@bitgo/sdk-coin-lnbtc 1.7.1 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/test/unit/index.js +105 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
package/dist/test/unit/index.js
CHANGED
|
@@ -1,17 +1,55 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
require("should");
|
|
37
|
+
const assert = __importStar(require("assert"));
|
|
38
|
+
const nock = require("nock");
|
|
4
39
|
const sdk_test_1 = require("@bitgo/sdk-test");
|
|
5
40
|
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
41
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
6
42
|
const index_1 = require("../../src/index");
|
|
7
43
|
describe('Lightning Bitcoin', function () {
|
|
8
44
|
let bitgo;
|
|
9
45
|
let basecoin;
|
|
46
|
+
let bgUrl;
|
|
10
47
|
before(function () {
|
|
11
48
|
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
12
49
|
bitgo.safeRegister('tlnbtc', index_1.Tlnbtc.createInstance);
|
|
13
50
|
bitgo.initializeTestVars();
|
|
14
51
|
basecoin = bitgo.coin('tlnbtc');
|
|
52
|
+
bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
|
|
15
53
|
});
|
|
16
54
|
it('should instantiate the coin', function () {
|
|
17
55
|
basecoin.should.be.an.instanceof(index_1.Tlnbtc);
|
|
@@ -19,5 +57,71 @@ describe('Lightning Bitcoin', function () {
|
|
|
19
57
|
it('should return full name', function () {
|
|
20
58
|
basecoin.getFullName().should.equal('Testnet Lightning Bitcoin');
|
|
21
59
|
});
|
|
60
|
+
describe('isValidPub', function () {
|
|
61
|
+
it('should return true for valid xpub', function () {
|
|
62
|
+
assert.strictEqual(basecoin.isValidPub('xpub661MyMwAqRbcGaE8M1N5i3fdBskDrwgU77TejReywexvb1sqCK1LhC2SETWp8XpPS2WDqyNywdgWo5kUTwkDv7qSe12xp4En7mcogZy95rQ'), true);
|
|
63
|
+
});
|
|
64
|
+
it('should return false for private key', function () {
|
|
65
|
+
assert.strictEqual(basecoin.isValidPub('xprv9s21ZrQH143K469fEyq5LuitdqujTUxcjtY3w3FNPKRwiDYgemh69PhxPBrgBc2s9vn8yfR1YKitAyUEXRTinrjyxxH5Xe38McnJ5rXkeXn'), false);
|
|
66
|
+
});
|
|
67
|
+
it('should return false for invalid string', function () {
|
|
68
|
+
assert.strictEqual(basecoin.isValidPub('not-a-pub'), false);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('isValidAddress', function () {
|
|
72
|
+
it('should accept valid compressed node pubkeys', function () {
|
|
73
|
+
assert.strictEqual(basecoin.isValidAddress('02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619'), true);
|
|
74
|
+
assert.strictEqual(basecoin.isValidAddress('03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad'), true);
|
|
75
|
+
});
|
|
76
|
+
it('should reject invalid node pubkeys', function () {
|
|
77
|
+
// wrong prefix
|
|
78
|
+
assert.strictEqual(basecoin.isValidAddress('04eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619'), false);
|
|
79
|
+
// too short
|
|
80
|
+
assert.strictEqual(basecoin.isValidAddress('02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f28368'), false);
|
|
81
|
+
// too long
|
|
82
|
+
assert.strictEqual(basecoin.isValidAddress('02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f28368661900'), false);
|
|
83
|
+
});
|
|
84
|
+
it('should accept valid testnet bitcoin addresses', function () {
|
|
85
|
+
// p2sh
|
|
86
|
+
assert.strictEqual(basecoin.isValidAddress('2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X'), true);
|
|
87
|
+
// bech32
|
|
88
|
+
assert.strictEqual(basecoin.isValidAddress('tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx'), true);
|
|
89
|
+
});
|
|
90
|
+
it('should reject invalid addresses', function () {
|
|
91
|
+
assert.strictEqual(basecoin.isValidAddress('not-an-address'), false);
|
|
92
|
+
assert.strictEqual(basecoin.isValidAddress(''), false);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('isWalletAddress', function () {
|
|
96
|
+
const walletId = 'wallet123';
|
|
97
|
+
const validBitcoinAddress = '2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X';
|
|
98
|
+
const nodePubkey = '02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619';
|
|
99
|
+
afterEach(function () {
|
|
100
|
+
nock.cleanAll();
|
|
101
|
+
});
|
|
102
|
+
it('should return true when address exists on wallet', async function () {
|
|
103
|
+
nock(bgUrl)
|
|
104
|
+
.get(`/api/v2/tlnbtc/wallet/${walletId}/address/${encodeURIComponent(validBitcoinAddress)}`)
|
|
105
|
+
.reply(200, { address: validBitcoinAddress });
|
|
106
|
+
const result = await basecoin.isWalletAddress({ address: validBitcoinAddress, walletId });
|
|
107
|
+
assert.strictEqual(result, true);
|
|
108
|
+
});
|
|
109
|
+
it('should return false when address does not exist on wallet', async function () {
|
|
110
|
+
nock(bgUrl)
|
|
111
|
+
.get(`/api/v2/tlnbtc/wallet/${walletId}/address/${encodeURIComponent(validBitcoinAddress)}`)
|
|
112
|
+
.reply(404);
|
|
113
|
+
const result = await basecoin.isWalletAddress({ address: validBitcoinAddress, walletId });
|
|
114
|
+
assert.strictEqual(result, false);
|
|
115
|
+
});
|
|
116
|
+
it('should return false for node pubkeys without querying API', async function () {
|
|
117
|
+
const result = await basecoin.isWalletAddress({ address: nodePubkey, walletId });
|
|
118
|
+
assert.strictEqual(result, false);
|
|
119
|
+
});
|
|
120
|
+
it('should throw InvalidAddressError for invalid addresses', async function () {
|
|
121
|
+
await assert.rejects(() => basecoin.isWalletAddress({ address: 'invalid', walletId }), {
|
|
122
|
+
name: 'InvalidAddressError',
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
22
126
|
});
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZ0I7QUFFaEIsOENBQTBEO0FBQzFELDRDQUEwQztBQUUxQywyQ0FBeUM7QUFFekMsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWdCLENBQUM7SUFFckIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFXLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7UUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtRQUM1QixRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuXG5pbXBvcnQgeyBUbG5idGMgfSBmcm9tICcuLi8uLi9zcmMvaW5kZXgnO1xuXG5kZXNjcmliZSgnTGlnaHRuaW5nIEJpdGNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW46IFRsbmJ0YztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGxuYnRjJywgVGxuYnRjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RsbmJ0YycpIGFzIFRsbmJ0YztcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUbG5idGMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBmdWxsIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQgTGlnaHRuaW5nIEJpdGNvaW4nKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsK0NBQWlDO0FBQ2pDLDZCQUE4QjtBQUU5Qiw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLDhDQUF5QztBQUV6QywyQ0FBeUM7QUFFekMsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWdCLENBQUM7SUFDckIsSUFBSSxLQUFhLENBQUM7SUFFbEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFXLENBQUM7UUFDMUMsS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFO1FBQzVCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxFQUFFO1FBQ3JCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtZQUN0QyxNQUFNLENBQUMsV0FBVyxDQUNoQixRQUFRLENBQUMsVUFBVSxDQUNqQixpSEFBaUgsQ0FDbEgsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFO1lBQ3hDLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLFFBQVEsQ0FBQyxVQUFVLENBQ2pCLGlIQUFpSCxDQUNsSCxFQUNELEtBQUssQ0FDTixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUU7WUFDM0MsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELE1BQU0sQ0FBQyxXQUFXLENBQ2hCLFFBQVEsQ0FBQyxjQUFjLENBQUMsb0VBQW9FLENBQUMsRUFDN0YsSUFBSSxDQUNMLENBQUM7WUFDRixNQUFNLENBQUMsV0FBVyxDQUNoQixRQUFRLENBQUMsY0FBYyxDQUFDLG9FQUFvRSxDQUFDLEVBQzdGLElBQUksQ0FDTCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsZUFBZTtZQUNmLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLFFBQVEsQ0FBQyxjQUFjLENBQUMsb0VBQW9FLENBQUMsRUFDN0YsS0FBSyxDQUNOLENBQUM7WUFDRixZQUFZO1lBQ1osTUFBTSxDQUFDLFdBQVcsQ0FDaEIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxnRUFBZ0UsQ0FBQyxFQUN6RixLQUFLLENBQ04sQ0FBQztZQUNGLFdBQVc7WUFDWCxNQUFNLENBQUMsV0FBVyxDQUNoQixRQUFRLENBQUMsY0FBYyxDQUFDLHNFQUFzRSxDQUFDLEVBQy9GLEtBQUssQ0FDTixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUU7WUFDbEQsT0FBTztZQUNQLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pGLFNBQVM7WUFDVCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsNENBQTRDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtZQUNwQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUM7UUFDN0IsTUFBTSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztRQUNsRSxNQUFNLFVBQVUsR0FBRyxvRUFBb0UsQ0FBQztRQUV4RixTQUFTLENBQUM7WUFDUixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSztZQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDO2lCQUNSLEdBQUcsQ0FBQyx5QkFBeUIsUUFBUSxZQUFZLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztpQkFDM0YsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7WUFFaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDMUYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSztZQUNuRSxJQUFJLENBQUMsS0FBSyxDQUFDO2lCQUNSLEdBQUcsQ0FBQyx5QkFBeUIsUUFBUSxZQUFZLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztpQkFDM0YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWQsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDMUYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSztZQUNuRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSztZQUNoRSxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRTtnQkFDckYsSUFBSSxFQUFFLHFCQUFxQjthQUM1QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IGNvbW1vbiB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IFRsbmJ0YyB9IGZyb20gJy4uLy4uL3NyYy9pbmRleCc7XG5cbmRlc2NyaWJlKCdMaWdodG5pbmcgQml0Y29pbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGxuYnRjO1xuICBsZXQgYmdVcmw6IHN0cmluZztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGxuYnRjJywgVGxuYnRjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RsbmJ0YycpIGFzIFRsbmJ0YztcbiAgICBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLnVyaTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUbG5idGMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBmdWxsIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQgTGlnaHRuaW5nIEJpdGNvaW4nKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQdWInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgdmFsaWQgeHB1YicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYmFzZWNvaW4uaXNWYWxpZFB1YihcbiAgICAgICAgICAneHB1YjY2MU15TXdBcVJiY0dhRThNMU41aTNmZEJza0Ryd2dVNzdUZWpSZXl3ZXh2YjFzcUNLMUxoQzJTRVRXcDhYcFBTMldEcXlOeXdkZ1dvNWtVVHdrRHY3cVNlMTJ4cDRFbjdtY29nWnk5NXJRJ1xuICAgICAgICApLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBiYXNlY29pbi5pc1ZhbGlkUHViKFxuICAgICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLNDY5ZkV5cTVMdWl0ZHF1alRVeGNqdFkzdzNGTlBLUndpRFlnZW1oNjlQaHhQQnJnQmMyczl2bjh5ZlIxWUtpdEF5VUVYUlRpbnJqeXh4SDVYZTM4TWNuSjVyWGtlWG4nXG4gICAgICAgICksXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGludmFsaWQgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhc2Vjb2luLmlzVmFsaWRQdWIoJ25vdC1hLXB1YicpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBjb21wcmVzc2VkIG5vZGUgcHVia2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzAyZWVjNzI0NWQ2YjdkMmNjYjMwMzgwYmZiZTJhMzY0OGNkN2E5NDI2NTNmNWFhMzQwZWRjZWExZjI4MzY4NjYxOScpLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMDNlNzE1NmFlMzNiMGEyMDhkMDc0NDE5OTE2MzE3N2U5MDllODAxNzZlNTVkOTdhMmYyMjFlZGUwZjkzNGRkOWFkJyksXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIG5vZGUgcHVia2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHdyb25nIHByZWZpeFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMDRlZWM3MjQ1ZDZiN2QyY2NiMzAzODBiZmJlMmEzNjQ4Y2Q3YTk0MjY1M2Y1YWEzNDBlZGNlYTFmMjgzNjg2NjE5JyksXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgLy8gdG9vIHNob3J0XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcwMmVlYzcyNDVkNmI3ZDJjY2IzMDM4MGJmYmUyYTM2NDhjZDdhOTQyNjUzZjVhYTM0MGVkY2VhMWYyODM2OCcpLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIC8vIHRvbyBsb25nXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcwMmVlYzcyNDVkNmI3ZDJjY2IzMDM4MGJmYmUyYTM2NDhjZDdhOTQyNjUzZjVhYTM0MGVkY2VhMWYyODM2ODY2MTkwMCcpLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIHRlc3RuZXQgYml0Y29pbiBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBwMnNoXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzJOQlNwVWpCUVVnNEJtV1VmdDhtMlZlUEdERVoyUUJGTTdYJyksIHRydWUpO1xuICAgICAgLy8gYmVjaDMyXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ3RiMXF3NTA4ZDZxZWp4dGRnNHk1cjN6YXJ2YXJ5MGM1eHc3a3hwanpzeCcpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCdub3QtYW4tYWRkcmVzcycpLCBmYWxzZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJycpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1dhbGxldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2FsbGV0SWQgPSAnd2FsbGV0MTIzJztcbiAgICBjb25zdCB2YWxpZEJpdGNvaW5BZGRyZXNzID0gJzJOQlNwVWpCUVVnNEJtV1VmdDhtMlZlUEdERVoyUUJGTTdYJztcbiAgICBjb25zdCBub2RlUHVia2V5ID0gJzAyZWVjNzI0NWQ2YjdkMmNjYjMwMzgwYmZiZTJhMzY0OGNkN2E5NDI2NTNmNWFhMzQwZWRjZWExZjI4MzY4NjYxOSc7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFkZHJlc3MgZXhpc3RzIG9uIHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvdGxuYnRjL3dhbGxldC8ke3dhbGxldElkfS9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbGlkQml0Y29pbkFkZHJlc3MpfWApXG4gICAgICAgIC5yZXBseSgyMDAsIHsgYWRkcmVzczogdmFsaWRCaXRjb2luQWRkcmVzcyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogdmFsaWRCaXRjb2luQWRkcmVzcywgd2FsbGV0SWQgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gYWRkcmVzcyBkb2VzIG5vdCBleGlzdCBvbiB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrKGJnVXJsKVxuICAgICAgICAuZ2V0KGAvYXBpL3YyL3RsbmJ0Yy93YWxsZXQvJHt3YWxsZXRJZH0vYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudCh2YWxpZEJpdGNvaW5BZGRyZXNzKX1gKVxuICAgICAgICAucmVwbHkoNDA0KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogdmFsaWRCaXRjb2luQWRkcmVzcywgd2FsbGV0SWQgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igbm9kZSBwdWJrZXlzIHdpdGhvdXQgcXVlcnlpbmcgQVBJJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogbm9kZVB1YmtleSwgd2FsbGV0SWQgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IEludmFsaWRBZGRyZXNzRXJyb3IgZm9yIGludmFsaWQgYWRkcmVzc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogJ2ludmFsaWQnLCB3YWxsZXRJZCB9KSwge1xuICAgICAgICBuYW1lOiAnSW52YWxpZEFkZHJlc3NFcnJvcicsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|