PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests/apis/evm
Просмотр файла: api.test.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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const jest_mock_axios_1 = __importDefault(require("jest-mock-axios"));
const src_1 = require("src");
const api_1 = require("../../../src/apis/evm/api");
const bintools_1 = __importDefault(require("../../../src/utils/bintools"));
const bech32 = __importStar(require("bech32"));
const constants_1 = require("../../../src/utils/constants");
/**
* @ignore
*/
const bintools = bintools_1.default.getInstance();
describe("EVMAPI", () => {
const networkID = 1337;
const blockchainID = constants_1.Defaults.network[networkID].C.blockchainID;
const ip = "127.0.0.1";
const port = 9650;
const protocol = "https";
const username = "AvaLabs";
const password = "password";
const avalanche = new src_1.Avalanche(ip, port, protocol, networkID, undefined, undefined, undefined, true);
let api;
const addrA = "C-" +
bech32.bech32.encode(avalanche.getHRP(), bech32.bech32.toWords(bintools.cb58Decode("B6D4v1VtPYLbiUvYXtW4Px8oE9imC2vGW")));
const addrC = "C-" +
bech32.bech32.encode(avalanche.getHRP(), bech32.bech32.toWords(bintools.cb58Decode("6Y3kysjF9jnHnYkdS9yGAuoHyae2eNmeV")));
beforeAll(() => {
api = new api_1.EVMAPI(avalanche, "/ext/bc/C/avax", blockchainID);
});
afterEach(() => {
jest_mock_axios_1.default.reset();
});
test("importKey", () => __awaiter(void 0, void 0, void 0, function* () {
const address = addrC;
const result = api.importKey(username, password, "key");
const payload = {
result: {
address
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(address);
}));
test("fail to import because no user created", () => __awaiter(void 0, void 0, void 0, function* () {
const badUserName = "zzzzzzzzzzzzzz";
const message = `problem retrieving data: rpc error: code = Unknown desc = incorrect password for user "${badUserName}`;
const result = api.importKey(badUserName, password, "key");
const payload = {
result: {
code: -32000,
message,
data: null
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["code"]).toBe(-32000);
expect(response["message"]).toBe(message);
}));
test("exportKey", () => __awaiter(void 0, void 0, void 0, function* () {
const key = "PrivateKey-ewoqjP7PxY4yr3iLTpLisriqt94hdyDFNgchSxGGztUrTXtNN";
const privateKeyHex = "0x56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027";
const object = { privateKey: key, privateKeyHex };
const result = api.exportKey(username, password, addrA);
const payload = {
result: {
privateKey: key,
privateKeyHex
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toEqual(object);
}));
test("exportAVAX", () => __awaiter(void 0, void 0, void 0, function* () {
let amount = new src_1.BN(100);
let to = "abcdef";
let username = "Robert";
let password = "Paulson";
let txID = "valid";
let result = api.exportAVAX(username, password, to, amount);
let payload = {
result: {
txID: txID
}
};
let responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
let response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(txID);
}));
test("export", () => __awaiter(void 0, void 0, void 0, function* () {
let amount = new src_1.BN(100);
let to = "abcdef";
let assetID = "2fombhL7aGPwj3KH4bfrmJwW6PVnMobf9Y2fn9GwxiAAJyFDbe";
let username = "Robert";
let password = "Paulson";
let txID = "valid";
let result = api.export(username, password, to, amount, assetID);
let payload = {
result: {
txID: txID
}
};
let responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
let response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(txID);
}));
test("importAVAX", () => __awaiter(void 0, void 0, void 0, function* () {
let to = "abcdef";
let username = "Robert";
let password = "Paulson";
let txID = "valid";
let result = api.importAVAX(username, password, to, blockchainID);
let payload = {
result: {
txID: txID
}
};
let responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
let response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(txID);
}));
test("import", () => __awaiter(void 0, void 0, void 0, function* () {
let to = "abcdef";
let username = "Robert";
let password = "Paulson";
let txID = "valid";
let result = api.import(username, password, to, blockchainID);
let payload = {
result: {
txID: txID
}
};
let responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
let response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(txID);
}));
test("refreshBlockchainID", () => __awaiter(void 0, void 0, void 0, function* () {
const n5bcID = constants_1.Defaults.network[5].C["blockchainID"];
const n1337bcID = constants_1.Defaults.network[1337].C["blockchainID"];
const testAPI = new api_1.EVMAPI(avalanche, "/ext/bc/C/avax", n5bcID);
const bc1 = testAPI.getBlockchainID();
expect(bc1).toBe(n5bcID);
let res = testAPI.refreshBlockchainID();
expect(res).toBeTruthy();
const bc2 = testAPI.getBlockchainID();
expect(bc2).toBe(n1337bcID);
res = testAPI.refreshBlockchainID(n5bcID);
expect(res).toBeTruthy();
const bc3 = testAPI.getBlockchainID();
expect(bc3).toBe(n5bcID);
}));
test("getAssetBalance", () => __awaiter(void 0, void 0, void 0, function* () {
const address = "0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC";
const hexStr = "0x0";
const blockHeight = hexStr;
const assetID = "FCry2Z1Su9KZqK1XRMhxQS6XuPorxDm3C3RBT7hw32ojiqyvP";
const result = api.getAssetBalance(address, blockHeight, assetID);
const payload = {
result: hexStr
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["result"]).toBe(hexStr);
}));
test("getAssetBalance with bad assetID", () => __awaiter(void 0, void 0, void 0, function* () {
const address = "0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC";
const hexStr = "0x0";
const blockHeight = hexStr;
const assetID = "aaa";
const message = "invalid argument 2: couldn't decode ID to bytes: input string is smaller than the checksum size";
const result = api.getAssetBalance(address, blockHeight, assetID);
const payload = {
result: {
code: -32602,
message
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response["result"]["code"]).toBe(-32602);
expect(response["result"]["message"]).toBe(message);
}));
test("getAtomicTxStatus", () => __awaiter(void 0, void 0, void 0, function* () {
const txID = "FCry2Z1Su9KZqK1XRMhxQS6XuPorxDm3C3RBT7hw32ojiqyvP";
const result = api.getAtomicTxStatus(txID);
const payload = {
result: {
status: "Accepted"
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe("Accepted");
}));
test("getBaseFee", () => __awaiter(void 0, void 0, void 0, function* () {
const result = api.getBaseFee();
const payload = {
result: "0x34630b8a00"
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe("0x34630b8a00");
}));
test("getMaxPriorityFeePerGas", () => __awaiter(void 0, void 0, void 0, function* () {
const result = api.getMaxPriorityFeePerGas();
const payload = {
result: "0x2540be400"
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe("0x2540be400");
}));
test("getAtomicTx", () => __awaiter(void 0, void 0, void 0, function* () {
const txID = "FCry2Z1Su9KZqK1XRMhxQS6XuPorxDm3C3RBT7hw32ojiqyvP";
const tx = "111119TRhWSj932BnTyhskYtn4j7dY9Nqq8wi3mmmFvHvDEoAfifMnRcUuTFqRxhsqWyXMTHmFBcSrMS6u9F6LRA1G3DmKWoA3Yb27JbhUV7ismLkiEsWJ187q2AwgE2RCVG7eZ9zL89ZBmaVA1bkzsx324LjU9NiYgkceJxm5d3L9ATiLgWt4mWMDR4YKpSv4qKqjfD2fRzYm7gX2C2F1auCvVN6Hd15J3jRUB7vKEEcBZJexdYdqnCX7vFdwoGpJM7tUiFRDgAAPpMoxz6QF7gwKbkkXK5Vg4LG2szScX9qL5BegNwUeNQYB42kF3M3w5tnVekhmHQdZSEYU8NjSnSZnqAFPcHc4StM3yZem3MTFRYJqNc7RAvoMGi8am3Hx4GVpwYqjiqev3XiqfyuTssn4bR1XaJbjQTyC";
const result = api.getAtomicTx(txID);
const payload = {
result: {
tx,
encoding: "hex",
blockHeight: 8
}
};
const responseObj = {
data: payload
};
jest_mock_axios_1.default.mockResponse(responseObj);
const response = yield result;
expect(jest_mock_axios_1.default.request).toHaveBeenCalledTimes(1);
expect(response).toBe(tx);
}));
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0cy9hcGlzL2V2bS9hcGkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0VBQXVDO0FBQ3ZDLDZCQUFtQztBQUNuQyxtREFBa0Q7QUFDbEQsMkVBQWtEO0FBQ2xELCtDQUFnQztBQUNoQyw0REFBdUQ7QUFHdkQ7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBYSxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBRWpELFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBUyxFQUFFO0lBQzVCLE1BQU0sU0FBUyxHQUFXLElBQUksQ0FBQTtJQUM5QixNQUFNLFlBQVksR0FBVyxvQkFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFBO0lBQ3ZFLE1BQU0sRUFBRSxHQUFXLFdBQVcsQ0FBQTtJQUM5QixNQUFNLElBQUksR0FBVyxJQUFJLENBQUE7SUFDekIsTUFBTSxRQUFRLEdBQVcsT0FBTyxDQUFBO0lBQ2hDLE1BQU0sUUFBUSxHQUFXLFNBQVMsQ0FBQTtJQUNsQyxNQUFNLFFBQVEsR0FBVyxVQUFVLENBQUE7SUFFbkMsTUFBTSxTQUFTLEdBQWMsSUFBSSxlQUFTLENBQ3hDLEVBQUUsRUFDRixJQUFJLEVBQ0osUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLENBQ0wsQ0FBQTtJQUNELElBQUksR0FBVyxDQUFBO0lBRWYsTUFBTSxLQUFLLEdBQ1QsSUFBSTtRQUNKLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUNsQixTQUFTLENBQUMsTUFBTSxFQUFFLEVBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQixRQUFRLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUFDLENBQ3pELENBQ0Ys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LGFBQWEsQ0FBQyxDQUFBO0lBQ3RDLENBQUMsQ0FBQSxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsYUFBYSxFQUFFLEdBQXdCLEVBQUU7UUFDNUMsTUFBTSxJQUFJLEdBQVcsbURBQW1ELENBQUE7UUFDeEUsTUFBTSxFQUFFLEdBQ04sd2FBQXdhLENBQUE7UUFFMWEsTUFBTSxNQUFNLEdBQW9CLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckQsTUFBTSxPQUFPLEdBQVc7WUFDdEIsTUFBTSxFQUFFO2dCQUNOLEVBQUU7Z0JBQ0YsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsV0FBVyxFQUFFLENBQUM7YUFDZjtTQUNGLENBQUE7UUFDRCxNQUFNLFdBQVcsR0FBaUI7WUFDaEMsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFBO1FBRUQseUJBQVMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDbkMsTUFBTSxRQUFRLEdBQVcsTUFBTSxNQUFNLENBQUE7UUFFckMsTUFBTSxDQUFDLHlCQUFTLENBQUMsT0FBTyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMzQixDQUFDLENBQUEsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9ja0F4aW9zIGZyb20gXCJqZXN0LW1vY2stYXhpb3NcIlxuaW1wb3J0IHsgQXZhbGFuY2hlLCBCTiB9IGZyb20gXCJzcmNcIlxuaW1wb3J0IHsgRVZNQVBJIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL2V2bS9hcGlcIlxuaW1wb3J0IEJpblRvb2xzIGZyb20gXCIuLi8uLi8uLi9zcmMvdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0ICogYXMgYmVjaDMyIGZyb20gXCJiZWNoMzJcIlxuaW1wb3J0IHsgRGVmYXVsdHMgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3V0aWxzL2NvbnN0YW50c1wiXG5pbXBvcnQgeyBIdHRwUmVzcG9uc2UgfSBmcm9tIFwiamVzdC1tb2NrLWF4aW9zL2Rpc3QvbGliL21vY2stYXhpb3MtdHlwZXNcIlxuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHM6IEJpblRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKVxuXG5kZXNjcmliZShcIkVWTUFQSVwiLCAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IG5ldHdvcmtJRDogbnVtYmVyID0gMTMzN1xuICBjb25zdCBibG9ja2NoYWluSUQ6IHN0cmluZyA9IERlZmF1bHRzLm5ldHdvcmtbbmV0d29ya0lEXS5DLmJsb2NrY2hhaW5JRFxuICBjb25zdCBpcDogc3RyaW5nID0gXCIxMjcuMC4wLjFcIlxuICBjb25zdCBwb3J0OiBudW1iZXIgPSA5NjUwXG4gIGNvbnN0IHByb3RvY29sOiBzdHJpbmcgPSBcImh0dHBzXCJcbiAgY29uc3QgdXNlcm5hbWU6IHN0cmluZyA9IFwiQXZhTGFic1wiXG4gIGNvbnN0IHBhc3N3b3JkOiBzdHJpbmcgPSBcInBhc3N3b3JkXCJcblxuICBjb25zdCBhdmFsYW5jaGU6IEF2YWxhbmNoZSA9IG5ldyBBdmFsYW5jaGUoXG4gICAgaXAsXG4gICAgcG9ydCxcbiAgICBwcm90b2NvbCxcbiAgICBuZXR3b3JrSUQsXG4gICAgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCxcbiAgICB1bmRlZmluZWQsXG4gICAgdHJ1ZVxuICApXG4gIGxldCBhcGk6IEVWTUFQSVxuXG4gIGNvbnN0IGFkZHJBOiBzdHJpbmcgPVxuICAgIFwiQy1cIiArXG4gICAgYmVjaDMyLmJlY2gzMi5lbmNvZGUoXG4gICAgICBhdmFsYW5jaGUuZ2V0SFJQKCksXG4gICAgICBiZWNoMzIuYmVjaDMyLnRvV29yZHMoXG4gICAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoXCJCNkQ0djFWdFBZTGJpVXZZWHRXNFB4OG9FOWltQzJ2R1dcIilcbiAgICAgIClcbiAgICApXG4gIGNvbnN0IGFkZHJDOiBzdHJpbmcgPVxuICAgIFwiQy1cIiArXG4gICAgYmVjaDMyLmJlY2gzMi5lbmNvZGUoXG4gICAgICBhdmFsYW5jaGUuZ2V0SFJQKCksXG4gICAgICBiZWNoMzIuYmVjaDMyLnRvV29yZHMoXG4gICAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoXCI2WTNreXNqRjlqbkhuWWtkUzl5R0F1b0h5YWUyZU5tZVZcIilcbiAgICAgIClcbiAgICApXG5cbiAgYmVmb3JlQWxsKCgpOiB2b2lkID0+IHtcbiAgICBhcGkgPSBuZXcgRVZNQVBJKGF2YWxhbmNoZSwgXCIvZXh0L2JjL0MvYXZheFwiLCBibG9ja2NoYWluSUQpXG4gIH0pXG5cbiAgYWZ0ZXJFYWNoKCgpOiB2b2lkID0+IHtcbiAgICBtb2NrQXhpb3MucmVzZXQoKVxuICB9KVxuXG4gIHRlc3QoXCJpbXBvcnRLZXlcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGFkZHJlc3M6IHN0cmluZyA9IGFkZHJDXG5cbiAgICBjb25zdCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5pbXBvcnRLZXkodXNlcm5hbWUsIHBhc3N3b3JkLCBcImtleVwiKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBhZGRyZXNzXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZShhZGRyZXNzKVxuICB9KVxuXG4gIHRlc3QoXCJmYWlsIHRvIGltcG9ydCBiZWNhdXNlIG5vIHVzZXIgY3JlYXRlZFwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgYmFkVXNlck5hbWUgPSBcInp6enp6enp6enp6enp6XCJcbiAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBgcHJvYmxlbSByZXRyaWV2aW5nIGRhdGE6IHJwYyBlcnJvcjogY29kZSA9IFVua25vd24gZGVzYyA9IGluY29ycmVjdCBwYXNzd29yZCBmb3IgdXNlciBcIiR7YmFkVXNlck5hbWV9YFxuXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZz4gPSBhcGkuaW1wb3J0S2V5KGJhZFVzZXJOYW1lLCBwYXNzd29yZCwgXCJrZXlcIilcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgY29kZTogLTMyMDAwLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBkYXRhOiBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZVtcImNvZGVcIl0pLnRvQmUoLTMyMDAwKVxuICAgIGV4cGVjdChyZXNwb25zZVtcIm1lc3NhZ2VcIl0pLnRvQmUobWVzc2FnZSlcbiAgfSlcblxuICB0ZXN0KFwiZXhwb3J0S2V5XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBrZXk6IHN0cmluZyA9XG4gICAgICBcIlByaXZhdGVLZXktZXdvcWpQN1B4WTR5cjNpTFRwTGlzcmlxdDk0aGR5REZOZ2NoU3hHR3p0VXJUWHROTlwiXG4gICAgY29uc3QgcHJpdmF0ZUtleUhleDogc3RyaW5nID1cbiAgICAgIFwiMHg1NjI4OWU5OWM5NGI2OTEyYmZjMTJhZGMwOTNjOWI1MTEyNGYwZGM1NGFjN2E3NjZiMmJjNWNjZjU1OGQ4MDI3XCJcbiAgICBjb25zdCBvYmplY3Q6IG9iamVjdCA9IHsgcHJpdmF0ZUtleToga2V5LCBwcml2YXRlS2V5SGV4IH1cblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLmV4cG9ydEtleSh1c2VybmFtZSwgcGFzc3dvcmQsIGFkZHJBKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBwcml2YXRlS2V5OiBrZXksXG4gICAgICAgIHByaXZhdGVLZXlIZXhcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBvYmplY3QgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlKS50b0VxdWFsKG9iamVjdClcbiAgfSlcblxuICB0ZXN0KFwiZXhwb3J0QVZBWFwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgbGV0IGFtb3VudDogQk4gPSBuZXcgQk4oMTAwKVxuICAgIGxldCB0bzogc3RyaW5nID0gXCJhYmNkZWZcIlxuICAgIGxldCB1c2VybmFtZTogc3RyaW5nID0gXCJSb2JlcnRcIlxuICAgIGxldCBwYXNzd29yZDogc3RyaW5nID0gXCJQYXVsc29uXCJcbiAgICBsZXQgdHhJRDogc3RyaW5nID0gXCJ2YWxpZFwiXG4gICAgbGV0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXBpLmV4cG9ydEFWQVgodXNlcm5hbWUsIHBhc3N3b3JkLCB0bywgYW1vdW50KVxuICAgIGxldCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgdHhJRDogdHhJRFxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmVzcG9uc2VPYmogPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBsZXQgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHhJRClcbiAgfSlcblxuICB0ZXN0KFwiZXhwb3J0XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBsZXQgYW1vdW50OiBCTiA9IG5ldyBCTigxMDApXG4gICAgbGV0IHRvOiBzdHJpbmcgPSBcImFiY2RlZlwiXG4gICAgbGV0IGFzc2V0SUQ6IHN0cmluZyA9IFwiMmZvbWJoTDdhR1B3ajNLSDRiZnJtSndXNlBWbk1vYmY5WTJmbjlHd3hpQUFKeUZEYmVcIlxuICAgIGxldCB1c2VybmFtZTogc3RyaW5nID0gXCJSb2JlcnRcIlxuICAgIGxldCBwYXNzd29yZDogc3RyaW5nID0gXCJQYXVsc29uXCJcbiAgICBsZXQgdHhJRDogc3RyaW5nID0gXCJ2YWxpZFwiXG4gICAgbGV0IHJlc3VsdDogUHJvbWlzZTxzdHJpbmc+ID0gYXBpLmV4cG9ydChcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICB0byxcbiAgICAgIGFtb3VudCxcbiAgICAgIGFzc2V0SURcbiAgICApXG4gICAgbGV0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICB0eElEOiB0eElEXG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXNwb25zZU9iaiA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGxldCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZSh0eElEKVxuICB9KVxuXG4gIHRlc3QoXCJpbXBvcnRBVkFYXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBsZXQgdG86IHN0cmluZyA9IFwiYWJjZGVmXCJcbiAgICBsZXQgdXNlcm5hbWU6IHN0cmluZyA9IFwiUm9iZXJ0XCJcbiAgICBsZXQgcGFzc3dvcmQ6IHN0cmluZyA9IFwiUGF1bHNvblwiXG4gICAgbGV0IHR4SUQ6IHN0cmluZyA9IFwidmFsaWRcIlxuICAgIGxldCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5pbXBvcnRBVkFYKFxuICAgICAgdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHRvLFxuICAgICAgYmxvY2tjaGFpbklEXG4gICAgKVxuICAgIGxldCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgdHhJRDogdHhJRFxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmVzcG9uc2VPYmogPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBsZXQgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHhJRClcbiAgfSlcblxuICB0ZXN0KFwiaW1wb3J0XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBsZXQgdG86IHN0cmluZyA9IFwiYWJjZGVmXCJcbiAgICBsZXQgdXNlcm5hbWU6IHN0cmluZyA9IFwiUm9iZXJ0XCJcbiAgICBsZXQgcGFzc3dvcmQ6IHN0cmluZyA9IFwiUGF1bHNvblwiXG4gICAgbGV0IHR4SUQ6IHN0cmluZyA9IFwidmFsaWRcIlxuICAgIGxldCByZXN1bHQ6IFByb21pc2U8c3RyaW5nPiA9IGFwaS5pbXBvcnQoXG4gICAgICB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgdG8sXG4gICAgICBibG9ja2NoYWluSURcbiAgICApXG4gICAgbGV0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICB0eElEOiB0eElEXG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXNwb25zZU9iaiA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGxldCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZSh0eElEKVxuICB9KVxuXG4gIHRlc3QoXCJyZWZyZXNoQmxvY2tjaGFpbklEXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBuNWJjSUQ6IHN0cmluZyA9IERlZmF1bHRzLm5ldHdvcmtbNV0uQ1tcImJsb2NrY2hhaW5JRFwiXVxuICAgIGNvbnN0IG4xMzM3YmNJRDogc3RyaW5nID0gRGVmYXVsdHMubmV0d29ya1sxMzM3XS5DW1wiYmxvY2tjaGFpbklEXCJdXG4gICAgY29uc3QgdGVzdEFQSTogRVZNQVBJID0gbmV3IEVWTUFQSShhdmFsYW5jaGUsIFwiL2V4dC9iYy9DL2F2YXhcIiwgbjViY0lEKVxuICAgIGNvbnN0IGJjMTogc3RyaW5nID0gdGVzdEFQSS5nZXRCbG9ja2NoYWluSUQoKVxuICAgIGV4cGVjdChiYzEpLnRvQmUobjViY0lEKVxuXG4gICAgbGV0IHJlczogYm9vbGVhbiA9IHRlc3RBUEkucmVmcmVzaEJsb2NrY2hhaW5JRCgpXG4gICAgZXhwZWN0KHJlcykudG9CZVRydXRoeSgpXG4gICAgY29uc3QgYmMyOiBzdHJpbmcgPSB0ZXN0QVBJLmdldEJsb2NrY2hhaW5JRCgpXG4gICAgZXhwZWN0KGJjMikudG9CZShuMTMzN2JjSUQpXG5cbiAgICByZXMgPSB0ZXN0QVBJLnJlZnJlc2hCbG9ja2NoYWluSUQobjViY0lEKVxuICAgIGV4cGVjdChyZXMpLnRvQmVUcnV0aHkoKVxuICAgIGNvbnN0IGJjMzogc3RyaW5nID0gdGVzdEFQSS5nZXRCbG9ja2NoYWluSUQoKVxuICAgIGV4cGVjdChiYzMpLnRvQmUobjViY0lEKVxuICB9KVxuXG4gIHRlc3QoXCJnZXRBc3NldEJhbGFuY2VcIiwgYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGFkZHJlc3M6IHN0cmluZyA9IFwiMHg4ZGI5N0M3Y0VjRTI0OWMyYjk4YkRDMDIyNkNjNEMyQTU3QkY1MkZDXCJcbiAgICBjb25zdCBoZXhTdHI6IHN0cmluZyA9IFwiMHgwXCJcbiAgICBjb25zdCBibG9ja0hlaWdodDogc3RyaW5nID0gaGV4U3RyXG4gICAgY29uc3QgYXNzZXRJRDogc3RyaW5nID0gXCJGQ3J5MloxU3U5S1pxSzFYUk1oeFFTNlh1UG9yeERtM0MzUkJUN2h3MzJvamlxeXZQXCJcblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLmdldEFzc2V0QmFsYW5jZShcbiAgICAgIGFkZHJlc3MsXG4gICAgICBibG9ja0hlaWdodCxcbiAgICAgIGFzc2V0SURcbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiBoZXhTdHJcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBvYmplY3QgPSBhd2FpdCByZXN1bHRcbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZVtcInJlc3VsdFwiXSkudG9CZShoZXhTdHIpXG4gIH0pXG5cbiAgdGVzdChcImdldEFzc2V0QmFsYW5jZSB3aXRoIGJhZCBhc3NldElEXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSBcIjB4OGRiOTdDN2NFY0UyNDljMmI5OGJEQzAyMjZDYzRDMkE1N0JGNTJGQ1wiXG4gICAgY29uc3QgaGV4U3RyOiBzdHJpbmcgPSBcIjB4MFwiXG4gICAgY29uc3QgYmxvY2tIZWlnaHQ6IHN0cmluZyA9IGhleFN0clxuICAgIGNvbnN0IGFzc2V0SUQ6IHN0cmluZyA9IFwiYWFhXCJcblxuICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9XG4gICAgICBcImludmFsaWQgYXJndW1lbnQgMjogY291bGRuJ3QgZGVjb2RlIElEIHRvIGJ5dGVzOiBpbnB1dCBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoZSBjaGVja3N1bSBzaXplXCJcblxuICAgIGNvbnN0IHJlc3VsdDogUHJvbWlzZTxvYmplY3Q+ID0gYXBpLmdldEFzc2V0QmFsYW5jZShcbiAgICAgIGFkZHJlc3MsXG4gICAgICBibG9ja0hlaWdodCxcbiAgICAgIGFzc2V0SURcbiAgICApXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGNvZGU6IC0zMjYwMixcbiAgICAgICAgbWVzc2FnZVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IG9iamVjdCA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2VbXCJyZXN1bHRcIl1bXCJjb2RlXCJdKS50b0JlKC0zMjYwMilcbiAgICBleHBlY3QocmVzcG9uc2VbXCJyZXN1bHRcIl1bXCJtZXNzYWdlXCJdKS50b0JlKG1lc3NhZ2UpXG4gIH0pXG5cbiAgdGVzdChcImdldEF0b21pY1R4U3RhdHVzXCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB0eElEOiBzdHJpbmcgPSBcIkZDcnkyWjFTdTlLWnFLMVhSTWh4UVM2WHVQb3J4RG0zQzNSQlQ3aHczMm9qaXF5dlBcIlxuXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZz4gPSBhcGkuZ2V0QXRvbWljVHhTdGF0dXModHhJRClcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgc3RhdHVzOiBcIkFjY2VwdGVkXCJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmo6IEh0dHBSZXNwb25zZSA9IHtcbiAgICAgIGRhdGE6IHBheWxvYWRcbiAgICB9XG5cbiAgICBtb2NrQXhpb3MubW9ja1Jlc3BvbnNlKHJlc3BvbnNlT2JqKVxuICAgIGNvbnN0IHJlc3BvbnNlOiBzdHJpbmcgPSBhd2FpdCByZXN1bHRcblxuICAgIGV4cGVjdChtb2NrQXhpb3MucmVxdWVzdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKFwiQWNjZXB0ZWRcIilcbiAgfSlcblxuICB0ZXN0KFwiZ2V0QmFzZUZlZVwiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZz4gPSBhcGkuZ2V0QmFzZUZlZSgpXG4gICAgY29uc3QgcGF5bG9hZDogb2JqZWN0ID0ge1xuICAgICAgcmVzdWx0OiBcIjB4MzQ2MzBiOGEwMFwiXG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZShcIjB4MzQ2MzBiOGEwMFwiKVxuICB9KVxuXG4gIHRlc3QoXCJnZXRNYXhQcmlvcml0eUZlZVBlckdhc1wiLCBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZz4gPSBhcGkuZ2V0TWF4UHJpb3JpdHlGZWVQZXJHYXMoKVxuICAgIGNvbnN0IHBheWxvYWQ6IG9iamVjdCA9IHtcbiAgICAgIHJlc3VsdDogXCIweDI1NDBiZTQwMFwiXG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlT2JqOiBIdHRwUmVzcG9uc2UgPSB7XG4gICAgICBkYXRhOiBwYXlsb2FkXG4gICAgfVxuXG4gICAgbW9ja0F4aW9zLm1vY2tSZXNwb25zZShyZXNwb25zZU9iailcbiAgICBjb25zdCByZXNwb25zZTogc3RyaW5nID0gYXdhaXQgcmVzdWx0XG5cbiAgICBleHBlY3QobW9ja0F4aW9zLnJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChyZXNwb25zZSkudG9CZShcIjB4MjU0MGJlNDAwXCIpXG4gIH0pXG5cbiAgdGVzdChcImdldEF0b21pY1R4XCIsIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB0eElEOiBzdHJpbmcgPSBcIkZDcnkyWjFTdTlLWnFLMVhSTWh4UVM2WHVQb3J4RG0zQzNSQlQ3aHczMm9qaXF5dlBcIlxuICAgIGNvbnN0IHR4ID1cbiAgICAgIFwiMTExMTE5VFJoV1NqOTMyQm5UeWhza1l0bjRqN2RZOU5xcTh3aTNtbW1Gdkh2REVvQWZpZk1uUmNVdVRGcVJ4aHNxV3lYTVRIbUZCY1NyTVM2dTlGNkxSQTFHM0RtS1dvQTNZYjI3SmJoVVY3aXNtTGtpRXNXSjE4N3EyQXdnRTJSQ1ZHN2VaOXpMODlaQm1hVkExYmt6c3gzMjRMalU5TmlZZ2tjZUp4bTVkM0w5QVRpTGdXdDRtV01EUjRZS3BTdjRxS3FqZkQyZlJ6WW03Z1gyQzJGMWF1Q3ZWTjZIZDE1SjNqUlVCN3ZLRUVjQlpKZXhkWWRxbkNYN3ZGZHdvR3BKTTd0VWlGUkRnQUFQcE1veHo2UUY3Z3dLYmtrWEs1Vmc0TEcyc3pTY1g5cUw1QmVnTndVZU5RWUI0MmtGM00zdzV0blZla2htSFFkWlNFWVU4TmpTblNabnFBRlBjSGM0U3RNM3laZW0zTVRGUllKcU5jN1JBdm9NR2k4YW0zSHg0R1Zwd1lxamlxZXYzWGlxZnl1VHNzbjRiUjFYYUpialFUeUNcIlxuXG4gICAgY29uc3QgcmVzdWx0OiBQcm9taXNlPHN0cmluZz4gPSBhcGkuZ2V0QXRvbWljVHgodHhJRClcbiAgICBjb25zdCBwYXlsb2FkOiBvYmplY3QgPSB7XG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgdHgsXG4gICAgICAgIGVuY29kaW5nOiBcImhleFwiLFxuICAgICAgICBibG9ja0hlaWdodDogOFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZU9iajogSHR0cFJlc3BvbnNlID0ge1xuICAgICAgZGF0YTogcGF5bG9hZFxuICAgIH1cblxuICAgIG1vY2tBeGlvcy5tb2NrUmVzcG9uc2UocmVzcG9uc2VPYmopXG4gICAgY29uc3QgcmVzcG9uc2U6IHN0cmluZyA9IGF3YWl0IHJlc3VsdFxuXG4gICAgZXhwZWN0KG1vY2tBeGlvcy5yZXF1ZXN0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHgpXG4gIH0pXG59KVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!