PHP WebShell

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

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

"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
    if (kind === "m") throw new TypeError("Private method is not writable");
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _TransactionBlock_blockData;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransactionBlock = void 0;
const bcs_1 = require("@mysten/bcs");
const superstruct_1 = require("superstruct");
const types_1 = require("../types");
const Transactions_1 = require("./Transactions");
const Inputs_1 = require("./Inputs");
const TransactionDataBlock_1 = require("./TransactionDataBlock");
const utils_1 = require("./utils");
function createTransactionResult(index) {
    const baseResult = { kind: 'Result', index };
    const nestedResults = [];
    const nestedResultFor = (resultIndex) => (nestedResults[resultIndex] ?? (nestedResults[resultIndex] = {
        kind: 'NestedResult',
        index,
        resultIndex,
    }));
    return new Proxy(baseResult, {
        set() {
            throw new Error('The transaction result is a proxy, and does not support setting properties directly');
        },
        // TODO: Instead of making this return a concrete argument, we should ideally
        // make it reference-based (so that this gets resolved at build-time), which
        // allows re-ordering transactions.
        get(target, property) {
            // This allows this transaction argument to be used in the singular form:
            if (property in target) {
                return Reflect.get(target, property);
            }
            // Support destructuring:
            if (property === Symbol.iterator) {
                return function* () {
                    let i = 0;
                    while (true) {
                        yield nestedResultFor(i);
                        i++;
                    }
                };
            }
            if (typeof property === 'symbol')
                return;
            const resultIndex = parseInt(property, 10);
            if (Number.isNaN(resultIndex) || resultIndex < 0)
                return;
            return nestedResultFor(resultIndex);
        },
    });
}
const TRANSACTION_BRAND = Symbol.for('@mysten/transaction');
// The maximum number of gas objects that can be selected for one transaction.
const MAX_GAS_OBJECTS = 256;
// The maximum gas that is allowed.
const MAX_GAS = 1000000000;
// A guess about how much overhead each coin provides for gas calculations.
// @ts-ignore
const GAS_OVERHEAD_PER_COIN = 10n;
/**
 * Transaction Builder
 */
