@bitgo/sdk-coin-algo 2.6.2 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/algo.d.ts.map +1 -1
- package/dist/src/algo.js +22 -5
- package/dist/test/fixtures/resources.d.ts +7 -0
- package/dist/test/fixtures/resources.d.ts.map +1 -1
- package/dist/test/fixtures/resources.js +10 -2
- package/dist/test/unit/verifyTransaction.js +410 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -41,6 +41,9 @@ const sdk_test_1 = require("@bitgo/sdk-test");
|
|
|
41
41
|
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
42
42
|
const testData = __importStar(require("../fixtures/resources"));
|
|
43
43
|
const assert_1 = __importDefault(require("assert"));
|
|
44
|
+
const nock = require("nock");
|
|
45
|
+
const sinon = __importStar(require("sinon"));
|
|
46
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
44
47
|
describe('Algorand Verify Transaction:', function () {
|
|
45
48
|
let bitgo;
|
|
46
49
|
let basecoin;
|
|
@@ -50,6 +53,10 @@ describe('Algorand Verify Transaction:', function () {
|
|
|
50
53
|
bitgo.initializeTestVars();
|
|
51
54
|
basecoin = bitgo.coin('talgo');
|
|
52
55
|
});
|
|
56
|
+
afterEach(function () {
|
|
57
|
+
sinon.restore();
|
|
58
|
+
nock.cleanAll();
|
|
59
|
+
});
|
|
53
60
|
describe('Parameter Validation', () => {
|
|
54
61
|
it('should throw error when txParams is missing', async function () {
|
|
55
62
|
const txPrebuild = {
|
|
@@ -290,5 +297,407 @@ describe('Algorand Verify Transaction:', function () {
|
|
|
290
297
|
assert_1.default.strictEqual(result, true);
|
|
291
298
|
});
|
|
292
299
|
});
|
|
300
|
+
describe('Consolidation Verification', () => {
|
|
301
|
+
it('should verify consolidation through sendAccountConsolidations with nock - positive case', async function () {
|
|
302
|
+
// This test verifies that sendAccountConsolidations allows valid consolidation transactions
|
|
303
|
+
// It calls verifyTransaction, which should pass when the tx sends to the correct rootAddress
|
|
304
|
+
const walletData = {
|
|
305
|
+
id: '6434384f1deb5200070345111cba7405',
|
|
306
|
+
coin: 'talgo',
|
|
307
|
+
keys: [
|
|
308
|
+
'6434383c40af290007578fdb89c69028',
|
|
309
|
+
'6434383c9e52490007e6f69f5523c82e',
|
|
310
|
+
'6434383e4b5a440007289caeebf76225',
|
|
311
|
+
],
|
|
312
|
+
coinSpecific: {
|
|
313
|
+
rootAddress: testData.consolidation.rootAddress, // Correct rootAddress
|
|
314
|
+
addressVersion: 1,
|
|
315
|
+
trustedTokens: [],
|
|
316
|
+
},
|
|
317
|
+
multisigType: 'onchain',
|
|
318
|
+
};
|
|
319
|
+
const consolidationTx = {
|
|
320
|
+
txHex: testData.consolidation.txHex, // Sends to rootAddress
|
|
321
|
+
txHash: testData.consolidation.txId,
|
|
322
|
+
feeInfo: {
|
|
323
|
+
size: 247,
|
|
324
|
+
fee: 1000,
|
|
325
|
+
feeRate: 4,
|
|
326
|
+
feeString: '1000',
|
|
327
|
+
},
|
|
328
|
+
keys: [
|
|
329
|
+
'42MIYL2KBISV6WJRALTTSXHBEGLNF7MMQ74FGSYUCT5YP3V2KENJGRFVVQ',
|
|
330
|
+
'MAGXZTDFW5QEXUKOUDIGHTXOKDW7TNQEDLWPBEZEL3VFU3YAA2PGYRS65M',
|
|
331
|
+
'IBHXE4L4HCGJSXJACQAM6ZU6JHTLDEQNVNDZ25TJVX5W43B3AQRMB4VEDU',
|
|
332
|
+
],
|
|
333
|
+
addressVersion: 1,
|
|
334
|
+
consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
|
|
335
|
+
coin: 'talgo',
|
|
336
|
+
};
|
|
337
|
+
const bgUrl = sdk_core_1.common.Environments['mock'].uri;
|
|
338
|
+
const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
|
|
339
|
+
// Mock the consolidateAccount/build API call
|
|
340
|
+
nock(bgUrl)
|
|
341
|
+
.post('/api/v2/talgo/wallet/6434384f1deb5200070345111cba7405/consolidateAccount/build')
|
|
342
|
+
.reply(200, [consolidationTx]);
|
|
343
|
+
// Mock getKeychainsAndValidatePassphrase
|
|
344
|
+
sinon.stub(walletObj, 'getKeychainsAndValidatePassphrase').resolves([]);
|
|
345
|
+
// The key test: should NOT throw the consolidation verification error
|
|
346
|
+
// because the transaction sends to the correct rootAddress
|
|
347
|
+
try {
|
|
348
|
+
await walletObj.sendAccountConsolidations({ walletPassphrase: 'test' });
|
|
349
|
+
// If we get here without throwing, the verification passed
|
|
350
|
+
assert_1.default.ok(true, 'Consolidation verification passed - no error thrown');
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
// If an error is thrown, it should NOT be the consolidation mismatch error
|
|
354
|
+
// (other errors like signing errors are okay since we're not fully mocking everything)
|
|
355
|
+
if (error.message === 'Consolidation transaction recipient does not match wallet base address') {
|
|
356
|
+
assert_1.default.fail('Should not throw consolidation verification error for valid transaction');
|
|
357
|
+
}
|
|
358
|
+
// Other errors are acceptable in this test (e.g., incomplete mocking of signing)
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
it('should reject malicious consolidation through sendAccountConsolidations with nock', async function () {
|
|
362
|
+
// This test verifies that sendAccountConsolidations rejects malicious transactions
|
|
363
|
+
// We use a wallet configured with the WRONG rootAddress to simulate a mismatch
|
|
364
|
+
const walletData = {
|
|
365
|
+
id: '6434384f1deb5200070345111cba7405',
|
|
366
|
+
coin: 'talgo',
|
|
367
|
+
keys: [
|
|
368
|
+
'6434383c40af290007578fdb89c69028',
|
|
369
|
+
'6434383c9e52490007e6f69f5523c82e',
|
|
370
|
+
'6434383e4b5a440007289caeebf76225',
|
|
371
|
+
],
|
|
372
|
+
coinSpecific: {
|
|
373
|
+
rootAddress: testData.consolidation.receiveAddress, // WRONG: not where the tx sends
|
|
374
|
+
addressVersion: 1,
|
|
375
|
+
trustedTokens: [],
|
|
376
|
+
},
|
|
377
|
+
multisigType: 'onchain',
|
|
378
|
+
};
|
|
379
|
+
// The txHex sends to testData.consolidation.rootAddress, but wallet expects receiveAddress
|
|
380
|
+
const consolidationTx = {
|
|
381
|
+
txHex: testData.consolidation.txHex, // Sends to rootAddress (not receiveAddress)
|
|
382
|
+
txHash: testData.consolidation.txId,
|
|
383
|
+
feeInfo: {
|
|
384
|
+
size: 247,
|
|
385
|
+
fee: 1000,
|
|
386
|
+
feeRate: 4,
|
|
387
|
+
feeString: '1000',
|
|
388
|
+
},
|
|
389
|
+
keys: [
|
|
390
|
+
'42MIYL2KBISV6WJRALTTSXHBEGLNF7MMQ74FGSYUCT5YP3V2KENJGRFVVQ',
|
|
391
|
+
'MAGXZTDFW5QEXUKOUDIGHTXOKDW7TNQEDLWPBEZEL3VFU3YAA2PGYRS65M',
|
|
392
|
+
'IBHXE4L4HCGJSXJACQAM6ZU6JHTLDEQNVNDZ25TJVX5W43B3AQRMB4VEDU',
|
|
393
|
+
],
|
|
394
|
+
addressVersion: 1,
|
|
395
|
+
consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
|
|
396
|
+
coin: 'talgo',
|
|
397
|
+
};
|
|
398
|
+
const bgUrl = sdk_core_1.common.Environments['mock'].uri;
|
|
399
|
+
const walletObj = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
|
|
400
|
+
// Mock the consolidateAccount/build API call
|
|
401
|
+
nock(bgUrl)
|
|
402
|
+
.post('/api/v2/talgo/wallet/6434384f1deb5200070345111cba7405/consolidateAccount/build')
|
|
403
|
+
.reply(200, [consolidationTx]);
|
|
404
|
+
// Mock getKeychainsAndValidatePassphrase
|
|
405
|
+
sinon.stub(walletObj, 'getKeychainsAndValidatePassphrase').resolves([]);
|
|
406
|
+
// The verification should catch this and throw an error BEFORE signing/sending
|
|
407
|
+
await assert_1.default.rejects(walletObj.sendAccountConsolidations({ walletPassphrase: 'test' }), (error) => {
|
|
408
|
+
assert_1.default.strictEqual(error.message, 'Consolidation transaction recipient does not match wallet base address');
|
|
409
|
+
return true;
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
it('should verify consolidation flow as called from sendAccountConsolidations', async function () {
|
|
413
|
+
// This test simulates how sendAccountConsolidations calls verifyTransaction
|
|
414
|
+
// It uses the real consolidation data and mimics the wallet structure
|
|
415
|
+
const mockWallet = {
|
|
416
|
+
_wallet: {
|
|
417
|
+
coinSpecific: {
|
|
418
|
+
rootAddress: testData.consolidation.rootAddress,
|
|
419
|
+
addressVersion: 1,
|
|
420
|
+
trustedTokens: [],
|
|
421
|
+
},
|
|
422
|
+
multisigType: 'onchain',
|
|
423
|
+
},
|
|
424
|
+
coinSpecific: function () {
|
|
425
|
+
return this._wallet.coinSpecific;
|
|
426
|
+
},
|
|
427
|
+
};
|
|
428
|
+
// This is the build result from buildAccountConsolidations
|
|
429
|
+
const build = {
|
|
430
|
+
txHex: testData.consolidation.txHex,
|
|
431
|
+
consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
|
|
432
|
+
coin: 'talgo',
|
|
433
|
+
};
|
|
434
|
+
// This is what sendAccountConsolidations does: verify with consolidationToBaseAddress
|
|
435
|
+
const result = await basecoin.verifyTransaction({
|
|
436
|
+
txPrebuild: build,
|
|
437
|
+
txParams: {}, // sendAccountConsolidations passes empty params from the build call
|
|
438
|
+
verification: {
|
|
439
|
+
consolidationToBaseAddress: true,
|
|
440
|
+
},
|
|
441
|
+
wallet: mockWallet,
|
|
442
|
+
walletType: mockWallet._wallet.multisigType,
|
|
443
|
+
});
|
|
444
|
+
assert_1.default.strictEqual(result, true);
|
|
445
|
+
});
|
|
446
|
+
it('should reject malicious consolidation with wrong recipient in sendAccountConsolidations flow', async function () {
|
|
447
|
+
// This test simulates a malicious transaction that tries to send to a different address
|
|
448
|
+
// The verification should catch this and throw an error
|
|
449
|
+
const mockWallet = {
|
|
450
|
+
_wallet: {
|
|
451
|
+
coinSpecific: {
|
|
452
|
+
rootAddress: testData.consolidation.receiveAddress, // WRONG: This is not where the tx is sending
|
|
453
|
+
addressVersion: 1,
|
|
454
|
+
trustedTokens: [],
|
|
455
|
+
},
|
|
456
|
+
multisigType: 'onchain',
|
|
457
|
+
},
|
|
458
|
+
coinSpecific: function () {
|
|
459
|
+
return this._wallet.coinSpecific;
|
|
460
|
+
},
|
|
461
|
+
};
|
|
462
|
+
const build = {
|
|
463
|
+
txHex: testData.consolidation.txHex, // This sends to rootAddress, not receiveAddress
|
|
464
|
+
consolidateId: '690572bd61f0a4695dd8710ae6c185cc',
|
|
465
|
+
coin: 'talgo',
|
|
466
|
+
};
|
|
467
|
+
// This should throw because the transaction recipient doesn't match the wallet's rootAddress
|
|
468
|
+
await assert_1.default.rejects(basecoin.verifyTransaction({
|
|
469
|
+
txPrebuild: build,
|
|
470
|
+
txParams: {},
|
|
471
|
+
verification: {
|
|
472
|
+
consolidationToBaseAddress: true,
|
|
473
|
+
},
|
|
474
|
+
wallet: mockWallet,
|
|
475
|
+
walletType: mockWallet._wallet.multisigType,
|
|
476
|
+
}), {
|
|
477
|
+
message: 'Consolidation transaction recipient does not match wallet base address',
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
it('should verify real consolidation transaction with valid rootAddress', async function () {
|
|
481
|
+
// Using real consolidation transaction data from actual wallet
|
|
482
|
+
const mockWallet = {
|
|
483
|
+
coinSpecific: () => ({
|
|
484
|
+
rootAddress: testData.consolidation.rootAddress,
|
|
485
|
+
}),
|
|
486
|
+
};
|
|
487
|
+
const txParams = {
|
|
488
|
+
recipients: [
|
|
489
|
+
{
|
|
490
|
+
address: testData.consolidation.rootAddress,
|
|
491
|
+
amount: testData.consolidation.amount,
|
|
492
|
+
},
|
|
493
|
+
],
|
|
494
|
+
};
|
|
495
|
+
const txPrebuild = {
|
|
496
|
+
txHex: testData.consolidation.txHex,
|
|
497
|
+
};
|
|
498
|
+
const result = await basecoin.verifyTransaction({
|
|
499
|
+
txParams,
|
|
500
|
+
txPrebuild,
|
|
501
|
+
wallet: mockWallet,
|
|
502
|
+
verification: {
|
|
503
|
+
consolidationToBaseAddress: true,
|
|
504
|
+
},
|
|
505
|
+
});
|
|
506
|
+
assert_1.default.strictEqual(result, true);
|
|
507
|
+
});
|
|
508
|
+
it('should reject consolidation when recipient does not match rootAddress', async function () {
|
|
509
|
+
// Using different rootAddress than what's in the consolidation transaction
|
|
510
|
+
const mockWallet = {
|
|
511
|
+
coinSpecific: () => ({
|
|
512
|
+
rootAddress: testData.consolidation.receiveAddress, // Wrong: using receive address instead of root
|
|
513
|
+
}),
|
|
514
|
+
};
|
|
515
|
+
const txParams = {
|
|
516
|
+
recipients: [
|
|
517
|
+
{
|
|
518
|
+
address: testData.consolidation.rootAddress,
|
|
519
|
+
amount: testData.consolidation.amount,
|
|
520
|
+
},
|
|
521
|
+
],
|
|
522
|
+
};
|
|
523
|
+
const txPrebuild = {
|
|
524
|
+
txHex: testData.consolidation.txHex,
|
|
525
|
+
};
|
|
526
|
+
await assert_1.default.rejects(basecoin.verifyTransaction({
|
|
527
|
+
txParams,
|
|
528
|
+
txPrebuild,
|
|
529
|
+
wallet: mockWallet,
|
|
530
|
+
verification: {
|
|
531
|
+
consolidationToBaseAddress: true,
|
|
532
|
+
},
|
|
533
|
+
}), {
|
|
534
|
+
message: 'Consolidation transaction recipient does not match wallet base address',
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
it('should handle missing rootAddress in wallet coinSpecific', async function () {
|
|
538
|
+
const mockWallet = {
|
|
539
|
+
coinSpecific: () => ({}),
|
|
540
|
+
};
|
|
541
|
+
const txParams = {
|
|
542
|
+
recipients: [
|
|
543
|
+
{
|
|
544
|
+
address: testData.consolidation.rootAddress,
|
|
545
|
+
amount: testData.consolidation.amount,
|
|
546
|
+
},
|
|
547
|
+
],
|
|
548
|
+
};
|
|
549
|
+
const txPrebuild = {
|
|
550
|
+
txHex: testData.consolidation.txHex,
|
|
551
|
+
};
|
|
552
|
+
await assert_1.default.rejects(basecoin.verifyTransaction({
|
|
553
|
+
txParams,
|
|
554
|
+
txPrebuild,
|
|
555
|
+
wallet: mockWallet,
|
|
556
|
+
verification: {
|
|
557
|
+
consolidationToBaseAddress: true,
|
|
558
|
+
},
|
|
559
|
+
}), {
|
|
560
|
+
message: 'Unable to determine base address for consolidation',
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
it('should handle consolidation verification for token transfers (axfer)', async function () {
|
|
564
|
+
// Using asset transfer transaction to root address
|
|
565
|
+
const rootAddress = testData.accounts.account2.address;
|
|
566
|
+
const mockWallet = {
|
|
567
|
+
coinSpecific: () => ({
|
|
568
|
+
rootAddress: rootAddress,
|
|
569
|
+
}),
|
|
570
|
+
};
|
|
571
|
+
const txParams = {
|
|
572
|
+
recipients: [
|
|
573
|
+
{
|
|
574
|
+
address: rootAddress,
|
|
575
|
+
amount: '1000',
|
|
576
|
+
},
|
|
577
|
+
],
|
|
578
|
+
};
|
|
579
|
+
const txPrebuild = {
|
|
580
|
+
txHex: testData.rawTx.assetTransfer.unsigned,
|
|
581
|
+
};
|
|
582
|
+
const result = await basecoin.verifyTransaction({
|
|
583
|
+
txParams,
|
|
584
|
+
txPrebuild,
|
|
585
|
+
wallet: mockWallet,
|
|
586
|
+
verification: {
|
|
587
|
+
consolidationToBaseAddress: true,
|
|
588
|
+
},
|
|
589
|
+
});
|
|
590
|
+
assert_1.default.strictEqual(result, true);
|
|
591
|
+
});
|
|
592
|
+
it('should reject consolidation for token transfer when recipient does not match rootAddress', async function () {
|
|
593
|
+
const rootAddress = testData.accounts.account1.address; // Different from transaction recipient
|
|
594
|
+
const mockWallet = {
|
|
595
|
+
coinSpecific: () => ({
|
|
596
|
+
rootAddress: rootAddress,
|
|
597
|
+
}),
|
|
598
|
+
};
|
|
599
|
+
const txParams = {
|
|
600
|
+
recipients: [
|
|
601
|
+
{
|
|
602
|
+
address: testData.accounts.account2.address,
|
|
603
|
+
amount: '1000',
|
|
604
|
+
},
|
|
605
|
+
],
|
|
606
|
+
};
|
|
607
|
+
const txPrebuild = {
|
|
608
|
+
txHex: testData.rawTx.assetTransfer.unsigned,
|
|
609
|
+
};
|
|
610
|
+
await assert_1.default.rejects(basecoin.verifyTransaction({
|
|
611
|
+
txParams,
|
|
612
|
+
txPrebuild,
|
|
613
|
+
wallet: mockWallet,
|
|
614
|
+
verification: {
|
|
615
|
+
consolidationToBaseAddress: true,
|
|
616
|
+
},
|
|
617
|
+
}), {
|
|
618
|
+
message: 'Consolidation transaction recipient does not match wallet base address',
|
|
619
|
+
});
|
|
620
|
+
});
|
|
621
|
+
it('should pass verification when consolidationToBaseAddress is not set', async function () {
|
|
622
|
+
// Using real consolidation tx but with wrong rootAddress - should still pass because verification is disabled
|
|
623
|
+
const mockWallet = {
|
|
624
|
+
coinSpecific: () => ({
|
|
625
|
+
rootAddress: testData.consolidation.receiveAddress, // Different from transaction recipient
|
|
626
|
+
}),
|
|
627
|
+
};
|
|
628
|
+
const txParams = {
|
|
629
|
+
recipients: [
|
|
630
|
+
{
|
|
631
|
+
address: testData.consolidation.rootAddress,
|
|
632
|
+
amount: testData.consolidation.amount,
|
|
633
|
+
},
|
|
634
|
+
],
|
|
635
|
+
};
|
|
636
|
+
const txPrebuild = {
|
|
637
|
+
txHex: testData.consolidation.txHex,
|
|
638
|
+
};
|
|
639
|
+
// Should not throw error even though recipient doesn't match rootAddress
|
|
640
|
+
// because consolidationToBaseAddress verification is not enabled
|
|
641
|
+
const result = await basecoin.verifyTransaction({
|
|
642
|
+
txParams,
|
|
643
|
+
txPrebuild,
|
|
644
|
+
wallet: mockWallet,
|
|
645
|
+
verification: {
|
|
646
|
+
consolidationToBaseAddress: false,
|
|
647
|
+
},
|
|
648
|
+
});
|
|
649
|
+
assert_1.default.strictEqual(result, true);
|
|
650
|
+
});
|
|
651
|
+
it('should pass verification when verification object is not provided', async function () {
|
|
652
|
+
// Using real consolidation tx but with wrong rootAddress - should still pass because no verification
|
|
653
|
+
const mockWallet = {
|
|
654
|
+
coinSpecific: () => ({
|
|
655
|
+
rootAddress: testData.consolidation.receiveAddress, // Different from transaction recipient
|
|
656
|
+
}),
|
|
657
|
+
};
|
|
658
|
+
const txParams = {
|
|
659
|
+
recipients: [
|
|
660
|
+
{
|
|
661
|
+
address: testData.consolidation.rootAddress,
|
|
662
|
+
amount: testData.consolidation.amount,
|
|
663
|
+
},
|
|
664
|
+
],
|
|
665
|
+
};
|
|
666
|
+
const txPrebuild = {
|
|
667
|
+
txHex: testData.consolidation.txHex,
|
|
668
|
+
};
|
|
669
|
+
// Should not throw error even though recipient doesn't match rootAddress
|
|
670
|
+
// because no verification object is provided
|
|
671
|
+
const result = await basecoin.verifyTransaction({
|
|
672
|
+
txParams,
|
|
673
|
+
txPrebuild,
|
|
674
|
+
wallet: mockWallet,
|
|
675
|
+
});
|
|
676
|
+
assert_1.default.strictEqual(result, true);
|
|
677
|
+
});
|
|
678
|
+
it('should handle missing wallet when consolidation verification is enabled', async function () {
|
|
679
|
+
const txParams = {
|
|
680
|
+
recipients: [
|
|
681
|
+
{
|
|
682
|
+
address: testData.consolidation.rootAddress,
|
|
683
|
+
amount: testData.consolidation.amount,
|
|
684
|
+
},
|
|
685
|
+
],
|
|
686
|
+
};
|
|
687
|
+
const txPrebuild = {
|
|
688
|
+
txHex: testData.consolidation.txHex,
|
|
689
|
+
};
|
|
690
|
+
await assert_1.default.rejects(basecoin.verifyTransaction({
|
|
691
|
+
txParams,
|
|
692
|
+
txPrebuild,
|
|
693
|
+
wallet: undefined,
|
|
694
|
+
verification: {
|
|
695
|
+
consolidationToBaseAddress: true,
|
|
696
|
+
},
|
|
697
|
+
}), {
|
|
698
|
+
message: 'Unable to determine base address for consolidation',
|
|
699
|
+
});
|
|
700
|
+
});
|
|
701
|
+
});
|
|
293
702
|
});
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBa0M7QUFDbEMsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyxnRUFBa0Q7QUFDbEQsb0RBQTRCO0FBRTVCLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFlLENBQUM7SUFFcEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFVLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLO1lBQ3JELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixVQUFVO2dCQUNWLE1BQU0sRUFBRSxFQUFTO2dCQUNqQixRQUFRLEVBQUUsU0FBZ0I7YUFDM0IsQ0FBQyxFQUNGO2dCQUNFLE9BQU8sRUFBRSxrQkFBa0I7YUFDNUIsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSztZQUN2RCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQy9FLENBQUM7WUFFRixNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUNsQixRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3pCLFFBQVE7Z0JBQ1IsTUFBTSxFQUFFLEVBQVM7Z0JBQ2pCLFVBQVUsRUFBRSxTQUFnQjthQUM3QixDQUFDLEVBQ0Y7Z0JBQ0UsT0FBTyxFQUFFLG9CQUFvQjthQUM5QixDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxLQUFLO1lBQzdELE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDL0UsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUV0QixNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLEVBQUU7Z0JBQzVGLE9BQU8sRUFBRSw2QkFBNkI7YUFDdkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7UUFDOUMsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUs7WUFDbkQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPO3dCQUMzQyxNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRO2FBQ3hDLENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUs7WUFDMUMsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPO3dCQUMzQyxNQUFNLEVBQUUsT0FBTyxFQUFFLDJDQUEyQztxQkFDN0Q7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRO2FBQ3hDLENBQUM7WUFFRixNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLEVBQUU7Z0JBQzVGLE9BQU8sRUFBRSwyRUFBMkU7YUFDckYsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSztZQUMzQyxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSx3Q0FBd0M7d0JBQ3JGLE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsRUFBRTtnQkFDNUYsT0FBTyxFQUFFLCtEQUErRDthQUN6RSxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLO1lBQzlDLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxFQUFFLE1BQU07cUJBQ2Y7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87d0JBQzNDLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxFQUFFO2dCQUM1RixPQUFPLEVBQUUsbURBQW1EO2FBQzdELENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUs7WUFDcEUsTUFBTSxRQUFRLEdBQUc7WUFDZiwwQkFBMEI7YUFDM0IsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUNyRCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSztZQUMxRCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87d0JBQzNDLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUTthQUM3QyxDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLO1lBQ2xELE1BQU0sUUFBUSxHQUFHO2dCQUNmLElBQUksRUFBRSxhQUFhO2dCQUNuQixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87d0JBQzNDLE1BQU0sRUFBRSxHQUFHO3FCQUNaO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixnR0FBZ0c7Z0JBQ2hHLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRO2FBQzdDLENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1FBQ2hELEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLO1lBQzVELE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDL0UsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsa0JBQWtCO2FBQzFCLENBQUM7WUFFRixNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLO1lBQy9DLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLG1DQUFtQzthQUM3RSxDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7UUFDMUIsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUs7WUFDaEQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPO3dCQUMzQyxNQUFNLEVBQUUsR0FBRztxQkFDWjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIseURBQXlEO2dCQUN6RCxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsMkVBQTJFO1lBQzNFLDJFQUEyRTtZQUMzRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2Ysa0NBQWtDO2dCQUNsQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLO1lBQ3BELE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsZ0ZBQWdGO1lBQ2hGLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQzdGLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixvQ0FBb0M7Z0JBQ3BDLGdCQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxLQUFLO1lBQzdELDREQUE0RDtZQUM1RCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87d0JBQzNDLE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFsZ28gfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9maXh0dXJlcy9yZXNvdXJjZXMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5kZXNjcmliZSgnQWxnb3JhbmQgVmVyaWZ5IFRyYW5zYWN0aW9uOicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGFsZ287XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RhbGdvJywgVGFsZ28uY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGFsZ28nKSBhcyBUYWxnbztcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcmFtZXRlciBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFBhcmFtcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICAgIHR4UGFyYW1zOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UGFyYW1zJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFByZWJ1aWxkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UHJlYnVpbGQnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6ICcxMDAwMCcgfV0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGF5bWVudCBUcmFuc2FjdGlvbiBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBhbW91bnQgbWlzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcyMDAwMCcsIC8vIERpZmZlcmVudCBhbW91bnQgdGhhbiBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggYWRkcmVzcyBtaXNtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzcywgLy8gRGlmZmVyZW50IGFkZHJlc3MgdGhhbiBpbiB0cmFuc2FjdGlvblxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjaXBpZW50IGFkZHJlc3MnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnQWxnb3JhbmQgdHJhbnNhY3Rpb25zIGNhbiBvbmx5IGhhdmUgb25lIHJlY2lwaWVudCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZWNpcGllbnRzIGluIHR4UGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIC8vIE5vIHJlY2lwaWVudHMgc3BlY2lmaWVkXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Fzc2V0IFRyYW5zZmVyIFRyYW5zYWN0aW9uIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB2YWxpZCBhc3NldCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0b2tlbiBlbmFibGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIC8vIFVzaW5nIGV4aXN0aW5nIGFzc2V0IHRyYW5zZmVyIGZvciB0ZXN0IC0gaW4gcmVhbCBzY2VuYXJpbyB0aGlzIHdvdWxkIGJlIGFuIG9wdC1pbiB0cmFuc2FjdGlvblxuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHguYXNzZXRUcmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdHJ1Y3R1cmUgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtYWxmb3JtZWQgdHJhbnNhY3Rpb24gaGV4IGdyYWNlZnVsbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiAnaW52YWxpZF9oZXhfZGF0YScsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCwgLy8gVGhpcyB0cmFuc2FjdGlvbiBpbmNsdWRlcyBhIG1lbW9cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFZGdlIENhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8gYW1vdW50IHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgLy8gVGhpcyB3b3VsZCBuZWVkIHRvIGJlIGEgdmFsaWQgMC1hbW91bnQgdHJhbnNhY3Rpb24gaGV4XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIE5vdGU6IFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGVzdCBkYXRhIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGFtb3VudFxuICAgICAgLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB3ZSdkIG5lZWQgcHJvcGVyIHRlc3QgZGF0YSBmb3IgMC1hbW91bnQgdHJhbnNhY3Rpb25zXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFeHBlY3RlZCBpZiBhbW91bnRzIGRvbid0IG1hdGNoXG4gICAgICAgIGFzc2VydC5vayhlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdhbW91bnQnKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjbG9zZSByZW1haW5kZXIgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyB0ZXN0IHZhbGlkYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyB3aXRoIGNsb3NlUmVtYWluZGVyVG8gZmllbGQgYXJlIGhhbmRsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIGlmIGFkZHJlc3NlcyBkb24ndCBtYXRjaFxuICAgICAgICBhc3NlcnQub2soZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnYWRkcmVzcycpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ05ldHdvcmsgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9ucyBmb3IgZGlmZmVyZW50IG5ldHdvcmtzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGVzdCB0aGF0IHRyYW5zYWN0aW9ucyB3b3JrIHJlZ2FyZGxlc3Mgb2YgZ2VuZXNpcyBoYXNoL0lEXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
703
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5VHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmVyaWZ5VHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBa0M7QUFDbEMsOENBQTBEO0FBQzFELDRDQUEwQztBQUMxQyxnRUFBa0Q7QUFDbEQsb0RBQTRCO0FBQzVCLDZCQUE4QjtBQUM5Qiw2Q0FBK0I7QUFDL0IsOENBQWlEO0FBRWpELFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFlLENBQUM7SUFFcEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFVLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUM7UUFDUixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsNkNBQTZDLEVBQUUsS0FBSztZQUNyRCxNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQ2xCLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDekIsVUFBVTtnQkFDVixNQUFNLEVBQUUsRUFBUztnQkFDakIsUUFBUSxFQUFFLFNBQWdCO2FBQzNCLENBQUMsRUFDRjtnQkFDRSxPQUFPLEVBQUUsa0JBQWtCO2FBQzVCLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUs7WUFDdkQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQzthQUMvRSxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixRQUFRO2dCQUNSLE1BQU0sRUFBRSxFQUFTO2dCQUNqQixVQUFVLEVBQUUsU0FBZ0I7YUFDN0IsQ0FBQyxFQUNGO2dCQUNFLE9BQU8sRUFBRSxvQkFBb0I7YUFDOUIsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSztZQUM3RCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQy9FLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFFdEIsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxFQUFFO2dCQUM1RixPQUFPLEVBQUUsNkJBQTZCO2FBQ3ZDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLO1lBQ25ELE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLO1lBQzFDLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxFQUFFLE9BQU8sRUFBRSwyQ0FBMkM7cUJBQzdEO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUTthQUN4QyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxFQUFFO2dCQUM1RixPQUFPLEVBQUUsMkVBQTJFO2FBQ3JGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUs7WUFDM0MsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsd0NBQXdDO3dCQUNyRixNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRO2FBQ3hDLENBQUM7WUFFRixNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLEVBQUU7Z0JBQzVGLE9BQU8sRUFBRSwrREFBK0Q7YUFDekUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSztZQUM5QyxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87d0JBQzNDLE1BQU0sRUFBRSxNQUFNO3FCQUNmO29CQUNEO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPO3dCQUMzQyxNQUFNLEVBQUUsTUFBTTtxQkFDZjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsRUFBRTtnQkFDNUYsT0FBTyxFQUFFLG1EQUFtRDthQUM3RCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLO1lBQ3BFLE1BQU0sUUFBUSxHQUFHO1lBQ2YsMEJBQTBCO2FBQzNCLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7UUFDckQsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUs7WUFDMUQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPO3dCQUMzQyxNQUFNLEVBQUUsTUFBTTtxQkFDZjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVE7YUFDN0MsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSztZQUNsRCxNQUFNLFFBQVEsR0FBRztnQkFDZixJQUFJLEVBQUUsYUFBYTtnQkFDbkIsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPO3dCQUMzQyxNQUFNLEVBQUUsR0FBRztxQkFDWjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsZ0dBQWdHO2dCQUNoRyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUTthQUM3QyxDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsS0FBSztZQUM1RCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQy9FLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLGtCQUFrQjthQUMxQixDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSztZQUMvQyxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87d0JBQzNDLE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxtQ0FBbUM7YUFDN0UsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1FBQzFCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLO1lBQ2hELE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxFQUFFLEdBQUc7cUJBQ1o7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLHlEQUF5RDtnQkFDekQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLDJFQUEyRTtZQUMzRSwyRUFBMkU7WUFDM0UsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBUyxFQUFFLENBQUMsQ0FBQztnQkFDN0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLGtDQUFrQztnQkFDbEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSztZQUNwRCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87d0JBQzNDLE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDeEMsQ0FBQztZQUVGLGdGQUFnRjtZQUNoRixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2Ysb0NBQW9DO2dCQUNwQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSztZQUM3RCw0REFBNEQ7WUFDNUQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPO3dCQUMzQyxNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRO2FBQ3hDLENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQVMsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1FBQzFDLEVBQUUsQ0FBQyx5RkFBeUYsRUFBRSxLQUFLO1lBQ2pHLDRGQUE0RjtZQUM1Riw2RkFBNkY7WUFDN0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEVBQUUsRUFBRSxrQ0FBa0M7Z0JBQ3RDLElBQUksRUFBRSxPQUFPO2dCQUNiLElBQUksRUFBRTtvQkFDSixrQ0FBa0M7b0JBQ2xDLGtDQUFrQztvQkFDbEMsa0NBQWtDO2lCQUNuQztnQkFDRCxZQUFZLEVBQUU7b0JBQ1osV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLHNCQUFzQjtvQkFDdkUsY0FBYyxFQUFFLENBQUM7b0JBQ2pCLGFBQWEsRUFBRSxFQUFFO2lCQUNsQjtnQkFDRCxZQUFZLEVBQUUsU0FBa0I7YUFDakMsQ0FBQztZQUVGLE1BQU0sZUFBZSxHQUFHO2dCQUN0QixLQUFLLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCO2dCQUM1RCxNQUFNLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJO2dCQUNuQyxPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLEdBQUc7b0JBQ1QsR0FBRyxFQUFFLElBQUk7b0JBQ1QsT0FBTyxFQUFFLENBQUM7b0JBQ1YsU0FBUyxFQUFFLE1BQU07aUJBQ2xCO2dCQUNELElBQUksRUFBRTtvQkFDSiw0REFBNEQ7b0JBQzVELDREQUE0RDtvQkFDNUQsNERBQTREO2lCQUM3RDtnQkFDRCxjQUFjLEVBQUUsQ0FBQztnQkFDakIsYUFBYSxFQUFFLGtDQUFrQztnQkFDakQsSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDO1lBRUYsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzlDLE1BQU0sU0FBUyxHQUFHLElBQUksaUJBQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRTFELDZDQUE2QztZQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDO2lCQUNSLElBQUksQ0FBQyxnRkFBZ0YsQ0FBQztpQkFDdEYsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFFakMseUNBQXlDO1lBQ3pDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG1DQUFtRCxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXhGLHNFQUFzRTtZQUN0RSwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sU0FBUyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDeEUsMkRBQTJEO2dCQUMzRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUscURBQXFELENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZiwyRUFBMkU7Z0JBQzNFLHVGQUF1RjtnQkFDdkYsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLHdFQUF3RSxFQUFFLENBQUM7b0JBQy9GLGdCQUFNLENBQUMsSUFBSSxDQUFDLHlFQUF5RSxDQUFDLENBQUM7Z0JBQ3pGLENBQUM7Z0JBQ0QsaUZBQWlGO1lBQ25GLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRkFBbUYsRUFBRSxLQUFLO1lBQzNGLG1GQUFtRjtZQUNuRiwrRUFBK0U7WUFDL0UsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEVBQUUsRUFBRSxrQ0FBa0M7Z0JBQ3RDLElBQUksRUFBRSxPQUFPO2dCQUNiLElBQUksRUFBRTtvQkFDSixrQ0FBa0M7b0JBQ2xDLGtDQUFrQztvQkFDbEMsa0NBQWtDO2lCQUNuQztnQkFDRCxZQUFZLEVBQUU7b0JBQ1osV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLGdDQUFnQztvQkFDcEYsY0FBYyxFQUFFLENBQUM7b0JBQ2pCLGFBQWEsRUFBRSxFQUFFO2lCQUNsQjtnQkFDRCxZQUFZLEVBQUUsU0FBa0I7YUFDakMsQ0FBQztZQUVGLDJGQUEyRjtZQUMzRixNQUFNLGVBQWUsR0FBRztnQkFDdEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLDRDQUE0QztnQkFDakYsTUFBTSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSTtnQkFDbkMsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxHQUFHO29CQUNULEdBQUcsRUFBRSxJQUFJO29CQUNULE9BQU8sRUFBRSxDQUFDO29CQUNWLFNBQVMsRUFBRSxNQUFNO2lCQUNsQjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osNERBQTREO29CQUM1RCw0REFBNEQ7b0JBQzVELDREQUE0RDtpQkFDN0Q7Z0JBQ0QsY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLGFBQWEsRUFBRSxrQ0FBa0M7Z0JBQ2pELElBQUksRUFBRSxPQUFPO2FBQ2QsQ0FBQztZQUVGLE1BQU0sS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLGlCQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUUxRCw2Q0FBNkM7WUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQztpQkFDUixJQUFJLENBQUMsZ0ZBQWdGLENBQUM7aUJBQ3RGLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBRWpDLHlDQUF5QztZQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQ0FBMEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUUvRSwrRUFBK0U7WUFDL0UsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBWSxFQUFFLEVBQUU7Z0JBQ3ZHLGdCQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsd0VBQXdFLENBQUMsQ0FBQztnQkFDNUcsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJFQUEyRSxFQUFFLEtBQUs7WUFDbkYsNEVBQTRFO1lBQzVFLHNFQUFzRTtZQUN0RSxNQUFNLFVBQVUsR0FBRztnQkFDakIsT0FBTyxFQUFFO29CQUNQLFlBQVksRUFBRTt3QkFDWixXQUFXLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXO3dCQUMvQyxjQUFjLEVBQUUsQ0FBQzt3QkFDakIsYUFBYSxFQUFFLEVBQUU7cUJBQ2xCO29CQUNELFlBQVksRUFBRSxTQUFTO2lCQUN4QjtnQkFDRCxZQUFZLEVBQUU7b0JBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDbkMsQ0FBQzthQUNGLENBQUM7WUFFRiwyREFBMkQ7WUFDM0QsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSztnQkFDbkMsYUFBYSxFQUFFLGtDQUFrQztnQkFDakQsSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDO1lBRUYsc0ZBQXNGO1lBQ3RGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUM5QyxVQUFVLEVBQUUsS0FBSztnQkFDakIsUUFBUSxFQUFFLEVBQUUsRUFBRSxvRUFBb0U7Z0JBQ2xGLFlBQVksRUFBRTtvQkFDWiwwQkFBMEIsRUFBRSxJQUFJO2lCQUNqQztnQkFDRCxNQUFNLEVBQUUsVUFBaUI7Z0JBQ3pCLFVBQVUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQW1CO2FBQ25ELENBQUMsQ0FBQztZQUVILGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4RkFBOEYsRUFBRSxLQUFLO1lBQ3RHLHdGQUF3RjtZQUN4Rix3REFBd0Q7WUFDeEQsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLE9BQU8sRUFBRTtvQkFDUCxZQUFZLEVBQUU7d0JBQ1osV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLDZDQUE2Qzt3QkFDakcsY0FBYyxFQUFFLENBQUM7d0JBQ2pCLGFBQWEsRUFBRSxFQUFFO3FCQUNsQjtvQkFDRCxZQUFZLEVBQUUsU0FBUztpQkFDeEI7Z0JBQ0QsWUFBWSxFQUFFO29CQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Z0JBQ25DLENBQUM7YUFDRixDQUFDO1lBRUYsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGdEQUFnRDtnQkFDckYsYUFBYSxFQUFFLGtDQUFrQztnQkFDakQsSUFBSSxFQUFFLE9BQU87YUFDZCxDQUFDO1lBRUYsNkZBQTZGO1lBQzdGLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQ2xCLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDekIsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFlBQVksRUFBRTtvQkFDWiwwQkFBMEIsRUFBRSxJQUFJO2lCQUNqQztnQkFDRCxNQUFNLEVBQUUsVUFBaUI7Z0JBQ3pCLFVBQVUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQW1CO2FBQ25ELENBQUMsRUFDRjtnQkFDRSxPQUFPLEVBQUUsd0VBQXdFO2FBQ2xGLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEtBQUs7WUFDN0UsK0RBQStEO1lBQy9ELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDbkIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVztpQkFDaEQsQ0FBQzthQUNILENBQUM7WUFFRixNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVzt3QkFDM0MsTUFBTSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTTtxQkFDdEM7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUs7YUFDcEMsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUM5QyxRQUFRO2dCQUNSLFVBQVU7Z0JBQ1YsTUFBTSxFQUFFLFVBQWlCO2dCQUN6QixZQUFZLEVBQUU7b0JBQ1osMEJBQTBCLEVBQUUsSUFBSTtpQkFDakM7YUFDRixDQUFDLENBQUM7WUFDSCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUUsS0FBSztZQUMvRSwyRUFBMkU7WUFDM0UsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNuQixXQUFXLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsK0NBQStDO2lCQUNwRyxDQUFDO2FBQ0gsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXO3dCQUMzQyxNQUFNLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNO3FCQUN0QztpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSzthQUNwQyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixRQUFRO2dCQUNSLFVBQVU7Z0JBQ1YsTUFBTSxFQUFFLFVBQWlCO2dCQUN6QixZQUFZLEVBQUU7b0JBQ1osMEJBQTBCLEVBQUUsSUFBSTtpQkFDakM7YUFDRixDQUFDLEVBQ0Y7Z0JBQ0UsT0FBTyxFQUFFLHdFQUF3RTthQUNsRixDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLO1lBQ2xFLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDekIsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXO3dCQUMzQyxNQUFNLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNO3FCQUN0QztpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSzthQUNwQyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixRQUFRO2dCQUNSLFVBQVU7Z0JBQ1YsTUFBTSxFQUFFLFVBQWlCO2dCQUN6QixZQUFZLEVBQUU7b0JBQ1osMEJBQTBCLEVBQUUsSUFBSTtpQkFDakM7YUFDRixDQUFDLEVBQ0Y7Z0JBQ0UsT0FBTyxFQUFFLG9EQUFvRDthQUM5RCxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzRUFBc0UsRUFBRSxLQUFLO1lBQzlFLG1EQUFtRDtZQUNuRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDdkQsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNuQixXQUFXLEVBQUUsV0FBVztpQkFDekIsQ0FBQzthQUNILENBQUM7WUFFRixNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFdBQVc7d0JBQ3BCLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUTthQUM3QyxDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQzlDLFFBQVE7Z0JBQ1IsVUFBVTtnQkFDVixNQUFNLEVBQUUsVUFBaUI7Z0JBQ3pCLFlBQVksRUFBRTtvQkFDWiwwQkFBMEIsRUFBRSxJQUFJO2lCQUNqQzthQUNGLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwRkFBMEYsRUFBRSxLQUFLO1lBQ2xHLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLHVDQUF1QztZQUMvRixNQUFNLFVBQVUsR0FBRztnQkFDakIsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ25CLFdBQVcsRUFBRSxXQUFXO2lCQUN6QixDQUFDO2FBQ0gsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzt3QkFDM0MsTUFBTSxFQUFFLE1BQU07cUJBQ2Y7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRO2FBQzdDLENBQUM7WUFFRixNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUNsQixRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3pCLFFBQVE7Z0JBQ1IsVUFBVTtnQkFDVixNQUFNLEVBQUUsVUFBaUI7Z0JBQ3pCLFlBQVksRUFBRTtvQkFDWiwwQkFBMEIsRUFBRSxJQUFJO2lCQUNqQzthQUNGLENBQUMsRUFDRjtnQkFDRSxPQUFPLEVBQUUsd0VBQXdFO2FBQ2xGLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEtBQUs7WUFDN0UsOEdBQThHO1lBQzlHLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDbkIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLHVDQUF1QztpQkFDNUYsQ0FBQzthQUNILENBQUM7WUFFRixNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1Y7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsV0FBVzt3QkFDM0MsTUFBTSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTTtxQkFDdEM7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUs7YUFDcEMsQ0FBQztZQUVGLHlFQUF5RTtZQUN6RSxpRUFBaUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQzlDLFFBQVE7Z0JBQ1IsVUFBVTtnQkFDVixNQUFNLEVBQUUsVUFBaUI7Z0JBQ3pCLFlBQVksRUFBRTtvQkFDWiwwQkFBMEIsRUFBRSxLQUFLO2lCQUNsQzthQUNGLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRUFBbUUsRUFBRSxLQUFLO1lBQzNFLHFHQUFxRztZQUNyRyxNQUFNLFVBQVUsR0FBRztnQkFDakIsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ25CLFdBQVcsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSx1Q0FBdUM7aUJBQzVGLENBQUM7YUFDSCxDQUFDO1lBRUYsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFO29CQUNWO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVc7d0JBQzNDLE1BQU0sRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU07cUJBQ3RDO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLO2FBQ3BDLENBQUM7WUFFRix5RUFBeUU7WUFDekUsNkNBQTZDO1lBQzdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUM5QyxRQUFRO2dCQUNSLFVBQVU7Z0JBQ1YsTUFBTSxFQUFFLFVBQWlCO2FBQzFCLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5RUFBeUUsRUFBRSxLQUFLO1lBQ2pGLE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVjt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXO3dCQUMzQyxNQUFNLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNO3FCQUN0QztpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRztnQkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSzthQUNwQyxDQUFDO1lBRUYsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixRQUFRO2dCQUNSLFVBQVU7Z0JBQ1YsTUFBTSxFQUFFLFNBQWdCO2dCQUN4QixZQUFZLEVBQUU7b0JBQ1osMEJBQTBCLEVBQUUsSUFBSTtpQkFDakM7YUFDRixDQUFDLEVBQ0Y7Z0JBQ0UsT0FBTyxFQUFFLG9EQUFvRDthQUM5RCxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWxnbyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IGNvbW1vbiwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ0FsZ29yYW5kIFZlcmlmeSBUcmFuc2FjdGlvbjonLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW46IFRhbGdvO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0YWxnbycsIFRhbGdvLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RhbGdvJykgYXMgVGFsZ287XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BhcmFtZXRlciBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFBhcmFtcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICAgIHR4UGFyYW1zOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UGFyYW1zJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0eFByZWJ1aWxkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdtaXNzaW5nIHR4UHJlYnVpbGQnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6ICcxMDAwMCcgfV0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGF5bWVudCBUcmFuc2FjdGlvbiBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdmFsaWQgcGF5bWVudCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBhbW91bnQgbWlzbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcyMDAwMCcsIC8vIERpZmZlcmVudCBhbW91bnQgdGhhbiBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggYWRkcmVzcyBtaXNtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzcywgLy8gRGlmZmVyZW50IGFkZHJlc3MgdGhhbiBpbiB0cmFuc2FjdGlvblxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjaXBpZW50IGFkZHJlc3MnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnQWxnb3JhbmQgdHJhbnNhY3Rpb25zIGNhbiBvbmx5IGhhdmUgb25lIHJlY2lwaWVudCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZWNpcGllbnRzIGluIHR4UGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIC8vIE5vIHJlY2lwaWVudHMgc3BlY2lmaWVkXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0OiB7fSBhcyBhbnkgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Fzc2V0IFRyYW5zZmVyIFRyYW5zYWN0aW9uIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB2YWxpZCBhc3NldCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0b2tlbiBlbmFibGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIC8vIFVzaW5nIGV4aXN0aW5nIGFzc2V0IHRyYW5zZmVyIGZvciB0ZXN0IC0gaW4gcmVhbCBzY2VuYXJpbyB0aGlzIHdvdWxkIGJlIGFuIG9wdC1pbiB0cmFuc2FjdGlvblxuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHguYXNzZXRUcmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdHJ1Y3R1cmUgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtYWxmb3JtZWQgdHJhbnNhY3Rpb24gaGV4IGdyYWNlZnVsbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAnMTAwMDAnIH1dLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiAnaW52YWxpZF9oZXhfZGF0YScsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCwgLy8gVGhpcyB0cmFuc2FjdGlvbiBpbmNsdWRlcyBhIG1lbW9cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFZGdlIENhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8gYW1vdW50IHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgLy8gVGhpcyB3b3VsZCBuZWVkIHRvIGJlIGEgdmFsaWQgMC1hbW91bnQgdHJhbnNhY3Rpb24gaGV4XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5yYXdUeC50cmFuc2Zlci51bnNpZ25lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIE5vdGU6IFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGVzdCBkYXRhIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGFtb3VudFxuICAgICAgLy8gSW4gYSByZWFsIHNjZW5hcmlvLCB3ZSdkIG5lZWQgcHJvcGVyIHRlc3QgZGF0YSBmb3IgMC1hbW91bnQgdHJhbnNhY3Rpb25zXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFeHBlY3RlZCBpZiBhbW91bnRzIGRvbid0IG1hdGNoXG4gICAgICAgIGFzc2VydC5vayhlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdhbW91bnQnKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjbG9zZSByZW1haW5kZXIgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LnRyYW5zZmVyLnVuc2lnbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyB0ZXN0IHZhbGlkYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyB3aXRoIGNsb3NlUmVtYWluZGVyVG8gZmllbGQgYXJlIGhhbmRsZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldDoge30gYXMgYW55IH0pO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIGlmIGFkZHJlc3NlcyBkb24ndCBtYXRjaFxuICAgICAgICBhc3NlcnQub2soZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnYWRkcmVzcycpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ05ldHdvcmsgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRyYW5zYWN0aW9ucyBmb3IgZGlmZmVyZW50IG5ldHdvcmtzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGVzdCB0aGF0IHRyYW5zYWN0aW9ucyB3b3JrIHJlZ2FyZGxlc3Mgb2YgZ2VuZXNpcyBoYXNoL0lEXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFjY291bnRzLmFjY291bnQyLmFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEucmF3VHgudHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQ6IHt9IGFzIGFueSB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc29saWRhdGlvbiBWZXJpZmljYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgY29uc29saWRhdGlvbiB0aHJvdWdoIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgd2l0aCBub2NrIC0gcG9zaXRpdmUgY2FzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgYWxsb3dzIHZhbGlkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgICAvLyBJdCBjYWxscyB2ZXJpZnlUcmFuc2FjdGlvbiwgd2hpY2ggc2hvdWxkIHBhc3Mgd2hlbiB0aGUgdHggc2VuZHMgdG8gdGhlIGNvcnJlY3Qgcm9vdEFkZHJlc3NcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNjQzNDM4NGYxZGViNTIwMDA3MDM0NTExMWNiYTc0MDUnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzY0MzQzODNjNDBhZjI5MDAwNzU3OGZkYjg5YzY5MDI4JyxcbiAgICAgICAgICAnNjQzNDM4M2M5ZTUyNDkwMDA3ZTZmNjlmNTUyM2M4MmUnLFxuICAgICAgICAgICc2NDM0MzgzZTRiNWE0NDAwMDcyODljYWVlYmY3NjIyNScsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLCAvLyBDb3JyZWN0IHJvb3RBZGRyZXNzXG4gICAgICAgICAgYWRkcmVzc1ZlcnNpb246IDEsXG4gICAgICAgICAgdHJ1c3RlZFRva2VuczogW10sXG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nIGFzIGNvbnN0LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29uc29saWRhdGlvblR4ID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eEhleCwgLy8gU2VuZHMgdG8gcm9vdEFkZHJlc3NcbiAgICAgICAgdHhIYXNoOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnR4SWQsXG4gICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICBzaXplOiAyNDcsXG4gICAgICAgICAgZmVlOiAxMDAwLFxuICAgICAgICAgIGZlZVJhdGU6IDQsXG4gICAgICAgICAgZmVlU3RyaW5nOiAnMTAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNDJNSVlMMktCSVNWNldKUkFMVFRTWEhCRUdMTkY3TU1RNzRGR1NZVUNUNVlQM1YyS0VOSkdSRlZWUScsXG4gICAgICAgICAgJ01BR1haVERGVzVRRVhVS09VRElHSFRYT0tEVzdUTlFFRExXUEJFWkVMM1ZGVTNZQUEyUEdZUlM2NU0nLFxuICAgICAgICAgICdJQkhYRTRMNEhDR0pTWEpBQ1FBTTZaVTZKSFRMREVRTlZORFoyNVRKVlg1VzQzQjNBUVJNQjRWRURVJyxcbiAgICAgICAgXSxcbiAgICAgICAgYWRkcmVzc1ZlcnNpb246IDEsXG4gICAgICAgIGNvbnNvbGlkYXRlSWQ6ICc2OTA1NzJiZDYxZjBhNDY5NWRkODcxMGFlNmMxODVjYycsXG4gICAgICAgIGNvaW46ICd0YWxnbycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbJ21vY2snXS51cmk7XG4gICAgICBjb25zdCB3YWxsZXRPYmogPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG5cbiAgICAgIC8vIE1vY2sgdGhlIGNvbnNvbGlkYXRlQWNjb3VudC9idWlsZCBBUEkgY2FsbFxuICAgICAgbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoJy9hcGkvdjIvdGFsZ28vd2FsbGV0LzY0MzQzODRmMWRlYjUyMDAwNzAzNDUxMTFjYmE3NDA1L2NvbnNvbGlkYXRlQWNjb3VudC9idWlsZCcpXG4gICAgICAgIC5yZXBseSgyMDAsIFtjb25zb2xpZGF0aW9uVHhdKTtcblxuICAgICAgLy8gTW9jayBnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2VcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0T2JqLCAnZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlJyBhcyBrZXlvZiBXYWxsZXQpLnJlc29sdmVzKFtdKTtcblxuICAgICAgLy8gVGhlIGtleSB0ZXN0OiBzaG91bGQgTk9UIHRocm93IHRoZSBjb25zb2xpZGF0aW9uIHZlcmlmaWNhdGlvbiBlcnJvclxuICAgICAgLy8gYmVjYXVzZSB0aGUgdHJhbnNhY3Rpb24gc2VuZHMgdG8gdGhlIGNvcnJlY3Qgcm9vdEFkZHJlc3NcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhbGxldE9iai5zZW5kQWNjb3VudENvbnNvbGlkYXRpb25zKHsgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QnIH0pO1xuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3aXRob3V0IHRocm93aW5nLCB0aGUgdmVyaWZpY2F0aW9uIHBhc3NlZFxuICAgICAgICBhc3NlcnQub2sodHJ1ZSwgJ0NvbnNvbGlkYXRpb24gdmVyaWZpY2F0aW9uIHBhc3NlZCAtIG5vIGVycm9yIHRocm93bicpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgYW4gZXJyb3IgaXMgdGhyb3duLCBpdCBzaG91bGQgTk9UIGJlIHRoZSBjb25zb2xpZGF0aW9uIG1pc21hdGNoIGVycm9yXG4gICAgICAgIC8vIChvdGhlciBlcnJvcnMgbGlrZSBzaWduaW5nIGVycm9ycyBhcmUgb2theSBzaW5jZSB3ZSdyZSBub3QgZnVsbHkgbW9ja2luZyBldmVyeXRoaW5nKVxuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSA9PT0gJ0NvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MnKSB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBub3QgdGhyb3cgY29uc29saWRhdGlvbiB2ZXJpZmljYXRpb24gZXJyb3IgZm9yIHZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXIgZXJyb3JzIGFyZSBhY2NlcHRhYmxlIGluIHRoaXMgdGVzdCAoZS5nLiwgaW5jb21wbGV0ZSBtb2NraW5nIG9mIHNpZ25pbmcpXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtYWxpY2lvdXMgY29uc29saWRhdGlvbiB0aHJvdWdoIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgd2l0aCBub2NrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyByZWplY3RzIG1hbGljaW91cyB0cmFuc2FjdGlvbnNcbiAgICAgIC8vIFdlIHVzZSBhIHdhbGxldCBjb25maWd1cmVkIHdpdGggdGhlIFdST05HIHJvb3RBZGRyZXNzIHRvIHNpbXVsYXRlIGEgbWlzbWF0Y2hcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNjQzNDM4NGYxZGViNTIwMDA3MDM0NTExMWNiYTc0MDUnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzY0MzQzODNjNDBhZjI5MDAwNzU3OGZkYjg5YzY5MDI4JyxcbiAgICAgICAgICAnNjQzNDM4M2M5ZTUyNDkwMDA3ZTZmNjlmNTUyM2M4MmUnLFxuICAgICAgICAgICc2NDM0MzgzZTRiNWE0NDAwMDcyODljYWVlYmY3NjIyNScsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJlY2VpdmVBZGRyZXNzLCAvLyBXUk9ORzogbm90IHdoZXJlIHRoZSB0eCBzZW5kc1xuICAgICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICAgIHRydXN0ZWRUb2tlbnM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyBhcyBjb25zdCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSB0eEhleCBzZW5kcyB0byB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLCBidXQgd2FsbGV0IGV4cGVjdHMgcmVjZWl2ZUFkZHJlc3NcbiAgICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UeCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsIC8vIFNlbmRzIHRvIHJvb3RBZGRyZXNzIChub3QgcmVjZWl2ZUFkZHJlc3MpXG4gICAgICAgIHR4SGFzaDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eElkLFxuICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgc2l6ZTogMjQ3LFxuICAgICAgICAgIGZlZTogMTAwMCxcbiAgICAgICAgICBmZWVSYXRlOiA0LFxuICAgICAgICAgIGZlZVN0cmluZzogJzEwMDAnLFxuICAgICAgICB9LFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzQyTUlZTDJLQklTVjZXSlJBTFRUU1hIQkVHTE5GN01NUTc0RkdTWVVDVDVZUDNWMktFTkpHUkZWVlEnLFxuICAgICAgICAgICdNQUdYWlRERlc1UUVYVUtPVURJR0hUWE9LRFc3VE5RRURMV1BCRVpFTDNWRlUzWUFBMlBHWVJTNjVNJyxcbiAgICAgICAgICAnSUJIWEU0TDRIQ0dKU1hKQUNRQU02WlU2SkhUTERFUU5WTkRaMjVUSlZYNVc0M0IzQVFSTUI0VkVEVScsXG4gICAgICAgIF0sXG4gICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjkwNTcyYmQ2MWYwYTQ2OTVkZDg3MTBhZTZjMTg1Y2MnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICAgICAgY29uc3Qgd2FsbGV0T2JqID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpO1xuXG4gICAgICAvLyBNb2NrIHRoZSBjb25zb2xpZGF0ZUFjY291bnQvYnVpbGQgQVBJIGNhbGxcbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KCcvYXBpL3YyL3RhbGdvL3dhbGxldC82NDM0Mzg0ZjFkZWI1MjAwMDcwMzQ1MTExY2JhNzQwNS9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKVxuICAgICAgICAucmVwbHkoMjAwLCBbY29uc29saWRhdGlvblR4XSk7XG5cbiAgICAgIC8vIE1vY2sgZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlXG4gICAgICBzaW5vbi5zdHViKHdhbGxldE9iaiwgJ2dldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZScgYXMgYW55KS5yZXNvbHZlcyhbXSk7XG5cbiAgICAgIC8vIFRoZSB2ZXJpZmljYXRpb24gc2hvdWxkIGNhdGNoIHRoaXMgYW5kIHRocm93IGFuIGVycm9yIEJFRk9SRSBzaWduaW5nL3NlbmRpbmdcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKHdhbGxldE9iai5zZW5kQWNjb3VudENvbnNvbGlkYXRpb25zKHsgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QnIH0pLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlcnJvci5tZXNzYWdlLCAnQ29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggd2FsbGV0IGJhc2UgYWRkcmVzcycpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgY29uc29saWRhdGlvbiBmbG93IGFzIGNhbGxlZCBmcm9tIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGlzIHRlc3Qgc2ltdWxhdGVzIGhvdyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb25zIGNhbGxzIHZlcmlmeVRyYW5zYWN0aW9uXG4gICAgICAvLyBJdCB1c2VzIHRoZSByZWFsIGNvbnNvbGlkYXRpb24gZGF0YSBhbmQgbWltaWNzIHRoZSB3YWxsZXQgc3RydWN0dXJlXG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge1xuICAgICAgICBfd2FsbGV0OiB7XG4gICAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgICByb290QWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICAgICAgdHJ1c3RlZFRva2VuczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29pblNwZWNpZmljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBUaGlzIGlzIHRoZSBidWlsZCByZXN1bHQgZnJvbSBidWlsZEFjY291bnRDb25zb2xpZGF0aW9uc1xuICAgICAgY29uc3QgYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnR4SGV4LFxuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjkwNTcyYmQ2MWYwYTQ2OTVkZDg3MTBhZTZjMTg1Y2MnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyBpcyB3aGF0IHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMgZG9lczogdmVyaWZ5IHdpdGggY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3NcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDogYnVpbGQsXG4gICAgICAgIHR4UGFyYW1zOiB7fSwgLy8gc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyBwYXNzZXMgZW1wdHkgcGFyYW1zIGZyb20gdGhlIGJ1aWxkIGNhbGxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldDogbW9ja1dhbGxldCBhcyBhbnksXG4gICAgICAgIHdhbGxldFR5cGU6IG1vY2tXYWxsZXQuX3dhbGxldC5tdWx0aXNpZ1R5cGUgYXMgYW55LFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgbWFsaWNpb3VzIGNvbnNvbGlkYXRpb24gd2l0aCB3cm9uZyByZWNpcGllbnQgaW4gc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyBmbG93JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyB0ZXN0IHNpbXVsYXRlcyBhIG1hbGljaW91cyB0cmFuc2FjdGlvbiB0aGF0IHRyaWVzIHRvIHNlbmQgdG8gYSBkaWZmZXJlbnQgYWRkcmVzc1xuICAgICAgLy8gVGhlIHZlcmlmaWNhdGlvbiBzaG91bGQgY2F0Y2ggdGhpcyBhbmQgdGhyb3cgYW4gZXJyb3JcbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7XG4gICAgICAgIF93YWxsZXQ6IHtcbiAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJlY2VpdmVBZGRyZXNzLCAvLyBXUk9ORzogVGhpcyBpcyBub3Qgd2hlcmUgdGhlIHR4IGlzIHNlbmRpbmdcbiAgICAgICAgICAgIGFkZHJlc3NWZXJzaW9uOiAxLFxuICAgICAgICAgICAgdHJ1c3RlZFRva2VuczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29pblNwZWNpZmljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsIC8vIFRoaXMgc2VuZHMgdG8gcm9vdEFkZHJlc3MsIG5vdCByZWNlaXZlQWRkcmVzc1xuICAgICAgICBjb25zb2xpZGF0ZUlkOiAnNjkwNTcyYmQ2MWYwYTQ2OTVkZDg3MTBhZTZjMTg1Y2MnLFxuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyBzaG91bGQgdGhyb3cgYmVjYXVzZSB0aGUgdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHdhbGxldCdzIHJvb3RBZGRyZXNzXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IGJ1aWxkLFxuICAgICAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiBtb2NrV2FsbGV0Ll93YWxsZXQubXVsdGlzaWdUeXBlIGFzIGFueSxcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnQ29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggd2FsbGV0IGJhc2UgYWRkcmVzcycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSByZWFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gd2l0aCB2YWxpZCByb290QWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVzaW5nIHJlYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBkYXRhIGZyb20gYWN0dWFsIHdhbGxldFxuICAgICAgY29uc3QgbW9ja1dhbGxldCA9IHtcbiAgICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLFxuICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuY29uc29saWRhdGlvbi5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eEhleCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHdhbGxldDogbW9ja1dhbGxldCBhcyBhbnksXG4gICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGNvbnNvbGlkYXRpb24gd2hlbiByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggcm9vdEFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVc2luZyBkaWZmZXJlbnQgcm9vdEFkZHJlc3MgdGhhbiB3aGF0J3MgaW4gdGhlIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7XG4gICAgICAgIGNvaW5TcGVjaWZpYzogKCkgPT4gKHtcbiAgICAgICAgICByb290QWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yZWNlaXZlQWRkcmVzcywgLy8gV3Jvbmc6IHVzaW5nIHJlY2VpdmUgYWRkcmVzcyBpbnN0ZWFkIG9mIHJvb3RcbiAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucm9vdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWlzc2luZyByb290QWRkcmVzcyBpbiB3YWxsZXQgY29pblNwZWNpZmljJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1dhbGxldCA9IHtcbiAgICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe30pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJvb3RBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLmFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnR4SGV4LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDogbW9ja1dhbGxldCBhcyBhbnksXG4gICAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gZGV0ZXJtaW5lIGJhc2UgYWRkcmVzcyBmb3IgY29uc29saWRhdGlvbicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjb25zb2xpZGF0aW9uIHZlcmlmaWNhdGlvbiBmb3IgdG9rZW4gdHJhbnNmZXJzIChheGZlciknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVc2luZyBhc3NldCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byByb290IGFkZHJlc3NcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcbiAgICAgIGNvbnN0IG1vY2tXYWxsZXQgPSB7XG4gICAgICAgIGNvaW5TcGVjaWZpYzogKCkgPT4gKHtcbiAgICAgICAgICByb290QWRkcmVzczogcm9vdEFkZHJlc3MsXG4gICAgICAgIH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB3YWxsZXQ6IG1vY2tXYWxsZXQgYXMgYW55LFxuICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBjb25zb2xpZGF0aW9uIGZvciB0b2tlbiB0cmFuc2ZlciB3aGVuIHJlY2lwaWVudCBkb2VzIG5vdCBtYXRjaCByb290QWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzczsgLy8gRGlmZmVyZW50IGZyb20gdHJhbnNhY3Rpb24gcmVjaXBpZW50XG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge1xuICAgICAgICBjb2luU3BlY2lmaWM6ICgpID0+ICh7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6IHJvb3RBZGRyZXNzLFxuICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLnJhd1R4LmFzc2V0VHJhbnNmZXIudW5zaWduZWQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIHZlcmlmaWNhdGlvbiB3aGVuIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzIGlzIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVc2luZyByZWFsIGNvbnNvbGlkYXRpb24gdHggYnV0IHdpdGggd3Jvbmcgcm9vdEFkZHJlc3MgLSBzaG91bGQgc3RpbGwgcGFzcyBiZWNhdXNlIHZlcmlmaWNhdGlvbiBpcyBkaXNhYmxlZFxuICAgICAgY29uc3QgbW9ja1dhbGxldCA9IHtcbiAgICAgICAgY29pblNwZWNpZmljOiAoKSA9PiAoe1xuICAgICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5jb25zb2xpZGF0aW9uLnJlY2VpdmVBZGRyZXNzLCAvLyBEaWZmZXJlbnQgZnJvbSB0cmFuc2FjdGlvbiByZWNpcGllbnRcbiAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucm9vdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsXG4gICAgICB9O1xuXG4gICAgICAvLyBTaG91bGQgbm90IHRocm93IGVycm9yIGV2ZW4gdGhvdWdoIHJlY2lwaWVudCBkb2Vzbid0IG1hdGNoIHJvb3RBZGRyZXNzXG4gICAgICAvLyBiZWNhdXNlIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBub3QgZW5hYmxlZFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyB2ZXJpZmljYXRpb24gd2hlbiB2ZXJpZmljYXRpb24gb2JqZWN0IGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVzaW5nIHJlYWwgY29uc29saWRhdGlvbiB0eCBidXQgd2l0aCB3cm9uZyByb290QWRkcmVzcyAtIHNob3VsZCBzdGlsbCBwYXNzIGJlY2F1c2Ugbm8gdmVyaWZpY2F0aW9uXG4gICAgICBjb25zdCBtb2NrV2FsbGV0ID0ge1xuICAgICAgICBjb2luU3BlY2lmaWM6ICgpID0+ICh7XG4gICAgICAgICAgcm9vdEFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucmVjZWl2ZUFkZHJlc3MsIC8vIERpZmZlcmVudCBmcm9tIHRyYW5zYWN0aW9uIHJlY2lwaWVudFxuICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuY29uc29saWRhdGlvbi5yb290QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuY29uc29saWRhdGlvbi5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICB0eEhleDogdGVzdERhdGEuY29uc29saWRhdGlvbi50eEhleCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNob3VsZCBub3QgdGhyb3cgZXJyb3IgZXZlbiB0aG91Z2ggcmVjaXBpZW50IGRvZXNuJ3QgbWF0Y2ggcm9vdEFkZHJlc3NcbiAgICAgIC8vIGJlY2F1c2Ugbm8gdmVyaWZpY2F0aW9uIG9iamVjdCBpcyBwcm92aWRlZFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIGFueSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaXNzaW5nIHdhbGxldCB3aGVuIGNvbnNvbGlkYXRpb24gdmVyaWZpY2F0aW9uIGlzIGVuYWJsZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24ucm9vdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24uYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgdHhIZXg6IHRlc3REYXRhLmNvbnNvbGlkYXRpb24udHhIZXgsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiB1bmRlZmluZWQgYXMgYW55LFxuICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3M6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIGRldGVybWluZSBiYXNlIGFkZHJlc3MgZm9yIGNvbnNvbGlkYXRpb24nLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|