UNPKG

bitgo

Version:
163 lines • 26.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const nock = require("nock"); const sinon = require("sinon"); const sdk_core_1 = require("@bitgo/sdk-core"); const sdk_test_1 = require("@bitgo/sdk-test"); const src_1 = require("../../../src"); describe('Verify string type is used for value of unspent', function () { const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'test' }); bitgo.initializeTestVars(); const basecoin = bitgo.coin('tdoge'); const walletData = { id: '5b34252f1bf349930e34020a00000000', coin: 'tdoge', keys: ['5b3424f91bf349930e34017500000000', '5b3424f91bf349930e34017600000000', '5b3424f91bf349930e34017700000000'], coinSpecific: {}, }; const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData); const bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri; const highPrecisionBigInt = BigInt(1e16) + BigInt(1); function matchMinMaxValue(minValue, maxValue) { return minValue === '1' && maxValue === highPrecisionBigInt.toString(); } function assertIsString(val) { if (typeof val !== 'string') { throw new Error('Expected string'); } } describe('unspents APIs with string type minValue and maxValue', function () { after(function () { nock.cleanAll(); }); ['consolidate', 'fanout'].forEach((manageUnspentType) => { it(manageUnspentType + ' should handle string type minValue and maxValue', async function () { const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() }; const consolidateUnspentsScope = nock(bgUrl) .post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/${manageUnspentType}Unspents`, (body) => { return matchMinMaxValue(body.minValue, body.maxValue); }) .reply(200, { txInfo: { unspents: [ { id: 123, address: 'sfajlkjad', value: 1242123, valueString: '1242123', }, ], }, }); wallet .keyIds() .forEach((keyId) => nock(bgUrl).get(`/api/v2/${wallet.coin()}/key/${keyId}`).reply(200, { id: keyId, pub: 'pub' })); sinon.stub(wallet, 'signTransaction').resolves({}); sinon.stub(wallet.baseCoin, 'verifyTransaction').resolves(); const sendScope = nock(bgUrl) .post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`, { type: manageUnspentType }) .reply(200, {}); await wallet[manageUnspentType + 'Unspents'](params); consolidateUnspentsScope.done(); sendScope.done(); sinon.restore(); }); }); it('maximumSpendable should handle string type minValue and maxValue', async function () { const params = { minValue: '1', maxValue: highPrecisionBigInt.toString(), target: highPrecisionBigInt.toString(), }; const maximumSpendableScope = nock(bgUrl) .get(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/maximumSpendable`) .query((queryParams) => { assertIsString(queryParams.minValue); assertIsString(queryParams.maxValue); return matchMinMaxValue(queryParams.minValue, queryParams.maxValue); }) .reply(200, {}); await wallet.maximumSpendable(params); maximumSpendableScope.done(); }); it('get unspents should handle string type minValue and maxValue', async function () { const params = { minValue: '1', maxValue: highPrecisionBigInt.toString(), target: highPrecisionBigInt.toString(), }; const unspentsScope = nock(bgUrl) .get(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/unspents`) .query((queryParams) => { assertIsString(queryParams.minValue); assertIsString(queryParams.maxValue); return matchMinMaxValue(queryParams.minValue, queryParams.maxValue); }) .reply(200, {}); await wallet.unspents(params); unspentsScope.done(); }); }); describe('build and send transaction APIs with string type minValue and maxValue', function () { after(function () { nock.cleanAll(); }); it('sendmany should handle string type minValue and maxValue', async function () { const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() }; const sendScope = nock(bgUrl) .post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`, (body) => { return matchMinMaxValue(body.minValue, body.maxValue); }) .reply(200, {}); const prebuildAndSignTransactionStub = sinon.stub(wallet, 'prebuildAndSignTransaction').resolves({}); await wallet.sendMany(params); prebuildAndSignTransactionStub.should.calledOnce(); sendScope.done(); }); it('prebuildTransaction should handle string type minValue and maxValue', async function () { const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() }; const buildScope = nock(bgUrl) .post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/build`, (body) => { return matchMinMaxValue(body.minValue, body.maxValue); }) .reply(200, { txHex: '010000000197c9d011880ce52e1730d7e18d4877db343b61c7369e3274b9c0f176349137840000000000ffffffff0132000000000000001976a9146ba5752fb24f37d99db121975d8d68f0c6204d9188ac00000000', }); nock(bgUrl).get(`/api/v2/${wallet.coin()}/public/block/latest`).twice().reply(200, {}); await wallet.prebuildTransaction(params); buildScope.done(); }); }); describe('Unspent Reservations', function () { after(nock.cleanAll); it('should only pass through the whitelisted properties', async function () { const unspentIds = ['test-test']; const expireTime = 'boogie'; // Create const createScope = nock(bgUrl) .post(`/api/v2/wallet/${wallet.id()}/reservedunspents`, { unspentIds, expireTime }) .reply(200, {}); await wallet.manageUnspentReservations({ create: { unspentIds, expireTime, dontIncludeThis: 'this' }, }); // Modify const modifyScope = nock(bgUrl) .put(`/api/v2/wallet/${wallet.id()}/reservedunspents`, { unspentIds, changes: { expireTime } }) .reply(200, {}); await wallet.manageUnspentReservations({ modify: { unspentIds, changes: { expireTime }, dontIncludeThis: 'this' }, }); // Delete const deleteScope = nock(bgUrl) .delete(`/api/v2/wallet/${wallet.id()}/reservedunspents?id=test-test`) .reply(200, {}); await wallet.manageUnspentReservations({ delete: { id: unspentIds[0], dontIncludeThis: 'this' }, }); createScope.done(); modifyScope.done(); deleteScope.done(); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zcGVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3YyL3VuaXQvdW5zcGVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBOEI7QUFDOUIsK0JBQStCO0FBQy9CLDhDQUFpRDtBQUNqRCw4Q0FBNEM7QUFDNUMsc0NBQXFDO0FBRXJDLFFBQVEsQ0FBQyxpREFBaUQsRUFBRTtJQUMxRCxNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMzQixNQUFNLFFBQVEsR0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEVBQUUsRUFBRSxrQ0FBa0M7UUFDdEMsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxrQ0FBa0MsRUFBRSxrQ0FBa0MsQ0FBQztRQUNsSCxZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3RELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRCxTQUFTLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDMUQsT0FBTyxRQUFRLEtBQUssR0FBRyxJQUFJLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsU0FB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RSxDQUFDO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IGNvbW1vbiwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHbyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdWZXJpZnkgc3RyaW5nIHR5cGUgaXMgdXNlZCBmb3IgdmFsdWUgb2YgdW5zcGVudCcsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAndGVzdCcgfSk7XG4gIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICBjb25zdCBiYXNlY29pbjogYW55ID0gYml0Z28uY29pbigndGRvZ2UnKTtcbiAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJyxcbiAgICBjb2luOiAndGRvZ2UnLFxuICAgIGtleXM6IFsnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLCAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLCAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc3MDAwMDAwMDAnXSxcbiAgICBjb2luU3BlY2lmaWM6IHt9LFxuICB9O1xuICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgd2FsbGV0RGF0YSk7XG4gIGNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tiaXRnby5nZXRFbnYoKV0udXJpO1xuICBjb25zdCBoaWdoUHJlY2lzaW9uQmlnSW50ID0gQmlnSW50KDFlMTYpICsgQmlnSW50KDEpO1xuXG4gIGZ1bmN0aW9uIG1hdGNoTWluTWF4VmFsdWUobWluVmFsdWU6IHN0cmluZywgbWF4VmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtaW5WYWx1ZSA9PT0gJzEnICYmIG1heFZhbHVlID09PSBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCk7XG4gIH1cbiAgZnVuY3Rpb24gYXNzZXJ0SXNTdHJpbmcodmFsOiB1bmtub3duKTogYXNzZXJ0cyB2YWwgaXMgc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgZGVzY3JpYmUoJ3Vuc3BlbnRzIEFQSXMgd2l0aCBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgWydjb25zb2xpZGF0ZScsICdmYW5vdXQnXS5mb3JFYWNoKChtYW5hZ2VVbnNwZW50VHlwZSkgPT4ge1xuICAgICAgaXQobWFuYWdlVW5zcGVudFR5cGUgKyAnIHNob3VsZCBoYW5kbGUgc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IG1pblZhbHVlOiAnMScsIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCkgfTtcblxuICAgICAgICBjb25zdCBjb25zb2xpZGF0ZVVuc3BlbnRzU2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9LyR7bWFuYWdlVW5zcGVudFR5cGV9VW5zcGVudHNgLCAoYm9keSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoTWluTWF4VmFsdWUoYm9keS5taW5WYWx1ZSwgYm9keS5tYXhWYWx1ZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICAgICAgdW5zcGVudHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZDogMTIzLFxuICAgICAgICAgICAgICAgICAgYWRkcmVzczogJ3NmYWpsa2phZCcsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogMTI0MjEyMyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiAnMTI0MjEyMycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgd2FsbGV0XG4gICAgICAgICAgLmtleUlkcygpXG4gICAgICAgICAgLmZvckVhY2goKGtleUlkKSA9PlxuICAgICAgICAgICAgbm9jayhiZ1VybCkuZ2V0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0va2V5LyR7a2V5SWR9YCkucmVwbHkoMjAwLCB7IGlkOiBrZXlJZCwgcHViOiAncHViJyB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgc2lub24uc3R1Yih3YWxsZXQsICdzaWduVHJhbnNhY3Rpb24nKS5yZXNvbHZlcyh7fSk7XG4gICAgICAgIHNpbm9uLnN0dWIod2FsbGV0LmJhc2VDb2luLCAndmVyaWZ5VHJhbnNhY3Rpb24nKS5yZXNvbHZlcygpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgICAgLnBvc3QoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdHgvc2VuZGAsIHsgdHlwZTogbWFuYWdlVW5zcGVudFR5cGUgfSlcbiAgICAgICAgICAucmVwbHkoMjAwLCB7fSk7XG5cbiAgICAgICAgYXdhaXQgd2FsbGV0W21hbmFnZVVuc3BlbnRUeXBlICsgJ1Vuc3BlbnRzJ10ocGFyYW1zKTtcblxuICAgICAgICBjb25zb2xpZGF0ZVVuc3BlbnRzU2NvcGUuZG9uZSgpO1xuICAgICAgICBzZW5kU2NvcGUuZG9uZSgpO1xuICAgICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXhpbXVtU3BlbmRhYmxlIHNob3VsZCBoYW5kbGUgc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBtaW5WYWx1ZTogJzEnLFxuICAgICAgICBtYXhWYWx1ZTogaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpLFxuICAgICAgICB0YXJnZXQ6IGhpZ2hQcmVjaXNpb25CaWdJbnQudG9TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1heGltdW1TcGVuZGFibGVTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vbWF4aW11bVNwZW5kYWJsZWApXG4gICAgICAgIC5xdWVyeSgocXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgICBhc3NlcnRJc1N0cmluZyhxdWVyeVBhcmFtcy5taW5WYWx1ZSk7XG4gICAgICAgICAgYXNzZXJ0SXNTdHJpbmcocXVlcnlQYXJhbXMubWF4VmFsdWUpO1xuICAgICAgICAgIHJldHVybiBtYXRjaE1pbk1heFZhbHVlKHF1ZXJ5UGFyYW1zLm1pblZhbHVlLCBxdWVyeVBhcmFtcy5tYXhWYWx1ZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHt9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0Lm1heGltdW1TcGVuZGFibGUocGFyYW1zKTtcblxuICAgICAgbWF4aW11bVNwZW5kYWJsZVNjb3BlLmRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZXQgdW5zcGVudHMgc2hvdWxkIGhhbmRsZSBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIG1pblZhbHVlOiAnMScsXG4gICAgICAgIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCksXG4gICAgICAgIHRhcmdldDogaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdW5zcGVudHNTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdW5zcGVudHNgKVxuICAgICAgICAucXVlcnkoKHF1ZXJ5UGFyYW1zKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0SXNTdHJpbmcocXVlcnlQYXJhbXMubWluVmFsdWUpO1xuICAgICAgICAgIGFzc2VydElzU3RyaW5nKHF1ZXJ5UGFyYW1zLm1heFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShxdWVyeVBhcmFtcy5taW5WYWx1ZSBhcyBzdHJpbmcsIHF1ZXJ5UGFyYW1zLm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQudW5zcGVudHMocGFyYW1zKTtcblxuICAgICAgdW5zcGVudHNTY29wZS5kb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBhbmQgc2VuZCB0cmFuc2FjdGlvbiBBUElzIHdpdGggc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZW5kbWFueSBzaG91bGQgaGFuZGxlIHN0cmluZyB0eXBlIG1pblZhbHVlIGFuZCBtYXhWYWx1ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgbWluVmFsdWU6ICcxJywgbWF4VmFsdWU6IGhpZ2hQcmVjaXNpb25CaWdJbnQudG9TdHJpbmcoKSB9O1xuXG4gICAgICBjb25zdCBzZW5kU2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zZW5kYCwgKGJvZHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShib2R5Lm1pblZhbHVlLCBib2R5Lm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBjb25zdCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvblN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuc2VuZE1hbnkocGFyYW1zKTtcblxuICAgICAgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25TdHViLnNob3VsZC5jYWxsZWRPbmNlKCk7XG4gICAgICBzZW5kU2NvcGUuZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZWJ1aWxkVHJhbnNhY3Rpb24gc2hvdWxkIGhhbmRsZSBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7IG1pblZhbHVlOiAnMScsIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCkgfTtcblxuICAgICAgY29uc3QgYnVpbGRTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3R4L2J1aWxkYCwgKGJvZHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShib2R5Lm1pblZhbHVlLCBib2R5Lm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgIHR4SGV4OlxuICAgICAgICAgICAgJzAxMDAwMDAwMDE5N2M5ZDAxMTg4MGNlNTJlMTczMGQ3ZTE4ZDQ4NzdkYjM0M2I2MWM3MzY5ZTMyNzRiOWMwZjE3NjM0OTEzNzg0MDAwMDAwMDAwMGZmZmZmZmZmMDEzMjAwMDAwMDAwMDAwMDAwMTk3NmE5MTQ2YmE1NzUyZmIyNGYzN2Q5OWRiMTIxOTc1ZDhkNjhmMGM2MjA0ZDkxODhhYzAwMDAwMDAwJyxcbiAgICAgICAgfSk7XG5cbiAgICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3B1YmxpYy9ibG9jay9sYXRlc3RgKS50d2ljZSgpLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQucHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXMpO1xuXG4gICAgICBidWlsZFNjb3BlLmRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Vuc3BlbnQgUmVzZXJ2YXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKG5vY2suY2xlYW5BbGwpO1xuXG4gICAgaXQoJ3Nob3VsZCBvbmx5IHBhc3MgdGhyb3VnaCB0aGUgd2hpdGVsaXN0ZWQgcHJvcGVydGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVuc3BlbnRJZHMgPSBbJ3Rlc3QtdGVzdCddO1xuICAgICAgY29uc3QgZXhwaXJlVGltZSA9ICdib29naWUnO1xuXG4gICAgICAvLyBDcmVhdGVcbiAgICAgIGNvbnN0IGNyZWF0ZVNjb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHNgLCB7IHVuc3BlbnRJZHMsIGV4cGlyZVRpbWUgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuICAgICAgYXdhaXQgd2FsbGV0Lm1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMoe1xuICAgICAgICBjcmVhdGU6IHsgdW5zcGVudElkcywgZXhwaXJlVGltZSwgZG9udEluY2x1ZGVUaGlzOiAndGhpcycgfSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICB1bnNwZW50SWRzOiBzdHJpbmdbXTtcbiAgICAgICAgICBleHBpcmVUaW1lOiBzdHJpbmc7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gTW9kaWZ5XG4gICAgICBjb25zdCBtb2RpZnlTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5wdXQoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHNgLCB7IHVuc3BlbnRJZHMsIGNoYW5nZXM6IHsgZXhwaXJlVGltZSB9IH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHt9KTtcbiAgICAgIGF3YWl0IHdhbGxldC5tYW5hZ2VVbnNwZW50UmVzZXJ2YXRpb25zKHtcbiAgICAgICAgbW9kaWZ5OiB7IHVuc3BlbnRJZHMsIGNoYW5nZXM6IHsgZXhwaXJlVGltZSB9LCBkb250SW5jbHVkZVRoaXM6ICd0aGlzJyB9IGFzIHVua25vd24gYXMge1xuICAgICAgICAgIHVuc3BlbnRJZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIGNoYW5nZXM6IHsgZXhwaXJlVGltZTogc3RyaW5nIH07XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gRGVsZXRlXG4gICAgICBjb25zdCBkZWxldGVTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5kZWxldGUoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHM/aWQ9dGVzdC10ZXN0YClcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuICAgICAgYXdhaXQgd2FsbGV0Lm1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMoe1xuICAgICAgICBkZWxldGU6IHsgaWQ6IHVuc3BlbnRJZHNbMF0sIGRvbnRJbmNsdWRlVGhpczogJ3RoaXMnIH0gYXMgdW5rbm93biBhcyB7IGlkOiBzdHJpbmcgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjcmVhdGVTY29wZS5kb25lKCk7XG4gICAgICBtb2RpZnlTY29wZS5kb25lKCk7XG4gICAgICBkZWxldGVTY29wZS5kb25lKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=