class TransactionBlock {
    /** Returns `true` if the object is an instance of the Transaction builder class. */
    static is(obj) {
        return !!obj && typeof obj === 'object' && obj[TRANSACTION_BRAND] === true;
    }
    /**
     * Converts from a serialize transaction kind (built with `build({ onlyTransactionKind: true })`) to a `Transaction` class.
     * Supports either a byte array, or base64-encoded bytes.
     */
    static fromKind(serialized) {
        const tx = new TransactionBlock();
        __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromKindBytes(typeof serialized === 'string' ? (0, bcs_1.fromB64)(serialized) : serialized), "f");
        return tx;
    }
    /**
     * Converts from a serialized transaction format to a `Transaction` class.
     * There are two supported serialized formats:
     * - A string returned from `Transaction#serialize`. The serialized format must be compatible, or it will throw an error.
     * - A byte array (or base64-encoded bytes) containing BCS transaction data.
     */
    static from(serialized) {
        const tx = new TransactionBlock();
        // Check for bytes:
        if (typeof serialized !== 'string' || !serialized.startsWith('{')) {
            __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.fromBytes(typeof serialized === 'string' ? (0, bcs_1.fromB64)(serialized) : serialized), "f");
        }
        else {
            __classPrivateFieldSet(tx, _TransactionBlock_blockData, TransactionDataBlock_1.TransactionBlockDataBuilder.restore(JSON.parse(serialized)), "f");
        }
        return tx;
    }
    /** A helper to retrieve the Transaction builder `Transactions` */
    static get Transactions() {
        return Transactions_1.Transactions;
    }
    /** A helper to retrieve the Transaction builder `Inputs` */
    static get Inputs() {
        return Inputs_1.Inputs;
    }
    setSender(sender) {
        __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").sender = sender;
    }
    /**
     * Sets the sender only if it has not already been set.
     * This is useful for sponsored transaction flows where the sender may not be the same as the signer address.
     */
    setSenderIfNotSet(sender) {
        if (!__classPrivateFieldGet(this, _TransactionBlock_blockData, "f").sender) {
            __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").sender = sender;
        }
    }
    setExpiration(expiration) {
        __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").expiration = expiration;
    }
    setGasPrice(price) {
        __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").gasConfig.price = String(price);
    }
    setGasBudget(budget) {
        __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").gasConfig.budget = String(budget);
    }
    setGasOwner(owner) {
        __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").gasConfig.owner = owner;
    }
    setGasPayment(payments) {
        if (payments.length >= MAX_GAS_OBJECTS) {
            throw new Error(`Payment objects exceed maximum amount ${MAX_GAS_OBJECTS}`);
        }
        __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").gasConfig.payment = payments.map((payment) => (0, superstruct_1.mask)(payment, types_1.SuiObjectRef));
    }
    /** Get a snapshot of the transaction data, in JSON form: */
    get blockData() {
        return __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").snapshot();
    }
    // Used to brand transaction classes so that they can be identified, even between multiple copies
    // of the builder.
    get [(_TransactionBlock_blockData = new WeakMap(), TRANSACTION_BRAND)]() {
        return true;
    }
    constructor(transaction) {
        _TransactionBlock_blockData.set(this, void 0);
        __classPrivateFieldSet(this, _TransactionBlock_blockData, new TransactionDataBlock_1.TransactionBlockDataBuilder(transaction ? __classPrivateFieldGet(transaction, _TransactionBlock_blockData, "f") : undefined), "f");
    }
    /** Returns an argument for the gas coin, to be used in a transaction. */
    get gas() {
        return { kind: 'GasCoin' };
    }
    /**
     * Dynamically create a new input, which is separate from the `input`. This is important
     * for generated clients to be able to define unique inputs that are non-overlapping with the
     * defined inputs.
     *
     * For `Uint8Array` type automatically convert the input into a `Pure` CallArg, since this
     * is the format required for custom serialization.
     *
     */
    input(type, value) {
        const index = __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").inputs.length;
        const input = (0, utils_1.create)({
            kind: 'Input',
            // bigints can't be serialized to JSON, so just string-convert them here:
            value: typeof value === 'bigint' ? String(value) : value,
            index,
            type,
        }, Transactions_1.TransactionBlockInput);
        __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").inputs.push(input);
        return input;
    }
    /**
     * Add a new object input to the transaction.
     */
    object(value) {
        const id = (0, Inputs_1.getIdFromCallArg)(value);
        // deduplicate
        const inserted = __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").inputs.find((i) => i.type === 'object' && id === (0, Inputs_1.getIdFromCallArg)(i.value));
        return inserted ?? this.input('object', value);
    }
    /**
     * Add a new non-object input to the transaction.
     */
    pure(
    /**
     * The pure value that will be used as the input value. If this is a Uint8Array, then the value
     * is assumed to be raw bytes, and will be used directly.
     */
    value, 
    /**
     * The BCS type to serialize the value into. If not provided, the type will automatically be determined
     * based on how the input is used.
     */
    type) {
        // TODO: we can also do some deduplication here
        return this.input('pure', value instanceof Uint8Array ? Inputs_1.Inputs.Pure(value) : type ? Inputs_1.Inputs.Pure(value, type) : value);
    }
    /** Add a transaction to the transaction block. */
    add(transaction) {
        const index = __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").transactions.push(transaction);
        return createTransactionResult(index - 1);
    }
    // Method shorthands:
    splitCoins(...args) {
        return this.add(Transactions_1.Transactions.SplitCoins(...args));
    }
    mergeCoins(...args) {
        return this.add(Transactions_1.Transactions.MergeCoins(...args));
    }
    publish(...args) {
        return this.add(Transactions_1.Transactions.Publish(...args));
    }
    moveCall(...args) {
        return this.add(Transactions_1.Transactions.MoveCall(...args));
    }
    transferObjects(...args) {
        return this.add(Transactions_1.Transactions.TransferObjects(...args));
    }
    makeMoveVec(...args) {
        return this.add(Transactions_1.Transactions.MakeMoveVec(...args));
    }
    /**
     * Serialize the transaction to a string so that it can be sent to a separate context.
     * This is different from `build` in that it does not serialize to BCS bytes, and instead
     * uses a separate format that is unique to the transaction builder. This allows
     * us to serialize partially-complete transactions, that can then be completed and
     * built in a separate context.
     *
     * For example, a dapp can construct a transaction, but not provide gas objects
     * or a gas budget. The transaction then can be sent to the wallet, where this
     * information is automatically filled in (e.g. by querying for coin objects
     * and performing a dry run).
     */
    serialize() {
        return JSON.stringify(__classPrivateFieldGet(this, _TransactionBlock_blockData, "f").snapshot());
    }
    /** Build the transaction to BCS bytes. */
    async build({ onlyTransactionKind } = {}) {
        return __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").build({ onlyTransactionKind });
    }
    /** Derive transaction digest */
    async getDigest() {
        return __classPrivateFieldGet(this, _TransactionBlock_blockData, "f").getDigest();
    }
}
exports.TransactionBlock = TransactionBlock;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CbG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbXlzdGVubGFiL2J1aWxkZXIvVHJhbnNhY3Rpb25CbG9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBc0M7QUFDdEMsNkNBQXVDO0FBQ3ZDLG9DQUFrRDtBQUNsRCxpREFBMkc7QUFDM0cscUNBQW1GO0FBQ25GLGlFQUE0RjtBQUM1RixtQ0FBaUM7QUFJakMsU0FBUyx1QkFBdUIsQ0FBQyxLQUFhO0lBQzVDLE1BQU0sVUFBVSxHQUF3QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFbEUsTUFBTSxhQUFhLEdBQTBCLEVBQUUsQ0FBQztJQUNoRCxNQUFNLGVBQWUsR0FBRyxDQUFDLFdBQW1CLEVBQXVCLEVBQUUsQ0FDbkUsQ0FBQyxhQUFhLENBQUMsV0FBVyxNQUF6QixhQUFhLENBQUMsV0FBVyxJQUFNO1FBQzlCLElBQUksRUFBRSxjQUFjO1FBQ3BCLEtBQUs7UUFDTCxXQUFXO0tBQ1osRUFBQyxDQUFDO0lBRUwsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDM0IsR0FBRztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUZBQXFGLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQ0QsNkVBQTZFO1FBQzdFLDRFQUE0RTtRQUM1RSxtQ0FBbUM7UUFDbkMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRO1lBQ2xCLHlFQUF5RTtZQUN6RSxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBRUQseUJBQXlCO1lBQ3pCLElBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxRQUFRLENBQUM7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QUM7SUFDakQsQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFHLElBQW1EO1FBQzdELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELGVBQWUsQ0FBQyxHQUFHLElBQTBEO1FBQzNFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELFdBQVcsQ0FBQyxHQUFHLElBQXNEO1FBQ25FLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBQSxJQUFJLG1DQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsS0FBbUIsRUFBRTtRQUNwRCxPQUFPLHVCQUFBLElBQUksbUNBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxLQUFLLENBQUMsU0FBUztRQUNiLE9BQU8sdUJBQUEsSUFBSSxtQ0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQXBORCw0Q0FvTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tQjY0IH0gZnJvbSAnQG15c3Rlbi9iY3MnO1xuaW1wb3J0IHsgaXMsIG1hc2sgfSBmcm9tICdzdXBlcnN0cnVjdCc7XG5pbXBvcnQgeyBPYmplY3RJZCwgU3VpT2JqZWN0UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25zLCBUcmFuc2FjdGlvbkFyZ3VtZW50LCBUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCB9IGZyb20gJy4vVHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJ1aWxkZXJDYWxsQXJnLCBnZXRJZEZyb21DYWxsQXJnLCBJbnB1dHMsIE9iamVjdENhbGxBcmcgfSBmcm9tICcuL0lucHV0cyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIsIFRyYW5zYWN0aW9uRXhwaXJhdGlvbiB9IGZyb20gJy4vVHJhbnNhY3Rpb25EYXRhQmxvY2snO1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgVHJhbnNhY3Rpb25SZXN1bHQgPSBUcmFuc2FjdGlvbkFyZ3VtZW50ICYgVHJhbnNhY3Rpb25Bcmd1bWVudFtdO1xuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2FjdGlvblJlc3VsdChpbmRleDogbnVtYmVyKTogVHJhbnNhY3Rpb25SZXN1bHQge1xuICBjb25zdCBiYXNlUmVzdWx0OiBUcmFuc2FjdGlvbkFyZ3VtZW50ID0geyBraW5kOiAnUmVzdWx0JywgaW5kZXggfTtcblxuICBjb25zdCBuZXN0ZWRSZXN1bHRzOiBUcmFuc2FjdGlvbkFyZ3VtZW50W10gPSBbXTtcbiAgY29uc3QgbmVzdGVkUmVzdWx0Rm9yID0gKHJlc3VsdEluZGV4OiBudW1iZXIpOiBUcmFuc2FjdGlvbkFyZ3VtZW50ID0+XG4gICAgKG5lc3RlZFJlc3VsdHNbcmVzdWx0SW5kZXhdID8/PSB7XG4gICAgICBraW5kOiAnTmVzdGVkUmVzdWx0JyxcbiAgICAgIGluZGV4LFxuICAgICAgcmVzdWx0SW5kZXgsXG4gICAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eShiYXNlUmVzdWx0LCB7XG4gICAgc2V0KCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdHJhbnNhY3Rpb24gcmVzdWx0IGlzIGEgcHJveHksIGFuZCBkb2VzIG5vdCBzdXBwb3J0IHNldHRpbmcgcHJvcGVydGllcyBkaXJlY3RseScpO1xuICAgIH0sXG4gICAgLy8gVE9ETzogSW5zdGVhZCBvZiBtYWtpbmcgdGhpcyByZXR1cm4gYSBjb25jcmV0ZSBhcmd1bWVudCwgd2Ugc2hvdWxkIGlkZWFsbHlcbiAgICAvLyBtYWtlIGl0IHJlZmVyZW5jZS1iYXNlZCAoc28gdGhhdCB0aGlzIGdldHMgcmVzb2x2ZWQgYXQgYnVpbGQtdGltZSksIHdoaWNoXG4gICAgLy8gYWxsb3dzIHJlLW9yZGVyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgLy8gVGhpcyBhbGxvd3MgdGhpcyB0cmFuc2FjdGlvbiBhcmd1bWVudCB0byBiZSB1c2VkIGluIHRoZSBzaW5ndWxhciBmb3JtOlxuICAgICAgaWYgKHByb3BlcnR5IGluIHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1cHBvcnQgZGVzdHJ1Y3R1cmluZzpcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gU3ltYm9sLml0ZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgeWllbGQgbmVzdGVkUmVzdWx0Rm9yKGkpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N5bWJvbCcpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVzdWx0SW5kZXggPSBwYXJzZUludChwcm9wZXJ0eSwgMTApO1xuICAgICAgaWYgKE51bWJlci5pc05hTihyZXN1bHRJbmRleCkgfHwgcmVzdWx0SW5kZXggPCAwKSByZXR1cm47XG4gICAgICByZXR1cm4gbmVzdGVkUmVzdWx0Rm9yKHJlc3VsdEluZGV4KTtcbiAgICB9LFxuICB9KSBhcyBUcmFuc2FjdGlvblJlc3VsdDtcbn1cblxuY29uc3QgVFJBTlNBQ1RJT05fQlJBTkQgPSBTeW1ib2wuZm9yKCdAbXlzdGVuL3RyYW5zYWN0aW9uJyk7XG5cbi8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBnYXMgb2JqZWN0cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBmb3Igb25lIHRyYW5zYWN0aW9uLlxuY29uc3QgTUFYX0dBU19PQkpFQ1RTID0gMjU2O1xuXG4vLyBUaGUgbWF4aW11bSBnYXMgdGhhdCBpcyBhbGxvd2VkLlxuY29uc3QgTUFYX0dBUyA9IDEwMDAwMDAwMDA7XG5cbi8vIEEgZ3Vlc3MgYWJvdXQgaG93IG11Y2ggb3ZlcmhlYWQgZWFjaCBjb2luIHByb3ZpZGVzIGZvciBnYXMgY2FsY3VsYXRpb25zLlxuLy8gQHRzLWlnbm9yZVxuY29uc3QgR0FTX09WRVJIRUFEX1BFUl9DT0lOID0gMTBuO1xuXG5pbnRlcmZhY2UgQnVpbGRPcHRpb25zIHtcbiAgb25seVRyYW5zYWN0aW9uS2luZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gQnVpbGRlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CbG9jayB7XG4gIC8qKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBUcmFuc2FjdGlvbiBidWlsZGVyIGNsYXNzLiAqL1xuICBzdGF0aWMgaXMob2JqOiB1bmtub3duKTogb2JqIGlzIFRyYW5zYWN0aW9uQmxvY2sge1xuICAgIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAob2JqIGFzIGFueSlbVFJBTlNBQ1RJT05fQlJBTkRdID09PSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGZyb20gYSBzZXJpYWxpemUgdHJhbnNhY3Rpb24ga2luZCAoYnVpbHQgd2l0aCBgYnVpbGQoeyBvbmx5VHJhbnNhY3Rpb25LaW5kOiB0cnVlIH0pYCkgdG8gYSBgVHJhbnNhY3Rpb25gIGNsYXNzLlxuICAgKiBTdXBwb3J0cyBlaXRoZXIgYSBieXRlIGFycmF5LCBvciBiYXNlNjQtZW5jb2RlZCBieXRlcy5cbiAgICovXG4gIHN0YXRpYyBmcm9tS2luZChzZXJpYWxpemVkOiBzdHJpbmcgfCBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb25CbG9jaygpO1xuXG4gICAgdHguI2Jsb2NrRGF0YSA9IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlci5mcm9tS2luZEJ5dGVzKFxuICAgICAgdHlwZW9mIHNlcmlhbGl6ZWQgPT09ICdzdHJpbmcnID8gZnJvbUI2NChzZXJpYWxpemVkKSA6IHNlcmlhbGl6ZWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGZyb20gYSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGZvcm1hdCB0byBhIGBUcmFuc2FjdGlvbmAgY2xhc3MuXG4gICAqIFRoZXJlIGFyZSB0d28gc3VwcG9ydGVkIHNlcmlhbGl6ZWQgZm9ybWF0czpcbiAgICogLSBBIHN0cmluZyByZXR1cm5lZCBmcm9tIGBUcmFuc2FjdGlvbiNzZXJpYWxpemVgLiBUaGUgc2VyaWFsaXplZCBmb3JtYXQgbXVzdCBiZSBjb21wYXRpYmxlLCBvciBpdCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiAtIEEgYnl0ZSBhcnJheSAob3IgYmFzZTY0LWVuY29kZWQgYnl0ZXMpIGNvbnRhaW5pbmcgQkNTIHRyYW5zYWN0aW9uIGRhdGEuXG4gICAqL1xuICBzdGF0aWMgZnJvbShzZXJpYWxpemVkOiBzdHJpbmcgfCBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb25CbG9jaygpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGJ5dGVzOlxuICAgIGlmICh0eXBlb2Ygc2VyaWFsaXplZCAhPT0gJ3N0cmluZycgfHwgIXNlcmlhbGl6ZWQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICB0eC4jYmxvY2tEYXRhID0gVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyLmZyb21CeXRlcyhcbiAgICAgICAgdHlwZW9mIHNlcmlhbGl6ZWQgPT09ICdzdHJpbmcnID8gZnJvbUI2NChzZXJpYWxpemVkKSA6IHNlcmlhbGl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4LiNibG9ja0RhdGEgPSBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIucmVzdG9yZShKU09OLnBhcnNlKHNlcmlhbGl6ZWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQSBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIFRyYW5zYWN0aW9uIGJ1aWxkZXIgYFRyYW5zYWN0aW9uc2AgKi9cbiAgc3RhdGljIGdldCBUcmFuc2FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9ucztcbiAgfVxuXG4gIC8qKiBBIGhlbHBlciB0byByZXRyaWV2ZSB0aGUgVHJhbnNhY3Rpb24gYnVpbGRlciBgSW5wdXRzYCAqL1xuICBzdGF0aWMgZ2V0IElucHV0cygpIHtcbiAgICByZXR1cm4gSW5wdXRzO1xuICB9XG5cbiAgc2V0U2VuZGVyKHNlbmRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy4jYmxvY2tEYXRhLnNlbmRlciA9IHNlbmRlcjtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgc2VuZGVyIG9ubHkgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gc2V0LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BvbnNvcmVkIHRyYW5zYWN0aW9uIGZsb3dzIHdoZXJlIHRoZSBzZW5kZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgc2lnbmVyIGFkZHJlc3MuXG4gICAqL1xuICBzZXRTZW5kZXJJZk5vdFNldChzZW5kZXI6IHN0cmluZykge1xuICAgIGlmICghdGhpcy4jYmxvY2tEYXRhLnNlbmRlcikge1xuICAgICAgdGhpcy4jYmxvY2tEYXRhLnNlbmRlciA9IHNlbmRlcjtcbiAgICB9XG4gIH1cbiAgc2V0RXhwaXJhdGlvbihleHBpcmF0aW9uPzogVHJhbnNhY3Rpb25FeHBpcmF0aW9uKSB7XG4gICAgdGhpcy4jYmxvY2tEYXRhLmV4cGlyYXRpb24gPSBleHBpcmF0aW9uO1xuICB9XG4gIHNldEdhc1ByaWNlKHByaWNlOiBudW1iZXIgfCBiaWdpbnQpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLnByaWNlID0gU3RyaW5nKHByaWNlKTtcbiAgfVxuICBzZXRHYXNCdWRnZXQoYnVkZ2V0OiBudW1iZXIgfCBiaWdpbnQpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLmJ1ZGdldCA9IFN0cmluZyhidWRnZXQpO1xuICB9XG4gIHNldEdhc093bmVyKG93bmVyOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLm93bmVyID0gb3duZXI7XG4gIH1cbiAgc2V0R2FzUGF5bWVudChwYXltZW50czogU3VpT2JqZWN0UmVmW10pIHtcbiAgICBpZiAocGF5bWVudHMubGVuZ3RoID49IE1BWF9HQVNfT0JKRUNUUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IG9iamVjdHMgZXhjZWVkIG1heGltdW0gYW1vdW50ICR7TUFYX0dBU19PQkpFQ1RTfWApO1xuICAgIH1cbiAgICB0aGlzLiNibG9ja0RhdGEuZ2FzQ29uZmlnLnBheW1lbnQgPSBwYXltZW50cy5tYXAoKHBheW1lbnQpID0+IG1hc2socGF5bWVudCwgU3VpT2JqZWN0UmVmKSk7XG4gIH1cblxuICAjYmxvY2tEYXRhOiBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXI7XG4gIC8qKiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgdHJhbnNhY3Rpb24gZGF0YSwgaW4gSlNPTiBmb3JtOiAqL1xuICBnZXQgYmxvY2tEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNibG9ja0RhdGEuc25hcHNob3QoKTtcbiAgfVxuXG4gIC8vIFVzZWQgdG8gYnJhbmQgdHJhbnNhY3Rpb24gY2xhc3NlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGlkZW50aWZpZWQsIGV2ZW4gYmV0d2VlbiBtdWx0aXBsZSBjb3BpZXNcbiAgLy8gb2YgdGhlIGJ1aWxkZXIuXG4gIGdldCBbVFJBTlNBQ1RJT05fQlJBTkRdKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IodHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbkJsb2NrKSB7XG4gICAgdGhpcy4jYmxvY2tEYXRhID0gbmV3IFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlcih0cmFuc2FjdGlvbiA/IHRyYW5zYWN0aW9uLiNibG9ja0RhdGEgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYW4gYXJndW1lbnQgZm9yIHRoZSBnYXMgY29pbiwgdG8gYmUgdXNlZCBpbiBhIHRyYW5zYWN0aW9uLiAqL1xuICBnZXQgZ2FzKCk6IFRyYW5zYWN0aW9uQXJndW1lbnQge1xuICAgIHJldHVybiB7IGtpbmQ6ICdHYXNDb2luJyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIER5bmFtaWNhbGx5IGNyZWF0ZSBhIG5ldyBpbnB1dCwgd2hpY2ggaXMgc2VwYXJhdGUgZnJvbSB0aGUgYGlucHV0YC4gVGhpcyBpcyBpbXBvcnRhbnRcbiAgICogZm9yIGdlbmVyYXRlZCBjbGllbnRzIHRvIGJlIGFibGUgdG8gZGVmaW5lIHVuaXF1ZSBpbnB1dHMgdGhhdCBhcmUgbm9uLW92ZXJsYXBwaW5nIHdpdGggdGhlXG4gICAqIGRlZmluZWQgaW5wdXRzLlxuICAgKlxuICAgKiBGb3IgYFVpbnQ4QXJyYXlgIHR5cGUgYXV0b21hdGljYWxseSBjb252ZXJ0IHRoZSBpbnB1dCBpbnRvIGEgYFB1cmVgIENhbGxBcmcsIHNpbmNlIHRoaXNcbiAgICogaXMgdGhlIGZvcm1hdCByZXF1aXJlZCBmb3IgY3VzdG9tIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqL1xuICBpbnB1dCh0eXBlOiAnb2JqZWN0JyB8ICdwdXJlJywgdmFsdWU/OiB1bmtub3duKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNibG9ja0RhdGEuaW5wdXRzLmxlbmd0aDtcbiAgICBjb25zdCBpbnB1dCA9IGNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAga2luZDogJ0lucHV0JyxcbiAgICAgICAgLy8gYmlnaW50cyBjYW4ndCBiZSBzZXJpYWxpemVkIHRvIEpTT04sIHNvIGp1c3Qgc3RyaW5nLWNvbnZlcnQgdGhlbSBoZXJlOlxuICAgICAgICB2YWx1ZTogdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IFN0cmluZyh2YWx1ZSkgOiB2YWx1ZSxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHR5cGUsXG4gICAgICB9LFxuICAgICAgVHJhbnNhY3Rpb25CbG9ja0lucHV0XG4gICAgKTtcbiAgICB0aGlzLiNibG9ja0RhdGEuaW5wdXRzLnB1c2goaW5wdXQpO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgb2JqZWN0IGlucHV0IHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIG9iamVjdCh2YWx1ZTogT2JqZWN0SWQgfCBPYmplY3RDYWxsQXJnKSB7XG4gICAgY29uc3QgaWQgPSBnZXRJZEZyb21DYWxsQXJnKHZhbHVlKTtcbiAgICAvLyBkZWR1cGxpY2F0ZVxuICAgIGNvbnN0IGluc2VydGVkID0gdGhpcy4jYmxvY2tEYXRhLmlucHV0cy5maW5kKChpKSA9PiBpLnR5cGUgPT09ICdvYmplY3QnICYmIGlkID09PSBnZXRJZEZyb21DYWxsQXJnKGkudmFsdWUpKTtcbiAgICByZXR1cm4gaW5zZXJ0ZWQgPz8gdGhpcy5pbnB1dCgnb2JqZWN0JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBub24tb2JqZWN0IGlucHV0IHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHB1cmUoXG4gICAgLyoqXG4gICAgICogVGhlIHB1cmUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGlucHV0IHZhbHVlLiBJZiB0aGlzIGlzIGEgVWludDhBcnJheSwgdGhlbiB0aGUgdmFsdWVcbiAgICAgKiBpcyBhc3N1bWVkIHRvIGJlIHJhdyBieXRlcywgYW5kIHdpbGwgYmUgdXNlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICAvKipcbiAgICAgKiBUaGUgQkNTIHR5cGUgdG8gc2VyaWFsaXplIHRoZSB2YWx1ZSBpbnRvLiBJZiBub3QgcHJvdmlkZWQsIHRoZSB0eXBlIHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXRlcm1pbmVkXG4gICAgICogYmFzZWQgb24gaG93IHRoZSBpbnB1dCBpcyB1c2VkLlxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gVE9ETzogd2UgY2FuIGFsc28gZG8gc29tZSBkZWR1cGxpY2F0aW9uIGhlcmVcbiAgICByZXR1cm4gdGhpcy5pbnB1dChcbiAgICAgICdwdXJlJyxcbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IElucHV0cy5QdXJlKHZhbHVlKSA6IHR5cGUgPyBJbnB1dHMuUHVyZSh2YWx1ZSwgdHlwZSkgOiB2YWx1ZVxuICAgICk7XG4gIH1cblxuICAvKiogQWRkIGEgdHJhbnNhY3Rpb24gdG8gdGhlIHRyYW5zYWN0aW9uIGJsb2NrLiAqL1xuICBhZGQodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uVHlwZSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jYmxvY2tEYXRhLnRyYW5zYWN0aW9ucy5wdXNoKHRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25SZXN1bHQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIC8vIE1ldGhvZCBzaG9ydGhhbmRzOlxuXG4gIHNwbGl0Q29pbnMoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ1NwbGl0Q29pbnMnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLlNwbGl0Q29pbnMoLi4uYXJncykpO1xuICB9XG4gIG1lcmdlQ29pbnMoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ01lcmdlQ29pbnMnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLk1lcmdlQ29pbnMoLi4uYXJncykpO1xuICB9XG4gIHB1Ymxpc2goLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIFRyYW5zYWN0aW9ucylbJ1B1Ymxpc2gnXT4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQoVHJhbnNhY3Rpb25zLlB1Ymxpc2goLi4uYXJncykpO1xuICB9XG4gIG1vdmVDYWxsKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBUcmFuc2FjdGlvbnMpWydNb3ZlQ2FsbCddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuTW92ZUNhbGwoLi4uYXJncykpO1xuICB9XG4gIHRyYW5zZmVyT2JqZWN0cyguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgVHJhbnNhY3Rpb25zKVsnVHJhbnNmZXJPYmplY3RzJ10+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKFRyYW5zYWN0aW9ucy5UcmFuc2Zlck9iamVjdHMoLi4uYXJncykpO1xuICB9XG4gIG1ha2VNb3ZlVmVjKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBUcmFuc2FjdGlvbnMpWydNYWtlTW92ZVZlYyddPikge1xuICAgIHJldHVybiB0aGlzLmFkZChUcmFuc2FjdGlvbnMuTWFrZU1vdmVWZWMoLi4uYXJncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gdG8gYSBzdHJpbmcgc28gdGhhdCBpdCBjYW4gYmUgc2VudCB0byBhIHNlcGFyYXRlIGNvbnRleHQuXG4gICAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYGJ1aWxkYCBpbiB0aGF0IGl0IGRvZXMgbm90IHNlcmlhbGl6ZSB0byBCQ1MgYnl0ZXMsIGFuZCBpbnN0ZWFkXG4gICAqIHVzZXMgYSBzZXBhcmF0ZSBmb3JtYXQgdGhhdCBpcyB1bmlxdWUgdG8gdGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIuIFRoaXMgYWxsb3dzXG4gICAqIHVzIHRvIHNlcmlhbGl6ZSBwYXJ0aWFsbHktY29tcGxldGUgdHJhbnNhY3Rpb25zLCB0aGF0IGNhbiB0aGVuIGJlIGNvbXBsZXRlZCBhbmRcbiAgICogYnVpbHQgaW4gYSBzZXBhcmF0ZSBjb250ZXh0LlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYSBkYXBwIGNhbiBjb25zdHJ1Y3QgYSB0cmFuc2FjdGlvbiwgYnV0IG5vdCBwcm92aWRlIGdhcyBvYmplY3RzXG4gICAqIG9yIGEgZ2FzIGJ1ZGdldC4gVGhlIHRyYW5zYWN0aW9uIHRoZW4gY2FuIGJlIHNlbnQgdG8gdGhlIHdhbGxldCwgd2hlcmUgdGhpc1xuICAgKiBpbmZvcm1hdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGZpbGxlZCBpbiAoZS5nLiBieSBxdWVyeWluZyBmb3IgY29pbiBvYmplY3RzXG4gICAqIGFuZCBwZXJmb3JtaW5nIGEgZHJ5IHJ1bikuXG4gICAqL1xuICBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuI2Jsb2NrRGF0YS5zbmFwc2hvdCgpKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgdHJhbnNhY3Rpb24gdG8gQkNTIGJ5dGVzLiAqL1xuICBhc3luYyBidWlsZCh7IG9ubHlUcmFuc2FjdGlvbktpbmQgfTogQnVpbGRPcHRpb25zID0ge30pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICByZXR1cm4gdGhpcy4jYmxvY2tEYXRhLmJ1aWxkKHsgb25seVRyYW5zYWN0aW9uS2luZCB9KTtcbiAgfVxuXG4gIC8qKiBEZXJpdmUgdHJhbnNhY3Rpb24gZGlnZXN0ICovXG4gIGFzeW5jIGdldERpZ2VzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLiNibG9ja0RhdGEuZ2V0RGlnZXN0KCk7XG4gIH1cbn1cbiJdfQ==

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


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