PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-zeta/dist/test/unit
Просмотр файла: transaction.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 sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const encoding_1 = require("@cosmjs/encoding");
const should_1 = __importDefault(require("should"));
const abstract_cosmos_1 = require("@bitgo/abstract-cosmos");
const utils_1 = __importDefault(require("../../src/lib/utils"));
const testData = __importStar(require("../resources/zeta"));
describe('Zeta Transaction', () => {
let tx;
const config = statics_1.coins.get('tzeta');
beforeEach(() => {
tx = new abstract_cosmos_1.CosmosTransaction(config, utils_1.default);
});
describe('Empty transaction', () => {
it('should throw empty transaction', function () {
should_1.default.throws(() => tx.toBroadcastFormat(), 'Empty transaction');
});
});
describe('From raw transaction', () => {
it('should build a transfer from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
should_1.default.equal(json.sendMessages[0].value.toAddress, testData.TEST_SEND_TX.sendMessage.value.toAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_SEND_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_SEND_TX.sender,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tzeta',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tzeta',
},
]);
});
it('should build a transfer from raw signed hex', function () {
tx.enrichTransactionDetailsFromRawTransaction((0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.signedTxBase64)));
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
should_1.default.equal(json.sendMessages[0].value.toAddress, testData.TEST_SEND_TX.sendMessage.value.toAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_SEND_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_SEND_TX.sender,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tzeta',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
coin: 'tzeta',
},
]);
});
it('should build a delegate txn from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_DELEGATE_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_DELEGATE_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_DELEGATE_TX.gasBudget);
should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_DELEGATE_TX.pubKey);
should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_DELEGATE_TX.sendMessage.value.validatorAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_DELEGATE_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_DELEGATE_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingActivate);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_DELEGATE_TX.delegator,
value: testData.TEST_DELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tzeta',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_DELEGATE_TX.validator,
value: testData.TEST_DELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tzeta',
},
]);
});
it('should build a undelegate txn from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_UNDELEGATE_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_UNDELEGATE_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_UNDELEGATE_TX.gasBudget);
should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_UNDELEGATE_TX.pubKey);
should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_UNDELEGATE_TX.sendMessage.value.validatorAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_UNDELEGATE_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_UNDELEGATE_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingDeactivate);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_UNDELEGATE_TX.delegator,
value: testData.TEST_UNDELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tzeta',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_UNDELEGATE_TX.validator,
value: testData.TEST_UNDELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tzeta',
},
]);
});
it('should build a redelegate txn from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_REDELEGATE_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_REDELEGATE_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_REDELEGATE_TX.gasBudget);
should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_REDELEGATE_TX.pubKey);
should_1.default.equal(json.sendMessages[0].value.validatorSrcAddress, testData.TEST_REDELEGATE_TX.sendMessage.value.validatorSrcAddress);
should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_REDELEGATE_TX.sendMessage.value.amount);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_REDELEGATE_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingRedelegate);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_REDELEGATE_TX.delegator,
value: testData.TEST_REDELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tzeta',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_REDELEGATE_TX.validator,
value: testData.TEST_REDELEGATE_TX.sendMessage.value.amount.amount,
coin: 'tzeta',
},
]);
});
it('should build a withdraw rewards from raw signed base64', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_WITHDRAW_REWARDS_TX.signedTxBase64);
const json = tx.toJson();
should_1.default.equal(json.sequence, testData.TEST_WITHDRAW_REWARDS_TX.sequence);
should_1.default.deepEqual(json.gasBudget, testData.TEST_WITHDRAW_REWARDS_TX.gasBudget);
should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_WITHDRAW_REWARDS_TX.pubKey);
should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_WITHDRAW_REWARDS_TX.sendMessage.value.validatorAddress);
should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_WITHDRAW_REWARDS_TX.signature);
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingWithdraw);
tx.loadInputsAndOutputs();
should_1.default.deepEqual(tx.inputs, [
{
address: testData.TEST_WITHDRAW_REWARDS_TX.delegator,
value: 'UNAVAILABLE',
coin: 'tzeta',
},
]);
should_1.default.deepEqual(tx.outputs, [
{
address: testData.TEST_WITHDRAW_REWARDS_TX.validator,
value: 'UNAVAILABLE',
coin: 'tzeta',
},
]);
});
it('should fail to build a transfer from incorrect raw hex', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('random' + testData.TEST_SEND_TX.signedTxBase64), 'incorrect raw data');
});
it('should fail to explain transaction with invalid raw hex', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
});
});
describe('Explain transaction', () => {
it('should explain a transfer pay transaction', function () {
tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
const explainedTransaction = tx.explainTransaction();
explainedTransaction.should.deepEqual({
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
id: testData.TEST_SEND_TX.hash,
outputs: [
{
address: testData.TEST_SEND_TX.recipient,
amount: testData.TEST_SEND_TX.sendAmount,
},
],
outputAmount: testData.TEST_SEND_TX.sendAmount,
changeOutputs: [],
changeAmount: '0',
fee: { fee: testData.TEST_SEND_TX.feeAmount },
type: 0,
});
});
it('should fail to explain transaction with invalid raw base64 string', function () {
should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBeUQ7QUFDekQsNENBQXVDO0FBQ3ZDLCtDQUE4QztBQUM5QyxvREFBNEI7QUFFNUIsNERBTWdDO0FBQ2hDLGdFQUF3QztBQUN4Qyw0REFBOEM7QUFFOUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFJLEVBQXFCLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVsQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsRUFBRSxHQUFHLElBQUksbUNBQWlCLENBQUMsTUFBTSxFQUFFLGVBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEYsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFlBQVks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QVksQ0FBQyxVQUFVO2dCQUM5QyxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLEdBQUc7Z0JBQ2pCLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtnQkFDN0MsSUFBSSxFQUFFLENBQUM7YUFDUixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRUFBbUUsRUFBRTtZQUN0RSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsY0FBYyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUM1RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0hleCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCB9IGZyb20gJ0Bjb3NtanMvZW5jb2RpbmcnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQge1xuICBDb3Ntb3NUcmFuc2FjdGlvbixcbiAgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlLFxuICBSZWRlbGVnYXRlTWVzc2FnZSxcbiAgU2VuZE1lc3NhZ2UsXG4gIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UsXG59IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1jb3Ntb3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3pldGEnO1xuXG5kZXNjcmliZSgnWmV0YSBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgbGV0IHR4OiBDb3Ntb3NUcmFuc2FjdGlvbjtcbiAgY29uc3QgY29uZmlnID0gY29pbnMuZ2V0KCd0emV0YScpO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHR4ID0gbmV3IENvc21vc1RyYW5zYWN0aW9uKGNvbmZpZywgdXRpbHMpO1xuICB9KTtcblxuICBkZXNjcmliZSgnRW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlbXB0eSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGcm9tIHJhdyB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNmZXIgZnJvbSByYXcgc2lnbmVkIGJhc2U2NCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZXF1ZW5jZSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguZ2FzQnVkZ2V0KTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnB1YmxpY0tleSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0RGF0YS5URVNUX1NFTkRfVFgucHViS2V5KSkpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgU2VuZE1lc3NhZ2UpLnRvQWRkcmVzcyxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzc1xuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBTZW5kTWVzc2FnZSkuYW1vdW50LFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50XG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24uc2lnbmF0dXJlIGFzIGFueSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kZXIsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0emV0YScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3R6ZXRhJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGZyb20gcmF3IHNpZ25lZCBoZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odG9IZXgoZnJvbUJhc2U2NCh0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2lnbmVkVHhCYXNlNjQpKSk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlcXVlbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3REYXRhLlRFU1RfU0VORF9UWC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGpzb24ucHVibGljS2V5LCB0b0hleChmcm9tQmFzZTY0KHRlc3REYXRhLlRFU1RfU0VORF9UWC5wdWJLZXkpKSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBTZW5kTWVzc2FnZSkudG9BZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUudG9BZGRyZXNzXG4gICAgICApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFNlbmRNZXNzYWdlKS5hbW91bnQsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5zaWduYXR1cmUgYXMgYW55KS50b1N0cmluZygnYmFzZTY0JyksIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRlcixcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3R6ZXRhJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUudG9BZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndHpldGEnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZGVsZWdhdGUgdHhuIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5zZXF1ZW5jZSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5wdWJsaWNLZXkgYXMgYW55LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLnB1YktleSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5zaWduYXR1cmUgYXMgYW55KS50b1N0cmluZygnYmFzZTY0JyksIHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKTtcbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5kZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndHpldGEnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Lm91dHB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFgudmFsaWRhdG9yLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3R6ZXRhJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHVuZGVsZWdhdGUgdHhuIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5wdWJsaWNLZXkgYXMgYW55LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFgucHViS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSkudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnZhbGlkYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlKS5hbW91bnQsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5zaWduYXR1cmUgYXMgYW55KS50b1N0cmluZygnYmFzZTY0JyksIHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSk7XG4gICAgICB0eC5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5kZWxlZ2F0b3IsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnQuYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0emV0YScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnZhbGlkYXRvcixcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3R6ZXRhJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHJlZGVsZWdhdGUgdHhuIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9SRURFTEVHQVRFX1RYLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1JFREVMRUdBVEVfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9SRURFTEVHQVRFX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oanNvbi5wdWJsaWNLZXkgYXMgYW55LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX1JFREVMRUdBVEVfVFgucHViS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFJlZGVsZWdhdGVNZXNzYWdlKS52YWxpZGF0b3JTcmNBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1JFREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUudmFsaWRhdG9yU3JjQWRkcmVzc1xuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9SRURFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShqc29uLnNpZ25hdHVyZSBhcyBhbnkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9SRURFTEVHQVRFX1RYLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdSZWRlbGVnYXRlKTtcbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9SRURFTEVHQVRFX1RYLmRlbGVnYXRvcixcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9SRURFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3R6ZXRhJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1JFREVMRUdBVEVfVFgudmFsaWRhdG9yLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1JFREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndHpldGEnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgd2l0aGRyYXcgcmV3YXJkcyBmcm9tIHJhdyBzaWduZWQgYmFzZTY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnNlcXVlbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICBCdWZmZXIuZnJvbShqc29uLnB1YmxpY0tleSBhcyBhbnksICdoZXgnKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgIHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5wdWJLZXlcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlKS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1dJVEhEUkFXX1JFV0FSRFNfVFguc2VuZE1lc3NhZ2UudmFsdWUudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShqc29uLnNpZ25hdHVyZSBhcyBhbnkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG5cbiAgICAgIHR4LmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLmRlbGVnYXRvcixcbiAgICAgICAgICB2YWx1ZTogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICBjb2luOiAndHpldGEnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Lm91dHB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC52YWxpZGF0b3IsXG4gICAgICAgICAgdmFsdWU6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgICAgY29pbjogJ3R6ZXRhJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGEgdHJhbnNmZXIgZnJvbSBpbmNvcnJlY3QgcmF3IGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbigncmFuZG9tJyArIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduZWRUeEJhc2U2NCksXG4gICAgICAgICdpbmNvcnJlY3QgcmF3IGRhdGEnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHJhdyBoZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbigncmFuZG9tU3RyaW5nJyksICdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFeHBsYWluIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHBheSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHR4LmVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3R5cGUnXSxcbiAgICAgICAgaWQ6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5oYXNoLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnJlY2lwaWVudCxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRBbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZEFtb3VudCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBmZWU6IHsgZmVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguZmVlQW1vdW50IH0sXG4gICAgICAgIHR5cGU6IDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCByYXcgYmFzZTY0IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKCdyYW5kb21TdHJpbmcnKSwgJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!