PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit
Просмотр файла: baseCoin.js
"use strict";
//
// Tests for Wallets
//
Object.defineProperty(exports, "__esModule", { value: true });
require("should");
const nock = require("nock");
const sdk_test_1 = require("@bitgo/sdk-test");
const bitgo_1 = require("../../../src/bitgo");
const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
const sdk_coin_xlm_1 = require("@bitgo/sdk-coin-xlm");
nock.disableNetConnect();
describe('V2 Base Coin:', function () {
let bitgo;
let basecoinEth;
let basecoinBtc;
let basecoinXlm;
let basecoinNear;
let basecoinEos;
let basecoinEosChex;
let basecoinErc20TokenWithName;
let basecoinErc20TokenWithContractHash;
let baseCoinStellarToken;
before(function () {
bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'test' });
bitgo.initializeTestVars();
basecoinEth = bitgo.coin('teth');
basecoinBtc = bitgo.coin('tbtc');
basecoinXlm = bitgo.coin('txlm');
basecoinNear = bitgo.coin('tnear');
basecoinEos = bitgo.coin('teos');
basecoinEosChex = bitgo.coin('teos:CHEX');
basecoinEth.keychains();
basecoinErc20TokenWithName = bitgo.coin('terc');
basecoinErc20TokenWithContractHash = bitgo.coin('0x945ac907cf021a6bcd07852bb3b8c087051706a9');
baseCoinStellarToken = bitgo.coin('txlm:BST-GBQTIOS3XGHB7LVYGBKQVJGCZ3R4JL5E4CBSWJ5ALIJUHBKS6263644L');
});
describe('Currency conversion', function () {
it('should convert wei amounts to ETH', function () {
// 1 wei
basecoinEth.baseUnitsToBigUnits(1).should.equal('0.000000000000000001');
// 100 wei
basecoinEth.baseUnitsToBigUnits(100).should.equal('0.0000000000000001');
// 1 ETH
basecoinEth.baseUnitsToBigUnits('1000000000000000000').should.equal('1');
// others
basecoinEth.baseUnitsToBigUnits('1000000010000000000').should.equal('1.00000001');
});
it('should convert satoshi amounts to BTC', function () {
// 1 satoshi
basecoinBtc.baseUnitsToBigUnits(1).should.equal('0.00000001');
// 100 satoshi
basecoinBtc.baseUnitsToBigUnits(100).should.equal('0.000001');
// 1 BTC
basecoinBtc.baseUnitsToBigUnits(100000000).should.equal('1');
// 2000 BTC
basecoinBtc.baseUnitsToBigUnits(200000000000).should.equal('2000');
// others
basecoinBtc.baseUnitsToBigUnits(200000397901).should.equal('2000.00397901');
});
it('should convert stroop amounts to XLM', function () {
// 1 stroop
basecoinXlm.baseUnitsToBigUnits('1').should.equal('0.0000001');
// 100 stroops
basecoinXlm.baseUnitsToBigUnits('100').should.equal('0.00001');
// 1 XLM
basecoinXlm.baseUnitsToBigUnits('10000000').should.equal('1');
// others
basecoinXlm.baseUnitsToBigUnits('10000001').should.equal('1.0000001');
});
it('should convert amounts to NEAR', function () {
basecoinNear.baseUnitsToBigUnits('5348162392287187499999010').should.equal('5.34816239228718749999901');
basecoinNear.baseUnitsToBigUnits('5555555555555555555555550').should.equal('5.55555555555555555555555');
basecoinNear.baseUnitsToBigUnits('197895229538867437499999802').should.equal('197.895229538867437499999802');
});
it('should convert amounts to EOS', function () {
basecoinEos.baseUnitsToBigUnits('1').should.equal('0.0001');
basecoinEos.baseUnitsToBigUnits('1234').should.equal('0.1234');
basecoinEos.baseUnitsToBigUnits('123456788').should.equal('12345.6788');
// for chex token, we need to round to 8 decimal places
basecoinEosChex.baseUnitsToBigUnits('1').should.equal('0.00000001');
basecoinEosChex.baseUnitsToBigUnits('1234').should.equal('0.00001234');
basecoinEosChex.baseUnitsToBigUnits('123456788').should.equal('1.23456788');
});
});
describe('supportsBlockTarget', function () {
it('should return false', function () {
basecoinEth.supportsBlockTarget().should.equal(false);
});
});
describe('Token initialization', function () {
it('ERC20 Tokens initialized with name and contract should be instances of Erc20Token', function () {
basecoinErc20TokenWithName.should.be.instanceof(sdk_coin_eth_1.Erc20Token);
basecoinErc20TokenWithContractHash.should.be.instanceof(sdk_coin_eth_1.Erc20Token);
});
it('ERC20 Tokens initialized with name and contract should be instances of each others constructor', function () {
basecoinErc20TokenWithName.should.be.instanceof(basecoinErc20TokenWithContractHash.constructor);
basecoinErc20TokenWithContractHash.should.be.instanceof(basecoinErc20TokenWithContractHash.constructor);
});
it('ERC20 Token comparison', function () {
basecoinErc20TokenWithName.getBaseFactor().should.equal(basecoinErc20TokenWithContractHash.getBaseFactor());
basecoinErc20TokenWithName.getChain().should.equal(basecoinErc20TokenWithContractHash.getChain());
basecoinErc20TokenWithName.getFamily().should.equal(basecoinErc20TokenWithContractHash.getFamily());
basecoinErc20TokenWithName.getFullName().should.equal(basecoinErc20TokenWithContractHash.getFullName());
});
it('Stellar Tokens should be instances of StellarToken', function () {
(baseCoinStellarToken instanceof sdk_coin_xlm_1.StellarToken).should.equal(true);
(baseCoinStellarToken instanceof sdk_coin_xlm_1.StellarToken).should.equal(true);
});
it('Goerli ERC20 Tokens set to gteth and Kovan ERC20 Tokens set to teth', function () {
// goerli token
const goerliToken = bitgo.coin('gusdt');
goerliToken.coin.should.equal('gteth');
goerliToken.network.should.equal('Testnet');
goerliToken.getFamily().should.equal('eth');
// kovan token
const kovanToken = bitgo.coin('terc');
kovanToken.coin.should.equal('teth');
kovanToken.network.should.equal('Testnet');
kovanToken.getFamily().should.equal('eth');
// holesky token
const holeskyToken = bitgo.coin('bgerch');
holeskyToken.coin.should.equal('hteth');
holeskyToken.network.should.equal('Testnet');
holeskyToken.getFamily().should.equal('eth');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZUNvaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3YyL3VuaXQvYmFzZUNvaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLEVBQUU7QUFDRixvQkFBb0I7QUFDcEIsRUFBRTs7QUFFRixrQkFBZ0I7QUFDaEIsNkJBQTZCO0FBRTdCLDhDQUE0QztBQUM1Qyw4Q0FBMkM7QUFDM0Msc0RBQWlEO0FBQ2pELHNEQUFtRDtBQUVuRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUV6QixRQUFRLENBQUMsZUFBZSxFQUFFO0lBQ3hCLElBQUksS0FBSyxDQUFDO0lBQ1YsSUFBSSxXQUFXLENBQUM7SUFDaEIsSUFBSSxXQUFXLENBQUM7SUFDaEIsSUFBSSxXQUFXLENBQUM7SUFDaEIsSUFBSSxZQUFZLENBQUM7SUFDakIsSUFBSSxXQUFXLENBQUM7SUFDaEIsSUFBSSxlQUFlLENBQUM7SUFDcEIsSUFBSSwwQkFBMEIsQ0FBQztJQUMvQixJQUFJLGtDQUFrQyxDQUFDO0lBQ3ZDLElBQUksb0JBQW9CLENBQUM7SUFFekIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGFBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pD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bmltcG9ydCAqIGFzIG5vY2sgZnJvbSAnbm9jayc7XG5cbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHbyB9IGZyb20gJy4uLy4uLy4uL3NyYy9iaXRnbyc7XG5pbXBvcnQgeyBFcmMyMFRva2VuIH0gZnJvbSAnQGJpdGdvL3Nkay1jb2luLWV0aCc7XG5pbXBvcnQgeyBTdGVsbGFyVG9rZW4gfSBmcm9tICdAYml0Z28vc2RrLWNvaW4teGxtJztcblxubm9jay5kaXNhYmxlTmV0Q29ubmVjdCgpO1xuXG5kZXNjcmliZSgnVjIgQmFzZSBDb2luOicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvO1xuICBsZXQgYmFzZWNvaW5FdGg7XG4gIGxldCBiYXNlY29pbkJ0YztcbiAgbGV0IGJhc2Vjb2luWGxtO1xuICBsZXQgYmFzZWNvaW5OZWFyO1xuICBsZXQgYmFzZWNvaW5Fb3M7XG4gIGxldCBiYXNlY29pbkVvc0NoZXg7XG4gIGxldCBiYXNlY29pbkVyYzIwVG9rZW5XaXRoTmFtZTtcbiAgbGV0IGJhc2Vjb2luRXJjMjBUb2tlbldpdGhDb250cmFjdEhhc2g7XG4gIGxldCBiYXNlQ29pblN0ZWxsYXJUb2tlbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luRXRoID0gYml0Z28uY29pbigndGV0aCcpO1xuICAgIGJhc2Vjb2luQnRjID0gYml0Z28uY29pbigndGJ0YycpO1xuICAgIGJhc2Vjb2luWGxtID0gYml0Z28uY29pbigndHhsbScpO1xuICAgIGJhc2Vjb2luTmVhciA9IGJpdGdvLmNvaW4oJ3RuZWFyJyk7XG4gICAgYmFzZWNvaW5Fb3MgPSBiaXRnby5jb2luKCd0ZW9zJyk7XG4gICAgYmFzZWNvaW5Fb3NDaGV4ID0gYml0Z28uY29pbigndGVvczpDSEVYJyk7XG4gICAgYmFzZWNvaW5FdGgua2V5Y2hhaW5zKCk7XG4gICAgYmFzZWNvaW5FcmMyMFRva2VuV2l0aE5hbWUgPSBiaXRnby5jb2luKCd0ZXJjJyk7XG4gICAgYmFzZWNvaW5FcmMyMFRva2VuV2l0aENvbnRyYWN0SGFzaCA9IGJpdGdvLmNvaW4oJzB4OTQ1YWM5MDdjZjAyMWE2YmNkMDc4NTJiYjNiOGMwODcwNTE3MDZhOScpO1xuICAgIGJhc2VDb2luU3RlbGxhclRva2VuID0gYml0Z28uY29pbigndHhsbTpCU1QtR0JRVElPUzNYR0hCN0xWWUdCS1FWSkdDWjNSNEpMNUU0Q0JTV0o1QUxJSlVIQktTNjI2MzY0NEwnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0N1cnJlbmN5IGNvbnZlcnNpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IHdlaSBhbW91bnRzIHRvIEVUSCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIDEgd2VpXG4gICAgICBiYXNlY29pbkV0aC5iYXNlVW5pdHNUb0JpZ1VuaXRzKDEpLnNob3VsZC5lcXVhbCgnMC4wMDAwMDAwMDAwMDAwMDAwMDEnKTtcbiAgICAgIC8vIDEwMCB3ZWlcbiAgICAgIGJhc2Vjb2luRXRoLmJhc2VVbml0c1RvQmlnVW5pdHMoMTAwKS5zaG91bGQuZXF1YWwoJzAuMDAwMDAwMDAwMDAwMDAwMScpO1xuICAgICAgLy8gMSBFVEhcbiAgICAgIGJhc2Vjb2luRXRoLmJhc2VVbml0c1RvQmlnVW5pdHMoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKS5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICAgIC8vIG90aGVyc1xuICAgICAgYmFzZWNvaW5FdGguYmFzZVVuaXRzVG9CaWdVbml0cygnMTAwMDAwMDAxMDAwMDAwMDAwMCcpLnNob3VsZC5lcXVhbCgnMS4wMDAwMDAwMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IHNhdG9zaGkgYW1vdW50cyB0byBCVEMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAxIHNhdG9zaGlcbiAgICAgIGJhc2Vjb2luQnRjLmJhc2VVbml0c1RvQmlnVW5pdHMoMSkuc2hvdWxkLmVxdWFsKCcwLjAwMDAwMDAxJyk7XG4gICAgICAvLyAxMDAgc2F0b3NoaVxuICAgICAgYmFzZWNvaW5CdGMuYmFzZVVuaXRzVG9CaWdVbml0cygxMDApLnNob3VsZC5lcXVhbCgnMC4wMDAwMDEnKTtcbiAgICAgIC8vIDEgQlRDXG4gICAgICBiYXNlY29pbkJ0Yy5iYXNlVW5pdHNUb0JpZ1VuaXRzKDEwMDAwMDAwMCkuc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgICAvLyAyMDAwIEJUQ1xuICAgICAgYmFzZWNvaW5CdGMuYmFzZVVuaXRzVG9CaWdVbml0cygyMDAwMDAwMDAwMDApLnNob3VsZC5lcXVhbCgnMjAwMCcpO1xuICAgICAgLy8gb3RoZXJzXG4gICAgICBiYXNlY29pbkJ0Yy5iYXNlVW5pdHNUb0JpZ1VuaXRzKDIwMDAwMDM5NzkwMSkuc2hvdWxkLmVxdWFsKCcyMDAwLjAwMzk3OTAxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgc3Ryb29wIGFtb3VudHMgdG8gWExNJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gMSBzdHJvb3BcbiAgICAgIGJhc2Vjb2luWGxtLmJhc2VVbml0c1RvQmlnVW5pdHMoJzEnKS5zaG91bGQuZXF1YWwoJzAuMDAwMDAwMScpO1xuICAgICAgLy8gMTAwIHN0cm9vcHNcbiAgICAgIGJhc2Vjb2luWGxtLmJhc2VVbml0c1RvQmlnVW5pdHMoJzEwMCcpLnNob3VsZC5lcXVhbCgnMC4wMDAwMScpO1xuICAgICAgLy8gMSBYTE1cbiAgICAgIGJhc2Vjb2luWGxtLmJhc2VVbml0c1RvQmlnVW5pdHMoJzEwMDAwMDAwJykuc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgICAvLyBvdGhlcnNcbiAgICAgIGJhc2Vjb2luWGxtLmJhc2VVbml0c1RvQmlnVW5pdHMoJzEwMDAwMDAxJykuc2hvdWxkLmVxdWFsKCcxLjAwMDAwMDEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBhbW91bnRzIHRvIE5FQVInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbk5lYXIuYmFzZVVuaXRzVG9CaWdVbml0cygnNTM0ODE2MjM5MjI4NzE4NzQ5OTk5OTAxMCcpLnNob3VsZC5lcXVhbCgnNS4zNDgxNjIzOTIyODcxODc0OTk5OTkwMScpO1xuXG4gICAgICBiYXNlY29pbk5lYXIuYmFzZVVuaXRzVG9CaWdVbml0cygnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MCcpLnNob3VsZC5lcXVhbCgnNS41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScpO1xuXG4gICAgICBiYXNlY29pbk5lYXIuYmFzZVVuaXRzVG9CaWdVbml0cygnMTk3ODk1MjI5NTM4ODY3NDM3NDk5OTk5ODAyJykuc2hvdWxkLmVxdWFsKCcxOTcuODk1MjI5NTM4ODY3NDM3NDk5OTk5ODAyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgYW1vdW50cyB0byBFT1MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbkVvcy5iYXNlVW5pdHNUb0JpZ1VuaXRzKCcxJykuc2hvdWxkLmVxdWFsKCcwLjAwMDEnKTtcblxuICAgICAgYmFzZWNvaW5Fb3MuYmFzZVVuaXRzVG9CaWdVbml0cygnMTIzNCcpLnNob3VsZC5lcXVhbCgnMC4xMjM0Jyk7XG5cbiAgICAgIGJhc2Vjb2luRW9zLmJhc2VVbml0c1RvQmlnVW5pdHMoJzEyMzQ1Njc4OCcpLnNob3VsZC5lcXVhbCgnMTIzNDUuNjc4OCcpO1xuXG4gICAgICAvLyBmb3IgY2hleCB0b2tlbiwgd2UgbmVlZCB0byByb3VuZCB0byA4IGRlY2ltYWwgcGxhY2VzXG4gICAgICBiYXNlY29pbkVvc0NoZXguYmFzZVVuaXRzVG9CaWdVbml0cygnMScpLnNob3VsZC5lcXVhbCgnMC4wMDAwMDAwMScpO1xuXG4gICAgICBiYXNlY29pbkVvc0NoZXguYmFzZVVuaXRzVG9CaWdVbml0cygnMTIzNCcpLnNob3VsZC5lcXVhbCgnMC4wMDAwMTIzNCcpO1xuXG4gICAgICBiYXNlY29pbkVvc0NoZXguYmFzZVVuaXRzVG9CaWdVbml0cygnMTIzNDU2Nzg4Jykuc2hvdWxkLmVxdWFsKCcxLjIzNDU2Nzg4Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdXBwb3J0c0Jsb2NrVGFyZ2V0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW5FdGguc3VwcG9ydHNCbG9ja1RhcmdldCgpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUb2tlbiBpbml0aWFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnRVJDMjAgVG9rZW5zIGluaXRpYWxpemVkIHdpdGggbmFtZSBhbmQgY29udHJhY3Qgc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBFcmMyMFRva2VuJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW5FcmMyMFRva2VuV2l0aE5hbWUuc2hvdWxkLmJlLmluc3RhbmNlb2YoRXJjMjBUb2tlbik7XG4gICAgICBiYXNlY29pbkVyYzIwVG9rZW5XaXRoQ29udHJhY3RIYXNoLnNob3VsZC5iZS5pbnN0YW5jZW9mKEVyYzIwVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ0VSQzIwIFRva2VucyBpbml0aWFsaXplZCB3aXRoIG5hbWUgYW5kIGNvbnRyYWN0IHNob3VsZCBiZSBpbnN0YW5jZXMgb2YgZWFjaCBvdGhlcnMgY29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbkVyYzIwVG9rZW5XaXRoTmFtZS5zaG91bGQuYmUuaW5zdGFuY2VvZihiYXNlY29pbkVyYzIwVG9rZW5XaXRoQ29udHJhY3RIYXNoLmNvbnN0cnVjdG9yKTtcbiAgICAgIGJhc2Vjb2luRXJjMjBUb2tlbldpdGhDb250cmFjdEhhc2guc2hvdWxkLmJlLmluc3RhbmNlb2YoYmFzZWNvaW5FcmMyMFRva2VuV2l0aENvbnRyYWN0SGFzaC5jb25zdHJ1Y3Rvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnRVJDMjAgVG9rZW4gY29tcGFyaXNvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luRXJjMjBUb2tlbldpdGhOYW1lLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoYmFzZWNvaW5FcmMyMFRva2VuV2l0aENvbnRyYWN0SGFzaC5nZXRCYXNlRmFjdG9yKCkpO1xuICAgICAgYmFzZWNvaW5FcmMyMFRva2VuV2l0aE5hbWUuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoYmFzZWNvaW5FcmMyMFRva2VuV2l0aENvbnRyYWN0SGFzaC5nZXRDaGFpbigpKTtcbiAgICAgIGJhc2Vjb2luRXJjMjBUb2tlbldpdGhOYW1lLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbChiYXNlY29pbkVyYzIwVG9rZW5XaXRoQ29udHJhY3RIYXNoLmdldEZhbWlseSgpKTtcbiAgICAgIGJhc2Vjb2luRXJjMjBUb2tlbldpdGhOYW1lLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKGJhc2Vjb2luRXJjMjBUb2tlbldpdGhDb250cmFjdEhhc2guZ2V0RnVsbE5hbWUoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU3RlbGxhciBUb2tlbnMgc2hvdWxkIGJlIGluc3RhbmNlcyBvZiBTdGVsbGFyVG9rZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoYmFzZUNvaW5TdGVsbGFyVG9rZW4gaW5zdGFuY2VvZiBTdGVsbGFyVG9rZW4pLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIChiYXNlQ29pblN0ZWxsYXJUb2tlbiBpbnN0YW5jZW9mIFN0ZWxsYXJUb2tlbikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0dvZXJsaSBFUkMyMCBUb2tlbnMgc2V0IHRvIGd0ZXRoIGFuZCBLb3ZhbiBFUkMyMCBUb2tlbnMgc2V0IHRvIHRldGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnb2VybGkgdG9rZW5cbiAgICAgIGNvbnN0IGdvZXJsaVRva2VuID0gYml0Z28uY29pbignZ3VzZHQnKTtcbiAgICAgIGdvZXJsaVRva2VuLmNvaW4uc2hvdWxkLmVxdWFsKCdndGV0aCcpO1xuICAgICAgZ29lcmxpVG9rZW4ubmV0d29yay5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQnKTtcbiAgICAgIGdvZXJsaVRva2VuLmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgnZXRoJyk7XG4gICAgICAvLyBrb3ZhbiB0b2tlblxuICAgICAgY29uc3Qga292YW5Ub2tlbiA9IGJpdGdvLmNvaW4oJ3RlcmMnKTtcbiAgICAgIGtvdmFuVG9rZW4uY29pbi5zaG91bGQuZXF1YWwoJ3RldGgnKTtcbiAgICAgIGtvdmFuVG9rZW4ubmV0d29yay5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQnKTtcbiAgICAgIGtvdmFuVG9rZW4uZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCdldGgnKTtcbiAgICAgIC8vIGhvbGVza3kgdG9rZW5cbiAgICAgIGNvbnN0IGhvbGVza3lUb2tlbiA9IGJpdGdvLmNvaW4oJ2JnZXJjaCcpO1xuICAgICAgaG9sZXNreVRva2VuLmNvaW4uc2hvdWxkLmVxdWFsKCdodGV0aCcpO1xuICAgICAgaG9sZXNreVRva2VuLm5ldHdvcmsuc2hvdWxkLmVxdWFsKCdUZXN0bmV0Jyk7XG4gICAgICBob2xlc2t5VG9rZW4uZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCdldGgnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!