@bitgo/sdk-coin-iota 1.8.2 → 1.9.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.
@@ -45,6 +45,8 @@ const statics_1 = require("@bitgo/statics");
45
45
  const testData = __importStar(require("../resources/iota"));
46
46
  const sdk_core_1 = require("@bitgo/sdk-core");
47
47
  const testHelpers_1 = require("./helpers/testHelpers");
48
+ const sinon_1 = __importDefault(require("sinon"));
49
+ const iota_1 = require("../resources/iota");
48
50
  describe('IOTA:', function () {
49
51
  let bitgo;
50
52
  let basecoin;
@@ -497,5 +499,603 @@ describe('IOTA:', function () {
497
499
  });
498
500
  });
499
501
  });
502
+ describe('Recover Transactions:', () => {
503
+ const sandBox = sinon_1.default.createSandbox();
504
+ const senderAddress0 = '0xfd36d2ad48edf5671abf04f5c0eef3464bf92cf45ae655aff471cfaedb61fa99';
505
+ const recoveryDestination = '0xda97e166d40fa6a0c949b6aeb862e391c29139b563ae0430b2419c589a02a6e0';
506
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
507
+ beforeEach(() => {
508
+ sandBox.stub(src_1.Iota.prototype, 'getBalance').resolves(1900000000n);
509
+ sandBox.stub(src_1.Iota.prototype, 'fetchOwnedObjects').resolves([
510
+ {
511
+ objectId: '0xc05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003',
512
+ version: '195',
513
+ digest: '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb',
514
+ balance: '1900000000',
515
+ },
516
+ ]);
517
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
518
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(1997880);
519
+ });
520
+ afterEach(() => {
521
+ sandBox.restore();
522
+ });
523
+ it('should recover a txn for non-bitgo recovery', async function () {
524
+ const res = await basecoin.recover({
525
+ userKey: iota_1.keys.userKey,
526
+ backupKey: iota_1.keys.backupKey,
527
+ bitgoKey: iota_1.keys.bitgoKey,
528
+ recoveryDestination,
529
+ walletPassphrase,
530
+ });
531
+ res.should.not.be.empty();
532
+ res.should.hasOwnProperty('transactions');
533
+ const tx = res.transactions[0];
534
+ tx.scanIndex.should.equal(0);
535
+ tx.recoveryAmount.should.equal('1897802332');
536
+ tx.serializedTx.should.equal('AAACAAhcKh5xAAAAAAAg2pfhZtQPpqDJSbauuGLjkcKRObVjrgQwskGcWJoCpuACAgABAQAAAQEDAAAAAAEBAP020q1I7fVnGr8E9cDu80ZL+Sz0WuZVr/Rxz67bYfqZAcBcdl4m5q6Ex4+iRfOKI/sgQGpc8/YbV70yOg352YADwwAAAAAAAAAgW8mIkF0QCGLXhzFxKv8dQiEFkxssx3itzNRMIwhvdSb9NtKtSO31Zxq/BPXA7vNGS/ks9FrmVa/0cc+u22H6megDAAAAAAAApIghAAAAAAAA');
537
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 1);
538
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
539
+ });
540
+ it('should recover a txn for unsigned sweep recovery', async function () {
541
+ const res = await basecoin.recover({
542
+ bitgoKey: iota_1.keys.bitgoKey,
543
+ recoveryDestination,
544
+ });
545
+ res.should.not.be.empty();
546
+ res.should.hasOwnProperty('txRequests');
547
+ const unsignedTx = res.txRequests[0].transactions[0].unsignedTx;
548
+ unsignedTx.scanIndex.should.equal(0);
549
+ unsignedTx.coin.should.equal('tiota');
550
+ unsignedTx.derivationPath.should.equal('m/0');
551
+ unsignedTx.parsedTx.inputs[0].address.should.equal(senderAddress0);
552
+ unsignedTx.parsedTx.outputs[0].address.should.equal(recoveryDestination);
553
+ unsignedTx.parsedTx.spendAmount.should.equal('1897802332');
554
+ unsignedTx.feeInfo.fee.should.equal(2197668);
555
+ unsignedTx.feeInfo.feeString.should.equal('2197668');
556
+ unsignedTx.coinSpecific.commonKeychain.should.equal('3b89eec9d2d2f3b049ecda2e7b5f47827f7927fe6618d6e8b13f64e7c95f4b00b9577ab01395ecf8eeb804b590cedae14ff5fd3947bf3b7a95b9327c49e27c54');
557
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 1);
558
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
559
+ });
560
+ });
561
+ describe('Recover Transactions for wallet with multiple addresses:', () => {
562
+ const sandBox = sinon_1.default.createSandbox();
563
+ const senderAddress0 = '0xfd36d2ad48edf5671abf04f5c0eef3464bf92cf45ae655aff471cfaedb61fa99';
564
+ const senderAddress1 = '0x62d5c86e6578d54ad9545fe9b323e54e8792964e0189d7f094d4c79865b9b827';
565
+ const recoveryDestination = '0xda97e166d40fa6a0c949b6aeb862e391c29139b563ae0430b2419c589a02a6e0';
566
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
567
+ beforeEach(function () {
568
+ const fetchOwnedObjectsStub = sandBox.stub(src_1.Iota.prototype, 'fetchOwnedObjects');
569
+ fetchOwnedObjectsStub.withArgs(senderAddress0).resolves([]);
570
+ fetchOwnedObjectsStub.withArgs(senderAddress1).resolves([
571
+ {
572
+ objectId: '0xff93adc2f516fcaa0c6040e01f50027a23f9b1767f5040eb2282790a6900ce7f',
573
+ version: '196',
574
+ digest: 'XrjRM9ZM98xdNWigHYQjCpGoWt6aZLpqXdSEixnhb4p',
575
+ balance: '1800000000',
576
+ },
577
+ ]);
578
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
579
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(1997880);
580
+ });
581
+ afterEach(function () {
582
+ sandBox.restore();
583
+ });
584
+ it('should recover a txn for non-bitgo recoveries at address 1 but search from address 0', async function () {
585
+ const res = await basecoin.recover({
586
+ userKey: iota_1.keys.userKey,
587
+ backupKey: iota_1.keys.backupKey,
588
+ bitgoKey: iota_1.keys.bitgoKey,
589
+ recoveryDestination,
590
+ walletPassphrase,
591
+ });
592
+ res.should.not.be.empty();
593
+ res.should.hasOwnProperty('transactions');
594
+ const tx = res.transactions[0];
595
+ tx.scanIndex.should.equal(1);
596
+ tx.recoveryAmount.should.equal('1797802332');
597
+ tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAg2pfhZtQPpqDJSbauuGLjkcKRObVjrgQwskGcWJoCpuACAgABAQAAAQEDAAAAAAEBAGLVyG5leNVK2VRf6bMj5U6HkpZOAYnX8JTUx5hlubgnAf+TrcL1FvyqDGBA4B9QAnoj+bF2f1BA6yKCeQppAM5/xAAAAAAAAAAgB+en3SAyx0EYbPW1b+wVCUCuGRGZiN2JdNfH4K/EeNVi1chuZXjVStlUX+mzI+VOh5KWTgGJ1/CU1MeYZbm4J+gDAAAAAAAApIghAAAAAAAA');
598
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
599
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
600
+ });
601
+ it('should recover a txn for non-bitgo recoveries at address 1 but search from address 1', async function () {
602
+ const res = await basecoin.recover({
603
+ userKey: iota_1.keys.userKey,
604
+ backupKey: iota_1.keys.backupKey,
605
+ bitgoKey: iota_1.keys.bitgoKey,
606
+ recoveryDestination,
607
+ walletPassphrase,
608
+ startingScanIndex: 1,
609
+ });
610
+ res.should.not.be.empty();
611
+ res.should.hasOwnProperty('transactions');
612
+ const tx = res.transactions[0];
613
+ tx.scanIndex.should.equal(1);
614
+ tx.recoveryAmount.should.equal('1797802332');
615
+ tx.serializedTx.should.equal('AAACAAhcSShrAAAAAAAg2pfhZtQPpqDJSbauuGLjkcKRObVjrgQwskGcWJoCpuACAgABAQAAAQEDAAAAAAEBAGLVyG5leNVK2VRf6bMj5U6HkpZOAYnX8JTUx5hlubgnAf+TrcL1FvyqDGBA4B9QAnoj+bF2f1BA6yKCeQppAM5/xAAAAAAAAAAgB+en3SAyx0EYbPW1b+wVCUCuGRGZiN2JdNfH4K/EeNVi1chuZXjVStlUX+mzI+VOh5KWTgGJ1/CU1MeYZbm4J+gDAAAAAAAApIghAAAAAAAA');
616
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 1);
617
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
618
+ });
619
+ });
620
+ describe('Recover Consolidation Transactions', () => {
621
+ const sandBox = sinon_1.default.createSandbox();
622
+ const receiveAddress1 = '0x62d5c86e6578d54ad9545fe9b323e54e8792964e0189d7f094d4c79865b9b827';
623
+ const receiveAddress2 = '0x0898a1bc18fd1c9f7c8fdf266bfdc633fe2ac73314bf071b2e0e9800131bfb85';
624
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
625
+ beforeEach(function () {
626
+ const fetchOwnedObjectsStub = sandBox.stub(src_1.Iota.prototype, 'fetchOwnedObjects');
627
+ fetchOwnedObjectsStub
628
+ .withArgs(receiveAddress1)
629
+ .resolves([
630
+ {
631
+ objectId: '0x996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76d',
632
+ version: '201',
633
+ digest: 'HXpNTfx9TBdxFcXHi4RziZsQuDAHavRasK6Ri15rVwuA',
634
+ balance: '200000000',
635
+ },
636
+ ])
637
+ .withArgs(receiveAddress2)
638
+ .resolves([
639
+ {
640
+ objectId: '0xfa04105eedebdabf729dccecf01d0cf5f1b770892fac2ed8f1e69d71a32a2d24',
641
+ version: '202',
642
+ digest: 'DeApRVSrTa9ttXvNyLexT4PJcAkyyxSpi3JQeUg4ua8Q',
643
+ balance: '200000000',
644
+ },
645
+ ]);
646
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
647
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(1997880);
648
+ });
649
+ afterEach(function () {
650
+ sandBox.restore();
651
+ });
652
+ it('should build signed consolidation transactions for hot wallet', async function () {
653
+ const res = await basecoin.recoverConsolidations({
654
+ userKey: iota_1.keys.userKey,
655
+ backupKey: iota_1.keys.backupKey,
656
+ bitgoKey: iota_1.keys.bitgoKey,
657
+ walletPassphrase,
658
+ startingScanIndex: 1,
659
+ endingScanIndex: 3,
660
+ });
661
+ const transactions = res.transactions;
662
+ transactions.length.should.equal(2);
663
+ const txn1 = transactions[0];
664
+ txn1.scanIndex.should.equal(1);
665
+ txn1.recoveryAmount.should.equal('197802332');
666
+ txn1.serializedTx.should.equal('AAACAAhcOcoLAAAAAAAg/TbSrUjt9WcavwT1wO7zRkv5LPRa5lWv9HHPrtth+pkCAgABAQAAAQEDAAAAAAEBAGLVyG5leNVK2VRf6bMj5U6HkpZOAYnX8JTUx5hlubgnAZlqqzZdRVG20SdPUgu/p7ClZtVIstWQtVZcYjgS5+dtyQAAAAAAAAAg9Z/5/USSVbWCCLevCjknDct+271b9SzKtmsjQViwFNli1chuZXjVStlUX+mzI+VOh5KWTgGJ1/CU1MeYZbm4J+gDAAAAAAAApIghAAAAAAAA');
667
+ const txn2 = transactions[1];
668
+ txn2.scanIndex.should.equal(2);
669
+ txn2.recoveryAmount.should.equal('197802332');
670
+ txn2.serializedTx.should.equal('AAACAAhcOcoLAAAAAAAg/TbSrUjt9WcavwT1wO7zRkv5LPRa5lWv9HHPrtth+pkCAgABAQAAAQEDAAAAAAEBAAiYobwY/RyffI/fJmv9xjP+KsczFL8HGy4OmAATG/uFAfoEEF7t69q/cp3M7PAdDPXxt3CJL6wu2PHmnXGjKi0kygAAAAAAAAAgu9HVeOUorKVEaH2lfhSkEUGwK/kC3pEGf5dcMBud9EEImKG8GP0cn3yP3yZr/cYz/irHMxS/BxsuDpgAExv7hegDAAAAAAAApIghAAAAAAAA');
671
+ res.lastScanIndex.should.equal(2);
672
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
673
+ sandBox.assert.callCount(basecoin.estimateGas, 2);
674
+ });
675
+ it('should build unsigned consolidation transactions for cold wallet', async function () {
676
+ const res = await basecoin.recoverConsolidations({
677
+ bitgoKey: iota_1.keys.bitgoKey,
678
+ startingScanIndex: 1,
679
+ endingScanIndex: 3,
680
+ });
681
+ res.should.hasOwnProperty('txRequests');
682
+ res.txRequests.length.should.equal(2);
683
+ const unsignedTx1 = res.txRequests[0].transactions[0].unsignedTx;
684
+ unsignedTx1.scanIndex.should.equal(1);
685
+ unsignedTx1.coin.should.equal('tiota');
686
+ unsignedTx1.derivationPath.should.equal('m/1');
687
+ unsignedTx1.parsedTx.inputs[0].address.should.equal(receiveAddress1);
688
+ unsignedTx1.parsedTx.outputs[0].address.should.equal('0xfd36d2ad48edf5671abf04f5c0eef3464bf92cf45ae655aff471cfaedb61fa99');
689
+ unsignedTx1.parsedTx.spendAmount.should.equal('197802332');
690
+ unsignedTx1.feeInfo.fee.should.equal(2197668);
691
+ const unsignedTx2 = res.txRequests[1].transactions[0].unsignedTx;
692
+ unsignedTx2.scanIndex.should.equal(2);
693
+ unsignedTx2.coin.should.equal('tiota');
694
+ unsignedTx2.derivationPath.should.equal('m/2');
695
+ unsignedTx2.parsedTx.inputs[0].address.should.equal(receiveAddress2);
696
+ unsignedTx2.parsedTx.outputs[0].address.should.equal('0xfd36d2ad48edf5671abf04f5c0eef3464bf92cf45ae655aff471cfaedb61fa99');
697
+ unsignedTx2.parsedTx.spendAmount.should.equal('197802332');
698
+ unsignedTx2.feeInfo.fee.should.equal(2197668);
699
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
700
+ sandBox.assert.callCount(basecoin.estimateGas, 2);
701
+ });
702
+ });
703
+ describe('Recover Token Transactions:', () => {
704
+ const sandBox = sinon_1.default.createSandbox();
705
+ const senderAddress0 = '0xfd36d2ad48edf5671abf04f5c0eef3464bf92cf45ae655aff471cfaedb61fa99';
706
+ const coldWalletAddress0 = '0x749fa49b82a76c995b9bd953c83b3291dcd8845854189f342f190d0ea3a435ea';
707
+ const recoveryDestination = '0xda97e166d40fa6a0c949b6aeb862e391c29139b563ae0430b2419c589a02a6e0';
708
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
709
+ const tokenContractAddress = '0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789';
710
+ const validDigest = '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb';
711
+ afterEach(() => {
712
+ sandBox.restore();
713
+ });
714
+ function stubTokenRecovery(senderAddr, tokenBalance, gasBalance) {
715
+ sandBox.stub(src_1.Iota.prototype, 'hasTokenBalance').callsFake(function (addr) {
716
+ return Promise.resolve(addr === senderAddr);
717
+ });
718
+ sandBox
719
+ .stub(src_1.Iota.prototype, 'fetchOwnedObjects')
720
+ .callsFake(function (addr, _rpc, coinType) {
721
+ if (addr === senderAddr && coinType === tokenContractAddress) {
722
+ return Promise.resolve([
723
+ { objectId: '0xaaaa' + senderAddr.slice(6), version: '100', digest: validDigest, balance: tokenBalance },
724
+ ]);
725
+ }
726
+ if (addr === senderAddr && !coinType) {
727
+ return Promise.resolve([
728
+ { objectId: '0xbbbb' + senderAddr.slice(6), version: '200', digest: validDigest, balance: gasBalance },
729
+ ]);
730
+ }
731
+ return Promise.resolve([]);
732
+ });
733
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
734
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(2345504);
735
+ }
736
+ it('should recover a token txn for non-bitgo recovery', async function () {
737
+ stubTokenRecovery(senderAddress0, '1000', '500000000');
738
+ const res = await basecoin.recover({
739
+ userKey: iota_1.keys.userKey,
740
+ backupKey: iota_1.keys.backupKey,
741
+ bitgoKey: iota_1.keys.bitgoKey,
742
+ recoveryDestination,
743
+ walletPassphrase,
744
+ tokenContractAddress,
745
+ });
746
+ res.should.not.be.empty();
747
+ res.should.hasOwnProperty('transactions');
748
+ const tx = res.transactions[0];
749
+ tx.scanIndex.should.equal(0);
750
+ tx.recoveryAmount.should.equal('1000');
751
+ tx.coin.should.equal(tokenContractAddress);
752
+ sandBox.assert.callCount(basecoin.hasTokenBalance, 1);
753
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
754
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
755
+ });
756
+ it('should recover a token txn for unsigned sweep recovery', async function () {
757
+ stubTokenRecovery(coldWalletAddress0, '1000', '200000000');
758
+ const res = await basecoin.recover({
759
+ bitgoKey: iota_1.keys.bitgoKeyColdWallet,
760
+ recoveryDestination,
761
+ tokenContractAddress,
762
+ });
763
+ res.should.not.be.empty();
764
+ res.should.hasOwnProperty('txRequests');
765
+ const unsignedTx = res.txRequests[0].transactions[0].unsignedTx;
766
+ unsignedTx.scanIndex.should.equal(0);
767
+ unsignedTx.coin.should.equal(tokenContractAddress);
768
+ unsignedTx.derivationPath.should.equal('m/0');
769
+ unsignedTx.parsedTx.inputs[0].address.should.equal(coldWalletAddress0);
770
+ unsignedTx.parsedTx.outputs[0].address.should.equal(recoveryDestination);
771
+ unsignedTx.parsedTx.spendAmount.should.equal('1000');
772
+ unsignedTx.feeInfo.fee.should.equal(2580054);
773
+ res.txRequests[0].walletCoin.should.equal(tokenContractAddress);
774
+ sandBox.assert.callCount(basecoin.hasTokenBalance, 1);
775
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
776
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
777
+ });
778
+ });
779
+ describe('Recover Token Transactions for wallet with multiple addresses:', () => {
780
+ const sandBox = sinon_1.default.createSandbox();
781
+ const senderAddress1 = '0x62d5c86e6578d54ad9545fe9b323e54e8792964e0189d7f094d4c79865b9b827';
782
+ const recoveryDestination = '0xda97e166d40fa6a0c949b6aeb862e391c29139b563ae0430b2419c589a02a6e0';
783
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
784
+ const tokenContractAddress = '0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789';
785
+ const validDigest = '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb';
786
+ beforeEach(function () {
787
+ sandBox.stub(src_1.Iota.prototype, 'hasTokenBalance').callsFake(function (addr) {
788
+ return Promise.resolve(addr === senderAddress1);
789
+ });
790
+ sandBox
791
+ .stub(src_1.Iota.prototype, 'fetchOwnedObjects')
792
+ .callsFake(function (addr, _rpc, coinType) {
793
+ if (addr === senderAddress1 && coinType === tokenContractAddress) {
794
+ return Promise.resolve([
795
+ { objectId: '0xcccc' + senderAddress1.slice(6), version: '300', digest: validDigest, balance: '1000' },
796
+ ]);
797
+ }
798
+ if (addr === senderAddress1 && !coinType) {
799
+ return Promise.resolve([
800
+ {
801
+ objectId: '0xdddd' + senderAddress1.slice(6),
802
+ version: '301',
803
+ digest: validDigest,
804
+ balance: '120000000',
805
+ },
806
+ ]);
807
+ }
808
+ return Promise.resolve([]);
809
+ });
810
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
811
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(2345504);
812
+ });
813
+ afterEach(function () {
814
+ sandBox.restore();
815
+ });
816
+ it('should recover a token txn at address 1 but search from address 0', async function () {
817
+ const res = await basecoin.recover({
818
+ userKey: iota_1.keys.userKey,
819
+ backupKey: iota_1.keys.backupKey,
820
+ bitgoKey: iota_1.keys.bitgoKey,
821
+ recoveryDestination,
822
+ walletPassphrase,
823
+ tokenContractAddress,
824
+ });
825
+ res.should.not.be.empty();
826
+ res.should.hasOwnProperty('transactions');
827
+ const tx = res.transactions[0];
828
+ tx.scanIndex.should.equal(1);
829
+ tx.recoveryAmount.should.equal('1000');
830
+ tx.coin.should.equal(tokenContractAddress);
831
+ sandBox.assert.callCount(basecoin.hasTokenBalance, 2);
832
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
833
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
834
+ });
835
+ it('should recover a token txn at address 1 but search from address 1', async function () {
836
+ const res = await basecoin.recover({
837
+ userKey: iota_1.keys.userKey,
838
+ backupKey: iota_1.keys.backupKey,
839
+ bitgoKey: iota_1.keys.bitgoKey,
840
+ recoveryDestination,
841
+ walletPassphrase,
842
+ tokenContractAddress,
843
+ startingScanIndex: 1,
844
+ });
845
+ res.should.not.be.empty();
846
+ res.should.hasOwnProperty('transactions');
847
+ const tx = res.transactions[0];
848
+ tx.scanIndex.should.equal(1);
849
+ tx.recoveryAmount.should.equal('1000');
850
+ tx.coin.should.equal(tokenContractAddress);
851
+ sandBox.assert.callCount(basecoin.hasTokenBalance, 1);
852
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
853
+ sandBox.assert.callCount(basecoin.estimateGas, 1);
854
+ });
855
+ });
856
+ describe('Recover Token Consolidation Transactions', () => {
857
+ const sandBox = sinon_1.default.createSandbox();
858
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
859
+ const tokenContractAddress = '0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789';
860
+ const validDigest = '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb';
861
+ const hotWalletAddress1 = '0x62d5c86e6578d54ad9545fe9b323e54e8792964e0189d7f094d4c79865b9b827';
862
+ const hotWalletAddress2 = '0x0898a1bc18fd1c9f7c8fdf266bfdc633fe2ac73314bf071b2e0e9800131bfb85';
863
+ const coldWalletAddress1 = '0xe1d61633030843ad069c0f783f2cc7cd6e1dc87dc026bb5ba1b5bddd6e654e47';
864
+ const coldWalletAddress2 = '0xb9581a03622c271707c0d4cac699e4ef2468cfc0316e8f9aa040eb449c195e1d';
865
+ afterEach(function () {
866
+ sandBox.restore();
867
+ });
868
+ function stubMultiTokenRecovery(addrsMap) {
869
+ sandBox.stub(src_1.Iota.prototype, 'hasTokenBalance').callsFake(function (addr) {
870
+ return Promise.resolve(!!addrsMap[addr]);
871
+ });
872
+ sandBox
873
+ .stub(src_1.Iota.prototype, 'fetchOwnedObjects')
874
+ .callsFake(function (addr, _rpc, coinType) {
875
+ const m = addrsMap[addr];
876
+ if (!m)
877
+ return Promise.resolve([]);
878
+ if (coinType === tokenContractAddress) {
879
+ return Promise.resolve([
880
+ { objectId: '0xaaaa' + addr.slice(6), version: '400', digest: validDigest, balance: m.tb },
881
+ ]);
882
+ }
883
+ if (!coinType) {
884
+ return Promise.resolve([
885
+ { objectId: '0xbbbb' + addr.slice(6), version: '401', digest: validDigest, balance: m.gb },
886
+ ]);
887
+ }
888
+ return Promise.resolve([]);
889
+ });
890
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
891
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(2345504);
892
+ }
893
+ it('should build signed token consolidation transactions for hot wallet', async function () {
894
+ stubMultiTokenRecovery({
895
+ [hotWalletAddress1]: { tb: '1500', gb: '116720144' },
896
+ [hotWalletAddress2]: { tb: '2000', gb: '120101976' },
897
+ });
898
+ const res = await basecoin.recoverConsolidations({
899
+ userKey: iota_1.keys.userKey,
900
+ backupKey: iota_1.keys.backupKey,
901
+ bitgoKey: iota_1.keys.bitgoKey,
902
+ walletPassphrase,
903
+ tokenContractAddress,
904
+ startingScanIndex: 1,
905
+ endingScanIndex: 3,
906
+ });
907
+ const transactions = res.transactions;
908
+ transactions.length.should.equal(2);
909
+ const txn1 = transactions[0];
910
+ txn1.scanIndex.should.equal(1);
911
+ txn1.recoveryAmount.should.equal('1500');
912
+ txn1.coin.should.equal(tokenContractAddress);
913
+ const txn2 = transactions[1];
914
+ txn2.scanIndex.should.equal(2);
915
+ txn2.recoveryAmount.should.equal('2000');
916
+ txn2.coin.should.equal(tokenContractAddress);
917
+ res.lastScanIndex.should.equal(2);
918
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 4);
919
+ sandBox.assert.callCount(basecoin.estimateGas, 2);
920
+ });
921
+ it('should build unsigned token consolidation transactions for cold wallet', async function () {
922
+ stubMultiTokenRecovery({
923
+ [coldWalletAddress1]: { tb: '4000', gb: '116720144' },
924
+ [coldWalletAddress2]: { tb: '6000', gb: '120101976' },
925
+ });
926
+ const res = await basecoin.recoverConsolidations({
927
+ bitgoKey: iota_1.keys.bitgoKeyColdWallet,
928
+ tokenContractAddress,
929
+ startingScanIndex: 1,
930
+ endingScanIndex: 3,
931
+ });
932
+ res.should.hasOwnProperty('txRequests');
933
+ res.txRequests.length.should.equal(2);
934
+ const unsignedTx1 = res.txRequests[0].transactions[0].unsignedTx;
935
+ unsignedTx1.scanIndex.should.equal(1);
936
+ unsignedTx1.coin.should.equal(tokenContractAddress);
937
+ unsignedTx1.derivationPath.should.equal('m/1');
938
+ unsignedTx1.parsedTx.inputs[0].address.should.equal(coldWalletAddress1);
939
+ unsignedTx1.parsedTx.spendAmount.should.equal('4000');
940
+ unsignedTx1.feeInfo.fee.should.equal(2580054);
941
+ res.txRequests[0].walletCoin.should.equal(tokenContractAddress);
942
+ const unsignedTx2 = res.txRequests[1].transactions[0].unsignedTx;
943
+ unsignedTx2.scanIndex.should.equal(2);
944
+ unsignedTx2.coin.should.equal(tokenContractAddress);
945
+ unsignedTx2.derivationPath.should.equal('m/2');
946
+ unsignedTx2.parsedTx.inputs[0].address.should.equal(coldWalletAddress2);
947
+ unsignedTx2.parsedTx.spendAmount.should.equal('6000');
948
+ unsignedTx2.feeInfo.fee.should.equal(2580054);
949
+ res.txRequests[1].walletCoin.should.equal(tokenContractAddress);
950
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 4);
951
+ sandBox.assert.callCount(basecoin.estimateGas, 2);
952
+ });
953
+ });
954
+ describe('Recover Consolidation Transactions with seed', () => {
955
+ const sandBox = sinon_1.default.createSandbox();
956
+ const validDigest = '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb';
957
+ const seedReceiveAddress1 = '0x9d33bc56f9d47c473cbea009f7d448670a9d32640c5b1b50a75c6f7879bc5994';
958
+ const seedReceiveAddress2 = '0xb32633913130a613807de9f83356d22baef778d78da5799ef4e566095a9ffe50';
959
+ const seedBaseAddress = '0x087a72a698ace16e252b8b66bf1184b4829a373a0d9ab546921d19efdb849034';
960
+ beforeEach(function () {
961
+ sandBox.stub(src_1.Iota.prototype, 'fetchOwnedObjects').callsFake(function (addr) {
962
+ if (addr === seedReceiveAddress1) {
963
+ return Promise.resolve([
964
+ {
965
+ objectId: '0x3333' + seedReceiveAddress1.slice(6),
966
+ version: '600',
967
+ digest: validDigest,
968
+ balance: '500000000',
969
+ },
970
+ ]);
971
+ }
972
+ if (addr === seedReceiveAddress2) {
973
+ return Promise.resolve([
974
+ {
975
+ objectId: '0x3333' + seedReceiveAddress2.slice(6),
976
+ version: '601',
977
+ digest: validDigest,
978
+ balance: '200000000',
979
+ },
980
+ ]);
981
+ }
982
+ return Promise.resolve([]);
983
+ });
984
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
985
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(1997880);
986
+ });
987
+ afterEach(function () {
988
+ sandBox.restore();
989
+ });
990
+ it('should build unsigned consolidation transactions for cold wallet with seed', async function () {
991
+ const res = await basecoin.recoverConsolidations({
992
+ bitgoKey: iota_1.keys.bitgoKeyWithSeed,
993
+ startingScanIndex: 1,
994
+ endingScanIndex: 3,
995
+ seed: '123',
996
+ });
997
+ res.should.hasOwnProperty('txRequests');
998
+ res.txRequests.length.should.equal(2);
999
+ const unsignedTx1 = res.txRequests[0].transactions[0].unsignedTx;
1000
+ unsignedTx1.scanIndex.should.equal(1);
1001
+ unsignedTx1.coin.should.equal('tiota');
1002
+ unsignedTx1.derivationPath.should.equal('m/999999/94862622/157363509/1');
1003
+ unsignedTx1.parsedTx.inputs[0].address.should.equal(seedReceiveAddress1);
1004
+ unsignedTx1.parsedTx.outputs[0].address.should.equal(seedBaseAddress);
1005
+ unsignedTx1.parsedTx.spendAmount.should.equal('497802332');
1006
+ unsignedTx1.feeInfo.fee.should.equal(2197668);
1007
+ const unsignedTx2 = res.txRequests[1].transactions[0].unsignedTx;
1008
+ unsignedTx2.scanIndex.should.equal(2);
1009
+ unsignedTx2.coin.should.equal('tiota');
1010
+ unsignedTx2.derivationPath.should.equal('m/999999/94862622/157363509/2');
1011
+ unsignedTx2.parsedTx.inputs[0].address.should.equal(seedReceiveAddress2);
1012
+ unsignedTx2.parsedTx.outputs[0].address.should.equal(seedBaseAddress);
1013
+ unsignedTx2.parsedTx.spendAmount.should.equal('197802332');
1014
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 2);
1015
+ sandBox.assert.callCount(basecoin.estimateGas, 2);
1016
+ });
1017
+ });
1018
+ describe('Recover Transaction Failures:', () => {
1019
+ const sandBox = sinon_1.default.createSandbox();
1020
+ const senderAddress0 = '0xfd36d2ad48edf5671abf04f5c0eef3464bf92cf45ae655aff471cfaedb61fa99';
1021
+ const recoveryDestination = '0xda97e166d40fa6a0c949b6aeb862e391c29139b563ae0430b2419c589a02a6e0';
1022
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
1023
+ afterEach(function () {
1024
+ sandBox.restore();
1025
+ });
1026
+ it('should fail to recover due to non-zero fund but insufficient funds address', async function () {
1027
+ sandBox
1028
+ .stub(src_1.Iota.prototype, 'fetchOwnedObjects')
1029
+ .withArgs(senderAddress0)
1030
+ .resolves([
1031
+ {
1032
+ objectId: '0xc05c765e26e6ae84c78fa245f38a23fb20406a5cf3f61b57bd323a0df9d98003',
1033
+ version: '195',
1034
+ digest: '7BJLb32LKN7wt5uv4xgXW4AbFKoMNcPE76o41TQEvUZb',
1035
+ balance: '9800212',
1036
+ },
1037
+ ]);
1038
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
1039
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(9800212);
1040
+ await basecoin
1041
+ .recover({
1042
+ userKey: iota_1.keys.userKey,
1043
+ backupKey: iota_1.keys.backupKey,
1044
+ bitgoKey: iota_1.keys.bitgoKey,
1045
+ recoveryDestination,
1046
+ walletPassphrase,
1047
+ startingScanIndex: 0,
1048
+ scan: 1,
1049
+ })
1050
+ .should.rejectedWith('Did not find an address with sufficient funds to recover. Scanned addresses from index 0 to 0. Please start the next scan at address index 1.');
1051
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 1);
1052
+ });
1053
+ it('should fail to recover due to not finding an address with funds', async function () {
1054
+ sandBox.stub(src_1.Iota.prototype, 'fetchOwnedObjects').resolves([]);
1055
+ await basecoin
1056
+ .recover({
1057
+ userKey: iota_1.keys.userKey,
1058
+ backupKey: iota_1.keys.backupKey,
1059
+ bitgoKey: iota_1.keys.bitgoKey,
1060
+ recoveryDestination,
1061
+ walletPassphrase,
1062
+ scan: 10,
1063
+ })
1064
+ .should.rejectedWith('Did not find an address with sufficient funds to recover. Scanned addresses from index 0 to 9. Please start the next scan at address index 10.');
1065
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 10);
1066
+ });
1067
+ });
1068
+ describe('Consolidation Transaction Failures:', () => {
1069
+ it('should fail due to insufficient funds in receive address', async function () {
1070
+ const sandBox = sinon_1.default.createSandbox();
1071
+ const receiveAddress1 = '0x62d5c86e6578d54ad9545fe9b323e54e8792964e0189d7f094d4c79865b9b827';
1072
+ const walletPassphrase = 'p$Sw<RjvAgf{nYAYI2xM';
1073
+ sandBox
1074
+ .stub(src_1.Iota.prototype, 'fetchOwnedObjects')
1075
+ .withArgs(receiveAddress1)
1076
+ .resolves([
1077
+ {
1078
+ objectId: '0x996aab365d4551b6d1274f520bbfa7b0a566d548b2d590b5565c623812e7e76d',
1079
+ version: '201',
1080
+ digest: 'HXpNTfx9TBdxFcXHi4RziZsQuDAHavRasK6Ri15rVwuA',
1081
+ balance: '1',
1082
+ },
1083
+ ]);
1084
+ sandBox.stub(src_1.Iota.prototype, 'fetchGasPrice').resolves(1000);
1085
+ sandBox.stub(src_1.Iota.prototype, 'estimateGas').resolves(1997880);
1086
+ await basecoin
1087
+ .recoverConsolidations({
1088
+ userKey: iota_1.keys.userKey,
1089
+ backupKey: iota_1.keys.backupKey,
1090
+ bitgoKey: iota_1.keys.bitgoKey,
1091
+ walletPassphrase,
1092
+ startingScanIndex: 1,
1093
+ endingScanIndex: 2,
1094
+ })
1095
+ .should.rejectedWith('Did not find an address with sufficient funds to recover. Please start the next scan at address index 2.');
1096
+ sandBox.assert.callCount(basecoin.fetchOwnedObjects, 1);
1097
+ sandBox.restore();
1098
+ });
1099
+ });
500
1100
  });
