@bitgo-beta/sdk-coin-cspr 1.2.19-beta.162 → 1.2.19-beta.1621

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 (67) hide show
  1. package/dist/src/cspr.d.ts +5 -2
  2. package/dist/src/cspr.d.ts.map +1 -1
  3. package/dist/src/cspr.js +36 -14
  4. package/dist/src/index.js +23 -9
  5. package/dist/src/lib/constants.d.ts +1 -1
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +2 -2
  8. package/dist/src/lib/delegateBuilder.js +6 -6
  9. package/dist/src/lib/ifaces.d.ts +2 -2
  10. package/dist/src/lib/ifaces.d.ts.map +1 -1
  11. package/dist/src/lib/index.js +23 -9
  12. package/dist/src/lib/keyPair.js +9 -10
  13. package/dist/src/lib/transaction.js +47 -34
  14. package/dist/src/lib/transactionBuilder.js +3 -3
  15. package/dist/src/lib/transactionBuilderFactory.js +2 -2
  16. package/dist/src/lib/transferBuilder.js +9 -9
  17. package/dist/src/lib/undelegateBuilder.js +6 -6
  18. package/dist/src/lib/utils.js +58 -45
  19. package/dist/src/lib/walletInitializationBuilder.js +1 -1
  20. package/dist/src/tcspr.js +1 -1
  21. package/dist/test/fixtures/cspr.d.ts +4 -0
  22. package/dist/test/fixtures/cspr.d.ts.map +1 -0
  23. package/dist/test/fixtures/cspr.js +7 -0
  24. package/dist/test/fixtures/resources.d.ts +92 -0
  25. package/dist/test/fixtures/resources.d.ts.map +1 -0
  26. package/dist/test/fixtures/resources.js +96 -0
  27. package/dist/test/integration/index.d.ts +1 -0
  28. package/dist/test/integration/index.d.ts.map +1 -0
  29. package/dist/test/integration/index.js +1 -0
  30. package/dist/test/unit/cspr.d.ts +2 -0
  31. package/dist/test/unit/cspr.d.ts.map +1 -0
  32. package/dist/test/unit/cspr.js +680 -0
  33. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  34. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  35. package/dist/test/unit/lib/keyPair.js +159 -0
  36. package/dist/test/unit/lib/signMessage.d.ts +2 -0
  37. package/dist/test/unit/lib/signMessage.d.ts.map +1 -0
  38. package/dist/test/unit/lib/signMessage.js +68 -0
  39. package/dist/test/unit/lib/transaction.d.ts +2 -0
  40. package/dist/test/unit/lib/transaction.d.ts.map +1 -0
  41. package/dist/test/unit/lib/transaction.js +271 -0
  42. package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts +2 -0
  43. package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts.map +1 -0
  44. package/dist/test/unit/lib/transactionBuilder/delegateBuilder.js +191 -0
  45. package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts +2 -0
  46. package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  47. package/dist/test/unit/lib/transactionBuilder/transactionBuilder.js +315 -0
  48. package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts +2 -0
  49. package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
  50. package/dist/test/unit/lib/transactionBuilder/transferBuilder.js +519 -0
  51. package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts +2 -0
  52. package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts.map +1 -0
  53. package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.js +192 -0
  54. package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts +2 -0
  55. package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts.map +1 -0
  56. package/dist/test/unit/lib/transactionBuilder/walletInitialization.js +338 -0
  57. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  58. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  59. package/dist/test/unit/lib/transactionBuilderFactory.js +328 -0
  60. package/dist/test/unit/lib/util.d.ts +2 -0
  61. package/dist/test/unit/lib/util.d.ts.map +1 -0
  62. package/dist/test/unit/lib/util.js +176 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/package.json +13 -10
  65. package/.eslintignore +0 -4
  66. package/.mocharc.yml +0 -8
  67. package/CHANGELOG.md +0 -272
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const lib_1 = require("../../../../src/lib");
42
+ const testData = __importStar(require("../../../fixtures/resources"));
43
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
44
+ const utils_1 = require("../../../../src/lib/utils");
45
+ const statics_1 = require("@bitgo-beta/statics");
46
+ describe('CSPR Wallet initialization', () => {
47
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
48
+ const owner1Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress();
49
+ const owner2Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress();
50
+ const owner3Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress();
51
+ const owner4Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_4.publicKey }).getAddress();
52
+ const sourceAddress = new lib_1.KeyPair({ pub: testData.ROOT_ACCOUNT.publicKey }).getAddress();
53
+ const initSignedTxBuilder = () => {
54
+ const txBuilder = initUnsignedTxBuilder();
55
+ txBuilder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
56
+ return txBuilder;
57
+ };
58
+ const initSignedTxBuilderWithExtendedKey = () => {
59
+ const txBuilder = initUnsignedTxBuilder();
60
+ txBuilder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
61
+ return txBuilder;
62
+ };
63
+ const initUnsignedTxBuilder = () => {
64
+ const txBuilder = factory.getWalletInitializationBuilder();
65
+ txBuilder.fee(testData.FEE);
66
+ txBuilder.owner(owner1Address);
67
+ txBuilder.owner(owner2Address);
68
+ txBuilder.owner(owner3Address);
69
+ txBuilder.source({ address: sourceAddress });
70
+ return txBuilder;
71
+ };
72
+ describe('should build ', () => {
73
+ it('an init transaction', async () => {
74
+ const txBuilder = initSignedTxBuilder();
75
+ const tx = await txBuilder.build();
76
+ const txJson = tx.toJson();
77
+ should_1.default.deepEqual(txJson.fee, testData.FEE);
78
+ should_1.default.deepEqual(tx.signature.length, 1);
79
+ should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
80
+ should_1.default.equal(txJson.from, sourceAddress);
81
+ tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
82
+ });
83
+ it('an init transaction using extended key to sign', async () => {
84
+ const txBuilder = initSignedTxBuilderWithExtendedKey();
85
+ const tx = await txBuilder.build();
86
+ const txJson = tx.toJson();
87
+ should_1.default.deepEqual(txJson.fee, testData.FEE);
88
+ should_1.default.deepEqual(tx.signature.length, 1);
89
+ should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
90
+ should_1.default.equal(txJson.from, sourceAddress);
91
+ tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
92
+ });
93
+ it('an init transaction with external signature', async () => {
94
+ const txBuilder = factory.getWalletInitializationBuilder();
95
+ txBuilder.fee(testData.FEE);
96
+ txBuilder.owner(owner1Address);
97
+ txBuilder.owner(owner2Address);
98
+ txBuilder.owner(owner3Address);
99
+ txBuilder.source({ address: sourceAddress });
100
+ txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
101
+ const tx = await txBuilder.build();
102
+ const txJson = tx.toJson();
103
+ should_1.default.equal(txJson.from, sourceAddress);
104
+ });
105
+ it('an init transaction with external signature included twice', async () => {
106
+ const txBuilder = factory.getWalletInitializationBuilder();
107
+ txBuilder.fee(testData.FEE);
108
+ txBuilder.owner(owner1Address);
109
+ txBuilder.owner(owner2Address);
110
+ txBuilder.owner(owner3Address);
111
+ txBuilder.source({ address: sourceAddress });
112
+ txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
113
+ txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
114
+ const tx = await txBuilder.build();
115
+ const txJson = tx.toJson();
116
+ should_1.default.equal(txJson.from, sourceAddress);
117
+ });
118
+ });
119
+ describe('should fail to build', () => {
120
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
121
+ it('a transaction without fee', async () => {
122
+ const txBuilder = factory.getWalletInitializationBuilder();
123
+ txBuilder.owner(owner1Address);
124
+ txBuilder.owner(owner2Address);
125
+ txBuilder.owner(owner3Address);
126
+ txBuilder.source({ address: sourceAddress });
127
+ await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_FEE);
128
+ });
129
+ it('a wallet initialization the wrong number of owners', async () => {
130
+ const txBuilder = factory.getWalletInitializationBuilder();
131
+ txBuilder.fee(testData.FEE);
132
+ txBuilder.owner(owner1Address);
133
+ txBuilder.owner(owner2Address);
134
+ txBuilder.source({ address: sourceAddress });
135
+ await txBuilder.build().should.be.rejectedWith(testData.INVALID_NUMBER_OF_OWNERS_TWO_OF_THREE);
136
+ assert_1.default.throws(() => txBuilder.owner(owner1Address), 'Repeated owner address: ' + owner1Address);
137
+ should_1.default.doesNotThrow(() => txBuilder.owner(owner3Address));
138
+ assert_1.default.throws(() => txBuilder.owner(owner4Address), /A maximum of 3 owners can be set for a multisig wallet/);
139
+ const newTxBuilder = factory.getWalletInitializationBuilder();
140
+ newTxBuilder.fee(testData.FEE);
141
+ txBuilder.source({ address: sourceAddress });
142
+ await newTxBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_OWNERS);
143
+ });
144
+ it('a transaction with invalid source', async () => {
145
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('thbar'));
146
+ const txBuilder = factory.getWalletInitializationBuilder();
147
+ txBuilder.fee(testData.FEE);
148
+ txBuilder.owner(owner1Address);
149
+ txBuilder.owner(owner2Address);
150
+ txBuilder.owner(owner3Address);
151
+ await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_SOURCE);
152
+ });
153
+ });
154
+ describe('should validate', () => {
155
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
156
+ it('an address', async () => {
157
+ const txBuilder = factory.getWalletInitializationBuilder();
158
+ txBuilder.validateAddress({ address: testData.VALID_ADDRESS });
159
+ assert_1.default.throws(() => txBuilder.validateAddress({ address: testData.INVALID_ADDRESS }), new RegExp('Invalid address ' + testData.INVALID_ADDRESS));
160
+ });
161
+ it('value should be greater than zero', () => {
162
+ const txBuilder = factory.getWalletInitializationBuilder();
163
+ assert_1.default.throws(() => txBuilder.fee({ gasLimit: '-10' }));
164
+ should_1.default.doesNotThrow(() => txBuilder.fee({ gasLimit: '10' }));
165
+ });
166
+ it('a private key', () => {
167
+ const txBuilder = factory.getWalletInitializationBuilder();
168
+ assert_1.default.throws(() => txBuilder.validateKey({ key: 'abc' }), /Unsupported private key/);
169
+ should_1.default.doesNotThrow(() => txBuilder.validateKey({ key: testData.ACCOUNT_1.privateKey }));
170
+ });
171
+ it('a transaction to build', async () => {
172
+ const txBuilder = factory.getWalletInitializationBuilder();
173
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
174
+ txBuilder.fee(testData.FEE);
175
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
176
+ txBuilder.source({ address: testData.VALID_ADDRESS });
177
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
178
+ txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
179
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 1/);
180
+ txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
181
+ assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 2/);
182
+ txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
183
+ should_1.default.doesNotThrow(() => txBuilder.validateTransaction());
184
+ });
185
+ });
186
+ describe('should build from', () => {
187
+ describe('serialized transactions', () => {
188
+ it('a non signed transfer transaction from serialized', async () => {
189
+ const builder = initUnsignedTxBuilder();
190
+ const tx = (await builder.build());
191
+ const txJson = tx.toJson();
192
+ should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
193
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
194
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
195
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
196
+ const builder2 = factory.getWalletInitializationBuilder();
197
+ builder2.from(tx.toBroadcastFormat());
198
+ const tx2 = (await builder2.build());
199
+ const tx2Json = tx2.toJson();
200
+ should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
201
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
202
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
203
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
204
+ should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
205
+ });
206
+ it('a signed transfer transaction from serialized', async () => {
207
+ const builder = initUnsignedTxBuilder();
208
+ builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
209
+ const tx = (await builder.build());
210
+ const txJson = tx.toJson();
211
+ should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
212
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
213
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
214
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
215
+ const builder2 = factory.getWalletInitializationBuilder();
216
+ builder2.from(tx.toBroadcastFormat());
217
+ const tx2 = (await builder2.build());
218
+ const tx2Json = tx2.toJson();
219
+ should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
220
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
221
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
222
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
223
+ should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
224
+ should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
225
+ });
226
+ it('a signed transfer transaction with extended key from serialized', async () => {
227
+ const builder = initUnsignedTxBuilder();
228
+ builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
229
+ const tx = (await builder.build());
230
+ const txJson = tx.toJson();
231
+ should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
232
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
233
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
234
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
235
+ const builder2 = factory.getWalletInitializationBuilder();
236
+ builder2.from(tx.toBroadcastFormat());
237
+ const tx2 = (await builder2.build());
238
+ const tx2Json = tx2.toJson();
239
+ should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
240
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
241
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
242
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
243
+ should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
244
+ should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
245
+ });
246
+ it('an offline multisig transfer transaction', async () => {
247
+ const builder = initUnsignedTxBuilder();
248
+ builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
249
+ builder.sign({ key: testData.ACCOUNT_1.privateKey });
250
+ const tx = (await builder.build());
251
+ const txJson = tx.toJson();
252
+ should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
253
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
254
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
255
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
256
+ const builder2 = factory.getWalletInitializationBuilder();
257
+ builder2.from(tx.toBroadcastFormat());
258
+ const tx2 = (await builder2.build());
259
+ const tx2Json = tx2.toJson();
260
+ should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
261
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
262
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
263
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
264
+ should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
265
+ should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
266
+ });
267
+ it('an offline multisig transfer transaction using extended keys', async () => {
268
+ const builder = initUnsignedTxBuilder();
269
+ builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
270
+ builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
271
+ const tx = (await builder.build());
272
+ const txJson = tx.toJson();
273
+ should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
274
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
275
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
276
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
277
+ const builder2 = factory.getWalletInitializationBuilder();
278
+ builder2.from(tx.toBroadcastFormat());
279
+ const tx2 = (await builder2.build());
280
+ const tx2Json = tx2.toJson();
281
+ should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
282
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
283
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
284
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
285
+ should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
286
+ should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
287
+ });
288
+ it('an offline multisig transfer transaction using one extended key', async () => {
289
+ const builder = initUnsignedTxBuilder();
290
+ builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
291
+ builder.sign({ key: testData.ACCOUNT_1.privateKey });
292
+ const tx = (await builder.build());
293
+ const txJson = tx.toJson();
294
+ should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
295
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
296
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
297
+ should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
298
+ const builder2 = factory.getWalletInitializationBuilder();
299
+ builder2.from(tx.toBroadcastFormat());
300
+ const tx2 = (await builder2.build());
301
+ const tx2Json = tx2.toJson();
302
+ should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
303
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
304
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
305
+ should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
306
+ should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
307
+ should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
308
+ });
309
+ });
310
+ });
311
+ describe('txJson validation', () => {
312
+ it('contains all required fields for Wallet Initialization', async () => {
313
+ const txBuilder = initSignedTxBuilder();
314
+ const tx = (await txBuilder.build());
315
+ const txJson = tx.toJson();
316
+ should_1.default.deepEqual(txJson.fee, testData.FEE);
317
+ should_1.default.equal(txJson.deployType, 'WalletInitialization');
318
+ should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
319
+ should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
320
+ should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
321
+ should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
322
+ should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
323
+ });
324
+ it('contains all required fields for Wallet Initialization using extended key to sign', async () => {
325
+ const txBuilder = initSignedTxBuilderWithExtendedKey();
326
+ const tx = (await txBuilder.build());
327
+ const txJson = tx.toJson();
328
+ should_1.default.deepEqual(txJson.fee, testData.FEE);
329
+ should_1.default.equal(txJson.deployType, 'WalletInitialization');
330
+ should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
331
+ should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
332
+ should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
333
+ should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
334
+ should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
335
+ });
336
+ });
337
+ });
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uQnVpbGRlci93YWxsZXRJbml0aWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsNkNBQXlFO0FBQ3pFLHNFQUF3RDtBQUN4RCxtREFBdUQ7QUFFdkQscURBQTREO0FBRTVELGlEQUE0QztBQUU1QyxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RGLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMs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QyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXpFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgdmVyaWZ5U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBDTFN0cmluZyB9IGZyb20gJ2Nhc3Blci1qcy1zZGsnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuZGVzY3JpYmUoJ0NTUFIgV2FsbGV0IGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y3NwcicpKTtcbiAgY29uc3Qgb3duZXIxQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXIyQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXIzQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXI0QWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzQucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgc291cmNlQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcblxuICBjb25zdCBpbml0U2lnbmVkVHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGluaXRTaWduZWRUeEJ1aWxkZXJXaXRoRXh0ZW5kZWRLZXkgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC54UHJpdmF0ZUtleSB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGluaXRVbnNpZ25lZFR4QnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMkFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgJywgKCkgPT4ge1xuICAgIGl0KCdhbiBpbml0IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLCB0ZXN0RGF0YS5GRUUpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdmVyaWZ5U2lnbmF0dXJlKHR4LnNpZ25hdHVyZVswXSwgdHhKc29uLmhhc2gsIHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wdWJsaWNLZXkpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgc291cmNlQWRkcmVzcyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZW5kZWQga2V5IHRvIHNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0U2lnbmVkVHhCdWlsZGVyV2l0aEV4dGVuZGVkS2V5KCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB2ZXJpZnlTaWduYXR1cmUodHguc2lnbmF0dXJlWzBdLCB0eEpzb24uaGFzaCwgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCBzb3VyY2VBZGRyZXNzKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25hdHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduYXR1cmUoXG4gICAgICAgIHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5zaWduYXR1cmUsXG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUucHVibGljS2V5IH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIHNvdXJjZUFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24gd2l0aCBleHRlcm5hbCBzaWduYXR1cmUgaW5jbHVkZWQgdHdpY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMUFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMkFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyM0FkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUuc2lnbmF0dXJlLFxuICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnB1YmxpY0tleSB9KVxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduYXR1cmUoXG4gICAgICAgIHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5zaWduYXR1cmUsXG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUucHVibGljS2V5IH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIHNvdXJjZUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8gYnVpbGQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGNzcHInKSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB3aXRob3V0IGZlZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgodGVzdERhdGEuSU5WQUxJRF9UUkFOU0FDVElPTl9NSVNTSU5HX0ZFRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdGhlIHdyb25nIG51bWJlciBvZiBvd25lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMUFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMkFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHRlc3REYXRhLklOVkFMSURfTlVNQkVSX09GX09XTkVSU19UV09fT0ZfVEhSRUUpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKSwgJ1JlcGVhdGVkIG93bmVyIGFkZHJlc3M6ICcgKyBvd25lcjFBZGRyZXNzKTtcblxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcykpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIub3duZXIob3duZXI0QWRkcmVzcyksIC9BIG1heGltdW0gb2YgMyBvd25lcnMgY2FuIGJlIHNldCBmb3IgYSBtdWx0aXNpZyB3YWxsZXQvKTtcblxuICAgICAgY29uc3QgbmV3VHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIG5ld1R4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgICAgYXdhaXQgbmV3VHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX01JU1NJTkdfT1dORVJTKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBzb3VyY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aGJhcicpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHRlc3REYXRhLklOVkFMSURfVFJBTlNBQ1RJT05fTUlTU0lOR19TT1VSQ0UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rjc3ByJykpO1xuXG4gICAgaXQoJ2FuIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6IHRlc3REYXRhLlZBTElEX0FERFJFU1MgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogdGVzdERhdGEuSU5WQUxJRF9BRERSRVNTIH0pLFxuICAgICAgICBuZXcgUmVnRXhwKCdJbnZhbGlkIGFkZHJlc3MgJyArIHRlc3REYXRhLklOVkFMSURfQUREUkVTUylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmZlZSh7IGdhc0xpbWl0OiAnLTEwJyB9KSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5mZWUoeyBnYXNMaW1pdDogJzEwJyB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogJ2FiYycgfSksIC9VbnN1cHBvcnRlZCBwcml2YXRlIGtleS8pO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcml2YXRlS2V5IH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHRvIGJ1aWxkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgd2FsbGV0IG93bmVycy8pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB3YWxsZXQgb3duZXJzLyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogdGVzdERhdGEuVkFMSURfQUREUkVTUyB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgd2FsbGV0IG93bmVycy8pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC93cm9uZyBudW1iZXIgb2Ygb3duZXJzIC0tIHJlcXVpcmVkOiAzLCBmb3VuZDogMS8pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC93cm9uZyBudW1iZXIgb2Ygb3duZXJzIC0tIHJlcXVpcmVkOiAzLCBmb3VuZDogMi8pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCkpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBmcm9tJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdzZXJpYWxpemVkIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICAgIGl0KCdhIG5vbiBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBleHRlbmRlZCBrZXkgZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICB0eDIuY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbiBvZmZsaW5lIG11bHRpc2lnIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnByaXZhdGVLZXkgfSk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZW5kZWQga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEueFByaXZhdGVLZXkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdXNpbmcgb25lIGV4dGVuZGVkIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHhKc29uIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NvbnRhaW5zIGFsbCByZXF1aXJlZCBmaWVsZHMgZm9yIFdhbGxldCBJbml0aWFsaXphdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRTaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLCB0ZXN0RGF0YS5GRUUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5kZXBsb3lUeXBlLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgJzAyJyArIHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5oYXNoLCBCdWZmZXIuZnJvbSh0eC5jYXNwZXJUeC5oYXNoKS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMSwgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIyLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjMsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29udGFpbnMgYWxsIHJlcXVpcmVkIGZpZWxkcyBmb3IgV2FsbGV0IEluaXRpYWxpemF0aW9uIHVzaW5nIGV4dGVuZGVkIGtleSB0byBzaWduJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFNpZ25lZFR4QnVpbGRlcldpdGhFeHRlbmRlZEtleSgpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmRlcGxveVR5cGUsICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCAnMDInICsgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmhhc2gsIEJ1ZmZlci5mcm9tKHR4LmNhc3BlclR4Lmhhc2gpLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIxLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjIsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMywgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transactionBuilderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/transactionBuilderFactory.ts"],"names":[],"mappings":""}