PHP WebShell
Текущая директория: /opt/BitGoJS/modules/unspents/dist/test/signedTx
Просмотр файла: txCombinations.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 });
const should_1 = __importDefault(require("should"));
const src_1 = require("../../src");
const testutils_1 = require("../testutils");
const txGen_1 = require("./txGen");
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const keys = [1, 2, 3].map((v) => utxolib.bip32.fromSeed(Buffer.alloc(16, `test/2/${v}`), utxolib.networks.bitcoin));
const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]);
const testDimensionsFromTx = (txCombo) => {
const { inputTypes, outputTypes, expectedDims } = txCombo;
describe(`Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
const nInputs = inputTypes.length;
const outputDims = src_1.Dimensions.sum(...outputTypes.map(testutils_1.getOutputDimensionsForUnspentType));
it(`calculates dimensions from unsigned transaction`, function () {
const unsignedTx = txCombo.getUnsignedTx();
// does not work for unsigned transactions
should_1.default.throws(() => src_1.Dimensions.fromTransaction(unsignedTx));
// unless explicitly allowed
src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH }).should.eql(src_1.Dimensions.sum({ nP2shInputs: nInputs }, outputDims));
src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2shP2wshInputs: nInputs }, outputDims));
src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2wshInputs: nInputs }, outputDims));
});
it(`calculates dimensions for signed transaction`, function () {
const dimensions = src_1.Dimensions.fromTransaction(txCombo.getSignedTx());
dimensions.should.eql(expectedDims);
});
it(`calculates dimensions for signed input of transaction`, function () {
const signedTx = txCombo.getSignedTx();
// test Dimensions.fromInput()
inputTypes.forEach((input, i) => src_1.Dimensions.fromInput(signedTx.ins[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
});
});
};
const testDimensionsFromPsbt = (keys, inputTypes, outputTypes, expectedDims) => {
describe(`Psbt Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
['unsigned', 'halfsigned', 'fullysigned'].forEach((s) => {
it(`calculates dimensions from ${s} psbt`, function () {
const dimensions = src_1.Dimensions.fromPsbt((0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, s));
dimensions.should.eql(expectedDims);
});
});
it(`calculates dimensions for signed input of psbt`, function () {
const signedPsbt = (0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, 'fullysigned');
inputTypes.forEach((input, i) => src_1.Dimensions.fromPsbtInput(signedPsbt.data.inputs[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
});
});
};
describe(`Dimensions for transaction combinations`, function () {
// p2trMusig2 is supported only with PSBT
const scriptTypes = utxolib.bitgo.outputScripts.scriptTypes2Of3.filter((t) => t !== 'p2trMusig2');
const params = {
inputTypes: [...scriptTypes, testutils_1.UnspentTypeP2shP2pk],
maxNInputs: 2,
outputTypes: [...scriptTypes, ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
maxNOutputs: 2,
};
(0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims)));
// Doubling the inputs should yield twice the input dims
testDimensionsFromTx(new txGen_1.TxCombo(keys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims)));
// Same for outputs
testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims)));
});
});
describe(`Dimensions for PSBT combinations`, function () {
const params = {
inputTypes: [
...utxolib.bitgo.outputScripts.scriptTypes2Of3,
utxolib.bitgo.outputScripts.scriptTypeP2shP2pk,
'taprootKeyPathSpend',
],
maxNInputs: 1,
outputTypes: [...Object.keys(testutils_1.UnspentTypeScript2of3), ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
maxNOutputs: 1,
};
it(`does not work for unknown psbt input`, function () {
const psbt = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin });
psbt.addInput({ hash: Buffer.alloc(32), index: 0 });
should_1.default.throws(() => src_1.Dimensions.fromPsbt(psbt));
});
(0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims));
// Doubling the inputs should yield twice the input dims
testDimensionsFromPsbt(rootWalletKeys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims));
// Same for outputs
testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims));
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhDb21iaW5hdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3NpZ25lZFR4L3R4Q29tYmluYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUF1QztBQUV2Qyw0Q0FRc0I7QUFFdEIsbUNBQW1EO0FBQ25ELHlEQUEyQztBQUkzQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ3RELENBQUM7QUFFOUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVyRixNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBWSxFQUFFLEVBQUU7SUFDNUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTFELFFBQVEsQ0FBQyxzQkFBc0IsVUFBVSxhQUFhLFdBQVcsRUFBRSxFQUFFO1FBQ25FLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsZ0JBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLDZDQUFpQyxDQUFDLENBQUMsQ0FBQztRQUV6RixFQUFFLENBQUMsaURBQWlELEVBQUU7WUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRTNDLDBDQUEwQztZQUMxQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRTVELDRCQUE0QjtZQUM1QixnQkFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLEVBQUUsZ0JBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzNGLGdCQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUNyRCxDQUFDO1lBRUYsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxFQUFFLGdCQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2pHLGdCQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQzFELENBQUM7WUFFRixnQkFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLEVBQUUsZ0JBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzVGLGdCQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUN0RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsTUFBTSxVQUFVLEdBQUcsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDckUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUU7WUFDMUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXZDLDhCQUE4QjtZQUM5QixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQzNDLGdCQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFVLENBQUMsR0FBRyxDQUFDLElBQUEsNENBQWdDLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUMxRyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsSUFBa0MsRUFDbEMsVUFBNkIsRUFDN0IsV0FBOEIsRUFDOUIsWUFBd0IsRUFDeEIsRUFBRTtJQUNGLFFBQVEsQ0FBQywyQkFBMkIsVUFBVSxhQUFhLFdBQVcsRUFBRSxFQUFFO1FBQ3ZFLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqRSxFQUFFLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFO2dCQUN6QyxNQUFNLFVBQVUsR0FBRyxnQkFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFBLHlCQUFhLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFhLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFL0UsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUMzQyxnQkFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzVELGdCQUFVLENBQUMsR0FBRyxDQUFDLElBQUEsNENBQWdDLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FDeEQsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRTtJQUNsRCx5Q0FBeUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDO0lBQ2xHLE1BQU0sTUFBTSxHQUFHO1FBQ2IsVUFBVSxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsK0JBQW1CLENBQXNCO1FBQ3RFLFVBQVUsRUFBRSxDQUFDO1FBQ2IsV0FBVyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFxQixDQUFDLENBQXNCO1FBQ3pGLFdBQVcsRUFBRSxDQUFDO0tBQ2YsQ0FBQztJQUVGLElBQUEsdUJBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxjQUFpQyxFQUFFLGVBQWtDLEVBQUUsRUFBRTtRQUNoRyxNQUFNLGlCQUFpQixHQUFHLGdCQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyw0Q0FBZ0MsQ0FBQyxDQUFDLENBQUM7UUFDbEcsTUFBTSxrQkFBa0IsR0FBRyxnQkFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsNkNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRXJHLG9CQUFvQixDQUNsQixJQUFJLGVBQU8sQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUMvRixDQUFDO1FBRUYsd0RBQXdEO1FBQ3hELG9CQUFvQixDQUNsQixJQUFJLGVBQU8sQ0FDVCxJQUFJLEVBQ0osQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxFQUN0QyxlQUFlLEVBQ2YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ25FLENBQ0YsQ0FBQztRQUVGLG1CQUFtQjtRQUNuQixvQkFBb0IsQ0FDbEIsSUFBSSxlQUFPLENBQ1QsSUFBSSxFQUNKLGNBQWMsRUFDZCxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQ3hDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUNwRSxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGtDQUFrQyxFQUFFO0lBQzNDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsVUFBVSxFQUFFO1lBQ1YsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGtCQUFrQjtZQUM5QyxxQkFBcUI7U0FDRDtRQUN0QixVQUFVLEVBQUUsQ0FBQztRQUNiLFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBcUIsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBcUIsQ0FBQyxDQUFDO1FBQzNGLFdBQVcsRUFBRSxDQUFDO0tBQ2YsQ0FBQztJQUVGLEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtRQUN6QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsdUJBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxjQUFpQyxFQUFFLGVBQWtDLEVBQUUsRUFBRTtRQUNoRyxNQUFNLGlCQUFpQixHQUFHLGdCQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyw0Q0FBZ0MsQ0FBQyxDQUFDLENBQUM7UUFDbEcsTUFBTSxrQkFBa0IsR0FBRyxnQkFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsNkNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRXJHLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFFcEgsd0RBQXdEO1FBQ3hELHNCQUFzQixDQUNwQixjQUFjLEVBQ2QsQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxFQUN0QyxlQUFlLEVBQ2YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ25FLENBQUM7UUFFRixtQkFBbUI7UUFDbkIsc0JBQXNCLENBQ3BCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsQ0FBQyxHQUFHLGVBQWUsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUN4QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FDcEUsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuaW1wb3J0IHtcbiAgY29uc3RydWN0UHNidCxcbiAgZ2V0SW5wdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUsXG4gIGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSxcbiAgVGVzdFVuc3BlbnRUeXBlLFxuICBVbnNwZW50VHlwZVAyc2hQMnBrLFxuICBVbnNwZW50VHlwZVB1YktleUhhc2gsXG4gIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMyxcbn0gZnJvbSAnLi4vdGVzdHV0aWxzJztcblxuaW1wb3J0IHsgcnVuQ29tYmluYXRpb25zLCBUeENvbWJvIH0gZnJvbSAnLi90eEdlbic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmV4cG9ydCB0eXBlIElucHV0U2NyaXB0VHlwZSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlIHwgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuXG5jb25zdCBrZXlzID0gWzEsIDIsIDNdLm1hcCgodikgPT5cbiAgdXR4b2xpYi5iaXAzMi5mcm9tU2VlZChCdWZmZXIuYWxsb2MoMTYsIGB0ZXN0LzIvJHt2fWApLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pXG4pIGFzIHV0eG9saWIuQklQMzJJbnRlcmZhY2VbXTtcblxuY29uc3Qgcm9vdFdhbGxldEtleXMgPSBuZXcgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyhba2V5c1swXSwga2V5c1sxXSwga2V5c1syXV0pO1xuXG5jb25zdCB0ZXN0RGltZW5zaW9uc0Zyb21UeCA9ICh0eENvbWJvOiBhbnkpID0+IHtcbiAgY29uc3QgeyBpbnB1dFR5cGVzLCBvdXRwdXRUeXBlcywgZXhwZWN0ZWREaW1zIH0gPSB0eENvbWJvO1xuXG4gIGRlc2NyaWJlKGBDb21iaW5hdGlvbiBpbnB1dHM9JHtpbnB1dFR5cGVzfTsgb3V0cHV0cz0ke291dHB1dFR5cGVzfWAsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBuSW5wdXRzID0gaW5wdXRUeXBlcy5sZW5ndGg7XG4gICAgY29uc3Qgb3V0cHV0RGltcyA9IERpbWVuc2lvbnMuc3VtKC4uLm91dHB1dFR5cGVzLm1hcChnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUpKTtcblxuICAgIGl0KGBjYWxjdWxhdGVzIGRpbWVuc2lvbnMgZnJvbSB1bnNpZ25lZCB0cmFuc2FjdGlvbmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0eENvbWJvLmdldFVuc2lnbmVkVHgoKTtcblxuICAgICAgLy8gZG9lcyBub3Qgd29yayBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkVHgpKTtcblxuICAgICAgLy8gdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZFxuICAgICAgRGltZW5zaW9ucy5mcm9tVHJhbnNhY3Rpb24odW5zaWduZWRUeCwgeyBhc3N1bWVVbnNpZ25lZDogRGltZW5zaW9ucy5BU1NVTUVfUDJTSCB9KS5zaG91bGQuZXFsKFxuICAgICAgICBEaW1lbnNpb25zLnN1bSh7IG5QMnNoSW5wdXRzOiBuSW5wdXRzIH0sIG91dHB1dERpbXMpXG4gICAgICApO1xuXG4gICAgICBEaW1lbnNpb25zLmZyb21UcmFuc2FjdGlvbih1bnNpZ25lZFR4LCB7IGFzc3VtZVVuc2lnbmVkOiBEaW1lbnNpb25zLkFTU1VNRV9QMlNIX1AyV1NIIH0pLnNob3VsZC5lcWwoXG4gICAgICAgIERpbWVuc2lvbnMuc3VtKHsgblAyc2hQMndzaElucHV0czogbklucHV0cyB9LCBvdXRwdXREaW1zKVxuICAgICAgKTtcblxuICAgICAgRGltZW5zaW9ucy5mcm9tVHJhbnNhY3Rpb24odW5zaWduZWRUeCwgeyBhc3N1bWVVbnNpZ25lZDogRGltZW5zaW9ucy5BU1NVTUVfUDJXU0ggfSkuc2hvdWxkLmVxbChcbiAgICAgICAgRGltZW5zaW9ucy5zdW0oeyBuUDJ3c2hJbnB1dHM6IG5JbnB1dHMgfSwgb3V0cHV0RGltcylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZvciBzaWduZWQgdHJhbnNhY3Rpb25gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkaW1lbnNpb25zID0gRGltZW5zaW9ucy5mcm9tVHJhbnNhY3Rpb24odHhDb21iby5nZXRTaWduZWRUeCgpKTtcbiAgICAgIGRpbWVuc2lvbnMuc2hvdWxkLmVxbChleHBlY3RlZERpbXMpO1xuICAgIH0pO1xuXG4gICAgaXQoYGNhbGN1bGF0ZXMgZGltZW5zaW9ucyBmb3Igc2lnbmVkIGlucHV0IG9mIHRyYW5zYWN0aW9uYCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSB0eENvbWJvLmdldFNpZ25lZFR4KCk7XG5cbiAgICAgIC8vIHRlc3QgRGltZW5zaW9ucy5mcm9tSW5wdXQoKVxuICAgICAgaW5wdXRUeXBlcy5mb3JFYWNoKChpbnB1dDogYW55LCBpOiBudW1iZXIpID0+XG4gICAgICAgIERpbWVuc2lvbnMuZnJvbUlucHV0KHNpZ25lZFR4Lmluc1tpXSkuc2hvdWxkLmVxbChEaW1lbnNpb25zLnN1bShnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZShpbnB1dCkpKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5jb25zdCB0ZXN0RGltZW5zaW9uc0Zyb21Qc2J0ID0gKFxuICBrZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBpbnB1dFR5cGVzOiBJbnB1dFNjcmlwdFR5cGVbXSxcbiAgb3V0cHV0VHlwZXM6IFRlc3RVbnNwZW50VHlwZVtdLFxuICBleHBlY3RlZERpbXM6IERpbWVuc2lvbnNcbikgPT4ge1xuICBkZXNjcmliZShgUHNidCBDb21iaW5hdGlvbiBpbnB1dHM9JHtpbnB1dFR5cGVzfTsgb3V0cHV0cz0ke291dHB1dFR5cGVzfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAoWyd1bnNpZ25lZCcsICdoYWxmc2lnbmVkJywgJ2Z1bGx5c2lnbmVkJ10gYXMgY29uc3QpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIGl0KGBjYWxjdWxhdGVzIGRpbWVuc2lvbnMgZnJvbSAke3N9IHBzYnRgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBEaW1lbnNpb25zLmZyb21Qc2J0KGNvbnN0cnVjdFBzYnQoa2V5cywgaW5wdXRUeXBlcywgb3V0cHV0VHlwZXMsIHMpKTtcbiAgICAgICAgZGltZW5zaW9ucy5zaG91bGQuZXFsKGV4cGVjdGVkRGltcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KGBjYWxjdWxhdGVzIGRpbWVuc2lvbnMgZm9yIHNpZ25lZCBpbnB1dCBvZiBwc2J0YCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmVkUHNidCA9IGNvbnN0cnVjdFBzYnQoa2V5cywgaW5wdXRUeXBlcywgb3V0cHV0VHlwZXMsICdmdWxseXNpZ25lZCcpO1xuXG4gICAgICBpbnB1dFR5cGVzLmZvckVhY2goKGlucHV0OiBhbnksIGk6IG51bWJlcikgPT5cbiAgICAgICAgRGltZW5zaW9ucy5mcm9tUHNidElucHV0KHNpZ25lZFBzYnQuZGF0YS5pbnB1dHNbaV0pLnNob3VsZC5lcWwoXG4gICAgICAgICAgRGltZW5zaW9ucy5zdW0oZ2V0SW5wdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUoaW5wdXQpKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmRlc2NyaWJlKGBEaW1lbnNpb25zIGZvciB0cmFuc2FjdGlvbiBjb21iaW5hdGlvbnNgLCBmdW5jdGlvbiAoKSB7XG4gIC8vIHAydHJNdXNpZzIgaXMgc3VwcG9ydGVkIG9ubHkgd2l0aCBQU0JUXG4gIGNvbnN0IHNjcmlwdFR5cGVzID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMy5maWx0ZXIoKHQpID0+IHQgIT09ICdwMnRyTXVzaWcyJyk7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBpbnB1dFR5cGVzOiBbLi4uc2NyaXB0VHlwZXMsIFVuc3BlbnRUeXBlUDJzaFAycGtdIGFzIElucHV0U2NyaXB0VHlwZVtdLFxuICAgIG1heE5JbnB1dHM6IDIsXG4gICAgb3V0cHV0VHlwZXM6IFsuLi5zY3JpcHRUeXBlcywgLi4uT2JqZWN0LmtleXMoVW5zcGVudFR5cGVQdWJLZXlIYXNoKV0gYXMgVGVzdFVuc3BlbnRUeXBlW10sXG4gICAgbWF4Tk91dHB1dHM6IDIsXG4gIH07XG5cbiAgcnVuQ29tYmluYXRpb25zKHBhcmFtcywgKGlucHV0VHlwZUNvbWJvOiBJbnB1dFNjcmlwdFR5cGVbXSwgb3V0cHV0VHlwZUNvbWJvOiBUZXN0VW5zcGVudFR5cGVbXSkgPT4ge1xuICAgIGNvbnN0IGV4cGVjdGVkSW5wdXREaW1zID0gRGltZW5zaW9ucy5zdW0oLi4uaW5wdXRUeXBlQ29tYm8ubWFwKGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG4gICAgY29uc3QgZXhwZWN0ZWRPdXRwdXREaW1zID0gRGltZW5zaW9ucy5zdW0oLi4ub3V0cHV0VHlwZUNvbWJvLm1hcChnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUpKTtcblxuICAgIHRlc3REaW1lbnNpb25zRnJvbVR4KFxuICAgICAgbmV3IFR4Q29tYm8oa2V5cywgaW5wdXRUeXBlQ29tYm8sIG91dHB1dFR5cGVDb21ibywgZXhwZWN0ZWRJbnB1dERpbXMucGx1cyhleHBlY3RlZE91dHB1dERpbXMpKVxuICAgICk7XG5cbiAgICAvLyBEb3VibGluZyB0aGUgaW5wdXRzIHNob3VsZCB5aWVsZCB0d2ljZSB0aGUgaW5wdXQgZGltc1xuICAgIHRlc3REaW1lbnNpb25zRnJvbVR4KFxuICAgICAgbmV3IFR4Q29tYm8oXG4gICAgICAgIGtleXMsXG4gICAgICAgIFsuLi5pbnB1dFR5cGVDb21ibywgLi4uaW5wdXRUeXBlQ29tYm9dLFxuICAgICAgICBvdXRwdXRUeXBlQ29tYm8sXG4gICAgICAgIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRJbnB1dERpbXMpLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBTYW1lIGZvciBvdXRwdXRzXG4gICAgdGVzdERpbWVuc2lvbnNGcm9tVHgoXG4gICAgICBuZXcgVHhDb21ibyhcbiAgICAgICAga2V5cyxcbiAgICAgICAgaW5wdXRUeXBlQ29tYm8sXG4gICAgICAgIFsuLi5vdXRwdXRUeXBlQ29tYm8sIC4uLm91dHB1dFR5cGVDb21ib10sXG4gICAgICAgIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKS5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcylcbiAgICAgIClcbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShgRGltZW5zaW9ucyBmb3IgUFNCVCBjb21iaW5hdGlvbnNgLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBpbnB1dFR5cGVzOiBbXG4gICAgICAuLi51dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzLFxuICAgICAgdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVQMnNoUDJwayxcbiAgICAgICd0YXByb290S2V5UGF0aFNwZW5kJyxcbiAgICBdIGFzIElucHV0U2NyaXB0VHlwZVtdLFxuICAgIG1heE5JbnB1dHM6IDEsXG4gICAgb3V0cHV0VHlwZXM6IFsuLi5PYmplY3Qua2V5cyhVbnNwZW50VHlwZVNjcmlwdDJvZjMpLCAuLi5PYmplY3Qua2V5cyhVbnNwZW50VHlwZVB1YktleUhhc2gpXSxcbiAgICBtYXhOT3V0cHV0czogMSxcbiAgfTtcblxuICBpdChgZG9lcyBub3Qgd29yayBmb3IgdW5rbm93biBwc2J0IGlucHV0YCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luIH0pO1xuICAgIHBzYnQuYWRkSW5wdXQoeyBoYXNoOiBCdWZmZXIuYWxsb2MoMzIpLCBpbmRleDogMCB9KTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuZnJvbVBzYnQocHNidCkpO1xuICB9KTtcblxuICBydW5Db21iaW5hdGlvbnMocGFyYW1zLCAoaW5wdXRUeXBlQ29tYm86IElucHV0U2NyaXB0VHlwZVtdLCBvdXRwdXRUeXBlQ29tYm86IFRlc3RVbnNwZW50VHlwZVtdKSA9PiB7XG4gICAgY29uc3QgZXhwZWN0ZWRJbnB1dERpbXMgPSBEaW1lbnNpb25zLnN1bSguLi5pbnB1dFR5cGVDb21iby5tYXAoZ2V0SW5wdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUpKTtcbiAgICBjb25zdCBleHBlY3RlZE91dHB1dERpbXMgPSBEaW1lbnNpb25zLnN1bSguLi5vdXRwdXRUeXBlQ29tYm8ubWFwKGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSkpO1xuXG4gICAgdGVzdERpbWVuc2lvbnNGcm9tUHNidChyb290V2FsbGV0S2V5cywgaW5wdXRUeXBlQ29tYm8sIG91dHB1dFR5cGVDb21ibywgZXhwZWN0ZWRJbnB1dERpbXMucGx1cyhleHBlY3RlZE91dHB1dERpbXMpKTtcblxuICAgIC8vIERvdWJsaW5nIHRoZSBpbnB1dHMgc2hvdWxkIHlpZWxkIHR3aWNlIHRoZSBpbnB1dCBkaW1zXG4gICAgdGVzdERpbWVuc2lvbnNGcm9tUHNidChcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAgWy4uLmlucHV0VHlwZUNvbWJvLCAuLi5pbnB1dFR5cGVDb21ib10sXG4gICAgICBvdXRwdXRUeXBlQ29tYm8sXG4gICAgICBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkSW5wdXREaW1zKS5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcylcbiAgICApO1xuXG4gICAgLy8gU2FtZSBmb3Igb3V0cHV0c1xuICAgIHRlc3REaW1lbnNpb25zRnJvbVBzYnQoXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIGlucHV0VHlwZUNvbWJvLFxuICAgICAgWy4uLm91dHB1dFR5cGVDb21ibywgLi4ub3V0cHV0VHlwZUNvbWJvXSxcbiAgICAgIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKS5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcylcbiAgICApO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!