@bitgo/sdk-core 38.12.1 → 38.15.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 (109) hide show
  1. package/dist/src/account-lib/baseCoin/enum.d.ts +2 -1
  2. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/enum.js +3 -1
  4. package/dist/src/api/types.d.ts +6 -0
  5. package/dist/src/api/types.d.ts.map +1 -1
  6. package/dist/src/api/types.js +8 -1
  7. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +2 -0
  8. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  9. package/dist/src/bitgo/baseCoin/baseCoin.js +3 -3
  10. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +12 -6
  11. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  12. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  13. package/dist/src/bitgo/defi/defiVault.d.ts +35 -1
  14. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
  15. package/dist/src/bitgo/defi/defiVault.js +67 -1
  16. package/dist/src/bitgo/defi/iDefiVault.d.ts +15 -0
  17. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
  18. package/dist/src/bitgo/defi/iDefiVault.js +1 -1
  19. package/dist/src/bitgo/internal/keycard.d.ts +2 -1
  20. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  21. package/dist/src/bitgo/internal/keycard.js +6 -3
  22. package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -2
  23. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  24. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  25. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  26. package/dist/src/bitgo/keychain/keychains.js +29 -5
  27. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +27 -6
  28. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
  29. package/dist/src/bitgo/safe/derivableEd25519Pub.js +68 -20
  30. package/dist/src/bitgo/safe/safe.js +2 -2
  31. package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
  32. package/dist/src/bitgo/safe/safes.js +10 -1
  33. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  34. package/dist/src/bitgo/tss/common.js +4 -1
  35. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +50 -0
  36. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  37. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +112 -0
  38. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  39. package/dist/src/bitgo/utils/mpcUtils.js +15 -1
  40. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +1 -1
  41. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  42. package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
  43. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +39 -0
  44. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
  45. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +344 -0
  46. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +1 -0
  47. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  48. package/dist/src/bitgo/utils/tss/ecdsa/index.js +2 -1
  49. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +17 -2
  50. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -1
  51. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +1 -1
  52. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +8 -5
  53. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  54. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1 -1
  55. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +33 -0
  56. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  57. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +260 -0
  58. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +1 -0
  59. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  60. package/dist/src/bitgo/utils/tss/eddsa/index.js +2 -1
  61. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +15 -2
  62. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
  63. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +13 -2
  64. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
  65. package/dist/src/bitgo/utils/tss/recipientUtils.js +13 -1
  66. package/dist/src/bitgo/wallet/iWallet.d.ts +30 -0
  67. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  68. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  69. package/dist/src/bitgo/wallet/iWallets.d.ts +2 -0
  70. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  71. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  72. package/dist/src/bitgo/wallet/safeKeychain.d.ts +25 -2
  73. package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -1
  74. package/dist/src/bitgo/wallet/safeKeychain.js +72 -18
  75. package/dist/src/bitgo/wallet/wallet.d.ts +18 -5
  76. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  77. package/dist/src/bitgo/wallet/wallet.js +109 -19
  78. package/dist/src/bitgo/wallet/wallets.d.ts +6 -0
  79. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  80. package/dist/src/bitgo/wallet/wallets.js +37 -22
  81. package/dist/test/unit/bitgo/defi/defiVault.js +163 -1
  82. package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
  83. package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
  84. package/dist/test/unit/bitgo/keychain/keychains.js +155 -0
  85. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +21 -6
  86. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +114 -62
  87. package/dist/test/unit/bitgo/safe/safe.js +4 -4
  88. package/dist/test/unit/bitgo/safe/safes.js +28 -2
  89. package/dist/test/unit/bitgo/tss/common.d.ts +2 -0
  90. package/dist/test/unit/bitgo/tss/common.d.ts.map +1 -0
  91. package/dist/test/unit/bitgo/tss/common.js +77 -0
  92. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  93. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  94. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +181 -0
  95. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +70 -1
  96. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
  97. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  98. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +173 -0
  99. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +33 -1
  100. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
  101. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
  102. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
  103. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +10 -10
  104. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts +9 -0
  105. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts.map +1 -0
  106. package/dist/test/unit/bitgo/wallet/safeShareWallet.js +303 -0
  107. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +51 -40
  108. package/dist/tsconfig.tsbuildinfo +1 -1
  109. package/package.json +6 -5
@@ -38,6 +38,8 @@ const sinon = __importStar(require("sinon"));
38
38
  require("should");
39
39
  const wallets_1 = require("../../../../src/bitgo/wallet/wallets");
40
40
  const wallet_1 = require("../../../../src/bitgo/wallet/wallet");
