@bitgo/sdk-core 38.16.0 → 38.17.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 (28) hide show
  1. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +3 -1
  2. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  3. package/dist/src/account-lib/util/ed25519KeyDeriver.js +4 -2
  4. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  5. package/dist/src/bitgo/keychain/keychains.js +7 -10
  6. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +24 -81
  7. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
  8. package/dist/src/bitgo/safe/derivableEd25519Pub.js +117 -147
  9. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  10. package/dist/src/bitgo/safe/safe.js +5 -3
  11. package/dist/src/bitgo/safe/safeDerivation.d.ts +13 -0
  12. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -1
  13. package/dist/src/bitgo/safe/safeDerivation.js +30 -1
  14. package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
  15. package/dist/src/bitgo/safe/safes.js +10 -8
  16. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
  17. package/dist/src/bitgo/utils/tss/recipientUtils.js +9 -1
  18. package/dist/test/unit/bitgo/keychain/keychains.js +15 -29
  19. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +72 -76
  20. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +50 -175
  21. package/dist/test/unit/bitgo/safe/safe.js +73 -5
  22. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
  23. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
  24. package/dist/test/unit/bitgo/safe/safeDerivation.js +71 -0
  25. package/dist/test/unit/bitgo/safe/safes.js +23 -11
  26. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +29 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +4 -4
@@ -37,6 +37,10 @@ const sinon = __importStar(require("sinon"));
37
37
  require("should");
38
38
  const src_1 = require("../../../../src");
39
39
  const ROOT_XPRV = 'xprv9s21ZrQH143K3hekyNj7TciR4XNYe1kMj68W2ipjJGNHETWP7o42AjDnSPgKhdZ4x8NBAvaL72RrXjuXNdmkMqLERZza73oYugGtbLFXG8g';
