@bitgo/sdk-coin-polyx 1.16.3 → 1.17.0
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/lib/constants.d.ts +4 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +6 -2
- package/dist/src/lib/hexTokenTransferBuilder.d.ts +21 -0
- package/dist/src/lib/hexTokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/hexTokenTransferBuilder.js +43 -0
- package/dist/src/lib/hexTransferBuilder.d.ts +26 -0
- package/dist/src/lib/hexTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/hexTransferBuilder.js +49 -0
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +6 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts +4 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +17 -1
- package/dist/src/lib/utils.d.ts +20 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +43 -1
- package/dist/src/polyx.d.ts +2 -1
- package/dist/src/polyx.d.ts.map +1 -1
- package/dist/src/polyx.js +4 -1
- package/dist/test/unit/transactionBuilder/hexTokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/hexTokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/hexTokenTransferBuilder.js +261 -0
- package/dist/test/unit/transactionBuilder/hexTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/hexTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/hexTransferBuilder.js +389 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,389 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
7
|
+
const statics_1 = require("@bitgo/statics");
|
|
8
|
+
const lib_1 = require("../../../src/lib");
|
|
9
|
+
const src_1 = require("../../../src");
|
|
10
|
+
const resources_1 = require("../../resources");
|
|
11
|
+
const base_1 = require("./base");
|
|
12
|
+
// Expected NEW-encoding hex values from problem.md example table
|
|
13
|
+
const NEW_MEMO_HEX = {
|
|
14
|
+
0: '0x3000000000000000000000000000000000000000000000000000000000000000',
|
|
15
|
+
1: '0x3100000000000000000000000000000000000000000000000000000000000000',
|
|
16
|
+
2: '0x3200000000000000000000000000000000000000000000000000000000000000',
|
|
17
|
+
56594: '0x3536353934000000000000000000000000000000000000000000000000000000',
|
|
18
|
+
102329716: '0x3130323332393731360000000000000000000000000000000000000000000000',
|
|
19
|
+
testmemo: '0x746573746d656d6f000000000000000000000000000000000000000000000000',
|
|
20
|
+
abc: '0x6162630000000000000000000000000000000000000000000000000000000000',
|
|
21
|
+
};
|
|
22
|
+
describe('HexTransferBuilder — memo encoding', () => {
|
|
23
|
+
let builder;
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
const config = (0, base_1.buildTestConfig)();
|
|
26
|
+
builder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
27
|
+
});
|
|
28
|
+
describe('memo() produces NEW encoding', () => {
|
|
29
|
+
it('encodes "0"', () => {
|
|
30
|
+
builder.memo('0');
|
|
31
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['0']);
|
|
32
|
+
});
|
|
33
|
+
it('encodes "1"', () => {
|
|
34
|
+
builder.memo('1');
|
|
35
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['1']);
|
|
36
|
+
});
|
|
37
|
+
it('encodes "2"', () => {
|
|
38
|
+
builder.memo('2');
|
|
39
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['2']);
|
|
40
|
+
});
|
|
41
|
+
it('encodes "56594"', () => {
|
|
42
|
+
builder.memo('56594');
|
|
43
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['56594']);
|
|
44
|
+
});
|
|
45
|
+
it('encodes "102329716"', () => {
|
|
46
|
+
builder.memo('102329716');
|
|
47
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['102329716']);
|
|
48
|
+
});
|
|
49
|
+
it('encodes "testmemo"', () => {
|
|
50
|
+
builder.memo('testmemo');
|
|
51
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['testmemo']);
|
|
52
|
+
});
|
|
53
|
+
it('encodes "abc"', () => {
|
|
54
|
+
builder.memo('abc');
|
|
55
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['abc']);
|
|
56
|
+
});
|
|
57
|
+
it('stores an already-encoded 0x hex memo as-is (round-trip)', () => {
|
|
58
|
+
const alreadyEncoded = NEW_MEMO_HEX['56594'];
|
|
59
|
+
builder.memo(alreadyEncoded);
|
|
60
|
+
should_1.default.equal(builder._memo, alreadyEncoded);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('NEW encoding differs from OLD encoding', () => {
|
|
64
|
+
it('produces different bytes than TransferBuilder for "56594"', () => {
|
|
65
|
+
const { TransferBuilder } = require('../../../src/lib');
|
|
66
|
+
const config = (0, base_1.buildTestConfig)();
|
|
67
|
+
const oldBuilder = new TransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
68
|
+
const newBuilder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
69
|
+
oldBuilder.memo('56594');
|
|
70
|
+
newBuilder.memo('56594');
|
|
71
|
+
const oldMemo = oldBuilder._memo;
|
|
72
|
+
const newMemo = newBuilder._memo;
|
|
73
|
+
should_1.default.notEqual(oldMemo, newMemo);
|
|
74
|
+
// OLD: left-pad with ASCII '0' chars
|
|
75
|
+
should_1.default.ok(oldMemo.startsWith('000000'), `OLD memo should start with ASCII '0' padding, got: ${oldMemo}`);
|
|
76
|
+
// NEW: 0x-prefixed hex
|
|
77
|
+
should_1.default.ok(newMemo.startsWith('0x'), `NEW memo should start with 0x, got: ${newMemo}`);
|
|
78
|
+
should_1.default.equal(newMemo, NEW_MEMO_HEX['56594']);
|
|
79
|
+
});
|
|
80
|
+
it('produces different bytes than TransferBuilder for "0"', () => {
|
|
81
|
+
const { TransferBuilder } = require('../../../src/lib');
|
|
82
|
+
const config = (0, base_1.buildTestConfig)();
|
|
83
|
+
const oldBuilder = new TransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
84
|
+
const newBuilder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
85
|
+
oldBuilder.memo('0');
|
|
86
|
+
newBuilder.memo('0');
|
|
87
|
+
should_1.default.notEqual(oldBuilder._memo, newBuilder._memo);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('build transaction with NEW memo encoding', () => {
|
|
91
|
+
const sender = resources_1.accounts.account1;
|
|
92
|
+
const receiver = resources_1.accounts.account2;
|
|
93
|
+
it('should build a transaction with NEW memo "56594"', async () => {
|
|
94
|
+
builder
|
|
95
|
+
.amount('1000000')
|
|
96
|
+
.to({ address: receiver.address })
|
|
97
|
+
.sender({ address: sender.address })
|
|
98
|
+
.memo('56594')
|
|
99
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
100
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
101
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
102
|
+
.fee({ amount: 0, type: 'tip' });
|
|
103
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
104
|
+
const tx = await builder.build();
|
|
105
|
+
const txJson = tx.toJson();
|
|
106
|
+
should_1.default.deepEqual(txJson.amount, '1000000');
|
|
107
|
+
should_1.default.deepEqual(txJson.to, receiver.address);
|
|
108
|
+
should_1.default.deepEqual(txJson.sender, sender.address);
|
|
109
|
+
});
|
|
110
|
+
it('should build a transaction with NEW memo "testmemo"', async () => {
|
|
111
|
+
builder
|
|
112
|
+
.amount('1000000')
|
|
113
|
+
.to({ address: receiver.address })
|
|
114
|
+
.sender({ address: sender.address })
|
|
115
|
+
.memo('testmemo')
|
|
116
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
117
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
118
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
119
|
+
.fee({ amount: 0, type: 'tip' });
|
|
120
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
121
|
+
const tx = await builder.build();
|
|
122
|
+
const txJson = tx.toJson();
|
|
123
|
+
should_1.default.deepEqual(txJson.amount, '1000000');
|
|
124
|
+
should_1.default.deepEqual(txJson.to, receiver.address);
|
|
125
|
+
should_1.default.deepEqual(builder._memo, NEW_MEMO_HEX['testmemo']);
|
|
126
|
+
});
|
|
127
|
+
it('should build a transaction with NEW memo "0" (default)', async () => {
|
|
128
|
+
builder
|
|
129
|
+
.amount('1000000')
|
|
130
|
+
.to({ address: receiver.address })
|
|
131
|
+
.sender({ address: sender.address })
|
|
132
|
+
.memo('0')
|
|
133
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
134
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
135
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
136
|
+
.fee({ amount: 0, type: 'tip' });
|
|
137
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
138
|
+
const tx = await builder.build();
|
|
139
|
+
should_1.default.ok(tx);
|
|
140
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['0']);
|
|
141
|
+
});
|
|
142
|
+
it('should build a transaction with NEW memo "102329716"', async () => {
|
|
143
|
+
builder
|
|
144
|
+
.amount('1000000')
|
|
145
|
+
.to({ address: receiver.address })
|
|
146
|
+
.sender({ address: sender.address })
|
|
147
|
+
.memo('102329716')
|
|
148
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
149
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
150
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
151
|
+
.fee({ amount: 0, type: 'tip' });
|
|
152
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
153
|
+
const tx = await builder.build();
|
|
154
|
+
should_1.default.ok(tx);
|
|
155
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['102329716']);
|
|
156
|
+
});
|
|
157
|
+
it('raw transaction bytes differ between OLD and NEW builder for same memo', async () => {
|
|
158
|
+
const { TransferBuilder } = require('../../../src/lib');
|
|
159
|
+
const config = (0, base_1.buildTestConfig)();
|
|
160
|
+
const material = src_1.utils.getMaterial(config.network.type);
|
|
161
|
+
const commonParams = {
|
|
162
|
+
address: receiver.address,
|
|
163
|
+
amount: '1000000',
|
|
164
|
+
sender: sender.address,
|
|
165
|
+
firstValid: 3933,
|
|
166
|
+
maxDuration: 64,
|
|
167
|
+
referenceBlock: '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d',
|
|
168
|
+
nonce: 1,
|
|
169
|
+
};
|
|
170
|
+
const oldBuilder = new TransferBuilder(config)
|
|
171
|
+
.material(material)
|
|
172
|
+
.amount(commonParams.amount)
|
|
173
|
+
.to({ address: commonParams.address })
|
|
174
|
+
.sender({ address: commonParams.sender })
|
|
175
|
+
.memo('56594')
|
|
176
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
177
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
178
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
179
|
+
.fee({ amount: 0, type: 'tip' });
|
|
180
|
+
oldBuilder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
181
|
+
const oldTx = await oldBuilder.build();
|
|
182
|
+
const newBuilder = new lib_1.HexTransferBuilder(config)
|
|
183
|
+
.material(material)
|
|
184
|
+
.amount(commonParams.amount)
|
|
185
|
+
.to({ address: commonParams.address })
|
|
186
|
+
.sender({ address: commonParams.sender })
|
|
187
|
+
.memo('56594')
|
|
188
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
189
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
190
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
191
|
+
.fee({ amount: 0, type: 'tip' });
|
|
192
|
+
newBuilder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
193
|
+
const newTx = await newBuilder.build();
|
|
194
|
+
should_1.default.notEqual(oldTx.toBroadcastFormat(), newTx.toBroadcastFormat());
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('HexTransferBuilder — Mainnet', () => {
|
|
199
|
+
let builder;
|
|
200
|
+
const sender = resources_1.accounts.account5Mainnet;
|
|
201
|
+
const receiver = resources_1.accounts.account6Mainnet;
|
|
202
|
+
beforeEach(() => {
|
|
203
|
+
const config = (0, base_1.buildMainnetConfig)();
|
|
204
|
+
builder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
205
|
+
});
|
|
206
|
+
it('should encode memo "56594" correctly on mainnet', () => {
|
|
207
|
+
builder.memo('56594');
|
|
208
|
+
should_1.default.equal(builder._memo, NEW_MEMO_HEX['56594']);
|
|
209
|
+
});
|
|
210
|
+
it('should build a mainnet transaction with NEW memo', async () => {
|
|
211
|
+
builder
|
|
212
|
+
.amount('1000000')
|
|
213
|
+
.to({ address: receiver.address })
|
|
214
|
+
.sender({ address: sender.address })
|
|
215
|
+
.memo('56594')
|
|
216
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
217
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
218
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 1 })
|
|
219
|
+
.fee({ amount: 0, type: 'tip' });
|
|
220
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
221
|
+
const tx = await builder.build();
|
|
222
|
+
const txJson = tx.toJson();
|
|
223
|
+
should_1.default.deepEqual(txJson.amount, '1000000');
|
|
224
|
+
should_1.default.deepEqual(txJson.to, receiver.address);
|
|
225
|
+
should_1.default.deepEqual(txJson.sender, sender.address);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe('HexTransferBuilder — factory.from() rebuild round-trip', () => {
|
|
229
|
+
const sender = resources_1.accounts.account1;
|
|
230
|
+
const receiver = resources_1.accounts.account2;
|
|
231
|
+
const commonParams = {
|
|
232
|
+
amount: '1000000',
|
|
233
|
+
firstValid: 3933,
|
|
234
|
+
maxDuration: 64,
|
|
235
|
+
referenceBlock: '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d',
|
|
236
|
+
nonce: 1,
|
|
237
|
+
};
|
|
238
|
+
let factory;
|
|
239
|
+
beforeEach(() => {
|
|
240
|
+
factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tpolyx'));
|
|
241
|
+
});
|
|
242
|
+
it('factory.from() returns HexTransferBuilder for a NEW-encoded signed transaction', async () => {
|
|
243
|
+
const builder = new lib_1.HexTransferBuilder((0, base_1.buildTestConfig)())
|
|
244
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
245
|
+
.amount(commonParams.amount)
|
|
246
|
+
.to({ address: receiver.address })
|
|
247
|
+
.sender({ address: sender.address })
|
|
248
|
+
.memo('56594')
|
|
249
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
250
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
251
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
252
|
+
.fee({ amount: 0, type: 'tip' });
|
|
253
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
254
|
+
const tx = await builder.build();
|
|
255
|
+
const serialized = tx.toBroadcastFormat();
|
|
256
|
+
const rebuilt = factory.from(serialized);
|
|
257
|
+
rebuilt.should.be.instanceOf(lib_1.HexTransferBuilder);
|
|
258
|
+
});
|
|
259
|
+
it('factory.from() returns TransferBuilder (not HexTransferBuilder) for an OLD-encoded signed transaction', async () => {
|
|
260
|
+
const builder = new lib_1.TransferBuilder((0, base_1.buildTestConfig)())
|
|
261
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
262
|
+
.amount(commonParams.amount)
|
|
263
|
+
.to({ address: receiver.address })
|
|
264
|
+
.sender({ address: sender.address })
|
|
265
|
+
.memo('56594')
|
|
266
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
267
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
268
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
269
|
+
.fee({ amount: 0, type: 'tip' });
|
|
270
|
+
builder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
271
|
+
const tx = await builder.build();
|
|
272
|
+
const serialized = tx.toBroadcastFormat();
|
|
273
|
+
const rebuilt = factory.from(serialized);
|
|
274
|
+
rebuilt.should.be.instanceOf(lib_1.TransferBuilder);
|
|
275
|
+
rebuilt.should.not.be.instanceOf(lib_1.HexTransferBuilder);
|
|
276
|
+
});
|
|
277
|
+
it('rebuild from NEW-encoded tx preserves memo bytes (serialized hex is identical)', async () => {
|
|
278
|
+
const build = async (memo) => {
|
|
279
|
+
const b = new lib_1.HexTransferBuilder((0, base_1.buildTestConfig)())
|
|
280
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
281
|
+
.amount(commonParams.amount)
|
|
282
|
+
.to({ address: receiver.address })
|
|
283
|
+
.sender({ address: sender.address })
|
|
284
|
+
.memo(memo)
|
|
285
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
286
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
287
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
288
|
+
.fee({ amount: 0, type: 'tip' });
|
|
289
|
+
b.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
290
|
+
return (await b.build()).toBroadcastFormat();
|
|
291
|
+
};
|
|
292
|
+
for (const memo of ['56594', 'testmemo', '0', '102329716']) {
|
|
293
|
+
const original = await build(memo);
|
|
294
|
+
// fromImplementation for signed txs doesn't restore blockNumber — must re-supply validity + referenceBlock
|
|
295
|
+
const rebuilt = factory
|
|
296
|
+
.from(original)
|
|
297
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
298
|
+
.referenceBlock(commonParams.referenceBlock);
|
|
299
|
+
const roundTripped = (await rebuilt.build()).toBroadcastFormat();
|
|
300
|
+
should_1.default.equal(roundTripped, original, `round-trip failed for memo "${memo}"`);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
it('rebuild from NEW-encoded tx has correct _memo value', async () => {
|
|
304
|
+
const hexBuilder = new lib_1.HexTransferBuilder((0, base_1.buildTestConfig)())
|
|
305
|
+
.material(src_1.utils.getMaterial((0, base_1.buildTestConfig)().network.type))
|
|
306
|
+
.amount(commonParams.amount)
|
|
307
|
+
.to({ address: receiver.address })
|
|
308
|
+
.sender({ address: sender.address })
|
|
309
|
+
.memo('56594')
|
|
310
|
+
.validity({ firstValid: commonParams.firstValid, maxDuration: commonParams.maxDuration })
|
|
311
|
+
.referenceBlock(commonParams.referenceBlock)
|
|
312
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: commonParams.nonce })
|
|
313
|
+
.fee({ amount: 0, type: 'tip' });
|
|
314
|
+
hexBuilder.addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
|
|
315
|
+
const serialized = (await hexBuilder.build()).toBroadcastFormat();
|
|
316
|
+
const rebuilt = factory.from(serialized);
|
|
317
|
+
should_1.default.equal(rebuilt._memo, NEW_MEMO_HEX['56594']);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
describe('utils.isNewMemoEncoding', () => {
|
|
321
|
+
it('detects NEW encoding (has 0x00 bytes)', () => {
|
|
322
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['56594']));
|
|
323
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['testmemo']));
|
|
324
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['abc']));
|
|
325
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(NEW_MEMO_HEX['0']));
|
|
326
|
+
});
|
|
327
|
+
it('does not detect OLD encoding as NEW (no 0x00 bytes)', () => {
|
|
328
|
+
// OLD encoding of "0": all 0x30 bytes, no nulls
|
|
329
|
+
const oldMemoZero = '0x3030303030303030303030303030303030303030303030303030303030303030';
|
|
330
|
+
// OLD encoding of "56594": 27 × 0x30 + ASCII "56594"
|
|
331
|
+
const oldMemoRef = '0x3030303030303030303030303030303030303030303030303030303536353934';
|
|
332
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding(oldMemoZero));
|
|
333
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding(oldMemoRef));
|
|
334
|
+
});
|
|
335
|
+
it('returns false for non-0x strings', () => {
|
|
336
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding('00000000000000000000000000056594'));
|
|
337
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding(''));
|
|
338
|
+
});
|
|
339
|
+
it('returns false for wrong-length 0x strings', () => {
|
|
340
|
+
should_1.default.ok(!src_1.utils.isNewMemoEncoding('0x1234'));
|
|
341
|
+
});
|
|
342
|
+
it('detects full 32-byte NEW memo with no null padding as NEW', () => {
|
|
343
|
+
const fullMemo = '0x' + '61'.repeat(32);
|
|
344
|
+
should_1.default.ok(src_1.utils.isNewMemoEncoding(fullMemo));
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
describe('utils.encodeMemoNew', () => {
|
|
348
|
+
it('encodes "56594" correctly', () => {
|
|
349
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('56594'), NEW_MEMO_HEX['56594']);
|
|
350
|
+
});
|
|
351
|
+
it('encodes "testmemo" correctly', () => {
|
|
352
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('testmemo'), NEW_MEMO_HEX['testmemo']);
|
|
353
|
+
});
|
|
354
|
+
it('encodes "0" correctly', () => {
|
|
355
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('0'), NEW_MEMO_HEX['0']);
|
|
356
|
+
});
|
|
357
|
+
it('encodes "102329716" correctly', () => {
|
|
358
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('102329716'), NEW_MEMO_HEX['102329716']);
|
|
359
|
+
});
|
|
360
|
+
it('encodes "abc" correctly', () => {
|
|
361
|
+
should_1.default.equal(src_1.utils.encodeMemoNew('abc'), NEW_MEMO_HEX['abc']);
|
|
362
|
+
});
|
|
363
|
+
it('always returns a 0x-prefixed 66-character string', () => {
|
|
364
|
+
['0', '1', '56594', 'testmemo', 'abc', '102329716'].forEach((memo) => {
|
|
365
|
+
const encoded = src_1.utils.encodeMemoNew(memo);
|
|
366
|
+
should_1.default.ok(encoded.startsWith('0x'), `should start with 0x: ${encoded}`);
|
|
367
|
+
should_1.default.equal(encoded.length, 66, `should be 66 chars (0x + 64 hex): ${encoded}`);
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
it('throws when memo exceeds 32 UTF-8 bytes', () => {
|
|
371
|
+
const tooLong = 'a'.repeat(33);
|
|
372
|
+
should_1.default.throws(() => src_1.utils.encodeMemoNew(tooLong), /exceeds maximum length of 32 bytes/);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe('HexTransferBuilder — memo validation', () => {
|
|
376
|
+
let builder;
|
|
377
|
+
beforeEach(() => {
|
|
378
|
+
const config = (0, base_1.buildTestConfig)();
|
|
379
|
+
builder = new lib_1.HexTransferBuilder(config).material(src_1.utils.getMaterial(config.network.type));
|
|
380
|
+
});
|
|
381
|
+
it('throws when memo exceeds 32 UTF-8 bytes', () => {
|
|
382
|
+
const tooLong = 'a'.repeat(33);
|
|
383
|
+
should_1.default.throws(() => builder.memo(tooLong), /exceeds maximum length of 32 bytes/);
|
|
384
|
+
});
|
|
385
|
+
it('throws for invalid hex memo', () => {
|
|
386
|
+
should_1.default.throws(() => builder.memo('0x' + 'zz'.repeat(32)), /Invalid memo hex encoding/);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGV4VHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9oZXhUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNENBQXVDO0FBQ3ZDLDBDQUFrRztBQUNsRyxzQ0FBcUM7QUFDckMsK0NBQTZEO0FBQzdELGlDQUE2RDtBQUU3RCxpRUFBaUU7QUFDakUsTUFBTSxZQUFZLEdBQTJCO0lBQzNDLENBQUMsRUFBRSxvRUFBb0U7SUFDdkUsQ0FBQyxFQUFFLG9FQUFvRTtJQUN2RSxDQUFDLEVBQUUsb0VBQW9FO0lBQ3ZFLEtBQUssRUFBRSxvRUFBb0U7SUFDM0UsU0FBUyxFQUFFLG9FQUFvRTtJQUMvRSxRQUFRLEVBQUUsb0VBQW9FO0lBQzlFLEdBQUcsRUFBRSxvRUFBb0U7Q0FDMUUsQ0FBQztBQUVGLFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7SUFDbEQsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFBLHNCQUFlLEdBQUUsQ0FBQztRQUNqQyxPQUFPLEdBQUcsSUFBSSx3QkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1FBQzVDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUUsT0FBZSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMs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RSxDQUFDLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ3pGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEhleFRyYW5zZmVyQnVpbGRlciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBhY2NvdW50cywgbW9ja1Rzc1NpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBidWlsZFRlc3RDb25maWcsIGJ1aWxkTWFpbm5ldENvbmZpZyB9IGZyb20gJy4vYmFzZSc7XG5cbi8vIEV4cGVjdGVkIE5FVy1lbmNvZGluZyBoZXggdmFsdWVzIGZyb20gcHJvYmxlbS5tZCBleGFtcGxlIHRhYmxlXG5jb25zdCBORVdfTUVNT19IRVg6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIDA6ICcweDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAxOiAnMHgzMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgMjogJzB4MzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gIDU2NTk0OiAnMHgzNTM2MzUzOTM0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgMTAyMzI5NzE2OiAnMHgzMTMwMzIzMzMyMzkzNzMxMzYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgdGVzdG1lbW86ICcweDc0NjU3Mzc0NmQ2NTZkNmYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICBhYmM6ICcweDYxNjI2MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxufTtcblxuZGVzY3JpYmUoJ0hleFRyYW5zZmVyQnVpbGRlciDigJQgbWVtbyBlbmNvZGluZycsICgpID0+IHtcbiAgbGV0IGJ1aWxkZXI6IEhleFRyYW5zZmVyQnVpbGRlcjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICBidWlsZGVyID0gbmV3IEhleFRyYW5zZmVyQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21lbW8oKSBwcm9kdWNlcyBORVcgZW5jb2RpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ2VuY29kZXMgXCIwXCInLCAoKSA9PiB7XG4gICAgICBidWlsZGVyLm1lbW8oJzAnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJzAnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5jb2RlcyBcIjFcIicsICgpID0+IHtcbiAgICAgIGJ1aWxkZXIubWVtbygnMScpO1xuICAgICAgc2hvdWxkLmVxdWFsKChidWlsZGVyIGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsnMSddKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmNvZGVzIFwiMlwiJywgKCkgPT4ge1xuICAgICAgYnVpbGRlci5tZW1vKCcyJyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWycyJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VuY29kZXMgXCI1NjU5NFwiJywgKCkgPT4ge1xuICAgICAgYnVpbGRlci5tZW1vKCc1NjU5NCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKChidWlsZGVyIGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsnNTY1OTQnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5jb2RlcyBcIjEwMjMyOTcxNlwiJywgKCkgPT4ge1xuICAgICAgYnVpbGRlci5tZW1vKCcxMDIzMjk3MTYnKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJzEwMjMyOTcxNiddKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmNvZGVzIFwidGVzdG1lbW9cIicsICgpID0+IHtcbiAgICAgIGJ1aWxkZXIubWVtbygndGVzdG1lbW8nKTtcbiAgICAgIHNob3VsZC5lcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJ3Rlc3RtZW1vJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VuY29kZXMgXCJhYmNcIicsICgpID0+IHtcbiAgICAgIGJ1aWxkZXIubWVtbygnYWJjJyk7XG4gICAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWydhYmMnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RvcmVzIGFuIGFscmVhZHktZW5jb2RlZCAweCBoZXggbWVtbyBhcy1pcyAocm91bmQtdHJpcCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbHJlYWR5RW5jb2RlZCA9IE5FV19NRU1PX0hFWFsnNTY1OTQnXTtcbiAgICAgIGJ1aWxkZXIubWVtbyhhbHJlYWR5RW5jb2RlZCk7XG4gICAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgYWxyZWFkeUVuY29kZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTkVXIGVuY29kaW5nIGRpZmZlcnMgZnJvbSBPTEQgZW5jb2RpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Byb2R1Y2VzIGRpZmZlcmVudCBieXRlcyB0aGFuIFRyYW5zZmVyQnVpbGRlciBmb3IgXCI1NjU5NFwiJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBUcmFuc2ZlckJ1aWxkZXIgfSA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9saWInKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3Qgb2xkQnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoY29uZmlnKS5tYXRlcmlhbCh1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKSk7XG4gICAgICBjb25zdCBuZXdCdWlsZGVyID0gbmV3IEhleFRyYW5zZmVyQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpKTtcblxuICAgICAgb2xkQnVpbGRlci5tZW1vKCc1NjU5NCcpO1xuICAgICAgbmV3QnVpbGRlci5tZW1vKCc1NjU5NCcpO1xuXG4gICAgICBjb25zdCBvbGRNZW1vID0gKG9sZEJ1aWxkZXIgYXMgYW55KS5fbWVtbztcbiAgICAgIGNvbnN0IG5ld01lbW8gPSAobmV3QnVpbGRlciBhcyBhbnkpLl9tZW1vO1xuXG4gICAgICBzaG91bGQubm90RXF1YWwob2xkTWVtbywgbmV3TWVtbyk7XG4gICAgICAvLyBPTEQ6IGxlZnQtcGFkIHdpdGggQVNDSUkgJzAnIGNoYXJzXG4gICAgICBzaG91bGQub2sob2xkTWVtby5zdGFydHNXaXRoKCcwMDAwMDAnKSwgYE9MRCBtZW1vIHNob3VsZCBzdGFydCB3aXRoIEFTQ0lJICcwJyBwYWRkaW5nLCBnb3Q6ICR7b2xkTWVtb31gKTtcbiAgICAgIC8vIE5FVzogMHgtcHJlZml4ZWQgaGV4XG4gICAgICBzaG91bGQub2sobmV3TWVtby5zdGFydHNXaXRoKCcweCcpLCBgTkVXIG1lbW8gc2hvdWxkIHN0YXJ0IHdpdGggMHgsIGdvdDogJHtuZXdNZW1vfWApO1xuICAgICAgc2hvdWxkLmVxdWFsKG5ld01lbW8sIE5FV19NRU1PX0hFWFsnNTY1OTQnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvZHVjZXMgZGlmZmVyZW50IGJ5dGVzIHRoYW4gVHJhbnNmZXJCdWlsZGVyIGZvciBcIjBcIicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgVHJhbnNmZXJCdWlsZGVyIH0gPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvbGliJyk7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG9sZEJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSkpO1xuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IG5ldyBIZXhUcmFuc2ZlckJ1aWxkZXIoY29uZmlnKS5tYXRlcmlhbCh1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKSk7XG5cbiAgICAgIG9sZEJ1aWxkZXIubWVtbygnMCcpO1xuICAgICAgbmV3QnVpbGRlci5tZW1vKCcwJyk7XG5cbiAgICAgIHNob3VsZC5ub3RFcXVhbCgob2xkQnVpbGRlciBhcyBhbnkpLl9tZW1vLCAobmV3QnVpbGRlciBhcyBhbnkpLl9tZW1vKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkIHRyYW5zYWN0aW9uIHdpdGggTkVXIG1lbW8gZW5jb2RpbmcnLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VuZGVyID0gYWNjb3VudHMuYWNjb3VudDE7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSBhY2NvdW50cy5hY2NvdW50MjtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIE5FVyBtZW1vIFwiNTY1OTRcIicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMCcpXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5tZW1vKCc1NjU5NCcpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDEgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgICBidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5hbW91bnQsICcxMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi50bywgcmVjZWl2ZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zZW5kZXIsIHNlbmRlci5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIE5FVyBtZW1vIFwidGVzdG1lbW9cIicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMCcpXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5tZW1vKCd0ZXN0bWVtbycpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDEgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgICBidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5hbW91bnQsICcxMDAwMDAwJyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi50bywgcmVjZWl2ZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKChidWlsZGVyIGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsndGVzdG1lbW8nXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBORVcgbWVtbyBcIjBcIiAoZGVmYXVsdCknLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzEwMDAwMDAnKVxuICAgICAgICAudG8oeyBhZGRyZXNzOiByZWNlaXZlci5hZGRyZXNzIH0pXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAubWVtbygnMCcpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDEgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgICBidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5vayh0eCk7XG4gICAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWycwJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggTkVXIG1lbW8gXCIxMDIzMjk3MTZcIicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMCcpXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5tZW1vKCcxMDIzMjk3MTYnKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiAzOTMzLCBtYXhEdXJhdGlvbjogNjQgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKCcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAxIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuICAgICAgYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20obW9ja1Rzc1NpZ25hdHVyZSwgJ2hleCcpKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQub2sodHgpO1xuICAgICAgc2hvdWxkLmVxdWFsKChidWlsZGVyIGFzIGFueSkuX21lbW8sIE5FV19NRU1PX0hFWFsnMTAyMzI5NzE2J10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JhdyB0cmFuc2FjdGlvbiBieXRlcyBkaWZmZXIgYmV0d2VlbiBPTEQgYW5kIE5FVyBidWlsZGVyIGZvciBzYW1lIG1lbW8nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IFRyYW5zZmVyQnVpbGRlciB9ID0gcmVxdWlyZSgnLi4vLi4vLi4vc3JjL2xpYicpO1xuICAgICAgY29uc3QgY29uZmlnID0gYnVpbGRUZXN0Q29uZmlnKCk7XG4gICAgICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpO1xuXG4gICAgICBjb25zdCBjb21tb25QYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzZW5kZXI6IHNlbmRlci5hZGRyZXNzLFxuICAgICAgICBmaXJzdFZhbGlkOiAzOTMzLFxuICAgICAgICBtYXhEdXJhdGlvbjogNjQsXG4gICAgICAgIHJlZmVyZW5jZUJsb2NrOiAnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJyxcbiAgICAgICAgbm9uY2U6IDEsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbGRCdWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcihjb25maWcpXG4gICAgICAgIC5tYXRlcmlhbChtYXRlcmlhbClcbiAgICAgICAgLmFtb3VudChjb21tb25QYXJhbXMuYW1vdW50KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiBjb21tb25QYXJhbXMuYWRkcmVzcyB9KVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogY29tbW9uUGFyYW1zLnNlbmRlciB9KVxuICAgICAgICAubWVtbygnNTY1OTQnKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiBjb21tb25QYXJhbXMuZmlyc3RWYWxpZCwgbWF4RHVyYXRpb246IGNvbW1vblBhcmFtcy5tYXhEdXJhdGlvbiB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soY29tbW9uUGFyYW1zLnJlZmVyZW5jZUJsb2NrKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiBjb21tb25QYXJhbXMubm9uY2UgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgICBvbGRCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuICAgICAgY29uc3Qgb2xkVHggPSBhd2FpdCBvbGRCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBuZXcgSGV4VHJhbnNmZXJCdWlsZGVyKGNvbmZpZylcbiAgICAgICAgLm1hdGVyaWFsKG1hdGVyaWFsKVxuICAgICAgICAuYW1vdW50KGNvbW1vblBhcmFtcy5hbW91bnQpXG4gICAgICAgIC50byh7IGFkZHJlc3M6IGNvbW1vblBhcmFtcy5hZGRyZXNzIH0pXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBjb21tb25QYXJhbXMuc2VuZGVyIH0pXG4gICAgICAgIC5tZW1vKCc1NjU5NCcpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IGNvbW1vblBhcmFtcy5maXJzdFZhbGlkLCBtYXhEdXJhdGlvbjogY29tbW9uUGFyYW1zLm1heER1cmF0aW9uIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhjb21tb25QYXJhbXMucmVmZXJlbmNlQmxvY2spXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IGNvbW1vblBhcmFtcy5ub25jZSB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICAgIG5ld0J1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgICBjb25zdCBuZXdUeCA9IGF3YWl0IG5ld0J1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgc2hvdWxkLm5vdEVxdWFsKG9sZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIG5ld1R4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnSGV4VHJhbnNmZXJCdWlsZGVyIOKAlCBNYWlubmV0JywgKCkgPT4ge1xuICBsZXQgYnVpbGRlcjogSGV4VHJhbnNmZXJCdWlsZGVyO1xuXG4gIGNvbnN0IHNlbmRlciA9IGFjY291bnRzLmFjY291bnQ1TWFpbm5ldDtcbiAgY29uc3QgcmVjZWl2ZXIgPSBhY2NvdW50cy5hY2NvdW50Nk1haW5uZXQ7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gYnVpbGRNYWlubmV0Q29uZmlnKCk7XG4gICAgYnVpbGRlciA9IG5ldyBIZXhUcmFuc2ZlckJ1aWxkZXIoY29uZmlnKS5tYXRlcmlhbCh1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZW5jb2RlIG1lbW8gXCI1NjU5NFwiIGNvcnJlY3RseSBvbiBtYWlubmV0JywgKCkgPT4ge1xuICAgIGJ1aWxkZXIubWVtbygnNTY1OTQnKTtcbiAgICBzaG91bGQuZXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWVtbywgTkVXX01FTU9fSEVYWyc1NjU5NCddKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIG1haW5uZXQgdHJhbnNhY3Rpb24gd2l0aCBORVcgbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICBidWlsZGVyXG4gICAgICAuYW1vdW50KCcxMDAwMDAwJylcbiAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgLm1lbW8oJzU2NTk0JylcbiAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgLnJlZmVyZW5jZUJsb2NrKCcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnKVxuICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMSB9KVxuICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20obW9ja1Rzc1NpZ25hdHVyZSwgJ2hleCcpKTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uYW1vdW50LCAnMTAwMDAwMCcpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnRvLCByZWNlaXZlci5hZGRyZXNzKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zZW5kZXIsIHNlbmRlci5hZGRyZXNzKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0hleFRyYW5zZmVyQnVpbGRlciDigJQgZmFjdG9yeS5mcm9tKCkgcmVidWlsZCByb3VuZC10cmlwJywgKCkgPT4ge1xuICBjb25zdCBzZW5kZXIgPSBhY2NvdW50cy5hY2NvdW50MTtcbiAgY29uc3QgcmVjZWl2ZXIgPSBhY2NvdW50cy5hY2NvdW50MjtcbiAgY29uc3QgY29tbW9uUGFyYW1zID0ge1xuICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgIGZpcnN0VmFsaWQ6IDM5MzMsXG4gICAgbWF4RHVyYXRpb246IDY0LFxuICAgIHJlZmVyZW5jZUJsb2NrOiAnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJyxcbiAgICBub25jZTogMSxcbiAgfTtcbiAgbGV0IGZhY3Rvcnk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHBvbHl4JykpO1xuICB9KTtcblxuICBpdCgnZmFjdG9yeS5mcm9tKCkgcmV0dXJucyBIZXhUcmFuc2ZlckJ1aWxkZXIgZm9yIGEgTkVXLWVuY29kZWQgc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgSGV4VHJhbnNmZXJCdWlsZGVyKGJ1aWxkVGVzdENvbmZpZygpKVxuICAgICAgLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGJ1aWxkVGVzdENvbmZpZygpLm5ldHdvcmsudHlwZSkpXG4gICAgICAuYW1vdW50KGNvbW1vblBhcmFtcy5hbW91bnQpXG4gICAgICAudG8oeyBhZGRyZXNzOiByZWNlaXZlci5hZGRyZXNzIH0pXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgIC5tZW1vKCc1NjU5NCcpXG4gICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiBjb21tb25QYXJhbXMuZmlyc3RWYWxpZCwgbWF4RHVyYXRpb246IGNvbW1vblBhcmFtcy5tYXhEdXJhdGlvbiB9KVxuICAgICAgLnJlZmVyZW5jZUJsb2NrKGNvbW1vblBhcmFtcy5yZWZlcmVuY2VCbG9jaylcbiAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IGNvbW1vblBhcmFtcy5ub25jZSB9KVxuICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20obW9ja1Rzc1NpZ25hdHVyZSwgJ2hleCcpKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGNvbnN0IHJlYnVpbHQgPSBmYWN0b3J5LmZyb20oc2VyaWFsaXplZCk7XG4gICAgcmVidWlsdC5zaG91bGQuYmUuaW5zdGFuY2VPZihIZXhUcmFuc2ZlckJ1aWxkZXIpO1xuICB9KTtcblxuICBpdCgnZmFjdG9yeS5mcm9tKCkgcmV0dXJucyBUcmFuc2ZlckJ1aWxkZXIgKG5vdCBIZXhUcmFuc2ZlckJ1aWxkZXIpIGZvciBhbiBPTEQtZW5jb2RlZCBzaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoYnVpbGRUZXN0Q29uZmlnKCkpXG4gICAgICAubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoYnVpbGRUZXN0Q29uZmlnKCkubmV0d29yay50eXBlKSlcbiAgICAgIC5hbW91bnQoY29tbW9uUGFyYW1zLmFtb3VudClcbiAgICAgIC50byh7IGFkZHJlc3M6IHJlY2VpdmVyLmFkZHJlc3MgfSlcbiAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgLm1lbW8oJzU2NTk0JylcbiAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IGNvbW1vblBhcmFtcy5maXJzdFZhbGlkLCBtYXhEdXJhdGlvbjogY29tbW9uUGFyYW1zLm1heER1cmF0aW9uIH0pXG4gICAgICAucmVmZXJlbmNlQmxvY2soY29tbW9uUGFyYW1zLnJlZmVyZW5jZUJsb2NrKVxuICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogY29tbW9uUGFyYW1zLm5vbmNlIH0pXG4gICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICBidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgcmVidWlsdCA9IGZhY3RvcnkuZnJvbShzZXJpYWxpemVkKTtcbiAgICByZWJ1aWx0LnNob3VsZC5iZS5pbnN0YW5jZU9mKFRyYW5zZmVyQnVpbGRlcik7XG4gICAgcmVidWlsdC5zaG91bGQubm90LmJlLmluc3RhbmNlT2YoSGV4VHJhbnNmZXJCdWlsZGVyKTtcbiAgfSk7XG5cbiAgaXQoJ3JlYnVpbGQgZnJvbSBORVctZW5jb2RlZCB0eCBwcmVzZXJ2ZXMgbWVtbyBieXRlcyAoc2VyaWFsaXplZCBoZXggaXMgaWRlbnRpY2FsKScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZCA9IGFzeW5jIChtZW1vOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGIgPSBuZXcgSGV4VHJhbnNmZXJCdWlsZGVyKGJ1aWxkVGVzdENvbmZpZygpKVxuICAgICAgICAubWF0ZXJpYWwodXRpbHMuZ2V0TWF0ZXJpYWwoYnVpbGRUZXN0Q29uZmlnKCkubmV0d29yay50eXBlKSlcbiAgICAgICAgLmFtb3VudChjb21tb25QYXJhbXMuYW1vdW50KVxuICAgICAgICAudG8oeyBhZGRyZXNzOiByZWNlaXZlci5hZGRyZXNzIH0pXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAubWVtbyhtZW1vKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiBjb21tb25QYXJhbXMuZmlyc3RWYWxpZCwgbWF4RHVyYXRpb246IGNvbW1vblBhcmFtcy5tYXhEdXJhdGlvbiB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soY29tbW9uUGFyYW1zLnJlZmVyZW5jZUJsb2NrKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiBjb21tb25QYXJhbXMubm9uY2UgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgICBiLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuICAgICAgcmV0dXJuIChhd2FpdCBiLmJ1aWxkKCkpLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgbWVtbyBvZiBbJzU2NTk0JywgJ3Rlc3RtZW1vJywgJzAnLCAnMTAyMzI5NzE2J10pIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gYXdhaXQgYnVpbGQobWVtbyk7XG4gICAgICAvLyBmcm9tSW1wbGVtZW50YXRpb24gZm9yIHNpZ25lZCB0eHMgZG9lc24ndCByZXN0b3JlIGJsb2NrTnVtYmVyIOKAlCBtdXN0IHJlLXN1cHBseSB2YWxpZGl0eSArIHJlZmVyZW5jZUJsb2NrXG4gICAgICBjb25zdCByZWJ1aWx0ID0gZmFjdG9yeVxuICAgICAgICAuZnJvbShvcmlnaW5hbClcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogY29tbW9uUGFyYW1zLmZpcnN0VmFsaWQsIG1heER1cmF0aW9uOiBjb21tb25QYXJhbXMubWF4RHVyYXRpb24gfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKGNvbW1vblBhcmFtcy5yZWZlcmVuY2VCbG9jayk7XG4gICAgICBjb25zdCByb3VuZFRyaXBwZWQgPSAoYXdhaXQgcmVidWlsdC5idWlsZCgpKS50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJvdW5kVHJpcHBlZCwgb3JpZ2luYWwsIGByb3VuZC10cmlwIGZhaWxlZCBmb3IgbWVtbyBcIiR7bWVtb31cImApO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3JlYnVpbGQgZnJvbSBORVctZW5jb2RlZCB0eCBoYXMgY29ycmVjdCBfbWVtbyB2YWx1ZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBoZXhCdWlsZGVyID0gbmV3IEhleFRyYW5zZmVyQnVpbGRlcihidWlsZFRlc3RDb25maWcoKSlcbiAgICAgIC5tYXRlcmlhbCh1dGlscy5nZXRNYXRlcmlhbChidWlsZFRlc3RDb25maWcoKS5uZXR3b3JrLnR5cGUpKVxuICAgICAgLmFtb3VudChjb21tb25QYXJhbXMuYW1vdW50KVxuICAgICAgLnRvKHsgYWRkcmVzczogcmVjZWl2ZXIuYWRkcmVzcyB9KVxuICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAubWVtbygnNTY1OTQnKVxuICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogY29tbW9uUGFyYW1zLmZpcnN0VmFsaWQsIG1heER1cmF0aW9uOiBjb21tb25QYXJhbXMubWF4RHVyYXRpb24gfSlcbiAgICAgIC5yZWZlcmVuY2VCbG9jayhjb21tb25QYXJhbXMucmVmZXJlbmNlQmxvY2spXG4gICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiBjb21tb25QYXJhbXMubm9uY2UgfSlcbiAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuICAgIGhleEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBzZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKG1vY2tUc3NTaWduYXR1cmUsICdoZXgnKSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IChhd2FpdCBoZXhCdWlsZGVyLmJ1aWxkKCkpLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICBjb25zdCByZWJ1aWx0ID0gZmFjdG9yeS5mcm9tKHNlcmlhbGl6ZWQpO1xuICAgIHNob3VsZC5lcXVhbCgocmVidWlsdCBhcyBhbnkpLl9tZW1vLCBORVdfTUVNT19IRVhbJzU2NTk0J10pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgndXRpbHMuaXNOZXdNZW1vRW5jb2RpbmcnLCAoKSA9PiB7XG4gIGl0KCdkZXRlY3RzIE5FVyBlbmNvZGluZyAoaGFzIDB4MDAgYnl0ZXMpJywgKCkgPT4ge1xuICAgIHNob3VsZC5vayh1dGlscy5pc05ld01lbW9FbmNvZGluZyhORVdfTUVNT19IRVhbJzU2NTk0J10pKTtcbiAgICBzaG91bGQub2sodXRpbHMuaXNOZXdNZW1vRW5jb2RpbmcoTkVXX01FTU9fSEVYWyd0ZXN0bWVtbyddKSk7XG4gICAgc2hvdWxkLm9rKHV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKE5FV19NRU1PX0hFWFsnYWJjJ10pKTtcbiAgICBzaG91bGQub2sodXRpbHMuaXNOZXdNZW1vRW5jb2RpbmcoTkVXX01FTU9fSEVYWycwJ10pKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGRldGVjdCBPTEQgZW5jb2RpbmcgYXMgTkVXIChubyAweDAwIGJ5dGVzKScsICgpID0+IHtcbiAgICAvLyBPTEQgZW5jb2Rpbmcgb2YgXCIwXCI6IGFsbCAweDMwIGJ5dGVzLCBubyBudWxsc1xuICAgIGNvbnN0IG9sZE1lbW9aZXJvID0gJzB4MzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMCc7XG4gICAgLy8gT0xEIGVuY29kaW5nIG9mIFwiNTY1OTRcIjogMjcgw5cgMHgzMCArIEFTQ0lJIFwiNTY1OTRcIlxuICAgIGNvbnN0IG9sZE1lbW9SZWYgPSAnMHgzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzNTM2MzUzOTM0JztcbiAgICBzaG91bGQub2soIXV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKG9sZE1lbW9aZXJvKSk7XG4gICAgc2hvdWxkLm9rKCF1dGlscy5pc05ld01lbW9FbmNvZGluZyhvbGRNZW1vUmVmKSk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIGZhbHNlIGZvciBub24tMHggc3RyaW5ncycsICgpID0+IHtcbiAgICBzaG91bGQub2soIXV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKCcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1NjU5NCcpKTtcbiAgICBzaG91bGQub2soIXV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKCcnKSk7XG4gIH0pO1xuXG4gIGl0KCdyZXR1cm5zIGZhbHNlIGZvciB3cm9uZy1sZW5ndGggMHggc3RyaW5ncycsICgpID0+IHtcbiAgICBzaG91bGQub2soIXV0aWxzLmlzTmV3TWVtb0VuY29kaW5nKCcweDEyMzQnKSk7XG4gIH0pO1xuXG4gIGl0KCdkZXRlY3RzIGZ1bGwgMzItYnl0ZSBORVcgbWVtbyB3aXRoIG5vIG51bGwgcGFkZGluZyBhcyBORVcnLCAoKSA9PiB7XG4gICAgY29uc3QgZnVsbE1lbW8gPSAnMHgnICsgJzYxJy5yZXBlYXQoMzIpO1xuICAgIHNob3VsZC5vayh1dGlscy5pc05ld01lbW9FbmNvZGluZyhmdWxsTWVtbykpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgndXRpbHMuZW5jb2RlTWVtb05ldycsICgpID0+IHtcbiAgaXQoJ2VuY29kZXMgXCI1NjU5NFwiIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwodXRpbHMuZW5jb2RlTWVtb05ldygnNTY1OTQnKSwgTkVXX01FTU9fSEVYWyc1NjU5NCddKTtcbiAgfSk7XG5cbiAgaXQoJ2VuY29kZXMgXCJ0ZXN0bWVtb1wiIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBzaG91bGQuZXF1YWwodXRpbHMuZW5jb2RlTWVtb05ldygndGVzdG1lbW8nKSwgTkVXX01FTU9fSEVYWyd0ZXN0bWVtbyddKTtcbiAgfSk7XG5cbiAgaXQoJ2VuY29kZXMgXCIwXCIgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIHNob3VsZC5lcXVhbCh1dGlscy5lbmNvZGVNZW1vTmV3KCcwJyksIE5FV19NRU1PX0hFWFsnMCddKTtcbiAgfSk7XG5cbiAgaXQoJ2VuY29kZXMgXCIxMDIzMjk3MTZcIiBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKHV0aWxzLmVuY29kZU1lbW9OZXcoJzEwMjMyOTcxNicpLCBORVdfTUVNT19IRVhbJzEwMjMyOTcxNiddKTtcbiAgfSk7XG5cbiAgaXQoJ2VuY29kZXMgXCJhYmNcIiBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgc2hvdWxkLmVxdWFsKHV0aWxzLmVuY29kZU1lbW9OZXcoJ2FiYycpLCBORVdfTUVNT19IRVhbJ2FiYyddKTtcbiAgfSk7XG5cbiAgaXQoJ2Fsd2F5cyByZXR1cm5zIGEgMHgtcHJlZml4ZWQgNjYtY2hhcmFjdGVyIHN0cmluZycsICgpID0+IHtcbiAgICBbJzAnLCAnMScsICc1NjU5NCcsICd0ZXN0bWVtbycsICdhYmMnLCAnMTAyMzI5NzE2J10uZm9yRWFjaCgobWVtbykgPT4ge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IHV0aWxzLmVuY29kZU1lbW9OZXcobWVtbyk7XG4gICAgICBzaG91bGQub2soZW5jb2RlZC5zdGFydHNXaXRoKCcweCcpLCBgc2hvdWxkIHN0YXJ0IHdpdGggMHg6ICR7ZW5jb2RlZH1gKTtcbiAgICAgIHNob3VsZC5lcXVhbChlbmNvZGVkLmxlbmd0aCwgNjYsIGBzaG91bGQgYmUgNjYgY2hhcnMgKDB4ICsgNjQgaGV4KTogJHtlbmNvZGVkfWApO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdoZW4gbWVtbyBleGNlZWRzIDMyIFVURi04IGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IHRvb0xvbmcgPSAnYScucmVwZWF0KDMzKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IHV0aWxzLmVuY29kZU1lbW9OZXcodG9vTG9uZyksIC9leGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mIDMyIGJ5dGVzLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdIZXhUcmFuc2ZlckJ1aWxkZXIg4oCUIG1lbW8gdmFsaWRhdGlvbicsICgpID0+IHtcbiAgbGV0IGJ1aWxkZXI6IEhleFRyYW5zZmVyQnVpbGRlcjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICBidWlsZGVyID0gbmV3IEhleFRyYW5zZmVyQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIG1lbW8gZXhjZWVkcyAzMiBVVEYtOCBieXRlcycsICgpID0+IHtcbiAgICBjb25zdCB0b29Mb25nID0gJ2EnLnJlcGVhdCgzMyk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBidWlsZGVyLm1lbW8odG9vTG9uZyksIC9leGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mIDMyIGJ5dGVzLyk7XG4gIH0pO1xuXG4gIGl0KCd0aHJvd3MgZm9yIGludmFsaWQgaGV4IG1lbW8nLCAoKSA9PiB7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBidWlsZGVyLm1lbW8oJzB4JyArICd6eicucmVwZWF0KDMyKSksIC9JbnZhbGlkIG1lbW8gaGV4IGVuY29kaW5nLyk7XG4gIH0pO1xufSk7XG4iXX0=
|