41
+ const bitcoin_1 = require("../../../../src/bitgo/bitcoin");
42
+ const api_1 = require("../../../../src/api");
41
43
  describe('Wallets - encryptionVersion threading', function () {
42
44
  let wallets;
43
45
  let mockBitGo;
@@ -218,7 +220,9 @@ describe('Wallets - encryptionVersion threading', function () {
218
220
  });
219
221
  describe('Wallet.shareWallet / createBulkWalletShare', function () {
220
222
  let wallet;
223
+ let recipientPubKey;
221
224
  beforeEach(function () {
225
+ recipientPubKey = (0, bitcoin_1.makeRandomKey)().publicKey.toString('hex');
222
226
  const mockWalletData = {
223
227
  id: 'wallet-id',
224
228
  keys: ['key-1', 'key-2', 'key-3'],
@@ -232,62 +236,69 @@ describe('Wallets - encryptionVersion threading', function () {
232
236
  mockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
233
237
  wallet = new wallet_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
234
238
  });
235
- it('shareWallet passes encryptionVersion to prepareSharedKeychain', async function () {
236
- const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
237
- mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
238
- mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
239
- await wallet.shareWallet({
240
- email: 'test@test.com',
241
- permissions: 'spend',
242
- walletPassphrase: 'passphrase',
243
- encryptionVersion: 2,
239
+ it('encryptPrvForUser encrypts to the ECDH secret at the high-entropy version', async function () {
240
+ await wallet.encryptPrvForUser('prv', 'pub', recipientPubKey, 'm/0', 2);
241
+ assert.ok(mockBitGo.encrypt.calledOnce, 'encrypt should have been called');
242
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
243
+ });
244
+ it('preserves the encryptionVersion position before a pre-decrypted keychain', async function () {
245
+ await wallet.prepareSharedKeychain(undefined, recipientPubKey, 'm/0', 2, {
246
+ prv: 'prv',
247
+ pub: 'pub',
244
248
  });
245
- assert.ok(prepareStub.calledOnce, 'prepareSharedKeychain should be called');
246
- assert.strictEqual(prepareStub.firstCall.args[3], 2, 'encryptionVersion should be forwarded');
249
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].input, 'prv');
250
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
247
251
  });
248
- it('shareWallet passes encryptionVersion: undefined when not set', async function () {
249
- const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
250
- mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
252
+ it('shareWallet ignores a caller-supplied encryptionVersion for the shared keychain', async function () {
253
+ sinon.stub(wallet, 'getDecryptedKeychainForSharing').resolves({ prv: 'prv', pub: 'pub' });
254
+ mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: recipientPubKey, path: 'm/0' });
251
255
  mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
252
256
  await wallet.shareWallet({
253
257
  email: 'test@test.com',
254
258
  permissions: 'spend',
255
259
  walletPassphrase: 'passphrase',
260
+ encryptionVersion: 2,
256
261
  });
257
- assert.ok(prepareStub.calledOnce);
258
- assert.strictEqual(prepareStub.firstCall.args[3], undefined);
262
+ assert.ok(mockBitGo.encrypt.calledOnce, 'encrypt should have been called');
263
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION, 'the ECDH-keyed share must not be encrypted at the caller-requested version');
259
264
  });
260
- it('createBulkWalletShare passes encryptionVersion to encryptPrvForUser', async function () {
261
- const encryptPrvStub = sinon
262
- .stub(wallet, 'encryptPrvForUser')
263
- .resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
264
- sinon
265
- .stub(wallet, 'getDecryptedKeychainForSharing')
266
- .resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
265
+ it('createBulkWalletShare ignores a caller-supplied encryptionVersion for every share', async function () {
266
+ sinon.stub(wallet, 'getDecryptedKeychainForSharing').resolves({ prv: 'prv', pub: 'pub' });
267
267
  sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
268
268
  await wallet.createBulkWalletShare({
269
269
  walletPassphrase: 'passphrase',
270
- keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
270
+ keyShareOptions: [
271
+ { userId: 'user-1', pubKey: recipientPubKey, path: 'm/0', permissions: ['spend'] },
272
+ { userId: 'user-2', pubKey: recipientPubKey, path: 'm/1', permissions: ['spend'] },
273
+ ],
271
274
  encryptionVersion: 2,
272
275
  });
273
- assert.ok(encryptPrvStub.calledOnce);
274
- assert.strictEqual(encryptPrvStub.firstCall.args[4], 2, 'encryptionVersion should be forwarded');
276
+ assert.strictEqual(mockBitGo.encrypt.callCount, 2, 'each recipient gets its own encryption');
277
+ for (const call of mockBitGo.encrypt.getCalls()) {
278
+ assert.strictEqual(call.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
279
+ }
275
280
  });
276
- it('createBulkWalletShare passes encryptionVersion: undefined when not set', async function () {
277
- const encryptPrvStub = sinon
278
- .stub(wallet, 'encryptPrvForUser')
279
- .resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
280
- sinon
281
- .stub(wallet, 'getDecryptedKeychainForSharing')
282
- .resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
283
- sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
284
- await wallet.createBulkWalletShare({
285
- walletPassphrase: 'passphrase',
286
- keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
281
+ });
282
+ describe('Wallets.generateWallet', function () {
283
+ it('keeps human-passphrase encryption at the requested version and pins recovery encryption', async function () {
284
+ mockKeychains.createBackup = sinon.stub().resolves({ id: 'backup-key-id', pub: 'backup-pub' });
285
+ mockKeychains.createBitGo = sinon.stub().resolves({ id: 'bitgo-key-id', pub: 'bitgo-pub' });
286
+ mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({ id: 'wallet-id' }) }) });
287
+ mockBaseCoin.getDefaultMultisigType = sinon.stub().returns('onchain');
288
+ mockBaseCoin.isEVM = sinon.stub().returns(false);
289
+ mockBaseCoin.isValidMofNSetup = sinon.stub().returns(true);
290
+ mockBaseCoin.supplementGenerateWallet = sinon.stub().callsFake(async (params) => params);
291
+ mockBaseCoin.signMessage = sinon.stub().resolves(Buffer.from('aabbcc', 'hex'));
292
+ await wallets.generateWallet({
293
+ label: 'Test Wallet',
294
+ passphrase: 'wallet-passphrase',
295
+ passcodeEncryptionCode: 'recovery-code',
296
+ encryptionVersion: 2,
287
297
  });
288
- assert.ok(encryptPrvStub.calledOnce);
289
- assert.strictEqual(encryptPrvStub.firstCall.args[4], undefined);
298
+ assert.strictEqual(mockBitGo.encrypt.callCount, 2);
299
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, 2);
300
+ assert.strictEqual(mockBitGo.encrypt.secondCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
290
301
  });
291
302
  });
292
303
  });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0VuY3J5cHRpb25WZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRW5jcnlwdGlvblZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFDL0QsZ0VBQTZEO0FBRTdELFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRTtJQUNoRCxJQUFJLE9BQWdCLENBQUM7SUFDckIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxZQUFpQixDQUFDO0lBQ3RCLElBQUksYUFBa0IsQ0FBQztJQUV2QixNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FDWCxpSEFBaUgsQ0FBQztJQUVwSCxVQUFVLENBQUM7UUFDVCxhQUFhLEdBQUc7WUFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzVELEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsQ0FBQztTQUMvRixDQUFDO1FBRUYsU0FBUyxHQUFHO1lBQ1YsT0FBTyxFQUFFLEtBQUs7aUJBQ1gsSUFBSSxFQUFFO2lCQUNOLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUF1QyxFQUFFLEVBQUUsQ0FBQyxPQUFPLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM1RyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFD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QUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IFdhbGxldHMgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L3dhbGxldHMnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQnO1xuXG5kZXNjcmliZSgnV2FsbGV0cyAtIGVuY3J5cHRpb25WZXJzaW9uIHRocmVhZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldHM6IFdhbGxldHM7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuICBsZXQgbW9ja0tleWNoYWluczogYW55O1xuXG4gIGNvbnN0IHVzZXJQcnYgPSAneHBydlNvbWVVc2VyUHJpdmF0ZUtleSc7XG4gIGNvbnN0IHVzZXJQdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRnRYZ1M1c1lKQUJxcUc5WUxtQzRRMVJkYXA5Z1NFOE5xdHd5YkdoZVBZMmdaMjlFU0ZqcUpvQ3UxUnVwamU4WXRHcXNlZkQyNjVUTWc3dXNVREZkcDZXMUVHTWNldDgnO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tLZXljaGFpbnMgPSB7XG4gICAgICBjcmVhdGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcHViOiB1c2VyUHViLCBwcnY6IHVzZXJQcnYgfSksXG4gICAgICBhZGQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAndXNlci1rZXktaWQnLCBwdWI6IHVzZXJQdWIsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1wcnYnIH0pLFxuICAgIH07XG5cbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBlbmNyeXB0OiBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKHsgcGFzc3dvcmQsIGlucHV0IH06IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBgZW5jOiR7cGFzc3dvcmR9OiR7aW5wdXR9YCksXG4gICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ2RlY3J5cHRlZFBydicpLFxuICAgICAgY3JlYXRlRW5jcnlwdGlvblNlc3Npb246IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhc3N3b3JkOiBzdHJpbmcsIGVuY3J5cHRpb25WZXJzaW9uPzogMSB8IDIpID0+ICh7XG4gICAgICAgIGVuY3J5cHQ6IHNpbm9uXG4gICAgICAgICAgLnN0dWIoKVxuICAgICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKGlucHV0OiBzdHJpbmcpID0+IGBzZXNzaW9uLWVuYzoke3Bhc3N3b3JkfToke2VuY3J5cHRpb25WZXJzaW9ufToke2lucHV0fWApLFxuICAgICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ3Nlc3Npb24tZGVjcnlwdGVkJyksXG4gICAgICAgIGRlc3Ryb3k6IHNpbm9uLnN0dWIoKSxcbiAgICAgIH0pKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKSwgcXVlcnk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpIH0pLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KSxcbiAgICAgIHB1dDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBzZW5kOiBzaW5vblxuICAgICAgICAgIC5zdHViKClcbiAgICAgICAgICAucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgYWNjZXB0ZWRXYWxsZXRTaGFyZXM6IFtdLCB3YWxsZXRTaGFyZVVwZGF0ZUVycm9yczogW10gfSkgfSksXG4gICAgICB9KSxcbiAgICAgIGdldEVDREhLZXljaGFpbjogc2lub24uc3R1YigpLnJlc29sdmVzKHsgZW5jcnlwdGVkWHBydjogJ2VuY1hwcnYnIH0pLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL3Rlc3QvdXJsJyksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLnJldHVybnMobW9ja0tleWNoYWlucyksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdidGMnKSxcbiAgICAgIGdldENoYWluOiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKSxcbiAgICB9O1xuXG4gICAgd2FsbGV0cyA9IG5ldyBXYWxsZXRzKG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIGVuY3J5cHQgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgICAgd2FsbGV0OiAnd2FsbGV0LWlkJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5hY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6ICdzaGFyZS1pZCcsXG4gICAgICAgIHVzZXJQYXNzd29yZDogJ215LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCwgJ2VuY3J5cHQgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQnKTtcbiAgICAgIGNvbnN0IGNhbGwgPSBtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgICAgIHdhbGxldDogJ3dhbGxldC1pZCcsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiAnc2hhcmUtaWQnLFxuICAgICAgICB1c2VyUGFzc3dvcmQ6ICdteS1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHQuZmlyc3RDYWxsO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1bGtBY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB3YWxsZXRTaGFyZXNMaXN0ID0ge1xuICAgICAgaW5jb21pbmc6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2hhcmUtaWQnLFxuICAgICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAga2V5Y2hhaW46IG51bGwsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBvdXRnb2luZzogW10sXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMod2FsbGV0U2hhcmVzTGlzdCkgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBbJ3NoYXJlLWlkJ10sXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24gd2hlbiBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5idWxrQWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkczogWydzaGFyZS1pZCddLFxuICAgICAgICB1c2VyTG9naW5QYXNzd29yZDogJ2xvZ2luLXBhc3N3b3JkJyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvY2Vzc2VzIHNoYXJlcyBpbiBiYXRjaGVzIG9mIDE2IHRvIGF2b2lkIFdBU00gbWVtb3J5IGV4aGF1c3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAyMCBzaGFyZXMg4oaSIDIgYmF0Y2hlcyAoMTYgKyA0KSwgdmVyaWZ5aW5nIHRoZSBiYXRjaCBib3VuZGFyeSBpcyBjcm9zc2VkXG4gICAgICBjb25zdCBtYW55U2hhcmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjAgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgIGlkOiBgc2hhcmUtJHtpfWAsXG4gICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgfSkpO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHtcbiAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpbmNvbWluZzogbWFueVNoYXJlcywgb3V0Z29pbmc6IFtdIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENhcHR1cmUgdGhlIHNlc3Npb24gc28gd2UgY2FuIGluc3BlY3QgaXRzIGVuY3J5cHQgY2FsbCBjb3VudFxuICAgICAgY29uc3Qgc2Vzc2lvbkVuY3J5cHRTdHViID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoaW5wdXQ6IHN0cmluZykgPT4gYHNlc3Npb24tZW5jOiR7aW5wdXR9YCk7XG4gICAgICBtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24gPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBlbmNyeXB0OiBzZXNzaW9uRW5jcnlwdFN0dWIsXG4gICAgICAgIGRlY3J5cHQ6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgZGVzdHJveTogc2lub24uc3R1YigpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYnVsa0FjY2VwdFNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZHM6IG1hbnlTaGFyZXMubWFwKChzKSA9PiBzLmlkKSxcbiAgICAgICAgdXNlckxvZ2luUGFzc3dvcmQ6ICdsb2dpbi1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2Vzc2lvbiBjcmVhdGVkIG9uY2UsIHNlc3Npb24uZW5jcnlwdCBjYWxsZWQgb25jZSBwZXIgc2hhcmVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24uY2FsbENvdW50LCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzZXNzaW9uRW5jcnlwdFN0dWIuY2FsbENvdW50LCAyMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbmV2ZXIgcnVucyBtb3JlIHRoYW4gMTYgc2hhcmVzIGNvbmN1cnJlbnRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpbkZsaWdodCA9IDA7XG4gICAgICBsZXQgbWF4SW5GbGlnaHQgPSAwO1xuXG4gICAgICBjb25zdCBzZXNzaW9uRW5jcnlwdFN0dWIgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKCgpID0+IHtcbiAgICAgICAgaW5GbGlnaHQrKztcbiAgICAgICAgbWF4SW5GbGlnaHQgPSBNYXRoLm1heChtYXhJbkZsaWdodCwgaW5GbGlnaHQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCdlbmNyeXB0ZWQnKS50aGVuKChyKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQtLTtcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG1vY2tCaXRHby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgIGVuY3J5cHQ6IHNlc3Npb25FbmNyeXB0U3R1YixcbiAgICAgICAgZGVjcnlwdDogc2lub24uc3R1YigpLFxuICAgICAgICBkZXN0cm95OiBzaW5vbi5zdHViKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFueVNoYXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDIwIH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBpZDogYHNoYXJlLSR7aX1gLFxuICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgIH0pKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaW5jb21pbmc6IG1hbnlTaGFyZXMsIG91dGdvaW5nOiBbXSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBtYW55U2hhcmVzLm1hcCgocykgPT4gcy5pZCksXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtYXhJbkZsaWdodCA8PSAxNiwgYGV4cGVjdGVkIG1heCBjb25jdXJyZW5jeSA8PSAxNiwgZ290ICR7bWF4SW5GbGlnaHR9YCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2Vzc2lvbkVuY3J5cHRTdHViLmNhbGxDb3VudCwgMjApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0LnNoYXJlV2FsbGV0IC8gY3JlYXRlQnVsa1dhbGxldFNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXQ6IFdhbGxldDtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWydrZXktMScsICdrZXktMicsICdrZXktMyddLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHVzZXJzOiBbXSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1RzcyA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaGFyZVdhbGxldCBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gcHJlcGFyZVNoYXJlZEtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHJlcGFyZVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZXBhcmVTaGFyZWRLZXljaGFpbicpLnJlc29sdmVzKHt9KTtcbiAgICAgIG1vY2tCaXRHby5nZXRTaGFyaW5nS2V5ID0gc2lub24uc3R1YigpLnJlc29sdmVzKHsgdXNlcklkOiAndXNlci1pZCcsIHB1YmtleTogJ3JlY3ZQdWInLCBwYXRoOiAnbS8wJyB9KTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0LnNoYXJlV2FsbGV0KHtcbiAgICAgICAgZW1haWw6ICd0ZXN0QHRlc3QuY29tJyxcbiAgICAgICAgcGVybWlzc2lvbnM6ICdzcGVuZCcsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4gc2hvdWxkIGJlIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCAyLCAnZW5jcnlwdGlvblZlcnNpb24gc2hvdWxkIGJlIGZvcndhcmRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NoYXJlV2FsbGV0IHBhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHdoZW4gbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4nKS5yZXNvbHZlcyh7fSk7XG4gICAgICBtb2NrQml0R28uZ2V0U2hhcmluZ0tleSA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHVzZXJJZDogJ3VzZXItaWQnLCBwdWJrZXk6ICdyZWN2UHViJywgcGF0aDogJ20vMCcgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5zaGFyZVdhbGxldCh7XG4gICAgICAgIGVtYWlsOiAndGVzdEB0ZXN0LmNvbScsXG4gICAgICAgIHBlcm1pc3Npb25zOiAnc3BlbmQnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZUJ1bGtXYWxsZXRTaGFyZSBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gZW5jcnlwdFBydkZvclVzZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbmNyeXB0UHJ2U3R1YiA9IHNpbm9uXG4gICAgICAgIC5zdHViKHdhbGxldCwgJ2VuY3J5cHRQcnZGb3JVc2VyJylcbiAgICAgICAgLnJlc29sdmVzKHsgZW5jcnlwdGVkUHJ2OiAnZW5jJywgcHViOiAncHViJywgZnJvbVB1YktleTogJ2ZwaycsIHRvUHViS2V5OiAndHBrJywgcGF0aDogJ20vMCcgfSk7XG4gICAgICBzaW5vblxuICAgICAgICAuc3R1Yih3YWxsZXQgYXMgYW55LCAnZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nJylcbiAgICAgICAgLnJlc29sdmVzKHsgcHJ2OiAncHJ2JywgcHViOiAncHViJywgZW5jcnlwdGVkUHJ2OiAnZW5jUHJ2JyB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2NyZWF0ZUJ1bGtLZXlTaGFyZXMnKS5yZXNvbHZlcyh7IHNoYXJlczogW10gfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5jcmVhdGVCdWxrV2FsbGV0U2hhcmUoe1xuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICAgIGtleVNoYXJlT3B0aW9uczogW3sgdXNlcklkOiAndXNlci0xJywgcHViS2V5OiAncHViS2V5JywgcGF0aDogJ20vMCcsIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10gfV0sXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhlbmNyeXB0UHJ2U3R1Yi5jYWxsZWRPbmNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0UHJ2U3R1Yi5maXJzdENhbGwuYXJnc1s0XSwgMiwgJ2VuY3J5cHRpb25WZXJzaW9uIHNob3VsZCBiZSBmb3J3YXJkZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVCdWxrV2FsbGV0U2hhcmUgcGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiB1bmRlZmluZWQgd2hlbiBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZW5jcnlwdFBydlN0dWIgPSBzaW5vblxuICAgICAgICAuc3R1Yih3YWxsZXQsICdlbmNyeXB0UHJ2Rm9yVXNlcicpXG4gICAgICAgIC5yZXNvbHZlcyh7IGVuY3J5cHRlZFBydjogJ2VuYycsIHB1YjogJ3B1YicsIGZyb21QdWJLZXk6ICdmcGsnLCB0b1B1YktleTogJ3RwaycsIHBhdGg6ICdtLzAnIH0pO1xuICAgICAgc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpXG4gICAgICAgIC5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicsIGVuY3J5cHRlZFBydjogJ2VuY1BydicgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdjcmVhdGVCdWxrS2V5U2hhcmVzJykucmVzb2x2ZXMoeyBzaGFyZXM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuY3JlYXRlQnVsa1dhbGxldFNoYXJlKHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBrZXlTaGFyZU9wdGlvbnM6IFt7IHVzZXJJZDogJ3VzZXItMScsIHB1YktleTogJ3B1YktleScsIHBhdGg6ICdtLzAnLCBwZXJtaXNzaW9uczogWydzcGVuZCddIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhlbmNyeXB0UHJ2U3R1Yi5jYWxsZWRPbmNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0UHJ2U3R1Yi5maXJzdENhbGwuYXJnc1s0XSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0VuY3J5cHRpb25WZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRW5jcnlwdGlvblZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFDL0QsZ0VBQTZEO0FBQzdELDJEQUE4RDtBQUM5RCw2Q0FBc0U7QUFFdEUsUUFBUSxDQUFDLHVDQUF1QyxFQUFFO0lBQ2hELElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxhQUFrQixDQUFDO0lBRXZCLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUNYLGlIQUFpSCxDQUFDO0lBRXBILFVBQVUsQ0FBQztRQUNULGFBQWEsR0FBRztZQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO1NBQy9GLENBQUM7UUFFRixTQUFTLEdBQUc7WUFDVixPQUFPLEVBQUUsS0FBSztpQkFDWCxJQUFJLEVBQUU7aUJBQ04sU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXVDLEVBQUUsRUFBRSxDQUFDLE9BQU8sUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzVHLE9BQU8sRUFB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IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cyc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L3dhbGxldCc7XG5pbXBvcnQgeyBtYWtlUmFuZG9tS2V5IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2JpdGNvaW4nO1xuaW1wb3J0IHsgSElHSF9FTlRST1BZX0VOQ1JZUFRJT05fVkVSU0lPTiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9hcGknO1xuXG5kZXNjcmliZSgnV2FsbGV0cyAtIGVuY3J5cHRpb25WZXJzaW9uIHRocmVhZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldHM6IFdhbGxldHM7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuICBsZXQgbW9ja0tleWNoYWluczogYW55O1xuXG4gIGNvbnN0IHVzZXJQcnYgPSAneHBydlNvbWVVc2VyUHJpdmF0ZUtleSc7XG4gIGNvbnN0IHVzZXJQdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRnRYZ1M1c1lKQUJxcUc5WUxtQzRRMVJkYXA5Z1NFOE5xdHd5YkdoZVBZMmdaMjlFU0ZqcUpvQ3UxUnVwamU4WXRHcXNlZkQyNjVUTWc3dXNVREZkcDZXMUVHTWNldDgnO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tLZXljaGFpbnMgPSB7XG4gICAgICBjcmVhdGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcHViOiB1c2VyUHViLCBwcnY6IHVzZXJQcnYgfSksXG4gICAgICBhZGQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAndXNlci1rZXktaWQnLCBwdWI6IHVzZXJQdWIsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1wcnYnIH0pLFxuICAgIH07XG5cbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBlbmNyeXB0OiBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKHsgcGFzc3dvcmQsIGlucHV0IH06IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBgZW5jOiR7cGFzc3dvcmR9OiR7aW5wdXR9YCksXG4gICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ2RlY3J5cHRlZFBydicpLFxuICAgICAgY3JlYXRlRW5jcnlwdGlvblNlc3Npb246IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhc3N3b3JkOiBzdHJpbmcsIGVuY3J5cHRpb25WZXJzaW9uPzogMSB8IDIpID0+ICh7XG4gICAgICAgIGVuY3J5cHQ6IHNpbm9uXG4gICAgICAgICAgLnN0dWIoKVxuICAgICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKGlucHV0OiBzdHJpbmcpID0+IGBzZXNzaW9uLWVuYzoke3Bhc3N3b3JkfToke2VuY3J5cHRpb25WZXJzaW9ufToke2lucHV0fWApLFxuICAgICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ3Nlc3Npb24tZGVjcnlwdGVkJyksXG4gICAgICAgIGRlc3Ryb3k6IHNpbm9uLnN0dWIoKSxcbiAgICAgIH0pKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKSwgcXVlcnk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpIH0pLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KSxcbiAgICAgIHB1dDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBzZW5kOiBzaW5vblxuICAgICAgICAgIC5zdHViKClcbiAgICAgICAgICAucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgYWNjZXB0ZWRXYWxsZXRTaGFyZXM6IFtdLCB3YWxsZXRTaGFyZVVwZGF0ZUVycm9yczogW10gfSkgfSksXG4gICAgICB9KSxcbiAgICAgIGdldEVDREhLZXljaGFpbjogc2lub24uc3R1YigpLnJlc29sdmVzKHsgZW5jcnlwdGVkWHBydjogJ2VuY1hwcnYnIH0pLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL3Rlc3QvdXJsJyksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLnJldHVybnMobW9ja0tleWNoYWlucyksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdidGMnKSxcbiAgICAgIGdldENoYWluOiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKSxcbiAgICB9O1xuXG4gICAgd2FsbGV0cyA9IG5ldyBXYWxsZXRzKG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIGVuY3J5cHQgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgICAgd2FsbGV0OiAnd2FsbGV0LWlkJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5hY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6ICdzaGFyZS1pZCcsXG4gICAgICAgIHVzZXJQYXNzd29yZDogJ215LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCwgJ2VuY3J5cHQgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQnKTtcbiAgICAgIGNvbnN0IGNhbGwgPSBtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgICAgIHdhbGxldDogJ3dhbGxldC1pZCcsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiAnc2hhcmUtaWQnLFxuICAgICAgICB1c2VyUGFzc3dvcmQ6ICdteS1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHQuZmlyc3RDYWxsO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1bGtBY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB3YWxsZXRTaGFyZXNMaXN0ID0ge1xuICAgICAgaW5jb21pbmc6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2hhcmUtaWQnLFxuICAgICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAga2V5Y2hhaW46IG51bGwsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBvdXRnb2luZzogW10sXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMod2FsbGV0U2hhcmVzTGlzdCkgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBbJ3NoYXJlLWlkJ10sXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24gd2hlbiBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5idWxrQWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkczogWydzaGFyZS1pZCddLFxuICAgICAgICB1c2VyTG9naW5QYXNzd29yZDogJ2xvZ2luLXBhc3N3b3JkJyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvY2Vzc2VzIHNoYXJlcyBpbiBiYXRjaGVzIG9mIDE2IHRvIGF2b2lkIFdBU00gbWVtb3J5IGV4aGF1c3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAyMCBzaGFyZXMg4oaSIDIgYmF0Y2hlcyAoMTYgKyA0KSwgdmVyaWZ5aW5nIHRoZSBiYXRjaCBib3VuZGFyeSBpcyBjcm9zc2VkXG4gICAgICBjb25zdCBtYW55U2hhcmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjAgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgIGlkOiBgc2hhcmUtJHtpfWAsXG4gICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgfSkpO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHtcbiAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpbmNvbWluZzogbWFueVNoYXJlcywgb3V0Z29pbmc6IFtdIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENhcHR1cmUgdGhlIHNlc3Npb24gc28gd2UgY2FuIGluc3BlY3QgaXRzIGVuY3J5cHQgY2FsbCBjb3VudFxuICAgICAgY29uc3Qgc2Vzc2lvbkVuY3J5cHRTdHViID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoaW5wdXQ6IHN0cmluZykgPT4gYHNlc3Npb24tZW5jOiR7aW5wdXR9YCk7XG4gICAgICBtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24gPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBlbmNyeXB0OiBzZXNzaW9uRW5jcnlwdFN0dWIsXG4gICAgICAgIGRlY3J5cHQ6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgZGVzdHJveTogc2lub24uc3R1YigpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYnVsa0FjY2VwdFNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZHM6IG1hbnlTaGFyZXMubWFwKChzKSA9PiBzLmlkKSxcbiAgICAgICAgdXNlckxvZ2luUGFzc3dvcmQ6ICdsb2dpbi1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2Vzc2lvbiBjcmVhdGVkIG9uY2UsIHNlc3Npb24uZW5jcnlwdCBjYWxsZWQgb25jZSBwZXIgc2hhcmVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24uY2FsbENvdW50LCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzZXNzaW9uRW5jcnlwdFN0dWIuY2FsbENvdW50LCAyMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbmV2ZXIgcnVucyBtb3JlIHRoYW4gMTYgc2hhcmVzIGNvbmN1cnJlbnRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpbkZsaWdodCA9IDA7XG4gICAgICBsZXQgbWF4SW5GbGlnaHQgPSAwO1xuXG4gICAgICBjb25zdCBzZXNzaW9uRW5jcnlwdFN0dWIgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKCgpID0+IHtcbiAgICAgICAgaW5GbGlnaHQrKztcbiAgICAgICAgbWF4SW5GbGlnaHQgPSBNYXRoLm1heChtYXhJbkZsaWdodCwgaW5GbGlnaHQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCdlbmNyeXB0ZWQnKS50aGVuKChyKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQtLTtcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG1vY2tCaXRHby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgIGVuY3J5cHQ6IHNlc3Npb25FbmNyeXB0U3R1YixcbiAgICAgICAgZGVjcnlwdDogc2lub24uc3R1YigpLFxuICAgICAgICBkZXN0cm95OiBzaW5vbi5zdHViKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFueVNoYXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDIwIH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBpZDogYHNoYXJlLSR7aX1gLFxuICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgIH0pKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaW5jb21pbmc6IG1hbnlTaGFyZXMsIG91dGdvaW5nOiBbXSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBtYW55U2hhcmVzLm1hcCgocykgPT4gcy5pZCksXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtYXhJbkZsaWdodCA8PSAxNiwgYGV4cGVjdGVkIG1heCBjb25jdXJyZW5jeSA8PSAxNiwgZ290ICR7bWF4SW5GbGlnaHR9YCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2Vzc2lvbkVuY3J5cHRTdHViLmNhbGxDb3VudCwgMjApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0LnNoYXJlV2FsbGV0IC8gY3JlYXRlQnVsa1dhbGxldFNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgICBsZXQgcmVjaXBpZW50UHViS2V5OiBzdHJpbmc7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlY2lwaWVudFB1YktleSA9IG1ha2VSYW5kb21LZXkoKS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWydrZXktMScsICdrZXktMicsICdrZXktMyddLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHVzZXJzOiBbXSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1RzcyA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmNyeXB0UHJ2Rm9yVXNlciBlbmNyeXB0cyB0byB0aGUgRUNESCBzZWNyZXQgYXQgdGhlIGhpZ2gtZW50cm9weSB2ZXJzaW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0LmVuY3J5cHRQcnZGb3JVc2VyKCdwcnYnLCAncHViJywgcmVjaXBpZW50UHViS2V5LCAnbS8wJywgMik7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdC5jYWxsZWRPbmNlLCAnZW5jcnlwdCBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LmZpcnN0Q2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCBISUdIX0VOVFJPUFlfRU5DUllQVElPTl9WRVJTSU9OKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgdGhlIGVuY3J5cHRpb25WZXJzaW9uIHBvc2l0aW9uIGJlZm9yZSBhIHByZS1kZWNyeXB0ZWQga2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXQucHJlcGFyZVNoYXJlZEtleWNoYWluKHVuZGVmaW5lZCwgcmVjaXBpZW50UHViS2V5LCAnbS8wJywgMiwge1xuICAgICAgICBwcnY6ICdwcnYnLFxuICAgICAgICBwdWI6ICdwdWInLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGwuYXJnc1swXS5pbnB1dCwgJ3BydicpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LmZpcnN0Q2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCBISUdIX0VOVFJPUFlfRU5DUllQVElPTl9WRVJTSU9OKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaGFyZVdhbGxldCBpZ25vcmVzIGEgY2FsbGVyLXN1cHBsaWVkIGVuY3J5cHRpb25WZXJzaW9uIGZvciB0aGUgc2hhcmVkIGtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQsICdnZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcnKS5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicgfSk7XG4gICAgICBtb2NrQml0R28uZ2V0U2hhcmluZ0tleSA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHVzZXJJZDogJ3VzZXItaWQnLCBwdWJrZXk6IHJlY2lwaWVudFB1YktleSwgcGF0aDogJ20vMCcgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5zaGFyZVdhbGxldCh7XG4gICAgICAgIGVtYWlsOiAndGVzdEB0ZXN0LmNvbScsXG4gICAgICAgIHBlcm1pc3Npb25zOiAnc3BlbmQnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdC5jYWxsZWRPbmNlLCAnZW5jcnlwdCBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgSElHSF9FTlRST1BZX0VOQ1JZUFRJT05fVkVSU0lPTixcbiAgICAgICAgJ3RoZSBFQ0RILWtleWVkIHNoYXJlIG11c3Qgbm90IGJlIGVuY3J5cHRlZCBhdCB0aGUgY2FsbGVyLXJlcXVlc3RlZCB2ZXJzaW9uJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVCdWxrV2FsbGV0U2hhcmUgaWdub3JlcyBhIGNhbGxlci1zdXBwbGllZCBlbmNyeXB0aW9uVmVyc2lvbiBmb3IgZXZlcnkgc2hhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpLnJlc29sdmVzKHsgcHJ2OiAncHJ2JywgcHViOiAncHViJyB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0LCAnY3JlYXRlQnVsa0tleVNoYXJlcycpLnJlc29sdmVzKHsgc2hhcmVzOiBbXSB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0LmNyZWF0ZUJ1bGtXYWxsZXRTaGFyZSh7XG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAga2V5U2hhcmVPcHRpb25zOiBbXG4gICAgICAgICAgeyB1c2VySWQ6ICd1c2VyLTEnLCBwdWJLZXk6IHJlY2lwaWVudFB1YktleSwgcGF0aDogJ20vMCcsIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10gfSxcbiAgICAgICAgICB7IHVzZXJJZDogJ3VzZXItMicsIHB1YktleTogcmVjaXBpZW50UHViS2V5LCBwYXRoOiAnbS8xJywgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSB9LFxuICAgICAgICBdLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja0JpdEdvLmVuY3J5cHQuY2FsbENvdW50LCAyLCAnZWFjaCByZWNpcGllbnQgZ2V0cyBpdHMgb3duIGVuY3J5cHRpb24nKTtcbiAgICAgIGZvciAoY29uc3QgY2FsbCBvZiBtb2NrQml0R28uZW5jcnlwdC5nZXRDYWxscygpKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMF0uZW5jcnlwdGlvblZlcnNpb24sIEhJR0hfRU5UUk9QWV9FTkNSWVBUSU9OX1ZFUlNJT04pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0cy5nZW5lcmF0ZVdhbGxldCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgna2VlcHMgaHVtYW4tcGFzc3BocmFzZSBlbmNyeXB0aW9uIGF0IHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBhbmQgcGlucyByZWNvdmVyeSBlbmNyeXB0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0tleWNoYWlucy5jcmVhdGVCYWNrdXAgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2JhY2t1cC1rZXktaWQnLCBwdWI6ICdiYWNrdXAtcHViJyB9KTtcbiAgICAgIG1vY2tLZXljaGFpbnMuY3JlYXRlQml0R28gPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2JpdGdvLWtleS1pZCcsIHB1YjogJ2JpdGdvLXB1YicgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAnd2FsbGV0LWlkJyB9KSB9KSB9KTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXREZWZhdWx0TXVsdGlzaWdUeXBlID0gc2lub24uc3R1YigpLnJldHVybnMoJ29uY2hhaW4nKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5pc0VWTSA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5pc1ZhbGlkTW9mTlNldHVwID0gc2lub24uc3R1YigpLnJldHVybnModHJ1ZSk7XG4gICAgICBtb2NrQmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAocGFyYW1zOiB1bmtub3duKSA9PiBwYXJhbXMpO1xuICAgICAgbW9ja0Jhc2VDb2luLnNpZ25NZXNzYWdlID0gc2lub24uc3R1YigpLnJlc29sdmVzKEJ1ZmZlci5mcm9tKCdhYWJiY2MnLCAnaGV4JykpO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KHtcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHBhc3NwaHJhc2U6ICd3YWxsZXQtcGFzc3BocmFzZScsXG4gICAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6ICdyZWNvdmVyeS1jb2RlJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxDb3VudCwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja0JpdEdvLmVuY3J5cHQuZmlyc3RDYWxsLmFyZ3NbMF0uZW5jcnlwdGlvblZlcnNpb24sIDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LnNlY29uZENhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgSElHSF9FTlRST1BZX0VOQ1JZUFRJT05fVkVSU0lPTik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=