PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/internal/tssUtils
Просмотр файла: bitgoMpcGpgPubKeys.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../../../src");
const openpgp = require("openpgp");
const nock = require("nock");
const assert = require("assert");
class TestEcdsaMpcv2Utils extends sdk_core_1.ECDSAUtils.EcdsaMPCv2Utils {
async testPickBitgoPubGpgKeyForSigning(isMpcv2, reqId, enterpriseId) {
return this.pickBitgoPubGpgKeyForSigning(isMpcv2, reqId, enterpriseId);
}
}
class TestEddsaMpcv1Utils extends sdk_core_1.EddsaUtils {
async testPickBitgoPubGpgKeyForSigning(isMpcv2, reqId, enterpriseId) {
return this.pickBitgoPubGpgKeyForSigning(isMpcv2, reqId, enterpriseId);
}
}
describe('TSS MPC Pick BitGo GPG Pub Key Utils:', function () {
const walletId = '5b34252f1bf349930e34020a00000000';
const enterpriseId = '6449153a6f6bc20006d66771cdbe15d3';
const ecdsaCoinName = 'hteth';
const eddsaCoinName = 'tsol';
const ecdsaWalletData = {
id: walletId,
enterprise: enterpriseId,
coin: ecdsaCoinName,
coinSpecific: {},
multisigType: 'tss',
keys: ['key1', 'key2', 'key3'],
};
const eddsaWalletData = {
id: walletId,
enterprise: enterpriseId,
coin: eddsaCoinName,
coinSpecific: {},
multisigType: 'tss',
keys: ['key1', 'key2', 'key3'],
};
const envs = ['test', 'staging', 'prod'];
const ecdsaMpcv2Utils = [];
const eddsaMpcv1Utils = [];
before(async function () {
nock.cleanAll();
for (const env of envs) {
const bitgoInstance = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env });
bitgoInstance.initializeTestVars();
let coinInstance = bitgoInstance.coin(ecdsaCoinName);
ecdsaMpcv2Utils.push(new TestEcdsaMpcv2Utils(bitgoInstance, coinInstance, new sdk_core_1.Wallet(bitgoInstance, coinInstance, ecdsaWalletData)));
coinInstance = bitgoInstance.coin(eddsaCoinName);
eddsaMpcv1Utils.push(new TestEddsaMpcv1Utils(bitgoInstance, coinInstance, new sdk_core_1.Wallet(bitgoInstance, coinInstance, eddsaWalletData)));
}
});
beforeEach(async function () {
for (const env of envs) {
const bgUrl = sdk_core_1.common.Environments[env].uri;
nock(bgUrl).get(`/api/v2/${ecdsaCoinName}/key/key3`).times(envs.length).reply(200, { hsmType: 'onprem' });
nock(bgUrl).get(`/api/v2/${eddsaCoinName}/key/key3`).times(envs.length).reply(200, { hsmType: 'nitro' });
}
});
envs.forEach(async function (env, index) {
it(`should pick correct Mpcv2 BitGo GPG Pub Key for ${env} env`, async function () {
const bitgoGpgPubKey = await ecdsaMpcv2Utils[index].testPickBitgoPubGpgKeyForSigning(true);
bitgoGpgPubKey
.armor()
.should.equal(sdk_core_1.BitgoMpcGpgPubKeys.bitgoMpcGpgPubKeys['mpcv2']['onprem'][env === 'staging' ? 'test' : env]);
});
});
envs.forEach(async function (env, index) {
it(`should pick correct Mpcv1 BitGo GPG Pub Key for ${env} env`, async function () {
const bitgoGpgPubKey = await eddsaMpcv1Utils[index].testPickBitgoPubGpgKeyForSigning(false);
bitgoGpgPubKey
.armor()
.should.equal(sdk_core_1.BitgoMpcGpgPubKeys.bitgoMpcGpgPubKeys['mpcv1']['nitro'][env === 'staging' ? 'test' : env]);
});
});
it(`should pick BitGo GPG Pub Key based on enterprise flag for mock env`, async function () {
const bgUrl = sdk_core_1.common.Environments['mock'].uri;
const testBitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock' });
const testCoin = testBitgo.coin(ecdsaCoinName);
const bitgoGPGKey = await openpgp.generateKey({
userIDs: [
{
name: 'bitgo',
email: 'bitgo@test.com',
},
],
});
nock(bgUrl)
.get(`/api/v2/${ecdsaCoinName}/tss/pubkey`)
.query({ enterpriseId })
.reply(200, { mpcv2PublicKey: bitgoGPGKey.publicKey });
const ecdsaMpcv2Util = new TestEcdsaMpcv2Utils(testBitgo, testCoin, new sdk_core_1.Wallet(testBitgo, testCoin, ecdsaWalletData));
const bitgoGpgPubKey = await ecdsaMpcv2Util.testPickBitgoPubGpgKeyForSigning(true, undefined, enterpriseId);
bitgoGpgPubKey.armor().should.equal(bitgoGPGKey.publicKey);
});
it(`should pick BitGo GPG Pub Key based on constants api for mock env if enterprise flag based fetch fails`, async function () {
nock.cleanAll();
const bgUrl = sdk_core_1.common.Environments['mock'].uri;
const testBitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock' });
const testCoin = testBitgo.coin(ecdsaCoinName);
const bitgoGPGKey = await openpgp.generateKey({
userIDs: [
{
name: 'bitgo',
email: 'bitgo@test.com',
},
],
});
const constants = {
mpc: {
bitgoMPCv2PublicKey: bitgoGPGKey.publicKey,
bitgoPublicKey: bitgoGPGKey.publicKey,
},
};
nock(bgUrl).get('/api/v1/client/constants').times(2).reply(200, { ttl: 3600, constants });
const ecdsaMpcv2Util = new TestEcdsaMpcv2Utils(testBitgo, testCoin, new sdk_core_1.Wallet(testBitgo, testCoin, ecdsaWalletData));
const bitgoGpgPubKey = await ecdsaMpcv2Util.testPickBitgoPubGpgKeyForSigning(true, undefined, enterpriseId);
bitgoGpgPubKey.armor().should.equal(bitgoGPGKey.publicKey);
});
it(`should throw an error if config is not available in one of test, staging, or prod`, async function () {
nock.cleanAll();
const testBitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'test' });
const testCoin = testBitgo.coin(ecdsaCoinName);
const ecdsaMpcv2Util = new TestEcdsaMpcv2Utils(testBitgo, testCoin, new sdk_core_1.Wallet(testBitgo, testCoin, ecdsaWalletData));
await assert.rejects(async () => await ecdsaMpcv2Util.testPickBitgoPubGpgKeyForSigning(true));
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29NcGNHcGdQdWJLZXlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2ludGVybmFsL3Rzc1V0aWxzL2JpdGdvTXBjR3BnUHViS2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhDQVF5QjtBQUN6Qiw4Q0FBNEM7QUFFNUMsNENBQTJDO0FBQzNDLG1DQUFtQztBQUNuQyw2QkFBOEI7QUFDOUIsaUNBQWtDO0FBRWxDLE1BQU0sbUJBQW9CLFNBQVEscUJBQVUsQ0FBQyxlQUFlO0lBQ25ELEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDM0MsT0FBZ0IsRUFDaEIsS0FBc0IsRUFDdEIsWUFBcUI7UUFFckIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLG1CQUFvQixTQUFRLHFCQUFVO0lBQ25DLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDM0MsT0FBZ0IsRUFDaEIsS0FBc0IsRUFDdEIsWUFBcUI7UUFFckIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0Y7QUFFRCxRQUFRLENBQUMsdUNBQXVDLEVBQUU7SUFDaEQsTUFBTSxRQUFRLEdBQUcsa0NBQWtDLENBQUM7SUFDcEQsTUFBTSxZQUFZLEdBQUcsa0NBQWtDLENBQUM7SUFDeEQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDO0lBQzlCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztJQUM3QixNQUFNLGVBQWUsR0FBRztRQUN0QixFQUFFLEVBQUUsUUFBUTtRQUNaLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLElBQUksRUFBRSxhQUFhO1FBQ25CLFlBQVksRUFBRSxFQUFFO1FBQ2hCLFlBQVksRUFBRSxLQUFLO1FBQ25CLElBQUksRUFBRSxDQUFD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Z29NcGNHcGdQdWJLZXlzLFxuICBjb21tb24sXG4gIEVDRFNBVXRpbHMsXG4gIEVkZHNhVXRpbHMsXG4gIEVudmlyb25tZW50TmFtZSxcbiAgSVJlcXVlc3RUcmFjZXIsXG4gIFdhbGxldCxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5cbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxuY2xhc3MgVGVzdEVjZHNhTXBjdjJVdGlscyBleHRlbmRzIEVDRFNBVXRpbHMuRWNkc2FNUEN2MlV0aWxzIHtcbiAgcHVibGljIGFzeW5jIHRlc3RQaWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKFxuICAgIGlzTXBjdjI6IGJvb2xlYW4sXG4gICAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcixcbiAgICBlbnRlcnByaXNlSWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxvcGVucGdwLktleT4ge1xuICAgIHJldHVybiB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcoaXNNcGN2MiwgcmVxSWQsIGVudGVycHJpc2VJZCk7XG4gIH1cbn1cblxuY2xhc3MgVGVzdEVkZHNhTXBjdjFVdGlscyBleHRlbmRzIEVkZHNhVXRpbHMge1xuICBwdWJsaWMgYXN5bmMgdGVzdFBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcoXG4gICAgaXNNcGN2MjogYm9vbGVhbixcbiAgICByZXFJZD86IElSZXF1ZXN0VHJhY2VyLFxuICAgIGVudGVycHJpc2VJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPG9wZW5wZ3AuS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhpc01wY3YyLCByZXFJZCwgZW50ZXJwcmlzZUlkKTtcbiAgfVxufVxuXG5kZXNjcmliZSgnVFNTIE1QQyBQaWNrIEJpdEdvIEdQRyBQdWIgS2V5IFV0aWxzOicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgd2FsbGV0SWQgPSAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnO1xuICBjb25zdCBlbnRlcnByaXNlSWQgPSAnNjQ0OTE1M2E2ZjZiYzIwMDA2ZDY2NzcxY2RiZTE1ZDMnO1xuICBjb25zdCBlY2RzYUNvaW5OYW1lID0gJ2h0ZXRoJztcbiAgY29uc3QgZWRkc2FDb2luTmFtZSA9ICd0c29sJztcbiAgY29uc3QgZWNkc2FXYWxsZXREYXRhID0ge1xuICAgIGlkOiB3YWxsZXRJZCxcbiAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlSWQsXG4gICAgY29pbjogZWNkc2FDb2luTmFtZSxcbiAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAga2V5czogWydrZXkxJywgJ2tleTInLCAna2V5MyddLFxuICB9O1xuICBjb25zdCBlZGRzYVdhbGxldERhdGEgPSB7XG4gICAgaWQ6IHdhbGxldElkLFxuICAgIGVudGVycHJpc2U6IGVudGVycHJpc2VJZCxcbiAgICBjb2luOiBlZGRzYUNvaW5OYW1lLFxuICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICBrZXlzOiBbJ2tleTEnLCAna2V5MicsICdrZXkzJ10sXG4gIH07XG4gIGNvbnN0IGVudnM6IEVudmlyb25tZW50TmFtZVtdID0gWyd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZCddO1xuICBjb25zdCBlY2RzYU1wY3YyVXRpbHM6IFRlc3RFY2RzYU1wY3YyVXRpbHNbXSA9IFtdO1xuICBjb25zdCBlZGRzYU1wY3YxVXRpbHM6IFRlc3RFZGRzYU1wY3YxVXRpbHNbXSA9IFtdO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIGZvciAoY29uc3QgZW52IG9mIGVudnMpIHtcbiAgICAgIGNvbnN0IGJpdGdvSW5zdGFuY2UgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52IH0pO1xuICAgICAgYml0Z29JbnN0YW5jZS5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICAgIGxldCBjb2luSW5zdGFuY2UgPSBiaXRnb0luc3RhbmNlLmNvaW4oZWNkc2FDb2luTmFtZSk7XG4gICAgICBlY2RzYU1wY3YyVXRpbHMucHVzaChcbiAgICAgICAgbmV3IFRlc3RFY2RzYU1wY3YyVXRpbHMoYml0Z29JbnN0YW5jZSwgY29pbkluc3RhbmNlLCBuZXcgV2FsbGV0KGJpdGdvSW5zdGFuY2UsIGNvaW5JbnN0YW5jZSwgZWNkc2FXYWxsZXREYXRhKSlcbiAgICAgICk7XG4gICAgICBjb2luSW5zdGFuY2UgPSBiaXRnb0luc3RhbmNlLmNvaW4oZWRkc2FDb2luTmFtZSk7XG4gICAgICBlZGRzYU1wY3YxVXRpbHMucHVzaChcbiAgICAgICAgbmV3IFRlc3RFZGRzYU1wY3YxVXRpbHMoYml0Z29JbnN0YW5jZSwgY29pbkluc3RhbmNlLCBuZXcgV2FsbGV0KGJpdGdvSW5zdGFuY2UsIGNvaW5JbnN0YW5jZSwgZWRkc2FXYWxsZXREYXRhKSlcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICBiZWZvcmVFYWNoKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKGNvbnN0IGVudiBvZiBlbnZzKSB7XG4gICAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmk7XG4gICAgICBub2NrKGJnVXJsKS5nZXQoYC9hcGkvdjIvJHtlY2RzYUNvaW5OYW1lfS9rZXkva2V5M2ApLnRpbWVzKGVudnMubGVuZ3RoKS5yZXBseSgyMDAsIHsgaHNtVHlwZTogJ29ucHJlbScgfSk7XG4gICAgICBub2NrKGJnVXJsKS5nZXQoYC9hcGkvdjIvJHtlZGRzYUNvaW5OYW1lfS9rZXkva2V5M2ApLnRpbWVzKGVudnMubGVuZ3RoKS5yZXBseSgyMDAsIHsgaHNtVHlwZTogJ25pdHJvJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGVudnMuZm9yRWFjaChhc3luYyBmdW5jdGlvbiAoZW52LCBpbmRleCkge1xuICAgIGl0KGBzaG91bGQgcGljayBjb3JyZWN0IE1wY3YyIEJpdEdvIEdQRyBQdWIgS2V5IGZvciAke2Vudn0gZW52YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z29HcGdQdWJLZXkgPSBhd2FpdCBlY2RzYU1wY3YyVXRpbHNbaW5kZXhdLnRlc3RQaWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUpO1xuICAgICAgYml0Z29HcGdQdWJLZXlcbiAgICAgICAgLmFybW9yKClcbiAgICAgICAgLnNob3VsZC5lcXVhbChCaXRnb01wY0dwZ1B1YktleXMuYml0Z29NcGNHcGdQdWJLZXlzWydtcGN2MiddWydvbnByZW0nXVtlbnYgPT09ICdzdGFnaW5nJyA/ICd0ZXN0JyA6IGVudl0pO1xuICAgIH0pO1xuICB9KTtcblxuICBlbnZzLmZvckVhY2goYXN5bmMgZnVuY3Rpb24gKGVudiwgaW5kZXgpIHtcbiAgICBpdChgc2hvdWxkIHBpY2sgY29ycmVjdCBNcGN2MSBCaXRHbyBHUEcgUHViIEtleSBmb3IgJHtlbnZ9IGVudmAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvR3BnUHViS2V5ID0gYXdhaXQgZWRkc2FNcGN2MVV0aWxzW2luZGV4XS50ZXN0UGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhmYWxzZSk7XG4gICAgICBiaXRnb0dwZ1B1YktleVxuICAgICAgICAuYXJtb3IoKVxuICAgICAgICAuc2hvdWxkLmVxdWFsKEJpdGdvTXBjR3BnUHViS2V5cy5iaXRnb01wY0dwZ1B1YktleXNbJ21wY3YxJ11bJ25pdHJvJ11bZW52ID09PSAnc3RhZ2luZycgPyAndGVzdCcgOiBlbnZdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoYHNob3VsZCBwaWNrIEJpdEdvIEdQRyBQdWIgS2V5IGJhc2VkIG9uIGVudGVycHJpc2UgZmxhZyBmb3IgbW9jayBlbnZgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzWydtb2NrJ10udXJpO1xuICAgIGNvbnN0IHRlc3RCaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBjb25zdCB0ZXN0Q29pbiA9IHRlc3RCaXRnby5jb2luKGVjZHNhQ29pbk5hbWUpO1xuICAgIGNvbnN0IGJpdGdvR1BHS2V5ID0gYXdhaXQgb3BlbnBncC5nZW5lcmF0ZUtleSh7XG4gICAgICB1c2VySURzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnYml0Z28nLFxuICAgICAgICAgIGVtYWlsOiAnYml0Z29AdGVzdC5jb20nLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBub2NrKGJnVXJsKVxuICAgICAgLmdldChgL2FwaS92Mi8ke2VjZHNhQ29pbk5hbWV9L3Rzcy9wdWJrZXlgKVxuICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZUlkIH0pXG4gICAgICAucmVwbHkoMjAwLCB7IG1wY3YyUHVibGljS2V5OiBiaXRnb0dQR0tleS5wdWJsaWNLZXkgfSk7XG4gICAgY29uc3QgZWNkc2FNcGN2MlV0aWwgPSBuZXcgVGVzdEVjZHNhTXBjdjJVdGlscyhcbiAgICAgIHRlc3RCaXRnbyxcbiAgICAgIHRlc3RDb2luLFxuICAgICAgbmV3IFdhbGxldCh0ZXN0Qml0Z28sIHRlc3RDb2luLCBlY2RzYVdhbGxldERhdGEpXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleSA9IGF3YWl0IGVjZHNhTXBjdjJVdGlsLnRlc3RQaWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUsIHVuZGVmaW5lZCwgZW50ZXJwcmlzZUlkKTtcbiAgICBiaXRnb0dwZ1B1YktleS5hcm1vcigpLnNob3VsZC5lcXVhbChiaXRnb0dQR0tleS5wdWJsaWNLZXkpO1xuICB9KTtcblxuICBpdChgc2hvdWxkIHBpY2sgQml0R28gR1BHIFB1YiBLZXkgYmFzZWQgb24gY29uc3RhbnRzIGFwaSBmb3IgbW9jayBlbnYgaWYgZW50ZXJwcmlzZSBmbGFnIGJhc2VkIGZldGNoIGZhaWxzYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbJ21vY2snXS51cmk7XG4gICAgY29uc3QgdGVzdEJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGNvbnN0IHRlc3RDb2luID0gdGVzdEJpdGdvLmNvaW4oZWNkc2FDb2luTmFtZSk7XG4gICAgY29uc3QgYml0Z29HUEdLZXkgPSBhd2FpdCBvcGVucGdwLmdlbmVyYXRlS2V5KHtcbiAgICAgIHVzZXJJRHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdiaXRnbycsXG4gICAgICAgICAgZW1haWw6ICdiaXRnb0B0ZXN0LmNvbScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnN0YW50cyA9IHtcbiAgICAgIG1wYzoge1xuICAgICAgICBiaXRnb01QQ3YyUHVibGljS2V5OiBiaXRnb0dQR0tleS5wdWJsaWNLZXksXG4gICAgICAgIGJpdGdvUHVibGljS2V5OiBiaXRnb0dQR0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgIH07XG4gICAgbm9jayhiZ1VybCkuZ2V0KCcvYXBpL3YxL2NsaWVudC9jb25zdGFudHMnKS50aW1lcygyKS5yZXBseSgyMDAsIHsgdHRsOiAzNjAwLCBjb25zdGFudHMgfSk7XG4gICAgY29uc3QgZWNkc2FNcGN2MlV0aWwgPSBuZXcgVGVzdEVjZHNhTXBjdjJVdGlscyhcbiAgICAgIHRlc3RCaXRnbyxcbiAgICAgIHRlc3RDb2luLFxuICAgICAgbmV3IFdhbGxldCh0ZXN0Qml0Z28sIHRlc3RDb2luLCBlY2RzYVdhbGxldERhdGEpXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleSA9IGF3YWl0IGVjZHNhTXBjdjJVdGlsLnRlc3RQaWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUsIHVuZGVmaW5lZCwgZW50ZXJwcmlzZUlkKTtcbiAgICBiaXRnb0dwZ1B1YktleS5hcm1vcigpLnNob3VsZC5lcXVhbChiaXRnb0dQR0tleS5wdWJsaWNLZXkpO1xuICB9KTtcblxuICBpdChgc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIGNvbmZpZyBpcyBub3QgYXZhaWxhYmxlIGluIG9uZSBvZiB0ZXN0LCBzdGFnaW5nLCBvciBwcm9kYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICBjb25zdCB0ZXN0Qml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAndGVzdCcgfSk7XG4gICAgY29uc3QgdGVzdENvaW4gPSB0ZXN0Qml0Z28uY29pbihlY2RzYUNvaW5OYW1lKTtcbiAgICBjb25zdCBlY2RzYU1wY3YyVXRpbCA9IG5ldyBUZXN0RWNkc2FNcGN2MlV0aWxzKFxuICAgICAgdGVzdEJpdGdvLFxuICAgICAgdGVzdENvaW4sXG4gICAgICBuZXcgV2FsbGV0KHRlc3RCaXRnbywgdGVzdENvaW4sIGVjZHNhV2FsbGV0RGF0YSlcbiAgICApO1xuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGVjZHNhTXBjdjJVdGlsLnRlc3RQaWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKHRydWUpKTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!