@bitgo-beta/sdk-core 8.2.1-beta.2071 → 8.2.1-beta.2072

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 (25) hide show
  1. package/dist/src/bitgo/keychain/iKeychains.d.ts +28 -0
  2. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  3. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  4. package/dist/src/bitgo/keychain/keychains.d.ts +47 -6
  5. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  6. package/dist/src/bitgo/keychain/keychains.js +100 -24
  7. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  8. package/dist/src/bitgo/safe/safe.js +10 -5
  9. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +16 -4
  10. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  11. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +23 -8
  12. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +4 -1
  13. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -1
  14. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +11 -1
  15. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +20 -1
  16. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -1
  17. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +55 -1
  18. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +3 -0
  19. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
  20. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +1 -1
  21. package/dist/test/unit/bitgo/keychain/keychains.js +261 -1
  22. package/dist/test/unit/bitgo/safe/safe.js +58 -1
  23. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +224 -18
  24. package/dist/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +9 -9
@@ -37,6 +37,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const assert_1 = __importDefault(require("assert"));
40
+ const pgp = __importStar(require("openpgp"));
41
+ const sinon = __importStar(require("sinon"));
42
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
43
+ const public_types_1 = require("@bitgo/public-types");
40
44
  const cbor_x_1 = require("cbor-x");
41
45
  const t = __importStar(require("io-ts"));
42
46
  const src_1 = require("../../../../../../src");
@@ -44,6 +48,7 @@ const codecs_1 = require("../../../../../../src/bitgo/utils/codecs");
44
48
  const keyShareEnvelope_1 = require("../../../../../../src/bitgo/utils/tss/keyShareEnvelope");
45
49
  const eddsaVrfMPCv2_1 = require("../../../../../../src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2");
46
50
  const typesMPCv2_1 = require("../../../../../../src/bitgo/utils/tss/ecdsa/typesMPCv2");
51
+ const opengpgUtils_1 = require("../../../../../../src/bitgo/utils/opengpgUtils");
47
52
  const Uint8ArrayCodec = new t.Type('Uint8Array', (value) => value instanceof Uint8Array, (value, context) => (value instanceof Uint8Array ? t.success(value) : t.failure(value, context)), t.identity);
