UNPKG

bitgo

Version:
132 lines • 24.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const should = require("should"); const nock = require("nock"); const sdk_core_1 = require("@bitgo/sdk-core"); const sdk_test_1 = require("@bitgo/sdk-test"); const src_1 = require("../../../../src"); const amsTokenConfig_1 = require("../../resources/amsTokenConfig"); describe('Asset metadata service', () => { const microservicesUri = sdk_core_1.Environments['mock'].uri; let bitgo; before(function () { bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); }); it('should create a custom coin factory from ams response', async () => { bitgo.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig); const coin = bitgo.coin('hteth:faketoken'); should.exist(coin); coin.type.should.equal('hteth:faketoken'); coin.name.should.equal('Hoodi Testnet fake token'); coin.decimalPlaces.should.equal(6); coin.tokenContractAddress.should.equal('0x89a959b9184b4f8c8633646d5dfd049d2ebc983a'); }); it('should not fetch coin from custom coin factory when useAms is false', async () => { const bitgoNoAms = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: false }); bitgoNoAms.initializeTestVars(); bitgoNoAms.initCoinFactory(amsTokenConfig_1.reducedAmsTokenConfig); (() => { bitgoNoAms.coin('hteth:faketoken'); }).should.throw('Coin or token type hteth:faketoken not supported or not compiled. Please be sure that you are using the latest version of BitGoJS. If using @bitgo/sdk-api, please confirm you have registered hteth:faketoken first.'); }); it('should be able to register a token in the coin factory', () => { const tokenName = 'hteth:faketoken'; bitgo.registerToken(tokenName); const coin = bitgo.coin(tokenName); should.exist(coin); coin.type.should.equal(tokenName); coin.name.should.equal('Hoodi Testnet fake token'); coin.decimalPlaces.should.equal(6); coin.tokenContractAddress.should.equal('0x89a959b9184b4f8c8633646d5dfd049d2ebc983a'); }); it('should fetch all assets from AMS and initialize the coin factory', async () => { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); // Setup nocks nock(microservicesUri).get('/api/v1/assets/list/testnet').reply(200, amsTokenConfig_1.reducedAmsTokenConfig); await bitgo.registerAllTokens(); const coin = bitgo.coin('hteth:faketoken'); should.exist(coin); }); describe('registerToken', () => { it('should throw an error when useAms is false', async () => { const bitgoNoAms = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: false }); bitgoNoAms.initializeTestVars(); await bitgoNoAms .registerToken('hteth:faketoken') .should.be.rejectedWith('registerToken is only supported when useAms is set to true'); }); it('should register a token from statics library if available', async () => { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); await bitgo.registerToken('hteth:bgerchv2'); const coin = bitgo.coin('hteth:bgerchv2'); should.exist(coin); }); it('should fetch token information from AMS if not in statics library', async () => { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); const tokenName = 'hteth:faketoken'; // Setup nocks nock(microservicesUri).get(`/api/v1/assets/name/${tokenName}`).reply(200, amsTokenConfig_1.reducedAmsTokenConfig[tokenName][0]); await bitgo.registerToken(tokenName); const coin = bitgo.coin(tokenName); should.exist(coin); }); it('should be able to register the ofc token', async () => { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); const tokenName = 'ofc'; await bitgo.registerToken(tokenName); const coin = bitgo.coin(tokenName); should.exist(coin); }); it('should register a EVM coin token from statics library if available', async () => { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); await bitgo.registerToken('tip:usdc'); const coin = bitgo.coin('tip:usdc'); should.exist(coin); }); it('should register an EVM coin token from AMS', async () => { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); const tokenName = 'tip:faketoken'; // Setup nocks for AMS API call nock(microservicesUri).get(`/api/v1/assets/name/${tokenName}`).reply(200, amsTokenConfig_1.reducedAmsTokenConfig[tokenName][0]); await bitgo.registerToken(tokenName); const coin = bitgo.coin(tokenName); should.exist(coin); coin.type.should.equal(tokenName); const staticsCoin = coin.getConfig(); staticsCoin.name.should.equal('tip'); staticsCoin.decimalPlaces.should.equal(18); // For EVM tokens, contractAddress is available on the statics coin if ('contractAddress' in staticsCoin && staticsCoin.contractAddress) { staticsCoin.contractAddress.should.equal('0x1234567890123456789012345678901234567890'); } staticsCoin.family.should.equal('ip'); }); it('should register a thypeevm EVM coin token from AMS', async () => { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri, useAms: true }); bitgo.initializeTestVars(); const tokenName = 'thypeevm:faketoken'; // Setup nocks for AMS API call nock(microservicesUri).get(`/api/v1/assets/name/${tokenName}`).reply(200, amsTokenConfig_1.reducedAmsTokenConfig[tokenName][0]); await bitgo.registerToken(tokenName); const coin = bitgo.coin(tokenName); should.exist(coin); coin.type.should.equal(tokenName); const staticsCoin = coin.getConfig(); staticsCoin.name.should.equal('thypeevm'); staticsCoin.decimalPlaces.should.equal(18); // For EVM tokens, contractAddress is available on the statics coin if ('contractAddress' in staticsCoin && staticsCoin.contractAddress) { staticsCoin.contractAddress.should.equal('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd'); } staticsCoin.family.should.equal('hypeevm'); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L2Ftcy9hbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBa0M7QUFDbEMsNkJBQThCO0FBRTlCLDhDQUErQztBQUMvQyw4Q0FBNEM7QUFDNUMseUNBQXNEO0FBQ3RELG1FQUF1RTtBQUV2RSxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsV0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFrQixDQUFDLENBQUM7UUFDbkcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxzQ0FBcUIsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsb0JBQW9CLENBQUMs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b3VsZCA9IHJlcXVpcmUoJ3Nob3VsZCcpO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5cbmltcG9ydCB7IEVudmlyb25tZW50cyB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28sIEJpdEdvT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyByZWR1Y2VkQW1zVG9rZW5Db25maWcgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYW1zVG9rZW5Db25maWcnO1xuXG5kZXNjcmliZSgnQXNzZXQgbWV0YWRhdGEgc2VydmljZScsICgpID0+IHtcbiAgY29uc3QgbWljcm9zZXJ2aWNlc1VyaSA9IEVudmlyb25tZW50c1snbW9jayddLnVyaTtcbiAgbGV0IGJpdGdvO1xuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpLCB1c2VBbXM6IHRydWUgfSBhcyBCaXRHb09wdGlvbnMpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjb2luIGZhY3RvcnkgZnJvbSBhbXMgcmVzcG9uc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgYml0Z28uaW5pdENvaW5GYWN0b3J5KHJlZHVjZWRBbXNUb2tlbkNvbmZpZyk7XG4gICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4oJ2h0ZXRoOmZha2V0b2tlbicpO1xuICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICBjb2luLnR5cGUuc2hvdWxkLmVxdWFsKCdodGV0aDpmYWtldG9rZW4nKTtcbiAgICBjb2luLm5hbWUuc2hvdWxkLmVxdWFsKCdIb29kaSBUZXN0bmV0IGZha2UgdG9rZW4nKTtcbiAgICBjb2luLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDYpO1xuICAgIGNvaW4udG9rZW5Db250cmFjdEFkZHJlc3Muc2hvdWxkLmVxdWFsKCcweDg5YTk1OWI5MTg0YjRmOGM4NjMzNjQ2ZDVkZmQwNDlkMmViYzk4M2EnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgZmV0Y2ggY29pbiBmcm9tIGN1c3RvbSBjb2luIGZhY3Rvcnkgd2hlbiB1c2VBbXMgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z29Ob0FtcyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgYml0Z29Ob0Ftcy5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiaXRnb05vQW1zLmluaXRDb2luRmFjdG9yeShyZWR1Y2VkQW1zVG9rZW5Db25maWcpO1xuICAgICgoKSA9PiB7XG4gICAgICBiaXRnb05vQW1zLmNvaW4oJ2h0ZXRoOmZha2V0b2tlbicpO1xuICAgIH0pLnNob3VsZC50aHJvdyhcbiAgICAgICdDb2luIG9yIHRva2VuIHR5cGUgaHRldGg6ZmFrZXRva2VuIG5vdCBzdXBwb3J0ZWQgb3Igbm90IGNvbXBpbGVkLiBQbGVhc2UgYmUgc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEJpdEdvSlMuIElmIHVzaW5nIEBiaXRnby9zZGstYXBpLCBwbGVhc2UgY29uZmlybSB5b3UgaGF2ZSByZWdpc3RlcmVkIGh0ZXRoOmZha2V0b2tlbiBmaXJzdC4nXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHJlZ2lzdGVyIGEgdG9rZW4gaW4gdGhlIGNvaW4gZmFjdG9yeScsICgpID0+IHtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSAnaHRldGg6ZmFrZXRva2VuJztcbiAgICBiaXRnby5yZWdpc3RlclRva2VuKHRva2VuTmFtZSk7XG4gICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4odG9rZW5OYW1lKTtcbiAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgY29pbi50eXBlLnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgIGNvaW4ubmFtZS5zaG91bGQuZXF1YWwoJ0hvb2RpIFRlc3RuZXQgZmFrZSB0b2tlbicpO1xuICAgIGNvaW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoNik7XG4gICAgY29pbi50b2tlbkNvbnRyYWN0QWRkcmVzcy5zaG91bGQuZXF1YWwoJzB4ODlhOTU5YjkxODRiNGY4Yzg2MzM2NDZkNWRmZDA0OWQyZWJjOTgzYScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZldGNoIGFsbCBhc3NldHMgZnJvbSBBTVMgYW5kIGluaXRpYWxpemUgdGhlIGNvaW4gZmFjdG9yeScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgIC8vIFNldHVwIG5vY2tzXG4gICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKS5nZXQoJy9hcGkvdjEvYXNzZXRzL2xpc3QvdGVzdG5ldCcpLnJlcGx5KDIwMCwgcmVkdWNlZEFtc1Rva2VuQ29uZmlnKTtcblxuICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyQWxsVG9rZW5zKCk7XG4gICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4oJ2h0ZXRoOmZha2V0b2tlbicpO1xuICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlZ2lzdGVyVG9rZW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIHVzZUFtcyBpcyBmYWxzZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJpdGdvTm9BbXMgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogZmFsc2UgfSBhcyBCaXRHb09wdGlvbnMpO1xuICAgICAgYml0Z29Ob0Ftcy5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgYXdhaXQgYml0Z29Ob0Ftc1xuICAgICAgICAucmVnaXN0ZXJUb2tlbignaHRldGg6ZmFrZXRva2VuJylcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ3JlZ2lzdGVyVG9rZW4gaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2VBbXMgaXMgc2V0IHRvIHRydWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYSB0b2tlbiBmcm9tIHN0YXRpY3MgbGlicmFyeSBpZiBhdmFpbGFibGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgICAgYXdhaXQgYml0Z28ucmVnaXN0ZXJUb2tlbignaHRldGg6YmdlcmNodjInKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKCdodGV0aDpiZ2VyY2h2MicpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmZXRjaCB0b2tlbiBpbmZvcm1hdGlvbiBmcm9tIEFNUyBpZiBub3QgaW4gc3RhdGljcyBsaWJyYXJ5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgY29uc3QgdG9rZW5OYW1lID0gJ2h0ZXRoOmZha2V0b2tlbic7XG5cbiAgICAgIC8vIFNldHVwIG5vY2tzXG4gICAgICBub2NrKG1pY3Jvc2VydmljZXNVcmkpLmdldChgL2FwaS92MS9hc3NldHMvbmFtZS8ke3Rva2VuTmFtZX1gKS5yZXBseSgyMDAsIHJlZHVjZWRBbXNUb2tlbkNvbmZpZ1t0b2tlbk5hbWVdWzBdKTtcblxuICAgICAgYXdhaXQgYml0Z28ucmVnaXN0ZXJUb2tlbih0b2tlbk5hbWUpO1xuICAgICAgY29uc3QgY29pbiA9IGJpdGdvLmNvaW4odG9rZW5OYW1lKTtcbiAgICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byByZWdpc3RlciB0aGUgb2ZjIHRva2VuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcblxuICAgICAgY29uc3QgdG9rZW5OYW1lID0gJ29mYyc7XG5cbiAgICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyVG9rZW4odG9rZW5OYW1lKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gICAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGEgRVZNIGNvaW4gdG9rZW4gZnJvbSBzdGF0aWNzIGxpYnJhcnkgaWYgYXZhaWxhYmxlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycsIG1pY3Jvc2VydmljZXNVcmksIHVzZUFtczogdHJ1ZSB9IGFzIEJpdEdvT3B0aW9ucyk7XG4gICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyVG9rZW4oJ3RpcDp1c2RjJyk7XG4gICAgICBjb25zdCBjb2luID0gYml0Z28uY29pbigndGlwOnVzZGMnKTtcbiAgICAgIHNob3VsZC5leGlzdChjb2luKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYW4gRVZNIGNvaW4gdG9rZW4gZnJvbSBBTVMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuXG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSAndGlwOmZha2V0b2tlbic7XG5cbiAgICAgIC8vIFNldHVwIG5vY2tzIGZvciBBTVMgQVBJIGNhbGxcbiAgICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSkuZ2V0KGAvYXBpL3YxL2Fzc2V0cy9uYW1lLyR7dG9rZW5OYW1lfWApLnJlcGx5KDIwMCwgcmVkdWNlZEFtc1Rva2VuQ29uZmlnW3Rva2VuTmFtZV1bMF0pO1xuXG4gICAgICBhd2FpdCBiaXRnby5yZWdpc3RlclRva2VuKHRva2VuTmFtZSk7XG4gICAgICBjb25zdCBjb2luID0gYml0Z28uY29pbih0b2tlbk5hbWUpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvaW4pO1xuICAgICAgY29pbi50eXBlLnNob3VsZC5lcXVhbCh0b2tlbk5hbWUpO1xuICAgICAgY29uc3Qgc3RhdGljc0NvaW4gPSBjb2luLmdldENvbmZpZygpO1xuICAgICAgc3RhdGljc0NvaW4ubmFtZS5zaG91bGQuZXF1YWwoJ3RpcCcpO1xuICAgICAgc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcy5zaG91bGQuZXF1YWwoMTgpO1xuICAgICAgLy8gRm9yIEVWTSB0b2tlbnMsIGNvbnRyYWN0QWRkcmVzcyBpcyBhdmFpbGFibGUgb24gdGhlIHN0YXRpY3MgY29pblxuICAgICAgaWYgKCdjb250cmFjdEFkZHJlc3MnIGluIHN0YXRpY3NDb2luICYmIHN0YXRpY3NDb2luLmNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICAoc3RhdGljc0NvaW4uY29udHJhY3RBZGRyZXNzIGFzIHN0cmluZykuc2hvdWxkLmVxdWFsKCcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnKTtcbiAgICAgIH1cbiAgICAgIHN0YXRpY3NDb2luLmZhbWlseS5zaG91bGQuZXF1YWwoJ2lwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGEgdGh5cGVldm0gRVZNIGNvaW4gdG9rZW4gZnJvbSBBTVMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICdtb2NrJywgbWljcm9zZXJ2aWNlc1VyaSwgdXNlQW1zOiB0cnVlIH0gYXMgQml0R29PcHRpb25zKTtcbiAgICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuXG4gICAgICBjb25zdCB0b2tlbk5hbWUgPSAndGh5cGVldm06ZmFrZXRva2VuJztcblxuICAgICAgLy8gU2V0dXAgbm9ja3MgZm9yIEFNUyBBUEkgY2FsbFxuICAgICAgbm9jayhtaWNyb3NlcnZpY2VzVXJpKS5nZXQoYC9hcGkvdjEvYXNzZXRzL25hbWUvJHt0b2tlbk5hbWV9YCkucmVwbHkoMjAwLCByZWR1Y2VkQW1zVG9rZW5Db25maWdbdG9rZW5OYW1lXVswXSk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLnJlZ2lzdGVyVG9rZW4odG9rZW5OYW1lKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBiaXRnby5jb2luKHRva2VuTmFtZSk7XG4gICAgICBzaG91bGQuZXhpc3QoY29pbik7XG4gICAgICBjb2luLnR5cGUuc2hvdWxkLmVxdWFsKHRva2VuTmFtZSk7XG4gICAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW4uZ2V0Q29uZmlnKCk7XG4gICAgICBzdGF0aWNzQ29pbi5uYW1lLnNob3VsZC5lcXVhbCgndGh5cGVldm0nKTtcbiAgICAgIHN0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMuc2hvdWxkLmVxdWFsKDE4KTtcbiAgICAgIC8vIEZvciBFVk0gdG9rZW5zLCBjb250cmFjdEFkZHJlc3MgaXMgYXZhaWxhYmxlIG9uIHRoZSBzdGF0aWNzIGNvaW5cbiAgICAgIGlmICgnY29udHJhY3RBZGRyZXNzJyBpbiBzdGF0aWNzQ29pbiAmJiBzdGF0aWNzQ29pbi5jb250cmFjdEFkZHJlc3MpIHtcbiAgICAgICAgKHN0YXRpY3NDb2luLmNvbnRyYWN0QWRkcmVzcyBhcyBzdHJpbmcpLnNob3VsZC5lcXVhbCgnMHhhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkZWZhYmNkJyk7XG4gICAgICB9XG4gICAgICBzdGF0aWNzQ29pbi5mYW1pbHkuc2hvdWxkLmVxdWFsKCdoeXBlZXZtJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=