PHP WebShell

Текущая директория: /opt/BitGoJS/modules/unspents/dist/test

Просмотр файла: testutils.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;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOutputDimensionsForUnspentType = exports.getInputDimensionsForUnspentType = exports.UnspentTypeOpReturn = exports.UnspentTypePubKeyHash = exports.UnspentTypeScript2of3 = exports.UnspentTypeP2shP2pk = void 0;
exports.getInputScriptTypes = getInputScriptTypes;
exports.constructPsbt = constructPsbt;
exports.getSignedTransaction = getSignedTransaction;
const unspents = __importStar(require("../src"));
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const assert_1 = __importDefault(require("assert"));
const txGen_1 = require("./signedTx/txGen");
/**
 * makeEnum('a', 'b') returns `{ a: 'a', b: 'b' }`
 *
 * @param args
 * @return map with string keys and symbol values
 */
const makeEnum = (...args) => args.reduce((obj, key) => Object.assign(obj, { [key]: key }), {});
exports.UnspentTypeP2shP2pk = 'p2shP2pk';
// p2trMusig2 is assumed to be script path only. taprootKeyPathSpend is for p2trMusig2 key path
exports.UnspentTypeScript2of3 = makeEnum('p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2', 'taprootKeyPathSpend');
exports.UnspentTypePubKeyHash = makeEnum('p2pkh', 'p2wpkh');
class UnspentTypeOpReturn {
    constructor(size) {
        this.size = size;
    }
    toString() {
        return `opReturn(${this.size})`;
    }
}
exports.UnspentTypeOpReturn = UnspentTypeOpReturn;
function getInputScriptTypes() {
    return [...utxolib.bitgo.outputScripts.scriptTypes2Of3, 'p2shP2pk', 'taprootKeyPathSpend'];
}
/**
 * Return the input dimensions based on unspent type
 * @param unspentType - one of UnspentTypeScript2of3
 * @return Dimensions
 */
