PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/bitgo/psbt

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const mocha_1 = require("mocha");
const src_1 = require("../../../src");
const bitgo_1 = require("../../../src/bitgo");
const testutil_1 = require("../../../src/testutil");
const outputScripts_1 = require("../../../src/bitgo/outputScripts");
const fromHalfSigned_1 = require("../../../src/bitgo/psbt/fromHalfSigned");
const transaction_util_1 = require("../../transaction_util");
const fixture_util_1 = require("../../fixture.util");
const normalize_1 = require("../../testutil/normalize");
const bs58check = require("bs58check");
function getScriptTypes2Of3() {
    // FIXME(BG-66941): p2trMusig2 signing does not work in this test suite yet
    //  because the test suite is written with TransactionBuilder
    return bitgo_1.outputScripts.scriptTypes2Of3.filter((scriptType) => scriptType !== 'p2trMusig2');
}
function getScriptTypes() {
    return [...getScriptTypes2Of3(), 'p2shP2pk'];
}
const walletKeys = (0, testutil_1.getDefaultWalletKeys)();
function runTest(scriptType, signer, cosigner, network) {
    const signerName = (0, testutil_1.getKeyName)(walletKeys.triple, signer);
    const cosignerName = (0, testutil_1.getKeyName)(walletKeys.triple, cosigner);
    const networkName = (0, src_1.getNetworkName)(network);
    const signingKeys = [
        signerName === 'user' || cosignerName === 'user',
        signerName === 'backup' || cosignerName === 'backup',
        signerName === 'bitgo' || cosignerName === 'bitgo',
    ];
    (0, mocha_1.describe)(`UtxoPsbt ${[
        `scriptType=${scriptType}`,
        `network=${networkName}`,
        `signer=${signerName}`,
        `cosigner=${cosignerName}`,
    ].join(',')}`, function () {
        let prevOutputs;
        let unsigned;
        let halfSigned;
        let fullSigned;
        before('create transaction', function () {
            prevOutputs = (0, transaction_util_1.getPrevOutputs)(scriptType, BigInt(1e8), network, {
                keys: walletKeys.triple,
                prevTx: (scriptType === 'p2sh' || scriptType === 'p2shP2pk') && (0, src_1.getNetworkName)(network) !== 'zcash',
            });
            ({ unsigned, halfSigned, fullSigned } = (0, transaction_util_1.getTransactionStages)(walletKeys.triple, signer, cosigner, scriptType, network, {
                amountType: 'bigint',
                outputAmount: BigInt(1e8),
                prevOutputs,
            }));
        });
        function testGetInputUpdateForStage(stage) {
            (0, mocha_1.it)(`has getInputUpdate with expected value, stage=${stage}`, async function () {
                const tx = stage === 'unsigned' ? unsigned : halfSigned;
                const vin = 0;
                const inputUpdate = (0, fromHalfSigned_1.getInputUpdate)(tx, vin, prevOutputs);
                assert.deepStrictEqual((0, normalize_1.normDefault)(inputUpdate), await (0, fixture_util_1.readFixture)(`test/bitgo/fixtures/psbt/inputUpdate.${scriptType}.${stage}.${signerName}-${cosignerName}.json`, inputUpdate));
            });
        }
        testGetInputUpdateForStage('unsigned');
        testGetInputUpdateForStage('halfSigned');
        (0, mocha_1.it)('has equal unsigned tx', function () {
            assert.strictEqual(bitgo_1.UtxoPsbt.fromTransaction(unsigned, prevOutputs).getUnsignedTx().toBuffer().toString('hex'), unsigned.toBuffer().toString('hex'));
            if (scriptType !== 'p2shP2pk') {
                assert.strictEqual(bitgo_1.UtxoPsbt.fromTransaction(halfSigned, prevOutputs).getUnsignedTx().toBuffer().toString('hex'), unsigned.toBuffer().toString('hex'));
            }
        });
        function signPsbt(startTx, signers) {
            const psbt = bitgo_1.UtxoPsbt.fromTransaction(startTx, prevOutputs);
            psbt.updateGlobal({
                globalXpub: walletKeys.triple.map((bip32) => {
                    const masterFingerprint = Buffer.alloc(4);
                    masterFingerprint.writeUInt32BE(bip32.parentFingerprint);
                    const extendedPubkey = bip32.neutered().toBase58();
                    return {
                        extendedPubkey: bs58check.decode(extendedPubkey),
                        masterFingerprint,
                        path: 'm',
                    };
                }),
            });
            signers.forEach((s) => {
                if (scriptType === 'p2tr') {
                    psbt.signTaprootInput(0, s, [
                        (0, outputScripts_1.getLeafHash)({
                            publicKeys: walletKeys.publicKeys,
                            signer: signer.publicKey,
                            cosigner: cosigner.publicKey,
                        }),
                    ]);
                }
                else {
                    psbt.signAllInputs(s);
                }
            });
            assert.deepStrictEqual(psbt.getSignatureValidationArray(0, { rootNodes: walletKeys.triple }), signingKeys);
            psbt.finalizeAllInputs();
            return psbt.extractTransaction();
        }
        (0, mocha_1.it)('can go from unsigned to full-signed', function () {
            // TODO(BG-57748): inputs lack some required information
            this.skip();
            assert.deepStrictEqual(signPsbt(unsigned, [signer, cosigner]).toBuffer().toString('hex'), fullSigned.toBuffer().toString('hex'));
        });
        (0, mocha_1.it)('can go from half-signed to full-signed', function () {
            if (scriptType === 'p2shP2pk') {
                this.skip();
            }
            assert.deepStrictEqual(signPsbt(halfSigned, [cosigner]).toBuffer().toString('hex'), fullSigned.toBuffer().toString('hex'));
        });
    });
}
getScriptTypes().forEach((t) => {
    runTest(t, walletKeys.user, walletKeys.bitgo, src_1.networks.bitcoin);
    runTest(t, walletKeys.backup, walletKeys.user, src_1.networks.bitcoin);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbUhhbGZTaWduZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2JpdGdvL3BzYnQvZnJvbUhhbGZTaWduZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFDakMsaUNBQXFDO0FBRXJDLHNDQUFpRjtBQUNqRiw4Q0FBMEY7QUFDMUYsb0RBQXlFO0FBQ3pFLG9FQUErRDtBQUMvRCwyRUFBd0U7QUFFeEUsNkRBQThFO0FBRTlFLHFEQUFpRDtBQUNqRCx3REFBdUQ7QUFDdkQsdUNBQXVDO0FBRXZDLFNBQVMsa0JBQWtCO0lBQ3pCLDJFQUEyRTtJQUMzRSw2REFBNkQ7SUFDN0QsT0FBTyxxQkFBYSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsS0FBSyxZQUFZLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRUQsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQW9CLEdBQUUsQ0FBQztBQUUxQyxTQUFTLE9BQU8sQ0FDZCxVQUFvQyxFQUNwQyxNQUFzQixFQUN0QixRQUF3QixFQUN4QixPQUFnQjtJQUVoQixNQUFNLFVBQVUsR0FBRyxJQUFBLHFCQUFVLEVBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCxNQUFNLFlBQVksR0FBRyxJQUFBLHFCQUFVLEVBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFBLG9CQUFjLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsTUFBTSxXQUFXLEdBQUc7UUFDbEIsVUFBVSxLQUFLLE1BQU0sSUFBSSxZQUFZLEtBQUssTUFBTTtRQUNoRCxVQUFVLEtBQUssUUFBUSxJQUFJLFlB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QztJQUNoRSxPQUFPLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxjQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcblxuaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UsIGdldE5ldHdvcmtOYW1lLCBOZXR3b3JrLCBuZXR3b3JrcyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBvdXRwdXRTY3JpcHRzLCBQcmV2T3V0cHV0LCBVdHhvUHNidCwgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2JpdGdvJztcbmltcG9ydCB7IGdldERlZmF1bHRXYWxsZXRLZXlzLCBnZXRLZXlOYW1lIH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Rlc3R1dGlsJztcbmltcG9ydCB7IGdldExlYWZIYXNoIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2JpdGdvL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgZ2V0SW5wdXRVcGRhdGUgfSBmcm9tICcuLi8uLi8uLi9zcmMvYml0Z28vcHNidC9mcm9tSGFsZlNpZ25lZCc7XG5cbmltcG9ydCB7IGdldFByZXZPdXRwdXRzLCBnZXRUcmFuc2FjdGlvblN0YWdlcyB9IGZyb20gJy4uLy4uL3RyYW5zYWN0aW9uX3V0aWwnO1xuXG5pbXBvcnQgeyByZWFkRml4dHVyZSB9IGZyb20gJy4uLy4uL2ZpeHR1cmUudXRpbCc7XG5pbXBvcnQgeyBub3JtRGVmYXVsdCB9IGZyb20gJy4uLy4uL3Rlc3R1dGlsL25vcm1hbGl6ZSc7XG5pbXBvcnQgKiBhcyBiczU4Y2hlY2sgZnJvbSAnYnM1OGNoZWNrJztcblxuZnVuY3Rpb24gZ2V0U2NyaXB0VHlwZXMyT2YzKCkge1xuICAvLyBGSVhNRShCRy02Njk0MSk6IHAydHJNdXNpZzIgc2lnbmluZyBkb2VzIG5vdCB3b3JrIGluIHRoaXMgdGVzdCBzdWl0ZSB5ZXRcbiAgLy8gIGJlY2F1c2UgdGhlIHRlc3Qgc3VpdGUgaXMgd3JpdHRlbiB3aXRoIFRyYW5zYWN0aW9uQnVpbGRlclxuICByZXR1cm4gb3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMuZmlsdGVyKChzY3JpcHRUeXBlKSA9PiBzY3JpcHRUeXBlICE9PSAncDJ0ck11c2lnMicpO1xufVxuXG5mdW5jdGlvbiBnZXRTY3JpcHRUeXBlcygpOiBvdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGVbXSB7XG4gIHJldHVybiBbLi4uZ2V0U2NyaXB0VHlwZXMyT2YzKCksICdwMnNoUDJwayddO1xufVxuXG5jb25zdCB3YWxsZXRLZXlzID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcblxuZnVuY3Rpb24gcnVuVGVzdChcbiAgc2NyaXB0VHlwZTogb3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlLFxuICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gIG5ldHdvcms6IE5ldHdvcmtcbikge1xuICBjb25zdCBzaWduZXJOYW1lID0gZ2V0S2V5TmFtZSh3YWxsZXRLZXlzLnRyaXBsZSwgc2lnbmVyKTtcbiAgY29uc3QgY29zaWduZXJOYW1lID0gZ2V0S2V5TmFtZSh3YWxsZXRLZXlzLnRyaXBsZSwgY29zaWduZXIpO1xuICBjb25zdCBuZXR3b3JrTmFtZSA9IGdldE5ldHdvcmtOYW1lKG5ldHdvcmspO1xuICBjb25zdCBzaWduaW5nS2V5cyA9IFtcbiAgICBzaWduZXJOYW1lID09PSAndXNlcicgfHwgY29zaWduZXJOYW1lID09PSAndXNlcicsXG4gICAgc2lnbmVyTmFtZSA9PT0gJ2JhY2t1cCcgfHwgY29zaWduZXJOYW1lID09PSAnYmFja3VwJyxcbiAgICBzaWduZXJOYW1lID09PSAnYml0Z28nIHx8IGNvc2lnbmVyTmFtZSA9PT0gJ2JpdGdvJyxcbiAgXTtcbiAgZGVzY3JpYmUoYFV0eG9Qc2J0ICR7W1xuICAgIGBzY3JpcHRUeXBlPSR7c2NyaXB0VHlwZX1gLFxuICAgIGBuZXR3b3JrPSR7bmV0d29ya05hbWV9YCxcbiAgICBgc2lnbmVyPSR7c2lnbmVyTmFtZX1gLFxuICAgIGBjb3NpZ25lcj0ke2Nvc2lnbmVyTmFtZX1gLFxuICBdLmpvaW4oJywnKX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHByZXZPdXRwdXRzOiBQcmV2T3V0cHV0PGJpZ2ludD5bXTtcbiAgICBsZXQgdW5zaWduZWQ6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+O1xuICAgIGxldCBoYWxmU2lnbmVkOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PjtcbiAgICBsZXQgZnVsbFNpZ25lZDogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD47XG4gICAgYmVmb3JlKCdjcmVhdGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwcmV2T3V0cHV0cyA9IGdldFByZXZPdXRwdXRzKHNjcmlwdFR5cGUsIEJpZ0ludCgxZTgpLCBuZXR3b3JrLCB7XG4gICAgICAgIGtleXM6IHdhbGxldEtleXMudHJpcGxlLFxuICAgICAgICBwcmV2VHg6IChzY3JpcHRUeXBlID09PSAncDJzaCcgfHwgc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJykgJiYgZ2V0TmV0d29ya05hbWUobmV0d29yaykgIT09ICd6Y2FzaCcsXG4gICAgICB9KTtcbiAgICAgICh7IHVuc2lnbmVkLCBoYWxmU2lnbmVkLCBmdWxsU2lnbmVkIH0gPSBnZXRUcmFuc2FjdGlvblN0YWdlcyhcbiAgICAgICAgd2FsbGV0S2V5cy50cmlwbGUsXG4gICAgICAgIHNpZ25lcixcbiAgICAgICAgY29zaWduZXIsXG4gICAgICAgIHNjcmlwdFR5cGUsXG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRUeXBlOiAnYmlnaW50JyxcbiAgICAgICAgICBvdXRwdXRBbW91bnQ6IEJpZ0ludCgxZTgpLFxuICAgICAgICAgIHByZXZPdXRwdXRzLFxuICAgICAgICB9XG4gICAgICApKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHRlc3RHZXRJbnB1dFVwZGF0ZUZvclN0YWdlKHN0YWdlOiAndW5zaWduZWQnIHwgJ2hhbGZTaWduZWQnKSB7XG4gICAgICBpdChgaGFzIGdldElucHV0VXBkYXRlIHdpdGggZXhwZWN0ZWQgdmFsdWUsIHN0YWdlPSR7c3RhZ2V9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eCA9IHN0YWdlID09PSAndW5zaWduZWQnID8gdW5zaWduZWQgOiBoYWxmU2lnbmVkO1xuICAgICAgICBjb25zdCB2aW4gPSAwO1xuICAgICAgICBjb25zdCBpbnB1dFVwZGF0ZSA9IGdldElucHV0VXBkYXRlKHR4LCB2aW4sIHByZXZPdXRwdXRzKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICBub3JtRGVmYXVsdChpbnB1dFVwZGF0ZSksXG4gICAgICAgICAgYXdhaXQgcmVhZEZpeHR1cmUoXG4gICAgICAgICAgICBgdGVzdC9iaXRnby9maXh0dXJlcy9wc2J0L2lucHV0VXBkYXRlLiR7c2NyaXB0VHlwZX0uJHtzdGFnZX0uJHtzaWduZXJOYW1lfS0ke2Nvc2lnbmVyTmFtZX0uanNvbmAsXG4gICAgICAgICAgICBpbnB1dFVwZGF0ZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRlc3RHZXRJbnB1dFVwZGF0ZUZvclN0YWdlKCd1bnNpZ25lZCcpO1xuICAgIHRlc3RHZXRJbnB1dFVwZGF0ZUZvclN0YWdlKCdoYWxmU2lnbmVkJyk7XG5cbiAgICBpdCgnaGFzIGVxdWFsIHVuc2lnbmVkIHR4JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBVdHhvUHNidC5mcm9tVHJhbnNhY3Rpb24odW5zaWduZWQsIHByZXZPdXRwdXRzKS5nZXRVbnNpZ25lZFR4KCkudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHVuc2lnbmVkLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICApO1xuXG4gICAgICBpZiAoc2NyaXB0VHlwZSAhPT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgVXR4b1BzYnQuZnJvbVRyYW5zYWN0aW9uKGhhbGZTaWduZWQsIHByZXZPdXRwdXRzKS5nZXRVbnNpZ25lZFR4KCkudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdW5zaWduZWQudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNpZ25Qc2J0KHN0YXJ0VHg6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+LCBzaWduZXJzOiBCSVAzMkludGVyZmFjZVtdKSB7XG4gICAgICBjb25zdCBwc2J0ID0gVXR4b1BzYnQuZnJvbVRyYW5zYWN0aW9uKHN0YXJ0VHgsIHByZXZPdXRwdXRzKTtcbiAgICAgIHBzYnQudXBkYXRlR2xvYmFsKHtcbiAgICAgICAgZ2xvYmFsWHB1Yjogd2FsbGV0S2V5cy50cmlwbGUubWFwKChiaXAzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hc3RlckZpbmdlcnByaW50ID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgICAgIG1hc3RlckZpbmdlcnByaW50LndyaXRlVUludDMyQkUoYmlwMzIucGFyZW50RmluZ2VycHJpbnQpO1xuICAgICAgICAgIGNvbnN0IGV4dGVuZGVkUHVia2V5ID0gYmlwMzIubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBleHRlbmRlZFB1YmtleTogYnM1OGNoZWNrLmRlY29kZShleHRlbmRlZFB1YmtleSksXG4gICAgICAgICAgICBtYXN0ZXJGaW5nZXJwcmludCxcbiAgICAgICAgICAgIHBhdGg6ICdtJyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgICAgc2lnbmVycy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIGlmIChzY3JpcHRUeXBlID09PSAncDJ0cicpIHtcbiAgICAgICAgICBwc2J0LnNpZ25UYXByb290SW5wdXQoMCwgcywgW1xuICAgICAgICAgICAgZ2V0TGVhZkhhc2goe1xuICAgICAgICAgICAgICBwdWJsaWNLZXlzOiB3YWxsZXRLZXlzLnB1YmxpY0tleXMsXG4gICAgICAgICAgICAgIHNpZ25lcjogc2lnbmVyLnB1YmxpY0tleSxcbiAgICAgICAgICAgICAgY29zaWduZXI6IGNvc2lnbmVyLnB1YmxpY0tleSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBzYnQuc2lnbkFsbElucHV0cyhzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBzYnQuZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KDAsIHsgcm9vdE5vZGVzOiB3YWxsZXRLZXlzLnRyaXBsZSB9KSwgc2lnbmluZ0tleXMpO1xuICAgICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICAgICAgcmV0dXJuIHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgaXQoJ2NhbiBnbyBmcm9tIHVuc2lnbmVkIHRvIGZ1bGwtc2lnbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVE9ETyhCRy01Nzc0OCk6IGlucHV0cyBsYWNrIHNvbWUgcmVxdWlyZWQgaW5mb3JtYXRpb25cbiAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgc2lnblBzYnQodW5zaWduZWQsIFtzaWduZXIsIGNvc2lnbmVyXSkudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGZ1bGxTaWduZWQudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FuIGdvIGZyb20gaGFsZi1zaWduZWQgdG8gZnVsbC1zaWduZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICB0aGlzLnNraXAoKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICAgIHNpZ25Qc2J0KGhhbGZTaWduZWQsIFtjb3NpZ25lcl0pLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBmdWxsU2lnbmVkLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZ2V0U2NyaXB0VHlwZXMoKS5mb3JFYWNoKCh0KSA9PiB7XG4gIHJ1blRlc3QodCwgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJpdGdvLCBuZXR3b3Jrcy5iaXRjb2luKTtcbiAgcnVuVGVzdCh0LCB3YWxsZXRLZXlzLmJhY2t1cCwgd2FsbGV0S2V5cy51c2VyLCBuZXR3b3Jrcy5iaXRjb2luKTtcbn0pO1xuIl19

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


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