40
+ // 32-byte synthetic seed, StrKey spelling generated with stellar-sdk; pinned derivation vectors in
41
+ // test/unit/bitgo/safe/safeDerivation.ts.
42
+ const ROOT_ED25519_SEED_STRKEY = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
43
+ const ed25519ChildAt0 = (0, src_1.deriveSafeChildEd25519Hardened)(ROOT_ED25519_SEED_STRKEY, 0);
40
44
  describe('Safe', function () {
41
45
  let safe;
42
46
  let mockBitGo;
@@ -287,12 +291,76 @@ describe('Safe', function () {
287
291
  .createWallet({ coin: 'tbtc', label: 'desk 1', passphrase: 'pw' })
288
292
  .should.be.rejectedWith(/returned slot 'ecdsaMpc'/);
289
293
  });
290
- it('rejects ed25519 onchain coins', async function () {
294
+ it('mints an ed25519 wallet from the StrKey seed user root', async function () {
291
295
  stubCoin('txlm');
292
- await safe
293
- .createWallet({ coin: 'txlm', label: 'xlm', passphrase: 'pw' })
294
- .should.be.rejectedWith(/ed25519 coin safe wallet minting is not yet supported/);
296
+ keychainsGet.resolves({
297
+ id: 'user-root-id',
298
+ source: 'user',
299
+ encryptedPrv: `enc:${ROOT_ED25519_SEED_STRKEY}`,
300
+ pub: 'GAB2CB576PHBBPQ5ODORRZ2LYCMWPZGWGCN2KDK7DXOIMZASKUY3QZ6Q',
301
+ type: 'independent',
302
+ });
303
+ keychainsAdd.resolves({ id: 'child-key-id', pub: ed25519ChildAt0.pub, type: 'independent' });
304
+ derivationQuery.returns({
305
+ result: sinon.stub().resolves({ slot: 'ed25519Multisig', index: 0 }),
306
+ });
307
+ await safe.createWallet({ coin: 'txlm', label: 'xlm desk', passphrase: 'pw' });
308
+ derivationQuery.calledOnceWithExactly({ slot: 'ed25519Multisig' }).should.be.true();
309
+ keychainsGet.calledOnceWithExactly({ id: 'ed-user' }).should.be.true();
310
+ const addArgs = keychainsAdd.firstCall.args[0];
311
+ addArgs.should.eql({
312
+ pub: ed25519ChildAt0.pub,
313
+ source: 'user',
314
+ keyType: 'independent',
315
+ parent: 'ed-user',
316
+ safeId: 'test-safe-id',
317
+ derivedFromParentWithPath: "m/0'",
318
+ });
319
+ addArgs.should.not.have.property('encryptedPrv');
320
+ mintSend.firstCall.args[0].should.eql({
321
+ coin: 'txlm',
322
+ label: 'xlm desk',
323
+ type: 'hot',
324
+ multisigType: 'onchain',
325
+ keys: ['child-key-id'],
326
+ });
295
327
  });
328
+ for (const chain of ['talgo', 'thbar']) {
329
+ it(`mints an ed25519 ${chain} wallet posting the user child as a StrKey (server converts)`, async function () {
330
+ // The user child is hardened-derived from the txlm StrKey user root, so the SDK posts a
331
+ // Stellar StrKey for EVERY ed25519 wallet coin. Wallet Platform converts the pub to the
332
+ // wallet coin's representation at registration; the SDK never coin-encodes children.
333
+ stubCoin(chain);
334
+ keychainsGet.resolves({
335
+ id: 'user-root-id',
336
+ source: 'user',
337
+ encryptedPrv: `enc:${ROOT_ED25519_SEED_STRKEY}`,
338
+ pub: 'GAB2CB576PHBBPQ5ODORRZ2LYCMWPZGWGCN2KDK7DXOIMZASKUY3QZ6Q',
339
+ type: 'independent',
340
+ });
341
+ keychainsAdd.resolves({ id: 'child-key-id', pub: `converted-${chain}-pub`, type: 'independent' });
342
+ derivationQuery.returns({
343
+ result: sinon.stub().resolves({ slot: 'ed25519Multisig', index: 0 }),
344
+ });
345
+ await safe.createWallet({ coin: chain, label: `${chain} desk`, passphrase: 'pw' });
346
+ const addArgs = keychainsAdd.firstCall.args[0];
347
+ addArgs.should.eql({
348
+ pub: ed25519ChildAt0.pub,
349
+ source: 'user',
350
+ keyType: 'independent',
351
+ parent: 'ed-user',
352
+ safeId: 'test-safe-id',
353
+ derivedFromParentWithPath: "m/0'",
354
+ });
355
+ mintSend.firstCall.args[0].should.eql({
356
+ coin: chain,
357
+ label: `${chain} desk`,
358
+ type: 'hot',
359
+ multisigType: 'onchain',
360
+ keys: ['child-key-id'],
361
+ });
362
+ });
363
+ }
296
364
  it('rejects an empty passphrase', async function () {
297
365
  await safe
298
366
  .createWallet({ coin: 'tbtc', label: 'w', passphrase: '' })
@@ -305,4 +373,4 @@ describe('Safe', function () {
305
373
  });
306
374
  });
307
375
  });
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBK0I7QUFDL0Isa0JBQWdCO0FBRWhCLHlDQUE0RztBQUU1RyxNQUFNLFNBQVMsR0FDYixpSEFBaUgsQ0FBQztBQUVwSCxRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsSUFBSSxJQUFVLENBQUM7SUFDZixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFFBQWtCLENBQUM7SUFDdkIsOEZBQThGO0lBQzlGLElBQUksWUFBaUIsQ0FBQztJQUV0QixNQUFNLGlCQUFpQixHQUE2QixDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4RyxNQUFNLFFBQVEsR0FBNkIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sUUFBUSxHQUE2QixDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDekYsTUFBTSxlQUFlLEdBQTZCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN2RixNQUFNLFFBQVEsR0FBRztRQUNmLEdBQUcsRUFBRTtZQUNILGlCQUFpQjtZQUNqQixRQUFRO1lBQ1IsUUFBUTtZQUNSLGVBQWU7U0FDaEI7S0FDRixDQUFDO0lBRUYsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNuRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtZQUNsQixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtTQUNsQixDQUFD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WSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztpQkFDMUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLO1lBQ3BDLE1BQU0sSUFBSTtpQkFDUCxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUM5RCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyw0QkFBc0IsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IFNhZmVEYXRhIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBFQ0RTQVV0aWxzLCBJbmNvcnJlY3RQYXNzd29yZEVycm9yLCBTYWZlLCBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuY29uc3QgUk9PVF9YUFJWID1cbiAgJ3hwcnY5czIxWnJRSDE0M0szaGVreU5qN1RjaVI0WE5ZZTFrTWo2OFcyaXBqSkdOSEVUV1A3bzQyQWpEblNQZ0toZFo0eDhOQkF2YUw3MlJyWGp1WE5kbWtNcUxFUlp6YTczb1l1Z0d0YkxGWEc4Zyc7XG5cbmRlc2NyaWJlKCdTYWZlJywgZnVuY3Rpb24gKCkge1xuICBsZXQgc2FmZTogU2FmZTtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgc2FmZURhdGE6IFNhZmVEYXRhO1xuICAvLyB3aXJlLXNoYXBlZCBTYWZlRGF0YSAodGltZXN0YW1wcyBhcyBJU08gc3RyaW5ncykgZm9yIG1vY2tlZCBSRVNUIHJlc3BvbnNlcyB0aGF0IGdldCBkZWNvZGVkXG4gIGxldCBzYWZlRGF0YVdpcmU6IGFueTtcblxuICBjb25zdCBzZWNwMjU2azFNdWx0aXNpZzogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gWyd1c2VyLXJvb3QtaWQnLCAnYmFja3VwLXJvb3QtaWQnLCAnYml0Z28tcm9vdC1pZCddO1xuICBjb25zdCBlY2RzYU1wYzogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gWydlY2RzYS11c2VyJywgJ2VjZHNhLWJhY2t1cCcsICdlY2RzYS1iaXRnbyddO1xuICBjb25zdCBlZGRzYU1wYzogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gWydlZGRzYS11c2VyJywgJ2VkZHNhLWJhY2t1cCcsICdlZGRzYS1iaXRnbyddO1xuICBjb25zdCBlZDI1NTE5TXVsdGlzaWc6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFsnZWQtdXNlcicsICdlZC1iYWNrdXAnLCAnZWQtYml0Z28nXTtcbiAgY29uc3Qgcm9vdEtleXMgPSB7XG4gICAgaG90OiB7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZyxcbiAgICAgIGVjZHNhTXBjLFxuICAgICAgZWRkc2FNcGMsXG4gICAgICBlZDI1NTE5TXVsdGlzaWcsXG4gICAgfSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBnZXQ6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuICAgIHNhZmVEYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXNhZmUtaWQnLFxuICAgICAgZW50ZXJwcmlzZUlkOiAndGVzdC1lbnRlcnByaXNlLWlkJyxcbiAgICAgIGxhYmVsOiAnbXkgc2FmZScsXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgY3JlYXRvcjogJ2NyZWF0b3ItaWQnLFxuICAgICAgdXNlcnM6IFt7IHVzZXJJZDogJ2NyZWF0b3ItaWQnLCBwZXJtaXNzaW9uczogWydhZG1pbicsICdzcGVuZCddIH1dLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgnMjAyNi0wNy0wN1QwMDowMDowMC4wMDBaJyksXG4gICAgICByb290S2V5cyxcbiAgICB9O1xuICAgIHNhZmVEYXRhV2lyZSA9IHtcbiAgICAgIGlkOiAndGVzdC1zYWZlLWlkJyxcbiAgICAgIGVudGVycHJpc2VJZDogJ3Rlc3QtZW50ZXJwcmlzZS1pZCcsXG4gICAgICBsYWJlbDogJ215IHNhZmUnLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgICAgIGNyZWF0b3I6ICdjcmVhdG9yLWlkJyxcbiAgICAgIHVzZXJzOiBbeyB1c2VySWQ6ICdjcmVhdG9yLWlkJywgcGVybWlzc2lvbnM6IFsnYWRtaW4nLCAnc3BlbmQnXSB9XSxcbiAgICAgIGNyZWF0ZWRBdDogJzIwMjYtMDctMDdUMDA6MDA6MDAuMDAwWicsXG4gICAgICByb290S2V5cyxcbiAgICB9O1xuICAgIHNhZmUgPSBuZXcgU2FmZShtb2NrQml0R28sIHNhZmVEYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXR0ZXJzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdleHBvc2VzIGlkL2VudGVycHJpc2VJZC9sYWJlbC9zdGF0dXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzYWZlLmlkKCkuc2hvdWxkLmVxdWFsKCd0ZXN0LXNhZmUtaWQnKTtcbiAgICAgIHNhZmUuZW50ZXJwcmlzZUlkKCkuc2hvdWxkLmVxdWFsKCd0ZXN0LWVudGVycHJpc2UtaWQnKTtcbiAgICAgIHNhZmUubGFiZWwoKS5zaG91bGQuZXF1YWwoJ215IHNhZmUnKTtcbiAgICAgIHNhZmUuc3RhdHVzKCkuc2hvdWxkLmVxdWFsKCdhY3RpdmUnKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b0pTT04gcmV0dXJucyB0aGUgdW5kZXJseWluZyBkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2FmZS50b0pTT04oKS5zaG91bGQuZXF1YWwoc2FmZURhdGEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXJsJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdidWlsZHMgdGhlIGVudGVycHJpc2Utc2NvcGVkIHYyIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzYWZlLnVybCgpLnNob3VsZC5lcXVhbCgnL2VudGVycHJpc2UvdGVzdC1lbnRlcnByaXNlLWlkL3NhZmVzL3Rlc3Qtc2FmZS1pZCcpO1xuICAgICAgc2FmZS51cmwoJy9mcmVlemUnKS5zaG91bGQuZXF1YWwoJy9lbnRlcnByaXNlL3Rlc3QtZW50ZXJwcmlzZS1pZC9zYWZlcy90ZXN0LXNhZmUtaWQvZnJlZXplJyk7XG4gICAgICBtb2NrQml0R28udXJsLmNhbGxlZFdpdGgoJy9lbnRlcnByaXNlL3Rlc3QtZW50ZXJwcmlzZS1pZC9zYWZlcy90ZXN0LXNhZmUtaWQnLCAyKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJlZXplIC8gYXJjaGl2ZSBSRVNUIHBsdW1iaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHN0dWJQb3N0KHJlc3BvbnNlOiB1bmtub3duKSB7XG4gICAgICBjb25zdCByZXN1bHRTdHViID0gc2lub24uc3R1YigpLnJlc29sdmVzKHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHJlc3VsdFN0dWIgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2VuZFN0dWIgfSk7XG4gICAgICByZXR1cm4geyBzZW5kU3R1YiB9O1xuICAgIH1cblxuICAgIGl0KCdmcmVlemUgcG9zdHMgdGhlIGVuY29kZWQgYm9keSB0byB0aGUgZnJlZXplIHJvdXRlIGFuZCBkZWNvZGVzIFNhZmVEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZnJvemVuID0geyAuLi5zYWZlRGF0YVdpcmUsIGZyZWV6ZTogeyByZWFzb246ICdpbmNpZGVudCcgfSB9O1xuICAgICAgY29uc3QgeyBzZW5kU3R1YiB9ID0gc3R1YlBvc3QoZnJvemVuKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhZmUuZnJlZXplKHsgcmVhc29uOiAnaW5jaWRlbnQnIH0pO1xuICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aCgnL2VudGVycHJpc2UvdGVzdC1lbnRlcnByaXNlLWlkL3NhZmVzL3Rlc3Qtc2FmZS1pZC9mcmVlemUnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgc2VuZFN0dWIuY2FsbGVkV2l0aCh7IHJlYXNvbjogJ2luY2lkZW50JyB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgcmVzdWx0LmZyZWV6ZSEucmVhc29uIS5zaG91bGQuZXF1YWwoJ2luY2lkZW50Jyk7XG4gICAgICByZXN1bHQuY3JlYXRlZEF0LnNob3VsZC5iZS5pbnN0YW5jZW9mKERhdGUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FyY2hpdmUgcG9zdHMgYW4gZW1wdHkgYm9keSB0byB0aGUgYXJjaGl2ZSByb3V0ZSBhbmQgZGVjb2RlcyBTYWZlRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFyY2hpdmVkID0geyAuLi5zYWZlRGF0YVdpcmUsIHN0YXR1czogJ2FyY2hpdmVkJyBhcyBjb25zdCB9O1xuICAgICAgY29uc3QgeyBzZW5kU3R1YiB9ID0gc3R1YlBvc3QoYXJjaGl2ZWQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FmZS5hcmNoaXZlKCk7XG4gICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKCcvZW50ZXJwcmlzZS90ZXN0LWVudGVycHJpc2UtaWQvc2FmZXMvdGVzdC1zYWZlLWlkL2FyY2hpdmUnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgc2VuZFN0dWIuY2FsbGVkV2l0aEV4YWN0bHkoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgcmVzdWx0LnN0YXR1cy5zaG91bGQuZXF1YWwoJ2FyY2hpdmVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdtZW1iZXIvc2hhcmUgbWV0aG9kcyBhcmUgc3R1YmJlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnYWRkTWVtYmVyIHRocm93cyBub3QtaW1wbGVtZW50ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzYWZlLmFkZE1lbWJlcih7IHVzZXJJZDogJ3UnLCBwZXJtaXNzaW9uczogWyd2aWV3J10gfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm90IHlldCBpbXBsZW1lbnRlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FkZE1lbWJlclRvV2FsbGV0IHRocm93cyBub3QtaW1wbGVtZW50ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzYWZlXG4gICAgICAgIC5hZGRNZW1iZXJUb1dhbGxldCh7IHdhbGxldElkOiAndycsIHdhbGxldFBhc3NwaHJhc2U6ICdwJyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm90IHlldCBpbXBsZW1lbnRlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xpc3RTaGFyZXMgdGhyb3dzIG5vdC1pbXBsZW1lbnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNhZmUubGlzdFNoYXJlcygpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdhY2NlcHRTaGFyZSB0aHJvd3Mgbm90LWltcGxlbWVudGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZS5hY2NlcHRTaGFyZSh7IHNhZmVTaGFyZUlkOiAncycgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm90IHlldCBpbXBsZW1lbnRlZC8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY3JlYXRlV2FsbGV0IChXQ04tMTIwMyknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY2hpbGRBdDAgPSBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KFJPT1RfWFBSViwgMCk7XG4gICAgY29uc3QgY2hpbGRBdDcgPSBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KFJPT1RfWFBSViwgNyk7XG4gICAgbGV0IGtleWNoYWluc0FkZDogc2lub24uU2lub25TdHViO1xuICAgIGxldCBrZXljaGFpbnNHZXQ6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQgZGVyaXZhdGlvblF1ZXJ5OiBzaW5vbi5TaW5vblN0dWI7XG4gICAgbGV0IG1pbnRTZW5kOiBzaW5vbi5TaW5vblN0dWI7XG5cbiAgICBmdW5jdGlvbiBzdHViQ29pbihjaGFpbjogc3RyaW5nLCBvcHRzOiB7IGdldERlZmF1bHRNdWx0aXNpZ1R5cGU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgICBrZXljaGFpbnNHZXQgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBpZDogJ3VzZXItcm9vdC1pZCcsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGBlbmM6JHtST09UX1hQUlZ9YCxcbiAgICAgICAgcHViOiAncm9vdC14cHViJyxcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIH0pO1xuICAgICAga2V5Y2hhaW5zQWRkID0gc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdjaGlsZC1rZXktaWQnLCBwdWI6IGNoaWxkQXQwLnB1YiwgdHlwZTogJ2luZGVwZW5kZW50JyB9KTtcbiAgICAgIG1vY2tCaXRHby5jb2luID0gc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBnZXRDaGFpbjogc2lub24uc3R1YigpLnJldHVybnMoY2hhaW4pLFxuICAgICAgICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlOiBzaW5vbi5zdHViKCkucmV0dXJucyhvcHRzLmdldERlZmF1bHRNdWx0aXNpZ1R5cGUpLFxuICAgICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZ2V0OiBrZXljaGFpbnNHZXQsIGFkZDoga2V5Y2hhaW5zQWRkIH0pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YkNvaW4oJ3RidGMnKTtcbiAgICAgIG1vY2tCaXRHby5kZWNyeXB0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZSgoeyBpbnB1dCwgcGFzc3dvcmQgfTogeyBpbnB1dDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgaWYgKHBhc3N3b3JkICE9PSAncHcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcGFzc3dvcmQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aCgnZW5jOicpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpbnB1dC5zbGljZSg0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgY2lwaGVydGV4dCcpO1xuICAgICAgfSk7XG4gICAgICBkZXJpdmF0aW9uUXVlcnkgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgaW5kZXg6IDAgfSksXG4gICAgICB9KTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7IHF1ZXJ5OiBkZXJpdmF0aW9uUXVlcnkgfSk7XG4gICAgICBjb25zdCBtaW50UmVzdWx0ID0gc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgaWQ6ICd3YWxsZXQtaWQnLFxuICAgICAgICBjb2luOiAndGJ0YycsXG4gICAgICAgIGtleXM6IFsnY2hpbGQta2V5LWlkJywgJ2JhY2t1cC1jaGlsZCcsICdiaXRnby1jaGlsZCddLFxuICAgICAgICB0eXBlOiAnaG90JyxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIGVudGVycHJpc2U6ICd0ZXN0LWVudGVycHJpc2UtaWQnLFxuICAgICAgICBzYWZlOiAndGVzdC1zYWZlLWlkJyxcbiAgICAgIH0pO1xuICAgICAgbWludFNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogbWludFJlc3VsdCB9KTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoeyBzZW5kOiBtaW50U2VuZCB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdwZWVrcyB0aGUgaW5kZXgsIHJlZ2lzdGVycyBhIHB1YmxpYy1vbmx5IHVzZXIgY2hpbGQsIGFuZCBtaW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHNhZmUuY3JlYXRlV2FsbGV0KHsgY29pbjogJ3RidGMnLCBsYWJlbDogJ2Rlc2sgMScsIHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGRlcml2YXRpb25RdWVyeS5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoeyBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXljaGFpbnNHZXQuY2FsbGVkT25jZVdpdGhFeGFjdGx5KHsgaWQ6ICd1c2VyLXJvb3QtaWQnIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXljaGFpbnNBZGQuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY29uc3QgYWRkQXJncyA9IGtleWNoYWluc0FkZC5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIGFkZEFyZ3Muc2hvdWxkLmVxbCh7XG4gICAgICAgIHB1YjogY2hpbGRBdDAucHViLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgcGFyZW50OiAndXNlci1yb290LWlkJyxcbiAgICAgICAgc2FmZUlkOiAndGVzdC1zYWZlLWlkJyxcbiAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDogXCJtLzAnXCIsXG4gICAgICB9KTtcbiAgICAgIGFkZEFyZ3Muc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIGFkZEFyZ3Muc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkJyk7XG4gICAgICBhZGRBcmdzLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgncGF0aCcpO1xuXG4gICAgICBtb2NrQml0R28ucG9zdC5jYWxsZWRXaXRoKCcvZW50ZXJwcmlzZS90ZXN0LWVudGVycHJpc2UtaWQvc2FmZXMvdGVzdC1zYWZlLWlkL3dhbGxldHMnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgbWludFNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0uc2hvdWxkLmVxbCh7XG4gICAgICAgIGNvaW46ICd0YnRjJyxcbiAgICAgICAgbGFiZWw6ICdkZXNrIDEnLFxuICAgICAgICB0eXBlOiAnaG90JyxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIGtleXM6IFsnY2hpbGQta2V5LWlkJ10sXG4gICAgICB9KTtcbiAgICAgIHdhbGxldC5pZCgpLnNob3VsZC5lcXVhbCgnd2FsbGV0LWlkJyk7XG4gICAgICBjb25zdCBtaW50ZWRTYWZlSWQgPSB3YWxsZXQuc2FmZUlkKCk7XG4gICAgICBpZiAobWludGVkU2FmZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBtaW50ZWQgd2FsbGV0IHRvIGluY2x1ZGUgc2FmZUlkJyk7XG4gICAgICB9XG4gICAgICBtaW50ZWRTYWZlSWQuc2hvdWxkLmVxdWFsKCd0ZXN0LXNhZmUtaWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWdpc3RlcnMgdGhlIGNoaWxkIHdpdGggZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCBhdCBhIG5vbi16ZXJvIG1pbnQgaW5kZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXJpdmF0aW9uUXVlcnkucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgaW5kZXg6IDcgfSksXG4gICAgICB9KTtcbiAgICAgIGtleWNoYWluc0FkZC5yZXNvbHZlcyh7IGlkOiAnY2hpbGQta2V5LWlkJywgcHViOiBjaGlsZEF0Ny5wdWIsIHR5cGU6ICdpbmRlcGVuZGVudCcgfSk7XG5cbiAgICAgIGF3YWl0IHNhZmUuY3JlYXRlV2FsbGV0KHsgY29pbjogJ3RidGMnLCBsYWJlbDogJ2Rlc2sgOCcsIHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGNvbnN0IGFkZEFyZ3MgPSBrZXljaGFpbnNBZGQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBhZGRBcmdzLnB1Yi5zaG91bGQuZXF1YWwoY2hpbGRBdDcucHViKTtcbiAgICAgIGFkZEFyZ3MuZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aC5zaG91bGQuZXF1YWwoXCJtLzcnXCIpO1xuICAgICAgYWRkQXJncy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3BhdGgnKTtcbiAgICAgIGFkZEFyZ3Muc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWludHMgYSBUU1Mgd2FsbGV0IHZpYSB0aGUgdXNlci9CaXRHbyBkZXJpdmUgY2VyZW1vbnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViQ29pbignaHRldGgnLCB7IGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6ICd0c3MnIH0pO1xuICAgICAgLy8gUmVhbCBWUkYga2V5IGVudmVsb3BlOiBge3ZlcnNpb246IDEsIHBydktleVNoYXJlLCB2cmZ9YC5cbiAgICAgIGNvbnN0IHVzZXJCbG9iID0gRUNEU0FVdGlscy5idWlsZFZyZktleUVudmVsb3BlcyhcbiAgICAgICAgQnVmZmVyLmZyb20oJ3NpZ25pbmctMScpLFxuICAgICAgICBCdWZmZXIuZnJvbSgncmVkdWNlZC0xJyksXG4gICAgICAgIEJ1ZmZlci5mcm9tKCd2cmYtMScpXG4gICAgICApLmVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIGtleWNoYWluc0dldC5vbkZpcnN0Q2FsbCgpLnJlc29sdmVzKHsgaWQ6ICdlY2RzYS11c2VyJywgc291cmNlOiAndXNlcicsIGVuY3J5cHRlZFBydjogYGVuYzoke3VzZXJCbG9ifWAgfSk7XG4gICAgICBtb2NrQml0R28uZGVjcnlwdCA9IHNpbm9uXG4gICAgICAgIC5zdHViKClcbiAgICAgICAgLmNhbGxzRmFrZSgoeyBpbnB1dCB9OiB7IGlucHV0OiBzdHJpbmcgfSkgPT4gUHJvbWlzZS5yZXNvbHZlKGlucHV0LnN0YXJ0c1dpdGgoJ2VuYzonKSA/IGlucHV0LnNsaWNlKDQpIDogJycpKTtcblxuICAgICAgZGVyaXZhdGlvblF1ZXJ5LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHNsb3Q6ICdlY2RzYU1wYycsIGluZGV4OiAwIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNlcmVtb255U3R1YiA9IHNpbm9uLnN0dWIoRUNEU0FVdGlscy5FY2RzYVZyZk1QQ3YyVXRpbHMucHJvdG90eXBlLCAnY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zJykucmVzb2x2ZXMoe1xuICAgICAgICB1c2VyS2V5Y2hhaW46IHsgaWQ6ICdlY2RzYS1jaGlsZC11c2VyJyB9LFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogeyBpZDogJ2VjZHNhLWNoaWxkLWJhY2t1cC1wbGFjZWhvbGRlcicgfSxcbiAgICAgIH0gYXMgbmV2ZXIpO1xuXG4gICAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBzYWZlLmNyZWF0ZVdhbGxldCh7IGNvaW46ICdodGV0aCcsIGxhYmVsOiAnZXZtJywgcGFzc3BocmFzZTogJ3B3JywgbXVsdGlzaWdUeXBlOiAndHNzJyB9KTtcblxuICAgICAgZGVyaXZhdGlvblF1ZXJ5LmNhbGxlZE9uY2VXaXRoRXhhY3RseSh7IHNsb3Q6ICdlY2RzYU1wYycgfSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleWNoYWluc0dldC5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoeyBpZDogJ2VjZHNhLXVzZXInIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBjb25zdCBjZXJlbW9ueUFyZ3MgPSBjZXJlbW9ueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBjZXJlbW9ueUFyZ3Muc2hvdWxkLmNvbnRhaW5FcWwoe1xuICAgICAgICBzYWZlSWQ6ICd0ZXN0LXNhZmUtaWQnLFxuICAgICAgICBlbnRlcnByaXNlOiAndGVzdC1lbnRlcnByaXNlLWlkJyxcbiAgICAgICAgcGFyZW50S2V5SWQ6ICdlY2RzYS1iaXRnbycsXG4gICAgICAgIGRlcml2YXRpb25JbmRleDogMCxcbiAgICAgICAgdXNlclJvb3RLZXlJZDogJ2VjZHNhLXVzZXInLFxuICAgICAgICBiYWNrdXBSb290S2V5SWQ6ICdlY2RzYS1iYWNrdXAnLFxuICAgICAgfSk7XG4gICAgICBjZXJlbW9ueUFyZ3Muc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdiYWNrdXBSb290S2V5U2hhcmUnKTtcbiAgICAgIGNlcmVtb255QXJncy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2JhY2t1cFJvb3RWcmZLZXlTaGFyZScpO1xuICAgICAgY2VyZW1vbnlBcmdzLnVzZXJSb290S2V5U2hhcmUuc2hvdWxkLmRlZXBFcXVhbChCdWZmZXIuZnJvbSgnc2lnbmluZy0xJykpO1xuICAgICAgY2VyZW1vbnlBcmdzLnVzZXJSb290VnJmS2V5U2hhcmUuc2hvdWxkLmRlZXBFcXVhbChCdWZmZXIuZnJvbSgndnJmLTEnKSk7XG5cbiAgICAgIG1pbnRTZW5kLmZpcnN0Q2FsbC5hcmdzWzBdLnNob3VsZC5lcWwoe1xuICAgICAgICBjb2luOiAnaHRldGgnLFxuICAgICAgICBsYWJlbDogJ2V2bScsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICBrZXlzOiBbJ2VjZHNhLWNoaWxkLXVzZXInLCAnZWNkc2EtY2hpbGQtYmFja3VwLXBsYWNlaG9sZGVyJ10sXG4gICAgICB9KTtcbiAgICAgIHdhbGxldC5pZCgpLnNob3VsZC5lcXVhbCgnd2FsbGV0LWlkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHBlZWtlZCBkZXJpdmF0aW9uIGluZGV4IGZvciB0aGUgd3Jvbmcgc2xvdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlcml2YXRpb25RdWVyeS5yZXR1cm5zKHtcbiAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBzbG90OiAnZWNkc2FNcGMnLCBpbmRleDogMCB9KSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgc2FmZVxuICAgICAgICAuY3JlYXRlV2FsbGV0KHsgY29pbjogJ3RidGMnLCBsYWJlbDogJ2Rlc2sgMScsIHBhc3NwaHJhc2U6ICdwdycgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JldHVybmVkIHNsb3QgJ2VjZHNhTXBjJy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgZWQyNTUxOSBvbmNoYWluIGNvaW5zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YkNvaW4oJ3R4bG0nKTtcbiAgICAgIGF3YWl0IHNhZmVcbiAgICAgICAgLmNyZWF0ZVdhbGxldCh7IGNvaW46ICd0eGxtJywgbGFiZWw6ICd4bG0nLCBwYXNzcGhyYXNlOiAncHcnIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9lZDI1NTE5IGNvaW4gc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYW4gZW1wdHkgcGFzc3BocmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNhZmVcbiAgICAgICAgLmNyZWF0ZVdhbGxldCh7IGNvaW46ICd0YnRjJywgbGFiZWw6ICd3JywgcGFzc3BocmFzZTogJycgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3Bhc3NwaHJhc2UgaXMgcmVxdWlyZWQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgd3JvbmcgcGFzc3BocmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNhZmVcbiAgICAgICAgLmNyZWF0ZVdhbGxldCh7IGNvaW46ICd0YnRjJywgbGFiZWw6ICd3JywgcGFzc3BocmFzZTogJ25vcGUnIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKEluY29ycmVjdFBhc3N3b3JkRXJyb3IpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBK0I7QUFDL0Isa0JBQWdCO0FBRWhCLHlDQU15QjtBQUV6QixNQUFNLFNBQVMsR0FDYixpSEFBaUgsQ0FBQztBQUVwSCxtR0FBbUc7QUFDbkcsMENBQTBDO0FBQzFDLE1BQU0sd0JBQXdCLEdBQUcsMERBQTBELENBQUM7QUFDNUYsTUFBTSxlQUFlLEdBQUcsSUFBQSxvQ0FBOEIsRUFBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRixRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsSUFBSSxJQUFVLENBQUM7SUFDZixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFFBQWtCLENBQUM7SUFDdkIsOEZBQThGO0lBQzlGLElBQUksWUFBaUIsQ0FBQztJQUV0QixNQUFNLGlCQUFpQixHQUE2QixDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4RyxNQUFNLFFBQVEsR0FBNkIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sUUFBUSxHQUE2QixDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDekYsTUFBTSxlQUFlLEdBQTZCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN2RixNQUFNLFFBQVEsR0FBRztRQUNmLEdBQUcsRUFBRTtZQUNILGlCQUFpQjtZQUNqQixRQUFRO1lBQ1IsUUFBUTtZQUNSLGVBQWU7U0FDaEI7S0FDRixDQUFDO0lBRUYsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHO1lBQ1YsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxT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LEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUM5RCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyw0QkFBc0IsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IFNhZmVEYXRhIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQge1xuICBFQ0RTQVV0aWxzLFxuICBJbmNvcnJlY3RQYXNzd29yZEVycm9yLFxuICBTYWZlLFxuICBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQsXG4gIGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYsXG59IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5cbmNvbnN0IFJPT1RfWFBSViA9XG4gICd4cHJ2OXMyMVpyUUgxNDNLM2hla3lOajdUY2lSNFhOWWUxa01qNjhXMmlwakpHTkhFVFdQN280MkFqRG5TUGdLaGRaNHg4TkJBdmFMNzJSclhqdVhOZG1rTXFMRVJaemE3M29ZdWdHdGJMRlhHOGcnO1xuXG4vLyAzMi1ieXRlIHN5bnRoZXRpYyBzZWVkLCBTdHJLZXkgc3BlbGxpbmcgZ2VuZXJhdGVkIHdpdGggc3RlbGxhci1zZGs7IHBpbm5lZCBkZXJpdmF0aW9uIHZlY3RvcnMgaW5cbi8vIHRlc3QvdW5pdC9iaXRnby9zYWZlL3NhZmVEZXJpdmF0aW9uLnRzLlxuY29uc3QgUk9PVF9FRDI1NTE5X1NFRURfU1RSS0VZID0gJ1NBQUFDQVFEQVFDUU1CWUlCRUZBV0RBTkJZSFJBRUlTQ01LQktGUVhEQU1SVUdZNERVUEI2TktJJztcbmNvbnN0IGVkMjU1MTlDaGlsZEF0MCA9IGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChST09UX0VEMjU1MTlfU0VFRF9TVFJLRVksIDApO1xuXG5kZXNjcmliZSgnU2FmZScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHNhZmU6IFNhZmU7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IHNhZmVEYXRhOiBTYWZlRGF0YTtcbiAgLy8gd2lyZS1zaGFwZWQgU2FmZURhdGEgKHRpbWVzdGFtcHMgYXMgSVNPIHN0cmluZ3MpIGZvciBtb2NrZWQgUkVTVCByZXNwb25zZXMgdGhhdCBnZXQgZGVjb2RlZFxuICBsZXQgc2FmZURhdGFXaXJlOiBhbnk7XG5cbiAgY29uc3Qgc2VjcDI1NmsxTXVsdGlzaWc6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFsndXNlci1yb290LWlkJywgJ2JhY2t1cC1yb290LWlkJywgJ2JpdGdvLXJvb3QtaWQnXTtcbiAgY29uc3QgZWNkc2FNcGM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFsnZWNkc2EtdXNlcicsICdlY2RzYS1iYWNrdXAnLCAnZWNkc2EtYml0Z28nXTtcbiAgY29uc3QgZWRkc2FNcGM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFsnZWRkc2EtdXNlcicsICdlZGRzYS1iYWNrdXAnLCAnZWRkc2EtYml0Z28nXTtcbiAgY29uc3QgZWQyNTUxOU11bHRpc2lnOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gPSBbJ2VkLXVzZXInLCAnZWQtYmFja3VwJywgJ2VkLWJpdGdvJ107XG4gIGNvbnN0IHJvb3RLZXlzID0ge1xuICAgIGhvdDoge1xuICAgICAgc2VjcDI1NmsxTXVsdGlzaWcsXG4gICAgICBlY2RzYU1wYyxcbiAgICAgIGVkZHNhTXBjLFxuICAgICAgZWQyNTUxOU11bHRpc2lnLFxuICAgIH0sXG4gIH07XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgdXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IHBhdGgpLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgICAgZ2V0OiBzaW5vbi5zdHViKCksXG4gICAgfTtcbiAgICBzYWZlRGF0YSA9IHtcbiAgICAgIGlkOiAndGVzdC1zYWZlLWlkJyxcbiAgICAgIGVudGVycHJpc2VJZDogJ3Rlc3QtZW50ZXJwcmlzZS1pZCcsXG4gICAgICBsYWJlbDogJ215IHNhZmUnLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgICAgIGNyZWF0b3I6ICdjcmVhdG9yLWlkJyxcbiAgICAgIHVzZXJzOiBbeyB1c2VySWQ6ICdjcmVhdG9yLWlkJywgcGVybWlzc2lvbnM6IFsnYWRtaW4nLCAnc3BlbmQnXSB9XSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoJzIwMjYtMDctMDdUMDA6MDA6MDAuMDAwWicpLFxuICAgICAgcm9vdEtleXMsXG4gICAgfTtcbiAgICBzYWZlRGF0YVdpcmUgPSB7XG4gICAgICBpZDogJ3Rlc3Qtc2FmZS1pZCcsXG4gICAgICBlbnRlcnByaXNlSWQ6ICd0ZXN0LWVudGVycHJpc2UtaWQnLFxuICAgICAgbGFiZWw6ICdteSBzYWZlJyxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICBjcmVhdG9yOiAnY3JlYXRvci1pZCcsXG4gICAgICB1c2VyczogW3sgdXNlcklkOiAnY3JlYXRvci1pZCcsIHBlcm1pc3Npb25zOiBbJ2FkbWluJywgJ3NwZW5kJ10gfV0sXG4gICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA3LTA3VDAwOjAwOjAwLjAwMFonLFxuICAgICAgcm9vdEtleXMsXG4gICAgfTtcbiAgICBzYWZlID0gbmV3IFNhZmUobW9ja0JpdEdvLCBzYWZlRGF0YSk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0dGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZXhwb3NlcyBpZC9lbnRlcnByaXNlSWQvbGFiZWwvc3RhdHVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2FmZS5pZCgpLnNob3VsZC5lcXVhbCgndGVzdC1zYWZlLWlkJyk7XG4gICAgICBzYWZlLmVudGVycHJpc2VJZCgpLnNob3VsZC5lcXVhbCgndGVzdC1lbnRlcnByaXNlLWlkJyk7XG4gICAgICBzYWZlLmxhYmVsKCkuc2hvdWxkLmVxdWFsKCdteSBzYWZlJyk7XG4gICAgICBzYWZlLnN0YXR1cygpLnNob3VsZC5lcXVhbCgnYWN0aXZlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgndG9KU09OIHJldHVybnMgdGhlIHVuZGVybHlpbmcgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhZmUudG9KU09OKCkuc2hvdWxkLmVxdWFsKHNhZmVEYXRhKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VybCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnYnVpbGRzIHRoZSBlbnRlcnByaXNlLXNjb3BlZCB2MiBwYXRoJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2FmZS51cmwoKS5zaG91bGQuZXF1YWwoJy9lbnRlcnByaXNlL3Rlc3QtZW50ZXJwcmlzZS1pZC9zYWZlcy90ZXN0LXNhZmUtaWQnKTtcbiAgICAgIHNhZmUudXJsKCcvZnJlZXplJykuc2hvdWxkLmVxdWFsKCcvZW50ZXJwcmlzZS90ZXN0LWVudGVycHJpc2UtaWQvc2FmZXMvdGVzdC1zYWZlLWlkL2ZyZWV6ZScpO1xuICAgICAgbW9ja0JpdEdvLnVybC5jYWxsZWRXaXRoKCcvZW50ZXJwcmlzZS90ZXN0LWVudGVycHJpc2UtaWQvc2FmZXMvdGVzdC1zYWZlLWlkJywgMikuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZyZWV6ZSAvIGFyY2hpdmUgUkVTVCBwbHVtYmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBzdHViUG9zdChyZXNwb25zZTogdW5rbm93bikge1xuICAgICAgY29uc3QgcmVzdWx0U3R1YiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyhyZXNwb25zZSk7XG4gICAgICBjb25zdCBzZW5kU3R1YiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVzdWx0OiByZXN1bHRTdHViIH0pO1xuICAgICAgbW9ja0JpdEdvLnBvc3QucmV0dXJucyh7IHNlbmQ6IHNlbmRTdHViIH0pO1xuICAgICAgcmV0dXJuIHsgc2VuZFN0dWIgfTtcbiAgICB9XG5cbiAgICBpdCgnZnJlZXplIHBvc3RzIHRoZSBlbmNvZGVkIGJvZHkgdG8gdGhlIGZyZWV6ZSByb3V0ZSBhbmQgZGVjb2RlcyBTYWZlRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZyb3plbiA9IHsgLi4uc2FmZURhdGFXaXJlLCBmcmVlemU6IHsgcmVhc29uOiAnaW5jaWRlbnQnIH0gfTtcbiAgICAgIGNvbnN0IHsgc2VuZFN0dWIgfSA9IHN0dWJQb3N0KGZyb3plbik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYWZlLmZyZWV6ZSh7IHJlYXNvbjogJ2luY2lkZW50JyB9KTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LmNhbGxlZFdpdGgoJy9lbnRlcnByaXNlL3Rlc3QtZW50ZXJwcmlzZS1pZC9zYWZlcy90ZXN0LXNhZmUtaWQvZnJlZXplJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHNlbmRTdHViLmNhbGxlZFdpdGgoeyByZWFzb246ICdpbmNpZGVudCcgfSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJlc3VsdC5mcmVlemUhLnJlYXNvbiEuc2hvdWxkLmVxdWFsKCdpbmNpZGVudCcpO1xuICAgICAgcmVzdWx0LmNyZWF0ZWRBdC5zaG91bGQuYmUuaW5zdGFuY2VvZihEYXRlKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcmNoaXZlIHBvc3RzIGFuIGVtcHR5IGJvZHkgdG8gdGhlIGFyY2hpdmUgcm91dGUgYW5kIGRlY29kZXMgU2FmZURhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhcmNoaXZlZCA9IHsgLi4uc2FmZURhdGFXaXJlLCBzdGF0dXM6ICdhcmNoaXZlZCcgYXMgY29uc3QgfTtcbiAgICAgIGNvbnN0IHsgc2VuZFN0dWIgfSA9IHN0dWJQb3N0KGFyY2hpdmVkKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhZmUuYXJjaGl2ZSgpO1xuICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aCgnL2VudGVycHJpc2UvdGVzdC1lbnRlcnByaXNlLWlkL3NhZmVzL3Rlc3Qtc2FmZS1pZC9hcmNoaXZlJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHNlbmRTdHViLmNhbGxlZFdpdGhFeGFjdGx5KCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJlc3VsdC5zdGF0dXMuc2hvdWxkLmVxdWFsKCdhcmNoaXZlZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWVtYmVyL3NoYXJlIG1ldGhvZHMgYXJlIHN0dWJiZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2FkZE1lbWJlciB0aHJvd3Mgbm90LWltcGxlbWVudGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZS5hZGRNZW1iZXIoeyB1c2VySWQ6ICd1JywgcGVybWlzc2lvbnM6IFsndmlldyddIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdhZGRNZW1iZXJUb1dhbGxldCB0aHJvd3Mgbm90LWltcGxlbWVudGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZVxuICAgICAgICAuYWRkTWVtYmVyVG9XYWxsZXQoeyB3YWxsZXRJZDogJ3cnLCB3YWxsZXRQYXNzcGhyYXNlOiAncCcgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdsaXN0U2hhcmVzIHRocm93cyBub3QtaW1wbGVtZW50ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzYWZlLmxpc3RTaGFyZXMoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub3QgeWV0IGltcGxlbWVudGVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWNjZXB0U2hhcmUgdGhyb3dzIG5vdC1pbXBsZW1lbnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNhZmUuYWNjZXB0U2hhcmUoeyBzYWZlU2hhcmVJZDogJ3MnIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCB5ZXQgaW1wbGVtZW50ZWQvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NyZWF0ZVdhbGxldCAoV0NOLTEyMDMpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNoaWxkQXQwID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihST09UX1hQUlYsIDApO1xuICAgIGNvbnN0IGNoaWxkQXQ3ID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihST09UX1hQUlYsIDcpO1xuICAgIGxldCBrZXljaGFpbnNBZGQ6IHNpbm9uLlNpbm9uU3R1YjtcbiAgICBsZXQga2V5Y2hhaW5zR2V0OiBzaW5vbi5TaW5vblN0dWI7XG4gICAgbGV0IGRlcml2YXRpb25RdWVyeTogc2lub24uU2lub25TdHViO1xuICAgIGxldCBtaW50U2VuZDogc2lub24uU2lub25TdHViO1xuXG4gICAgZnVuY3Rpb24gc3R1YkNvaW4oY2hhaW46IHN0cmluZywgb3B0czogeyBnZXREZWZhdWx0TXVsdGlzaWdUeXBlPzogc3RyaW5nIH0gPSB7fSkge1xuICAgICAga2V5Y2hhaW5zR2V0ID0gc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgaWQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBgZW5jOiR7Uk9PVF9YUFJWfWAsXG4gICAgICAgIHB1YjogJ3Jvb3QteHB1YicsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICB9KTtcbiAgICAgIGtleWNoYWluc0FkZCA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAnY2hpbGQta2V5LWlkJywgcHViOiBjaGlsZEF0MC5wdWIsIHR5cGU6ICdpbmRlcGVuZGVudCcgfSk7XG4gICAgICBtb2NrQml0R28uY29pbiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgZ2V0Q2hhaW46IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGNoYWluKSxcbiAgICAgICAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZTogc2lub24uc3R1YigpLnJldHVybnMob3B0cy5nZXREZWZhdWx0TXVsdGlzaWdUeXBlKSxcbiAgICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IGdldDoga2V5Y2hhaW5zR2V0LCBhZGQ6IGtleWNoYWluc0FkZCB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHN0dWJDb2luKCd0YnRjJyk7XG4gICAgICBtb2NrQml0R28uZGVjcnlwdCA9IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHsgaW5wdXQsIHBhc3N3b3JkIH06IHsgaW5wdXQ6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIGlmIChwYXNzd29yZCAhPT0gJ3B3Jykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIHBhc3N3b3JkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJ2VuYzonKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaW5wdXQuc2xpY2UoNCkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIGNpcGhlcnRleHQnKTtcbiAgICAgIH0pO1xuICAgICAgZGVyaXZhdGlvblF1ZXJ5ID0gc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsIGluZGV4OiAwIH0pLFxuICAgICAgfSk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoeyBxdWVyeTogZGVyaXZhdGlvblF1ZXJ5IH0pO1xuICAgICAgY29uc3QgbWludFJlc3VsdCA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAgY29pbjogJ3RidGMnLFxuICAgICAgICBrZXlzOiBbJ2NoaWxkLWtleS1pZCcsICdiYWNrdXAtY2hpbGQnLCAnYml0Z28tY2hpbGQnXSxcbiAgICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAgICBlbnRlcnByaXNlOiAndGVzdC1lbnRlcnByaXNlLWlkJyxcbiAgICAgICAgc2FmZTogJ3Rlc3Qtc2FmZS1pZCcsXG4gICAgICB9KTtcbiAgICAgIG1pbnRTZW5kID0gc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IG1pbnRSZXN1bHQgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogbWludFNlbmQgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGVla3MgdGhlIGluZGV4LCByZWdpc3RlcnMgYSBwdWJsaWMtb25seSB1c2VyIGNoaWxkLCBhbmQgbWludHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBzYWZlLmNyZWF0ZVdhbGxldCh7IGNvaW46ICd0YnRjJywgbGFiZWw6ICdkZXNrIDEnLCBwYXNzcGhyYXNlOiAncHcnIH0pO1xuXG4gICAgICBkZXJpdmF0aW9uUXVlcnkuY2FsbGVkT25jZVdpdGhFeGFjdGx5KHsgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAga2V5Y2hhaW5zR2V0LmNhbGxlZE9uY2VXaXRoRXhhY3RseSh7IGlkOiAndXNlci1yb290LWlkJyB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAga2V5Y2hhaW5zQWRkLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGNvbnN0IGFkZEFyZ3MgPSBrZXljaGFpbnNBZGQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBhZGRBcmdzLnNob3VsZC5lcWwoe1xuICAgICAgICBwdWI6IGNoaWxkQXQwLnB1YixcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHBhcmVudDogJ3VzZXItcm9vdC1pZCcsXG4gICAgICAgIHNhZmVJZDogJ3Rlc3Qtc2FmZS1pZCcsXG4gICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg6IFwibS8wJ1wiLFxuICAgICAgfSk7XG4gICAgICBhZGRBcmdzLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICBhZGRBcmdzLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCcpO1xuICAgICAgYWRkQXJncy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3BhdGgnKTtcblxuICAgICAgbW9ja0JpdEdvLnBvc3QuY2FsbGVkV2l0aCgnL2VudGVycHJpc2UvdGVzdC1lbnRlcnByaXNlLWlkL3NhZmVzL3Rlc3Qtc2FmZS1pZC93YWxsZXRzJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIG1pbnRTZW5kLmZpcnN0Q2FsbC5hcmdzWzBdLnNob3VsZC5lcWwoe1xuICAgICAgICBjb2luOiAndGJ0YycsXG4gICAgICAgIGxhYmVsOiAnZGVzayAxJyxcbiAgICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAgICBrZXlzOiBbJ2NoaWxkLWtleS1pZCddLFxuICAgICAgfSk7XG4gICAgICB3YWxsZXQuaWQoKS5zaG91bGQuZXF1YWwoJ3dhbGxldC1pZCcpO1xuICAgICAgY29uc3QgbWludGVkU2FmZUlkID0gd2FsbGV0LnNhZmVJZCgpO1xuICAgICAgaWYgKG1pbnRlZFNhZmVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgbWludGVkIHdhbGxldCB0byBpbmNsdWRlIHNhZmVJZCcpO1xuICAgICAgfVxuICAgICAgbWludGVkU2FmZUlkLnNob3VsZC5lcXVhbCgndGVzdC1zYWZlLWlkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVnaXN0ZXJzIHRoZSBjaGlsZCB3aXRoIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGggYXQgYSBub24temVybyBtaW50IGluZGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZGVyaXZhdGlvblF1ZXJ5LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsIGluZGV4OiA3IH0pLFxuICAgICAgfSk7XG4gICAgICBrZXljaGFpbnNBZGQucmVzb2x2ZXMoeyBpZDogJ2NoaWxkLWtleS1pZCcsIHB1YjogY2hpbGRBdDcucHViLCB0eXBlOiAnaW5kZXBlbmRlbnQnIH0pO1xuXG4gICAgICBhd2FpdCBzYWZlLmNyZWF0ZVdhbGxldCh7IGNvaW46ICd0YnRjJywgbGFiZWw6ICdkZXNrIDgnLCBwYXNzcGhyYXNlOiAncHcnIH0pO1xuXG4gICAgICBjb25zdCBhZGRBcmdzID0ga2V5Y2hhaW5zQWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYWRkQXJncy5wdWIuc2hvdWxkLmVxdWFsKGNoaWxkQXQ3LnB1Yik7XG4gICAgICBhZGRBcmdzLmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGguc2hvdWxkLmVxdWFsKFwibS83J1wiKTtcbiAgICAgIGFkZEFyZ3Muc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdwYXRoJyk7XG4gICAgICBhZGRBcmdzLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ21pbnRzIGEgVFNTIHdhbGxldCB2aWEgdGhlIHVzZXIvQml0R28gZGVyaXZlIGNlcmVtb255JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YkNvaW4oJ2h0ZXRoJywgeyBnZXREZWZhdWx0TXVsdGlzaWdUeXBlOiAndHNzJyB9KTtcbiAgICAgIC8vIFJlYWwgVlJGIGtleSBlbnZlbG9wZTogYHt2ZXJzaW9uOiAxLCBwcnZLZXlTaGFyZSwgdnJmfWAuXG4gICAgICBjb25zdCB1c2VyQmxvYiA9IEVDRFNBVXRpbHMuYnVpbGRWcmZLZXlFbnZlbG9wZXMoXG4gICAgICAgIEJ1ZmZlci5mcm9tKCdzaWduaW5nLTEnKSxcbiAgICAgICAgQnVmZmVyLmZyb20oJ3JlZHVjZWQtMScpLFxuICAgICAgICBCdWZmZXIuZnJvbSgndnJmLTEnKVxuICAgICAgKS5lbnZlbG9wZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICBrZXljaGFpbnNHZXQub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7IGlkOiAnZWNkc2EtdXNlcicsIHNvdXJjZTogJ3VzZXInLCBlbmNyeXB0ZWRQcnY6IGBlbmM6JHt1c2VyQmxvYn1gIH0pO1xuICAgICAgbW9ja0JpdEdvLmRlY3J5cHQgPSBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoKHsgaW5wdXQgfTogeyBpbnB1dDogc3RyaW5nIH0pID0+IFByb21pc2UucmVzb2x2ZShpbnB1dC5zdGFydHNXaXRoKCdlbmM6JykgPyBpbnB1dC5zbGljZSg0KSA6ICcnKSk7XG5cbiAgICAgIGRlcml2YXRpb25RdWVyeS5yZXR1cm5zKHtcbiAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBzbG90OiAnZWNkc2FNcGMnLCBpbmRleDogMCB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjZXJlbW9ueVN0dWIgPSBzaW5vbi5zdHViKEVDRFNBVXRpbHMuRWNkc2FWcmZNUEN2MlV0aWxzLnByb3RvdHlwZSwgJ2NyZWF0ZVNhZmVDaGlsZEtleWNoYWlucycpLnJlc29sdmVzKHtcbiAgICAgICAgdXNlcktleWNoYWluOiB7IGlkOiAnZWNkc2EtY2hpbGQtdXNlcicgfSxcbiAgICAgICAgYmFja3VwS2V5Y2hhaW46IHsgaWQ6ICdlY2RzYS1jaGlsZC1iYWNrdXAtcGxhY2Vob2xkZXInIH0sXG4gICAgICB9IGFzIG5ldmVyKTtcblxuICAgICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgc2FmZS5jcmVhdGVXYWxsZXQoeyBjb2luOiAnaHRldGgnLCBsYWJlbDogJ2V2bScsIHBhc3NwaHJhc2U6ICdwdycsIG11bHRpc2lnVHlwZTogJ3RzcycgfSk7XG5cbiAgICAgIGRlcml2YXRpb25RdWVyeS5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoeyBzbG90OiAnZWNkc2FNcGMnIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXljaGFpbnNHZXQuY2FsbGVkT25jZVdpdGhFeGFjdGx5KHsgaWQ6ICdlY2RzYS11c2VyJyB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY29uc3QgY2VyZW1vbnlBcmdzID0gY2VyZW1vbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgY2VyZW1vbnlBcmdzLnNob3VsZC5jb250YWluRXFsKHtcbiAgICAgICAgc2FmZUlkOiAndGVzdC1zYWZlLWlkJyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ3Rlc3QtZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIHBhcmVudEtleUlkOiAnZWNkc2EtYml0Z28nLFxuICAgICAgICBkZXJpdmF0aW9uSW5kZXg6IDAsXG4gICAgICAgIHVzZXJSb290S2V5SWQ6ICdlY2RzYS11c2VyJyxcbiAgICAgICAgYmFja3VwUm9vdEtleUlkOiAnZWNkc2EtYmFja3VwJyxcbiAgICAgIH0pO1xuICAgICAgY2VyZW1vbnlBcmdzLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnYmFja3VwUm9vdEtleVNoYXJlJyk7XG4gICAgICBjZXJlbW9ueUFyZ3Muc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdiYWNrdXBSb290VnJmS2V5U2hhcmUnKTtcbiAgICAgIGNlcmVtb255QXJncy51c2VyUm9vdEtleVNoYXJlLnNob3VsZC5kZWVwRXF1YWwoQnVmZmVyLmZyb20oJ3NpZ25pbmctMScpKTtcbiAgICAgIGNlcmVtb255QXJncy51c2VyUm9vdFZyZktleVNoYXJlLnNob3VsZC5kZWVwRXF1YWwoQnVmZmVyLmZyb20oJ3ZyZi0xJykpO1xuXG4gICAgICBtaW50U2VuZC5maXJzdENhbGwuYXJnc1swXS5zaG91bGQuZXFsKHtcbiAgICAgICAgY29pbjogJ2h0ZXRoJyxcbiAgICAgICAgbGFiZWw6ICdldm0nLFxuICAgICAgICB0eXBlOiAnaG90JyxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAga2V5czogWydlY2RzYS1jaGlsZC11c2VyJywgJ2VjZHNhLWNoaWxkLWJhY2t1cC1wbGFjZWhvbGRlciddLFxuICAgICAgfSk7XG4gICAgICB3YWxsZXQuaWQoKS5zaG91bGQuZXF1YWwoJ3dhbGxldC1pZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBwZWVrZWQgZGVyaXZhdGlvbiBpbmRleCBmb3IgdGhlIHdyb25nIHNsb3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXJpdmF0aW9uUXVlcnkucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgc2xvdDogJ2VjZHNhTXBjJywgaW5kZXg6IDAgfSksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHNhZmVcbiAgICAgICAgLmNyZWF0ZVdhbGxldCh7IGNvaW46ICd0YnRjJywgbGFiZWw6ICdkZXNrIDEnLCBwYXNzcGhyYXNlOiAncHcnIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9yZXR1cm5lZCBzbG90ICdlY2RzYU1wYycvKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaW50cyBhbiBlZDI1NTE5IHdhbGxldCBmcm9tIHRoZSBTdHJLZXkgc2VlZCB1c2VyIHJvb3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViQ29pbigndHhsbScpO1xuICAgICAga2V5Y2hhaW5zR2V0LnJlc29sdmVzKHtcbiAgICAgICAgaWQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBgZW5jOiR7Uk9PVF9FRDI1NTE5X1NFRURfU1RSS0VZfWAsXG4gICAgICAgIHB1YjogJ0dBQjJDQjU3NlBIQkJQUTVPRE9SUloyTFlDTVdQWkdXR0NOMktESzdEWE9JTVpBU0tVWTNRWjZRJyxcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIH0pO1xuICAgICAga2V5Y2hhaW5zQWRkLnJlc29sdmVzKHsgaWQ6ICdjaGlsZC1rZXktaWQnLCBwdWI6IGVkMjU1MTlDaGlsZEF0MC5wdWIsIHR5cGU6ICdpbmRlcGVuZGVudCcgfSk7XG4gICAgICBkZXJpdmF0aW9uUXVlcnkucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsIGluZGV4OiAwIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHNhZmUuY3JlYXRlV2FsbGV0KHsgY29pbjogJ3R4bG0nLCBsYWJlbDogJ3hsbSBkZXNrJywgcGFzc3BocmFzZTogJ3B3JyB9KTtcblxuICAgICAgZGVyaXZhdGlvblF1ZXJ5LmNhbGxlZE9uY2VXaXRoRXhhY3RseSh7IHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXljaGFpbnNHZXQuY2FsbGVkT25jZVdpdGhFeGFjdGx5KHsgaWQ6ICdlZC11c2VyJyB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY29uc3QgYWRkQXJncyA9IGtleWNoYWluc0FkZC5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIGFkZEFyZ3Muc2hvdWxkLmVxbCh7XG4gICAgICAgIHB1YjogZWQyNTUxOUNoaWxkQXQwLnB1YixcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHBhcmVudDogJ2VkLXVzZXInLFxuICAgICAgICBzYWZlSWQ6ICd0ZXN0LXNhZmUtaWQnLFxuICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBcIm0vMCdcIixcbiAgICAgIH0pO1xuICAgICAgYWRkQXJncy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2VuY3J5cHRlZFBydicpO1xuICAgICAgbWludFNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0uc2hvdWxkLmVxbCh7XG4gICAgICAgIGNvaW46ICd0eGxtJyxcbiAgICAgICAgbGFiZWw6ICd4bG0gZGVzaycsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgICAga2V5czogWydjaGlsZC1rZXktaWQnXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBjaGFpbiBvZiBbJ3RhbGdvJywgJ3RoYmFyJ10pIHtcbiAgICAgIGl0KGBtaW50cyBhbiBlZDI1NTE5ICR7Y2hhaW59IHdhbGxldCBwb3N0aW5nIHRoZSB1c2VyIGNoaWxkIGFzIGEgU3RyS2V5IChzZXJ2ZXIgY29udmVydHMpYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUaGUgdXNlciBjaGlsZCBpcyBoYXJkZW5lZC1kZXJpdmVkIGZyb20gdGhlIHR4bG0gU3RyS2V5IHVzZXIgcm9vdCwgc28gdGhlIFNESyBwb3N0cyBhXG4gICAgICAgIC8vIFN0ZWxsYXIgU3RyS2V5IGZvciBFVkVSWSBlZDI1NTE5IHdhbGxldCBjb2luLiBXYWxsZXQgUGxhdGZvcm0gY29udmVydHMgdGhlIHB1YiB0byB0aGVcbiAgICAgICAgLy8gd2FsbGV0IGNvaW4ncyByZXByZXNlbnRhdGlvbiBhdCByZWdpc3RyYXRpb247IHRoZSBTREsgbmV2ZXIgY29pbi1lbmNvZGVzIGNoaWxkcmVuLlxuICAgICAgICBzdHViQ29pbihjaGFpbik7XG4gICAgICAgIGtleWNoYWluc0dldC5yZXNvbHZlcyh7XG4gICAgICAgICAgaWQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke1JPT1RfRUQyNTUxOV9TRUVEX1NUUktFWX1gLFxuICAgICAgICAgIHB1YjogJ0dBQjJDQjU3NlBIQkJQUTVPRE9SUloyTFlDTVdQWkdXR0NOMktESzdEWE9JTVpBU0tVWTNRWjZRJyxcbiAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICB9KTtcbiAgICAgICAga2V5Y2hhaW5zQWRkLnJlc29sdmVzKHsgaWQ6ICdjaGlsZC1rZXktaWQnLCBwdWI6IGBjb252ZXJ0ZWQtJHtjaGFpbn0tcHViYCwgdHlwZTogJ2luZGVwZW5kZW50JyB9KTtcbiAgICAgICAgZGVyaXZhdGlvblF1ZXJ5LnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsIGluZGV4OiAwIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBzYWZlLmNyZWF0ZVdhbGxldCh7IGNvaW46IGNoYWluLCBsYWJlbDogYCR7Y2hhaW59IGRlc2tgLCBwYXNzcGhyYXNlOiAncHcnIH0pO1xuXG4gICAgICAgIGNvbnN0IGFkZEFyZ3MgPSBrZXljaGFpbnNBZGQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgIGFkZEFyZ3Muc2hvdWxkLmVxbCh7XG4gICAgICAgICAgcHViOiBlZDI1NTE5Q2hpbGRBdDAucHViLFxuICAgICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgICAgcGFyZW50OiAnZWQtdXNlcicsXG4gICAgICAgICAgc2FmZUlkOiAndGVzdC1zYWZlLWlkJyxcbiAgICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBcIm0vMCdcIixcbiAgICAgICAgfSk7XG4gICAgICAgIG1pbnRTZW5kLmZpcnN0Q2FsbC5hcmdzWzBdLnNob3VsZC5lcWwoe1xuICAgICAgICAgIGNvaW46IGNoYWluLFxuICAgICAgICAgIGxhYmVsOiBgJHtjaGFpbn0gZGVza2AsXG4gICAgICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgICAga2V5czogWydjaGlsZC1rZXktaWQnXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgncmVqZWN0cyBhbiBlbXB0eSBwYXNzcGhyYXNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZVxuICAgICAgICAuY3JlYXRlV2FsbGV0KHsgY29pbjogJ3RidGMnLCBsYWJlbDogJ3cnLCBwYXNzcGhyYXNlOiAnJyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvcGFzc3BocmFzZSBpcyByZXF1aXJlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSB3cm9uZyBwYXNzcGhyYXNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc2FmZVxuICAgICAgICAuY3JlYXRlV2FsbGV0KHsgY29pbjogJ3RidGMnLCBsYWJlbDogJ3cnLCBwYXNzcGhyYXNlOiAnbm9wZScgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoSW5jb3JyZWN0UGFzc3dvcmRFcnJvcik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=safeDerivation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/safe/safeDerivation.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("should");
4
+ const src_1 = require("../../../../src");
5
+ // 32-byte synthetic root seed. The StrKey spelling was generated with stellar-sdk
6
+ // (Keypair.fromRawEd25519Seed); the derivation vectors below were generated with an independent
7
+ // SLIP-0010 implementation written from the spec and cross-checked against published vectors
8
+ // (SLIP-0010 test vector 1 seed 000102...0f derives m/0' to 68e0fe46...dade7a3).
9
+ const ROOT_SEED_STRKEY = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
10
+ const ROOT_XPRV = 'xprv9s21ZrQH143K3hekyNj7TciR4XNYe1kMj68W2ipjJGNHETWP7o42AjDnSPgKhdZ4x8NBAvaL72RrXjuXNdmkMqLERZza73oYugGtbLFXG8g';
11
+ describe('safeDerivation', function () {
12
+ describe('parseSafeDerivationIndex', function () {
13
+ it('accepts numbers and digit strings', function () {
14
+ (0, src_1.parseSafeDerivationIndex)(0).should.equal(0);
15
+ (0, src_1.parseSafeDerivationIndex)(7).should.equal(7);
16
+ (0, src_1.parseSafeDerivationIndex)('42').should.equal(42);
17
+ (0, src_1.parseSafeDerivationIndex)(0x7fffffff).should.equal(0x7fffffff);
18
+ });
19
+ it('rejects negatives, non-integers, and out-of-range values', function () {
20
+ (() => (0, src_1.parseSafeDerivationIndex)(-1)).should.throw(/Invalid safe derivation index/);
21
+ (() => (0, src_1.parseSafeDerivationIndex)(1.5)).should.throw(/Invalid safe derivation index/);
22
+ (() => (0, src_1.parseSafeDerivationIndex)(0x80000000)).should.throw(/Invalid safe derivation index/);
23
+ });
24
+ it('rejects non-numeric strings', function () {
25
+ (() => (0, src_1.parseSafeDerivationIndex)("0'")).should.throw(/Invalid safe derivation index/);
26
+ (() => (0, src_1.parseSafeDerivationIndex)('m/0')).should.throw(/Invalid safe derivation index/);
27
+ (() => (0, src_1.parseSafeDerivationIndex)('')).should.throw(/Invalid safe derivation index/);
28
+ });
29
+ });
30
+ describe('getSafeHardenedDerivationPath', function () {
31
+ it('formats m/<index> with hardened apostrophe', function () {
32
+ (0, src_1.getSafeHardenedDerivationPath)(0).should.equal("m/0'");
33
+ (0, src_1.getSafeHardenedDerivationPath)('7').should.equal("m/7'");
34
+ (0, src_1.getSafeHardenedDerivationPath)('007').should.equal("m/7'");
35
+ });
36
+ });
37
+ describe('deriveSafeChildHardenedFromXprv', function () {
38
+ it('derives m/0 from the root xprv', function () {
39
+ const child = (0, src_1.deriveSafeChildHardenedFromXprv)(ROOT_XPRV, 0);
40
+ child.derivationPath.should.equal("m/0'");
41
+ child.pub.should.equal('xpub69PbR6HB6ZaW3Q9CWAzNsmWXC8TBDq1VEmd25XkwUgrU3PVGAbj6bksqPnGWcFdAodXWRpWMXJ5KGim45n55cZjXeW7FDw4BqahtxTEN4wB');
42
+ child.prv.should.equal('xprv9vQF1akHGC2Cpv4jQ9TNWdZne6cgpNHdsYhRH9MKvMKVAbA7d4Qr3xZMYXqAS35V4damCDP2hYohCLViHzcGhX4Tr7djjCBruAX73SsjCiC');
43
+ });
44
+ });
45
+ describe('deriveSafeChildEd25519Hardened', function () {
46
+ it('derives m/0 to the pinned SLIP-0010 vector', function () {
47
+ const child = (0, src_1.deriveSafeChildEd25519Hardened)(ROOT_SEED_STRKEY, 0);
48
+ child.should.eql({
49
+ prv: 'b127eb5092011c085345c8ce0bfeda6064f9e1249e29cc238c1d64bf2e587ce7',
50
+ pub: 'GCTZR46FPFAMYN734SQB4NCNBI44M4DSNM5RJPCDLOMAOFPEUVUXPK7R',
51
+ derivationPath: "m/0'",
52
+ });
53
+ });
54
+ it('derives m/7 to the pinned SLIP-0010 vector', function () {
55
+ const child = (0, src_1.deriveSafeChildEd25519Hardened)(ROOT_SEED_STRKEY, '7');
56
+ child.should.eql({
57
+ prv: 'd54701e221cf51e9e208a7c59e3fe3e4cfbb6b91fd3f35ce092a471c35228217',
58
+ pub: 'GC2Y5EU2XA22SOSCRSZRNDEY3UAA4OJSLZ5NQUFUZDBQSLMVCIZCBHIN',
59
+ derivationPath: "m/7'",
60
+ });
61
+ });
62
+ it('rejects a malformed root seed', function () {
63
+ (() => (0, src_1.deriveSafeChildEd25519Hardened)(ROOT_SEED_STRKEY.slice(0, 55), 0)).should.throw(/Invalid ed25519 StrKey secret seed/);
64
+ (() => (0, src_1.deriveSafeChildEd25519Hardened)(ROOT_XPRV, 0)).should.throw(/Invalid ed25519 StrKey secret seed/);
65
+ });
66
+ it('rejects an invalid index', function () {
67
+ (() => (0, src_1.deriveSafeChildEd25519Hardened)(ROOT_SEED_STRKEY, -1)).should.throw(/Invalid safe derivation index/);
68
+ });
69
+ });
70
+ });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vc2FmZS9zYWZlRGVyaXZhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtCQUFnQjtBQUNoQix5Q0FLeUI7QUFFekIsa0ZBQWtGO0FBQ2xGLGdHQUFnRztBQUNoRyw2RkFBNkY7QUFDN0YsaUZBQWlGO0FBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsMERBQTBELENBQUM7QUFFcEYsTUFBTSxTQUFTLEdBQ2IsaUhBQWlILENBQUM7QUFFcEgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLFFBQVEsQ0FBQywwQkFBMEIsRUFBRTtRQUNuQyxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsSUFBQSw4QkFBd0IsRUFBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUEsOEJBQXdCLEVBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFBLDhCQUF3QixFQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEQsSUFBQSw4QkFBd0IsRUFBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFO1lBQzdELENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSw4QkFBd0IsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ25GLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSw4QkFBd0IsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFL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LENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDbkYsb0NBQW9DLENBQ3JDLENBQUM7WUFDRixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsb0NBQThCLEVBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBCQUEwQixFQUFFO1lBQzdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxvQ0FBOEIsRUFBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzdHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7XG4gIGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZCxcbiAgZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydixcbiAgZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgsXG4gIHBhcnNlU2FmZURlcml2YXRpb25JbmRleCxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuLy8gMzItYnl0ZSBzeW50aGV0aWMgcm9vdCBzZWVkLiBUaGUgU3RyS2V5IHNwZWxsaW5nIHdhcyBnZW5lcmF0ZWQgd2l0aCBzdGVsbGFyLXNka1xuLy8gKEtleXBhaXIuZnJvbVJhd0VkMjU1MTlTZWVkKTsgdGhlIGRlcml2YXRpb24gdmVjdG9ycyBiZWxvdyB3ZXJlIGdlbmVyYXRlZCB3aXRoIGFuIGluZGVwZW5kZW50XG4vLyBTTElQLTAwMTAgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmcm9tIHRoZSBzcGVjIGFuZCBjcm9zcy1jaGVja2VkIGFnYWluc3QgcHVibGlzaGVkIHZlY3RvcnNcbi8vIChTTElQLTAwMTAgdGVzdCB2ZWN0b3IgMSBzZWVkIDAwMDEwMi4uLjBmIGRlcml2ZXMgbS8wJyB0byA2OGUwZmU0Ni4uLmRhZGU3YTMpLlxuY29uc3QgUk9PVF9TRUVEX1NUUktFWSA9ICdTQUFBQ0FRREFRQ1FNQllJQkVGQVdEQU5CWUhSQUVJU0NNS0JLRlFYREFNUlVHWTREVVBCNk5LSSc7XG5cbmNvbnN0IFJPT1RfWFBSViA9XG4gICd4cHJ2OXMyMVpyUUgxNDNLM2hla3lOajdUY2lSNFhOWWUxa01qNjhXMmlwakpHTkhFVFdQN280MkFqRG5TUGdLaGRaNHg4TkJBdmFMNzJSclhqdVhOZG1rTXFMRVJaemE3M29ZdWdHdGJMRlhHOGcnO1xuXG5kZXNjcmliZSgnc2FmZURlcml2YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2FjY2VwdHMgbnVtYmVycyBhbmQgZGlnaXQgc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHBhcnNlU2FmZURlcml2YXRpb25JbmRleCgwKS5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoNykuc2hvdWxkLmVxdWFsKDcpO1xuICAgICAgcGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KCc0MicpLnNob3VsZC5lcXVhbCg0Mik7XG4gICAgICBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoMHg3ZmZmZmZmZikuc2hvdWxkLmVxdWFsKDB4N2ZmZmZmZmYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgbmVnYXRpdmVzLCBub24taW50ZWdlcnMsIGFuZCBvdXQtb2YtcmFuZ2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IHBhcnNlU2FmZURlcml2YXRpb25JbmRleCgtMSkpLnNob3VsZC50aHJvdygvSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXgvKTtcbiAgICAgICgoKSA9PiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoMS41KSkuc2hvdWxkLnRocm93KC9JbnZhbGlkIHNhZmUgZGVyaXZhdGlvbiBpbmRleC8pO1xuICAgICAgKCgpID0+IHBhcnNlU2FmZURlcml2YXRpb25JbmRleCgweDgwMDAwMDAwKSkuc2hvdWxkLnRocm93KC9JbnZhbGlkIHNhZmUgZGVyaXZhdGlvbiBpbmRleC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgbm9uLW51bWVyaWMgc3RyaW5ncycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoXCIwJ1wiKSkuc2hvdWxkLnRocm93KC9JbnZhbGlkIHNhZmUgZGVyaXZhdGlvbiBpbmRleC8pO1xuICAgICAgKCgpID0+IHBhcnNlU2FmZURlcml2YXRpb25JbmRleCgnbS8wJykpLnNob3VsZC50aHJvdygvSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXgvKTtcbiAgICAgICgoKSA9PiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoJycpKS5zaG91bGQudGhyb3coL0ludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4Lyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZm9ybWF0cyBtLzxpbmRleD4gd2l0aCBoYXJkZW5lZCBhcG9zdHJvcGhlJywgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoMCkuc2hvdWxkLmVxdWFsKFwibS8wJ1wiKTtcbiAgICAgIGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKCc3Jykuc2hvdWxkLmVxdWFsKFwibS83J1wiKTtcbiAgICAgIGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKCcwMDcnKS5zaG91bGQuZXF1YWwoXCJtLzcnXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZGVyaXZlcyBtLzAgZnJvbSB0aGUgcm9vdCB4cHJ2JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KFJPT1RfWFBSViwgMCk7XG4gICAgICBjaGlsZC5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoXCJtLzAnXCIpO1xuICAgICAgY2hpbGQucHViLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3hwdWI2OVBiUjZIQjZaYVczUTlDV0F6TnNtV1hDOFRCRHExVkVtZDI1WGt3VWdyVTNQVkdBYmo2YmtzcVBuR1djRmRBb2RYV1JwV01YSjVLR2ltNDVuNTVjWmpYZVc3RkR3NEJxYWh0eFRFTjR3QidcbiAgICAgICk7XG4gICAgICBjaGlsZC5wcnYuc2hvdWxkLmVxdWFsKFxuICAgICAgICAneHBydjl2UUYxYWtIR0MyQ3B2NGpROVROV2RabmU2Y2dwTkhkc1loUkg5TUt2TUtWQWJBN2Q0UXIzeFpNWVhxQVMzNVY0ZGFtQ0RQMmhZb2hDTFZpSHpjR2hYNFRyN2RqakNCcnVBWDczU3NqQ2lDJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Rlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZGVyaXZlcyBtLzAgdG8gdGhlIHBpbm5lZCBTTElQLTAwMTAgdmVjdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQoUk9PVF9TRUVEX1NUUktFWSwgMCk7XG4gICAgICBjaGlsZC5zaG91bGQuZXFsKHtcbiAgICAgICAgcHJ2OiAnYjEyN2ViNTA5MjAxMWMwODUzNDVjOGNlMGJmZWRhNjA2NGY5ZTEyNDllMjljYzIzOGMxZDY0YmYyZTU4N2NlNycsXG4gICAgICAgIHB1YjogJ0dDVFpSNDZGUEZBTVlONzM0U1FCNE5DTkJJNDRNNERTTk01UkpQQ0RMT01BT0ZQRVVWVVhQSzdSJyxcbiAgICAgICAgZGVyaXZhdGlvblBhdGg6IFwibS8wJ1wiLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVyaXZlcyBtLzcgdG8gdGhlIHBpbm5lZCBTTElQLTAwMTAgdmVjdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQoUk9PVF9TRUVEX1NUUktFWSwgJzcnKTtcbiAgICAgIGNoaWxkLnNob3VsZC5lcWwoe1xuICAgICAgICBwcnY6ICdkNTQ3MDFlMjIxY2Y1MWU5ZTIwOGE3YzU5ZTNmZTNlNGNmYmI2YjkxZmQzZjM1Y2UwOTJhNDcxYzM1MjI4MjE3JyxcbiAgICAgICAgcHViOiAnR0MyWTVFVTJYQTIyU09TQ1JTWlJOREVZM1VBQTRPSlNMWjVOUVVGVVpEQlFTTE1WQ0laQ0JISU4nLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aDogXCJtLzcnXCIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgbWFsZm9ybWVkIHJvb3Qgc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQoUk9PVF9TRUVEX1NUUktFWS5zbGljZSgwLCA1NSksIDApKS5zaG91bGQudGhyb3coXG4gICAgICAgIC9JbnZhbGlkIGVkMjU1MTkgU3RyS2V5IHNlY3JldCBzZWVkL1xuICAgICAgKTtcbiAgICAgICgoKSA9PiBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQoUk9PVF9YUFJWLCAwKSkuc2hvdWxkLnRocm93KC9JbnZhbGlkIGVkMjU1MTkgU3RyS2V5IHNlY3JldCBzZWVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhbiBpbnZhbGlkIGluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChST09UX1NFRURfU1RSS0VZLCAtMSkpLnNob3VsZC50aHJvdygvSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXgvKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==