const getInputDimensionsForUnspentType = (unspentType) => {
    switch (unspentType) {
        case exports.UnspentTypeScript2of3.p2sh:
            return unspents.Dimensions.sum({ nP2shInputs: 1 });
        case exports.UnspentTypeScript2of3.p2shP2wsh:
            return unspents.Dimensions.sum({ nP2shP2wshInputs: 1 });
        case exports.UnspentTypeScript2of3.p2wsh:
            return unspents.Dimensions.sum({ nP2wshInputs: 1 });
        case exports.UnspentTypeScript2of3.p2tr:
        case exports.UnspentTypeScript2of3.p2trMusig2:
            return unspents.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 });
        case exports.UnspentTypeScript2of3.taprootKeyPathSpend:
            return unspents.Dimensions.sum({ nP2trKeypathInputs: 1 });
        case exports.UnspentTypeP2shP2pk:
            return unspents.Dimensions.sum({ nP2shP2pkInputs: 1 });
    }
    throw new Error(`no input dimensions for ${unspentType}`);
};
exports.getInputDimensionsForUnspentType = getInputDimensionsForUnspentType;
const getOutputDimensionsForUnspentType = (unspentType) => {
    /* The values here are validated in the test 'calculates output dimensions dynamically' */
    switch (unspentType) {
        case exports.UnspentTypeScript2of3.p2sh:
        case exports.UnspentTypeScript2of3.p2shP2wsh:
        case exports.UnspentTypeP2shP2pk:
            return unspents.Dimensions.fromOutputScriptLength(23);
        case exports.UnspentTypeScript2of3.p2wsh:
            return unspents.Dimensions.fromOutputScriptLength(34);
        case exports.UnspentTypeScript2of3.p2tr:
        case exports.UnspentTypeScript2of3.p2trMusig2:
        case exports.UnspentTypeScript2of3.taprootKeyPathSpend:
            return unspents.Dimensions.fromOutputScriptLength(34);
        case exports.UnspentTypePubKeyHash.p2pkh:
            return unspents.Dimensions.fromOutputScriptLength(25);
        case exports.UnspentTypePubKeyHash.p2wpkh:
            return unspents.Dimensions.fromOutputScriptLength(22);
        default:
            if (unspentType instanceof UnspentTypeOpReturn) {
                return unspents.Dimensions.fromOutputScriptLength(1 + unspentType.size);
            }
            throw new TypeError(`unknown unspentType ${unspentType}`);
    }
};
exports.getOutputDimensionsForUnspentType = getOutputDimensionsForUnspentType;
function getDefaultSignerNames(inputType, signers) {
    if (signers) {
        return [signers.signerName, signers.cosignerName];
    }
    if (inputType === 'p2shP2pk') {
        return ['user'];
    }
    if (inputType === 'p2trMusig2') {
        return ['user', 'backup'];
    }
    return ['user', 'bitgo'];
}
function constructPsbt(keys, inputTypes, outputTypes, signatureStatus, signers) {
    const psbt = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin });
    inputTypes.forEach((t, i) => {
        if (t === 'p2shP2pk') {
            const signer = keys[getDefaultSignerNames(t, signers)[0]];
            const unspent = utxolib.testutil.mockReplayProtectionUnspent(utxolib.networks.bitcoin, BigInt(10), {
                key: signer,
                vout: i,
            });
            const { redeemScript } = utxolib.bitgo.outputScripts.createOutputScriptP2shP2pk(signer.publicKey);
            assert_1.default.ok(redeemScript);
            utxolib.bitgo.addReplayProtectionUnspentToPsbt(psbt, unspent, redeemScript);
        }
        else {
            const unspent = utxolib.testutil.mockWalletUnspent(utxolib.networks.bitcoin, BigInt(10), {
                keys,
                chain: utxolib.bitgo.getExternalChainCode(t === 'taprootKeyPathSpend' ? 'p2trMusig2' : t),
                vout: i,
                index: i,
            });
            const signerNames = getDefaultSignerNames(t, signers);
            utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, keys, signerNames[0], signerNames[1]);
        }
    });
    outputTypes.forEach((t, index) => {
        psbt.addOutput({
            script: (0, txGen_1.createScriptPubKey)(keys.triple, t),
            value: BigInt(10),
        });
    });
    if (signatureStatus === 'unsigned') {
        return psbt;
    }
    psbt.setAllInputsMusig2NonceHD(keys['user']);
    psbt.setAllInputsMusig2NonceHD(keys['bitgo']);
    inputTypes.forEach((t, i) => {
        const signerNames = getDefaultSignerNames(t, signers);
        if (t === 'p2shP2pk') {
            if (signatureStatus === 'fullysigned') {
                psbt.signInput(i, keys[signerNames[0]]);
            }
        }
        else {
            psbt.signInputHD(i, keys[signerNames[0]]);
            if (signatureStatus === 'fullysigned') {
                psbt.signInputHD(i, keys[signerNames[1]]);
            }
        }
    });
    if (signatureStatus === 'fullysigned') {
        assert_1.default.ok(psbt.validateSignaturesOfAllInputs());
    }
    return psbt;
}
function getSignedTransaction(keys, signerName, cosignerName, inputTypes, outputTypes) {
    const psbt = constructPsbt(keys, inputTypes, outputTypes, 'fullysigned', { signerName, cosignerName });
    psbt.finalizeAllInputs();
    return psbt.extractTransaction().clone('number');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdHV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC90ZXN0dXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENBLGtEQUVDO0FBbUVELHNDQThEQztBQUVELG9EQVVDO0FBekxELGlEQUFtQztBQUNuQyx5REFBMkM7QUFDM0Msb0RBQTRCO0FBQzVCLDRDQUFzRDtBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFjLEVBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVsRyxRQUFBLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztBQUU5QywrRkFBK0Y7QUFDbEYsUUFBQSxxQkFBcUIsR0FPOUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUUzRSxRQUFBLHFCQUFxQixHQUc5QixRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBSWhDLE1BQWEsbUJBQW1CO0lBQzlCLFlBQW1CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUcsQ0FBQztJQUU1QixRQUFRO1FBQ2IsT0FBTyxZQUFZLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFORCxrREFNQztBQUlELFNBQWdCLG1CQUFtQjtJQUNqQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxNQUFNLGdDQUFnQyxHQUFHLENBQUMsV0FBNEIsRUFBdUIsRUFBRTtJQUNwRyxRQUFRLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssNkJBQXFCLENBQUMsSUFBSTtZQUM3QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckQsS0FBSyw2QkFBcUIsQ0FBQyxTQUFTO1lBQ2xDLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFELEtBQUssNkJBQXFCLENBQUMsS0FBSztZQUM5QixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyw2QkFBcUIsQ0FBQyxJQUFJLENBQUM7UUFDaEMsS0FBSyw2QkFBcUIsQ0FBQyxVQUFVO1lBQ25DLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSwyQkFBMkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLEtBQUssNkJBQXFCLENBQUMsbUJBQW1CO1lBQzVDLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELEtBQUssMkJBQW1CO1lBQ3RCLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUM1RCxDQUFDLENBQUM7QUFqQlcsUUFBQSxnQ0FBZ0Msb0NBaUIzQztBQUVLLE1BQU0saUNBQWlDLEdBQUcsQ0FBQyxXQUE0QixFQUF1QixFQUFFO0lBQ3JHLDBGQUEwRjtJQUMxRixRQUFRLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssNkJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQ2hDLEtBQUssNkJBQXFCLENBQUMsU0FBUyxDQUFDO1FBQ3JDLEtBQUssMkJBQW1CO1lBQ3RCLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RCxLQUFLLDZCQUFxQixDQUFDLEtBQUs7WUFDOUIsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELEtBQUssNkJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQ2hDLEtBQUssNkJBQXFCLENBQUMsVUFBVSxDQUFDO1FBQ3RDLEtBQUssNkJBQXFCLENBQUMsbUJBQW1CO1lBQzVDLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RCxLQUFLLDZCQUFxQixDQUFDLEtBQUs7WUFDOUIsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELEtBQUssNkJBQXFCLENBQUMsTUFBTTtZQUMvQixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQ7WUFDRSxJQUFJLFdBQVcsWUFBWSxtQkFBbUIsRUFBRSxDQUFDO2dCQUMvQyxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1QkFBdUIsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBdkJXLFFBQUEsaUNBQWlDLHFDQXVCNUM7QUFFRixTQUFTLHFCQUFxQixDQUM1QixTQUEwQixFQUMxQixPQUFvRjtJQUVwRixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUNELElBQUksU0FBUyxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FDM0IsSUFBa0MsRUFDbEMsVUFBNkIsRUFDN0IsV0FBOEIsRUFDOUIsZUFBMEQsRUFDMUQsT0FBb0Y7SUFFcEYsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFdkYsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pHLEdBQUcsRUFBRSxNQUFNO2dCQUNYLElBQUksRUFBRSxDQUFDO2FBQ1IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDdkYsSUFBSTtnQkFDSixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUsscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RixJQUFJLEVBQUUsQ0FBQztnQkFDUCxLQUFLLEVBQUUsQ0FBQzthQUNULENBQUMsQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDYixNQUFNLEVBQUUsSUFBQSwwQkFBa0IsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMxQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztTQUNsQixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFOUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxlQUFlLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksZUFBZSxLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxlQUFlLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDdEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQ2xDLElBQWtDLEVBQ2xDLFVBQWlDLEVBQ2pDLFlBQW1DLEVBQ25DLFVBQTZCLEVBQzdCLFdBQThCO0lBRTlCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUN2RyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN6QixPQUFRLElBQUksQ0FBQyxrQkFBa0IsRUFBNEMsQ0FBQyxLQUFLLENBQVMsUUFBUSxDQUFDLENBQUM7QUFDdEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVuc3BlbnRzIGZyb20gJy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBjcmVhdGVTY3JpcHRQdWJLZXkgfSBmcm9tICcuL3NpZ25lZFR4L3R4R2VuJztcblxuLyoqXG4gKiBtYWtlRW51bSgnYScsICdiJykgcmV0dXJucyBgeyBhOiAnYScsIGI6ICdiJyB9YFxuICpcbiAqIEBwYXJhbSBhcmdzXG4gKiBAcmV0dXJuIG1hcCB3aXRoIHN0cmluZyBrZXlzIGFuZCBzeW1ib2wgdmFsdWVzXG4gKi9cbmNvbnN0IG1ha2VFbnVtID0gKC4uLmFyZ3M6IHN0cmluZ1tdKTogYW55ID0+IGFyZ3MucmVkdWNlKChvYmosIGtleSkgPT4gT2JqZWN0LmFzc2lnbihvYmosIHsgW2tleV06IGtleSB9KSwge30pO1xuXG5leHBvcnQgY29uc3QgVW5zcGVudFR5cGVQMnNoUDJwayA9ICdwMnNoUDJwayc7XG5cbi8vIHAydHJNdXNpZzIgaXMgYXNzdW1lZCB0byBiZSBzY3JpcHQgcGF0aCBvbmx5LiB0YXByb290S2V5UGF0aFNwZW5kIGlzIGZvciBwMnRyTXVzaWcyIGtleSBwYXRoXG5leHBvcnQgY29uc3QgVW5zcGVudFR5cGVTY3JpcHQyb2YzOiB7XG4gIHAyc2g6IHN0cmluZztcbiAgcDJzaFAyd3NoOiBzdHJpbmc7XG4gIHAyd3NoOiBzdHJpbmc7XG4gIHAydHI6IHN0cmluZztcbiAgcDJ0ck11c2lnMjogc3RyaW5nO1xuICB0YXByb290S2V5UGF0aFNwZW5kOiBzdHJpbmc7XG59ID0gbWFrZUVudW0oJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJywgJ3AydHInLCAncDJ0ck11c2lnMicsICd0YXByb290S2V5UGF0aFNwZW5kJyk7XG5cbmV4cG9ydCBjb25zdCBVbnNwZW50VHlwZVB1YktleUhhc2g6IHtcbiAgcDJwa2g6ICdwMnBraCc7XG4gIHAyd3BraDogJ3Ayd3BraCc7XG59ID0gbWFrZUVudW0oJ3AycGtoJywgJ3Ayd3BraCcpO1xuXG5leHBvcnQgdHlwZSBUZXN0VW5zcGVudFR5cGUgPSBzdHJpbmcgfCBVbnNwZW50VHlwZU9wUmV0dXJuO1xuXG5leHBvcnQgY2xhc3MgVW5zcGVudFR5cGVPcFJldHVybiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzaXplOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBvcFJldHVybigke3RoaXMuc2l6ZX0pYDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBJbnB1dFNjcmlwdFR5cGUgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZSB8ICd0YXByb290S2V5UGF0aFNwZW5kJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldElucHV0U2NyaXB0VHlwZXMoKTogSW5wdXRTY3JpcHRUeXBlW10ge1xuICByZXR1cm4gWy4uLnV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMsICdwMnNoUDJwaycsICd0YXByb290S2V5UGF0aFNwZW5kJ107XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBpbnB1dCBkaW1lbnNpb25zIGJhc2VkIG9uIHVuc3BlbnQgdHlwZVxuICogQHBhcmFtIHVuc3BlbnRUeXBlIC0gb25lIG9mIFVuc3BlbnRUeXBlU2NyaXB0Mm9mM1xuICogQHJldHVybiBEaW1lbnNpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSA9ICh1bnNwZW50VHlwZTogVGVzdFVuc3BlbnRUeXBlKTogdW5zcGVudHMuRGltZW5zaW9ucyA9PiB7XG4gIHN3aXRjaCAodW5zcGVudFR5cGUpIHtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IDEgfSk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJzaFAyd3NoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuc3VtKHsgblAyc2hQMndzaElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMndzaDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMndzaElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnRyOlxuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHJNdXNpZzI6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDEgfSk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMudGFwcm9vdEtleVBhdGhTcGVuZDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLnN1bSh7IG5QMnRyS2V5cGF0aElucHV0czogMSB9KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlUDJzaFAycGs6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5zdW0oeyBuUDJzaFAycGtJbnB1dHM6IDEgfSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBubyBpbnB1dCBkaW1lbnNpb25zIGZvciAke3Vuc3BlbnRUeXBlfWApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSA9ICh1bnNwZW50VHlwZTogVGVzdFVuc3BlbnRUeXBlKTogdW5zcGVudHMuRGltZW5zaW9ucyA9PiB7XG4gIC8qIFRoZSB2YWx1ZXMgaGVyZSBhcmUgdmFsaWRhdGVkIGluIHRoZSB0ZXN0ICdjYWxjdWxhdGVzIG91dHB1dCBkaW1lbnNpb25zIGR5bmFtaWNhbGx5JyAqL1xuICBzd2l0Y2ggKHVuc3BlbnRUeXBlKSB7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJzaDpcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoUDJ3c2g6XG4gICAgY2FzZSBVbnNwZW50VHlwZVAyc2hQMnBrOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgyMyk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ3c2g6XG4gICAgICByZXR1cm4gdW5zcGVudHMuRGltZW5zaW9ucy5mcm9tT3V0cHV0U2NyaXB0TGVuZ3RoKDM0KTtcbiAgICBjYXNlIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnRyOlxuICAgIGNhc2UgVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHJNdXNpZzI6XG4gICAgY2FzZSBVbnNwZW50VHlwZVNjcmlwdDJvZjMudGFwcm9vdEtleVBhdGhTcGVuZDpcbiAgICAgIHJldHVybiB1bnNwZW50cy5EaW1lbnNpb25zLmZyb21PdXRwdXRTY3JpcHRMZW5ndGgoMzQpO1xuICAgIGNhc2UgVW5zcGVudFR5cGVQdWJLZXlIYXNoLnAycGtoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgyNSk7XG4gICAgY2FzZSBVbnNwZW50VHlwZVB1YktleUhhc2gucDJ3cGtoOlxuICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgyMik7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh1bnNwZW50VHlwZSBpbnN0YW5jZW9mIFVuc3BlbnRUeXBlT3BSZXR1cm4pIHtcbiAgICAgICAgcmV0dXJuIHVuc3BlbnRzLkRpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aCgxICsgdW5zcGVudFR5cGUuc2l6ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGB1bmtub3duIHVuc3BlbnRUeXBlICR7dW5zcGVudFR5cGV9YCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRTaWduZXJOYW1lcyhcbiAgaW5wdXRUeXBlOiBJbnB1dFNjcmlwdFR5cGUsXG4gIHNpZ25lcnM/OiB7IHNpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZTsgY29zaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUgfVxuKTogdXR4b2xpYi5iaXRnby5LZXlOYW1lW10ge1xuICBpZiAoc2lnbmVycykge1xuICAgIHJldHVybiBbc2lnbmVycy5zaWduZXJOYW1lLCBzaWduZXJzLmNvc2lnbmVyTmFtZV07XG4gIH1cbiAgaWYgKGlucHV0VHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgIHJldHVybiBbJ3VzZXInXTtcbiAgfVxuICBpZiAoaW5wdXRUeXBlID09PSAncDJ0ck11c2lnMicpIHtcbiAgICByZXR1cm4gWyd1c2VyJywgJ2JhY2t1cCddO1xuICB9XG4gIHJldHVybiBbJ3VzZXInLCAnYml0Z28nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdFBzYnQoXG4gIGtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIGlucHV0VHlwZXM6IElucHV0U2NyaXB0VHlwZVtdLFxuICBvdXRwdXRUeXBlczogVGVzdFVuc3BlbnRUeXBlW10sXG4gIHNpZ25hdHVyZVN0YXR1czogJ3Vuc2lnbmVkJyB8ICdoYWxmc2lnbmVkJyB8ICdmdWxseXNpZ25lZCcsXG4gIHNpZ25lcnM/OiB7IHNpZ25lck5hbWU6IHV0eG9saWIuYml0Z28uS2V5TmFtZTsgY29zaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUgfVxuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidDx1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+PiB7XG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luIH0pO1xuXG4gIGlucHV0VHlwZXMuZm9yRWFjaCgodCwgaSkgPT4ge1xuICAgIGlmICh0ID09PSAncDJzaFAycGsnKSB7XG4gICAgICBjb25zdCBzaWduZXIgPSBrZXlzW2dldERlZmF1bHRTaWduZXJOYW1lcyh0LCBzaWduZXJzKVswXV07XG4gICAgICBjb25zdCB1bnNwZW50ID0gdXR4b2xpYi50ZXN0dXRpbC5tb2NrUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQodXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLCBCaWdJbnQoMTApLCB7XG4gICAgICAgIGtleTogc2lnbmVyLFxuICAgICAgICB2b3V0OiBpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IHJlZGVlbVNjcmlwdCB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKHNpZ25lci5wdWJsaWNLZXkpO1xuICAgICAgYXNzZXJ0Lm9rKHJlZGVlbVNjcmlwdCk7XG4gICAgICB1dHhvbGliLmJpdGdvLmFkZFJlcGxheVByb3RlY3Rpb25VbnNwZW50VG9Qc2J0KHBzYnQsIHVuc3BlbnQsIHJlZGVlbVNjcmlwdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVuc3BlbnQgPSB1dHhvbGliLnRlc3R1dGlsLm1vY2tXYWxsZXRVbnNwZW50KHV0eG9saWIubmV0d29ya3MuYml0Y29pbiwgQmlnSW50KDEwKSwge1xuICAgICAgICBrZXlzLFxuICAgICAgICBjaGFpbjogdXR4b2xpYi5iaXRnby5nZXRFeHRlcm5hbENoYWluQ29kZSh0ID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiB0KSxcbiAgICAgICAgdm91dDogaSxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25lck5hbWVzID0gZ2V0RGVmYXVsdFNpZ25lck5hbWVzKHQsIHNpZ25lcnMpO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KHBzYnQsIHVuc3BlbnQsIGtleXMsIHNpZ25lck5hbWVzWzBdLCBzaWduZXJOYW1lc1sxXSk7XG4gICAgfVxuICB9KTtcblxuICBvdXRwdXRUeXBlcy5mb3JFYWNoKCh0LCBpbmRleCkgPT4ge1xuICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgIHNjcmlwdDogY3JlYXRlU2NyaXB0UHViS2V5KGtleXMudHJpcGxlLCB0KSxcbiAgICAgIHZhbHVlOiBCaWdJbnQoMTApLFxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoc2lnbmF0dXJlU3RhdHVzID09PSAndW5zaWduZWQnKSB7XG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoa2V5c1sndXNlciddKTtcbiAgcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKGtleXNbJ2JpdGdvJ10pO1xuXG4gIGlucHV0VHlwZXMuZm9yRWFjaCgodCwgaSkgPT4ge1xuICAgIGNvbnN0IHNpZ25lck5hbWVzID0gZ2V0RGVmYXVsdFNpZ25lck5hbWVzKHQsIHNpZ25lcnMpO1xuICAgIGlmICh0ID09PSAncDJzaFAycGsnKSB7XG4gICAgICBpZiAoc2lnbmF0dXJlU3RhdHVzID09PSAnZnVsbHlzaWduZWQnKSB7XG4gICAgICAgIHBzYnQuc2lnbklucHV0KGksIGtleXNbc2lnbmVyTmFtZXNbMF1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHNidC5zaWduSW5wdXRIRChpLCBrZXlzW3NpZ25lck5hbWVzWzBdXSk7XG4gICAgICBpZiAoc2lnbmF0dXJlU3RhdHVzID09PSAnZnVsbHlzaWduZWQnKSB7XG4gICAgICAgIHBzYnQuc2lnbklucHV0SEQoaSwga2V5c1tzaWduZXJOYW1lc1sxXV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmIChzaWduYXR1cmVTdGF0dXMgPT09ICdmdWxseXNpZ25lZCcpIHtcbiAgICBhc3NlcnQub2socHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpKTtcbiAgfVxuICByZXR1cm4gcHNidDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25lZFRyYW5zYWN0aW9uKFxuICBrZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBzaWduZXJOYW1lOiB1dHhvbGliLmJpdGdvLktleU5hbWUsXG4gIGNvc2lnbmVyTmFtZTogdXR4b2xpYi5iaXRnby5LZXlOYW1lLFxuICBpbnB1dFR5cGVzOiBJbnB1dFNjcmlwdFR5cGVbXSxcbiAgb3V0cHV0VHlwZXM6IFRlc3RVbnNwZW50VHlwZVtdXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbiB7XG4gIGNvbnN0IHBzYnQgPSBjb25zdHJ1Y3RQc2J0KGtleXMsIGlucHV0VHlwZXMsIG91dHB1dFR5cGVzLCAnZnVsbHlzaWduZWQnLCB7IHNpZ25lck5hbWUsIGNvc2lnbmVyTmFtZSB9KTtcbiAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICByZXR1cm4gKHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCkgYXMgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PikuY2xvbmU8bnVtYmVyPignbnVtYmVyJyk7XG59XG4iXX0=

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


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