PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-avaxc/dist/test/unit

Просмотр файла: avaxc.js

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
const sdk_test_1 = require("@bitgo/sdk-test");
const sdk_api_1 = require("@bitgo/sdk-api");
const src_1 = require("../../src");
const getBuilder_1 = require("./getBuilder");
const secp256k1 = __importStar(require("secp256k1"));
const secp256k1_1 = require("@bitgo/secp256k1");
const nock = __importStar(require("nock"));
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
const should = __importStar(require("should"));
const avaxc_1 = require("../resources/avaxc");
const sdk_coin_avaxp_1 = require("@bitgo/sdk-coin-avaxp");
const helpers_1 = require("./helpers");
const sinon = __importStar(require("sinon"));
const ethereumjs_util_1 = require("ethereumjs-util");
nock.enableNetConnect();
describe('Avalanche C-Chain', function () {
    let bitgo;
    let tavaxCoin;
    let avaxCoin;
    let hopTxBitgoSignature;
    let hopExportTxBitgoSignature;
    const address1 = '0x174cfd823af8ce27ed0afee3fcf3c3ba259116be';
    const address2 = '0x7e85bdc27c050e3905ebf4b8e634d9ad6edd0de6';
    const hopContractAddress = '0x47ce7cc86efefef19f8fb516b11735d183da8635';
    const hopDestinationAddress = '0x9c7e8ce6825bD48278B3Ab59228EE26f8BE7925b';
    const hopTx = '0xf86b808504a817c8ff8252ff949c7e8ce6825bd48278b3ab59228ee26f8be7925b87038d7ea4c68000801ca011bc22c664570133dfca4f08a0b8d02339cf467046d6a4152f04f368d0eaf99ea01d6dc5cf0c897c8d4c3e1df53d0d042784c424536a4cc5b802552b7d64fee8b5';
    const hopTxid = '0x4af65143bc77da2b50f35b3d13cacb4db18f026bf84bc0743550bc57b9b53351';
    const userReqSig = '0x404db307f6147f0d8cd338c34c13906ef46a6faa7e0e119d5194ef05aec16e6f3d710f9b7901460f97e924066b62efd74443bd34402c6d40b49c203a559ff2c8';
    const hopExportTx = '0x000000000001000000057fc93d85c6d62c5b2ac0b519c87010ea5294012d1e407030d6acd0021cac10d50000000000000000000000000000000000000000000000000000000000000000000000011fe3de7886be9e53072d6762e9fa1fc27dddfb0500000000061465b23d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa0000000000000000000000013d9bdac0ed1d761330cf680efdeb1a42159eb387d6d2950c96f7d28f61bbe2aa000000070000000006052340000000000000000000000002000000038b2ce3381003fdf86900280a4ec86b384b5d5c99b7fc1f65220b9a0b2f431578b8bb6ee130bf563af1fab1503135fbd423e442d5e9b73abd5622fe02000000010000000900000001af20066197fa3b72bea3d7cc503c60918c098378b958fbb5da8c6f438d0f4e380e506bb2c38dc88dd97c81e982706c48623937c2fe22b31248ed9fd34951480b0173b4e9ca';
    const hopExportTxId = '0xc4b5ca6e7d8c9c24bb9934afcb5c87e6db472dbe31111b778445f8f9c5352966';
    before(function () {
        const bitgoKeyXprv = 'xprv9s21ZrQH143K3tpWBHWe31sLoXNRQ9AvRYJgitkKxQ4ATFQMwvr7hHNqYRUnS7PsjzB7aK1VxqHLuNQjj1sckJ2Jwo2qxmsvejwECSpFMfC';
        const bitgoKey = secp256k1_1.bip32.fromBase58(bitgoKeyXprv);
        if (!bitgoKey.privateKey) {
            throw new Error('no privateKey');
        }
        const bitgoXpub = bitgoKey.neutered().toBase58();
        hopTxBitgoSignature =
            '0xaa' +
                Buffer.from(secp256k1.ecdsaSign(Buffer.from(hopTxid.slice(2), 'hex'), bitgoKey.privateKey).signature).toString('hex');
        hopExportTxBitgoSignature =
            '0xaa' +
                Buffer.from(secp256k1.ecdsaSign(Buffer.from(hopExportTxId.slice(2), 'hex'), bitgoKey.privateKey).signature).toString('hex');
        const env = 'test';
        bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env });
        bitgo.safeRegister('avaxc', src_1.AvaxC.createInstance);
        bitgo.safeRegister('tavaxc', src_1.TavaxC.createInstance);
        bitgo.safeRegister('teth', sdk_coin_eth_1.Eth.createInstance);
        bitgo.safeRegister('tavaxp', sdk_coin_avaxp_1.TavaxP.createInstance);
        sdk_core_1.common.Environments[bitgo.getEnv()].hsmXpub = bitgoXpub;
        bitgo.initializeTestVars();
    });
    beforeEach(() => {
        tavaxCoin = bitgo.coin('tavaxc');
        avaxCoin = bitgo.coin('avaxc');
    });
    after(function () {
        nock.cleanAll();
    });
    describe('Instantiate & Statics', () => {
        it('should instantiate the coin', function () {
            let localBasecoin = bitgo.coin('tavaxc');
            localBasecoin.should.be.an.instanceof(src_1.TavaxC);
            localBasecoin = bitgo.coin('avaxc');
            localBasecoin.should.be.an.instanceof(src_1.AvaxC);
        });
        it('should get hop digest', () => {
            const digest = src_1.AvaxC.getHopDigest(['1', '2', '3']);
            digest.toString('hex').should.equal('231cda5f050c841322b9df536afb633ca062400a8f393bf654a48bdd1dfd825b');
        });
    });
    describe('KeyPair', () => {
        it('should generate tavax keyPair without aguments', () => {
            const kp = tavaxCoin.generateKeyPair();
            kp.should.have.property('prv');
            kp.should.have.property('pub');
        });
        it('should generate avax keyPair without aguments', () => {
            const kp = avaxCoin.generateKeyPair();
            kp.should.have.property('prv');
            kp.should.have.property('pub');
        });
        it('should generate avax keyPair from seed', () => {
            const seed = '4b3b89f6ca897cb729d2146913877f71';
            const tAvaxKeyPair = tavaxCoin.generateKeyPair(Buffer.from(seed, 'hex'));
            const avaxKeyPair = avaxCoin.generateKeyPair(Buffer.from(seed, 'hex'));
            tAvaxKeyPair.should.have.property('prv');
            tAvaxKeyPair.should.have.property('pub');
            tAvaxKeyPair.prv.should.equals('xprv9s21ZrQH143K2MJE1yvV8UhjfLQcaDPPipMYvfYjrPbHLptLsnt1FbbCrCT9E5LCmRrS593YZ1CKgf3rf3C2hYTynZN5au3VvBvLcWh8sV2');
            tAvaxKeyPair.pub.should.equals('xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ');
            tAvaxKeyPair.should.deepEqual(avaxKeyPair);
        });
    });
    describe('keys validations success cases', () => {
        it('validate valid eth uncompressed public key', () => {
            const uncompressedPublicKey = '043BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E227874E8075353564D83047566EEA6CF5A7313816AF004DDA8CA529DE8C94BC6A';
            tavaxCoin.isValidPub(uncompressedPublicKey).should.be.true();
            avaxCoin.isValidPub(uncompressedPublicKey).should.be.true();
        });
        it('validate valid eth compressed public key', () => {
            const compressedPublicKey = '023BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E2';
            tavaxCoin.isValidPub(compressedPublicKey).should.be.true();
            avaxCoin.isValidPub(compressedPublicKey).should.be.true();
        });
        it('validate valid extended public key', () => {
            const extendedPublicKey = 'xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ';
            tavaxCoin.isValidPub(extendedPublicKey).should.be.true();
            avaxCoin.isValidPub(extendedPublicKey).should.be.true();
        });
        it('validate valid eth address', () => {
            const address = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
            tavaxCoin.isValidAddress(address).should.be.true();
            avaxCoin.isValidAddress(address).should.be.true();
        });
        it('should validate an array of p-chain addresses', function () {
            const address = [
                'P-fuji15x3z4rvk8e7vwa6g9lkyg89v5dwknp44858uex',
                'P-avax143q8lsy3y4ke9d6zeltre8u2ateed6uk9ka0nu',
                'NodeID-143q8lsy3y4ke9d6zeltre8u2ateed6uk9ka0nu',
            ];
            tavaxCoin.isValidAddress(address).should.be.true();
            avaxCoin.isValidAddress(address).should.be.true();
        });
        it('should validate a p-chain multsig address string', function () {
            const address = 'P-fuji1yzpfsdalhfwkq2ceewgs9wv7k0uft40ydpuj59~P-fuji103cmntssp6qnucejahddy42wcy4qty0uj42822~P-fuji1hdk7ntw0huhqmlhlheme9t7scsy9lhfhw3ywy4';
            tavaxCoin.isValidAddress(address).should.be.true();
            avaxCoin.isValidAddress(address).should.be.true();
        });
    });
    describe('keys validations failure cases', () => {
        it('validate empty eth public key', () => {
            tavaxCoin.isValidPub('').should.be.false();
            avaxCoin.isValidPub('').should.be.false();
            tavaxCoin.isValidPub(undefined).should.be.false();
            avaxCoin.isValidPub(undefined).should.be.false();
        });
        it('validate empty eth address', () => {
            tavaxCoin.isValidAddress(undefined).should.be.false();
            avaxCoin.isValidAddress(undefined).should.be.false();
        });
        it('validate eth uncompressed public key too short', () => {
            const uncompressedPublicKey = '043BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E227874E8075353564D83047566EEA6CF5A7313816AF004DDA8CA529DE8C94BC6A';
            tavaxCoin.isValidPub(uncompressedPublicKey.slice(1)).should.be.false();
            avaxCoin.isValidPub(uncompressedPublicKey.slice(1)).should.be.false();
        });
        it('validate eth compressed public key too short', () => {
            const compressedPublicKey = '023BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E2';
            tavaxCoin.isValidPub(compressedPublicKey.slice(1)).should.be.false();
            avaxCoin.isValidPub(compressedPublicKey.slice(1)).should.be.false();
        });
        it('validate invalid extended private key', () => {
            const extendedPublicKey = 'xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ';
            tavaxCoin.isValidPub(extendedPublicKey.substr(0, extendedPublicKey.length - 1)).should.be.false();
            avaxCoin.isValidPub(extendedPublicKey.substr(0, extendedPublicKey.length - 1)).should.be.false();
        });
        it('validate eth address too short', () => {
            const address = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
            tavaxCoin.isValidAddress(address.slice(1)).should.be.false();
            avaxCoin.isValidAddress(address.slice(1)).should.be.false();
        });
        it('validate eth uncompressed public key too long', () => {
            const uncompressedPublicKey = '043BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E227874E8075353564D83047566EEA6CF5A7313816AF004DDA8CA529DE8C94BC6A';
            tavaxCoin.isValidPub(uncompressedPublicKey + '00').should.be.false();
            avaxCoin.isValidPub(uncompressedPublicKey + '00').should.be.false();
        });
        it('validate eth compressed public key too long', () => {
            const compressedPublicKey = '023BE650E2C11F36D201C9173BE37BC028AF495CF78CA05F78FEE192F5D339A9E2';
            tavaxCoin.isValidPub(compressedPublicKey + '00').should.be.false();
            avaxCoin.isValidPub(compressedPublicKey + '00').should.be.false();
        });
        it('validate extended public key too long', () => {
            const extendedPublicKey = 'xpub661MyMwAqRbcEqNh81TVVceUDNF6yg7F63H9j3xMQj8GDdDVRLCFoPughSdgGs4X1n89iPXFKPMy3f45Y7E63kXGAZKuZ1fhLqsKtkoB3yZ';
            tavaxCoin.isValidPub(extendedPublicKey + '00').should.be.false();
            avaxCoin.isValidPub(extendedPublicKey + '00').should.be.false();
        });
        it('validate eth address too long', () => {
            const address = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
            tavaxCoin.isValidAddress(address + '00').should.be.false();
            avaxCoin.isValidAddress(address + '00').should.be.false();
        });
    });
    describe('Sign Transaction', () => {
        const account_1 = {
            address: '0xeeaf0F05f37891ab4a21208B105A0687d12c5aF7',
            owner_1: '4ee089aceabf3ddbf748db79b1066c33b7d3ea1ab3eb7e325121bba2bff2f5ca',
            owner_2: '5ca116d25aec5f765465432cc421ff25ef9ffdc330b10bb3d9ad61e3baad88d7',
            owner_3: '1fae946cc84af8bd74d610a88537e24e19c3349d478d86fc5bb59ba4c88fb9cc',
        };
        const account_2 = {
            address: '0x8Ce59c2d1702844F8EdED451AA103961bC37B4e8',
            owner_1: '4ee089aceabf3ddbf748db79b1066c33b7d3ea1ab3eb7e325121bba2bff2f5ca',
            owner_2: '5c7e4efff7304d4dfff6d5f1591844ec6f2adfa6a47e9fece6a3c1a4d755f1e3',
            owner_3: '4421ab25dd91e1a3180d03d57c323a7886dcc313d3b3a4b4256a5791572bf597',
        };
        it('should sign an unsigned test tx', async function () {
            const builder = (0, getBuilder_1.getBuilder)('tavaxc');
            builder.fee({
                fee: '280000000000',
                gasLimit: '7000000',
            });
            builder.counter(1);
            builder.type(sdk_core_1.TransactionType.Send);
            builder.contract(account_1.address);
            builder.transfer().amount('1').to(account_2.address).expirationTime(10000).contractSequenceId(1);
            const unsignedTx = await builder.build();
            const unsignedTxForBroadcasting = unsignedTx.toBroadcastFormat();
            const halfSignedRawTx = await tavaxCoin.signTransaction({
                txPrebuild: {
                    txHex: unsignedTxForBroadcasting,
                },
                prv: account_1.owner_2,
            });
            builder.transfer().key(account_1.owner_2);
            const halfSignedTx = await builder.build();
            const halfSignedTxForBroadcasting = halfSignedTx.toBroadcastFormat();
            halfSignedRawTx.halfSigned.txHex.should.equals(halfSignedTxForBroadcasting);
            halfSignedRawTx.halfSigned.recipients.length.should.equals(1);
            halfSignedRawTx.halfSigned.recipients[0].address.toLowerCase().should.equals(account_2.address.toLowerCase());
            halfSignedRawTx.halfSigned.recipients[0].amount.toLowerCase().should.equals('1');
        });
        it('should sign an unsigned test tx with eip1559', async function () {
            const builder = (0, getBuilder_1.getBuilder)('tavaxc');
            builder.fee({
                fee: '280000000000',
                gasLimit: '7000000',
                eip1559: {
                    maxFeePerGas: '7593123',
                    maxPriorityFeePerGas: '150',
                },
            });
            builder.counter(1);
            builder.type(sdk_core_1.TransactionType.Send);
            builder.contract(account_1.address);
            builder.transfer().amount('1').to(account_2.address).expirationTime(10000).contractSequenceId(1);
            const unsignedTx = await builder.build();
            const unsignedTxForBroadcasting = unsignedTx.toBroadcastFormat();
            const halfSignedRawTx = await tavaxCoin.signTransaction({
                txPrebuild: {
                    txHex: unsignedTxForBroadcasting,
                    eip1559: {
                        maxFeePerGas: '7593123',
                        maxPriorityFeePerGas: '150',
                    },
                },
                prv: account_1.owner_2,
            });
            builder.transfer().key(account_1.owner_2);
            const halfSignedTx = await builder.build();
            const halfSignedTxForBroadcasting = halfSignedTx.toBroadcastFormat();
            halfSignedRawTx.halfSigned.txHex.should.equals(halfSignedTxForBroadcasting);
            halfSignedRawTx.halfSigned.recipients.length.should.equals(1);
            halfSignedRawTx.halfSigned.recipients[0].address.toLowerCase().should.equals(account_2.address.toLowerCase());
            halfSignedRawTx.halfSigned.recipients[0].amount.toLowerCase().should.equals('1');
            halfSignedRawTx.halfSigned.eip1559.maxFeePerGas.should.equal('7593123');
            halfSignedRawTx.halfSigned.eip1559.maxPriorityFeePerGas.should.equal('150');
        });
        it('should sign an unsigned mainnet tx', async function () {
            const builder = (0, getBuilder_1.getBuilder)('avaxc');
            builder.fee({
                fee: '280000000000',
                gasLimit: '7000000',
            });
            builder.counter(1);
            builder.type(sdk_core_1.TransactionType.Send);
            builder.contract(account_1.address);
            builder.transfer().amount('1').to(account_2.address).expirationTime(10000).contractSequenceId(1);
            const unsignedTx = await builder.build();
            const unsignedTxForBroadcasting = unsignedTx.toBroadcastFormat();
            const halfSignedRawTx = await avaxCoin.signTransaction({
                txPrebuild: {
                    txHex: unsignedTxForBroadcasting,
                },
                prv: account_1.owner_2,
            });
            builder.transfer().key(account_1.owner_2);
            const halfSignedTx = await builder.build();
            const halfSignedTxForBroadcasting = halfSignedTx.toBroadcastFormat();
            halfSignedRawTx.halfSigned.txHex.should.equals(halfSignedTxForBroadcasting);
            halfSignedRawTx.halfSigned.recipients.length.should.equals(1);
            halfSignedRawTx.halfSigned.recipients[0].address.toLowerCase().should.equals(account_2.address.toLowerCase());
            halfSignedRawTx.halfSigned.recipients[0].amount.toLowerCase().should.equals('1');
        });
    });
    describe('Transaction Verification', () => {
        it('should verify a hop txPrebuild from the bitgo server that matches the client txParams', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [{ amount: 1000000000000000, address: hopDestinationAddress }],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
                hop: true,
            };
            const txPrebuild = {
                recipients: [{ amount: '5000000000000000', address: hopContractAddress }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
                hopTransaction: {
                    tx: hopTx,
                    id: hopTxid,
                    signature: hopTxBitgoSignature,
                    paymentId: '2773928196',
                    gasPrice: 20000000000,
                    gasLimit: 500000,
                    amount: '1000000000000000',
                    recipient: hopDestinationAddress,
                    nonce: 0,
                    userReqSig: userReqSig,
                    gasPriceMax: 500000000000,
                },
            };
            const verification = {};
            const isTransactionVerified = await tavaxCoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
            isTransactionVerified.should.equal(true);
        });
        describe('Hop export tx verify', () => {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const hopDestinationAddress = 'P-fuji13vkwxwqsq07ls6gq9q9yajrt8p946hye5zq3w3~P-fuji178atz5p3xhaagglygt27nde6h4tz9lsznwq2dh~P-fuji1kl7p7efzpwdqkt6rz4ut3wmwuyct7436q6l9h5';
            const hopAddress = '0x1fe3de7886be9e53072d6762e9fa1fc27dddfb05';
            const importTxFee = 1e6;
            const amount = 100000000000000000;
            const txParams = {
                recipients: [{ amount, address: hopDestinationAddress }],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
                hop: true,
                type: 'Export',
            };
            const txPrebuild = {
                recipients: [{ amount: '102000050000000000', address: hopAddress }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
                hopTransaction: {
                    tx: hopExportTx,
                    id: hopExportTxId,
                    signature: hopExportTxBitgoSignature,
                    paymentId: '4933349984',
                    gasPrice: '50',
                    gasLimit: 1,
                    amount: '101000000',
                    recipient: hopDestinationAddress,
                    nonce: 0,
                    userReqSig: '0x06fd0b1f8859a40d9fb2d1a65d54da5d645a1d81bbb8c1c5b037051843ec0d3c22433ec7f50cc97fa041cbf8d9ff5ddf7ed41f72a08fa3f1983fd651a33a4441',
                    gasPriceMax: 7187500000,
                    type: 'Export',
                },
            };
            const verification = {};
            before(() => {
                txPrebuild.hopTransaction.signature = hopExportTxBitgoSignature;
            });
            it('should verify successfully', async function () {
                const verifyAvaxcTransactionOptions = { txParams, txPrebuild, wallet, verification };
                const isTransactionVerified = await tavaxCoin.verifyTransaction(verifyAvaxcTransactionOptions);
                isTransactionVerified.should.equal(true);
            });
            it('should fail verify for amount plus 1', async function () {
                const verifyAvaxcTransactionOptions = {
                    txParams: { ...txParams, recipients: [{ amount: amount + 1e9, address: hopDestinationAddress }] },
                    txPrebuild,
                    wallet,
                    verification,
                };
                await tavaxCoin
                    .verifyTransaction(verifyAvaxcTransactionOptions)
                    .should.be.rejectedWith(`Hop amount: ${amount / 1e9 + importTxFee} does not equal original amount: ${amount / 1e9 + importTxFee + 1}`);
            });
            it('should fail verify for changed prebuild hop address', async function () {
                const verifyAvaxcTransactionOptions = {
                    txParams,
                    txPrebuild: { ...txPrebuild, recipients: [{ address: address2, amount: '102000050000000000' }] },
                    wallet,
                    verification,
                };
                await tavaxCoin
                    .verifyTransaction(verifyAvaxcTransactionOptions)
                    .should.be.rejectedWith(`recipient address of txPrebuild does not match hop address`);
            });
            it('should fail verify for changed address', async function () {
                const hopDestinationAddressDiff = 'P-fuji13vkwxwqsq07ls6gq8q9yajrt8p946hye5zq3w3~P-fuji178atz5p3xhabgglygt27nde6h4tz9lsznwq2dh~P-fuji1kl7p7efzpwdqkt6rz4ut3wmwuyct7436q6l9h6';
                const verifyAvaxcTransactionOptions = {
                    txParams: { ...txParams, recipients: [{ amount: amount, address: hopDestinationAddressDiff }] },
                    txPrebuild,
                    wallet,
                    verification,
                };
                await tavaxCoin
                    .verifyTransaction(verifyAvaxcTransactionOptions)
                    .should.be.rejectedWith(`Hop destination: ${hopDestinationAddress} does not equal original recipient: ${hopDestinationAddressDiff}`);
            });
            it('should verify if walletId is used instead of address', async function () {
                const verifyAvaxcTransactionOptions = {
                    txParams: { ...txParams, recipients: [{ amount: amount, walletId: 'same wallet' }] },
                    txPrebuild,
                    wallet,
                    verification,
                };
                const isTransactionVerified = await tavaxCoin.verifyTransaction(verifyAvaxcTransactionOptions);
                isTransactionVerified.should.equal(true);
            });
        });
        it('should reject when client txParams are missing', async function () {
            const coin = bitgo.coin('teth');
            const wallet = new sdk_core_1.Wallet(bitgo, coin, {});
            const txParams = null;
            const txPrebuild = {
                recipients: [{ amount: '1000000000000', address: address1 }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
            };
            const verification = {};
            await coin
                .verifyTransaction({ txParams: txParams, txPrebuild: txPrebuild, wallet, verification })
                .should.be.rejectedWith('missing params');
        });
        it('should reject txPrebuild that is both batch and hop', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [
                    { amount: '1000000000000', address: address1 },
                    { amount: '2500000000000', address: address2 },
                ],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
                hop: true,
            };
            const txPrebuild = {
                recipients: [{ amount: '3500000000000', address: address1 }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: true,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
                hopTransaction: {
                    tx: hopTx,
                    id: hopTxid,
                    signature: hopTxBitgoSignature,
                    paymentId: '2773928196',
                    gasPrice: 20000000000,
                    gasLimit: 500000,
                    amount: '1000000000000000',
                    recipient: hopDestinationAddress,
                    nonce: 0,
                    userReqSig: userReqSig,
                    gasPriceMax: 500000000000,
                },
            };
            const verification = {};
            await tavaxCoin
                .verifyTransaction({ txParams, txPrebuild, wallet, verification })
                .should.be.rejectedWith('tx cannot be both a batch and hop transaction');
        });
        it('should reject a txPrebuild with more than one recipient', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [
                    { amount: '1000000000000', address: address1 },
                    { amount: '2500000000000', address: address2 },
                ],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
            };
            const txPrebuild = {
                recipients: [
                    { amount: '1000000000000', address: address1 },
                    { amount: '2500000000000', address: address2 },
                ],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: true,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
            };
            const verification = {};
            await tavaxCoin
                .verifyTransaction({ txParams, txPrebuild, wallet, verification })
                .should.be.rejectedWith(`tavaxc doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
        });
        it('should reject a hop txPrebuild that does not send to its hop address', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [{ amount: '1000000000000000', address: hopDestinationAddress }],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
                hop: true,
            };
            const txPrebuild = {
                recipients: [{ amount: '5000000000000000', address: address1 }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
                hopTransaction: {
                    tx: hopTx,
                    id: hopTxid,
                    signature: hopTxBitgoSignature,
                    paymentId: '0',
                    gasPrice: 20000000000,
                    gasLimit: 500000,
                    amount: '1000000000000000',
                    recipient: hopDestinationAddress,
                    nonce: 0,
                    userReqSig: userReqSig,
                    gasPriceMax: 500000000000,
                },
            };
            const verification = {};
            await tavaxCoin
                .verifyTransaction({ txParams, txPrebuild, wallet, verification })
                .should.be.rejectedWith('recipient address of txPrebuild does not match hop address');
        });
        it('should reject a normal txPrebuild from the bitgo server with the wrong amount', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [{ amount: '1000000000000', address: address1 }],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
            };
            const txPrebuild = {
                recipients: [{ amount: '2000000000000', address: address1 }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
            };
            const verification = {};
            await tavaxCoin
                .verifyTransaction({ txParams, txPrebuild, wallet, verification })
                .should.be.rejectedWith('normal transaction amount in txPrebuild received from BitGo servers does not match txParams supplied by client');
        });
        it('should reject a normal txPrebuild from the bitgo server with the wrong recipient', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [{ amount: '1000000000000', address: address1 }],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
            };
            const txPrebuild = {
                recipients: [{ amount: '1000000000000', address: address2 }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'tavaxc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
            };
            const verification = {};
            await tavaxCoin
                .verifyTransaction({ txParams, txPrebuild, wallet, verification })
                .should.be.rejectedWith('destination address in normal txPrebuild does not match that in txParams supplied by client');
        });
        it('should verify a token txPrebuild from the bitgo server that matches the client txParams', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [{ amount: '1000000000000', address: address1 }],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
            };
            const txPrebuild = {
                recipients: [{ amount: '1000000000000', address: address1 }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'tavaxc',
                token: 'test',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
            };
            const verification = {};
            const isTransactionVerified = await tavaxCoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
            isTransactionVerified.should.equal(true);
        });
        it('should reject a txPrebuild from the bitgo server with the wrong coin', async function () {
            const wallet = new sdk_core_1.Wallet(bitgo, tavaxCoin, {});
            const txParams = {
                recipients: [{ amount: '1000000000000', address: address1 }],
                wallet: wallet,
                walletPassphrase: 'fakeWalletPassphrase',
            };
            const txPrebuild = {
                recipients: [{ amount: '1000000000000', address: address1 }],
                nextContractSequenceId: 0,
                gasPrice: 20000000000,
                gasLimit: 500000,
                isBatch: false,
                coin: 'btc',
                walletId: 'fakeWalletId',
                walletContractAddress: 'fakeWalletContractAddress',
            };
            const verification = {};
            await tavaxCoin
                .verifyTransaction({ txParams, txPrebuild, wallet, verification })
                .should.be.rejectedWith('coin in txPrebuild did not match that in txParams supplied by client');
        });
    });
    describe('Explain Transaction', () => {
        it('should explain a half signed import in C transaction', async () => {
            const testData = avaxc_1.IMPORT_C;
            const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.halfsigntxHex, crossChainType: 'import' });
            txExplain.outputAmount.should.equal((Number(testData.amount) - txExplain.fee?.fee).toString());
            txExplain.type.should.equal(sdk_core_1.TransactionType.Import);
            txExplain.outputs[0].address.should.equal(testData.to);
            txExplain.changeOutputs.should.be.empty();
            should.not.exist(txExplain.memo);
        });
        it('should explain a signed import in C transaction', async () => {
            const testData = avaxc_1.IMPORT_C;
            const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.fullsigntxHex, crossChainType: 'import' });
            txExplain.outputAmount.should.equal((Number(testData.amount) - txExplain.fee?.fee).toString());
            txExplain.type.should.equal(sdk_core_1.TransactionType.Import);
            txExplain.outputs[0].address.should.equal(testData.to);
            txExplain.changeOutputs.should.be.empty();
            should.not.exist(txExplain.memo);
        });
        it('should explain a unsigned export in C transaction', async () => {
            const importInPFee = 1000000;
            const testData = avaxc_1.EXPORT_C;
            const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.unsignedTxHex, crossChainType: 'export' });
            txExplain.outputAmount.should.equal((Number(testData.amount) + importInPFee).toString());
            txExplain.type.should.equal(sdk_core_1.TransactionType.Export);
            txExplain.inputs[0].address.should.equal(testData.cHexAddress);
            txExplain.outputs[0].address.should.equal(testData.pAddresses.slice().sort().join('~'));
            txExplain.fee.fee.should.equal(testData.fee);
            txExplain.changeOutputs.should.be.empty();
            should.not.exist(txExplain.memo);
        });
        it('should explain a signed export in C transaction', async () => {
            const importInPFee = 1000000;
            const testData = avaxc_1.EXPORT_C;
            const txExplain = await tavaxCoin.explainTransaction({ txHex: testData.fullsigntxHex, crossChainType: 'export' });
            txExplain.outputAmount.should.equal((Number(testData.amount) + importInPFee).toString());
            txExplain.type.should.equal(sdk_core_1.TransactionType.Export);
            txExplain.inputs[0].address.should.equal(testData.cHexAddress);
            txExplain.outputs[0].address.should.equal(testData.pAddresses.slice().sort().join('~'));
            txExplain.fee.fee.should.equal(testData.fee);
            txExplain.changeOutputs.should.be.empty();
            should.not.exist(txExplain.memo);
        });
    });
    // TODO(BG-56136): move to modules/bitgo/test/v2/integration/coins/avaxc.ts
    describe('Recovery', function () {
        // contract address for 'tavaxc:link'
        const tokenContractAddress = '0x0b9d5d9136855f6fec3c0993fee6e9ce8a297846';
        const sequenceIdData = '0xa0b7967b';
        const sandBox = sinon.createSandbox();
        beforeEach(function () {
            const callBack = sandBox.stub(src_1.AvaxC.prototype, 'recoveryBlockchainExplorerQuery');
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getTransactionCount',
                params: ['0xdfd95d01fc9c2cb744e2852256385bbe6d87b72b', 'latest'],
                id: 1,
            })
                .resolves({ jsonrpc: '2.0', id: 1, result: '0x0' });
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getTransactionCount',
                params: ['0x29d97ce344599825220a54a4bdf7b8aa7ca14fd1', 'latest'],
                id: 1,
            })
                .resolves({ jsonrpc: '2.0', id: 1, result: '0x7' });
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getBalance',
                params: ['0xdfd95d01fc9c2cb744e2852256385bbe6d87b72b', 'latest'],
                id: 1,
            })
                .resolves({ jsonrpc: '2.0', id: 1, result: '0x0' });
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getBalance',
                params: ['0x29d97ce344599825220a54a4bdf7b8aa7ca14fd1', 'latest'],
                id: 1,
            })
                .resolves({ jsonrpc: '2.0', id: 1, result: '0x315f8cb9bc2ec00' });
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getBalance',
                params: ['0xe0b1fe098050f2745b450de419b5cafc7e826699', 'latest'],
                id: 1,
            })
                .resolves({ jsonrpc: '2.0', id: 1, result: '0x0' });
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_call',
                params: [{ to: '0xe0b1fe098050f2745b450de419b5cafc7e826699', data: '0xa0b7967b' }, 'latest'],
                id: 1,
            })
                .resolves({
                jsonrpc: '2.0',
                id: 1,
                result: '0x000000000000000000000000000000000000000000000000000000000000000f',
            });
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getTransactionCount',
                params: [avaxc_1.recoveryUsers.hotWalletRecoveryUser.backupKeyAddress, 'latest'],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.addressNonceResponse1);
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getTransactionCount',
                params: [avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKeyAddress, 'latest'],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.addressNonceResponse2);
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getBalance',
                params: [avaxc_1.recoveryUsers.hotWalletRecoveryUser.backupKeyAddress, 'latest'],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.backupAddressBalanceResponse);
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_getBalance',
                params: [avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKeyAddress, 'latest'],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.backupAddressBalanceResponse);
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_call',
                params: [
                    {
                        to: tokenContractAddress,
                        data: sdk_coin_eth_1.optionalDeps.ethUtil.addHexPrefix(sdk_coin_eth_1.optionalDeps.ethAbi
                            .simpleEncode('balanceOf(address)', avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress)
                            .toString('hex')),
                    },
                    'latest',
                ],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.addressTokenBalanceResponse);
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_call',
                params: [
                    {
                        to: tokenContractAddress,
                        data: sdk_coin_eth_1.optionalDeps.ethUtil.addHexPrefix(sdk_coin_eth_1.optionalDeps.ethAbi
                            .simpleEncode('balanceOf(address)', avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress)
                            .toString('hex')),
                    },
                    'latest',
                ],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.addressTokenBalanceResponse);
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_call',
                params: [{ to: avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress, data: sequenceIdData }, 'latest'],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.sequenceIdResponse1);
            callBack
                .withArgs({
                jsonrpc: '2.0',
                method: 'eth_call',
                params: [{ to: avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress, data: sequenceIdData }, 'latest'],
                id: 1,
            })
                .resolves(avaxc_1.endpointResponses.sequenceIdResponse2);
        });
        afterEach(function () {
            sandBox.restore();
        });
        describe('Non-BitGo', async function () {
            it('should error when the backup key is unfunded (cannot pay gas)', async function () {
                await tavaxCoin
                    .recover({
                    userKey: '{"iv":"ntd9/urFjryqxd4rzREB2Q==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
                        ':"ccm","adata":"","cipher":"aes","salt":"LTqZ47b1BwE=","ct":"JSbJIBTkHoKR3L\n' +
                        'oT2QTkDx3X1OBIPxiSL6WoMiIrKA+aKTgmutXnWC2GTEIyfbLeajw6D2UZ+U0Y8viv7mgITgSz1\n' +
                        'u9Gdj97Btm8WsZ0e+KmsbdB/gYucCZoPUZCFqG4bEkdfZ8ZvDI9XvVv4xPzNb/AoSijosA="}',
                    backupKey: '{"iv":"Axs+G9gsZ5PENUHx1YY5cg==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
                        ':"ccm","adata":"","cipher":"aes","salt":"awQshUvFi7Q=","ct":"sWQ0bHmruUTI8C\n' +
                        'lwGneHObdNfo3WQ/mrz3p84Fo07HgizvgLd+E3wFA3Z1LRbHozRjfstV/qJMRqrFvEgKOcG+SKd\n' +
                        'gx6BbmXWfKhFHEerSYluBgU5OrXMfOkbExnMywEWrCKEvoNL+wyNHoRaMNbbDogo36J8PE="}',
                    walletContractAddress: '0x22c1ab44371985e49294d1a40e92c8ad00f5be8e',
                    // walletPassphrase: TestBitGo.V2.TEST_RECOVERY_PASSCODE,
                    walletPassphrase: 'Ghghjkg!455544llll',
                    recoveryDestination: '0x94b51ebb8c3b90404ad262f42c1588bd94242ecb',
                })
                    .should.be.rejectedWith('Backup key address 0xdfd95d01fc9c2cb744e2852256385bbe6d87b72b has balance 0 Gwei.This address must have a balance of at least 10000000 Gwei to perform recoveries. Try sending some AVAX to this address then retry.');
            });
            it('should build recovery tx', async function () {
                const recovery = await tavaxCoin.recover({
                    userKey: '{"iv":"o27pBl7IP+ibe39xYg/cXg==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
                        ':"ccm","adata":"","cipher":"aes","salt":"992R6padf2I=","ct":"6wkn1PdwtWcCWR\n' +
                        'VdOdaiGMCMS5RhurGI9eF4tdgzaMzOpgw56eYRmKTzldj5Vh1Cnz6RoqFlVSfnwR+tFjOyqDn3O\n' +
                        '8K3NUD5YlMGoCdfvcrCbPF3tCdKl2DyoLv+ZWPo5sKVjjgUOZgI7pn7iBtXRDvqaWylawY="}',
                    backupKey: '{"iv":"mwj9ld8svgRBsWS+5NZQqA==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
                        ':"ccm","adata":"","cipher":"aes","salt":"XuMxbqa/yNg=","ct":"lqLnjsVSBR/4ue\n' +
                        'ztYahAvEEV+ltDXLoyIEMCmFMycba+3mPtiAM8HrF/84AzJOjwKyvK1pm+CFuuWCTXssAQxRCuc\n' +
                        'HujrBvrKunY4hfIJHJsyBr+l1PNNSUB/aYL1aW/n7tdvwL8fOCNqFqEPBCbxXoOlSgCAUw="}',
                    walletContractAddress: '0xe0b1fe098050f2745b450de419b5cafc7e826699',
                    walletPassphrase: 'Ghghjkg!455544llll',
                    recoveryDestination: '0x94b51ebb8c3b90404ad262f42c1588bd94242ecb',
                    gasPrice: '30000000000',
                });
                // id and tx will always be different because of expireTime
                recovery.should.not.be.undefined();
                recovery.should.have.property('id');
                recovery.should.have.property('tx');
                const txBuilder = tavaxCoin.getTransactionBuilder();
                txBuilder.from(recovery.tx);
                const tx = await txBuilder.build();
                tx.toBroadcastFormat().should.not.be.empty();
            });
        });
        describe('Unsigned Sweep', function () {
            const userXprv = 'xprv9s21ZrQH143K3fZVRfmxvr7YBodF4jSczgKU6RoDUzvKnFiFz2mcuKgw1zYgvTGtLMBPAPonv5GzHnDXQK5Vk8BRHcN76TGgLwcNcFTy4kC';
            const userXpub = 'xpub661MyMwAqRbcG9dxXhJyHz4GjqTjUCAUMuF4tpCq3LTJf43QXa5sT81QsJ5VMdK8vnAK56gi7qy2cZ2dzYQfy7YP7x4uHQpuRViAv9CNbtS';
            const backupXprv = 'xprv9s21ZrQH143K4N6YBjooa6Tx3U7hzM3SvHFA8XP23qYhQ6KPLo2QgXTSasVpiMY4F6gMrstXBHRDso5WE7Gn37yZnW5qTRJZU6FPeXx1B69';
            const backupXpub = 'xpub661MyMwAqRbcGrB1HmLowEQgbVxCPomJHWAkvundcB5gGteXtLLfEKmvSB9dKvRmh3LxpL2yvgqy37Z3ydqvHoViMWa2dwX3huwmmBuip7J';
            const walletContractAddress = '0xe0b1fe098050f2745b450de419b5cafc7e826699';
            const recoveryDestination = '0x94b51ebb8c3b90404ad262f42c1588bd94242ecb';
            const gasPrice = '25000000000';
            it('should build unsigned sweep tx', async function () {
                const recovery = await tavaxCoin.recover({
                    userKey: userXpub,
                    backupKey: backupXpub,
                    walletContractAddress,
                    recoveryDestination,
                    gasPrice,
                });
                const parsedTx = (0, helpers_1.parseTransaction)(recovery.txHex);
                const decodedSendMultisigCallData = (0, helpers_1.decodeTransaction)(JSON.stringify(helpers_1.walletSimpleABI), parsedTx.data);
                const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
                const safeTransferFromDestination = decodedSendMultisigCallData.args[0];
                safeTransferFromDestination.toLowerCase().should.equal(recoveryDestination);
                safeTransferFromCallData.should.be.equal('0x');
                recovery.should.not.be.undefined();
                recovery.should.have.properties('txHex', 'userKey', 'backupKey');
                recovery.recipients.length.should.equal(1);
                recovery.recipients[0].address.should.equal(recoveryDestination);
                recovery.walletContractAddress.should.equal(walletContractAddress);
            });
            it('should add a second signature', async function () {
                const recovery = await tavaxCoin.recover({
                    userKey: userXpub,
                    backupKey: backupXpub,
                    walletContractAddress,
                    recoveryDestination,
                    gasPrice,
                });
                const txPrebuild = {
                    txHex: recovery.txHex,
                    userKey: userXpub,
                    backupKey: backupXpub,
                    coin: recovery.coin,
                    gasPrice: recovery.gasPrice,
                    gasLimit: recovery.gasLimit,
                    recipients: recovery.recipients,
                    walletContractAddress: recovery.walletContractAddress,
                    amount: recovery.amount,
                    backupKeyNonce: recovery.backupKeyNonce,
                    recipient: recovery.recipient,
                    expireTime: recovery.expireTime,
                    contractSequenceId: recovery.contractSequenceId,
                    nextContractSequenceId: recovery.nextContractSequenceId,
                };
                const params = {
                    txPrebuild,
                    prv: userXprv,
                };
                // sign transaction once
                const halfSigned = await tavaxCoin.signTransaction(params);
                const wrapper = {};
                wrapper.txPrebuild = halfSigned;
                wrapper.isLastSignature = true;
                wrapper.walletContractAddress = walletContractAddress;
                wrapper.prv = backupXprv;
                // sign transaction twice with the "isLastSignature" flag
                const finalSignedTx = await tavaxCoin.signTransaction(wrapper);
                finalSignedTx.should.have.property('txHex');
                const txBuilder = tavaxCoin.getTransactionBuilder();
                txBuilder.from(finalSignedTx.txHex);
                const rebuiltTx = await txBuilder.build();
                rebuiltTx.signature.length.should.equal(2);
                rebuiltTx.outputs.length.should.equal(1);
                rebuiltTx.outputs[0].address.should.equal(txPrebuild.recipient.address);
                rebuiltTx.outputs[0].value.should.equal(txPrebuild.recipient.amount);
            });
        });
        describe('Token Recovery', async function () {
            const destAddr = '0xc74b1c0ee90a481b528253042ce3228a8cd6873e';
            const weiToGwei = 10 ** 9;
            const gasPrice = 30 * weiToGwei;
            // contract address for 'tavaxc:link'
            const tokenContractAddress = '0x0b9d5d9136855f6fec3c0993fee6e9ce8a297846';
            const tokenName = 'tavaxc:link';
            it('should build token recovery tx', async function () {
                const params = {
                    userKey: avaxc_1.recoveryUsers.hotWalletRecoveryUser.userKey,
                    backupKey: avaxc_1.recoveryUsers.hotWalletRecoveryUser.backupKey,
                    recoveryDestination: destAddr,
                    walletPassphrase: avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletPassphrase,
                    walletContractAddress: avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress,
                    tokenContractAddress,
                    gasPrice: gasPrice.toString(),
                };
                const recoveryTxn = await tavaxCoin.recover(params);
                recoveryTxn.should.not.be.undefined();
                recoveryTxn.should.have.property('id');
                recoveryTxn.should.have.property('tx');
                const txBuilder = tavaxCoin.getTransactionBuilder();
                txBuilder.from(recoveryTxn.tx);
                const tx = await txBuilder.build();
                tx.toBroadcastFormat().should.not.be.empty();
                tx.inputs.should.not.be.empty();
                tx.inputs[0].address.should.equal(avaxc_1.recoveryUsers.hotWalletRecoveryUser.walletContractAddress);
                tx.inputs[0].value.should.equal(new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10));
                tx.inputs[0].coin?.should.equal(tokenName);
                tx.outputs.should.not.be.empty();
                tx.outputs[0].address.should.equal(destAddr);
                tx.outputs[0].value.should.equal(new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10));
                tx.outputs[0].coin?.should.equal(tokenName);
            });
            it('should build unsigned sweep token recovery tx', async function () {
                const params = {
                    userKey: avaxc_1.recoveryUsers.coldWalletRecoveryUser.userKey,
                    backupKey: avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKey,
                    recoveryDestination: destAddr,
                    walletPassphrase: avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletPassphrase,
                    walletContractAddress: avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress,
                    tokenContractAddress,
                    gasPrice: gasPrice.toString(),
                };
                const recoveryTxn = await tavaxCoin.recover(params);
                recoveryTxn.should.not.be.undefined();
                recoveryTxn.should.have.property('txHex');
                recoveryTxn.should.have.property('token');
                recoveryTxn.token.should.equal('tavaxc:link');
                const txBuilder = tavaxCoin.getTransactionBuilder();
                txBuilder.from(recoveryTxn.txHex);
                const tx = await txBuilder.build();
                const recoveryAmount = new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10);
                tx.toBroadcastFormat().should.not.be.empty();
                tx.inputs.should.not.be.empty();
                tx.inputs[0].address.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress);
                tx.inputs[0].value.should.equal(recoveryAmount);
                tx.inputs[0].should.have.property('coin');
                tx.inputs[0].coin?.should.equal(tokenName);
                tx.outputs.should.not.be.empty();
                tx.outputs[0].address.should.equal(destAddr);
                tx.outputs[0].value.should.equal(new ethereumjs_util_1.BN(avaxc_1.endpointResponses.addressTokenBalanceResponse.result.slice(2), 16).toString(10));
                tx.outputs[0].should.have.property('coin');
                tx.outputs[0].coin?.should.equal(tokenName);
                recoveryTxn.should.have.property('userKey');
                recoveryTxn.userKey.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.userKey);
                recoveryTxn.should.have.property('backupKey');
                recoveryTxn.backupKey.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.backupKey);
                recoveryTxn.should.have.property('coin');
                recoveryTxn.coin.should.equal('tavaxc');
                recoveryTxn.should.have.property('gasPrice');
                recoveryTxn.gasPrice.should.equal(gasPrice.toString());
                recoveryTxn.should.have.property('gasLimit');
                recoveryTxn.gasLimit.should.equal('500000');
                recoveryTxn.should.have.property('recipients');
                recoveryTxn.recipients.length.should.equal(1);
                recoveryTxn.recipients[0].address.should.equal(destAddr);
                recoveryTxn.recipients[0].amount.should.equal(recoveryAmount);
                recoveryTxn.should.have.property('walletContractAddress');
                recoveryTxn.walletContractAddress.should.equal(avaxc_1.recoveryUsers.coldWalletRecoveryUser.walletContractAddress);
                recoveryTxn.should.have.property('amount');
                recoveryTxn.amount.should.equal(recoveryAmount);
                recoveryTxn.should.have.property('recipient');
                recoveryTxn.recipient.address.should.equal(destAddr);
                recoveryTxn.recipient.amount.should.equal(recoveryAmount);
                recoveryTxn.should.have.property('tokenContractAddress');
                recoveryTxn.tokenContractAddress.should.equal(tokenContractAddress);
                recoveryTxn.should.have.property('backupKeyNonce');
                recoveryTxn.should.have.property('expireTime');
                recoveryTxn.should.have.property('contractSequenceId');
                recoveryTxn.should.have.property('nextContractSequenceId');
            });
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZheGMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvYXZheGMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLG1DQUE4RDtBQUM5RCw2Q0FBMEM7QUFDMUMscURBQXVDO0FBQ3ZDLGdEQUF5QztBQUN6QywyQ0FBNkI7QUFDN0IsOENBQWtFO0FBQ2xFLHNEQUF3RDtBQUV4RCwrQ0FBaUM7QUFDakMsOENBQTBGO0FBQzFGLDBEQUErQztBQUMvQyx1Q0FBaUY7QUFDakYsNkNBQStCO0FBQy9CLHFEQUFxQztBQUVyQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUV4QixRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksU0FBUyxDQUFDO0lBQ2QsSUFBSSxRQUFRLENBQUM7SUFDYixJQUFJLG1CQUFtQixDQUFDO0lBQ3hCLElBQUkseUJBQXlCLENBQUM7SUFFOUIsTUFBTSxRQUFRLEdBQUcsNENBQTRDLENBQUM7SUFDOUQsTUFBTSxRQUFRLEdBQUcsNENBQTRDLENBQUM7SUFDOUQsTUFBTSxrQkFBa0IsR0FBRyw0Q0FBNEMsQ0FBQztJQUN4RSxNQUFNLHFCQUFxQixHQUFHLDRDQUE0QyxDQUFDO0lBQzNFLE1BQU0sS0FBSyxHQUNULDhOQUE4TixDQUFDO0lBQ2pPLE1BQU0sT0FBTyxHQUFHLG9FQUFvRSxDQUFDO0lBQ3JGLE1BQU0sVUFBVSxHQUNkLG9JQUFvSSxDQUFDO0lBQ3ZJLE1BQU0sV0FBVyxHQUNmLGtzQkFBa3NCLENBQUM7SUFDcnNCLE1BQU0sYUFBYSxHQUFHLG9FQUFvRSxDQUFDO0lBRTNGLE1BQU0sQ0FBQztRQUNMLE1BQU0sWUFBWSxHQUNoQixpSEFBaUgsQ0FBQztRQUNwSCxNQUFNLFFBQVEsR0FBRyxpQkFBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqRCxtQkFBbUI7WUFDakIsTUFBTTtnQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQzVHLEtBQUssQ0FDTixDQUFDO1FBRUoseUJBQXlCO1lBQ3ZCLE1BQU07Z0JBQ04sTUFBTSxDQUFDLElBQUksQ0FDVCxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUMvRixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDbkIsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFdBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsa0JBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSx1QkFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELGlCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDeEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFXLENBQUM7UUFDM0MsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFVLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxLQUFLLENBQUM7UUFDSixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQ3JDLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtZQUNoQyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBTSxDQUFDLENBQUM7WUFFOUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQUcsV0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUMxRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtZQUN4RCxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLEVBQUU7WUFDdkQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQ2hELE1BQU0sSUFBSSxHQUFHLGtDQUFrQyxDQUFDO1lBQ2hELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6RSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQzVCLGlIQUFpSCxDQUNsSCxDQUFDO1lBQ0YsWUFBWSxDQUFDLEdBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUM3QixpSEFBaUgsQ0FDbEgsQ0FBQztZQUNGLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7WUFDcEQsTUFBTSxxQkFBcUIsR0FDekIsb0lBQW9JLENBQUM7WUFDdkksU0FBUyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1lBQ2xELE1BQU0sbUJBQW1CLEdBQUcsb0VBQW9FLENBQUM7WUFDakcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1lBQzVDLE1BQU0saUJBQWlCLEdBQ3JCLGlIQUFpSCxDQUFDO1lBQ3BILFNBQVMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pELFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBRyw0Q0FBNEMsQ0FBQztZQUM3RCxTQUFTLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkQsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUFHO2dCQUNkLCtDQUErQztnQkFDL0MsK0NBQStDO2dCQUMvQyxnREFBZ0Q7YUFDakQsQ0FBQztZQUVGLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7WUFDckQsTUFBTSxPQUFPLEdBQ1gsMklBQTJJLENBQUM7WUFDOUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25ELFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtRQUM5QyxFQUFFLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO1lBQ3ZDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFMUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xELFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7WUFDcEMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RELFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7WUFDeEQsTUFBTSxxQkFBcUIsR0FDekIsb0lBQW9JLENBQUM7WUFFdkksU0FBUyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZFLFFBQVEsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsTUFBTSxtQkFBbUIsR0FBRyxvRUFBb0UsQ0FBQztZQUVqRyxTQUFTLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxNQUFNLGlCQUFpQixHQUNyQixpSEFBaUgsQ0FBQztZQUVwSCxTQUFTLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRyxRQUFRLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsTUFBTSxPQUFPLEdBQUcsNENBQTRDLENBQUM7WUFFN0QsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3RCxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtZQUN2RCxNQUFNLHFCQUFxQixHQUN6QixvSUFBb0ksQ0FBQztZQUV2SSxTQUFTLENBQUMsVUFBVSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtZQUNyRCxNQUFNLG1CQUFtQixHQUFHLG9FQUFvRSxDQUFDO1lBRWpHLFNBQVMsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuRSxRQUFRLENBQUMsVUFBVSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQy9DLE1BQU0saUJBQWlCLEdBQ3JCLGlIQUFpSCxDQUFDO1lBRXBILFNBQVMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqRSxRQUFRLENBQUMsVUFBVSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHLDRDQUE0QyxDQUFDO1lBRTdELFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0QsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtRQUNoQyxNQUFNLFNBQVMsR0FBRztZQUNoQixPQUFPLEVBQUUsNENBQTRDO1lBQ3JELE9BQU8sRUFBRSxrRUFBa0U7WUFDM0UsT0FBTyxFQUFFLGtFQUFrRTtZQUMzRSxPQUFPLEVBQUUsa0VBQWtFO1NBQzVFLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRztZQUNoQixPQUFPLEVBQUUsNENBQTRDO1lBQ3JELE9BQU8sRUFBRSxrRUFBa0U7WUFDM0UsT0FBTyxFQUFFLGtFQUFrRTtZQUMzRSxPQUFPLEVBQUUsa0VBQWtFO1NBQzVFLENBQUM7UUFFRixFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSztZQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFBLHVCQUFVLEVBQUMsUUFBUSxDQUF1QixDQUFDO1lBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ1YsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2FBQ3BCLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFakcsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsTUFBTSx5QkFBeUIsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUVqRSxNQUFNLGVBQWUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxlQUFlLENBQUM7Z0JBQ3RELFVBQVUsRUFBRTtvQkFDVixLQUFLLEVBQUUseUJBQXlCO2lCQUNqQztnQkFDRCxHQUFHLEVBQUUsU0FBUyxDQUFDLE9BQU87YUFDdkIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0MsTUFBTSwyQkFBMkIsR0FBRyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUVyRSxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDNUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzlHLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEtBQUs7WUFDdEQsTUFBTSxPQUFPLEdBQUcsSUFBQSx1QkFBVSxFQUFDLFFBQVEsQ0FBdUIsQ0FBQztZQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUNWLEdBQUcsRUFBRSxjQUFjO2dCQUNuQixRQUFRLEVBQUUsU0FBUztnQkFDbkIsT0FBTyxFQUFFO29CQUNQLFlBQVksRUFBRSxTQUFTO29CQUN2QixvQkFBb0IsRUFBRSxLQUFLO2lCQUM1QjthQUNGLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFakcsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsTUFBTSx5QkFBeUIsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUVqRSxNQUFNLGVBQWUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxlQUFlLENBQUM7Z0JBQ3RELFVBQVUsRUFBRTtvQkFDVixLQUFLLEVBQUUseUJBQXlCO29CQUNoQyxPQUFPLEVBQUU7d0JBQ1AsWUFBWSxFQUFFLFNBQVM7d0JBQ3ZCLG9CQUFvQixFQUFFLEtBQUs7cUJBQzVCO2lCQUNGO2dCQUNELEdBQUcsRUFBRSxTQUFTLENBQUMsT0FBTzthQUN2QixDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxNQUFNLDJCQUEyQixHQUFHLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRXJFLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM1RSxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakYsZUFBZSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLO1lBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7WUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDVixHQUFHLEVBQUUsY0FBYztnQkFDbkIsUUFBUSxFQUFFLFNBQVM7YUFDcEIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqRyxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QyxNQUFNLHlCQUF5QixHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRWpFLE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQztnQkFDckQsVUFBVSxFQUFFO29CQUNWLEtBQUssRUFBRSx5QkFBeUI7aUJBQ2pDO2dCQUNELEdBQUcsRUFBRSxTQUFTLENBQUMsT0FBTzthQUN2QixDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxNQUFNLDJCQUEyQixHQUFHLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRXJFLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM1RSxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7UUFDeEMsRUFBRSxDQUFDLHVGQUF1RixFQUFFLEtBQUs7WUFDL0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFaEQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUM7Z0JBQzFFLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGdCQUFnQixFQUFFLHNCQUFzQjtnQkFDeEMsR0FBRyxFQUFFLElBQUk7YUFDVixDQUFDO1lBRUYsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDO2dCQUN6RSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsV0FBVztnQkFDckIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixxQkFBcUIsRUFBRSwyQkFBMkI7Z0JBQ2xELGNBQWMsRUFBRTtvQkFDZCxFQUFFLEVBQUUsS0FBSztvQkFDVCxFQUFFLEVBQUUsT0FBTztvQkFDWCxTQUFTLEVBQUUsbUJBQW1CO29CQUM5QixTQUFTLEVBQUUsWUFBWTtvQkFDdkIsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFFBQVEsRUFBRSxNQUFNO29CQUNoQixNQUFNLEVBQUUsa0JBQWtCO29CQUMxQixTQUFTLEVBQUUscUJBQXFCO29CQUNoQyxLQUFLLEVBQUUsQ0FBQztvQkFDUixVQUFVLEVBQUUsVUFBVTtvQkFDdEIsV0FBVyxFQUFFLFlBQVk7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUV4QixNQUFNLHFCQUFxQixHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoSCxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtZQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxNQUFNLHFCQUFxQixHQUN6QiwySUFBMkksQ0FBQztZQUM5SSxNQUFNLFVBQVUsR0FBRyw0Q0FBNEMsQ0FBQztZQUNoRSxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7WUFDeEIsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUM7WUFDbEMsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxNQUFNO2dCQUNkLGdCQUFnQixFQUFFLHNCQUFzQjtnQkFDeEMsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsSUFBSSxFQUFFLFFBQVE7YUFDZixDQUFDO1lBRUYsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztnQkFDbkUsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsY0FBYztnQkFDeEIscUJBQXFCLEVBQUUsMkJBQTJCO2dCQUNsRCxjQUFjLEVBQUU7b0JBQ2QsRUFBRSxFQUFFLFdBQVc7b0JBQ2YsRUFBRSxFQUFFLGFBQWE7b0JBQ2pCLFNBQVMsRUFBRSx5QkFBeUI7b0JBQ3BDLFNBQVMsRUFBRSxZQUFZO29CQUN2QixRQUFRLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUsV0FBVztvQkFDbkIsU0FBUyxFQUFFLHFCQUFxQjtvQkFDaEMsS0FBSyxFQUFFLENBQUM7b0JBQ1IsVUFBVSxFQUNSLG9JQUFvSTtvQkFDdEksV0FBVyxFQUFFLFVBQVU7b0JBQ3ZCLElBQUksRUFBRSxRQUFRO2lCQUNmO2FBQ0YsQ0FBQztZQUVGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUV4QixNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNWLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLHlCQUF5QixDQUFDO1lBQ2xFLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEtBQUs7Z0JBQ3BDLE1BQU0sNkJBQTZCLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztnQkFDckYsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2dCQUMvRixxQkFBcUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUs7Z0JBQzlDLE1BQU0sNkJBQTZCLEdBQUc7b0JBQ3BDLFFBQVEsRUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRTtvQkFDakcsVUFBVTtvQkFDVixNQUFNO29CQUNOLFlBQVk7aUJBQ2IsQ0FBQztnQkFFRixNQUFNLFNBQVM7cUJBQ1osaUJBQWlCLENBQUMsNkJBQTZCLENBQUM7cUJBQ2hELE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUNyQixlQUFlLE1BQU0sR0FBRyxHQUFHLEdBQUcsV0FBVyxvQ0FDdkMsTUFBTSxHQUFHLEdBQUcsR0FBRyxXQUFXLEdBQUcsQ0FDL0IsRUFBRSxDQUNILENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxLQUFLO2dCQUM3RCxNQUFNLDZCQUE2QixHQUFHO29CQUNwQyxRQUFRO29CQUNSLFVBQVUsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFO29CQUNoRyxNQUFNO29CQUNOLFlBQVk7aUJBQ2IsQ0FBQztnQkFDRixNQUFNLFNBQVM7cUJBQ1osaUJBQWlCLENBQUMsNkJBQTZCLENBQUM7cUJBQ2hELE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLDREQUE0RCxDQUFDLENBQUM7WUFDMUYsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsS0FBSztnQkFDaEQsTUFBTSx5QkFBeUIsR0FDN0IsMklBQTJJLENBQUM7Z0JBQzlJLE1BQU0sNkJBQTZCLEdBQUc7b0JBQ3BDLFFBQVEsRUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxFQUFFO29CQUMvRixVQUFVO29CQUNWLE1BQU07b0JBQ04sWUFBWTtpQkFDYixDQUFDO2dCQUNGLE1BQU0sU0FBUztxQkFDWixpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FBQztxQkFDaEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQ3JCLG9CQUFvQixxQkFBcUIsdUNBQXVDLHlCQUF5QixFQUFFLENBQzVHLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLO2dCQUM5RCxNQUFNLDZCQUE2QixHQUFHO29CQUNwQyxRQUFRLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUU7b0JBQ3BGLFVBQVU7b0JBQ1YsTUFBTTtvQkFDTixZQUFZO2lCQUNiLENBQUM7Z0JBQ0YsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2dCQUMvRixxQkFBcUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsS0FBSztZQUN4RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQztZQUV0QixNQUFNLFVBQVUsR0FBRztnQkFDakIsVUFBVSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDNUQsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsY0FBYztnQkFDeEIscUJBQXFCLEVBQUUsMkJBQTJCO2FBQ25ELENBQUM7WUFFRixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7WUFFeEIsTUFBTSxJQUFJO2lCQUNQLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQWUsRUFBRSxVQUFVLEVBQUUsVUFBaUIsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7aUJBQ3JHLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSztZQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVoRCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1YsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7b0JBQzlDLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO2lCQUMvQztnQkFDRCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxnQkFBZ0IsRUFBRSxzQkFBc0I7Z0JBQ3hDLEdBQUcsRUFBRSxJQUFJO2FBQ1YsQ0FBQztZQUVGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsV0FBVztnQkFDckIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixxQkFBcUIsRUFBRSwyQkFBMkI7Z0JBQ2xELGNBQWMsRUFBRTtvQkFDZCxFQUFFLEVBQUUsS0FBSztvQkFDVCxFQUFFLEVBQUUsT0FBTztvQkFDWCxTQUFTLEVBQUUsbUJBQW1CO29CQUM5QixTQUFTLEVBQUUsWUFBWTtvQkFDdkIsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFFBQVEsRUFBRSxNQUFNO29CQUNoQixNQUFNLEVBQUUsa0JBQWtCO29CQUMxQixTQUFTLEVBQUUscUJBQXFCO29CQUNoQyxLQUFLLEVBQUUsQ0FBQztvQkFDUixVQUFVLEVBQUUsVUFBVTtvQkFDdEIsV0FBVyxFQUFFLFlBQVk7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUV4QixNQUFNLFNBQVM7aUJBQ1osaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztpQkFDakUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWhELE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRTtvQkFDVixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtvQkFDOUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7aUJBQy9DO2dCQUNELE1BQU0sRUFBRSxNQUFNO2dCQUNkLGdCQUFnQixFQUFFLHNCQUFzQjthQUN6QyxDQUFDO1lBRUYsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRTtvQkFDVixFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtvQkFDOUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7aUJBQy9DO2dCQUNELHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLHFCQUFxQixFQUFFLDJCQUEyQjthQUNuRCxDQUFDO1lBRUYsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBRXhCLE1BQU0sU0FBUztpQkFDWixpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDO2lCQUNqRSxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FDckIsMElBQTBJLENBQzNJLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzRUFBc0UsRUFBRSxLQUFLO1lBQzlFLE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWhELE1BQU0sUUFBUSxHQUFHO2dCQUNmLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1RSxNQUFNLEVBQUUsTUFBTTtnQkFDZCxnQkFBZ0IsRUFBRSxzQkFBc0I7Z0JBQ3hDLEdBQUcsRUFBRSxJQUFJO2FBQ1YsQ0FBQztZQUVGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQy9ELHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLHFCQUFxQixFQUFFLDJCQUEyQjtnQkFDbEQsY0FBYyxFQUFFO29CQUNkLEVBQUUsRUFBRSxLQUFLO29CQUNULEVBQUUsRUFBRSxPQUFPO29CQUNYLFNBQVMsRUFBRSxtQkFBbUI7b0JBQzlCLFNBQVMsRUFBRSxHQUFHO29CQUNkLFFBQVEsRUFBRSxXQUFXO29CQUNyQixRQUFRLEVBQUUsTUFBTTtvQkFDaEIsTUFBTSxFQUFFLGtCQUFrQjtvQkFDMUIsU0FBUyxFQUFFLHFCQUFxQjtvQkFDaEMsS0FBSyxFQUFFLENBQUM7b0JBQ1IsVUFBVSxFQUFFLFVBQVU7b0JBQ3RCLFdBQVcsRUFBRSxZQUFZO2lCQUMxQjthQUNGLENBQUM7WUFFRixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7WUFFeEIsTUFBTSxTQUFTO2lCQUNaLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7aUJBQ2pFLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0VBQStFLEVBQUUsS0FBSztZQUN2RixNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVoRCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxnQkFBZ0IsRUFBRSxzQkFBc0I7YUFDekMsQ0FBQztZQUVGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsV0FBVztnQkFDckIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixxQkFBcUIsRUFBRSwyQkFBMkI7YUFDbkQsQ0FBQztZQUVGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUV4QixNQUFNLFNBQVM7aUJBQ1osaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztpQkFDakUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQ3JCLGdIQUFnSCxDQUNqSCxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0ZBQWtGLEVBQUUsS0FBSztZQUMxRixNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVoRCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxnQkFBZ0IsRUFBRSxzQkFBc0I7YUFDekMsQ0FBQztZQUVGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsV0FBVztnQkFDckIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixxQkFBcUIsRUFBRSwyQkFBMkI7YUFDbkQsQ0FBQztZQUVGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUV4QixNQUFNLFNBQVM7aUJBQ1osaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztpQkFDakUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQ3JCLDZGQUE2RixDQUM5RixDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUZBQXlGLEVBQUUsS0FBSztZQUNqRyxNQUFNLE1BQU0sR0FBRyxJQUFJLGlCQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVoRCxNQUFNLFFBQVEsR0FBRztnQkFDZixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxnQkFBZ0IsRUFBRSxzQkFBc0I7YUFDekMsQ0FBQztZQUVGLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsV0FBVztnQkFDckIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLEtBQUssRUFBRSxNQUFNO2dCQUNiLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixxQkFBcUIsRUFBRSwyQkFBMkI7YUFDbkQsQ0FBQztZQUVGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUV4QixNQUFNLHFCQUFxQixHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoSCxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNFQUFzRSxFQUFFLEtBQUs7WUFDOUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFaEQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsVUFBVSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDNUQsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsZ0JBQWdCLEVBQUUsc0JBQXNCO2FBQ3pDLENBQUM7WUFFRixNQUFNLFVBQVUsR0FBRztnQkFDakIsVUFBVSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDNUQsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsS0FBSztnQkFDWCxRQUFRLEVBQUUsY0FBYztnQkFDeEIscUJBQXFCLEVBQUUsMkJBQTJCO2FBQ25ELENBQUM7WUFFRixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7WUFFeEIsTUFBTSxTQUFTO2lCQUNaLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7aUJBQ2pFLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BFLE1BQU0sUUFBUSxHQUFHLGdCQUFRLENBQUM7WUFDMUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxTQUFTLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNsSCxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMvRixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQy9ELE1BQU0sUUFBUSxHQUFHLGdCQUFRLENBQUM7WUFDMUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxTQUFTLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNsSCxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMvRixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxnQkFBUSxDQUFDO1lBQzFCLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbEgsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9ELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQy9ELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxnQkFBUSxDQUFDO1lBQzFCLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbEgsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9ELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCwyRUFBMkU7SUFDM0UsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUNuQixxQ0FBcUM7UUFDckMsTUFBTSxvQkFBb0IsR0FBRyw0Q0FBNEMsQ0FBQztRQUMxRSxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLFVBQVUsQ0FBQztZQUNULE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBSyxDQUFDLFNBQVMsRUFBRSxpQ0FBZ0QsQ0FBQyxDQUFDO1lBQ2pHLFFBQVE7aUJBQ0wsUUFBUSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSx5QkFBeUI7Z0JBQ2pDLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztnQkFDaEUsRUFBRSxFQUFFLENBQUM7YUFDTixDQUFDO2lCQUNELFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN0RCxRQUFRO2lCQUNMLFFBQVEsQ0FBQztnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUseUJBQXlCO2dCQUNqQyxNQUFNLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hFLEVBQUUsRUFBRSxDQUFDO2FBQ04sQ0FBQztpQkFDRCxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdEQsUUFBUTtpQkFDTCxRQUFRLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLGdCQUFnQjtnQkFDeEIsTUFBTSxFQUFFLENBQUMsNENBQTRDLEVBQUUsUUFBUSxDQUFDO2dCQUNoRSxFQUFFLEVBQUUsQ0FBQzthQUNOLENBQUM7aUJBQ0QsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELFFBQVE7aUJBQ0wsUUFBUSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztnQkFDaEUsRUFBRSxFQUFFLENBQUM7YUFDTixDQUFDO2lCQUNELFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLFFBQVE7aUJBQ0wsUUFBUSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztnQkFDaEUsRUFBRSxFQUFFLENBQUM7YUFDTixDQUFDO2lCQUNELFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN0RCxRQUFRO2lCQUNMLFFBQVEsQ0FBQztnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsNENBQTRDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLFFBQVEsQ0FBQztnQkFDNUYsRUFBRSxFQUFFLENBQUM7YUFDTixDQUFDO2lCQUNELFFBQVEsQ0FBQztnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxNQUFNLEVBQUUsb0VBQW9FO2FBQzdFLENBQUMsQ0FBQztZQUNMLFFBQVE7aUJBQ0wsUUFBUSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSx5QkFBeUI7Z0JBQ2pDLE1BQU0sRUFBRSxDQUFDLHFCQUFhLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDO2dCQUN4RSxFQUFFLEVBQUUsQ0FBQzthQUNOLENBQUM7aUJBQ0QsUUFBUSxDQUFDLHlCQUFpQixDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDckQsUUFBUTtpQkFDTCxRQUFRLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLHlCQUF5QjtnQkFDakMsTUFBTSxFQUFFLENBQUMscUJBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUM7Z0JBQ3pFLEVBQUUsRUFBRSxDQUFDO2FBQ04sQ0FBQztpQkFDRCxRQUFRLENBQUMseUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNyRCxRQUFRO2lCQUNMLFFBQVEsQ0FBQztnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixNQUFNLEVBQUUsQ0FBQyxxQkFBYSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQztnQkFDeEUsRUFBRSxFQUFFLENBQUM7YUFDTixDQUFDO2lCQUNELFFBQVEsQ0FBQyx5QkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQzVELFFBQVE7aUJBQ0wsUUFBUSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxDQUFDLHFCQUFhLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDO2dCQUN6RSxFQUFFLEVBQUUsQ0FBQzthQUNOLENBQUM7aUJBQ0QsUUFBUSxDQUFDLHlCQUFpQixDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDNUQsUUFBUTtpQkFDTCxRQUFRLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRTtvQkFDTjt3QkFDRSxFQUFFLEVBQUUsb0JBQW9CO3dCQUN4QixJQUFJLEVBQUUsMkJBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUNyQywyQkFBWSxDQUFDLE1BQU07NkJBQ2hCLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxxQkFBYSxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDOzZCQUM3RixRQUFRLENBQUMsS0FBSyxDQUFDLENBQ25CO3FCQUNGO29CQUNELFFBQVE7aUJBQ1Q7Z0JBQ0QsRUFBRSxFQUFFLENBQUM7YUFDTixDQUFDO2lCQUNELFFBQVEsQ0FBQyx5QkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzNELFFBQVE7aUJBQ0wsUUFBUSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUU7b0JBQ047d0JBQ0UsRUFBRSxFQUFFLG9CQUFvQjt3QkFDeEIsSUFBSSxFQUFFLDJCQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FDckMsMkJBQVksQ0FBQyxNQUFNOzZCQUNoQixZQUFZLENBQUMsb0JBQW9CLEVBQUUscUJBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQzs2QkFDOUYsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNuQjtxQkFDRjtvQkFDRCxRQUFRO2lCQUNUO2dCQUNELEVBQUUsRUFBRSxDQUFDO2FBQ04sQ0FBQztpQkFDRCxRQUFRLENBQUMseUJBQWlCLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUMzRCxRQUFRO2lCQUNMLFFBQVEsQ0FBQztnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUscUJBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEVBQUUsUUFBUSxDQUFDO2dCQUMzRyxFQUFFLEVBQUUsQ0FBQzthQUNOLENBQUM7aUJBQ0QsUUFBUSxDQUFDLHlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkQsUUFBUTtpQkFDTCxRQUFRLENBQUM7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLHFCQUFhLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxFQUFFLFFBQVEsQ0FBQztnQkFDNUcsRUFBRSxFQUFFLENBQUM7YUFDTixDQUFDO2lCQUNELFFBQVEsQ0FBQyx5QkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDO1lBQ1IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLO1lBQ3pCLEVBQUUsQ0FBQywrREFBK0QsRUFBRSxLQUFLO2dCQUN2RSxNQUFNLFNBQVM7cUJBQ1osT0FBTyxDQUFDO29CQUNQLE9BQU8sRUFDTCwrRUFBK0U7d0JBQy9FLCtFQUErRTt3QkFDL0UsK0VBQStFO3dCQUMvRSwyRUFBMkU7b0JBQzdFLFNBQVMsRUFDUCwrRUFBK0U7d0JBQy9FLCtFQUErRTt3QkFDL0UsK0VBQStFO3dCQUMvRSwyRUFBMkU7b0JBQzdFLHFCQUFxQixFQUFFLDRDQUE0QztvQkFDbkUseURBQXlEO29CQUN6RCxnQkFBZ0IsRUFBRSxvQkFBb0I7b0JBQ3RDLG1CQUFtQixFQUFFLDRDQUE0QztpQkFDbEUsQ0FBQztxQkFDRCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FDckIsc05BQXNOLENBQ3ZOLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxLQUFLO2dCQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ3ZDLE9BQU8sRUFDTCwrRUFBK0U7d0JBQy9FLCtFQUErRTt3QkFDL0UsK0VBQStFO3dCQUMvRSwyRUFBMkU7b0JBQzdFLFNBQVMsRUFDUCwrRUFBK0U7d0JBQy9FLCtFQUErRTt3QkFDL0UsK0VBQStFO3dCQUMvRSwyRUFBMkU7b0JBQzdFLHFCQUFxQixFQUFFLDRDQUE0QztvQkFDbkUsZ0JBQWdCLEVBQUUsb0JBQW9CO29CQUN0QyxtQkFBbUIsRUFBRSw0Q0FBNEM7b0JBQ2pFLFFBQVEsRUFBRSxhQUFhO2lCQUN4QixDQUFDLENBQUM7Z0JBRUgsMkRBQTJEO2dCQUMzRCxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25DLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMscUJBQXFCLEVBQXdCLENBQUM7Z0JBQzFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QixNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixNQUFNLFFBQVEsR0FDWixpSEFBaUgsQ0FBQztZQUNwSCxNQUFNLFFBQVEsR0FDWixpSEFBaUgsQ0FBQztZQUNwSCxNQUFNLFVBQVUsR0FDZCxpSEFBaUgsQ0FBQztZQUNwSCxNQUFNLFVBQVUsR0FDZCxpSEFBaUgsQ0FBQztZQUNwSCxNQUFNLHFCQUFxQixHQUFHLDRDQUE0QyxDQUFDO1lBQzNFLE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7WUFDekUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDO1lBRS9CLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLO2dCQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ3ZDLE9BQU8sRUFBRSxRQUFRO29CQUNqQixTQUFTLEVBQUUsVUFBVTtvQkFDckIscUJBQXFCO29CQUNyQixtQkFBbUI7b0JBQ25CLFFBQVE7aUJBQ1QsQ0FBQyxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVsRCxNQUFNLDJCQUEyQixHQUFHLElBQUEsMkJBQWlCLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBZSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUV0RyxNQUFNLHdCQUF3QixHQUFHLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckUsTUFBTSwyQkFBMkIsR0FBRywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDNUUsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ2pFLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDakUsUUFBUSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLO2dCQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQ3ZDLE9BQU8sRUFBRSxRQUFRO29CQUNqQixTQUFTLEVBQUUsVUFBVTtvQkFDckIscUJBQXFCO29CQUNyQixtQkFBbUI7b0JBQ25CLFFBQVE7aUJBQ1QsQ0FBQyxDQUFDO2dCQUVILE1BQU0sVUFBVSxHQUFHO29CQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7b0JBQ3JCLE9BQU8sRUFBRSxRQUFRO29CQUNqQixTQUFTLEVBQUUsVUFBVTtvQkFDckIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO29CQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7b0JBQzNCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtvQkFDM0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO29CQUMvQixxQkFBcUIsRUFBRSxRQUFRLENBQUMscUJBQXFCO29CQUNyRCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ3ZCLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztvQkFDdkMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO29CQUM3QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7b0JBQy9CLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7b0JBQy9DLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxzQkFBc0I7aUJBQ3hELENBQUM7Z0JBRUYsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsVUFBVTtvQkFDVixHQUFHLEVBQUUsUUFBUTtpQkFDZCxDQUFDO2dCQUNGLHdCQUF3QjtnQkFDeEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUUzRCxNQUFNLE9BQU8sR0FBRyxFQUFnQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztnQkFDdEQsT0FBTyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUM7Z0JBRXpCLHlEQUF5RDtnQkFDekQsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvRCxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxxQkFBcUIsRUFBd0IsQ0FBQztnQkFDMUUsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMxQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEtBQUs7WUFDOUIsTUFBTSxRQUFRLEdBQUcsNENBQTRDLENBQUM7WUFDOUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLHFDQUFxQztZQUNyQyxNQUFNLG9CQUFvQixHQUFHLDRDQUE0QyxDQUFDO1lBQzFFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQztZQUVoQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSztnQkFDeEMsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsT0FBTyxFQUFFLHFCQUFhLENBQUMscUJBQXFCLENBQUMsT0FBTztvQkFDcEQsU0FBUyxFQUFFLHFCQUFhLENBQUMscUJBQXFCLENBQUMsU0FBUztvQkFDeEQsbUJBQW1CLEVBQUUsUUFBUTtvQkFDN0IsZ0JBQWdCLEVBQUUscUJBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0I7b0JBQ3RFLHFCQUFxQixFQUFFLHFCQUFhLENBQUMscUJBQXFCLENBQUMscUJBQXFCO29CQUNoRixvQkFBb0I7b0JBQ3BCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFO2lCQUM5QixDQUFDO2dCQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFcEQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0QyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFdkMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUF3QixDQUFDO2dCQUMxRSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM3QyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFhLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDN0YsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDN0IsSUFBSSxvQkFBRSxDQUFDLHlCQUFpQixDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUN2RixDQUFDO2dCQUNGLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2pDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQzlCLElBQUksb0JBQUUsQ0FBQyx5QkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FDdkYsQ0FBQztnQkFDRixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUs7Z0JBQ3ZELE1BQU0sTUFBTSxHQUFHO29CQUNiLE9BQU8sRUFBRSxxQkFBYSxDQUFDLHNCQUFzQixDQUFDLE9BQU87b0JBQ3JELFNBQVMsRUFBRSxxQkFBYSxDQUFDLHNCQUFzQixDQUFDLFNBQVM7b0JBQ3pELG1CQUFtQixFQUFFLFFBQVE7b0JBQzdCLGdCQUFnQixFQUFFLHFCQUFhLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCO29CQUN2RSxxQkFBcUIsRUFBRSxxQkFBYSxDQUFDLHNCQUFzQixDQUFDLHFCQUFxQjtvQkFDakYsb0JBQW9CO29CQUNwQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRTtpQkFDOUIsQ0FBQztnQkFDRixNQUFNLFdBQVcsR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXBELFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMxQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUF3QixDQUFDO2dCQUMxRSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sY0FBYyxHQUFHLElBQUksb0JBQUUsQ0FBQyx5QkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUM5RixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNoRCxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUM5QixJQUFJLG9CQUFFLENBQUMseUJBQWlCLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQ3ZGLENBQUM7Z0JBQ0YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFNUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1QyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0UsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM5QyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFbkYsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRXhDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0MsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RCxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFNUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMvQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RCxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUU5RCxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFDMUQsV0FBVyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUUzRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFaEQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM5QyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyRCxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUUxRCxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDekQsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFFcEUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ25ELFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDL0MsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3ZELFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBBdmF4QywgVGF2YXhDLCBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4vZ2V0QnVpbGRlcic7XG5pbXBvcnQgKiBhcyBzZWNwMjU2azEgZnJvbSAnc2VjcDI1NmsxJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3NlY3AyNTZrMSc7XG5pbXBvcnQgKiBhcyBub2NrIGZyb20gJ25vY2snO1xuaW1wb3J0IHsgY29tbW9uLCBUcmFuc2FjdGlvblR5cGUsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBFdGgsIG9wdGlvbmFsRGVwcyB9IGZyb20gJ0BiaXRnby9zZGstY29pbi1ldGgnO1xuaW1wb3J0IHsgQXZheFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9zcmMvaWZhY2UnO1xuaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBFWFBPUlRfQywgSU1QT1JUX0MsIGVuZHBvaW50UmVzcG9uc2VzLCByZWNvdmVyeVVzZXJzIH0gZnJvbSAnLi4vcmVzb3VyY2VzL2F2YXhjJztcbmltcG9ydCB7IFRhdmF4UCB9IGZyb20gJ0BiaXRnby9zZGstY29pbi1hdmF4cCc7XG5pbXBvcnQgeyBkZWNvZGVUcmFuc2FjdGlvbiwgcGFyc2VUcmFuc2FjdGlvbiwgd2FsbGV0U2ltcGxlQUJJIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcblxubm9jay5lbmFibGVOZXRDb25uZWN0KCk7XG5cbmRlc2NyaWJlKCdBdmFsYW5jaGUgQy1DaGFpbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCB0YXZheENvaW47XG4gIGxldCBhdmF4Q29pbjtcbiAgbGV0IGhvcFR4Qml0Z29TaWduYXR1cmU7XG4gIGxldCBob3BFeHBvcnRUeEJpdGdvU2lnbmF0dXJlO1xuXG4gIGNvbnN0IGFkZHJlc3MxID0gJzB4MTc0Y2ZkODIzYWY4Y2UyN2VkMGFmZWUzZmNmM2MzYmEyNTkxMTZiZSc7XG4gIGNvbnN0IGFkZHJlc3MyID0gJzB4N2U4NWJkYzI3YzA1MGUzOTA1ZWJmNGI4ZTYzNGQ5YWQ2ZWRkMGRlNic7XG4gIGNvbnN0IGhvcENvbnRyYWN0QWRkcmVzcyA9ICcweDQ3Y2U3Y2M4NmVmZWZlZjE5ZjhmYjUxNmIxMTczNWQxODNkYTg2MzUnO1xuICBjb25zdCBob3BEZXN0aW5hdGlvbkFkZHJlc3MgPSAnMHg5YzdlOGNlNjgyNWJENDgyNzhCM0FiNTkyMjhFRTI2ZjhCRTc5MjViJztcbiAgY29uc3QgaG9wVHggPVxuICAgICcweGY4NmI4MDg1MDRhODE3YzhmZjgyNTJmZjk0OWM3ZThjZTY4MjViZDQ4Mjc4YjNhYjU5MjI4ZWUyNmY4YmU3OTI1Yjg3MDM4ZDdlYTRjNjgwMDA4MDFjYTAxMWJjMjJjNjY0NTcwMTMzZGZjYTRmMDhhMGI4ZDAyMzM5Y2Y0NjcwNDZkNmE0MTUyZjA0ZjM2OGQwZWFmOTllYTAxZDZkYzVjZjBjODk3YzhkNGMzZTFkZjUzZDBkMDQyNzg0YzQyNDUzNmE0Y2M1YjgwMjU1MmI3ZDY0ZmVlOGI1JztcbiAgY29uc3QgaG9wVHhpZCA9ICcweDRhZjY1MTQzYmM3N2RhMmI1MGYzNWIzZDEzY2FjYjRkYjE4ZjAyNmJmODRiYzA3NDM1NTBiYzU3YjliNTMzNTEnO1xuICBjb25zdCB1c2VyUmVxU2lnID1cbiAgICAnMHg0MDRkYjMwN2Y2MTQ3ZjBkOGNkMzM4YzM0YzEzOTA2ZWY0NmE2ZmFhN2UwZTExOWQ1MTk0ZWYwNWFlYzE2ZTZmM2Q3MTBmOWI3OTAxNDYwZjk3ZTkyNDA2NmI2MmVmZDc0NDQzYmQzNDQwMmM2ZDQwYjQ5YzIwM2E1NTlmZjJjOCc7XG4gIGNvbnN0IGhvcEV4cG9ydFR4ID1cbiAgICAnMHgwMDAwMDAwMDAwMDEwMDAwMDAwNTdmYzkzZDg1YzZkNjJjNWIyYWMwYjUxOWM4NzAxMGVhNTI5NDAxMmQxZTQwNzAzMGQ2YWNkMDAyMWNhYzEwZDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExZmUzZGU3ODg2YmU5ZTUzMDcyZDY3NjJlOWZhMWZjMjdkZGRmYjA1MDAwMDAwMDAwNjE0NjViMjNkOWJkYWMwZWQxZDc2MTMzMGNmNjgwZWZkZWIxYTQyMTU5ZWIzODdkNmQyOTUwYzk2ZjdkMjhmNjFiYmUyYWEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzZDliZGFjMGVkMWQ3NjEzMzBjZjY4MGVmZGViMWE0MjE1OWViMzg3ZDZkMjk1MGM5NmY3ZDI4ZjYxYmJlMmFhMDAwMDAwMDcwMDAwMDAwMDA2MDUyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDM4YjJjZTMzODEwMDNmZGY4NjkwMDI4MGE0ZWM4NmIzODRiNWQ1Yzk5YjdmYzFmNjUyMjBiOWEwYjJmNDMxNTc4YjhiYjZlZTEzMGJmNTYzYWYxZmFiMTUwMzEzNWZiZDQyM2U0NDJkNWU5YjczYWJkNTYyMmZlMDIwMDAwMDAwMTAwMDAwMDA5MDAwMDAwMDFhZjIwMDY2MTk3ZmEzYjcyYmVhM2Q3Y2M1MDNjNjA5MThjMDk4Mzc4Yjk1OGZiYjVkYThjNmY0MzhkMGY0ZTM4MGU1MDZiYjJjMzhkYzg4ZGQ5N2M4MWU5ODI3MDZjNDg2MjM5MzdjMmZlMjJiMzEyNDhlZDlmZDM0OTUxNDgwYjAxNzNiNGU5Y2EnO1xuICBjb25zdCBob3BFeHBvcnRUeElkID0gJzB4YzRiNWNhNmU3ZDhjOWMyNGJiOTkzNGFmY2I1Yzg3ZTZkYjQ3MmRiZTMxMTExYjc3ODQ0NWY4ZjljNTM1Mjk2Nic7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiaXRnb0tleVhwcnYgPVxuICAgICAgJ3hwcnY5czIxWnJRSDE0M0szdHBXQkhXZTMxc0xvWE5SUTlBdlJZSmdpdGtLeFE0QVRGUU13dnI3aEhOcVlSVW5TN1BzanpCN2FLMVZ4cUhMdU5Ramoxc2NrSjJKd28ycXhtc3ZlandFQ1NwRk1mQyc7XG4gICAgY29uc3QgYml0Z29LZXkgPSBiaXAzMi5mcm9tQmFzZTU4KGJpdGdvS2V5WHBydik7XG4gICAgaWYgKCFiaXRnb0tleS5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHByaXZhdGVLZXknKTtcbiAgICB9XG4gICAgY29uc3QgYml0Z29YcHViID0gYml0Z29LZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG4gICAgaG9wVHhCaXRnb1NpZ25hdHVyZSA9XG4gICAgICAnMHhhYScgK1xuICAgICAgQnVmZmVyLmZyb20oc2VjcDI1NmsxLmVjZHNhU2lnbihCdWZmZXIuZnJvbShob3BUeGlkLnNsaWNlKDIpLCAnaGV4JyksIGJpdGdvS2V5LnByaXZhdGVLZXkpLnNpZ25hdHVyZSkudG9TdHJpbmcoXG4gICAgICAgICdoZXgnXG4gICAgICApO1xuXG4gICAgaG9wRXhwb3J0VHhCaXRnb1NpZ25hdHVyZSA9XG4gICAgICAnMHhhYScgK1xuICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgIHNlY3AyNTZrMS5lY2RzYVNpZ24oQnVmZmVyLmZyb20oaG9wRXhwb3J0VHhJZC5zbGljZSgyKSwgJ2hleCcpLCBiaXRnb0tleS5wcml2YXRlS2V5KS5zaWduYXR1cmVcbiAgICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgZW52ID0gJ3Rlc3QnO1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudiB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ2F2YXhjJywgQXZheEMuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGF2YXhjJywgVGF2YXhDLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RldGgnLCBFdGguY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGF2YXhwJywgVGF2YXhQLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS5oc21YcHViID0gYml0Z29YcHViO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0YXZheENvaW4gPSBiaXRnby5jb2luKCd0YXZheGMnKSBhcyBUYXZheEM7XG4gICAgYXZheENvaW4gPSBiaXRnby5jb2luKCdhdmF4YycpIGFzIEF2YXhDO1xuICB9KTtcblxuICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnSW5zdGFudGlhdGUgJiBTdGF0aWNzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIGNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgbG9jYWxCYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RhdmF4YycpO1xuICAgICAgbG9jYWxCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUYXZheEMpO1xuXG4gICAgICBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbignYXZheGMnKTtcbiAgICAgIGxvY2FsQmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoQXZheEMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgaG9wIGRpZ2VzdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRpZ2VzdCA9IEF2YXhDLmdldEhvcERpZ2VzdChbJzEnLCAnMicsICczJ10pO1xuICAgICAgZGlnZXN0LnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoJzIzMWNkYTVmMDUwYzg0MTMyMmI5ZGY1MzZhZmI2MzNjYTA2MjQwMGE4ZjM5M2JmNjU0YTQ4YmRkMWRmZDgyNWInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0tleVBhaXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSB0YXZheCBrZXlQYWlyIHdpdGhvdXQgYWd1bWVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrcCA9IHRhdmF4Q29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGtwLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcnYnKTtcbiAgICAgIGtwLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwdWInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYXZheCBrZXlQYWlyIHdpdGhvdXQgYWd1bWVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrcCA9IGF2YXhDb2luLmdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAga3Auc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BydicpO1xuICAgICAga3Auc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhdmF4IGtleVBhaXIgZnJvbSBzZWVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VlZCA9ICc0YjNiODlmNmNhODk3Y2I3MjlkMjE0NjkxMzg3N2Y3MSc7XG4gICAgICBjb25zdCB0QXZheEtleVBhaXIgPSB0YXZheENvaW4uZ2VuZXJhdGVLZXlQYWlyKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSk7XG4gICAgICBjb25zdCBhdmF4S2V5UGFpciA9IGF2YXhDb2luLmdlbmVyYXRlS2V5UGFpcihCdWZmZXIuZnJvbShzZWVkLCAnaGV4JykpO1xuICAgICAgdEF2YXhLZXlQYWlyLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcnYnKTtcbiAgICAgIHRBdmF4S2V5UGFpci5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHViJyk7XG4gICAgICB0QXZheEtleVBhaXIucHJ2LnNob3VsZC5lcXVhbHMoXG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLMk1KRTF5dlY4VWhqZkxRY2FEUFBpcE1ZdmZZanJQYkhMcHRMc250MUZiYkNyQ1Q5RTVMQ21SclM1OTNZWjFDS2dmM3JmM0MyaFlUeW5aTjVhdTNWdkJ2TGNXaDhzVjInXG4gICAgICApO1xuICAgICAgdEF2YXhLZXlQYWlyLnB1YiEuc2hvdWxkLmVxdWFscyhcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNFcU5oODFUVlZjZVVETkY2eWc3RjYzSDlqM3hNUWo4R0RkRFZSTENGb1B1Z2hTZGdHczRYMW44OWlQWEZLUE15M2Y0NVk3RTYza1hHQVpLdVoxZmhMcXNLdGtvQjN5WidcbiAgICAgICk7XG4gICAgICB0QXZheEtleVBhaXIuc2hvdWxkLmRlZXBFcXVhbChhdmF4S2V5UGFpcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdrZXlzIHZhbGlkYXRpb25zIHN1Y2Nlc3MgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3ZhbGlkYXRlIHZhbGlkIGV0aCB1bmNvbXByZXNzZWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuY29tcHJlc3NlZFB1YmxpY0tleSA9XG4gICAgICAgICcwNDNCRTY1MEUyQzExRjM2RDIwMUM5MTczQkUzN0JDMDI4QUY0OTVDRjc4Q0EwNUY3OEZFRTE5MkY1RDMzOUE5RTIyNzg3NEU4MDc1MzUzNTY0RDgzMDQ3NTY2RUVBNkNGNUE3MzEzODE2QUYwMDREREE4Q0E1MjlERThDOTRCQzZBJztcbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKHVuY29tcHJlc3NlZFB1YmxpY0tleSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRQdWIodW5jb21wcmVzc2VkUHVibGljS2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIHZhbGlkIGV0aCBjb21wcmVzc2VkIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkUHVibGljS2V5ID0gJzAyM0JFNjUwRTJDMTFGMzZEMjAxQzkxNzNCRTM3QkMwMjhBRjQ5NUNGNzhDQTA1Rjc4RkVFMTkyRjVEMzM5QTlFMic7XG4gICAgICB0YXZheENvaW4uaXNWYWxpZFB1Yihjb21wcmVzc2VkUHVibGljS2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1Yihjb21wcmVzc2VkUHVibGljS2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIHZhbGlkIGV4dGVuZGVkIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFB1YmxpY0tleSA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRXFOaDgxVFZWY2VVRE5GNnlnN0Y2M0g5ajN4TVFqOEdEZERWUkxDRm9QdWdoU2RnR3M0WDFuODlpUFhGS1BNeTNmNDVZN0U2M2tYR0FaS3VaMWZoTHFzS3Rrb0IzeVonO1xuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIoZXh0ZW5kZWRQdWJsaWNLZXkpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkUHViKGV4dGVuZGVkUHVibGljS2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIHZhbGlkIGV0aCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICcweDEzNzRhMjA0NjY2MWY5MTRkMTY4N2Q4NWRiYmNlYjlhYzc5MTBhMjknO1xuICAgICAgdGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhbiBhcnJheSBvZiBwLWNoYWluIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBbXG4gICAgICAgICdQLWZ1amkxNXgzejRydms4ZTd2d2E2Zzlsa3lnODl2NWR3a25wNDQ4NTh1ZXgnLFxuICAgICAgICAnUC1hdmF4MTQzcThsc3kzeTRrZTlkNnplbHRyZTh1MmF0ZWVkNnVrOWthMG51JyxcbiAgICAgICAgJ05vZGVJRC0xNDNxOGxzeTN5NGtlOWQ2emVsdHJlOHUyYXRlZWQ2dWs5a2EwbnUnLFxuICAgICAgXTtcblxuICAgICAgdGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIHAtY2hhaW4gbXVsdHNpZyBhZGRyZXNzIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAnUC1mdWppMXl6cGZzZGFsaGZ3a3EyY2Vld2dzOXd2N2swdWZ0NDB5ZHB1ajU5flAtZnVqaTEwM2NtbnRzc3A2cW51Y2VqYWhkZHk0MndjeTRxdHkwdWo0MjgyMn5QLWZ1amkxaGRrN250dzBodWhxbWxobGhlbWU5dDdzY3N5OWxoZmh3M3l3eTQnO1xuICAgICAgdGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgna2V5cyB2YWxpZGF0aW9ucyBmYWlsdXJlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZSBlbXB0eSBldGggcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKCcnKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRQdWIoJycpLnNob3VsZC5iZS5mYWxzZSgpO1xuXG4gICAgICB0YXZheENvaW4uaXNWYWxpZFB1Yih1bmRlZmluZWQpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1Yih1bmRlZmluZWQpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGVtcHR5IGV0aCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgdGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCB1bmNvbXByZXNzZWQgcHVibGljIGtleSB0b28gc2hvcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1bmNvbXByZXNzZWRQdWJsaWNLZXkgPVxuICAgICAgICAnMDQzQkU2NTBFMkMxMUYzNkQyMDFDOTE3M0JFMzdCQzAyOEFGNDk1Q0Y3OENBMDVGNzhGRUUxOTJGNUQzMzlBOUUyMjc4NzRFODA3NTM1MzU2NEQ4MzA0NzU2NkVFQTZDRjVBNzMxMzgxNkFGMDA0RERBOENBNTI5REU4Qzk0QkM2QSc7XG5cbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKHVuY29tcHJlc3NlZFB1YmxpY0tleS5zbGljZSgxKSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkUHViKHVuY29tcHJlc3NlZFB1YmxpY0tleS5zbGljZSgxKSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIGNvbXByZXNzZWQgcHVibGljIGtleSB0b28gc2hvcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkUHVibGljS2V5ID0gJzAyM0JFNjUwRTJDMTFGMzZEMjAxQzkxNzNCRTM3QkMwMjhBRjQ5NUNGNzhDQTA1Rjc4RkVFMTkyRjVEMzM5QTlFMic7XG5cbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKGNvbXByZXNzZWRQdWJsaWNLZXkuc2xpY2UoMSkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1Yihjb21wcmVzc2VkUHVibGljS2V5LnNsaWNlKDEpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBpbnZhbGlkIGV4dGVuZGVkIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0ZW5kZWRQdWJsaWNLZXkgPVxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0VxTmg4MVRWVmNlVURORjZ5ZzdGNjNIOWozeE1RajhHRGREVlJMQ0ZvUHVnaFNkZ0dzNFgxbjg5aVBYRktQTXkzZjQ1WTdFNjNrWEdBWkt1WjFmaExxc0t0a29CM3laJztcblxuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIoZXh0ZW5kZWRQdWJsaWNLZXkuc3Vic3RyKDAsIGV4dGVuZGVkUHVibGljS2V5Lmxlbmd0aCAtIDEpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRQdWIoZXh0ZW5kZWRQdWJsaWNLZXkuc3Vic3RyKDAsIGV4dGVuZGVkUHVibGljS2V5Lmxlbmd0aCAtIDEpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggYWRkcmVzcyB0b28gc2hvcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzB4MTM3NGEyMDQ2NjYxZjkxNGQxNjg3ZDg1ZGJiY2ViOWFjNzkxMGEyOSc7XG5cbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLnNsaWNlKDEpKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3Muc2xpY2UoMSkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCB1bmNvbXByZXNzZWQgcHVibGljIGtleSB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHVuY29tcHJlc3NlZFB1YmxpY0tleSA9XG4gICAgICAgICcwNDNCRTY1MEUyQzExRjM2RDIwMUM5MTczQkUzN0JDMDI4QUY0OTVDRjc4Q0EwNUY3OEZFRTE5MkY1RDMzOUE5RTIyNzg3NEU4MDc1MzUzNTY0RDgzMDQ3NTY2RUVBNkNGNUE3MzEzODE2QUYwMDREREE4Q0E1MjlERThDOTRCQzZBJztcblxuICAgICAgdGF2YXhDb2luLmlzVmFsaWRQdWIodW5jb21wcmVzc2VkUHVibGljS2V5ICsgJzAwJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBhdmF4Q29pbi5pc1ZhbGlkUHViKHVuY29tcHJlc3NlZFB1YmxpY0tleSArICcwMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBjb21wcmVzc2VkIHB1YmxpYyBrZXkgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkUHVibGljS2V5ID0gJzAyM0JFNjUwRTJDMTFGMzZEMjAxQzkxNzNCRTM3QkMwMjhBRjQ5NUNGNzhDQTA1Rjc4RkVFMTkyRjVEMzM5QTlFMic7XG5cbiAgICAgIHRhdmF4Q29pbi5pc1ZhbGlkUHViKGNvbXByZXNzZWRQdWJsaWNLZXkgKyAnMDAnKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGF2YXhDb2luLmlzVmFsaWRQdWIoY29tcHJlc3NlZFB1YmxpY0tleSArICcwMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV4dGVuZGVkIHB1YmxpYyBrZXkgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFB1YmxpY0tleSA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRXFOaDgxVFZWY2VVRE5GNnlnN0Y2M0g5ajN4TVFqOEdEZERWUkxDRm9QdWdoU2RnR3M0WDFuODlpUFhGS1BNeTNmNDVZN0U2M2tYR0FaS3VaMWZoTHFzS3Rrb0IzeVonO1xuXG4gICAgICB0YXZheENvaW4uaXNWYWxpZFB1YihleHRlbmRlZFB1YmxpY0tleSArICcwMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZFB1YihleHRlbmRlZFB1YmxpY0tleSArICcwMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBhZGRyZXNzIHRvbyBsb25nJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICcweDEzNzRhMjA0NjY2MWY5MTRkMTY4N2Q4NWRiYmNlYjlhYzc5MTBhMjknO1xuXG4gICAgICB0YXZheENvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyArICcwMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgYXZheENvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyArICcwMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbiBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCBhY2NvdW50XzEgPSB7XG4gICAgICBhZGRyZXNzOiAnMHhlZWFmMEYwNWYzNzg5MWFiNGEyMTIwOEIxMDVBMDY4N2QxMmM1YUY3JyxcbiAgICAgIG93bmVyXzE6ICc0ZWUwODlhY2VhYmYzZGRiZjc0OGRiNzliMTA2NmMzM2I3ZDNlYTFhYjNlYjdlMzI1MTIxYmJhMmJmZjJmNWNhJyxcbiAgICAgIG93bmVyXzI6ICc1Y2ExMTZkMjVhZWM1Zjc2NTQ2NTQzMmNjNDIxZmYyNWVmOWZmZGMzMzBiMTBiYjNkOWFkNjFlM2JhYWQ4OGQ3JyxcbiAgICAgIG93bmVyXzM6ICcxZmFlOTQ2Y2M4NGFmOGJkNzRkNjEwYTg4NTM3ZTI0ZTE5YzMzNDlkNDc4ZDg2ZmM1YmI1OWJhNGM4OGZiOWNjJyxcbiAgICB9O1xuXG4gICAgY29uc3QgYWNjb3VudF8yID0ge1xuICAgICAgYWRkcmVzczogJzB4OENlNTljMmQxNzAyODQ0RjhFZEVENDUxQUExMDM5NjFiQzM3QjRlOCcsXG4gICAgICBvd25lcl8xOiAnNGVlMDg5YWNlYWJmM2RkYmY3NDhkYjc5YjEwNjZjMzNiN2QzZWExYWIzZWI3ZTMyNTEyMWJiYTJiZmYyZjVjYScsXG4gICAgICBvd25lcl8yOiAnNWM3ZTRlZmZmNzMwNGQ0ZGZmZjZkNWYxNTkxODQ0ZWM2ZjJhZGZhNmE0N2U5ZmVjZTZhM2MxYTRkNzU1ZjFlMycsXG4gICAgICBvd25lcl8zOiAnNDQyMWFiMjVkZDkxZTFhMzE4MGQwM2Q1N2MzMjNhNzg4NmRjYzMxM2QzYjNhNGI0MjU2YTU3OTE1NzJiZjU5NycsXG4gICAgfTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBhbiB1bnNpZ25lZCB0ZXN0IHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIGJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgYnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgYnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGJ1aWxkZXIuY29udHJhY3QoYWNjb3VudF8xLmFkZHJlc3MpO1xuICAgICAgYnVpbGRlci50cmFuc2ZlcigpLmFtb3VudCgnMScpLnRvKGFjY291bnRfMi5hZGRyZXNzKS5leHBpcmF0aW9uVGltZSgxMDAwMCkuY29udHJhY3RTZXF1ZW5jZUlkKDEpO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeEZvckJyb2FkY2FzdGluZyA9IHVuc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFJhd1R4ID0gYXdhaXQgdGF2YXhDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdW5zaWduZWRUeEZvckJyb2FkY2FzdGluZyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJ2OiBhY2NvdW50XzEub3duZXJfMixcbiAgICAgIH0pO1xuXG4gICAgICBidWlsZGVyLnRyYW5zZmVyKCkua2V5KGFjY291bnRfMS5vd25lcl8yKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeEZvckJyb2FkY2FzdGluZyA9IGhhbGZTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC50eEhleC5zaG91bGQuZXF1YWxzKGhhbGZTaWduZWRUeEZvckJyb2FkY2FzdGluZyk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWxzKDEpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50c1swXS5hZGRyZXNzLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFscyhhY2NvdW50XzIuYWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnJlY2lwaWVudHNbMF0uYW1vdW50LnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFscygnMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIGFuIHVuc2lnbmVkIHRlc3QgdHggd2l0aCBlaXAxNTU5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RhdmF4YycpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIGJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICAgICAgZWlwMTU1OToge1xuICAgICAgICAgIG1heEZlZVBlckdhczogJzc1OTMxMjMnLFxuICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnMTUwJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgYnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGJ1aWxkZXIuY29udHJhY3QoYWNjb3VudF8xLmFkZHJlc3MpO1xuICAgICAgYnVpbGRlci50cmFuc2ZlcigpLmFtb3VudCgnMScpLnRvKGFjY291bnRfMi5hZGRyZXNzKS5leHBpcmF0aW9uVGltZSgxMDAwMCkuY29udHJhY3RTZXF1ZW5jZUlkKDEpO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeEZvckJyb2FkY2FzdGluZyA9IHVuc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFJhd1R4ID0gYXdhaXQgdGF2YXhDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdW5zaWduZWRUeEZvckJyb2FkY2FzdGluZyxcbiAgICAgICAgICBlaXAxNTU5OiB7XG4gICAgICAgICAgICBtYXhGZWVQZXJHYXM6ICc3NTkzMTIzJyxcbiAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiAnMTUwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwcnY6IGFjY291bnRfMS5vd25lcl8yLFxuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkZXIudHJhbnNmZXIoKS5rZXkoYWNjb3VudF8xLm93bmVyXzIpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nID0gaGFsZlNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnR4SGV4LnNob3VsZC5lcXVhbHMoaGFsZlNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbHMoMSk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzWzBdLmFkZHJlc3MudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWxzKGFjY291bnRfMi5hZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50c1swXS5hbW91bnQudG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWxzKCcxJyk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5laXAxNTU5Lm1heEZlZVBlckdhcy5zaG91bGQuZXF1YWwoJzc1OTMxMjMnKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLmVpcDE1NTkubWF4UHJpb3JpdHlGZWVQZXJHYXMuc2hvdWxkLmVxdWFsKCcxNTAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBhbiB1bnNpZ25lZCBtYWlubmV0IHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGdldEJ1aWxkZXIoJ2F2YXhjJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgYnVpbGRlci5mZWUoe1xuICAgICAgICBmZWU6ICcyODAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzcwMDAwMDAnLFxuICAgICAgfSk7XG4gICAgICBidWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICBidWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgYnVpbGRlci5jb250cmFjdChhY2NvdW50XzEuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLnRyYW5zZmVyKCkuYW1vdW50KCcxJykudG8oYWNjb3VudF8yLmFkZHJlc3MpLmV4cGlyYXRpb25UaW1lKDEwMDAwKS5jb250cmFjdFNlcXVlbmNlSWQoMSk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4Rm9yQnJvYWRjYXN0aW5nID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkUmF3VHggPSBhd2FpdCBhdmF4Q29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6IHVuc2lnbmVkVHhGb3JCcm9hZGNhc3RpbmcsXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogYWNjb3VudF8xLm93bmVyXzIsXG4gICAgICB9KTtcblxuICAgICAgYnVpbGRlci50cmFuc2ZlcigpLmtleShhY2NvdW50XzEub3duZXJfMik7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkVHhGb3JCcm9hZGNhc3RpbmcgPSBoYWxmU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQudHhIZXguc2hvdWxkLmVxdWFscyhoYWxmU2lnbmVkVHhGb3JCcm9hZGNhc3RpbmcpO1xuICAgICAgaGFsZlNpZ25lZFJhd1R4LmhhbGZTaWduZWQucmVjaXBpZW50cy5sZW5ndGguc2hvdWxkLmVxdWFscygxKTtcbiAgICAgIGhhbGZTaWduZWRSYXdUeC5oYWxmU2lnbmVkLnJlY2lwaWVudHNbMF0uYWRkcmVzcy50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbHMoYWNjb3VudF8yLmFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBoYWxmU2lnbmVkUmF3VHguaGFsZlNpZ25lZC5yZWNpcGllbnRzWzBdLmFtb3VudC50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbHMoJzEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFZlcmlmaWNhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIGhvcCB0eFByZWJ1aWxkIGZyb20gdGhlIGJpdGdvIHNlcnZlciB0aGF0IG1hdGNoZXMgdGhlIGNsaWVudCB0eFBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIHRhdmF4Q29pbiwge30pO1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwLCBhZGRyZXNzOiBob3BEZXN0aW5hdGlvbkFkZHJlc3MgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICc1MDAwMDAwMDAwMDAwMDAwJywgYWRkcmVzczogaG9wQ29udHJhY3RBZGRyZXNzIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAndGF2YXhjJyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgICAgaG9wVHJhbnNhY3Rpb246IHtcbiAgICAgICAgICB0eDogaG9wVHgsXG4gICAgICAgICAgaWQ6IGhvcFR4aWQsXG4gICAgICAgICAgc2lnbmF0dXJlOiBob3BUeEJpdGdvU2lnbmF0dXJlLFxuICAgICAgICAgIHBheW1lbnRJZDogJzI3NzM5MjgxOTYnLFxuICAgICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgICBnYXNMaW1pdDogNTAwMDAwLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHJlY2lwaWVudDogaG9wRGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgIG5vbmNlOiAwLFxuICAgICAgICAgIHVzZXJSZXFTaWc6IHVzZXJSZXFTaWcsXG4gICAgICAgICAgZ2FzUHJpY2VNYXg6IDUwMDAwMDAwMDAwMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hvcCBleHBvcnQgdHggdmVyaWZ5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG4gICAgICBjb25zdCBob3BEZXN0aW5hdGlvbkFkZHJlc3MgPVxuICAgICAgICAnUC1mdWppMTN2a3d4d3FzcTA3bHM2Z3E5cTl5YWpydDhwOTQ2aHllNXpxM3czflAtZnVqaTE3OGF0ejVwM3hoYWFnZ2x5Z3QyN25kZTZoNHR6OWxzem53cTJkaH5QLWZ1amkxa2w3cDdlZnpwd2Rxa3Q2cno0dXQzd213dXljdDc0MzZxNmw5aDUnO1xuICAgICAgY29uc3QgaG9wQWRkcmVzcyA9ICcweDFmZTNkZTc4ODZiZTllNTMwNzJkNjc2MmU5ZmExZmMyN2RkZGZiMDUnO1xuICAgICAgY29uc3QgaW1wb3J0VHhGZWUgPSAxZTY7XG4gICAgICBjb25zdCBhbW91bnQgPSAxMDAwMDAwMDAwMDAwMDAwMDA7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50LCBhZGRyZXNzOiBob3BEZXN0aW5hdGlvbkFkZHJlc3MgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICAgIHR5cGU6ICdFeHBvcnQnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAyMDAwMDUwMDAwMDAwMDAwJywgYWRkcmVzczogaG9wQWRkcmVzcyB9XSxcbiAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICBnYXNMaW1pdDogNTAwMDAwLFxuICAgICAgICBpc0JhdGNoOiBmYWxzZSxcbiAgICAgICAgY29pbjogJ3RhdmF4YycsXG4gICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnZmFrZVdhbGxldENvbnRyYWN0QWRkcmVzcycsXG4gICAgICAgIGhvcFRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgdHg6IGhvcEV4cG9ydFR4LFxuICAgICAgICAgIGlkOiBob3BFeHBvcnRUeElkLFxuICAgICAgICAgIHNpZ25hdHVyZTogaG9wRXhwb3J0VHhCaXRnb1NpZ25hdHVyZSxcbiAgICAgICAgICBwYXltZW50SWQ6ICc0OTMzMzQ5OTg0JyxcbiAgICAgICAgICBnYXNQcmljZTogJzUwJyxcbiAgICAgICAgICBnYXNMaW1pdDogMSxcbiAgICAgICAgICBhbW91bnQ6ICcxMDEwMDAwMDAnLFxuICAgICAgICAgIHJlY2lwaWVudDogaG9wRGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgIG5vbmNlOiAwLFxuICAgICAgICAgIHVzZXJSZXFTaWc6XG4gICAgICAgICAgICAnMHgwNmZkMGIxZjg4NTlhNDBkOWZiMmQxYTY1ZDU0ZGE1ZDY0NWExZDgxYmJiOGMxYzViMDM3MDUxODQzZWMwZDNjMjI0MzNlYzdmNTBjYzk3ZmEwNDFjYmY4ZDlmZjVkZGY3ZWQ0MWY3MmEwOGZhM2YxOTgzZmQ2NTFhMzNhNDQ0MScsXG4gICAgICAgICAgZ2FzUHJpY2VNYXg6IDcxODc1MDAwMDAsXG4gICAgICAgICAgdHlwZTogJ0V4cG9ydCcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgYmVmb3JlKCgpID0+IHtcbiAgICAgICAgdHhQcmVidWlsZC5ob3BUcmFuc2FjdGlvbi5zaWduYXR1cmUgPSBob3BFeHBvcnRUeEJpdGdvU2lnbmF0dXJlO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmVyaWZ5IHN1Y2Nlc3NmdWxseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMgPSB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9O1xuICAgICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMpO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB2ZXJpZnkgZm9yIGFtb3VudCBwbHVzIDEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UGFyYW1zLCByZWNpcGllbnRzOiBbeyBhbW91bnQ6IGFtb3VudCArIDFlOSwgYWRkcmVzczogaG9wRGVzdGluYXRpb25BZGRyZXNzIH1dIH0sXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih2ZXJpZnlBdmF4Y1RyYW5zYWN0aW9uT3B0aW9ucylcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAgIGBIb3AgYW1vdW50OiAke2Ftb3VudCAvIDFlOSArIGltcG9ydFR4RmVlfSBkb2VzIG5vdCBlcXVhbCBvcmlnaW5hbCBhbW91bnQ6ICR7XG4gICAgICAgICAgICAgIGFtb3VudCAvIDFlOSArIGltcG9ydFR4RmVlICsgMVxuICAgICAgICAgICAgfWBcbiAgICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCB2ZXJpZnkgZm9yIGNoYW5nZWQgcHJlYnVpbGQgaG9wIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgIHR4UGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgLi4udHhQcmVidWlsZCwgcmVjaXBpZW50czogW3sgYWRkcmVzczogYWRkcmVzczIsIGFtb3VudDogJzEwMjAwMDA1MDAwMDAwMDAwMCcgfV0gfSxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB0YXZheENvaW5cbiAgICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMpXG4gICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoYHJlY2lwaWVudCBhZGRyZXNzIG9mIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggaG9wIGFkZHJlc3NgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgdmVyaWZ5IGZvciBjaGFuZ2VkIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGhvcERlc3RpbmF0aW9uQWRkcmVzc0RpZmYgPVxuICAgICAgICAgICdQLWZ1amkxM3Zrd3h3cXNxMDdsczZncThxOXlhanJ0OHA5NDZoeWU1enEzdzN+UC1mdWppMTc4YXR6NXAzeGhhYmdnbHlndDI3bmRlNmg0dHo5bHN6bndxMmRoflAtZnVqaTFrbDdwN2VmenB3ZHFrdDZyejR1dDN3bXd1eWN0NzQzNnE2bDloNic7XG4gICAgICAgIGNvbnN0IHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UGFyYW1zLCByZWNpcGllbnRzOiBbeyBhbW91bnQ6IGFtb3VudCwgYWRkcmVzczogaG9wRGVzdGluYXRpb25BZGRyZXNzRGlmZiB9XSB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0LFxuICAgICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGF2YXhDb2luXG4gICAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHZlcmlmeUF2YXhjVHJhbnNhY3Rpb25PcHRpb25zKVxuICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICAgYEhvcCBkZXN0aW5hdGlvbjogJHtob3BEZXN0aW5hdGlvbkFkZHJlc3N9IGRvZXMgbm90IGVxdWFsIG9yaWdpbmFsIHJlY2lwaWVudDogJHtob3BEZXN0aW5hdGlvbkFkZHJlc3NEaWZmfWBcbiAgICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmVyaWZ5IGlmIHdhbGxldElkIGlzIHVzZWQgaW5zdGVhZCBvZiBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB2ZXJpZnlBdmF4Y1RyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICB0eFBhcmFtczogeyAuLi50eFBhcmFtcywgcmVjaXBpZW50czogW3sgYW1vdW50OiBhbW91bnQsIHdhbGxldElkOiAnc2FtZSB3YWxsZXQnIH1dIH0sXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24odmVyaWZ5QXZheGNUcmFuc2FjdGlvbk9wdGlvbnMpO1xuICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIGNsaWVudCB0eFBhcmFtcyBhcmUgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCd0ZXRoJyk7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBjb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbnVsbDtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAndGF2YXhjJyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zOiB0eFBhcmFtcyBhcyBhbnksIHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQgYXMgYW55LCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyBwYXJhbXMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHR4UHJlYnVpbGQgdGhhdCBpcyBib3RoIGJhdGNoIGFuZCBob3AnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCB0YXZheENvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9LFxuICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICczNTAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDAsXG4gICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgaXNCYXRjaDogdHJ1ZSxcbiAgICAgICAgY29pbjogJ3RhdmF4YycsXG4gICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnZmFrZVdhbGxldENvbnRyYWN0QWRkcmVzcycsXG4gICAgICAgIGhvcFRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgdHg6IGhvcFR4LFxuICAgICAgICAgIGlkOiBob3BUeGlkLFxuICAgICAgICAgIHNpZ25hdHVyZTogaG9wVHhCaXRnb1NpZ25hdHVyZSxcbiAgICAgICAgICBwYXltZW50SWQ6ICcyNzczOTI4MTk2JyxcbiAgICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICByZWNpcGllbnQ6IGhvcERlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgICAgICBub25jZTogMCxcbiAgICAgICAgICB1c2VyUmVxU2lnOiB1c2VyUmVxU2lnLFxuICAgICAgICAgIGdhc1ByaWNlTWF4OiA1MDAwMDAwMDAwMDAsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgYXdhaXQgdGF2YXhDb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgndHggY2Fubm90IGJlIGJvdGggYSBiYXRjaCBhbmQgaG9wIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHR4UHJlYnVpbGQgd2l0aCBtb3JlIHRoYW4gb25lIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIHRhdmF4Q29pbiwge30pO1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHsgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH0sXG4gICAgICAgICAgeyBhbW91bnQ6ICcyNTAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgd2FsbGV0OiB3YWxsZXQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdmYWtlV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfSxcbiAgICAgICAgICB7IGFtb3VudDogJzI1MDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMiB9LFxuICAgICAgICBdLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IHRydWUsXG4gICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcsXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJ2Zha2VXYWxsZXRDb250cmFjdEFkZHJlc3MnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG5cbiAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYHRhdmF4YyBkb2Vzbid0IHN1cHBvcnQgc2VuZGluZyB0byBtb3JlIHRoYW4gMSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpdGhpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4gVHJ5IGFnYWluLCB1c2luZyBvbmx5IGEgc2luZ2xlIHJlY2lwaWVudC5gXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIGhvcCB0eFByZWJ1aWxkIHRoYXQgZG9lcyBub3Qgc2VuZCB0byBpdHMgaG9wIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCB0YXZheENvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBob3BEZXN0aW5hdGlvbkFkZHJlc3MgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgICBob3A6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICc1MDAwMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDAsXG4gICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgaXNCYXRjaDogZmFsc2UsXG4gICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcsXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJ2Zha2VXYWxsZXRDb250cmFjdEFkZHJlc3MnLFxuICAgICAgICBob3BUcmFuc2FjdGlvbjoge1xuICAgICAgICAgIHR4OiBob3BUeCxcbiAgICAgICAgICBpZDogaG9wVHhpZCxcbiAgICAgICAgICBzaWduYXR1cmU6IGhvcFR4Qml0Z29TaWduYXR1cmUsXG4gICAgICAgICAgcGF5bWVudElkOiAnMCcsXG4gICAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgcmVjaXBpZW50OiBob3BEZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgICAgbm9uY2U6IDAsXG4gICAgICAgICAgdXNlclJlcVNpZzogdXNlclJlcVNpZyxcbiAgICAgICAgICBnYXNQcmljZU1heDogNTAwMDAwMDAwMDAwLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG5cbiAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3JlY2lwaWVudCBhZGRyZXNzIG9mIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggaG9wIGFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbm9ybWFsIHR4UHJlYnVpbGQgZnJvbSB0aGUgYml0Z28gc2VydmVyIHdpdGggdGhlIHdyb25nIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIHRhdmF4Q29pbiwge30pO1xuXG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICB3YWxsZXQ6IHdhbGxldCxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2Zha2VXYWxsZXRQYXNzcGhyYXNlJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzIwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9XSxcbiAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogMCxcbiAgICAgICAgZ2FzUHJpY2U6IDIwMDAwMDAwMDAwLFxuICAgICAgICBnYXNMaW1pdDogNTAwMDAwLFxuICAgICAgICBpc0JhdGNoOiBmYWxzZSxcbiAgICAgICAgY29pbjogJ3RhdmF4YycsXG4gICAgICAgIHdhbGxldElkOiAnZmFrZVdhbGxldElkJyxcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnZmFrZVdhbGxldENvbnRyYWN0QWRkcmVzcycsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcblxuICAgICAgYXdhaXQgdGF2YXhDb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnbm9ybWFsIHRyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIHJlY2VpdmVkIGZyb20gQml0R28gc2VydmVycyBkb2VzIG5vdCBtYXRjaCB0eFBhcmFtcyBzdXBwbGllZCBieSBjbGllbnQnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG5vcm1hbCB0eFByZWJ1aWxkIGZyb20gdGhlIGJpdGdvIHNlcnZlciB3aXRoIHRoZSB3cm9uZyByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCB0YXZheENvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9XSxcbiAgICAgICAgd2FsbGV0OiB3YWxsZXQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdmYWtlV2FsbGV0UGFzc3BocmFzZScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczIgfV0sXG4gICAgICAgIG5leHRDb250cmFjdFNlcXVlbmNlSWQ6IDAsXG4gICAgICAgIGdhc1ByaWNlOiAyMDAwMDAwMDAwMCxcbiAgICAgICAgZ2FzTGltaXQ6IDUwMDAwMCxcbiAgICAgICAgaXNCYXRjaDogZmFsc2UsXG4gICAgICAgIGNvaW46ICd0YXZheGMnLFxuICAgICAgICB3YWxsZXRJZDogJ2Zha2VXYWxsZXRJZCcsXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJ2Zha2VXYWxsZXRDb250cmFjdEFkZHJlc3MnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0ge307XG5cbiAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgaW4gbm9ybWFsIHR4UHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggdGhhdCBpbiB0eFBhcmFtcyBzdXBwbGllZCBieSBjbGllbnQnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHRva2VuIHR4UHJlYnVpbGQgZnJvbSB0aGUgYml0Z28gc2VydmVyIHRoYXQgbWF0Y2hlcyB0aGUgY2xpZW50IHR4UGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAndGF2YXhjJyxcbiAgICAgICAgdG9rZW46ICd0ZXN0JyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBjb25zdCBpc1RyYW5zYWN0aW9uVmVyaWZpZWQgPSBhd2FpdCB0YXZheENvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSB0eFByZWJ1aWxkIGZyb20gdGhlIGJpdGdvIHNlcnZlciB3aXRoIHRoZSB3cm9uZyBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgdGF2YXhDb2luLCB7fSk7XG5cbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbeyBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwJywgYWRkcmVzczogYWRkcmVzczEgfV0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MxIH1dLFxuICAgICAgICBuZXh0Q29udHJhY3RTZXF1ZW5jZUlkOiAwLFxuICAgICAgICBnYXNQcmljZTogMjAwMDAwMDAwMDAsXG4gICAgICAgIGdhc0xpbWl0OiA1MDAwMDAsXG4gICAgICAgIGlzQmF0Y2g6IGZhbHNlLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgd2FsbGV0SWQ6ICdmYWtlV2FsbGV0SWQnLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICdmYWtlV2FsbGV0Q29udHJhY3RBZGRyZXNzJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuXG4gICAgICBhd2FpdCB0YXZheENvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdjb2luIGluIHR4UHJlYnVpbGQgZGlkIG5vdCBtYXRjaCB0aGF0IGluIHR4UGFyYW1zIHN1cHBsaWVkIGJ5IGNsaWVudCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXhwbGFpbiBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBoYWxmIHNpZ25lZCBpbXBvcnQgaW4gQyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhID0gSU1QT1JUX0M7XG4gICAgICBjb25zdCB0eEV4cGxhaW4gPSBhd2FpdCB0YXZheENvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHRlc3REYXRhLmhhbGZzaWdudHhIZXgsIGNyb3NzQ2hhaW5UeXBlOiAnaW1wb3J0JyB9KTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKChOdW1iZXIodGVzdERhdGEuYW1vdW50KSAtIHR4RXhwbGFpbi5mZWU/LmZlZSkudG9TdHJpbmcoKSk7XG4gICAgICB0eEV4cGxhaW4udHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkltcG9ydCk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50byk7XG4gICAgICB0eEV4cGxhaW4uY2hhbmdlT3V0cHV0cy5zaG91bGQuYmUuZW1wdHkoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHhFeHBsYWluLm1lbW8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgc2lnbmVkIGltcG9ydCBpbiBDIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGEgPSBJTVBPUlRfQztcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IGF3YWl0IHRhdmF4Q29pbi5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogdGVzdERhdGEuZnVsbHNpZ250eEhleCwgY3Jvc3NDaGFpblR5cGU6ICdpbXBvcnQnIH0pO1xuICAgICAgdHhFeHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoKE51bWJlcih0ZXN0RGF0YS5hbW91bnQpIC0gdHhFeHBsYWluLmZlZT8uZmVlKS50b1N0cmluZygpKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuSW1wb3J0KTtcbiAgICAgIHR4RXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRvKTtcbiAgICAgIHR4RXhwbGFpbi5jaGFuZ2VPdXRwdXRzLnNob3VsZC5iZS5lbXB0eSgpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eEV4cGxhaW4ubWVtbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB1bnNpZ25lZCBleHBvcnQgaW4gQyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGltcG9ydEluUEZlZSA9IDEwMDAwMDA7XG4gICAgICBjb25zdCB0ZXN0RGF0YSA9IEVYUE9SVF9DO1xuICAgICAgY29uc3QgdHhFeHBsYWluID0gYXdhaXQgdGF2YXhDb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiB0ZXN0RGF0YS51bnNpZ25lZFR4SGV4LCBjcm9zc0NoYWluVHlwZTogJ2V4cG9ydCcgfSk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCgoTnVtYmVyKHRlc3REYXRhLmFtb3VudCkgKyBpbXBvcnRJblBGZWUpLnRvU3RyaW5nKCkpO1xuICAgICAgdHhFeHBsYWluLnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQpO1xuICAgICAgdHhFeHBsYWluLmlucHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5jSGV4QWRkcmVzcyk7XG4gICAgICB0eEV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5wQWRkcmVzc2VzLnNsaWNlKCkuc29ydCgpLmpvaW4oJ34nKSk7XG4gICAgICB0eEV4cGxhaW4uZmVlLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEuZmVlKTtcbiAgICAgIHR4RXhwbGFpbi5jaGFuZ2VPdXRwdXRzLnNob3VsZC5iZS5lbXB0eSgpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdCh0eEV4cGxhaW4ubWVtbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBzaWduZWQgZXhwb3J0IGluIEMgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbXBvcnRJblBGZWUgPSAxMDAwMDAwO1xuICAgICAgY29uc3QgdGVzdERhdGEgPSBFWFBPUlRfQztcbiAgICAgIGNvbnN0IHR4RXhwbGFpbiA9IGF3YWl0IHRhdmF4Q29pbi5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogdGVzdERhdGEuZnVsbHNpZ250eEhleCwgY3Jvc3NDaGFpblR5cGU6ICdleHBvcnQnIH0pO1xuICAgICAgdHhFeHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoKE51bWJlcih0ZXN0RGF0YS5hbW91bnQpICsgaW1wb3J0SW5QRmVlKS50b1N0cmluZygpKTtcbiAgICAgIHR4RXhwbGFpbi50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuRXhwb3J0KTtcbiAgICAgIHR4RXhwbGFpbi5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuY0hleEFkZHJlc3MpO1xuICAgICAgdHhFeHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucEFkZHJlc3Nlcy5zbGljZSgpLnNvcnQoKS5qb2luKCd+JykpO1xuICAgICAgdHhFeHBsYWluLmZlZS5mZWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZlZSk7XG4gICAgICB0eEV4cGxhaW4uY2hhbmdlT3V0cHV0cy5zaG91bGQuYmUuZW1wdHkoKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QodHhFeHBsYWluLm1lbW8pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBUT0RPKEJHLTU2MTM2KTogbW92ZSB0byBtb2R1bGVzL2JpdGdvL3Rlc3QvdjIvaW50ZWdyYXRpb24vY29pbnMvYXZheGMudHNcbiAgZGVzY3JpYmUoJ1JlY292ZXJ5JywgZnVuY3Rpb24gKCkge1xuICAgIC8vIGNvbnRyYWN0IGFkZHJlc3MgZm9yICd0YXZheGM6bGluaydcbiAgICBjb25zdCB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9ICcweDBiOWQ1ZDkxMzY4NTVmNmZlYzNjMDk5M2ZlZTZlOWNlOGEyOTc4NDYnO1xuICAgIGNvbnN0IHNlcXVlbmNlSWREYXRhID0gJzB4YTBiNzk2N2InO1xuICAgIGNvbnN0IHNhbmRCb3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjYWxsQmFjayA9IHNhbmRCb3guc3R1YihBdmF4Qy5wcm90b3R5cGUsICdyZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5JyBhcyBrZXlvZiBBdmF4Qyk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHhkZmQ5NWQwMWZjOWMyY2I3NDRlMjg1MjI1NjM4NWJiZTZkODdiNzJiJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4MCcgfSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHgyOWQ5N2NlMzQ0NTk5ODI1MjIwYTU0YTRiZGY3YjhhYTdjYTE0ZmQxJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4NycgfSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHhkZmQ5NWQwMWZjOWMyY2I3NDRlMjg1MjI1NjM4NWJiZTZkODdiNzJiJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4MCcgfSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IFsnMHgyOWQ5N2NlMzQ0NTk5ODI1MjIwYTU0YTRiZGY3YjhhYTdjYTE0ZmQxJywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoeyBqc29ucnBjOiAnMi4wJywgaWQ6IDEsIHJlc3VsdDogJzB4MzE1ZjhjYjliYzJlYzAwJyB9KTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgbWV0aG9kOiAnZXRoX2dldEJhbGFuY2UnLFxuICAgICAgICAgIHBhcmFtczogWycweGUwYjFmZTA5ODA1MGYyNzQ1YjQ1MGRlNDE5YjVjYWZjN2U4MjY2OTknLCAnbGF0ZXN0J10sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyh7IGpzb25ycGM6ICcyLjAnLCBpZDogMSwgcmVzdWx0OiAnMHgwJyB9KTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLFxuICAgICAgICAgIHBhcmFtczogW3sgdG86ICcweGUwYjFmZTA5ODA1MGYyNzQ1YjQ1MGRlNDE5YjVjYWZjN2U4MjY2OTknLCBkYXRhOiAnMHhhMGI3OTY3YicgfSwgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIHJlc3VsdDogJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZicsXG4gICAgICAgIH0pO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfZ2V0VHJhbnNhY3Rpb25Db3VudCcsXG4gICAgICAgICAgcGFyYW1zOiBbcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5QWRkcmVzcywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuYWRkcmVzc05vbmNlUmVzcG9uc2UxKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgbWV0aG9kOiAnZXRoX2dldFRyYW5zYWN0aW9uQ291bnQnLFxuICAgICAgICAgIHBhcmFtczogW3JlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci5iYWNrdXBLZXlBZGRyZXNzLCAnbGF0ZXN0J10sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyhlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzTm9uY2VSZXNwb25zZTIpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfZ2V0QmFsYW5jZScsXG4gICAgICAgICAgcGFyYW1zOiBbcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5QWRkcmVzcywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuYmFja3VwQWRkcmVzc0JhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IFtyZWNvdmVyeVVzZXJzLmNvbGRXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5QWRkcmVzcywgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuYmFja3VwQWRkcmVzc0JhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9jYWxsJyxcbiAgICAgICAgICBwYXJhbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG86IHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgICBkYXRhOiBvcHRpb25hbERlcHMuZXRoVXRpbC5hZGRIZXhQcmVmaXgoXG4gICAgICAgICAgICAgICAgb3B0aW9uYWxEZXBzLmV0aEFiaVxuICAgICAgICAgICAgICAgICAgLnNpbXBsZUVuY29kZSgnYmFsYW5jZU9mKGFkZHJlc3MpJywgcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIud2FsbGV0Q29udHJhY3RBZGRyZXNzKVxuICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsYXRlc3QnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyhlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzVG9rZW5CYWxhbmNlUmVzcG9uc2UpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfY2FsbCcsXG4gICAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRvOiB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgICAgZGF0YTogb3B0aW9uYWxEZXBzLmV0aFV0aWwuYWRkSGV4UHJlZml4KFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsRGVwcy5ldGhBYmlcbiAgICAgICAgICAgICAgICAgIC5zaW1wbGVFbmNvZGUoJ2JhbGFuY2VPZihhZGRyZXNzKScsIHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MpXG4gICAgICAgICAgICAgICAgICAudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2xhdGVzdCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKGVuZHBvaW50UmVzcG9uc2VzLmFkZHJlc3NUb2tlbkJhbGFuY2VSZXNwb25zZSk7XG4gICAgICBjYWxsQmFja1xuICAgICAgICAud2l0aEFyZ3Moe1xuICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIG1ldGhvZDogJ2V0aF9jYWxsJyxcbiAgICAgICAgICBwYXJhbXM6IFt7IHRvOiByZWNvdmVyeVVzZXJzLmhvdFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MsIGRhdGE6IHNlcXVlbmNlSWREYXRhIH0sICdsYXRlc3QnXSxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc29sdmVzKGVuZHBvaW50UmVzcG9uc2VzLnNlcXVlbmNlSWRSZXNwb25zZTEpO1xuICAgICAgY2FsbEJhY2tcbiAgICAgICAgLndpdGhBcmdzKHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBtZXRob2Q6ICdldGhfY2FsbCcsXG4gICAgICAgICAgcGFyYW1zOiBbeyB0bzogcmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLndhbGxldENvbnRyYWN0QWRkcmVzcywgZGF0YTogc2VxdWVuY2VJZERhdGEgfSwgJ2xhdGVzdCddLFxuICAgICAgICAgIGlkOiAxLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoZW5kcG9pbnRSZXNwb25zZXMuc2VxdWVuY2VJZFJlc3BvbnNlMik7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZEJveC5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTm9uLUJpdEdvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBlcnJvciB3aGVuIHRoZSBiYWNrdXAga2V5IGlzIHVuZnVuZGVkIChjYW5ub3QgcGF5IGdhcyknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRhdmF4Q29pblxuICAgICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICAgIHVzZXJLZXk6XG4gICAgICAgICAgICAgICd7XCJpdlwiOlwibnRkOS91ckZqcnlxeGQ0cnpSRUIyUT09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIlxcbicgK1xuICAgICAgICAgICAgICAnOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiTFRxWjQ3YjFCd0U9XCIsXCJjdFwiOlwiSlNiSklCVGtIb0tSM0xcXG4nICtcbiAgICAgICAgICAgICAgJ29UMlFUa0R4M1gxT0JJUHhpU0w2V29NaUlyS0ErYUtUZ211dFhuV0MyR1RFSXlmYkxlYWp3NkQyVVorVTBZOHZpdjdtZ0lUZ1N6MVxcbicgK1xuICAgICAgICAgICAgICAndTlHZGo5N0J0bThXc1owZStLbXNiZEIvZ1l1Y0Nab1BVWkNGcUc0YkVrZGZaOFp2REk5WHZWdjR4UHpOYi9Bb1Npam9zQT1cIn0nLFxuICAgICAgICAgICAgYmFja3VwS2V5OlxuICAgICAgICAgICAgICAne1wiaXZcIjpcIkF4cytHOWdzWjVQRU5VSHgxWVk1Y2c9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCJcXG4nICtcbiAgICAgICAgICAgICAgJzpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcImF3UXNoVXZGaTdRPVwiLFwiY3RcIjpcInNXUTBiSG1ydVVUSThDXFxuJyArXG4gICAgICAgICAgICAgICdsd0duZUhPYmROZm8zV1EvbXJ6M3A4NEZvMDdIZ2l6dmdMZCtFM3dGQTNaMUxSYkhvelJqZnN0Vi9xSk1ScXJGdkVnS09jRytTS2RcXG4nICtcbiAgICAgICAgICAgICAgJ2d4NkJibVhXZktoRkhFZXJTWWx1QmdVNU9yWE1mT2tiRXhuTXl3RVdyQ0tFdm9OTCt3eU5Ib1JhTU5iYkRvZ28zNko4UEU9XCJ9JyxcbiAgICAgICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJzB4MjJjMWFiNDQzNzE5ODVlNDkyOTRkMWE0MGU5MmM4YWQwMGY1YmU4ZScsXG4gICAgICAgICAgICAvLyB3YWxsZXRQYXNzcGhyYXNlOiBUZXN0Qml0R28uVjIuVEVTVF9SRUNPVkVSWV9QQVNTQ09ERSxcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdHaGdoamtnITQ1NTU0NGxsbGwnLFxuICAgICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogJzB4OTRiNTFlYmI4YzNiOTA0MDRhZDI2MmY0MmMxNTg4YmQ5NDI0MmVjYicsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAgICdCYWNrdXAga2V5IGFkZHJlc3MgMHhkZmQ5NWQwMWZjOWMyY2I3NDRlMjg1MjI1NjM4NWJiZTZkODdiNzJiIGhhcyBiYWxhbmNlIDAgR3dlaS5UaGlzIGFkZHJlc3MgbXVzdCBoYXZlIGEgYmFsYW5jZSBvZiBhdCBsZWFzdCAxMDAwMDAwMCBHd2VpIHRvIHBlcmZvcm0gcmVjb3Zlcmllcy4gVHJ5IHNlbmRpbmcgc29tZSBBVkFYIHRvIHRoaXMgYWRkcmVzcyB0aGVuIHJldHJ5LidcbiAgICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgcmVjb3ZlcnkgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5ID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6XG4gICAgICAgICAgICAne1wiaXZcIjpcIm8yN3BCbDdJUCtpYmUzOXhZZy9jWGc9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCJcXG4nICtcbiAgICAgICAgICAgICc6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCI5OTJSNnBhZGYyST1cIixcImN0XCI6XCI2d2tuMVBkd3RXY0NXUlxcbicgK1xuICAgICAgICAgICAgJ1ZkT2RhaUdNQ01TNVJodXJHSTllRjR0ZGd6YU16T3BndzU2ZVlSbUtUemxkajVWaDFDbno2Um9xRmxWU2Zud1IrdEZqT3lxRG4zT1xcbicgK1xuICAgICAgICAgICAgJzhLM05VRDVZbE1Hb0NkZnZjckNiUEYzdENkS2wyRHlvTHYrWldQbzVzS1ZqamdVT1pnSTdwbjdpQnRYUkR2cWFXeWxhd1k9XCJ9JyxcbiAgICAgICAgICBiYWNrdXBLZXk6XG4gICAgICAgICAgICAne1wiaXZcIjpcIm13ajlsZDhzdmdSQnNXUys1TlpRcUE9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCJcXG4nICtcbiAgICAgICAgICAgICc6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCJYdU14YnFhL3lOZz1cIixcImN0XCI6XCJscUxuanNWU0JSLzR1ZVxcbicgK1xuICAgICAgICAgICAgJ3p0WWFoQXZFRVYrbHREWExveUlFTUNtRk15Y2JhKzNtUHRpQU04SHJGLzg0QXpKT2p3S3l2SzFwbStDRnV1V0NUWHNzQVF4UkN1Y1xcbicgK1xuICAgICAgICAgICAgJ0h1anJCdnJLdW5ZNGhmSUpISnN5QnIrbDFQTk5TVUIvYVlMMWFXL243dGR2d0w4Zk9DTnFGcUVQQkNieFhvT2xTZ0NBVXc9XCJ9JyxcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICcweGUwYjFmZTA5ODA1MGYyNzQ1YjQ1MGRlNDE5YjVjYWZjN2U4MjY2OTknLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdHaGdoamtnITQ1NTU0NGxsbGwnLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246ICcweDk0YjUxZWJiOGMzYjkwNDA0YWQyNjJmNDJjMTU4OGJkOTQyNDJlY2InLFxuICAgICAgICAgIGdhc1ByaWNlOiAnMzAwMDAwMDAwMDAnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpZCBhbmQgdHggd2lsbCBhbHdheXMgYmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgZXhwaXJlVGltZVxuICAgICAgICByZWNvdmVyeS5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgICByZWNvdmVyeS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnKTtcbiAgICAgICAgcmVjb3Zlcnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRhdmF4Q29pbi5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICAgIHR4QnVpbGRlci5mcm9tKHJlY292ZXJ5LnR4KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVbnNpZ25lZCBTd2VlcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVzZXJYcHJ2ID1cbiAgICAgICAgJ3hwcnY5czIxWnJRSDE0M0szZlpWUmZteHZyN1lCb2RGNGpTY3pnS1U2Um9EVXp2S25GaUZ6Mm1jdUtndzF6WWd2VEd0TE1CUEFQb252NUd6SG5EWFFLNVZrOEJSSGNONzZUR2dMd2NOY0ZUeTRrQyc7XG4gICAgICBjb25zdCB1c2VyWHB1YiA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjRzlkeFhoSnlIejRHanFUalVDQVVNdUY0dHBDcTNMVEpmNDNRWGE1c1Q4MVFzSjVWTWRLOHZuQUs1NmdpN3F5MmNaMmR6WVFmeTdZUDd4NHVIUXB1UlZpQXY5Q05idFMnO1xuICAgICAgY29uc3QgYmFja3VwWHBydiA9XG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLNE42WUJqb29hNlR4M1U3aHpNM1N2SEZBOFhQMjNxWWhRNktQTG8yUWdYVFNhc1ZwaU1ZNEY2Z01yc3RYQkhSRHNvNVdFN0duMzd5Wm5XNXFUUkpaVTZGUGVYeDFCNjknO1xuICAgICAgY29uc3QgYmFja3VwWHB1YiA9XG4gICAgICAgICd4cHViNjYxTXlNd0FxUmJjR3JCMUhtTG93RVFnYlZ4Q1BvbUpIV0FrdnVuZGNCNWdHdGVYdExMZkVLbXZTQjlkS3ZSbWgzTHhwTDJ5dmdxeTM3WjN5ZHF2SG9WaU1XYTJkd1gzaHV3bW1CdWlwN0onO1xuICAgICAgY29uc3Qgd2FsbGV0Q29udHJhY3RBZGRyZXNzID0gJzB4ZTBiMWZlMDk4MDUwZjI3NDViNDUwZGU0MTliNWNhZmM3ZTgyNjY5OSc7XG4gICAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gJzB4OTRiNTFlYmI4YzNiOTA0MDRhZDI2MmY0MmMxNTg4YmQ5NDI0MmVjYic7XG4gICAgICBjb25zdCBnYXNQcmljZSA9ICcyNTAwMDAwMDAwMCc7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgdW5zaWduZWQgc3dlZXAgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5ID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIoe1xuICAgICAgICAgIHVzZXJLZXk6IHVzZXJYcHViLFxuICAgICAgICAgIGJhY2t1cEtleTogYmFja3VwWHB1YixcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgICBnYXNQcmljZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR4ID0gcGFyc2VUcmFuc2FjdGlvbihyZWNvdmVyeS50eEhleCk7XG5cbiAgICAgICAgY29uc3QgZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhID0gZGVjb2RlVHJhbnNhY3Rpb24oSlNPTi5zdHJpbmdpZnkod2FsbGV0U2ltcGxlQUJJKSwgcGFyc2VkVHguZGF0YSk7XG5cbiAgICAgICAgY29uc3Qgc2FmZVRyYW5zZmVyRnJvbUNhbGxEYXRhID0gZGVjb2RlZFNlbmRNdWx0aXNpZ0NhbGxEYXRhLmFyZ3NbMl07XG4gICAgICAgIGNvbnN0IHNhZmVUcmFuc2ZlckZyb21EZXN0aW5hdGlvbiA9IGRlY29kZWRTZW5kTXVsdGlzaWdDYWxsRGF0YS5hcmdzWzBdO1xuICAgICAgICBzYWZlVHJhbnNmZXJGcm9tRGVzdGluYXRpb24udG9Mb3dlckNhc2UoKS5zaG91bGQuZXF1YWwocmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gICAgICAgIHNhZmVUcmFuc2ZlckZyb21DYWxsRGF0YS5zaG91bGQuYmUuZXF1YWwoJzB4Jyk7XG4gICAgICAgIHJlY292ZXJ5LnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICAgIHJlY292ZXJ5LnNob3VsZC5oYXZlLnByb3BlcnRpZXMoJ3R4SGV4JywgJ3VzZXJLZXknLCAnYmFja3VwS2V5Jyk7XG4gICAgICAgIHJlY292ZXJ5LnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgcmVjb3ZlcnkucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChyZWNvdmVyeURlc3RpbmF0aW9uKTtcbiAgICAgICAgcmVjb3Zlcnkud2FsbGV0Q29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCh3YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWRkIGEgc2Vjb25kIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCB0YXZheENvaW4ucmVjb3Zlcih7XG4gICAgICAgICAgdXNlcktleTogdXNlclhwdWIsXG4gICAgICAgICAgYmFja3VwS2V5OiBiYWNrdXBYcHViLFxuICAgICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIGdhc1ByaWNlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0eFByZWJ1aWxkID0ge1xuICAgICAgICAgIHR4SGV4OiByZWNvdmVyeS50eEhleCxcbiAgICAgICAgICB1c2VyS2V5OiB1c2VyWHB1YixcbiAgICAgICAgICBiYWNrdXBLZXk6IGJhY2t1cFhwdWIsXG4gICAgICAgICAgY29pbjogcmVjb3ZlcnkuY29pbixcbiAgICAgICAgICBnYXNQcmljZTogcmVjb3ZlcnkuZ2FzUHJpY2UsXG4gICAgICAgICAgZ2FzTGltaXQ6IHJlY292ZXJ5Lmdhc0xpbWl0LFxuICAgICAgICAgIHJlY2lwaWVudHM6IHJlY292ZXJ5LnJlY2lwaWVudHMsXG4gICAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiByZWNvdmVyeS53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiByZWNvdmVyeS5hbW91bnQsXG4gICAgICAgICAgYmFja3VwS2V5Tm9uY2U6IHJlY292ZXJ5LmJhY2t1cEtleU5vbmNlLFxuICAgICAgICAgIHJlY2lwaWVudDogcmVjb3ZlcnkucmVjaXBpZW50LFxuICAgICAgICAgIGV4cGlyZVRpbWU6IHJlY292ZXJ5LmV4cGlyZVRpbWUsXG4gICAgICAgICAgY29udHJhY3RTZXF1ZW5jZUlkOiByZWNvdmVyeS5jb250cmFjdFNlcXVlbmNlSWQsXG4gICAgICAgICAgbmV4dENvbnRyYWN0U2VxdWVuY2VJZDogcmVjb3ZlcnkubmV4dENvbnRyYWN0U2VxdWVuY2VJZCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICBwcnY6IHVzZXJYcHJ2LFxuICAgICAgICB9O1xuICAgICAgICAvLyBzaWduIHRyYW5zYWN0aW9uIG9uY2VcbiAgICAgICAgY29uc3QgaGFsZlNpZ25lZCA9IGF3YWl0IHRhdmF4Q29pbi5zaWduVHJhbnNhY3Rpb24ocGFyYW1zKTtcblxuICAgICAgICBjb25zdCB3cmFwcGVyID0ge30gYXMgQXZheFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM7XG4gICAgICAgIHdyYXBwZXIudHhQcmVidWlsZCA9IGhhbGZTaWduZWQ7XG4gICAgICAgIHdyYXBwZXIuaXNMYXN0U2lnbmF0dXJlID0gdHJ1ZTtcbiAgICAgICAgd3JhcHBlci53YWxsZXRDb250cmFjdEFkZHJlc3MgPSB3YWxsZXRDb250cmFjdEFkZHJlc3M7XG4gICAgICAgIHdyYXBwZXIucHJ2ID0gYmFja3VwWHBydjtcblxuICAgICAgICAvLyBzaWduIHRyYW5zYWN0aW9uIHR3aWNlIHdpdGggdGhlIFwiaXNMYXN0U2lnbmF0dXJlXCIgZmxhZ1xuICAgICAgICBjb25zdCBmaW5hbFNpZ25lZFR4ID0gYXdhaXQgdGF2YXhDb2luLnNpZ25UcmFuc2FjdGlvbih3cmFwcGVyKTtcbiAgICAgICAgZmluYWxTaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhIZXgnKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGF2YXhDb2luLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgICAgdHhCdWlsZGVyLmZyb20oZmluYWxTaWduZWRUeC50eEhleCk7XG4gICAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICByZWJ1aWx0VHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICAgIHJlYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHJlYnVpbHRUeC5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHR4UHJlYnVpbGQucmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgICByZWJ1aWx0VHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwodHhQcmVidWlsZC5yZWNpcGllbnQuYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1Rva2VuIFJlY292ZXJ5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVzdEFkZHIgPSAnMHhjNzRiMWMwZWU5MGE0ODFiNTI4MjUzMDQyY2UzMjI4YThjZDY4NzNlJztcbiAgICAgIGNvbnN0IHdlaVRvR3dlaSA9IDEwICoqIDk7XG4gICAgICBjb25zdCBnYXNQcmljZSA9IDMwICogd2VpVG9Hd2VpO1xuICAgICAgLy8gY29udHJhY3QgYWRkcmVzcyBmb3IgJ3RhdmF4YzpsaW5rJ1xuICAgICAgY29uc3QgdG9rZW5Db250cmFjdEFkZHJlc3MgPSAnMHgwYjlkNWQ5MTM2ODU1ZjZmZWMzYzA5OTNmZWU2ZTljZThhMjk3ODQ2JztcbiAgICAgIGNvbnN0IHRva2VuTmFtZSA9ICd0YXZheGM6bGluayc7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgdG9rZW4gcmVjb3ZlcnkgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICB1c2VyS2V5OiByZWNvdmVyeVVzZXJzLmhvdFdhbGxldFJlY292ZXJ5VXNlci51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleTogcmVjb3ZlcnlVc2Vycy5ob3RXYWxsZXRSZWNvdmVyeVVzZXIuYmFja3VwS2V5LFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RBZGRyLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHJlY292ZXJ5VXNlcnMuaG90V2FsbGV0UmVjb3ZlcnlVc2VyLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiByZWNvdmVyeVVzZXJzLmhvdFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5VHhuID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIocGFyYW1zKTtcblxuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG5cbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGF2YXhDb2luLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgICAgdHhCdWlsZGVyLmZyb20ocmVjb3ZlcnlUeG4udHgpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY292ZXJ5VXNlcnMuaG90V2FsbGV0UmVjb3ZlcnlVc2VyLndhbGxldENvbnRyYWN0QWRkcmVzcyk7XG4gICAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgbmV3IEJOKGVuZHBvaW50UmVzcG9uc2VzLmFkZHJlc3NUb2tlbkJhbGFuY2VSZXNwb25zZS5yZXN1bHQuc2xpY2UoMiksIDE2KS50b1N0cmluZygxMClcbiAgICAgICAgKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmNvaW4/LnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgICAgICB0eC5vdXRwdXRzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChkZXN0QWRkcik7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIG5ldyBCTihlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzVG9rZW5CYWxhbmNlUmVzcG9uc2UucmVzdWx0LnNsaWNlKDIpLCAxNikudG9TdHJpbmcoMTApXG4gICAgICAgICk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uY29pbj8uc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCB1bnNpZ25lZCBzd2VlcCB0b2tlbiByZWNvdmVyeSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHVzZXJLZXk6IHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci51c2VyS2V5LFxuICAgICAgICAgIGJhY2t1cEtleTogcmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLmJhY2t1cEtleSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBkZXN0QWRkcixcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiByZWNvdmVyeVVzZXJzLmNvbGRXYWxsZXRSZWNvdmVyeVVzZXIud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlY292ZXJ5VHhuID0gYXdhaXQgdGF2YXhDb2luLnJlY292ZXIocGFyYW1zKTtcblxuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhIZXgnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Rva2VuJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnRva2VuLnNob3VsZC5lcXVhbCgndGF2YXhjOmxpbmsnKTtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGF2YXhDb2luLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgICAgdHhCdWlsZGVyLmZyb20ocmVjb3ZlcnlUeG4udHhIZXgpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByZWNvdmVyeUFtb3VudCA9IG5ldyBCTihlbmRwb2ludFJlc3BvbnNlcy5hZGRyZXNzVG9rZW5CYWxhbmNlUmVzcG9uc2UucmVzdWx0LnNsaWNlKDIpLCAxNikudG9TdHJpbmcoMTApO1xuICAgICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzLnNob3VsZC5ub3QuYmUuZW1wdHkoKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuICAgICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKHJlY292ZXJ5QW1vdW50KTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb2luJyk7XG4gICAgICAgIHR4LmlucHV0c1swXS5jb2luPy5zaG91bGQuZXF1YWwodG9rZW5OYW1lKTtcbiAgICAgICAgdHgub3V0cHV0cy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoZGVzdEFkZHIpO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChcbiAgICAgICAgICBuZXcgQk4oZW5kcG9pbnRSZXNwb25zZXMuYWRkcmVzc1Rva2VuQmFsYW5jZVJlc3BvbnNlLnJlc3VsdC5zbGljZSgyKSwgMTYpLnRvU3RyaW5nKDEwKVxuICAgICAgICApO1xuICAgICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb2luJyk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0uY29pbj8uc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3VzZXJLZXknKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4udXNlcktleS5zaG91bGQuZXF1YWwocmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLnVzZXJLZXkpO1xuICAgICAgICByZWNvdmVyeVR4bi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYmFja3VwS2V5Jyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLmJhY2t1cEtleS5zaG91bGQuZXF1YWwocmVjb3ZlcnlVc2Vycy5jb2xkV2FsbGV0UmVjb3ZlcnlVc2VyLmJhY2t1cEtleSk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2NvaW4nKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uY29pbi5zaG91bGQuZXF1YWwoJ3RhdmF4YycpO1xuXG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdnYXNQcmljZScpO1xuICAgICAgICByZWNvdmVyeVR4bi5nYXNQcmljZS5zaG91bGQuZXF1YWwoZ2FzUHJpY2UudG9TdHJpbmcoKSk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdnYXNMaW1pdCcpO1xuICAgICAgICByZWNvdmVyeVR4bi5nYXNMaW1pdC5zaG91bGQuZXF1YWwoJzUwMDAwMCcpO1xuXG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdyZWNpcGllbnRzJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4ucmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChkZXN0QWRkcik7XG4gICAgICAgIHJlY292ZXJ5VHhuLnJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChyZWNvdmVyeUFtb3VudCk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3dhbGxldENvbnRyYWN0QWRkcmVzcycpO1xuICAgICAgICByZWNvdmVyeVR4bi53YWxsZXRDb250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKHJlY292ZXJ5VXNlcnMuY29sZFdhbGxldFJlY292ZXJ5VXNlci53YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuXG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhbW91bnQnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uYW1vdW50LnNob3VsZC5lcXVhbChyZWNvdmVyeUFtb3VudCk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3JlY2lwaWVudCcpO1xuICAgICAgICByZWNvdmVyeVR4bi5yZWNpcGllbnQuYWRkcmVzcy5zaG91bGQuZXF1YWwoZGVzdEFkZHIpO1xuICAgICAgICByZWNvdmVyeVR4bi5yZWNpcGllbnQuYW1vdW50LnNob3VsZC5lcXVhbChyZWNvdmVyeUFtb3VudCk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Rva2VuQ29udHJhY3RBZGRyZXNzJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnRva2VuQ29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCh0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG5cbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2JhY2t1cEtleU5vbmNlJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdleHBpcmVUaW1lJyk7XG4gICAgICAgIHJlY292ZXJ5VHhuLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb250cmFjdFNlcXVlbmNlSWQnKTtcbiAgICAgICAgcmVjb3ZlcnlUeG4uc2hvdWxkLmhhdmUucHJvcGVydHkoJ25leHRDb250cmFjdFNlcXVlbmNlSWQnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!