@bitgo-beta/sdk-coin-algo 2.8.9-beta.62 → 2.8.9-beta.621

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=algoSafeRecovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algoSafeRecovery.d.ts","sourceRoot":"","sources":["../../../test/unit/algoSafeRecovery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const src_1 = require("../../src");
9
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
10
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
11
+ const sinon_1 = __importDefault(require("sinon"));
12
+ const algo_1 = require("../../src/algo");
13
+ const ed25519_1 = require("@noble/curves/ed25519");
14
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
15
+ const algosdk_1 = __importDefault(require("algosdk"));
16
+ /**
17
+ * End-to-end Safe ALGO recovery: keycard decrypt → derive slot-2 children → map to recover()
18
+ * params → `Algo.recover()` builds and signs a 2-of-3 multisig sweep whose rootAddress equals
19
+ * `multisigAddress(1, 2, [user, backup, bitgo])`.
20
+ *
21
+ * This proves the whole WCN-2898 chain with real keys (no mocked derivation or encryption):
22
+ * the lazy backup signer signs the actual transaction bytes with the derived kL/kR, so the final
23
+ * transaction verifies under algosdk.verifyMultisig.
24
+ */
25
+ describe('Safe ALGO recovery end-to-end', function () {
26
+ let bitgo;
27
+ let basecoin;
28
+ const sandbox = sinon_1.default.createSandbox();
29
+ afterEach(function () {
30
+ sandbox.restore();
31
+ });
32
+ before(function () {
33
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
34
+ bitgo.safeRegister('talgo', src_1.Talgo.createInstance);
35
+ bitgo.initializeTestVars();
36
+ basecoin = bitgo.coin('talgo');
37
+ });
38
+ // The ed25519Multisig root fixture the sdk-core unit tests pin (with a distinct BitGo root, so the
39
+ // backup child and the BitGo child are different keys and a slot swap changes every assertion).
40
+ function ed25519Roots() {
41
+ const seed = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
42
+ const chainCode = Buffer.alloc(32, 0xab);
43
+ const bitgoSeed = Buffer.alloc(32, 0x22);
44
+ const bitgoRootPub = Buffer.from(ed25519_1.ed25519.getPublicKey(bitgoSeed));
45
+ const bitgoChainCode = Buffer.alloc(32, 0xcd);
46
+ return {
47
+ secp256k1Multisig: { user: 'u', backup: 'b', bitgo: 'g' },
48
+ ed25519Multisig: {
49
+ user: seed,
50
+ backup: { prv: seed, chainCode: (0, sdk_core_1.encodeEd25519ChainCode)(chainCode) },
51
+ bitgo: (0, sdk_core_1.encodeDerivableEd25519Pub)(bitgoRootPub, bitgoChainCode),
52
+ },
53
+ ecdsaMpc: {
54
+ user: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
55
+ backup: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
56
+ bitgo: 'g',
57
+ },
58
+ eddsaMpc: {
59
+ user: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
60
+ backup: { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) },
61
+ bitgo: 'g',
62
+ },
63
+ };
64
+ }
65
+ const nodeParams = {
66
+ token: '2810c2d168e8417c5f111d38d68327b8cfe2d0ddc02986490c22f8ddf4128bcd',
67
+ baseServer: 'http://localhost/',
68
+ port: 8443,
69
+ };
70
+ const fee = 1000;
71
+ const nativeBalance = 10000000; // 10 ALGO
72
+ const recoveryDestination = 'GB3YETD5TSTBAIYGYHVWU3O3I7XGOB44HOZA5MOEF5M23CLLZKRQLEVAOA';
73
+ it('recovers a Safe ALGO wallet whose rootAddress equals multisigAddress(1,2,[user,backup,bitgo])', async function () {
74
+ sandbox.stub(algo_1.Algo.prototype, 'getAccountBalance').resolves(nativeBalance);
75
+ const roots = ed25519Roots();
76
+ const derived = await (0, sdk_core_1.deriveSafeWalletKeys)({ coin: 'algo', slot: 'ed25519Multisig', account: 0, roots });
77
+ if (derived.slot !== 'ed25519Multisig') {
78
+ throw new Error('expected ed25519Multisig slot');
79
+ }
80
+ const keyParams = await (0, sdk_core_1.buildSafeRecoverKeyParams)({
81
+ bitgo,
82
+ coin: 'algo',
83
+ slot: 'ed25519Multisig',
84
+ keys: derived.keys,
85
+ mode: 'signed',
86
+ });
87
+ if (keyParams.slot !== 'ed25519Multisig' || keyParams.mode !== 'signed') {
88
+ throw new Error('expected signed ed25519Multisig key params');
89
+ }
90
+ // Distinct fixture roots: a slot swap between backup and bitgo must change the signer and root.
91
+ derived.keys.user.pub.should.not.equal(derived.keys.backup.pub);
92
+ derived.keys.backup.pub.should.not.equal(derived.keys.bitgo.pub);
93
+ // The mapper's rootAddress is the wallet's on-chain address, derived from the same children.
94
+ const expectedRoot = algosdk_1.default.multisigAddress({
95
+ version: 1,
96
+ threshold: 2,
97
+ addrs: [
98
+ algosdk_1.default.encodeAddress(Buffer.from(derived.keys.user.pub, 'hex')),
99
+ algosdk_1.default.encodeAddress(Buffer.from(derived.keys.backup.pub, 'hex')),
100
+ algosdk_1.default.encodeAddress(Buffer.from(derived.keys.bitgo.pub, 'hex')),
101
+ ],
102
+ });
103
+ (0, assert_1.default)(keyParams.rootAddress);
104
+ assert_1.default.strictEqual(keyParams.rootAddress, expectedRoot);
105
+ const recovery = await basecoin.recover({
106
+ userKey: keyParams.userKey,
107
+ rootAddress: keyParams.rootAddress,
108
+ bitgoKey: keyParams.bitgoKey,
109
+ walletPassphrase: keyParams.walletPassphrase,
110
+ fee,
111
+ recoveryDestination,
112
+ firstRound: 5002596,
113
+ nodeParams,
114
+ externalBackupSigner: keyParams.externalBackupSigner,
115
+ });
116
+ (0, assert_1.default)('tx' in recovery);
117
+ recovery.should.have.property('tx');
118
+ assert_1.default.strictEqual(recovery.userKey, algosdk_1.default.encodeAddress(Buffer.from(derived.keys.user.pub, 'hex')));
119
+ assert_1.default.strictEqual(recovery.backupKey, algosdk_1.default.encodeAddress(Buffer.from(derived.keys.backup.pub, 'hex')));
120
+ assert_1.default.strictEqual(recovery.bitgoKey, algosdk_1.default.encodeAddress(Buffer.from(derived.keys.bitgo.pub, 'hex')));
121
+ assert_1.default.strictEqual(recovery.rootAddress, expectedRoot);
122
+ assert_1.default.notStrictEqual(recovery.userKey, keyParams.userKey);
123
+ recovery.should.not.have.property('walletPassphrase');
124
+ recovery.should.not.have.property('externalBackupSigner');
125
+ const decoded = algosdk_1.default.decodeSignedTransaction(Buffer.from(recovery.tx, 'base64'));
126
+ (0, should_1.default)(decoded.msig).not.be.undefined();
127
+ const msigPk = algosdk_1.default.decodeAddress(expectedRoot).publicKey;
128
+ algosdk_1.default.verifyMultisig(decoded.txn.bytesToSign(), decoded.msig, msigPk).should.equal(true);
129
+ });
130
+ it('returns the derived public keys for an unsigned Safe recovery without encrypting or decrypting', async function () {
131
+ sandbox.stub(algo_1.Algo.prototype, 'getAccountBalance').resolves(nativeBalance);
132
+ const encryptSpy = sandbox.spy(bitgo, 'encrypt');
133
+ const decryptSpy = sandbox.spy(bitgo, 'decrypt');
134
+ const derived = await (0, sdk_core_1.deriveSafeWalletKeys)({
135
+ coin: 'talgo',
136
+ slot: 'ed25519Multisig',
137
+ account: 0,
138
+ roots: ed25519Roots(),
139
+ });
140
+ (0, assert_1.default)(derived.slot === 'ed25519Multisig');
141
+ const keyParams = await (0, sdk_core_1.buildSafeRecoverKeyParams)({
142
+ bitgo,
143
+ coin: 'talgo',
144
+ slot: 'ed25519Multisig',
145
+ keys: derived.keys,
146
+ mode: 'unsigned',
147
+ });
148
+ (0, assert_1.default)(keyParams.mode === 'unsigned');
149
+ (0, assert_1.default)(keyParams.rootAddress);
150
+ const recovery = await basecoin.recover({
151
+ ...keyParams,
152
+ rootAddress: keyParams.rootAddress,
153
+ fee,
154
+ recoveryDestination,
155
+ firstRound: 5002596,
156
+ nodeParams,
157
+ });
158
+ (0, assert_1.default)('txHex' in recovery);
159
+ const expectedKeys = [derived.keys.user.pub, derived.keys.backup.pub, derived.keys.bitgo.pub].map((pub) => algosdk_1.default.encodeAddress(Buffer.from(pub, 'hex')));
160
+ assert_1.default.deepStrictEqual([recovery.userKey, recovery.backupKey, recovery.bitgoKey], expectedKeys);
161
+ assert_1.default.deepStrictEqual(recovery.keys, expectedKeys);
162
+ assert_1.default.strictEqual(recovery.address, keyParams.rootAddress);
163
+ sinon_1.default.assert.notCalled(encryptSpy);
164
+ sinon_1.default.assert.notCalled(decryptSpy);
165
+ });
166
+ it('fails closed with RecoveryKeyMismatchError when the user key does not belong to the root', async function () {
167
+ const getBalanceStub = sandbox.stub(algo_1.Algo.prototype, 'getAccountBalance').resolves(nativeBalance);
168
+ const roots = ed25519Roots();
169
+ const derived = await (0, sdk_core_1.deriveSafeWalletKeys)({ coin: 'algo', slot: 'ed25519Multisig', account: 0, roots });
170
+ if (derived.slot !== 'ed25519Multisig') {
171
+ throw new Error('expected ed25519Multisig slot');
172
+ }
173
+ const keyParams = await (0, sdk_core_1.buildSafeRecoverKeyParams)({
174
+ bitgo,
175
+ coin: 'algo',
176
+ slot: 'ed25519Multisig',
177
+ keys: derived.keys,
178
+ mode: 'signed',
179
+ });
180
+ if (keyParams.slot !== 'ed25519Multisig' || keyParams.mode !== 'signed') {
181
+ throw new Error('expected signed ed25519Multisig key params');
182
+ }
183
+ // A rootAddress the derived keys do not control: the fail-closed check fires before any node call.
184
+ await assert_1.default.rejects(() => basecoin.recover({
185
+ userKey: keyParams.userKey,
186
+ rootAddress: algosdk_1.default.encodeAddress(Buffer.alloc(32, 0xee)),
187
+ bitgoKey: keyParams.bitgoKey,
188
+ walletPassphrase: keyParams.walletPassphrase,
189
+ fee,
190
+ recoveryDestination,
191
+ firstRound: 5002596,
192
+ nodeParams,
193
+ externalBackupSigner: keyParams.externalBackupSigner,
194
+ }), sdk_core_1.RecoveryKeyMismatchError);
195
+ sinon_1.default.assert.notCalled(getBalanceStub);
196
+ });
197
+ });
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxnb1NhZmVSZWNvdmVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9hbGdvU2FmZVJlY292ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixtQ0FBa0M7QUFDbEMsbURBQStEO0FBQy9ELGlEQUErQztBQUMvQyxrREFBMEI7QUFDMUIseUNBQXNDO0FBQ3RDLG1EQUFnRDtBQUNoRCxtREFPOEI7QUFDOUIsc0RBQThCO0FBRTlCOzs7Ozs7OztHQVFHO0FBQ0gsUUFBUSxDQUFDLCtCQUErQixFQUFFO0lBQ3hDLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWMsQ0FBQztJQUNuQixNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFFdEMsU0FBUyxDQUFDO1FBQ1IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFTLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxtR0FBbUc7SUFDbkcsZ0dBQWdHO0lBQ2hHLFNBQVMsWUFBWTtRQUNuQixNQUFNLElBQUksR0FBRywwREFBMEQsQ0FBQztRQUN4RSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENB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LEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELG1HQUFtRztRQUNuRyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUNsQixHQUFHLEVBQUUsQ0FDSCxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ2YsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQzFCLFdBQVcsRUFBRSxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRCxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7WUFDNUIsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLGdCQUFnQjtZQUM1QyxHQUFHO1lBQ0gsbUJBQW1CO1lBQ25CLFVBQVUsRUFBRSxPQUFPO1lBQ25CLFVBQVU7WUFDVixvQkFBb0IsRUFBRSxTQUFTLENBQUMsb0JBQW9CO1NBQ3JELENBQUMsRUFDSixtQ0FBd0IsQ0FDekIsQ0FBQztRQUNGLGVBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUYWxnbyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgU2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgQWxnbyB9IGZyb20gJy4uLy4uL3NyYy9hbGdvJztcbmltcG9ydCB7IGVkMjU1MTkgfSBmcm9tICdAbm9ibGUvY3VydmVzL2VkMjU1MTknO1xuaW1wb3J0IHtcbiAgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyxcbiAgZGVyaXZlU2FmZVdhbGxldEtleXMsXG4gIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIsXG4gIGVuY29kZUVkMjU1MTlDaGFpbkNvZGUsXG4gIFJlY292ZXJ5S2V5TWlzbWF0Y2hFcnJvcixcbiAgdHlwZSBEZWNyeXB0ZWRTYWZlUm9vdHMsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBhbGdvc2RrIGZyb20gJ2FsZ29zZGsnO1xuXG4vKipcbiAqIEVuZC10by1lbmQgU2FmZSBBTEdPIHJlY292ZXJ5OiBrZXljYXJkIGRlY3J5cHQg4oaSIGRlcml2ZSBzbG90LTIgY2hpbGRyZW4g4oaSIG1hcCB0byByZWNvdmVyKClcbiAqIHBhcmFtcyDihpIgYEFsZ28ucmVjb3ZlcigpYCBidWlsZHMgYW5kIHNpZ25zIGEgMi1vZi0zIG11bHRpc2lnIHN3ZWVwIHdob3NlIHJvb3RBZGRyZXNzIGVxdWFsc1xuICogYG11bHRpc2lnQWRkcmVzcygxLCAyLCBbdXNlciwgYmFja3VwLCBiaXRnb10pYC5cbiAqXG4gKiBUaGlzIHByb3ZlcyB0aGUgd2hvbGUgV0NOLTI4OTggY2hhaW4gd2l0aCByZWFsIGtleXMgKG5vIG1vY2tlZCBkZXJpdmF0aW9uIG9yIGVuY3J5cHRpb24pOlxuICogdGhlIGxhenkgYmFja3VwIHNpZ25lciBzaWducyB0aGUgYWN0dWFsIHRyYW5zYWN0aW9uIGJ5dGVzIHdpdGggdGhlIGRlcml2ZWQga0wva1IsIHNvIHRoZSBmaW5hbFxuICogdHJhbnNhY3Rpb24gdmVyaWZpZXMgdW5kZXIgYWxnb3Nkay52ZXJpZnlNdWx0aXNpZy5cbiAqL1xuZGVzY3JpYmUoJ1NhZmUgQUxHTyByZWNvdmVyeSBlbmQtdG8tZW5kJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luOiBBbGdvO1xuICBjb25zdCBzYW5kYm94ID0gU2lub24uY3JlYXRlU2FuZGJveCgpO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0YWxnbycsIFRhbGdvLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RhbGdvJykgYXMgQWxnbztcbiAgfSk7XG5cbiAgLy8gVGhlIGVkMjU1MTlNdWx0aXNpZyByb290IGZpeHR1cmUgdGhlIHNkay1jb3JlIHVuaXQgdGVzdHMgcGluICh3aXRoIGEgZGlzdGluY3QgQml0R28gcm9vdCwgc28gdGhlXG4gIC8vIGJhY2t1cCBjaGlsZCBhbmQgdGhlIEJpdEdvIGNoaWxkIGFyZSBkaWZmZXJlbnQga2V5cyBhbmQgYSBzbG90IHN3YXAgY2hhbmdlcyBldmVyeSBhc3NlcnRpb24pLlxuICBmdW5jdGlvbiBlZDI1NTE5Um9vdHMoKTogRGVjcnlwdGVkU2FmZVJvb3RzIHtcbiAgICBjb25zdCBzZWVkID0gJ1NBQUFDQVFEQVFDUU1CWUlCRUZBV0RBTkJZSFJBRUlTQ01LQktGUVhEQU1SVUdZNERVUEI2TktJJztcbiAgICBjb25zdCBjaGFpbkNvZGUgPSBCdWZmZXIuYWxsb2MoMzIsIDB4YWIpO1xuICAgIGNvbnN0IGJpdGdvU2VlZCA9IEJ1ZmZlci5hbGxvYygzMiwgMHgyMik7XG4gICAgY29uc3QgYml0Z29Sb290UHViID0gQnVmZmVyLmZyb20oZWQyNTUxOS5nZXRQdWJsaWNLZXkoYml0Z29TZWVkKSk7XG4gICAgY29uc3QgYml0Z29DaGFpbkNvZGUgPSBCdWZmZXIuYWxsb2MoMzIsIDB4Y2QpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogeyB1c2VyOiAndScsIGJhY2t1cDogJ2InLCBiaXRnbzogJ2cnIH0sXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6IHtcbiAgICAgICAgdXNlcjogc2VlZCxcbiAgICAgICAgYmFja3VwOiB7IHBydjogc2VlZCwgY2hhaW5Db2RlOiBlbmNvZGVFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZSkgfSxcbiAgICAgICAgYml0Z286IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoYml0Z29Sb290UHViLCBiaXRnb0NoYWluQ29kZSksXG4gICAgICB9LFxuICAgICAgZWNkc2FNcGM6IHtcbiAgICAgICAgdXNlcjogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJhY2t1cDogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJpdGdvOiAnZycsXG4gICAgICB9LFxuICAgICAgZWRkc2FNcGM6IHtcbiAgICAgICAgdXNlcjogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJhY2t1cDogeyBzaWduaW5nOiBCdWZmZXIuYWxsb2MoMCksIHZyZjogQnVmZmVyLmFsbG9jKDApIH0sXG4gICAgICAgIGJpdGdvOiAnZycsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjb25zdCBub2RlUGFyYW1zID0ge1xuICAgIHRva2VuOiAnMjgxMGMyZDE2OGU4NDE3YzVmMTExZDM4ZDY4MzI3YjhjZmUyZDBkZGMwMjk4NjQ5MGMyMmY4ZGRmNDEyOGJjZCcsXG4gICAgYmFzZVNlcnZlcjogJ2h0dHA6Ly9sb2NhbGhvc3QvJyxcbiAgICBwb3J0OiA4NDQzLFxuICB9O1xuICBjb25zdCBmZWUgPSAxMDAwO1xuICBjb25zdCBuYXRpdmVCYWxhbmNlID0gMTBfMDAwXzAwMDsgLy8gMTAgQUxHT1xuICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJ0dCM1lFVEQ1VFNUQkFJWUdZSFZXVTNPM0k3WEdPQjQ0SE9aQTVNT0VGNU0yM0NMTFpLUlFMRVZBT0EnO1xuXG4gIGl0KCdyZWNvdmVycyBhIFNhZmUgQUxHTyB3YWxsZXQgd2hvc2Ugcm9vdEFkZHJlc3MgZXF1YWxzIG11bHRpc2lnQWRkcmVzcygxLDIsW3VzZXIsYmFja3VwLGJpdGdvXSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5zdHViKEFsZ28ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEJhbGFuY2UnKS5yZXNvbHZlcyhuYXRpdmVCYWxhbmNlKTtcblxuICAgIGNvbnN0IHJvb3RzID0gZWQyNTUxOVJvb3RzKCk7XG4gICAgY29uc3QgZGVyaXZlZCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2FsZ28nLCBzbG90OiAnZWQyNTUxOU11bHRpc2lnJywgYWNjb3VudDogMCwgcm9vdHMgfSk7XG4gICAgaWYgKGRlcml2ZWQuc2xvdCAhPT0gJ2VkMjU1MTlNdWx0aXNpZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgZWQyNTUxOU11bHRpc2lnIHNsb3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlQYXJhbXMgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ2FsZ28nLFxuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICBrZXlzOiBkZXJpdmVkLmtleXMsXG4gICAgICBtb2RlOiAnc2lnbmVkJyxcbiAgICB9KTtcbiAgICBpZiAoa2V5UGFyYW1zLnNsb3QgIT09ICdlZDI1NTE5TXVsdGlzaWcnIHx8IGtleVBhcmFtcy5tb2RlICE9PSAnc2lnbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzaWduZWQgZWQyNTUxOU11bHRpc2lnIGtleSBwYXJhbXMnKTtcbiAgICB9XG5cbiAgICAvLyBEaXN0aW5jdCBmaXh0dXJlIHJvb3RzOiBhIHNsb3Qgc3dhcCBiZXR3ZWVuIGJhY2t1cCBhbmQgYml0Z28gbXVzdCBjaGFuZ2UgdGhlIHNpZ25lciBhbmQgcm9vdC5cbiAgICBkZXJpdmVkLmtleXMudXNlci5wdWIuc2hvdWxkLm5vdC5lcXVhbChkZXJpdmVkLmtleXMuYmFja3VwLnB1Yik7XG4gICAgZGVyaXZlZC5rZXlzLmJhY2t1cC5wdWIuc2hvdWxkLm5vdC5lcXVhbChkZXJpdmVkLmtleXMuYml0Z28ucHViKTtcblxuICAgIC8vIFRoZSBtYXBwZXIncyByb290QWRkcmVzcyBpcyB0aGUgd2FsbGV0J3Mgb24tY2hhaW4gYWRkcmVzcywgZGVyaXZlZCBmcm9tIHRoZSBzYW1lIGNoaWxkcmVuLlxuICAgIGNvbnN0IGV4cGVjdGVkUm9vdCA9IGFsZ29zZGsubXVsdGlzaWdBZGRyZXNzKHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICBhZGRyczogW1xuICAgICAgICBhbGdvc2RrLmVuY29kZUFkZHJlc3MoQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLnVzZXIucHViLCAnaGV4JykpLFxuICAgICAgICBhbGdvc2RrLmVuY29kZUFkZHJlc3MoQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLmJhY2t1cC5wdWIsICdoZXgnKSksXG4gICAgICAgIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShkZXJpdmVkLmtleXMuYml0Z28ucHViLCAnaGV4JykpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhc3NlcnQoa2V5UGFyYW1zLnJvb3RBZGRyZXNzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoa2V5UGFyYW1zLnJvb3RBZGRyZXNzLCBleHBlY3RlZFJvb3QpO1xuXG4gICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgIHVzZXJLZXk6IGtleVBhcmFtcy51c2VyS2V5LFxuICAgICAgcm9vdEFkZHJlc3M6IGtleVBhcmFtcy5yb290QWRkcmVzcyxcbiAgICAgIGJpdGdvS2V5OiBrZXlQYXJhbXMuYml0Z29LZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBrZXlQYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGZlZSxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICBmaXJzdFJvdW5kOiA1MDAyNTk2LFxuICAgICAgbm9kZVBhcmFtcyxcbiAgICAgIGV4dGVybmFsQmFja3VwU2lnbmVyOiBrZXlQYXJhbXMuZXh0ZXJuYWxCYWNrdXBTaWduZXIsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQoJ3R4JyBpbiByZWNvdmVyeSk7XG4gICAgcmVjb3Zlcnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY292ZXJ5LnVzZXJLZXksIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShkZXJpdmVkLmtleXMudXNlci5wdWIsICdoZXgnKSkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNvdmVyeS5iYWNrdXBLZXksIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShkZXJpdmVkLmtleXMuYmFja3VwLnB1YiwgJ2hleCcpKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY292ZXJ5LmJpdGdvS2V5LCBhbGdvc2RrLmVuY29kZUFkZHJlc3MoQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLmJpdGdvLnB1YiwgJ2hleCcpKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY292ZXJ5LnJvb3RBZGRyZXNzLCBleHBlY3RlZFJvb3QpO1xuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChyZWNvdmVyeS51c2VyS2V5LCBrZXlQYXJhbXMudXNlcktleSk7XG4gICAgcmVjb3Zlcnkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJyk7XG4gICAgcmVjb3Zlcnkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdleHRlcm5hbEJhY2t1cFNpZ25lcicpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBhbGdvc2RrLmRlY29kZVNpZ25lZFRyYW5zYWN0aW9uKEJ1ZmZlci5mcm9tKHJlY292ZXJ5LnR4IGFzIHN0cmluZywgJ2Jhc2U2NCcpKTtcbiAgICBzaG91bGQoZGVjb2RlZC5tc2lnKS5ub3QuYmUudW5kZWZpbmVkKCk7XG5cbiAgICBjb25zdCBtc2lnUGsgPSBhbGdvc2RrLmRlY29kZUFkZHJlc3MoZXhwZWN0ZWRSb290KS5wdWJsaWNLZXk7XG4gICAgYWxnb3Nkay52ZXJpZnlNdWx0aXNpZyhkZWNvZGVkLnR4bi5ieXRlc1RvU2lnbigpLCBkZWNvZGVkLm1zaWchLCBtc2lnUGspLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3JldHVybnMgdGhlIGRlcml2ZWQgcHVibGljIGtleXMgZm9yIGFuIHVuc2lnbmVkIFNhZmUgcmVjb3Zlcnkgd2l0aG91dCBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5zdHViKEFsZ28ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEJhbGFuY2UnKS5yZXNvbHZlcyhuYXRpdmVCYWxhbmNlKTtcbiAgICBjb25zdCBlbmNyeXB0U3B5ID0gc2FuZGJveC5zcHkoYml0Z28sICdlbmNyeXB0Jyk7XG4gICAgY29uc3QgZGVjcnlwdFNweSA9IHNhbmRib3guc3B5KGJpdGdvLCAnZGVjcnlwdCcpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7XG4gICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICBhY2NvdW50OiAwLFxuICAgICAgcm9vdHM6IGVkMjU1MTlSb290cygpLFxuICAgIH0pO1xuICAgIGFzc2VydChkZXJpdmVkLnNsb3QgPT09ICdlZDI1NTE5TXVsdGlzaWcnKTtcbiAgICBjb25zdCBrZXlQYXJhbXMgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ3RhbGdvJyxcbiAgICAgIHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnLFxuICAgICAga2V5czogZGVyaXZlZC5rZXlzLFxuICAgICAgbW9kZTogJ3Vuc2lnbmVkJyxcbiAgICB9KTtcbiAgICBhc3NlcnQoa2V5UGFyYW1zLm1vZGUgPT09ICd1bnNpZ25lZCcpO1xuICAgIGFzc2VydChrZXlQYXJhbXMucm9vdEFkZHJlc3MpO1xuXG4gICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgIC4uLmtleVBhcmFtcyxcbiAgICAgIHJvb3RBZGRyZXNzOiBrZXlQYXJhbXMucm9vdEFkZHJlc3MsXG4gICAgICBmZWUsXG4gICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgZmlyc3RSb3VuZDogNTAwMjU5NixcbiAgICAgIG5vZGVQYXJhbXMsXG4gICAgfSk7XG4gICAgYXNzZXJ0KCd0eEhleCcgaW4gcmVjb3ZlcnkpO1xuICAgIGNvbnN0IGV4cGVjdGVkS2V5cyA9IFtkZXJpdmVkLmtleXMudXNlci5wdWIsIGRlcml2ZWQua2V5cy5iYWNrdXAucHViLCBkZXJpdmVkLmtleXMuYml0Z28ucHViXS5tYXAoKHB1YikgPT5cbiAgICAgIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhCdWZmZXIuZnJvbShwdWIsICdoZXgnKSlcbiAgICApO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoW3JlY292ZXJ5LnVzZXJLZXksIHJlY292ZXJ5LmJhY2t1cEtleSwgcmVjb3ZlcnkuYml0Z29LZXldLCBleHBlY3RlZEtleXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjb3Zlcnkua2V5cywgZXhwZWN0ZWRLZXlzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjb3ZlcnkuYWRkcmVzcywga2V5UGFyYW1zLnJvb3RBZGRyZXNzKTtcbiAgICBTaW5vbi5hc3NlcnQubm90Q2FsbGVkKGVuY3J5cHRTcHkpO1xuICAgIFNpbm9uLmFzc2VydC5ub3RDYWxsZWQoZGVjcnlwdFNweSk7XG4gIH0pO1xuXG4gIGl0KCdmYWlscyBjbG9zZWQgd2l0aCBSZWNvdmVyeUtleU1pc21hdGNoRXJyb3Igd2hlbiB0aGUgdXNlciBrZXkgZG9lcyBub3QgYmVsb25nIHRvIHRoZSByb290JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGdldEJhbGFuY2VTdHViID0gc2FuZGJveC5zdHViKEFsZ28ucHJvdG90eXBlLCAnZ2V0QWNjb3VudEJhbGFuY2UnKS5yZXNvbHZlcyhuYXRpdmVCYWxhbmNlKTtcblxuICAgIGNvbnN0IHJvb3RzID0gZWQyNTUxOVJvb3RzKCk7XG4gICAgY29uc3QgZGVyaXZlZCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2FsZ28nLCBzbG90OiAnZWQyNTUxOU11bHRpc2lnJywgYWNjb3VudDogMCwgcm9vdHMgfSk7XG4gICAgaWYgKGRlcml2ZWQuc2xvdCAhPT0gJ2VkMjU1MTlNdWx0aXNpZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgZWQyNTUxOU11bHRpc2lnIHNsb3QnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5UGFyYW1zID0gYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdhbGdvJyxcbiAgICAgIHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnLFxuICAgICAga2V5czogZGVyaXZlZC5rZXlzLFxuICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgfSk7XG4gICAgaWYgKGtleVBhcmFtcy5zbG90ICE9PSAnZWQyNTUxOU11bHRpc2lnJyB8fCBrZXlQYXJhbXMubW9kZSAhPT0gJ3NpZ25lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc2lnbmVkIGVkMjU1MTlNdWx0aXNpZyBrZXkgcGFyYW1zJyk7XG4gICAgfVxuXG4gICAgLy8gQSByb290QWRkcmVzcyB0aGUgZGVyaXZlZCBrZXlzIGRvIG5vdCBjb250cm9sOiB0aGUgZmFpbC1jbG9zZWQgY2hlY2sgZmlyZXMgYmVmb3JlIGFueSBub2RlIGNhbGwuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAoKSA9PlxuICAgICAgICBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OiBrZXlQYXJhbXMudXNlcktleSxcbiAgICAgICAgICByb290QWRkcmVzczogYWxnb3Nkay5lbmNvZGVBZGRyZXNzKEJ1ZmZlci5hbGxvYygzMiwgMHhlZSkpLFxuICAgICAgICAgIGJpdGdvS2V5OiBrZXlQYXJhbXMuYml0Z29LZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZToga2V5UGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgZmVlLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgZmlyc3RSb3VuZDogNTAwMjU5NixcbiAgICAgICAgICBub2RlUGFyYW1zLFxuICAgICAgICAgIGV4dGVybmFsQmFja3VwU2lnbmVyOiBrZXlQYXJhbXMuZXh0ZXJuYWxCYWNrdXBTaWduZXIsXG4gICAgICAgIH0pLFxuICAgICAgUmVjb3ZlcnlLZXlNaXNtYXRjaEVycm9yXG4gICAgKTtcbiAgICBTaW5vbi5hc3NlcnQubm90Q2FsbGVkKGdldEJhbGFuY2VTdHViKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -38,6 +38,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const assert_1 = __importDefault(require("assert"));
40
40
  const should_1 = __importDefault(require("should"));
