@bitgo/sdk-coin-flrp 1.11.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/flrp.d.ts +17 -1
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +40 -3
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +12 -1
- package/dist/src/lib/transaction.d.ts +6 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +30 -1
- package/dist/src/lib/transactionBuilder.js +3 -3
- package/dist/test/unit/flrp.js +257 -3
- package/dist/test/unit/lib/exportInCTxBuilder.js +123 -8
- package/dist/test/unit/lib/exportInPTxBuilder.js +150 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +102 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +106 -1
- package/dist/test/unit/lib/transactionBuilderFactory.js +31 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -36,12 +36,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
const statics_1 = require("@bitgo/statics");
|
|
37
37
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
38
38
|
const assert = __importStar(require("assert"));
|
|
39
|
-
const
|
|
39
|
+
const lib_1 = require("../../../src/lib");
|
|
40
40
|
const exportInC_1 = require("../../resources/transactionData/exportInC");
|
|
41
41
|
const account_1 = require("../../resources/account");
|
|
42
|
+
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
42
43
|
describe('ExportInCTxBuilder', function () {
|
|
43
44
|
const coinConfig = statics_1.coins.get('tflrp');
|
|
44
|
-
const factory = new
|
|
45
|
+
const factory = new lib_1.TransactionBuilderFactory(coinConfig);
|
|
45
46
|
const txBuilder = factory.getExportInCBuilder();
|
|
46
47
|
describe('utxos validation', function () {
|
|
47
48
|
it('should reject UTXOs since C-chain exports do not use UTXOs', async function () {
|
|
@@ -136,13 +137,13 @@ describe('ExportInCTxBuilder', function () {
|
|
|
136
137
|
rawTx.length.should.be.greaterThan(100);
|
|
137
138
|
});
|
|
138
139
|
it('should deserialize unsigned export tx from raw hex', async () => {
|
|
139
|
-
const txBuilder = new
|
|
140
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.unsignedHex);
|
|
140
141
|
const tx = await txBuilder.build();
|
|
141
142
|
const rawTx = tx.toBroadcastFormat();
|
|
142
143
|
rawTx.should.equal(exportInC_1.EXPORT_IN_C.unsignedHex);
|
|
143
144
|
});
|
|
144
145
|
it('should deserialize signed export tx and preserve tx id', async () => {
|
|
145
|
-
const txBuilder = new
|
|
146
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.signedHex);
|
|
146
147
|
const tx = await txBuilder.build();
|
|
147
148
|
const rawTx = tx.toBroadcastFormat();
|
|
148
149
|
rawTx.should.equal(exportInC_1.EXPORT_IN_C.signedHex);
|
|
@@ -161,7 +162,7 @@ describe('ExportInCTxBuilder', function () {
|
|
|
161
162
|
json.outputs[0].value.should.equal(exportInC_1.EXPORT_IN_C.amount);
|
|
162
163
|
});
|
|
163
164
|
it('should sign unsigned raw tx and match expected signed hex and tx id', async () => {
|
|
164
|
-
const txBuilder = new
|
|
165
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.unsignedHex);
|
|
165
166
|
txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
|
|
166
167
|
const tx = await txBuilder.build();
|
|
167
168
|
const rawTx = tx.toBroadcastFormat();
|
|
@@ -169,7 +170,7 @@ describe('ExportInCTxBuilder', function () {
|
|
|
169
170
|
tx.id.should.equal(exportInC_1.EXPORT_IN_C.txhash);
|
|
170
171
|
});
|
|
171
172
|
it('should reject signing with key that does not match from address', () => {
|
|
172
|
-
const txBuilder = new
|
|
173
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
|
|
173
174
|
.from(exportInC_1.EXPORT_IN_C.unsignedHex)
|
|
174
175
|
.fromPubKey(exportInC_1.EXPORT_IN_C.pAddresses);
|
|
175
176
|
txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
|
|
@@ -182,12 +183,126 @@ describe('ExportInCTxBuilder', function () {
|
|
|
182
183
|
});
|
|
183
184
|
it('should compute correct tx id for on-chain verified signed export', async () => {
|
|
184
185
|
const signedExportHex = '0x0000000000010000007278db5c30bed04c05ce209179812850bbb3fe6d46d7eef3744d814c0da555247900000000000000000000000000000000000000000000000000000000000000000000000117dbd11b9dd1c9be337353db7c14f9fb3662e5b50000000002ff3d1658734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd00000000000000050000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000002faf080000000000000000000000002000000033329be7d01cd3ebaae6654d7327dd9f17a2e15817e918a5e8083ae4c9f2f0ed77055c24bf3665001c7324437c96c7c8a6a152da2385c1db5c3ab1f910000000100000009000000018d1ac79d2e26d1c9689ca93b3b191c077dced2f201bdda132e74c3fc5ab9b10b6c85fd318dd6c0a99b327145977ac6ea6ff54cb8e9b7093b6bbe3545b3cc126400';
|
|
185
|
-
const txBuilder = new
|
|
186
|
+
const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(signedExportHex);
|
|
186
187
|
const tx = await txBuilder.build();
|
|
187
188
|
const rawTx = tx.toBroadcastFormat();
|
|
188
189
|
rawTx.should.equal(signedExportHex);
|
|
189
190
|
tx.id.should.equal('3kXUsHix1bZRQ9hqUc24cp7sXFiy2LbPn6Eh2HQCAaMUi75s9');
|
|
190
191
|
});
|
|
191
192
|
});
|
|
193
|
+
describe('MPC signing (threshold=1)', () => {
|
|
194
|
+
it('should build and sign export from C-chain with threshold=1 using sign()', async () => {
|
|
195
|
+
const mpcAddress = account_1.ON_CHAIN_TEST_WALLET.user.pChainAddress;
|
|
196
|
+
const txBuilder = factory
|
|
197
|
+
.getExportInCBuilder()
|
|
198
|
+
.fromPubKey(exportInC_1.EXPORT_IN_C.cHexAddress)
|
|
199
|
+
.nonce(exportInC_1.EXPORT_IN_C.nonce)
|
|
200
|
+
.amount(exportInC_1.EXPORT_IN_C.amount)
|
|
201
|
+
.threshold(1)
|
|
202
|
+
.locktime(0)
|
|
203
|
+
.to(mpcAddress)
|
|
204
|
+
.fee(exportInC_1.EXPORT_IN_C.fee)
|
|
205
|
+
.context(account_1.CONTEXT);
|
|
206
|
+
txBuilder.sign({ key: account_1.ON_CHAIN_TEST_WALLET.user.privateKey });
|
|
207
|
+
const tx = await txBuilder.build();
|
|
208
|
+
tx.signature.length.should.equal(1);
|
|
209
|
+
tx.signature[0].should.startWith('0x');
|
|
210
|
+
const json = tx.toJson();
|
|
211
|
+
json.type.should.equal(sdk_core_1.TransactionType.Export);
|
|
212
|
+
json.threshold.should.equal(1);
|
|
213
|
+
json.sourceChain.should.equal('C');
|
|
214
|
+
json.destinationChain.should.equal('P');
|
|
215
|
+
});
|
|
216
|
+
it('should build and sign export from C-chain with threshold=1 using addExternalSignature()', async () => {
|
|
217
|
+
const mpcAddress = account_1.ON_CHAIN_TEST_WALLET.user.pChainAddress;
|
|
218
|
+
const txBuilder = factory
|
|
219
|
+
.getExportInCBuilder()
|
|
220
|
+
.fromPubKey(exportInC_1.EXPORT_IN_C.cHexAddress)
|
|
221
|
+
.nonce(exportInC_1.EXPORT_IN_C.nonce)
|
|
222
|
+
.amount(exportInC_1.EXPORT_IN_C.amount)
|
|
223
|
+
.threshold(1)
|
|
224
|
+
.locktime(0)
|
|
225
|
+
.to(mpcAddress)
|
|
226
|
+
.fee(exportInC_1.EXPORT_IN_C.fee)
|
|
227
|
+
.context(account_1.CONTEXT);
|
|
228
|
+
// Build unsigned
|
|
229
|
+
const tx = (await txBuilder.build());
|
|
230
|
+
const unsignedHex = tx.toBroadcastFormat();
|
|
231
|
+
// Simulate MPC: sign the unsigned bytes externally
|
|
232
|
+
const unsignedTx = tx.getFlareTransaction();
|
|
233
|
+
const unsignedBytes = unsignedTx.toBytes();
|
|
234
|
+
const signature = await flarejs_1.secp256k1.sign(unsignedBytes, Buffer.from(account_1.ON_CHAIN_TEST_WALLET.user.privateKey, 'hex'));
|
|
235
|
+
tx.addExternalSignature(signature);
|
|
236
|
+
const signedHex = tx.toBroadcastFormat();
|
|
237
|
+
signedHex.should.not.equal(unsignedHex);
|
|
238
|
+
// Verify roundtrip
|
|
239
|
+
const parsedBuilder = factory.from(signedHex);
|
|
240
|
+
const parsedTx = await parsedBuilder.build();
|
|
241
|
+
parsedTx.toBroadcastFormat().should.equal(signedHex);
|
|
242
|
+
// Verify signature
|
|
243
|
+
tx.signature.length.should.equal(1);
|
|
244
|
+
});
|
|
245
|
+
it('should produce same signed tx via sign() and addExternalSignature()', async () => {
|
|
246
|
+
const mpcAddress = account_1.ON_CHAIN_TEST_WALLET.user.pChainAddress;
|
|
247
|
+
const mpcPrivateKey = account_1.ON_CHAIN_TEST_WALLET.user.privateKey;
|
|
248
|
+
// Build and sign via sign()
|
|
249
|
+
const txBuilder1 = factory
|
|
250
|
+
.getExportInCBuilder()
|
|
251
|
+
.fromPubKey(exportInC_1.EXPORT_IN_C.cHexAddress)
|
|
252
|
+
.nonce(exportInC_1.EXPORT_IN_C.nonce)
|
|
253
|
+
.amount(exportInC_1.EXPORT_IN_C.amount)
|
|
254
|
+
.threshold(1)
|
|
255
|
+
.locktime(0)
|
|
256
|
+
.to(mpcAddress)
|
|
257
|
+
.fee(exportInC_1.EXPORT_IN_C.fee)
|
|
258
|
+
.context(account_1.CONTEXT);
|
|
259
|
+
txBuilder1.sign({ key: mpcPrivateKey });
|
|
260
|
+
const tx1 = await txBuilder1.build();
|
|
261
|
+
const signedHex1 = tx1.toBroadcastFormat();
|
|
262
|
+
// Build and sign via addExternalSignature()
|
|
263
|
+
const txBuilder2 = factory
|
|
264
|
+
.getExportInCBuilder()
|
|
265
|
+
.fromPubKey(exportInC_1.EXPORT_IN_C.cHexAddress)
|
|
266
|
+
.nonce(exportInC_1.EXPORT_IN_C.nonce)
|
|
267
|
+
.amount(exportInC_1.EXPORT_IN_C.amount)
|
|
268
|
+
.threshold(1)
|
|
269
|
+
.locktime(0)
|
|
270
|
+
.to(mpcAddress)
|
|
271
|
+
.fee(exportInC_1.EXPORT_IN_C.fee)
|
|
272
|
+
.context(account_1.CONTEXT);
|
|
273
|
+
const tx2 = (await txBuilder2.build());
|
|
274
|
+
const unsignedTx = tx2.getFlareTransaction();
|
|
275
|
+
const signature = await flarejs_1.secp256k1.sign(unsignedTx.toBytes(), Buffer.from(mpcPrivateKey, 'hex'));
|
|
276
|
+
tx2.addExternalSignature(signature);
|
|
277
|
+
const signedHex2 = tx2.toBroadcastFormat();
|
|
278
|
+
signedHex1.should.equal(signedHex2);
|
|
279
|
+
tx1.id.should.equal(tx2.id);
|
|
280
|
+
});
|
|
281
|
+
it('should deserialize unsigned MPC tx and sign it', async () => {
|
|
282
|
+
const mpcAddress = account_1.ON_CHAIN_TEST_WALLET.user.pChainAddress;
|
|
283
|
+
const txBuilder = factory
|
|
284
|
+
.getExportInCBuilder()
|
|
285
|
+
.fromPubKey(exportInC_1.EXPORT_IN_C.cHexAddress)
|
|
286
|
+
.nonce(exportInC_1.EXPORT_IN_C.nonce)
|
|
287
|
+
.amount(exportInC_1.EXPORT_IN_C.amount)
|
|
288
|
+
.threshold(1)
|
|
289
|
+
.locktime(0)
|
|
290
|
+
.to(mpcAddress)
|
|
291
|
+
.fee(exportInC_1.EXPORT_IN_C.fee)
|
|
292
|
+
.context(account_1.CONTEXT);
|
|
293
|
+
const unsignedTx = await txBuilder.build();
|
|
294
|
+
const unsignedHex = unsignedTx.toBroadcastFormat();
|
|
295
|
+
// Deserialize and sign
|
|
296
|
+
const txBuilder2 = factory.from(unsignedHex);
|
|
297
|
+
txBuilder2.sign({ key: account_1.ON_CHAIN_TEST_WALLET.user.privateKey });
|
|
298
|
+
const signedTx = await txBuilder2.build();
|
|
299
|
+
signedTx.signature.length.should.equal(1);
|
|
300
|
+
// Verify roundtrip of signed tx
|
|
301
|
+
const txBuilder3 = factory.from(signedTx.toBroadcastFormat());
|
|
302
|
+
const parsedTx = await txBuilder3.build();
|
|
303
|
+
parsedTx.toBroadcastFormat().should.equal(signedTx.toBroadcastFormat());
|
|
304
|
+
parsedTx.id.should.equal(signedTx.id);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
192
307
|
});
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsOENBQXlFO0FBQ3pFLCtDQUFpQztBQUNqQywwRkFBdUY7QUFDdkYseUVBQW9GO0FBQ3BGLHFEQUFrRDtBQUdsRCxRQUFRLENBQUMsb0JBQW9CLEVBQUU7SUFDN0IsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLHFEQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBRWhELFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSztZQUNwRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixDQUFDLEVBQUUsSUFBSSxnQ0FBcUIsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFFbkUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM5QixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtvQkFDdkIs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QUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtFQUFrRSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hGLE1BQU0sZUFBZSxHQUNuQiwwckJBQTByQixDQUFDO1lBQzdyQixNQUFNLFNBQVMsR0FBRyxJQUFJLHFEQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUYsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgRVhQT1JUX0lOX0MgYXMgdGVzdERhdGEgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL2V4cG9ydEluQyc7XG5pbXBvcnQgeyBDT05URVhUIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2FjY291bnQnO1xuaW1wb3J0IHsgRmxycENvbnRleHQgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuZGVzY3JpYmUoJ0V4cG9ydEluQ1R4QnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEluQ0J1aWxkZXIoKTtcblxuICBkZXNjcmliZSgndXR4b3MgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBVVFhPcyBzaW5jZSBDLWNoYWluIGV4cG9ydHMgZG8gbm90IHVzZSBVVFhPcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIuZGVjb2RlZFV0eG9zKFtdKTtcbiAgICAgIH0sIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VUWE9zIGFyZSBub3QgcmVxdWlyZWQgZm9yIEV4cG9ydCBUeCBmcm9tIEMtQ2hhaW4nKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhbW91bnQgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBiaWdpbnQgYW5kIHN0cmluZyBhbW91bnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkQW1vdW50cyA9IFtCaWdJbnQoMTAwMCksICcxMDAwJywgJzEwMDAwMDAwMDAwMDAwMDAwMDAnXTtcblxuICAgICAgdmFsaWRBbW91bnRzLmZvckVhY2goKGFtb3VudCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB6ZXJvIGFuZCBuZWdhdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudHMgPSBbJzAnLCAnLTEnXTtcblxuICAgICAgaW52YWxpZEFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uY2UgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBzdHJpbmcgYW5kIG51bWJlciBub25jZSBmb3JtYXRzIGluY2x1ZGluZyB6ZXJvJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWROb25jZXMgPSBbJzEnLCAxLCAwXTtcblxuICAgICAgdmFsaWROb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIG5vbmNlIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UoJy0xJyk7XG4gICAgICB9LCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAwJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVzdGluYXRpb24gYWRkcmVzcyAodG8pIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRFeHBvcnRJbkNCdWlsZGVyKCk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhcnJheSBvZiBQLWNoYWluIGFkZHJlc3NlcyBmb3IgbXVsdGlzaWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gdGVzdERhdGEucEFkZHJlc3NlcztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50byhwQWRkcmVzc2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgc2luZ2xlIFAtY2hhaW4gYWRkcmVzcyBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnRvKHRlc3REYXRhLnBBZGRyZXNzZXNbMF0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB0aWxkZS1zZXBhcmF0ZWQgUC1jaGFpbiBhZGRyZXNzZXMgZm9yIG11bHRpc2lnJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcEFkZHJlc3NlcyA9IHRlc3REYXRhLnBBZGRyZXNzZXMuam9pbignficpO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnRvKHBBZGRyZXNzZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBDLWNoYWluIHRvIFAtY2hhaW4gZXhwb3J0IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG5ld1R4QnVpbGRlciA9ICgpID0+XG4gICAgICBmYWN0b3J5XG4gICAgICAgIC5nZXRFeHBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY0hleEFkZHJlc3MpXG4gICAgICAgIC5ub25jZSh0ZXN0RGF0YS5ub25jZSlcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5hbW91bnQpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC50byh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBGbHJwQ29udGV4dCk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGV4cG9ydCB0eCB3aXRoIGNvcnJlY3QgdHlwZSwgY2hhaW5zLCBhbW91bnQsIGFuZCBmZWUgZGVkdWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3VHhCdWlsZGVyKCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIGpzb24udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCk7XG4gICAgICBqc29uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGpzb24ub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwodGVzdERhdGEuYW1vdW50KTtcbiAgICAgIGpzb24uc291cmNlQ2hhaW4uc2hvdWxkLmVxdWFsKCdDJyk7XG4gICAgICBqc29uLmRlc3RpbmF0aW9uQ2hhaW4uc2hvdWxkLmVxdWFsKCdQJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBmZWUgaXMgY2FsY3VsYXRlZCBjb3JyZWN0bHk6IGFjdHVhbEZlZSA9IGJhc2VGZWVfYWRqdXN0ZWQgw5cgZ2FzVW5pdHNcbiAgICAgIC8vIGJhc2VGZWVfYWRqdXN0ZWQgPSB0ZXN0RGF0YS5mZWUgLyAxZTkgPSAyNVxuICAgICAgLy8gZ2FzVW5pdHMgdmFyaWVzIGJ1dCBmZWUgc2hvdWxkIGJlID4gMCBhbmQgaW5wdXQgPiBvdXRwdXRcbiAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBCaWdJbnQoanNvbi5pbnB1dHNbMF0udmFsdWUpO1xuICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSBCaWdJbnQoanNvbi5vdXRwdXRzWzBdLnZhbHVlKTtcbiAgICAgIGNvbnN0IGFjdHVhbEZlZSA9IGlucHV0VmFsdWUgLSBvdXRwdXRWYWx1ZTtcbiAgICAgIChhY3R1YWxGZWUgPiAwbikuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIChpbnB1dFZhbHVlID4gb3V0cHV0VmFsdWUpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5zdGFydFdpdGgoJzB4Jyk7XG4gICAgICByYXdUeC5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDEwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlc2VyaWFsaXplIHVuc2lnbmVkIGV4cG9ydCB0eCBmcm9tIHJhdyBoZXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVzZXJpYWxpemUgc2lnbmVkIGV4cG9ydCB0eCBhbmQgcHJlc2VydmUgdHggaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGV4cG9ydCB0eCBidWlsdCBmcm9tIHNjcmF0Y2ggYW5kIHByb2R1Y2UgdmFsaWQgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3VHhCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSBleGlzdHNcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgdHguc2lnbmF0dXJlWzBdLnNob3VsZC5zdGFydFdpdGgoJzB4Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBwcm9wZXJ0aWVzIGFmdGVyIHNpZ25pbmdcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGpzb24udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCk7XG4gICAgICBqc29uLm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmFtb3VudCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNpZ24gdW5zaWduZWQgcmF3IHR4IGFuZCBtYXRjaCBleHBlY3RlZCBzaWduZWQgaGV4IGFuZCB0eCBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgc2lnbmluZyB3aXRoIGtleSB0aGF0IGRvZXMgbm90IG1hdGNoIGZyb20gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXkgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbXB1dGUgY29ycmVjdCB0eCBpZCBmb3Igb24tY2hhaW4gdmVyaWZpZWQgc2lnbmVkIGV4cG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lZEV4cG9ydEhleCA9XG4gICAgICAgICcweDAwMDAwMDAwMDAwMTAwMDAwMDcyNzhkYjVjMzBiZWQwNGMwNWNlMjA5MTc5ODEyODUwYmJiM2ZlNmQ0NmQ3ZWVmMzc0NGQ4MTRjMGRhNTU1MjQ3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE3ZGJkMTFiOWRkMWM5YmUzMzczNTNkYjdjMTRmOWZiMzY2MmU1YjUwMDAwMDAwMDAyZmYzZDE2NTg3MzRmOTRhZjg3MWMzZDEzMWI1NjEzMWI2ZmI3YTAyOTFlYWNhZGQyNjFlNjlkZmI0MmE5Y2RmNmY3ZmRkZDAwMDAwMDAwMDAwMDAwMDUwMDAwMDAwMTU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNzAwMDAwMDAwMDJmYWYwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODE3ZTkxOGE1ZTgwODNhZTRjOWYyZjBlZDc3MDU1YzI0YmYzNjY1MDAxYzczMjQ0MzdjOTZjN2M4YTZhMTUyZGEyMzg1YzFkYjVjM2FiMWY5MTAwMDAwMDAxMDAwMDAwMDkwMDAwMDAwMThkMWFjNzlkMmUyNmQxYzk2ODljYTkzYjNiMTkxYzA3N2RjZWQyZjIwMWJkZGExMzJlNzRjM2ZjNWFiOWIxMGI2Yzg1ZmQzMThkZDZjMGE5OWIzMjcxNDU5NzdhYzZlYTZmZjU0Y2I4ZTliNzA5M2I2YmJlMzU0NWIzY2MxMjY0MDAnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHNpZ25lZEV4cG9ydEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHNpZ25lZEV4cG9ydEhleCk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJzNrWFVzSGl4MWJaUlE5aHFVYzI0Y3A3c1hGaXkyTGJQbjZFaDJIUUNBYU1VaTc1czknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsOENBQXlFO0FBQ3pFLCtDQUFpQztBQUNqQywwQ0FBMEU7QUFDMUUseUVBQW9GO0FBQ3BGLHFEQUF3RTtBQUV4RSxtREFBOEQ7QUFFOUQsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUVoRCxRQUFRLENBQUMsa0JBQWtCLEVBQUU7UUFDM0IsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUs7WUFDcEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxFQUFFLElBQUksZ0NBQXFCLENBQUMsbURBQW1ELENBQUMsQ0FBQyxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsbUJBQW1CLEVBQUU7UUFDNUIsRUFBRSxDQUFDLGdEQUFnRCxFQUFFO1lBQ25ELE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBRW5FLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFH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LHVCQUFRLENBQUMsR0FBRyxDQUFDO2lCQUNqQixPQUFPLENBQUMsaUJBQXNCLENBQUMsQ0FBQztZQUVuQyxNQUFNLFVBQVUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUVuRCx1QkFBdUI7WUFDdkIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLDhCQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRTFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFMUMsZ0NBQWdDO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUM5RCxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDeEUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IEVYUE9SVF9JTl9DIGFzIHRlc3REYXRhIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3RyYW5zYWN0aW9uRGF0YS9leHBvcnRJbkMnO1xuaW1wb3J0IHsgQ09OVEVYVCwgT05fQ0hBSU5fVEVTVF9XQUxMRVQgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYWNjb3VudCc7XG5pbXBvcnQgeyBGbHJwQ29udGV4dCB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgc2VjcDI1NmsxLCBVbnNpZ25lZFR4IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcblxuZGVzY3JpYmUoJ0V4cG9ydEluQ1R4QnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEluQ0J1aWxkZXIoKTtcblxuICBkZXNjcmliZSgndXR4b3MgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBVVFhPcyBzaW5jZSBDLWNoYWluIGV4cG9ydHMgZG8gbm90IHVzZSBVVFhPcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIuZGVjb2RlZFV0eG9zKFtdKTtcbiAgICAgIH0sIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VUWE9zIGFyZSBub3QgcmVxdWlyZWQgZm9yIEV4cG9ydCBUeCBmcm9tIEMtQ2hhaW4nKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhbW91bnQgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBiaWdpbnQgYW5kIHN0cmluZyBhbW91bnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkQW1vdW50cyA9IFtCaWdJbnQoMTAwMCksICcxMDAwJywgJzEwMDAwMDAwMDAwMDAwMDAwMDAnXTtcblxuICAgICAgdmFsaWRBbW91bnRzLmZvckVhY2goKGFtb3VudCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB6ZXJvIGFuZCBuZWdhdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudHMgPSBbJzAnLCAnLTEnXTtcblxuICAgICAgaW52YWxpZEFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uY2UgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBzdHJpbmcgYW5kIG51bWJlciBub25jZSBmb3JtYXRzIGluY2x1ZGluZyB6ZXJvJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWROb25jZXMgPSBbJzEnLCAxLCAwXTtcblxuICAgICAgdmFsaWROb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIG5vbmNlIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UoJy0xJyk7XG4gICAgICB9LCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAwJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVzdGluYXRpb24gYWRkcmVzcyAodG8pIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRFeHBvcnRJbkNCdWlsZGVyKCk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhcnJheSBvZiBQLWNoYWluIGFkZHJlc3NlcyBmb3IgbXVsdGlzaWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gdGVzdERhdGEucEFkZHJlc3NlcztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50byhwQWRkcmVzc2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgc2luZ2xlIFAtY2hhaW4gYWRkcmVzcyBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnRvKHRlc3REYXRhLnBBZGRyZXNzZXNbMF0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB0aWxkZS1zZXBhcmF0ZWQgUC1jaGFpbiBhZGRyZXNzZXMgZm9yIG11bHRpc2lnJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcEFkZHJlc3NlcyA9IHRlc3REYXRhLnBBZGRyZXNzZXMuam9pbignficpO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnRvKHBBZGRyZXNzZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBDLWNoYWluIHRvIFAtY2hhaW4gZXhwb3J0IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG5ld1R4QnVpbGRlciA9ICgpID0+XG4gICAgICBmYWN0b3J5XG4gICAgICAgIC5nZXRFeHBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY0hleEFkZHJlc3MpXG4gICAgICAgIC5ub25jZSh0ZXN0RGF0YS5ub25jZSlcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5hbW91bnQpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC50byh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBGbHJwQ29udGV4dCk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGV4cG9ydCB0eCB3aXRoIGNvcnJlY3QgdHlwZSwgY2hhaW5zLCBhbW91bnQsIGFuZCBmZWUgZGVkdWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3VHhCdWlsZGVyKCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIGpzb24udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCk7XG4gICAgICBqc29uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGpzb24ub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwodGVzdERhdGEuYW1vdW50KTtcbiAgICAgIGpzb24uc291cmNlQ2hhaW4uc2hvdWxkLmVxdWFsKCdDJyk7XG4gICAgICBqc29uLmRlc3RpbmF0aW9uQ2hhaW4uc2hvdWxkLmVxdWFsKCdQJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBmZWUgaXMgY2FsY3VsYXRlZCBjb3JyZWN0bHk6IGFjdHVhbEZlZSA9IGJhc2VGZWVfYWRqdXN0ZWQgw5cgZ2FzVW5pdHNcbiAgICAgIC8vIGJhc2VGZWVfYWRqdXN0ZWQgPSB0ZXN0RGF0YS5mZWUgLyAxZTkgPSAyNVxuICAgICAgLy8gZ2FzVW5pdHMgdmFyaWVzIGJ1dCBmZWUgc2hvdWxkIGJlID4gMCBhbmQgaW5wdXQgPiBvdXRwdXRcbiAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBCaWdJbnQoanNvbi5pbnB1dHNbMF0udmFsdWUpO1xuICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSBCaWdJbnQoanNvbi5vdXRwdXRzWzBdLnZhbHVlKTtcbiAgICAgIGNvbnN0IGFjdHVhbEZlZSA9IGlucHV0VmFsdWUgLSBvdXRwdXRWYWx1ZTtcbiAgICAgIChhY3R1YWxGZWUgPiAwbikuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIChpbnB1dFZhbHVlID4gb3V0cHV0VmFsdWUpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5zdGFydFdpdGgoJzB4Jyk7XG4gICAgICByYXdUeC5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDEwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlc2VyaWFsaXplIHVuc2lnbmVkIGV4cG9ydCB0eCBmcm9tIHJhdyBoZXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVzZXJpYWxpemUgc2lnbmVkIGV4cG9ydCB0eCBhbmQgcHJlc2VydmUgdHggaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGV4cG9ydCB0eCBidWlsdCBmcm9tIHNjcmF0Y2ggYW5kIHByb2R1Y2UgdmFsaWQgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3VHhCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSBleGlzdHNcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgICAgdHguc2lnbmF0dXJlWzBdLnNob3VsZC5zdGFydFdpdGgoJzB4Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBwcm9wZXJ0aWVzIGFmdGVyIHNpZ25pbmdcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIGpzb24udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCk7XG4gICAgICBqc29uLm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmFtb3VudCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNpZ24gdW5zaWduZWQgcmF3IHR4IGFuZCBtYXRjaCBleHBlY3RlZCBzaWduZWQgaGV4IGFuZCB0eCBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgc2lnbmluZyB3aXRoIGtleSB0aGF0IGRvZXMgbm90IG1hdGNoIGZyb20gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXkgfSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbXB1dGUgY29ycmVjdCB0eCBpZCBmb3Igb24tY2hhaW4gdmVyaWZpZWQgc2lnbmVkIGV4cG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lZEV4cG9ydEhleCA9XG4gICAgICAgICcweDAwMDAwMDAwMDAwMTAwMDAwMDcyNzhkYjVjMzBiZWQwNGMwNWNlMjA5MTc5ODEyODUwYmJiM2ZlNmQ0NmQ3ZWVmMzc0NGQ4MTRjMGRhNTU1MjQ3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE3ZGJkMTFiOWRkMWM5YmUzMzczNTNkYjdjMTRmOWZiMzY2MmU1YjUwMDAwMDAwMDAyZmYzZDE2NTg3MzRmOTRhZjg3MWMzZDEzMWI1NjEzMWI2ZmI3YTAyOTFlYWNhZGQyNjFlNjlkZmI0MmE5Y2RmNmY3ZmRkZDAwMDAwMDAwMDAwMDAwMDUwMDAwMDAwMTU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNzAwMDAwMDAwMDJmYWYwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODE3ZTkxOGE1ZTgwODNhZTRjOWYyZjBlZDc3MDU1YzI0YmYzNjY1MDAxYzczMjQ0MzdjOTZjN2M4YTZhMTUyZGEyMzg1YzFkYjVjM2FiMWY5MTAwMDAwMDAxMDAwMDAwMDkwMDAwMDAwMThkMWFjNzlkMmUyNmQxYzk2ODljYTkzYjNiMTkxYzA3N2RjZWQyZjIwMWJkZGExMzJlNzRjM2ZjNWFiOWIxMGI2Yzg1ZmQzMThkZDZjMGE5OWIzMjcxNDU5NzdhYzZlYTZmZjU0Y2I4ZTliNzA5M2I2YmJlMzU0NWIzY2MxMjY0MDAnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHNpZ25lZEV4cG9ydEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHNpZ25lZEV4cG9ydEhleCk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJzNrWFVzSGl4MWJaUlE5aHFVYzI0Y3A3c1hGaXkyTGJQbjZFaDJIUUNBYU1VaTc1czknKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01QQyBzaWduaW5nICh0aHJlc2hvbGQ9MSknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBleHBvcnQgZnJvbSBDLWNoYWluIHdpdGggdGhyZXNob2xkPTEgdXNpbmcgc2lnbigpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbXBjQWRkcmVzcyA9IE9OX0NIQUlOX1RFU1RfV0FMTEVULnVzZXIucENoYWluQWRkcmVzcztcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0RXhwb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLmNIZXhBZGRyZXNzKVxuICAgICAgICAubm9uY2UodGVzdERhdGEubm9uY2UpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuYW1vdW50KVxuICAgICAgICAudGhyZXNob2xkKDEpXG4gICAgICAgIC5sb2NrdGltZSgwKVxuICAgICAgICAudG8obXBjQWRkcmVzcylcbiAgICAgICAgLmZlZSh0ZXN0RGF0YS5mZWUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgRmxycENvbnRleHQpO1xuXG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogT05fQ0hBSU5fVEVTVF9XQUxMRVQudXNlci5wcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5zaWduYXR1cmVbMF0uc2hvdWxkLnN0YXJ0V2l0aCgnMHgnKTtcblxuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAganNvbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuRXhwb3J0KTtcbiAgICAgIGpzb24udGhyZXNob2xkLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGpzb24uc291cmNlQ2hhaW4hLnNob3VsZC5lcXVhbCgnQycpO1xuICAgICAganNvbi5kZXN0aW5hdGlvbkNoYWluIS5zaG91bGQuZXF1YWwoJ1AnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gZXhwb3J0IGZyb20gQy1jaGFpbiB3aXRoIHRocmVzaG9sZD0xIHVzaW5nIGFkZEV4dGVybmFsU2lnbmF0dXJlKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtcGNBZGRyZXNzID0gT05fQ0hBSU5fVEVTVF9XQUxMRVQudXNlci5wQ2hhaW5BZGRyZXNzO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRFeHBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY0hleEFkZHJlc3MpXG4gICAgICAgIC5ub25jZSh0ZXN0RGF0YS5ub25jZSlcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5hbW91bnQpXG4gICAgICAgIC50aHJlc2hvbGQoMSlcbiAgICAgICAgLmxvY2t0aW1lKDApXG4gICAgICAgIC50byhtcGNBZGRyZXNzKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBGbHJwQ29udGV4dCk7XG5cbiAgICAgIC8vIEJ1aWxkIHVuc2lnbmVkXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB1bnNpZ25lZEhleCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIE1QQzogc2lnbiB0aGUgdW5zaWduZWQgYnl0ZXMgZXh0ZXJuYWxseVxuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IHR4LmdldEZsYXJlVHJhbnNhY3Rpb24oKSBhcyBVbnNpZ25lZFR4O1xuICAgICAgY29uc3QgdW5zaWduZWRCeXRlcyA9IHVuc2lnbmVkVHgudG9CeXRlcygpO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgc2VjcDI1NmsxLnNpZ24odW5zaWduZWRCeXRlcywgQnVmZmVyLmZyb20oT05fQ0hBSU5fVEVTVF9XQUxMRVQudXNlci5wcml2YXRlS2V5LCAnaGV4JykpO1xuXG4gICAgICB0eC5hZGRFeHRlcm5hbFNpZ25hdHVyZShzaWduYXR1cmUpO1xuICAgICAgY29uc3Qgc2lnbmVkSGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNpZ25lZEhleC5zaG91bGQubm90LmVxdWFsKHVuc2lnbmVkSGV4KTtcblxuICAgICAgLy8gVmVyaWZ5IHJvdW5kdHJpcFxuICAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IGZhY3RvcnkuZnJvbShzaWduZWRIZXgpO1xuICAgICAgY29uc3QgcGFyc2VkVHggPSBhd2FpdCBwYXJzZWRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBwYXJzZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChzaWduZWRIZXgpO1xuXG4gICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlXG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBzYW1lIHNpZ25lZCB0eCB2aWEgc2lnbigpIGFuZCBhZGRFeHRlcm5hbFNpZ25hdHVyZSgpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbXBjQWRkcmVzcyA9IE9OX0NIQUlOX1RFU1RfV0FMTEVULnVzZXIucENoYWluQWRkcmVzcztcbiAgICAgIGNvbnN0IG1wY1ByaXZhdGVLZXkgPSBPTl9DSEFJTl9URVNUX1dBTExFVC51c2VyLnByaXZhdGVLZXk7XG5cbiAgICAgIC8vIEJ1aWxkIGFuZCBzaWduIHZpYSBzaWduKClcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjEgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRFeHBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY0hleEFkZHJlc3MpXG4gICAgICAgIC5ub25jZSh0ZXN0RGF0YS5ub25jZSlcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5hbW91bnQpXG4gICAgICAgIC50aHJlc2hvbGQoMSlcbiAgICAgICAgLmxvY2t0aW1lKDApXG4gICAgICAgIC50byhtcGNBZGRyZXNzKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBGbHJwQ29udGV4dCk7XG5cbiAgICAgIHR4QnVpbGRlcjEuc2lnbih7IGtleTogbXBjUHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IHR4MSA9IGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNpZ25lZEhleDEgPSB0eDEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHNpZ24gdmlhIGFkZEV4dGVybmFsU2lnbmF0dXJlKClcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRFeHBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY0hleEFkZHJlc3MpXG4gICAgICAgIC5ub25jZSh0ZXN0RGF0YS5ub25jZSlcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5hbW91bnQpXG4gICAgICAgIC50aHJlc2hvbGQoMSlcbiAgICAgICAgLmxvY2t0aW1lKDApXG4gICAgICAgIC50byhtcGNBZGRyZXNzKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBGbHJwQ29udGV4dCk7XG5cbiAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IHR4Mi5nZXRGbGFyZVRyYW5zYWN0aW9uKCkgYXMgVW5zaWduZWRUeDtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNlY3AyNTZrMS5zaWduKHVuc2lnbmVkVHgudG9CeXRlcygpLCBCdWZmZXIuZnJvbShtcGNQcml2YXRlS2V5LCAnaGV4JykpO1xuICAgICAgdHgyLmFkZEV4dGVybmFsU2lnbmF0dXJlKHNpZ25hdHVyZSk7XG4gICAgICBjb25zdCBzaWduZWRIZXgyID0gdHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHNpZ25lZEhleDEuc2hvdWxkLmVxdWFsKHNpZ25lZEhleDIpO1xuICAgICAgdHgxLmlkLnNob3VsZC5lcXVhbCh0eDIuaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZXNlcmlhbGl6ZSB1bnNpZ25lZCBNUEMgdHggYW5kIHNpZ24gaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtcGNBZGRyZXNzID0gT05fQ0hBSU5fVEVTVF9XQUxMRVQudXNlci5wQ2hhaW5BZGRyZXNzO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRFeHBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY0hleEFkZHJlc3MpXG4gICAgICAgIC5ub25jZSh0ZXN0RGF0YS5ub25jZSlcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5hbW91bnQpXG4gICAgICAgIC50aHJlc2hvbGQoMSlcbiAgICAgICAgLmxvY2t0aW1lKDApXG4gICAgICAgIC50byhtcGNBZGRyZXNzKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBGbHJwQ29udGV4dCk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBEZXNlcmlhbGl6ZSBhbmQgc2lnblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZnJvbSh1bnNpZ25lZEhleCk7XG4gICAgICB0eEJ1aWxkZXIyLnNpZ24oeyBrZXk6IE9OX0NIQUlOX1RFU1RfV0FMTEVULnVzZXIucHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuXG4gICAgICBzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgLy8gVmVyaWZ5IHJvdW5kdHJpcCBvZiBzaWduZWQgdHhcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjMgPSBmYWN0b3J5LmZyb20oc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjMuYnVpbGQoKTtcbiAgICAgIHBhcnNlZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgcGFyc2VkVHguaWQuc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|