PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/bitgo
Просмотр файла: outputScripts.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
const assert = require("assert");
const outputScripts_1 = require("../../src/bitgo/outputScripts");
const src_1 = require("../../src");
const testutil_1 = require("../../src/testutil");
const keys = (0, testutil_1.getKeyTriple)('utxo');
const pubkeys = keys.map((k) => k.publicKey);
describe('output script support', function () {
it('has expected values for each network', function () {
assert.deepStrictEqual((0, src_1.getNetworkList)().map((n) => [(0, src_1.getNetworkName)(n), outputScripts_1.scriptTypes2Of3.filter((t) => (0, outputScripts_1.isSupportedScriptType)(n, t))]), [
['bitcoin', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
['testnet', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
['bitcoinPublicSignet', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
['bitcoinTestnet4', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
['bitcoinBitGoSignet', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
['bitcoincash', ['p2sh']],
['bitcoincashTestnet', ['p2sh']],
['bitcoingold', ['p2sh', 'p2shP2wsh', 'p2wsh']],
['bitcoingoldTestnet', ['p2sh', 'p2shP2wsh', 'p2wsh']],
['bitcoinsv', ['p2sh']],
['bitcoinsvTestnet', ['p2sh']],
['dash', ['p2sh']],
['dashTest', ['p2sh']],
['dogecoin', ['p2sh']],
['dogecoinTest', ['p2sh']],
['ecash', ['p2sh']],
['ecashTest', ['p2sh']],
['litecoin', ['p2sh', 'p2shP2wsh', 'p2wsh']],
['litecoinTest', ['p2sh', 'p2shP2wsh', 'p2wsh']],
['zcash', ['p2sh']],
['zcashTest', ['p2sh']],
]);
});
it('does not allow unsupported scripts when network parameter is provided', function () {
(0, src_1.getNetworkList)().forEach((n) => {
outputScripts_1.scriptTypes2Of3
.filter((t) => !(0, outputScripts_1.isSupportedScriptType)(n, t))
.forEach((t) => assert.throws(() => (0, outputScripts_1.createOutputScript2of3)(pubkeys, t, n), (err) => !!(err instanceof Error && err.message.match(/^unsupported script type/))));
});
});
});
describe('createOutputScript2of3()', function () {
const p2ms = '522103f1667be6e8b8eb0c980155dfcda742affeeb0b0ca10969c54152713185' +
'6d65c9210305902cf20a0bbc9274e62414aa4afea8c96e3e83abb5233d72355c' +
'27d7de660a2103c79183d6641585179d25bbc091b2a7fce86c9f15d311e5aca0' +
'a020478d8f208753ae';
const p2wsh = '002095ecaacb606b9ece3821c0111c0a1208dd1d35192809bf8cf6cbad4bbeaca67f';
const p2tr = '5120a4ce7d122bdc05224b27415228728e5d5bf485961a07493d068ddbb4d4569059';
const p2trMusig2 = '51207cd79799a4cf6183b018a29960ffe8351e90afdb2383b9b9dcd3ec07929c72e3';
outputScripts_1.scriptTypes2Of3.forEach((scriptType) => {
it(`creates output script (type=${scriptType})`, function () {
const { scriptPubKey, redeemScript, witnessScript } = (0, outputScripts_1.createOutputScript2of3)(pubkeys, scriptType);
switch (scriptType) {
case 'p2sh':
assert.strictEqual(scriptPubKey.toString('hex'), 'a91491590bed8198ea7ca57ba68ab7cbfabc656cbbaf87');
assert.strictEqual(redeemScript && redeemScript.toString('hex'), p2ms);
assert.strictEqual(witnessScript, undefined);
break;
case 'p2shP2wsh':
assert.strictEqual(scriptPubKey.toString('hex'), 'a9140312dd6f801ab11d53c35f6a2bdac9c602a55d9d87');
assert.strictEqual(redeemScript && redeemScript.toString('hex'), p2wsh);
assert.strictEqual(witnessScript && witnessScript.toString('hex'), p2ms);
break;
case 'p2wsh':
assert.strictEqual(scriptPubKey.toString('hex'), p2wsh);
assert.strictEqual(redeemScript, undefined);
assert.strictEqual(witnessScript && witnessScript.toString('hex'), p2ms);
break;
case 'p2tr':
assert.strictEqual(scriptPubKey.toString('hex'), p2tr);
// TODO: validate script control blocks once they are returned by payments.p2tr()
break;
case 'p2trMusig2':
assert.strictEqual(scriptPubKey.toString('hex'), p2trMusig2);
break;
default:
throw new Error(`unexpected type ${scriptType}`);
}
});
});
});
describe('createOutputScriptP2shP2pk', function () {
it('create output script p2shP2pk', function () {
const keypair = src_1.ECPair.fromWIF('cTLxw4KC55LQfFj3eZz51NpWX1j2ja4WkbQFbHaTuaRkSFGeJ4yS', bitcoinjs_lib_1.networks.testnet);
const { scriptPubKey, redeemScript, witnessScript } = (0, outputScripts_1.createOutputScriptP2shP2pk)(keypair.publicKey);
assert.strictEqual(scriptPubKey.toString('hex'), 'a914172dcc4e025361d951a9511c670973a4e3720c9887');
assert.strictEqual(redeemScript?.toString('hex'), '210219da48412c2268865fe8c126327d1b12eee350a3b69eb09e3323cc9a11828945ac');
assert.strictEqual(witnessScript, undefined);
});
});
describe('createPaymentP2tr', () => {
const controlBlocks = [
'c1aa3303d48847f4d54aa02a4ff97448f1f430b07eecd632c41f390e3f8431a166487df024a0eb38aeb56b5263cf22c84a2c9c7daad9a8e55cce2e3cac87c52a0a',
'c1aa3303d48847f4d54aa02a4ff97448f1f430b07eecd632c41f390e3f8431a1660a75f62db677b9c1974741735aa4b0c2c8718796c82578b960e1fa0986d4f25cf0b2127669c12ad75a079c25502a5456764de23f30df1fcdb88418fe970834d7',
'c1aa3303d48847f4d54aa02a4ff97448f1f430b07eecd632c41f390e3f8431a1669c039366a9ce89ad30c9935268a10110cb1a4b6357dcc2c651e9de38639c206af0b2127669c12ad75a079c25502a5456764de23f30df1fcdb88418fe970834d7',
];
it('allows no redeemIndex', () => {
const p2tr = (0, outputScripts_1.createPaymentP2tr)(pubkeys);
assert.strictEqual(p2tr.controlBlock, undefined);
});
for (let i = 0; i < 3; i++) {
it(`creates controlBlock for redeemIndex ${i}`, () => {
const p2tr = (0, outputScripts_1.createPaymentP2tr)(pubkeys, i);
assert.strictEqual(p2tr.controlBlock?.toString('hex'), controlBlocks[i]);
});
}
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0U2NyaXB0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvYml0Z28vb3V0cHV0U2NyaXB0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUF5QztBQUN6QyxpQ0FBaUM7QUFFakMsaUVBTXVDO0FBQ3ZDLG1DQUFtRTtBQUNuRSxpREFBa0Q7QUFFbEQsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBWSxFQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQTZCLENBQUM7QUFFekUsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtRQUN6QyxNQUFNLENBQUMsZUFBZSxDQUNwQixJQUFBLG9CQUFjLEdBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBQSxvQkFBYyxFQUFDLENBQUMsQ0FBQyxFQUFFLCtCQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLHFDQUFxQixFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDNUc7WUFDRSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNqRSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNqRSxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzdFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLEVBQUUs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O1FBQ3hDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixFQUFFLENBQUMsd0NBQXdDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUNuRCxNQUFNLElBQUksR0FBRyxJQUFBLGlDQUFpQixFQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbmV0d29ya3MgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzLFxuICBjcmVhdGVPdXRwdXRTY3JpcHRQMnNoUDJwayxcbiAgY3JlYXRlUGF5bWVudFAydHIsXG4gIGlzU3VwcG9ydGVkU2NyaXB0VHlwZSxcbiAgc2NyaXB0VHlwZXMyT2YzLFxufSBmcm9tICcuLi8uLi9zcmMvYml0Z28vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBFQ1BhaXIsIGdldE5ldHdvcmtOYW1lLCBnZXROZXR3b3JrTGlzdCB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBnZXRLZXlUcmlwbGUgfSBmcm9tICcuLi8uLi9zcmMvdGVzdHV0aWwnO1xuXG5jb25zdCBrZXlzID0gZ2V0S2V5VHJpcGxlKCd1dHhvJyk7XG5jb25zdCBwdWJrZXlzID0ga2V5cy5tYXAoKGspID0+IGsucHVibGljS2V5KSBhcyBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl07XG5cbmRlc2NyaWJlKCdvdXRwdXQgc2NyaXB0IHN1cHBvcnQnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdoYXMgZXhwZWN0ZWQgdmFsdWVzIGZvciBlYWNoIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgIGdldE5ldHdvcmtMaXN0KCkubWFwKChuKSA9PiBbZ2V0TmV0d29ya05hbWUobiksIHNjcmlwdFR5cGVzMk9mMy5maWx0ZXIoKHQpID0+IGlzU3VwcG9ydGVkU2NyaXB0VHlwZShuLCB0KSldKSxcbiAgICAgIFtcbiAgICAgICAgWydiaXRjb2luJywgWydwMnNoJywgJ3Ayc2hQMndzaCcsICdwMndzaCcsICdwMnRyJywgJ3AydHJNdXNpZzInXV0sXG4gICAgICAgIFsndGVzdG5ldCcsIFsncDJzaCcsICdwMnNoUDJ3c2gnLCAncDJ3c2gnLCAncDJ0cicsICdwMnRyTXVzaWcyJ11dLFxuICAgICAgICBbJ2JpdGNvaW5QdWJsaWNTaWduZXQnLCBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJywgJ3AydHInLCAncDJ0ck11c2lnMiddXSxcbiAgICAgICAgWydiaXRjb2luVGVzdG5ldDQnLCBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJywgJ3AydHInLCAncDJ0ck11c2lnMiddXSxcbiAgICAgICAgWydiaXRjb2luQml0R29TaWduZXQnLCBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJywgJ3AydHInLCAncDJ0ck11c2lnMiddXSxcbiAgICAgICAgWydiaXRjb2luY2FzaCcsIFsncDJzaCddXSxcbiAgICAgICAgWydiaXRjb2luY2FzaFRlc3RuZXQnLCBbJ3Ayc2gnXV0sXG4gICAgICAgIFsnYml0Y29pbmdvbGQnLCBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJ11dLFxuICAgICAgICBbJ2JpdGNvaW5nb2xkVGVzdG5ldCcsIFsncDJzaCcsICdwMnNoUDJ3c2gnLCAncDJ3c2gnXV0sXG4gICAgICAgIFsnYml0Y29pbnN2JywgWydwMnNoJ11dLFxuICAgICAgICBbJ2JpdGNvaW5zdlRlc3RuZXQnLCBbJ3Ayc2gnXV0sXG4gICAgICAgIFsnZGFzaCcsIFsncDJzaCddXSxcbiAgICAgICAgWydkYXNoVGVzdCcsIFsncDJzaCddXSxcbiAgICAgICAgWydkb2dlY29pbicsIFsncDJzaCddXSxcbiAgICAgICAgWydkb2dlY29pblRlc3QnLCBbJ3Ayc2gnXV0sXG4gICAgICAgIFsnZWNhc2gnLCBbJ3Ayc2gnXV0sXG4gICAgICAgIFsnZWNhc2hUZXN0JywgWydwMnNoJ11dLFxuICAgICAgICBbJ2xpdGVjb2luJywgWydwMnNoJywgJ3Ayc2hQMndzaCcsICdwMndzaCddXSxcbiAgICAgICAgWydsaXRlY29pblRlc3QnLCBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJ11dLFxuICAgICAgICBbJ3pjYXNoJywgWydwMnNoJ11dLFxuICAgICAgICBbJ3pjYXNoVGVzdCcsIFsncDJzaCddXSxcbiAgICAgIF1cbiAgICApO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgYWxsb3cgdW5zdXBwb3J0ZWQgc2NyaXB0cyB3aGVuIG5ldHdvcmsgcGFyYW1ldGVyIGlzIHByb3ZpZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGdldE5ldHdvcmtMaXN0KCkuZm9yRWFjaCgobikgPT4ge1xuICAgICAgc2NyaXB0VHlwZXMyT2YzXG4gICAgICAgIC5maWx0ZXIoKHQpID0+ICFpc1N1cHBvcnRlZFNjcmlwdFR5cGUobiwgdCkpXG4gICAgICAgIC5mb3JFYWNoKCh0KSA9PlxuICAgICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgICAoKSA9PiBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzKHB1YmtleXMsIHQsIG4pLFxuICAgICAgICAgICAgKGVycikgPT4gISEoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm1lc3NhZ2UubWF0Y2goL151bnN1cHBvcnRlZCBzY3JpcHQgdHlwZS8pKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NyZWF0ZU91dHB1dFNjcmlwdDJvZjMoKScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcDJtcyA9XG4gICAgJzUyMjEwM2YxNjY3YmU2ZThiOGViMGM5ODAxNTVkZmNkYTc0MmFmZmVlYjBiMGNhMTA5NjljNTQxNTI3MTMxODUnICtcbiAgICAnNmQ2NWM5MjEwMzA1OTAyY2YyMGEwYmJjOTI3NGU2MjQxNGFhNGFmZWE4Yzk2ZTNlODNhYmI1MjMzZDcyMzU1YycgK1xuICAgICcyN2Q3ZGU2NjBhMjEwM2M3OTE4M2Q2NjQxNTg1MTc5ZDI1YmJjMDkxYjJhN2ZjZTg2YzlmMTVkMzExZTVhY2EwJyArXG4gICAgJ2EwMjA0NzhkOGYyMDg3NTNhZSc7XG4gIGNvbnN0IHAyd3NoID0gJzAwMjA5NWVjYWFjYjYwNmI5ZWNlMzgyMWMwMTExYzBhMTIwOGRkMWQzNTE5MjgwOWJmOGNmNmNiYWQ0YmJlYWNhNjdmJztcbiAgY29uc3QgcDJ0ciA9ICc1MTIwYTRjZTdkMTIyYmRjMDUyMjRiMjc0MTUyMjg3MjhlNWQ1YmY0ODU5NjFhMDc0OTNkMDY4ZGRiYjRkNDU2OTA1OSc7XG4gIGNvbnN0IHAydHJNdXNpZzIgPSAnNTEyMDdjZDc5Nzk5YTRjZjYxODNiMDE4YTI5OTYwZmZlODM1MWU5MGFmZGIyMzgzYjliOWRjZDNlYzA3OTI5YzcyZTMnO1xuXG4gIHNjcmlwdFR5cGVzMk9mMy5mb3JFYWNoKChzY3JpcHRUeXBlKSA9PiB7XG4gICAgaXQoYGNyZWF0ZXMgb3V0cHV0IHNjcmlwdCAodHlwZT0ke3NjcmlwdFR5cGV9KWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgc2NyaXB0UHViS2V5LCByZWRlZW1TY3JpcHQsIHdpdG5lc3NTY3JpcHQgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMocHVia2V5cywgc2NyaXB0VHlwZSk7XG5cbiAgICAgIHN3aXRjaCAoc2NyaXB0VHlwZSkge1xuICAgICAgICBjYXNlICdwMnNoJzpcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0UHViS2V5LnRvU3RyaW5nKCdoZXgnKSwgJ2E5MTQ5MTU5MGJlZDgxOThlYTdjYTU3YmE2OGFiN2NiZmFiYzY1NmNiYmFmODcnKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVkZWVtU2NyaXB0ICYmIHJlZGVlbVNjcmlwdC50b1N0cmluZygnaGV4JyksIHAybXMpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3aXRuZXNzU2NyaXB0LCB1bmRlZmluZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwMnNoUDJ3c2gnOlxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRQdWJLZXkudG9TdHJpbmcoJ2hleCcpLCAnYTkxNDAzMTJkZDZmODAxYWIxMWQ1M2MzNWY2YTJiZGFjOWM2MDJhNTVkOWQ4NycpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWRlZW1TY3JpcHQgJiYgcmVkZWVtU2NyaXB0LnRvU3RyaW5nKCdoZXgnKSwgcDJ3c2gpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3aXRuZXNzU2NyaXB0ICYmIHdpdG5lc3NTY3JpcHQudG9TdHJpbmcoJ2hleCcpLCBwMm1zKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncDJ3c2gnOlxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRQdWJLZXkudG9TdHJpbmcoJ2hleCcpLCBwMndzaCk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlZGVlbVNjcmlwdCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2l0bmVzc1NjcmlwdCAmJiB3aXRuZXNzU2NyaXB0LnRvU3RyaW5nKCdoZXgnKSwgcDJtcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3AydHInOlxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRQdWJLZXkudG9TdHJpbmcoJ2hleCcpLCBwMnRyKTtcbiAgICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBzY3JpcHQgY29udHJvbCBibG9ja3Mgb25jZSB0aGV5IGFyZSByZXR1cm5lZCBieSBwYXltZW50cy5wMnRyKClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncDJ0ck11c2lnMic6XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFB1YktleS50b1N0cmluZygnaGV4JyksIHAydHJNdXNpZzIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCB0eXBlICR7c2NyaXB0VHlwZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrJywgZnVuY3Rpb24gKCkge1xuICBpdCgnY3JlYXRlIG91dHB1dCBzY3JpcHQgcDJzaFAycGsnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5cGFpciA9IEVDUGFpci5mcm9tV0lGKCdjVEx4dzRLQzU1TFFmRmozZVp6NTFOcFdYMWoyamE0V2tiUUZiSGFUdWFSa1NGR2VKNHlTJywgbmV0d29ya3MudGVzdG5ldCk7XG4gICAgY29uc3QgeyBzY3JpcHRQdWJLZXksIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCB9ID0gY3JlYXRlT3V0cHV0U2NyaXB0UDJzaFAycGsoa2V5cGFpci5wdWJsaWNLZXkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRQdWJLZXkudG9TdHJpbmcoJ2hleCcpLCAnYTkxNDE3MmRjYzRlMDI1MzYxZDk1MWE5NTExYzY3MDk3M2E0ZTM3MjBjOTg4NycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIHJlZGVlbVNjcmlwdD8udG9TdHJpbmcoJ2hleCcpLFxuICAgICAgJzIxMDIxOWRhNDg0MTJjMjI2ODg2NWZlOGMxMjYzMjdkMWIxMmVlZTM1MGEzYjY5ZWIwOWUzMzIzY2M5YTExODI4OTQ1YWMnXG4gICAgKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2l0bmVzc1NjcmlwdCwgdW5kZWZpbmVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NyZWF0ZVBheW1lbnRQMnRyJywgKCkgPT4ge1xuICBjb25zdCBjb250cm9sQmxvY2tzID0gW1xuICAgICdjMWFhMzMwM2Q0ODg0N2Y0ZDU0YWEwMmE0ZmY5NzQ0OGYxZjQzMGIwN2VlY2Q2MzJjNDFmMzkwZTNmODQzMWExNjY0ODdkZjAyNGEwZWIzOGFlYjU2YjUyNjNjZjIyYzg0YTJjOWM3ZGFhZDlhOGU1NWNjZTJlM2NhYzg3YzUyYTBhJyxcbiAgICAnYzFhYTMzMDNkNDg4NDdmNGQ1NGFhMDJhNGZmOTc0NDhmMWY0MzBiMDdlZWNkNjMyYzQxZjM5MGUzZjg0MzFhMTY2MGE3NWY2MmRiNjc3YjljMTk3NDc0MTczNWFhNGIwYzJjODcxODc5NmM4MjU3OGI5NjBlMWZhMDk4NmQ0ZjI1Y2YwYjIxMjc2NjljMTJhZDc1YTA3OWMyNTUwMmE1NDU2NzY0ZGUyM2YzMGRmMWZjZGI4ODQxOGZlOTcwODM0ZDcnLFxuICAgICdjMWFhMzMwM2Q0ODg0N2Y0ZDU0YWEwMmE0ZmY5NzQ0OGYxZjQzMGIwN2VlY2Q2MzJjNDFmMzkwZTNmODQzMWExNjY5YzAzOTM2NmE5Y2U4OWFkMzBjOTkzNTI2OGExMDExMGNiMWE0YjYzNTdkY2MyYzY1MWU5ZGUzODYzOWMyMDZhZjBiMjEyNzY2OWMxMmFkNzVhMDc5YzI1NTAyYTU0NTY3NjRkZTIzZjMwZGYxZmNkYjg4NDE4ZmU5NzA4MzRkNycsXG4gIF07XG5cbiAgaXQoJ2FsbG93cyBubyByZWRlZW1JbmRleCcsICgpID0+IHtcbiAgICBjb25zdCBwMnRyID0gY3JlYXRlUGF5bWVudFAydHIocHVia2V5cyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHAydHIuY29udHJvbEJsb2NrLCB1bmRlZmluZWQpO1xuICB9KTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIGl0KGBjcmVhdGVzIGNvbnRyb2xCbG9jayBmb3IgcmVkZWVtSW5kZXggJHtpfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHAydHIgPSBjcmVhdGVQYXltZW50UDJ0cihwdWJrZXlzLCBpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwMnRyLmNvbnRyb2xCbG9jaz8udG9TdHJpbmcoJ2hleCcpLCBjb250cm9sQmxvY2tzW2ldKTtcbiAgICB9KTtcbiAgfVxufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!