@bitgo-beta/abstract-lightning 1.0.0-alpha.31 → 1.0.0-alpha.310
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/src/abstractLightningCoin.d.ts +3 -2
- package/dist/src/abstractLightningCoin.d.ts.map +1 -1
- package/dist/src/abstractLightningCoin.js +7 -2
- package/dist/src/codecs/api/backup.d.ts +15 -0
- package/dist/src/codecs/api/backup.d.ts.map +1 -0
- package/dist/src/codecs/api/backup.js +47 -0
- package/dist/src/codecs/api/balance.d.ts +156 -0
- package/dist/src/codecs/api/balance.d.ts.map +1 -0
- package/dist/src/codecs/api/balance.js +107 -0
- package/dist/src/codecs/api/index.d.ts +8 -0
- package/dist/src/codecs/api/index.d.ts.map +1 -0
- package/dist/src/codecs/api/index.js +24 -0
- package/dist/src/codecs/api/invoice.d.ts +66 -0
- package/dist/src/codecs/api/invoice.d.ts.map +1 -0
- package/dist/src/codecs/api/invoice.js +102 -0
- package/dist/src/codecs/api/payment.d.ts +107 -0
- package/dist/src/codecs/api/payment.d.ts.map +1 -0
- package/dist/src/codecs/api/payment.js +153 -0
- package/dist/src/codecs/api/transaction.d.ts +138 -0
- package/dist/src/codecs/api/transaction.d.ts.map +1 -0
- package/dist/src/codecs/api/transaction.js +122 -0
- package/dist/src/codecs/api/wallet.d.ts +99 -0
- package/dist/src/codecs/api/wallet.d.ts.map +1 -0
- package/dist/src/codecs/api/wallet.js +103 -0
- package/dist/src/codecs/api/withdraw.d.ts +92 -0
- package/dist/src/codecs/api/withdraw.d.ts.map +1 -0
- package/dist/src/codecs/api/withdraw.js +92 -0
- package/dist/src/codecs/index.d.ts +3 -0
- package/dist/src/codecs/index.d.ts.map +1 -0
- package/dist/src/codecs/index.js +19 -0
- package/dist/src/codecs/shared.d.ts +7 -0
- package/dist/src/codecs/shared.d.ts.map +1 -0
- package/dist/src/codecs/shared.js +42 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -1
- package/dist/src/lightning/index.d.ts +5 -0
- package/dist/src/lightning/index.d.ts.map +1 -0
- package/dist/src/lightning/index.js +21 -0
- package/dist/src/lightning/lightningUtils.d.ts +90 -0
- package/dist/src/lightning/lightningUtils.d.ts.map +1 -0
- package/dist/src/lightning/lightningUtils.js +290 -0
- package/dist/src/lightning/parseWithdrawPsbt.d.ts +11 -0
- package/dist/src/lightning/parseWithdrawPsbt.d.ts.map +1 -0
- package/dist/src/lightning/parseWithdrawPsbt.js +159 -0
- package/dist/src/lightning/signableJson.d.ts +17 -0
- package/dist/src/lightning/signableJson.d.ts.map +1 -0
- package/dist/src/lightning/signableJson.js +29 -0
- package/dist/src/lightning/signature.d.ts +22 -0
- package/dist/src/lightning/signature.d.ts.map +1 -0
- package/dist/src/lightning/signature.js +69 -0
- package/dist/src/wallet/custodialLightning.d.ts +7 -0
- package/dist/src/wallet/custodialLightning.d.ts.map +1 -0
- package/dist/src/wallet/custodialLightning.js +14 -0
- package/dist/src/wallet/index.d.ts +5 -0
- package/dist/src/wallet/index.d.ts.map +1 -0
- package/dist/src/wallet/index.js +21 -0
- package/dist/src/wallet/lightning.d.ts +141 -0
- package/dist/src/wallet/lightning.d.ts.map +1 -0
- package/dist/src/wallet/lightning.js +288 -0
- package/dist/src/wallet/selfCustodialLightning.d.ts +32 -0
- package/dist/src/wallet/selfCustodialLightning.d.ts.map +1 -0
- package/dist/src/wallet/selfCustodialLightning.js +131 -0
- package/dist/src/wallet/wallet.d.ts +7 -0
- package/dist/src/wallet/wallet.d.ts.map +1 -0
- package/dist/src/wallet/wallet.js +22 -0
- package/dist/test/unit/lightning/codecs.d.ts +2 -0
- package/dist/test/unit/lightning/codecs.d.ts.map +1 -0
- package/dist/test/unit/lightning/codecs.js +151 -0
- package/dist/test/unit/lightning/createPsbt.d.ts +27 -0
- package/dist/test/unit/lightning/createPsbt.d.ts.map +1 -0
- package/dist/test/unit/lightning/createPsbt.js +162 -0
- package/dist/test/unit/lightning/createWatchOnlyFixture.d.ts +4 -0
- package/dist/test/unit/lightning/createWatchOnlyFixture.d.ts.map +1 -0
- package/dist/test/unit/lightning/createWatchOnlyFixture.js +1561 -0
- package/dist/test/unit/lightning/lightningUtils.d.ts +2 -0
- package/dist/test/unit/lightning/lightningUtils.d.ts.map +1 -0
- package/dist/test/unit/lightning/lightningUtils.js +123 -0
- package/dist/test/unit/lightning/parseWithdrawPsbt.d.ts +2 -0
- package/dist/test/unit/lightning/parseWithdrawPsbt.d.ts.map +1 -0
- package/dist/test/unit/lightning/parseWithdrawPsbt.js +441 -0
- package/dist/test/unit/lightning/signableJson.d.ts +2 -0
- package/dist/test/unit/lightning/signableJson.d.ts.map +1 -0
- package/dist/test/unit/lightning/signableJson.js +52 -0
- package/dist/test/unit/lightning/signature.d.ts +2 -0
- package/dist/test/unit/lightning/signature.d.ts.map +1 -0
- package/dist/test/unit/lightning/signature.js +91 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +19 -6
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -40
|
@@ -0,0 +1,441 @@
|
|
|
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
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const src_1 = require("../../../src");
|
|
40
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
41
|
+
const assert_1 = __importDefault(require("assert"));
|
|
42
|
+
const createPsbt_1 = require("./createPsbt");
|
|
43
|
+
describe('parseWithdrawPsbt', () => {
|
|
44
|
+
const network = utxolib.networks.testnet;
|
|
45
|
+
describe('regression tests with hardcoded PSBT', () => {
|
|
46
|
+
// Keeping one regression test with real PSBT data to ensure backward compatibility
|
|
47
|
+
const unsignedPsbtHex = '70736274ff01007d02000000015e50b8d96cebdc3273d9a100eb68392d980d5b934b8170c80a23488b595268ca0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15affa80a000000000016001480a06f2e6b77e817fd5de6e41ea512c563c26cb800000000000100ea02000000000101a158d806735bb7c54e4c701d4f5821cd5342d48d5e1fcbed1169e6e45aa444be0100000000ffffffff02a086010000000000225120379bc88cc15d3605ed9de1b61ff8d65021b650db1151e751a30885ccfcc7d15a6a310c000000000016001478a5d98c7160484b9b00f1782803c58edfc49b9a024730440220407d9162f52371df246dcfa2943d40fbdcb0d4b6768f7682c65193378b2845a60220101c7bc460c93d2976961ac23400f0f10c145efb989a3addb7f03ebaaa2200950121037e17444c85c8b7da07f12fd53cb2ca142c2b4932d0f898649c4b5be0021da0980000000001030401000000220602e57146e5b4762a7ff374adf4072047b67ef115ad46a34189bdeb6a4f88db9b0818000000005400008000000080000000800100000006000000000022020379abbe44004ff7e527bdee3dd8d95e5cd250053f35ee92258b97aa83dfa93c621800000000540000800000008000000080010000005000000000';
|
|
48
|
+
const recipients = [
|
|
49
|
+
{
|
|
50
|
+
amountSat: 100000n,
|
|
51
|
+
address: 'tb1px7du3rxpt5mqtmvauxmpl7xk2qsmv5xmz9g7w5drpzzuelx869dqwape7k',
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
const accounts = [
|
|
55
|
+
{
|
|
56
|
+
xpub: 'tpubDCmiWMkTJrZ24t1Z6ECR3HyynCyZ9zGsWqhcLh6H4yFK2CDozSszD1pP2Li4Nx1YYtRcvmNbdb3nD1SzFejYtPFfTocTv2EaAgJCg4zpJpA',
|
|
57
|
+
purpose: 49,
|
|
58
|
+
coin_type: 0,
|
|
59
|
+
account: 0,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
xpub: 'tpubDCFN7bsxR9UTKggdH2pmv5HeHGQNiDrJwa1EZFtP9sH5PF28i37FHpoYSYARQkKZ6Mi98pkp7oypDcxFmE4dQGq8jV8Gv3L6gmWBeRwPxkP',
|
|
63
|
+
purpose: 84,
|
|
64
|
+
coin_type: 0,
|
|
65
|
+
account: 0,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
it('should parse a valid withdraw PSBT', () => {
|
|
69
|
+
(0, src_1.validatePsbtForWithdraw)(unsignedPsbtHex, network, recipients, accounts);
|
|
70
|
+
});
|
|
71
|
+
it('should throw for invalid PSBT hex', () => {
|
|
72
|
+
assert_1.default.throws(() => {
|
|
73
|
+
(0, src_1.validatePsbtForWithdraw)('asdasd', network, recipients, accounts);
|
|
74
|
+
}, /ERR_BUFFER_OUT_OF_BOUNDS/);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('test cases with creating psbt on the go', () => {
|
|
78
|
+
it('should validate PSBT with P2WPKH (purpose 84) change address', () => {
|
|
79
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
80
|
+
network,
|
|
81
|
+
inputValue: 500000,
|
|
82
|
+
outputValue: 100000,
|
|
83
|
+
changeValue: 390000,
|
|
84
|
+
changePurpose: 84,
|
|
85
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
86
|
+
});
|
|
87
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
88
|
+
const recipients = [
|
|
89
|
+
{
|
|
90
|
+
amountSat: BigInt(100000),
|
|
91
|
+
address: recipientAddress,
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
const accounts = [
|
|
95
|
+
{
|
|
96
|
+
xpub: masterKey.neutered().toBase58(),
|
|
97
|
+
purpose: 84,
|
|
98
|
+
coin_type: 0,
|
|
99
|
+
account: 0,
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
103
|
+
});
|
|
104
|
+
it('should validate PSBT with P2SH-P2WPKH (purpose 49) change address', () => {
|
|
105
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
106
|
+
network,
|
|
107
|
+
inputValue: 500000,
|
|
108
|
+
outputValue: 100000,
|
|
109
|
+
changeValue: 390000,
|
|
110
|
+
changePurpose: 49,
|
|
111
|
+
changeDerivationPath: "m/49'/0'/0'/1/6",
|
|
112
|
+
});
|
|
113
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
114
|
+
const recipients = [
|
|
115
|
+
{
|
|
116
|
+
amountSat: BigInt(100000),
|
|
117
|
+
address: recipientAddress,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
const accounts = [
|
|
121
|
+
{
|
|
122
|
+
xpub: masterKey.neutered().toBase58(),
|
|
123
|
+
purpose: 49,
|
|
124
|
+
coin_type: 0,
|
|
125
|
+
account: 0,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
129
|
+
});
|
|
130
|
+
it('should validate PSBT with P2TR (purpose 86) change address', () => {
|
|
131
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
132
|
+
network,
|
|
133
|
+
inputValue: 500000,
|
|
134
|
+
outputValue: 100000,
|
|
135
|
+
changeValue: 390000,
|
|
136
|
+
changePurpose: 86,
|
|
137
|
+
changeDerivationPath: "m/86'/0'/0'/1/6",
|
|
138
|
+
});
|
|
139
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
140
|
+
const recipients = [
|
|
141
|
+
{
|
|
142
|
+
amountSat: BigInt(100000),
|
|
143
|
+
address: recipientAddress,
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
const accounts = [
|
|
147
|
+
{
|
|
148
|
+
xpub: masterKey.neutered().toBase58(),
|
|
149
|
+
purpose: 86,
|
|
150
|
+
coin_type: 0,
|
|
151
|
+
account: 0,
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
155
|
+
});
|
|
156
|
+
it('should throw for missing bip32Derivation path on change output', () => {
|
|
157
|
+
const { psbt, masterKey } = (0, createPsbt_1.createTestPsbt)({
|
|
158
|
+
network,
|
|
159
|
+
inputValue: 500000,
|
|
160
|
+
outputValue: 100000,
|
|
161
|
+
changeValue: 390000,
|
|
162
|
+
changePurpose: 84,
|
|
163
|
+
});
|
|
164
|
+
// Remove the bip32Derivation from the change output
|
|
165
|
+
// This will cause the output to be treated as a regular recipient output, not a change output
|
|
166
|
+
delete psbt.data.outputs[1].bip32Derivation;
|
|
167
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
168
|
+
const recipients = [
|
|
169
|
+
{
|
|
170
|
+
amountSat: BigInt(100000),
|
|
171
|
+
address: recipientAddress,
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
const accounts = [
|
|
175
|
+
{
|
|
176
|
+
xpub: masterKey.neutered().toBase58(),
|
|
177
|
+
purpose: 84,
|
|
178
|
+
coin_type: 0,
|
|
179
|
+
account: 0,
|
|
180
|
+
},
|
|
181
|
+
];
|
|
182
|
+
// The output without bip32Derivation is treated as a recipient output,
|
|
183
|
+
// and since it's not in the recipients list, it should fail with "does not match any recipient"
|
|
184
|
+
assert_1.default.throws(() => {
|
|
185
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
186
|
+
}, /does not match any recipient/);
|
|
187
|
+
});
|
|
188
|
+
it('should throw for invalid change address (derived address mismatch)', () => {
|
|
189
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
190
|
+
network,
|
|
191
|
+
inputValue: 500000,
|
|
192
|
+
outputValue: 100000,
|
|
193
|
+
changeValue: 390000,
|
|
194
|
+
changePurpose: 84,
|
|
195
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
196
|
+
});
|
|
197
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
198
|
+
const recipients = [
|
|
199
|
+
{
|
|
200
|
+
amountSat: BigInt(100000),
|
|
201
|
+
address: recipientAddress,
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
// Use a different xpub that won't match the change address
|
|
205
|
+
const differentMasterKey = utxolib.bip32.fromSeed(Buffer.alloc(32, 2), network);
|
|
206
|
+
const accounts = [
|
|
207
|
+
{
|
|
208
|
+
xpub: differentMasterKey.neutered().toBase58(),
|
|
209
|
+
purpose: 84,
|
|
210
|
+
coin_type: 0,
|
|
211
|
+
account: 0,
|
|
212
|
+
},
|
|
213
|
+
];
|
|
214
|
+
assert_1.default.throws(() => {
|
|
215
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
216
|
+
}, /Derived pubkey does not match for address/);
|
|
217
|
+
});
|
|
218
|
+
it('should validate PSBT with upub prefix (P2SH-P2WPKH testnet)', () => {
|
|
219
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
220
|
+
network,
|
|
221
|
+
inputValue: 500000,
|
|
222
|
+
outputValue: 100000,
|
|
223
|
+
changeValue: 390000,
|
|
224
|
+
changePurpose: 49,
|
|
225
|
+
changeDerivationPath: "m/49'/0'/0'/1/6",
|
|
226
|
+
});
|
|
227
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
228
|
+
const recipients = [
|
|
229
|
+
{
|
|
230
|
+
amountSat: BigInt(100000),
|
|
231
|
+
address: recipientAddress,
|
|
232
|
+
},
|
|
233
|
+
];
|
|
234
|
+
// Use upub prefix (testnet P2SH-P2WPKH) instead of standard tpub
|
|
235
|
+
// This tests that revertXpubPrefix correctly converts upub -> tpub
|
|
236
|
+
const accounts = [
|
|
237
|
+
{
|
|
238
|
+
xpub: 'upub5Eep7H5q39PzQZLVEYLBytDyBNeV74E8mQsyeL6UozFq9Y3MsZ52G7YGuqrJPgoyAqF7TBeJdnkrHrVrB5pkWkPJ9cJGAePMU6F1Gyw6aFH',
|
|
239
|
+
purpose: 49,
|
|
240
|
+
coin_type: 0,
|
|
241
|
+
account: 0,
|
|
242
|
+
},
|
|
243
|
+
];
|
|
244
|
+
// This should work because revertXpubPrefix will convert upub back to tpub
|
|
245
|
+
// However, the master key we used is different, so it should fail with pubkey mismatch
|
|
246
|
+
assert_1.default.throws(() => {
|
|
247
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
248
|
+
}, /Derived pubkey does not match for address/);
|
|
249
|
+
});
|
|
250
|
+
it('should validate PSBT with vpub prefix (P2WPKH testnet)', () => {
|
|
251
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
252
|
+
network,
|
|
253
|
+
inputValue: 500000,
|
|
254
|
+
outputValue: 100000,
|
|
255
|
+
changeValue: 390000,
|
|
256
|
+
changePurpose: 84,
|
|
257
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
258
|
+
});
|
|
259
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
260
|
+
const recipients = [
|
|
261
|
+
{
|
|
262
|
+
amountSat: BigInt(100000),
|
|
263
|
+
address: recipientAddress,
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
// Use vpub prefix (testnet P2WPKH) instead of standard tpub
|
|
267
|
+
// This tests that revertXpubPrefix correctly converts vpub -> tpub
|
|
268
|
+
const accounts = [
|
|
269
|
+
{
|
|
270
|
+
xpub: 'vpub5ZU1PHGpQoDSHckYico4nsvwsD3mTh6UjqL5zyGWXZXzBjTYMNKot7t9eRPQY71hJcnNN9r1ss25g3xA9rmoJ5nWPg8jEWavrttnsVa1qw1',
|
|
271
|
+
purpose: 84,
|
|
272
|
+
coin_type: 0,
|
|
273
|
+
account: 0,
|
|
274
|
+
},
|
|
275
|
+
];
|
|
276
|
+
// This should work because revertXpubPrefix will convert vpub back to tpub
|
|
277
|
+
// However, the master key we used is different, so it should fail with pubkey mismatch
|
|
278
|
+
assert_1.default.throws(() => {
|
|
279
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
280
|
+
}, /Derived pubkey does not match for address/);
|
|
281
|
+
});
|
|
282
|
+
it('should validate PSBT with matching upub prefix and correct key', () => {
|
|
283
|
+
// Import the signer root key from the fixture which corresponds to the upub/vpub accounts
|
|
284
|
+
const signerRootKey = 'tprv8ZgxMBicQKsPe6jS4vDm2n7s42Q6MpvghUQqMmSKG7bTZvGKtjrcU3PGzMNG37yzxywrcdvgkwrr8eYXJmbwdvUNVT4Ucv7ris4jvA7BUmg';
|
|
285
|
+
const masterHDNode = utxolib.bip32.fromBase58(signerRootKey, network);
|
|
286
|
+
// Derive the account key for purpose 49
|
|
287
|
+
const accountKey = masterHDNode.derivePath("m/49'/0'/0'");
|
|
288
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
289
|
+
network,
|
|
290
|
+
inputValue: 500000,
|
|
291
|
+
outputValue: 100000,
|
|
292
|
+
changeValue: 390000,
|
|
293
|
+
changePurpose: 49,
|
|
294
|
+
changeDerivationPath: "m/49'/0'/0'/1/6",
|
|
295
|
+
masterKey: accountKey,
|
|
296
|
+
});
|
|
297
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
298
|
+
const recipients = [
|
|
299
|
+
{
|
|
300
|
+
amountSat: BigInt(100000),
|
|
301
|
+
address: recipientAddress,
|
|
302
|
+
},
|
|
303
|
+
];
|
|
304
|
+
// Use the upub from the fixture - this should work because the keys match
|
|
305
|
+
const accounts = [
|
|
306
|
+
{
|
|
307
|
+
xpub: 'upub5Eep7H5q39PzQZLVEYLBytDyBNeV74E8mQsyeL6UozFq9Y3MsZ52G7YGuqrJPgoyAqF7TBeJdnkrHrVrB5pkWkPJ9cJGAePMU6F1Gyw6aFH',
|
|
308
|
+
purpose: 49,
|
|
309
|
+
coin_type: 0,
|
|
310
|
+
account: 0,
|
|
311
|
+
},
|
|
312
|
+
];
|
|
313
|
+
// This should pass - revertXpubPrefix converts upub -> tpub, and the key matches
|
|
314
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
315
|
+
});
|
|
316
|
+
it('should validate PSBT with matching vpub prefix and correct key', () => {
|
|
317
|
+
// Import the signer root key from the fixture which corresponds to the upub/vpub accounts
|
|
318
|
+
const signerRootKey = 'tprv8ZgxMBicQKsPe6jS4vDm2n7s42Q6MpvghUQqMmSKG7bTZvGKtjrcU3PGzMNG37yzxywrcdvgkwrr8eYXJmbwdvUNVT4Ucv7ris4jvA7BUmg';
|
|
319
|
+
const masterHDNode = utxolib.bip32.fromBase58(signerRootKey, network);
|
|
320
|
+
// Derive the account key for purpose 84
|
|
321
|
+
const accountKey = masterHDNode.derivePath("m/84'/0'/0'");
|
|
322
|
+
const { psbt } = (0, createPsbt_1.createTestPsbt)({
|
|
323
|
+
network,
|
|
324
|
+
inputValue: 500000,
|
|
325
|
+
outputValue: 100000,
|
|
326
|
+
changeValue: 390000,
|
|
327
|
+
changePurpose: 84,
|
|
328
|
+
changeDerivationPath: "m/84'/0'/0'/1/6",
|
|
329
|
+
masterKey: accountKey,
|
|
330
|
+
});
|
|
331
|
+
const recipientAddress = utxolib.address.fromOutputScript(psbt.txOutputs[0].script, network);
|
|
332
|
+
const recipients = [
|
|
333
|
+
{
|
|
334
|
+
amountSat: BigInt(100000),
|
|
335
|
+
address: recipientAddress,
|
|
336
|
+
},
|
|
337
|
+
];
|
|
338
|
+
// Use the vpub from the fixture - this should work because the keys match
|
|
339
|
+
const accounts = [
|
|
340
|
+
{
|
|
341
|
+
xpub: 'vpub5ZU1PHGpQoDSHckYico4nsvwsD3mTh6UjqL5zyGWXZXzBjTYMNKot7t9eRPQY71hJcnNN9r1ss25g3xA9rmoJ5nWPg8jEWavrttnsVa1qw1',
|
|
342
|
+
purpose: 84,
|
|
343
|
+
coin_type: 0,
|
|
344
|
+
account: 0,
|
|
345
|
+
},
|
|
346
|
+
];
|
|
347
|
+
// This should pass - revertXpubPrefix converts vpub -> tpub, and the key matches
|
|
348
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
349
|
+
});
|
|
350
|
+
it('should validate PSBT with multiple recipients', () => {
|
|
351
|
+
// Create a PSBT manually with 2 recipient outputs and 1 change output
|
|
352
|
+
const masterKey = utxolib.bip32.fromSeed(Buffer.alloc(32, 1), network);
|
|
353
|
+
const inputKeyPair = utxolib.ECPair.makeRandom({ network });
|
|
354
|
+
const p2wpkhInput = utxolib.payments.p2wpkh({
|
|
355
|
+
pubkey: Buffer.from(inputKeyPair.publicKey),
|
|
356
|
+
network,
|
|
357
|
+
});
|
|
358
|
+
const psbt = new utxolib.Psbt({ network });
|
|
359
|
+
// Add input
|
|
360
|
+
psbt.addInput({
|
|
361
|
+
hash: 'ca6852598b48230ac870814b935b0d982d3968eb00a1d97332dceb6cd9b8505e',
|
|
362
|
+
index: 1,
|
|
363
|
+
witnessUtxo: {
|
|
364
|
+
script: p2wpkhInput.output,
|
|
365
|
+
value: BigInt(500000),
|
|
366
|
+
},
|
|
367
|
+
bip32Derivation: [
|
|
368
|
+
{
|
|
369
|
+
masterFingerprint: Buffer.alloc(4, 0),
|
|
370
|
+
path: "m/84'/0'/0'/0/0",
|
|
371
|
+
pubkey: Buffer.from(inputKeyPair.publicKey),
|
|
372
|
+
},
|
|
373
|
+
],
|
|
374
|
+
});
|
|
375
|
+
// Create first recipient
|
|
376
|
+
const recipient1KeyPair = utxolib.ECPair.makeRandom({ network });
|
|
377
|
+
const recipient1Payment = utxolib.payments.p2wpkh({
|
|
378
|
+
pubkey: Buffer.from(recipient1KeyPair.publicKey),
|
|
379
|
+
network,
|
|
380
|
+
});
|
|
381
|
+
const recipient1Address = recipient1Payment.address;
|
|
382
|
+
// Create second recipient
|
|
383
|
+
const recipient2KeyPair = utxolib.ECPair.makeRandom({ network });
|
|
384
|
+
const recipient2Payment = utxolib.payments.p2wpkh({
|
|
385
|
+
pubkey: Buffer.from(recipient2KeyPair.publicKey),
|
|
386
|
+
network,
|
|
387
|
+
});
|
|
388
|
+
const recipient2Address = recipient2Payment.address;
|
|
389
|
+
// Derive change address from master key
|
|
390
|
+
const changeNode = masterKey.derive(1).derive(6); // m/1/6
|
|
391
|
+
const changePayment = utxolib.payments.p2wpkh({
|
|
392
|
+
pubkey: changeNode.publicKey,
|
|
393
|
+
network,
|
|
394
|
+
});
|
|
395
|
+
const changeAddress = changePayment.address;
|
|
396
|
+
// Add outputs: recipient1, recipient2, change
|
|
397
|
+
psbt.addOutput({
|
|
398
|
+
address: recipient1Address,
|
|
399
|
+
value: BigInt(100000),
|
|
400
|
+
});
|
|
401
|
+
psbt.addOutput({
|
|
402
|
+
address: recipient2Address,
|
|
403
|
+
value: BigInt(50000),
|
|
404
|
+
});
|
|
405
|
+
psbt.addOutput({
|
|
406
|
+
address: changeAddress,
|
|
407
|
+
value: BigInt(340000), // 500000 - 100000 - 50000 - 10000 (fee)
|
|
408
|
+
});
|
|
409
|
+
// Add bip32Derivation to the change output (index 2)
|
|
410
|
+
psbt.updateOutput(2, {
|
|
411
|
+
bip32Derivation: [
|
|
412
|
+
{
|
|
413
|
+
masterFingerprint: Buffer.alloc(4, 0),
|
|
414
|
+
path: "m/84'/0'/0'/1/6",
|
|
415
|
+
pubkey: changeNode.publicKey,
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
});
|
|
419
|
+
const recipients = [
|
|
420
|
+
{
|
|
421
|
+
amountSat: BigInt(100000),
|
|
422
|
+
address: recipient1Address,
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
amountSat: BigInt(50000),
|
|
426
|
+
address: recipient2Address,
|
|
427
|
+
},
|
|
428
|
+
];
|
|
429
|
+
const accounts = [
|
|
430
|
+
{
|
|
431
|
+
xpub: masterKey.neutered().toBase58(),
|
|
432
|
+
purpose: 84,
|
|
433
|
+
coin_type: 0,
|
|
434
|
+
account: 0,
|
|
435
|
+
},
|
|
436
|
+
];
|
|
437
|
+
(0, src_1.validatePsbtForWithdraw)(psbt.toHex(), network, recipients, accounts);
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VXaXRoZHJhd1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGlnaHRuaW5nL3BhcnNlV2l0aGRyYXdQc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0NBQXVEO0FBQ3ZELDhEQUFnRDtBQUNoRCxvREFBNEI7QUFDNUIsNkNBQThDO0FBRTlDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7SUFDakMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFFekMsUUFBUSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxtRkFBbUY7UUFDbkYsTUFBTSxlQUFlLEdBQ25CLDQrQkFBNCtCLENBQUM7UUFDLytCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCO2dCQUNFLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixPQUFPLEVBQUUsZ0VBQWdFO2FBQzFFO1NBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHO1lBQ2Y7Z0JBQ0UsSUFBSSxFQUFFLGlIQUFpSDtnQkFDdkgsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNEO2dCQUNFLElBQUksRUFBRSxpSEFBaUg7Z0JBQ3ZILE9BQU8sRUFBRSxFQUFFO2dCQUNYLFNBQVMsRUFBRSxDQUFDO2dCQUNaLE9BQU8sRUFBRSxDQUFDO2FBQ1g7U0FDRixDQUFDO1FBRUYsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxJQUFBLDZCQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtZQUMzQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUEsNkJBQXVCLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkUsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7UUFDdkQsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEdBQUcsRUFBRTtZQUN0RSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEsMkJBQWMsRUFBQztnQkFDekMsT0FBTztnQkFDUCxVQUFVLEVBQUUsTUFBTTtnQkFDbEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsaUJBQWlCO2FBQ3hDLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixNQUFNLFVBQVUsR0FBRztnQkFDakI7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmO29CQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUNyQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRixJQUFBLDZCQUF1QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEsMkJBQWMsRUFBQztnQkFDekMsT0FBTztnQkFDUCxVQUFVLEVBQUUsTUFBTTtnQkFDbEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsaUJBQWlCO2FBQ3hDLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixNQUFNLFVBQVUsR0FBRztnQkFDakI7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmO29CQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUNyQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRixJQUFBLDZCQUF1QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtZQUNwRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEsMkJBQWMsRUFBQztnQkFDekMsT0FBTztnQkFDUCxVQUFVLEVBQUUsTUFBTTtnQkFDbEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsaUJBQWlCO2FBQ3hDLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixNQUFNLFVBQVUsR0FBRztnQkFDakI7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmO29CQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUNyQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRixJQUFBLDZCQUF1QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEdBQUcsRUFBRTtZQUN4RSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEsMkJBQWMsRUFBQztnQkFDekMsT0FBTztnQkFDUCxVQUFVLEVBQUUsTUFBTTtnQkFDbEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixhQUFhLEVBQUUsRUFBRTthQUNsQixDQUFDLENBQUM7WUFFSCxvREFBb0Q7WUFDcEQsOEZBQThGO1lBQzlGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBRTVDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixNQUFNLFVBQVUsR0FBRztnQkFDakI7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmO29CQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUNyQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRix1RUFBdUU7WUFDdkUsZ0dBQWdHO1lBQ2hHLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsSUFBQSw2QkFBdUIsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLEVBQUUsOEJBQThCLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxHQUFHLEVBQUU7WUFDNUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEsMkJBQWMsRUFBQztnQkFDOUIsT0FBTztnQkFDUCxVQUFVLEVBQUUsTUFBTTtnQkFDbEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsaUJBQWlCO2FBQ3hDLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixNQUFNLFVBQVUsR0FBRztnQkFDakI7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLDJEQUEyRDtZQUMzRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sUUFBUSxHQUFHO2dCQUNmO29CQUNFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7b0JBQzlDLE9BQU8sRUFBRSxFQUFFO29CQUNYLFNBQVMsRUFBRSxDQUFDO29CQUNaLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2FBQ0YsQ0FBQztZQUVGLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsSUFBQSw2QkFBdUIsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLEVBQUUsMkNBQTJDLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxHQUFHLEVBQUU7WUFDckUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEsMkJBQWMsRUFBQztnQkFDOUIsT0FBTztnQkFDUCxVQUFVLEVBQUUsTUFBTTtnQkFDbEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsaUJBQWlCO2FBQ3hDLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixNQUFNLFVBQVUsR0FBRztnQkFDakI7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLGlFQUFpRTtZQUNqRSxtRUFBbUU7WUFDbkUsTUFBTSxRQUFRLEdBQUc7Z0JBQ2Y7b0JBQ0UsSUFBSSxFQUFFLGlIQUFpSDtvQkFDdkgsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsU0FBUyxFQUFFLENBQUM7b0JBQ1osT0FBTyxFQUFFLENBQUM7aUJBQ1g7YUFDRixDQUFDO1lBRUYsMkVBQTJFO1lBQzNFLHVGQUF1RjtZQUN2RixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUEsNkJBQXVCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxFQUFFLDJDQUEyQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsR0FBRyxFQUFFO1lBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLDJCQUFjLEVBQUM7Z0JBQzlCLE9BQU87Z0JBQ1AsVUFBVSxFQUFFLE1BQU07Z0JBQ2xCLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixXQUFXLEVBQUUsTUFBTTtnQkFDbkIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG9CQUFvQixFQUFFLGlCQUFpQjthQUN4QyxDQUFDLENBQUM7WUFFSCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFN0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCO29CQUNFLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO29CQUN6QixPQUFPLEVBQUUsZ0JBQWdCO2lCQUMxQjthQUNGLENBQUM7WUFFRiw0REFBNEQ7WUFDNUQsbUVBQW1FO1lBQ25FLE1BQU0sUUFBUSxHQUFHO2dCQUNmO29CQUNFLElBQUksRUFBRSxpSEFBaUg7b0JBQ3ZILE9BQU8sRUFBRSxFQUFFO29CQUNYLFNBQVMsRUFBRSxDQUFDO29CQUNaLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2FBQ0YsQ0FBQztZQUVGLDJFQUEyRTtZQUMzRSx1RkFBdUY7WUFDdkYsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixJQUFBLDZCQUF1QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEdBQUcsRUFBRTtZQUN4RSwwRkFBMEY7WUFDMUYsTUFBTSxhQUFhLEdBQ2pCLGlIQUFpSCxDQUFDO1lBQ3BILE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV0RSx3Q0FBd0M7WUFDeEMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUUxRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBQSwyQkFBYyxFQUFDO2dCQUM5QixPQUFPO2dCQUNQLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixXQUFXLEVBQUUsTUFBTTtnQkFDbkIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixvQkFBb0IsRUFBRSxpQkFBaUI7Z0JBQ3ZDLFNBQVMsRUFBRSxVQUFVO2FBQ3RCLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixNQUFNLFVBQVUsR0FBRztnQkFDakI7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztZQUVGLDBFQUEwRTtZQUMxRSxNQUFNLFFBQVEsR0FBRztnQkFDZjtvQkFDRSxJQUFJLEVBQUUsaUhBQWlIO29CQUN2SCxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRixpRkFBaUY7WUFDakYsSUFBQSw2QkFBdUIsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRSxHQUFHLEVBQUU7WUFDeEUsMEZBQTBGO1lBQzFGLE1BQU0sYUFBYSxHQUNqQixpSEFBaUgsQ0FBQztZQUNwSCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFdEUsd0NBQXdDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFMUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEsMkJBQWMsRUFBQztnQkFDOUIsT0FBTztnQkFDUCxVQUFVLEVBQUUsTUFBTTtnQkFDbEIsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsaUJBQWlCO2dCQUN2QyxTQUFTLEVBQUUsVUFBVTthQUN0QixDQUFDLENBQUM7WUFFSCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFN0YsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCO29CQUNFLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO29CQUN6QixPQUFPLEVBQUUsZ0JBQWdCO2lCQUMxQjthQUNGLENBQUM7WUFFRiwwRUFBMEU7WUFDMUUsTUFBTSxRQUFRLEdBQUc7Z0JBQ2Y7b0JBQ0UsSUFBSSxFQUFFLGlIQUFpSDtvQkFDdkgsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsU0FBUyxFQUFFLENBQUM7b0JBQ1osT0FBTyxFQUFFLENBQUM7aUJBQ1g7YUFDRixDQUFDO1lBRUYsaUZBQWlGO1lBQ2pGLElBQUEsNkJBQXVCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQ3ZELHNFQUFzRTtZQUN0RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV2RSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQzFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7Z0JBQzNDLE9BQU87YUFDUixDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRTNDLFlBQVk7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLElBQUksRUFBRSxrRUFBa0U7Z0JBQ3hFLEtBQUssRUFBRSxDQUFDO2dCQUNSLFdBQVcsRUFBRTtvQkFDWCxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU87b0JBQzNCLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUN0QjtnQkFDRCxlQUFlLEVBQUU7b0JBQ2Y7d0JBQ0UsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNyQyxJQUFJLEVBQUUsaUJBQWlCO3dCQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO3FCQUM1QztpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILHlCQUF5QjtZQUN6QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNqRSxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUNoRCxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hELE9BQU87YUFDUixDQUFDLENBQUM7WUFDSCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE9BQVEsQ0FBQztZQUVyRCwwQkFBMEI7WUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDakUsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDaEQsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO2dCQUNoRCxPQUFPO2FBQ1IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxPQUFRLENBQUM7WUFFckQsd0NBQXdDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUMxRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDNUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxTQUFTO2dCQUM1QixPQUFPO2FBQ1IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQVEsQ0FBQztZQUU3Qyw4Q0FBOEM7WUFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDYixPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUN0QixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ3JCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsd0NBQXdDO2FBQ2hFLENBQUMsQ0FBQztZQUVILHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRTtnQkFDbkIsZUFBZSxFQUFFO29CQUNmO3dCQUNFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDckMsSUFBSSxFQUFFLGlCQUFpQjt3QkFDdkIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxTQUFTO3FCQUM3QjtpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sVUFBVSxHQUFHO2dCQUNqQjtvQkFDRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDekIsT0FBTyxFQUFFLGlCQUFpQjtpQkFDM0I7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQ3hCLE9BQU8sRUFBRSxpQkFBaUI7aUJBQzNCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHO2dCQUNmO29CQUNFLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO29CQUNyQyxPQUFPLEVBQUUsRUFBRTtvQkFDWCxTQUFTLEVBQUUsQ0FBQztvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGLENBQUM7WUFFRixJQUFBLDZCQUF1QixFQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlUHNidEZvcldpdGhkcmF3IH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlVGVzdFBzYnQgfSBmcm9tICcuL2NyZWF0ZVBzYnQnO1xuXG5kZXNjcmliZSgncGFyc2VXaXRoZHJhd1BzYnQnLCAoKSA9PiB7XG4gIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLnRlc3RuZXQ7XG5cbiAgZGVzY3JpYmUoJ3JlZ3Jlc3Npb24gdGVzdHMgd2l0aCBoYXJkY29kZWQgUFNCVCcsICgpID0+IHtcbiAgICAvLyBLZWVwaW5nIG9uZSByZWdyZXNzaW9uIHRlc3Qgd2l0aCByZWFsIFBTQlQgZGF0YSB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHVuc2lnbmVkUHNidEhleCA9XG4gICAgICAnNzA3MzYyNzRmZjAxMDA3ZDAyMDAwMDAwMDE1ZTUwYjhkOTZjZWJkYzMyNzNkOWExMDBlYjY4MzkyZDk4MGQ1YjkzNGI4MTcwYzgwYTIzNDg4YjU5NTI2OGNhMDEwMDAwMDAwMGZmZmZmZmZmMDJhMDg2MDEwMDAwMDAwMDAwMjI1MTIwMzc5YmM4OGNjMTVkMzYwNWVkOWRlMWI2MWZmOGQ2NTAyMWI2NTBkYjExNTFlNzUxYTMwODg1Y2NmY2M3ZDE1YWZmYTgwYTAwMDAwMDAwMDAxNjAwMTQ4MGEwNmYyZTZiNzdlODE3ZmQ1ZGU2ZTQxZWE1MTJjNTYzYzI2Y2I4MDAwMDAwMDAwMDAxMDBlYTAyMDAwMDAwMDAwMTAxYTE1OGQ4MDY3MzViYjdjNTRlNGM3MDFkNGY1ODIxY2Q1MzQyZDQ4ZDVlMWZjYmVkMTE2OWU2ZTQ1YWE0NDRiZTAxMDAwMDAwMDBmZmZmZmZmZjAyYTA4NjAxMDAwMDAwMDAwMDIyNTEyMDM3OWJjODhjYzE1ZDM2MDVlZDlkZTFiNjFmZjhkNjUwMjFiNjUwZGIxMTUxZTc1MWEzMDg4NWNjZmNjN2QxNWE2YTMxMGMwMDAwMDAwMDAwMTYwMDE0NzhhNWQ5OGM3MTYwNDg0YjliMDBmMTc4MjgwM2M1OGVkZmM0OWI5YTAyNDczMDQ0MDIyMDQwN2Q5MTYyZjUyMzcxZGYyNDZkY2ZhMjk0M2Q0MGZiZGNiMGQ0YjY3NjhmNzY4MmM2NTE5MzM3OGIyODQ1YTYwMjIwMTAxYzdiYzQ2MGM5M2QyOTc2OTYxYWMyMzQwMGYwZjEwYzE0NWVmYjk4OWEzYWRkYjdmMDNlYmFhYTIyMDA5NTAxMjEwMzdlMTc0NDRjODVjOGI3ZGEwN2YxMmZkNTNjYjJjYTE0MmMyYjQ5MzJkMGY4OTg2NDljNGI1YmUwMDIxZGEwOTgwMDAwMDAwMDAxMDMwNDAxMDAwMDAwMjIwNjAyZTU3MTQ2ZTViNDc2MmE3ZmYzNzRhZGY0MDcyMDQ3YjY3ZWYxMTVhZDQ2YTM0MTg5YmRlYjZhNGY4OGRiOWIwODE4MDAwMDAwMDA1NDAwMDA4MDAwMDAwMDgwMDAwMDAwODAwMTAwMDAwMDA2MDAwMDAwMDAwMDIyMDIwMzc5YWJiZTQ0MDA0ZmY3ZTUyN2JkZWUzZGQ4ZDk1ZTVjZDI1MDA1M2YzNWVlOTIyNThiOTdhYTgzZGZhOTNjNjIxODAwMDAwMDAwNTQwMDAwODAwMDAwMDA4MDAwMDAwMDgwMDEwMDAwMDA1MDAwMDAwMDAwJztcbiAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAge1xuICAgICAgICBhbW91bnRTYXQ6IDEwMDAwMG4sXG4gICAgICAgIGFkZHJlc3M6ICd0YjFweDdkdTNyeHB0NW1xdG12YXV4bXBsN3hrMnFzbXY1eG16OWc3dzVkcnB6enVlbHg4NjlkcXdhcGU3aycsXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICB7XG4gICAgICAgIHhwdWI6ICd0cHViRENtaVdNa1RKcloyNHQxWjZFQ1IzSHl5bkN5Wjl6R3NXcWhjTGg2SDR5RksyQ0RvelNzekQxcFAyTGk0TngxWVl0UmN2bU5iZGIzbkQxU3pGZWpZdFBGZlRvY1R2MkVhQWdKQ2c0enBKcEEnLFxuICAgICAgICBwdXJwb3NlOiA0OSxcbiAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgeHB1YjogJ3RwdWJEQ0ZON2JzeFI5VVRLZ2dkSDJwbXY1SGVIR1FOaURySndhMUVaRnRQOXNINVBGMjhpMzdGSHBvWVNZQVJRa0taNk1pOThwa3A3b3lwRGN4Rm1FNGRRR3E4alY4R3YzTDZnbVdCZVJ3UHhrUCcsXG4gICAgICAgIHB1cnBvc2U6IDg0LFxuICAgICAgICBjb2luX3R5cGU6IDAsXG4gICAgICAgIGFjY291bnQ6IDAsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGEgdmFsaWQgd2l0aGRyYXcgUFNCVCcsICgpID0+IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHVuc2lnbmVkUHNidEhleCwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgaW52YWxpZCBQU0JUIGhleCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdygnYXNkYXNkJywgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgICAgfSwgL0VSUl9CVUZGRVJfT1VUX09GX0JPVU5EUy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndGVzdCBjYXNlcyB3aXRoIGNyZWF0aW5nIHBzYnQgb24gdGhlIGdvJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIFAyV1BLSCAocHVycG9zZSA4NCkgY2hhbmdlIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBzYnQsIG1hc3RlcktleSB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDg0LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzg0Jy8wJy8wJy8xLzZcIixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQocHNidC50eE91dHB1dHNbMF0uc2NyaXB0LCBuZXR3b3JrKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgeHB1YjogbWFzdGVyS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgICAgICBwdXJwb3NlOiA4NCxcbiAgICAgICAgICBjb2luX3R5cGU6IDAsXG4gICAgICAgICAgYWNjb3VudDogMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBQU0JUIHdpdGggUDJTSC1QMldQS0ggKHB1cnBvc2UgNDkpIGNoYW5nZSBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBwc2J0LCBtYXN0ZXJLZXkgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA0OSxcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS80OScvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IG1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogNDksXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIFAyVFIgKHB1cnBvc2UgODYpIGNoYW5nZSBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBwc2J0LCBtYXN0ZXJLZXkgfSA9IGNyZWF0ZVRlc3RQc2J0KHtcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgaW5wdXRWYWx1ZTogNTAwMDAwLFxuICAgICAgICBvdXRwdXRWYWx1ZTogMTAwMDAwLFxuICAgICAgICBjaGFuZ2VWYWx1ZTogMzkwMDAwLFxuICAgICAgICBjaGFuZ2VQdXJwb3NlOiA4NixcbiAgICAgICAgY2hhbmdlRGVyaXZhdGlvblBhdGg6IFwibS84NicvMCcvMCcvMS82XCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IG1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogODYsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIG1pc3NpbmcgYmlwMzJEZXJpdmF0aW9uIHBhdGggb24gY2hhbmdlIG91dHB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCwgbWFzdGVyS2V5IH0gPSBjcmVhdGVUZXN0UHNidCh7XG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIGlucHV0VmFsdWU6IDUwMDAwMCxcbiAgICAgICAgb3V0cHV0VmFsdWU6IDEwMDAwMCxcbiAgICAgICAgY2hhbmdlVmFsdWU6IDM5MDAwMCxcbiAgICAgICAgY2hhbmdlUHVycG9zZTogODQsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBiaXAzMkRlcml2YXRpb24gZnJvbSB0aGUgY2hhbmdlIG91dHB1dFxuICAgICAgLy8gVGhpcyB3aWxsIGNhdXNlIHRoZSBvdXRwdXQgdG8gYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgcmVjaXBpZW50IG91dHB1dCwgbm90IGEgY2hhbmdlIG91dHB1dFxuICAgICAgZGVsZXRlIHBzYnQuZGF0YS5vdXRwdXRzWzFdLmJpcDMyRGVyaXZhdGlvbjtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IG1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBUaGUgb3V0cHV0IHdpdGhvdXQgYmlwMzJEZXJpdmF0aW9uIGlzIHRyZWF0ZWQgYXMgYSByZWNpcGllbnQgb3V0cHV0LFxuICAgICAgLy8gYW5kIHNpbmNlIGl0J3Mgbm90IGluIHRoZSByZWNpcGllbnRzIGxpc3QsIGl0IHNob3VsZCBmYWlsIHdpdGggXCJkb2VzIG5vdCBtYXRjaCBhbnkgcmVjaXBpZW50XCJcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICAgIH0sIC9kb2VzIG5vdCBtYXRjaCBhbnkgcmVjaXBpZW50Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIGNoYW5nZSBhZGRyZXNzIChkZXJpdmVkIGFkZHJlc3MgbWlzbWF0Y2gpJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBwc2J0IH0gPSBjcmVhdGVUZXN0UHNidCh7XG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIGlucHV0VmFsdWU6IDUwMDAwMCxcbiAgICAgICAgb3V0cHV0VmFsdWU6IDEwMDAwMCxcbiAgICAgICAgY2hhbmdlVmFsdWU6IDM5MDAwMCxcbiAgICAgICAgY2hhbmdlUHVycG9zZTogODQsXG4gICAgICAgIGNoYW5nZURlcml2YXRpb25QYXRoOiBcIm0vODQnLzAnLzAnLzEvNlwiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVXNlIGEgZGlmZmVyZW50IHhwdWIgdGhhdCB3b24ndCBtYXRjaCB0aGUgY2hhbmdlIGFkZHJlc3NcbiAgICAgIGNvbnN0IGRpZmZlcmVudE1hc3RlcktleSA9IHV0eG9saWIuYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDMyLCAyKSwgbmV0d29yayk7XG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6IGRpZmZlcmVudE1hc3RlcktleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgICB9LCAvRGVyaXZlZCBwdWJrZXkgZG9lcyBub3QgbWF0Y2ggZm9yIGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIHVwdWIgcHJlZml4IChQMlNILVAyV1BLSCB0ZXN0bmV0KScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDQ5LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzQ5Jy8wJy8wJy8xLzZcIixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQocHNidC50eE91dHB1dHNbMF0uc2NyaXB0LCBuZXR3b3JrKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFVzZSB1cHViIHByZWZpeCAodGVzdG5ldCBQMlNILVAyV1BLSCkgaW5zdGVhZCBvZiBzdGFuZGFyZCB0cHViXG4gICAgICAvLyBUaGlzIHRlc3RzIHRoYXQgcmV2ZXJ0WHB1YlByZWZpeCBjb3JyZWN0bHkgY29udmVydHMgdXB1YiAtPiB0cHViXG4gICAgICBjb25zdCBhY2NvdW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHhwdWI6ICd1cHViNUVlcDdINXEzOVB6UVpMVkVZTEJ5dER5Qk5lVjc0RThtUXN5ZUw2VW96RnE5WTNNc1o1Mkc3WUd1cXJKUGdveUFxRjdUQmVKZG5rckhyVnJCNXBrV2tQSjljSkdBZVBNVTZGMUd5dzZhRkgnLFxuICAgICAgICAgIHB1cnBvc2U6IDQ5LFxuICAgICAgICAgIGNvaW5fdHlwZTogMCxcbiAgICAgICAgICBhY2NvdW50OiAwLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVGhpcyBzaG91bGQgd29yayBiZWNhdXNlIHJldmVydFhwdWJQcmVmaXggd2lsbCBjb252ZXJ0IHVwdWIgYmFjayB0byB0cHViXG4gICAgICAvLyBIb3dldmVyLCB0aGUgbWFzdGVyIGtleSB3ZSB1c2VkIGlzIGRpZmZlcmVudCwgc28gaXQgc2hvdWxkIGZhaWwgd2l0aCBwdWJrZXkgbWlzbWF0Y2hcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB2YWxpZGF0ZVBzYnRGb3JXaXRoZHJhdyhwc2J0LnRvSGV4KCksIG5ldHdvcmssIHJlY2lwaWVudHMsIGFjY291bnRzKTtcbiAgICAgIH0sIC9EZXJpdmVkIHB1YmtleSBkb2VzIG5vdCBtYXRjaCBmb3IgYWRkcmVzcy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBQU0JUIHdpdGggdnB1YiBwcmVmaXggKFAyV1BLSCB0ZXN0bmV0KScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHNidCB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDg0LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzg0Jy8wJy8wJy8xLzZcIixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRBZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQocHNidC50eE91dHB1dHNbMF0uc2NyaXB0LCBuZXR3b3JrKTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDEwMDAwMCksXG4gICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFVzZSB2cHViIHByZWZpeCAodGVzdG5ldCBQMldQS0gpIGluc3RlYWQgb2Ygc3RhbmRhcmQgdHB1YlxuICAgICAgLy8gVGhpcyB0ZXN0cyB0aGF0IHJldmVydFhwdWJQcmVmaXggY29ycmVjdGx5IGNvbnZlcnRzIHZwdWIgLT4gdHB1YlxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiAndnB1YjVaVTFQSEdwUW9EU0hja1lpY280bnN2d3NEM21UaDZVanFMNXp5R1dYWlh6QmpUWU1OS290N3Q5ZVJQUVk3MWhKY25OTjlyMXNzMjVnM3hBOXJtb0o1bldQZzhqRVdhdnJ0dG5zVmExcXcxJyxcbiAgICAgICAgICBwdXJwb3NlOiA4NCxcbiAgICAgICAgICBjb2luX3R5cGU6IDAsXG4gICAgICAgICAgYWNjb3VudDogMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIHdvcmsgYmVjYXVzZSByZXZlcnRYcHViUHJlZml4IHdpbGwgY29udmVydCB2cHViIGJhY2sgdG8gdHB1YlxuICAgICAgLy8gSG93ZXZlciwgdGhlIG1hc3RlciBrZXkgd2UgdXNlZCBpcyBkaWZmZXJlbnQsIHNvIGl0IHNob3VsZCBmYWlsIHdpdGggcHVia2V5IG1pc21hdGNoXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgICB9LCAvRGVyaXZlZCBwdWJrZXkgZG9lcyBub3QgbWF0Y2ggZm9yIGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgUFNCVCB3aXRoIG1hdGNoaW5nIHVwdWIgcHJlZml4IGFuZCBjb3JyZWN0IGtleScsICgpID0+IHtcbiAgICAgIC8vIEltcG9ydCB0aGUgc2lnbmVyIHJvb3Qga2V5IGZyb20gdGhlIGZpeHR1cmUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHVwdWIvdnB1YiBhY2NvdW50c1xuICAgICAgY29uc3Qgc2lnbmVyUm9vdEtleSA9XG4gICAgICAgICd0cHJ2OFpneE1CaWNRS3NQZTZqUzR2RG0ybjdzNDJRNk1wdmdoVVFxTW1TS0c3YlRadkdLdGpyY1UzUEd6TU5HMzd5enh5d3JjZHZna3dycjhlWVhKbWJ3ZHZVTlZUNFVjdjdyaXM0anZBN0JVbWcnO1xuICAgICAgY29uc3QgbWFzdGVySEROb2RlID0gdXR4b2xpYi5iaXAzMi5mcm9tQmFzZTU4KHNpZ25lclJvb3RLZXksIG5ldHdvcmspO1xuXG4gICAgICAvLyBEZXJpdmUgdGhlIGFjY291bnQga2V5IGZvciBwdXJwb3NlIDQ5XG4gICAgICBjb25zdCBhY2NvdW50S2V5ID0gbWFzdGVySEROb2RlLmRlcml2ZVBhdGgoXCJtLzQ5Jy8wJy8wJ1wiKTtcblxuICAgICAgY29uc3QgeyBwc2J0IH0gPSBjcmVhdGVUZXN0UHNidCh7XG4gICAgICAgIG5ldHdvcmssXG4gICAgICAgIGlucHV0VmFsdWU6IDUwMDAwMCxcbiAgICAgICAgb3V0cHV0VmFsdWU6IDEwMDAwMCxcbiAgICAgICAgY2hhbmdlVmFsdWU6IDM5MDAwMCxcbiAgICAgICAgY2hhbmdlUHVycG9zZTogNDksXG4gICAgICAgIGNoYW5nZURlcml2YXRpb25QYXRoOiBcIm0vNDknLzAnLzAnLzEvNlwiLFxuICAgICAgICBtYXN0ZXJLZXk6IGFjY291bnRLZXksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdCwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludCgxMDAwMDApLFxuICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBVc2UgdGhlIHVwdWIgZnJvbSB0aGUgZml4dHVyZSAtIHRoaXMgc2hvdWxkIHdvcmsgYmVjYXVzZSB0aGUga2V5cyBtYXRjaFxuICAgICAgY29uc3QgYWNjb3VudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB4cHViOiAndXB1YjVFZXA3SDVxMzlQelFaTFZFWUxCeXREeUJOZVY3NEU4bVFzeWVMNlVvekZxOVkzTXNaNTJHN1lHdXFySlBnb3lBcUY3VEJlSmRua3JIclZyQjVwa1drUEo5Y0pHQWVQTVU2RjFHeXc2YUZIJyxcbiAgICAgICAgICBwdXJwb3NlOiA0OSxcbiAgICAgICAgICBjb2luX3R5cGU6IDAsXG4gICAgICAgICAgYWNjb3VudDogMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIHBhc3MgLSByZXZlcnRYcHViUHJlZml4IGNvbnZlcnRzIHVwdWIgLT4gdHB1YiwgYW5kIHRoZSBrZXkgbWF0Y2hlc1xuICAgICAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcocHNidC50b0hleCgpLCBuZXR3b3JrLCByZWNpcGllbnRzLCBhY2NvdW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIFBTQlQgd2l0aCBtYXRjaGluZyB2cHViIHByZWZpeCBhbmQgY29ycmVjdCBrZXknLCAoKSA9PiB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHNpZ25lciByb290IGtleSBmcm9tIHRoZSBmaXh0dXJlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSB1cHViL3ZwdWIgYWNjb3VudHNcbiAgICAgIGNvbnN0IHNpZ25lclJvb3RLZXkgPVxuICAgICAgICAndHBydjhaZ3hNQmljUUtzUGU2alM0dkRtMm43czQyUTZNcHZnaFVRcU1tU0tHN2JUWnZHS3RqcmNVM1BHek1ORzM3eXp4eXdyY2R2Z2t3cnI4ZVlYSm1id2R2VU5WVDRVY3Y3cmlzNGp2QTdCVW1nJztcbiAgICAgIGNvbnN0IG1hc3RlckhETm9kZSA9IHV0eG9saWIuYmlwMzIuZnJvbUJhc2U1OChzaWduZXJSb290S2V5LCBuZXR3b3JrKTtcblxuICAgICAgLy8gRGVyaXZlIHRoZSBhY2NvdW50IGtleSBmb3IgcHVycG9zZSA4NFxuICAgICAgY29uc3QgYWNjb3VudEtleSA9IG1hc3RlckhETm9kZS5kZXJpdmVQYXRoKFwibS84NCcvMCcvMCdcIik7XG5cbiAgICAgIGNvbnN0IHsgcHNidCB9ID0gY3JlYXRlVGVzdFBzYnQoe1xuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBpbnB1dFZhbHVlOiA1MDAwMDAsXG4gICAgICAgIG91dHB1dFZhbHVlOiAxMDAwMDAsXG4gICAgICAgIGNoYW5nZVZhbHVlOiAzOTAwMDAsXG4gICAgICAgIGNoYW5nZVB1cnBvc2U6IDg0LFxuICAgICAgICBjaGFuZ2VEZXJpdmF0aW9uUGF0aDogXCJtLzg0Jy8wJy8wJy8xLzZcIixcbiAgICAgICAgbWFzdGVyS2V5OiBhY2NvdW50S2V5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsIG5ldHdvcmspO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVXNlIHRoZSB2cHViIGZyb20gdGhlIGZpeHR1cmUgLSB0aGlzIHNob3VsZCB3b3JrIGJlY2F1c2UgdGhlIGtleXMgbWF0Y2hcbiAgICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgeHB1YjogJ3ZwdWI1WlUxUEhHcFFvRFNIY2tZaWNvNG5zdndzRDNtVGg2VWpxTDV6eUdXWFpYekJqVFlNTktvdDd0OWVSUFFZNzFoSmNuTk45cjFzczI1ZzN4QTlybW9KNW5XUGc4akVXYXZydHRuc1ZhMXF3MScsXG4gICAgICAgICAgcHVycG9zZTogODQsXG4gICAgICAgICAgY29pbl90eXBlOiAwLFxuICAgICAgICAgIGFjY291bnQ6IDAsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBUaGlzIHNob3VsZCBwYXNzIC0gcmV2ZXJ0WHB1YlByZWZpeCBjb252ZXJ0cyB2cHViIC0+IHRwdWIsIGFuZCB0aGUga2V5IG1hdGNoZXNcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBQU0JUIHdpdGggbXVsdGlwbGUgcmVjaXBpZW50cycsICgpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIFBTQlQgbWFudWFsbHkgd2l0aCAyIHJlY2lwaWVudCBvdXRwdXRzIGFuZCAxIGNoYW5nZSBvdXRwdXRcbiAgICAgIGNvbnN0IG1hc3RlcktleSA9IHV0eG9saWIuYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDMyLCAxKSwgbmV0d29yayk7XG5cbiAgICAgIGNvbnN0IGlucHV0S2V5UGFpciA9IHV0eG9saWIuRUNQYWlyLm1ha2VSYW5kb20oeyBuZXR3b3JrIH0pO1xuICAgICAgY29uc3QgcDJ3cGtoSW5wdXQgPSB1dHhvbGliLnBheW1lbnRzLnAyd3BraCh7XG4gICAgICAgIHB1YmtleTogQnVmZmVyLmZyb20oaW5wdXRLZXlQYWlyLnB1YmxpY0tleSksXG4gICAgICAgIG5ldHdvcmssXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHNidCA9IG5ldyB1dHhvbGliLlBzYnQoeyBuZXR3b3JrIH0pO1xuXG4gICAgICAvLyBBZGQgaW5wdXRcbiAgICAgIHBzYnQuYWRkSW5wdXQoe1xuICAgICAgICBoYXNoOiAnY2E2ODUyNTk4YjQ4MjMwYWM4NzA4MTRiOTM1YjBkOTgyZDM5NjhlYjAwYTFkOTczMzJkY2ViNmNkOWI4NTA1ZScsXG4gICAgICAgIGluZGV4OiAxLFxuICAgICAgICB3aXRuZXNzVXR4bzoge1xuICAgICAgICAgIHNjcmlwdDogcDJ3cGtoSW5wdXQub3V0cHV0ISxcbiAgICAgICAgICB2YWx1ZTogQmlnSW50KDUwMDAwMCksXG4gICAgICAgIH0sXG4gICAgICAgIGJpcDMyRGVyaXZhdGlvbjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hc3RlckZpbmdlcnByaW50OiBCdWZmZXIuYWxsb2MoNCwgMCksXG4gICAgICAgICAgICBwYXRoOiBcIm0vODQnLzAnLzAnLzAvMFwiLFxuICAgICAgICAgICAgcHVia2V5OiBCdWZmZXIuZnJvbShpbnB1dEtleVBhaXIucHVibGljS2V5KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBmaXJzdCByZWNpcGllbnRcbiAgICAgIGNvbnN0IHJlY2lwaWVudDFLZXlQYWlyID0gdXR4b2xpYi5FQ1BhaXIubWFrZVJhbmRvbSh7IG5ldHdvcmsgfSk7XG4gICAgICBjb25zdCByZWNpcGllbnQxUGF5bWVudCA9IHV0eG9saWIucGF5bWVudHMucDJ3cGtoKHtcbiAgICAgICAgcHVia2V5OiBCdWZmZXIuZnJvbShyZWNpcGllbnQxS2V5UGFpci5wdWJsaWNLZXkpLFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZWNpcGllbnQxQWRkcmVzcyA9IHJlY2lwaWVudDFQYXltZW50LmFkZHJlc3MhO1xuXG4gICAgICAvLyBDcmVhdGUgc2Vjb25kIHJlY2lwaWVudFxuICAgICAgY29uc3QgcmVjaXBpZW50MktleVBhaXIgPSB1dHhvbGliLkVDUGFpci5tYWtlUmFuZG9tKHsgbmV0d29yayB9KTtcbiAgICAgIGNvbnN0IHJlY2lwaWVudDJQYXltZW50ID0gdXR4b2xpYi5wYXltZW50cy5wMndwa2goe1xuICAgICAgICBwdWJrZXk6IEJ1ZmZlci5mcm9tKHJlY2lwaWVudDJLZXlQYWlyLnB1YmxpY0tleSksXG4gICAgICAgIG5ldHdvcmssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlY2lwaWVudDJBZGRyZXNzID0gcmVjaXBpZW50MlBheW1lbnQuYWRkcmVzcyE7XG5cbiAgICAgIC8vIERlcml2ZSBjaGFuZ2UgYWRkcmVzcyBmcm9tIG1hc3RlciBrZXlcbiAgICAgIGNvbnN0IGNoYW5nZU5vZGUgPSBtYXN0ZXJLZXkuZGVyaXZlKDEpLmRlcml2ZSg2KTsgLy8gbS8xLzZcbiAgICAgIGNvbnN0IGNoYW5nZVBheW1lbnQgPSB1dHhvbGliLnBheW1lbnRzLnAyd3BraCh7XG4gICAgICAgIHB1YmtleTogY2hhbmdlTm9kZS5wdWJsaWNLZXksXG4gICAgICAgIG5ldHdvcmssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSBjaGFuZ2VQYXltZW50LmFkZHJlc3MhO1xuXG4gICAgICAvLyBBZGQgb3V0cHV0czogcmVjaXBpZW50MSwgcmVjaXBpZW50MiwgY2hhbmdlXG4gICAgICBwc2J0LmFkZE91dHB1dCh7XG4gICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudDFBZGRyZXNzLFxuICAgICAgICB2YWx1ZTogQmlnSW50KDEwMDAwMCksXG4gICAgICB9KTtcblxuICAgICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQyQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCg1MDAwMCksXG4gICAgICB9KTtcblxuICAgICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLFxuICAgICAgICB2YWx1ZTogQmlnSW50KDM0MDAwMCksIC8vIDUwMDAwMCAtIDEwMDAwMCAtIDUwMDAwIC0gMTAwMDAgKGZlZSlcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgYmlwMzJEZXJpdmF0aW9uIHRvIHRoZSBjaGFuZ2Ugb3V0cHV0IChpbmRleCAyKVxuICAgICAgcHNidC51cGRhdGVPdXRwdXQoMiwge1xuICAgICAgICBiaXAzMkRlcml2YXRpb246IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogQnVmZmVyLmFsbG9jKDQsIDApLFxuICAgICAgICAgICAgcGF0aDogXCJtLzg0Jy8wJy8wJy8xLzZcIixcbiAgICAgICAgICAgIHB1YmtleTogY2hhbmdlTm9kZS5wdWJsaWNLZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYW1vdW50U2F0OiBCaWdJbnQoMTAwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQxQWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGFtb3VudFNhdDogQmlnSW50KDUwMDAwKSxcbiAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQyQWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGFjY291bnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgeHB1YjogbWFzdGVyS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgICAgICBwdXJwb3NlOiA4NCxcbiAgICAgICAgICBjb2luX3R5cGU6IDAsXG4gICAgICAgICAgYWNjb3VudDogMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KHBzYnQudG9IZXgoKSwgbmV0d29yaywgcmVjaXBpZW50cywgYWNjb3VudHMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signableJson.d.ts","sourceRoot":"","sources":["../../../../test/unit/lightning/signableJson.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const lightning_1 = require("../../../src/lightning");
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
describe('canonicalizeObject', function () {
|
|
9
|
+
it('should return the canonicalized object with sorted keys', function () {
|
|
10
|
+
const input = { b: 1, a: 2 };
|
|
11
|
+
const expected = { a: 2, b: 1 };
|
|
12
|
+
const result = (0, lightning_1.canonicalizeObject)(input);
|
|
13
|
+
assert_1.default.notDeepStrictEqual(JSON.stringify(input), JSON.stringify(expected));
|
|
14
|
+
assert_1.default.deepStrictEqual(JSON.stringify(result), JSON.stringify(expected));
|
|
15
|
+
});
|
|
16
|
+
it('should handle nested objects and sort their keys', function () {
|
|
17
|
+
const input = { b: { d: 4, c: 3 }, a: 2 };
|
|
18
|
+
const expected = { a: 2, b: { c: 3, d: 4 } };
|
|
19
|
+
const result = (0, lightning_1.canonicalizeObject)(input);
|
|
20
|
+
assert_1.default.notDeepStrictEqual(JSON.stringify(input), JSON.stringify(expected));
|
|
21
|
+
assert_1.default.deepStrictEqual(JSON.stringify(result), JSON.stringify(expected));
|
|
22
|
+
});
|
|
23
|
+
it('should handle arrays within objects', function () {
|
|
24
|
+
const input = { b: [3, 2, 1], a: 2 };
|
|
25
|
+
const expected = { a: 2, b: [3, 2, 1] };
|
|
26
|
+
const result = (0, lightning_1.canonicalizeObject)(input);
|
|
27
|
+
assert_1.default.notDeepStrictEqual(JSON.stringify(input), JSON.stringify(expected));
|
|
28
|
+
assert_1.default.deepStrictEqual(JSON.stringify(result), JSON.stringify(expected));
|
|
29
|
+
});
|
|
30
|
+
it('should handle arrays of objects and sort their keys', function () {
|
|
31
|
+
const input = [
|
|
32
|
+
{ b: 2, a: 1 },
|
|
33
|
+
{ d: 4, c: 3 },
|
|
34
|
+
];
|
|
35
|
+
const expected = [
|
|
36
|
+
{ a: 1, b: 2 },
|
|
37
|
+
{ c: 3, d: 4 },
|
|
38
|
+
];
|
|
39
|
+
const result = (0, lightning_1.canonicalizeObject)(input);
|
|
40
|
+
assert_1.default.notDeepStrictEqual(JSON.stringify(input), JSON.stringify(expected));
|
|
41
|
+
assert_1.default.deepStrictEqual(JSON.stringify(result), JSON.stringify(expected));
|
|
42
|
+
});
|
|
43
|
+
it('should return primitive values as is', function () {
|
|
44
|
+
assert_1.default.strictEqual(JSON.stringify((0, lightning_1.canonicalizeObject)(42)), JSON.stringify(42));
|
|
45
|
+
assert_1.default.strictEqual(JSON.stringify((0, lightning_1.canonicalizeObject)('string')), JSON.stringify('string'));
|
|
46
|
+
});
|
|
47
|
+
it('should throw an error for invalid object types', function () {
|
|
48
|
+
assert_1.default.throws(() => (0, lightning_1.canonicalizeObject)(null), /Invalid object type/);
|
|
49
|
+
assert_1.default.throws(() => (0, lightning_1.canonicalizeObject)(undefined), /Invalid object type/);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFibGVKc29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpZ2h0bmluZy9zaWduYWJsZUpzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzREFBNEQ7QUFDNUQsb0RBQTRCO0FBRTVCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixFQUFFLENBQUMseURBQXlELEVBQUU7UUFDNUQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUEsOEJBQWtCLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsZ0JBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMzRSxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrREFBa0QsRUFBRTtRQUNyRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3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QUUsQ0FBQyxJQUFBLDhCQUFrQixFQUFDLFNBQWtCLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYW5vbmljYWxpemVPYmplY3QgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGlnaHRuaW5nJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZGVzY3JpYmUoJ2Nhbm9uaWNhbGl6ZU9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNhbm9uaWNhbGl6ZWQgb2JqZWN0IHdpdGggc29ydGVkIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB7IGI6IDEsIGE6IDIgfTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHsgYTogMiwgYjogMSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbm9uaWNhbGl6ZU9iamVjdChpbnB1dCk7XG4gICAgYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbChKU09OLnN0cmluZ2lmeShpbnB1dCksIEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShleHBlY3RlZCkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGhhbmRsZSBuZXN0ZWQgb2JqZWN0cyBhbmQgc29ydCB0aGVpciBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0ID0geyBiOiB7IGQ6IDQsIGM6IDMgfSwgYTogMiB9O1xuICAgIGNvbnN0IGV4cGVjdGVkID0geyBhOiAyLCBiOiB7IGM6IDMsIGQ6IDQgfSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbm9uaWNhbGl6ZU9iamVjdChpbnB1dCk7XG4gICAgYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbChKU09OLnN0cmluZ2lmeShpbnB1dCksIEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShleHBlY3RlZCkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGhhbmRsZSBhcnJheXMgd2l0aGluIG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB7IGI6IFszLCAyLCAxXSwgYTogMiB9O1xuICAgIGNvbnN0IGV4cGVjdGVkID0geyBhOiAyLCBiOiBbMywgMiwgMV0gfTtcbiAgICBjb25zdCByZXN1bHQgPSBjYW5vbmljYWxpemVPYmplY3QoaW5wdXQpO1xuICAgIGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwoSlNPTi5zdHJpbmdpZnkoaW5wdXQpLCBKU09OLnN0cmluZ2lmeShleHBlY3RlZCkpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWQpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBoYW5kbGUgYXJyYXlzIG9mIG9iamVjdHMgYW5kIHNvcnQgdGhlaXIga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbnB1dCA9IFtcbiAgICAgIHsgYjogMiwgYTogMSB9LFxuICAgICAgeyBkOiA0LCBjOiAzIH0sXG4gICAgXTtcbiAgICBjb25zdCBleHBlY3RlZCA9IFtcbiAgICAgIHsgYTogMSwgYjogMiB9LFxuICAgICAgeyBjOiAzLCBkOiA0IH0sXG4gICAgXTtcbiAgICBjb25zdCByZXN1bHQgPSBjYW5vbmljYWxpemVPYmplY3QoaW5wdXQpO1xuICAgIGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwoSlNPTi5zdHJpbmdpZnkoaW5wdXQpLCBKU09OLnN0cmluZ2lmeShleHBlY3RlZCkpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWQpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyBhcyBpcycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplT2JqZWN0KDQyKSksIEpTT04uc3RyaW5naWZ5KDQyKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbGl6ZU9iamVjdCgnc3RyaW5nJykpLCBKU09OLnN0cmluZ2lmeSgnc3RyaW5nJykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGZvciBpbnZhbGlkIG9iamVjdCB0eXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNhbm9uaWNhbGl6ZU9iamVjdChudWxsIGFzIG5ldmVyKSwgL0ludmFsaWQgb2JqZWN0IHR5cGUvKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNhbm9uaWNhbGl6ZU9iamVjdCh1bmRlZmluZWQgYXMgbmV2ZXIpLCAvSW52YWxpZCBvYmplY3QgdHlwZS8pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../../test/unit/lightning/signature.ts"],"names":[],"mappings":""}
|