PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-avaxp/dist/src/lib

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Transaction = void 0;
const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
const sdk_core_1 = require("@bitgo/sdk-core");
const avalanche_1 = require("avalanche");
const iface_1 = require("./iface");
const utils_1 = __importDefault(require("./utils"));
/**
 * Checks if a signature is empty
 * @param signature
 * @returns {boolean}
 */
function isEmptySignature(signature) {
    return !!signature && utils_1.default.removeHexPrefix(signature).startsWith(''.padStart(90, '0'));
}
function generateSelectorSignature(signatures) {
    if (signatures.length > 1 && signatures.every((sig) => isEmptySignature(sig))) {
        // Look for address.
        return function (sig, address) {
            try {
                if (!isEmptySignature(sig)) {
                    return false;
                }
                if (sig.startsWith('0x'))
                    sig = sig.substring(2);
                const pub = sig.substring(90);
                return pub === address;
            }
            catch (e) {
                return false;
            }
        };
    }
    else {
        // Look for empty string
        return function (sig, address) {
            return isEmptySignature(sig);
        };
    }
}
// end region utils for sign
class Transaction extends sdk_core_1.BaseTransaction {
    constructor(coinConfig) {
        super(coinConfig);
        this._threshold = 2;
        this._locktime = BigInt(0);
        this._fromAddresses = [];
        this._rewardAddresses = [];
        this._utxos = [];
        this._fee = {};
        this._network = coinConfig.network;
        this._assetId = this._network.avaxAssetID;
        this._blockchainID = this._network.blockchainID;
        this._networkID = this._network.networkID;
    }
    get avaxPTransaction() {
        return this._avaxTransaction.getTx().baseTx;
    }
    get signature() {
        if (this.credentials.length === 0) {
            return [];
        }
        return this.credentials[0].getSignatures().filter((s) => !isEmptySignature(s));
    }
    get credentials() {
        return this._avaxTransaction?.credentials;
    }
    get hasCredentials() {
        return this.credentials !== undefined && this.credentials.length > 0;
    }
    /** @inheritdoc */
    canSign({ key }) {
        // TODO(BG-56700):  Improve canSign by check in addresses in empty credentials match signer
        return true;
    }
    /**
     * Sign an avaxp transaction and update the transaction hex
     * @param {KeyPair} keyPair
     */
    async sign(keyPair) {
        const prv = keyPair.getPrivateKey();
        const addressHex = keyPair.getAddressBuffer().toString('hex');
        if (!prv) {
            throw new sdk_core_1.SigningError('Missing private key');
        }
        if (!this.avaxPTransaction) {
            throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
        }
        if (!this.hasCredentials) {
            throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
        }
        const unsignedTx = this._avaxTransaction;
        const unsignedBytes = unsignedTx.toBytes();
        const publicKey = avalanchejs_1.secp256k1.getPublicKey(prv);
        if (unsignedTx.hasPubkey(publicKey)) {
            const signature = await avalanchejs_1.secp256k1.sign(unsignedBytes, prv);
            let checkSign = undefined;
            unsignedTx.credentials.forEach((c, index) => {
                if (checkSign === undefined) {
                    checkSign = generateSelectorSignature(c.getSignatures());
                }
                let find = false;
                c.getSignatures().forEach((sig, index) => {
                    if (checkSign && checkSign(sig, addressHex)) {
                        c.setSignature(index, signature);
                        find = true;
                    }
                });
                if (!find) {
                    throw new sdk_core_1.SigningError(`Private key cannot sign the transaction, address hex ${addressHex}, public key: ${publicKey}`);
                }
            });
        }
    }
    toHexString(byteArray) {
        return avalanchejs_1.utils.bufferToHex(byteArray);
    }
    /** @inheritdoc */
    /**
     * should be of signedTx doing this with baseTx
     */
    toBroadcastFormat() {
        if (!this.avaxPTransaction) {
            throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
        }
        return this.toHexString(avalanchejs_1.utils.addChecksum(this._avaxTransaction.getSignedTx().toBytes()));
    }
    // types - stakingTransaction, import, export
    toJson() {
        if (!this.avaxPTransaction) {
            throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
        }
        return {
            id: this.id,
            inputs: this.inputs,
            fromAddresses: this.fromAddresses,
            threshold: this._threshold,
            locktime: this._locktime.toString(),
            type: this.type,
            signatures: this.signature,
            outputs: this.outputs,
            changeOutputs: this.changeOutputs,
        };
    }
    setTransaction(tx) {
        this._avaxTransaction = tx;
    }
    /**
     * Set the transaction type
     *
     * @param {TransactionType} transactionType The transaction type to be set
     */
    setTransactionType(transactionType) {
        if (![sdk_core_1.TransactionType.AddPermissionlessValidator].includes(transactionType)) {
            throw new Error(`Transaction type ${transactionType} is not supported`);
        }
        this._type = transactionType;
    }
    /**
     * Returns the portion of the transaction that needs to be signed in Buffer format.
     * Only needed for coins that support adding signatures directly (e.g. TSS).
     */
    get signablePayload() {
        return utils_1.default.sha256(this._avaxTransaction.toBytes());
    }
    get id() {
        const bufferArray = utils_1.default.sha256(this._avaxTransaction.toBytes());
        return utils_1.default.cb58Encode(avalanche_1.Buffer.from(bufferArray));
    }
    get fromAddresses() {
        return this._fromAddresses.map((a) => avalanchejs_1.utils.format(this._network.alias, this._network.hrp, a));
    }
    get rewardAddresses() {
        return this._rewardAddresses.map((a) => avalanchejs_1.utils.format(this._network.alias, this._network.hrp, a));
    }
    /**
     * Get the list of outputs. Amounts are expressed in absolute value.
     */
    get outputs() {
        switch (this.type) {
            case sdk_core_1.TransactionType.AddPermissionlessValidator:
                return [
                    {
                        address: this._avaxTransaction.getTx().subnetValidator.validator.nodeId.toString(),
                        value: this._avaxTransaction.getTx().subnetValidator.validator.weight.toJSON(),
                    },
                ];
            default:
                return [];
        }
    }
    get fee() {
        return { fee: '0', ...this._fee };
    }
    get changeOutputs() {
        return this._avaxTransaction.getTx().baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
    }
    get inputs() {
        let inputs;
        switch (this.type) {
            case sdk_core_1.TransactionType.AddPermissionlessValidator:
            default:
                inputs = this._avaxTransaction.getTx().baseTx
                    .inputs;
                break;
        }
        return inputs.map((input) => {
            return {
                id: input.utxoID.txID.toString() + iface_1.INPUT_SEPARATOR + input.utxoID.outputIdx.value(),
                address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
                value: input.amount().toString(),
            };
        });
    }
    /**
     * Avax wrapper to create signature and return it for credentials
     * @param prv
     * @return hexstring
     */
    createSignature(prv) {
        const signval = utils_1.default.createSignatureAvaxBuffer(this._network, avalanche_1.Buffer.from(this.signablePayload), avalanche_1.Buffer.from(prv));
        return signval.toString('hex');
    }
    /** @inheritdoc */
    explainTransaction() {
        const txJson = this.toJson();
        const displayOrder = ['id', 'inputs', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
        const outputAmount = txJson.outputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
        const changeAmount = txJson.changeOutputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
        let rewardAddresses;
        if ([sdk_core_1.TransactionType.AddPermissionlessValidator].includes(txJson.type)) {
            rewardAddresses = this.rewardAddresses;
            displayOrder.splice(6, 0, 'rewardAddresses');
        }
        return {
            displayOrder,
            id: txJson.id,
            inputs: txJson.inputs,
            outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.value })),
            outputAmount,
            changeOutputs: txJson.changeOutputs.map((o) => ({ address: o.address, amount: o.value })),
            changeAmount,
            rewardAddresses,
            fee: this.fee,
            type: txJson.type,
        };
    }
}
exports.Transaction = Transaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUF3SDtBQUN4SCw4Q0FReUI7QUFFekIseUNBQXFEO0FBRXJELG1DQUFpSDtBQUVqSCxvREFBNEI7QUFFNUI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsU0FBaUI7SUFDekMsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQU1ELFNBQVMseUJBQXlCLENBQUMsVUFBb0I7SUFDckQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUUsb0JBQW9CO1FBQ3BCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLEtBQUssT0FBTyxDQUFDO1lBQ3pCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sd0JBQXdCO1FBQ3hCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBQ0QsNEJBQTRCO0FBRTVCLE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBcUI5QyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQVhiLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixjQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLG1CQUFjLEdBQWlCLEVBQUUsQ0FBQztRQUNsQyxxQkFBZ0IsR0FBaUIsRUFBRSxDQUFDO1FBQ3BDLFdBQU0sR0FBcUIsRUFBRSxDQUFDO1FBRTlCLFNBQUksR0FBNEIsRUFBRSxDQUFDO1FBTXhDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQTJCLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE9BQVMsSUFBSSxDQUFDLGdCQUErQixDQUFDLEtBQUssRUFBNkMsQ0FBQyxNQUFNLENBQUM7SUFDMUcsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFRLElBQUksQ0FBQyxnQkFBK0IsRUFBRSxXQUFXLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBVztRQUN0QiwyRkFBMkY7UUFDM0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFnQjtRQUN6QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFnQixDQUFDO1FBQ2xELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksdUJBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBOEIsQ0FBQztRQUN2RCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFM0MsTUFBTSxTQUFTLEdBQUcsdUJBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSx1QkFBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxTQUFTLEdBQStCLFNBQVMsQ0FBQztZQUN0RCxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzVCLFNBQVMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFDRCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQzt3QkFDNUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQ2pDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ1YsTUFBTSxJQUFJLHVCQUFZLENBQ3BCLHdEQUF3RCxVQUFVLGlCQUFpQixTQUFTLEVBQUUsQ0FDL0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFxQjtRQUMvQixPQUFPLG1CQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEI7O09BRUc7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBUyxDQUFDLFdBQVcsQ0FBRSxJQUFJLENBQUMsZ0JBQStCLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtZQUNuQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxFQUFNO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxlQUFnQztRQUNqRCxJQUFJLENBQUMsQ0FBQywwQkFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsZUFBZSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sZUFBSyxDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsZ0JBQStCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBSSxFQUFFO1FBQ0osTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsZ0JBQStCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRixPQUFPLGVBQUssQ0FBQyxVQUFVLENBQUMsa0JBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDVCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLDBCQUFlLENBQUMsMEJBQTBCO2dCQUM3QyxPQUFPO29CQUNMO3dCQUNFLE9BQU8sRUFDSixJQUFJLENBQUMsZ0JBQStCLENBQUMsS0FBSyxFQUM1QyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTt3QkFDN0MsS0FBSyxFQUNGLElBQUksQ0FBQyxnQkFBK0IsQ0FBQyxLQUFLLEVBQzVDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO3FCQUM1QztpQkFDRixDQUFDO1lBQ0o7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksR0FBRztRQUNMLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFTLElBQUksQ0FBQyxnQkFBK0IsQ0FBQyxLQUFLLEVBQTZDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ2pILGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsSUFBSSxNQUFNLENBQUM7UUFDWCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLDBCQUFlLENBQUMsMEJBQTBCLENBQUM7WUFDaEQ7Z0JBQ0UsTUFBTSxHQUFLLElBQUksQ0FBQyxnQkFBK0IsQ0FBQyxLQUFLLEVBQTZDLENBQUMsTUFBTTtxQkFDdEcsTUFBTSxDQUFDO2dCQUNWLE1BQU07UUFDVixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDMUIsT0FBTztnQkFDTCxFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsdUJBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ25GLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBaUIsQ0FBQztnQkFDMUQsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7YUFDakMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsR0FBVztRQUN6QixNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMseUJBQXlCLENBQzdDLElBQUksQ0FBQyxRQUFRLEVBQ2Isa0JBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUNyQyxrQkFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDckIsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGtCQUFrQjtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakgsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkcsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFekcsSUFBSSxlQUFlLENBQUM7UUFDcEIsSUFBSSxDQUFDLDBCQUFlLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkUsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU87WUFDTCxZQUFZO1lBQ1osRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RSxZQUFZO1lBQ1osYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFlBQVk7WUFDWixlQUFlO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFqUUQsa0NBaVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXZheFNlcmlhbCwgdXRpbHMgYXMgYXZheFV0aWxzLCBDcmVkZW50aWFsLCBwdm1TZXJpYWwsIHNlY3AyNTZrMSwgVW5zaWduZWRUeCB9IGZyb20gJ0BiaXRnby1mb3Jrcy9hdmFsYW5jaGVqcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXZhbGFuY2hlTmV0d29yaywgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgQUREUkVTU19TRVBBUkFUT1IsIERlY29kZWRVdHhvT2JqLCBJTlBVVF9TRVBBUkFUT1IsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFR4LCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZ25hdHVyZSBpcyBlbXB0eVxuICogQHBhcmFtIHNpZ25hdHVyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc2lnbmF0dXJlICYmIHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpLnN0YXJ0c1dpdGgoJycucGFkU3RhcnQoOTAsICcwJykpO1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tTaWduYXR1cmUge1xuICAoc2lnYXR1cmU6IHN0cmluZywgYWRkcmVzc0hleDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzOiBzdHJpbmdbXSk6IENoZWNrU2lnbmF0dXJlIHtcbiAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID4gMSAmJiBzaWduYXR1cmVzLmV2ZXJ5KChzaWcpID0+IGlzRW1wdHlTaWduYXR1cmUoc2lnKSkpIHtcbiAgICAvLyBMb29rIGZvciBhZGRyZXNzLlxuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnLnN0YXJ0c1dpdGgoJzB4JykpIHNpZyA9IHNpZy5zdWJzdHJpbmcoMik7XG4gICAgICAgIGNvbnN0IHB1YiA9IHNpZy5zdWJzdHJpbmcoOTApO1xuICAgICAgICByZXR1cm4gcHViID09PSBhZGRyZXNzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMb29rIGZvciBlbXB0eSBzdHJpbmdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGlzRW1wdHlTaWduYXR1cmUoc2lnKTtcbiAgICB9O1xuICB9XG59XG4vLyBlbmQgcmVnaW9uIHV0aWxzIGZvciBzaWduXG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfYXZheFRyYW5zYWN0aW9uOiBUeDtcbiAgcHVibGljIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIHB1YmxpYyBfbmV0d29yazogQXZhbGFuY2hlTmV0d29yaztcbiAgcHVibGljIF9uZXR3b3JrSUQ6IG51bWJlcjtcbiAgcHVibGljIF9hc3NldElkOiBzdHJpbmc7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBzdHJpbmc7XG4gIHB1YmxpYyBfbm9kZUlEOiBzdHJpbmc7XG4gIHB1YmxpYyBfc3RhcnRUaW1lOiBiaWdpbnQ7XG4gIHB1YmxpYyBfZW5kVGltZTogYmlnaW50O1xuICBwdWJsaWMgX3N0YWtlQW1vdW50OiBiaWdpbnQ7XG4gIHB1YmxpYyBfdGhyZXNob2xkID0gMjtcbiAgcHVibGljIF9sb2NrdGltZSA9IEJpZ0ludCgwKTtcbiAgcHVibGljIF9mcm9tQWRkcmVzc2VzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgcHVibGljIF9yZXdhcmRBZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXSA9IFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107XG4gIHB1YmxpYyBfdG86IEJ1ZmZlckF2YXhbXTtcbiAgcHVibGljIF9mZWU6IFBhcnRpYWw8VHJhbnNhY3Rpb25GZWU+ID0ge307XG4gIHB1YmxpYyBfYmxzUHVibGljS2V5OiBzdHJpbmc7XG4gIHB1YmxpYyBfYmxzU2lnbmF0dXJlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcms7XG4gICAgdGhpcy5fYXNzZXRJZCA9IHRoaXMuX25ldHdvcmsuYXZheEFzc2V0SUQ7XG4gICAgdGhpcy5fYmxvY2tjaGFpbklEID0gdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQ7XG4gICAgdGhpcy5fbmV0d29ya0lEID0gdGhpcy5fbmV0d29yay5uZXR3b3JrSUQ7XG4gIH1cblxuICBnZXQgYXZheFBUcmFuc2FjdGlvbigpOiBhdmF4U2VyaWFsLkJhc2VUeCB7XG4gICAgcmV0dXJuICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeDtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFsc1swXS5nZXRTaWduYXR1cmVzKCkuZmlsdGVyKChzKSA9PiAhaXNFbXB0eVNpZ25hdHVyZShzKSk7XG4gIH1cblxuICBnZXQgY3JlZGVudGlhbHMoKTogQ3JlZGVudGlhbFtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KT8uY3JlZGVudGlhbHM7XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyhCRy01NjcwMCk6ICBJbXByb3ZlIGNhblNpZ24gYnkgY2hlY2sgaW4gYWRkcmVzc2VzIGluIGVtcHR5IGNyZWRlbnRpYWxzIG1hdGNoIHNpZ25lclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYW4gYXZheHAgdHJhbnNhY3Rpb24gYW5kIHVwZGF0ZSB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpclxuICAgKi9cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCkgYXMgVWludDhBcnJheTtcbiAgICBjb25zdCBhZGRyZXNzSGV4ID0ga2V5UGFpci5nZXRBZGRyZXNzQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hdmF4UFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2VtcHR5IHRyYW5zYWN0aW9uIHRvIHNpZ24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2VtcHR5IGNyZWRlbnRpYWxzIHRvIHNpZ24nKTtcbiAgICB9XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4O1xuICAgIGNvbnN0IHVuc2lnbmVkQnl0ZXMgPSB1bnNpZ25lZFR4LnRvQnl0ZXMoKTtcblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNlY3AyNTZrMS5nZXRQdWJsaWNLZXkocHJ2KTtcbiAgICBpZiAodW5zaWduZWRUeC5oYXNQdWJrZXkocHVibGljS2V5KSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgc2VjcDI1NmsxLnNpZ24odW5zaWduZWRCeXRlcywgcHJ2KTtcbiAgICAgIGxldCBjaGVja1NpZ246IENoZWNrU2lnbmF0dXJlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgdW5zaWduZWRUeC5jcmVkZW50aWFscy5mb3JFYWNoKChjLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tTaWduID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjaGVja1NpZ24gPSBnZW5lcmF0ZVNlbGVjdG9yU2lnbmF0dXJlKGMuZ2V0U2lnbmF0dXJlcygpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmluZCA9IGZhbHNlO1xuICAgICAgICBjLmdldFNpZ25hdHVyZXMoKS5mb3JFYWNoKChzaWcsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKGNoZWNrU2lnbiAmJiBjaGVja1NpZ24oc2lnLCBhZGRyZXNzSGV4KSkge1xuICAgICAgICAgICAgYy5zZXRTaWduYXR1cmUoaW5kZXgsIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICBmaW5kID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZpbmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKFxuICAgICAgICAgICAgYFByaXZhdGUga2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbiwgYWRkcmVzcyBoZXggJHthZGRyZXNzSGV4fSwgcHVibGljIGtleTogJHtwdWJsaWNLZXl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRvSGV4U3RyaW5nKGJ5dGVBcnJheTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGF2YXhVdGlscy5idWZmZXJUb0hleChieXRlQXJyYXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIC8qKlxuICAgKiBzaG91bGQgYmUgb2Ygc2lnbmVkVHggZG9pbmcgdGhpcyB3aXRoIGJhc2VUeFxuICAgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRvSGV4U3RyaW5nKGF2YXhVdGlscy5hZGRDaGVja3N1bSgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFNpZ25lZFR4KCkudG9CeXRlcygpKSk7XG4gIH1cblxuICAvLyB0eXBlcyAtIHN0YWtpbmdUcmFuc2FjdGlvbiwgaW1wb3J0LCBleHBvcnRcbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpbnB1dHM6IHRoaXMuaW5wdXRzLFxuICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy5mcm9tQWRkcmVzc2VzLFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl90aHJlc2hvbGQsXG4gICAgICBsb2NrdGltZTogdGhpcy5fbG9ja3RpbWUudG9TdHJpbmcoKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlLFxuICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLFxuICAgICAgY2hhbmdlT3V0cHV0czogdGhpcy5jaGFuZ2VPdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9hdmF4VHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIGlmICghW1RyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcl0uaW5jbHVkZXModHJhbnNhY3Rpb25UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBzaWduZWQgaW4gQnVmZmVyIGZvcm1hdC5cbiAgICogT25seSBuZWVkZWQgZm9yIGNvaW5zIHRoYXQgc3VwcG9ydCBhZGRpbmcgc2lnbmF0dXJlcyBkaXJlY3RseSAoZS5nLiBUU1MpLlxuICAgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB1dGlscy5zaGEyNTYoKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS50b0J5dGVzKCkpO1xuICB9XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYnVmZmVyQXJyYXkgPSB1dGlscy5zaGEyNTYoKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS50b0J5dGVzKCkpO1xuICAgIHJldHVybiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlckF2YXguZnJvbShidWZmZXJBcnJheSkpO1xuICB9XG5cbiAgZ2V0IGZyb21BZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQWRkcmVzc2VzLm1hcCgoYSkgPT4gYXZheFV0aWxzLmZvcm1hdCh0aGlzLl9uZXR3b3JrLmFsaWFzLCB0aGlzLl9uZXR3b3JrLmhycCwgYSkpO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGEpID0+IGF2YXhVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2Ygb3V0cHV0cy4gQW1vdW50cyBhcmUgZXhwcmVzc2VkIGluIGFic29sdXRlIHZhbHVlLlxuICAgKi9cbiAgZ2V0IG91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IChcbiAgICAgICAgICAgICAgKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4XG4gICAgICAgICAgICApLnN1Ym5ldFZhbGlkYXRvci52YWxpZGF0b3Iubm9kZUlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogKFxuICAgICAgICAgICAgICAodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhcbiAgICAgICAgICAgICkuc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci53ZWlnaHQudG9KU09OKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmVlKCk6IFRyYW5zYWN0aW9uRmVlIHtcbiAgICByZXR1cm4geyBmZWU6ICcwJywgLi4udGhpcy5fZmVlIH07XG4gIH1cblxuICBnZXQgY2hhbmdlT3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICByZXR1cm4gKCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuYmFzZVR4Lm91dHB1dHMubWFwKFxuICAgICAgdXRpbHMubWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKVxuICAgICk7XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IEVudHJ5W10ge1xuICAgIGxldCBpbnB1dHM7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5wdXRzID0gKCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuYmFzZVR4XG4gICAgICAgICAgLmlucHV0cztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlucHV0LnV0eG9JRC50eElELnRvU3RyaW5nKCkgKyBJTlBVVF9TRVBBUkFUT1IgKyBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnZhbHVlKCksXG4gICAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICAgIHZhbHVlOiBpbnB1dC5hbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdmF4IHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ252YWwgPSB1dGlscy5jcmVhdGVTaWduYXR1cmVBdmF4QnVmZmVyKFxuICAgICAgdGhpcy5fbmV0d29yayxcbiAgICAgIEJ1ZmZlckF2YXguZnJvbSh0aGlzLnNpZ25hYmxlUGF5bG9hZCksXG4gICAgICBCdWZmZXJBdmF4LmZyb20ocHJ2KVxuICAgICk7XG4gICAgcmV0dXJuIHNpZ252YWwudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB0eEpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnaW5wdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICd0eXBlJ107XG5cbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0eEpzb24ub3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0eEpzb24uY2hhbmdlT3V0cHV0cy5yZWR1Y2UoKHAsIG4pID0+IHAuYWRkKG5ldyBCTihuLnZhbHVlKSksIG5ldyBCTigwKSkudG9TdHJpbmcoKTtcblxuICAgIGxldCByZXdhcmRBZGRyZXNzZXM7XG4gICAgaWYgKFtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHR4SnNvbi50eXBlKSkge1xuICAgICAgcmV3YXJkQWRkcmVzc2VzID0gdGhpcy5yZXdhcmRBZGRyZXNzZXM7XG4gICAgICBkaXNwbGF5T3JkZXIuc3BsaWNlKDYsIDAsICdyZXdhcmRBZGRyZXNzZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHR4SnNvbi5pZCxcbiAgICAgIGlucHV0czogdHhKc29uLmlucHV0cyxcbiAgICAgIG91dHB1dHM6IHR4SnNvbi5vdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgY2hhbmdlT3V0cHV0czogdHhKc29uLmNoYW5nZU91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBjaGFuZ2VBbW91bnQsXG4gICAgICByZXdhcmRBZGRyZXNzZXMsXG4gICAgICBmZWU6IHRoaXMuZmVlLFxuICAgICAgdHlwZTogdHhKc29uLnR5cGUsXG4gICAgfTtcbiAgfVxufVxuIl19

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


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