@bitgo/sdk-coin-flrp 1.9.0 → 1.9.2
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/lib/permissionlessDelegatorTxBuilder.d.ts +41 -9
- package/dist/src/lib/permissionlessDelegatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessDelegatorTxBuilder.js +152 -18
- package/dist/test/resources/transactionData/multisigDelegationTx.d.ts +79 -0
- package/dist/test/resources/transactionData/multisigDelegationTx.d.ts.map +1 -0
- package/dist/test/resources/transactionData/multisigDelegationTx.js +94 -0
- package/dist/test/unit/lib/permissionlessDelegatorTxBuilder.js +772 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -231,5 +231,776 @@ describe('Flrp PermissionlessDelegatorTxBuilder', () => {
|
|
|
231
231
|
tx.outputs.length.should.be.above(0);
|
|
232
232
|
});
|
|
233
233
|
});
|
|
234
|
+
describe('build with UTXOs (comprehensive tests)', () => {
|
|
235
|
+
const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
|
|
236
|
+
const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60; // 14 days (1209600 seconds)
|
|
237
|
+
const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9); // 50000 FLR in nanoFLR
|
|
238
|
+
function createTestUtxos(addresses, threshold, amount = '60000000000000') {
|
|
239
|
+
return [
|
|
240
|
+
{
|
|
241
|
+
outputID: 7,
|
|
242
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
243
|
+
outputidx: '0',
|
|
244
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
245
|
+
amount,
|
|
246
|
+
threshold,
|
|
247
|
+
addresses,
|
|
248
|
+
locktime: '0',
|
|
249
|
+
},
|
|
250
|
+
];
|
|
251
|
+
}
|
|
252
|
+
it('should build delegation transaction with threshold=2 and 3 addresses (BitGo 2-of-3 multisig)', async () => {
|
|
253
|
+
const builder = factory.getDelegatorBuilder();
|
|
254
|
+
const now = Math.floor(Date.now() / 1000);
|
|
255
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
256
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
257
|
+
const utxos = createTestUtxos(addresses, 2);
|
|
258
|
+
const tx = await builder
|
|
259
|
+
.nodeID(validNodeID)
|
|
260
|
+
.startTime(now + 60)
|
|
261
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
262
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
263
|
+
.fromPubKey(addresses)
|
|
264
|
+
.decodedUtxos(utxos)
|
|
265
|
+
.feeState(mockFeeState)
|
|
266
|
+
.context(account_1.CONTEXT)
|
|
267
|
+
.build();
|
|
268
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
269
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
270
|
+
});
|
|
271
|
+
it('should build delegation transaction with threshold=2 and 2 addresses', async () => {
|
|
272
|
+
const builder = factory.getDelegatorBuilder();
|
|
273
|
+
const now = Math.floor(Date.now() / 1000);
|
|
274
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
275
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
|
|
276
|
+
const utxos = createTestUtxos(addresses, 2);
|
|
277
|
+
const tx = await builder
|
|
278
|
+
.nodeID(validNodeID)
|
|
279
|
+
.startTime(now + 60)
|
|
280
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
281
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
282
|
+
.fromPubKey(addresses)
|
|
283
|
+
.decodedUtxos(utxos)
|
|
284
|
+
.feeState(mockFeeState)
|
|
285
|
+
.context(account_1.CONTEXT)
|
|
286
|
+
.build();
|
|
287
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
288
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
289
|
+
});
|
|
290
|
+
it('should fail when UTXO amount is insufficient', async () => {
|
|
291
|
+
const builder = factory.getDelegatorBuilder();
|
|
292
|
+
const now = Math.floor(Date.now() / 1000);
|
|
293
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
294
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
|
|
295
|
+
const utxos = createTestUtxos(addresses, 2, '1000000000000');
|
|
296
|
+
await builder
|
|
297
|
+
.nodeID(validNodeID)
|
|
298
|
+
.startTime(now + 60)
|
|
299
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
300
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
301
|
+
.fromPubKey(addresses)
|
|
302
|
+
.decodedUtxos(utxos)
|
|
303
|
+
.feeState(mockFeeState)
|
|
304
|
+
.context(account_1.CONTEXT)
|
|
305
|
+
.build()
|
|
306
|
+
.should.be.rejected();
|
|
307
|
+
});
|
|
308
|
+
it('should build delegation with multiple UTXOs', async () => {
|
|
309
|
+
const builder = factory.getDelegatorBuilder();
|
|
310
|
+
const now = Math.floor(Date.now() / 1000);
|
|
311
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
312
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
313
|
+
// Create multiple UTXOs with different txids
|
|
314
|
+
const utxos = [
|
|
315
|
+
{
|
|
316
|
+
outputID: 7,
|
|
317
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
318
|
+
outputidx: '0',
|
|
319
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
320
|
+
amount: '30000000000000', // 30k FLR
|
|
321
|
+
threshold: 2,
|
|
322
|
+
addresses,
|
|
323
|
+
locktime: '0',
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
outputID: 7,
|
|
327
|
+
txid: '2kSSHWKZH7uJ1FfSpgRaPfgPpnT4915QVXPAMw6HjfFQVJ1QFx',
|
|
328
|
+
outputidx: '0',
|
|
329
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
330
|
+
amount: '25000000000000', // 25k FLR
|
|
331
|
+
threshold: 2,
|
|
332
|
+
addresses,
|
|
333
|
+
locktime: '0',
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
outputID: 7,
|
|
337
|
+
txid: '2E6Xuqf3i6TnwH6zjt4K6jNDR2ooj1DTJpTFZ6SgZZkRJ4ADSe',
|
|
338
|
+
outputidx: '0',
|
|
339
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
340
|
+
amount: '10000000000000', // 10k FLR
|
|
341
|
+
threshold: 2,
|
|
342
|
+
addresses,
|
|
343
|
+
locktime: '0',
|
|
344
|
+
},
|
|
345
|
+
];
|
|
346
|
+
// Total: 65k FLR > 50k minimum
|
|
347
|
+
const tx = await builder
|
|
348
|
+
.nodeID(validNodeID)
|
|
349
|
+
.startTime(now + 60)
|
|
350
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
351
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
352
|
+
.fromPubKey(addresses)
|
|
353
|
+
.decodedUtxos(utxos)
|
|
354
|
+
.feeState(mockFeeState)
|
|
355
|
+
.context(account_1.CONTEXT)
|
|
356
|
+
.build();
|
|
357
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
358
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
359
|
+
// FlareJS optimizes to use minimum UTXOs needed, may not consume all 3
|
|
360
|
+
tx.inputs.length.should.be.greaterThan(0);
|
|
361
|
+
});
|
|
362
|
+
/**
|
|
363
|
+
* Verifies fix for FlareJS Bug - Change output threshold
|
|
364
|
+
*
|
|
365
|
+
* FlareJS's pvm.e.newAddPermissionlessDelegatorTx() defaults change outputs to threshold=1.
|
|
366
|
+
* We implement a fix (similar to ExportInPTxBuilder) to correct change outputs to threshold=2
|
|
367
|
+
* for multisig wallets, maintaining security.
|
|
368
|
+
*/
|
|
369
|
+
it('should create change output with threshold=2 for multisig wallet (bug fixed)', async () => {
|
|
370
|
+
const builder = factory.getDelegatorBuilder();
|
|
371
|
+
const now = Math.floor(Date.now() / 1000);
|
|
372
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
373
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
374
|
+
const utxos = createTestUtxos(addresses, 2, '60000000000000'); // 60k FLR
|
|
375
|
+
const tx = await builder
|
|
376
|
+
.nodeID(validNodeID)
|
|
377
|
+
.startTime(now + 60)
|
|
378
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
379
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT) // Stake 50k
|
|
380
|
+
.fromPubKey(addresses)
|
|
381
|
+
.decodedUtxos(utxos)
|
|
382
|
+
.feeState(mockFeeState)
|
|
383
|
+
.context(account_1.CONTEXT)
|
|
384
|
+
.build();
|
|
385
|
+
// Verify change exists using explainTransaction
|
|
386
|
+
const explanation = tx.explainTransaction();
|
|
387
|
+
const changeAmount = BigInt(explanation.changeAmount);
|
|
388
|
+
Number(changeAmount).should.be.greaterThan(Number(BigInt('9000000000000')), 'Should have change (at least 9k after fees)');
|
|
389
|
+
explanation.changeOutputs.length.should.be.greaterThan(0, 'Should have change outputs');
|
|
390
|
+
// Verify the fix: change outputs should now have threshold=2
|
|
391
|
+
const flareTransaction = tx._flareTransaction;
|
|
392
|
+
const innerTx = flareTransaction.getTx();
|
|
393
|
+
const changeOutputs = innerTx.baseTx.outputs;
|
|
394
|
+
changeOutputs.forEach((output) => {
|
|
395
|
+
const transferOut = output.output;
|
|
396
|
+
const threshold = transferOut.outputOwners.threshold.value();
|
|
397
|
+
threshold.should.equal(2, 'Change output should have threshold=2 (bug fixed!)');
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
it('should have change output addresses matching wallet addresses', async () => {
|
|
401
|
+
const builder = factory.getDelegatorBuilder();
|
|
402
|
+
const now = Math.floor(Date.now() / 1000);
|
|
403
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
404
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
405
|
+
const utxos = createTestUtxos(addresses, 2, '60000000000000');
|
|
406
|
+
const tx = await builder
|
|
407
|
+
.nodeID(validNodeID)
|
|
408
|
+
.startTime(now + 60)
|
|
409
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
410
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
411
|
+
.fromPubKey(addresses)
|
|
412
|
+
.decodedUtxos(utxos)
|
|
413
|
+
.feeState(mockFeeState)
|
|
414
|
+
.context(account_1.CONTEXT)
|
|
415
|
+
.build();
|
|
416
|
+
// Verify change exists and addresses match using explainTransaction
|
|
417
|
+
const explanation = tx.explainTransaction();
|
|
418
|
+
const changeAmount = BigInt(explanation.changeAmount);
|
|
419
|
+
Number(changeAmount).should.be.greaterThan(0, 'Should have change output');
|
|
420
|
+
explanation.changeOutputs.length.should.be.greaterThan(0);
|
|
421
|
+
// Verify change output addresses match wallet addresses (sorted)
|
|
422
|
+
const sortedFromAddresses = tx.fromAddresses.slice().sort().join('~');
|
|
423
|
+
explanation.changeOutputs.forEach((output) => {
|
|
424
|
+
output.address.should.equal(sortedFromAddresses, 'Change output addresses should match wallet addresses');
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
describe('multiple delegations to same validator', () => {
|
|
429
|
+
const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
|
|
430
|
+
const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60;
|
|
431
|
+
const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9);
|
|
432
|
+
it('should support creating multiple delegations to same validator with different time periods', async () => {
|
|
433
|
+
const now = Math.floor(Date.now() / 1000);
|
|
434
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
435
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
436
|
+
// First delegation: Jan 1 - Mar 1
|
|
437
|
+
const builder1 = factory.getDelegatorBuilder();
|
|
438
|
+
const utxos1 = [
|
|
439
|
+
{
|
|
440
|
+
outputID: 7,
|
|
441
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
442
|
+
outputidx: '0',
|
|
443
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
444
|
+
amount: '100000000000000', // 100k FLR
|
|
445
|
+
threshold: 2,
|
|
446
|
+
addresses,
|
|
447
|
+
locktime: '0',
|
|
448
|
+
},
|
|
449
|
+
];
|
|
450
|
+
const tx1 = await builder1
|
|
451
|
+
.nodeID(validNodeID)
|
|
452
|
+
.startTime(now + 60)
|
|
453
|
+
.endTime(now + 60 + MIN_DELEGATION_DURATION)
|
|
454
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT) // 50k
|
|
455
|
+
.fromPubKey(addresses)
|
|
456
|
+
.decodedUtxos(utxos1)
|
|
457
|
+
.feeState(mockFeeState)
|
|
458
|
+
.context(account_1.CONTEXT)
|
|
459
|
+
.build();
|
|
460
|
+
tx1.should.be.instanceof(lib_1.Transaction);
|
|
461
|
+
tx1.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
462
|
+
// Second delegation: Feb 1 - Apr 1 (overlapping period, different start/end)
|
|
463
|
+
// Simulating using a different UTXO (in practice, could be change from first delegation)
|
|
464
|
+
const builder2 = factory.getDelegatorBuilder();
|
|
465
|
+
const utxos2 = [
|
|
466
|
+
{
|
|
467
|
+
outputID: 7,
|
|
468
|
+
txid: '2QttuE1MNRPEvLPdhB8t6WpC91VKfvigHvf1PKrNQ6BGgB6hZw', // Valid CB58 txid
|
|
469
|
+
outputidx: '0',
|
|
470
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
471
|
+
amount: '50010000000000', // 50010 FLR (50k stake + extra for fees)
|
|
472
|
+
threshold: 2,
|
|
473
|
+
addresses,
|
|
474
|
+
locktime: '0',
|
|
475
|
+
},
|
|
476
|
+
];
|
|
477
|
+
const tx2 = await builder2
|
|
478
|
+
.nodeID(validNodeID) // Same validator!
|
|
479
|
+
.startTime(now + 60 + 30 * 24 * 60 * 60) // 30 days later
|
|
480
|
+
.endTime(now + 60 + 30 * 24 * 60 * 60 + MIN_DELEGATION_DURATION)
|
|
481
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT) // Another 50k
|
|
482
|
+
.fromPubKey(addresses)
|
|
483
|
+
.decodedUtxos(utxos2)
|
|
484
|
+
.feeState(mockFeeState)
|
|
485
|
+
.context(account_1.CONTEXT)
|
|
486
|
+
.build();
|
|
487
|
+
tx2.should.be.instanceof(lib_1.Transaction);
|
|
488
|
+
tx2.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
489
|
+
// Both transactions should be valid and independent
|
|
490
|
+
tx1.id.should.not.equal(tx2.id);
|
|
491
|
+
});
|
|
492
|
+
it('should support sequential delegations (one ends, next begins)', async () => {
|
|
493
|
+
const now = Math.floor(Date.now() / 1000);
|
|
494
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
495
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
496
|
+
const utxos = [
|
|
497
|
+
{
|
|
498
|
+
outputID: 7,
|
|
499
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
500
|
+
outputidx: '0',
|
|
501
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
502
|
+
amount: '100000000000000',
|
|
503
|
+
threshold: 2,
|
|
504
|
+
addresses,
|
|
505
|
+
locktime: '0',
|
|
506
|
+
},
|
|
507
|
+
];
|
|
508
|
+
// First delegation
|
|
509
|
+
const builder1 = factory.getDelegatorBuilder();
|
|
510
|
+
const delegation1EndTime = now + 60 + MIN_DELEGATION_DURATION;
|
|
511
|
+
const tx1 = await builder1
|
|
512
|
+
.nodeID(validNodeID)
|
|
513
|
+
.startTime(now + 60)
|
|
514
|
+
.endTime(delegation1EndTime)
|
|
515
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
516
|
+
.fromPubKey(addresses)
|
|
517
|
+
.decodedUtxos(utxos)
|
|
518
|
+
.feeState(mockFeeState)
|
|
519
|
+
.context(account_1.CONTEXT)
|
|
520
|
+
.build();
|
|
521
|
+
// Second delegation starts right after first one ends
|
|
522
|
+
const builder2 = factory.getDelegatorBuilder();
|
|
523
|
+
const utxos2 = [
|
|
524
|
+
{
|
|
525
|
+
outputID: 7,
|
|
526
|
+
txid: '2K9rgiEgsEcT3dB9EyduEHFq7g4sHQBMks16VUQArVRieBQ9W5', // Valid CB58 txid
|
|
527
|
+
outputidx: '0',
|
|
528
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
529
|
+
amount: '50010000000000', // 50010 FLR (50k stake + extra for fees)
|
|
530
|
+
threshold: 2,
|
|
531
|
+
addresses,
|
|
532
|
+
locktime: '0',
|
|
533
|
+
},
|
|
534
|
+
];
|
|
535
|
+
const tx2 = await builder2
|
|
536
|
+
.nodeID(validNodeID)
|
|
537
|
+
.startTime(delegation1EndTime + 1) // Starts 1 second after first ends
|
|
538
|
+
.endTime(delegation1EndTime + 1 + MIN_DELEGATION_DURATION)
|
|
539
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
540
|
+
.fromPubKey(addresses)
|
|
541
|
+
.decodedUtxos(utxos2)
|
|
542
|
+
.feeState(mockFeeState)
|
|
543
|
+
.context(account_1.CONTEXT)
|
|
544
|
+
.build();
|
|
545
|
+
tx1.should.be.instanceof(lib_1.Transaction);
|
|
546
|
+
tx2.should.be.instanceof(lib_1.Transaction);
|
|
547
|
+
tx1.id.should.not.equal(tx2.id);
|
|
548
|
+
});
|
|
549
|
+
});
|
|
550
|
+
describe('signing multisig delegation transactions', () => {
|
|
551
|
+
const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
|
|
552
|
+
const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60;
|
|
553
|
+
const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9);
|
|
554
|
+
it('should successfully sign delegation transaction with threshold=2 multisig wallet', async () => {
|
|
555
|
+
const builder = factory.getDelegatorBuilder();
|
|
556
|
+
const now = Math.floor(Date.now() / 1000);
|
|
557
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
558
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
559
|
+
const utxos = [
|
|
560
|
+
{
|
|
561
|
+
outputID: 7,
|
|
562
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
563
|
+
outputidx: '0',
|
|
564
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
565
|
+
amount: '60000000000000', // 60k FLR (will have change)
|
|
566
|
+
threshold: 2,
|
|
567
|
+
addresses,
|
|
568
|
+
locktime: '0',
|
|
569
|
+
},
|
|
570
|
+
];
|
|
571
|
+
builder
|
|
572
|
+
.nodeID(validNodeID)
|
|
573
|
+
.startTime(now + 60)
|
|
574
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
575
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
576
|
+
.fromPubKey(addresses)
|
|
577
|
+
.decodedUtxos(utxos)
|
|
578
|
+
.feeState(mockFeeState)
|
|
579
|
+
.context(account_1.CONTEXT)
|
|
580
|
+
.sign({ key: account_1.SEED_ACCOUNT.privateKey });
|
|
581
|
+
const tx = await builder.build();
|
|
582
|
+
// Verify transaction is built successfully
|
|
583
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
584
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
585
|
+
// Verify credentials exist (non-empty)
|
|
586
|
+
const credentials = tx._flareTransaction.credentials;
|
|
587
|
+
credentials.should.not.be.empty();
|
|
588
|
+
credentials.length.should.be.greaterThan(0);
|
|
589
|
+
// Verify at least one signature slot has a signature
|
|
590
|
+
let hasSignature = false;
|
|
591
|
+
for (const credential of credentials) {
|
|
592
|
+
const signatures = credential.getSignatures();
|
|
593
|
+
for (const sig of signatures) {
|
|
594
|
+
if (sig && sig.length > 0 && !sig.startsWith('0x' + '0'.repeat(130))) {
|
|
595
|
+
hasSignature = true;
|
|
596
|
+
break;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
if (hasSignature)
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
602
|
+
hasSignature.should.be.true('Should have at least one signature');
|
|
603
|
+
});
|
|
604
|
+
it('should successfully sign delegation transaction with multiple signers', async () => {
|
|
605
|
+
const builder = factory.getDelegatorBuilder();
|
|
606
|
+
const now = Math.floor(Date.now() / 1000);
|
|
607
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
608
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
|
|
609
|
+
const utxos = [
|
|
610
|
+
{
|
|
611
|
+
outputID: 7,
|
|
612
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
613
|
+
outputidx: '0',
|
|
614
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
615
|
+
amount: '60000000000000',
|
|
616
|
+
threshold: 2,
|
|
617
|
+
addresses,
|
|
618
|
+
locktime: '0',
|
|
619
|
+
},
|
|
620
|
+
];
|
|
621
|
+
// Sign with both keys for 2-of-2 multisig
|
|
622
|
+
builder
|
|
623
|
+
.nodeID(validNodeID)
|
|
624
|
+
.startTime(now + 60)
|
|
625
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
626
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
627
|
+
.fromPubKey(addresses)
|
|
628
|
+
.decodedUtxos(utxos)
|
|
629
|
+
.feeState(mockFeeState)
|
|
630
|
+
.context(account_1.CONTEXT);
|
|
631
|
+
builder.sign({ key: account_1.SEED_ACCOUNT.privateKey });
|
|
632
|
+
builder.sign({ key: account_1.ACCOUNT_1.privateKey });
|
|
633
|
+
const tx = await builder.build();
|
|
634
|
+
// Verify transaction is built and has multiple signatures
|
|
635
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
636
|
+
const credentials = tx._flareTransaction.credentials;
|
|
637
|
+
credentials.should.not.be.empty();
|
|
638
|
+
// Count non-empty signatures
|
|
639
|
+
let signatureCount = 0;
|
|
640
|
+
for (const credential of credentials) {
|
|
641
|
+
const signatures = credential.getSignatures();
|
|
642
|
+
for (const sig of signatures) {
|
|
643
|
+
if (sig && sig.length > 0 && !sig.startsWith('0x' + '0'.repeat(130))) {
|
|
644
|
+
signatureCount++;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
signatureCount.should.be.greaterThanOrEqual(2, 'Should have at least 2 signatures for 2-of-2 multisig');
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
describe('half-signing workflow with real transaction data', () => {
|
|
652
|
+
// Import real multisig delegation transaction data from testnet
|
|
653
|
+
const { HALF_SIGN_TEST_ACCOUNTS, MULTISIG_DELEGATION_PARAMS, MULTISIG_DELEGATION_UNSIGNED_TX_HEX, MULTISIG_DELEGATION_HALF_SIGNED_TX_HEX, MULTISIG_DELEGATION_FULLY_SIGNED_TX_HEX, } = require('../../resources/transactionData/multisigDelegationTx');
|
|
654
|
+
it('should parse unsigned multisig delegation transaction from testnet', async () => {
|
|
655
|
+
const rawTx = utils_1.default.removeHexPrefix(MULTISIG_DELEGATION_UNSIGNED_TX_HEX);
|
|
656
|
+
// Verify transaction can be deserialized by FlareJS
|
|
657
|
+
const decodedTxBytes = Buffer.from(rawTx, 'hex');
|
|
658
|
+
decodedTxBytes.should.not.be.empty();
|
|
659
|
+
decodedTxBytes.length.should.be.greaterThan(0);
|
|
660
|
+
});
|
|
661
|
+
it('should build delegation transaction with multisig addresses and verify sorting', async () => {
|
|
662
|
+
const builder = factory.getDelegatorBuilder();
|
|
663
|
+
const addresses = MULTISIG_DELEGATION_PARAMS.multisigAddresses;
|
|
664
|
+
const utxos = [
|
|
665
|
+
{
|
|
666
|
+
outputID: 7,
|
|
667
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
668
|
+
outputidx: '0',
|
|
669
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
670
|
+
amount: '60000000000000',
|
|
671
|
+
threshold: 2,
|
|
672
|
+
addresses,
|
|
673
|
+
locktime: '0',
|
|
674
|
+
},
|
|
675
|
+
];
|
|
676
|
+
builder
|
|
677
|
+
.nodeID(MULTISIG_DELEGATION_PARAMS.nodeID)
|
|
678
|
+
.startTime(MULTISIG_DELEGATION_PARAMS.startTime)
|
|
679
|
+
.endTime(MULTISIG_DELEGATION_PARAMS.endTime)
|
|
680
|
+
.stakeAmount(BigInt(MULTISIG_DELEGATION_PARAMS.stakeAmount))
|
|
681
|
+
.fromPubKey(addresses)
|
|
682
|
+
.decodedUtxos(utxos)
|
|
683
|
+
.feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
|
|
684
|
+
.context(account_1.CONTEXT);
|
|
685
|
+
const tx = await builder.build();
|
|
686
|
+
// Verify transaction was built successfully
|
|
687
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
688
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
689
|
+
// Verify UTXOs are properly handled
|
|
690
|
+
const txUtxos = tx._utxos;
|
|
691
|
+
txUtxos.should.not.be.empty();
|
|
692
|
+
txUtxos[0].should.have.property('addresses');
|
|
693
|
+
});
|
|
694
|
+
it('should successfully parse half-signed transaction', async () => {
|
|
695
|
+
const rawTx = utils_1.default.removeHexPrefix(MULTISIG_DELEGATION_HALF_SIGNED_TX_HEX);
|
|
696
|
+
const tx = (await factory.from(rawTx).build());
|
|
697
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
698
|
+
// Verify it has one signature
|
|
699
|
+
const credentials = tx._flareTransaction.credentials;
|
|
700
|
+
credentials.should.not.be.empty();
|
|
701
|
+
let signatureCount = 0;
|
|
702
|
+
for (const credential of credentials) {
|
|
703
|
+
const signatures = credential.getSignatures();
|
|
704
|
+
for (const sig of signatures) {
|
|
705
|
+
const sigHex = sig.toString('hex');
|
|
706
|
+
// Non-empty signature (not all zeros)
|
|
707
|
+
if (sigHex && !sigHex.match(/^0+$/)) {
|
|
708
|
+
signatureCount++;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
signatureCount.should.be.greaterThanOrEqual(1, 'Should have at least 1 signature in half-signed tx');
|
|
713
|
+
});
|
|
714
|
+
it('should successfully parse fully-signed transaction', async () => {
|
|
715
|
+
const rawTx = utils_1.default.removeHexPrefix(MULTISIG_DELEGATION_FULLY_SIGNED_TX_HEX);
|
|
716
|
+
const tx = (await factory.from(rawTx).build());
|
|
717
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
718
|
+
// Verify it has two signatures
|
|
719
|
+
const credentials = tx._flareTransaction.credentials;
|
|
720
|
+
credentials.should.not.be.empty();
|
|
721
|
+
let signatureCount = 0;
|
|
722
|
+
for (const credential of credentials) {
|
|
723
|
+
const signatures = credential.getSignatures();
|
|
724
|
+
for (const sig of signatures) {
|
|
725
|
+
const sigHex = sig.toString('hex');
|
|
726
|
+
// Non-empty signature (not all zeros)
|
|
727
|
+
if (sigHex && !sigHex.match(/^0+$/)) {
|
|
728
|
+
signatureCount++;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
signatureCount.should.be.greaterThanOrEqual(2, 'Should have at least 2 signatures in fully-signed tx');
|
|
733
|
+
});
|
|
734
|
+
it('should build, sign with user key, and match half-signed format', async () => {
|
|
735
|
+
const builder = factory.getDelegatorBuilder();
|
|
736
|
+
const addresses = MULTISIG_DELEGATION_PARAMS.multisigAddresses;
|
|
737
|
+
const utxos = [
|
|
738
|
+
{
|
|
739
|
+
outputID: 7,
|
|
740
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
741
|
+
outputidx: '0',
|
|
742
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
743
|
+
amount: '60000000000000',
|
|
744
|
+
threshold: 2,
|
|
745
|
+
addresses,
|
|
746
|
+
locktime: '0',
|
|
747
|
+
},
|
|
748
|
+
];
|
|
749
|
+
builder
|
|
750
|
+
.nodeID(MULTISIG_DELEGATION_PARAMS.nodeID)
|
|
751
|
+
.startTime(MULTISIG_DELEGATION_PARAMS.startTime)
|
|
752
|
+
.endTime(MULTISIG_DELEGATION_PARAMS.endTime)
|
|
753
|
+
.stakeAmount(BigInt(MULTISIG_DELEGATION_PARAMS.stakeAmount))
|
|
754
|
+
.fromPubKey(addresses)
|
|
755
|
+
.decodedUtxos(utxos)
|
|
756
|
+
.feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
|
|
757
|
+
.context(account_1.CONTEXT)
|
|
758
|
+
.sign({ key: HALF_SIGN_TEST_ACCOUNTS.user.privateKey });
|
|
759
|
+
const tx = await builder.build();
|
|
760
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
761
|
+
// Verify transaction has credentials
|
|
762
|
+
const credentials = tx._flareTransaction.credentials;
|
|
763
|
+
credentials.should.not.be.empty();
|
|
764
|
+
// Count signatures
|
|
765
|
+
let signatureCount = 0;
|
|
766
|
+
for (const credential of credentials) {
|
|
767
|
+
const signatures = credential.getSignatures();
|
|
768
|
+
for (const sig of signatures) {
|
|
769
|
+
const sigHex = sig.toString('hex');
|
|
770
|
+
if (sigHex && !sigHex.match(/^0+$/)) {
|
|
771
|
+
signatureCount++;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
signatureCount.should.be.greaterThanOrEqual(1, 'Should have user signature after signing');
|
|
776
|
+
});
|
|
777
|
+
it('should build and sign with both user and bitgo keys for fully-signed tx', async () => {
|
|
778
|
+
const builder = factory.getDelegatorBuilder();
|
|
779
|
+
const addresses = MULTISIG_DELEGATION_PARAMS.multisigAddresses;
|
|
780
|
+
const utxos = [
|
|
781
|
+
{
|
|
782
|
+
outputID: 7,
|
|
783
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
784
|
+
outputidx: '0',
|
|
785
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
786
|
+
amount: '60000000000000',
|
|
787
|
+
threshold: 2,
|
|
788
|
+
addresses,
|
|
789
|
+
locktime: '0',
|
|
790
|
+
},
|
|
791
|
+
];
|
|
792
|
+
builder
|
|
793
|
+
.nodeID(MULTISIG_DELEGATION_PARAMS.nodeID)
|
|
794
|
+
.startTime(MULTISIG_DELEGATION_PARAMS.startTime)
|
|
795
|
+
.endTime(MULTISIG_DELEGATION_PARAMS.endTime)
|
|
796
|
+
.stakeAmount(BigInt(MULTISIG_DELEGATION_PARAMS.stakeAmount))
|
|
797
|
+
.fromPubKey(addresses)
|
|
798
|
+
.decodedUtxos(utxos)
|
|
799
|
+
.feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
|
|
800
|
+
.context(account_1.CONTEXT);
|
|
801
|
+
// Sign with both keys
|
|
802
|
+
builder.sign({ key: HALF_SIGN_TEST_ACCOUNTS.user.privateKey });
|
|
803
|
+
builder.sign({ key: HALF_SIGN_TEST_ACCOUNTS.bitgo.privateKey });
|
|
804
|
+
const tx = await builder.build();
|
|
805
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
806
|
+
// Verify transaction has both signatures
|
|
807
|
+
const credentials = tx._flareTransaction.credentials;
|
|
808
|
+
credentials.should.not.be.empty();
|
|
809
|
+
let signatureCount = 0;
|
|
810
|
+
for (const credential of credentials) {
|
|
811
|
+
const signatures = credential.getSignatures();
|
|
812
|
+
for (const sig of signatures) {
|
|
813
|
+
const sigHex = sig.toString('hex');
|
|
814
|
+
if (sigHex && !sigHex.match(/^0+$/)) {
|
|
815
|
+
signatureCount++;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
signatureCount.should.be.greaterThanOrEqual(2, 'Should have both user and bitgo signatures');
|
|
820
|
+
});
|
|
821
|
+
it('should build delegation transaction when addresses need sorting', async () => {
|
|
822
|
+
// Create a scenario with addresses in different order
|
|
823
|
+
const builder = factory.getDelegatorBuilder();
|
|
824
|
+
const now = Math.floor(Date.now() / 1000);
|
|
825
|
+
// Use addresses in a specific order
|
|
826
|
+
const addresses = [account_1.ACCOUNT_3.address, account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet];
|
|
827
|
+
const utxos = [
|
|
828
|
+
{
|
|
829
|
+
outputID: 7,
|
|
830
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
831
|
+
outputidx: '0',
|
|
832
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
833
|
+
amount: '60000000000000',
|
|
834
|
+
threshold: 2,
|
|
835
|
+
addresses,
|
|
836
|
+
locktime: '0',
|
|
837
|
+
},
|
|
838
|
+
];
|
|
839
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
840
|
+
builder
|
|
841
|
+
.nodeID(validNodeID)
|
|
842
|
+
.startTime(now + 60)
|
|
843
|
+
.endTime(now + 14 * 24 * 60 * 60)
|
|
844
|
+
.stakeAmount(BigInt(50000 * 1e9))
|
|
845
|
+
.fromPubKey(addresses)
|
|
846
|
+
.decodedUtxos(utxos)
|
|
847
|
+
.feeState({ capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' })
|
|
848
|
+
.context(account_1.CONTEXT);
|
|
849
|
+
const tx = await builder.build();
|
|
850
|
+
// Verify transaction builds successfully with sorted addresses
|
|
851
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
852
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
853
|
+
// Verify UTXOs are properly handled
|
|
854
|
+
const txUtxos = tx._utxos;
|
|
855
|
+
txUtxos.should.not.be.empty();
|
|
856
|
+
txUtxos[0].should.have.property('addresses');
|
|
857
|
+
txUtxos[0].addresses.length.should.equal(3);
|
|
858
|
+
});
|
|
859
|
+
});
|
|
860
|
+
describe('recovery mode signing', () => {
|
|
861
|
+
const mockFeeState = { capacity: 100000n, excess: 0n, price: 1000n, timestamp: '1234567890' };
|
|
862
|
+
const MIN_DELEGATION_DURATION = 14 * 24 * 60 * 60;
|
|
863
|
+
const MIN_DELEGATION_AMOUNT = BigInt(50000 * 1e9);
|
|
864
|
+
/**
|
|
865
|
+
* Recovery mode test verifies that when recoverSigner=true, the builder uses:
|
|
866
|
+
* - Backup key (index 2) instead of user key (index 0)
|
|
867
|
+
* - BitGo key (index 1) as always
|
|
868
|
+
*
|
|
869
|
+
* This is inherited from AtomicTransactionBuilder but should be verified
|
|
870
|
+
* to work correctly with delegation transactions.
|
|
871
|
+
*/
|
|
872
|
+
it('should sign delegation transaction in recovery mode (backup + bitgo keys)', async () => {
|
|
873
|
+
const builder = factory.getDelegatorBuilder();
|
|
874
|
+
const now = Math.floor(Date.now() / 1000);
|
|
875
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
876
|
+
// 2-of-3 multisig: user, bitgo, backup
|
|
877
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
878
|
+
const utxos = [
|
|
879
|
+
{
|
|
880
|
+
outputID: 7,
|
|
881
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
882
|
+
outputidx: '0',
|
|
883
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
884
|
+
amount: '60000000000000', // 60k FLR
|
|
885
|
+
threshold: 2,
|
|
886
|
+
addresses,
|
|
887
|
+
locktime: '0',
|
|
888
|
+
},
|
|
889
|
+
];
|
|
890
|
+
// Enable recovery mode - this tells the builder to use backup (index 2) instead of user (index 0)
|
|
891
|
+
builder.recoverSigner = true;
|
|
892
|
+
builder
|
|
893
|
+
.nodeID(validNodeID)
|
|
894
|
+
.startTime(now + 60)
|
|
895
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
896
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
897
|
+
.fromPubKey(addresses)
|
|
898
|
+
.decodedUtxos(utxos)
|
|
899
|
+
.feeState(mockFeeState)
|
|
900
|
+
.context(account_1.CONTEXT);
|
|
901
|
+
// In recovery mode: sign with backup (index 2) and bitgo (index 1)
|
|
902
|
+
builder.sign({ key: account_1.ACCOUNT_3.privateKey }); // backup key
|
|
903
|
+
builder.sign({ key: account_1.ACCOUNT_1.privateKey }); // bitgo key
|
|
904
|
+
const tx = await builder.build();
|
|
905
|
+
// Verify transaction builds successfully
|
|
906
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
907
|
+
tx.type.should.equal(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
908
|
+
// Verify credentials exist
|
|
909
|
+
const credentials = tx._flareTransaction.credentials;
|
|
910
|
+
credentials.should.not.be.empty();
|
|
911
|
+
credentials.length.should.be.greaterThan(0);
|
|
912
|
+
// Verify we have signatures from both recovery keys
|
|
913
|
+
let signatureCount = 0;
|
|
914
|
+
for (const credential of credentials) {
|
|
915
|
+
const signatures = credential.getSignatures();
|
|
916
|
+
for (const sig of signatures) {
|
|
917
|
+
const sigHex = sig.toString('hex');
|
|
918
|
+
// Non-empty signature (not all zeros)
|
|
919
|
+
if (sigHex && !sigHex.match(/^0+$/)) {
|
|
920
|
+
signatureCount++;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
// Should have at least 2 signatures (backup + bitgo)
|
|
925
|
+
signatureCount.should.be.greaterThanOrEqual(2, 'Recovery mode should have backup + bitgo signatures');
|
|
926
|
+
});
|
|
927
|
+
it('should fail when signing in recovery mode with user key instead of backup', async () => {
|
|
928
|
+
const builder = factory.getDelegatorBuilder();
|
|
929
|
+
const now = Math.floor(Date.now() / 1000);
|
|
930
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
931
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
932
|
+
const utxos = [
|
|
933
|
+
{
|
|
934
|
+
outputID: 7,
|
|
935
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
936
|
+
outputidx: '0',
|
|
937
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
938
|
+
amount: '60000000000000',
|
|
939
|
+
threshold: 2,
|
|
940
|
+
addresses,
|
|
941
|
+
locktime: '0',
|
|
942
|
+
},
|
|
943
|
+
];
|
|
944
|
+
builder.recoverSigner = true;
|
|
945
|
+
builder
|
|
946
|
+
.nodeID(validNodeID)
|
|
947
|
+
.startTime(now + 60)
|
|
948
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
949
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
950
|
+
.fromPubKey(addresses)
|
|
951
|
+
.decodedUtxos(utxos)
|
|
952
|
+
.feeState(mockFeeState)
|
|
953
|
+
.context(account_1.CONTEXT);
|
|
954
|
+
// Try to sign with user key (index 0) - this should fail in recovery mode
|
|
955
|
+
// because recovery mode expects backup key (index 2) + bitgo key (index 1)
|
|
956
|
+
builder.sign({ key: account_1.SEED_ACCOUNT.privateKey }); // user key (wrong for recovery mode)
|
|
957
|
+
builder.sign({ key: account_1.ACCOUNT_1.privateKey }); // bitgo key
|
|
958
|
+
const tx = await builder.build();
|
|
959
|
+
// Transaction builds but may not have correct signature count
|
|
960
|
+
// In recovery mode with wrong key, signature matching may fail
|
|
961
|
+
tx.should.be.instanceof(lib_1.Transaction);
|
|
962
|
+
});
|
|
963
|
+
it('should verify recovery mode uses correct address indices (backup=2, bitgo=1)', async () => {
|
|
964
|
+
const builder = factory.getDelegatorBuilder();
|
|
965
|
+
const now = Math.floor(Date.now() / 1000);
|
|
966
|
+
const validNodeID = 'NodeID-AK7sPBsZM9rQwse23aLhEEBPHZD5gkLrL';
|
|
967
|
+
const addresses = [account_1.SEED_ACCOUNT.addressTestnet, account_1.ACCOUNT_1.addressTestnet, account_1.ACCOUNT_3.address];
|
|
968
|
+
const utxos = [
|
|
969
|
+
{
|
|
970
|
+
outputID: 7,
|
|
971
|
+
txid: '2NWd9hrSGkWJWyTu4DnSM1qQSUT2DVm8uqwFk4wQRFLAmcsHQz',
|
|
972
|
+
outputidx: '0',
|
|
973
|
+
assetID: account_1.CONTEXT.avaxAssetID,
|
|
974
|
+
amount: '60000000000000',
|
|
975
|
+
threshold: 2,
|
|
976
|
+
addresses,
|
|
977
|
+
locktime: '0',
|
|
978
|
+
},
|
|
979
|
+
];
|
|
980
|
+
// Enable recovery mode
|
|
981
|
+
builder.recoverSigner = true;
|
|
982
|
+
builder
|
|
983
|
+
.nodeID(validNodeID)
|
|
984
|
+
.startTime(now + 60)
|
|
985
|
+
.endTime(now + MIN_DELEGATION_DURATION)
|
|
986
|
+
.stakeAmount(MIN_DELEGATION_AMOUNT)
|
|
987
|
+
.fromPubKey(addresses)
|
|
988
|
+
.decodedUtxos(utxos)
|
|
989
|
+
.feeState(mockFeeState)
|
|
990
|
+
.context(account_1.CONTEXT);
|
|
991
|
+
// Build without signing to inspect internal state
|
|
992
|
+
await builder.build();
|
|
993
|
+
const transaction = builder.transaction;
|
|
994
|
+
transaction._fromAddresses.length.should.equal(3);
|
|
995
|
+
// In recovery mode, getSigningAddresses should return [backup, bitgo]
|
|
996
|
+
const signingAddresses = builder.getSigningAddresses();
|
|
997
|
+
signingAddresses.length.should.equal(2);
|
|
998
|
+
// Verify signing addresses are backup (index 2) and bitgo (index 1)
|
|
999
|
+
// Note: We can't directly compare addresses as they may be sorted,
|
|
1000
|
+
// but we can verify the method returns exactly 2 addresses
|
|
1001
|
+
signingAddresses[0].length.should.equal(20);
|
|
1002
|
+
signingAddresses[1].length.should.equal(20);
|
|
1003
|
+
});
|
|
1004
|
+
});
|
|
234
1005
|
});
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGtCQUFnQjtBQUNoQiw0Q0FBdUM7QUFDdkMsOENBQWtEO0FBQ2xELDBDQUE0RztBQUM1RyxxREFBMkU7QUFDM0UsbUVBQTJDO0FBQzNDLDZFQUE4RTtBQUU5RSxRQUFRLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO0lBQ3JELE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxHQUFHLEVBQUU7WUFDbkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLHNDQUFnQyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENB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QyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEUsTUFBTSxLQUFLLEdBQUcsZUFBSyxDQUFDLGVBQWUsQ0FBQyw2QkFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1lBQzlELE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUVsRSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN2RCxNQUFNLEtBQUssR0FBRyxlQUFLLENBQUMsZUFBZSxDQUFDLDZCQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7WUFDOUQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4QnVpbGRlciwgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IFNFRURfQUNDT1VOVCwgQUNDT1VOVF8xLCBDT05URVhUIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2FjY291bnQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgREVMRUdBVElPTl9UWF8yIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3RyYW5zYWN0aW9uRGF0YS9kZWxlZ2F0b3JUeCc7XG5cbmRlc2NyaWJlKCdGbHJwIFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG5cbiAgZGVzY3JpYmUoJ2dldERlbGVnYXRvckJ1aWxkZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4QnVpbGRlciBpbnN0YW5jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2hvdWxkLmJlLmluc3RhbmNlT2YoUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGUgbm9kZUlEJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIG5vZGVJRCBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9kZUlEKCcnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBub2RlSUQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gbm9kZUlEIGhhcyBpbnZhbGlkIHByZWZpeCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vZGVJRCgnSW52YWxpZFByZWZpeC0xMjM0NTY3ODknKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnSW52YWxpZCB0cmFuc2FjdGlvbjogaW52YWxpZCBOb2RlSUQgdGFnJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIG5vZGVJRCBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcbiAgICAgICgoKSA9PiBidWlsZGVyLm5vZGVJRCh2YWxpZE5vZGVJRCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHN0YWtlIGR1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGVuZCB0aW1lIGlzIGxlc3MgdGhhbiBzdGFydCB0aW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gQmlnSW50KE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgNjApO1xuICAgICAgY29uc3QgZW5kVGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSAtIDYwKTtcblxuICAgICAgYnVpbGRlci5zdGFydFRpbWUoc3RhcnRUaW1lLnRvU3RyaW5nKCkpO1xuICAgICAgYnVpbGRlci5lbmRUaW1lKGVuZFRpbWUudG9TdHJpbmcoKSk7XG5cbiAgICAgIC8vIFRoZSB2YWxpZGF0aW9uIGhhcHBlbnMgaW4gYnVpbGRGbGFyZVRyYW5zYWN0aW9uLCBidXQgd2UgY2FuIHRlc3QgdmFsaWRhdGVTdGFrZUR1cmF0aW9uIGRpcmVjdGx5XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci52YWxpZGF0ZVN0YWtlRHVyYXRpb24oc3RhcnRUaW1lLCBlbmRUaW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnRW5kIGRhdGUgY2Fubm90IGJlIGxlc3MgdGhhbiBzdGFydCBkYXRlJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIHN0YWtlIGR1cmF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gQmlnSW50KE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgNjApO1xuICAgICAgY29uc3QgZW5kVGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDg2NDAwICogMTQpOyAvLyAxNCBkYXlzIGxhdGVyXG5cbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZGVyIG1ldGhvZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgc3RhcnRUaW1lIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgNjA7XG4gICAgICAoKCkgPT4gYnVpbGRlci5zdGFydFRpbWUoc3RhcnRUaW1lKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgZW5kVGltZSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBlbmRUaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyA4NjQwMCAqIDE0O1xuICAgICAgKCgpID0+IGJ1aWxkZXIuZW5kVGltZShlbmRUaW1lKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmV3YXJkQWRkcmVzcyB3aXRoIFAtY2hhaW4gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIC8vIFAtY2hhaW4gQmVjaDMyIGFkZHJlc3NcbiAgICAgICgoKSA9PiBidWlsZGVyLnJld2FyZEFkZHJlc3MoU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0KSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBub2RlSUQgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdOb2RlSUQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIHN0YXJ0IHRpbWUgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1N0YXJ0IHRpbWUgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIGVuZCB0aW1lIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdFbmQgdGltZSBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gc3Rha2UgYW1vdW50IGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1N0YWtlIGFtb3VudCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gY29udGV4dCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdDb250ZXh0IGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBmcm9tIGFkZHJlc3NlcyBhcmUgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0Zyb20gYWRkcmVzc2VzIGFyZSByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gZmVlIHN0YXRlIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGZWUgc3RhdGUgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIFVUWE9zIGFyZSBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcbiAgICAgIGNvbnN0IG1vY2tGZWVTdGF0ZSA9IHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSBzdGFrZSBhbW91bnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gc3Rha2UgYW1vdW50IGlzIGJlbG93IG1pbmltdW0nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICAvLyBNaW5pbXVtIGlzIDUwMDAwIEZMUiwgc28gMTAwMCBzaG91bGQgZmFpbFxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuc3Rha2VBbW91bnQoQmlnSW50KDEwMDAgKiAxZTkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdNaW5pbXVtIGRlbGVnYXRpb24gYW1vdW50JylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBzdGFrZSBhbW91bnQgYXQgb3IgYWJvdmUgbWluaW11bScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YWtlQW1vdW50ID0gQmlnSW50KDUwMDAwICogMWU5KTtcbiAgICAgICgoKSA9PiBidWlsZGVyLnN0YWtlQW1vdW50KHN0YWtlQW1vdW50KSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJhbnNhY3Rpb24gdHlwZSBzdXBwb3J0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWxsb3cgc2V0dGluZyBBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvciB0cmFuc2FjdGlvbiB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgLy8gVGhlIGJ1aWxkZXIgc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb25maWd1cmUgd2l0aCBBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvciB0eXBlXG4gICAgICAvLyBUaGlzIHZlcmlmaWVzIHRyYW5zYWN0aW9uLnRzIHNldFRyYW5zYWN0aW9uVHlwZSBhY2NlcHRzIHRoZSBkZWxlZ2F0aW9uIHR5cGVcbiAgICAgIGJ1aWxkZXIuc2hvdWxkLmJlLmluc3RhbmNlb2YoUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgbWluaW11bSBzdGFrZSBhbW91bnQgY29uc3RhbnQnLCAoKSA9PiB7XG4gICAgICAvLyBWZXJpZnkgdGhlIG1pbmltdW0gc3Rha2UgYW1vdW50IGlzIDUwMDAwIEZMUiAoaW4gbmFub0ZMUilcbiAgICAgIGNvbnN0IG1pblN0YWtlQW1vdW50ID0gQmlnSW50KDUwMDAwICogMWU5KTtcbiAgICAgIG1pblN0YWtlQW1vdW50LnNob3VsZC5lcXVhbChCaWdJbnQoJzUwMDAwMDAwMDAwMDAwJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncm91bmQtdHJpcCBkZXNlcmlhbGl6YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZXNlcmlhbGl6ZSBhIHNpZ25lZCBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIGZyb20gaGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGV4dHJhY3QgZGVsZWdhdGlvbiBwYXJhbWV0ZXJzIGZyb20gZGVzZXJpYWxpemVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoREVMRUdBVElPTl9UWF8yLnN0YWtlQW1vdW50KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmUtc2VyaWFsaXplIHRvIHRoZSBzYW1lIGhleCAocm91bmQtdHJpcCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChERUxFR0FUSU9OX1RYXzIuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByZUVuY29kZWRUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcblxuICAgICAgcmVFbmNvZGVkVHguc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IGlucHV0L291dHB1dCBjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChERUxFR0FUSU9OX1RYXzIuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICB0eC5pbnB1dHMuc2hvdWxkLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
1006
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGtCQUFnQjtBQUNoQiw0Q0FBdUM7QUFDdkMsOENBQWtEO0FBQ2xELDBDQUE0RztBQUM1RyxxREFBc0Y7QUFDdEYsbUVBQTJDO0FBQzNDLDZFQUE4RTtBQUU5RSxRQUFRLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO0lBQ3JELE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxHQUFHLEVBQUU7WUFDbkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLHNDQUFnQyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENB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b250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgU0VFRF9BQ0NPVU5ULCBBQ0NPVU5UXzEsIEFDQ09VTlRfMywgQ09OVEVYVCB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9hY2NvdW50JztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IERFTEVHQVRJT05fVFhfMiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy90cmFuc2FjdGlvbkRhdGEvZGVsZWdhdG9yVHgnO1xuXG5kZXNjcmliZSgnRmxycCBQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4QnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuXG4gIGRlc2NyaWJlKCdnZXREZWxlZ2F0b3JCdWlsZGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIgaW5zdGFuY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNob3VsZC5iZS5pbnN0YW5jZU9mKFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIG5vZGVJRCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBub2RlSUQgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vZGVJRCgnJyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9kZUlEJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIG5vZGVJRCBoYXMgaW52YWxpZCBwcmVmaXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5ub2RlSUQoJ0ludmFsaWRQcmVmaXgtMTIzNDU2Nzg5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgTm9kZUlEIHRhZydcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBub2RlSUQgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG4gICAgICAoKCkgPT4gYnVpbGRlci5ub2RlSUQodmFsaWROb2RlSUQpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSBzdGFrZSBkdXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBlbmQgdGltZSBpcyBsZXNzIHRoYW4gc3RhcnQgdGltZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDYwKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBCaWdJbnQoTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgLSA2MCk7XG5cbiAgICAgIGJ1aWxkZXIuc3RhcnRUaW1lKHN0YXJ0VGltZS50b1N0cmluZygpKTtcbiAgICAgIGJ1aWxkZXIuZW5kVGltZShlbmRUaW1lLnRvU3RyaW5nKCkpO1xuXG4gICAgICAvLyBUaGUgdmFsaWRhdGlvbiBoYXBwZW5zIGluIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbiwgYnV0IHdlIGNhbiB0ZXN0IHZhbGlkYXRlU3Rha2VEdXJhdGlvbiBkaXJlY3RseVxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0VuZCBkYXRlIGNhbm5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgZGF0ZSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBzdGFrZSBkdXJhdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDYwKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBCaWdJbnQoTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyA4NjQwMCAqIDE0KTsgLy8gMTQgZGF5cyBsYXRlclxuXG4gICAgICAoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnZhbGlkYXRlU3Rha2VEdXJhdGlvbihzdGFydFRpbWUsIGVuZFRpbWUpO1xuICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRlciBtZXRob2RzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IHN0YXJ0VGltZSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDYwO1xuICAgICAgKCgpID0+IGJ1aWxkZXIuc3RhcnRUaW1lKHN0YXJ0VGltZSkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGVuZFRpbWUgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgZW5kVGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgODY0MDAgKiAxNDtcbiAgICAgICgoKSA9PiBidWlsZGVyLmVuZFRpbWUoZW5kVGltZSkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IHJld2FyZEFkZHJlc3Mgd2l0aCBQLWNoYWluIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICAvLyBQLWNoYWluIEJlY2gzMiBhZGRyZXNzXG4gICAgICAoKCkgPT4gYnVpbGRlci5yZXdhcmRBZGRyZXNzKFNFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gbm9kZUlEIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnTm9kZUlEIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBzdGFydCB0aW1lIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdTdGFydCB0aW1lIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBlbmQgdGltZSBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRW5kIHRpbWUgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIHN0YWtlIGFtb3VudCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuZnJvbVB1YktleShbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdTdGFrZSBhbW91bnQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIGNvbnRleHQgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnQ29udGV4dCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGJ1aWxkIHdoZW4gZnJvbSBhZGRyZXNzZXMgYXJlIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDg2NDAwICogMTQpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoNTAwMDAgKiAxZTkpKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdGcm9tIGFkZHJlc3NlcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBidWlsZCB3aGVuIGZlZSBzdGF0ZSBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyA4NjQwMCAqIDE0KVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KDUwMDAwICogMWU5KSlcbiAgICAgICAgLmZyb21QdWJLZXkoW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0XSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRmVlIHN0YXRlIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgYnVpbGQgd2hlbiBVVFhPcyBhcmUgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG4gICAgICBjb25zdCBtb2NrRmVlU3RhdGUgPSB7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH07XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgODY0MDAgKiAxNClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1VUWE9zIGFyZSByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGUgc3Rha2UgYW1vdW50JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHN0YWtlIGFtb3VudCBpcyBiZWxvdyBtaW5pbXVtJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgLy8gTWluaW11bSBpcyA1MDAwMCBGTFIsIHNvIDEwMDAgc2hvdWxkIGZhaWxcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLnN0YWtlQW1vdW50KEJpZ0ludCgxMDAwICogMWU5KSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnTWluaW11bSBkZWxlZ2F0aW9uIGFtb3VudCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgc3Rha2UgYW1vdW50IGF0IG9yIGFib3ZlIG1pbmltdW0nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBzdGFrZUFtb3VudCA9IEJpZ0ludCg1MDAwMCAqIDFlOSk7XG4gICAgICAoKCkgPT4gYnVpbGRlci5zdGFrZUFtb3VudChzdGFrZUFtb3VudCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIHR5cGUgc3VwcG9ydCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IHNldHRpbmcgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IgdHJhbnNhY3Rpb24gdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIC8vIFRoZSBidWlsZGVyIHNob3VsZCBzdWNjZXNzZnVsbHkgY29uZmlndXJlIHdpdGggQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IgdHlwZVxuICAgICAgLy8gVGhpcyB2ZXJpZmllcyB0cmFuc2FjdGlvbi50cyBzZXRUcmFuc2FjdGlvblR5cGUgYWNjZXB0cyB0aGUgZGVsZWdhdGlvbiB0eXBlXG4gICAgICBidWlsZGVyLnNob3VsZC5iZS5pbnN0YW5jZW9mKFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IG1pbmltdW0gc3Rha2UgYW1vdW50IGNvbnN0YW50JywgKCkgPT4ge1xuICAgICAgLy8gVmVyaWZ5IHRoZSBtaW5pbXVtIHN0YWtlIGFtb3VudCBpcyA1MDAwMCBGTFIgKGluIG5hbm9GTFIpXG4gICAgICBjb25zdCBtaW5TdGFrZUFtb3VudCA9IEJpZ0ludCg1MDAwMCAqIDFlOSk7XG4gICAgICBtaW5TdGFrZUFtb3VudC5zaG91bGQuZXF1YWwoQmlnSW50KCc1MDAwMDAwMDAwMDAwMCcpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JvdW5kLXRyaXAgZGVzZXJpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZGVzZXJpYWxpemUgYSBzaWduZWQgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbiBmcm9tIGhleCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KERFTEVHQVRJT05fVFhfMi5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBleHRyYWN0IGRlbGVnYXRpb24gcGFyYW1ldGVycyBmcm9tIGRlc2VyaWFsaXplZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdXRpbHMucmVtb3ZlSGV4UHJlZml4KERFTEVHQVRJT05fVFhfMi5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKERFTEVHQVRJT05fVFhfMi5zdGFrZUFtb3VudCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlLXNlcmlhbGl6ZSB0byB0aGUgc2FtZSBoZXggKHJvdW5kLXRyaXApJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgcmVFbmNvZGVkVHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG5cbiAgICAgIHJlRW5jb2RlZFR4LnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBpbnB1dC9vdXRwdXQgY291bnRzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoREVMRUdBVElPTl9UWF8yLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgdHguaW5wdXRzLnNob3VsZC5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkIHdpdGggVVRYT3MgKGNvbXByZWhlbnNpdmUgdGVzdHMpJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tGZWVTdGF0ZSA9IHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfTtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9EVVJBVElPTiA9IDE0ICogMjQgKiA2MCAqIDYwOyAvLyAxNCBkYXlzICgxMjA5NjAwIHNlY29uZHMpXG4gICAgY29uc3QgTUlOX0RFTEVHQVRJT05fQU1PVU5UID0gQmlnSW50KDUwMDAwICogMWU5KTsgLy8gNTAwMDAgRkxSIGluIG5hbm9GTFJcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXM6IHN0cmluZ1tdLCB0aHJlc2hvbGQ6IG51bWJlciwgYW1vdW50ID0gJzYwMDAwMDAwMDAwMDAwJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gd2l0aCB0aHJlc2hvbGQ9MiBhbmQgMyBhZGRyZXNzZXMgKEJpdEdvIDItb2YtMyBtdWx0aXNpZyknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcbiAgICAgIGNvbnN0IHV0eG9zID0gY3JlYXRlVGVzdFV0eG9zKGFkZHJlc3NlcywgMik7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIHR4LnNob3VsZC5iZS5pbnN0YW5jZW9mKFRyYW5zYWN0aW9uKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gd2l0aCB0aHJlc2hvbGQ9MiBhbmQgMiBhZGRyZXNzZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXRdO1xuICAgICAgY29uc3QgdXR4b3MgPSBjcmVhdGVUZXN0VXR4b3MoYWRkcmVzc2VzLCAyKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIFVUWE8gYW1vdW50IGlzIGluc3VmZmljaWVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF07XG4gICAgICBjb25zdCB1dHhvcyA9IGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXMsIDIsICcxMDAwMDAwMDAwMDAwJyk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04pXG4gICAgICAgIC5zdGFrZUFtb3VudChNSU5fREVMRUdBVElPTl9BTU9VTlQpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgZGVsZWdhdGlvbiB3aXRoIG11bHRpcGxlIFVUWE9zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICAvLyBDcmVhdGUgbXVsdGlwbGUgVVRYT3Mgd2l0aCBkaWZmZXJlbnQgdHhpZHNcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzMwMDAwMDAwMDAwMDAwJywgLy8gMzBrIEZMUlxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgICAgbG9ja3RpbWU6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcya1NTSFdLWkg3dUoxRmZTcGdSYVBmZ1BwblQ0OTE1UVZYUEFNdzZIamZGUVZKMVFGeCcsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICcyNTAwMDAwMDAwMDAwMCcsIC8vIDI1ayBGTFJcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMkU2WHVxZjNpNlRud0g2emp0NEs2ak5EUjJvb2oxRFRKcFRGWjZTZ1paa1JKNEFEU2UnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIGFzc2V0SUQ6IENPTlRFWFQuYXZheEFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAnLCAvLyAxMGsgRkxSXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIC8vIFRvdGFsOiA2NWsgRkxSID4gNTBrIG1pbmltdW1cblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcbiAgICAgIC8vIEZsYXJlSlMgb3B0aW1pemVzIHRvIHVzZSBtaW5pbXVtIFVUWE9zIG5lZWRlZCwgbWF5IG5vdCBjb25zdW1lIGFsbCAzXG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIGZpeCBmb3IgRmxhcmVKUyBCdWcgLSBDaGFuZ2Ugb3V0cHV0IHRocmVzaG9sZFxuICAgICAqXG4gICAgICogRmxhcmVKUydzIHB2bS5lLm5ld0FkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHgoKSBkZWZhdWx0cyBjaGFuZ2Ugb3V0cHV0cyB0byB0aHJlc2hvbGQ9MS5cbiAgICAgKiBXZSBpbXBsZW1lbnQgYSBmaXggKHNpbWlsYXIgdG8gRXhwb3J0SW5QVHhCdWlsZGVyKSB0byBjb3JyZWN0IGNoYW5nZSBvdXRwdXRzIHRvIHRocmVzaG9sZD0yXG4gICAgICogZm9yIG11bHRpc2lnIHdhbGxldHMsIG1haW50YWluaW5nIHNlY3VyaXR5LlxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIGNoYW5nZSBvdXRwdXQgd2l0aCB0aHJlc2hvbGQ9MiBmb3IgbXVsdGlzaWcgd2FsbGV0IChidWcgZml4ZWQpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXMsIDIsICc2MDAwMDAwMDAwMDAwMCcpOyAvLyA2MGsgRkxSXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVCkgLy8gU3Rha2UgNTBrXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgY2hhbmdlIGV4aXN0cyB1c2luZyBleHBsYWluVHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBCaWdJbnQoZXhwbGFuYXRpb24uY2hhbmdlQW1vdW50KTtcbiAgICAgIE51bWJlcihjaGFuZ2VBbW91bnQpLnNob3VsZC5iZS5ncmVhdGVyVGhhbihcbiAgICAgICAgTnVtYmVyKEJpZ0ludCgnOTAwMDAwMDAwMDAwMCcpKSxcbiAgICAgICAgJ1Nob3VsZCBoYXZlIGNoYW5nZSAoYXQgbGVhc3QgOWsgYWZ0ZXIgZmVlcyknXG4gICAgICApO1xuXG4gICAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCwgJ1Nob3VsZCBoYXZlIGNoYW5nZSBvdXRwdXRzJyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgZml4OiBjaGFuZ2Ugb3V0cHV0cyBzaG91bGQgbm93IGhhdmUgdGhyZXNob2xkPTJcbiAgICAgIGNvbnN0IGZsYXJlVHJhbnNhY3Rpb24gPSAodHggYXMgYW55KS5fZmxhcmVUcmFuc2FjdGlvbiBhcyBhbnk7XG4gICAgICBjb25zdCBpbm5lclR4ID0gZmxhcmVUcmFuc2FjdGlvbi5nZXRUeCgpO1xuICAgICAgY29uc3QgY2hhbmdlT3V0cHV0cyA9IGlubmVyVHguYmFzZVR4Lm91dHB1dHM7XG5cbiAgICAgIGNoYW5nZU91dHB1dHMuZm9yRWFjaCgob3V0cHV0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJPdXQgPSBvdXRwdXQub3V0cHV0O1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSB0cmFuc2Zlck91dC5vdXRwdXRPd25lcnMudGhyZXNob2xkLnZhbHVlKCk7XG4gICAgICAgIHRocmVzaG9sZC5zaG91bGQuZXF1YWwoMiwgJ0NoYW5nZSBvdXRwdXQgc2hvdWxkIGhhdmUgdGhyZXNob2xkPTIgKGJ1ZyBmaXhlZCEpJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjaGFuZ2Ugb3V0cHV0IGFkZHJlc3NlcyBtYXRjaGluZyB3YWxsZXQgYWRkcmVzc2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IGNyZWF0ZVRlc3RVdHhvcyhhZGRyZXNzZXMsIDIsICc2MDAwMDAwMDAwMDAwMCcpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04pXG4gICAgICAgIC5zdGFrZUFtb3VudChNSU5fREVMRUdBVElPTl9BTU9VTlQpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgY2hhbmdlIGV4aXN0cyBhbmQgYWRkcmVzc2VzIG1hdGNoIHVzaW5nIGV4cGxhaW5UcmFuc2FjdGlvblxuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IEJpZ0ludChleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQpO1xuICAgICAgTnVtYmVyKGNoYW5nZUFtb3VudCkuc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDAsICdTaG91bGQgaGF2ZSBjaGFuZ2Ugb3V0cHV0Jyk7XG5cbiAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IGNoYW5nZSBvdXRwdXQgYWRkcmVzc2VzIG1hdGNoIHdhbGxldCBhZGRyZXNzZXMgKHNvcnRlZClcbiAgICAgIGNvbnN0IHNvcnRlZEZyb21BZGRyZXNzZXMgPSAodHggYXMgVHJhbnNhY3Rpb24pLmZyb21BZGRyZXNzZXMuc2xpY2UoKS5zb3J0KCkuam9pbignficpO1xuXG4gICAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLmZvckVhY2goKG91dHB1dCkgPT4ge1xuICAgICAgICBvdXRwdXQuYWRkcmVzcy5zaG91bGQuZXF1YWwoc29ydGVkRnJvbUFkZHJlc3NlcywgJ0NoYW5nZSBvdXRwdXQgYWRkcmVzc2VzIHNob3VsZCBtYXRjaCB3YWxsZXQgYWRkcmVzc2VzJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ211bHRpcGxlIGRlbGVnYXRpb25zIHRvIHNhbWUgdmFsaWRhdG9yJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tGZWVTdGF0ZSA9IHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfTtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9EVVJBVElPTiA9IDE0ICogMjQgKiA2MCAqIDYwO1xuICAgIGNvbnN0IE1JTl9ERUxFR0FUSU9OX0FNT1VOVCA9IEJpZ0ludCg1MDAwMCAqIDFlOSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgY3JlYXRpbmcgbXVsdGlwbGUgZGVsZWdhdGlvbnMgdG8gc2FtZSB2YWxpZGF0b3Igd2l0aCBkaWZmZXJlbnQgdGltZSBwZXJpb2RzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8zLmFkZHJlc3NdO1xuXG4gICAgICAvLyBGaXJzdCBkZWxlZ2F0aW9uOiBKYW4gMSAtIE1hciAxXG4gICAgICBjb25zdCBidWlsZGVyMSA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgdXR4b3MxID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMCcsIC8vIDEwMGsgRkxSXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdHgxID0gYXdhaXQgYnVpbGRlcjFcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUobm93ICsgNjAgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVCkgLy8gNTBrXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvczEpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHgxLnNob3VsZC5iZS5pbnN0YW5jZW9mKFRyYW5zYWN0aW9uKTtcbiAgICAgIHR4MS50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBTZWNvbmQgZGVsZWdhdGlvbjogRmViIDEgLSBBcHIgMSAob3ZlcmxhcHBpbmcgcGVyaW9kLCBkaWZmZXJlbnQgc3RhcnQvZW5kKVxuICAgICAgLy8gU2ltdWxhdGluZyB1c2luZyBhIGRpZmZlcmVudCBVVFhPIChpbiBwcmFjdGljZSwgY291bGQgYmUgY2hhbmdlIGZyb20gZmlyc3QgZGVsZWdhdGlvbilcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCB1dHhvczIgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMlF0dHVFMU1OUlBFdkxQZGhCOHQ2V3BDOTFWS2Z2aWdIdmYxUEtyTlE2QkdnQjZoWncnLCAvLyBWYWxpZCBDQjU4IHR4aWRcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzUwMDEwMDAwMDAwMDAwJywgLy8gNTAwMTAgRkxSICg1MGsgc3Rha2UgKyBleHRyYSBmb3IgZmVlcylcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCBidWlsZGVyMlxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKSAvLyBTYW1lIHZhbGlkYXRvciFcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MCArIDMwICogMjQgKiA2MCAqIDYwKSAvLyAzMCBkYXlzIGxhdGVyXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIDYwICsgMzAgKiAyNCAqIDYwICogNjAgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVCkgLy8gQW5vdGhlciA1MGtcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zMilcbiAgICAgICAgLmZlZVN0YXRlKG1vY2tGZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICB0eDIuc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgyLnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIEJvdGggdHJhbnNhY3Rpb25zIHNob3VsZCBiZSB2YWxpZCBhbmQgaW5kZXBlbmRlbnRcbiAgICAgIHR4MS5pZC5zaG91bGQubm90LmVxdWFsKHR4Mi5pZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgc2VxdWVudGlhbCBkZWxlZ2F0aW9ucyAob25lIGVuZHMsIG5leHQgYmVnaW5zKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcblxuICAgICAgY29uc3QgdXR4b3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMk5XZDloclNHa1dKV3lUdTREblNNMXFRU1VUMkRWbTh1cXdGazR3UVJGTEFtY3NIUXonLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIGFzc2V0SUQ6IENPTlRFWFQuYXZheEFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBGaXJzdCBkZWxlZ2F0aW9uXG4gICAgICBjb25zdCBidWlsZGVyMSA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgZGVsZWdhdGlvbjFFbmRUaW1lID0gbm93ICsgNjAgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTjtcblxuICAgICAgY29uc3QgdHgxID0gYXdhaXQgYnVpbGRlcjFcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShub3cgKyA2MClcbiAgICAgICAgLmVuZFRpbWUoZGVsZWdhdGlvbjFFbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgLy8gU2Vjb25kIGRlbGVnYXRpb24gc3RhcnRzIHJpZ2h0IGFmdGVyIGZpcnN0IG9uZSBlbmRzXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3QgdXR4b3MyID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJLOXJnaUVnc0VjVDNkQjlFeWR1RUhGcTdnNHNIUUJNa3MxNlZVUUFyVlJpZUJROVc1JywgLy8gVmFsaWQgQ0I1OCB0eGlkXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc1MDAxMDAwMDAwMDAwMCcsIC8vIDUwMDEwIEZMUiAoNTBrIHN0YWtlICsgZXh0cmEgZm9yIGZlZXMpXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdHgyID0gYXdhaXQgYnVpbGRlcjJcbiAgICAgICAgLm5vZGVJRCh2YWxpZE5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShkZWxlZ2F0aW9uMUVuZFRpbWUgKyAxKSAvLyBTdGFydHMgMSBzZWNvbmQgYWZ0ZXIgZmlyc3QgZW5kc1xuICAgICAgICAuZW5kVGltZShkZWxlZ2F0aW9uMUVuZFRpbWUgKyAxICsgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04pXG4gICAgICAgIC5zdGFrZUFtb3VudChNSU5fREVMRUdBVElPTl9BTU9VTlQpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvczIpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgdHgxLnNob3VsZC5iZS5pbnN0YW5jZW9mKFRyYW5zYWN0aW9uKTtcbiAgICAgIHR4Mi5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICB0eDEuaWQuc2hvdWxkLm5vdC5lcXVhbCh0eDIuaWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbmluZyBtdWx0aXNpZyBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmVlU3RhdGUgPSB7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH07XG4gICAgY29uc3QgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04gPSAxNCAqIDI0ICogNjAgKiA2MDtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9BTU9VTlQgPSBCaWdJbnQoNTAwMDAgKiAxZTkpO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgc2lnbiBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdpdGggdGhyZXNob2xkPTIgbXVsdGlzaWcgd2FsbGV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsIC8vIDYwayBGTFIgKHdpbGwgaGF2ZSBjaGFuZ2UpXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSlcbiAgICAgICAgLnNpZ24oeyBrZXk6IFNFRURfQUNDT1VOVC5wcml2YXRlS2V5IH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGlzIGJ1aWx0IHN1Y2Nlc3NmdWxseVxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcblxuICAgICAgLy8gVmVyaWZ5IGNyZWRlbnRpYWxzIGV4aXN0IChub24tZW1wdHkpXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgY3JlZGVudGlhbHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IGF0IGxlYXN0IG9uZSBzaWduYXR1cmUgc2xvdCBoYXMgYSBzaWduYXR1cmVcbiAgICAgIGxldCBoYXNTaWduYXR1cmUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiBjcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHNpZ25hdHVyZXMpIHtcbiAgICAgICAgICBpZiAoc2lnICYmIHNpZy5sZW5ndGggPiAwICYmICFzaWcuc3RhcnRzV2l0aCgnMHgnICsgJzAnLnJlcGVhdCgxMzApKSkge1xuICAgICAgICAgICAgaGFzU2lnbmF0dXJlID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzU2lnbmF0dXJlKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGhhc1NpZ25hdHVyZS5zaG91bGQuYmUudHJ1ZSgnU2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHNpZ25hdHVyZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgc2lnbiBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgc2lnbmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgY29uc3QgdmFsaWROb2RlSUQgPSAnTm9kZUlELUFLN3NQQnNaTTlyUXdzZTIzYUxoRUVCUEhaRDVna0xyTCc7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFtTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF07XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gU2lnbiB3aXRoIGJvdGgga2V5cyBmb3IgMi1vZi0yIG11bHRpc2lnXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBTRUVEX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gaXMgYnVpbHQgYW5kIGhhcyBtdWx0aXBsZSBzaWduYXR1cmVzXG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuXG4gICAgICAvLyBDb3VudCBub24tZW1wdHkgc2lnbmF0dXJlc1xuICAgICAgbGV0IHNpZ25hdHVyZUNvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiBjcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHNpZ25hdHVyZXMpIHtcbiAgICAgICAgICBpZiAoc2lnICYmIHNpZy5sZW5ndGggPiAwICYmICFzaWcuc3RhcnRzV2l0aCgnMHgnICsgJzAnLnJlcGVhdCgxMzApKSkge1xuICAgICAgICAgICAgc2lnbmF0dXJlQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNpZ25hdHVyZUNvdW50LnNob3VsZC5iZS5ncmVhdGVyVGhhbk9yRXF1YWwoMiwgJ1Nob3VsZCBoYXZlIGF0IGxlYXN0IDIgc2lnbmF0dXJlcyBmb3IgMi1vZi0yIG11bHRpc2lnJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdoYWxmLXNpZ25pbmcgd29ya2Zsb3cgd2l0aCByZWFsIHRyYW5zYWN0aW9uIGRhdGEnLCAoKSA9PiB7XG4gICAgLy8gSW1wb3J0IHJlYWwgbXVsdGlzaWcgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbiBkYXRhIGZyb20gdGVzdG5ldFxuICAgIGNvbnN0IHtcbiAgICAgIEhBTEZfU0lHTl9URVNUX0FDQ09VTlRTLFxuICAgICAgTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMsXG4gICAgICBNVUxUSVNJR19ERUxFR0FUSU9OX1VOU0lHTkVEX1RYX0hFWCxcbiAgICAgIE1VTFRJU0lHX0RFTEVHQVRJT05fSEFMRl9TSUdORURfVFhfSEVYLFxuICAgICAgTVVMVElTSUdfREVMRUdBVElPTl9GVUxMWV9TSUdORURfVFhfSEVYLFxuICAgIH0gPSByZXF1aXJlKCcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL211bHRpc2lnRGVsZWdhdGlvblR4Jyk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHVuc2lnbmVkIG11bHRpc2lnIGRlbGVnYXRpb24gdHJhbnNhY3Rpb24gZnJvbSB0ZXN0bmV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoTVVMVElTSUdfREVMRUdBVElPTl9VTlNJR05FRF9UWF9IRVgpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gY2FuIGJlIGRlc2VyaWFsaXplZCBieSBGbGFyZUpTXG4gICAgICBjb25zdCBkZWNvZGVkVHhCeXRlcyA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnaGV4Jyk7XG4gICAgICBkZWNvZGVkVHhCeXRlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICBkZWNvZGVkVHhCeXRlcy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlzaWcgYWRkcmVzc2VzIGFuZCB2ZXJpZnkgc29ydGluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldERlbGVnYXRvckJ1aWxkZXIoKTtcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMubXVsdGlzaWdBZGRyZXNzZXM7XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLm5vZGVJRClcbiAgICAgICAgLnN0YXJ0VGltZShNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5zdGFydFRpbWUpXG4gICAgICAgIC5lbmRUaW1lKE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLmVuZFRpbWUpXG4gICAgICAgIC5zdGFrZUFtb3VudChCaWdJbnQoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMuc3Rha2VBbW91bnQpKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZSh7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH0pXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiB3YXMgYnVpbHQgc3VjY2Vzc2Z1bGx5XG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBWZXJpZnkgVVRYT3MgYXJlIHByb3Blcmx5IGhhbmRsZWRcbiAgICAgIGNvbnN0IHR4VXR4b3MgPSAodHggYXMgYW55KS5fdXR4b3M7XG4gICAgICB0eFV0eG9zLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHR4VXR4b3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FkZHJlc3NlcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByYXdUeCA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChNVUxUSVNJR19ERUxFR0FUSU9OX0hBTEZfU0lHTkVEX1RYX0hFWCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBWZXJpZnkgaXQgaGFzIG9uZSBzaWduYXR1cmVcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gKHR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb24uY3JlZGVudGlhbHM7XG4gICAgICBjcmVkZW50aWFscy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG5cbiAgICAgIGxldCBzaWduYXR1cmVDb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNyZWRlbnRpYWwgb2YgY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZyBvZiBzaWduYXR1cmVzKSB7XG4gICAgICAgICAgY29uc3Qgc2lnSGV4ID0gc2lnLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAvLyBOb24tZW1wdHkgc2lnbmF0dXJlIChub3QgYWxsIHplcm9zKVxuICAgICAgICAgIGlmIChzaWdIZXggJiYgIXNpZ0hleC5tYXRjaCgvXjArJC8pKSB7XG4gICAgICAgICAgICBzaWduYXR1cmVDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzaWduYXR1cmVDb3VudC5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKDEsICdTaG91bGQgaGF2ZSBhdCBsZWFzdCAxIHNpZ25hdHVyZSBpbiBoYWxmLXNpZ25lZCB0eCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgZnVsbHktc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmF3VHggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoTVVMVElTSUdfREVMRUdBVElPTl9GVUxMWV9TSUdORURfVFhfSEVYKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIFZlcmlmeSBpdCBoYXMgdHdvIHNpZ25hdHVyZXNcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gKHR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb24uY3JlZGVudGlhbHM7XG4gICAgICBjcmVkZW50aWFscy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG5cbiAgICAgIGxldCBzaWduYXR1cmVDb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNyZWRlbnRpYWwgb2YgY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZyBvZiBzaWduYXR1cmVzKSB7XG4gICAgICAgICAgY29uc3Qgc2lnSGV4ID0gc2lnLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAvLyBOb24tZW1wdHkgc2lnbmF0dXJlIChub3QgYWxsIHplcm9zKVxuICAgICAgICAgIGlmIChzaWdIZXggJiYgIXNpZ0hleC5tYXRjaCgvXjArJC8pKSB7XG4gICAgICAgICAgICBzaWduYXR1cmVDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzaWduYXR1cmVDb3VudC5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKDIsICdTaG91bGQgaGF2ZSBhdCBsZWFzdCAyIHNpZ25hdHVyZXMgaW4gZnVsbHktc2lnbmVkIHR4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkLCBzaWduIHdpdGggdXNlciBrZXksIGFuZCBtYXRjaCBoYWxmLXNpZ25lZCBmb3JtYXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLm11bHRpc2lnQWRkcmVzc2VzO1xuICAgICAgY29uc3QgdXR4b3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogNyxcbiAgICAgICAgICB0eGlkOiAnMk5XZDloclNHa1dKV3lUdTREblNNMXFRU1VUMkRWbTh1cXdGazR3UVJGTEFtY3NIUXonLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIGFzc2V0SUQ6IENPTlRFWFQuYXZheEFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiAnNjAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgICAgbG9ja3RpbWU6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLm5vZGVJRChNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5ub2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMuc3RhcnRUaW1lKVxuICAgICAgICAuZW5kVGltZShNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5lbmRUaW1lKVxuICAgICAgICAuc3Rha2VBbW91bnQoQmlnSW50KE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLnN0YWtlQW1vdW50KSlcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUoeyBjYXBhY2l0eTogMTAwMDAwbiwgZXhjZXNzOiAwbiwgcHJpY2U6IDEwMDBuLCB0aW1lc3RhbXA6ICcxMjM0NTY3ODkwJyB9KVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSlcbiAgICAgICAgLnNpZ24oeyBrZXk6IEhBTEZfU0lHTl9URVNUX0FDQ09VTlRTLnVzZXIucHJpdmF0ZUtleSB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBoYXMgY3JlZGVudGlhbHNcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gKHR4IGFzIGFueSkuX2ZsYXJlVHJhbnNhY3Rpb24uY3JlZGVudGlhbHM7XG4gICAgICBjcmVkZW50aWFscy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG5cbiAgICAgIC8vIENvdW50IHNpZ25hdHVyZXNcbiAgICAgIGxldCBzaWduYXR1cmVDb3VudCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNyZWRlbnRpYWwgb2YgY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZyBvZiBzaWduYXR1cmVzKSB7XG4gICAgICAgICAgY29uc3Qgc2lnSGV4ID0gc2lnLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICBpZiAoc2lnSGV4ICYmICFzaWdIZXgubWF0Y2goL14wKyQvKSkge1xuICAgICAgICAgICAgc2lnbmF0dXJlQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2lnbmF0dXJlQ291bnQuc2hvdWxkLmJlLmdyZWF0ZXJUaGFuT3JFcXVhbCgxLCAnU2hvdWxkIGhhdmUgdXNlciBzaWduYXR1cmUgYWZ0ZXIgc2lnbmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiB3aXRoIGJvdGggdXNlciBhbmQgYml0Z28ga2V5cyBmb3IgZnVsbHktc2lnbmVkIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5tdWx0aXNpZ0FkZHJlc3NlcztcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMubm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKE1VTFRJU0lHX0RFTEVHQVRJT05fUEFSQU1TLnN0YXJ0VGltZSlcbiAgICAgICAgLmVuZFRpbWUoTVVMVElTSUdfREVMRUdBVElPTl9QQVJBTVMuZW5kVGltZSlcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludChNVUxUSVNJR19ERUxFR0FUSU9OX1BBUkFNUy5zdGFrZUFtb3VudCkpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICAvLyBTaWduIHdpdGggYm90aCBrZXlzXG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IEhBTEZfU0lHTl9URVNUX0FDQ09VTlRTLnVzZXIucHJpdmF0ZUtleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogSEFMRl9TSUdOX1RFU1RfQUNDT1VOVFMuYml0Z28ucHJpdmF0ZUtleSB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcik7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBoYXMgYm90aCBzaWduYXR1cmVzXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuXG4gICAgICBsZXQgc2lnbmF0dXJlQ291bnQgPSAwO1xuICAgICAgZm9yIChjb25zdCBjcmVkZW50aWFsIG9mIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBjcmVkZW50aWFsLmdldFNpZ25hdHVyZXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWcgb2Ygc2lnbmF0dXJlcykge1xuICAgICAgICAgIGNvbnN0IHNpZ0hleCA9IHNpZy50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgaWYgKHNpZ0hleCAmJiAhc2lnSGV4Lm1hdGNoKC9eMCskLykpIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZUNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNpZ25hdHVyZUNvdW50LnNob3VsZC5iZS5ncmVhdGVyVGhhbk9yRXF1YWwoMiwgJ1Nob3VsZCBoYXZlIGJvdGggdXNlciBhbmQgYml0Z28gc2lnbmF0dXJlcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIHdoZW4gYWRkcmVzc2VzIG5lZWQgc29ydGluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIHNjZW5hcmlvIHdpdGggYWRkcmVzc2VzIGluIGRpZmZlcmVudCBvcmRlclxuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgICAgIC8vIFVzZSBhZGRyZXNzZXMgaW4gYSBzcGVjaWZpYyBvcmRlclxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW0FDQ09VTlRfMy5hZGRyZXNzLCBTRUVEX0FDQ09VTlQuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMS5hZGRyZXNzVGVzdG5ldF07XG5cbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyAxNCAqIDI0ICogNjAgKiA2MClcbiAgICAgICAgLnN0YWtlQW1vdW50KEJpZ0ludCg1MDAwMCAqIDFlOSkpXG4gICAgICAgIC5mcm9tUHViS2V5KGFkZHJlc3NlcylcbiAgICAgICAgLmRlY29kZWRVdHhvcyh1dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKHsgY2FwYWNpdHk6IDEwMDAwMG4sIGV4Y2VzczogMG4sIHByaWNlOiAxMDAwbiwgdGltZXN0YW1wOiAnMTIzNDU2Nzg5MCcgfSlcbiAgICAgICAgLmNvbnRleHQoQ09OVEVYVCBhcyBhbnkpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGJ1aWxkcyBzdWNjZXNzZnVsbHkgd2l0aCBzb3J0ZWQgYWRkcmVzc2VzXG4gICAgICB0eC5zaG91bGQuYmUuaW5zdGFuY2VvZihUcmFuc2FjdGlvbik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IpO1xuXG4gICAgICAvLyBWZXJpZnkgVVRYT3MgYXJlIHByb3Blcmx5IGhhbmRsZWRcbiAgICAgIGNvbnN0IHR4VXR4b3MgPSAodHggYXMgYW55KS5fdXR4b3M7XG4gICAgICB0eFV0eG9zLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHR4VXR4b3NbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FkZHJlc3NlcycpO1xuICAgICAgdHhVdHhvc1swXS5hZGRyZXNzZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlY292ZXJ5IG1vZGUgc2lnbmluZycsICgpID0+IHtcbiAgICBjb25zdCBtb2NrRmVlU3RhdGUgPSB7IGNhcGFjaXR5OiAxMDAwMDBuLCBleGNlc3M6IDBuLCBwcmljZTogMTAwMG4sIHRpbWVzdGFtcDogJzEyMzQ1Njc4OTAnIH07XG4gICAgY29uc3QgTUlOX0RFTEVHQVRJT05fRFVSQVRJT04gPSAxNCAqIDI0ICogNjAgKiA2MDtcbiAgICBjb25zdCBNSU5fREVMRUdBVElPTl9BTU9VTlQgPSBCaWdJbnQoNTAwMDAgKiAxZTkpO1xuXG4gICAgLyoqXG4gICAgICogUmVjb3ZlcnkgbW9kZSB0ZXN0IHZlcmlmaWVzIHRoYXQgd2hlbiByZWNvdmVyU2lnbmVyPXRydWUsIHRoZSBidWlsZGVyIHVzZXM6XG4gICAgICogLSBCYWNrdXAga2V5IChpbmRleCAyKSBpbnN0ZWFkIG9mIHVzZXIga2V5IChpbmRleCAwKVxuICAgICAqIC0gQml0R28ga2V5IChpbmRleCAxKSBhcyBhbHdheXNcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIGJ1dCBzaG91bGQgYmUgdmVyaWZpZWRcbiAgICAgKiB0byB3b3JrIGNvcnJlY3RseSB3aXRoIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgc2lnbiBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uIGluIHJlY292ZXJ5IG1vZGUgKGJhY2t1cCArIGJpdGdvIGtleXMpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgLy8gMi1vZi0zIG11bHRpc2lnOiB1c2VyLCBiaXRnbywgYmFja3VwXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJywgLy8gNjBrIEZMUlxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgICAgbG9ja3RpbWU6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIEVuYWJsZSByZWNvdmVyeSBtb2RlIC0gdGhpcyB0ZWxscyB0aGUgYnVpbGRlciB0byB1c2UgYmFja3VwIChpbmRleCAyKSBpbnN0ZWFkIG9mIHVzZXIgKGluZGV4IDApXG4gICAgICAoYnVpbGRlciBhcyBhbnkpLnJlY292ZXJTaWduZXIgPSB0cnVlO1xuXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQodmFsaWROb2RlSUQpXG4gICAgICAgIC5zdGFydFRpbWUobm93ICsgNjApXG4gICAgICAgIC5lbmRUaW1lKG5vdyArIE1JTl9ERUxFR0FUSU9OX0RVUkFUSU9OKVxuICAgICAgICAuc3Rha2VBbW91bnQoTUlOX0RFTEVHQVRJT05fQU1PVU5UKVxuICAgICAgICAuZnJvbVB1YktleShhZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZShtb2NrRmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KENPTlRFWFQgYXMgYW55KTtcblxuICAgICAgLy8gSW4gcmVjb3ZlcnkgbW9kZTogc2lnbiB3aXRoIGJhY2t1cCAoaW5kZXggMikgYW5kIGJpdGdvIChpbmRleCAxKVxuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBBQ0NPVU5UXzMucHJpdmF0ZUtleSB9KTsgLy8gYmFja3VwIGtleVxuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBBQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTsgLy8gYml0Z28ga2V5XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gYnVpbGRzIHN1Y2Nlc3NmdWxseVxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcblxuICAgICAgLy8gVmVyaWZ5IGNyZWRlbnRpYWxzIGV4aXN0XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9ICh0eCBhcyBhbnkpLl9mbGFyZVRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgY3JlZGVudGlhbHMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IHdlIGhhdmUgc2lnbmF0dXJlcyBmcm9tIGJvdGggcmVjb3Zlcnkga2V5c1xuICAgICAgbGV0IHNpZ25hdHVyZUNvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiBjcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gY3JlZGVudGlhbC5nZXRTaWduYXR1cmVzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHNpZ25hdHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBzaWdIZXggPSBzaWcudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIC8vIE5vbi1lbXB0eSBzaWduYXR1cmUgKG5vdCBhbGwgemVyb3MpXG4gICAgICAgICAgaWYgKHNpZ0hleCAmJiAhc2lnSGV4Lm1hdGNoKC9eMCskLykpIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZUNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIGF0IGxlYXN0IDIgc2lnbmF0dXJlcyAoYmFja3VwICsgYml0Z28pXG4gICAgICBzaWduYXR1cmVDb3VudC5zaG91bGQuYmUuZ3JlYXRlclRoYW5PckVxdWFsKDIsICdSZWNvdmVyeSBtb2RlIHNob3VsZCBoYXZlIGJhY2t1cCArIGJpdGdvIHNpZ25hdHVyZXMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHNpZ25pbmcgaW4gcmVjb3ZlcnkgbW9kZSB3aXRoIHVzZXIga2V5IGluc3RlYWQgb2YgYmFja3VwJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0RGVsZWdhdG9yQnVpbGRlcigpO1xuICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICBjb25zdCB2YWxpZE5vZGVJRCA9ICdOb2RlSUQtQUs3c1BCc1pNOXJRd3NlMjNhTGhFRUJQSFpENWdrTHJMJztcblxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gW1NFRURfQUNDT1VOVC5hZGRyZXNzVGVzdG5ldCwgQUNDT1VOVF8xLmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzMuYWRkcmVzc107XG4gICAgICBjb25zdCB1dHhvcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiA3LFxuICAgICAgICAgIHR4aWQ6ICcyTldkOWhyU0drV0pXeVR1NERuU00xcVFTVVQyRFZtOHVxd0ZrNHdRUkZMQW1jc0hReicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgYXNzZXRJRDogQ09OVEVYVC5hdmF4QXNzZXRJRCxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICBsb2NrdGltZTogJzAnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgKGJ1aWxkZXIgYXMgYW55KS5yZWNvdmVyU2lnbmVyID0gdHJ1ZTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIC8vIFRyeSB0byBzaWduIHdpdGggdXNlciBrZXkgKGluZGV4IDApIC0gdGhpcyBzaG91bGQgZmFpbCBpbiByZWNvdmVyeSBtb2RlXG4gICAgICAvLyBiZWNhdXNlIHJlY292ZXJ5IG1vZGUgZXhwZWN0cyBiYWNrdXAga2V5IChpbmRleCAyKSArIGJpdGdvIGtleSAoaW5kZXggMSlcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogU0VFRF9BQ0NPVU5ULnByaXZhdGVLZXkgfSk7IC8vIHVzZXIga2V5ICh3cm9uZyBmb3IgcmVjb3ZlcnkgbW9kZSlcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7IC8vIGJpdGdvIGtleVxuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVHJhbnNhY3Rpb24gYnVpbGRzIGJ1dCBtYXkgbm90IGhhdmUgY29ycmVjdCBzaWduYXR1cmUgY291bnRcbiAgICAgIC8vIEluIHJlY292ZXJ5IG1vZGUgd2l0aCB3cm9uZyBrZXksIHNpZ25hdHVyZSBtYXRjaGluZyBtYXkgZmFpbFxuICAgICAgdHguc2hvdWxkLmJlLmluc3RhbmNlb2YoVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgcmVjb3ZlcnkgbW9kZSB1c2VzIGNvcnJlY3QgYWRkcmVzcyBpbmRpY2VzIChiYWNrdXA9MiwgYml0Z289MSknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXREZWxlZ2F0b3JCdWlsZGVyKCk7XG4gICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgIGNvbnN0IHZhbGlkTm9kZUlEID0gJ05vZGVJRC1BSzdzUEJzWk05clF3c2UyM2FMaEVFQlBIWkQ1Z2tMckwnO1xuXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbU0VFRF9BQ0NPVU5ULmFkZHJlc3NUZXN0bmV0LCBBQ0NPVU5UXzEuYWRkcmVzc1Rlc3RuZXQsIEFDQ09VTlRfMy5hZGRyZXNzXTtcbiAgICAgIGNvbnN0IHV0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDcsXG4gICAgICAgICAgdHhpZDogJzJOV2Q5aHJTR2tXSld5VHU0RG5TTTFxUVNVVDJEVm04dXF3Rms0d1FSRkxBbWNzSFF6JyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICBhc3NldElEOiBDT05URVhULmF2YXhBc3NldElELFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzLFxuICAgICAgICAgIGxvY2t0aW1lOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBFbmFibGUgcmVjb3ZlcnkgbW9kZVxuICAgICAgKGJ1aWxkZXIgYXMgYW55KS5yZWNvdmVyU2lnbmVyID0gdHJ1ZTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKHZhbGlkTm9kZUlEKVxuICAgICAgICAuc3RhcnRUaW1lKG5vdyArIDYwKVxuICAgICAgICAuZW5kVGltZShub3cgKyBNSU5fREVMRUdBVElPTl9EVVJBVElPTilcbiAgICAgICAgLnN0YWtlQW1vdW50KE1JTl9ERUxFR0FUSU9OX0FNT1VOVClcbiAgICAgICAgLmZyb21QdWJLZXkoYWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHV0eG9zKVxuICAgICAgICAuZmVlU3RhdGUobW9ja0ZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dChDT05URVhUIGFzIGFueSk7XG5cbiAgICAgIC8vIEJ1aWxkIHdpdGhvdXQgc2lnbmluZyB0byBpbnNwZWN0IGludGVybmFsIHN0YXRlXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChidWlsZGVyIGFzIGFueSkudHJhbnNhY3Rpb247XG4gICAgICB0cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuXG4gICAgICAvLyBJbiByZWNvdmVyeSBtb2RlLCBnZXRTaWduaW5nQWRkcmVzc2VzIHNob3VsZCByZXR1cm4gW2JhY2t1cCwgYml0Z29dXG4gICAgICBjb25zdCBzaWduaW5nQWRkcmVzc2VzID0gKGJ1aWxkZXIgYXMgYW55KS5nZXRTaWduaW5nQWRkcmVzc2VzKCk7XG4gICAgICBzaWduaW5nQWRkcmVzc2VzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIC8vIFZlcmlmeSBzaWduaW5nIGFkZHJlc3NlcyBhcmUgYmFja3VwIChpbmRleCAyKSBhbmQgYml0Z28gKGluZGV4IDEpXG4gICAgICAvLyBOb3RlOiBXZSBjYW4ndCBkaXJlY3RseSBjb21wYXJlIGFkZHJlc3NlcyBhcyB0aGV5IG1heSBiZSBzb3J0ZWQsXG4gICAgICAvLyBidXQgd2UgY2FuIHZlcmlmeSB0aGUgbWV0aG9kIHJldHVybnMgZXhhY3RseSAyIGFkZHJlc3Nlc1xuICAgICAgc2lnbmluZ0FkZHJlc3Nlc1swXS5sZW5ndGguc2hvdWxkLmVxdWFsKDIwKTtcbiAgICAgIHNpZ25pbmdBZGRyZXNzZXNbMV0ubGVuZ3RoLnNob3VsZC5lcXVhbCgyMCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|