@bitgo-beta/sdk-coin-iota 1.0.1-beta.32 → 1.0.1-beta.320
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.
- package/README.md +1 -1
- package/dist/src/iota.d.ts +13 -2
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +142 -22
- package/dist/src/lib/constants.d.ts +10 -6
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +12 -8
- package/dist/src/lib/iface.d.ts +33 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/transaction.d.ts +72 -5
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +270 -6
- package/dist/src/lib/transactionBuilder.d.ts +70 -9
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +155 -14
- package/dist/src/lib/transactionBuilderFactory.d.ts +15 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +45 -5
- package/dist/src/lib/transferBuilder.d.ts +10 -2
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +45 -3
- package/dist/src/lib/transferTransaction.d.ts +28 -0
- package/dist/src/lib/transferTransaction.d.ts.map +1 -0
- package/dist/src/lib/transferTransaction.js +173 -0
- package/dist/src/lib/utils.d.ts +2 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +28 -4
- package/dist/test/resources/iota.d.ts +35 -0
- package/dist/test/resources/iota.d.ts.map +1 -0
- package/dist/test/resources/iota.js +93 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +16 -0
- package/dist/test/unit/iota.d.ts +2 -0
- package/dist/test/unit/iota.d.ts.map +1 -0
- package/dist/test/unit/iota.js +603 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +135 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +306 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +243 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +400 -0
- package/dist/test/unit/transferTransaction.d.ts +2 -0
- package/dist/test/unit/transferTransaction.d.ts.map +1 -0
- package/dist/test/unit/transferTransaction.js +465 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +278 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -10
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
|
@@ -0,0 +1,465 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
40
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
41
|
+
const src_1 = require("../../src");
|
|
42
|
+
const testData = __importStar(require("../resources/iota"));
|
|
43
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
44
|
+
describe('Iota Transfer Transaction', () => {
|
|
45
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
|
|
46
|
+
describe('Transaction Properties', () => {
|
|
47
|
+
it('should have correct transaction type', async function () {
|
|
48
|
+
const txBuilder = factory.getTransferBuilder();
|
|
49
|
+
txBuilder.sender(testData.sender.address);
|
|
50
|
+
txBuilder.recipients(testData.recipients);
|
|
51
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
52
|
+
const tx = (await txBuilder.build());
|
|
53
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
54
|
+
});
|
|
55
|
+
it('should have correct sender', async function () {
|
|
56
|
+
const txBuilder = factory.getTransferBuilder();
|
|
57
|
+
txBuilder.sender(testData.sender.address);
|
|
58
|
+
txBuilder.recipients(testData.recipients);
|
|
59
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
60
|
+
const tx = (await txBuilder.build());
|
|
61
|
+
should_1.default.equal(tx.sender, testData.sender.address);
|
|
62
|
+
});
|
|
63
|
+
it('should have correct recipients', async function () {
|
|
64
|
+
const txBuilder = factory.getTransferBuilder();
|
|
65
|
+
txBuilder.sender(testData.sender.address);
|
|
66
|
+
txBuilder.recipients(testData.recipients);
|
|
67
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
68
|
+
const tx = (await txBuilder.build());
|
|
69
|
+
should_1.default.deepEqual(tx.recipients, testData.recipients);
|
|
70
|
+
});
|
|
71
|
+
it('should have correct payment objects', async function () {
|
|
72
|
+
const txBuilder = factory.getTransferBuilder();
|
|
73
|
+
txBuilder.sender(testData.sender.address);
|
|
74
|
+
txBuilder.recipients(testData.recipients);
|
|
75
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
76
|
+
const tx = (await txBuilder.build());
|
|
77
|
+
should_1.default.deepEqual(tx.paymentObjects, testData.paymentObjects);
|
|
78
|
+
});
|
|
79
|
+
it('should be in simulate mode by default', async function () {
|
|
80
|
+
const txBuilder = factory.getTransferBuilder();
|
|
81
|
+
txBuilder.sender(testData.sender.address);
|
|
82
|
+
txBuilder.recipients(testData.recipients);
|
|
83
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
84
|
+
const tx = (await txBuilder.build());
|
|
85
|
+
should_1.default.equal(tx.isSimulateTx, true);
|
|
86
|
+
});
|
|
87
|
+
it('should not be in simulate mode when gas data is provided', async function () {
|
|
88
|
+
const txBuilder = factory.getTransferBuilder();
|
|
89
|
+
txBuilder.sender(testData.sender.address);
|
|
90
|
+
txBuilder.recipients(testData.recipients);
|
|
91
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
92
|
+
txBuilder.gasData(testData.gasData);
|
|
93
|
+
const tx = (await txBuilder.build());
|
|
94
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('Transaction Inputs and Outputs', () => {
|
|
98
|
+
it('should correctly set inputs', async function () {
|
|
99
|
+
const txBuilder = factory.getTransferBuilder();
|
|
100
|
+
txBuilder.sender(testData.sender.address);
|
|
101
|
+
txBuilder.recipients(testData.recipients);
|
|
102
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
103
|
+
txBuilder.gasData(testData.gasData);
|
|
104
|
+
const tx = (await txBuilder.build());
|
|
105
|
+
const totalAmount = testData.recipients.reduce((sum, r) => sum + Number(r.amount), 0);
|
|
106
|
+
tx.inputs.length.should.equal(1);
|
|
107
|
+
tx.inputs[0].should.deepEqual({
|
|
108
|
+
address: testData.sender.address,
|
|
109
|
+
value: totalAmount.toString(),
|
|
110
|
+
coin: 'tiota',
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
it('should correctly set outputs', async function () {
|
|
114
|
+
const txBuilder = factory.getTransferBuilder();
|
|
115
|
+
txBuilder.sender(testData.sender.address);
|
|
116
|
+
txBuilder.recipients(testData.recipients);
|
|
117
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
118
|
+
txBuilder.gasData(testData.gasData);
|
|
119
|
+
const tx = (await txBuilder.build());
|
|
120
|
+
tx.outputs.length.should.equal(testData.recipients.length);
|
|
121
|
+
testData.recipients.forEach((recipient, index) => {
|
|
122
|
+
tx.outputs[index].should.deepEqual({
|
|
123
|
+
address: recipient.address,
|
|
124
|
+
value: recipient.amount,
|
|
125
|
+
coin: 'tiota',
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('Transaction Serialization', () => {
|
|
131
|
+
it('should serialize to JSON correctly', async function () {
|
|
132
|
+
const txBuilder = factory.getTransferBuilder();
|
|
133
|
+
txBuilder.sender(testData.sender.address);
|
|
134
|
+
txBuilder.recipients(testData.recipients);
|
|
135
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
136
|
+
txBuilder.gasData(testData.gasData);
|
|
137
|
+
const tx = (await txBuilder.build());
|
|
138
|
+
const json = tx.toJson();
|
|
139
|
+
should_1.default.equal(json.sender, testData.sender.address);
|
|
140
|
+
should_1.default.deepEqual(json.recipients, testData.recipients);
|
|
141
|
+
should_1.default.deepEqual(json.paymentObjects, testData.paymentObjects);
|
|
142
|
+
should_1.default.equal(json.gasBudget, testData.GAS_BUDGET);
|
|
143
|
+
should_1.default.equal(json.gasPrice, testData.GAS_PRICE);
|
|
144
|
+
should_1.default.deepEqual(json.gasPaymentObjects, testData.gasPaymentObjects);
|
|
145
|
+
should_1.default.equal(json.type, sdk_core_1.TransactionType.Send);
|
|
146
|
+
});
|
|
147
|
+
it('should deserialize from JSON correctly', async function () {
|
|
148
|
+
const txBuilder = factory.getTransferBuilder();
|
|
149
|
+
txBuilder.sender(testData.sender.address);
|
|
150
|
+
txBuilder.recipients(testData.recipients);
|
|
151
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
152
|
+
txBuilder.gasData(testData.gasData);
|
|
153
|
+
const tx = (await txBuilder.build());
|
|
154
|
+
const json = tx.toJson();
|
|
155
|
+
const newTx = new src_1.TransferTransaction(statics_1.coins.get('tiota'));
|
|
156
|
+
newTx.parseFromJSON(json);
|
|
157
|
+
should_1.default.equal(newTx.sender, tx.sender);
|
|
158
|
+
should_1.default.deepEqual(newTx.recipients, tx.recipients);
|
|
159
|
+
should_1.default.deepEqual(newTx.paymentObjects, tx.paymentObjects);
|
|
160
|
+
should_1.default.equal(newTx.gasBudget, tx.gasBudget);
|
|
161
|
+
should_1.default.equal(newTx.gasPrice, tx.gasPrice);
|
|
162
|
+
});
|
|
163
|
+
it('should serialize to broadcast format', async function () {
|
|
164
|
+
const txBuilder = factory.getTransferBuilder();
|
|
165
|
+
txBuilder.sender(testData.sender.address);
|
|
166
|
+
txBuilder.recipients(testData.recipients);
|
|
167
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
168
|
+
txBuilder.gasData(testData.gasData);
|
|
169
|
+
const tx = (await txBuilder.build());
|
|
170
|
+
const broadcastFormat = await tx.toBroadcastFormat();
|
|
171
|
+
should_1.default.exist(broadcastFormat);
|
|
172
|
+
should_1.default.equal(typeof broadcastFormat, 'string');
|
|
173
|
+
should_1.default.equal(broadcastFormat.length > 0, true);
|
|
174
|
+
});
|
|
175
|
+
it('should serialize to broadcast format', async function () {
|
|
176
|
+
const txBuilder = factory.getTransferBuilder();
|
|
177
|
+
txBuilder.sender(testData.sender.address);
|
|
178
|
+
txBuilder.recipients(testData.recipients);
|
|
179
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
180
|
+
txBuilder.gasData(testData.gasData);
|
|
181
|
+
const tx = (await txBuilder.build());
|
|
182
|
+
const broadcastFormat = await tx.toBroadcastFormat();
|
|
183
|
+
should_1.default.exist(broadcastFormat);
|
|
184
|
+
should_1.default.equal(typeof broadcastFormat, 'string');
|
|
185
|
+
should_1.default.equal(broadcastFormat.length > 0, true);
|
|
186
|
+
// Note: parseFromBroadcastTx has known parsing issues and is not fully tested here
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('Gas Configuration', () => {
|
|
190
|
+
it('should set gas budget correctly', async function () {
|
|
191
|
+
const txBuilder = factory.getTransferBuilder();
|
|
192
|
+
txBuilder.sender(testData.sender.address);
|
|
193
|
+
txBuilder.recipients(testData.recipients);
|
|
194
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
195
|
+
txBuilder.gasData(testData.gasData);
|
|
196
|
+
const tx = (await txBuilder.build());
|
|
197
|
+
should_1.default.equal(tx.gasBudget, testData.GAS_BUDGET);
|
|
198
|
+
});
|
|
199
|
+
it('should set gas price correctly', async function () {
|
|
200
|
+
const txBuilder = factory.getTransferBuilder();
|
|
201
|
+
txBuilder.sender(testData.sender.address);
|
|
202
|
+
txBuilder.recipients(testData.recipients);
|
|
203
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
204
|
+
txBuilder.gasData(testData.gasData);
|
|
205
|
+
const tx = (await txBuilder.build());
|
|
206
|
+
should_1.default.equal(tx.gasPrice, testData.GAS_PRICE);
|
|
207
|
+
});
|
|
208
|
+
it('should set gas payment objects correctly', async function () {
|
|
209
|
+
const txBuilder = factory.getTransferBuilder();
|
|
210
|
+
txBuilder.sender(testData.sender.address);
|
|
211
|
+
txBuilder.recipients(testData.recipients);
|
|
212
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
213
|
+
txBuilder.gasData(testData.gasData);
|
|
214
|
+
const tx = (await txBuilder.build());
|
|
215
|
+
should_1.default.deepEqual(tx.gasPaymentObjects, testData.gasPaymentObjects);
|
|
216
|
+
});
|
|
217
|
+
it('should set gas sponsor correctly', async function () {
|
|
218
|
+
const txBuilder = factory.getTransferBuilder();
|
|
219
|
+
txBuilder.sender(testData.sender.address);
|
|
220
|
+
txBuilder.recipients(testData.recipients);
|
|
221
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
222
|
+
txBuilder.gasData(testData.gasData);
|
|
223
|
+
txBuilder.gasSponsor(testData.gasSponsor.address);
|
|
224
|
+
const tx = (await txBuilder.build());
|
|
225
|
+
should_1.default.equal(tx.gasSponsor, testData.gasSponsor.address);
|
|
226
|
+
});
|
|
227
|
+
it('should return gas fee correctly', async function () {
|
|
228
|
+
const txBuilder = factory.getTransferBuilder();
|
|
229
|
+
txBuilder.sender(testData.sender.address);
|
|
230
|
+
txBuilder.recipients(testData.recipients);
|
|
231
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
232
|
+
txBuilder.gasData(testData.gasData);
|
|
233
|
+
const tx = (await txBuilder.build());
|
|
234
|
+
should_1.default.equal(tx.getFee(), testData.GAS_BUDGET.toString());
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('Transaction Signing', () => {
|
|
238
|
+
it('should get signable payload for non-simulate tx', async function () {
|
|
239
|
+
const txBuilder = factory.getTransferBuilder();
|
|
240
|
+
txBuilder.sender(testData.sender.address);
|
|
241
|
+
txBuilder.recipients(testData.recipients);
|
|
242
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
243
|
+
txBuilder.gasData(testData.gasData);
|
|
244
|
+
const tx = (await txBuilder.build());
|
|
245
|
+
const payload = tx.signablePayload;
|
|
246
|
+
should_1.default.exist(payload);
|
|
247
|
+
should_1.default.equal(Buffer.isBuffer(payload), true);
|
|
248
|
+
should_1.default.equal(payload.length, 32); // Blake2b produces 32-byte hash
|
|
249
|
+
});
|
|
250
|
+
it('should throw error when getting signable payload for simulate tx', async function () {
|
|
251
|
+
const txBuilder = factory.getTransferBuilder();
|
|
252
|
+
txBuilder.sender(testData.sender.address);
|
|
253
|
+
txBuilder.recipients(testData.recipients);
|
|
254
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
255
|
+
const tx = (await txBuilder.build());
|
|
256
|
+
should_1.default.equal(tx.isSimulateTx, true);
|
|
257
|
+
(0, should_1.default)(() => tx.signablePayload).throwError('Cannot sign a simulate tx');
|
|
258
|
+
});
|
|
259
|
+
it('should allow canSign for non-simulate tx', async function () {
|
|
260
|
+
const txBuilder = factory.getTransferBuilder();
|
|
261
|
+
txBuilder.sender(testData.sender.address);
|
|
262
|
+
txBuilder.recipients(testData.recipients);
|
|
263
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
264
|
+
txBuilder.gasData(testData.gasData);
|
|
265
|
+
const tx = (await txBuilder.build());
|
|
266
|
+
should_1.default.equal(tx.canSign({}), true);
|
|
267
|
+
});
|
|
268
|
+
it('should not allow canSign for simulate tx', async function () {
|
|
269
|
+
const txBuilder = factory.getTransferBuilder();
|
|
270
|
+
txBuilder.sender(testData.sender.address);
|
|
271
|
+
txBuilder.recipients(testData.recipients);
|
|
272
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
273
|
+
const tx = (await txBuilder.build());
|
|
274
|
+
should_1.default.equal(tx.canSign({}), false);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
describe('Transaction Explanation', () => {
|
|
278
|
+
it('should explain transaction correctly', async function () {
|
|
279
|
+
const txBuilder = factory.getTransferBuilder();
|
|
280
|
+
txBuilder.sender(testData.sender.address);
|
|
281
|
+
txBuilder.recipients(testData.recipients);
|
|
282
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
283
|
+
txBuilder.gasData(testData.gasData);
|
|
284
|
+
const tx = (await txBuilder.build());
|
|
285
|
+
const explanation = tx.explainTransaction();
|
|
286
|
+
should_1.default.exist(explanation);
|
|
287
|
+
should_1.default.equal(explanation.type, sdk_core_1.TransactionType.Send);
|
|
288
|
+
should_1.default.exist(explanation.id);
|
|
289
|
+
should_1.default.exist(explanation.outputs);
|
|
290
|
+
should_1.default.equal(explanation.outputs.length, testData.recipients.length);
|
|
291
|
+
should_1.default.equal(explanation.fee.fee, testData.GAS_BUDGET.toString());
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
describe('Transaction ID', () => {
|
|
295
|
+
it('should generate transaction ID for built transaction', async function () {
|
|
296
|
+
const txBuilder = factory.getTransferBuilder();
|
|
297
|
+
txBuilder.sender(testData.sender.address);
|
|
298
|
+
txBuilder.recipients(testData.recipients);
|
|
299
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
300
|
+
txBuilder.gasData(testData.gasData);
|
|
301
|
+
const tx = (await txBuilder.build());
|
|
302
|
+
const txId = tx.id;
|
|
303
|
+
should_1.default.exist(txId);
|
|
304
|
+
should_1.default.equal(typeof txId, 'string');
|
|
305
|
+
should_1.default.equal(txId.length > 0, true);
|
|
306
|
+
});
|
|
307
|
+
it('should throw error when getting ID before build', function () {
|
|
308
|
+
const tx = new src_1.TransferTransaction(statics_1.coins.get('tiota'));
|
|
309
|
+
tx.sender = testData.sender.address;
|
|
310
|
+
(0, should_1.default)(() => tx.id).throwError('Tx not built or a rebuild is required');
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
describe('Rebuild Requirement', () => {
|
|
314
|
+
it('should set rebuild required when sender changes', async function () {
|
|
315
|
+
const txBuilder = factory.getTransferBuilder();
|
|
316
|
+
txBuilder.sender(testData.sender.address);
|
|
317
|
+
txBuilder.recipients(testData.recipients);
|
|
318
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
319
|
+
txBuilder.gasData(testData.gasData);
|
|
320
|
+
const tx = (await txBuilder.build());
|
|
321
|
+
tx.sender = testData.gasSponsor.address;
|
|
322
|
+
(0, should_1.default)(() => tx.id).throwError('Tx not built or a rebuild is required');
|
|
323
|
+
});
|
|
324
|
+
it('should set rebuild required when gas budget changes', async function () {
|
|
325
|
+
const txBuilder = factory.getTransferBuilder();
|
|
326
|
+
txBuilder.sender(testData.sender.address);
|
|
327
|
+
txBuilder.recipients(testData.recipients);
|
|
328
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
329
|
+
txBuilder.gasData(testData.gasData);
|
|
330
|
+
const tx = (await txBuilder.build());
|
|
331
|
+
tx.gasBudget = 10000000;
|
|
332
|
+
(0, should_1.default)(() => tx.id).throwError('Tx not built or a rebuild is required');
|
|
333
|
+
});
|
|
334
|
+
it('should set rebuild required when recipients change', async function () {
|
|
335
|
+
const txBuilder = factory.getTransferBuilder();
|
|
336
|
+
txBuilder.sender(testData.sender.address);
|
|
337
|
+
txBuilder.recipients(testData.recipients);
|
|
338
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
339
|
+
txBuilder.gasData(testData.gasData);
|
|
340
|
+
const tx = (await txBuilder.build());
|
|
341
|
+
tx.recipients = [{ address: testData.addresses.validAddresses[0], amount: '5000' }];
|
|
342
|
+
(0, should_1.default)(() => tx.id).throwError('Tx not built or a rebuild is required');
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
describe('Signature Serialization', () => {
|
|
346
|
+
it('should have undefined serializedSignature before signing', async function () {
|
|
347
|
+
const txBuilder = factory.getTransferBuilder();
|
|
348
|
+
txBuilder.sender(testData.sender.address);
|
|
349
|
+
txBuilder.recipients(testData.recipients);
|
|
350
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
351
|
+
txBuilder.gasData(testData.gasData);
|
|
352
|
+
const tx = (await txBuilder.build());
|
|
353
|
+
should_1.default.equal(tx.serializedSignature, undefined);
|
|
354
|
+
should_1.default.equal(tx.serializedGasSponsorSignature, undefined);
|
|
355
|
+
});
|
|
356
|
+
it('should serialize signature after adding and rebuilding', async function () {
|
|
357
|
+
const txBuilder = factory.getTransferBuilder();
|
|
358
|
+
txBuilder.sender(testData.sender.address);
|
|
359
|
+
txBuilder.recipients(testData.recipients);
|
|
360
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
361
|
+
txBuilder.gasData(testData.gasData);
|
|
362
|
+
const tx = (await txBuilder.build());
|
|
363
|
+
// Add signature
|
|
364
|
+
tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
|
|
365
|
+
// Rebuild to trigger serialization
|
|
366
|
+
await tx.build();
|
|
367
|
+
should_1.default.exist(tx.serializedSignature);
|
|
368
|
+
should_1.default.equal(typeof tx.serializedSignature, 'string');
|
|
369
|
+
// Verify it's valid base64
|
|
370
|
+
should_1.default.equal(/^[A-Za-z0-9+/]*={0,2}$/.test(tx.serializedSignature), true);
|
|
371
|
+
});
|
|
372
|
+
it('should serialize gas sponsor signature correctly', async function () {
|
|
373
|
+
const txBuilder = factory.getTransferBuilder();
|
|
374
|
+
txBuilder.sender(testData.sender.address);
|
|
375
|
+
txBuilder.recipients(testData.recipients);
|
|
376
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
377
|
+
txBuilder.gasData(testData.gasData);
|
|
378
|
+
txBuilder.gasSponsor(testData.gasSponsor.address);
|
|
379
|
+
const tx = (await txBuilder.build());
|
|
380
|
+
// Add gas sponsor signature
|
|
381
|
+
tx.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
|
|
382
|
+
// Rebuild to trigger serialization
|
|
383
|
+
await tx.build();
|
|
384
|
+
should_1.default.exist(tx.serializedGasSponsorSignature);
|
|
385
|
+
should_1.default.equal(typeof tx.serializedGasSponsorSignature, 'string');
|
|
386
|
+
// Verify it's valid base64
|
|
387
|
+
should_1.default.equal(/^[A-Za-z0-9+/]*={0,2}$/.test(tx.serializedGasSponsorSignature), true);
|
|
388
|
+
});
|
|
389
|
+
it('should serialize both sender and gas sponsor signatures', async function () {
|
|
390
|
+
const txBuilder = factory.getTransferBuilder();
|
|
391
|
+
txBuilder.sender(testData.sender.address);
|
|
392
|
+
txBuilder.recipients(testData.recipients);
|
|
393
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
394
|
+
txBuilder.gasData(testData.gasData);
|
|
395
|
+
txBuilder.gasSponsor(testData.gasSponsor.address);
|
|
396
|
+
const tx = (await txBuilder.build());
|
|
397
|
+
// Add both signatures
|
|
398
|
+
tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
|
|
399
|
+
tx.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
|
|
400
|
+
// Rebuild to trigger serialization
|
|
401
|
+
await tx.build();
|
|
402
|
+
should_1.default.exist(tx.serializedSignature);
|
|
403
|
+
should_1.default.exist(tx.serializedGasSponsorSignature);
|
|
404
|
+
should_1.default.notEqual(tx.serializedSignature, tx.serializedGasSponsorSignature);
|
|
405
|
+
});
|
|
406
|
+
it('should include serialized signatures in signatures array', async function () {
|
|
407
|
+
const txBuilder = factory.getTransferBuilder();
|
|
408
|
+
txBuilder.sender(testData.sender.address);
|
|
409
|
+
txBuilder.recipients(testData.recipients);
|
|
410
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
411
|
+
txBuilder.gasData(testData.gasData);
|
|
412
|
+
const tx = (await txBuilder.build());
|
|
413
|
+
// Add signature
|
|
414
|
+
tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
|
|
415
|
+
// Rebuild to trigger serialization
|
|
416
|
+
await tx.build();
|
|
417
|
+
// Check that signatures array contains the serialized signature
|
|
418
|
+
tx.signature.length.should.equal(1);
|
|
419
|
+
tx.signature[0].should.equal(tx.serializedSignature);
|
|
420
|
+
});
|
|
421
|
+
it('should include both signatures in signatures array when gas sponsor is present', async function () {
|
|
422
|
+
const txBuilder = factory.getTransferBuilder();
|
|
423
|
+
txBuilder.sender(testData.sender.address);
|
|
424
|
+
txBuilder.recipients(testData.recipients);
|
|
425
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
426
|
+
txBuilder.gasData(testData.gasData);
|
|
427
|
+
txBuilder.gasSponsor(testData.gasSponsor.address);
|
|
428
|
+
const tx = (await txBuilder.build());
|
|
429
|
+
// Add both signatures
|
|
430
|
+
tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
|
|
431
|
+
tx.addGasSponsorSignature(testData.testGasSponsorSignature.publicKey, testData.testGasSponsorSignature.signature);
|
|
432
|
+
// Rebuild to trigger serialization
|
|
433
|
+
await tx.build();
|
|
434
|
+
// Check that signatures array contains both serialized signatures
|
|
435
|
+
tx.signature.length.should.equal(2);
|
|
436
|
+
tx.signature[0].should.equal(tx.serializedSignature);
|
|
437
|
+
tx.signature[1].should.equal(tx.serializedGasSponsorSignature);
|
|
438
|
+
});
|
|
439
|
+
it('should verify signature serialization format', async function () {
|
|
440
|
+
const txBuilder = factory.getTransferBuilder();
|
|
441
|
+
txBuilder.sender(testData.sender.address);
|
|
442
|
+
txBuilder.recipients(testData.recipients);
|
|
443
|
+
txBuilder.paymentObjects(testData.paymentObjects);
|
|
444
|
+
txBuilder.gasData(testData.gasData);
|
|
445
|
+
const tx = (await txBuilder.build());
|
|
446
|
+
// Add signature
|
|
447
|
+
tx.addSignature(testData.testSignature.publicKey, testData.testSignature.signature);
|
|
448
|
+
// Rebuild to trigger serialization
|
|
449
|
+
await tx.build();
|
|
450
|
+
// Decode and verify format: 0x00 + signature (64 bytes) + pubkey (32 bytes) = 97 bytes
|
|
451
|
+
const decoded = Buffer.from(tx.serializedSignature, 'base64');
|
|
452
|
+
// Should be 97 bytes total (1 prefix + 64 signature + 32 pubkey)
|
|
453
|
+
decoded.length.should.equal(97);
|
|
454
|
+
// First byte should be 0x00
|
|
455
|
+
decoded[0].should.equal(0x00);
|
|
456
|
+
// Next 64 bytes should be the signature
|
|
457
|
+
const signatureBytes = decoded.slice(1, 65);
|
|
458
|
+
signatureBytes.toString('hex').should.equal(testData.testSignature.signature.toString('hex'));
|
|
459
|
+
// Last 32 bytes should be the public key
|
|
460
|
+
const pubKeyBytes = decoded.slice(65);
|
|
461
|
+
pubKeyBytes.toString('hex').should.equal(testData.testSignature.publicKey.pub);
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2ZlclRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1QyxtQ0FBMkU7QUFDM0UsNERBQThDO0FBQzlDLG1EQUF1RDtBQUV2RCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWxFLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7UUFDdEMsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUs7WUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDL0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRWxELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEtBQUs7WUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDL0MsU0FBUyxDQUFDLE1BQU0sQ0FB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QUMsQ0FBQztZQUVoQyw0QkFBNEI7WUFDNUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFOUIsd0NBQXdDO1lBQ3hDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUU5Rix5Q0FBeUM7WUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL2lvdGEnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5kZXNjcmliZSgnSW90YSBUcmFuc2ZlciBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGlvdGEnKSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgdHJhbnNhY3Rpb24gdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3Qgc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5yZWNpcGllbnRzLCB0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHBheW1lbnQgb2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnBheW1lbnRPYmplY3RzLCB0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGluIHNpbXVsYXRlIG1vZGUgYnkgZGVmYXVsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGJlIGluIHNpbXVsYXRlIG1vZGUgd2hlbiBnYXMgZGF0YSBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIElucHV0cyBhbmQgT3V0cHV0cycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBzZXQgaW5wdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdG90YWxBbW91bnQgPSB0ZXN0RGF0YS5yZWNpcGllbnRzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyBOdW1iZXIoci5hbW91bnQpLCAwKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdG90YWxBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3Rpb3RhJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgc2V0IG91dHB1dHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICB0ZXN0RGF0YS5yZWNpcGllbnRzLmZvckVhY2goKHJlY2lwaWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgdHgub3V0cHV0c1tpbmRleF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6IHJlY2lwaWVudC5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3Rpb3RhJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFNlcmlhbGl6YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXJpYWxpemUgdG8gSlNPTiBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnJlY2lwaWVudHMsIHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnBheW1lbnRPYmplY3RzLCB0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3REYXRhLkdBU19CVURHRVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGpzb24uZ2FzUHJpY2UsIHRlc3REYXRhLkdBU19QUklDRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzUGF5bWVudE9iamVjdHMsIHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVzZXJpYWxpemUgZnJvbSBKU09OIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgY29uc3QgbmV3VHggPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3Rpb3RhJykpO1xuICAgICAgbmV3VHgucGFyc2VGcm9tSlNPTihqc29uKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKG5ld1R4LnNlbmRlciwgdHguc2VuZGVyKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwobmV3VHgucmVjaXBpZW50cywgdHgucmVjaXBpZW50cyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKG5ld1R4LnBheW1lbnRPYmplY3RzLCB0eC5wYXltZW50T2JqZWN0cyk7XG4gICAgICBzaG91bGQuZXF1YWwobmV3VHguZ2FzQnVkZ2V0LCB0eC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKG5ld1R4Lmdhc1ByaWNlLCB0eC5nYXNQcmljZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSB0byBicm9hZGNhc3QgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgYnJvYWRjYXN0Rm9ybWF0ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGJyb2FkY2FzdEZvcm1hdCk7XG4gICAgICBzaG91bGQuZXF1YWwodHlwZW9mIGJyb2FkY2FzdEZvcm1hdCwgJ3N0cmluZycpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJyb2FkY2FzdEZvcm1hdC5sZW5ndGggPiAwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIHRvIGJyb2FkY2FzdCBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBicm9hZGNhc3RGb3JtYXQgPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoYnJvYWRjYXN0Rm9ybWF0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgYnJvYWRjYXN0Rm9ybWF0LCAnc3RyaW5nJyk7XG4gICAgICBzaG91bGQuZXF1YWwoYnJvYWRjYXN0Rm9ybWF0Lmxlbmd0aCA+IDAsIHRydWUpO1xuXG4gICAgICAvLyBOb3RlOiBwYXJzZUZyb21Ccm9hZGNhc3RUeCBoYXMga25vd24gcGFyc2luZyBpc3N1ZXMgYW5kIGlzIG5vdCBmdWxseSB0ZXN0ZWQgaGVyZVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnR2FzIENvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgZ2FzIGJ1ZGdldCBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5HQVNfQlVER0VUKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGdhcyBwcmljZSBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzUHJpY2UsIHRlc3REYXRhLkdBU19QUklDRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBnYXMgcGF5bWVudCBvYmplY3RzIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguZ2FzUGF5bWVudE9iamVjdHMsIHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGdhcyBzcG9uc29yIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzU3BvbnNvciwgdGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGdhcyBmZWUgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmdldEZlZSgpLCB0ZXN0RGF0YS5HQVNfQlVER0VULnRvU3RyaW5nKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gU2lnbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdldCBzaWduYWJsZSBwYXlsb2FkIGZvciBub24tc2ltdWxhdGUgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBwYXlsb2FkID0gdHguc2lnbmFibGVQYXlsb2FkO1xuXG4gICAgICBzaG91bGQuZXhpc3QocGF5bG9hZCk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmlzQnVmZmVyKHBheWxvYWQpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmxlbmd0aCwgMzIpOyAvLyBCbGFrZTJiIHByb2R1Y2VzIDMyLWJ5dGUgaGFzaFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGdldHRpbmcgc2lnbmFibGUgcGF5bG9hZCBmb3Igc2ltdWxhdGUgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgdHJ1ZSk7XG5cbiAgICAgIHNob3VsZCgoKSA9PiB0eC5zaWduYWJsZVBheWxvYWQpLnRocm93RXJyb3IoJ0Nhbm5vdCBzaWduIGEgc2ltdWxhdGUgdHgnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgY2FuU2lnbiBmb3Igbm9uLXNpbXVsYXRlIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmNhblNpZ24oe30gYXMgYW55KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBhbGxvdyBjYW5TaWduIGZvciBzaW11bGF0ZSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHguY2FuU2lnbih7fSBhcyBhbnkpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBFeHBsYW5hdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gdHJhbnNhY3Rpb24gY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGV4cGxhbmF0aW9uKTtcbiAgICAgIHNob3VsZC5lcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXhpc3QoZXhwbGFuYXRpb24uaWQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGV4cGxhbmF0aW9uLm91dHB1dHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLCB0ZXN0RGF0YS5yZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICBzaG91bGQuZXF1YWwoZXhwbGFuYXRpb24uZmVlLmZlZSwgdGVzdERhdGEuR0FTX0JVREdFVC50b1N0cmluZygpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIElEJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgdHJhbnNhY3Rpb24gSUQgZm9yIGJ1aWx0IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhJZCA9IHR4LmlkO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHhJZCk7XG4gICAgICBzaG91bGQuZXF1YWwodHlwZW9mIHR4SWQsICdzdHJpbmcnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eElkLmxlbmd0aCA+IDAsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGdldHRpbmcgSUQgYmVmb3JlIGJ1aWxkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNmZXJUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3Rpb3RhJykpO1xuICAgICAgdHguc2VuZGVyID0gdGVzdERhdGEuc2VuZGVyLmFkZHJlc3M7XG5cbiAgICAgIHNob3VsZCgoKSA9PiB0eC5pZCkudGhyb3dFcnJvcignVHggbm90IGJ1aWx0IG9yIGEgcmVidWlsZCBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVidWlsZCBSZXF1aXJlbWVudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCByZWJ1aWxkIHJlcXVpcmVkIHdoZW4gc2VuZGVyIGNoYW5nZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHR4LnNlbmRlciA9IHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcztcbiAgICAgIHNob3VsZCgoKSA9PiB0eC5pZCkudGhyb3dFcnJvcignVHggbm90IGJ1aWx0IG9yIGEgcmVidWlsZCBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmVidWlsZCByZXF1aXJlZCB3aGVuIGdhcyBidWRnZXQgY2hhbmdlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHR4Lmdhc0J1ZGdldCA9IDEwMDAwMDAwO1xuXG4gICAgICBzaG91bGQoKCkgPT4gdHguaWQpLnRocm93RXJyb3IoJ1R4IG5vdCBidWlsdCBvciBhIHJlYnVpbGQgaXMgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IHJlYnVpbGQgcmVxdWlyZWQgd2hlbiByZWNpcGllbnRzIGNoYW5nZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHR4LnJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJzUwMDAnIH1dO1xuXG4gICAgICBzaG91bGQoKCkgPT4gdHguaWQpLnRocm93RXJyb3IoJ1R4IG5vdCBidWlsdCBvciBhIHJlYnVpbGQgaXMgcmVxdWlyZWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NpZ25hdHVyZSBTZXJpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGF2ZSB1bmRlZmluZWQgc2VyaWFsaXplZFNpZ25hdHVyZSBiZWZvcmUgc2lnbmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRTaWduYXR1cmUsIHVuZGVmaW5lZCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSBzaWduYXR1cmUgYWZ0ZXIgYWRkaW5nIGFuZCByZWJ1aWxkaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBBZGQgc2lnbmF0dXJlXG4gICAgICB0eC5hZGRTaWduYXR1cmUodGVzdERhdGEudGVzdFNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlKTtcblxuICAgICAgLy8gUmVidWlsZCB0byB0cmlnZ2VyIHNlcmlhbGl6YXRpb25cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkU2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgdHguc2VyaWFsaXplZFNpZ25hdHVyZSwgJ3N0cmluZycpO1xuICAgICAgLy8gVmVyaWZ5IGl0J3MgdmFsaWQgYmFzZTY0XG4gICAgICBzaG91bGQuZXF1YWwoL15bQS1aYS16MC05Ky9dKj17MCwyfSQvLnRlc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSBhcyBzdHJpbmcpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIGdhcyBzcG9uc29yIHNpZ25hdHVyZSBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBBZGQgZ2FzIHNwb25zb3Igc2lnbmF0dXJlXG4gICAgICB0eC5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnB1YmxpY0tleSwgdGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUuc2lnbmF0dXJlKTtcblxuICAgICAgLy8gUmVidWlsZCB0byB0cmlnZ2VyIHNlcmlhbGl6YXRpb25cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHlwZW9mIHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlLCAnc3RyaW5nJyk7XG4gICAgICAvLyBWZXJpZnkgaXQncyB2YWxpZCBiYXNlNjRcbiAgICAgIHNob3VsZC5lcXVhbCgvXltBLVphLXowLTkrL10qPXswLDJ9JC8udGVzdCh0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSBhcyBzdHJpbmcpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIGJvdGggc2VuZGVyIGFuZCBnYXMgc3BvbnNvciBzaWduYXR1cmVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzU3BvbnNvcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gQWRkIGJvdGggc2lnbmF0dXJlc1xuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG4gICAgICB0eC5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnB1YmxpY0tleSwgdGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUuc2lnbmF0dXJlKTtcblxuICAgICAgLy8gUmVidWlsZCB0byB0cmlnZ2VyIHNlcmlhbGl6YXRpb25cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG5cbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkU2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQubm90RXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSwgdHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIHNlcmlhbGl6ZWQgc2lnbmF0dXJlcyBpbiBzaWduYXR1cmVzIGFycmF5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBBZGQgc2lnbmF0dXJlXG4gICAgICB0eC5hZGRTaWduYXR1cmUodGVzdERhdGEudGVzdFNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlKTtcblxuICAgICAgLy8gUmVidWlsZCB0byB0cmlnZ2VyIHNlcmlhbGl6YXRpb25cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgc2lnbmF0dXJlcyBhcnJheSBjb250YWlucyB0aGUgc2VyaWFsaXplZCBzaWduYXR1cmVcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguc2lnbmF0dXJlWzBdLnNob3VsZC5lcXVhbCh0eC5zZXJpYWxpemVkU2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSBib3RoIHNpZ25hdHVyZXMgaW4gc2lnbmF0dXJlcyBhcnJheSB3aGVuIGdhcyBzcG9uc29yIGlzIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAvLyBBZGQgYm90aCBzaWduYXR1cmVzXG4gICAgICB0eC5hZGRTaWduYXR1cmUodGVzdERhdGEudGVzdFNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlKTtcbiAgICAgIHR4LmFkZEdhc1Nwb25zb3JTaWduYXR1cmUodGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5zaWduYXR1cmUpO1xuXG4gICAgICAvLyBSZWJ1aWxkIHRvIHRyaWdnZXIgc2VyaWFsaXphdGlvblxuICAgICAgYXdhaXQgdHguYnVpbGQoKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBzaWduYXR1cmVzIGFycmF5IGNvbnRhaW5zIGJvdGggc2VyaWFsaXplZCBzaWduYXR1cmVzXG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICB0eC5zaWduYXR1cmVbMV0uc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHNpZ25hdHVyZSBzZXJpYWxpemF0aW9uIGZvcm1hdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gQWRkIHNpZ25hdHVyZVxuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIC8vIFJlYnVpbGQgdG8gdHJpZ2dlciBzZXJpYWxpemF0aW9uXG4gICAgICBhd2FpdCB0eC5idWlsZCgpO1xuXG4gICAgICAvLyBEZWNvZGUgYW5kIHZlcmlmeSBmb3JtYXQ6IDB4MDAgKyBzaWduYXR1cmUgKDY0IGJ5dGVzKSArIHB1YmtleSAoMzIgYnl0ZXMpID0gOTcgYnl0ZXNcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbSh0eC5zZXJpYWxpemVkU2lnbmF0dXJlISwgJ2Jhc2U2NCcpO1xuXG4gICAgICAvLyBTaG91bGQgYmUgOTcgYnl0ZXMgdG90YWwgKDEgcHJlZml4ICsgNjQgc2lnbmF0dXJlICsgMzIgcHVia2V5KVxuICAgICAgZGVjb2RlZC5sZW5ndGguc2hvdWxkLmVxdWFsKDk3KTtcblxuICAgICAgLy8gRmlyc3QgYnl0ZSBzaG91bGQgYmUgMHgwMFxuICAgICAgZGVjb2RlZFswXS5zaG91bGQuZXF1YWwoMHgwMCk7XG5cbiAgICAgIC8vIE5leHQgNjQgYnl0ZXMgc2hvdWxkIGJlIHRoZSBzaWduYXR1cmVcbiAgICAgIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gZGVjb2RlZC5zbGljZSgxLCA2NSk7XG4gICAgICBzaWduYXR1cmVCeXRlcy50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRlc3RTaWduYXR1cmUuc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIC8vIExhc3QgMzIgYnl0ZXMgc2hvdWxkIGJlIHRoZSBwdWJsaWMga2V5XG4gICAgICBjb25zdCBwdWJLZXlCeXRlcyA9IGRlY29kZWQuc2xpY2UoNjUpO1xuICAgICAgcHViS2V5Qnl0ZXMudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnB1YmxpY0tleS5wdWIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
|