48
53
  const VrfEnvelope = t.type({
49
54
  version: t.literal(1),
@@ -53,6 +58,30 @@ const VrfEnvelope = t.type({
53
58
  function decodeVrfEnvelope(encoded) {
54
59
  return (0, codecs_1.decodeWithCodec)(VrfEnvelope, (0, cbor_x_1.decode)(encoded), 'VRF key envelope');
55
60
  }
61
+ function createKeychainFixture() {
62
+ const encryptedInputs = [];
63
+ const addedKeychains = [];
64
+ const post = sinon.stub();
65
+ const bitgo = {
66
+ getEnv: () => 'dev',
67
+ url: (path) => path,
68
+ post,
69
+ encrypt: async (params) => {
70
+ encryptedInputs.push(params.input);
71
+ return `encrypted:${params.input}`;
72
+ },
73
+ };
74
+ const keychains = {
75
+ add: async (params) => {
76
+ addedKeychains.push(params);
77
+ return { id: `${params.source}-child`, type: 'tss', encryptedPrv: params.encryptedPrv };
78
+ },
79
+ };
80
+ const baseCoin = {
81
+ keychains: () => keychains,
82
+ };
83
+ return { bitgo, baseCoin, post, encryptedInputs, addedKeychains };
84
+ }
56
85
  describe('EdDSA MPCv2 VRF root material', function () {
57
86
  it('encodes signing and VRF shares in both full and reduced envelopes', function () {
58
87
  const privateMaterial = Buffer.from('signing-share');
@@ -67,23 +96,7 @@ describe('EdDSA MPCv2 VRF root material', function () {
67
96
  assert_1.default.deepStrictEqual(Buffer.from(decodedReducedEnvelope.vrf), vrfKeyShare);
68
97
  });
69
98
  it('keeps ordinary MPCv2 participant material as bare base64', async function () {
70
- const encryptedInputs = [];
71
- const addedKeychains = [];
72
- const bitgo = {
73
- encrypt: async (params) => {
74
- encryptedInputs.push(params.input);
75
- return `encrypted:${params.input}`;
76
- },
77
- };
78
- const keychains = {
79
- add: async (params) => {
80
- addedKeychains.push(params);
81
- return { id: 'user-key' };
82
- },
83
- };
84
- const baseCoin = {
85
- keychains: () => keychains,
86
- };
99
+ const { bitgo, baseCoin, encryptedInputs, addedKeychains } = createKeychainFixture();
87
100
  const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
88
101
  const privateMaterial = Buffer.from('signing-share');
89
102
  const reducedPrivateMaterial = Buffer.from('reduced-signing-share');
@@ -95,6 +108,13 @@ describe('EdDSA MPCv2 VRF root material', function () {
95
108
  assert_1.default.strictEqual(addedKeychains[0].encryptedPrv, `encrypted:${privateMaterial.toString('base64')}`);
96
109
  assert_1.default.strictEqual(addedKeychains[0].safeId, undefined);
97
110
  });
111
+ it('rejects a public-only backup outside a safe child derivation', async function () {
112
+ const { bitgo, baseCoin, encryptedInputs, addedKeychains } = createKeychainFixture();
113
+ const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
114
+ await assert_1.default.rejects(utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, 'common-keychain', undefined, undefined, 'passphrase'), /Private material is required for backup keychain/);
115
+ assert_1.default.deepStrictEqual(encryptedInputs, []);
116
+ assert_1.default.deepStrictEqual(addedKeychains, []);
117
+ });
98
118
  it('encrypts the VRF envelope and tags the keychain with safeId', async function () {
99
119
  const encryptedInputs = [];
100
120
  const addedKeychains = [];
@@ -171,4 +191,190 @@ describe('EdDSA MPCv2 VRF root material', function () {
171
191
  assert_1.default.throws(() => (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(badParty, typesMPCv2_1.MPCv2PartiesEnum.USER), /VRF DKG message blob/);
172
192
  });
173
193
  });
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFDaEMseUNBQTJCO0FBRTNCLCtDQUF3RjtBQUN4RixxRUFBMkU7QUFDM0UsNkZBQWtHO0FBQ2xHLDZGQUdtRTtBQUNuRSx1RkFBMEY7QUFFMUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNoQyxZQUFZLEVBQ1osQ0FBQyxLQUFLLEVBQXVCLEVBQUUsQ0FBQyxLQUFLLFlBQVksVUFBVSxFQUMzRCxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFDaEcsQ0FBQyxDQUFDLFFBQVEsQ0FDWCxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDckIsV0FBVyxFQUFFLGVBQWU7SUFDNUIsR0FBRyxFQUFFLGVBQWU7Q0FDckIsQ0FBQyxDQUFDO0FBUUgsU0FBUyxpQkFBaUIsQ0FBQyxPQUFlO0lBQ3hDLE9BQU8sSUFBQSx3QkFBZSxFQUFDLFdBQVcsRUFBRSxJQUFBLGVBQU0sRUFBQyxPQUFPLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxRQUFRLENBQUMsK0JBQStCLEVBQUU7SUFDeEMsRUFB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WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmltcG9ydCB7IEVkZHNhTVBDdjJVdGlscywgQml0R29CYXNlLCBJQmFzZUNvaW4sIEtleWNoYWluIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy9jb2RlY3MnO1xuaW1wb3J0IHsgYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9rZXlTaGFyZUVudmVsb3BlJztcbmltcG9ydCB7XG4gIGRlc2VyaWFsaXplVnJmTWVzc2FnZXMsXG4gIHNlcmlhbGl6ZVZyZk1lc3NhZ2VzLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VkZHNhL2VkZHNhVnJmTVBDdjInO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvdHlwZXNNUEN2Mic7XG5cbmNvbnN0IFVpbnQ4QXJyYXlDb2RlYyA9IG5ldyB0LlR5cGU8VWludDhBcnJheSwgVWludDhBcnJheSwgdW5rbm93bj4oXG4gICdVaW50OEFycmF5JyxcbiAgKHZhbHVlKTogdmFsdWUgaXMgVWludDhBcnJheSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXG4gICh2YWx1ZSwgY29udGV4dCkgPT4gKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IHQuc3VjY2Vzcyh2YWx1ZSkgOiB0LmZhaWx1cmUodmFsdWUsIGNvbnRleHQpKSxcbiAgdC5pZGVudGl0eVxuKTtcblxuY29uc3QgVnJmRW52ZWxvcGUgPSB0LnR5cGUoe1xuICB2ZXJzaW9uOiB0LmxpdGVyYWwoMSksXG4gIHBydktleVNoYXJlOiBVaW50OEFycmF5Q29kZWMsXG4gIHZyZjogVWludDhBcnJheUNvZGVjLFxufSk7XG5cbnR5cGUgQWRkZWRLZXljaGFpblBhcmFtcyA9IHtcbiAgc291cmNlPzogc3RyaW5nO1xuICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIHNhZmVJZD86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZVZyZkVudmVsb3BlKGVuY29kZWQ6IEJ1ZmZlcik6IHQuVHlwZU9mPHR5cGVvZiBWcmZFbnZlbG9wZT4ge1xuICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFZyZkVudmVsb3BlLCBkZWNvZGUoZW5jb2RlZCksICdWUkYga2V5IGVudmVsb3BlJyk7XG59XG5cbmRlc2NyaWJlKCdFZERTQSBNUEN2MiBWUkYgcm9vdCBtYXRlcmlhbCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2VuY29kZXMgc2lnbmluZyBhbmQgVlJGIHNoYXJlcyBpbiBib3RoIGZ1bGwgYW5kIHJlZHVjZWQgZW52ZWxvcGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdzaWduaW5nLXNoYXJlJyk7XG4gICAgY29uc3QgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdyZWR1Y2VkLXNpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCB2cmZLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKCd2cmYtc2hhcmUnKTtcblxuICAgIGNvbnN0IHsgZW52ZWxvcGUsIHJlZHVjZWRFbnZlbG9wZSB9ID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHZyZktleVNoYXJlXG4gICAgKTtcbiAgICBjb25zdCBkZWNvZGVkRW52ZWxvcGUgPSBkZWNvZGVWcmZFbnZlbG9wZShlbnZlbG9wZSk7XG4gICAgY29uc3QgZGVjb2RlZFJlZHVjZWRFbnZlbG9wZSA9IGRlY29kZVZyZkVudmVsb3BlKHJlZHVjZWRFbnZlbG9wZSk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWRFbnZlbG9wZS5wcnZLZXlTaGFyZSksIHByaXZhdGVNYXRlcmlhbCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkRW52ZWxvcGUudnJmKSwgdnJmS2V5U2hhcmUpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZFJlZHVjZWRFbnZlbG9wZS5wcnZLZXlTaGFyZSksIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZFJlZHVjZWRFbnZlbG9wZS52cmYpLCB2cmZLZXlTaGFyZSk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBvcmRpbmFyeSBNUEN2MiBwYXJ0aWNpcGFudCBtYXRlcmlhbCBhcyBiYXJlIGJhc2U2NCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWRkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgIGNvbnN0IGJpdGdvID0ge1xuICAgICAgZW5jcnlwdDogYXN5bmMgKHBhcmFtczogeyBpbnB1dDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgICByZXR1cm4gYGVuY3J5cHRlZDoke3BhcmFtcy5pbnB1dH1gO1xuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIGFkZDogYXN5bmMgKHBhcmFtczogQWRkZWRLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgICByZXR1cm4geyBpZDogJ3VzZXIta2V5JyB9IGFzIHVua25vd24gYXMgS2V5Y2hhaW47XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuICAgIGNvbnN0IHByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdzaWduaW5nLXNoYXJlJyk7XG4gICAgY29uc3QgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IEJ1ZmZlci5mcm9tKCdyZWR1Y2VkLXNpZ25pbmctc2hhcmUnKTtcblxuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAnY29tbW9uLWtleWNoYWluJyxcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICAncGFzc3BocmFzZSdcbiAgICApO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMsIFtcbiAgICAgIHByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICBdKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uZW5jcnlwdGVkUHJ2LCBgZW5jcnlwdGVkOiR7cHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKX1gKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uc2FmZUlkLCB1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdCgnZW5jcnlwdHMgdGhlIFZSRiBlbnZlbG9wZSBhbmQgdGFncyB0aGUga2V5Y2hhaW4gd2l0aCBzYWZlSWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZW5jcnlwdGVkSW5wdXRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGFkZGVkS2V5Y2hhaW5zOiBBZGRlZEtleWNoYWluUGFyYW1zW10gPSBbXTtcbiAgICBjb25zdCBiaXRnbyA9IHtcbiAgICAgIGVuY3J5cHQ6IGFzeW5jIChwYXJhbXM6IHsgaW5wdXQ6IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgZW5jcnlwdGVkSW5wdXRzLnB1c2gocGFyYW1zLmlucHV0KTtcbiAgICAgICAgcmV0dXJuIGBlbmNyeXB0ZWQ6JHtwYXJhbXMuaW5wdXR9YDtcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSB7XG4gICAgICBhZGQ6IGFzeW5jIChwYXJhbXM6IEFkZGVkS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGFkZGVkS2V5Y2hhaW5zLnB1c2gocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHsgaWQ6ICd1c2VyLWtleScgfSBhcyB1bmtub3duIGFzIEtleWNoYWluO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb2luID0ge1xuICAgICAga2V5Y2hhaW5zOiAoKSA9PiBrZXljaGFpbnMsXG4gICAgfSBhcyB1bmtub3duIGFzIElCYXNlQ29pbjtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICBjb25zdCB7IGVudmVsb3BlLCByZWR1Y2VkRW52ZWxvcGUgfSA9IGJ1aWxkU2FmZU1wY0tleUVudmVsb3BlcyhcbiAgICAgIEJ1ZmZlci5mcm9tKCdzaWduaW5nLXNoYXJlJyksXG4gICAgICBCdWZmZXIuZnJvbSgncmVkdWNlZC1zaWduaW5nLXNoYXJlJyksXG4gICAgICBCdWZmZXIuZnJvbSgndnJmLXNoYXJlJylcbiAgICApO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICdjb21tb24ta2V5Y2hhaW4nLFxuICAgICAgZW52ZWxvcGUsXG4gICAgICByZWR1Y2VkRW52ZWxvcGUsXG4gICAgICAncGFzc3BocmFzZScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAnc2FmZS1pZCdcbiAgICApO1xuXG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHNbMF0sIGVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLnNhZmVJZCwgJ3NhZmUtaWQnKTtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVnJmRW52ZWxvcGUoQnVmZmVyLmZyb20oZW5jcnlwdGVkSW5wdXRzWzBdLCAnYmFzZTY0JykpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZC52cmYpLCBCdWZmZXIuZnJvbSgndnJmLXNoYXJlJykpO1xuICB9KTtcblxuICBpdCgndGFncyB0aGUgQml0R28ga2V5Y2hhaW4gd2l0aCBzYWZlSWQgYW5kIGRvZXMgbm90IGVuY3J5cHQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZW5jcnlwdGVkSW5wdXRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGFkZGVkS2V5Y2hhaW5zOiBBZGRlZEtleWNoYWluUGFyYW1zW10gPSBbXTtcbiAgICBjb25zdCBiaXRnbyA9IHtcbiAgICAgIGVuY3J5cHQ6IGFzeW5jIChwYXJhbXM6IHsgaW5wdXQ6IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgZW5jcnlwdGVkSW5wdXRzLnB1c2gocGFyYW1zLmlucHV0KTtcbiAgICAgICAgcmV0dXJuIGBlbmNyeXB0ZWQ6JHtwYXJhbXMuaW5wdXR9YDtcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSB7XG4gICAgICBhZGQ6IGFzeW5jIChwYXJhbXM6IEFkZGVkS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICAgIGFkZGVkS2V5Y2hhaW5zLnB1c2gocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHsgaWQ6ICdiaXRnby1rZXknIH0gYXMgdW5rbm93biBhcyBLZXljaGFpbjtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogKCkgPT4ga2V5Y2hhaW5zLFxuICAgIH0gYXMgdW5rbm93biBhcyBJQmFzZUNvaW47XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG5cbiAgICBhd2FpdCB1dGlscy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgICdjb21tb24ta2V5Y2hhaW4nLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgJ3NhZmUtaWQnXG4gICAgKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzLCBbXSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLnNvdXJjZSwgJ2JpdGdvJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLnNhZmVJZCwgJ3NhZmUtaWQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnNbMF0uZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdCgncm91bmQtdHJpcHMgb3BhcXVlIFZSRiBibG9icyBhbmQga2VlcHMgb25seSB0aGUgcmVjaXBpZW50IHAycCBtZXNzYWdlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBibG9iID0gc2VyaWFsaXplVnJmTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzXSkgfV0sXG4gICAgICBwMnBNZXNzYWdlczogW1xuICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sIHRvOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KFs0XSkgfSxcbiAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCB0bzogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KFs1XSkgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3JVc2VyID0gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhibG9iLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZm9yVXNlci5icm9hZGNhc3RNZXNzYWdlc1swXS5wYXlsb2FkKSwgQnVmZmVyLmZyb20oWzEsIDIsIDNdKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZvclVzZXIucDJwTWVzc2FnZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZm9yVXNlci5wMnBNZXNzYWdlc1swXS50bywgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGZvclVzZXIucDJwTWVzc2FnZXNbMF0ucGF5bG9hZCksIEJ1ZmZlci5mcm9tKFs0XSkpO1xuXG4gICAgY29uc3QgZm9yQmFja3VwID0gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhibG9iLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZvckJhY2t1cC5wMnBNZXNzYWdlcy5sZW5ndGgsIDEpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChmb3JCYWNrdXAucDJwTWVzc2FnZXNbMF0udG8sIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgbWFsZm9ybWVkIFZSRiBES0cgbWVzc2FnZSBibG9icycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMoJyUlJScsIE1QQ3YyUGFydGllc0VudW0uVVNFUiksIC9JbnZhbGlkIFZSRiBES0cgbWVzc2FnZSBibG9iLyk7XG4gICAgY29uc3Qgbm90QW5BcnJheSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgZnJvbTogMCB9KSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhub3RBbkFycmF5LCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpLCAvVlJGIERLRyBtZXNzYWdlIGJsb2IvKTtcbiAgICBjb25zdCBiYWRQYXJ0eSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KFt7IGZyb206IDksIHBheWxvYWQ6IEJ1ZmZlci5mcm9tKFsxXSkudG9TdHJpbmcoJ2Jhc2U2NCcpIH1dKSkudG9TdHJpbmcoXG4gICAgICAnYmFzZTY0J1xuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKGJhZFBhcnR5LCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpLCAvVlJGIERLRyBtZXNzYWdlIGJsb2IvKTtcbiAgfSk7XG59KTtcbiJdfQ==
194
+ describe('EdDSA safe-child MPS derivation', function () {
195
+ let userSigningShare;
196
+ let userVrfShare;
197
+ let bitgoSigningShare;
198
+ let bitgoVrfShare;
199
+ let bitgoPrivateKey;
200
+ let bitgoPublicKey;
201
+ const sessionId = 'derive-session';
202
+ const derivationIndex = 7;
203
+ const path = "m/7'";
204
+ const Request = t.intersection([
205
+ t.type({ enterprise: t.string, type: t.string, curveType: t.string, round: t.string, payload: t.unknown }),
206
+ t.partial({ safeId: t.string }),
207
+ ]);
208
+ before(async function () {
209
+ const signing = await sdk_lib_mpc_1.MPSUtil.generateEdDsaDKGKeyShares();
210
+ const vrf = await sdk_lib_mpc_1.MpsVrfUtils.generateVrfDKGKeyShares();
211
+ userSigningShare = signing[typesMPCv2_1.MPCv2PartiesEnum.USER].getKeyShare();
212
+ bitgoSigningShare = signing[typesMPCv2_1.MPCv2PartiesEnum.BITGO].getKeyShare();
213
+ userVrfShare = vrf[typesMPCv2_1.MPCv2PartiesEnum.USER].getKeyShare();
214
+ bitgoVrfShare = vrf[typesMPCv2_1.MPCv2PartiesEnum.BITGO].getKeyShare();
215
+ const bitgoGpg = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
216
+ bitgoPrivateKey = await pgp.readPrivateKey({ armoredKey: bitgoGpg.privateKey });
217
+ bitgoPublicKey = await pgp.readKey({ armoredKey: bitgoGpg.publicKey });
218
+ });
219
+ async function deriveWithPeer(fault, recordedKeychains) {
220
+ const { bitgo, baseCoin, post, encryptedInputs, addedKeychains } = createKeychainFixture();
221
+ const utils = new eddsaVrfMPCv2_1.EddsaVrfMPCv2Utils(bitgo, baseCoin);
222
+ sinon.stub(utils, 'getBitgoGpgPubkeyBasedOnFeatureFlags').resolves({
223
+ mpcv2PublicKey: bitgoPublicKey,
224
+ eddsaMpcv2PublicKey: bitgoPublicKey,
225
+ redpallasMpcv2PublicKey: undefined,
226
+ });
227
+ const bitgoPeer = new sdk_lib_mpc_1.MpsDerive.Derive(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BITGO, bitgoSigningShare, bitgoVrfShare, path);
228
+ let bitgoMsg2;
229
+ let userGpgPublicKey = '';
230
+ let rounds = 0;
231
+ post.callsFake((_url) => ({
232
+ send: (rawBody) => ({
233
+ result: async () => {
234
+ const body = (0, codecs_1.decodeWithCodec)(Request, rawBody, 'EdDSA derive request');
235
+ assert_1.default.strictEqual(_url, '/mpc/generatekey');
236
+ assert_1.default.strictEqual(body.enterprise, 'enterprise-id');
237
+ assert_1.default.strictEqual(body.type, public_types_1.KeyGenTypeEnum.MPCv2);
238
+ assert_1.default.strictEqual(body.curveType, public_types_1.KeyCurveEnum.EdDSA);
239
+ if (rounds++ === 0) {
240
+ assert_1.default.strictEqual(body.round, public_types_1.MPCv2KeyGenStateEnum['MPCv2Derive-R1']);
241
+ assert_1.default.strictEqual(body.safeId, 'safe-id');
242
+ const request = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2DeriveRound1Request, body.payload, 'EdDSA derive round 1');
243
+ assert_1.default.deepStrictEqual(Object.keys(request).sort(), [
244
+ 'derivationIndex',
245
+ 'parentKeyId',
246
+ 'userGpgPublicKey',
247
+ 'userMsg1',
248
+ ]);
249
+ assert_1.default.strictEqual(request.parentKeyId, 'bitgo-root-id');
250
+ assert_1.default.strictEqual(request.derivationIndex, derivationIndex);
251
+ userGpgPublicKey = request.userGpgPublicKey;
252
+ const userGpgKey = await pgp.readKey({ armoredKey: request.userGpgPublicKey });
253
+ const userPayload = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(request.userMsg1, userGpgKey);
254
+ const bitgoFirst = await bitgoPeer.initDerive();
255
+ const [outgoing] = bitgoPeer.handleIncomingMessages([
256
+ { from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userPayload) },
257
+ ]);
258
+ assert_1.default.ok(outgoing);
259
+ bitgoMsg2 = outgoing.payload;
260
+ const signed = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(bitgoFirst.payload), bitgoPrivateKey);
261
+ return {
262
+ sessionId,
263
+ bitgoMsg1: fault === 'r1-signature' ? { ...signed, message: Buffer.from('tampered').toString('base64') } : signed,
264
+ };
265
+ }
266
+ assert_1.default.strictEqual(rounds, 2);
267
+ assert_1.default.strictEqual(body.round, public_types_1.MPCv2KeyGenStateEnum['MPCv2Derive-R2']);
268
+ assert_1.default.strictEqual(body.safeId, 'safe-id');
269
+ const request = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2DeriveRound2Request, body.payload, 'EdDSA derive round 2');
270
+ assert_1.default.deepStrictEqual(Object.keys(request).sort(), ['sessionId', 'userMsg2']);
271
+ assert_1.default.strictEqual(request.sessionId, sessionId);
272
+ const userPayload = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(request.userMsg2, await pgp.readKey({ armoredKey: userGpgPublicKey }));
273
+ assert_1.default.deepStrictEqual(bitgoPeer.handleIncomingMessages([{ from: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array(userPayload) }]), []);
274
+ assert_1.default.ok(bitgoMsg2);
275
+ const signed = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(bitgoMsg2), bitgoPrivateKey);
276
+ const commonPublicKeychain = bitgoPeer.getCommonKeychain();
277
+ return {
278
+ sessionId: fault === 'session' ? 'different-session' : sessionId,
279
+ commonPublicKeychain: fault === 'commonKeychain'
280
+ ? `${commonPublicKeychain.slice(0, -1)}${commonPublicKeychain.endsWith('0') ? '1' : '0'}`
281
+ : commonPublicKeychain,
282
+ bitgoMsg2: fault === 'r2-signature' ? { ...signed, message: Buffer.from('tampered').toString('base64') } : signed,
283
+ };
284
+ },
285
+ }),
286
+ }));
287
+ try {
288
+ const result = await utils.createSafeChildKeychains({
289
+ passphrase: 'passphrase',
290
+ enterprise: 'enterprise-id',
291
+ safeId: 'safe-id',
292
+ parentKeyId: 'bitgo-root-id',
293
+ derivationIndex,
294
+ userRootKeyId: 'user-root-id',
295
+ backupRootKeyId: 'backup-root-id',
296
+ userRootKeyShare: userSigningShare,
297
+ userRootVrfKeyShare: userVrfShare,
298
+ });
299
+ return { result, encryptedInputs, addedKeychains, bitgoPeer, rounds };
300
+ }
301
+ finally {
302
+ recordedKeychains?.push(...addedKeychains);
303
+ }
304
+ }
305
+ afterEach(function () {
306
+ sinon.restore();
307
+ });
308
+ it('registers the child signing share and two public-only placeholders after the signed ceremony', async function () {
309
+ const { result, encryptedInputs, addedKeychains, bitgoPeer, rounds } = await deriveWithPeer();
310
+ assert_1.default.strictEqual(rounds, 2);
311
+ assert_1.default.deepStrictEqual(addedKeychains.map(({ source }) => source).sort(), ['backup', 'bitgo', 'user']);
312
+ assert_1.default.deepStrictEqual([result.userKeychain.id, result.backupKeychain.id, result.bitgoKeychain.id], ['user-child', 'backup-child', 'bitgo-child']);
313
+ for (const keychain of addedKeychains) {
314
+ assert_1.default.strictEqual(keychain.safeId, 'safe-id');
315
+ assert_1.default.strictEqual(keychain.derivedFromParentWithPath, path);
316
+ assert_1.default.strictEqual(keychain.commonKeychain, bitgoPeer.getCommonKeychain());
317
+ assert_1.default.strictEqual(keychain.keyType, 'tss');
318
+ assert_1.default.strictEqual(keychain.isMPCv2, true);
319
+ }
320
+ const userChild = addedKeychains.find(({ source }) => source === 'user');
321
+ const backupChild = addedKeychains.find(({ source }) => source === 'backup');
322
+ const bitgoChild = addedKeychains.find(({ source }) => source === 'bitgo');
323
+ assert_1.default.ok(userChild);
324
+ assert_1.default.ok(backupChild);
325
+ assert_1.default.ok(bitgoChild);
326
+ assert_1.default.strictEqual(userChild.parent, 'user-root-id');
327
+ assert_1.default.strictEqual(backupChild.parent, 'backup-root-id');
328
+ assert_1.default.strictEqual(bitgoChild.parent, 'bitgo-root-id');
329
+ assert_1.default.strictEqual(encryptedInputs.length, 2);
330
+ assert_1.default.strictEqual(userChild.encryptedPrv, `encrypted:${encryptedInputs[0]}`);
331
+ const signingShare = Buffer.from(result.userKeychain.encryptedPrv?.slice('encrypted:'.length) ?? '', 'base64');
332
+ assert_1.default.deepStrictEqual(signingShare, Buffer.from(encryptedInputs[0], 'base64'));
333
+ assert_1.default.notDeepStrictEqual(signingShare, userSigningShare);
334
+ assert_1.default.notDeepStrictEqual(signingShare, bitgoPeer.getKeyShare());
335
+ assert_1.default.strictEqual(userChild.reducedEncryptedPrv, undefined);
336
+ const reduced = result.userKeychain.reducedEncryptedPrv;
337
+ assert_1.default.ok(reduced);
338
+ const reducedShare = sdk_lib_mpc_1.MPSTypes.getDecodedReducedKeyShare(Buffer.from(reduced.slice('encrypted:'.length), 'base64'));
339
+ assert_1.default.deepStrictEqual(Buffer.from(reducedShare.keyShare), signingShare);
340
+ assert_1.default.strictEqual(Buffer.from(reducedShare.pub).toString('hex'), bitgoPeer.getCommonKeychain().slice(0, 64));
341
+ assert_1.default.throws(() => decodeVrfEnvelope(signingShare));
342
+ assert_1.default.strictEqual(backupChild.encryptedPrv, undefined);
343
+ assert_1.default.strictEqual(bitgoChild.encryptedPrv, undefined);
344
+ });
345
+ it('rejects indexes outside the hardened Safe range before contacting WP', async function () {
346
+ const { bitgo, baseCoin, post, addedKeychains } = createKeychainFixture();
347
+ const utils = new eddsaVrfMPCv2_1.EddsaVrfMPCv2Utils(bitgo, baseCoin);
348
+ await assert_1.default.rejects(utils.createSafeChildKeychains({
349
+ passphrase: 'passphrase',
350
+ enterprise: 'enterprise-id',
351
+ safeId: 'safe-id',
352
+ parentKeyId: 'bitgo-root-id',
353
+ derivationIndex: 0x80000000,
354
+ userRootKeyId: 'user-root-id',
355
+ backupRootKeyId: 'backup-root-id',
356
+ userRootKeyShare: userSigningShare,
357
+ userRootVrfKeyShare: userVrfShare,
358
+ }), /derivedFromParentWithPath/);
359
+ assert_1.default.strictEqual(post.called, false);
360
+ assert_1.default.deepStrictEqual(addedKeychains, []);
361
+ });
362
+ const faults = [
363
+ 'r1-signature',
364
+ 'r2-signature',
365
+ 'session',
366
+ 'commonKeychain',
367
+ ];
368
+ for (const fault of faults) {
369
+ it(`rejects ${fault} before registering any child`, async function () {
370
+ const recordedKeychains = [];
371
+ await assert_1.default.rejects(() => deriveWithPeer(fault, recordedKeychains), fault === 'session'
372
+ ? /session id/i
373
+ : fault === 'commonKeychain'
374
+ ? /common keychain/i
375
+ : /signature|verification|signed/i);
376
+ assert_1.default.deepStrictEqual(recordedKeychains, []);
377
+ });
378
+ }
379
+ });
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw2Q0FBK0I7QUFDL0IsNkNBQStCO0FBQy9CLHlEQUE4RjtBQUM5RixzREFNNkI7QUFDN0IsbUNBQWdDO0FBQ2hDLHlDQUEyQjtBQUUzQiwrQ0FBd0Y7QUFDeEYscUVBQTJFO0FBQzNFLDZGQUFrRztBQUNsRyw2RkFJbUU7QUFDbkUsdUZBQTBGO0FBQzFGLGlGQUFvRjtBQUVwRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ2hDLFlBQVksRUFDWixDQUFDLEtBQUssRUFBdUIsRUFBRSxDQUFDLEtBQUssWUFBWSxVQUFVLEVBQzNELENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUNoRyxDQUFDLENBQUMsUUFBUSxDQUNYLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNyQixXQUFXLEVBQUUsZUFBZTtJQUM1QixHQUFHLEVBQUUsZUFBZTtDQUNyQixDQUFDLENBQUM7QUFjSCxTQUFTLGlCQUFpQixDQUFDLE9BQWU7SUFDeEMsT0FBTyxJQUFBLHdCQUFlLEVBQUMsV0FBVyxFQUFFLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFF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QU0sRUFBRSxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxXQUFXLEtBQUssK0JBQStCLEVBQUUsS0FBSztZQUN2RCxNQUFNLGlCQUFpQixHQUEwQixFQUFFLENBQUM7WUFDcEQsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxFQUM5QyxLQUFLLEtBQUssU0FBUztnQkFDakIsQ0FBQyxDQUFDLGFBQWE7Z0JBQ2YsQ0FBQyxDQUFDLEtBQUssS0FBSyxnQkFBZ0I7b0JBQzVCLENBQUMsQ0FBQyxrQkFBa0I7b0JBQ3BCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FDckMsQ0FBQztZQUNGLGdCQUFNLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgcGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgTVBTQ29tbXMsIE1QU1V0aWwsIE1QU1R5cGVzLCBNcHNEZXJpdmUsIE1wc1ZyZlV0aWxzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgRWRkc2FNUEN2MkRlcml2ZVJvdW5kMVJlcXVlc3QsXG4gIEVkZHNhTVBDdjJEZXJpdmVSb3VuZDJSZXF1ZXN0LFxuICBLZXlDdXJ2ZUVudW0sXG4gIEtleUdlblR5cGVFbnVtLFxuICBNUEN2MktleUdlblN0YXRlRW51bSxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmltcG9ydCB7IEVkZHNhTVBDdjJVdGlscywgQml0R29CYXNlLCBJQmFzZUNvaW4sIEtleWNoYWluIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy9jb2RlY3MnO1xuaW1wb3J0IHsgYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9rZXlTaGFyZUVudmVsb3BlJztcbmltcG9ydCB7XG4gIEVkZHNhVnJmTVBDdjJVdGlscyxcbiAgZGVzZXJpYWxpemVWcmZNZXNzYWdlcyxcbiAgc2VyaWFsaXplVnJmTWVzc2FnZXMsXG59IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mic7XG5pbXBvcnQgeyBNUEN2MlBhcnRpZXNFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9lY2RzYS90eXBlc01QQ3YyJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy9vcGVuZ3BnVXRpbHMnO1xuXG5jb25zdCBVaW50OEFycmF5Q29kZWMgPSBuZXcgdC5UeXBlPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXksIHVua25vd24+KFxuICAnVWludDhBcnJheScsXG4gICh2YWx1ZSk6IHZhbHVlIGlzIFVpbnQ4QXJyYXkgPT4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAodmFsdWUsIGNvbnRleHQpID0+ICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyB0LnN1Y2Nlc3ModmFsdWUpIDogdC5mYWlsdXJlKHZhbHVlLCBjb250ZXh0KSksXG4gIHQuaWRlbnRpdHlcbik7XG5cbmNvbnN0IFZyZkVudmVsb3BlID0gdC50eXBlKHtcbiAgdmVyc2lvbjogdC5saXRlcmFsKDEpLFxuICBwcnZLZXlTaGFyZTogVWludDhBcnJheUNvZGVjLFxuICB2cmY6IFVpbnQ4QXJyYXlDb2RlYyxcbn0pO1xuXG50eXBlIEFkZGVkS2V5Y2hhaW5QYXJhbXMgPSB7XG4gIHNvdXJjZT86IHN0cmluZztcbiAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICByZWR1Y2VkRW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICBzYWZlSWQ/OiBzdHJpbmc7XG4gIHBhcmVudD86IHN0cmluZztcbiAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aD86IHN0cmluZztcbiAgY29tbW9uS2V5Y2hhaW4/OiBzdHJpbmc7XG4gIGlzTVBDdjI/OiBib29sZWFuO1xuICBrZXlUeXBlPzogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlVnJmRW52ZWxvcGUoZW5jb2RlZDogQnVmZmVyKTogdC5UeXBlT2Y8dHlwZW9mIFZyZkVudmVsb3BlPiB7XG4gIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoVnJmRW52ZWxvcGUsIGRlY29kZShlbmNvZGVkKSwgJ1ZSRiBrZXkgZW52ZWxvcGUnKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCkge1xuICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFkZGVkS2V5Y2hhaW5zOiBBZGRlZEtleWNoYWluUGFyYW1zW10gPSBbXTtcbiAgY29uc3QgcG9zdCA9IHNpbm9uLnN0dWIoKTtcbiAgY29uc3QgYml0Z28gPSB7XG4gICAgZ2V0RW52OiAoKSA9PiAnZGV2JyxcbiAgICB1cmw6IChwYXRoOiBzdHJpbmcpID0+IHBhdGgsXG4gICAgcG9zdCxcbiAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgcmV0dXJuIGBlbmNyeXB0ZWQ6JHtwYXJhbXMuaW5wdXR9YDtcbiAgICB9LFxuICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICBjb25zdCBrZXljaGFpbnMgPSB7XG4gICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgcmV0dXJuIHsgaWQ6IGAke3BhcmFtcy5zb3VyY2V9LWNoaWxkYCwgdHlwZTogJ3RzcycsIGVuY3J5cHRlZFBydjogcGFyYW1zLmVuY3J5cHRlZFBydiB9O1xuICAgIH0sXG4gIH07XG4gIGNvbnN0IGJhc2VDb2luID0ge1xuICAgIGtleWNoYWluczogKCkgPT4ga2V5Y2hhaW5zLFxuICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICByZXR1cm4geyBiaXRnbywgYmFzZUNvaW4sIHBvc3QsIGVuY3J5cHRlZElucHV0cywgYWRkZWRLZXljaGFpbnMgfTtcbn1cblxuZGVzY3JpYmUoJ0VkRFNBIE1QQ3YyIFZSRiByb290IG1hdGVyaWFsJywgZnVuY3Rpb24gKCkge1xuICBpdCgnZW5jb2RlcyBzaWduaW5nIGFuZCBWUkYgc2hhcmVzIGluIGJvdGggZnVsbCBhbmQgcmVkdWNlZCBlbnZlbG9wZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3NpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpO1xuICAgIGNvbnN0IHZyZktleVNoYXJlID0gQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpO1xuXG4gICAgY29uc3QgeyBlbnZlbG9wZSwgcmVkdWNlZEVudmVsb3BlIH0gPSBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMoXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgdnJmS2V5U2hhcmVcbiAgICApO1xuICAgIGNvbnN0IGRlY29kZWRFbnZlbG9wZSA9IGRlY29kZVZyZkVudmVsb3BlKGVudmVsb3BlKTtcbiAgICBjb25zdCBkZWNvZGVkUmVkdWNlZEVudmVsb3BlID0gZGVjb2RlVnJmRW52ZWxvcGUocmVkdWNlZEVudmVsb3BlKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZEVudmVsb3BlLnBydktleVNoYXJlKSwgcHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWRFbnZlbG9wZS52cmYpLCB2cmZLZXlTaGFyZSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkUmVkdWNlZEVudmVsb3BlLnBydktleVNoYXJlKSwgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkUmVkdWNlZEVudmVsb3BlLnZyZiksIHZyZktleVNoYXJlKTtcbiAgfSk7XG5cbiAgaXQoJ2tlZXBzIG9yZGluYXJ5IE1QQ3YyIHBhcnRpY2lwYW50IG1hdGVyaWFsIGFzIGJhcmUgYmFzZTY0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH0gPSBjcmVhdGVLZXljaGFpbkZpeHR1cmUoKTtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICBjb25zdCBwcml2YXRlTWF0ZXJpYWwgPSBCdWZmZXIuZnJvbSgnc2lnbmluZy1zaGFyZScpO1xuICAgIGNvbnN0IHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSBCdWZmZXIuZnJvbSgncmVkdWNlZC1zaWduaW5nLXNoYXJlJyk7XG5cbiAgICBhd2FpdCB1dGlscy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgJ2NvbW1vbi1rZXljaGFpbicsXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgJ3Bhc3NwaHJhc2UnXG4gICAgKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzLCBbXG4gICAgICBwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0JyksXG4gICAgXSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiwgYGVuY3J5cHRlZDoke3ByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0Jyl9YCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLnNhZmVJZCwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSBwdWJsaWMtb25seSBiYWNrdXAgb3V0c2lkZSBhIHNhZmUgY2hpbGQgZGVyaXZhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IGJpdGdvLCBiYXNlQ29pbiwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsICdjb21tb24ta2V5Y2hhaW4nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3Bhc3NwaHJhc2UnKSxcbiAgICAgIC9Qcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciBiYWNrdXAga2V5Y2hhaW4vXG4gICAgKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW10pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYWRkZWRLZXljaGFpbnMsIFtdKTtcbiAgfSk7XG5cbiAgaXQoJ2VuY3J5cHRzIHRoZSBWUkYgZW52ZWxvcGUgYW5kIHRhZ3MgdGhlIGtleWNoYWluIHdpdGggc2FmZUlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVuY3J5cHRlZElucHV0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhZGRlZEtleWNoYWluczogQWRkZWRLZXljaGFpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgYml0Z28gPSB7XG4gICAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGVuY3J5cHRlZElucHV0cy5wdXNoKHBhcmFtcy5pbnB1dCk7XG4gICAgICAgIHJldHVybiBgZW5jcnlwdGVkOiR7cGFyYW1zLmlucHV0fWA7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBhZGRlZEtleWNoYWlucy5wdXNoKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiB7IGlkOiAndXNlci1rZXknIH0gYXMgdW5rbm93biBhcyBLZXljaGFpbjtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogKCkgPT4ga2V5Y2hhaW5zLFxuICAgIH0gYXMgdW5rbm93biBhcyBJQmFzZUNvaW47XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG4gICAgY29uc3QgeyBlbnZlbG9wZSwgcmVkdWNlZEVudmVsb3BlIH0gPSBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMoXG4gICAgICBCdWZmZXIuZnJvbSgnc2lnbmluZy1zaGFyZScpLFxuICAgICAgQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpLFxuICAgICAgQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpXG4gICAgKTtcblxuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAnY29tbW9uLWtleWNoYWluJyxcbiAgICAgIGVudmVsb3BlLFxuICAgICAgcmVkdWNlZEVudmVsb3BlLFxuICAgICAgJ3Bhc3NwaHJhc2UnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgJ3NhZmUtaWQnXG4gICAgKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzWzBdLCBlbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVZyZkVudmVsb3BlKEJ1ZmZlci5mcm9tKGVuY3J5cHRlZElucHV0c1swXSwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWQudnJmKSwgQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpKTtcbiAgfSk7XG5cbiAgaXQoJ3RhZ3MgdGhlIEJpdEdvIGtleWNoYWluIHdpdGggc2FmZUlkIGFuZCBkb2VzIG5vdCBlbmNyeXB0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVuY3J5cHRlZElucHV0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhZGRlZEtleWNoYWluczogQWRkZWRLZXljaGFpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgYml0Z28gPSB7XG4gICAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGVuY3J5cHRlZElucHV0cy5wdXNoKHBhcmFtcy5pbnB1dCk7XG4gICAgICAgIHJldHVybiBgZW5jcnlwdGVkOiR7cGFyYW1zLmlucHV0fWA7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBhZGRlZEtleWNoYWlucy5wdXNoKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiB7IGlkOiAnYml0Z28ta2V5JyB9IGFzIHVua25vd24gYXMgS2V5Y2hhaW47XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAnY29tbW9uLWtleWNoYWluJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgICdzYWZlLWlkJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW10pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zb3VyY2UsICdiaXRnbycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXRyaXBzIG9wYXF1ZSBWUkYgYmxvYnMgYW5kIGtlZXBzIG9ubHkgdGhlIHJlY2lwaWVudCBwMnAgbWVzc2FnZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmxvYiA9IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbMSwgMiwgM10pIH1dLFxuICAgICAgcDJwTWVzc2FnZXM6IFtcbiAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCB0bzogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbNF0pIH0sXG4gICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTywgdG86IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbNV0pIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9yVXNlciA9IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMoYmxvYiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGZvclVzZXIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCksIEJ1ZmZlci5mcm9tKFsxLCAyLCAzXSkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChmb3JVc2VyLnAycE1lc3NhZ2VzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZvclVzZXIucDJwTWVzc2FnZXNbMF0udG8sIE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShmb3JVc2VyLnAycE1lc3NhZ2VzWzBdLnBheWxvYWQpLCBCdWZmZXIuZnJvbShbNF0pKTtcblxuICAgIGNvbnN0IGZvckJhY2t1cCA9IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMoYmxvYiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChmb3JCYWNrdXAucDJwTWVzc2FnZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZm9yQmFja3VwLnAycE1lc3NhZ2VzWzBdLnRvLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIG1hbGZvcm1lZCBWUkYgREtHIG1lc3NhZ2UgYmxvYnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKCclJSUnLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpLCAvSW52YWxpZCBWUkYgREtHIG1lc3NhZ2UgYmxvYi8pO1xuICAgIGNvbnN0IG5vdEFuQXJyYXkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGZyb206IDAgfSkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMobm90QW5BcnJheSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSwgL1ZSRiBES0cgbWVzc2FnZSBibG9iLyk7XG4gICAgY29uc3QgYmFkUGFydHkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShbeyBmcm9tOiA5LCBwYXlsb2FkOiBCdWZmZXIuZnJvbShbMV0pLnRvU3RyaW5nKCdiYXNlNjQnKSB9XSkpLnRvU3RyaW5nKFxuICAgICAgJ2Jhc2U2NCdcbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiYWRQYXJ0eSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSwgL1ZSRiBES0cgbWVzc2FnZSBibG9iLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdFZERTQSBzYWZlLWNoaWxkIE1QUyBkZXJpdmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgdXNlclNpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgdXNlclZyZlNoYXJlOiBCdWZmZXI7XG4gIGxldCBiaXRnb1NpZ25pbmdTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29WcmZTaGFyZTogQnVmZmVyO1xuICBsZXQgYml0Z29Qcml2YXRlS2V5OiBwZ3AuUHJpdmF0ZUtleTtcbiAgbGV0IGJpdGdvUHVibGljS2V5OiBwZ3AuS2V5O1xuXG4gIGNvbnN0IHNlc3Npb25JZCA9ICdkZXJpdmUtc2Vzc2lvbic7XG4gIGNvbnN0IGRlcml2YXRpb25JbmRleCA9IDc7XG4gIGNvbnN0IHBhdGggPSBcIm0vNydcIjtcbiAgY29uc3QgUmVxdWVzdCA9IHQuaW50ZXJzZWN0aW9uKFtcbiAgICB0LnR5cGUoeyBlbnRlcnByaXNlOiB0LnN0cmluZywgdHlwZTogdC5zdHJpbmcsIGN1cnZlVHlwZTogdC5zdHJpbmcsIHJvdW5kOiB0LnN0cmluZywgcGF5bG9hZDogdC51bmtub3duIH0pLFxuICAgIHQucGFydGlhbCh7IHNhZmVJZDogdC5zdHJpbmcgfSksXG4gIF0pO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2lnbmluZyA9IGF3YWl0IE1QU1V0aWwuZ2VuZXJhdGVFZERzYURLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IHZyZiA9IGF3YWl0IE1wc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgdXNlclNpZ25pbmdTaGFyZSA9IHNpZ25pbmdbTVBDdjJQYXJ0aWVzRW51bS5VU0VSXS5nZXRLZXlTaGFyZSgpO1xuICAgIGJpdGdvU2lnbmluZ1NoYXJlID0gc2lnbmluZ1tNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXS5nZXRLZXlTaGFyZSgpO1xuICAgIHVzZXJWcmZTaGFyZSA9IHZyZltNUEN2MlBhcnRpZXNFbnVtLlVTRVJdLmdldEtleVNoYXJlKCk7XG4gICAgYml0Z29WcmZTaGFyZSA9IHZyZltNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXS5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJpdGdvR3BnID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgYml0Z29Qcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGcucHJpdmF0ZUtleSB9KTtcbiAgICBiaXRnb1B1YmxpY0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29HcGcucHVibGljS2V5IH0pO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBkZXJpdmVXaXRoUGVlcihcbiAgICBmYXVsdD86ICdyMS1zaWduYXR1cmUnIHwgJ3IyLXNpZ25hdHVyZScgfCAnc2Vzc2lvbicgfCAnY29tbW9uS2V5Y2hhaW4nLFxuICAgIHJlY29yZGVkS2V5Y2hhaW5zPzogQWRkZWRLZXljaGFpblBhcmFtc1tdXG4gICkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zIH0gPSBjcmVhdGVLZXljaGFpbkZpeHR1cmUoKTtcbiAgICBjb25zdCB1dGlscyA9IG5ldyBFZGRzYVZyZk1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luKTtcbiAgICBzaW5vbi5zdHViKHV0aWxzLCAnZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzJykucmVzb2x2ZXMoe1xuICAgICAgbXBjdjJQdWJsaWNLZXk6IGJpdGdvUHVibGljS2V5LFxuICAgICAgZWRkc2FNcGN2MlB1YmxpY0tleTogYml0Z29QdWJsaWNLZXksXG4gICAgICByZWRwYWxsYXNNcGN2MlB1YmxpY0tleTogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvUGVlciA9IG5ldyBNcHNEZXJpdmUuRGVyaXZlKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQklUR08sIGJpdGdvU2lnbmluZ1NoYXJlLCBiaXRnb1ZyZlNoYXJlLCBwYXRoKTtcbiAgICBsZXQgYml0Z29Nc2cyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIGxldCB1c2VyR3BnUHVibGljS2V5ID0gJyc7XG4gICAgbGV0IHJvdW5kcyA9IDA7XG4gICAgcG9zdC5jYWxsc0Zha2UoKF91cmw6IHN0cmluZykgPT4gKHtcbiAgICAgIHNlbmQ6IChyYXdCb2R5OiB1bmtub3duKSA9PiAoe1xuICAgICAgICByZXN1bHQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gZGVjb2RlV2l0aENvZGVjKFJlcXVlc3QsIHJhd0JvZHksICdFZERTQSBkZXJpdmUgcmVxdWVzdCcpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChfdXJsLCAnL21wYy9nZW5lcmF0ZWtleScpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmVudGVycHJpc2UsICdlbnRlcnByaXNlLWlkJyk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkudHlwZSwgS2V5R2VuVHlwZUVudW0uTVBDdjIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LmN1cnZlVHlwZSwgS2V5Q3VydmVFbnVtLkVkRFNBKTtcbiAgICAgICAgICBpZiAocm91bmRzKysgPT09IDApIHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjJEZXJpdmUtUjEnXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gZGVjb2RlV2l0aENvZGVjKEVkZHNhTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0LCBib2R5LnBheWxvYWQsICdFZERTQSBkZXJpdmUgcm91bmQgMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChPYmplY3Qua2V5cyhyZXF1ZXN0KS5zb3J0KCksIFtcbiAgICAgICAgICAgICAgJ2Rlcml2YXRpb25JbmRleCcsXG4gICAgICAgICAgICAgICdwYXJlbnRLZXlJZCcsXG4gICAgICAgICAgICAgICd1c2VyR3BnUHVibGljS2V5JyxcbiAgICAgICAgICAgICAgJ3VzZXJNc2cxJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcXVlc3QucGFyZW50S2V5SWQsICdiaXRnby1yb290LWlkJyk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVxdWVzdC5kZXJpdmF0aW9uSW5kZXgsIGRlcml2YXRpb25JbmRleCk7XG4gICAgICAgICAgICB1c2VyR3BnUHVibGljS2V5ID0gcmVxdWVzdC51c2VyR3BnUHVibGljS2V5O1xuICAgICAgICAgICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcmVxdWVzdC51c2VyR3BnUHVibGljS2V5IH0pO1xuICAgICAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHJlcXVlc3QudXNlck1zZzEsIHVzZXJHcGdLZXkpO1xuICAgICAgICAgICAgY29uc3QgYml0Z29GaXJzdCA9IGF3YWl0IGJpdGdvUGVlci5pbml0RGVyaXZlKCk7XG4gICAgICAgICAgICBjb25zdCBbb3V0Z29pbmddID0gYml0Z29QZWVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW1xuICAgICAgICAgICAgICB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkodXNlclBheWxvYWQpIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGFzc2VydC5vayhvdXRnb2luZyk7XG4gICAgICAgICAgICBiaXRnb01zZzIgPSBvdXRnb2luZy5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmVkID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYml0Z29GaXJzdC5wYXlsb2FkKSwgYml0Z29Qcml2YXRlS2V5KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgYml0Z29Nc2cxOlxuICAgICAgICAgICAgICAgIGZhdWx0ID09PSAncjEtc2lnbmF0dXJlJyA/IHsgLi4uc2lnbmVkLCBtZXNzYWdlOiBCdWZmZXIuZnJvbSgndGFtcGVyZWQnKS50b1N0cmluZygnYmFzZTY0JykgfSA6IHNpZ25lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyb3VuZHMsIDIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChib2R5LnJvdW5kLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjJEZXJpdmUtUjInXSk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJvZHkuc2FmZUlkLCAnc2FmZS1pZCcpO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBkZWNvZGVXaXRoQ29kZWMoRWRkc2FNUEN2MkRlcml2ZVJvdW5kMlJlcXVlc3QsIGJvZHkucGF5bG9hZCwgJ0VkRFNBIGRlcml2ZSByb3VuZCAyJyk7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChPYmplY3Qua2V5cyhyZXF1ZXN0KS5zb3J0KCksIFsnc2Vzc2lvbklkJywgJ3VzZXJNc2cyJ10pO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXF1ZXN0LnNlc3Npb25JZCwgc2Vzc2lvbklkKTtcbiAgICAgICAgICBjb25zdCB1c2VyUGF5bG9hZCA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UoXG4gICAgICAgICAgICByZXF1ZXN0LnVzZXJNc2cyLFxuICAgICAgICAgICAgYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnUHVibGljS2V5IH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgICAgYml0Z29QZWVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3sgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheSh1c2VyUGF5bG9hZCkgfV0pLFxuICAgICAgICAgICAgW11cbiAgICAgICAgICApO1xuICAgICAgICAgIGFzc2VydC5vayhiaXRnb01zZzIpO1xuICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJpdGdvTXNnMiksIGJpdGdvUHJpdmF0ZUtleSk7XG4gICAgICAgICAgY29uc3QgY29tbW9uUHVibGljS2V5Y2hhaW4gPSBiaXRnb1BlZXIuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBmYXVsdCA9PT0gJ3Nlc3Npb24nID8gJ2RpZmZlcmVudC1zZXNzaW9uJyA6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluOlxuICAgICAgICAgICAgICBmYXVsdCA9PT0gJ2NvbW1vbktleWNoYWluJ1xuICAgICAgICAgICAgICAgID8gYCR7Y29tbW9uUHVibGljS2V5Y2hhaW4uc2xpY2UoMCwgLTEpfSR7Y29tbW9uUHVibGljS2V5Y2hhaW4uZW5kc1dpdGgoJzAnKSA/ICcxJyA6ICcwJ31gXG4gICAgICAgICAgICAgICAgOiBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICAgICAgIGJpdGdvTXNnMjpcbiAgICAgICAgICAgICAgZmF1bHQgPT09ICdyMi1zaWduYXR1cmUnID8geyAuLi5zaWduZWQsIG1lc3NhZ2U6IEJ1ZmZlci5mcm9tKCd0YW1wZXJlZCcpLnRvU3RyaW5nKCdiYXNlNjQnKSB9IDogc2lnbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXRpbHMuY3JlYXRlU2FmZUNoaWxkS2V5Y2hhaW5zKHtcbiAgICAgICAgcGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBlbnRlcnByaXNlOiAnZW50ZXJwcmlzZS1pZCcsXG4gICAgICAgIHNhZmVJZDogJ3NhZmUtaWQnLFxuICAgICAgICBwYXJlbnRLZXlJZDogJ2JpdGdvLXJvb3QtaWQnLFxuICAgICAgICBkZXJpdmF0aW9uSW5kZXgsXG4gICAgICAgIHVzZXJSb290S2V5SWQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICBiYWNrdXBSb290S2V5SWQ6ICdiYWNrdXAtcm9vdC1pZCcsXG4gICAgICAgIHVzZXJSb290S2V5U2hhcmU6IHVzZXJTaWduaW5nU2hhcmUsXG4gICAgICAgIHVzZXJSb290VnJmS2V5U2hhcmU6IHVzZXJWcmZTaGFyZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgcmVzdWx0LCBlbmNyeXB0ZWRJbnB1dHMsIGFkZGVkS2V5Y2hhaW5zLCBiaXRnb1BlZXIsIHJvdW5kcyB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRlZEtleWNoYWlucz8ucHVzaCguLi5hZGRlZEtleWNoYWlucyk7XG4gICAgfVxuICB9XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdyZWdpc3RlcnMgdGhlIGNoaWxkIHNpZ25pbmcgc2hhcmUgYW5kIHR3byBwdWJsaWMtb25seSBwbGFjZWhvbGRlcnMgYWZ0ZXIgdGhlIHNpZ25lZCBjZXJlbW9ueScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IHJlc3VsdCwgZW5jcnlwdGVkSW5wdXRzLCBhZGRlZEtleWNoYWlucywgYml0Z29QZWVyLCByb3VuZHMgfSA9IGF3YWl0IGRlcml2ZVdpdGhQZWVyKCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJvdW5kcywgMik7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRlZEtleWNoYWlucy5tYXAoKHsgc291cmNlIH0pID0+IHNvdXJjZSkuc29ydCgpLCBbJ2JhY2t1cCcsICdiaXRnbycsICd1c2VyJ10pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICBbcmVzdWx0LnVzZXJLZXljaGFpbi5pZCwgcmVzdWx0LmJhY2t1cEtleWNoYWluLmlkLCByZXN1bHQuYml0Z29LZXljaGFpbi5pZF0sXG4gICAgICBbJ3VzZXItY2hpbGQnLCAnYmFja3VwLWNoaWxkJywgJ2JpdGdvLWNoaWxkJ11cbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5Y2hhaW4gb2YgYWRkZWRLZXljaGFpbnMpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCwgcGF0aCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sIGJpdGdvUGVlci5nZXRDb21tb25LZXljaGFpbigpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChrZXljaGFpbi5rZXlUeXBlLCAndHNzJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5Y2hhaW4uaXNNUEN2MiwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJDaGlsZCA9IGFkZGVkS2V5Y2hhaW5zLmZpbmQoKHsgc291cmNlIH0pID0+IHNvdXJjZSA9PT0gJ3VzZXInKTtcbiAgICBjb25zdCBiYWNrdXBDaGlsZCA9IGFkZGVkS2V5Y2hhaW5zLmZpbmQoKHsgc291cmNlIH0pID0+IHNvdXJjZSA9PT0gJ2JhY2t1cCcpO1xuICAgIGNvbnN0IGJpdGdvQ2hpbGQgPSBhZGRlZEtleWNoYWlucy5maW5kKCh7IHNvdXJjZSB9KSA9PiBzb3VyY2UgPT09ICdiaXRnbycpO1xuICAgIGFzc2VydC5vayh1c2VyQ2hpbGQpO1xuICAgIGFzc2VydC5vayhiYWNrdXBDaGlsZCk7XG4gICAgYXNzZXJ0Lm9rKGJpdGdvQ2hpbGQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2hpbGQucGFyZW50LCAndXNlci1yb290LWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhY2t1cENoaWxkLnBhcmVudCwgJ2JhY2t1cC1yb290LWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJpdGdvQ2hpbGQucGFyZW50LCAnYml0Z28tcm9vdC1pZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0ZWRJbnB1dHMubGVuZ3RoLCAyKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodXNlckNoaWxkLmVuY3J5cHRlZFBydiwgYGVuY3J5cHRlZDoke2VuY3J5cHRlZElucHV0c1swXX1gKTtcbiAgICBjb25zdCBzaWduaW5nU2hhcmUgPSBCdWZmZXIuZnJvbShyZXN1bHQudXNlcktleWNoYWluLmVuY3J5cHRlZFBydj8uc2xpY2UoJ2VuY3J5cHRlZDonLmxlbmd0aCkgPz8gJycsICdiYXNlNjQnKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNpZ25pbmdTaGFyZSwgQnVmZmVyLmZyb20oZW5jcnlwdGVkSW5wdXRzWzBdLCAnYmFzZTY0JykpO1xuICAgIGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwoc2lnbmluZ1NoYXJlLCB1c2VyU2lnbmluZ1NoYXJlKTtcbiAgICBhc3NlcnQubm90RGVlcFN0cmljdEVxdWFsKHNpZ25pbmdTaGFyZSwgYml0Z29QZWVyLmdldEtleVNoYXJlKCkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1c2VyQ2hpbGQucmVkdWNlZEVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVzdWx0LnVzZXJLZXljaGFpbi5yZWR1Y2VkRW5jcnlwdGVkUHJ2O1xuICAgIGFzc2VydC5vayhyZWR1Y2VkKTtcbiAgICBjb25zdCByZWR1Y2VkU2hhcmUgPSBNUFNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKEJ1ZmZlci5mcm9tKHJlZHVjZWQuc2xpY2UoJ2VuY3J5cHRlZDonLmxlbmd0aCksICdiYXNlNjQnKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShyZWR1Y2VkU2hhcmUua2V5U2hhcmUpLCBzaWduaW5nU2hhcmUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChCdWZmZXIuZnJvbShyZWR1Y2VkU2hhcmUucHViKS50b1N0cmluZygnaGV4JyksIGJpdGdvUGVlci5nZXRDb21tb25LZXljaGFpbigpLnNsaWNlKDAsIDY0KSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZWNvZGVWcmZFbnZlbG9wZShzaWduaW5nU2hhcmUpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFja3VwQ2hpbGQuZW5jcnlwdGVkUHJ2LCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiaXRnb0NoaWxkLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgaW5kZXhlcyBvdXRzaWRlIHRoZSBoYXJkZW5lZCBTYWZlIHJhbmdlIGJlZm9yZSBjb250YWN0aW5nIFdQJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHsgYml0Z28sIGJhc2VDb2luLCBwb3N0LCBhZGRlZEtleWNoYWlucyB9ID0gY3JlYXRlS2V5Y2hhaW5GaXh0dXJlKCk7XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FWcmZNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHV0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICAgIHBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW50ZXJwcmlzZTogJ2VudGVycHJpc2UtaWQnLFxuICAgICAgICBzYWZlSWQ6ICdzYWZlLWlkJyxcbiAgICAgICAgcGFyZW50S2V5SWQ6ICdiaXRnby1yb290LWlkJyxcbiAgICAgICAgZGVyaXZhdGlvbkluZGV4OiAweDgwMDAwMDAwLFxuICAgICAgICB1c2VyUm9vdEtleUlkOiAndXNlci1yb290LWlkJyxcbiAgICAgICAgYmFja3VwUm9vdEtleUlkOiAnYmFja3VwLXJvb3QtaWQnLFxuICAgICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyU2lnbmluZ1NoYXJlLFxuICAgICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB1c2VyVnJmU2hhcmUsXG4gICAgICB9KSxcbiAgICAgIC9kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoL1xuICAgICk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBvc3QuY2FsbGVkLCBmYWxzZSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRlZEtleWNoYWlucywgW10pO1xuICB9KTtcblxuICBjb25zdCBmYXVsdHM6IEFycmF5PCdyMS1zaWduYXR1cmUnIHwgJ3IyLXNpZ25hdHVyZScgfCAnc2Vzc2lvbicgfCAnY29tbW9uS2V5Y2hhaW4nPiA9IFtcbiAgICAncjEtc2lnbmF0dXJlJyxcbiAgICAncjItc2lnbmF0dXJlJyxcbiAgICAnc2Vzc2lvbicsXG4gICAgJ2NvbW1vbktleWNoYWluJyxcbiAgXTtcbiAgZm9yIChjb25zdCBmYXVsdCBvZiBmYXVsdHMpIHtcbiAgICBpdChgcmVqZWN0cyAke2ZhdWx0fSBiZWZvcmUgcmVnaXN0ZXJpbmcgYW55IGNoaWxkYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjb3JkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICgpID0+IGRlcml2ZVdpdGhQZWVyKGZhdWx0LCByZWNvcmRlZEtleWNoYWlucyksXG4gICAgICAgIGZhdWx0ID09PSAnc2Vzc2lvbidcbiAgICAgICAgICA/IC9zZXNzaW9uIGlkL2lcbiAgICAgICAgICA6IGZhdWx0ID09PSAnY29tbW9uS2V5Y2hhaW4nXG4gICAgICAgICAgPyAvY29tbW9uIGtleWNoYWluL2lcbiAgICAgICAgICA6IC9zaWduYXR1cmV8dmVyaWZpY2F0aW9ufHNpZ25lZC9pXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWNvcmRlZEtleWNoYWlucywgW10pO1xuICAgIH0pO1xuICB9XG59KTtcbiJdfQ==