PHP WebShell

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

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnstakingBuilder = void 0;
const bcs_1 = require("@mysten/bcs");
const sdk_core_1 = require("@bitgo/sdk-core");
const iface_1 = require("./iface");
const transactionBuilder_1 = require("./transactionBuilder");
const assert_1 = __importDefault(require("assert"));
const builder_1 = require("./mystenlab/builder");
const framework_1 = require("./mystenlab/framework");
const unstakingTransaction_1 = require("./unstakingTransaction");
const utils_1 = __importDefault(require("./utils"));
const types_1 = require("./mystenlab/types");
class UnstakingBuilder extends transactionBuilder_1.TransactionBuilder {
    constructor(_coinConfig) {
        super(_coinConfig);
        this._transaction = new unstakingTransaction_1.UnstakingTransaction(_coinConfig);
    }
    /**
     * Build a MoveCall transaction ready to be signed and executed.
     *
     * @returns {BitGoSuiTransaction} an unsigned Sui transaction
     */
    buildUnstakeTransaction() {
        return {
            type: iface_1.SuiTransactionType.WithdrawStake,
            sender: this._sender,
            tx: {
                inputs: [],
                transactions: [],
            },
            gasData: this._gasData,
        };
    }
    /**
     * Get staking transaction type
     *
     * @return {TransactionType}
     * @protected
     */
    get transactionType() {
        return sdk_core_1.TransactionType.StakingClaim;
    }
    /** @inheritdoc */
    validateTransaction(transaction) {
        if (!transaction.suiTransaction) {
            return;
        }
        this.validateTransactionFields();
    }
    /** @inheritdoc */
    sign(key) {
        this.transaction.setSuiTransaction(this.buildSuiTransaction());
        super.sign(key);
    }
    /**
     * Create a new transaction for withdrawing coins ready to be signed
     *
     * @param {RequestWithdrawStakedSui} request
     */
    unstake(request) {
        this.validateSuiObjectRef(request.stakedSui, 'stakedSui');
        if (request.amount !== undefined) {
            if (!utils_1.default.isValidAmount(request.amount)) {
                throw new Error(`invalid amount: ${request.amount}`);
            }
        }
        this._withdrawDelegation = request;
        return this;
    }
    /** @inheritdoc */
    fromImplementation(rawTransaction) {
        const tx = new unstakingTransaction_1.UnstakingTransaction(this._coinConfig);
        this.validateRawTransaction(rawTransaction);
        tx.fromRawTransaction(rawTransaction);
        this.initBuilder(tx);
        return this.transaction;
    }
    /** @inheritdoc */
    async buildImplementation() {
        this.transaction.setSuiTransaction(this.buildSuiTransaction());
        this.transaction.transactionType(this.transactionType);
        if (this._signer) {
            this.transaction.sign(this._signer);
        }
        this._signatures.forEach((signature) => {
            this.transaction.addSignature(signature.publicKey, signature.signature);
        });
        this.transaction.loadInputsAndOutputs();
        return this.transaction;
    }
    /**
     * Initialize the transaction builder fields using the decoded transaction data
     *
     * @param {StakingTransaction} tx the transaction data
     */
    initBuilder(tx) {
        this._transaction = tx;
        if (tx.signature && tx.signature.length > 0) {
            this._signatures = [tx.suiSignature];
        }
        const txData = tx.toJson();
        this.type(iface_1.SuiTransactionType.WithdrawStake);
        this.sender(txData.sender);
        this.gasData(txData.gasData);
        const parsed = unstakingTransaction_1.UnstakingTransaction.parseTransaction(tx.suiTransaction.tx);
        this.unstake({
            stakedSui: {
                // it is a bit unclear why we have to normalize this way
                ...parsed.stakedObjectRef,
                objectId: (0, types_1.normalizeSuiObjectId)(parsed.stakedObjectRef.objectId),
                version: Number(parsed.stakedObjectRef.version),
            },
            amount: parsed.amount === undefined ? undefined : Number(parsed.amount),
        });
    }
    /**
     * Validates all fields are defined
     */
    validateTransactionFields() {
        (0, assert_1.default)(this._type, new sdk_core_1.BuildTransactionError('type is required before building'));
        (0, assert_1.default)(this._sender, new sdk_core_1.BuildTransactionError('sender is required before building'));
        (0, assert_1.default)(this._withdrawDelegation.stakedSui, new sdk_core_1.BuildTransactionError('stakedSui object is required before building'));
        (0, assert_1.default)(this._gasData, new sdk_core_1.BuildTransactionError('gasData is required before building'));
        this.validateGasData(this._gasData);
    }
    static getTransactionBlockData(objectRef, amount) {
        const txb = new builder_1.TransactionBlock();
        const targetSplit = `${framework_1.SUI_SYSTEM_ADDRESS}::${framework_1.SUI_STAKING_POOL_MODULE_NAME}::${framework_1.SUI_STAKING_POOL_SPLIT_FUN_NAME}`;
        const targetWithdrawStake = `${framework_1.SUI_SYSTEM_ADDRESS}::${framework_1.SUI_SYSTEM_MODULE_NAME}::${framework_1.WITHDRAW_STAKE_FUN_NAME}`;
        if (amount === undefined) {
            txb.moveCall({
                target: targetWithdrawStake,
                arguments: [txb.object(builder_1.Inputs.SharedObjectRef(framework_1.SUI_SYSTEM_STATE_OBJECT)), txb.pure(builder_1.Inputs.ObjectRef(objectRef))],
            });
        }
        else {
            txb.moveCall({
                target: targetSplit,
                arguments: [txb.object(builder_1.Inputs.ObjectRef(objectRef)), txb.pure(amount)],
            });
            txb.moveCall({
                target: targetWithdrawStake,
                arguments: [
                    txb.object(builder_1.Inputs.SharedObjectRef(framework_1.SUI_SYSTEM_STATE_OBJECT)),
                    { kind: 'NestedResult', index: 0, resultIndex: 0 },
                ],
            });
        }
        return txb.blockData;
    }
    static getTransactionBlockDataReserialized(objectRef, amount) {
        const inputs = [
            { Object: { ImmOrOwned: objectRef } },
            builder_1.Inputs.Pure(amount, bcs_1.BCS.U64),
            {
                Object: {
                    Shared: {
                        objectId: '0000000000000000000000000000000000000000000000000000000000000005',
                        initialSharedVersion: '1',
                        mutable: true,
                    },
                },
            },
        ];
        const transactions = [
            {
                kind: 'MoveCall',
                target: '0000000000000000000000000000000000000000000000000000000000000003::staking_pool::split',
                arguments: [
                    {
                        kind: 'Input',
                        index: 0,
                    },
                    {
                        kind: 'Input',
                        index: 1,
                    },
                ],
                typeArguments: [],
            },
            {
                kind: 'MoveCall',
                target: '0000000000000000000000000000000000000000000000000000000000000003::sui_system::request_withdraw_stake',
                arguments: [
                    {
                        kind: 'Input',
                        index: 2,
                    },
                    {
                        kind: 'NestedResult',
                        index: 0,
                        resultIndex: 0,
                    },
                ],
                typeArguments: [],
            },
        ];
        return { inputs, transactions };
    }
    /**
     * Build SuiTransaction
     *
     * @return {SuiTransaction<UnstakingProgrammableTransaction>}
     * @protected
     */
    buildSuiTransaction() {
        this.validateTransactionFields();
        const txData = UnstakingBuilder.getTransactionBlockData(this._withdrawDelegation.stakedSui, this._withdrawDelegation.amount === undefined ? undefined : BigInt(this._withdrawDelegation.amount));
        return {
            type: this._type,
            sender: this._sender,
            tx: {
                inputs: [...txData.inputs],
                transactions: [...txData.transactions],
            },
            gasData: {
                ...this._gasData,
            },
        };
    }
}
exports.UnstakingBuilder = UnstakingBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zdGFraW5nQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdW5zdGFraW5nQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxQ0FBa0M7QUFFbEMsOENBQWtGO0FBQ2xGLG1DQUtpQjtBQUNqQiw2REFBMEQ7QUFFMUQsb0RBQTRCO0FBRTVCLGlEQUFxRztBQUNyRyxxREFPK0I7QUFDL0IsaUVBQThEO0FBQzlELG9EQUE0QjtBQUM1Qiw2Q0FBdUU7QUFHdkUsTUFBYSxnQkFBaUIsU0FBUSx1Q0FBb0Q7SUFHeEYsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLDJDQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7OztPQUlHO0lBQ08sdUJBQXVCO1FBQy9CLE9BQU87WUFDTCxJQUFJLEVBQUUsMEJBQWtCLENBQUMsYUFBYTtZQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDcEIsRUFBRSxFQUFFO2dCQUNGLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFlBQVksRUFBRSxFQUFFO2FBQ2pCO1lBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLG1CQUFtQixDQUFDLFdBQWdDO1FBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxHQUFZO1FBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxp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LENBQUMsTUFBTSxDQUFDLENBQ3BHLENBQUM7UUFDRixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNwQixFQUFFLEVBQUU7Z0JBQ0YsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUMxQixZQUFZLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7YUFDdkM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxJQUFJLENBQUMsUUFBUTthQUNqQjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE3T0QsNENBNk9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQkNTIH0gZnJvbSAnQG15c3Rlbi9iY3MnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJhc2VLZXksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7XG4gIFN1aVRyYW5zYWN0aW9uLFxuICBSZXF1ZXN0V2l0aGRyYXdTdGFrZWRTdWksXG4gIFN1aVRyYW5zYWN0aW9uVHlwZSxcbiAgVW5zdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CbG9jayBhcyBQcm9ncmFtbWluZ1RyYW5zYWN0aW9uQmxvY2tCdWlsZGVyLCBJbnB1dHMgfSBmcm9tICcuL215c3RlbmxhYi9idWlsZGVyJztcbmltcG9ydCB7XG4gIFNVSV9TVEFLSU5HX1BPT0xfTU9EVUxFX05BTUUsXG4gIFNVSV9TVEFLSU5HX1BPT0xfU1BMSVRfRlVOX05BTUUsXG4gIFNVSV9TWVNURU1fQUREUkVTUyxcbiAgU1VJX1NZU1RFTV9NT0RVTEVfTkFNRSxcbiAgU1VJX1NZU1RFTV9TVEFURV9PQkpFQ1QsXG4gIFdJVEhEUkFXX1NUQUtFX0ZVTl9OQU1FLFxufSBmcm9tICcuL215c3RlbmxhYi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgVW5zdGFraW5nVHJhbnNhY3Rpb24gfSBmcm9tICcuL3Vuc3Rha2luZ1RyYW5zYWN0aW9uJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVN1aU9iamVjdElkLCBTdWlPYmplY3RSZWYgfSBmcm9tICcuL215c3RlbmxhYi90eXBlcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHJhbnNhY3Rpb25EYXRhQnVpbGRlciB9IGZyb20gJy4vbXlzdGVubGFiL2J1aWxkZXIvVHJhbnNhY3Rpb25EYXRhQmxvY2snO1xuXG5leHBvcnQgY2xhc3MgVW5zdGFraW5nQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlcjxVbnN0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4ge1xuICBwcm90ZWN0ZWQgX3dpdGhkcmF3RGVsZWdhdGlvbjogUmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBVbnN0YWtpbmdUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBNb3ZlQ2FsbCB0cmFuc2FjdGlvbiByZWFkeSB0byBiZSBzaWduZWQgYW5kIGV4ZWN1dGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Qml0R29TdWlUcmFuc2FjdGlvbn0gYW4gdW5zaWduZWQgU3VpIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRVbnN0YWtlVHJhbnNhY3Rpb24oKTogU3VpVHJhbnNhY3Rpb248VW5zdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UsXG4gICAgICBzZW5kZXI6IHRoaXMuX3NlbmRlcixcbiAgICAgIHR4OiB7XG4gICAgICAgIGlucHV0czogW10sXG4gICAgICAgIHRyYW5zYWN0aW9uczogW10sXG4gICAgICB9LFxuICAgICAgZ2FzRGF0YTogdGhpcy5fZ2FzRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGFraW5nIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHJldHVybiB7VHJhbnNhY3Rpb25UeXBlfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0NsYWltO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zZmVyVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRyYW5zYWN0aW9uLnN1aVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbkZpZWxkcygpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHNpZ24oa2V5OiBCYXNlS2V5KSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRTdWlUcmFuc2FjdGlvbih0aGlzLmJ1aWxkU3VpVHJhbnNhY3Rpb24oKSk7XG4gICAgc3VwZXIuc2lnbihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB0cmFuc2FjdGlvbiBmb3Igd2l0aGRyYXdpbmcgY29pbnMgcmVhZHkgdG8gYmUgc2lnbmVkXG4gICAqXG4gICAqIEBwYXJhbSB7UmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpfSByZXF1ZXN0XG4gICAqL1xuICB1bnN0YWtlKHJlcXVlc3Q6IFJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVTdWlPYmplY3RSZWYocmVxdWVzdC5zdGFrZWRTdWksICdzdGFrZWRTdWknKTtcbiAgICBpZiAocmVxdWVzdC5hbW91bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF1dGlscy5pc1ZhbGlkQW1vdW50KHJlcXVlc3QuYW1vdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYW1vdW50OiAke3JlcXVlc3QuYW1vdW50fWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl93aXRoZHJhd0RlbGVnYXRpb24gPSByZXF1ZXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRyYW5zYWN0aW9uPFVuc3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHggPSBuZXcgVW5zdGFraW5nVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZyk7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb248VW5zdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+PiB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRTdWlUcmFuc2FjdGlvbih0aGlzLmJ1aWxkU3VpVHJhbnNhY3Rpb24oKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi50cmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuXG4gICAgaWYgKHRoaXMuX3NpZ25lcikge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zaWduKHRoaXMuX3NpZ25lcik7XG4gICAgfVxuXG4gICAgdGhpcy5fc2lnbmF0dXJlcy5mb3JFYWNoKChzaWduYXR1cmUpID0+IHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uYWRkU2lnbmF0dXJlKHNpZ25hdHVyZS5wdWJsaWNLZXksIHNpZ25hdHVyZS5zaWduYXR1cmUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmllbGRzIHVzaW5nIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtTdGFraW5nVHJhbnNhY3Rpb259IHR4IHRoZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqL1xuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb248VW5zdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+KTogdm9pZCB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0eDtcblxuICAgIGlmICh0eC5zaWduYXR1cmUgJiYgdHguc2lnbmF0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBbdHguc3VpU2lnbmF0dXJlXTtcbiAgICB9XG5cbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0aGlzLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UpO1xuICAgIHRoaXMuc2VuZGVyKHR4RGF0YS5zZW5kZXIpO1xuICAgIHRoaXMuZ2FzRGF0YSh0eERhdGEuZ2FzRGF0YSk7XG4gICAgY29uc3QgcGFyc2VkID0gVW5zdGFraW5nVHJhbnNhY3Rpb24ucGFyc2VUcmFuc2FjdGlvbih0eC5zdWlUcmFuc2FjdGlvbi50eCk7XG4gICAgdGhpcy51bnN0YWtlKHtcbiAgICAgIHN0YWtlZFN1aToge1xuICAgICAgICAvLyBpdCBpcyBhIGJpdCB1bmNsZWFyIHdoeSB3ZSBoYXZlIHRvIG5vcm1hbGl6ZSB0aGlzIHdheVxuICAgICAgICAuLi5wYXJzZWQuc3Rha2VkT2JqZWN0UmVmLFxuICAgICAgICBvYmplY3RJZDogbm9ybWFsaXplU3VpT2JqZWN0SWQocGFyc2VkLnN0YWtlZE9iamVjdFJlZi5vYmplY3RJZCksXG4gICAgICAgIHZlcnNpb246IE51bWJlcihwYXJzZWQuc3Rha2VkT2JqZWN0UmVmLnZlcnNpb24pLFxuICAgICAgfSxcbiAgICAgIGFtb3VudDogcGFyc2VkLmFtb3VudCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTnVtYmVyKHBhcnNlZC5hbW91bnQpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbGwgZmllbGRzIGFyZSBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNhY3Rpb25GaWVsZHMoKTogdm9pZCB7XG4gICAgYXNzZXJ0KHRoaXMuX3R5cGUsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3R5cGUgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIGFzc2VydCh0aGlzLl9zZW5kZXIsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3NlbmRlciBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKSk7XG4gICAgYXNzZXJ0KFxuICAgICAgdGhpcy5fd2l0aGRyYXdEZWxlZ2F0aW9uLnN0YWtlZFN1aSxcbiAgICAgIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3N0YWtlZFN1aSBvYmplY3QgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJylcbiAgICApO1xuICAgIGFzc2VydCh0aGlzLl9nYXNEYXRhLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdnYXNEYXRhIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICB0aGlzLnZhbGlkYXRlR2FzRGF0YSh0aGlzLl9nYXNEYXRhKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRUcmFuc2FjdGlvbkJsb2NrRGF0YShvYmplY3RSZWY6IFN1aU9iamVjdFJlZiwgYW1vdW50PzogYmlnaW50KTogU2VyaWFsaXplZFRyYW5zYWN0aW9uRGF0YUJ1aWxkZXIge1xuICAgIGNvbnN0IHR4YiA9IG5ldyBQcm9ncmFtbWluZ1RyYW5zYWN0aW9uQmxvY2tCdWlsZGVyKCk7XG4gICAgY29uc3QgdGFyZ2V0U3BsaXQgPVxuICAgICAgYCR7U1VJX1NZU1RFTV9BRERSRVNTfTo6JHtTVUlfU1RBS0lOR19QT09MX01PRFVMRV9OQU1FfTo6JHtTVUlfU1RBS0lOR19QT09MX1NQTElUX0ZVTl9OQU1FfWAgYXMgYCR7c3RyaW5nfTo6JHtzdHJpbmd9Ojoke3N0cmluZ31gO1xuICAgIGNvbnN0IHRhcmdldFdpdGhkcmF3U3Rha2UgPVxuICAgICAgYCR7U1VJX1NZU1RFTV9BRERSRVNTfTo6JHtTVUlfU1lTVEVNX01PRFVMRV9OQU1FfTo6JHtXSVRIRFJBV19TVEFLRV9GVU5fTkFNRX1gIGFzIGAke3N0cmluZ306OiR7c3RyaW5nfTo6JHtzdHJpbmd9YDtcbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHR4Yi5tb3ZlQ2FsbCh7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0V2l0aGRyYXdTdGFrZSxcbiAgICAgICAgYXJndW1lbnRzOiBbdHhiLm9iamVjdChJbnB1dHMuU2hhcmVkT2JqZWN0UmVmKFNVSV9TWVNURU1fU1RBVEVfT0JKRUNUKSksIHR4Yi5wdXJlKElucHV0cy5PYmplY3RSZWYob2JqZWN0UmVmKSldLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4Yi5tb3ZlQ2FsbCh7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0U3BsaXQsXG4gICAgICAgIGFyZ3VtZW50czogW3R4Yi5vYmplY3QoSW5wdXRzLk9iamVjdFJlZihvYmplY3RSZWYpKSwgdHhiLnB1cmUoYW1vdW50KV0sXG4gICAgICB9KTtcbiAgICAgIHR4Yi5tb3ZlQ2FsbCh7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0V2l0aGRyYXdTdGFrZSxcbiAgICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgICAgdHhiLm9iamVjdChJbnB1dHMuU2hhcmVkT2JqZWN0UmVmKFNVSV9TWVNURU1fU1RBVEVfT0JKRUNUKSksXG4gICAgICAgICAgeyBraW5kOiAnTmVzdGVkUmVzdWx0JywgaW5kZXg6IDAsIHJlc3VsdEluZGV4OiAwIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHR4Yi5ibG9ja0RhdGE7XG4gIH1cblxuICBzdGF0aWMgZ2V0VHJhbnNhY3Rpb25CbG9ja0RhdGFSZXNlcmlhbGl6ZWQoXG4gICAgb2JqZWN0UmVmOiBTdWlPYmplY3RSZWYsXG4gICAgYW1vdW50OiBiaWdpbnRcbiAgKTogeyBpbnB1dHM6IHVua25vd25bXTsgdHJhbnNhY3Rpb25zOiB1bmtub3duW10gfSB7XG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgeyBPYmplY3Q6IHsgSW1tT3JPd25lZDogb2JqZWN0UmVmIH0gfSxcbiAgICAgIElucHV0cy5QdXJlKGFtb3VudCwgQkNTLlU2NCksXG4gICAgICB7XG4gICAgICAgIE9iamVjdDoge1xuICAgICAgICAgIFNoYXJlZDoge1xuICAgICAgICAgICAgb2JqZWN0SWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1JyxcbiAgICAgICAgICAgIGluaXRpYWxTaGFyZWRWZXJzaW9uOiAnMScsXG4gICAgICAgICAgICBtdXRhYmxlOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gW1xuICAgICAge1xuICAgICAgICBraW5kOiAnTW92ZUNhbGwnLFxuICAgICAgICB0YXJnZXQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzOjpzdGFraW5nX3Bvb2w6OnNwbGl0JyxcbiAgICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2luZDogJ0lucHV0JyxcbiAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2luZDogJ0lucHV0JyxcbiAgICAgICAgICAgIGluZGV4OiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHR5cGVBcmd1bWVudHM6IFtdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2luZDogJ01vdmVDYWxsJyxcbiAgICAgICAgdGFyZ2V0OiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzo6c3VpX3N5c3RlbTo6cmVxdWVzdF93aXRoZHJhd19zdGFrZScsXG4gICAgICAgIGFyZ3VtZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtpbmQ6ICdJbnB1dCcsXG4gICAgICAgICAgICBpbmRleDogMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtpbmQ6ICdOZXN0ZWRSZXN1bHQnLFxuICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICByZXN1bHRJbmRleDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0eXBlQXJndW1lbnRzOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICByZXR1cm4geyBpbnB1dHMsIHRyYW5zYWN0aW9ucyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFN1aVRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEByZXR1cm4ge1N1aVRyYW5zYWN0aW9uPFVuc3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uPn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkU3VpVHJhbnNhY3Rpb24oKTogU3VpVHJhbnNhY3Rpb248VW5zdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLnZhbGlkYXRlVHJhbnNhY3Rpb25GaWVsZHMoKTtcbiAgICBjb25zdCB0eERhdGEgPSBVbnN0YWtpbmdCdWlsZGVyLmdldFRyYW5zYWN0aW9uQmxvY2tEYXRhKFxuICAgICAgdGhpcy5fd2l0aGRyYXdEZWxlZ2F0aW9uLnN0YWtlZFN1aSxcbiAgICAgIHRoaXMuX3dpdGhkcmF3RGVsZWdhdGlvbi5hbW91bnQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IEJpZ0ludCh0aGlzLl93aXRoZHJhd0RlbGVnYXRpb24uYW1vdW50KVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMuX3R5cGUsXG4gICAgICBzZW5kZXI6IHRoaXMuX3NlbmRlcixcbiAgICAgIHR4OiB7XG4gICAgICAgIGlucHV0czogWy4uLnR4RGF0YS5pbnB1dHNdLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IFsuLi50eERhdGEudHJhbnNhY3Rpb25zXSxcbiAgICAgIH0sXG4gICAgICBnYXNEYXRhOiB7XG4gICAgICAgIC4uLnRoaXMuX2dhc0RhdGEsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==

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


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