41
+ const algosdk_1 = __importDefault(require("algosdk"));
42
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
41
43
  const statics_1 = require("@bitgo-beta/statics");
42
44
  const AlgoResources = __importStar(require("../../fixtures/resources"));
43
45
  const transaction_1 = require("../../../src/lib/transaction");
@@ -153,5 +155,33 @@ describe('Algo Transaction', () => {
153
155
  txInfo.tokenName.should.equal('USON');
154
156
  });
155
157
  });
158
+ describe('addRawMultisigSignature', () => {
159
+ it('throws when the transaction is empty', () => {
160
+ assert_1.default.throws(() => tx.addRawMultisigSignature(address, new Uint8Array(64)), /Empty transaction/);
161
+ });
162
+ it('appends a raw external signature and produces a valid multisig transaction', async () => {
163
+ const a1 = AlgoResources.accounts.account1;
164
+ const a2 = AlgoResources.accounts.account2;
165
+ const a3 = AlgoResources.accounts.account3;
166
+ txnBuilder.numberOfRequiredSigners(2).setSigners([a1.address, a2.address, a3.address]);
167
+ txnBuilder.sign({ key: a1.prvKey });
168
+ const built = (await txnBuilder.build());
169
+ const algoTxn = built.getAlgoTransaction();
170
+ const rawSig = tweetnacl_1.default.sign.detached(algoTxn.bytesToSign(), tweetnacl_1.default.sign.keyPair.fromSeed(a2.secretKey).secretKey);
171
+ built.addRawMultisigSignature(a2.address, rawSig);
172
+ const msigAddr = algosdk_1.default.multisigAddress({
173
+ version: 1,
174
+ threshold: 2,
175
+ addrs: [a1.address, a2.address, a3.address],
176
+ });
177
+ const expectedPk = algosdk_1.default.decodeAddress(msigAddr).publicKey;
178
+ const decoded = algosdk_1.default.decodeSignedTransaction(built.toBroadcastFormat());
179
+ const msig = decoded.msig;
180
+ if (!msig) {
181
+ throw new Error('Expected a multisig signature');
182
+ }
183
+ algosdk_1.default.verifyMultisig(algoTxn.bytesToSign(), msig, expectedPk).should.equal(true);
184
+ });
185
+ });
156
186
  });
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixpREFBNEM7QUFDNUMsd0VBQTBEO0FBQzFELDhEQUEyRDtBQUMzRCwwQ0FBNEY7QUFFNUYsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFJLEVBQWUsQ0FBQztJQUNwQixJQUFJLFVBQWdDLENBQUM7SUFDckMsTUFBTSxPQUFPLEdBQUcsNERBQTRELENBQUM7SUFFN0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFFbkIsRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixVQUFVLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2xGLFVBQVU7YUFDUCxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7YUFDNUIsU0FBUyxDQUFDLElBQUksQ0FBQzthQUNmLFVBQVUsQ0FBQyxVQUFVLENBQUM7YUFDdEIsU0FBUyxD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QUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBBbGdvUmVzb3VyY2VzIGZyb20gJy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UGFpciwgQXNzZXRUcmFuc2ZlckJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcblxuZGVzY3JpYmUoJ0FsZ28gVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGxldCB0eDogVHJhbnNhY3Rpb247XG4gIGxldCB0eG5CdWlsZGVyOiBBc3NldFRyYW5zZmVyQnVpbGRlcjtcbiAgY29uc3QgYWRkcmVzcyA9ICdSSUpWTERZV0FTWlpOR09TUU5PSzdITjZKTkZMTU1aM0ZGQkJGRzJOTlJPTTVDRTc0NERBSlNQWko0JztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ2FsZ28nKTtcbiAgICBjb25zdCB0b2tlbkNvbmZpZyA9IGNvaW5zLmdldCgndGFsZ286VVNPTi0xNjAyNjcyOCcpO1xuICAgIGNvbnN0IGZpcnN0Um91bmQgPSAxNjc7XG4gICAgY29uc3QgbGFzdFJvdW5kID0gMTE2NztcbiAgICBjb25zdCBmZWUgPSAxMDAwO1xuICAgIGNvbnN0IHRva2VuSWQgPSAxO1xuICAgIGNvbnN0IGFtb3VudCA9ICcwJztcblxuICAgIHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvbmZpZyk7XG4gICAgdHhuQnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KHRva2VuQ29uZmlnKS5nZXRBc3NldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4bkJ1aWxkZXJcbiAgICAgIC5mZWUoeyBmZWU6IGZlZS50b1N0cmluZygpIH0pXG4gICAgICAuaXNGbGF0RmVlKHRydWUpXG4gICAgICAuZmlyc3RSb3VuZChmaXJzdFJvdW5kKVxuICAgICAgLmxhc3RSb3VuZChsYXN0Um91bmQpXG4gICAgICAudGVzdG5ldCgpXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWRkcmVzcyB9KVxuICAgICAgLnRva2VuSWQodG9rZW5JZClcbiAgICAgIC5hbW91bnQoQmlnSW50KGFtb3VudCkpXG4gICAgICAudG8oeyBhZGRyZXNzOiBhZGRyZXNzIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHgudG9Kc29uKCksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAvRW1wdHkgdHJhbnNhY3Rpb24vKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHNpZ24nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eC5zaWduKFtuZXcgS2V5UGFpcih7IHBydjogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5kZWZhdWx0LnNlY3JldEtleS50b1N0cmluZygnaGV4JykgfSldKSxcbiAgICAgICAgL0VtcHR5IHRyYW5zYWN0aW9uL1xuICAgICAgKTtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDIpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHguc2lnbihbbmV3IEtleVBhaXIoeyBwcnY6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuZGVmYXVsdC5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pXSksXG4gICAgICAgIC9FbXB0eSB0cmFuc2FjdGlvbi9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYW5ub3Qgc2lnbiAtIG5vIHNpZ25lciByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogJ3NvbWUnIH0pLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2Fubm90IHNpZ24gLSB3cm9uZyBhY2NvdW50IHNlY3JldCcsICgpID0+IHtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDEpO1xuICAgICAgdHguc2VuZGVyKEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmNhblNpZ24oeyBrZXk6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDIuc2VjcmV0S2V5LnRvU3RyaW5nKCdoZXgnKSB9KSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbiBzaWduJywgKCkgPT4ge1xuICAgICAgdHguc2V0TnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMoMSk7XG4gICAgICB0eC5zZW5kZXIoQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHR5cGUnLCAoKSA9PiB7XG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBlbmFibGVUb2tlbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhuQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhUeXBlJyk7XG4gICAgICB0eEluZm8udHhUeXBlLnNob3VsZC5lcXVhbCgnZW5hYmxlVG9rZW4nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG9rZW5OYW1lJyk7XG4gICAgICB0eEluZm8udG9rZW5OYW1lLnNob3VsZC5lcXVhbCgnVVNPTicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBkaXNhYmxlVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbG9zZVJlbWFpbmRlclRvID0gJ1NQNzQ1SkpSNEtQUlFFWEpaSFZJRU43MzZMWVRMMlQyREZNRzNPSUlGSkJWNjZLNzNQSE5NRENaVk0nO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuY2xvc2VSZW1haW5kZXJUbyh7IGFkZHJlc3M6IGNsb3NlUmVtYWluZGVyVG8gfSkuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhJbmZvID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdHModHhIZXgpO1xuXG4gICAgICB0eEluZm8udG8uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmZyb20uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIHR4SW5mby5maXJzdFJvdW5kLnNob3VsZC5lcXVhbCgxNjcpO1xuICAgICAgdHhJbmZvLnRva2VuSWQuc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhJbmZvLmZlZS5zaG91bGQuZXF1YWwoMTAwMCk7XG4gICAgICB0eEluZm8uY2xvc2VSZW1haW5kZXJUby5zaG91bGQuZXF1YWwoY2xvc2VSZW1haW5kZXJUbyk7XG4gICAgICB0eEluZm8ubGFzdFJvdW5kLnNob3VsZC5lcXVhbCgxMTY3KTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSUQuc2hvdWxkLmVxdWFsKCd0ZXN0bmV0LXYxLjAnKTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSGFzaC5zaG91bGQuZXF1YWwoJ1NHTzFHS1N6eUU3SUVQSXRUeENCeXc5eDhGbW5yQ0RleGk5L2NPVUpPaUk9Jyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnR4VHlwZS5zaG91bGQuZXF1YWwoJ2Rpc2FibGVUb2tlbicpO1xuICAgICAgdHhJbmZvLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eFR5cGUnKTtcbiAgICAgIHR4SW5mby50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCdVU09OJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmllbGQgdHhUeXBlIGFuZCB0b2tlbk5hbWUgYXJlIGFkZGVkIG9uIHRyYW5zZmVyVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuYW1vdW50KEJpZ0ludCgnMTAwMCcpKS5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby50eFR5cGUuc2hvdWxkLmVxdWFsKCd0cmFuc2ZlclRva2VuJyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ1VTT04nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixzREFBOEI7QUFDOUIsMERBQTZCO0FBQzdCLGlEQUE0QztBQUM1Qyx3RUFBMEQ7QUFDMUQsOERBQTJEO0FBQzNELDBDQUE0RjtBQUU1RixRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUksRUFBZSxDQUFDO0lBQ3BCLElBQUksVUFBZ0MsQ0FBQztJQUNyQyxNQUFNLE9BQU8sR0FBRyw0REFBNEQsQ0FBQztJQUU3RSxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxNQUFNLFdBQVcsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDckQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUVuQixFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLFVBQVUsR0FBRyxJQUFJLCtCQUF5QixDQUFDLFdBQVcsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbEYsVUFBVTthQUNQLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQzthQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDO2FBQ2YsVUFBVSxD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RUFBRSxDQUFDLE9BQU8sQ0FBQzthQUM1QyxDQUFDLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDN0QsTUFBTSxPQUFPLEdBQUcsaUJBQU8sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsaUJBQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCBhbGdvc2RrIGZyb20gJ2FsZ29zZGsnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBBbGdvUmVzb3VyY2VzIGZyb20gJy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UGFpciwgQXNzZXRUcmFuc2ZlckJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcblxuZGVzY3JpYmUoJ0FsZ28gVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGxldCB0eDogVHJhbnNhY3Rpb247XG4gIGxldCB0eG5CdWlsZGVyOiBBc3NldFRyYW5zZmVyQnVpbGRlcjtcbiAgY29uc3QgYWRkcmVzcyA9ICdSSUpWTERZV0FTWlpOR09TUU5PSzdITjZKTkZMTU1aM0ZGQkJGRzJOTlJPTTVDRTc0NERBSlNQWko0JztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ2FsZ28nKTtcbiAgICBjb25zdCB0b2tlbkNvbmZpZyA9IGNvaW5zLmdldCgndGFsZ286VVNPTi0xNjAyNjcyOCcpO1xuICAgIGNvbnN0IGZpcnN0Um91bmQgPSAxNjc7XG4gICAgY29uc3QgbGFzdFJvdW5kID0gMTE2NztcbiAgICBjb25zdCBmZWUgPSAxMDAwO1xuICAgIGNvbnN0IHRva2VuSWQgPSAxO1xuICAgIGNvbnN0IGFtb3VudCA9ICcwJztcblxuICAgIHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvbmZpZyk7XG4gICAgdHhuQnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KHRva2VuQ29uZmlnKS5nZXRBc3NldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4bkJ1aWxkZXJcbiAgICAgIC5mZWUoeyBmZWU6IGZlZS50b1N0cmluZygpIH0pXG4gICAgICAuaXNGbGF0RmVlKHRydWUpXG4gICAgICAuZmlyc3RSb3VuZChmaXJzdFJvdW5kKVxuICAgICAgLmxhc3RSb3VuZChsYXN0Um91bmQpXG4gICAgICAudGVzdG5ldCgpXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWRkcmVzcyB9KVxuICAgICAgLnRva2VuSWQodG9rZW5JZClcbiAgICAgIC5hbW91bnQoQmlnSW50KGFtb3VudCkpXG4gICAgICAudG8oeyBhZGRyZXNzOiBhZGRyZXNzIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHgudG9Kc29uKCksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAvRW1wdHkgdHJhbnNhY3Rpb24vKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHNpZ24nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eC5zaWduKFtuZXcgS2V5UGFpcih7IHBydjogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5kZWZhdWx0LnNlY3JldEtleS50b1N0cmluZygnaGV4JykgfSldKSxcbiAgICAgICAgL0VtcHR5IHRyYW5zYWN0aW9uL1xuICAgICAgKTtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDIpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHguc2lnbihbbmV3IEtleVBhaXIoeyBwcnY6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuZGVmYXVsdC5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pXSksXG4gICAgICAgIC9FbXB0eSB0cmFuc2FjdGlvbi9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYW5ub3Qgc2lnbiAtIG5vIHNpZ25lciByZXF1aXJlZCcsICgpID0+IHtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogJ3NvbWUnIH0pLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2Fubm90IHNpZ24gLSB3cm9uZyBhY2NvdW50IHNlY3JldCcsICgpID0+IHtcbiAgICAgIHR4LnNldE51bWJlck9mUmVxdWlyZWRTaWduZXJzKDEpO1xuICAgICAgdHguc2VuZGVyKEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmNhblNpZ24oeyBrZXk6IEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDIuc2VjcmV0S2V5LnRvU3RyaW5nKCdoZXgnKSB9KSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbiBzaWduJywgKCkgPT4ge1xuICAgICAgdHguc2V0TnVtYmVyT2ZSZXF1aXJlZFNpZ25lcnMoMSk7XG4gICAgICB0eC5zZW5kZXIoQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FuU2lnbih7IGtleTogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50Mi5zZWNyZXRLZXkudG9TdHJpbmcoJ2hleCcpIH0pLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHR5cGUnLCAoKSA9PiB7XG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBlbmFibGVUb2tlbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhuQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhUeXBlJyk7XG4gICAgICB0eEluZm8udHhUeXBlLnNob3VsZC5lcXVhbCgnZW5hYmxlVG9rZW4nKTtcbiAgICAgIHR4SW5mby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG9rZW5OYW1lJyk7XG4gICAgICB0eEluZm8udG9rZW5OYW1lLnNob3VsZC5lcXVhbCgnVVNPTicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZpZWxkIHR4VHlwZSBhbmQgdG9rZW5OYW1lIGFyZSBhZGRlZCBvbiBkaXNhYmxlVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjbG9zZVJlbWFpbmRlclRvID0gJ1NQNzQ1SkpSNEtQUlFFWEpaSFZJRU43MzZMWVRMMlQyREZNRzNPSUlGSkJWNjZLNzNQSE5NRENaVk0nO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuY2xvc2VSZW1haW5kZXJUbyh7IGFkZHJlc3M6IGNsb3NlUmVtYWluZGVyVG8gfSkuYnVpbGQoKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhJbmZvID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdHModHhIZXgpO1xuXG4gICAgICB0eEluZm8udG8uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmZyb20uc2hvdWxkLmVxdWFsKGFkZHJlc3MpO1xuICAgICAgdHhJbmZvLmFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIHR4SW5mby5maXJzdFJvdW5kLnNob3VsZC5lcXVhbCgxNjcpO1xuICAgICAgdHhJbmZvLnRva2VuSWQuc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhJbmZvLmZlZS5zaG91bGQuZXF1YWwoMTAwMCk7XG4gICAgICB0eEluZm8uY2xvc2VSZW1haW5kZXJUby5zaG91bGQuZXF1YWwoY2xvc2VSZW1haW5kZXJUbyk7XG4gICAgICB0eEluZm8ubGFzdFJvdW5kLnNob3VsZC5lcXVhbCgxMTY3KTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSUQuc2hvdWxkLmVxdWFsKCd0ZXN0bmV0LXYxLjAnKTtcbiAgICAgIHR4SW5mby5nZW5lc2lzSGFzaC5zaG91bGQuZXF1YWwoJ1NHTzFHS1N6eUU3SUVQSXRUeENCeXc5eDhGbW5yQ0RleGk5L2NPVUpPaUk9Jyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnR4VHlwZS5zaG91bGQuZXF1YWwoJ2Rpc2FibGVUb2tlbicpO1xuICAgICAgdHhJbmZvLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eFR5cGUnKTtcbiAgICAgIHR4SW5mby50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCdVU09OJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmllbGQgdHhUeXBlIGFuZCB0b2tlbk5hbWUgYXJlIGFkZGVkIG9uIHRyYW5zZmVyVG9rZW4gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4bkJ1aWxkZXIuYW1vdW50KEJpZ0ludCgnMTAwMCcpKS5idWlsZCgpO1xuXG4gICAgICBjb25zdCB0eEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEluZm8gPSB0eC50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eEhleCk7XG5cbiAgICAgIHR4SW5mby50by5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uZnJvbS5zaG91bGQuZXF1YWwoYWRkcmVzcyk7XG4gICAgICB0eEluZm8uYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHhJbmZvLmZpcnN0Um91bmQuc2hvdWxkLmVxdWFsKDE2Nyk7XG4gICAgICB0eEluZm8udG9rZW5JZC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eEluZm8uZmVlLnNob3VsZC5lcXVhbCgxMDAwKTtcbiAgICAgIHR4SW5mby5sYXN0Um91bmQuc2hvdWxkLmVxdWFsKDExNjcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNJRC5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQtdjEuMCcpO1xuICAgICAgdHhJbmZvLmdlbmVzaXNIYXNoLnNob3VsZC5lcXVhbCgnU0dPMUdLU3p5RTdJRVBJdFR4Q0J5dzl4OEZtbnJDRGV4aTkvY09VSk9pST0nKTtcbiAgICAgIHR4SW5mby50eFR5cGUuc2hvdWxkLmVxdWFsKCd0cmFuc2ZlclRva2VuJyk7XG4gICAgICB0eEluZm8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4VHlwZScpO1xuICAgICAgdHhJbmZvLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ1VTT04nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZFJhd011bHRpc2lnU2lnbmF0dXJlJywgKCkgPT4ge1xuICAgIGl0KCd0aHJvd3Mgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4LmFkZFJhd011bHRpc2lnU2lnbmF0dXJlKGFkZHJlc3MsIG5ldyBVaW50OEFycmF5KDY0KSksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FwcGVuZHMgYSByYXcgZXh0ZXJuYWwgc2lnbmF0dXJlIGFuZCBwcm9kdWNlcyBhIHZhbGlkIG11bHRpc2lnIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYTEgPSBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxO1xuICAgICAgY29uc3QgYTIgPSBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQyO1xuICAgICAgY29uc3QgYTMgPSBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQzO1xuXG4gICAgICB0eG5CdWlsZGVyLm51bWJlck9mUmVxdWlyZWRTaWduZXJzKDIpLnNldFNpZ25lcnMoW2ExLmFkZHJlc3MsIGEyLmFkZHJlc3MsIGEzLmFkZHJlc3NdKTtcbiAgICAgIHR4bkJ1aWxkZXIuc2lnbih7IGtleTogYTEucHJ2S2V5IH0pO1xuXG4gICAgICBjb25zdCBidWlsdCA9IChhd2FpdCB0eG5CdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgYWxnb1R4biA9IGJ1aWx0LmdldEFsZ29UcmFuc2FjdGlvbigpITtcbiAgICAgIGNvbnN0IHJhd1NpZyA9IG5hY2wuc2lnbi5kZXRhY2hlZChhbGdvVHhuLmJ5dGVzVG9TaWduKCksIG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKGEyLnNlY3JldEtleSkuc2VjcmV0S2V5KTtcblxuICAgICAgYnVpbHQuYWRkUmF3TXVsdGlzaWdTaWduYXR1cmUoYTIuYWRkcmVzcywgcmF3U2lnKTtcblxuICAgICAgY29uc3QgbXNpZ0FkZHIgPSBhbGdvc2RrLm11bHRpc2lnQWRkcmVzcyh7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgYWRkcnM6IFthMS5hZGRyZXNzLCBhMi5hZGRyZXNzLCBhMy5hZGRyZXNzXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhwZWN0ZWRQayA9IGFsZ29zZGsuZGVjb2RlQWRkcmVzcyhtc2lnQWRkcikucHVibGljS2V5O1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGFsZ29zZGsuZGVjb2RlU2lnbmVkVHJhbnNhY3Rpb24oYnVpbHQudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCBtc2lnID0gZGVjb2RlZC5tc2lnO1xuICAgICAgaWYgKCFtc2lnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBtdWx0aXNpZyBzaWduYXR1cmUnKTtcbiAgICAgIH1cbiAgICAgIGFsZ29zZGsudmVyaWZ5TXVsdGlzaWcoYWxnb1R4bi5ieXRlc1RvU2lnbigpLCBtc2lnLCBleHBlY3RlZFBrKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=