501
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhDQUEwRDtBQUMxRCw0Q0FBMEM7QUFDMUMsbUNBQWlGO0FBQ2pGLG9EQUE0QjtBQUM1Qiw0Q0FBMkQ7QUFDM0QsNERBQThDO0FBQzlDLDhDQUFrRDtBQUNsRCx1REFBcUU7QUFFckUsUUFBUSxDQUFDLE9BQU8sRUFBRTtJQUNoQixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7UUFDakMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUF1QixDQUFDO1FBQzVELE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxD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QUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDakQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsS0FBSztnQkFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBQSwwQ0FBNEIsR0FBRSxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO2dCQUM1RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFFMUIsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBJb3RhLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNvaW5zLCBHYXNUYW5rQWNjb3VudENvaW4gfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvaW90YSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcyB9IGZyb20gJy4vaGVscGVycy90ZXN0SGVscGVycyc7XG5cbmRlc2NyaWJlKCdJT1RBOicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcignaW90YScsIElvdGEuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGlvdGEnLCBJb3RhLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3Rpb3RhJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByaWdodCBpbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlvdGEgPSBiaXRnby5jb2luKCdpb3RhJyk7XG4gICAgY29uc3QgdGlvdGEgPSBiaXRnby5jb2luKCd0aW90YScpO1xuICAgIGNvbnN0IGlvdGFTdGF0aWNzID0gY29pbnMuZ2V0KCdpb3RhJykgYXMgR2FzVGFua0FjY291bnRDb2luO1xuICAgIGNvbnN0IHRpb3RhU3RhdGljcyA9IGNvaW5zLmdldCgndGlvdGEnKSBhcyBHYXNUYW5rQWNjb3VudENvaW47XG5cbiAgICBpb3RhLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCdpb3RhJyk7XG4gICAgaW90YS5nZXRGYW1pbHkoKS5zaG91bGQuZXF1YWwoJ2lvdGEnKTtcbiAgICBpb3RhLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdJb3RhJyk7XG4gICAgaW90YS5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlOSk7XG5cbiAgICB0aW90YS5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgndGlvdGEnKTtcbiAgICB0aW90YS5nZXRGYW1pbHkoKS5zaG91bGQuZXF1YWwoJ2lvdGEnKTtcbiAgICB0aW90YS5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBJb3RhJyk7XG4gICAgdGlvdGEuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTkpO1xuXG4gICAgaW90YVN0YXRpY3MuZ2FzVGFua0xvd0JhbGFuY2VBbGVydEZhY3Rvci5zaG91bGQuZXF1YWwoODApO1xuICAgIHRpb3RhU3RhdGljcy5nYXNUYW5rTG93QmFsYW5jZUFsZXJ0RmFjdG9yLnNob3VsZC5lcXVhbCg4MCk7XG4gICAgaW90YVN0YXRpY3MuZ2FzVGFua01pbkJhbGFuY2VSZWNvbW1lbmRhdGlvbkZhY3Rvci5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICB0aW90YVN0YXRpY3MuZ2FzVGFua01pbkJhbGFuY2VSZWNvbW1lbmRhdGlvbkZhY3Rvci5zaG91bGQuZXF1YWwoMjAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdXBwb3J0IGFjY291bnQgY29uc29saWRhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnaXMgdmFsaWQgcHViJywgZnVuY3Rpb24gKCkge1xuICAgIC8vIHdpdGggMHggcHJlZml4XG4gICAgYmFzZWNvaW4uaXNWYWxpZFB1YignMHg5YjRlOTYwODZkMTExNTAwMjU5ZjliMzg2ODBiMDUwOWE0MDVjMTkwNGRhMTg5NzY0NTVhMjBjNjkxZDNiYjA3Jykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAvLyB3aXRob3V0IDB4IHByZWZpeFxuICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIoJzliNGU5NjA4NmQxMTE1MDAyNTlmOWIzODY4MGIwNTA5YTQwNWMxOTA0ZGExODk3NjQ1NWEyMGM2OTFkM2JiMDcnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBZGRyZXNzIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgbGV0IGtleWNoYWlucztcbiAgICBsZXQgY29tbW9uS2V5Y2hhaW47XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgY29tbW9uS2V5Y2hhaW4gPVxuICAgICAgICAnMTliZGZlMmE0YjQ5OGEwNTUxMTM4MTIzNWE4ODkyZDU0MjY3ODA3YzRhM2Y2NTRlMzEwYjkzOGI4YjQyNGZmNGFkZWRiZTkyZjRjMTQ2ZGU2NDFjNjc1MDhhOTYxMzI0Yzg1MDRjZGY4ZTBjMGFjYmI2OGQ2MTA0Y2NjY2Q3ODEnO1xuICAgICAga2V5Y2hhaW5zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICc2NDI0YzM1M2VhZjc4ZDAwMDc2NmU5NTk0OTg2ODQ2OCcsXG4gICAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAnMTliZGZlMmE0YjQ5OGEwNTUxMTM4MTIzNWE4ODkyZDU0MjY3ODA3YzRhM2Y2NTRlMzEwYjkzOGI4YjQyNGZmNGFkZWRiZTkyZjRjMTQ2ZGU2NDFjNjc1MDhhOTYxMzI0Yzg1MDRjZGY4ZTBjMGFjYmI2OGQ2MTA0Y2NjY2Q3ODEnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjpcbiAgICAgICAgICAgICd7XCJpdlwiOlwiY1pkNWk3TDRSeHR3ckFMVzJySzdVQT09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIjpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcIjV6Z29IMUJkM0Z3PVwiLFwiY3RcIjpcIjl2VmxuWEZSdHJNOUZWRW8rZDJjaGJHSGxNOWxGWmVtdWVCdUFzM0JJa1BvMzNGbzdqend3Tksva0lXa0V5ZytObUVCZDVJYXFBUzE1N252dnZ3enpzbU1XbFFkVXo5cWJtWE52M3BnOTg3Y1hGUjA4ZXhTKzR1aHdQMVlOT2pKVFJ2Uk5jTzlacUhiNDZkNGZteUoveUM5L3N1c0NnZTdyL0VzYmFONUMzYWZ2MWR6eWJ1cTkxMkZ3YVFFbFpMWVlwNUJJQ3VkRk9NWjlrMFVETWZLTS9QTURrSDdXZXhvR0hyOUdLcS9iZ0NIMkIzOVRaWnlIS1U2VXk0N2xYZXAyczZoMERyTXdIT3JubWlMM0Raak9qODhZbnZwaGx6eHVvNGVPbEQyVUhpYTIrbnZJYUlTWXMyOVByMERBdlJFdXRjaHZjQnBFeGoxa1dXUHY3aFFZcnY4RjBOQWRhdHNiV2wzdyt4S3lmaU1LbzFVU2xyd3lKdml5cEd0UXRYT0p5dzBYUE4wcnYyK0w1bFc4QmJqcHpIZllZTjEzZkpUZWRsR1RGaGhrelZ0YmJQQUtFMDJreDd6Q0pjallhaWV4ZFNUc3JETFNjWU5UOS9KaGR0MjdLcHNvb2Vod1ZvaExmU0t6NHZiRmZSdTJNUFp3My8rYy9oZmlKTmd0ejZlc1dibnhHcmNFOFUySXdQWUNhSytHaGs0RGNxV05Jbmk1OVJJNUI1a0FzUU9Ub0lJNDBxUE41MTB1VGd4QlNQTzdxN01IZ2t4ZGQ0Q3FCcStvanI5ajBQN29hbzhFNVkrQ0JESnJvakRvQ2gxb0NDRFc5dm8yZFhsVmNEOFNJYnc3VS85QWZ2RWJBNHh5RS81bWQxTTdDSXdMbldzMlludjBZdGFLb3FoZFM5eDZGbUhsTURoTi9ES0hpbnJ3bW93dHJUVDgyZk9rcE81ZzlzYVNtZ1U3UXkzZ0x0OHQrVndkRXllRmVRVUtSU3ljaThxZ3FYUWFaSWc0K2FYZ2FTT25sQ0ZNdG1COGVrWXhFaFRZNXV6UmZyTmdTNHMxUWVxRkJwTnRVRitZZGkyOTdwYlZYbkpvWEFOK1NWV2Q4MEdDeCt5STJkcFZDODlrM3JPV0s5V2V5cWxuenVMSldwMlJJT0I5Y2RXOEdGdi9mTitRQUpwWWVWeE9FNCtuWkRzS25zajhuS2NnOXQ0RGx4MUc2Z0xNMS9WcTlZeE5MYnV6dVJDMGFzVVl2ZE1ub012c3ptcG0rK1R4bmRZaXNnTllzY3BaU296N3d2Y2F6Sk5FUGZoUFZqRWtkNnRVVXVONEdNMzVIMERtS0NVUU5UK2E2QjZobUhsVFp2anhpeUdBZzViWTU5aGRqdkorMjJRZHVhemxFRUM2TEkzSHJBN3VLMFRwcGxXelMxdENJRnZUTVVoajY1REVabU5KMitaWTliUTR2c01mK0RSUjNPT0c0dCtETWxOZmpPZDN6TnYzUW9ZOTVCamZXcHJ5RndQekRxN2JDUDY3SkRzb2o3ajJUWTVGUlNyUmtENzdIMEV3bHV4MmNXZmpSVHdjTUhjZFF4eHVWME9QMGFOakdEanliRk5cIn0nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICc2NDI0YzM1M2VhZjc4ZDAwMDc2NmU5NjEzN2Q0NDA0YicsXG4gICAgICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MScsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OlxuICAgICAgICAgICAgJ3tcIml2XCI6XCJ2aTBkUGVmL1J4N2tHL3BSeVNRaTZRPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiOWVmaFFzaUV2VnM9XCIsXCJjdFwiOlwiR3c2YXR2ZjZneEt6c2p0bDN4c2VpcE8zckF4cDFtQXo3WXUxaWhGc2k1L2xmMnZNWmVnQXBnWngrcHlJTEZTOUtLTEhiTkYzVTZXZ1NZZHJyMnQ0dnpkTHNYa0gxV0l4ZkhTK2NkMkM1TjU5eUFEWkRuUEpCVDZwdi9JUnZhWWVsUDBDazNuSVlRMmhTTW04b3ArVk9XQy9TekhlaDdzbFlEcXdFSFRHYW4wV2lnZnZrMXlSZDdDQ0pUYUVBb21uYy80ZUZpMk5ZM1gzZ3QvM29weTlJQWdrbm53VUZvaG45NkVXcEVRMEY2cGJ6SC9aOFZGNmdGK0RVY3JyQnlBeEV4VVBuSFFaaUZrM1lIVS92VlY0RnhCVS9tVkFFOHhCc0JuNXVsNWU1U1VNUGZjN1RCdUpXdjRCQnlUTmc5eERTaEYvOTFZeDJuYmZVbTVkOVFtTThscEtnenpRdmNLOFBPQVBrODdnUkN1S25zR2g1dk5TMFVwcGtIYytvY2Z6UlFsR0E2anplN1F5eVFPMHJNajVMeThrV2p3azJ2SVN2S1lIWVMxTlI3VlU1NDlVSVhvN05YamF0dW5LU2MzK0lyZW9SVUhJc2hpYUxnNmhsK3B4Q0N1YzBxUTQzVjBtZElmQ2pUTjhna0dXTE5rOFI3dEFHUHo5anlhcFFQY1BFR0hnRXowQVRJaTZ5TU5XQ3NpYlMyZUxpRTF1VkVKT05vTTRsazZGUGwzUTJDSGJXMk1lRWJxalk4aGJhdzE4bU5iMnhTQkgvRndwaWlhbCtUdmkyaW1xZ25DTzRacE85YmxsS2Z0WlBjUXkwc3ROK2VHQmxiNXVmeWZsS2tEU2lDaEhZcm9HakVwbWlGaWNkZGU0OGNKc3pGNTJ1S05uZjFxNjdmQTkvUzJGQUhRYWIzRVhvanhIMkdiaytra1YyaC9UWUtGRlpTV0Mzdmk0ZThtTyt2ak1VY1IwQWRzZ1BGeUVJejBTQ0d1YmEzQ25UTE5kRXVad3NhdUFlSGt4MnZVVG5SZ0pQVmdOZWV1WG1zVkc3NlN5MmdnSkh1YWxzMEhqOFUyWGRhMHFPMVJ1RmZvQ1dmc3M5d242SEdSd1BQa2hTQi84b05ndUFxbVJWR0trZDhad3QzSXZyVGQ5ZmswL3JGRkRKS0d6N1d5TkhrWWdVbU5pR2NJdEQxMnYwang3Rlo1MkVKemwzQXYxUnlKVVFLMTgrOEVZUGgzU0dpVTlkdDdWWDBhRjB1bzZKb3VLaE9lbGRVdk1QK0F1Z1F6OGZVY2x3VFFzYmJvVmcyN1l4bzBEeUFUVndUaFc1YTU2UjZRZjVaaVFKbHVGdXpzNXk5OHJxMFM1cTA0NmxFNm8zdlZtSnBFZHdqZVNDSm9FVDVDTDRuVGdrWHlXdmhtNGVCOHUvZTY2bDNvMHFiYVN4OHE5WVltVDlFcFJjbDVUUDRUaExCS0VUWWR6VnZnNGV4alFmZWt0TWF0azVFeVVwRUloWlBYaDV2WHBKWmVzZGZPOUxKOHpUYUhCc0JqRFBVN2NkTmdRTWJlYnBhdGFSaThBMGVsMi9JSlhsK0Urb2xnQXo1ekM0aTJPMVE9PVwifScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJzY0MjRjMzUzZWFmNzhkMDAwNzY2ZTk1MTBiMTI1ZmJhJyxcbiAgICAgICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICAgICAgdHlwZTogJ3RzcycsXG4gICAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgICAnMTliZGZlMmE0YjQ5OGEwNTUxMTM4MTIzNWE4ODkyZDU0MjY3ODA3YzRhM2Y2NTRlMzEwYjkzOGI4YjQyNGZmNGFkZWRiZTkyZjRjMTQ2ZGU2NDFjNjc1MDhhOTYxMzI0Yzg1MDRjZGY4ZTBjMGFjYmI2OGQ2MTA0Y2NjY2Q3ODEnLFxuICAgICAgICAgIHZlcmlmaWVkVnNzUHJvb2Y6IHRydWUsXG4gICAgICAgICAgaXNCaXRHbzogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICBjb25zdCBhZGRyZXNzVmFsaWRhdGlvblRlc3RzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiAnMHhmOTQxYWUzY2JlNTY0NWRjY2MxNWRhODM0NmI1MzNmN2Y5MWYyMDIwODlhNTUyMTY1M2MwNjJiMmZmMTBiMzA0JyxcbiAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAndmFsaWQgMHgtcHJlZml4ZWQgYWRkcmVzcycsXG4gICAgICB9LFxuICAgICAgeyBhZGRyZXNzOiAnMHgyOTU5YmZjM2ZkYjdkYzIzZmVkOGRlYmEyZmFmYjcwZjNlNjA2YTU5JywgdmFsaWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ29sZCBmb3JtYXQgYWRkcmVzcycgfSxcbiAgICAgIHsgYWRkcmVzczogJ3dyb25nYWRkcmVzcycsIHZhbGlkOiBmYWxzZSwgZGVzY3JpcHRpb246ICdpbmNvcnJlY3RseSBmb3JtYXR0ZWQgYWRkcmVzcycgfSxcbiAgICBdO1xuXG4gICAgYWRkcmVzc1ZhbGlkYXRpb25UZXN0cy5mb3JFYWNoKCh7IGFkZHJlc3MsIHZhbGlkLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIHJldHVybiAke3ZhbGlkfSB3aGVuIHZhbGlkYXRpbmcgJHtkZXNjcmlwdGlvbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5lcXVhbCh2YWxpZCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIGlzV2FsbGV0QWRkcmVzcyB3aXRoIHZhbGlkIGFkZHJlc3MgZm9yIGluZGV4IDQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZXdBZGRyZXNzID0gJzB4M2Y0YjJhOTVkOWI2OTY5ODk4MTRmMDJmODk5Y2VlNDkxYjRkNjAwYjFiOTE4ZTk3OWNhZWMzMDdhZjRiOGRmYyc7XG4gICAgICBjb25zdCBpbmRleCA9IDQ7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgY29tbW9uS2V5Y2hhaW4sIGFkZHJlc3M6IG5ld0FkZHJlc3MsIGluZGV4LCBrZXljaGFpbnMgfTtcbiAgICAgIChhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaXNXYWxsZXRBZGRyZXNzIHdoZW4ga2V5Y2hhaW5zIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzB4Mjk1OWJmYzNmZGI3ZGMyM2ZlZDhkZWJhMmZhZmI3MGYzZTYwNmE1OSc7XG4gICAgICBjb25zdCBpbmRleCA9IDA7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgY29tbW9uS2V5Y2hhaW4sIGFkZHJlc3MsIGluZGV4IH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpc1dhbGxldEFkZHJlc3Mgd2hlbiBuZXcgYWRkcmVzcyBpcyBpbnZhbGlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd3JvbmdBZGRyZXNzID0gJ2JhZEFkZHJlc3MnO1xuICAgICAgY29uc3QgaW5kZXggPSAwO1xuXG4gICAgICBjb25zdCBwYXJhbXMgPSB7IGNvbW1vbktleWNoYWluLCBhZGRyZXNzOiB3cm9uZ0FkZHJlc3MsIGluZGV4IH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKSwge1xuICAgICAgICBtZXNzYWdlOiBgaW52YWxpZCBhZGRyZXNzOiAke3dyb25nQWRkcmVzc31gLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBNZXRob2RzJywgKCkgPT4ge1xuICAgIGxldCBmYWN0b3J5OiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5O1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rpb3RhJykpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2V4cGxhaW5UcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3NpbmcgdHhIZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAnJyB9KSxcbiAgICAgICAgICAvbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleC9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogJ2ludmFsaWRUeEhleCcgfSksXG4gICAgICAgICAgL0ZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uL1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY2FsbCBleHBsYWluVHJhbnNhY3Rpb24gb24gdHJhbnNhY3Rpb24gb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcpO1xuICAgICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3V0cHV0cycpO1xuICAgICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3V0cHV0QW1vdW50Jyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdmZWUnKTtcbiAgICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R5cGUnKTtcbiAgICAgICAgZXhwbGFuYXRpb24udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICBleHBsYW5hdGlvbi5mZWUuZmVlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5HQVNfQlVER0VULnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndmVyaWZ5VHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtaXNzaW5nIHR4SGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgICBhc3luYyAoKSA9PlxuICAgICAgICAgICAgYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICB0eFByZWJ1aWxkOiB7fSxcbiAgICAgICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogdGVzdERhdGEucmVjaXBpZW50cyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCBtYXRjaGluZyByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEhleCA9IEJ1ZmZlci5mcm9tKGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSxcbiAgICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IHRlc3REYXRhLnJlY2lwaWVudHMgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCByZWNpcGllbnRzIGNvbnRhaW5pbmcgZXh0cmEgZmllbGRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEhleCA9IEJ1ZmZlci5mcm9tKGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgICAgY29uc3QgcmVjaXBpZW50c1dpdGhFeHRyYUZpZWxkcyA9IHRlc3REYXRhLnJlY2lwaWVudHMubWFwKChyKSA9PiAoe1xuICAgICAgICAgIC4uLnIsXG4gICAgICAgICAgZXh0cmFGaWVsZDogJ3Nob3VsZCBiZSBpZ25vcmVkJyxcbiAgICAgICAgICBhbm90aGVyRmllbGQ6IDEyMyxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sXG4gICAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiByZWNpcGllbnRzV2l0aEV4dHJhRmllbGRzIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZGV0ZWN0IG1pc21hdGNoZWQgcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhIZXggPSBCdWZmZXIuZnJvbShhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICAgIGNvbnN0IG1pc21hdGNoZWRSZWNpcGllbnRzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1syXSxcbiAgICAgICAgICAgIGFtb3VudDogJzk5OTknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgYXN5bmMgKCkgPT5cbiAgICAgICAgICAgIGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9LFxuICAgICAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBtaXNtYXRjaGVkUmVjaXBpZW50cyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzL1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgcmVjaXBpZW50cyBwYXJhbWV0ZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gQnVmZmVyLmZyb20oYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9LFxuICAgICAgICAgICAgdHhQYXJhbXM6IHt9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3BhcnNlVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCBiYXNlY29pbi5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6ICdpbnZhbGlkVHhIZXgnIH0pLFxuICAgICAgICAgIC9GYWlsZWQgdG8gcmVidWlsZCB0cmFuc2FjdGlvbi9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhcnNlIHRyYW5zYWN0aW9uIHVzaW5nIEpTT04gZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcpO1xuICAgICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3V0cHV0cycpO1xuICAgICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3V0cHV0QW1vdW50Jyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdmZWUnKTtcblxuICAgICAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50cy5sZW5ndGgpO1xuICAgICAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmZvckVhY2goKG91dHB1dCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBvdXRwdXQuYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50c1tpbmRleF0uYWRkcmVzcyk7XG4gICAgICAgICAgb3V0cHV0LmFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50c1tpbmRleF0uYW1vdW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdG90YWxBbW91bnQgPSB0ZXN0RGF0YS5yZWNpcGllbnRzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyBOdW1iZXIoci5hbW91bnQpLCAwKTtcbiAgICAgICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0b3RhbEFtb3VudC50b1N0cmluZygpKTtcbiAgICAgICAgZXhwbGFuYXRpb24uZmVlLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEuR0FTX0JVREdFVC50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhcnNlIHRyYW5zYWN0aW9uIHdpdGggc2luZ2xlIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2luZ2xlUmVjaXBpZW50ID0gW3Rlc3REYXRhLnJlY2lwaWVudHNbMF1dO1xuXG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyhzaW5nbGVSZWNpcGllbnQpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgICAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoc2luZ2xlUmVjaXBpZW50WzBdLmFkZHJlc3MpO1xuICAgICAgICBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoc2luZ2xlUmVjaXBpZW50WzBdLmFtb3VudCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoc2luZ2xlUmVjaXBpZW50WzBdLmFtb3VudCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSB0cmFuc2FjdGlvbiB3aXRoIG11bHRpcGxlIHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG11bHRpcGxlUmVjaXBpZW50cyA9IFtcbiAgICAgICAgICB7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSwgYW1vdW50OiAnMTAwMCcgfSxcbiAgICAgICAgICB7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1sxXSwgYW1vdW50OiAnMjAwMCcgfSxcbiAgICAgICAgICB7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1syXSwgYW1vdW50OiAnMzAwMCcgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHMobXVsdGlwbGVSZWNpcGllbnRzKTtcbiAgICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgICAgZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKCc2MDAwJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRTaWduYWJsZVBheWxvYWQnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGdldCBzaWduYWJsZSBwYXlsb2FkIGZyb20gdHJhbnNhY3Rpb24gZGlyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHR4LnNpZ25hYmxlUGF5bG9hZDtcblxuICAgICAgICBzaWduYWJsZVBheWxvYWQuc2hvdWxkLmJlLmluc3RhbmNlT2YoQnVmZmVyKTtcbiAgICAgICAgc2lnbmFibGVQYXlsb2FkLmxlbmd0aC5zaG91bGQuZXF1YWwoMzIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGJhc2Vjb2luLmdldFNpZ25hYmxlUGF5bG9hZCgnaW52YWxpZFR4QmFzZTY0JyksXG4gICAgICAgICAgL0ZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uL1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29uc2lzdGVudCBzaWduYWJsZSBwYXlsb2FkIGZvciBpZGVudGljYWwgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIxID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eDEgPSAoYXdhaXQgdHhCdWlsZGVyMS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgdHgxLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHR4Mi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGRpZmZlcmVudCBzaWduYWJsZSBwYXlsb2FkcyBmb3IgZGlmZmVyZW50IHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMSA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHgxID0gKGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBjb25zdCBkaWZmZXJlbnRSZWNpcGllbnRzID0gW3sgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLCBhbW91bnQ6ICc1MDAwJyB9XTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyMi5yZWNpcGllbnRzKGRpZmZlcmVudFJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgICAgdHhCdWlsZGVyMi5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHR4MS5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5ub3QuZXF1YWwodHgyLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JykpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBnZXR0aW5nIHBheWxvYWQgZnJvbSBzaW11bGF0ZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCB0cnVlKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4LnNpZ25hYmxlUGF5bG9hZCkudGhyb3dFcnJvcignQ2Fubm90IHNpZ24gYSBzaW11bGF0ZSB0eCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0Q29pblNwZWNpZmljRmllbGRzSW5JbnRlbnQnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHNldCB1bnNwZW50cyBpbiBpbnRlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGludGVudCA9IHt9IGFzIGFueTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHVuc3BlbnRzOiBbXG4gICAgICAgICAgICB7IG9iamVjdElkOiAnMHgxMjMnLCB2ZXJzaW9uOiAnMScsIGRpZ2VzdDogJ2FiYycgfSxcbiAgICAgICAgICAgIHsgb2JqZWN0SWQ6ICcweDQ1NicsIHZlcnNpb246ICcyJywgZGlnZXN0OiAnZGVmJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgIGJhc2Vjb2luLnNldENvaW5TcGVjaWZpY0ZpZWxkc0luSW50ZW50KGludGVudCwgcGFyYW1zKTtcblxuICAgICAgICBpbnRlbnQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Vuc3BlbnRzJyk7XG4gICAgICAgIGludGVudC51bnNwZW50cy5zaG91bGQuZGVlcEVxdWFsKHBhcmFtcy51bnNwZW50cyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgdW5zcGVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGludGVudCA9IHt9IGFzIGFueTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyB1bnNwZW50czogW10gfSBhcyBhbnk7XG5cbiAgICAgICAgYmFzZWNvaW4uc2V0Q29pblNwZWNpZmljRmllbGRzSW5JbnRlbnQoaW50ZW50LCBwYXJhbXMpO1xuXG4gICAgICAgIGludGVudC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndW5zcGVudHMnKTtcbiAgICAgICAgaW50ZW50LnVuc3BlbnRzLnNob3VsZC5kZWVwRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCB1bnNwZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW50ZW50ID0ge30gYXMgYW55O1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgYmFzZWNvaW4uc2V0Q29pblNwZWNpZmljRmllbGRzSW5JbnRlbnQoaW50ZW50LCBwYXJhbXMpO1xuXG4gICAgICAgIGludGVudC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndW5zcGVudHMnKTtcbiAgICAgICAgKGludGVudC51bnNwZW50cyA9PT0gdW5kZWZpbmVkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gd2l0aCBHYXMgU3BvbnNvcicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBnYXMgc3BvbnNvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzU3BvbnNvcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQubm90RXF1YWwodHguc2VuZGVyLCB0eC5nYXNTcG9uc29yKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSB0cmFuc2FjdGlvbiB3aGVyZSBzZW5kZXIgYW5kIGdhcyBzcG9uc29yIGFyZSBzYW1lJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZ2FzU3BvbnNvciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gSUQgQ29uc2lzdGVuY3knLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHNhbWUgSUQgZm9yIGlkZW50aWNhbCB0cmFuc2FjdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjEgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4MSA9IChhd2FpdCB0eEJ1aWxkZXIxLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgxLmlkLCB0eDIuaWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgZGlmZmVyZW50IElEcyBmb3IgZGlmZmVyZW50IHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMSA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHgxID0gKGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBjb25zdCBkaWZmZXJlbnRSZWNpcGllbnRzID0gW3sgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLCBhbW91bnQ6ICc5OTk5JyB9XTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlcjIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyMi5yZWNpcGllbnRzKGRpZmZlcmVudFJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgICAgdHhCdWlsZGVyMi5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5ub3RFcXVhbCh0eDEuaWQsIHR4Mi5pZCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdHYXMgQ29uZmlndXJhdGlvbiBFZGdlIENhc2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWluaW11bSBnYXMgdmFsdWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBtaW5HYXNEYXRhID0ge1xuICAgICAgICAgIGdhc0J1ZGdldDogMTAwMCxcbiAgICAgICAgICBnYXNQcmljZTogMTAwLFxuICAgICAgICAgIGdhc1BheW1lbnRPYmplY3RzOiBbdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHNbMF1dLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEobWluR2FzRGF0YSk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc0J1ZGdldCwgMTAwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNQcmljZSwgMTAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1BheW1lbnRPYmplY3RzPy5sZW5ndGgsIDEpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGxhcmdlIGdhcyB2YWx1ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGxhcmdlR2FzRGF0YSA9IHtcbiAgICAgICAgICBnYXNCdWRnZXQ6IDUwMDAwMDAwMDAwLCAvLyA1MCBiaWxsaW9uXG4gICAgICAgICAgZ2FzUHJpY2U6IDEwMDAwMCxcbiAgICAgICAgICBnYXNQYXltZW50T2JqZWN0czogdGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShsYXJnZUdhc0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNCdWRnZXQsIDUwMDAwMDAwMDAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1ByaWNlLCAxMDAwMDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGdhcyBmZWUgZnJvbSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgZmVlID0gdHguZ2V0RmVlKCk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KGZlZSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChmZWUsIHRlc3REYXRhLkdBU19CVURHRVQudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdGF0ZSBNYW5hZ2VtZW50JywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCB0cmFjayBzaW11bGF0ZSBtb2RlIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQnVpbGQgd2l0aG91dCBnYXMgZGF0YSAtIHNob3VsZCBiZSBzaW11bGF0ZSBtb2RlXG4gICAgICAgIGNvbnN0IHNpbXVsYXRlQnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNpbXVsYXRlQnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICBzaW11bGF0ZUJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgICAgc2ltdWxhdGVCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcblxuICAgICAgICBjb25zdCBzaW11bGF0ZVR4ID0gKGF3YWl0IHNpbXVsYXRlQnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwoc2ltdWxhdGVUeC5pc1NpbXVsYXRlVHgsIHRydWUpO1xuXG4gICAgICAgIC8vIEJ1aWxkIHdpdGggZ2FzIGRhdGEgLSBzaG91bGQgbm90IGJlIHNpbXVsYXRlIG1vZGVcbiAgICAgICAgY29uc3QgcmVhbEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICByZWFsQnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICByZWFsQnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICByZWFsQnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICAgIHJlYWxCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgICAgY29uc3QgcmVhbFR4ID0gKGF3YWl0IHJlYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbChyZWFsVHguaXNTaW11bGF0ZVR4LCBmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgY2FuU2lnbiBiYXNlZCBvbiBzaW11bGF0ZSBtb2RlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBTaW11bGF0ZSB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgc2lnbmVkXG4gICAgICAgIGNvbnN0IHNpbXVsYXRlQnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNpbXVsYXRlQnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICBzaW11bGF0ZUJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgICAgc2ltdWxhdGVCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcblxuICAgICAgICBjb25zdCBzaW11bGF0ZVR4ID0gKGF3YWl0IHNpbXVsYXRlQnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBzaG91bGQuZXF1YWwoc2ltdWxhdGVUeC5jYW5TaWduKHt9IGFzIGFueSksIGZhbHNlKTtcblxuICAgICAgICAvLyBSZWFsIHRyYW5zYWN0aW9uIGNhbiBiZSBzaWduZWRcbiAgICAgICAgY29uc3QgcmVhbEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICByZWFsQnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICByZWFsQnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICByZWFsQnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICAgIHJlYWxCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgICAgY29uc3QgcmVhbFR4ID0gKGF3YWl0IHJlYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbChyZWFsVHguY2FuU2lnbih7fSBhcyBhbnkpLCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSB0cmFuc2FjdGlvbiB0eXBlIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gU2VyaWFsaXphdGlvbiBGb3JtYXRzJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBzZXJpYWxpemUgdG8gY29uc2lzdGVudCBicm9hZGNhc3QgZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIxID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eDEgPSAoYXdhaXQgdHhCdWlsZGVyMS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBicm9hZGNhc3QxID0gYXdhaXQgdHgxLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgYnJvYWRjYXN0MiA9IGF3YWl0IHR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChicm9hZGNhc3QxLCBicm9hZGNhc3QyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHByb2R1Y2UgdmFsaWQgYmFzZTY0IGJyb2FkY2FzdCBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IGJyb2FkY2FzdCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiBicm9hZGNhc3QsICdzdHJpbmcnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKC9eW0EtWmEtejAtOSsvXSo9ezAsMn0kLy50ZXN0KGJyb2FkY2FzdCksIHRydWUpO1xuICAgICAgICBzaG91bGQuZXF1YWwoYnJvYWRjYXN0Lmxlbmd0aCA+IDAsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShicm9hZGNhc3QsICdiYXNlNjQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGRlY29kZWQubGVuZ3RoID4gMCwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBtYWludGFpbiBKU09OIHNlcmlhbGl6YXRpb24gY29uc2lzdGVuY3knLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IGpzb24xID0gdHgudG9Kc29uKCk7XG4gICAgICAgIGNvbnN0IGpzb24yID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uMSwganNvbjIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
1101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhDQUEwRDtBQUMxRCw0Q0FBMEM7QUFDMUMsbUNBQWlGO0FBQ2pGLG9EQUE0QjtBQUM1Qiw0Q0FBMkQ7QUFDM0QsNERBQThDO0FBQzlDLDhDQUFrRDtBQUNsRCx1REFBcUU7QUFDckUsa0RBQTBCO0FBQzFCLDRDQUF5QztBQUV6QyxRQUFRLENBQUMsT0FBTyxFQUFFO0lBQ2hCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQVEsQ0FBQztJQUViLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtRQUNqQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQXVCLENBQUM7UUFDNUQsTUFBTSxZQUFZLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQXVCLENBQUM7UUFFOUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakQsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUQsWUFBWSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0QsV0FBVyxDQUFDLHFDQUFxQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsWUFBWSxDQUFDLHFDQUFxQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7UUFDMUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUMsTUFB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QUksQ0FBQyxTQUFTLEVBQUUsYUFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU1RSxNQUFNLFFBQVE7aUJBQ1gscUJBQXFCLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxXQUFJLENBQUMsT0FBTztnQkFDckIsU0FBUyxFQUFFLFdBQUksQ0FBQyxTQUFTO2dCQUN6QixRQUFRLEVBQUUsV0FBSSxDQUFDLFFBQVE7Z0JBQ3ZCLGdCQUFnQjtnQkFDaEIsaUJBQWlCLEVBQUUsQ0FBQztnQkFDcEIsZUFBZSxFQUFFLENBQUM7YUFDbkIsQ0FBQztpQkFDRCxNQUFNLENBQUMsWUFBWSxDQUNsQiwwR0FBMEcsQ0FDM0csQ0FBQztZQUVKLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBJb3RhLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNvaW5zLCBHYXNUYW5rQWNjb3VudENvaW4gfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvaW90YSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcyB9IGZyb20gJy4vaGVscGVycy90ZXN0SGVscGVycyc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsga2V5cyB9IGZyb20gJy4uL3Jlc291cmNlcy9pb3RhJztcblxuZGVzY3JpYmUoJ0lPVEE6JywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdpb3RhJywgSW90YS5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0aW90YScsIElvdGEuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGlvdGEnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGluZm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW90YSA9IGJpdGdvLmNvaW4oJ2lvdGEnKTtcbiAgICBjb25zdCB0aW90YSA9IGJpdGdvLmNvaW4oJ3Rpb3RhJyk7XG4gICAgY29uc3QgaW90YVN0YXRpY3MgPSBjb2lucy5nZXQoJ2lvdGEnKSBhcyBHYXNUYW5rQWNjb3VudENvaW47XG4gICAgY29uc3QgdGlvdGFTdGF0aWNzID0gY29pbnMuZ2V0KCd0aW90YScpIGFzIEdhc1RhbmtBY2NvdW50Q29pbjtcblxuICAgIGlvdGEuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ2lvdGEnKTtcbiAgICBpb3RhLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnaW90YScpO1xuICAgIGlvdGEuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ0lvdGEnKTtcbiAgICBpb3RhLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWU5KTtcblxuICAgIHRpb3RhLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd0aW90YScpO1xuICAgIHRpb3RhLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnaW90YScpO1xuICAgIHRpb3RhLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IElvdGEnKTtcbiAgICB0aW90YS5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlOSk7XG5cbiAgICBpb3RhU3RhdGljcy5nYXNUYW5rTG93QmFsYW5jZUFsZXJ0RmFjdG9yLnNob3VsZC5lcXVhbCg4MCk7XG4gICAgdGlvdGFTdGF0aWNzLmdhc1RhbmtMb3dCYWxhbmNlQWxlcnRGYWN0b3Iuc2hvdWxkLmVxdWFsKDgwKTtcbiAgICBpb3RhU3RhdGljcy5nYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yLnNob3VsZC5lcXVhbCgyMDApO1xuICAgIHRpb3RhU3RhdGljcy5nYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yLnNob3VsZC5lcXVhbCgyMDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgYWNjb3VudCBjb25zb2xpZGF0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdpcyB2YWxpZCBwdWInLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gd2l0aCAweCBwcmVmaXhcbiAgICBiYXNlY29pbi5pc1ZhbGlkUHViKCcweDliNGU5NjA4NmQxMTE1MDAyNTlmOWIzODY4MGIwNTA5YTQwNWMxOTA0ZGExODk3NjQ1NWEyMGM2OTFkM2JiMDcnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIC8vIHdpdGhvdXQgMHggcHJlZml4XG4gICAgYmFzZWNvaW4uaXNWYWxpZFB1YignOWI0ZTk2MDg2ZDExMTUwMDI1OWY5YjM4NjgwYjA1MDlhNDA1YzE5MDRkYTE4OTc2NDU1YTIwYzY5MWQzYmIwNycpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0FkZHJlc3MgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBsZXQga2V5Y2hhaW5zO1xuICAgIGxldCBjb21tb25LZXljaGFpbjtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICBjb21tb25LZXljaGFpbiA9XG4gICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MSc7XG4gICAgICBrZXljaGFpbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJzY0MjRjMzUzZWFmNzhkMDAwNzY2ZTk1OTQ5ODY4NDY4JyxcbiAgICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MScsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OlxuICAgICAgICAgICAgJ3tcIml2XCI6XCJjWmQ1aTdMNFJ4dHdyQUxXMnJLN1VBPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiNXpnb0gxQmQzRnc9XCIsXCJjdFwiOlwiOXZWbG5YRlJ0ck05RlZFbytkMmNoYkdIbE05bEZaZW11ZUJ1QXMzQklrUG8zM0ZvN2p6d3dOSy9rSVdrRXlnK05tRUJkNUlhcUFTMTU3bnZ2dnd6enNtTVdsUWRVejlxYm1YTnYzcGc5ODdjWEZSMDhleFMrNHVod1AxWU5PakpUUnZSTmNPOVpxSGI0NmQ0Zm15Si95Qzkvc3VzQ2dlN3IvRXNiYU41QzNhZnYxZHp5YnVxOTEyRndhUUVsWkxZWXA1QklDdWRGT01aOWswVURNZktNL1BNRGtIN1dleG9HSHI5R0txL2JnQ0gyQjM5VFpaeUhLVTZVeTQ3bFhlcDJzNmgwRHJNd0hPcm5taUwzRFpqT2o4OFludnBobHp4dW80ZU9sRDJVSGlhMitudklhSVNZczI5UHIwREF2UkV1dGNodmNCcEV4ajFrV1dQdjdoUVlydjhGME5BZGF0c2JXbDN3K3hLeWZpTUtvMVVTbHJ3eUp2aXlwR3RRdFhPSnl3MFhQTjBydjIrTDVsVzhCYmpwekhmWVlOMTNmSlRlZGxHVEZoaGt6VnRiYlBBS0UwMmt4N3pDSmNqWWFpZXhkU1RzckRMU2NZTlQ5L0poZHQyN0twc29vZWh3Vm9oTGZTS3o0dmJGZlJ1Mk1QWnczLytjL2hmaUpOZ3R6NmVzV2JueEdyY0U4VTJJd1BZQ2FLK0doazREY3FXTkluaTU5Ukk1QjVrQXNRT1RvSUk0MHFQTjUxMHVUZ3hCU1BPN3E3TUhna3hkZDRDcUJxK29qcjlqMFA3b2FvOEU1WStDQkRKcm9qRG9DaDFvQ0NEVzl2bzJkWGxWY0Q4U0lidzdVLzlBZnZFYkE0eHlFLzVtZDFNN0NJd0xuV3MyWW52MFl0YUtvcWhkUzl4NkZtSGxNRGhOL0RLSGlucndtb3d0clRUODJmT2twTzVnOXNhU21nVTdReTNnTHQ4dCtWd2RFeWVGZVFVS1JTeWNpOHFncVhRYVpJZzQrYVhnYVNPbmxDRk10bUI4ZWtZeEVoVFk1dXpSZnJOZ1M0czFRZXFGQnBOdFVGK1lkaTI5N3BiVlhuSm9YQU4rU1ZXZDgwR0N4K3lJMmRwVkM4OWszck9XSzlXZXlxbG56dUxKV3AyUklPQjljZFc4R0Z2L2ZOK1FBSnBZZVZ4T0U0K25aRHNLbnNqOG5LY2c5dDREbHgxRzZnTE0xL1ZxOVl4TkxidXp1UkMwYXNVWXZkTW5vTXZzem1wbSsrVHhuZFlpc2dOWXNjcFpTb3o3d3ZjYXpKTkVQZmhQVmpFa2Q2dFVVdU40R00zNUgwRG1LQ1VRTlQrYTZCNmhtSGxUWnZqeGl5R0FnNWJZNTloZGp2SisyMlFkdWF6bEVFQzZMSTNIckE3dUswVHBwbFd6UzF0Q0lGdlRNVWhqNjVERVptTkoyK1pZOWJRNHZzTWYrRFJSM09PRzR0K0RNbE5mak9kM3pOdjNRb1k5NUJqZldwcnlGd1B6RHE3YkNQNjdKRHNvajdqMlRZNUZSU3JSa0Q3N0gwRXdsdXgyY1dmalJUd2NNSGNkUXh4dVYwT1AwYU5qR0RqeWJGTlwifScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJzY0MjRjMzUzZWFmNzhkMDAwNzY2ZTk2MTM3ZDQ0MDRiJyxcbiAgICAgICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgICAgIHR5cGU6ICd0c3MnLFxuICAgICAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAgICAgJzE5YmRmZTJhNGI0OThhMDU1MTEzODEyMzVhODg5MmQ1NDI2NzgwN2M0YTNmNjU0ZTMxMGI5MzhiOGI0MjRmZjRhZGVkYmU5MmY0YzE0NmRlNjQxYzY3NTA4YTk2MTMyNGM4NTA0Y2RmOGUwYzBhY2JiNjhkNjEwNGNjY2NkNzgxJyxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6XG4gICAgICAgICAgICAne1wiaXZcIjpcInZpMGRQZWYvUng3a0cvcFJ5U1FpNlE9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCI6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCI5ZWZoUXNpRXZWcz1cIixcImN0XCI6XCJHdzZhdHZmNmd4S3pzanRsM3hzZWlwTzNyQXhwMW1BejdZdTFpaEZzaTUvbGYydk1aZWdBcGdaeCtweUlMRlM5S0tMSGJORjNVNldnU1lkcnIydDR2emRMc1hrSDFXSXhmSFMrY2QyQzVONTl5QURaRG5QSkJUNnB2L0lSdmFZZWxQMENrM25JWVEyaFNNbThvcCtWT1dDL1N6SGVoN3NsWURxd0VIVEdhbjBXaWdmdmsxeVJkN0NDSlRhRUFvbW5jLzRlRmkyTlkzWDNndC8zb3B5OUlBZ2tubndVRm9objk2RVdwRVEwRjZwYnpIL1o4VkY2Z0YrRFVjcnJCeUF4RXhVUG5IUVppRmszWUhVL3ZWVjRGeEJVL21WQUU4eEJzQm41dWw1ZTVTVU1QZmM3VEJ1Sld2NEJCeVROZzl4RFNoRi85MVl4Mm5iZlVtNWQ5UW1NOGxwS2d6elF2Y0s4UE9BUGs4N2dSQ3VLbnNHaDV2TlMwVXBwa0hjK29jZnpSUWxHQTZqemU3UXl5UU8wck1qNUx5OGtXandrMnZJU3ZLWUhZUzFOUjdWVTU0OVVJWG83TlhqYXR1bktTYzMrSXJlb1JVSElzaGlhTGc2aGwrcHhDQ3VjMHFRNDNWMG1kSWZDalROOGdrR1dMTms4Ujd0QUdQejlqeWFwUVBjUEVHSGdFejBBVElpNnlNTldDc2liUzJlTGlFMXVWRUpPTm9NNGxrNkZQbDNRMkNIYlcyTWVFYnFqWThoYmF3MThtTmIyeFNCSC9Gd3BpaWFsK1R2aTJpbXFnbkNPNFpwTzlibGxLZnRaUGNReTBzdE4rZUdCbGI1dWZ5ZmxLa0RTaUNoSFlyb0dqRXBtaUZpY2RkZTQ4Y0pzekY1MnVLTm5mMXE2N2ZBOS9TMkZBSFFhYjNFWG9qeEgyR2JrK2trVjJoL1RZS0ZGWlNXQzN2aTRlOG1PK3ZqTVVjUjBBZHNnUEZ5RUl6MFNDR3ViYTNDblRMTmRFdVp3c2F1QWVIa3gydlVUblJnSlBWZ05lZXVYbXNWRzc2U3kyZ2dKSHVhbHMwSGo4VTJYZGEwcU8xUnVGZm9DV2Zzczl3bjZIR1J3UFBraFNCLzhvTmd1QXFtUlZHS2tkOFp3dDNJdnJUZDlmazAvckZGREpLR3o3V3lOSGtZZ1VtTmlHY0l0RDEydjBqeDdGWjUyRUp6bDNBdjFSeUpVUUsxOCs4RVlQaDNTR2lVOWR0N1ZYMGFGMHVvNkpvdUtoT2VsZFV2TVArQXVnUXo4ZlVjbHdUUXNiYm9WZzI3WXhvMER5QVRWd1RoVzVhNTZSNlFmNVppUUpsdUZ1enM1eTk4cnEwUzVxMDQ2bEU2bzN2Vm1KcEVkd2plU0NKb0VUNUNMNG5UZ2tYeVd2aG00ZUI4dS9lNjZsM28wcWJhU3g4cTlZWW1UOUVwUmNsNVRQNFRoTEJLRVRZZHpWdmc0ZXhqUWZla3RNYXRrNUV5VXBFSWhaUFhoNXZYcEpaZXNkZk85TEo4elRhSEJzQmpEUFU3Y2ROZ1FNYmVicGF0YVJpOEEwZWwyL0lKWGwrRStvbGdBejV6QzRpMk8xUT09XCJ9JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnNjQyNGMzNTNlYWY3OGQwMDA3NjZlOTUxMGIxMjVmYmEnLFxuICAgICAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICAgICcxOWJkZmUyYTRiNDk4YTA1NTExMzgxMjM1YTg4OTJkNTQyNjc4MDdjNGEzZjY1NGUzMTBiOTM4YjhiNDI0ZmY0YWRlZGJlOTJmNGMxNDZkZTY0MWM2NzUwOGE5NjEzMjRjODUwNGNkZjhlMGMwYWNiYjY4ZDYxMDRjY2NjZDc4MScsXG4gICAgICAgICAgdmVyaWZpZWRWc3NQcm9vZjogdHJ1ZSxcbiAgICAgICAgICBpc0JpdEdvOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFkZHJlc3NWYWxpZGF0aW9uVGVzdHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6ICcweGY5NDFhZTNjYmU1NjQ1ZGNjYzE1ZGE4MzQ2YjUzM2Y3ZjkxZjIwMjA4OWE1NTIxNjUzYzA2MmIyZmYxMGIzMDQnLFxuICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICd2YWxpZCAweC1wcmVmaXhlZCBhZGRyZXNzJyxcbiAgICAgIH0sXG4gICAgICB7IGFkZHJlc3M6ICcweDI5NTliZmMzZmRiN2RjMjNmZWQ4ZGViYTJmYWZiNzBmM2U2MDZhNTknLCB2YWxpZDogZmFsc2UsIGRlc2NyaXB0aW9uOiAnb2xkIGZvcm1hdCBhZGRyZXNzJyB9LFxuICAgICAgeyBhZGRyZXNzOiAnd3JvbmdhZGRyZXNzJywgdmFsaWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ2luY29ycmVjdGx5IGZvcm1hdHRlZCBhZGRyZXNzJyB9LFxuICAgIF07XG5cbiAgICBhZGRyZXNzVmFsaWRhdGlvblRlc3RzLmZvckVhY2goKHsgYWRkcmVzcywgdmFsaWQsIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgcmV0dXJuICR7dmFsaWR9IHdoZW4gdmFsaWRhdGluZyAke2Rlc2NyaXB0aW9ufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxdWFsKHZhbGlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgaXNXYWxsZXRBZGRyZXNzIHdpdGggdmFsaWQgYWRkcmVzcyBmb3IgaW5kZXggNCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAnMHgzZjRiMmE5NWQ5YjY5Njk4OTgxNGYwMmY4OTljZWU0OTFiNGQ2MDBiMWI5MThlOTc5Y2FlYzMwN2FmNGI4ZGZjJztcbiAgICAgIGNvbnN0IGluZGV4ID0gNDtcblxuICAgICAgY29uc3QgcGFyYW1zID0geyBjb21tb25LZXljaGFpbiwgYWRkcmVzczogbmV3QWRkcmVzcywgaW5kZXgsIGtleWNoYWlucyB9O1xuICAgICAgKGF3YWl0IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyhwYXJhbXMpKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpc1dhbGxldEFkZHJlc3Mgd2hlbiBrZXljaGFpbnMgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnMHgyOTU5YmZjM2ZkYjdkYzIzZmVkOGRlYmEyZmFmYjcwZjNlNjA2YTU5JztcbiAgICAgIGNvbnN0IGluZGV4ID0gMDtcblxuICAgICAgY29uc3QgcGFyYW1zID0geyBjb21tb25LZXljaGFpbiwgYWRkcmVzcywgaW5kZXggfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyhwYXJhbXMpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGlzV2FsbGV0QWRkcmVzcyB3aGVuIG5ldyBhZGRyZXNzIGlzIGludmFsaWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3cm9uZ0FkZHJlc3MgPSAnYmFkQWRkcmVzcyc7XG4gICAgICBjb25zdCBpbmRleCA9IDA7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgY29tbW9uS2V5Y2hhaW4sIGFkZHJlc3M6IHdyb25nQWRkcmVzcywgaW5kZXggfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyhwYXJhbXMpLCB7XG4gICAgICAgIG1lc3NhZ2U6IGBpbnZhbGlkIGFkZHJlc3M6ICR7d3JvbmdBZGRyZXNzfWAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIE1ldGhvZHMnLCAoKSA9PiB7XG4gICAgbGV0IGZhY3Rvcnk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnk7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGlvdGEnKSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZXhwbGFpblRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWlzc2luZyB0eEhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6ICcnIH0pLFxuICAgICAgICAgIC9taXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4L1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAnaW52YWxpZFR4SGV4JyB9KSxcbiAgICAgICAgICAvRmFpbGVkIHRvIHJlYnVpbGQgdHJhbnNhY3Rpb24vXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBjYWxsIGV4cGxhaW5UcmFuc2FjdGlvbiBvbiB0cmFuc2FjdGlvbiBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2lkJyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdvdXRwdXRzJyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdvdXRwdXRBbW91bnQnKTtcbiAgICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZScpO1xuICAgICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHlwZScpO1xuICAgICAgICBleHBsYW5hdGlvbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLmZlZS5mZWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkdBU19CVURHRVQudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd2ZXJpZnlUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3NpbmcgdHhIZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgIGFzeW5jICgpID0+XG4gICAgICAgICAgICBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAgIHR4UHJlYnVpbGQ6IHt9LFxuICAgICAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiB0ZXN0RGF0YS5yZWNpcGllbnRzIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleC9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHZlcmlmeSB0cmFuc2FjdGlvbiB3aXRoIG1hdGNoaW5nIHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gQnVmZmVyLmZyb20oYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9LFxuICAgICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogdGVzdERhdGEucmVjaXBpZW50cyB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHZlcmlmeSB0cmFuc2FjdGlvbiB3aXRoIHJlY2lwaWVudHMgY29udGFpbmluZyBleHRyYSBmaWVsZHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gQnVmZmVyLmZyb20oYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgICBjb25zdCByZWNpcGllbnRzV2l0aEV4dHJhRmllbGRzID0gdGVzdERhdGEucmVjaXBpZW50cy5tYXAoKHIpID0+ICh7XG4gICAgICAgICAgLi4ucixcbiAgICAgICAgICBleHRyYUZpZWxkOiAnc2hvdWxkIGJlIGlnbm9yZWQnLFxuICAgICAgICAgIGFub3RoZXJGaWVsZDogMTIzLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSxcbiAgICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IHJlY2lwaWVudHNXaXRoRXh0cmFGaWVsZHMgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBkZXRlY3QgbWlzbWF0Y2hlZCByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEhleCA9IEJ1ZmZlci5mcm9tKGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgICAgY29uc3QgbWlzbWF0Y2hlZFJlY2lwaWVudHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzJdLFxuICAgICAgICAgICAgYW1vdW50OiAnOTk5OScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgICBhc3luYyAoKSA9PlxuICAgICAgICAgICAgYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sXG4gICAgICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IG1pc21hdGNoZWRSZWNpcGllbnRzIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aG91dCByZWNpcGllbnRzIHBhcmFtZXRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhIZXggPSBCdWZmZXIuZnJvbShhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sXG4gICAgICAgICAgICB0eFBhcmFtczoge30sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncGFyc2VUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGJhc2Vjb2luLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogJ2ludmFsaWRUeEhleCcgfSksXG4gICAgICAgICAgL0ZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uL1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFyc2UgdHJhbnNhY3Rpb24gdXNpbmcgSlNPTiBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2lkJyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdvdXRwdXRzJyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdvdXRwdXRBbW91bnQnKTtcbiAgICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZScpO1xuXG4gICAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHMuZm9yRWFjaCgob3V0cHV0LCBpbmRleCkgPT4ge1xuICAgICAgICAgIG91dHB1dC5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzW2luZGV4XS5hZGRyZXNzKTtcbiAgICAgICAgICBvdXRwdXQuYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzW2luZGV4XS5hbW91bnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRlc3REYXRhLnJlY2lwaWVudHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIE51bWJlcihyLmFtb3VudCksIDApO1xuICAgICAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRvdGFsQW1vdW50LnRvU3RyaW5nKCkpO1xuICAgICAgICBleHBsYW5hdGlvbi5mZWUuZmVlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5HQVNfQlVER0VULnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcGFyc2UgdHJhbnNhY3Rpb24gd2l0aCBzaW5nbGUgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaW5nbGVSZWNpcGllbnQgPSBbdGVzdERhdGEucmVjaXBpZW50c1swXV07XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHNpbmdsZVJlY2lwaWVudCk7XG4gICAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChzaW5nbGVSZWNpcGllbnRbMF0uYWRkcmVzcyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChzaW5nbGVSZWNpcGllbnRbMF0uYW1vdW50KTtcbiAgICAgICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbChzaW5nbGVSZWNpcGllbnRbMF0uYW1vdW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhcnNlIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgbXVsdGlwbGVSZWNpcGllbnRzID0gW1xuICAgICAgICAgIHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLCBhbW91bnQ6ICcxMDAwJyB9LFxuICAgICAgICAgIHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdLCBhbW91bnQ6ICcyMDAwJyB9LFxuICAgICAgICAgIHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzJdLCBhbW91bnQ6ICczMDAwJyB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyhtdWx0aXBsZVJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgICAgICBleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoJzYwMDAnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldFNpZ25hYmxlUGF5bG9hZCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZ2V0IHNpZ25hYmxlIHBheWxvYWQgZnJvbSB0cmFuc2FjdGlvbiBkaXJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gdHguc2lnbmFibGVQYXlsb2FkO1xuXG4gICAgICAgIHNpZ25hYmxlUGF5bG9hZC5zaG91bGQuYmUuaW5zdGFuY2VPZihCdWZmZXIpO1xuICAgICAgICBzaWduYWJsZVBheWxvYWQubGVuZ3RoLnNob3VsZC5lcXVhbCgzMik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgYmFzZWNvaW4uZ2V0U2lnbmFibGVQYXlsb2FkKCdpbnZhbGlkVHhCYXNlNjQnKSxcbiAgICAgICAgICAvRmFpbGVkIHRvIHJlYnVpbGQgdHJhbnNhY3Rpb24vXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBjb25zaXN0ZW50IHNpZ25hYmxlIHBheWxvYWQgZm9yIGlkZW50aWNhbCB0cmFuc2FjdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjEgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4MSA9IChhd2FpdCB0eEJ1aWxkZXIxLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICB0eDEuc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwodHgyLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JykpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgZGlmZmVyZW50IHNpZ25hYmxlIHBheWxvYWRzIGZvciBkaWZmZXJlbnQgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIxID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eDEgPSAoYXdhaXQgdHhCdWlsZGVyMS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIGNvbnN0IGRpZmZlcmVudFJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJzUwMDAnIH1dO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIyLnJlY2lwaWVudHMoZGlmZmVyZW50UmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlcjIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgdHgxLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4Jykuc2hvdWxkLm5vdC5lcXVhbCh0eDIuc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGdldHRpbmcgcGF5bG9hZCBmcm9tIHNpbXVsYXRlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIHRydWUpO1xuICAgICAgICBzaG91bGQoKCkgPT4gdHguc2lnbmFibGVQYXlsb2FkKS50aHJvd0Vycm9yKCdDYW5ub3Qgc2lnbiBhIHNpbXVsYXRlIHR4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgc2V0IHVuc3BlbnRzIGluIGludGVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW50ZW50ID0ge30gYXMgYW55O1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdW5zcGVudHM6IFtcbiAgICAgICAgICAgIHsgb2JqZWN0SWQ6ICcweDEyMycsIHZlcnNpb246ICcxJywgZGlnZXN0OiAnYWJjJyB9LFxuICAgICAgICAgICAgeyBvYmplY3RJZDogJzB4NDU2JywgdmVyc2lvbjogJzInLCBkaWdlc3Q6ICdkZWYnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgYmFzZWNvaW4uc2V0Q29pblNwZWNpZmljRmllbGRzSW5JbnRlbnQoaW50ZW50LCBwYXJhbXMpO1xuXG4gICAgICAgIGludGVudC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndW5zcGVudHMnKTtcbiAgICAgICAgaW50ZW50LnVuc3BlbnRzLnNob3VsZC5kZWVwRXF1YWwocGFyYW1zLnVuc3BlbnRzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSB1bnNwZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW50ZW50ID0ge30gYXMgYW55O1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IHVuc3BlbnRzOiBbXSB9IGFzIGFueTtcblxuICAgICAgICBiYXNlY29pbi5zZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQsIHBhcmFtcyk7XG5cbiAgICAgICAgaW50ZW50LnNob3VsZC5oYXZlLnByb3BlcnR5KCd1bnNwZW50cycpO1xuICAgICAgICBpbnRlbnQudW5zcGVudHMuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5kZWZpbmVkIHVuc3BlbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbnRlbnQgPSB7fSBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9IGFzIGFueTtcblxuICAgICAgICBiYXNlY29pbi5zZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQsIHBhcmFtcyk7XG5cbiAgICAgICAgaW50ZW50LnNob3VsZC5oYXZlLnByb3BlcnR5KCd1bnNwZW50cycpO1xuICAgICAgICAoaW50ZW50LnVuc3BlbnRzID09PSB1bmRlZmluZWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiB3aXRoIEdhcyBTcG9uc29yJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB3aXRoIGdhcyBzcG9uc29yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1Nwb25zb3IsIHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5ub3RFcXVhbCh0eC5zZW5kZXIsIHR4Lmdhc1Nwb25zb3IpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHRyYW5zYWN0aW9uIHdoZXJlIHNlbmRlciBhbmQgZ2FzIHNwb25zb3IgYXJlIHNhbWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBJRCBDb25zaXN0ZW5jeScsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgc2FtZSBJRCBmb3IgaWRlbnRpY2FsIHRyYW5zYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyMSA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgICAgY29uc3QgdHgxID0gKGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eDEuaWQsIHR4Mi5pZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBkaWZmZXJlbnQgSURzIGZvciBkaWZmZXJlbnQgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIxID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eDEgPSAoYXdhaXQgdHhCdWlsZGVyMS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIGNvbnN0IGRpZmZlcmVudFJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJzk5OTknIH1dO1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyMi5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIyLnJlY2lwaWVudHMoZGlmZmVyZW50UmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlcjIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgc2hvdWxkLm5vdEVxdWFsKHR4MS5pZCwgdHgyLmlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0dhcyBDb25maWd1cmF0aW9uIEVkZ2UgQ2FzZXMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBtaW5pbXVtIGdhcyB2YWx1ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG1pbkdhc0RhdGEgPSB7XG4gICAgICAgICAgZ2FzQnVkZ2V0OiAxMDAwLFxuICAgICAgICAgIGdhc1ByaWNlOiAxMDAsXG4gICAgICAgICAgZ2FzUGF5bWVudE9iamVjdHM6IFt0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0c1swXV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShtaW5HYXNEYXRhKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHguZ2FzQnVkZ2V0LCAxMDAwKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1ByaWNlLCAxMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZ2FzUGF5bWVudE9iamVjdHM/Lmxlbmd0aCwgMSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgZ2FzIHZhbHVlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgbGFyZ2VHYXNEYXRhID0ge1xuICAgICAgICAgIGdhc0J1ZGdldDogNTAwMDAwMDAwMDAsIC8vIDUwIGJpbGxpb25cbiAgICAgICAgICBnYXNQcmljZTogMTAwMDAwLFxuICAgICAgICAgIGdhc1BheW1lbnRPYmplY3RzOiB0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0cyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKGxhcmdlR2FzRGF0YSk7XG5cbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc0J1ZGdldCwgNTAwMDAwMDAwMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguZ2FzUHJpY2UsIDEwMDAwMCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZ2FzIGZlZSBmcm9tIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBmZWUgPSB0eC5nZXRGZWUoKTtcblxuICAgICAgICBzaG91bGQuZXhpc3QoZmVlKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGZlZSwgdGVzdERhdGEuR0FTX0JVREdFVC50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFN0YXRlIE1hbmFnZW1lbnQnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHRyYWNrIHNpbXVsYXRlIG1vZGUgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBCdWlsZCB3aXRob3V0IGdhcyBkYXRhIC0gc2hvdWxkIGJlIHNpbXVsYXRlIG1vZGVcbiAgICAgICAgY29uc3Qgc2ltdWxhdGVCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2ltdWxhdGVCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHNpbXVsYXRlQnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICBzaW11bGF0ZUJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICAgIGNvbnN0IHNpbXVsYXRlVHggPSAoYXdhaXQgc2ltdWxhdGVCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbChzaW11bGF0ZVR4LmlzU2ltdWxhdGVUeCwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gQnVpbGQgd2l0aCBnYXMgZGF0YSAtIHNob3VsZCBub3QgYmUgc2ltdWxhdGUgbW9kZVxuICAgICAgICBjb25zdCByZWFsQnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHJlYWxCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHJlYWxCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAgIHJlYWxCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgICAgcmVhbEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBjb25zdCByZWFsVHggPSAoYXdhaXQgcmVhbEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlYWxUeC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBjYW5TaWduIGJhc2VkIG9uIHNpbXVsYXRlIG1vZGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSBzaWduZWRcbiAgICAgICAgY29uc3Qgc2ltdWxhdGVCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2ltdWxhdGVCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHNpbXVsYXRlQnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICBzaW11bGF0ZUJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICAgIGNvbnN0IHNpbXVsYXRlVHggPSAoYXdhaXQgc2ltdWxhdGVCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIHNob3VsZC5lcXVhbChzaW11bGF0ZVR4LmNhblNpZ24oe30gYXMgYW55KSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIFJlYWwgdHJhbnNhY3Rpb24gY2FuIGJlIHNpZ25lZFxuICAgICAgICBjb25zdCByZWFsQnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHJlYWxCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHJlYWxCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAgIHJlYWxCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgICAgcmVhbEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBjb25zdCByZWFsVHggPSAoYXdhaXQgcmVhbEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJlYWxUeC5jYW5TaWduKHt9IGFzIGFueSksIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHRyYW5zYWN0aW9uIHR5cGUgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTZXJpYWxpemF0aW9uIEZvcm1hdHMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSB0byBjb25zaXN0ZW50IGJyb2FkY2FzdCBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlcjEgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICAgIGNvbnN0IHR4MSA9IChhd2FpdCB0eEJ1aWxkZXIxLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IGJyb2FkY2FzdDEgPSBhd2FpdCB0eDEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBjb25zdCB0eEJ1aWxkZXIyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBicm9hZGNhc3QyID0gYXdhaXQgdHgyLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKGJyb2FkY2FzdDEsIGJyb2FkY2FzdDIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcHJvZHVjZSB2YWxpZCBiYXNlNjQgYnJvYWRjYXN0IGZvcm1hdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgYnJvYWRjYXN0ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHlwZW9mIGJyb2FkY2FzdCwgJ3N0cmluZycpO1xuICAgICAgICBzaG91bGQuZXF1YWwoL15bQS1aYS16MC05Ky9dKj17MCwyfSQvLnRlc3QoYnJvYWRjYXN0KSwgdHJ1ZSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChicm9hZGNhc3QubGVuZ3RoID4gMCwgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKGJyb2FkY2FzdCwgJ2Jhc2U2NCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZC5sZW5ndGggPiAwLCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG1haW50YWluIEpTT04gc2VyaWFsaXphdGlvbiBjb25zaXN0ZW5jeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QganNvbjEgPSB0eC50b0pzb24oKTtcbiAgICAgICAgY29uc3QganNvbjIgPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24xLCBqc29uMik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVHJhbnNhY3Rpb25zOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4ZmQzNmQyYWQ0OGVkZjU2NzFhYmYwNGY1YzBlZWYzNDY0YmY5MmNmNDVhZTY1NWFmZjQ3MWNmYWVkYjYxZmE5OSc7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICcweGRhOTdlMTY2ZDQwZmE2YTBjOTQ5YjZhZWI4NjJlMzkxYzI5MTM5YjU2M2FlMDQzMGIyNDE5YzU4OWEwMmE2ZTAnO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdnZXRCYWxhbmNlJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygxOTAwMDAwMDAwbik7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaE93bmVkT2JqZWN0cycgYXMga2V5b2YgSW90YSkucmVzb2x2ZXMoW1xuICAgICAgICB7XG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGMwNWM3NjVlMjZlNmFlODRjNzhmYTI0NWYzOGEyM2ZiMjA0MDZhNWNmM2Y2MWI1N2JkMzIzYTBkZjlkOTgwMDMnLFxuICAgICAgICAgIHZlcnNpb246ICcxOTUnLFxuICAgICAgICAgIGRpZ2VzdDogJzdCSkxiMzJMS043d3Q1dXY0eGdYVzRBYkZLb01OY1BFNzZvNDFUUUV2VVpiJyxcbiAgICAgICAgICBiYWxhbmNlOiAnMTkwMDAwMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2ZldGNoR2FzUHJpY2UnIGFzIGtleW9mIElvdGEpLnJlc29sdmVzKDEwMDApO1xuICAgICAgc2FuZEJveC5zdHViKElvdGEucHJvdG90eXBlLCAnZXN0aW1hdGVHYXMnIGFzIGtleW9mIElvdGEpLnJlc29sdmVzKDE5OTc4ODApO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTg5NzgwMjMzMicpO1xuICAgICAgdHguc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWhjS2g1eEFBQUFBQUFnMnBmaFp0UVBwcURKU2JhdXVHTGprY0tST2JWanJnUXdza0djV0pvQ3B1QUNBZ0FCQVFBQUFRRURBQUFBQUFFQkFQMDIwcTFJN2ZWbkdyOEU5Y0R1ODBaTCtTejBXdVpWci9SeHo2N2JZZnFaQWNCY2RsNG01cTZFeDQraVJmT0tJL3NnUUdwYzgvWWJWNzB5T2czNTJZQUR3d0FBQUFBQUFBQWdXOG1Ja0YwUUNHTFhoekZ4S3Y4ZFFpRUZreHNzeDNpdHpOUk1Jd2h2ZFNiOU50S3RTTzMxWnhxL0JQWEE3dk5HUy9rczlGcm1WYS8wY2MrdTIySDZtZWdEQUFBQUFBQUFwSWdoQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZmV0Y2hPd25lZE9iamVjdHMsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmVzdGltYXRlR2FzLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHR4biBmb3IgdW5zaWduZWQgc3dlZXAgcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3R4UmVxdWVzdHMnKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIHVuc2lnbmVkVHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHVuc2lnbmVkVHguY29pbi5zaG91bGQuZXF1YWwoJ3Rpb3RhJyk7XG4gICAgICB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoLnNob3VsZC5lcXVhbCgnbS8wJyk7XG4gICAgICB1bnNpZ25lZFR4LnBhcnNlZFR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChzZW5kZXJBZGRyZXNzMCk7XG4gICAgICB1bnNpZ25lZFR4LnBhcnNlZFR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwocmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gICAgICB1bnNpZ25lZFR4LnBhcnNlZFR4LnNwZW5kQW1vdW50LnNob3VsZC5lcXVhbCgnMTg5NzgwMjMzMicpO1xuICAgICAgdW5zaWduZWRUeC5mZWVJbmZvLmZlZS5zaG91bGQuZXF1YWwoMjE5NzY2OCk7XG4gICAgICB1bnNpZ25lZFR4LmZlZUluZm8uZmVlU3RyaW5nLnNob3VsZC5lcXVhbCgnMjE5NzY2OCcpO1xuICAgICAgdW5zaWduZWRUeC5jb2luU3BlY2lmaWMuY29tbW9uS2V5Y2hhaW4uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnM2I4OWVlYzlkMmQyZjNiMDQ5ZWNkYTJlN2I1ZjQ3ODI3Zjc5MjdmZTY2MThkNmU4YjEzZjY0ZTdjOTVmNGIwMGI5NTc3YWIwMTM5NWVjZjhlZWI4MDRiNTkwY2VkYWUxNGZmNWZkMzk0N2JmM2I3YTk1YjkzMjdjNDllMjdjNTQnXG4gICAgICApO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZmV0Y2hPd25lZE9iamVjdHMsIDEpO1xuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmVzdGltYXRlR2FzLCAxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVHJhbnNhY3Rpb25zIGZvciB3YWxsZXQgd2l0aCBtdWx0aXBsZSBhZGRyZXNzZXM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczAgPSAnMHhmZDM2ZDJhZDQ4ZWRmNTY3MWFiZjA0ZjVjMGVlZjM0NjRiZjkyY2Y0NWFlNjU1YWZmNDcxY2ZhZWRiNjFmYTk5JztcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzMSA9ICcweDYyZDVjODZlNjU3OGQ1NGFkOTU0NWZlOWIzMjNlNTRlODc5Mjk2NGUwMTg5ZDdmMDk0ZDRjNzk4NjViOWI4MjcnO1xuICAgIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSAnMHhkYTk3ZTE2NmQ0MGZhNmEwYzk0OWI2YWViODYyZTM5MWMyOTEzOWI1NjNhZTA0MzBiMjQxOWM1ODlhMDJhNmUwJztcbiAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmV0Y2hPd25lZE9iamVjdHNTdHViID0gc2FuZEJveC5zdHViKElvdGEucHJvdG90eXBlLCAnZmV0Y2hPd25lZE9iamVjdHMnIGFzIGtleW9mIElvdGEpO1xuICAgICAgZmV0Y2hPd25lZE9iamVjdHNTdHViLndpdGhBcmdzKHNlbmRlckFkZHJlc3MwKS5yZXNvbHZlcyhbXSk7XG4gICAgICBmZXRjaE93bmVkT2JqZWN0c1N0dWIud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczEpLnJlc29sdmVzKFtcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdElkOiAnMHhmZjkzYWRjMmY1MTZmY2FhMGM2MDQwZTAxZjUwMDI3YTIzZjliMTc2N2Y1MDQwZWIyMjgyNzkwYTY5MDBjZTdmJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMTk2JyxcbiAgICAgICAgICBkaWdlc3Q6ICdYcmpSTTlaTTk4eGROV2lnSFlRakNwR29XdDZhWkxwcVhkU0VpeG5oYjRwJyxcbiAgICAgICAgICBiYWxhbmNlOiAnMTgwMDAwMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgc2FuZEJveC5zdHViKElvdGEucHJvdG90eXBlLCAnZmV0Y2hHYXNQcmljZScgYXMga2V5b2YgSW90YSkucmVzb2x2ZXMoMTAwMCk7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdlc3RpbWF0ZUdhcycgYXMga2V5b2YgSW90YSkucmVzb2x2ZXMoMTk5Nzg4MCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICByZXMuc2hvdWxkLmhhc093blByb3BlcnR5KCd0cmFuc2FjdGlvbnMnKTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzLnRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4LnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE3OTc4MDIzMzInKTtcbiAgICAgIHR4LnNlcmlhbGl6ZWRUeC5zaG91bGQuZXF1YWwoXG4gICAgICAgICdBQUFDQUFoY1NTaHJBQUFBQUFBZzJwZmhadFFQcHFESlNiYXV1R0xqa2NLUk9iVmpyZ1F3c2tHY1dKb0NwdUFDQWdBQkFRQUFBUUVEQUFBQUFBRUJBR0xWeUc1bGVOVksyVlJmNmJNajVVNkhrcFpPQVluWDhKVFV4NWhsdWJnbkFmK1RyY0wxRnZ5cURHQkE0QjlRQW5vaitiRjJmMUJBNnlLQ2VRcHBBTTUveEFBQUFBQUFBQUFnQitlbjNTQXl4MEVZYlBXMWIrd1ZDVUN1R1JHWmlOMkpkTmZINEsvRWVOVmkxY2h1WlhqVlN0bFVYK216SStWT2g1S1dUZ0dKMS9DVTFNZVlaYm00SitnREFBQUFBQUFBcElnaEFBQUFBQUFBJ1xuICAgICAgKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmZldGNoT3duZWRPYmplY3RzLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5lc3RpbWF0ZUdhcywgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlY292ZXIgYSB0eG4gZm9yIG5vbi1iaXRnbyByZWNvdmVyaWVzIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHJhbnNhY3Rpb25zJyk7XG4gICAgICBjb25zdCB0eCA9IHJlcy50cmFuc2FjdGlvbnNbMF07XG4gICAgICB0eC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxNzk3ODAyMzMyJyk7XG4gICAgICB0eC5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBQ0FBaGNTU2hyQUFBQUFBQWcycGZoWnRRUHBxREpTYmF1dUdMamtjS1JPYlZqcmdRd3NrR2NXSm9DcHVBQ0FnQUJBUUFBQVFFREFBQUFBQUVCQUdMVnlHNWxlTlZLMlZSZjZiTWo1VTZIa3BaT0FZblg4SlRVeDVobHViZ25BZitUcmNMMUZ2eXFER0JBNEI5UUFub2orYkYyZjFCQTZ5S0NlUXBwQU01L3hBQUFBQUFBQUFBZ0IrZW4zU0F5eDBFWWJQVzFiK3dWQ1VDdUdSR1ppTjJKZE5mSDRLL0VlTlZpMWNodVpYalZTdGxVWCttekkrVk9oNUtXVGdHSjEvQ1UxTWVZWmJtNEorZ0RBQUFBQUFBQXBJZ2hBQUFBQUFBQSdcbiAgICAgICk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5mZXRjaE93bmVkT2JqZWN0cywgMSk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZXN0aW1hdGVHYXMsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBDb25zb2xpZGF0aW9uIFRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHJlY2VpdmVBZGRyZXNzMSA9ICcweDYyZDVjODZlNjU3OGQ1NGFkOTU0NWZlOWIzMjNlNTRlODc5Mjk2NGUwMTg5ZDdmMDk0ZDRjNzk4NjViOWI4MjcnO1xuICAgIGNvbnN0IHJlY2VpdmVBZGRyZXNzMiA9ICcweDA4OThhMWJjMThmZDFjOWY3YzhmZGYyNjZiZmRjNjMzZmUyYWM3MzMxNGJmMDcxYjJlMGU5ODAwMTMxYmZiODUnO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaE93bmVkT2JqZWN0c1N0dWIgPSBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaE93bmVkT2JqZWN0cycgYXMga2V5b2YgSW90YSk7XG4gICAgICBmZXRjaE93bmVkT2JqZWN0c1N0dWJcbiAgICAgICAgLndpdGhBcmdzKHJlY2VpdmVBZGRyZXNzMSlcbiAgICAgICAgLnJlc29sdmVzKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvYmplY3RJZDogJzB4OTk2YWFiMzY1ZDQ1NTFiNmQxMjc0ZjUyMGJiZmE3YjBhNTY2ZDU0OGIyZDU5MGI1NTY1YzYyMzgxMmU3ZTc2ZCcsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMjAxJyxcbiAgICAgICAgICAgIGRpZ2VzdDogJ0hYcE5UZng5VEJkeEZjWEhpNFJ6aVpzUXVEQUhhdlJhc0s2UmkxNXJWd3VBJyxcbiAgICAgICAgICAgIGJhbGFuY2U6ICcyMDAwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICAgIC53aXRoQXJncyhyZWNlaXZlQWRkcmVzczIpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGZhMDQxMDVlZWRlYmRhYmY3MjlkY2NlY2YwMWQwY2Y1ZjFiNzcwODkyZmFjMmVkOGYxZTY5ZDcxYTMyYTJkMjQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIwMicsXG4gICAgICAgICAgICBkaWdlc3Q6ICdEZUFwUlZTclRhOXR0WHZOeUxleFQ0UEpjQWt5eXhTcGkzSlFlVWc0dWE4UScsXG4gICAgICAgICAgICBiYWxhbmNlOiAnMjAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgc2FuZEJveC5zdHViKElvdGEucHJvdG90eXBlLCAnZmV0Y2hHYXNQcmljZScgYXMga2V5b2YgSW90YSkucmVzb2x2ZXMoMTAwMCk7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdlc3RpbWF0ZUdhcycgYXMga2V5b2YgSW90YSkucmVzb2x2ZXMoMTk5Nzg4MCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHNpZ25lZCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgaG90IHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gcmVzLnRyYW5zYWN0aW9ucztcbiAgICAgIHRyYW5zYWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgY29uc3QgdHhuMSA9IHRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4bjEuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4bjEucmVjb3ZlcnlBbW91bnQuc2hvdWxkLmVxdWFsKCcxOTc4MDIzMzInKTtcbiAgICAgIHR4bjEuc2VyaWFsaXplZFR4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ0FBQUNBQWhjT2NvTEFBQUFBQUFnL1RiU3JVanQ5V2NhdndUMXdPN3pSa3Y1TFBSYTVsV3Y5SEhQcnR0aCtwa0NBZ0FCQVFBQUFRRURBQUFBQUFFQkFHTFZ5RzVsZU5WSzJWUmY2Yk1qNVU2SGtwWk9BWW5YOEpUVXg1aGx1YmduQVpscXF6WmRSVkcyMFNkUFVndS9wN0NsWnRWSXN0V1F0VlpjWWpnUzUrZHR5UUFBQUFBQUFBQWc5Wi81L1VTU1ZiV0NDTGV2Q2prbkRjdCsyNzFiOVN6S3Rtc2pRVml3Rk5saTFjaHVaWGpWU3RsVVgrbXpJK1ZPaDVLV1RnR0oxL0NVMU1lWVpibTRKK2dEQUFBQUFBQUFwSWdoQUFBQUFBQUEnXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eG4yID0gdHJhbnNhY3Rpb25zWzFdO1xuICAgICAgdHhuMi5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHhuMi5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE5NzgwMjMzMicpO1xuICAgICAgdHhuMi5zZXJpYWxpemVkVHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnQUFBQ0FBaGNPY29MQUFBQUFBQWcvVGJTclVqdDlXY2F2d1Qxd083elJrdjVMUFJhNWxXdjlISFBydHRoK3BrQ0FnQUJBUUFBQVFFREFBQUFBQUVCQUFpWW9id1kvUnlmZkkvZkptdjl4alArS3NjekZMOEhHeTRPbUFBVEcvdUZBZm9FRUY3dDY5cS9jcDNNN1BBZERQWHh0M0NKTDZ3dTJQSG1uWEdqS2kwa3lnQUFBQUFBQUFBZ3U5SFZlT1VvcktWRWFIMmxmaFNrRVVHd0sva0MzcEVHZjVkY01CdWQ5RUVJbUtHOEdQMGNuM3lQM3laci9jWXovaXJITXhTL0J4c3VEcGdBRXh2N2hlZ0RBQUFBQUFBQXBJZ2hBQUFBQUFBQSdcbiAgICAgICk7XG5cbiAgICAgIHJlcy5sYXN0U2NhbkluZGV4LnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmZldGNoT3duZWRPYmplY3RzLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5lc3RpbWF0ZUdhcywgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc2lnbmVkIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBjb2xkIHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgZW5kaW5nU2NhbkluZGV4OiAzLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3R4UmVxdWVzdHMnKTtcbiAgICAgIHJlcy50eFJlcXVlc3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHgxID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICB1bnNpZ25lZFR4MS5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdW5zaWduZWRUeDEuY29pbi5zaG91bGQuZXF1YWwoJ3Rpb3RhJyk7XG4gICAgICB1bnNpZ25lZFR4MS5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMScpO1xuICAgICAgdW5zaWduZWRUeDEucGFyc2VkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY2VpdmVBZGRyZXNzMSk7XG4gICAgICB1bnNpZ25lZFR4MS5wYXJzZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMHhmZDM2ZDJhZDQ4ZWRmNTY3MWFiZjA0ZjVjMGVlZjM0NjRiZjkyY2Y0NWFlNjU1YWZmNDcxY2ZhZWRiNjFmYTk5J1xuICAgICAgKTtcbiAgICAgIHVuc2lnbmVkVHgxLnBhcnNlZFR4LnNwZW5kQW1vdW50LnNob3VsZC5lcXVhbCgnMTk3ODAyMzMyJyk7XG4gICAgICB1bnNpZ25lZFR4MS5mZWVJbmZvLmZlZS5zaG91bGQuZXF1YWwoMjE5NzY2OCk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHgyID0gcmVzLnR4UmVxdWVzdHNbMV0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICB1bnNpZ25lZFR4Mi5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdW5zaWduZWRUeDIuY29pbi5zaG91bGQuZXF1YWwoJ3Rpb3RhJyk7XG4gICAgICB1bnNpZ25lZFR4Mi5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMicpO1xuICAgICAgdW5zaWduZWRUeDIucGFyc2VkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY2VpdmVBZGRyZXNzMik7XG4gICAgICB1bnNpZ25lZFR4Mi5wYXJzZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMHhmZDM2ZDJhZDQ4ZWRmNTY3MWFiZjA0ZjVjMGVlZjM0NjRiZjkyY2Y0NWFlNjU1YWZmNDcxY2ZhZWRiNjFmYTk5J1xuICAgICAgKTtcbiAgICAgIHVuc2lnbmVkVHgyLnBhcnNlZFR4LnNwZW5kQW1vdW50LnNob3VsZC5lcXVhbCgnMTk3ODAyMzMyJyk7XG4gICAgICB1bnNpZ25lZFR4Mi5mZWVJbmZvLmZlZS5zaG91bGQuZXF1YWwoMjE5NzY2OCk7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5mZXRjaE93bmVkT2JqZWN0cywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZXN0aW1hdGVHYXMsIDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUb2tlbiBUcmFuc2FjdGlvbnM6JywgKCkgPT4ge1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzczAgPSAnMHhmZDM2ZDJhZDQ4ZWRmNTY3MWFiZjA0ZjVjMGVlZjM0NjRiZjkyY2Y0NWFlNjU1YWZmNDcxY2ZhZWRiNjFmYTk5JztcbiAgICBjb25zdCBjb2xkV2FsbGV0QWRkcmVzczAgPSAnMHg3NDlmYTQ5YjgyYTc2Yzk5NWI5YmQ5NTNjODNiMzI5MWRjZDg4NDU4NTQxODlmMzQyZjE5MGQwZWEzYTQzNWVhJztcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4ZGE5N2UxNjZkNDBmYTZhMGM5NDliNmFlYjg2MmUzOTFjMjkxMzliNTYzYWUwNDMwYjI0MTljNTg5YTAyYTZlMCc7XG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdwJFN3PFJqdkFnZntuWUFZSTJ4TSc7XG4gICAgY29uc3QgdG9rZW5Db250cmFjdEFkZHJlc3MgPSAnMHhhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5JztcbiAgICBjb25zdCB2YWxpZERpZ2VzdCA9ICc3QkpMYjMyTEtON3d0NXV2NHhnWFc0QWJGS29NTmNQRTc2bzQxVFFFdlVaYic7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBzdHViVG9rZW5SZWNvdmVyeShzZW5kZXJBZGRyOiBzdHJpbmcsIHRva2VuQmFsYW5jZTogc3RyaW5nLCBnYXNCYWxhbmNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2hhc1Rva2VuQmFsYW5jZScgYXMga2V5b2YgSW90YSkuY2FsbHNGYWtlKGZ1bmN0aW9uIChhZGRyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhZGRyID09PSBzZW5kZXJBZGRyKTtcbiAgICAgIH0pO1xuICAgICAgc2FuZEJveFxuICAgICAgICAuc3R1YihJb3RhLnByb3RvdHlwZSwgJ2ZldGNoT3duZWRPYmplY3RzJyBhcyBrZXlvZiBJb3RhKVxuICAgICAgICAuY2FsbHNGYWtlKGZ1bmN0aW9uIChhZGRyOiBzdHJpbmcsIF9ycGM6IHVua25vd24sIGNvaW5UeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAoYWRkciA9PT0gc2VuZGVyQWRkciAmJiBjb2luVHlwZSA9PT0gdG9rZW5Db250cmFjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1xuICAgICAgICAgICAgICB7IG9iamVjdElkOiAnMHhhYWFhJyArIHNlbmRlckFkZHIuc2xpY2UoNiksIHZlcnNpb246ICcxMDAnLCBkaWdlc3Q6IHZhbGlkRGlnZXN0LCBiYWxhbmNlOiB0b2tlbkJhbGFuY2UgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWRkciA9PT0gc2VuZGVyQWRkciAmJiAhY29pblR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1xuICAgICAgICAgICAgICB7IG9iamVjdElkOiAnMHhiYmJiJyArIHNlbmRlckFkZHIuc2xpY2UoNiksIHZlcnNpb246ICcyMDAnLCBkaWdlc3Q6IHZhbGlkRGlnZXN0LCBiYWxhbmNlOiBnYXNCYWxhbmNlIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH0pO1xuICAgICAgc2FuZEJveC5zdHViKElvdGEucHJvdG90eXBlLCAnZmV0Y2hHYXNQcmljZScgYXMga2V5b2YgSW90YSkucmVzb2x2ZXMoMTAwMCk7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdlc3RpbWF0ZUdhcycgYXMga2V5b2YgSW90YSkucmVzb2x2ZXMoMjM0NTUwNCk7XG4gICAgfVxuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciBub24tYml0Z28gcmVjb3ZlcnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViVG9rZW5SZWNvdmVyeShzZW5kZXJBZGRyZXNzMCwgJzEwMDAnLCAnNTAwMDAwMDAwJyk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHguY29pbi5zaG91bGQuZXF1YWwodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uaGFzVG9rZW5CYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5mZXRjaE93bmVkT2JqZWN0cywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZXN0aW1hdGVHYXMsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGZvciB1bnNpZ25lZCBzd2VlcCByZWNvdmVyeScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHN0dWJUb2tlblJlY292ZXJ5KGNvbGRXYWxsZXRBZGRyZXNzMCwgJzEwMDAnLCAnMjAwMDAwMDAwJyk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleUNvbGRXYWxsZXQsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgICByZXMuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHhSZXF1ZXN0cycpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IHJlcy50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4O1xuICAgICAgdW5zaWduZWRUeC5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgdW5zaWduZWRUeC5jb2luLnNob3VsZC5lcXVhbCh0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoLnNob3VsZC5lcXVhbCgnbS8wJyk7XG4gICAgICB1bnNpZ25lZFR4LnBhcnNlZFR4LmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChjb2xkV2FsbGV0QWRkcmVzczApO1xuICAgICAgdW5zaWduZWRUeC5wYXJzZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgICAgdW5zaWduZWRUeC5wYXJzZWRUeC5zcGVuZEFtb3VudC5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICAgIHVuc2lnbmVkVHguZmVlSW5mby5mZWUuc2hvdWxkLmVxdWFsKDI1ODAwNTQpO1xuICAgICAgcmVzLnR4UmVxdWVzdHNbMF0ud2FsbGV0Q29pbi5zaG91bGQuZXF1YWwodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uaGFzVG9rZW5CYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5mZXRjaE93bmVkT2JqZWN0cywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZXN0aW1hdGVHYXMsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUb2tlbiBUcmFuc2FjdGlvbnMgZm9yIHdhbGxldCB3aXRoIG11bHRpcGxlIGFkZHJlc3NlczonLCAoKSA9PiB7XG4gICAgY29uc3Qgc2FuZEJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzMSA9ICcweDYyZDVjODZlNjU3OGQ1NGFkOTU0NWZlOWIzMjNlNTRlODc5Mjk2NGUwMTg5ZDdmMDk0ZDRjNzk4NjViOWI4MjcnO1xuICAgIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSAnMHhkYTk3ZTE2NmQ0MGZhNmEwYzk0OWI2YWViODYyZTM5MWMyOTEzOWI1NjNhZTA0MzBiMjQxOWM1ODlhMDJhNmUwJztcbiAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3AkU3c8Ump2QWdme25ZQVlJMnhNJztcbiAgICBjb25zdCB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9ICcweGFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODknO1xuICAgIGNvbnN0IHZhbGlkRGlnZXN0ID0gJzdCSkxiMzJMS043d3Q1dXY0eGdYVzRBYkZLb01OY1BFNzZvNDFUUUV2VVpiJztcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5zdHViKElvdGEucHJvdG90eXBlLCAnaGFzVG9rZW5CYWxhbmNlJyBhcyBrZXlvZiBJb3RhKS5jYWxsc0Zha2UoZnVuY3Rpb24gKGFkZHI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFkZHIgPT09IHNlbmRlckFkZHJlc3MxKTtcbiAgICAgIH0pO1xuICAgICAgc2FuZEJveFxuICAgICAgICAuc3R1YihJb3RhLnByb3RvdHlwZSwgJ2ZldGNoT3duZWRPYmplY3RzJyBhcyBrZXlvZiBJb3RhKVxuICAgICAgICAuY2FsbHNGYWtlKGZ1bmN0aW9uIChhZGRyOiBzdHJpbmcsIF9ycGM6IHVua25vd24sIGNvaW5UeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAoYWRkciA9PT0gc2VuZGVyQWRkcmVzczEgJiYgY29pblR5cGUgPT09IHRva2VuQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtcbiAgICAgICAgICAgICAgeyBvYmplY3RJZDogJzB4Y2NjYycgKyBzZW5kZXJBZGRyZXNzMS5zbGljZSg2KSwgdmVyc2lvbjogJzMwMCcsIGRpZ2VzdDogdmFsaWREaWdlc3QsIGJhbGFuY2U6ICcxMDAwJyB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhZGRyID09PSBzZW5kZXJBZGRyZXNzMSAmJiAhY29pblR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGRkZGQnICsgc2VuZGVyQWRkcmVzczEuc2xpY2UoNiksXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogJzMwMScsXG4gICAgICAgICAgICAgICAgZGlnZXN0OiB2YWxpZERpZ2VzdCxcbiAgICAgICAgICAgICAgICBiYWxhbmNlOiAnMTIwMDAwMDAwJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfSk7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaEdhc1ByaWNlJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygxMDAwKTtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2VzdGltYXRlR2FzJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygyMzQ1NTA0KTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVjb3ZlciBhIHRva2VuIHR4biBhdCBhZGRyZXNzIDEgYnV0IHNlYXJjaCBmcm9tIGFkZHJlc3MgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHguY29pbi5zaG91bGQuZXF1YWwodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uaGFzVG9rZW5CYWxhbmNlLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5mZXRjaE93bmVkT2JqZWN0cywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZXN0aW1hdGVHYXMsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWNvdmVyIGEgdG9rZW4gdHhuIGF0IGFkZHJlc3MgMSBidXQgc2VhcmNoIGZyb20gYWRkcmVzcyAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3RyYW5zYWN0aW9ucycpO1xuICAgICAgY29uc3QgdHggPSByZXMudHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHguc2NhbkluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMCcpO1xuICAgICAgdHguY29pbi5zaG91bGQuZXF1YWwodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uaGFzVG9rZW5CYWxhbmNlLCAxKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5mZXRjaE93bmVkT2JqZWN0cywgMik7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZXN0aW1hdGVHYXMsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUb2tlbiBDb25zb2xpZGF0aW9uIFRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuICAgIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzID0gJzB4YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OSc7XG4gICAgY29uc3QgdmFsaWREaWdlc3QgPSAnN0JKTGIzMkxLTjd3dDV1djR4Z1hXNEFiRktvTU5jUEU3Nm80MVRRRXZVWmInO1xuXG4gICAgY29uc3QgaG90V2FsbGV0QWRkcmVzczEgPSAnMHg2MmQ1Yzg2ZTY1NzhkNTRhZDk1NDVmZTliMzIzZTU0ZTg3OTI5NjRlMDE4OWQ3ZjA5NGQ0Yzc5ODY1YjliODI3JztcbiAgICBjb25zdCBob3RXYWxsZXRBZGRyZXNzMiA9ICcweDA4OThhMWJjMThmZDFjOWY3YzhmZGYyNjZiZmRjNjMzZmUyYWM3MzMxNGJmMDcxYjJlMGU5ODAwMTMxYmZiODUnO1xuICAgIGNvbnN0IGNvbGRXYWxsZXRBZGRyZXNzMSA9ICcweGUxZDYxNjMzMDMwODQzYWQwNjljMGY3ODNmMmNjN2NkNmUxZGM4N2RjMDI2YmI1YmExYjViZGRkNmU2NTRlNDcnO1xuICAgIGNvbnN0IGNvbGRXYWxsZXRBZGRyZXNzMiA9ICcweGI5NTgxYTAzNjIyYzI3MTcwN2MwZDRjYWM2OTllNGVmMjQ2OGNmYzAzMTZlOGY5YWEwNDBlYjQ0OWMxOTVlMWQnO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gc3R1Yk11bHRpVG9rZW5SZWNvdmVyeShhZGRyc01hcDogUmVjb3JkPHN0cmluZywgeyB0Yjogc3RyaW5nOyBnYjogc3RyaW5nIH0+KTogdm9pZCB7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdoYXNUb2tlbkJhbGFuY2UnIGFzIGtleW9mIElvdGEpLmNhbGxzRmFrZShmdW5jdGlvbiAoYWRkcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoISFhZGRyc01hcFthZGRyXSk7XG4gICAgICB9KTtcbiAgICAgIHNhbmRCb3hcbiAgICAgICAgLnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaE93bmVkT2JqZWN0cycgYXMga2V5b2YgSW90YSlcbiAgICAgICAgLmNhbGxzRmFrZShmdW5jdGlvbiAoYWRkcjogc3RyaW5nLCBfcnBjOiB1bmtub3duLCBjb2luVHlwZTogc3RyaW5nKSB7XG4gICAgICAgICAgY29uc3QgbSA9IGFkZHJzTWFwW2FkZHJdO1xuICAgICAgICAgIGlmICghbSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgICAgaWYgKGNvaW5UeXBlID09PSB0b2tlbkNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXG4gICAgICAgICAgICAgIHsgb2JqZWN0SWQ6ICcweGFhYWEnICsgYWRkci5zbGljZSg2KSwgdmVyc2lvbjogJzQwMCcsIGRpZ2VzdDogdmFsaWREaWdlc3QsIGJhbGFuY2U6IG0udGIgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNvaW5UeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtcbiAgICAgICAgICAgICAgeyBvYmplY3RJZDogJzB4YmJiYicgKyBhZGRyLnNsaWNlKDYpLCB2ZXJzaW9uOiAnNDAxJywgZGlnZXN0OiB2YWxpZERpZ2VzdCwgYmFsYW5jZTogbS5nYiB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgICAgICB9KTtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2ZldGNoR2FzUHJpY2UnIGFzIGtleW9mIElvdGEpLnJlc29sdmVzKDEwMDApO1xuICAgICAgc2FuZEJveC5zdHViKElvdGEucHJvdG90eXBlLCAnZXN0aW1hdGVHYXMnIGFzIGtleW9mIElvdGEpLnJlc29sdmVzKDIzNDU1MDQpO1xuICAgIH1cblxuICAgIGl0KCdzaG91bGQgYnVpbGQgc2lnbmVkIHRva2VuIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBob3Qgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1Yk11bHRpVG9rZW5SZWNvdmVyeSh7XG4gICAgICAgIFtob3RXYWxsZXRBZGRyZXNzMV06IHsgdGI6ICcxNTAwJywgZ2I6ICcxMTY3MjAxNDQnIH0sXG4gICAgICAgIFtob3RXYWxsZXRBZGRyZXNzMl06IHsgdGI6ICcyMDAwJywgZ2I6ICcxMjAxMDE5NzYnIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlckNvbnNvbGlkYXRpb25zKHtcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zID0gcmVzLnRyYW5zYWN0aW9ucztcbiAgICAgIHRyYW5zYWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgICBjb25zdCB0eG4xID0gdHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHhuMS5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhuMS5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzE1MDAnKTtcbiAgICAgIHR4bjEuY29pbi5zaG91bGQuZXF1YWwodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuXG4gICAgICBjb25zdCB0eG4yID0gdHJhbnNhY3Rpb25zWzFdO1xuICAgICAgdHhuMi5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHhuMi5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzIwMDAnKTtcbiAgICAgIHR4bjIuY29pbi5zaG91bGQuZXF1YWwodG9rZW5Db250cmFjdEFkZHJlc3MpO1xuXG4gICAgICByZXMubGFzdFNjYW5JbmRleC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5mZXRjaE93bmVkT2JqZWN0cywgNCk7XG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZXN0aW1hdGVHYXMsIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB1bnNpZ25lZCB0b2tlbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgY29sZCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViTXVsdGlUb2tlblJlY292ZXJ5KHtcbiAgICAgICAgW2NvbGRXYWxsZXRBZGRyZXNzMV06IHsgdGI6ICc0MDAwJywgZ2I6ICcxMTY3MjAxNDQnIH0sXG4gICAgICAgIFtjb2xkV2FsbGV0QWRkcmVzczJdOiB7IHRiOiAnNjAwMCcsIGdiOiAnMTIwMTAxOTc2JyB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5Q29sZFdhbGxldCxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICB9KTtcblxuICAgICAgcmVzLnNob3VsZC5oYXNPd25Qcm9wZXJ0eSgndHhSZXF1ZXN0cycpO1xuICAgICAgcmVzLnR4UmVxdWVzdHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgY29uc3QgdW5zaWduZWRUeDEgPSByZXMudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIHVuc2lnbmVkVHgxLnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB1bnNpZ25lZFR4MS5jb2luLnNob3VsZC5lcXVhbCh0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICB1bnNpZ25lZFR4MS5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMScpO1xuICAgICAgdW5zaWduZWRUeDEucGFyc2VkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKGNvbGRXYWxsZXRBZGRyZXNzMSk7XG4gICAgICB1bnNpZ25lZFR4MS5wYXJzZWRUeC5zcGVuZEFtb3VudC5zaG91bGQuZXF1YWwoJzQwMDAnKTtcbiAgICAgIHVuc2lnbmVkVHgxLmZlZUluZm8uZmVlLnNob3VsZC5lcXVhbCgyNTgwMDU0KTtcbiAgICAgIHJlcy50eFJlcXVlc3RzWzBdLndhbGxldENvaW4uc2hvdWxkLmVxdWFsKHRva2VuQ29udHJhY3RBZGRyZXNzKTtcblxuICAgICAgY29uc3QgdW5zaWduZWRUeDIgPSByZXMudHhSZXF1ZXN0c1sxXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIHVuc2lnbmVkVHgyLnNjYW5JbmRleC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB1bnNpZ25lZFR4Mi5jb2luLnNob3VsZC5lcXVhbCh0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICB1bnNpZ25lZFR4Mi5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMicpO1xuICAgICAgdW5zaWduZWRUeDIucGFyc2VkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKGNvbGRXYWxsZXRBZGRyZXNzMik7XG4gICAgICB1bnNpZ25lZFR4Mi5wYXJzZWRUeC5zcGVuZEFtb3VudC5zaG91bGQuZXF1YWwoJzYwMDAnKTtcbiAgICAgIHVuc2lnbmVkVHgyLmZlZUluZm8uZmVlLnNob3VsZC5lcXVhbCgyNTgwMDU0KTtcbiAgICAgIHJlcy50eFJlcXVlc3RzWzFdLndhbGxldENvaW4uc2hvdWxkLmVxdWFsKHRva2VuQ29udHJhY3RBZGRyZXNzKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmZldGNoT3duZWRPYmplY3RzLCA0KTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5lc3RpbWF0ZUdhcywgMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIENvbnNvbGlkYXRpb24gVHJhbnNhY3Rpb25zIHdpdGggc2VlZCcsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHZhbGlkRGlnZXN0ID0gJzdCSkxiMzJMS043d3Q1dXY0eGdYVzRBYkZLb01OY1BFNzZvNDFUUUV2VVpiJztcbiAgICBjb25zdCBzZWVkUmVjZWl2ZUFkZHJlc3MxID0gJzB4OWQzM2JjNTZmOWQ0N2M0NzNjYmVhMDA5ZjdkNDQ4NjcwYTlkMzI2NDBjNWIxYjUwYTc1YzZmNzg3OWJjNTk5NCc7XG4gICAgY29uc3Qgc2VlZFJlY2VpdmVBZGRyZXNzMiA9ICcweGIzMjYzMzkxMzEzMGE2MTM4MDdkZTlmODMzNTZkMjJiYWVmNzc4ZDc4ZGE1Nzk5ZWY0ZTU2NjA5NWE5ZmZlNTAnO1xuICAgIGNvbnN0IHNlZWRCYXNlQWRkcmVzcyA9ICcweDA4N2E3MmE2OThhY2UxNmUyNTJiOGI2NmJmMTE4NGI0ODI5YTM3M2EwZDlhYjU0NjkyMWQxOWVmZGI4NDkwMzQnO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaE93bmVkT2JqZWN0cycgYXMga2V5b2YgSW90YSkuY2FsbHNGYWtlKGZ1bmN0aW9uIChhZGRyOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGFkZHIgPT09IHNlZWRSZWNlaXZlQWRkcmVzczEpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDMzMzMnICsgc2VlZFJlY2VpdmVBZGRyZXNzMS5zbGljZSg2KSxcbiAgICAgICAgICAgICAgdmVyc2lvbjogJzYwMCcsXG4gICAgICAgICAgICAgIGRpZ2VzdDogdmFsaWREaWdlc3QsXG4gICAgICAgICAgICAgIGJhbGFuY2U6ICc1MDAwMDAwMDAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkciA9PT0gc2VlZFJlY2VpdmVBZGRyZXNzMikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvYmplY3RJZDogJzB4MzMzMycgKyBzZWVkUmVjZWl2ZUFkZHJlc3MyLnNsaWNlKDYpLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiAnNjAxJyxcbiAgICAgICAgICAgICAgZGlnZXN0OiB2YWxpZERpZ2VzdCxcbiAgICAgICAgICAgICAgYmFsYW5jZTogJzIwMDAwMDAwMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgICAgfSk7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaEdhc1ByaWNlJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygxMDAwKTtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2VzdGltYXRlR2FzJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygxOTk3ODgwKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGNvbGQgd2FsbGV0IHdpdGggc2VlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5V2l0aFNlZWQsXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiAxLFxuICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDMsXG4gICAgICAgIHNlZWQ6ICcxMjMnLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5zaG91bGQuaGFzT3duUHJvcGVydHkoJ3R4UmVxdWVzdHMnKTtcbiAgICAgIHJlcy50eFJlcXVlc3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHgxID0gcmVzLnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICB1bnNpZ25lZFR4MS5zY2FuSW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdW5zaWduZWRUeDEuY29pbi5zaG91bGQuZXF1YWwoJ3Rpb3RhJyk7XG4gICAgICB1bnNpZ25lZFR4MS5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vOTk5OTk5Lzk0ODYyNjIyLzE1NzM2MzUwOS8xJyk7XG4gICAgICB1bnNpZ25lZFR4MS5wYXJzZWRUeC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoc2VlZFJlY2VpdmVBZGRyZXNzMSk7XG4gICAgICB1bnNpZ25lZFR4MS5wYXJzZWRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHNlZWRCYXNlQWRkcmVzcyk7XG4gICAgICB1bnNpZ25lZFR4MS5wYXJzZWRUeC5zcGVuZEFtb3VudC5zaG91bGQuZXF1YWwoJzQ5NzgwMjMzMicpO1xuICAgICAgdW5zaWduZWRUeDEuZmVlSW5mby5mZWUuc2hvdWxkLmVxdWFsKDIxOTc2NjgpO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFR4MiA9IHJlcy50eFJlcXVlc3RzWzFdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4O1xuICAgICAgdW5zaWduZWRUeDIuc2NhbkluZGV4LnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHVuc2lnbmVkVHgyLmNvaW4uc2hvdWxkLmVxdWFsKCd0aW90YScpO1xuICAgICAgdW5zaWduZWRUeDIuZGVyaXZhdGlvblBhdGguc2hvdWxkLmVxdWFsKCdtLzk5OTk5OS85NDg2MjYyMi8xNTczNjM1MDkvMicpO1xuICAgICAgdW5zaWduZWRUeDIucGFyc2VkVHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHNlZWRSZWNlaXZlQWRkcmVzczIpO1xuICAgICAgdW5zaWduZWRUeDIucGFyc2VkVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChzZWVkQmFzZUFkZHJlc3MpO1xuICAgICAgdW5zaWduZWRUeDIucGFyc2VkVHguc3BlbmRBbW91bnQuc2hvdWxkLmVxdWFsKCcxOTc4MDIzMzInKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmZldGNoT3duZWRPYmplY3RzLCAyKTtcbiAgICAgIHNhbmRCb3guYXNzZXJ0LmNhbGxDb3VudChiYXNlY29pbi5lc3RpbWF0ZUdhcywgMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIFRyYW5zYWN0aW9uIEZhaWx1cmVzOicsICgpID0+IHtcbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MwID0gJzB4ZmQzNmQyYWQ0OGVkZjU2NzFhYmYwNGY1YzBlZWYzNDY0YmY5MmNmNDVhZTY1NWFmZjQ3MWNmYWVkYjYxZmE5OSc7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9ICcweGRhOTdlMTY2ZDQwZmE2YTBjOTQ5YjZhZWI4NjJlMzkxYzI5MTM5YjU2M2FlMDQzMGIyNDE5YzU4OWEwMmE2ZTAnO1xuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHJlY292ZXIgZHVlIHRvIG5vbi16ZXJvIGZ1bmQgYnV0IGluc3VmZmljaWVudCBmdW5kcyBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveFxuICAgICAgICAuc3R1YihJb3RhLnByb3RvdHlwZSwgJ2ZldGNoT3duZWRPYmplY3RzJyBhcyBrZXlvZiBJb3RhKVxuICAgICAgICAud2l0aEFyZ3Moc2VuZGVyQWRkcmVzczApXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweGMwNWM3NjVlMjZlNmFlODRjNzhmYTI0NWYzOGEyM2ZiMjA0MDZhNWNmM2Y2MWI1N2JkMzIzYTBkZjlkOTgwMDMnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzE5NScsXG4gICAgICAgICAgICBkaWdlc3Q6ICc3QkpMYjMyTEtON3d0NXV2NHhnWFc0QWJGS29NTmNQRTc2bzQxVFFFdlVaYicsXG4gICAgICAgICAgICBiYWxhbmNlOiAnOTgwMDIxMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaEdhc1ByaWNlJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygxMDAwKTtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2VzdGltYXRlR2FzJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcyg5ODAwMjEyKTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6IGtleXMudXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwS2V5LFxuICAgICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvS2V5LFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMCxcbiAgICAgICAgICBzY2FuOiAxLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIFNjYW5uZWQgYWRkcmVzc2VzIGZyb20gaW5kZXggMCB0byAwLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4IDEuJ1xuICAgICAgICApO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZmV0Y2hPd25lZE9iamVjdHMsIDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHJlY292ZXIgZHVlIHRvIG5vdCBmaW5kaW5nIGFuIGFkZHJlc3Mgd2l0aCBmdW5kcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2ZldGNoT3duZWRPYmplY3RzJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcyhbXSk7XG5cbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OiBrZXlzLnVzZXJLZXksXG4gICAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cEtleSxcbiAgICAgICAgICBiaXRnb0tleToga2V5cy5iaXRnb0tleSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgc2NhbjogMTAsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gU2Nhbm5lZCBhZGRyZXNzZXMgZnJvbSBpbmRleCAwIHRvIDkuIFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggMTAuJ1xuICAgICAgICApO1xuXG4gICAgICBzYW5kQm94LmFzc2VydC5jYWxsQ291bnQoYmFzZWNvaW4uZmV0Y2hPd25lZE9iamVjdHMsIDEwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbnNvbGlkYXRpb24gVHJhbnNhY3Rpb24gRmFpbHVyZXM6JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmFpbCBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzIGluIHJlY2VpdmUgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgICBjb25zdCByZWNlaXZlQWRkcmVzczEgPSAnMHg2MmQ1Yzg2ZTY1NzhkNTRhZDk1NDVmZTliMzIzZTU0ZTg3OTI5NjRlMDE4OWQ3ZjA5NGQ0Yzc5ODY1YjliODI3JztcbiAgICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAncCRTdzxSanZBZ2Z7bllBWUkyeE0nO1xuXG4gICAgICBzYW5kQm94XG4gICAgICAgIC5zdHViKElvdGEucHJvdG90eXBlLCAnZmV0Y2hPd25lZE9iamVjdHMnIGFzIGtleW9mIElvdGEpXG4gICAgICAgIC53aXRoQXJncyhyZWNlaXZlQWRkcmVzczEpXG4gICAgICAgIC5yZXNvbHZlcyhbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0SWQ6ICcweDk5NmFhYjM2NWQ0NTUxYjZkMTI3NGY1MjBiYmZhN2IwYTU2NmQ1NDhiMmQ1OTBiNTU2NWM2MjM4MTJlN2U3NmQnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzIwMScsXG4gICAgICAgICAgICBkaWdlc3Q6ICdIWHBOVGZ4OVRCZHhGY1hIaTRSemlac1F1REFIYXZSYXNLNlJpMTVyVnd1QScsXG4gICAgICAgICAgICBiYWxhbmNlOiAnMScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICBzYW5kQm94LnN0dWIoSW90YS5wcm90b3R5cGUsICdmZXRjaEdhc1ByaWNlJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygxMDAwKTtcbiAgICAgIHNhbmRCb3guc3R1YihJb3RhLnByb3RvdHlwZSwgJ2VzdGltYXRlR2FzJyBhcyBrZXlvZiBJb3RhKS5yZXNvbHZlcygxOTk3ODgwKTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXJDb25zb2xpZGF0aW9ucyh7XG4gICAgICAgICAgdXNlcktleToga2V5cy51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXBLZXksXG4gICAgICAgICAgYml0Z29LZXk6IGtleXMuYml0Z29LZXksXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogMSxcbiAgICAgICAgICBlbmRpbmdTY2FuSW5kZXg6IDIsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAyLidcbiAgICAgICAgKTtcblxuICAgICAgc2FuZEJveC5hc3NlcnQuY2FsbENvdW50KGJhc2Vjb2luLmZldGNoT3duZWRPYmplY3RzLCAxKTtcbiAgICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19