@bitgo/sdk-core 38.9.0 → 38.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/bitgo/defi/defiVault.d.ts +21 -1
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/defiVault.js +36 -12
- package/dist/src/bitgo/defi/iDefiVault.d.ts +2 -1
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/iDefiVault.js +1 -1
- package/dist/src/bitgo/environments.js +3 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +3 -1
- package/dist/src/bitgo/safe/iSafe.d.ts +4 -2
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafe.js +1 -1
- package/dist/src/bitgo/safe/iSafes.d.ts +13 -8
- package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafes.js +1 -1
- package/dist/src/bitgo/safe/safe.d.ts +3 -8
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safe.js +136 -4
- package/dist/src/bitgo/safe/safeDerivation.d.ts +7 -3
- package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safeDerivation.js +57 -17
- package/dist/src/bitgo/safe/safes.d.ts +7 -6
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safes.js +27 -19
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +9 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +19 -3
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +4 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts +3 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/safeKeychain.d.ts +2 -2
- package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/safeKeychain.js +10 -10
- package/dist/src/bitgo/wallet/wallet.d.ts +4 -0
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +6 -2
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +13 -3
- package/dist/test/unit/bitgo/defi/defiVault.js +56 -1
- package/dist/test/unit/bitgo/safe/safe.js +133 -5
- package/dist/test/unit/bitgo/safe/safes.js +45 -4
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +121 -1
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +14 -1
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +18 -40
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +46 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -1111,7 +1111,12 @@ class Wallets {
|
|
|
1111
1111
|
});
|
|
1112
1112
|
const newWalletPassphrase = params.newWalletPassphrase || params.userLoginPassword;
|
|
1113
1113
|
const webauthnInfo = params.webauthnInfo;
|
|
1114
|
-
|
|
1114
|
+
// Each decrypt/encrypt call runs Argon2id inside a WebAssembly instance that reserves ~2 GiB of
|
|
1115
|
+
// virtual address space. Running all shares concurrently via Promise.all exhausts the browser's
|
|
1116
|
+
// WASM memory at scale (e.g. 96 wallets). Process in small batches so only a bounded number of
|
|
1117
|
+
// WASM instances are alive at once.
|
|
1118
|
+
const BATCH_SIZE = 16;
|
|
1119
|
+
const processShare = async (walletShare) => {
|
|
1115
1120
|
// Handle userMultiKeyRotationRequired case - these shares don't have keychains
|
|
1116
1121
|
if (walletShare.userMultiKeyRotationRequired) {
|
|
1117
1122
|
if (!params.userLoginPassword) {
|
|
@@ -1162,7 +1167,12 @@ class Wallets {
|
|
|
1162
1167
|
};
|
|
1163
1168
|
}
|
|
1164
1169
|
return [entry];
|
|
1165
|
-
}
|
|
1170
|
+
};
|
|
1171
|
+
const keysForWalletShares = [];
|
|
1172
|
+
for (const batch of _.chunk(walletShares, BATCH_SIZE)) {
|
|
1173
|
+
const batchResults = await Promise.all(batch.map((walletShare) => processShare(walletShare)));
|
|
1174
|
+
keysForWalletShares.push(...batchResults.flat());
|
|
1175
|
+
}
|
|
1166
1176
|
return this.bulkAcceptShareRequest(keysForWalletShares);
|
|
1167
1177
|
}
|
|
1168
1178
|
/**
|
|
@@ -1705,4 +1715,4 @@ class Wallets {
|
|
|
1705
1715
|
}
|
|
1706
1716
|
}
|
|
1707
1717
|
exports.Wallets = Wallets;
|
|
1708
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvREEsc0RBSUM7QUF4REQ7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLDhDQUF3QztBQUN4QywwQ0FBNEI7QUFDNUIsNENBQTZDO0FBRTdDLG1DQUFrRTtBQUNsRSxxREFBdUM7QUFHdkMsa0NBQTBDO0FBQzFDLDBDQUF1RTtBQUN2RSxvQ0FBNkY7QUFDN0YseUNBMkJvQjtBQUVwQixxQ0FBa0M7QUFFbEMsOENBQXlGO0FBRXpGOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLE1BQTRGO0lBRTVGLE9BQU8sTUFBTSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBYSxPQUFPO0lBSWxCLFlBQVksS0FBZ0IsRUFBRSxRQUFtQjtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUEyQixFQUFFO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBc0QsRUFBRTtRQUNqRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxD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Q0FBQyxhQUFzQixFQUFFLG1CQUE0QjtRQUN6RixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksbUJBQW1CLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUFDLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFyOURELDBCQXE5REMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQ29pbkZlYXR1cmUgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5cbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBzYW5pdGl6ZUxlZ2FjeVBhdGggfSBmcm9tICcuLi8uLi9hcGknO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBJQmFzZUNvaW4sIEtleWNoYWluc1RyaXBsZXQsIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgZ2V0U2hhcmVkU2VjcmV0IH0gZnJvbSAnLi4vZWNkaCc7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlJbmRpY2VzIH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgZGVjb2RlT3JFbHNlLCBFQ0RTQVV0aWxzLCBFRERTQVV0aWxzLCBwcm9taXNlUHJvcHMsIFJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBBY2NlcHRTaGFyZU9wdGlvbnMsXG4gIEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3QsXG4gIEFkZFdhbGxldE9wdGlvbnMsXG4gIEJ1bGtBY2NlcHRTaGFyZU9wdGlvbnMsXG4gIEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlLFxuICBCdWxrVXBkYXRlV2FsbGV0U2hhcmVPcHRpb25zLFxuICBCdWxrVXBkYXRlV2FsbGV0U2hhcmVPcHRpb25zUmVxdWVzdCxcbiAgQnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVzcG9uc2UsXG4gIEdlbmVyYXRlQmFzZU1wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zQ29kZWMsXG4gIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMsXG4gIEdlbmVyYXRlTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVTTUNNcGNXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyT3B0aW9ucyxcbiAgR2V0V2FsbGV0QnlBZGRyZXNzT3B0aW9ucyxcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbixcbiAgSVdhbGxldHMsXG4gIExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnMsXG4gIExpc3RXYWxsZXRPcHRpb25zLFxuICBVcGRhdGVTaGFyZU9wdGlvbnMsXG4gIFdhbGxldFNoYXJlcyxcbiAgV2FsbGV0V2l0aEtleWNoYWlucyxcbn0gZnJvbSAnLi9pV2FsbGV0cyc7XG5pbXBvcnQgeyBXYWxsZXRTaGFyZSB9IGZyb20gJy4vaVdhbGxldCc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuL3dhbGxldCc7XG5pbXBvcnQgeyBUc3NTZXR0aW5ncyB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlRXZtS2V5UmluZ1dhbGxldCwgdmFsaWRhdGVFdm1LZXlSaW5nV2FsbGV0UGFyYW1zIH0gZnJvbSAnLi4vZXZtL2V2bVV0aWxzJztcblxuLyoqXG4gKiBDaGVjayBpZiBhIHdhbGxldCBpcyBhIFdhbGxldFdpdGhLZXljaGFpbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2FsbGV0V2l0aEtleWNoYWlucyhcbiAgd2FsbGV0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyB8IEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW5cbik6IHdhbGxldCBpcyBXYWxsZXRXaXRoS2V5Y2hhaW5zIHtcbiAgcmV0dXJuIHdhbGxldC5yZXNwb25zZVR5cGUgPT09ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJztcbn1cblxuZXhwb3J0IGNsYXNzIFdhbGxldHMgaW1wbGVtZW50cyBJV2FsbGV0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlQ29pbjogSUJhc2VDb2luO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBJRCAocHJveHkgZm9yIGdldFdhbGxldClcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZ2V0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRXYWxsZXQocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGEgdXNlcidzIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGxpc3QocGFyYW1zOiBMaXN0V2FsbGV0T3B0aW9ucyAmIHsgZW50ZXJwcmlzZT86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPHsgd2FsbGV0czogV2FsbGV0W10gfT4ge1xuICAgIGlmIChwYXJhbXMuc2tpcCAmJiBwYXJhbXMucHJldklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggc2tpcCBhbmQgcHJldklkJyk7XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQnKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKSkgYXMgYW55O1xuICAgIGJvZHkud2FsbGV0cyA9IGJvZHkud2FsbGV0cy5tYXAoKHcpID0+IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgdykpO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZFxuICAgKiBBZGQgYSBuZXcgd2FsbGV0IChhZHZhbmNlZCBtb2RlKS5cbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIG1hbnVhbGx5IHN1Ym1pdCB0aGUga2V5cywgdHlwZSwgbSBhbmQgbiBvZiB0aGUgd2FsbGV0XG4gICAqIFBhcmFtZXRlcnMgaW5jbHVkZTpcbiAgICogICAgXCJsYWJlbFwiOiBsYWJlbCBvZiB0aGUgd2FsbGV0IHRvIGJlIHNob3duIGluIFVJXG4gICAqICAgIFwibVwiOiBudW1iZXIgb2Yga2V5cyByZXF1aXJlZCB0byB1bmxvY2sgd2FsbGV0ICgyKVxuICAgKiAgICBcIm5cIjogbnVtYmVyIG9mIGtleXMgYXZhaWxhYmxlIG9uIHRoZSB3YWxsZXQgKDMpXG4gICAqICAgIFwia2V5c1wiOiBhcnJheSBvZiBrZXljaGFpbiBpZHNcbiAgICovXG4gIGFzeW5jIGFkZChwYXJhbXM6IEFkZFdhbGxldE9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2xhYmVsJywgJ2VudGVycHJpc2UnLCAndHlwZSddKTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgbGFiZWwnKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUV2bUtleVJpbmdXYWxsZXRQYXJhbXMocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcblxuICAgIGlmICghcGFyYW1zLmV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZCAmJiBwYXJhbXMudHlwZSAhPT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIC8vIG5vIG5lZWQgdG8gcGFzcyBrZXlzIGZvciAoc2luZ2xlKSBjdXN0b2RpYWwgd2FsbGV0c1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLmtleXMpID09PSBmYWxzZSB8fCAhXy5pc051bWJlcihwYXJhbXMubSkgfHwgIV8uaXNOdW1iZXIocGFyYW1zLm4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgdHlwZXMgb2YgbXVsdGlzaWdcbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkTW9mTlNldHVwKHBhcmFtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBtdWx0aS1zaWcgdHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2FzUHJpY2UgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmdhc1ByaWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBnYXNQcmljZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMud2FsbGV0VmVyc2lvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIHdhbGxldFZlcnNpb24gLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnICYmIHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSAzKSB7XG4gICAgICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgICAucmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8ubXVsdGlTaWdUeXBlVmVyc2lvbjtcbiAgICAgICAgaWYgKG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicpIHtcbiAgICAgICAgICBwYXJhbXMud2FsbGV0VmVyc2lvbiA9IDU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMudGFncykgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIHRhZ3MgLSBhcnJheSBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY2xpZW50RmxhZ3MgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuY2xpZW50RmxhZ3MpID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBjbGllbnRGbGFncyAtIGFycmF5IGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pc0NvbGQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pc0NvbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGlzQ29sZCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmlzQ3VzdG9kaWFsICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaXNDdXN0b2RpYWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGlzQ3VzdG9kaWFsIC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWRkcmVzcyAmJiAoIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpIHx8ICF0aGlzLmJhc2VDb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5hZGRyZXNzKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYWRkcmVzcyAtIHZhbGlkIGFkZHJlc3Mgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0KHBhcmFtczogR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCB7IGxhYmVsLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBwYXNzY29kZUVuY3J5cHRpb25Db2RlLCBzdWJUeXBlLCBsaWdodG5pbmdQcm92aWRlciwgZW5jcnlwdGlvblZlcnNpb24gfSA9XG4gICAgICBwYXJhbXM7XG5cbiAgICAvLyBUT0RPIEJUQy0xODk5OiBvbmx5IHVzZXJBdXRoIGtleSBpcyByZXF1aXJlZCBmb3IgY3VzdG9kaWFsIGxpZ2h0bmluZyB3YWxsZXQuIGFsbCAzIGtleXMgYXJlIHJlcXVpcmVkIGZvciBzZWxmIGN1c3RvZGlhbCBsaWdodG5pbmcuXG4gICAgLy8gdG8gYXZvaWQgY2hhbmdpbmcgdGhlIHBsYXRmb3JtIGZvciBjdXN0b2RpYWwgZmxvdywgbGV0IHVzIGFsbCAzIGtleXMgYm90aCB3YWxsZXQgdHlwZXMuXG4gICAgY29uc3Qga2V5Y2hhaW5Qcm9taXNlcyA9IChbdW5kZWZpbmVkLCAndXNlckF1dGgnLCAnbm9kZUF1dGgnXSBhcyBjb25zdCkubWFwKChwdXJwb3NlKSA9PiB7XG4gICAgICByZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBrZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgICAgIHB1Yjoga2V5Y2hhaW4ucHViLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgICAgaW5wdXQ6IGtleWNoYWluLnBydixcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcHVycG9zZSA9PT0gdW5kZWZpbmVkID8gcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHB1cnBvc2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHsgW3RoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKV06IHsgcHVycG9zZSB9IH0sXG4gICAgICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGtleWNoYWluUGFyYW1zKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgdXNlckF1dGhLZXljaGFpbiwgbm9kZUF1dGhLZXljaGFpbiB9ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgIHVzZXJLZXljaGFpbjoga2V5Y2hhaW5Qcm9taXNlc1swXSgpLFxuICAgICAgdXNlckF1dGhLZXljaGFpbjoga2V5Y2hhaW5Qcm9taXNlc1sxXSgpLFxuICAgICAgbm9kZUF1dGhLZXljaGFpbjoga2V5Y2hhaW5Qcm9taXNlc1syXSgpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAxLFxuICAgICAgbjogMSxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgc3ViVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkXSxcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBbdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpXTogeyBrZXlzOiBbdXNlckF1dGhLZXljaGFpbi5pZCwgbm9kZUF1dGhLZXljaGFpbi5pZF0gfSB9LFxuICAgICAgbGlnaHRuaW5nUHJvdmlkZXIsXG4gICAgfTtcblxuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZCh3YWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0LFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgdXNlckF1dGhLZXljaGFpbixcbiAgICAgIG5vZGVBdXRoS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgR28gQWNjb3VudCB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcyBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZTxHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluPlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUdvQWNjb3VudFdhbGxldChcbiAgICBwYXJhbXM6IEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc1xuICApOiBQcm9taXNlPEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHsgbGFiZWwsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UsIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsIGVuY3J5cHRpb25WZXJzaW9uLCB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCBrZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBrZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgcHViOiBrZXljaGFpbi5wdWIsXG4gICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgfTtcblxuICAgIGlmIChwYXNzcGhyYXNlICE9PSB1bmRlZmluZWQgJiYgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXljaGFpblBhcmFtcy5lbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgaW5wdXQ6IGtleWNoYWluLnBydixcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIGtleWNoYWluUGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSA9IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGU7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoa2V5Y2hhaW5QYXJhbXMpO1xuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAxLFxuICAgICAgbjogMSxcbiAgICAgIHR5cGU6ICd0cmFkaW5nJyxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkXSxcbiAgICAgIC4uLih1c2VyS2V5U2lnbmluZ1JlcXVpcmVkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBjb2luU3BlY2lmaWM6IHsgdXNlcktleVNpZ25pbmdSZXF1aXJlZCB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZCh3YWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KTtcblxuICAgIGNvbnN0IHJlc3VsdDogR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbiA9IHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ0dvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4nLFxuICAgIH07XG5cbiAgICAvLyBBZGQgd2FybmluZyBpZiB0aGUgdXNlciBrZXljaGFpbiBoYXMgYW4gZW5jcnlwdGVkIHByaXZhdGUga2V5XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpKSB7XG4gICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgdXNlciBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IHdhbGxldFxuICAgKiAxLiBDcmVhdGVzIHRoZSB1c2VyIGtleWNoYWluIGxvY2FsbHkgb24gdGhlIGNsaWVudCwgYW5kIGVuY3J5cHRzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHBhc3NwaHJhc2VcbiAgICogMi4gSWYgbm8gcHViIHdhcyBwcm92aWRlZCwgY3JlYXRlcyB0aGUgYmFja3VwIGtleWNoYWluIGxvY2FsbHkgb24gdGhlIGNsaWVudCwgYW5kIGVuY3J5cHRzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHBhc3NwaHJhc2VcbiAgICogMy4gVXBsb2FkcyB0aGUgZW5jcnlwdGVkIHVzZXIgYW5kIGJhY2t1cCBrZXljaGFpbnMgdG8gQml0R29cbiAgICogNC4gQ3JlYXRlcyB0aGUgQml0R28ga2V5IG9uIHRoZSBzZXJ2aWNlXG4gICAqIDUuIENyZWF0ZXMgdGhlIHdhbGxldCBvbiBCaXRHbyB3aXRoIHRoZSAzIHB1YmxpYyBrZXlzIGFib3ZlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5sYWJlbCBMYWJlbCBmb3IgdGhlIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zLnBhc3NwaHJhc2UgUGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHVzZXIgYW5kIGJhY2t1cCBrZXljaGFpbnNcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyS2V5IFVzZXIgeHB1YlxuICAgKiBAcGFyYW0gcGFyYW1zLmJhY2t1cFhwdWIgQmFja3VwIHhwdWJcbiAgICogQHBhcmFtIHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXJcbiAgICogQHBhcmFtIHBhcmFtcy5lbnRlcnByaXNlIHRoZSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSBvcHRpb25hbCB0aGlzIGlzIGEgcmVjb3ZlcnkgY29kZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIG9yaWdpbmFsIHBhc3NwaHJhc2UgaW4gYSByZWNvdmVyeSBjYXNlLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgbXVzdCBnZW5lcmF0ZSBhbmQga2VlcCB0aGUgZW5jcnlwdGVkIG9yaWdpbmFsIHBhc3NwaHJhc2Ugc2FmZSB3aGlsZSB0aGlzIGNvZGUgaXMgc3RvcmVkIG9uIEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkIG9wdGlvbmFsIHNlZWQgZm9yIFNNQyB3YWxsZXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZ2FzUHJpY2VcbiAgICogQHBhcmFtIHBhcmFtcy5kaXNhYmxlS1JTRW1haWxcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRWZXJzaW9uXG4gICAqIEBwYXJhbSBwYXJhbXMubXVsdGlzaWdUeXBlIG9wdGlvbmFsIG11bHRpc2lnIHR5cGUsICdvbmNoYWluJyBvciAndHNzJyBvciAnYmxzZGtnJzsgaWYgYWJzZW50LCB3ZSB3aWxsIGRlZmVyIHRvIHRoZSBjb2luJ3MgZGVmYXVsdCB0eXBlXG4gICAqIEBwYXJhbSBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkgb3B0aW9uYWwgcGFyYW1ldGVyIGZvciBjcmVhdGluZyBiaXRnbyBrZXkuIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gY3JlYXRlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldC4gSWYgcHJvdmlkZWQsIHlvdSBtdXN0IGhhdmUgdGhlIGVudGVycHJpc2UgbGljZW5zZSBhbmQgcGFzcyBpblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBwYXJhbXMuZW50ZXJwcmlzZWAgaW50byBgZ2VuZXJhdGVXYWxsZXRgIGFzIHdlbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMudHlwZSBvcHRpb25hbCB3YWxsZXQgdHlwZSwgJ2hvdCcgb3IgJ2NvbGQnIG9yICdjdXN0b2RpYWwnOyBpZiBhYnNlbnQsIHdlIHdpbGwgZGVmZXIgdG8gJ2hvdCdcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleUlkIG9wdGlvbmFsIGJpdGdvIGtleSBpZCBmb3IgU01DIFRTUyB3YWxsZXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuY29tbW9uS2V5Y2hhaW4gb3B0aW9uYWwgY29tbW9uIGtleWNoYWluIGZvciBTTUMgVFNTIHdhbGxldHNcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVdhbGxldChcbiAgICBwYXJhbXM6IEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucyB8IExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnMgfCBHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluPiB7XG4gICAgLy8gQXNzaWduIHRoZSBkZWZhdWx0IG11bHRpU2lnIHR5cGUgdmFsdWUgYmFzZWQgb24gdGhlIGNvaW5cbiAgICBpZiAoIXBhcmFtcy5tdWx0aXNpZ1R5cGUpIHtcbiAgICAgIHBhcmFtcy5tdWx0aXNpZ1R5cGUgPSB0aGlzLmJhc2VDb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ2xuYnRjJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGRlY29kZU9yRWxzZShcbiAgICAgICAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMubmFtZSxcbiAgICAgICAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgKGVycm9ycykgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyBnZW5lcmF0ZSBsaWdodG5pbmcgd2FsbGV0IHJlcXVlc3QgcGFyYW1zOiAke2Vycm9yc31gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVMaWdodG5pbmdXYWxsZXQob3B0aW9ucyk7XG4gICAgICB3YWxsZXREYXRhLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogb3B0aW9ucy5wYXNzcGhyYXNlLFxuICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogb3B0aW9ucy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHdhbGxldERhdGE7XG4gICAgfVxuXG4gICAgLy8gR28gQWNjb3VudCB3YWxsZXQgZ2VuZXJhdGlvblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnb2ZjJyAmJiBwYXJhbXMudHlwZSA9PT0gJ3RyYWRpbmcnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZGVjb2RlT3JFbHNlKFxuICAgICAgICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYy5uYW1lLFxuICAgICAgICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICAoZXJyb3JzKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIGdlbmVyYXRlIGdvIGFjY291bnQgcmVxdWVzdCBwYXJhbXM6ICR7ZXJyb3JzfWApO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUdvQWNjb3VudFdhbGxldChvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLnBhc3NwaHJhc2UgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YWxsZXREYXRhLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBvcHRpb25zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogb3B0aW9ucy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2xhYmVsJ10sIFsncGFzc3BocmFzZScsICd1c2VyS2V5JywgJ2JhY2t1cFhwdWInXSk7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3JlYXRlS2V5Y2hhaW5DYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIocGFyYW1zIGFzIEdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlID0gJ2hvdCcsIGxhYmVsLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keSwgZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgaXNUc3MgPSBwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCk7XG4gICAgY29uc3QgY2FuRW5jcnlwdCA9ICEhcGFzc3BocmFzZSAmJiB0eXBlb2YgcGFzc3BocmFzZSA9PT0gJ3N0cmluZyc7XG5cbiAgICBpZiAodmFsaWRhdGVFdm1LZXlSaW5nV2FsbGV0UGFyYW1zKHBhcmFtcywgdGhpcy5iYXNlQ29pbikpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjcmVhdGVFdm1LZXlSaW5nV2FsbGV0KHtcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIGV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZDogZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkISxcbiAgICAgICAgYml0Z286IHRoaXMuYml0Z28sXG4gICAgICAgIGJhc2VDb2luOiB0aGlzLmJhc2VDb2luLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbXSxcbiAgICAgIHR5cGU6ICEhcGFyYW1zLnVzZXJLZXkgJiYgcGFyYW1zLm11bHRpc2lnVHlwZSAhPT0gJ29uY2hhaW4nID8gJ2NvbGQnIDogdHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRlcnByaXNlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGVudGVycHJpc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRlcnByaXNlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IGVudGVycHJpc2U7XG4gICAgfVxuXG4gICAgLy8gRVZNIFRTUyB3YWxsZXRzIG11c3QgdXNlIHdhbGxldCB2ZXJzaW9uIDMsIDUgYW5kIDZcbiAgICBpZiAoXG4gICAgICBpc1RzcyAmJlxuICAgICAgdGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmXG4gICAgICAhZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkICYmXG4gICAgICAhKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSAzIHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFVk0gVFNTIHdhbGxldHMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB3YWxsZXQgdmVyc2lvbiAzLCA1IGFuZCA2Jyk7XG4gICAgfVxuXG4gICAgaWYgKGlzVHNzKSB7XG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KSAmJlxuICAgICAgICAhdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NUENWMilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBNUEN2MiBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldCcpO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ2NvbGQnKSB7XG4gICAgICAgIC8vIHZhbGlkYXRlXG4gICAgICAgIGFzc2VydChwYXJhbXMuYml0Z29LZXlJZCwgJ2JpdGdvS2V5SWQgaXMgcmVxdWlyZWQgZm9yIFNNQyBUU1Mgd2FsbGV0Jyk7XG4gICAgICAgIGFzc2VydChwYXJhbXMuY29tbW9uS2V5Y2hhaW4sICdjb21tb25LZXljaGFpbiBpcyByZXF1aXJlZCBmb3IgU01DIFRTUyB3YWxsZXQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTTUNNcGNXYWxsZXQoe1xuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgICBiaXRnb0tleUlkOiBwYXJhbXMuYml0Z29LZXlJZCxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjogcGFyYW1zLmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIGNvbGREZXJpdmF0aW9uU2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUN1c3RvZGlhbE1wY1dhbGxldCh7XG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsICdjYW5ub3QgZ2VuZXJhdGUgVFNTIGtleXMgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU1wY1dhbGxldCh7XG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBwYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgd2ViYXV0aG5JbmZvOiBwYXJhbXMud2ViYXV0aG5JbmZvLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgICBpZiAocGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpIHtcbiAgICAgICAgd2FsbGV0RGF0YS5lbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcGFzc3BocmFzZSxcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlzdHJpYnV0ZWQgY3VzdG9keVxuICAgIGlmIChpc0Rpc3RyaWJ1dGVkQ3VzdG9keSkge1xuICAgICAgaWYgKCFlbnRlcnByaXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGVudGVycHJpc2Ugd2hlbiBjcmVhdGluZyBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eXBlIHx8IHR5cGUgIT09ICdjb2xkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBtdXN0IGJlIHR5cGU6IGNvbGQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYXNCYWNrdXBYcHViID0gISFwYXJhbXMuYmFja3VwWHB1YjtcbiAgICBjb25zdCBoYXNCYWNrdXBYcHViUHJvdmlkZXIgPSAhIXBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXI7XG4gICAgaWYgKGhhc0JhY2t1cFhwdWIgJiYgaGFzQmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwcm92aWRlIG1vcmUgdGhhbiBvbmUgYmFja3VwWHB1YiBvciBiYWNrdXBYcHViUHJvdmlkZXIgZmxhZycpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2FzUHJpY2UgJiYgcGFyYW1zLmVpcDE1NTkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCB1c2UgYm90aCBlaXAxNTU5IGFuZCBnYXNQcmljZSB2YWx1ZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5nYXNQcmljZSkpIHtcbiAgICAgIGNvbnN0IGdhc1ByaWNlQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5nYXNQcmljZSk7XG4gICAgICBpZiAoZ2FzUHJpY2VCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBnYXMgcHJpY2UgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2VCTi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZWlwMTU1OSkgJiYgIV8uaXNFbXB0eShwYXJhbXMuZWlwMTU1OSkpIHtcbiAgICAgIGNvbnN0IG1heEZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heEZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4UHJpb3JpdHlGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heFByaW9yaXR5RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpb3JpdHkgZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5laXAxNTU5ID0ge1xuICAgICAgICBtYXhGZWVQZXJHYXM6IG1heEZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBtYXhQcmlvcml0eUZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZUtSU0VtYWlsIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmRpc2FibGVLUlNFbWFpbCA9IHBhcmFtcy5kaXNhYmxlS1JTRW1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0VmVyc2lvbiBwcm92aWRlZCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLndhbGxldFZlcnNpb24gPSBwYXJhbXMud2FsbGV0VmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgZWFjaCBrcnNTcGVjaWZpYyBwYXJhbSBpcyBlaXRoZXIgYSBzdHJpbmcsIGJvb2xlYW4sIG9yIG51bWJlclxuICAgIGNvbnN0IHsga3JzU3BlY2lmaWMgfSA9IHBhcmFtcztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoa3JzU3BlY2lmaWMpKSB7XG4gICAgICBPYmplY3Qua2V5cyhrcnNTcGVjaWZpYykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGtyc1NwZWNpZmljW2tleV07XG4gICAgICAgIGlmICghXy5pc0Jvb2xlYW4odmFsKSAmJiAhXy5pc1N0cmluZyh2YWwpICYmICFfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tyc1NwZWNpZmljIG9iamVjdCBjb250YWlucyBpbGxlZ2FsIHZhbHVlcy4gdmFsdWVzIG11c3QgYmUgc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bWJlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIChwYXJhbXMubXVsdGlzaWdUeXBlID8/ICdvbmNoYWluJykgPT09ICdvbmNoYWluJykge1xuICAgICAgLy8gZm9yIGN1c3RvZGlhbCBtdWx0aXNpZywgd2hlbiB0aGUgd2FsbGV0IGlzIGNyZWF0ZWQgb24gdGhlIHBsYXRmb3Igc2lkZSwgdGhlIGtleXMgYXJlIG5vdCBuZWVkZWRcbiAgICAgIHdhbGxldFBhcmFtcy5uID0gdW5kZWZpbmVkO1xuICAgICAgd2FsbGV0UGFyYW1zLm0gPSB1bmRlZmluZWQ7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5cyA9IHVuZGVmaW5lZDtcbiAgICAgIHdhbGxldFBhcmFtcy5rZXlTaWduYXR1cmVzID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTsgLy8gcmV0dXJucyB0aGUgaWRzXG5cbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuVVNFUl0sIHJlcUlkIH0pO1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBuZXdXYWxsZXQua2V5c1tLZXlJbmRpY2VzLkJBQ0tVUF0sIHJlcUlkIH0pO1xuICAgICAgY29uc3QgYml0Z29LZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuQklUR09dLCByZXFJZCB9KTtcblxuICAgICAgY29uc3QgW3VzZXJLZXksIGJpdGdvS2V5LCBiYWNrdXBLZXldID0gYXdhaXQgUHJvbWlzZS5hbGwoW3VzZXJLZXljaGFpbiwgYml0Z29LZXljaGFpbiwgYmFja3VwS2V5Y2hhaW5dKTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYml0Z29LZXksXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IGJhY2t1cEtleSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgbGV0IHVzZXJLZXljaGFpblBhcmFtcztcbiAgICAgICAgbGV0IHVzZXJLZXljaGFpbjtcbiAgICAgICAgLy8gVXNlciBwcm92aWRlZCB1c2VyIGtleVxuICAgICAgICBpZiAocGFyYW1zLnVzZXJLZXkpIHtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW4gPSB7IHB1YjogcGFyYW1zLnVzZXJLZXkgfTtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB1c2VyS2V5Y2hhaW47XG4gICAgICAgICAgaWYgKHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgZGVyaXZhdGlvbiA9IHRoaXMuYmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQoe1xuICAgICAgICAgICAgICBrZXk6IHBhcmFtcy51c2VyS2V5LFxuICAgICAgICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb24uZGVyaXZhdGlvblBhdGg7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW4ucHViID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCA9IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2FuRW5jcnlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgdXNlciBrZXlwYWlyIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHVzZXIga2V5LlxuICAgICAgICAgIHVzZXJLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgICAgdXNlcktleWNoYWluLmVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICAgIGlucHV0OiB1c2VyS2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICAgICAgICBwdWI6IHVzZXJLZXljaGFpbi5wdWIsXG4gICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBJZiBXZWJBdXRobiBpbmZvIGlzIHByb3ZpZGVkLCBzdG9yZSBhbiBhZGRpdGlvbmFsIGNvcHkgb2YgdGhlIHByaXZhdGUga2V5IGVuY3J5cHRlZFxuICAgICAgICAgIC8vIHdpdGggdGhlIFBSRi1kZXJpdmVkIHBhc3NwaHJhc2Ugc28gdGhlIGF1dGhlbnRpY2F0b3IgY2FuIGxhdGVyIGRlY3J5cHQgaXQuXG4gICAgICAgICAgLy8gU2VuZCBpdCBhcyBgd2ViYXV0aG5JbmZvYCAoc2luZ2xlIG9iamVjdCwgd2l0aCBlbnRlcnByaXNlSWQpIHNvIHRoZSBhdG9taWNcbiAgICAgICAgICAvLyBQT1NUIC9rZXkgcGVyc2lzdHMgdGhlIHBhc3NrZXkg4oCUIHRoZSBiYWNrZW5kIGlnbm9yZXMgdGhlIGRlcHJlY2F0ZWQgYHdlYmF1dGhuRGV2aWNlc2AuXG4gICAgICAgICAgaWYgKHBhcmFtcy53ZWJhdXRobkluZm8gJiYgdXNlcktleWNoYWluLnBydikge1xuICAgICAgICAgICAgdXNlcktleWNoYWluUGFyYW1zLndlYmF1dGhuSW5mbyA9IHtcbiAgICAgICAgICAgICAgb3RwRGV2aWNlSWQ6IHBhcmFtcy53ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgICAgICAgIHByZlNhbHQ6IHBhcmFtcy53ZWJhdXRobkluZm8ucHJmU2FsdCxcbiAgICAgICAgICAgICAgZW50ZXJwcmlzZUlkOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHVzZXJLZXljaGFpbi5wcnYsXG4gICAgICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgICAgICBhZGF0YTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICAgICAgY29uc3QgbmV3VXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBuZXdVc2VyS2V5Y2hhaW4sIHVzZXJLZXljaGFpbik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgICAgIC8vIElmIHJlcXVlc3RlZCwgdXNlIGEgS1JTIG9yIGJhY2t1cCBrZXkgcHJvdmlkZXJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoe1xuICAgICAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIgfHwgJ2RlZmF1bHRSTUdCYWNrdXBQcm92aWRlcicsXG4gICAgICAgICAgICBkaXNhYmxlS1JTRW1haWw6IHBhcmFtcy5kaXNhYmxlS1JTRW1haWwsXG4gICAgICAgICAgICBrcnNTcGVjaWZpYzogcGFyYW1zLmtyc1NwZWNpZmljLFxuICAgICAgICAgICAgdHlwZTogdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpLFxuICAgICAgICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIGJhY2t1cCB4cHViXG4gICAgICAgIGlmIChwYXJhbXMuYmFja3VwWHB1Yikge1xuICAgICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgYmFja3VwIGV0aGVyZXVtIGFkZHJlc3NcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoe1xuICAgICAgICAgICAgcHViOiBwYXJhbXMuYmFja3VwWHB1YixcbiAgICAgICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGdlbmVyYXRlIGJhY2t1cCBrZXlwYWlyIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBObyBwcm92aWRlZCBiYWNrdXAgeHB1YiBvciBhZGRyZXNzLCBzbyBkZWZhdWx0IHRvIGNyZWF0aW5nIG9uZSBoZXJlXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH06IEtleWNoYWluc1RyaXBsZXQgPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXljaGFpblByb21pc2UoKSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IGJhY2t1cEtleWNoYWluUHJvbWlzZSgpLFxuICAgICAgICBiaXRnb0tleWNoYWluOiB0aGlzLmJhc2VDb2luXG4gICAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgICAgLmNyZWF0ZUJpdEdvKHsgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsIHJlcUlkLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keTogcGFyYW1zLmlzRGlzdHJpYnV0ZWRDdXN0b2R5IH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHdhbGxldFBhcmFtcy5rZXlzID0gW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdO1xuXG4gICAgICBjb25zdCB7IHBydiB9ID0gdXNlcktleWNoYWluO1xuICAgICAgaWYgKF8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgICBhc3NlcnQoYmFja3VwS2V5Y2hhaW4ucHViKTtcbiAgICAgICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4ucHViKTtcbiAgICAgICAgd2FsbGV0UGFyYW1zLmtleVNpZ25hdHVyZXMgPSB7XG4gICAgICAgICAgYmFja3VwOiAoYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydiB9LCBiYWNrdXBLZXljaGFpbi5wdWIpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgYml0Z286IChhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIGJpdGdvS2V5Y2hhaW4ucHViKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXljaGFpbnMgPSB7XG4gICAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcblxuICAgICAgaWYgKF8uaW5jbHVkZXMoWyd4cnAnLCAneGxtJywgJ2NzcHInXSwgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLnJvb3RQcml2YXRlS2V5KSkge1xuICAgICAgICB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkgPSBwYXJhbXMucm9vdFByaXZhdGVLZXk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IGJhY2t1cEtleWNoYWluLFxuICAgICAgICBiaXRnb0tleWNoYWluOiBiaXRnb0tleWNoYWluLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChiYWNrdXBLZXljaGFpbi5wcnYpKSB7XG4gICAgICAgIHJlc3VsdC53YXJuaW5nID0gJ0JlIHN1cmUgdG8gYmFja3VwIHRoZSBiYWNrdXAga2V5Y2hhaW4gLS0gaXQgaXMgbm90IHN0b3JlZCBhbnl3aGVyZSBlbHNlISc7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZXJpdmF0aW9uUGF0aCkpIHtcbiAgICAgICAgdXNlcktleWNoYWluLmRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvblBhdGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5FbmNyeXB0ICYmIHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSB7XG4gICAgICAgIHJlc3VsdC5lbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcGFzc3BocmFzZSxcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIG9uY2hhaW4gbXVsdGlzaWcgd2FsbGV0IHVzaW5nIGFuIGV4dGVybmFsIHNpZ25lciBmb3IgdXNlciBhbmQgYmFja3VwIGtleSBjcmVhdGlvbi5cbiAgICogMS4gQ2FsbHMgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayBmb3IgdXNlciBhbmQgYmFja3VwIGtleXNcbiAgICogMi4gVXBsb2FkcyBrZXljaGFpbnMgdmlhIGtleWNoYWlucygpLmFkZCgpXG4gICAqIDMuIENyZWF0ZXMgdGhlIEJpdEdvIGtleSBvbiB0aGUgc2VydmljZVxuICAgKiA0LiBDcmVhdGVzIHRoZSB3YWxsZXQgb24gQml0R28gd2l0aCB0aGUgMyBwdWJsaWMga2V5c1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IEdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyT3B0aW9uc1xuICApOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCBoYXNPbmNoYWluQ2FsbGJhY2sgPSBfLmlzRnVuY3Rpb24ocGFyYW1zLmNyZWF0ZUtleWNoYWluQ2FsbGJhY2spO1xuICAgIGNvbnN0IGhhc01wY0NhbGxiYWNrcyA9ICEhKHBhcmFtcy5lY2RzYU1QQ3YyQ2FsbGJhY2tzIHx8IHBhcmFtcy5lZGRzYUNhbGxiYWNrcyk7XG5cbiAgICBpZiAoaGFzT25jaGFpbkNhbGxiYWNrICYmIGhhc01wY0NhbGxiYWNrcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVLZXljaGFpbkNhbGxiYWNrIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggTVBDIFRTUyBrZXkgZ2VuZXJhdGlvbiBjYWxsYmFja3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtdWx0aXNpZ1R5cGUgPVxuICAgICAgcGFyYW1zLm11bHRpc2lnVHlwZSA/PyAoaGFzT25jaGFpbkNhbGxiYWNrID8gJ29uY2hhaW4nIDogdGhpcy5iYXNlQ29pbi5nZXREZWZhdWx0TXVsdGlzaWdUeXBlKCkpO1xuXG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlTXBjV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKG11bHRpc2lnVHlwZSAhPT0gJ29uY2hhaW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igb25jaGFpbiBtdWx0aXNpZyB3YWxsZXRzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRnVuY3Rpb24ocGFyYW1zLmNyZWF0ZUtleWNoYWluQ2FsbGJhY2spKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgZnVuY3Rpb24gcGFyYW1ldGVyIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2snKTtcbiAgICB9XG5cbiAgICAvLyB0aGVzZSBiZWxvbmcgdG8gdGhlIHBhc3NwaHJhc2UtYmFzZWQgcGF0aCBhbmQgYXJlIGluY29tcGF0aWJsZSB3aXRoIGNyZWF0ZUtleWNoYWluQ2FsbGJhY2tcbiAgICBjb25zdCBwYXNzcGhyYXNlUGF0aFBhcmFtcyA9IFsncGFzc3BocmFzZScsICd1c2VyS2V5JywgJ2JhY2t1cFhwdWInLCAnYmFja3VwWHB1YlByb3ZpZGVyJ10gYXMgY29uc3Q7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGFzc3BocmFzZVBhdGhQYXJhbXMpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXNba2V5XSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVLZXljaGFpbkNhbGxiYWNrIGNhbm5vdCBiZSB1c2VkIHdpdGggJHtrZXl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBsYWJlbCwgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjaywgdHlwZSA9ICdob3QnLCBlbnRlcnByaXNlLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBjdXN0b2RpYWwgb25jaGFpbiB3YWxsZXRzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53ZWJhdXRobkluZm8pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dlYmF1dGhuSW5mbyBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzdHJpYnV0ZWRDdXN0b2R5KSB7XG4gICAgICBpZiAoIWVudGVycHJpc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHByb3ZpZGUgZW50ZXJwcmlzZSB3aGVuIGNyZWF0aW5nIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0Jyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSAhPT0gJ2NvbGQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXRzIG11c3QgYmUgdHlwZTogY29sZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2FzUHJpY2UgJiYgcGFyYW1zLmVpcDE1NTkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCB1c2UgYm90aCBlaXAxNTU5IGFuZCBnYXNQcmljZSB2YWx1ZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW10sXG4gICAgICB0eXBlLFxuICAgIH07XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50ZXJwcmlzZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhlbnRlcnByaXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50ZXJwcmlzZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmVudGVycHJpc2UgPSBlbnRlcnByaXNlO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgPSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmdhc1ByaWNlKSkge1xuICAgICAgY29uc3QgZ2FzUHJpY2VCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmdhc1ByaWNlKTtcbiAgICAgIGlmIChnYXNQcmljZUJOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGdhcyBwcmljZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZUJOLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5laXAxNTU5KSAmJiAhXy5pc0VtcHR5KHBhcmFtcy5laXAxNTU5KSkge1xuICAgICAgY29uc3QgbWF4RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heEZlZVBlckdhcyk7XG4gICAgICBpZiAobWF4RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXhQcmlvcml0eUZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhQcmlvcml0eUZlZVBlckdhcyk7XG4gICAgICBpZiAobWF4UHJpb3JpdHlGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmlvcml0eSBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmVpcDE1NTkgPSB7XG4gICAgICAgIG1heEZlZVBlckdhczogbWF4RmVlUGVyR2FzQk4udG9TdHJpbmcoKSxcbiAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IG1heFByaW9yaXR5RmVlUGVyR2FzQk4udG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0VmVyc2lvbiBwcm92aWRlZCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLndhbGxldFZlcnNpb24gPSBwYXJhbXMud2FsbGV0VmVyc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKTtcblxuICAgIGNvbnN0IGNyZWF0ZUFuZFVwbG9hZEtleWNoYWluID0gYXN5bmMgKHNvdXJjZTogJ3VzZXInIHwgJ2JhY2t1cCcpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBrZXljaGFpbkZyb21DYWxsYmFjayA9IGF3YWl0IGNyZWF0ZUtleWNoYWluQ2FsbGJhY2soeyBzb3VyY2UsIGNvaW4gfSk7XG4gICAgICAgIGlmIChrZXljaGFpbkZyb21DYWxsYmFjay5zb3VyY2UgIT09IHNvdXJjZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayByZXR1cm5lZCBzb3VyY2UgJHtrZXljaGFpbkZyb21DYWxsYmFjay5zb3VyY2V9LCBleHBlY3RlZCAke3NvdXJjZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5Y2hhaW5Gcm9tQ2FsbGJhY2sudHlwZSAhPT0gJ2luZGVwZW5kZW50Jykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBjcmVhdGVLZXljaGFpbkNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgdHlwZSAke2tleWNoYWluRnJvbUNhbGxiYWNrLnR5cGV9LCBleHBlY3RlZCAnaW5kZXBlbmRlbnQnIGZvciBvbmNoYWluIG11bHRpc2lnYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRQdWIoa2V5Y2hhaW5Gcm9tQ2FsbGJhY2sucHViKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayByZXR1cm5lZCBpbnZhbGlkIHB1YiBmb3IgJHtzb3VyY2V9IGtleSBvbiAke2NvaW59YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgICAgICBwdWI6IGtleWNoYWluRnJvbUNhbGxiYWNrLnB1YixcbiAgICAgICAgICBrZXlUeXBlOiBrZXljaGFpbkZyb21DYWxsYmFjay50eXBlLFxuICAgICAgICAgIHNvdXJjZToga2V5Y2hhaW5Gcm9tQ2FsbGJhY2suc291cmNlLFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSAke3NvdXJjZX0ga2V5Y2hhaW46ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH06IEtleWNoYWluc1RyaXBsZXQgPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgdXNlcktleWNoYWluOiBjcmVhdGVBbmRVcGxvYWRLZXljaGFpbigndXNlcicpLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGNyZWF0ZUFuZFVwbG9hZEtleWNoYWluKCdiYWNrdXAnKSxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgIC5jcmVhdGVCaXRHbyh7IGVudGVycHJpc2UsIHJlcUlkLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keTogcGFyYW1zLmlzRGlzdHJpYnV0ZWRDdXN0b2R5IH0pLFxuICAgIH0pO1xuXG4gICAgd2FsbGV0UGFyYW1zLmtleXMgPSBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG5cbiAgICBpZiAocGFyYW1zLmtleVNpZ25hdHVyZXMpIHtcbiAgICAgIHdhbGxldFBhcmFtcy5rZXlTaWduYXR1cmVzID0gcGFyYW1zLmtleVNpZ25hdHVyZXM7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG5cbiAgICBpZiAoXy5pbmNsdWRlcyhbJ3hycCcsICd4bG0nLCAnY3NwciddLCB0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMucm9vdFByaXZhdGVLZXkpKSB7XG4gICAgICB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkgPSBwYXJhbXMucm9vdFByaXZhdGVLZXk7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHVzZXIncyB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZScpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlcyB2MlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRTaGFyZXM+fVxuICAgKi9cbiAgYXN5bmMgbGlzdFNoYXJlc1YyKCk6IFByb21pc2U8V2FsbGV0U2hhcmVzPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmVzJywgMikpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB3YWxsZXQgc2hhcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNoYXJpbmcga2V5Y2hhaW4uIHJlcXVpcmVzIHVubG9jayBpZiBrZXljaGFpbiBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gZ2V0IGluZm9ybWF0aW9uIG9uXG4gICAqL1xuICBhc3luYyBnZXRTaGFyZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHBhcmFtcy5zdGF0ZSAtIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyB1cGRhdGVTaGFyZShwYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWxrIGFjY2VwdCB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXMgQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlPn1cbiAgICovXG4gIGFzeW5jIGJ1bGtBY2NlcHRTaGFyZVJlcXVlc3QocGFyYW1zOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10pOiBQcm9taXNlPEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYnVsa0FjY2VwdFNoYXJlUmVxdWVzdFdpdGhSZXRyeShwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWxrQWNjZXB0U2hhcmVSZXF1ZXN0V2l0aFJldHJ5KHBhcmFtczogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdKTogUHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT4ge1xuICAgIC8vIFNlcnZlciBoYXMgYSBsaW1pdCBvZiBhcHByb3hpbWF0ZWx5IDFNQiBmb3IgcGF5bG9hZCBzaXplXG4gICAgbGV0IE1BWF9QQVlMT0FEX1NJWkUgPSA5NTAwMDA7IC8vIH45NTBLQiB0byBsZWF2ZSBzb21lIGJ1ZmZlclxuXG4gICAgLy8gRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgcGF5bG9hZFxuICAgIGNvbnN0IGNhbGN1bGF0ZVBheWxvYWRTaXplID0gKGl0ZW1zOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10pOiBudW1iZXIgPT4ge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KHsga2V5c0ZvcldhbGxldFNoYXJlczogaXRlbXMgfSksICd1dGY4Jyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gW107XG4gICAgY29uc3QgcmVtYWluaW5nUGFyYW1zID0gWy4uLnBhcmFtc107XG5cbiAgICB3aGlsZSAocmVtYWluaW5nUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEJ1aWxkIG9wdGltYWwgYmF0Y2ggYnkgYWRkaW5nIGl0ZW1zIHVudGlsIHdlIHJlYWNoIHNpemUgbGltaXRcbiAgICAgIGNvbnN0IGJhdGNoOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10gPSBbXTtcbiAgICAgIC8vIFN0YXJ0IHdpdGggZW1wdHkgYmF0Y2hcblxuICAgICAgLy8gQWRkIGl0ZW1zIG9uZSBieSBvbmUgd2hpbGUgbW9uaXRvcmluZyBwYXlsb2FkIHNpemVcbiAgICAgIHdoaWxlIChyZW1haW5pbmdQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBUZXN0IGFkZGluZyB0aGUgbmV4dCBpdGVtXG4gICAgICAgIGNvbnN0IHRlc3RCYXRjaCA9IFsuLi5iYXRjaCwgcmVtYWluaW5nUGFyYW1zWzBdXTtcbiAgICAgICAgY29uc3QgdGVzdFNpemUgPSBjYWxjdWxhdGVQYXlsb2FkU2l6ZSh0ZXN0QmF0Y2gpO1xuXG4gICAgICAgIC8vIElmIGFkZGluZyB0aGlzIGl0ZW0gd291bGQgZXhjZWVkIHRoZSBzaXplIGxpbWl0LCBzdG9wIGFkZGluZ1xuICAgICAgICBpZiAodGVzdFNpemUgPiBNQVhfUEFZTE9BRF9TSVpFICYmIGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgYWRkIHRoZSBpdGVtIHRvIHRoZSBiYXRjaFxuICAgICAgICBiYXRjaC5wdXNoKHJlbWFpbmluZ1BhcmFtcy5zaGlmdCgpISk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGV2ZW4gYSBzaW5nbGUgaXRlbSBpcyB0b28gbGFyZ2VcbiAgICAgIGlmIChiYXRjaC5sZW5ndGggPT09IDAgJiYgcmVtYWluaW5nUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gU2VuZCBqdXN0IHRoZSBmaXJzdCBpdGVtIGV2ZW4gaWYgaXQncyBvdmVyc2l6ZWRcbiAgICAgICAgYmF0Y2gucHVzaChyZW1haW5pbmdQYXJhbXMuc2hpZnQoKSEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkT2JqID0geyBrZXlzRm9yV2FsbGV0U2hhcmVzOiBiYXRjaCB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcy9hY2NlcHQnLCAyKSkuc2VuZChwYXlsb2FkT2JqKS5yZXN1bHQoKTtcblxuICAgICAgICBpZiAocmVzdWx0LmFjY2VwdGVkV2FsbGV0U2hhcmVzICYmIEFycmF5LmlzQXJyYXkocmVzdWx0LmFjY2VwdGVkV2FsbGV0U2hhcmVzKSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5yZXN1bHQuYWNjZXB0ZWRXYWxsZXRTaGFyZXMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQxMyAmJiBiYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgZ2V0IDQxMyB3aXRoIG11bHRpcGxlIGl0ZW1zLCBwdXQgdGhlbSBiYWNrIGFuZCB0cnkgd2l0aCBoYWxmIHRoZSBiYXRjaCBzaXplXG4gICAgICAgICAgcmVtYWluaW5nUGFyYW1zLnVuc2hpZnQoLi4uYmF0Y2gpO1xuICAgICAgICAgIE1BWF9QQVlMT0FEX1NJWkUgPSBNYXRoLmZsb29yKE1BWF9QQVlMT0FEX1NJWkUgLyAyKTsgLy8gUmVkdWNlIHNpemUgbGltaXQgZm9yIG5leHQgYXR0ZW1wdFxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY2NlcHRlZFdhbGxldFNoYXJlczogcmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgYnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVxdWVzdChcbiAgICBwYXJhbXM6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0W11cbiAgKTogUHJvbWlzZTxCdWxrVXBkYXRlV2FsbGV0U2hhcmVSZXNwb25zZT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmVzL3VwZGF0ZScsIDIpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBzaGFyZXM6IHBhcmFtcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kIGEgd2FsbGV0IHNoYXJlIGludml0YXRpb24gZW1haWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHdob3NlIGludml0aWF0aW9uIHNob3VsZCBiZSByZXNlbnRcbiAgICovXG4gIGFzeW5jIHJlc2VuZFNoYXJlSW52aXRlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIGNvbnN0IHVybFBhcnRzID0gcGFyYW1zLndhbGxldFNoYXJlSWQgKyAnL3Jlc2VuZGVtYWlsJztcbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHVybFBhcnRzKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGEgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbiAgICovXG4gIGFzeW5jIGNhbmNlbFNoYXJlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zaGFyZSB3YWxsZXQgd2l0aCBleGlzdGluZyBzcGVuZGVycyBvZiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB3YWxsZXRJZFxuICAgKiBAcGFyYW0gdXNlclBhc3N3b3JkXG4gICAqL1xuICBhc3luYyByZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKFxuICAgIHdhbGxldElkOiBzdHJpbmcsXG4gICAgdXNlclBhc3N3b3JkOiBzdHJpbmcsXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmdldCh7IGlkOiB3YWxsZXRJZCB9KTtcbiAgICBpZiAoIXdhbGxldD8uX3dhbGxldD8uZW50ZXJwcmlzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRlcnByaXNlIG5vdCBmb3VuZCBmb3IgdGhlIHdhbGxldCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGVycHJpc2VVc2Vyc1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJpdGdvLnVybChgL2VudGVycHJpc2UvJHt3YWxsZXQ/Ll93YWxsZXQ/LmVudGVycHJpc2V9L3VzZXJgKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICAvLyBjcmVhdGUgYSBtYXAgb2YgdXNlcnMgZm9yIGVhc3kgbG9va3VwIC0gd2UgbmVlZCB0aGUgdXNlciBlbWFpbCBpZCB0byBzaGFyZSB0aGUgd2FsbGV0XG4gICAgY29uc3QgdXNlcnNNYXAgPSBuZXcgTWFwKFxuICAgICAgWy4uLmVudGVycHJpc2VVc2Vyc1Jlc3BvbnNlPy5hZG1pblVzZXJzLCAuLi5lbnRlcnByaXNlVXNlcnNSZXNwb25zZT8ubm9uQWRtaW5Vc2Vyc10ubWFwKChvYmopID0+IFtvYmouaWQsIG9ial0pXG4gICAgKTtcblxuICAgIGlmICh3YWxsZXQuX3dhbGxldC51c2Vycykge1xuICAgICAgZm9yIChjb25zdCB1c2VyIG9mIHdhbGxldC5fd2FsbGV0LnVzZXJzKSB7XG4gICAgICAgIGNvbnN0IHVzZXJPYmplY3QgPSB1c2Vyc01hcC5nZXQodXNlci51c2VyKTtcbiAgICAgICAgaWYgKHVzZXIucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykgJiYgIXVzZXIucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2FkbWluJykgJiYgdXNlck9iamVjdCkge1xuICAgICAgICAgIGNvbnN0IHNoYXJlUGFyYW1zID0ge1xuICAgICAgICAgICAgd2FsbGV0SWQ6IHdhbGxldElkLFxuICAgICAgICAgICAgdXNlcjogdXNlci51c2VyLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHVzZXIucGVybWlzc2lvbnMuam9pbignLCcpLFxuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdXNlclBhc3N3b3JkLFxuICAgICAgICAgICAgZW1haWw6IHVzZXJPYmplY3QuZW1haWwuZW1haWwsXG4gICAgICAgICAgICByZXNoYXJlOiB0cnVlLFxuICAgICAgICAgICAgc2tpcEtleWNoYWluOiBmYWxzZSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd2FsbGV0LnNoYXJlV2FsbGV0KHNoYXJlUGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHRzIGEgd2FsbGV0IHNoYXJlLCBhZGRpbmcgdGhlIHdhbGxldCB0byB0aGUgdXNlcidzIGxpc3RcbiAgICogTmVlZHMgYSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIGtleVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gYWNjZXB0XG4gICAqIEBwYXJhbSBwYXJhbXMudXNlclBhc3N3b3JkIC0gKHJlcXVpcmVkIGlmIG1vcmUgYSBrZXljaGFpbiB3YXMgc2hhcmVkKSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgLSBuZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHNhdmluZyB0aGUgc2hhcmVkIHdhbGxldCBwcnYuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGxlZnQgYmxhbmsgYW5kIGEgd2FsbGV0IHdpdGggbW9yZSB0aGFuIHZpZXcgcGVybWlzc2lvbnMgd2FzIHNoYXJlZCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgdXNlcidzIGxvZ2luIHBhc3N3b3JkIGlzIHVzZWQuXG4gICAqIEBwYXJhbSBwYXJhbXMub3ZlcnJpZGVFbmNyeXB0ZWRQcnYgLSBzZXQgb25seSBpZiB0aGUgcHJ2IHdhcyByZWNlaXZlZCBvdXQtb2YtYmFuZC5cbiAgICovXG4gIGFzeW5jIGFjY2VwdFNoYXJlKHBhcmFtczogQWNjZXB0U2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbJ292ZXJyaWRlRW5jcnlwdGVkUHJ2JywgJ3VzZXJQYXNzd29yZCcsICduZXdXYWxsZXRQYXNzcGhyYXNlJ10pO1xuXG4gICAgbGV0IGVuY3J5cHRlZFBydiA9IHBhcmFtcy5vdmVycmlkZUVuY3J5cHRlZFBydjtcbiAgICBjb25zdCB3YWxsZXRTaGFyZSA9IGF3YWl0IHRoaXMuZ2V0U2hhcmUoeyB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCB9KTtcblxuICAgIC8vIE11bHRpLXVzZXIta2V5IGNhc2U6IHJlcXVpcmVzIHVzZXIgdG8gcHJvdmlkZSB0aGVpciBvd24gcHVibGljIGtleSBpbiBhZGRpdGlvbiB0byB0aGUgZW5jcnlwdGVkIHByaXZhdGUga2V5XG4gICAgaWYgKHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyUGFzc3dvcmQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlclBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgfHwgcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldEtleWNoYWluLnBydixcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1cGRhdGVQYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGVuY3J5cHRlZFBydixcbiAgICAgICAgcHViOiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICB9O1xuXG4gICAgICAvLyBOb3RlOiBVbmxpa2Uga2V5Y2hhaW5PdmVycmlkZVJlcXVpcmVkLCB3ZSBkbyBOT1QgcmVzaGFyZSB0aGUgd2FsbGV0IHdpdGggc3BlbmRlcnNcbiAgICAgIC8vIFRoaXMgaXMgYSBrZXkgZGlmZmVyZW5jZSAtIG11bHRpLWtleS11c2VyLWtleSB3YWxsZXRzIGRvbid0IHJlcXVpcmUgcmVzaGFyZVxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU2hhcmUodXBkYXRlUGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBLZXljaGFpbiBvdmVycmlkZSBjYXNlOiByZXF1aXJlcyB1c2VyIGtleWNoYWluIGNyZWF0aW9uIGFuZCBzaWduaW5nXG4gICAgaWYgKFxuICAgICAgd2FsbGV0U2hhcmUua2V5Y2hhaW5PdmVycmlkZVJlcXVpcmVkICYmXG4gICAgICB3YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmRleE9mKCdhZG1pbicpICE9PSAtMSAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5kZXhPZignc3BlbmQnKSAhPT0gLTFcbiAgICApIHtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyUGFzc3dvcmQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlclBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgLmNyZWF0ZVVzZXJLZXljaGFpbihwYXJhbXMudXNlclBhc3N3b3JkLCBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24pO1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQod2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFBydiB3YXMgbm90IGZvdW5kIG9uIHdhbGxldCBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICB0cmFkaW5nQWNjb3VudElkOiB3YWxsZXRTaGFyZS53YWxsZXQsXG4gICAgICAgIHB1YmtleTogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBwYXlsb2FkU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cbiAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldEtleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydjogcHJpdmF0ZUtleSB9LCBwYXlsb2FkU3RyaW5nKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVwZGF0ZVNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgICAgICBrZXlJZDogd2FsbGV0S2V5Y2hhaW4uaWQsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFN0cmluZyxcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgdGhlIHdhbGxldCBzaGFyZSB3YXMgYWNjZXB0ZWQgc3VjY2Vzc2Z1bGx5IChjaGFuZ2VkPXRydWUpLCByZXNoYXJlIHRoZSB3YWxsZXQgd2l0aCB0aGUgc3BlbmRlcnNcbiAgICAgIGlmIChyZXNwb25zZS5jaGFuZ2VkICYmIHJlc3BvbnNlLnN0YXRlID09PSAnYWNjZXB0ZWQnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldFNoYXJlLndhbGxldCwgcGFyYW1zLnVzZXJQYXNzd29yZCwgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIFRPRE86IFBYLTM4MjZcbiAgICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gcmlnaHQgYXdheSBpZiB0aGVyZSBpcyBubyBrZXljaGFpbiB0byBkZWNyeXB0LCBvciBpZiBleHBsaWNpdCBlbmNyeXB0ZWRQcnYgd2FzIHByb3ZpZGVkXG4gICAgaWYgKCF3YWxsZXRTaGFyZS5rZXljaGFpbiB8fCAhd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IHx8IGVuY3J5cHRlZFBydikge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3JlIHRoYW4gdmlld2luZyB3YXMgcmVxdWVzdGVkLCBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHdhbGxldCBrZXlzIHVzaW5nIHRoZSBzaGFyZWQgZWNkaCBzY2hlbWVcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlclBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nS2V5Y2hhaW4gPSAoYXdhaXQgdGhpcy5iaXRnby5nZXRFQ0RIS2V5Y2hhaW4oKSkgYXMgYW55O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRYcHJ2IHdhcyBub3QgZm91bmQgb24gc2hhcmluZyBrZXljaGFpbicpO1xuICAgIH1cblxuICAgIC8vIE5vdyB3ZSBoYXZlIHRoZSBzaGFyaW5nIGtleWNoYWluLCB3ZSBjYW4gd29yayBvdXQgdGhlIHNlY3JldCB1c2VkIGZvciBzaGFyaW5nIHRoZSB3YWxsZXQgd2l0aCB1c1xuICAgIHNoYXJpbmdLZXljaGFpbi5wcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHBhcmFtcy51c2VyUGFzc3dvcmQsXG4gICAgICBpbnB1dDogc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgfSk7XG4gICAgY29uc3Qgc2VjcmV0ID0gZ2V0U2hhcmVkU2VjcmV0KFxuICAgICAgLy8gRGVyaXZlIGtleSBieSBwYXRoICh3aGljaCBpcyB1c2VkIGJldHdlZW4gdGhlc2UgMiB1c2VycyBvbmx5KVxuICAgICAgYmlwMzIuZnJvbUJhc2U1OChzaGFyaW5nS2V5Y2hhaW4ucHJ2KS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aCh3YWxsZXRTaGFyZS5rZXljaGFpbi5wYXRoKSksXG4gICAgICBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JylcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIFllcyEgV2UgZ290IHRoZSBzZWNyZXQgc3VjY2Vzc2Z1bGx5IGhlcmUsIG5vdyBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0IHBydlxuICAgIGNvbnN0IGRlY3J5cHRlZFNoYXJlZFdhbGxldFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgaW5wdXQ6IHdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICB9KTtcblxuICAgIC8vIFdlIHdpbGwgbm93IHJlLWVuY3J5cHQgdGhlIHdhbGxldCB3aXRoIG91ciBvd24gcGFzc3dvcmRcbiAgICBjb25zdCBuZXdXYWxsZXRQYXNzcGhyYXNlID0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgfHwgcGFyYW1zLnVzZXJQYXNzd29yZDtcbiAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IG5ld1dhbGxldFBhc3NwaHJhc2UsXG4gICAgICBpbnB1dDogZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2LFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICB9KTtcbiAgICBjb25zdCB1cGRhdGVQYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgfTtcblxuICAgIGlmIChlbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHVwZGF0ZVBhcmFtcy5lbmNyeXB0ZWRQcnYgPSBlbmNyeXB0ZWRQcnY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHVwZGF0ZVBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVsayBBY2NlcHQgd2FsbGV0IHNoYXJlcywgYWRkaW5nIHRoZSB3YWxsZXRzIHRvIHRoZSB1c2VyJ3MgbGlzdFxuICAgKiBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgQnVsa0FjY2VwdFNoYXJlT3B0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSBhcnJheSBvZiB0aGUgd2FsbGV0IHNoYXJlcyB0byBhY2NlcHRcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyUGFzc3dvcmQgLSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldCBrZXlcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIC0gbmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciBzYXZpbmcgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBsZWZ0IGJsYW5rIHRoZW4gdGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZCBpcyB1c2VkLlxuICAgKlxuICAgKkByZXR1cm5zIHtQcm9taXNlPEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlPn1cbiAgICovXG4gIGFzeW5jIGJ1bGtBY2NlcHRTaGFyZShwYXJhbXM6IEJ1bGtBY2NlcHRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlckxvZ2luUGFzc3dvcmQnXSwgWyduZXdXYWxsZXRQYXNzcGhyYXNlJ10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICgnbmV3V2FsbGV0UGFzc3BocmFzZScgaW4gcGFyYW1zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHVzZXIgbG9naW4gcGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICBhc3NlcnQocGFyYW1zLndhbGxldFNoYXJlSWRzLmxlbmd0aCA+IDAsICdQbGVhc2UgcHJvdmlkZSBhdCBsZWFzdCBvbmUgd2FsbGV0IHNoYXJlIHRvIGFjY2VwdCcpO1xuXG4gICAgY29uc3QgYWxsV2FsbGV0U2hhcmVzID0gYXdhaXQgdGhpcy5saXN0U2hhcmVzVjIoKTtcbiAgICBjb25zdCB3YWxsZXRTaGFyZU1hcCA9IGFsbFdhbGxldFNoYXJlcy5pbmNvbWluZy5yZWR1Y2UoXG4gICAgICAobWFwOiB7IFtrZXk6IHN0cmluZ106IFdhbGxldFNoYXJlIH0sIHNoYXJlKSA9PiAoeyAuLi5tYXAsIFtzaGFyZS5pZF06IHNoYXJlIH0pLFxuICAgICAge31cbiAgICApO1xuXG4gICAgY29uc3Qgd2FsbGV0U2hhcmVzID0gcGFyYW1zLndhbGxldFNoYXJlSWRzXG4gICAgICAubWFwKCh3YWxsZXRTaGFyZUlkKSA9PiB3YWxsZXRTaGFyZU1hcFt3YWxsZXRTaGFyZUlkXSlcbiAgICAgIC5maWx0ZXIoKHdhbGxldFNoYXJlKSA9PiB3YWxsZXRTaGFyZSAmJiAod2FsbGV0U2hhcmUua2V5Y2hhaW4gfHwgd2FsbGV0U2hhcmUudXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCkpO1xuXG4gICAgaWYgKCF3YWxsZXRTaGFyZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZhbGlkIHdhbGxldCBzaGFyZXMgZm91bmQgdG8gYWNjZXB0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZ0tleWNoYWluID0gYXdhaXQgdGhpcy5iaXRnby5nZXRFQ0RIS2V5Y2hhaW4oKTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkWHBydiB3YXMgbm90IGZvdW5kIG9uIHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBzaGFyaW5nS2V5Y2hhaW4ucHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQsXG4gICAgICBpbnB1dDogc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgfSk7XG4gICAgY29uc3QgbmV3V2FsbGV0UGFzc3BocmFzZSA9IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyTG9naW5QYXNzd29yZDtcbiAgICBjb25zdCB3ZWJhdXRobkluZm8gPSBwYXJhbXMud2ViYXV0aG5JbmZvO1xuICAgIGNvbnN0IGtleXNGb3JXYWxsZXRTaGFyZXMgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgd2FsbGV0U2hhcmVzLm1hcChhc3luYyAod2FsbGV0U2hhcmUpID0+IHtcbiAgICAgICAgICAvLyBIYW5kbGUgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCBjYXNlIC0gdGhlc2Ugc2hhcmVzIGRvbid0IGhhdmUga2V5Y2hhaW5zXG4gICAgICAgICAgaWYgKHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGlmICghcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBnZW5lcmF0ZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHdhbGxldEtleWNoYWluLnBydixcbiAgICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdhbGxldFNoYXJlSWQ6IHdhbGxldFNoYXJlLmlkLFxuICAgICAgICAgICAgICAgIGVuY3J5cHRlZFBydjogZW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgICAgIHB1Yjogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGFuZGFyZCBjYXNlOiBzaGFyZXMgd2l0aCBrZXljaGFpbnNcbiAgICAgICAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChcbiAgICAgICAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgICAgICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgICAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgICAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgICAgaW5wdXQ6IGRlY3J5cHRlZFNoYXJlZFdhbGxldFBydixcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZW50cnk6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3QgPSB7XG4gICAgICAgICAgICB3YWxsZXRTaGFyZUlkOiB3YWxsZXRTaGFyZS5pZCxcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHdlYmF1dGhuSW5mbykge1xuICAgICAgICAgICAgZW50cnkud2ViYXV0aG5JbmZvID0ge1xuICAgICAgICAgICAgICBvdHBEZXZpY2VJZDogd2ViYXV0aG5JbmZvLm90cERldmljZUlkLFxuICAgICAgICAgICAgICBwcmZTYWx0OiB3ZWJhdXRobkluZm8ucHJmU2FsdCxcbiAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiB3ZWJhdXRobkluZm8ucGFzc3BocmFzZSxcbiAgICAgICAgICAgICAgICBpbnB1dDogZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgICAgICAgYWRhdGE6IHdhbGxldFNoYXJlLmVudGVycHJpc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtlbnRyeV07XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG5cbiAgICByZXR1cm4gdGhpcy5idWxrQWNjZXB0U2hhcmVSZXF1ZXN0KGtleXNGb3JXYWxsZXRTaGFyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgbXVsdGlwbGUgd2FsbGV0IHNoYXJlcyBpbiBidWxrXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB1c2VycyB0byBhY2NlcHQgb3IgcmVqZWN0IG11bHRpcGxlIHdhbGxldCBzaGFyZXMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBJdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiB3YWxsZXQgc2hhcmVzIGluY2x1ZGluZyB0aG9zZSByZXF1aXJpbmcgc3BlY2lhbCBrZXljaGFpbiBvdmVycmlkZXNcbiAgICogYW5kIHRob3NlIHdpdGggZW5jcnlwdGVkIHByaXZhdGUga2V5cyB0aGF0IG5lZWQgdG8gYmUgZGVjcnlwdGVkIGFuZCByZS1lbmNyeXB0ZWQuXG4gICAqIEFmdGVyIHByb2Nlc3NpbmcsIGl0IGFsc28gcmVzaGFyZXMgYWNjZXB0ZWQgd2FsbGV0cyB3aXRoIHNwZW5kZXJzIGZvciBzcGVjaWFsIG92ZXJyaWRlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9ucyBmb3IgYnVsayB1cGRhdGluZyB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXMuc2hhcmVzIC0gQXJyYXkgb2Ygd2FsbGV0IHNoYXJlcyB0byB1cGRhdGUgd2l0aCB0aGVpciBzdGF0dXMgKGFjY2VwdC9yZWplY3QpXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQgLSBVc2VyJ3MgbG9naW4gcGFzc3dvcmQgZm9yIGRlY3J5cHRpb24gb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgLSBOZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHJlLWVuY3J5cHRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgcmVzcG9uc2VzIGZvciBlYWNoIHdhbGxldCBzaGFyZSB1cGRhdGVcbiAgICovXG4gIGFzeW5jIGJ1bGtVcGRhdGVXYWxsZXRTaGFyZShwYXJhbXM6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlPiB7XG4gICAgaWYgKCFwYXJhbXMuc2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiBzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnNoYXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBhcnJheTogc2hhcmVzIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy5zaGFyZXMpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggc2hhcmUgaW4gdGhlIGFycmF5XG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBwYXJhbXMuc2hhcmVzKSB7XG4gICAgICBpZiAoIXNoYXJlLndhbGxldFNoYXJlSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFNoYXJlSWQgaW4gc2hhcmUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaGFyZS5zdGF0dXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHN0YXR1cyBpbiBzaGFyZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hhcmUuc3RhdHVzICE9PSAnYWNjZXB0JyAmJiBzaGFyZS5zdGF0dXMgIT09ICdyZWplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0dXMgaW4gc2hhcmU6ICcgKyBzaGFyZS5zdGF0dXMgKyAnLiBNdXN0IGJlIGVpdGhlciBcImFjY2VwdFwiIG9yIFwicmVqZWN0XCInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzaGFyZS53YWxsZXRTaGFyZUlkICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyB3YWxsZXRTaGFyZUlkIHRvIGJlIGEgc3RyaW5nIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHNoYXJlLndhbGxldFNoYXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBzdHJpbmc6IHVzZXJMb2dpblBhc3N3b3JkIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgcGFyYW1ldGVyIHN0cmluZzogbmV3V2FsbGV0UGFzc3BocmFzZSBidXQgZm91bmQgJyArIHR5cGVvZiBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSk7XG4gICAgfVxuICAgIGFzc2VydChwYXJhbXMuc2hhcmVzLmxlbmd0aCA+IDAsICdubyBzaGFyZXMgYXJlIHBhc3NlZCcpO1xuXG4gICAgY29uc3QgeyBzaGFyZXM6IGlucHV0U2hhcmVzLCB1c2VyTG9naW5QYXNzd29yZCwgbmV3V2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb24gfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGFsbFdhbGxldFNoYXJlcyA9IGF3YWl0IHRoaXMubGlzdFNoYXJlc1YyKCk7XG5cbiAgICAvLyBPbmx5IGluY2x1ZGUgc2hhcmVzIHRoYXQgYXJlIGluIHRoZSBpbnB1dCBhcnJheSBmb3IgZWZmaWNpZW5jeVxuICAgIGNvbnN0IHNoYXJlSWRzID0gbmV3IFNldChpbnB1dFNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZS53YWxsZXRTaGFyZUlkKSk7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBhbGxXYWxsZXRTaGFyZXMuaW5jb21pbmdcbiAgICAgIC5maWx0ZXIoKHNoYXJlKSA9PiBzaGFyZUlkcy5oYXMoc2hhcmUuaWQpKVxuICAgICAgLmZvckVhY2goKHNoYXJlKSA9PiB3YWxsZXRTaGFyZU1hcC5zZXQoc2hhcmUuaWQsIHNoYXJlKSk7XG5cbiAgICBhbGxXYWxsZXRTaGFyZXMub3V0Z29pbmdcbiAgICAgIC5maWx0ZXIoKHNoYXJlKSA9PiBzaGFyZUlkcy5oYXMoc2hhcmUuaWQpKVxuICAgICAgLmZvckVhY2goKHNoYXJlKSA9PiB3YWxsZXRTaGFyZU1hcC5zZXQoc2hhcmUuaWQsIHNoYXJlKSk7XG5cbiAgICBjb25zdCByZXNvbHZlZFNoYXJlcyA9IGlucHV0U2hhcmVzLm1hcCgoc2hhcmUpID0+IHtcbiAgICAgIGNvbnN0IHdhbGxldFNoYXJlID0gd2FsbGV0U2hhcmVNYXAuZ2V0KHNoYXJlLndhbGxldFNoYXJlSWQpO1xuICAgICAgaWYgKCF3YWxsZXRTaGFyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2FsbGV0IHNoYXJlIHByb3ZpZGVkOiAke3NoYXJlLndhbGxldFNoYXJlSWR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zaGFyZSwgd2FsbGV0U2hhcmUgfTtcbiAgICB9KTtcblxuICAgIC8vIElkZW50aWZ5IHNwZWNpYWwgb3ZlcnJpZGUgY2FzZXMgdGhhdCBuZWVkIHJlc2hhcmluZyBhZnRlciBhY2NlcHRhbmNlXG4gICAgY29uc3Qgc3BlY2lhbE92ZXJyaWRlQ2FzZXMgPSBuZXcgTWFwKCk7XG4gICAgcmVzb2x2ZWRTaGFyZXMuZm9yRWFjaCgoc2hhcmUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgc2hhcmUuc3RhdHVzID09PSAnYWNjZXB0JyAmJlxuICAgICAgICBzaGFyZS53YWxsZXRTaGFyZS5rZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQgJiZcbiAgICAgICAgc2hhcmUud2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2FkbWluJykgJiZcbiAgICAgICAgc2hhcmUud2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJylcbiAgICAgICkge1xuICAgICAgICBzcGVjaWFsT3ZlcnJpZGVDYXNlcy5zZXQoc2hhcmUud2FsbGV0U2hhcmVJZCwgc2hhcmUud2FsbGV0U2hhcmUud2FsbGV0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERlY3J5cHQgc2hhcmluZyBrZXljaGFpbiBpZiBuZWVkZWQgKG9ubHkgb25jZSlcbiAgICBsZXQgc2hhcmluZ0tleWNoYWluUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGRlY3J5cHQgaWYgdGhlcmUgYXJlIHNoYXJlcyB0byBhY2NlcHQgdGhhdCBtaWdodCBuZWVkIGl0XG4gICAgY29uc3QgaGFzU2hhcmVzUmVxdWlyaW5nRGVjcnlwdGlvbiA9XG4gICAgICBzcGVjaWFsT3ZlcnJpZGVDYXNlcy5zaXplID4gMCB8fFxuICAgICAgcmVzb2x2ZWRTaGFyZXMuc29tZSgoc2hhcmUpID0+IHNoYXJlLnN0YXR1cyA9PT0gJ2FjY2VwdCcgJiYgc2hhcmUud2FsbGV0U2hhcmUua2V5Y2hhaW4/LmVuY3J5cHRlZFBydik7XG5cbiAgICBpZiAodXNlckxvZ2luUGFzc3dvcmQgJiYgaGFzU2hhcmVzUmVxdWlyaW5nRGVjcnlwdGlvbikge1xuICAgICAgY29uc3Qgc2hhcmluZ0tleWNoYWluID0gYXdhaXQgdGhpcy5iaXRnby5nZXRFQ0RIS2V5Y2hhaW4oKTtcbiAgICAgIGlmICghc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRYcHJ2IHdhcyBub3QgZm91bmQgb24gc2hhcmluZyBrZXljaGFpbicpO1xuICAgICAgfVxuICAgICAgc2hhcmluZ0tleWNoYWluUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0bGVkVXBkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHJlc29sdmVkU2hhcmVzLm1hcChhc3luYyAoc2hhcmUpID0+IHtcbiAgICAgICAgY29uc3QgeyB3YWxsZXRTaGFyZUlkLCBzdGF0dXMsIHdhbGxldFNoYXJlIH0gPSBzaGFyZTtcblxuICAgICAgICAvLyBIYW5kbGUgYWNjZXB0IGNhc2VcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ2FjY2VwdCcpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQWNjZXB0U2hhcmUoXG4gICAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgICAgd2FsbGV0U2hhcmUsXG4gICAgICAgICAgICB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgICAgICAgIG5ld1dhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICBzaGFyaW5nS2V5Y2hhaW5QcnYsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvblxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgcmVqZWN0IGNhc2VcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgICAgc3RhdHVzOiAncmVqZWN0JyBhcyBjb25zdCxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHVwZGF0ZXNcbiAgICBjb25zdCBzdWNjZXNzZnVsVXBkYXRlcyA9IHNldHRsZWRVcGRhdGVzLmZsYXRNYXAoKHJlc3VsdCkgPT4gKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnID8gcmVzdWx0LnZhbHVlIDogW10pKTtcblxuICAgIC8vIEV4dHJhY3QgZmFpbGVkIHVwZGF0ZXMgLSBvbmx5IGZyb20gcmVqZWN0ZWQgcHJvbWlzZXNcbiAgICBjb25zdCBmYWlsZWRVcGRhdGVzID0gc2V0dGxlZFVwZGF0ZXMucmVkdWNlPEFycmF5PHsgd2FsbGV0U2hhcmVJZDogc3RyaW5nOyByZWFzb246IHN0cmluZyB9Pj4oXG4gICAgICAoYWNjLCByZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgcmVqZWN0ZWRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZDogcmVzb2x2ZWRTaGFyZXNbaW5kZXhdLndhbGxldFNoYXJlSWQsXG4gICAgICAgICAgICByZWFzb246IHJlamVjdGVkUmVzdWx0LnJlYXNvbj8ubWVzc2FnZSB8fCBTdHJpbmcocmVqZWN0ZWRSZXN1bHQucmVhc29uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIFtdXG4gICAgKTtcblxuICAgIC8vIFNlbmQgc3VjY2Vzc2Z1bCB1cGRhdGVzIHRvIHRoZSBzZXJ2ZXJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVxdWVzdChzdWNjZXNzZnVsVXBkYXRlcyk7XG5cbiAgICAvLyBQcm9jZXNzIGFjY2VwdGVkIHNwZWNpYWwgb3ZlcnJpZGUgY2FzZXMgLSByZXNoYXJlIHdpdGggc3BlbmRlcnNcbiAgICBpZiAocmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMgJiYgcmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMubGVuZ3RoID4gMCAmJiB1c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgLy8gRm9yIGVhY2ggYWNjZXB0ZWQgd2FsbGV0IHNoYXJlIHRoYXQgaXMgYSBzcGVjaWFsIG92ZXJyaWRlIGNhc2UsIHJlc2hhcmUgd2l0aCBzcGVuZGVyc1xuICAgICAgZm9yIChjb25zdCB3YWxsZXRTaGFyZUlkIG9mIHJlc3BvbnNlLmFjY2VwdGVkV2FsbGV0U2hhcmVzKSB7XG4gICAgICAgIGlmIChzcGVjaWFsT3ZlcnJpZGVDYXNlcy5oYXMod2FsbGV0U2hhcmVJZCkpIHtcbiAgICAgICAgICBjb25zdCB3YWxsZXRJZCA9IHNwZWNpYWxPdmVycmlkZUNhc2VzLmdldCh3YWxsZXRTaGFyZUlkKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldElkLCB1c2VyTG9naW5QYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIExvZyBlcnJvciBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBzaGFyZXNcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlc2hhcmluZyB3YWxsZXQgJHt3YWxsZXRJZH0gd2l0aCBzcGVuZGVyczogJHtlPy5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBmYWlsZWQgdXBkYXRlcyB0byB0aGUgcmVzcG9uc2VcbiAgICBpZiAoZmFpbGVkVXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXNwb25zZS53YWxsZXRTaGFyZVVwZGF0ZUVycm9ycy5wdXNoKC4uLmZhaWxlZFVwZGF0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGEgd2FsbGV0IHNoYXJlIHRoYXQgaXMgYmVpbmcgYWNjZXB0ZWRcbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgZGlmZmVyZW50IGNhc2VzIGZvciBhY2NlcHRpbmcgYSB3YWxsZXQgc2hhcmU6XG4gICAqIDEuIFNwZWNpYWwgb3ZlcnJpZGUgY2FzZSByZXF1aXJpbmcgdXNlciBrZXljaGFpbiBhbmQgc2lnbmluZ1xuICAgKiAyLiBTaW1wbGUgY2FzZSB3aXRoIG5vIGtleWNoYWluIHRvIGRlY3J5cHRcbiAgICogMy4gU3RhbmRhcmQgY2FzZSByZXF1aXJpbmcgZGVjcnlwdGlvbiBhbmQgcmUtZW5jcnlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0U2hhcmVJZCAtIElEIG9mIHRoZSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHdhbGxldFNoYXJlIC0gV2FsbGV0IHNoYXJlIG9iamVjdFxuICAgKiBAcGFyYW0gdXNlckxvZ2luUGFzc3dvcmQgLSBVc2VyJ3MgbG9naW4gcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1dhbGxldFBhc3NwaHJhc2UgLSBOZXcgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHNoYXJpbmdLZXljaGFpblBydiAtIERlY3J5cHRlZCBzaGFyaW5nIGtleWNoYWluIHByaXZhdGUga2V5XG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHdhbGxldCBzaGFyZSB1cGRhdGUgcmVxdWVzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0FjY2VwdFNoYXJlKFxuICAgIHdhbGxldFNoYXJlSWQ6IHN0cmluZyxcbiAgICB3YWxsZXRTaGFyZTogV2FsbGV0U2hhcmUsXG4gICAgdXNlckxvZ2luUGFzc3dvcmQ/OiBzdHJpbmcsXG4gICAgbmV3V2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBzaGFyaW5nS2V5Y2hhaW5QcnY/OiBzdHJpbmcsXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvblxuICApOiBQcm9taXNlPEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0W10+IHtcbiAgICAvLyBTcGVjaWFsIG92ZXJyaWRlIGNhc2U6IHJlcXVpcmVzIHVzZXIga2V5Y2hhaW4gYW5kIHNpZ25pbmdcbiAgICBpZiAoXG4gICAgICB3YWxsZXRTaGFyZS5rZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdhZG1pbicpICYmXG4gICAgICB3YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKVxuICAgICkge1xuICAgICAgaWYgKCF1c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgLmNyZWF0ZVVzZXJLZXljaGFpbihuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkLCBlbmNyeXB0aW9uVmVyc2lvbik7XG4gICAgICBpZiAoIXdhbGxldEtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFBydiB3YXMgbm90IGZvdW5kIG9uIHdhbGxldCBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0cmFkaW5nQWNjb3VudElkOiB3YWxsZXRTaGFyZS53YWxsZXQsXG4gICAgICAgIHB1YmtleTogd2FsbGV0S2V5Y2hhaW4ucHViLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogdXNlckxvZ2luUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydiB9LCBwYXlsb2FkKTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHdhbGxldFNoYXJlSWQsXG4gICAgICAgICAgc3RhdHVzOiAnYWNjZXB0JyBhcyBjb25zdCxcbiAgICAgICAgICBrZXlJZDogd2FsbGV0S2V5Y2hhaW4uaWQsXG4gICAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIE11bHRpLXVzZXIta2V5IGNhc2U6IHJlcXVpcmVzIHVzZXIgdG8gcHJvdmlkZSB0aGVpciBvd24gcHVibGljIGtleVxuICAgIGlmICh3YWxsZXRTaGFyZS51c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkKSB7XG4gICAgICBpZiAoIShuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSB8fCB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldEtleWNoYWluLnBydixcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHdhbGxldFNoYXJlSWQsXG4gICAgICAgICAgc3RhdHVzOiAnYWNjZXB0JyBhcyBjb25zdCxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGVuY3J5cHRlZFBydixcbiAgICAgICAgICBwdWI6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHJpZ2h0IGF3YXkgaWYgdGhlcmUgaXMgbm8ga2V5Y2hhaW4gdG8gZGVjcnlwdFxuICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4gfHwgIXdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHdhbGxldFNoYXJlSWQsXG4gICAgICAgICAgc3RhdHVzOiAnYWNjZXB0JyBhcyBjb25zdCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gTW9yZSB0aGFuIHZpZXdpbmcgd2FzIHJlcXVlc3RlZCwgc28gd2UgbmVlZCB0byBwcm9jZXNzIHRoZSB3YWxsZXQga2V5cyB1c2luZyB0aGUgc2hhcmVkIGVjZGggc2NoZW1lXG4gICAgaWYgKCF1c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyTG9naW5QYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXNoYXJpbmdLZXljaGFpblBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gcmV0cmlldmUgYW5kIGRlY3J5cHQgc2hhcmluZyBrZXljaGFpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpblBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpO1xuXG4gICAgY29uc3Qgc2hhcmVkU2VjcmV0ID0gZ2V0U2hhcmVkU2VjcmV0KGRlcml2ZWRLZXksIEJ1ZmZlci5mcm9tKHdhbGxldFNoYXJlLmtleWNoYWluLmZyb21QdWJLZXksICdoZXgnKSkudG9TdHJpbmcoXG4gICAgICAnaGV4J1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHNoYXJlZFNlY3JldCxcbiAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgfSk7XG5cbiAgICAvLyBXZSB3aWxsIG5vdyByZS1lbmNyeXB0IHRoZSB3YWxsZXQgd2l0aCBvdXIgb3duIHBhc3N3b3JkXG4gICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IGRlY3J5cHRlZFBydixcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZCxcbiAgICAgICAgc3RhdHVzOiAnYWNjZXB0JyBhcyBjb25zdCxcbiAgICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBpdHMgSURcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlkIHdhbGxldCBpZFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFdhbGxldChwYXJhbXM6IEdldFdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogR2V0V2FsbGV0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaW5jbHVkZUJhbGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcXVlcnkuaW5jbHVkZUJhbGFuY2UgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2U7XG4gICAgfVxuXG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpKTtcblxuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHBhcmFtcy5pZCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgd2FsbGV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3YWxsZXQgYnkgaXRzIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3Mgd2FsbGV0IGFkZHJlc3NcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXRCeUFkZHJlc3MocGFyYW1zOiBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSk7XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkcmVzcy8nICsgcGFyYW1zLmFkZHJlc3MpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3YWxsZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgZ2l2ZW4gc3VwcG9ydGVkIGNvaW4sIGdldCB0b3RhbCBiYWxhbmNlcyBmb3IgYWxsIHdhbGxldHMgb2YgdGhhdFxuICAgKiBjb2luIHR5cGUgb24gdGhlIGFjY291bnQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRUb3RhbEJhbGFuY2VzKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9iYWxhbmNlcycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBUU1Mgd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lciBjYWxsYmFja3MgZm9yIGtleSBnZW5lcmF0aW9uLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1wY1dhbGxldFdpdGhFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IEdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyT3B0aW9uc1xuICApOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCB7IGxhYmVsLCBlbnRlcnByaXNlLCB0eXBlID0gJ2hvdCcgfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1RzcygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBhdCB0aGlzIHRpbWVgKTtcbiAgICB9XG5cbiAgICBpZiAoIWVudGVycHJpc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW50ZXJwcmlzZSBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldCBnZW5lcmF0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmXG4gICAgICBwYXJhbXMud2FsbGV0VmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFVk0gVFNTIHdhbGxldHMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB3YWxsZXQgdmVyc2lvbiA1IGFuZCA2Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2N1c3RvZGlhbCBUU1Mgd2FsbGV0cyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzY29kZUVuY3J5cHRpb25Db2RlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFRTUyBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndlYmF1dGhuSW5mbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2ViYXV0aG5JbmZvIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFRTUyBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzcGhyYXNlUGF0aFBhcmFtcyA9IFsncGFzc3BocmFzZScsICd1c2VyS2V5JywgJ2JhY2t1cFhwdWInLCAnYmFja3VwWHB1YlByb3ZpZGVyJ10gYXMgY29uc3Q7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGFzc3BocmFzZVBhdGhQYXJhbXMpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXNba2V5XSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gY2Fubm90IGJlIHVzZWQgd2l0aCBUU1MgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbXBjQWxnb3JpdGhtID0gdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKTtcbiAgICBsZXQgd2FsbGV0VmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkID0gcGFyYW1zLndhbGxldFZlcnNpb247XG4gICAgbGV0IGtleWNoYWluczogS2V5Y2hhaW5zVHJpcGxldDtcblxuICAgIGlmIChtcGNBbGdvcml0aG0gPT09ICdlY2RzYScpIHtcbiAgICAgIGlmICghcGFyYW1zLmVjZHNhTVBDdjJDYWxsYmFja3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlY2RzYU1QQ3YyQ2FsbGJhY2tzIGlzIHJlcXVpcmVkIGZvciBFQ0RTQSBUU1Mgd2FsbGV0IGdlbmVyYXRpb24gd2l0aCBleHRlcm5hbCBzaWduZXInKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLmdldCh0aGlzLmJpdGdvLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvdjIvdHNzL3NldHRpbmdzJykpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/Lm11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG5cbiAgICAgIGlmICh3YWxsZXRWZXJzaW9uID09PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRUNEU0EgTVBDdjEgKHdhbGxldCB2ZXJzaW9uIDMpIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICh3YWxsZXRWZXJzaW9uID09PSA1IHx8IHdhbGxldFZlcnNpb24gPT09IDYpICYmXG4gICAgICAgICF0aGlzLmJhc2VDb2luLmdldENvbmZpZygpLmZlYXR1cmVzLmluY2x1ZGVzKENvaW5GZWF0dXJlLk1QQ1YyKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgVFNTIE1QQ3YyIGF0IHRoaXMgdGltZWApO1xuICAgICAgfVxuXG4gICAgICBrZXljaGFpbnMgPSBhd2FpdCBuZXcgRUNEU0FVdGlscy5FY2RzYU1QQ3YyVXRpbHModGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbikuY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgY2FsbGJhY2tzOiBwYXJhbXMuZWNkc2FNUEN2MkNhbGxiYWNrcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXBhcmFtcy5lZGRzYUNhbGxiYWNrcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VkZHNhQ2FsbGJhY2tzIGlzIHJlcXVpcmVkIGZvciBFZERTQSBUU1Mgd2FsbGV0IGdlbmVyYXRpb24gd2l0aCBleHRlcm5hbCBzaWduZXInKTtcbiAgICAgIH1cbiAgICAgIGtleWNoYWlucyA9IGF3YWl0IG5ldyBFRERTQVV0aWxzLmRlZmF1bHQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbikuY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHtcbiAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgY2FsbGJhY2tzOiBwYXJhbXMuZWRkc2FDYWxsYmFja3MsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGtleWNoYWlucztcbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdLFxuICAgICAgdHlwZSxcbiAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBUU1Mgb3IgQkxTLURLRyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNcGNXYWxsZXQoe1xuICAgIHBhc3NwaHJhc2UsXG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGVudGVycHJpc2UsXG4gICAgd2FsbGV0VmVyc2lvbixcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgd2ViYXV0aG5JbmZvLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICB9OiBHZW5lcmF0ZU1wY1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgLy8gQ3JlYXRlIE1QQyBLZXljaGFpbnNcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZU1wYyh7XG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHdlYmF1dGhuSW5mbyxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIFdhbGxldFxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9ID0ga2V5Y2hhaW5zO1xuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgIH07XG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYWNrdXBLZXljaGFpbi5wcnYpKSB7XG4gICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU2VsZi1NYW5hZ2VkIENvbGQgVFNTIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVNNQ01wY1dhbGxldCh7XG4gICAgbGFiZWwsXG4gICAgbXVsdGlzaWdUeXBlLFxuICAgIGVudGVycHJpc2UsXG4gICAgd2FsbGV0VmVyc2lvbixcbiAgICBiaXRnb0tleUlkLFxuICAgIGNvbW1vbktleWNoYWluLFxuICAgIGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgfTogR2VuZXJhdGVTTUNNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBsZXQgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5jb2xkTXVsdGlTaWdUeXBlVmVyc2lvbjtcbiAgICAgIHdhbGxldFZlcnNpb24gPSB0aGlzLmRldGVybWluZUVjZHNhTXBjV2FsbGV0VmVyc2lvbih3YWxsZXRWZXJzaW9uLCBtdWx0aXNpZ1R5cGVWZXJzaW9uKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgTVBDIEtleWNoYWluc1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBiaXRnb0tleUlkIH0pO1xuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8ICFiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdEdvIGtleWNoYWluIG5vdCBmb3VuZCcpO1xuICAgIH1cblxuICAgIGlmIChiaXRnb0tleWNoYWluLnNvdXJjZSAhPT0gJ2JpdGdvJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgYml0Z29LZXlJZCBpcyBub3QgYSBCaXRHbyBrZXljaGFpbicpO1xuICAgIH1cblxuICAgIGlmIChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluICE9PSBjb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgQ29tbW9uIGtleWNoYWluIG1pc21hdGNoIHdpdGggdGhlIHByb3ZpZGVkIEJpdGdvIGtleScpO1xuICAgIH1cblxuICAgIGlmICghY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogY29tbW9uS2V5Y2hhaW4sXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBjb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICBpc01QQ3YyOiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHVzZXJLZXljaGFpblBhcmFtcyk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlDaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGNvbW1vbktleWNoYWluLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgaXNNUEN2MjogbXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJyA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoYmFja3VwS2V5Q2hhaW5QYXJhbXMpO1xuXG4gICAgLy8gQ3JlYXRlIFdhbGxldFxuICAgIGNvbnN0IGtleWNoYWlucyA9IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9O1xuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICB0eXBlOiAnY29sZCcsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ3VzdG9kaWFsIFRTUyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVDdXN0b2RpYWxNcGNXYWxsZXQoe1xuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gIH06IEdlbmVyYXRlQmFzZU1wY1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGlmIChtdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpIHtcbiAgICAgIGNvbnN0IHRzc1NldHRpbmdzOiBUc3NTZXR0aW5ncyA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLmdldCh0aGlzLmJpdGdvLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvdjIvdHNzL3NldHRpbmdzJykpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG11bHRpc2lnVHlwZVZlcnNpb24gPVxuICAgICAgICB0c3NTZXR0aW5ncy5jb2luU2V0dGluZ3NbdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKV0/LndhbGxldENyZWF0aW9uU2V0dGluZ3M/LmN1c3RvZGlhbE11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB3YWxsZXRWZXJzaW9uLFxuICAgICAgdHlwZTogJ2N1c3RvZGlhbCcsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSB3YWxsZXQua2V5SWRzKCk7XG4gICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgd2FsbGV0LFxuICAgICAgdXNlcktleWNoYWluOiB7IGlkOiBrZXljaGFpbnNbMF0sIHR5cGU6IG11bHRpc2lnVHlwZSwgc291cmNlOiAndXNlcicgfSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiB7IGlkOiBrZXljaGFpbnNbMV0sIHR5cGU6IG11bHRpc2lnVHlwZSwgc291cmNlOiAnYmFja3VwJyB9LFxuICAgICAgYml0Z29LZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzJdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ2JpdGdvJyB9LFxuICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGRldGVybWluZUVjZHNhTXBjV2FsbGV0VmVyc2lvbih3YWxsZXRWZXJzaW9uPzogbnVtYmVyLCBtdWx0aXNpZ1R5cGVWZXJzaW9uPzogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmIG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicpIHtcbiAgICAgIGlmICghd2FsbGV0VmVyc2lvbiB8fCAod2FsbGV0VmVyc2lvbiAhPT0gNSAmJiB3YWxsZXRWZXJzaW9uICE9PSA2KSkge1xuICAgICAgICByZXR1cm4gNTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdhbGxldFZlcnNpb247XG4gIH1cbn1cbiJdfQ==
|
|
1718
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvREEsc0RBSUM7QUF4REQ7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLDhDQUF3QztBQUN4QywwQ0FBNEI7QUFDNUIsNENBQTZDO0FBRTdDLG1DQUFrRTtBQUNsRSxxREFBdUM7QUFHdkMsa0NBQTBDO0FBQzFDLDBDQUF1RTtBQUN2RSxvQ0FBNkY7QUFDN0YseUNBMkJvQjtBQUVwQixxQ0FBa0M7QUFFbEMsOENBQXlGO0FBRXpGOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLE1BQTRGO0lBRTVGLE9BQU8sTUFBTSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBYSxPQUFPO0lBSWxCLFlBQVksS0FBZ0IsRUFBRSxRQUFtQjtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUEyQixFQUFFO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBc0QsRUFBRTtRQUNqRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxD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RSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7WUFDdEUsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7WUFDMUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7WUFDeEUsWUFBWSxFQUFFLHFCQUFxQjtTQUNwQyxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLDhCQUE4QixDQUFDLGFBQXNCLEVBQUUsbUJBQTRCO1FBQ3pGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxtQkFBbUIsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQTk5REQsMEJBODlEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBDb2luRmVhdHVyZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuaW1wb3J0IHsgRW5jcnlwdGlvblZlcnNpb24sIHNhbml0aXplTGVnYWN5UGF0aCB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCwgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgS2V5Y2hhaW4sIEtleUluZGljZXMgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBkZWNvZGVPckVsc2UsIEVDRFNBVXRpbHMsIEVERFNBVXRpbHMsIHByb21pc2VQcm9wcywgUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIEFjY2VwdFNoYXJlT3B0aW9ucyxcbiAgQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdCxcbiAgQWRkV2FsbGV0T3B0aW9ucyxcbiAgQnVsa0FjY2VwdFNoYXJlT3B0aW9ucyxcbiAgQnVsa0FjY2VwdFNoYXJlUmVzcG9uc2UsXG4gIEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnMsXG4gIEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0LFxuICBCdWxrVXBkYXRlV2FsbGV0U2hhcmVSZXNwb25zZSxcbiAgR2VuZXJhdGVCYXNlTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYyxcbiAgR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYyxcbiAgR2VuZXJhdGVNcGNXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZVNNQ01wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXJPcHRpb25zLFxuICBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zLFxuICBHZXRXYWxsZXRPcHRpb25zLFxuICBHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluLFxuICBJV2FsbGV0cyxcbiAgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyxcbiAgTGlzdFdhbGxldE9wdGlvbnMsXG4gIFVwZGF0ZVNoYXJlT3B0aW9ucyxcbiAgV2FsbGV0U2hhcmVzLFxuICBXYWxsZXRXaXRoS2V5Y2hhaW5zLFxufSBmcm9tICcuL2lXYWxsZXRzJztcbmltcG9ydCB7IFdhbGxldFNoYXJlIH0gZnJvbSAnLi9pV2FsbGV0JztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4vd2FsbGV0JztcbmltcG9ydCB7IFRzc1NldHRpbmdzIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVFdm1LZXlSaW5nV2FsbGV0LCB2YWxpZGF0ZUV2bUtleVJpbmdXYWxsZXRQYXJhbXMgfSBmcm9tICcuLi9ldm0vZXZtVXRpbHMnO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgd2FsbGV0IGlzIGEgV2FsbGV0V2l0aEtleWNoYWluc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXYWxsZXRXaXRoS2V5Y2hhaW5zKFxuICB3YWxsZXQ6IFdhbGxldFdpdGhLZXljaGFpbnMgfCBMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpblxuKTogd2FsbGV0IGlzIFdhbGxldFdpdGhLZXljaGFpbnMge1xuICByZXR1cm4gd2FsbGV0LnJlc3BvbnNlVHlwZSA9PT0gJ1dhbGxldFdpdGhLZXljaGFpbnMnO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0cyBpbXBsZW1lbnRzIElXYWxsZXRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbikge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IElEIChwcm94eSBmb3IgZ2V0V2FsbGV0KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXQocGFyYW1zOiBHZXRXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHJldHVybiB0aGlzLmdldFdhbGxldChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYSB1c2VyJ3Mgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RXYWxsZXRPcHRpb25zICYgeyBlbnRlcnByaXNlPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8eyB3YWxsZXRzOiBXYWxsZXRbXSB9PiB7XG4gICAgaWYgKHBhcmFtcy5za2lwICYmIHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBza2lwIGFuZCBwcmV2SWQnKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IChhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldCcpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKSBhcyBhbnk7XG4gICAgYm9keS53YWxsZXRzID0gYm9keS53YWxsZXRzLm1hcCgodykgPT4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3KSk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogYWRkXG4gICAqIEFkZCBhIG5ldyB3YWxsZXQgKGFkdmFuY2VkIG1vZGUpLlxuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gbWFudWFsbHkgc3VibWl0IHRoZSBrZXlzLCB0eXBlLCBtIGFuZCBuIG9mIHRoZSB3YWxsZXRcbiAgICogUGFyYW1ldGVycyBpbmNsdWRlOlxuICAgKiAgICBcImxhYmVsXCI6IGxhYmVsIG9mIHRoZSB3YWxsZXQgdG8gYmUgc2hvd24gaW4gVUlcbiAgICogICAgXCJtXCI6IG51bWJlciBvZiBrZXlzIHJlcXVpcmVkIHRvIHVubG9jayB3YWxsZXQgKDIpXG4gICAqICAgIFwiblwiOiBudW1iZXIgb2Yga2V5cyBhdmFpbGFibGUgb24gdGhlIHdhbGxldCAoMylcbiAgICogICAgXCJrZXlzXCI6IGFycmF5IG9mIGtleWNoYWluIGlkc1xuICAgKi9cbiAgYXN5bmMgYWRkKHBhcmFtczogQWRkV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbGFiZWwnLCAnZW50ZXJwcmlzZScsICd0eXBlJ10pO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRXZtS2V5UmluZ1dhbGxldFBhcmFtcyhwYXJhbXMsIHRoaXMuYmFzZUNvaW4pO1xuXG4gICAgaWYgKCFwYXJhbXMuZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkICYmIHBhcmFtcy50eXBlICE9PSAnY3VzdG9kaWFsJykge1xuICAgICAgLy8gbm8gbmVlZCB0byBwYXNzIGtleXMgZm9yIChzaW5nbGUpIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMua2V5cykgPT09IGZhbHNlIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5tKSB8fCAhXy5pc051bWJlcihwYXJhbXMubikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSB0eXBlcyBvZiBtdWx0aXNpZ1xuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRNb2ZOU2V0dXAocGFyYW1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIG11bHRpLXNpZyB0eXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5nYXNQcmljZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGdhc1ByaWNlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy53YWxsZXRWZXJzaW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3Igd2FsbGV0VmVyc2lvbiAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScgJiYgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDMpIHtcbiAgICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAgIC5yZXN1bHQoKTtcbiAgICAgICAgY29uc3QgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgICBpZiAobXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgIHBhcmFtcy53YWxsZXRWZXJzaW9uID0gNTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMudGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy50YWdzKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgdGFncyAtIGFycmF5IGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5jbGllbnRGbGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5jbGllbnRGbGFncykgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGNsaWVudEZsYWdzIC0gYXJyYXkgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmlzQ29sZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmlzQ29sZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDb2xkIC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaXNDdXN0b2RpYWwgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pc0N1c3RvZGlhbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDdXN0b2RpYWwgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzICYmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykgfHwgIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLmFkZHJlc3MpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhZGRyZXNzIC0gdmFsaWQgYWRkcmVzcyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVMaWdodG5pbmdXYWxsZXQocGFyYW1zOiBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHsgbGFiZWwsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UsIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsIHN1YlR5cGUsIGxpZ2h0bmluZ1Byb3ZpZGVyLCBlbmNyeXB0aW9uVmVyc2lvbiB9ID1cbiAgICAgIHBhcmFtcztcblxuICAgIC8vIFRPRE8gQlRDLTE4OTk6IG9ubHkgdXNlckF1dGgga2V5IGlzIHJlcXVpcmVkIGZvciBjdXN0b2RpYWwgbGlnaHRuaW5nIHdhbGxldC4gYWxsIDMga2V5cyBhcmUgcmVxdWlyZWQgZm9yIHNlbGYgY3VzdG9kaWFsIGxpZ2h0bmluZy5cbiAgICAvLyB0byBhdm9pZCBjaGFuZ2luZyB0aGUgcGxhdGZvcm0gZm9yIGN1c3RvZGlhbCBmbG93LCBsZXQgdXMgYWxsIDMga2V5cyBib3RoIHdhbGxldCB0eXBlcy5cbiAgICBjb25zdCBrZXljaGFpblByb21pc2VzID0gKFt1bmRlZmluZWQsICd1c2VyQXV0aCcsICdub2RlQXV0aCddIGFzIGNvbnN0KS5tYXAoKHB1cnBvc2UpID0+IHtcbiAgICAgIHJldHVybiBhc3luYyAoKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBjb25zdCBrZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IGtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICAgICAgcHViOiBrZXljaGFpbi5wdWIsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgICBpbnB1dDoga2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwdXJwb3NlID09PSB1bmRlZmluZWQgPyBwYXNzY29kZUVuY3J5cHRpb25Db2RlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzogcHVycG9zZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeyBbdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpXTogeyBwdXJwb3NlIH0gfSxcbiAgICAgICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoa2V5Y2hhaW5QYXJhbXMpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCB1c2VyQXV0aEtleWNoYWluLCBub2RlQXV0aEtleWNoYWluIH0gPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpblByb21pc2VzWzBdKCksXG4gICAgICB1c2VyQXV0aEtleWNoYWluOiBrZXljaGFpblByb21pc2VzWzFdKCksXG4gICAgICBub2RlQXV0aEtleWNoYWluOiBrZXljaGFpblByb21pc2VzWzJdKCksXG4gICAgfSk7XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDEsXG4gICAgICBuOiAxLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBzdWJUeXBlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWRdLFxuICAgICAgY29pblNwZWNpZmljOiB7IFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiB7IGtleXM6IFt1c2VyQXV0aEtleWNoYWluLmlkLCBub2RlQXV0aEtleWNoYWluLmlkXSB9IH0sXG4gICAgICBsaWdodG5pbmdQcm92aWRlcixcbiAgICB9O1xuXG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICB1c2VyQXV0aEtleWNoYWluLFxuICAgICAgbm9kZUF1dGhLZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ0xpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBHbyBBY2NvdW50IHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4+XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlR29BY2NvdW50V2FsbGV0KFxuICAgIHBhcmFtczogR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zXG4gICk6IFByb21pc2U8R29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbj4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgeyBsYWJlbCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSwgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSwgZW5jcnlwdGlvblZlcnNpb24sIHVzZXJLZXlTaWduaW5nUmVxdWlyZWQgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IGtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBwdWI6IGtleWNoYWluLnB1YixcbiAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICB9O1xuXG4gICAgaWYgKHBhc3NwaHJhc2UgIT09IHVuZGVmaW5lZCAmJiBwYXNzY29kZUVuY3J5cHRpb25Db2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleWNoYWluUGFyYW1zLmVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICBpbnB1dDoga2V5Y2hhaW4ucHJ2LFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pO1xuICAgICAga2V5Y2hhaW5QYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlID0gcGFzc2NvZGVFbmNyeXB0aW9uQ29kZTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChrZXljaGFpblBhcmFtcyk7XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDEsXG4gICAgICBuOiAxLFxuICAgICAgdHlwZTogJ3RyYWRpbmcnLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWRdLFxuICAgICAgLi4uKHVzZXJLZXlTaWduaW5nUmVxdWlyZWQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGNvaW5TcGVjaWZpYzogeyB1c2VyS2V5U2lnbmluZ1JlcXVpcmVkIH0sXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluID0ge1xuICAgICAgd2FsbGV0LFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbicsXG4gICAgfTtcblxuICAgIC8vIEFkZCB3YXJuaW5nIGlmIHRoZSB1c2VyIGtleWNoYWluIGhhcyBhbiBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodXNlcktleWNoYWluLmVuY3J5cHRlZFBydikpIHtcbiAgICAgIHJlc3VsdC53YXJuaW5nID0gJ0JlIHN1cmUgdG8gYmFja3VwIHRoZSB1c2VyIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcgd2FsbGV0XG4gICAqIDEuIENyZWF0ZXMgdGhlIHVzZXIga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuICAgKiAyLiBJZiBubyBwdWIgd2FzIHByb3ZpZGVkLCBjcmVhdGVzIHRoZSBiYWNrdXAga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuICAgKiAzLiBVcGxvYWRzIHRoZSBlbmNyeXB0ZWQgdXNlciBhbmQgYmFja3VwIGtleWNoYWlucyB0byBCaXRHb1xuICAgKiA0LiBDcmVhdGVzIHRoZSBCaXRHbyBrZXkgb24gdGhlIHNlcnZpY2VcbiAgICogNS4gQ3JlYXRlcyB0aGUgd2FsbGV0IG9uIEJpdEdvIHdpdGggdGhlIDMgcHVibGljIGtleXMgYWJvdmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmxhYmVsIExhYmVsIGZvciB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMucGFzc3BocmFzZSBQYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgdXNlciBhbmQgYmFja3VwIGtleWNoYWluc1xuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJLZXkgVXNlciB4cHViXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwWHB1YiBCYWNrdXAgeHB1YlxuICAgKiBAcGFyYW0gcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlclxuICAgKiBAcGFyYW0gcGFyYW1zLmVudGVycHJpc2UgdGhlIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlIG9wdGlvbmFsIHRoaXMgaXMgYSByZWNvdmVyeSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgb3JpZ2luYWwgcGFzc3BocmFzZSBpbiBhIHJlY292ZXJ5IGNhc2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciBtdXN0IGdlbmVyYXRlIGFuZCBrZWVwIHRoZSBlbmNyeXB0ZWQgb3JpZ2luYWwgcGFzc3BocmFzZSBzYWZlIHdoaWxlIHRoaXMgY29kZSBpcyBzdG9yZWQgb24gQml0R29cbiAgICogQHBhcmFtIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgb3B0aW9uYWwgc2VlZCBmb3IgU01DIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtcy5nYXNQcmljZVxuICAgKiBAcGFyYW0gcGFyYW1zLmRpc2FibGVLUlNFbWFpbFxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFZlcnNpb25cbiAgICogQHBhcmFtIHBhcmFtcy5tdWx0aXNpZ1R5cGUgb3B0aW9uYWwgbXVsdGlzaWcgdHlwZSwgJ29uY2hhaW4nIG9yICd0c3MnIG9yICdibHNka2cnOyBpZiBhYnNlbnQsIHdlIHdpbGwgZGVmZXIgdG8gdGhlIGNvaW4ncyBkZWZhdWx0IHR5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIGJpdGdvIGtleS4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBjcmVhdGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0LiBJZiBwcm92aWRlZCwgeW91IG11c3QgaGF2ZSB0aGUgZW50ZXJwcmlzZSBsaWNlbnNlIGFuZCBwYXNzIGluXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHBhcmFtcy5lbnRlcnByaXNlYCBpbnRvIGBnZW5lcmF0ZVdhbGxldGAgYXMgd2VsbC5cbiAgICogQHBhcmFtIHBhcmFtcy50eXBlIG9wdGlvbmFsIHdhbGxldCB0eXBlLCAnaG90JyBvciAnY29sZCcgb3IgJ2N1c3RvZGlhbCc7IGlmIGFic2VudCwgd2Ugd2lsbCBkZWZlciB0byAnaG90J1xuICAgKiBAcGFyYW0gcGFyYW1zLmJpdGdvS2V5SWQgb3B0aW9uYWwgYml0Z28ga2V5IGlkIGZvciBTTUMgVFNTIHdhbGxldHNcbiAgICogQHBhcmFtIHBhcmFtcy5jb21tb25LZXljaGFpbiBvcHRpb25hbCBjb21tb24ga2V5Y2hhaW4gZm9yIFNNQyBUU1Mgd2FsbGV0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FsbGV0KFxuICAgIHBhcmFtczogR2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyB8IEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4+IHtcbiAgICAvLyBBc3NpZ24gdGhlIGRlZmF1bHQgbXVsdGlTaWcgdHlwZSB2YWx1ZSBiYXNlZCBvbiB0aGUgY29pblxuICAgIGlmICghcGFyYW1zLm11bHRpc2lnVHlwZSkge1xuICAgICAgcGFyYW1zLm11bHRpc2lnVHlwZSA9IHRoaXMuYmFzZUNvaW4uZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnbG5idGMnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZGVjb2RlT3JFbHNlKFxuICAgICAgICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYy5uYW1lLFxuICAgICAgICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICAoZXJyb3JzKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIGdlbmVyYXRlIGxpZ2h0bmluZyB3YWxsZXQgcmVxdWVzdCBwYXJhbXM6ICR7ZXJyb3JzfWApO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldChvcHRpb25zKTtcbiAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBvcHRpb25zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBvcHRpb25zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICAvLyBHbyBBY2NvdW50IHdhbGxldCBnZW5lcmF0aW9uXG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdvZmMnICYmIHBhcmFtcy50eXBlID09PSAndHJhZGluZycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBkZWNvZGVPckVsc2UoXG4gICAgICAgIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjLm5hbWUsXG4gICAgICAgIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIChlcnJvcnMpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yKHMpIHBhcnNpbmcgZ2VuZXJhdGUgZ28gYWNjb3VudCByZXF1ZXN0IHBhcmFtczogJHtlcnJvcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSBhd2FpdCB0aGlzLmdlbmVyYXRlR29BY2NvdW50V2FsbGV0KG9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMucGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IG9wdGlvbnMucGFzc3BocmFzZSxcbiAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBvcHRpb25zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3YWxsZXREYXRhO1xuICAgIH1cblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgWydwYXNzcGhyYXNlJywgJ3VzZXJLZXknLCAnYmFja3VwWHB1YiddKTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5sYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGxhYmVsJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5jcmVhdGVLZXljaGFpbkNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lcihwYXJhbXMgYXMgR2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXJPcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHR5cGUgPSAnaG90JywgbGFiZWwsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UsIGlzRGlzdHJpYnV0ZWRDdXN0b2R5LCBldm1LZXlSaW5nUmVmZXJlbmNlV2FsbGV0SWQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBpc1RzcyA9IHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKTtcbiAgICBjb25zdCBjYW5FbmNyeXB0ID0gISFwYXNzcGhyYXNlICYmIHR5cGVvZiBwYXNzcGhyYXNlID09PSAnc3RyaW5nJztcblxuICAgIGlmICh2YWxpZGF0ZUV2bUtleVJpbmdXYWxsZXRQYXJhbXMocGFyYW1zLCB0aGlzLmJhc2VDb2luKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUV2bUtleVJpbmdXYWxsZXQoe1xuICAgICAgICBsYWJlbCxcbiAgICAgICAgZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkOiBldm1LZXlSaW5nUmVmZXJlbmNlV2FsbGV0SWQhLFxuICAgICAgICBiaXRnbzogdGhpcy5iaXRnbyxcbiAgICAgICAgYmFzZUNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbDogbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFtdLFxuICAgICAgdHlwZTogISFwYXJhbXMudXNlcktleSAmJiBwYXJhbXMubXVsdGlzaWdUeXBlICE9PSAnb25jaGFpbicgPyAnY29sZCcgOiB0eXBlLFxuICAgIH07XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc2NvZGVFbmNyeXB0aW9uQ29kZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVudGVycHJpc2UpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZW50ZXJwcmlzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudGVycHJpc2UgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gZW50ZXJwcmlzZTtcbiAgICB9XG5cbiAgICAvLyBFVk0gVFNTIHdhbGxldHMgbXVzdCB1c2Ugd2FsbGV0IHZlcnNpb24gMywgNSBhbmQgNlxuICAgIGlmIChcbiAgICAgIGlzVHNzICYmXG4gICAgICB0aGlzLmJhc2VDb2luLmlzRVZNKCkgJiZcbiAgICAgICFldm1LZXlSaW5nUmVmZXJlbmNlV2FsbGV0SWQgJiZcbiAgICAgICEocGFyYW1zLndhbGxldFZlcnNpb24gPT09IDMgfHwgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDUgfHwgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDYpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VWTSBUU1Mgd2FsbGV0cyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHdhbGxldCB2ZXJzaW9uIDMsIDUgYW5kIDYnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUc3MpIHtcbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1RzcygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgVFNTIGF0IHRoaXMgdGltZWApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAocGFyYW1zLndhbGxldFZlcnNpb24gPT09IDUgfHwgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDYpICYmXG4gICAgICAgICF0aGlzLmJhc2VDb2luLmdldENvbmZpZygpLmZlYXR1cmVzLmluY2x1ZGVzKENvaW5GZWF0dXJlLk1QQ1YyKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgVFNTIE1QQ3YyIGF0IHRoaXMgdGltZWApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGVudGVycHJpc2UsICdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIGZvciBUU1Mgd2FsbGV0Jyk7XG5cbiAgICAgIGlmICh0eXBlID09PSAnY29sZCcpIHtcbiAgICAgICAgLy8gdmFsaWRhdGVcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy5iaXRnb0tleUlkLCAnYml0Z29LZXlJZCBpcyByZXF1aXJlZCBmb3IgU01DIFRTUyB3YWxsZXQnKTtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy5jb21tb25LZXljaGFpbiwgJ2NvbW1vbktleWNoYWluIGlzIHJlcXVpcmVkIGZvciBTTUMgVFNTIHdhbGxldCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNNQ01wY1dhbGxldCh7XG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgICAgIGJpdGdvS2V5SWQ6IHBhcmFtcy5iaXRnb0tleUlkLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOiBwYXJhbXMuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgICAgY29sZERlcml2YXRpb25TZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ3VzdG9kaWFsTXBjV2FsbGV0KHtcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgICAgd2FsbGV0VmVyc2lvbjogcGFyYW1zLndhbGxldFZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQocGFzc3BocmFzZSwgJ2Nhbm5vdCBnZW5lcmF0ZSBUU1Mga2V5cyB3aXRob3V0IHBhc3NwaHJhc2UnKTtcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSBhd2FpdCB0aGlzLmdlbmVyYXRlTXBjV2FsbGV0KHtcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHBhc3NwaHJhc2UsXG4gICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgICB3ZWJhdXRobkluZm86IHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIGlmIChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkge1xuICAgICAgICB3YWxsZXREYXRhLmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBwYXNzcGhyYXNlLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3YWxsZXREYXRhO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkaXN0cmlidXRlZCBjdXN0b2R5XG4gICAgaWYgKGlzRGlzdHJpYnV0ZWRDdXN0b2R5KSB7XG4gICAgICBpZiAoIWVudGVycHJpc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHByb3ZpZGUgZW50ZXJwcmlzZSB3aGVuIGNyZWF0aW5nIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZSAhPT0gJ2NvbGQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXRzIG11c3QgYmUgdHlwZTogY29sZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhc0JhY2t1cFhwdWIgPSAhIXBhcmFtcy5iYWNrdXBYcHViO1xuICAgIGNvbnN0IGhhc0JhY2t1cFhwdWJQcm92aWRlciA9ICEhcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcjtcbiAgICBpZiAoaGFzQmFja3VwWHB1YiAmJiBoYXNCYWNrdXBYcHViUHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb3ZpZGUgbW9yZSB0aGFuIG9uZSBiYWNrdXBYcHViIG9yIGJhY2t1cFhwdWJQcm92aWRlciBmbGFnJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5nYXNQcmljZSAmJiBwYXJhbXMuZWlwMTU1OSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IHVzZSBib3RoIGVpcDE1NTkgYW5kIGdhc1ByaWNlIHZhbHVlcycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgPSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmdhc1ByaWNlKSkge1xuICAgICAgY29uc3QgZ2FzUHJpY2VCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmdhc1ByaWNlKTtcbiAgICAgIGlmIChnYXNQcmljZUJOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGdhcyBwcmljZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZUJOLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5laXAxNTU5KSAmJiAhXy5pc0VtcHR5KHBhcmFtcy5laXAxNTU5KSkge1xuICAgICAgY29uc3QgbWF4RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heEZlZVBlckdhcyk7XG4gICAgICBpZiAobWF4RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXhQcmlvcml0eUZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhQcmlvcml0eUZlZVBlckdhcyk7XG4gICAgICBpZiAobWF4UHJpb3JpdHlGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmlvcml0eSBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmVpcDE1NTkgPSB7XG4gICAgICAgIG1heEZlZVBlckdhczogbWF4RmVlUGVyR2FzQk4udG9TdHJpbmcoKSxcbiAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IG1heFByaW9yaXR5RmVlUGVyR2FzQk4udG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlS1JTRW1haWwpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlS1JTRW1haWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkaXNhYmxlS1JTRW1haWwgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZUtSU0VtYWlsID0gcGFyYW1zLmRpc2FibGVLUlNFbWFpbDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXRWZXJzaW9uIHByb3ZpZGVkLCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMud2FsbGV0VmVyc2lvbiA9IHBhcmFtcy53YWxsZXRWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBlYWNoIGtyc1NwZWNpZmljIHBhcmFtIGlzIGVpdGhlciBhIHN0cmluZywgYm9vbGVhbiwgb3IgbnVtYmVyXG4gICAgY29uc3QgeyBrcnNTcGVjaWZpYyB9ID0gcGFyYW1zO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChrcnNTcGVjaWZpYykpIHtcbiAgICAgIE9iamVjdC5rZXlzKGtyc1NwZWNpZmljKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0ga3JzU3BlY2lmaWNba2V5XTtcbiAgICAgICAgaWYgKCFfLmlzQm9vbGVhbih2YWwpICYmICFfLmlzU3RyaW5nKHZhbCkgJiYgIV8uaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigna3JzU3BlY2lmaWMgb2JqZWN0IGNvbnRhaW5zIGlsbGVnYWwgdmFsdWVzLiB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzLCBib29sZWFucywgb3IgbnVtYmVycycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgZGVyaXZhdGlvblBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPz8gJ29uY2hhaW4nKSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICAvLyBmb3IgY3VzdG9kaWFsIG11bHRpc2lnLCB3aGVuIHRoZSB3YWxsZXQgaXMgY3JlYXRlZCBvbiB0aGUgcGxhdGZvciBzaWRlLCB0aGUga2V5cyBhcmUgbm90IG5lZWRlZFxuICAgICAgd2FsbGV0UGFyYW1zLm4gPSB1bmRlZmluZWQ7XG4gICAgICB3YWxsZXRQYXJhbXMubSA9IHVuZGVmaW5lZDtcbiAgICAgIHdhbGxldFBhcmFtcy5rZXlzID0gdW5kZWZpbmVkO1xuICAgICAgd2FsbGV0UGFyYW1zLmtleVNpZ25hdHVyZXMgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZCh3YWxsZXRQYXJhbXMpLnJlc3VsdCgpOyAvLyByZXR1cm5zIHRoZSBpZHNcblxuICAgICAgY29uc3QgdXNlcktleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogbmV3V2FsbGV0LmtleXNbS2V5SW5kaWNlcy5VU0VSXSwgcmVxSWQgfSk7XG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuQkFDS1VQXSwgcmVxSWQgfSk7XG4gICAgICBjb25zdCBiaXRnb0tleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogbmV3V2FsbGV0LmtleXNbS2V5SW5kaWNlcy5CSVRHT10sIHJlcUlkIH0pO1xuXG4gICAgICBjb25zdCBbdXNlcktleSwgYml0Z29LZXksIGJhY2t1cEtleV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluLCBiaXRnb0tleWNoYWluLCBiYWNrdXBLZXljaGFpbl0pO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiBiaXRnb0tleSxcbiAgICAgICAgYml0Z29LZXljaGFpbjogYmFja3VwS2V5LFxuICAgICAgICByZXNwb25zZVR5cGU6ICdXYWxsZXRXaXRoS2V5Y2hhaW5zJyxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSBhc3luYyAoKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBsZXQgdXNlcktleWNoYWluUGFyYW1zO1xuICAgICAgICBsZXQgdXNlcktleWNoYWluO1xuICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIHVzZXIga2V5XG4gICAgICAgIGlmIChwYXJhbXMudXNlcktleSkge1xuICAgICAgICAgIHVzZXJLZXljaGFpbiA9IHsgcHViOiBwYXJhbXMudXNlcktleSB9O1xuICAgICAgICAgIHVzZXJLZXljaGFpblBhcmFtcyA9IHVzZXJLZXljaGFpbjtcbiAgICAgICAgICBpZiAocGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgICAgICAgLy8gdGhlIGRlcml2YXRpb24gb25seSBtYWtlcyBzZW5zZSB3aGVuIGEga2V5IGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgICBjb25zdCBkZXJpdmF0aW9uID0gdGhpcy5iYXNlQ29pbi5kZXJpdmVLZXlXaXRoU2VlZCh7XG4gICAgICAgICAgICAgIGtleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgICAgICAgIHNlZWQ6IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvbi5kZXJpdmF0aW9uUGF0aDtcbiAgICAgICAgICAgIHVzZXJLZXljaGFpbi5wdWIgPSBkZXJpdmF0aW9uLmtleTtcbiAgICAgICAgICAgIHVzZXJLZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkID0gcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjYW5FbmNyeXB0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBnZW5lcmF0ZSB1c2VyIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgdXNlciBrZXkuXG4gICAgICAgICAgdXNlcktleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgICAgaW5wdXQ6IHVzZXJLZXljaGFpbi5wcnYsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVzZXJLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgICAgICAgIHB1YjogdXNlcktleWNoYWluLnB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogdXNlcktleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIElmIFdlYkF1dGhuIGluZm8gaXMgcHJvdmlkZWQsIHN0b3JlIGFuIGFkZGl0aW9uYWwgY29weSBvZiB0aGUgcHJpdmF0ZSBrZXkgZW5jcnlwdGVkXG4gICAgICAgICAgLy8gd2l0aCB0aGUgUFJGLWRlcml2ZWQgcGFzc3BocmFzZSBzbyB0aGUgYXV0aGVudGljYXRvciBjYW4gbGF0ZXIgZGVjcnlwdCBpdC5cbiAgICAgICAgICAvLyBTZW5kIGl0IGFzIGB3ZWJhdXRobkluZm9gIChzaW5nbGUgb2JqZWN0LCB3aXRoIGVudGVycHJpc2VJZCkgc28gdGhlIGF0b21pY1xuICAgICAgICAgIC8vIFBPU1QgL2tleSBwZXJzaXN0cyB0aGUgcGFzc2tleSDigJQgdGhlIGJhY2tlbmQgaWdub3JlcyB0aGUgZGVwcmVjYXRlZCBgd2ViYXV0aG5EZXZpY2VzYC5cbiAgICAgICAgICBpZiAocGFyYW1zLndlYmF1dGhuSW5mbyAmJiB1c2VyS2V5Y2hhaW4ucHJ2KSB7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMud2ViYXV0aG5JbmZvID0ge1xuICAgICAgICAgICAgICBvdHBEZXZpY2VJZDogcGFyYW1zLndlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgICAgICAgcHJmU2FsdDogcGFyYW1zLndlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICAgICAgICBlbnRlcnByaXNlSWQ6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53ZWJhdXRobkluZm8ucGFzc3BocmFzZSxcbiAgICAgICAgICAgICAgICBpbnB1dDogdXNlcktleWNoYWluLnBydixcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgICAgICAgIGFkYXRhOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHVzZXJLZXljaGFpblBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgICAgICBjb25zdCBuZXdVc2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICAgICAgICByZXR1cm4gXy5leHRlbmQoe30sIG5ld1VzZXJLZXljaGFpbiwgdXNlcktleWNoYWluKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGlmIChwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgICAgICAgLy8gSWYgcmVxdWVzdGVkLCB1c2UgYSBLUlMgb3IgYmFja3VwIGtleSBwcm92aWRlclxuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cCh7XG4gICAgICAgICAgICBwcm92aWRlcjogcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlciB8fCAnZGVmYXVsdFJNR0JhY2t1cFByb3ZpZGVyJyxcbiAgICAgICAgICAgIGRpc2FibGVLUlNFbWFpbDogcGFyYW1zLmRpc2FibGVLUlNFbWFpbCxcbiAgICAgICAgICAgIGtyc1NwZWNpZmljOiBwYXJhbXMua3JzU3BlY2lmaWMsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLmJhc2VDb2luLmdldENoYWluKCksXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgYmFja3VwIHhwdWJcbiAgICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViKSB7XG4gICAgICAgICAgLy8gdXNlciBwcm92aWRlZCBiYWNrdXAgZXRoZXJldW0gYWRkcmVzc1xuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICAgICAgICBwdWI6IHBhcmFtcy5iYWNrdXBYcHViLFxuICAgICAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2FuRW5jcnlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgYmFja3VwIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vIHByb3ZpZGVkIGJhY2t1cCB4cHViIG9yIGFkZHJlc3MsIHNvIGRlZmF1bHQgdG8gY3JlYXRpbmcgb25lIGhlcmVcbiAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoe1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTogS2V5Y2hhaW5zVHJpcGxldCA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluUHJvbWlzZSgpLFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgICAuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSwgcmVxSWQsIGlzRGlzdHJpYnV0ZWRDdXN0b2R5OiBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkgfSksXG4gICAgICB9KTtcblxuICAgICAgd2FsbGV0UGFyYW1zLmtleXMgPSBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG5cbiAgICAgIGNvbnN0IHsgcHJ2IH0gPSB1c2VyS2V5Y2hhaW47XG4gICAgICBpZiAoXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICAgIGFzc2VydChiYWNrdXBLZXljaGFpbi5wdWIpO1xuICAgICAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5wdWIpO1xuICAgICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHtcbiAgICAgICAgICBiYWNrdXA6IChhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIGJhY2t1cEtleWNoYWluLnB1YikpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBiaXRnbzogKGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgYml0Z29LZXljaGFpbi5wdWIpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgICAgdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuXG4gICAgICBpZiAoXy5pbmNsdWRlcyhbJ3hycCcsICd4bG0nLCAnY3NwciddLCB0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMucm9vdFByaXZhdGVLZXkpKSB7XG4gICAgICAgIHdhbGxldFBhcmFtcy5yb290UHJpdmF0ZUtleSA9IHBhcmFtcy5yb290UHJpdmF0ZUtleTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4sXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgICAgfTtcblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhY2t1cEtleWNoYWluLnBydikpIHtcbiAgICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGRlcml2YXRpb25QYXRoKSkge1xuICAgICAgICB1c2VyS2V5Y2hhaW4uZGVyaXZhdGlvblBhdGggPSBkZXJpdmF0aW9uUGF0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbkVuY3J5cHQgJiYgcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUpIHtcbiAgICAgICAgcmVzdWx0LmVuY3J5cHRlZFdhbGxldFBhc3NwaHJhc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBwYXNzcGhyYXNlLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gb25jaGFpbiBtdWx0aXNpZyB3YWxsZXQgdXNpbmcgYW4gZXh0ZXJuYWwgc2lnbmVyIGZvciB1c2VyIGFuZCBiYWNrdXAga2V5IGNyZWF0aW9uLlxuICAgKiAxLiBDYWxscyBjcmVhdGVLZXljaGFpbkNhbGxiYWNrIGZvciB1c2VyIGFuZCBiYWNrdXAga2V5c1xuICAgKiAyLiBVcGxvYWRzIGtleWNoYWlucyB2aWEga2V5Y2hhaW5zKCkuYWRkKClcbiAgICogMy4gQ3JlYXRlcyB0aGUgQml0R28ga2V5IG9uIHRoZSBzZXJ2aWNlXG4gICAqIDQuIENyZWF0ZXMgdGhlIHdhbGxldCBvbiBCaXRHbyB3aXRoIHRoZSAzIHB1YmxpYyBrZXlzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FsbGV0V2l0aEV4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogR2VuZXJhdGVXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXJPcHRpb25zXG4gICk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IGhhc09uY2hhaW5DYWxsYmFjayA9IF8uaXNGdW5jdGlvbihwYXJhbXMuY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayk7XG4gICAgY29uc3QgaGFzTXBjQ2FsbGJhY2tzID0gISEocGFyYW1zLmVjZHNhTVBDdjJDYWxsYmFja3MgfHwgcGFyYW1zLmVkZHNhQ2FsbGJhY2tzKTtcblxuICAgIGlmIChoYXNPbmNoYWluQ2FsbGJhY2sgJiYgaGFzTXBjQ2FsbGJhY2tzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZUtleWNoYWluQ2FsbGJhY2sgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBNUEMgVFNTIGtleSBnZW5lcmF0aW9uIGNhbGxiYWNrcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG11bHRpc2lnVHlwZSA9XG4gICAgICBwYXJhbXMubXVsdGlzaWdUeXBlID8/IChoYXNPbmNoYWluQ2FsbGJhY2sgPyAnb25jaGFpbicgOiB0aGlzLmJhc2VDb2luLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKSk7XG5cbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAobXVsdGlzaWdUeXBlICE9PSAnb25jaGFpbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBvbmNoYWluIG11bHRpc2lnIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNGdW5jdGlvbihwYXJhbXMuY3JlYXRlS2V5Y2hhaW5DYWxsYmFjaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBmdW5jdGlvbiBwYXJhbWV0ZXIgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjaycpO1xuICAgIH1cblxuICAgIC8vIHRoZXNlIGJlbG9uZyB0byB0aGUgcGFzc3BocmFzZS1iYXNlZCBwYXRoIGFuZCBhcmUgaW5jb21wYXRpYmxlIHdpdGggY3JlYXRlS2V5Y2hhaW5DYWxsYmFja1xuICAgIGNvbnN0IHBhc3NwaHJhc2VQYXRoUGFyYW1zID0gWydwYXNzcGhyYXNlJywgJ3VzZXJLZXknLCAnYmFja3VwWHB1YicsICdiYWNrdXBYcHViUHJvdmlkZXInXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXNzcGhyYXNlUGF0aFBhcmFtcykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtc1trZXldKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgY2Fubm90IGJlIHVzZWQgd2l0aCAke2tleX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IGxhYmVsLCBjcmVhdGVLZXljaGFpbkNhbGxiYWNrLCB0eXBlID0gJ2hvdCcsIGVudGVycHJpc2UsIGlzRGlzdHJpYnV0ZWRDdXN0b2R5IH0gPSBwYXJhbXM7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGN1c3RvZGlhbCBvbmNoYWluIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndlYmF1dGhuSW5mbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2ViYXV0aG5JbmZvIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc2NvZGVFbmNyeXB0aW9uQ29kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXN0cmlidXRlZEN1c3RvZHkpIHtcbiAgICAgIGlmICghZW50ZXJwcmlzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBlbnRlcnByaXNlIHdoZW4gY3JlYXRpbmcgZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlICE9PSAnY29sZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldHMgbXVzdCBiZSB0eXBlOiBjb2xkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5nYXNQcmljZSAmJiBwYXJhbXMuZWlwMTU1OSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IHVzZSBib3RoIGVpcDE1NTkgYW5kIGdhc1ByaWNlIHZhbHVlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbXSxcbiAgICAgIHR5cGUsXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRlcnByaXNlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGVudGVycHJpc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRlcnByaXNlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IGVudGVycHJpc2U7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyA9IHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICBjb25zdCBnYXNQcmljZUJOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZ2FzUHJpY2UpO1xuICAgICAgaWYgKGdhc1ByaWNlQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2FzIHByaWNlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlQk4udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmVpcDE1NTkpICYmICFfLmlzRW1wdHkocGFyYW1zLmVpcDE1NTkpKSB7XG4gICAgICBjb25zdCBtYXhGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXggZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heFByaW9yaXR5RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heFByaW9yaXR5RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhQcmlvcml0eUZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByaW9yaXR5IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZWlwMTU1OSA9IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiBtYXhGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogbWF4UHJpb3JpdHlGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXRWZXJzaW9uIHByb3ZpZGVkLCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMud2FsbGV0VmVyc2lvbiA9IHBhcmFtcy53YWxsZXRWZXJzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBjb2luID0gdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpO1xuXG4gICAgY29uc3QgY3JlYXRlQW5kVXBsb2FkS2V5Y2hhaW4gPSBhc3luYyAoc291cmNlOiAndXNlcicgfCAnYmFja3VwJyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleWNoYWluRnJvbUNhbGxiYWNrID0gYXdhaXQgY3JlYXRlS2V5Y2hhaW5DYWxsYmFjayh7IHNvdXJjZSwgY29pbiB9KTtcbiAgICAgICAgaWYgKGtleWNoYWluRnJvbUNhbGxiYWNrLnNvdXJjZSAhPT0gc291cmNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVLZXljaGFpbkNhbGxiYWNrIHJldHVybmVkIHNvdXJjZSAke2tleWNoYWluRnJvbUNhbGxiYWNrLnNvdXJjZX0sIGV4cGVjdGVkICR7c291cmNlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXljaGFpbkZyb21DYWxsYmFjay50eXBlICE9PSAnaW5kZXBlbmRlbnQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYGNyZWF0ZUtleWNoYWluQ2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCB0eXBlICR7a2V5Y2hhaW5Gcm9tQ2FsbGJhY2sudHlwZX0sIGV4cGVjdGVkICdpbmRlcGVuZGVudCcgZm9yIG9uY2hhaW4gbXVsdGlzaWdgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uaXNWYWxpZFB1YihrZXljaGFpbkZyb21DYWxsYmFjay5wdWIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVLZXljaGFpbkNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcHViIGZvciAke3NvdXJjZX0ga2V5IG9uICR7Y29pbn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoe1xuICAgICAgICAgIHB1Yjoga2V5Y2hhaW5Gcm9tQ2FsbGJhY2sucHViLFxuICAgICAgICAgIGtleVR5cGU6IGtleWNoYWluRnJvbUNhbGxiYWNrLnR5cGUsXG4gICAgICAgICAgc291cmNlOiBrZXljaGFpbkZyb21DYWxsYmFjay5zb3VyY2UsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlICR7c291cmNlfSBrZXljaGFpbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTogS2V5Y2hhaW5zVHJpcGxldCA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICB1c2VyS2V5Y2hhaW46IGNyZWF0ZUFuZFVwbG9hZEtleWNoYWluKCd1c2VyJyksXG4gICAgICBiYWNrdXBLZXljaGFpbjogY3JlYXRlQW5kVXBsb2FkS2V5Y2hhaW4oJ2JhY2t1cCcpLFxuICAgICAgYml0Z29LZXljaGFpbjogdGhpcy5iYXNlQ29pblxuICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgLmNyZWF0ZUJpdEdvKHsgZW50ZXJwcmlzZSwgcmVxSWQsIGlzRGlzdHJpYnV0ZWRDdXN0b2R5OiBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkgfSksXG4gICAgfSk7XG5cbiAgICB3YWxsZXRQYXJhbXMua2V5cyA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgIGlmIChwYXJhbXMua2V5U2lnbmF0dXJlcykge1xuICAgICAgd2FsbGV0UGFyYW1zLmtleVNpZ25hdHVyZXMgPSBwYXJhbXMua2V5U2lnbmF0dXJlcztcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmluY2x1ZGVzKFsneHJwJywgJ3hsbScsICdjc3ByJ10sIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5yb290UHJpdmF0ZUtleSkpIHtcbiAgICAgIHdhbGxldFBhcmFtcy5yb290UHJpdmF0ZUtleSA9IHBhcmFtcy5yb290UHJpdmF0ZUtleTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdXNlcidzIHdhbGxldCBzaGFyZXNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFNoYXJlcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHVzZXIncyB3YWxsZXQgc2hhcmVzIHYyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFdhbGxldFNoYXJlcz59XG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzVjIoKTogUHJvbWlzZTxXYWxsZXRTaGFyZXM+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZXMnLCAyKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHdhbGxldCBzaGFyZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBlbmNyeXB0ZWQgc2hhcmluZyBrZXljaGFpbi4gcmVxdWlyZXMgdW5sb2NrIGlmIGtleWNoYWluIGlzIHByZXNlbnQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBnZXQgaW5mb3JtYXRpb24gb25cbiAgICovXG4gIGFzeW5jIGdldFNoYXJlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gcGFyYW1zLnN0YXRlIC0gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVNoYXJlKHBhcmFtczogVXBkYXRlU2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGsgYWNjZXB0IHdhbGxldCBzaGFyZXNcbiAgICogQHBhcmFtIHBhcmFtcyBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W11cbiAgICogQHJldHVybnMge1Byb21pc2U8QnVsa0FjY2VwdFNoYXJlUmVzcG9uc2U+fVxuICAgKi9cbiAgYXN5bmMgYnVsa0FjY2VwdFNoYXJlUmVxdWVzdChwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXSk6IFByb21pc2U8QnVsa0FjY2VwdFNoYXJlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5idWxrQWNjZXB0U2hhcmVSZXF1ZXN0V2l0aFJldHJ5KHBhcmFtcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1bGtBY2NlcHRTaGFyZVJlcXVlc3RXaXRoUmV0cnkocGFyYW1zOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10pOiBQcm9taXNlPEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlPiB7XG4gICAgLy8gU2VydmVyIGhhcyBhIGxpbWl0IG9mIGFwcHJveGltYXRlbHkgMU1CIGZvciBwYXlsb2FkIHNpemVcbiAgICBsZXQgTUFYX1BBWUxPQURfU0laRSA9IDk1MDAwMDsgLy8gfjk1MEtCIHRvIGxlYXZlIHNvbWUgYnVmZmVyXG5cbiAgICAvLyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBwYXlsb2FkXG4gICAgY29uc3QgY2FsY3VsYXRlUGF5bG9hZFNpemUgPSAoaXRlbXM6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXSk6IG51bWJlciA9PiB7XG4gICAgICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoSlNPTi5zdHJpbmdpZnkoeyBrZXlzRm9yV2FsbGV0U2hhcmVzOiBpdGVtcyB9KSwgJ3V0ZjgnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmdQYXJhbXMgPSBbLi4ucGFyYW1zXTtcblxuICAgIHdoaWxlIChyZW1haW5pbmdQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQnVpbGQgb3B0aW1hbCBiYXRjaCBieSBhZGRpbmcgaXRlbXMgdW50aWwgd2UgcmVhY2ggc2l6ZSBsaW1pdFxuICAgICAgY29uc3QgYmF0Y2g6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXSA9IFtdO1xuICAgICAgLy8gU3RhcnQgd2l0aCBlbXB0eSBiYXRjaFxuXG4gICAgICAvLyBBZGQgaXRlbXMgb25lIGJ5IG9uZSB3aGlsZSBtb25pdG9yaW5nIHBheWxvYWQgc2l6ZVxuICAgICAgd2hpbGUgKHJlbWFpbmluZ1BhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRlc3QgYWRkaW5nIHRoZSBuZXh0IGl0ZW1cbiAgICAgICAgY29uc3QgdGVzdEJhdGNoID0gWy4uLmJhdGNoLCByZW1haW5pbmdQYXJhbXNbMF1dO1xuICAgICAgICBjb25zdCB0ZXN0U2l6ZSA9IGNhbGN1bGF0ZVBheWxvYWRTaXplKHRlc3RCYXRjaCk7XG5cbiAgICAgICAgLy8gSWYgYWRkaW5nIHRoaXMgaXRlbSB3b3VsZCBleGNlZWQgdGhlIHNpemUgbGltaXQsIHN0b3AgYWRkaW5nXG4gICAgICAgIGlmICh0ZXN0U2l6ZSA+IE1BWF9QQVlMT0FEX1NJWkUgJiYgYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBhZGQgdGhlIGl0ZW0gdG8gdGhlIGJhdGNoXG4gICAgICAgIGJhdGNoLnB1c2gocmVtYWluaW5nUGFyYW1zLnNoaWZ0KCkhKTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgZXZlbiBhIHNpbmdsZSBpdGVtIGlzIHRvbyBsYXJnZVxuICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMCAmJiByZW1haW5pbmdQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBTZW5kIGp1c3QgdGhlIGZpcnN0IGl0ZW0gZXZlbiBpZiBpdCdzIG92ZXJzaXplZFxuICAgICAgICBiYXRjaC5wdXNoKHJlbWFpbmluZ1BhcmFtcy5zaGlmdCgpISk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWRPYmogPSB7IGtleXNGb3JXYWxsZXRTaGFyZXM6IGJhdGNoIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmVzL2FjY2VwdCcsIDIpKS5zZW5kKHBheWxvYWRPYmopLnJlc3VsdCgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuYWNjZXB0ZWRXYWxsZXRTaGFyZXMgJiYgQXJyYXkuaXNBcnJheShyZXN1bHQuYWNjZXB0ZWRXYWxsZXRTaGFyZXMpKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLnJlc3VsdC5hY2NlcHRlZFdhbGxldFNoYXJlcyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDEzICYmIGJhdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBnZXQgNDEzIHdpdGggbXVsdGlwbGUgaXRlbXMsIHB1dCB0aGVtIGJhY2sgYW5kIHRyeSB3aXRoIGhhbGYgdGhlIGJhdGNoIHNpemVcbiAgICAgICAgICByZW1haW5pbmdQYXJhbXMudW5zaGlmdCguLi5iYXRjaCk7XG4gICAgICAgICAgTUFYX1BBWUxPQURfU0laRSA9IE1hdGguZmxvb3IoTUFYX1BBWUxPQURfU0laRSAvIDIpOyAvLyBSZWR1Y2Ugc2l6ZSBsaW1pdCBmb3IgbmV4dCBhdHRlbXB0XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2VwdGVkV2FsbGV0U2hhcmVzOiByZXN1bHRzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBidWxrVXBkYXRlV2FsbGV0U2hhcmVSZXF1ZXN0KFxuICAgIHBhcmFtczogQnVsa1VwZGF0ZVdhbGxldFNoYXJlT3B0aW9uc1JlcXVlc3RbXVxuICApOiBQcm9taXNlPEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy5iaXRnby51cmwoJy93YWxsZXRzaGFyZXMvdXBkYXRlJywgMikpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIHNoYXJlczogcGFyYW1zLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgYSB3YWxsZXQgc2hhcmUgaW52aXRhdGlvbiBlbWFpbFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgd2hvc2UgaW52aXRpYXRpb24gc2hvdWxkIGJlIHJlc2VudFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kU2hhcmVJbnZpdGUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXJsUGFydHMgPSBwYXJhbXMud2FsbGV0U2hhcmVJZCArICcvcmVzZW5kZW1haWwnO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgdXJsUGFydHMpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgYSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIHVwZGF0ZVxuICAgKi9cbiAgYXN5bmMgY2FuY2VsU2hhcmUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5kZWwodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNoYXJlIHdhbGxldCB3aXRoIGV4aXN0aW5nIHNwZW5kZXJzIG9mIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHdhbGxldElkXG4gICAqIEBwYXJhbSB1c2VyUGFzc3dvcmRcbiAgICovXG4gIGFzeW5jIHJlc2hhcmVXYWxsZXRXaXRoU3BlbmRlcnMoXG4gICAgd2FsbGV0SWQ6IHN0cmluZyxcbiAgICB1c2VyUGFzc3dvcmQ6IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHRoaXMuZ2V0KHsgaWQ6IHdhbGxldElkIH0pO1xuICAgIGlmICghd2FsbGV0Py5fd2FsbGV0Py5lbnRlcnByaXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudGVycHJpc2Ugbm90IGZvdW5kIGZvciB0aGUgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW50ZXJwcmlzZVVzZXJzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke3dhbGxldD8uX3dhbGxldD8uZW50ZXJwcmlzZX0vdXNlcmApKVxuICAgICAgLnJlc3VsdCgpO1xuICAgIC8vIGNyZWF0ZSBhIG1hcCBvZiB1c2VycyBmb3IgZWFzeSBsb29rdXAgLSB3ZSBuZWVkIHRoZSB1c2VyIGVtYWlsIGlkIHRvIHNoYXJlIHRoZSB3YWxsZXRcbiAgICBjb25zdCB1c2Vyc01hcCA9IG5ldyBNYXAoXG4gICAgICBbLi4uZW50ZXJwcmlzZVVzZXJzUmVzcG9uc2U/LmFkbWluVXNlcnMsIC4uLmVudGVycHJpc2VVc2Vyc1Jlc3BvbnNlPy5ub25BZG1pblVzZXJzXS5tYXAoKG9iaikgPT4gW29iai5pZCwgb2JqXSlcbiAgICApO1xuXG4gICAgaWYgKHdhbGxldC5fd2FsbGV0LnVzZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHVzZXIgb2Ygd2FsbGV0Ll93YWxsZXQudXNlcnMpIHtcbiAgICAgICAgY29uc3QgdXNlck9iamVjdCA9IHVzZXJzTWFwLmdldCh1c2VyLnVzZXIpO1xuICAgICAgICBpZiAodXNlci5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSAmJiAhdXNlci5wZXJtaXNzaW9ucy5pbmNsdWRlcygnYWRtaW4nKSAmJiB1c2VyT2JqZWN0KSB7XG4gICAgICAgICAgY29uc3Qgc2hhcmVQYXJhbXMgPSB7XG4gICAgICAgICAgICB3YWxsZXRJZDogd2FsbGV0SWQsXG4gICAgICAgICAgICB1c2VyOiB1c2VyLnVzZXIsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogdXNlci5wZXJtaXNzaW9ucy5qb2luKCcsJyksXG4gICAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB1c2VyUGFzc3dvcmQsXG4gICAgICAgICAgICBlbWFpbDogdXNlck9iamVjdC5lbWFpbC5lbWFpbCxcbiAgICAgICAgICAgIHJlc2hhcmU6IHRydWUsXG4gICAgICAgICAgICBza2lwS2V5Y2hhaW46IGZhbHNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3YWxsZXQuc2hhcmVXYWxsZXQoc2hhcmVQYXJhbXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSB3YWxsZXQgc2hhcmUsIGFkZGluZyB0aGUgd2FsbGV0IHRvIHRoZSB1c2VyJ3MgbGlzdFxuICAgKiBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBhY2NlcHRcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyUGFzc3dvcmQgLSAocmVxdWlyZWQgaWYgbW9yZSBhIGtleWNoYWluIHdhcyBzaGFyZWQpIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayBhbmQgYSB3YWxsZXQgd2l0aCBtb3JlIHRoYW4gdmlldyBwZXJtaXNzaW9ucyB3YXMgc2hhcmVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHBhcmFtcy5vdmVycmlkZUVuY3J5cHRlZFBydiAtIHNldCBvbmx5IGlmIHRoZSBwcnYgd2FzIHJlY2VpdmVkIG91dC1vZi1iYW5kLlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFsnb3ZlcnJpZGVFbmNyeXB0ZWRQcnYnLCAndXNlclBhc3N3b3JkJywgJ25ld1dhbGxldFBhc3NwaHJhc2UnXSk7XG5cbiAgICBsZXQgZW5jcnlwdGVkUHJ2ID0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2O1xuICAgIGNvbnN0IHdhbGxldFNoYXJlID0gYXdhaXQgdGhpcy5nZXRTaGFyZSh7IHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkIH0pO1xuXG4gICAgLy8gTXVsdGktdXNlci1rZXkgY2FzZTogcmVxdWlyZXMgdXNlciB0byBwcm92aWRlIHRoZWlyIG93biBwdWJsaWMga2V5IGluIGFkZGl0aW9uIHRvIHRoZSBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICBpZiAod2FsbGV0U2hhcmUudXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCkge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJQYXNzd29yZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBnZW5lcmF0ZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4ucHJ2LFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVBhcmFtczogVXBkYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgICAgIGVuY3J5cHRlZFBydjogZW5jcnlwdGVkUHJ2LFxuICAgICAgICBwdWI6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgIH07XG5cbiAgICAgIC8vIE5vdGU6IFVubGlrZSBrZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQsIHdlIGRvIE5PVCByZXNoYXJlIHRoZSB3YWxsZXQgd2l0aCBzcGVuZGVyc1xuICAgICAgLy8gVGhpcyBpcyBhIGtleSBkaWZmZXJlbmNlIC0gbXVsdGkta2V5LXVzZXIta2V5IHdhbGxldHMgZG9uJ3QgcmVxdWlyZSByZXNoYXJlXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIEtleWNoYWluIG92ZXJyaWRlIGNhc2U6IHJlcXVpcmVzIHVzZXIga2V5Y2hhaW4gY3JlYXRpb24gYW5kIHNpZ25pbmdcbiAgICBpZiAoXG4gICAgICB3YWxsZXRTaGFyZS5rZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluZGV4T2YoJ2FkbWluJykgIT09IC0xICYmXG4gICAgICB3YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMVxuICAgICkge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJQYXNzd29yZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FsbGV0S2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luXG4gICAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgICAuY3JlYXRlVXNlcktleWNoYWluKHBhcmFtcy51c2VyUGFzc3dvcmQsIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbik7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkUHJ2IHdhcyBub3QgZm91bmQgb24gd2FsbGV0IGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHRyYWRpbmdBY2NvdW50SWQ6IHdhbGxldFNoYXJlLndhbGxldCxcbiAgICAgICAgcHVia2V5OiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBheWxvYWRTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcblxuICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2OiBwcml2YXRlS2V5IH0sIHBheWxvYWRTdHJpbmcpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudXBkYXRlU2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgICAgIGtleUlkOiB3YWxsZXRLZXljaGFpbi5pZCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nLFxuICAgICAgfSk7XG4gICAgICAvLyBJZiB0aGUgd2FsbGV0IHNoYXJlIHdhcyBhY2NlcHRlZCBzdWNjZXNzZnVsbHkgKGNoYW5nZWQ9dHJ1ZSksIHJlc2hhcmUgdGhlIHdhbGxldCB3aXRoIHRoZSBzcGVuZGVyc1xuICAgICAgaWYgKHJlc3BvbnNlLmNoYW5nZWQgJiYgcmVzcG9uc2Uuc3RhdGUgPT09ICdhY2NlcHRlZCcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc2hhcmVXYWxsZXRXaXRoU3BlbmRlcnMod2FsbGV0U2hhcmUud2FsbGV0LCBwYXJhbXMudXNlclBhc3N3b3JkLCBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gVE9ETzogUFgtMzgyNlxuICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHQsIG9yIGlmIGV4cGxpY2l0IGVuY3J5cHRlZFBydiB3YXMgcHJvdmlkZWRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHwgZW5jcnlwdGVkUHJ2KSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyUGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IChhd2FpdCB0aGlzLmJpdGdvLmdldEVDREhLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgdGhlIHNoYXJpbmcga2V5Y2hhaW4sIHdlIGNhbiB3b3JrIG91dCB0aGUgc2VjcmV0IHVzZWQgZm9yIHNoYXJpbmcgdGhlIHdhbGxldCB3aXRoIHVzXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICB9KTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAvLyBEZXJpdmUga2V5IGJ5IHBhdGggKHdoaWNoIGlzIHVzZWQgYmV0d2VlbiB0aGVzZSAyIHVzZXJzIG9ubHkpXG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi5wcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHdhbGxldFNoYXJlLmtleWNoYWluLmZyb21QdWJLZXksICdoZXgnKVxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gWWVzISBXZSBnb3QgdGhlIHNlY3JldCBzdWNjZXNzZnVsbHkgaGVyZSwgbm93IGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2XG4gICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gV2Ugd2lsbCBub3cgcmUtZW5jcnlwdCB0aGUgd2FsbGV0IHdpdGggb3VyIG93biBwYXNzd29yZFxuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkO1xuICAgIGVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgIH0pO1xuICAgIGNvbnN0IHVwZGF0ZVBhcmFtczogVXBkYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQsXG4gICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICB9O1xuXG4gICAgaWYgKGVuY3J5cHRlZFBydikge1xuICAgICAgdXBkYXRlUGFyYW1zLmVuY3J5cHRlZFBydiA9IGVuY3J5cHRlZFBydjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlU2hhcmUodXBkYXRlUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWxrIEFjY2VwdCB3YWxsZXQgc2hhcmVzLCBhZGRpbmcgdGhlIHdhbGxldHMgdG8gdGhlIHVzZXIncyBsaXN0XG4gICAqIE5lZWRzIGEgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCBrZXlcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBCdWxrQWNjZXB0U2hhcmVPcHRpb25zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIGFycmF5IG9mIHRoZSB3YWxsZXQgc2hhcmVzIHRvIGFjY2VwdFxuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJQYXNzd29yZCAtIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0IGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgLSBuZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHNhdmluZyB0aGUgc2hhcmVkIHdhbGxldCBwcnYuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGxlZnQgYmxhbmsgdGhlbiB0aGUgdXNlcidzIGxvZ2luIHBhc3N3b3JkIGlzIHVzZWQuXG4gICAqXG4gICAqQHJldHVybnMge1Byb21pc2U8QnVsa0FjY2VwdFNoYXJlUmVzcG9uc2U+fVxuICAgKi9cbiAgYXN5bmMgYnVsa0FjY2VwdFNoYXJlKHBhcmFtczogQnVsa0FjY2VwdFNoYXJlT3B0aW9ucyk6IFByb21pc2U8QnVsa0FjY2VwdFNoYXJlUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyTG9naW5QYXNzd29yZCddLCBbJ25ld1dhbGxldFBhc3NwaHJhc2UnXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCduZXdXYWxsZXRQYXNzcGhyYXNlJyBpbiBwYXJhbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgdmFsaWQgdXNlciBsb2dpbiBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGFzc2VydChwYXJhbXMud2FsbGV0U2hhcmVJZHMubGVuZ3RoID4gMCwgJ1BsZWFzZSBwcm92aWRlIGF0IGxlYXN0IG9uZSB3YWxsZXQgc2hhcmUgdG8gYWNjZXB0Jyk7XG5cbiAgICBjb25zdCBhbGxXYWxsZXRTaGFyZXMgPSBhd2FpdCB0aGlzLmxpc3RTaGFyZXNWMigpO1xuICAgIGNvbnN0IHdhbGxldFNoYXJlTWFwID0gYWxsV2FsbGV0U2hhcmVzLmluY29taW5nLnJlZHVjZShcbiAgICAgIChtYXA6IHsgW2tleTogc3RyaW5nXTogV2FsbGV0U2hhcmUgfSwgc2hhcmUpID0+ICh7IC4uLm1hcCwgW3NoYXJlLmlkXTogc2hhcmUgfSksXG4gICAgICB7fVxuICAgICk7XG5cbiAgICBjb25zdCB3YWxsZXRTaGFyZXMgPSBwYXJhbXMud2FsbGV0U2hhcmVJZHNcbiAgICAgIC5tYXAoKHdhbGxldFNoYXJlSWQpID0+IHdhbGxldFNoYXJlTWFwW3dhbGxldFNoYXJlSWRdKVxuICAgICAgLmZpbHRlcigod2FsbGV0U2hhcmUpID0+IHdhbGxldFNoYXJlICYmICh3YWxsZXRTaGFyZS5rZXljaGFpbiB8fCB3YWxsZXRTaGFyZS51c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkKSk7XG5cbiAgICBpZiAoIXdhbGxldFNoYXJlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdmFsaWQgd2FsbGV0IHNoYXJlcyBmb3VuZCB0byBhY2NlcHQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJpdGdvLmdldEVDREhLZXljaGFpbigpO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRYcHJ2IHdhcyBub3QgZm91bmQgb24gc2hhcmluZyBrZXljaGFpbicpO1xuICAgIH1cblxuICAgIHNoYXJpbmdLZXljaGFpbi5wcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCxcbiAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICB9KTtcbiAgICBjb25zdCBuZXdXYWxsZXRQYXNzcGhyYXNlID0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgfHwgcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkO1xuICAgIGNvbnN0IHdlYmF1dGhuSW5mbyA9IHBhcmFtcy53ZWJhdXRobkluZm87XG5cbiAgICAvLyBFYWNoIGRlY3J5cHQvZW5jcnlwdCBjYWxsIHJ1bnMgQXJnb24yaWQgaW5zaWRlIGEgV2ViQXNzZW1ibHkgaW5zdGFuY2UgdGhhdCByZXNlcnZlcyB+MiBHaUIgb2ZcbiAgICAvLyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuIFJ1bm5pbmcgYWxsIHNoYXJlcyBjb25jdXJyZW50bHkgdmlhIFByb21pc2UuYWxsIGV4aGF1c3RzIHRoZSBicm93c2VyJ3NcbiAgICAvLyBXQVNNIG1lbW9yeSBhdCBzY2FsZSAoZS5nLiA5NiB3YWxsZXRzKS4gUHJvY2VzcyBpbiBzbWFsbCBiYXRjaGVzIHNvIG9ubHkgYSBib3VuZGVkIG51bWJlciBvZlxuICAgIC8vIFdBU00gaW5zdGFuY2VzIGFyZSBhbGl2ZSBhdCBvbmNlLlxuICAgIGNvbnN0IEJBVENIX1NJWkUgPSAxNjtcblxuICAgIGNvbnN0IHByb2Nlc3NTaGFyZSA9IGFzeW5jICh3YWxsZXRTaGFyZTogV2FsbGV0U2hhcmUpOiBQcm9taXNlPEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXT4gPT4ge1xuICAgICAgLy8gSGFuZGxlIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQgY2FzZSAtIHRoZXNlIHNoYXJlcyBkb24ndCBoYXZlIGtleWNoYWluc1xuICAgICAgaWYgKHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgaWYgKCFwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdhbGxldFNoYXJlSWQ6IHdhbGxldFNoYXJlLmlkLFxuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgICBwdWI6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFuZGFyZCBjYXNlOiBzaGFyZXMgd2l0aCBrZXljaGFpbnNcbiAgICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VjcmV0ID0gZ2V0U2hhcmVkU2VjcmV0KFxuICAgICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi5wcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IG5ld1dhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVudHJ5OiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0ID0ge1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiB3YWxsZXRTaGFyZS5pZCxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBuZXdFbmNyeXB0ZWRQcnYsXG4gICAgICB9O1xuICAgICAgaWYgKHdlYmF1dGhuSW5mbykge1xuICAgICAgICBlbnRyeS53ZWJhdXRobkluZm8gPSB7XG4gICAgICAgICAgb3RwRGV2aWNlSWQ6IHdlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgICBwcmZTYWx0OiB3ZWJhdXRobkluZm8ucHJmU2FsdCxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICBwYXNzd29yZDogd2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICBpbnB1dDogZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2LFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgIGFkYXRhOiB3YWxsZXRTaGFyZS5lbnRlcnByaXNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtlbnRyeV07XG4gICAgfTtcblxuICAgIGNvbnN0IGtleXNGb3JXYWxsZXRTaGFyZXM6IEFjY2VwdFNoYXJlT3B0aW9uc1JlcXVlc3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgXy5jaHVuayh3YWxsZXRTaGFyZXMsIEJBVENIX1NJWkUpKSB7XG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChiYXRjaC5tYXAoKHdhbGxldFNoYXJlKSA9PiBwcm9jZXNzU2hhcmUod2FsbGV0U2hhcmUpKSk7XG4gICAgICBrZXlzRm9yV2FsbGV0U2hhcmVzLnB1c2goLi4uYmF0Y2hSZXN1bHRzLmZsYXQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnVsa0FjY2VwdFNoYXJlUmVxdWVzdChrZXlzRm9yV2FsbGV0U2hhcmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIG11bHRpcGxlIHdhbGxldCBzaGFyZXMgaW4gYnVsa1xuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdXNlcnMgdG8gYWNjZXB0IG9yIHJlamVjdCBtdWx0aXBsZSB3YWxsZXQgc2hhcmVzIGluIGEgc2luZ2xlIG9wZXJhdGlvbi5cbiAgICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgdHlwZXMgb2Ygd2FsbGV0IHNoYXJlcyBpbmNsdWRpbmcgdGhvc2UgcmVxdWlyaW5nIHNwZWNpYWwga2V5Y2hhaW4gb3ZlcnJpZGVzXG4gICAqIGFuZCB0aG9zZSB3aXRoIGVuY3J5cHRlZCBwcml2YXRlIGtleXMgdGhhdCBuZWVkIHRvIGJlIGRlY3J5cHRlZCBhbmQgcmUtZW5jcnlwdGVkLlxuICAgKiBBZnRlciBwcm9jZXNzaW5nLCBpdCBhbHNvIHJlc2hhcmVzIGFjY2VwdGVkIHdhbGxldHMgd2l0aCBzcGVuZGVycyBmb3Igc3BlY2lhbCBvdmVycmlkZSBjYXNlcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIE9wdGlvbnMgZm9yIGJ1bGsgdXBkYXRpbmcgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zLnNoYXJlcyAtIEFycmF5IG9mIHdhbGxldCBzaGFyZXMgdG8gdXBkYXRlIHdpdGggdGhlaXIgc3RhdHVzIChhY2NlcHQvcmVqZWN0KVxuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkIC0gVXNlcidzIGxvZ2luIHBhc3N3b3JkIGZvciBkZWNyeXB0aW9uIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIC0gTmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciByZS1lbmNyeXB0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJlc3BvbnNlcyBmb3IgZWFjaCB3YWxsZXQgc2hhcmUgdXBkYXRlXG4gICAqL1xuICBhc3luYyBidWxrVXBkYXRlV2FsbGV0U2hhcmUocGFyYW1zOiBCdWxrVXBkYXRlV2FsbGV0U2hhcmVPcHRpb25zKTogUHJvbWlzZTxCdWxrVXBkYXRlV2FsbGV0U2hhcmVSZXNwb25zZT4ge1xuICAgIGlmICghcGFyYW1zLnNoYXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogc2hhcmVzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zaGFyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBwYXJhbWV0ZXIgYXJyYXk6IHNoYXJlcyBidXQgZm91bmQgJyArIHR5cGVvZiBwYXJhbXMuc2hhcmVzKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHNoYXJlIGluIHRoZSBhcnJheVxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgcGFyYW1zLnNoYXJlcykge1xuICAgICAgaWYgKCFzaGFyZS53YWxsZXRTaGFyZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB3YWxsZXRTaGFyZUlkIGluIHNoYXJlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hhcmUuc3RhdHVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBzdGF0dXMgaW4gc2hhcmUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNoYXJlLnN0YXR1cyAhPT0gJ2FjY2VwdCcgJiYgc2hhcmUuc3RhdHVzICE9PSAncmVqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGluIHNoYXJlOiAnICsgc2hhcmUuc3RhdHVzICsgJy4gTXVzdCBiZSBlaXRoZXIgXCJhY2NlcHRcIiBvciBcInJlamVjdFwiJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2hhcmUud2FsbGV0U2hhcmVJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3Rpbmcgd2FsbGV0U2hhcmVJZCB0byBiZSBhIHN0cmluZyBidXQgZm91bmQgJyArIHR5cGVvZiBzaGFyZS53YWxsZXRTaGFyZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGlmIHByb3ZpZGVkXG4gICAgaWYgKHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBwYXJhbWV0ZXIgc3RyaW5nOiB1c2VyTG9naW5QYXNzd29yZCBidXQgZm91bmQgJyArIHR5cGVvZiBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBzdHJpbmc6IG5ld1dhbGxldFBhc3NwaHJhc2UgYnV0IGZvdW5kICcgKyB0eXBlb2YgcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UpO1xuICAgIH1cbiAgICBhc3NlcnQocGFyYW1zLnNoYXJlcy5sZW5ndGggPiAwLCAnbm8gc2hhcmVzIGFyZSBwYXNzZWQnKTtcblxuICAgIGNvbnN0IHsgc2hhcmVzOiBpbnB1dFNoYXJlcywgdXNlckxvZ2luUGFzc3dvcmQsIG5ld1dhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRpb25WZXJzaW9uIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCBhbGxXYWxsZXRTaGFyZXMgPSBhd2FpdCB0aGlzLmxpc3RTaGFyZXNWMigpO1xuXG4gICAgLy8gT25seSBpbmNsdWRlIHNoYXJlcyB0aGF0IGFyZSBpbiB0aGUgaW5wdXQgYXJyYXkgZm9yIGVmZmljaWVuY3lcbiAgICBjb25zdCBzaGFyZUlkcyA9IG5ldyBTZXQoaW5wdXRTaGFyZXMubWFwKChzaGFyZSkgPT4gc2hhcmUud2FsbGV0U2hhcmVJZCkpO1xuICAgIGNvbnN0IHdhbGxldFNoYXJlTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgYWxsV2FsbGV0U2hhcmVzLmluY29taW5nXG4gICAgICAuZmlsdGVyKChzaGFyZSkgPT4gc2hhcmVJZHMuaGFzKHNoYXJlLmlkKSlcbiAgICAgIC5mb3JFYWNoKChzaGFyZSkgPT4gd2FsbGV0U2hhcmVNYXAuc2V0KHNoYXJlLmlkLCBzaGFyZSkpO1xuXG4gICAgYWxsV2FsbGV0U2hhcmVzLm91dGdvaW5nXG4gICAgICAuZmlsdGVyKChzaGFyZSkgPT4gc2hhcmVJZHMuaGFzKHNoYXJlLmlkKSlcbiAgICAgIC5mb3JFYWNoKChzaGFyZSkgPT4gd2FsbGV0U2hhcmVNYXAuc2V0KHNoYXJlLmlkLCBzaGFyZSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRTaGFyZXMgPSBpbnB1dFNoYXJlcy5tYXAoKHNoYXJlKSA9PiB7XG4gICAgICBjb25zdCB3YWxsZXRTaGFyZSA9IHdhbGxldFNoYXJlTWFwLmdldChzaGFyZS53YWxsZXRTaGFyZUlkKTtcbiAgICAgIGlmICghd2FsbGV0U2hhcmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHdhbGxldCBzaGFyZSBwcm92aWRlZDogJHtzaGFyZS53YWxsZXRTaGFyZUlkfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc2hhcmUsIHdhbGxldFNoYXJlIH07XG4gICAgfSk7XG5cbiAgICAvLyBJZGVudGlmeSBzcGVjaWFsIG92ZXJyaWRlIGNhc2VzIHRoYXQgbmVlZCByZXNoYXJpbmcgYWZ0ZXIgYWNjZXB0YW5jZVxuICAgIGNvbnN0IHNwZWNpYWxPdmVycmlkZUNhc2VzID0gbmV3IE1hcCgpO1xuICAgIHJlc29sdmVkU2hhcmVzLmZvckVhY2goKHNoYXJlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHNoYXJlLnN0YXR1cyA9PT0gJ2FjY2VwdCcgJiZcbiAgICAgICAgc2hhcmUud2FsbGV0U2hhcmUua2V5Y2hhaW5PdmVycmlkZVJlcXVpcmVkICYmXG4gICAgICAgIHNoYXJlLndhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdhZG1pbicpICYmXG4gICAgICAgIHNoYXJlLndhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpXG4gICAgICApIHtcbiAgICAgICAgc3BlY2lhbE92ZXJyaWRlQ2FzZXMuc2V0KHNoYXJlLndhbGxldFNoYXJlSWQsIHNoYXJlLndhbGxldFNoYXJlLndhbGxldCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEZWNyeXB0IHNoYXJpbmcga2V5Y2hhaW4gaWYgbmVlZGVkIChvbmx5IG9uY2UpXG4gICAgbGV0IHNoYXJpbmdLZXljaGFpblBydjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBkZWNyeXB0IGlmIHRoZXJlIGFyZSBzaGFyZXMgdG8gYWNjZXB0IHRoYXQgbWlnaHQgbmVlZCBpdFxuICAgIGNvbnN0IGhhc1NoYXJlc1JlcXVpcmluZ0RlY3J5cHRpb24gPVxuICAgICAgc3BlY2lhbE92ZXJyaWRlQ2FzZXMuc2l6ZSA+IDAgfHxcbiAgICAgIHJlc29sdmVkU2hhcmVzLnNvbWUoKHNoYXJlKSA9PiBzaGFyZS5zdGF0dXMgPT09ICdhY2NlcHQnICYmIHNoYXJlLndhbGxldFNoYXJlLmtleWNoYWluPy5lbmNyeXB0ZWRQcnYpO1xuXG4gICAgaWYgKHVzZXJMb2dpblBhc3N3b3JkICYmIGhhc1NoYXJlc1JlcXVpcmluZ0RlY3J5cHRpb24pIHtcbiAgICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCk7XG4gICAgICBpZiAoIXNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkWHBydiB3YXMgbm90IGZvdW5kIG9uIHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICAgIH1cbiAgICAgIHNoYXJpbmdLZXljaGFpblBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGxlZFVwZGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICByZXNvbHZlZFNoYXJlcy5tYXAoYXN5bmMgKHNoYXJlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgd2FsbGV0U2hhcmVJZCwgc3RhdHVzLCB3YWxsZXRTaGFyZSB9ID0gc2hhcmU7XG5cbiAgICAgICAgLy8gSGFuZGxlIGFjY2VwdCBjYXNlXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdhY2NlcHQnKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0FjY2VwdFNoYXJlKFxuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZCxcbiAgICAgICAgICAgIHdhbGxldFNoYXJlLFxuICAgICAgICAgICAgdXNlckxvZ2luUGFzc3dvcmQsXG4gICAgICAgICAgICBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgICAgc2hhcmluZ0tleWNoYWluUHJ2LFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIHJlamVjdCBjYXNlXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3JlamVjdCcgYXMgY29uc3QsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCB1cGRhdGVzXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFVwZGF0ZXMgPSBzZXR0bGVkVXBkYXRlcy5mbGF0TWFwKChyZXN1bHQpID0+IChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyA/IHJlc3VsdC52YWx1ZSA6IFtdKSk7XG5cbiAgICAvLyBFeHRyYWN0IGZhaWxlZCB1cGRhdGVzIC0gb25seSBmcm9tIHJlamVjdGVkIHByb21pc2VzXG4gICAgY29uc3QgZmFpbGVkVXBkYXRlcyA9IHNldHRsZWRVcGRhdGVzLnJlZHVjZTxBcnJheTx7IHdhbGxldFNoYXJlSWQ6IHN0cmluZzsgcmVhc29uOiBzdHJpbmcgfT4+KFxuICAgICAgKGFjYywgcmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgIGNvbnN0IHJlamVjdGVkUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICAgIHdhbGxldFNoYXJlSWQ6IHJlc29sdmVkU2hhcmVzW2luZGV4XS53YWxsZXRTaGFyZUlkLFxuICAgICAgICAgICAgcmVhc29uOiByZWplY3RlZFJlc3VsdC5yZWFzb24/Lm1lc3NhZ2UgfHwgU3RyaW5nKHJlamVjdGVkUmVzdWx0LnJlYXNvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXVxuICAgICk7XG5cbiAgICAvLyBTZW5kIHN1Y2Nlc3NmdWwgdXBkYXRlcyB0byB0aGUgc2VydmVyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlcXVlc3Qoc3VjY2Vzc2Z1bFVwZGF0ZXMpO1xuXG4gICAgLy8gUHJvY2VzcyBhY2NlcHRlZCBzcGVjaWFsIG92ZXJyaWRlIGNhc2VzIC0gcmVzaGFyZSB3aXRoIHNwZW5kZXJzXG4gICAgaWYgKHJlc3BvbnNlLmFjY2VwdGVkV2FsbGV0U2hhcmVzICYmIHJlc3BvbnNlLmFjY2VwdGVkV2FsbGV0U2hhcmVzLmxlbmd0aCA+IDAgJiYgdXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgIC8vIEZvciBlYWNoIGFjY2VwdGVkIHdhbGxldCBzaGFyZSB0aGF0IGlzIGEgc3BlY2lhbCBvdmVycmlkZSBjYXNlLCByZXNoYXJlIHdpdGggc3BlbmRlcnNcbiAgICAgIGZvciAoY29uc3Qgd2FsbGV0U2hhcmVJZCBvZiByZXNwb25zZS5hY2NlcHRlZFdhbGxldFNoYXJlcykge1xuICAgICAgICBpZiAoc3BlY2lhbE92ZXJyaWRlQ2FzZXMuaGFzKHdhbGxldFNoYXJlSWQpKSB7XG4gICAgICAgICAgY29uc3Qgd2FsbGV0SWQgPSBzcGVjaWFsT3ZlcnJpZGVDYXNlcy5nZXQod2FsbGV0U2hhcmVJZCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzaGFyZVdhbGxldFdpdGhTcGVuZGVycyh3YWxsZXRJZCwgdXNlckxvZ2luUGFzc3dvcmQsIGVuY3J5cHRpb25WZXJzaW9uKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBMb2cgZXJyb3IgYnV0IGNvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgc2hhcmVzXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciByZXNoYXJpbmcgd2FsbGV0ICR7d2FsbGV0SWR9IHdpdGggc3BlbmRlcnM6ICR7ZT8ubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaW5mb3JtYXRpb24gYWJvdXQgZmFpbGVkIHVwZGF0ZXMgdG8gdGhlIHJlc3BvbnNlXG4gICAgaWYgKGZhaWxlZFVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzcG9uc2Uud2FsbGV0U2hhcmVVcGRhdGVFcnJvcnMucHVzaCguLi5mYWlsZWRVcGRhdGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhIHdhbGxldCBzaGFyZSB0aGF0IGlzIGJlaW5nIGFjY2VwdGVkXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGRpZmZlcmVudCBjYXNlcyBmb3IgYWNjZXB0aW5nIGEgd2FsbGV0IHNoYXJlOlxuICAgKiAxLiBTcGVjaWFsIG92ZXJyaWRlIGNhc2UgcmVxdWlyaW5nIHVzZXIga2V5Y2hhaW4gYW5kIHNpZ25pbmdcbiAgICogMi4gU2ltcGxlIGNhc2Ugd2l0aCBubyBrZXljaGFpbiB0byBkZWNyeXB0XG4gICAqIDMuIFN0YW5kYXJkIGNhc2UgcmVxdWlyaW5nIGRlY3J5cHRpb24gYW5kIHJlLWVuY3J5cHRpb25cbiAgICpcbiAgICogQHBhcmFtIHdhbGxldFNoYXJlSWQgLSBJRCBvZiB0aGUgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSB3YWxsZXRTaGFyZSAtIFdhbGxldCBzaGFyZSBvYmplY3RcbiAgICogQHBhcmFtIHVzZXJMb2dpblBhc3N3b3JkIC0gVXNlcidzIGxvZ2luIHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdXYWxsZXRQYXNzcGhyYXNlIC0gTmV3IHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBzaGFyaW5nS2V5Y2hhaW5QcnYgLSBEZWNyeXB0ZWQgc2hhcmluZyBrZXljaGFpbiBwcml2YXRlIGtleVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB3YWxsZXQgc2hhcmUgdXBkYXRlIHJlcXVlc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NBY2NlcHRTaGFyZShcbiAgICB3YWxsZXRTaGFyZUlkOiBzdHJpbmcsXG4gICAgd2FsbGV0U2hhcmU6IFdhbGxldFNoYXJlLFxuICAgIHVzZXJMb2dpblBhc3N3b3JkPzogc3RyaW5nLFxuICAgIG5ld1dhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmcsXG4gICAgc2hhcmluZ0tleWNoYWluUHJ2Pzogc3RyaW5nLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb25cbiAgKTogUHJvbWlzZTxCdWxrVXBkYXRlV2FsbGV0U2hhcmVPcHRpb25zUmVxdWVzdFtdPiB7XG4gICAgLy8gU3BlY2lhbCBvdmVycmlkZSBjYXNlOiByZXF1aXJlcyB1c2VyIGtleWNoYWluIGFuZCBzaWduaW5nXG4gICAgaWYgKFxuICAgICAgd2FsbGV0U2hhcmUua2V5Y2hhaW5PdmVycmlkZVJlcXVpcmVkICYmXG4gICAgICB3YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnYWRtaW4nKSAmJlxuICAgICAgd2FsbGV0U2hhcmUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJylcbiAgICApIHtcbiAgICAgIGlmICghdXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyTG9naW5QYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWxsZXRLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgICAgLmtleWNoYWlucygpXG4gICAgICAgIC5jcmVhdGVVc2VyS2V5Y2hhaW4obmV3V2FsbGV0UGFzc3BocmFzZSB8fCB1c2VyTG9naW5QYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24pO1xuICAgICAgaWYgKCF3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRQcnYgd2FzIG5vdCBmb3VuZCBvbiB3YWxsZXQga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdHJhZGluZ0FjY291bnRJZDogd2FsbGV0U2hhcmUud2FsbGV0LFxuICAgICAgICBwdWJrZXk6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgcGF5bG9hZCk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgICAga2V5SWQ6IHdhbGxldEtleWNoYWluLmlkLFxuICAgICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBNdWx0aS11c2VyLWtleSBjYXNlOiByZXF1aXJlcyB1c2VyIHRvIHByb3ZpZGUgdGhlaXIgb3duIHB1YmxpYyBrZXlcbiAgICBpZiAod2FsbGV0U2hhcmUudXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCkge1xuICAgICAgaWYgKCEobmV3V2FsbGV0UGFzc3BocmFzZSB8fCB1c2VyTG9naW5QYXNzd29yZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyTG9naW5QYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGdlbmVyYXRlIHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FsbGV0S2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IG5ld1dhbGxldFBhc3NwaHJhc2UgfHwgdXNlckxvZ2luUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5wcnYsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgcHViOiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmICghdXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICB9XG4gICAgaWYgKCFzaGFyaW5nS2V5Y2hhaW5QcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHJldHJpZXZlIGFuZCBkZWNyeXB0IHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXJpdmVkS2V5ID0gYmlwMzIuZnJvbUJhc2U1OChzaGFyaW5nS2V5Y2hhaW5QcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKTtcblxuICAgIGNvbnN0IHNoYXJlZFNlY3JldCA9IGdldFNoYXJlZFNlY3JldChkZXJpdmVkS2V5LCBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JykpLnRvU3RyaW5nKFxuICAgICAgJ2hleCdcbiAgICApO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzaGFyZWRTZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gV2Ugd2lsbCBub3cgcmUtZW5jcnlwdCB0aGUgd2FsbGV0IHdpdGggb3VyIG93biBwYXNzd29yZFxuICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSB8fCB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgIGlucHV0OiBkZWNyeXB0ZWRQcnYsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICB9KTtcblxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHdhbGxldFNoYXJlSWQsXG4gICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3YWxsZXQgYnkgaXRzIElEXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5pZCB3YWxsZXQgaWRcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXQocGFyYW1zOiBHZXRXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IEdldFdhbGxldE9wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zLmFsbFRva2Vucykge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuYWxsVG9rZW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWxsVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuYWxsVG9rZW5zID0gcGFyYW1zLmFsbFRva2VucztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmluY2x1ZGVCYWxhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHF1ZXJ5LmluY2x1ZGVCYWxhbmNlID0gcGFyYW1zLmluY2x1ZGVCYWxhbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyBwYXJhbXMuaWQpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIHdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IGl0cyBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIHdhbGxldCBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FsbGV0QnlBZGRyZXNzKHBhcmFtczogR2V0V2FsbGV0QnlBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10pO1xuXG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpKTtcblxuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZHJlc3MvJyArIHBhcmFtcy5hZGRyZXNzKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgd2FsbGV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgYW55IGdpdmVuIHN1cHBvcnRlZCBjb2luLCBnZXQgdG90YWwgYmFsYW5jZXMgZm9yIGFsbCB3YWxsZXRzIG9mIHRoYXRcbiAgICogY29pbiB0eXBlIG9uIHRoZSBhY2NvdW50LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VG90YWxCYWxhbmNlcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYmFsYW5jZXMnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgVFNTIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIgY2FsbGJhY2tzIGZvciBrZXkgZ2VuZXJhdGlvbi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNcGNXYWxsZXRXaXRoRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBHZW5lcmF0ZVdhbGxldFdpdGhFeHRlcm5hbFNpZ25lck9wdGlvbnNcbiAgKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgeyBsYWJlbCwgZW50ZXJwcmlzZSwgdHlwZSA9ICdob3QnIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2luICR7dGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKX0gZG9lcyBub3Qgc3VwcG9ydCBUU1MgYXQgdGhpcyB0aW1lYCk7XG4gICAgfVxuXG4gICAgaWYgKCFlbnRlcnByaXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXQgZ2VuZXJhdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25lcicpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuYmFzZUNvaW4uaXNFVk0oKSAmJlxuICAgICAgcGFyYW1zLndhbGxldFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIShwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNSB8fCBwYXJhbXMud2FsbGV0VmVyc2lvbiA9PT0gNilcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRVZNIFRTUyB3YWxsZXRzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3Igd2FsbGV0IHZlcnNpb24gNSBhbmQgNicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjdXN0b2RpYWwgVFNTIHdhbGxldHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc2NvZGVFbmNyeXB0aW9uQ29kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBUU1MgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53ZWJhdXRobkluZm8pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dlYmF1dGhuSW5mbyBpcyBub3Qgc3VwcG9ydGVkIGZvciBUU1MgZXh0ZXJuYWwgc2lnbmVyIHdhbGxldCBnZW5lcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc3BocmFzZVBhdGhQYXJhbXMgPSBbJ3Bhc3NwaHJhc2UnLCAndXNlcktleScsICdiYWNrdXBYcHViJywgJ2JhY2t1cFhwdWJQcm92aWRlciddIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhc3NwaHJhc2VQYXRoUGFyYW1zKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zW2tleV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGNhbm5vdCBiZSB1c2VkIHdpdGggVFNTIGV4dGVybmFsIHNpZ25lciB3YWxsZXQgZ2VuZXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1wY0FsZ29yaXRobSA9IHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCk7XG4gICAgbGV0IHdhbGxldFZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZCA9IHBhcmFtcy53YWxsZXRWZXJzaW9uO1xuICAgIGxldCBrZXljaGFpbnM6IEtleWNoYWluc1RyaXBsZXQ7XG5cbiAgICBpZiAobXBjQWxnb3JpdGhtID09PSAnZWNkc2EnKSB7XG4gICAgICBpZiAoIXBhcmFtcy5lY2RzYU1QQ3YyQ2FsbGJhY2tzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZWNkc2FNUEN2MkNhbGxiYWNrcyBpcyByZXF1aXJlZCBmb3IgRUNEU0EgVFNTIHdhbGxldCBnZW5lcmF0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmVyJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuXG4gICAgICBpZiAod2FsbGV0VmVyc2lvbiA9PT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VDRFNBIE1QQ3YxICh3YWxsZXQgdmVyc2lvbiAzKSBpcyBub3Qgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIgd2FsbGV0IGdlbmVyYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAod2FsbGV0VmVyc2lvbiA9PT0gNSB8fCB3YWxsZXRWZXJzaW9uID09PSA2KSAmJlxuICAgICAgICAhdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NUENWMilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBNUEN2MiBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cblxuICAgICAga2V5Y2hhaW5zID0gYXdhaXQgbmV3IEVDRFNBVXRpbHMuRWNkc2FNUEN2MlV0aWxzKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIGNhbGxiYWNrczogcGFyYW1zLmVjZHNhTVBDdjJDYWxsYmFja3MsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwYXJhbXMuZWRkc2FDYWxsYmFja3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlZGRzYUNhbGxiYWNrcyBpcyByZXF1aXJlZCBmb3IgRWREU0EgVFNTIHdhbGxldCBnZW5lcmF0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmVyJyk7XG4gICAgICB9XG4gICAgICBrZXljaGFpbnMgPSBhd2FpdCBuZXcgRUREU0FVdGlscy5kZWZhdWx0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4pLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7XG4gICAgICAgIGVudGVycHJpc2UsXG4gICAgICAgIGNhbGxiYWNrczogcGFyYW1zLmVkZHNhQ2FsbGJhY2tzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBrZXljaGFpbnM7XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXSxcbiAgICAgIHR5cGUsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHdhbGxldFZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgVFNTIG9yIEJMUy1ES0cgV2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTXBjV2FsbGV0KHtcbiAgICBwYXNzcGhyYXNlLFxuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIHdlYmF1dGhuSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgfTogR2VuZXJhdGVNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgY29uc3QgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8ubXVsdGlTaWdUeXBlVmVyc2lvbjtcbiAgICAgIHdhbGxldFZlcnNpb24gPSB0aGlzLmRldGVybWluZUVjZHNhTXBjV2FsbGV0VmVyc2lvbih3YWxsZXRWZXJzaW9uLCBtdWx0aXNpZ1R5cGVWZXJzaW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIC8vIENyZWF0ZSBNUEMgS2V5Y2hhaW5zXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVNcGMoe1xuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3ZWJhdXRobkluZm8sXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGtleWNoYWlucztcbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICB9O1xuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFja3VwS2V5Y2hhaW4ucHJ2KSkge1xuICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFNlbGYtTWFuYWdlZCBDb2xkIFRTUyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVTTUNNcGNXYWxsZXQoe1xuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gICAgYml0Z29LZXlJZCxcbiAgICBjb21tb25LZXljaGFpbixcbiAgICBjb2xkRGVyaXZhdGlvblNlZWQsXG4gIH06IEdlbmVyYXRlU01DTXBjV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8uY29sZE11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIE1QQyBLZXljaGFpbnNcbiAgICBjb25zdCBiaXRnb0tleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogYml0Z29LZXlJZCB9KTtcblxuICAgIGlmICghYml0Z29LZXljaGFpbiB8fCAhYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRHbyBrZXljaGFpbiBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICBpZiAoYml0Z29LZXljaGFpbi5zb3VyY2UgIT09ICdiaXRnbycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIGJpdGdvS2V5SWQgaXMgbm90IGEgQml0R28ga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBpZiAoYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbiAhPT0gY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIENvbW1vbiBrZXljaGFpbiBtaXNtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCBCaXRnbyBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGNvbW1vbktleWNoYWluLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgaXNNUEN2MjogbXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJyA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuXG4gICAgY29uc3QgYmFja3VwS2V5Q2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBjb21tb25LZXljaGFpbixcbiAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgIGlzTVBDdjI6IG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBiYWNrdXBLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGJhY2t1cEtleUNoYWluUGFyYW1zKTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCBrZXljaGFpbnMgPSB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTtcbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdLFxuICAgICAgdHlwZTogJ2NvbGQnLFxuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHdhbGxldFZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIEN1c3RvZGlhbCBUU1MgV2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQ3VzdG9kaWFsTXBjV2FsbGV0KHtcbiAgICBsYWJlbCxcbiAgICBtdWx0aXNpZ1R5cGUsXG4gICAgZW50ZXJwcmlzZSxcbiAgICB3YWxsZXRWZXJzaW9uLFxuICB9OiBHZW5lcmF0ZUJhc2VNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5jdXN0b2RpYWxNdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICAgIHR5cGU6ICdjdXN0b2RpYWwnLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgV2FsbGV0XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gd2FsbGV0LmtleUlkcygpO1xuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzBdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ3VzZXInIH0sXG4gICAgICBiYWNrdXBLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzFdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ2JhY2t1cCcgfSxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6IGtleWNoYWluc1syXSwgdHlwZTogbXVsdGlzaWdUeXBlLCBzb3VyY2U6ICdiaXRnbycgfSxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbj86IG51bWJlciwgbXVsdGlzaWdUeXBlVmVyc2lvbj86IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uaXNFVk0oKSAmJiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICBpZiAoIXdhbGxldFZlcnNpb24gfHwgKHdhbGxldFZlcnNpb24gIT09IDUgJiYgd2FsbGV0VmVyc2lvbiAhPT0gNikpIHtcbiAgICAgICAgcmV0dXJuIDU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YWxsZXRWZXJzaW9uO1xuICB9XG59XG4iXX0=
|