@bitgo/sdk-core 37.10.1 → 38.0.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.
Files changed (71) hide show
  1. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -3
  2. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  3. package/dist/src/bitgo/baseCoin/baseCoin.js +3 -17
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +2 -2
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  7. package/dist/src/bitgo/bitgoBase.d.ts +3 -6
  8. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  9. package/dist/src/bitgo/bitgoBase.js +1 -1
  10. package/dist/src/bitgo/environments.d.ts.map +1 -1
  11. package/dist/src/bitgo/environments.js +9 -1
  12. package/dist/src/bitgo/internal/keycard.d.ts +9 -18
  13. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  14. package/dist/src/bitgo/internal/keycard.js +8 -56
  15. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +2 -12
  16. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -1
  17. package/dist/src/bitgo/keychain/decryptKeychain.js +6 -37
  18. package/dist/src/bitgo/keychain/iKeychains.d.ts +1 -2
  19. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  20. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  21. package/dist/src/bitgo/keychain/keychains.d.ts +1 -12
  22. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  23. package/dist/src/bitgo/keychain/keychains.js +16 -44
  24. package/dist/src/bitgo/recovery/initiate.d.ts +2 -15
  25. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  26. package/dist/src/bitgo/recovery/initiate.js +7 -47
  27. package/dist/src/bitgo/trading/tradingAccount.js +2 -2
  28. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
  29. package/dist/src/bitgo/utils/tss/addressVerification.js +3 -10
  30. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  31. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +5 -5
  32. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +7 -7
  33. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +13 -8
  34. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +78 -103
  36. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -0
  37. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  38. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +61 -18
  39. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -3
  40. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +30 -46
  42. package/dist/src/bitgo/wallet/iWallet.d.ts +2 -4
  43. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  44. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  45. package/dist/src/bitgo/wallet/iWallets.d.ts +96 -2
  46. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  47. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  48. package/dist/src/bitgo/wallet/wallet.d.ts +8 -21
  49. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  50. package/dist/src/bitgo/wallet/wallet.js +26 -114
  51. package/dist/src/bitgo/wallet/wallets.d.ts +5 -0
  52. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  53. package/dist/src/bitgo/wallet/wallets.js +123 -27
  54. package/dist/src/index.d.ts +1 -0
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +1 -1
  57. package/dist/test/unit/bitgo/recovery/initiate.js +18 -89
  58. package/dist/test/unit/bitgo/trading/tradingAccount.js +5 -5
  59. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +26 -22
  60. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +14 -14
  61. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +129 -10
  62. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  63. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  64. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  65. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +47 -75
  66. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +4 -4
  67. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +16 -16
  68. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +364 -14
  69. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +2 -5
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +4 -4
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=eddsaExternalSigner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eddsaExternalSigner.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const sinon = __importStar(require("sinon"));
38
+ const src_1 = require("../../../../../../src");
39
+ const gpgKeys_1 = require("../ecdsa/gpgKeys");
40
+ describe('EddsaUtils.createKeychainsWithExternalSigner', function () {
41
+ let utils;
42
+ let callbacks;
43
+ let mockCoin;
44
+ const enterprise = 'enterprise-id';
45
+ const commonKeychain = 'eddsa-common-keychain';
46
+ const keyShare = (pub, prv, proof) => ({
47
+ publicShare: pub,
48
+ privateShare: prv,
49
+ privateShareProof: proof,
50
+ vssProof: `${proof}-vss`,
51
+ gpgKey: `${pub}-gpg`,
52
+ });
53
+ const userToBitgoKeyShare = keyShare('upub', 'uprv-enc', 'uproof');
54
+ const backupToBitgoKeyShare = keyShare('bpub', 'bprv-enc', 'bproof');
55
+ const backupToUserCounterPartyKeyShare = keyShare('ucp-pub', 'ucp-prv', 'ucp-proof');
56
+ const userState = { encryptedData: 'u-data', encryptedDataKey: 'u-data-key' };
57
+ const backupState = { encryptedData: 'b-data', encryptedDataKey: 'b-data-key' };
58
+ const bitgoKeychain = { id: 'bitgo-key-id', commonKeychain, source: 'bitgo', type: 'tss' };
59
+ const initResult = {
60
+ userGpgPublicKey: 'user-gpg-pub',
61
+ backupGpgPublicKey: 'backup-gpg-pub',
62
+ userToBitgoKeyShare,
63
+ backupToBitgoKeyShare,
64
+ userState,
65
+ backupState,
66
+ backupToUserCounterPartyKeyShare,
67
+ };
68
+ beforeEach(function () {
69
+ callbacks = {
70
+ initializeCallback: sinon.stub().resolves(initResult),
71
+ finalizeCallback: sinon.stub().callsFake(async ({ source }) => ({
72
+ commonKeychain,
73
+ counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
74
+ })),
75
+ };
76
+ const mockKeychains = {
77
+ add: sinon.stub().callsFake((params) => {
78
+ if (params.source === 'bitgo')
79
+ return Promise.resolve(bitgoKeychain);
80
+ return Promise.resolve({ id: `${params.source}-key-id`, commonKeychain, source: params.source, type: 'tss' });
81
+ }),
82
+ };
83
+ const mockBitGo = {
84
+ getEnv: sinon.stub().returns('dev'),
85
+ fetchConstants: sinon.stub().resolves({
86
+ mpc: { bitgoPublicKey: gpgKeys_1.bitgoGpgKey.public },
87
+ }),
88
+ };
89
+ mockCoin = {
90
+ getChain: sinon.stub().returns('tsol'),
91
+ keychains: sinon.stub().returns(mockKeychains),
92
+ };
93
+ utils = new src_1.EddsaUtils(mockBitGo, mockCoin);
94
+ });
95
+ afterEach(function () {
96
+ sinon.restore();
97
+ });
98
+ it('should call initialize before finalize, and finalize user before backup (sequential)', async function () {
99
+ const callOrder = [];
100
+ callbacks.initializeCallback.callsFake(async () => {
101
+ callOrder.push('initialize');
102
+ return initResult;
103
+ });
104
+ callbacks.finalizeCallback.callsFake(async ({ source }) => {
105
+ callOrder.push(`finalize-${source}`);
106
+ return {
107
+ commonKeychain,
108
+ counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
109
+ };
110
+ });
111
+ await utils.createKeychainsWithExternalSigner({ enterprise, callbacks });
112
+ assert.deepStrictEqual(callOrder, ['initialize', 'finalize-user', 'finalize-backup']);
113
+ });
114
+ it('should return user, backup, and bitgo keychains', async function () {
115
+ const result = await utils.createKeychainsWithExternalSigner({ enterprise, callbacks });
116
+ assert.ok(result.userKeychain);
117
+ assert.ok(result.backupKeychain);
118
+ assert.ok(result.bitgoKeychain);
119
+ assert.strictEqual(result.bitgoKeychain.commonKeychain, commonKeychain);
120
+ });
121
+ it('should pass bitgoKeychain and counterparty context to finalizeCallback for both sources', async function () {
122
+ await utils.createKeychainsWithExternalSigner({ enterprise, callbacks });
123
+ const userCall = callbacks.finalizeCallback.getCall(0).args[0];
124
+ const backupCall = callbacks.finalizeCallback.getCall(1).args[0];
125
+ assert.strictEqual(userCall.source, 'user');
126
+ assert.strictEqual(userCall.coin, 'tsol');
127
+ assert.deepStrictEqual(userCall.bitgoKeychain, bitgoKeychain);
128
+ assert.strictEqual(userCall.counterPartyGPGKey, 'backup-gpg-pub');
129
+ assert.deepStrictEqual(userCall.counterPartyKeyShare, backupToUserCounterPartyKeyShare);
130
+ assert.deepStrictEqual(userCall.state, userState);
131
+ assert.strictEqual(backupCall.source, 'backup');
132
+ assert.strictEqual(backupCall.coin, 'tsol');
133
+ assert.deepStrictEqual(backupCall.bitgoKeychain, bitgoKeychain);
134
+ assert.strictEqual(backupCall.counterPartyGPGKey, 'user-gpg-pub');
135
+ // backup receives the counterparty share produced by user finalize
136
+ assert.ok(backupCall.counterPartyKeyShare);
137
+ assert.deepStrictEqual(backupCall.state, backupState);
138
+ });
139
+ it('should reject when user finalize does not produce a counterparty key share', async function () {
140
+ callbacks.finalizeCallback.callsFake(async () => ({ commonKeychain }));
141
+ await assert.rejects(() => utils.createKeychainsWithExternalSigner({ enterprise, callbacks }), /User finalize did not produce a counterparty key share/);
142
+ });
143
+ it('should reject when user finalizeCallback returns mismatched commonKeychain', async function () {
144
+ callbacks.finalizeCallback.callsFake(async ({ source }) => ({
145
+ commonKeychain: source === 'user' ? 'wrong-keychain' : commonKeychain,
146
+ counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
147
+ }));
148
+ await assert.rejects(() => utils.createKeychainsWithExternalSigner({ enterprise, callbacks }), /User common keychain does not match BitGo/);
149
+ });
150
+ it('should reject when backup finalizeCallback returns mismatched commonKeychain', async function () {
151
+ callbacks.finalizeCallback.callsFake(async ({ source }) => ({
152
+ commonKeychain: source === 'backup' ? 'wrong-keychain' : commonKeychain,
153
+ counterpartyKeyShare: source === 'user' ? keyShare('bcp-pub', 'bcp-prv', 'bcp-proof') : undefined,
154
+ }));
155
+ await assert.rejects(() => utils.createKeychainsWithExternalSigner({ enterprise, callbacks }), /Backup common keychain does not match BitGo/);
156
+ });
157
+ });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FFeHRlcm5hbFNpZ25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FFeHRlcm5hbFNpZ25lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyw2Q0FBK0I7QUFDL0IsK0NBQXlFO0FBQ3pFLDhDQUErQztBQUUvQyxRQUFRLENBQUMsOENBQThDLEVBQUU7SUFDdkQsSUFBSSxLQUFpQixDQUFDO0lBQ3RCLElBQUksU0FBK0IsQ0FBQztJQUNwQyxJQUFJLFFBQWEsQ0FBQztJQUNsQixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUM7SUFDbkMsTUFBTSxjQUFjLEdBQUcsdUJBQXVCLENBQUM7SUFFL0MsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxXQUFXLEVBQUUsR0FBRztRQUNoQixZQUFZLEVBQUUsR0FBRztRQUNqQixpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLEtBQUssTUFBTTtRQUN4QixNQUFNLEVBQUUsR0FBRyxHQUFHLE1BQU07S0FDckIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRSxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sZ0NBQWdDLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckYsTUFBTSxTQUFTLEdBQUcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxDQUFDO0lBQzlFLE1BQU0sV0FBVyxHQUFHLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUNoRixNQUFNLGFBQWEsR0FBRyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBRTNGLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLGdCQUFnQixFQUFFLGNBQWM7UUFDaEMsa0JBQWtCLEVBQUUsZ0JBQWdCO1FBQ3BDLG1CQUFtQjtRQUNuQixxQkFBcUI7UUFDckIsU0FBUztRQUNULFdBQVc7UUFDWCxnQ0FBZ0M7S0FDakMsQ0FBQztJQUVGLFVBQVUsQ0FBQztRQUNULFNBQVMsR0FBRztZQUNWLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQ3JELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFpQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RixjQUFjO2dCQUNkLG9CQUFvQixFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQ2xHLENBQUMsQ0FBQztTQUNKLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRztZQUNwQixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssT0FBTztvQkFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEgsQ0FBQyxDQUFDO1NBQ0gsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNuQyxjQUFjLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDcEMsR0FBRyxFQUFFLEVBQUUsY0FBYyxFQUFFLHFCQUFXLENBQUMsTUFBTSxFQUFFO2FBQzVDLENBQUM7U0FDSSxDQUFDO1FBRVQsUUFBUSxHQUFHO1lBQ1QsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN4QyxDQUFDO1FBRVQsS0FBSyxHQUFHLElBQUksZ0JBQVUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUM7UUFDUixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0ZBQXNGLEVBQUUsS0FBSztRQUM5RixNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUM7UUFDOUIsU0FBUyxDQUFDLGtCQUFzQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNyRSxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdCLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0YsU0FBUyxDQUFDLGdCQUFvQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQWlDLEVBQUUsRUFBRTtZQUM1RyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNyQyxPQUFPO2dCQUNMLGNBQWM7Z0JBQ2Qsb0JBQW9CLEVBQUUsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDbEcsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUV6RSxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUs7UUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUV4RixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlGQUF5RixFQUFFLEtBQUs7UUFDakcsTUFBTSxLQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUV6RSxNQUFNLFFBQVEsR0FBSSxTQUFTLENBQUMsZ0JBQW9DLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLFVBQVUsR0FBSSxTQUFTLENBQUMsZ0JBQW9DLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RixNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM5RCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDeEYsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xFLG1FQUFtRTtRQUNuRSxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxLQUFLO1FBQ25GLFNBQVMsQ0FBQyxnQkFBb0MsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTVGLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FDbEIsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQ3hFLHdEQUF3RCxDQUN6RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEVBQTRFLEVBQUUsS0FBSztRQUNuRixTQUFTLENBQUMsZ0JBQW9DLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBaUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5RyxjQUFjLEVBQUUsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWM7WUFDckUsb0JBQW9CLEVBQUUsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDbEcsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQ2xCLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUN4RSwyQ0FBMkMsQ0FDNUMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhFQUE4RSxFQUFFLEtBQUs7UUFDckYsU0FBUyxDQUFDLGdCQUFvQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQWlDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUcsY0FBYyxFQUFFLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxjQUFjO1lBQ3ZFLG9CQUFvQixFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ2xHLENBQUMsQ0FBQyxDQUFDO1FBRUosTUFBTSxNQUFNLENBQUMsT0FBTyxDQUNsQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFDeEUsNkNBQTZDLENBQzlDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBFZGRzYVV0aWxzLCBFZGRzYUtleUdlbkNhbGxiYWNrcyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBiaXRnb0dwZ0tleSB9IGZyb20gJy4uL2VjZHNhL2dwZ0tleXMnO1xuXG5kZXNjcmliZSgnRWRkc2FVdGlscy5jcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXInLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB1dGlsczogRWRkc2FVdGlscztcbiAgbGV0IGNhbGxiYWNrczogRWRkc2FLZXlHZW5DYWxsYmFja3M7XG4gIGxldCBtb2NrQ29pbjogYW55O1xuICBjb25zdCBlbnRlcnByaXNlID0gJ2VudGVycHJpc2UtaWQnO1xuICBjb25zdCBjb21tb25LZXljaGFpbiA9ICdlZGRzYS1jb21tb24ta2V5Y2hhaW4nO1xuXG4gIGNvbnN0IGtleVNoYXJlID0gKHB1Yjogc3RyaW5nLCBwcnY6IHN0cmluZywgcHJvb2Y6IHN0cmluZykgPT4gKHtcbiAgICBwdWJsaWNTaGFyZTogcHViLFxuICAgIHByaXZhdGVTaGFyZTogcHJ2LFxuICAgIHByaXZhdGVTaGFyZVByb29mOiBwcm9vZixcbiAgICB2c3NQcm9vZjogYCR7cHJvb2Z9LXZzc2AsXG4gICAgZ3BnS2V5OiBgJHtwdWJ9LWdwZ2AsXG4gIH0pO1xuICBjb25zdCB1c2VyVG9CaXRnb0tleVNoYXJlID0ga2V5U2hhcmUoJ3VwdWInLCAndXBydi1lbmMnLCAndXByb29mJyk7XG4gIGNvbnN0IGJhY2t1cFRvQml0Z29LZXlTaGFyZSA9IGtleVNoYXJlKCdicHViJywgJ2JwcnYtZW5jJywgJ2Jwcm9vZicpO1xuICBjb25zdCBiYWNrdXBUb1VzZXJDb3VudGVyUGFydHlLZXlTaGFyZSA9IGtleVNoYXJlKCd1Y3AtcHViJywgJ3VjcC1wcnYnLCAndWNwLXByb29mJyk7XG4gIGNvbnN0IHVzZXJTdGF0ZSA9IHsgZW5jcnlwdGVkRGF0YTogJ3UtZGF0YScsIGVuY3J5cHRlZERhdGFLZXk6ICd1LWRhdGEta2V5JyB9O1xuICBjb25zdCBiYWNrdXBTdGF0ZSA9IHsgZW5jcnlwdGVkRGF0YTogJ2ItZGF0YScsIGVuY3J5cHRlZERhdGFLZXk6ICdiLWRhdGEta2V5JyB9O1xuICBjb25zdCBiaXRnb0tleWNoYWluID0geyBpZDogJ2JpdGdvLWtleS1pZCcsIGNvbW1vbktleWNoYWluLCBzb3VyY2U6ICdiaXRnbycsIHR5cGU6ICd0c3MnIH07XG5cbiAgY29uc3QgaW5pdFJlc3VsdCA9IHtcbiAgICB1c2VyR3BnUHVibGljS2V5OiAndXNlci1ncGctcHViJyxcbiAgICBiYWNrdXBHcGdQdWJsaWNLZXk6ICdiYWNrdXAtZ3BnLXB1YicsXG4gICAgdXNlclRvQml0Z29LZXlTaGFyZSxcbiAgICBiYWNrdXBUb0JpdGdvS2V5U2hhcmUsXG4gICAgdXNlclN0YXRlLFxuICAgIGJhY2t1cFN0YXRlLFxuICAgIGJhY2t1cFRvVXNlckNvdW50ZXJQYXJ0eUtleVNoYXJlLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrcyA9IHtcbiAgICAgIGluaXRpYWxpemVDYWxsYmFjazogc2lub24uc3R1YigpLnJlc29sdmVzKGluaXRSZXN1bHQpLFxuICAgICAgZmluYWxpemVDYWxsYmFjazogc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoeyBzb3VyY2UgfTogeyBzb3VyY2U6ICd1c2VyJyB8ICdiYWNrdXAnIH0pID0+ICh7XG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICBjb3VudGVycGFydHlLZXlTaGFyZTogc291cmNlID09PSAndXNlcicgPyBrZXlTaGFyZSgnYmNwLXB1YicsICdiY3AtcHJ2JywgJ2JjcC1wcm9vZicpIDogdW5kZWZpbmVkLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrS2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocGFyYW1zLnNvdXJjZSA9PT0gJ2JpdGdvJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShiaXRnb0tleWNoYWluKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGlkOiBgJHtwYXJhbXMuc291cmNlfS1rZXktaWRgLCBjb21tb25LZXljaGFpbiwgc291cmNlOiBwYXJhbXMuc291cmNlLCB0eXBlOiAndHNzJyB9KTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrQml0R28gPSB7XG4gICAgICBnZXRFbnY6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdkZXYnKSxcbiAgICAgIGZldGNoQ29uc3RhbnRzOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBtcGM6IHsgYml0Z29QdWJsaWNLZXk6IGJpdGdvR3BnS2V5LnB1YmxpYyB9LFxuICAgICAgfSksXG4gICAgfSBhcyBhbnk7XG5cbiAgICBtb2NrQ29pbiA9IHtcbiAgICAgIGdldENoYWluOiBzaW5vbi5zdHViKCkucmV0dXJucygndHNvbCcpLFxuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyhtb2NrS2V5Y2hhaW5zKSxcbiAgICB9IGFzIGFueTtcblxuICAgIHV0aWxzID0gbmV3IEVkZHNhVXRpbHMobW9ja0JpdEdvLCBtb2NrQ29pbik7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGwgaW5pdGlhbGl6ZSBiZWZvcmUgZmluYWxpemUsIGFuZCBmaW5hbGl6ZSB1c2VyIGJlZm9yZSBiYWNrdXAgKHNlcXVlbnRpYWwpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNhbGxPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgICAoY2FsbGJhY2tzLmluaXRpYWxpemVDYWxsYmFjayBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxzRmFrZShhc3luYyAoKSA9PiB7XG4gICAgICBjYWxsT3JkZXIucHVzaCgnaW5pdGlhbGl6ZScpO1xuICAgICAgcmV0dXJuIGluaXRSZXN1bHQ7XG4gICAgfSk7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICh7IHNvdXJjZSB9OiB7IHNvdXJjZTogJ3VzZXInIHwgJ2JhY2t1cCcgfSkgPT4ge1xuICAgICAgY2FsbE9yZGVyLnB1c2goYGZpbmFsaXplLSR7c291cmNlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGNvdW50ZXJwYXJ0eUtleVNoYXJlOiBzb3VyY2UgPT09ICd1c2VyJyA/IGtleVNoYXJlKCdiY3AtcHViJywgJ2JjcC1wcnYnLCAnYmNwLXByb29mJykgOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHsgZW50ZXJwcmlzZSwgY2FsbGJhY2tzIH0pO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChjYWxsT3JkZXIsIFsnaW5pdGlhbGl6ZScsICdmaW5hbGl6ZS11c2VyJywgJ2ZpbmFsaXplLWJhY2t1cCddKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdXNlciwgYmFja3VwLCBhbmQgYml0Z28ga2V5Y2hhaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHV0aWxzLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9KTtcblxuICAgIGFzc2VydC5vayhyZXN1bHQudXNlcktleWNoYWluKTtcbiAgICBhc3NlcnQub2socmVzdWx0LmJhY2t1cEtleWNoYWluKTtcbiAgICBhc3NlcnQub2socmVzdWx0LmJpdGdvS2V5Y2hhaW4pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbiwgY29tbW9uS2V5Y2hhaW4pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhc3MgYml0Z29LZXljaGFpbiBhbmQgY291bnRlcnBhcnR5IGNvbnRleHQgdG8gZmluYWxpemVDYWxsYmFjayBmb3IgYm90aCBzb3VyY2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9KTtcblxuICAgIGNvbnN0IHVzZXJDYWxsID0gKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuZ2V0Q2FsbCgwKS5hcmdzWzBdO1xuICAgIGNvbnN0IGJhY2t1cENhbGwgPSAoY2FsbGJhY2tzLmZpbmFsaXplQ2FsbGJhY2sgYXMgc2lub24uU2lub25TdHViKS5nZXRDYWxsKDEpLmFyZ3NbMF07XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodXNlckNhbGwuc291cmNlLCAndXNlcicpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2FsbC5jb2luLCAndHNvbCcpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodXNlckNhbGwuYml0Z29LZXljaGFpbiwgYml0Z29LZXljaGFpbik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHVzZXJDYWxsLmNvdW50ZXJQYXJ0eUdQR0tleSwgJ2JhY2t1cC1ncGctcHViJyk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh1c2VyQ2FsbC5jb3VudGVyUGFydHlLZXlTaGFyZSwgYmFja3VwVG9Vc2VyQ291bnRlclBhcnR5S2V5U2hhcmUpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodXNlckNhbGwuc3RhdGUsIHVzZXJTdGF0ZSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5zb3VyY2UsICdiYWNrdXAnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5jb2luLCAndHNvbCcpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5iaXRnb0tleWNoYWluLCBiaXRnb0tleWNoYWluKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5jb3VudGVyUGFydHlHUEdLZXksICd1c2VyLWdwZy1wdWInKTtcbiAgICAvLyBiYWNrdXAgcmVjZWl2ZXMgdGhlIGNvdW50ZXJwYXJ0eSBzaGFyZSBwcm9kdWNlZCBieSB1c2VyIGZpbmFsaXplXG4gICAgYXNzZXJ0Lm9rKGJhY2t1cENhbGwuY291bnRlclBhcnR5S2V5U2hhcmUpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmFja3VwQ2FsbC5zdGF0ZSwgYmFja3VwU3RhdGUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIHVzZXIgZmluYWxpemUgZG9lcyBub3QgcHJvZHVjZSBhIGNvdW50ZXJwYXJ0eSBrZXkgc2hhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICgpID0+ICh7IGNvbW1vbktleWNoYWluIH0pKTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgKCkgPT4gdXRpbHMuY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHsgZW50ZXJwcmlzZSwgY2FsbGJhY2tzIH0pLFxuICAgICAgL1VzZXIgZmluYWxpemUgZGlkIG5vdCBwcm9kdWNlIGEgY291bnRlcnBhcnR5IGtleSBzaGFyZS9cbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIHVzZXIgZmluYWxpemVDYWxsYmFjayByZXR1cm5zIG1pc21hdGNoZWQgY29tbW9uS2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICh7IHNvdXJjZSB9OiB7IHNvdXJjZTogJ3VzZXInIHwgJ2JhY2t1cCcgfSkgPT4gKHtcbiAgICAgIGNvbW1vbktleWNoYWluOiBzb3VyY2UgPT09ICd1c2VyJyA/ICd3cm9uZy1rZXljaGFpbicgOiBjb21tb25LZXljaGFpbixcbiAgICAgIGNvdW50ZXJwYXJ0eUtleVNoYXJlOiBzb3VyY2UgPT09ICd1c2VyJyA/IGtleVNoYXJlKCdiY3AtcHViJywgJ2JjcC1wcnYnLCAnYmNwLXByb29mJykgOiB1bmRlZmluZWQsXG4gICAgfSkpO1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PiB1dGlscy5jcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXIoeyBlbnRlcnByaXNlLCBjYWxsYmFja3MgfSksXG4gICAgICAvVXNlciBjb21tb24ga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28vXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBiYWNrdXAgZmluYWxpemVDYWxsYmFjayByZXR1cm5zIG1pc21hdGNoZWQgY29tbW9uS2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgKGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrIGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbHNGYWtlKGFzeW5jICh7IHNvdXJjZSB9OiB7IHNvdXJjZTogJ3VzZXInIHwgJ2JhY2t1cCcgfSkgPT4gKHtcbiAgICAgIGNvbW1vbktleWNoYWluOiBzb3VyY2UgPT09ICdiYWNrdXAnID8gJ3dyb25nLWtleWNoYWluJyA6IGNvbW1vbktleWNoYWluLFxuICAgICAgY291bnRlcnBhcnR5S2V5U2hhcmU6IHNvdXJjZSA9PT0gJ3VzZXInID8ga2V5U2hhcmUoJ2JjcC1wdWInLCAnYmNwLXBydicsICdiY3AtcHJvb2YnKSA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICgpID0+IHV0aWxzLmNyZWF0ZUtleWNoYWluc1dpdGhFeHRlcm5hbFNpZ25lcih7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9KSxcbiAgICAgIC9CYWNrdXAgY29tbW9uIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvL1xuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=