@bitgo/sdk-coin-stx 4.1.4 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +2 -1
- package/dist/src/lib/network.d.ts +16 -0
- package/dist/src/lib/network.d.ts.map +1 -0
- package/dist/src/lib/network.js +29 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +3 -4
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +3 -1
- package/dist/src/sip10Token.d.ts.map +1 -1
- package/dist/src/sip10Token.js +4 -2
- package/dist/src/tstxsignet.d.ts +20 -0
- package/dist/src/tstxsignet.d.ts.map +1 -0
- package/dist/src/tstxsignet.js +36 -0
- package/dist/test/unit/network.d.ts +2 -0
- package/dist/test/unit/network.d.ts.map +1 -0
- package/dist/test/unit/network.js +50 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.js +169 -1
- package/dist/test/unit/tstxsignet.d.ts +2 -0
- package/dist/test/unit/tstxsignet.d.ts.map +1 -0
- package/dist/test/unit/tstxsignet.js +60 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -246,5 +246,173 @@ describe('Stacks: PoX-5 Builder', function () {
|
|
|
246
246
|
outputs: [{ ...validLockup.outputs[0], leafHashes: Array(15).fill('00'.repeat(32)) }],
|
|
247
247
|
}), /more than 14 merkle siblings/);
|
|
248
248
|
});
|
|
249
|
+
describe('PoX-5 Builder on tstxsignet', function () {
|
|
250
|
+
// Stacks Foundation staking-testnet: chain ID 1280 (0x00000500) with the 0x80 testnet tx version
|
|
251
|
+
const signetFactory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get('tstxsignet'));
|
|
252
|
+
const TSTXSIGNET_TX_PREFIX = '8000000500';
|
|
253
|
+
const POX5_BOOT_ADDRESS = 'ST000000000000000000002AMW42H';
|
|
254
|
+
function configure(builder) {
|
|
255
|
+
builder.fee({ fee: '180' });
|
|
256
|
+
builder.nonce(0);
|
|
257
|
+
builder.fromPubKey(testData.TX_SENDER.pub);
|
|
258
|
+
builder.numberSignatures(1);
|
|
259
|
+
return builder;
|
|
260
|
+
}
|
|
261
|
+
function payloadOf(tx) {
|
|
262
|
+
return tx.toJson().payload;
|
|
263
|
+
}
|
|
264
|
+
function uintArg(cv, expected) {
|
|
265
|
+
cv.type.should.equal(transactions_1.ClarityType.UInt);
|
|
266
|
+
String(cv.value).should.equal(expected);
|
|
267
|
+
}
|
|
268
|
+
it('builds a stake transaction carrying the tstxsignet chain ID', async () => {
|
|
269
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
270
|
+
builder.stake({
|
|
271
|
+
signerManager,
|
|
272
|
+
amountUstx: '100000000',
|
|
273
|
+
numCycles: 1,
|
|
274
|
+
startBurnHt: 66849,
|
|
275
|
+
});
|
|
276
|
+
const tx = await builder.build();
|
|
277
|
+
tx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
278
|
+
const payload = payloadOf(tx);
|
|
279
|
+
payload.contractAddress.should.equal(POX5_BOOT_ADDRESS);
|
|
280
|
+
payload.contractName.should.equal('pox-5');
|
|
281
|
+
payload.functionName.should.equal('stake');
|
|
282
|
+
payload.functionArgs.length.should.equal(5);
|
|
283
|
+
payload.functionArgs[0].type.should.equal(transactions_1.ClarityType.PrincipalContract);
|
|
284
|
+
(0, transactions_1.cvToString)(payload.functionArgs[0]).should.equal(signerManager);
|
|
285
|
+
uintArg(payload.functionArgs[1], '100000000');
|
|
286
|
+
uintArg(payload.functionArgs[2], '1');
|
|
287
|
+
uintArg(payload.functionArgs[3], '66849');
|
|
288
|
+
payload.functionArgs[4].type.should.equal(transactions_1.ClarityType.OptionalNone);
|
|
289
|
+
});
|
|
290
|
+
it('builds a stake-update transaction carrying the tstxsignet chain ID', async () => {
|
|
291
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
292
|
+
builder.stakeUpdate({
|
|
293
|
+
signerManager,
|
|
294
|
+
oldSignerManager,
|
|
295
|
+
cyclesToExtend: 1,
|
|
296
|
+
amountIncrease: '50000',
|
|
297
|
+
});
|
|
298
|
+
const tx = await builder.build();
|
|
299
|
+
tx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
300
|
+
const payload = payloadOf(tx);
|
|
301
|
+
payload.functionName.should.equal('stake-update');
|
|
302
|
+
payload.functionArgs.length.should.equal(5);
|
|
303
|
+
(0, transactions_1.cvToString)(payload.functionArgs[0]).should.equal(signerManager);
|
|
304
|
+
(0, transactions_1.cvToString)(payload.functionArgs[1]).should.equal(oldSignerManager);
|
|
305
|
+
uintArg(payload.functionArgs[2], '1');
|
|
306
|
+
uintArg(payload.functionArgs[3], '50000');
|
|
307
|
+
payload.functionArgs[4].type.should.equal(transactions_1.ClarityType.OptionalNone);
|
|
308
|
+
});
|
|
309
|
+
it('builds an unstake transaction carrying the tstxsignet chain ID', async () => {
|
|
310
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
311
|
+
builder.unstake(oldSignerManager);
|
|
312
|
+
const tx = await builder.build();
|
|
313
|
+
tx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
314
|
+
const payload = payloadOf(tx);
|
|
315
|
+
payload.functionName.should.equal('unstake');
|
|
316
|
+
payload.functionArgs.length.should.equal(1);
|
|
317
|
+
(0, transactions_1.cvToString)(payload.functionArgs[0]).should.equal(oldSignerManager);
|
|
318
|
+
});
|
|
319
|
+
it('builds register-for-bond transactions (L1 lockup and sBTC) carrying the tstxsignet chain ID', async () => {
|
|
320
|
+
const btcBuilder = configure(signetFactory.getPox5Builder());
|
|
321
|
+
btcBuilder.registerForBond({
|
|
322
|
+
bondIndex: 210,
|
|
323
|
+
signerManager,
|
|
324
|
+
amountUstx: '1005000',
|
|
325
|
+
lockup: { kind: 'btc', unlockBytes: '00', outputs: [validLockupOutput()] },
|
|
326
|
+
});
|
|
327
|
+
const btcTx = await btcBuilder.build();
|
|
328
|
+
btcTx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
329
|
+
const btcPayload = payloadOf(btcTx);
|
|
330
|
+
btcPayload.functionName.should.equal('register-for-bond');
|
|
331
|
+
btcPayload.functionArgs[3].type.should.equal(transactions_1.ClarityType.ResponseOk);
|
|
332
|
+
const sbtcBuilder = configure(signetFactory.getPox5Builder());
|
|
333
|
+
sbtcBuilder.registerForBond({
|
|
334
|
+
bondIndex: 210,
|
|
335
|
+
signerManager,
|
|
336
|
+
amountUstx: '1005000',
|
|
337
|
+
lockup: { kind: 'sbtc', sbtcSats: 10000 },
|
|
338
|
+
});
|
|
339
|
+
const sbtcTx = await sbtcBuilder.build();
|
|
340
|
+
sbtcTx.toBroadcastFormat().slice(0, 10).should.equal(TSTXSIGNET_TX_PREFIX);
|
|
341
|
+
const sbtcPayload = payloadOf(sbtcTx);
|
|
342
|
+
sbtcPayload.functionArgs[3].type.should.equal(transactions_1.ClarityType.ResponseErr);
|
|
343
|
+
});
|
|
344
|
+
it('rebuilds every staking flow byte-identically from raw hex', async () => {
|
|
345
|
+
const stakeBuilder = configure(signetFactory.getPox5Builder());
|
|
346
|
+
stakeBuilder.stake({
|
|
347
|
+
signerManager,
|
|
348
|
+
amountUstx: '100000000',
|
|
349
|
+
numCycles: 1,
|
|
350
|
+
startBurnHt: 66849,
|
|
351
|
+
});
|
|
352
|
+
const stakeTx = await stakeBuilder.build();
|
|
353
|
+
const stakeRebuilt = signetFactory.from(stakeTx.toBroadcastFormat());
|
|
354
|
+
stakeRebuilt.fromPubKey(testData.TX_SENDER.pub);
|
|
355
|
+
(await stakeRebuilt.build()).toBroadcastFormat().should.equal(stakeTx.toBroadcastFormat());
|
|
356
|
+
const unstakeBuilder = configure(signetFactory.getPox5Builder());
|
|
357
|
+
unstakeBuilder.unstake(oldSignerManager);
|
|
358
|
+
const unstakeTx = await unstakeBuilder.build();
|
|
359
|
+
const unstakeRebuilt = signetFactory.from(unstakeTx.toBroadcastFormat());
|
|
360
|
+
unstakeRebuilt.fromPubKey(testData.TX_SENDER.pub);
|
|
361
|
+
(await unstakeRebuilt.build()).toBroadcastFormat().should.equal(unstakeTx.toBroadcastFormat());
|
|
362
|
+
const registerBuilder = configure(signetFactory.getPox5Builder());
|
|
363
|
+
registerBuilder.registerForBond({
|
|
364
|
+
bondIndex: 210,
|
|
365
|
+
signerManager,
|
|
366
|
+
amountUstx: '1005000',
|
|
367
|
+
lockup: { kind: 'sbtc', sbtcSats: 10000 },
|
|
368
|
+
});
|
|
369
|
+
const registerTx = await registerBuilder.build();
|
|
370
|
+
const registerRebuilt = signetFactory.from(registerTx.toBroadcastFormat());
|
|
371
|
+
registerRebuilt.fromPubKey(testData.TX_SENDER.pub);
|
|
372
|
+
(await registerRebuilt.build()).toBroadcastFormat().should.equal(registerTx.toBroadcastFormat());
|
|
373
|
+
});
|
|
374
|
+
it('routes parsed stake transactions to the PoX-5 builder on tstxsignet', async () => {
|
|
375
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
376
|
+
builder.stake({
|
|
377
|
+
signerManager,
|
|
378
|
+
amountUstx: '100000000',
|
|
379
|
+
numCycles: 1,
|
|
380
|
+
startBurnHt: 66849,
|
|
381
|
+
});
|
|
382
|
+
const tx = await builder.build();
|
|
383
|
+
const payload = tx.stxTransaction.payload;
|
|
384
|
+
builder.should.be.an.instanceOf(src_1.StxLib.Pox5Builder);
|
|
385
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstxsignet'), payload), true);
|
|
386
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstxsignet'), {
|
|
387
|
+
...payload,
|
|
388
|
+
contractAddress: (0, transactions_1.createAddress)(testData.ACCOUNT_1.address),
|
|
389
|
+
}), false);
|
|
390
|
+
const routed = signetFactory.from(tx.toBroadcastFormat());
|
|
391
|
+
routed.should.be.an.instanceOf(src_1.StxLib.Pox5Builder);
|
|
392
|
+
});
|
|
393
|
+
it('exposes fee, nonce and sender on the built stake transaction', async () => {
|
|
394
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
395
|
+
builder.stake({
|
|
396
|
+
signerManager,
|
|
397
|
+
amountUstx: '100000000',
|
|
398
|
+
numCycles: 1,
|
|
399
|
+
startBurnHt: 66849,
|
|
400
|
+
});
|
|
401
|
+
const txJson = (await builder.build()).toJson();
|
|
402
|
+
txJson.fee.should.equal('180');
|
|
403
|
+
txJson.nonce.should.equal(0);
|
|
404
|
+
txJson.id.should.match(/^[0-9a-f]{64}$/);
|
|
405
|
+
txJson.from.should.equal(testData.TX_SENDER.address);
|
|
406
|
+
});
|
|
407
|
+
it('rejects a signer-manager principal without the address.contract-name shape', () => {
|
|
408
|
+
const builder = configure(signetFactory.getPox5Builder());
|
|
409
|
+
assert_1.default.throws(() => builder.stake({
|
|
410
|
+
signerManager: 'no-dot',
|
|
411
|
+
amountUstx: '100000000',
|
|
412
|
+
numCycles: 1,
|
|
413
|
+
startBurnHt: 66849,
|
|
414
|
+
}), /address.contract-name format/);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
249
417
|
});
|
|
250
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3BveDVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHVEQUF5RjtBQUN6Riw0Q0FBdUM7QUFDdkMsb0RBQTRCO0FBRTVCLHNDQUFzQztBQUN0Qyx1REFBeUM7QUFFekMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLGFBQWEsR0FBRyx5REFBeUQsQ0FBQztJQUNoRixNQUFNLGdCQUFnQixHQUFHLDZEQUE2RCxDQUFDO0lBRXZGLFNBQVMsU0FBUyxDQUFDLE9BQTJCO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsaUJBQWlCO1FBQ3hCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSTtZQUNaLEVBQUUsRUFBRSxJQUFJO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkIsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZ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RSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ3RGLDhDQUE4QyxDQUMvQyxDQUFDO1FBQ0YsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxXQUFXLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDbEcsMEJBQTBCLENBQzNCLENBQUM7UUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxRQUFRLENBQUM7WUFDUCxHQUFHLFdBQVc7WUFDZCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN0RixDQUFDLEVBQ0osOEJBQThCLENBQy9CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQ2xhcml0eVR5cGUsIGNyZWF0ZUFkZHJlc3MsIGN2VG9TdHJpbmcsIGN2VG9WYWx1ZSB9IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyBTdHhMaWIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ1N0YWNrczogUG9YLTUgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RzdHgnKSk7XG4gIGNvbnN0IHNpZ25lck1hbmFnZXIgPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMC5zaWduZXItbWFuYWdlcic7XG4gIGNvbnN0IG9sZFNpZ25lck1hbmFnZXIgPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMC5vbGQtc2lnbmVyLW1hbmFnZXInO1xuXG4gIGZ1bmN0aW9uIGNvbmZpZ3VyZShidWlsZGVyOiBTdHhMaWIuUG94NUJ1aWxkZXIpOiBTdHhMaWIuUG94NUJ1aWxkZXIge1xuICAgIGJ1aWxkZXIuZmVlKHsgZmVlOiAnMTgwJyB9KTtcbiAgICBidWlsZGVyLm5vbmNlKDApO1xuICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMSk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZExvY2t1cE91dHB1dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiA5MjMxLFxuICAgICAgdHg6ICcwMCcsXG4gICAgICBvdXRwdXRJbmRleDogMCxcbiAgICAgIGhlYWRlcjogJzAwJy5yZXBlYXQoODApLFxuICAgICAgbGVhZkhhc2hlczogWycwMCcucmVwZWF0KDMyKV0sXG4gICAgICB0eENvdW50OiAxLFxuICAgICAgdHhJbmRleDogMCxcbiAgICAgIGFtb3VudDogMTAwMDAsXG4gICAgICB1bmxvY2tCdXJuSGVpZ2h0OiA5NDkwLFxuICAgIH07XG4gIH1cblxuICBpdCgnYnVpbGRzIGFuZCBwYXJzZXMgcmVnaXN0ZXItZm9yLWJvbmQgd2l0aCBhbiBMMSBsb2NrdXAnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgIGxvY2t1cDoge1xuICAgICAgICBraW5kOiAnYnRjJyxcbiAgICAgICAgdW5sb2NrQnl0ZXM6ICcwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWlnaHQ6IDkyMzEsXG4gICAgICAgICAgICB0eDogJzAwJyxcbiAgICAgICAgICAgIG91dHB1dEluZGV4OiAwLFxuICAgICAgICAgICAgaGVhZGVyOiAnMDAnLnJlcGVhdCg4MCksXG4gICAgICAgICAgICBsZWFmSGFzaGVzOiBbJzAwJy5yZXBlYXQoMzIpXSxcbiAgICAgICAgICAgIHR4Q291bnQ6IDEsXG4gICAgICAgICAgICB0eEluZGV4OiAwLFxuICAgICAgICAgICAgYW1vdW50OiAxMDAwMCxcbiAgICAgICAgICAgIHVubG9ja0J1cm5IZWlnaHQ6IDk0OTAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBzaWduZXJDYWxsZGF0YTogJzAwJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eC50b0pzb24oKS5wYXlsb2FkIGFzIGFueTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbk5hbWUsICdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJncy5sZW5ndGgsIDUpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJnc1swXS50eXBlLCBDbGFyaXR5VHlwZS5VSW50KTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuUHJpbmNpcGFsQ29udHJhY3QpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS50eXBlLCBDbGFyaXR5VHlwZS5SZXNwb25zZU9rKTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbNF0udHlwZSwgQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lKTtcblxuICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIHJlYnVpbHRCdWlsZGVyLmZyb21QdWJLZXkodGVzdERhdGEuVFhfU0VOREVSLnB1Yik7XG4gICAgY29uc3QgcmVidWlsdCA9IGF3YWl0IHJlYnVpbHRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHJlYnVpbHQudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZXMgdGhlIFBvWC01IGNvbnRyYWN0IGFkZHJlc3MgZHVyaW5nIGZhY3Rvcnkgcm91dGluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgYnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdidGMnLCB1bmxvY2tCeXRlczogJzAwJywgb3V0cHV0czogW3ZhbGlkTG9ja3VwT3V0cHV0KCldIH0sXG4gICAgfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9ICh0eCBhcyBTdHhMaWIuVHJhbnNhY3Rpb24pLnN0eFRyYW5zYWN0aW9uLnBheWxvYWQgYXMgYW55O1xuICAgIHNob3VsZC5lcXVhbChTdHhMaWIuUG94NUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbChjb2lucy5nZXQoJ3RzdHgnKSwgcGF5bG9hZCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChcbiAgICAgIFN0eExpYi5Qb3g1QnVpbGRlci5pc1ZhbGlkQ29udHJhY3RDYWxsKGNvaW5zLmdldCgndHN0eCcpLCB7XG4gICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogY3JlYXRlQWRkcmVzcyh0ZXN0RGF0YS5BQ0NPVU5UXzEuYWRkcmVzcyksXG4gICAgICB9KSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyBzQlRDIHJlZ2lzdHJhdGlvbiB1c2luZyByZXNwb25zZSBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgYnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdzYnRjJywgc2J0Y1NhdHM6IDEwMDAwIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gdHgudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKHBheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnR5cGUsIENsYXJpdHlUeXBlLlJlc3BvbnNlRXJyKTtcbiAgICBzaG91bGQuZXF1YWwoY3ZUb1ZhbHVlKHBheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnZhbHVlKS50b1N0cmluZygpLCAnMTAwMDAnKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyB2YWxpZGF0b3IgdXBkYXRlLCBlYXJseSBleGl0LCBhbmQgcmV3YXJkIGNhbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZSA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLnVwZGF0ZUJvbmRSZWdpc3RyYXRpb24oe1xuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIG9sZFNpZ25lck1hbmFnZXIsXG4gICAgICBzaWduZXJDYWxsZGF0YTogJzAwJyxcbiAgICB9KTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICAoKGF3YWl0IHVwZGF0ZS5idWlsZCgpKS50b0pzb24oKS5wYXlsb2FkIGFzIHsgZnVuY3Rpb25OYW1lOiBzdHJpbmcgfSkuZnVuY3Rpb25OYW1lLFxuICAgICAgJ3VwZGF0ZS1ib25kLXJlZ2lzdHJhdGlvbidcbiAgICApO1xuXG4gICAgY29uc3QgZWFybHlFeGl0ID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkuYW5ub3VuY2VMMUVhcmx5RXhpdCh7XG4gICAgICBzdGFrZXI6IHRlc3REYXRhLlRYX1NFTkRFUi5hZGRyZXNzLFxuICAgICAgb2xkU2lnbmVyTWFuYWdlcixcbiAgICB9KTtcbiAgICBjb25zdCBlYXJseUV4aXRQYXlsb2FkID0gKGF3YWl0IGVhcmx5RXhpdC5idWlsZCgpKS50b0pzb24oKS5wYXlsb2FkIGFzIGFueTtcbiAgICBzaG91bGQuZXF1YWwoZWFybHlFeGl0UGF5bG9hZC5mdW5jdGlvbk5hbWUsICdhbm5vdW5jZS1sMS1lYXJseS1leGl0Jyk7XG4gICAgc2hvdWxkLmVxdWFsKGN2VG9TdHJpbmcoZWFybHlFeGl0UGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0pLCB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG5cbiAgICBjb25zdCBjbGFpbXMgPSBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5jbGFpbVJld2FyZHMoe1xuICAgICAgYm9uZEluZGljZXM6IFsyMTAsIDIyNl0sXG4gICAgICByZXdhcmRDeWNsZTogMzkxLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsYWltUGF5bG9hZCA9IChhd2FpdCBjbGFpbXMuYnVpbGQoKSkudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbk5hbWUsICdjbGFpbS1yZXdhcmRzJyk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0udHlwZSwgQ2xhcml0eVR5cGUuTGlzdCk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuVUludCk7XG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGV2ZXJ5IHN1cHBvcnRlZCBQb1gtNSBmdW5jdGlvbiBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZXMgPSBbXG4gICAgICAnc3Rha2UnLFxuICAgICAgJ3N0YWtlLXVwZGF0ZScsXG4gICAgICAndW5zdGFrZScsXG4gICAgICAncmVnaXN0ZXItZm9yLWJvbmQnLFxuICAgICAgJ3VwZGF0ZS1ib25kLXJlZ2lzdHJhdGlvbicsXG4gICAgICAnYW5ub3VuY2UtbDEtZWFybHktZXhpdCcsXG4gICAgICAnY2xhaW0tcmV3YXJkcycsXG4gICAgICAnY2xhaW0tc3Rha2VyLXJld2FyZHMtZm9yLXNpZ25lcicsXG4gICAgICAnY2FsY3VsYXRlLXJld2FyZHMnLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZ1bmN0aW9uTmFtZSBvZiBmdW5jdGlvbk5hbWVzKSB7XG4gICAgICBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5mdW5jdGlvbk5hbWUoZnVuY3Rpb25OYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdwYXJzZXMgcmVzcG9uc2UsIGxpc3QsIGFuZCBleHBsaWNpdCBwcmluY2lwYWwgSlNPTiB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25OYW1lKCdjYWxjdWxhdGUtcmV3YXJkcycpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgdmFsOiB7XG4gICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICB2YWw6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgIHZhbDogW3sgdHlwZTogJ3VpbnQxMjgnLCB2YWw6ICcyMTAnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyB0eXBlOiAnY29udHJhY3QtcHJpbmNpcGFsJywgdmFsOiBvbGRTaWduZXJNYW5hZ2VyIH0sXG4gICAgXSk7XG5cbiAgICBjb25zdCBhcmdzID0gKChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpLnBheWxvYWQgYXMgYW55KS5mdW5jdGlvbkFyZ3M7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMF0udHlwZSwgQ2xhcml0eVR5cGUuUmVzcG9uc2VPayk7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMF0udmFsdWUudHlwZSwgQ2xhcml0eVR5cGUuTGlzdCk7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuUHJpbmNpcGFsQ29udHJhY3QpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBpbnZhbGlkIFNQViBwcm9vZiBieXRlIGxlbmd0aHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbG9ja3VwID0ge1xuICAgICAga2luZDogJ2J0YycgYXMgY29uc3QsXG4gICAgICB1bmxvY2tCeXRlczogJzAwJyxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGhlaWdodDogOTIzMSxcbiAgICAgICAgICB0eDogJzAwJyxcbiAgICAgICAgICBvdXRwdXRJbmRleDogMCxcbiAgICAgICAgICBoZWFkZXI6ICcwMCcsXG4gICAgICAgICAgbGVhZkhhc2hlczogWycwMCcucmVwZWF0KDMyKV0sXG4gICAgICAgICAgdHhDb3VudDogMSxcbiAgICAgICAgICB0eEluZGV4OiAwLFxuICAgICAgICAgIGFtb3VudDogMTAwMDAsXG4gICAgICAgICAgdW5sb2NrQnVybkhlaWdodDogOTQ5MCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgICAgIGxvY2t1cCxcbiAgICAgICAgfSksXG4gICAgICAvaGVhZGVyIG11c3QgYmUgZXhhY3RseSA4MCBieXRlcy9cbiAgICApO1xuXG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLnJlZ2lzdGVyRm9yQm9uZCh7XG4gICAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgICBhbW91bnRVc3R4OiAnMTAwNTAwMCcsXG4gICAgICAgICAgbG9ja3VwOiB7XG4gICAgICAgICAgICAuLi5sb2NrdXAsXG4gICAgICAgICAgICBvdXRwdXRzOiBbeyAuLi5sb2NrdXAub3V0cHV0c1swXSwgaGVhZGVyOiAnMDAnLnJlcGVhdCg4MCksIGxlYWZIYXNoZXM6IFsnMDAnXSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIC9sZWFmSGFzaCBtdXN0IGJlIGV4YWN0bHkgMzIgYnl0ZXMvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgbWFsZm9ybWVkIGxvY2t1cCBmaWVsZHMgYW5kIGNvbnRyYWN0IHByaW5jaXBhbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRMb2NrdXAgPSB7IGtpbmQ6ICdidGMnIGFzIGNvbnN0LCB1bmxvY2tCeXRlczogJzAwJywgb3V0cHV0czogW3ZhbGlkTG9ja3VwT3V0cHV0KCldIH07XG4gICAgY29uc3QgcmVnaXN0ZXIgPSAobG9ja3VwOiB0eXBlb2YgdmFsaWRMb2NrdXAsIG1hbmFnZXIgPSBzaWduZXJNYW5hZ2VyKSA9PlxuICAgICAgY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgIHNpZ25lck1hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgICAgbG9ja3VwLFxuICAgICAgfSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHJlZ2lzdGVyKHZhbGlkTG9ja3VwLCAnbm8tZG90JyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUgZm9ybWF0Lyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiByZWdpc3Rlcih2YWxpZExvY2t1cCwgJ2EuYi5jJyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUgZm9ybWF0Lyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiByZWdpc3Rlcih2YWxpZExvY2t1cCwgJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAuJyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUvKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gcmVnaXN0ZXIoeyAuLi52YWxpZExvY2t1cCwgb3V0cHV0czogW3sgLi4udmFsaWRMb2NrdXAub3V0cHV0c1swXSwgdHg6ICcwJyB9XSB9KSxcbiAgICAgIC90eCBtdXN0IGJlIGFuIGV2ZW4tbGVuZ3RoIGhleGFkZWNpbWFsIHN0cmluZy9cbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiByZWdpc3Rlcih7IC4uLnZhbGlkTG9ja3VwLCBvdXRwdXRzOiBbeyAuLi52YWxpZExvY2t1cC5vdXRwdXRzWzBdLCB0eDogJ3p6JyB9XSB9KSxcbiAgICAgIC90eCBtdXN0IGJlIGFuIGV2ZW4tbGVuZ3RoIGhleGFkZWNpbWFsIHN0cmluZy9cbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiByZWdpc3Rlcih7IC4uLnZhbGlkTG9ja3VwLCBvdXRwdXRzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMSB9LCAoKSA9PiB2YWxpZExvY2t1cE91dHB1dCgpKSB9KSxcbiAgICAgIC9iZXR3ZWVuIDEgYW5kIDEwIG91dHB1dHMvXG4gICAgKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgcmVnaXN0ZXIoe1xuICAgICAgICAgIC4uLnZhbGlkTG9ja3VwLFxuICAgICAgICAgIG91dHB1dHM6IFt7IC4uLnZhbGlkTG9ja3VwLm91dHB1dHNbMF0sIGxlYWZIYXNoZXM6IEFycmF5KDE1KS5maWxsKCcwMCcucmVwZWF0KDMyKSkgfV0sXG4gICAgICAgIH0pLFxuICAgICAgL21vcmUgdGhhbiAxNCBtZXJrbGUgc2libGluZ3MvXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
418
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3BveDVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHVEQUE4RztBQUM5Ryw0Q0FBdUM7QUFDdkMsb0RBQTRCO0FBRzVCLHNDQUFzQztBQUN0Qyx1REFBeUM7QUFFekMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLGFBQWEsR0FBRyx5REFBeUQsQ0FBQztJQUNoRixNQUFNLGdCQUFnQixHQUFHLDZEQUE2RCxDQUFDO0lBRXZGLFNBQVMsU0FBUyxDQUFDLE9BQTJCO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsaUJBQWlCO1FBQ3hCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSTtZQUNaLEVBQUUsRUFBRSxJQUFJO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkIsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZ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QztZQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxHQUFHLEVBQUU7WUFDcEYsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzFELGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUNILE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ1osYUFBYSxFQUFFLFFBQVE7Z0JBQ3ZCLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixTQUFTLEVBQUUsQ0FBQztnQkFDWixXQUFXLEVBQUUsS0FBSzthQUNuQixDQUFDLEVBQ0osOEJBQThCLENBQy9CLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDbGFyaXR5VHlwZSwgQ29udHJhY3RDYWxsUGF5bG9hZCwgY3JlYXRlQWRkcmVzcywgY3ZUb1N0cmluZywgY3ZUb1ZhbHVlIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBTdHhMaWIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ1N0YWNrczogUG9YLTUgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RzdHgnKSk7XG4gIGNvbnN0IHNpZ25lck1hbmFnZXIgPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMC5zaWduZXItbWFuYWdlcic7XG4gIGNvbnN0IG9sZFNpZ25lck1hbmFnZXIgPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMC5vbGQtc2lnbmVyLW1hbmFnZXInO1xuXG4gIGZ1bmN0aW9uIGNvbmZpZ3VyZShidWlsZGVyOiBTdHhMaWIuUG94NUJ1aWxkZXIpOiBTdHhMaWIuUG94NUJ1aWxkZXIge1xuICAgIGJ1aWxkZXIuZmVlKHsgZmVlOiAnMTgwJyB9KTtcbiAgICBidWlsZGVyLm5vbmNlKDApO1xuICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMSk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZExvY2t1cE91dHB1dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiA5MjMxLFxuICAgICAgdHg6ICcwMCcsXG4gICAgICBvdXRwdXRJbmRleDogMCxcbiAgICAgIGhlYWRlcjogJzAwJy5yZXBlYXQoODApLFxuICAgICAgbGVhZkhhc2hlczogWycwMCcucmVwZWF0KDMyKV0sXG4gICAgICB0eENvdW50OiAxLFxuICAgICAgdHhJbmRleDogMCxcbiAgICAgIGFtb3VudDogMTAwMDAsXG4gICAgICB1bmxvY2tCdXJuSGVpZ2h0OiA5NDkwLFxuICAgIH07XG4gIH1cblxuICBpdCgnYnVpbGRzIGFuZCBwYXJzZXMgcmVnaXN0ZXItZm9yLWJvbmQgd2l0aCBhbiBMMSBsb2NrdXAnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgIGxvY2t1cDoge1xuICAgICAgICBraW5kOiAnYnRjJyxcbiAgICAgICAgdW5sb2NrQnl0ZXM6ICcwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWlnaHQ6IDkyMzEsXG4gICAgICAgICAgICB0eDogJzAwJyxcbiAgICAgICAgICAgIG91dHB1dEluZGV4OiAwLFxuICAgICAgICAgICAgaGVhZGVyOiAnMDAnLnJlcGVhdCg4MCksXG4gICAgICAgICAgICBsZWFmSGFzaGVzOiBbJzAwJy5yZXBlYXQoMzIpXSxcbiAgICAgICAgICAgIHR4Q291bnQ6IDEsXG4gICAgICAgICAgICB0eEluZGV4OiAwLFxuICAgICAgICAgICAgYW1vdW50OiAxMDAwMCxcbiAgICAgICAgICAgIHVubG9ja0J1cm5IZWlnaHQ6IDk0OTAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBzaWduZXJDYWxsZGF0YTogJzAwJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eC50b0pzb24oKS5wYXlsb2FkIGFzIGFueTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbk5hbWUsICdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJncy5sZW5ndGgsIDUpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJnc1swXS50eXBlLCBDbGFyaXR5VHlwZS5VSW50KTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuUHJpbmNpcGFsQ29udHJhY3QpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS50eXBlLCBDbGFyaXR5VHlwZS5SZXNwb25zZU9rKTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbNF0udHlwZSwgQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lKTtcblxuICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIHJlYnVpbHRCdWlsZGVyLmZyb21QdWJLZXkodGVzdERhdGEuVFhfU0VOREVSLnB1Yik7XG4gICAgY29uc3QgcmVidWlsdCA9IGF3YWl0IHJlYnVpbHRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHJlYnVpbHQudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZXMgdGhlIFBvWC01IGNvbnRyYWN0IGFkZHJlc3MgZHVyaW5nIGZhY3Rvcnkgcm91dGluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgYnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdidGMnLCB1bmxvY2tCeXRlczogJzAwJywgb3V0cHV0czogW3ZhbGlkTG9ja3VwT3V0cHV0KCldIH0sXG4gICAgfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9ICh0eCBhcyBTdHhMaWIuVHJhbnNhY3Rpb24pLnN0eFRyYW5zYWN0aW9uLnBheWxvYWQgYXMgYW55O1xuICAgIHNob3VsZC5lcXVhbChTdHhMaWIuUG94NUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbChjb2lucy5nZXQoJ3RzdHgnKSwgcGF5bG9hZCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChcbiAgICAgIFN0eExpYi5Qb3g1QnVpbGRlci5pc1ZhbGlkQ29udHJhY3RDYWxsKGNvaW5zLmdldCgndHN0eCcpLCB7XG4gICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogY3JlYXRlQWRkcmVzcyh0ZXN0RGF0YS5BQ0NPVU5UXzEuYWRkcmVzcyksXG4gICAgICB9KSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyBzQlRDIHJlZ2lzdHJhdGlvbiB1c2luZyByZXNwb25zZSBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgYnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdzYnRjJywgc2J0Y1NhdHM6IDEwMDAwIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gdHgudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKHBheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnR5cGUsIENsYXJpdHlUeXBlLlJlc3BvbnNlRXJyKTtcbiAgICBzaG91bGQuZXF1YWwoY3ZUb1ZhbHVlKHBheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnZhbHVlKS50b1N0cmluZygpLCAnMTAwMDAnKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyB2YWxpZGF0b3IgdXBkYXRlLCBlYXJseSBleGl0LCBhbmQgcmV3YXJkIGNhbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZSA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLnVwZGF0ZUJvbmRSZWdpc3RyYXRpb24oe1xuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIG9sZFNpZ25lck1hbmFnZXIsXG4gICAgICBzaWduZXJDYWxsZGF0YTogJzAwJyxcbiAgICB9KTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICAoKGF3YWl0IHVwZGF0ZS5idWlsZCgpKS50b0pzb24oKS5wYXlsb2FkIGFzIHsgZnVuY3Rpb25OYW1lOiBzdHJpbmcgfSkuZnVuY3Rpb25OYW1lLFxuICAgICAgJ3VwZGF0ZS1ib25kLXJlZ2lzdHJhdGlvbidcbiAgICApO1xuXG4gICAgY29uc3QgZWFybHlFeGl0ID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkuYW5ub3VuY2VMMUVhcmx5RXhpdCh7XG4gICAgICBzdGFrZXI6IHRlc3REYXRhLlRYX1NFTkRFUi5hZGRyZXNzLFxuICAgICAgb2xkU2lnbmVyTWFuYWdlcixcbiAgICB9KTtcbiAgICBjb25zdCBlYXJseUV4aXRQYXlsb2FkID0gKGF3YWl0IGVhcmx5RXhpdC5idWlsZCgpKS50b0pzb24oKS5wYXlsb2FkIGFzIGFueTtcbiAgICBzaG91bGQuZXF1YWwoZWFybHlFeGl0UGF5bG9hZC5mdW5jdGlvbk5hbWUsICdhbm5vdW5jZS1sMS1lYXJseS1leGl0Jyk7XG4gICAgc2hvdWxkLmVxdWFsKGN2VG9TdHJpbmcoZWFybHlFeGl0UGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0pLCB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG5cbiAgICBjb25zdCBjbGFpbXMgPSBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5jbGFpbVJld2FyZHMoe1xuICAgICAgYm9uZEluZGljZXM6IFsyMTAsIDIyNl0sXG4gICAgICByZXdhcmRDeWNsZTogMzkxLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsYWltUGF5bG9hZCA9IChhd2FpdCBjbGFpbXMuYnVpbGQoKSkudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbk5hbWUsICdjbGFpbS1yZXdhcmRzJyk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0udHlwZSwgQ2xhcml0eVR5cGUuTGlzdCk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuVUludCk7XG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGV2ZXJ5IHN1cHBvcnRlZCBQb1gtNSBmdW5jdGlvbiBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZXMgPSBbXG4gICAgICAnc3Rha2UnLFxuICAgICAgJ3N0YWtlLXVwZGF0ZScsXG4gICAgICAndW5zdGFrZScsXG4gICAgICAncmVnaXN0ZXItZm9yLWJvbmQnLFxuICAgICAgJ3VwZGF0ZS1ib25kLXJlZ2lzdHJhdGlvbicsXG4gICAgICAnYW5ub3VuY2UtbDEtZWFybHktZXhpdCcsXG4gICAgICAnY2xhaW0tcmV3YXJkcycsXG4gICAgICAnY2xhaW0tc3Rha2VyLXJld2FyZHMtZm9yLXNpZ25lcicsXG4gICAgICAnY2FsY3VsYXRlLXJld2FyZHMnLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZ1bmN0aW9uTmFtZSBvZiBmdW5jdGlvbk5hbWVzKSB7XG4gICAgICBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5mdW5jdGlvbk5hbWUoZnVuY3Rpb25OYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdwYXJzZXMgcmVzcG9uc2UsIGxpc3QsIGFuZCBleHBsaWNpdCBwcmluY2lwYWwgSlNPTiB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25OYW1lKCdjYWxjdWxhdGUtcmV3YXJkcycpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgdmFsOiB7XG4gICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICB2YWw6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgIHZhbDogW3sgdHlwZTogJ3VpbnQxMjgnLCB2YWw6ICcyMTAnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyB0eXBlOiAnY29udHJhY3QtcHJpbmNpcGFsJywgdmFsOiBvbGRTaWduZXJNYW5hZ2VyIH0sXG4gICAgXSk7XG5cbiAgICBjb25zdCBhcmdzID0gKChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpLnBheWxvYWQgYXMgYW55KS5mdW5jdGlvbkFyZ3M7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMF0udHlwZSwgQ2xhcml0eVR5cGUuUmVzcG9uc2VPayk7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMF0udmFsdWUudHlwZSwgQ2xhcml0eVR5cGUuTGlzdCk7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuUHJpbmNpcGFsQ29udHJhY3QpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBpbnZhbGlkIFNQViBwcm9vZiBieXRlIGxlbmd0aHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbG9ja3VwID0ge1xuICAgICAga2luZDogJ2J0YycgYXMgY29uc3QsXG4gICAgICB1bmxvY2tCeXRlczogJzAwJyxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGhlaWdodDogOTIzMSxcbiAgICAgICAgICB0eDogJzAwJyxcbiAgICAgICAgICBvdXRwdXRJbmRleDogMCxcbiAgICAgICAgICBoZWFkZXI6ICcwMCcsXG4gICAgICAgICAgbGVhZkhhc2hlczogWycwMCcucmVwZWF0KDMyKV0sXG4gICAgICAgICAgdHhDb3VudDogMSxcbiAgICAgICAgICB0eEluZGV4OiAwLFxuICAgICAgICAgIGFtb3VudDogMTAwMDAsXG4gICAgICAgICAgdW5sb2NrQnVybkhlaWdodDogOTQ5MCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgICAgIGxvY2t1cCxcbiAgICAgICAgfSksXG4gICAgICAvaGVhZGVyIG11c3QgYmUgZXhhY3RseSA4MCBieXRlcy9cbiAgICApO1xuXG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLnJlZ2lzdGVyRm9yQm9uZCh7XG4gICAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgICBhbW91bnRVc3R4OiAnMTAwNTAwMCcsXG4gICAgICAgICAgbG9ja3VwOiB7XG4gICAgICAgICAgICAuLi5sb2NrdXAsXG4gICAgICAgICAgICBvdXRwdXRzOiBbeyAuLi5sb2NrdXAub3V0cHV0c1swXSwgaGVhZGVyOiAnMDAnLnJlcGVhdCg4MCksIGxlYWZIYXNoZXM6IFsnMDAnXSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIC9sZWFmSGFzaCBtdXN0IGJlIGV4YWN0bHkgMzIgYnl0ZXMvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgbWFsZm9ybWVkIGxvY2t1cCBmaWVsZHMgYW5kIGNvbnRyYWN0IHByaW5jaXBhbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRMb2NrdXAgPSB7IGtpbmQ6ICdidGMnIGFzIGNvbnN0LCB1bmxvY2tCeXRlczogJzAwJywgb3V0cHV0czogW3ZhbGlkTG9ja3VwT3V0cHV0KCldIH07XG4gICAgY29uc3QgcmVnaXN0ZXIgPSAobG9ja3VwOiB0eXBlb2YgdmFsaWRMb2NrdXAsIG1hbmFnZXIgPSBzaWduZXJNYW5hZ2VyKSA9PlxuICAgICAgY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgIHNpZ25lck1hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgICAgbG9ja3VwLFxuICAgICAgfSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHJlZ2lzdGVyKHZhbGlkTG9ja3VwLCAnbm8tZG90JyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUgZm9ybWF0Lyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiByZWdpc3Rlcih2YWxpZExvY2t1cCwgJ2EuYi5jJyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUgZm9ybWF0Lyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiByZWdpc3Rlcih2YWxpZExvY2t1cCwgJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAuJyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUvKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gcmVnaXN0ZXIoeyAuLi52YWxpZExvY2t1cCwgb3V0cHV0czogW3sgLi4udmFsaWRMb2NrdXAub3V0cHV0c1swXSwgdHg6ICcwJyB9XSB9KSxcbiAgICAgIC90eCBtdXN0IGJlIGFuIGV2ZW4tbGVuZ3RoIGhleGFkZWNpbWFsIHN0cmluZy9cbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiByZWdpc3Rlcih7IC4uLnZhbGlkTG9ja3VwLCBvdXRwdXRzOiBbeyAuLi52YWxpZExvY2t1cC5vdXRwdXRzWzBdLCB0eDogJ3p6JyB9XSB9KSxcbiAgICAgIC90eCBtdXN0IGJlIGFuIGV2ZW4tbGVuZ3RoIGhleGFkZWNpbWFsIHN0cmluZy9cbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiByZWdpc3Rlcih7IC4uLnZhbGlkTG9ja3VwLCBvdXRwdXRzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMSB9LCAoKSA9PiB2YWxpZExvY2t1cE91dHB1dCgpKSB9KSxcbiAgICAgIC9iZXR3ZWVuIDEgYW5kIDEwIG91dHB1dHMvXG4gICAgKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgcmVnaXN0ZXIoe1xuICAgICAgICAgIC4uLnZhbGlkTG9ja3VwLFxuICAgICAgICAgIG91dHB1dHM6IFt7IC4uLnZhbGlkTG9ja3VwLm91dHB1dHNbMF0sIGxlYWZIYXNoZXM6IEFycmF5KDE1KS5maWxsKCcwMCcucmVwZWF0KDMyKSkgfV0sXG4gICAgICAgIH0pLFxuICAgICAgL21vcmUgdGhhbiAxNCBtZXJrbGUgc2libGluZ3MvXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BvWC01IEJ1aWxkZXIgb24gdHN0eHNpZ25ldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdGFja3MgRm91bmRhdGlvbiBzdGFraW5nLXRlc3RuZXQ6IGNoYWluIElEIDEyODAgKDB4MDAwMDA1MDApIHdpdGggdGhlIDB4ODAgdGVzdG5ldCB0eCB2ZXJzaW9uXG4gICAgY29uc3Qgc2lnbmV0RmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RzdHhzaWduZXQnKSk7XG4gICAgY29uc3QgVFNUWFNJR05FVF9UWF9QUkVGSVggPSAnODAwMDAwMDUwMCc7XG4gICAgY29uc3QgUE9YNV9CT09UX0FERFJFU1MgPSAnU1QwMDAwMDAwMDAwMDAwMDAwMDAwMDJBTVc0MkgnO1xuXG4gICAgZnVuY3Rpb24gY29uZmlndXJlKGJ1aWxkZXI6IFN0eExpYi5Qb3g1QnVpbGRlcik6IFN0eExpYi5Qb3g1QnVpbGRlciB7XG4gICAgICBidWlsZGVyLmZlZSh7IGZlZTogJzE4MCcgfSk7XG4gICAgICBidWlsZGVyLm5vbmNlKDApO1xuICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDEpO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGF5bG9hZE9mKHR4OiBCYXNlVHJhbnNhY3Rpb24pOiBTdHhMaWIuU3RhY2tzQ29udHJhY3RQYXlsb2FkIHtcbiAgICAgIHJldHVybiB0eC50b0pzb24oKS5wYXlsb2FkIGFzIFN0eExpYi5TdGFja3NDb250cmFjdFBheWxvYWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdWludEFyZyhjdjogeyB0eXBlOiBudW1iZXI7IHZhbHVlPzogdW5rbm93biB9LCBleHBlY3RlZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjdi50eXBlLnNob3VsZC5lcXVhbChDbGFyaXR5VHlwZS5VSW50KTtcbiAgICAgIFN0cmluZyhjdi52YWx1ZSkuc2hvdWxkLmVxdWFsKGV4cGVjdGVkKTtcbiAgICB9XG5cbiAgICBpdCgnYnVpbGRzIGEgc3Rha2UgdHJhbnNhY3Rpb24gY2FycnlpbmcgdGhlIHRzdHhzaWduZXQgY2hhaW4gSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICBidWlsZGVyLnN0YWtlKHtcbiAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgYW1vdW50VXN0eDogJzEwMDAwMDAwMCcsXG4gICAgICAgIG51bUN5Y2xlczogMSxcbiAgICAgICAgc3RhcnRCdXJuSHQ6IDY2ODQ5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zbGljZSgwLCAxMCkuc2hvdWxkLmVxdWFsKFRTVFhTSUdORVRfVFhfUFJFRklYKTtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHBheWxvYWRPZih0eCk7XG4gICAgICBwYXlsb2FkLmNvbnRyYWN0QWRkcmVzcy5zaG91bGQuZXF1YWwoUE9YNV9CT09UX0FERFJFU1MpO1xuICAgICAgcGF5bG9hZC5jb250cmFjdE5hbWUuc2hvdWxkLmVxdWFsKCdwb3gtNScpO1xuICAgICAgcGF5bG9hZC5mdW5jdGlvbk5hbWUuc2hvdWxkLmVxdWFsKCdzdGFrZScpO1xuICAgICAgcGF5bG9hZC5mdW5jdGlvbkFyZ3MubGVuZ3RoLnNob3VsZC5lcXVhbCg1KTtcbiAgICAgIHBheWxvYWQuZnVuY3Rpb25BcmdzWzBdLnR5cGUuc2hvdWxkLmVxdWFsKENsYXJpdHlUeXBlLlByaW5jaXBhbENvbnRyYWN0KTtcbiAgICAgIGN2VG9TdHJpbmcocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0pLnNob3VsZC5lcXVhbChzaWduZXJNYW5hZ2VyKTtcbiAgICAgIHVpbnRBcmcocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0sICcxMDAwMDAwMDAnKTtcblxuICAgICAgdWludEFyZyhwYXlsb2FkLmZ1bmN0aW9uQXJnc1syXSwgJzEnKTtcblxuICAgICAgdWludEFyZyhwYXlsb2FkLmZ1bmN0aW9uQXJnc1szXSwgJzY2ODQ5Jyk7XG5cbiAgICAgIHBheWxvYWQuZnVuY3Rpb25BcmdzWzRdLnR5cGUuc2hvdWxkLmVxdWFsKENsYXJpdHlUeXBlLk9wdGlvbmFsTm9uZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGRzIGEgc3Rha2UtdXBkYXRlIHRyYW5zYWN0aW9uIGNhcnJ5aW5nIHRoZSB0c3R4c2lnbmV0IGNoYWluIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgYnVpbGRlci5zdGFrZVVwZGF0ZSh7XG4gICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgIG9sZFNpZ25lck1hbmFnZXIsXG4gICAgICAgIGN5Y2xlc1RvRXh0ZW5kOiAxLFxuICAgICAgICBhbW91bnRJbmNyZWFzZTogJzUwMDAwJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2xpY2UoMCwgMTApLnNob3VsZC5lcXVhbChUU1RYU0lHTkVUX1RYX1BSRUZJWCk7XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBwYXlsb2FkT2YodHgpO1xuICAgICAgcGF5bG9hZC5mdW5jdGlvbk5hbWUuc2hvdWxkLmVxdWFsKCdzdGFrZS11cGRhdGUnKTtcbiAgICAgIHBheWxvYWQuZnVuY3Rpb25BcmdzLmxlbmd0aC5zaG91bGQuZXF1YWwoNSk7XG4gICAgICBjdlRvU3RyaW5nKHBheWxvYWQuZnVuY3Rpb25BcmdzWzBdKS5zaG91bGQuZXF1YWwoc2lnbmVyTWFuYWdlcik7XG4gICAgICBjdlRvU3RyaW5nKHBheWxvYWQuZnVuY3Rpb25BcmdzWzFdKS5zaG91bGQuZXF1YWwob2xkU2lnbmVyTWFuYWdlcik7XG4gICAgICB1aW50QXJnKHBheWxvYWQuZnVuY3Rpb25BcmdzWzJdLCAnMScpO1xuICAgICAgdWludEFyZyhwYXlsb2FkLmZ1bmN0aW9uQXJnc1szXSwgJzUwMDAwJyk7XG4gICAgICBwYXlsb2FkLmZ1bmN0aW9uQXJnc1s0XS50eXBlLnNob3VsZC5lcXVhbChDbGFyaXR5VHlwZS5PcHRpb25hbE5vbmUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkcyBhbiB1bnN0YWtlIHRyYW5zYWN0aW9uIGNhcnJ5aW5nIHRoZSB0c3R4c2lnbmV0IGNoYWluIElEJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgYnVpbGRlci51bnN0YWtlKG9sZFNpZ25lck1hbmFnZXIpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2xpY2UoMCwgMTApLnNob3VsZC5lcXVhbChUU1RYU0lHTkVUX1RYX1BSRUZJWCk7XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBwYXlsb2FkT2YodHgpO1xuICAgICAgcGF5bG9hZC5mdW5jdGlvbk5hbWUuc2hvdWxkLmVxdWFsKCd1bnN0YWtlJyk7XG4gICAgICBwYXlsb2FkLmZ1bmN0aW9uQXJncy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgY3ZUb1N0cmluZyhwYXlsb2FkLmZ1bmN0aW9uQXJnc1swXSkuc2hvdWxkLmVxdWFsKG9sZFNpZ25lck1hbmFnZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkcyByZWdpc3Rlci1mb3ItYm9uZCB0cmFuc2FjdGlvbnMgKEwxIGxvY2t1cCBhbmQgc0JUQykgY2FycnlpbmcgdGhlIHRzdHhzaWduZXQgY2hhaW4gSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidGNCdWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICBidGNCdWlsZGVyLnJlZ2lzdGVyRm9yQm9uZCh7XG4gICAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgICBhbW91bnRVc3R4OiAnMTAwNTAwMCcsXG4gICAgICAgIGxvY2t1cDogeyBraW5kOiAnYnRjJywgdW5sb2NrQnl0ZXM6ICcwMCcsIG91dHB1dHM6IFt2YWxpZExvY2t1cE91dHB1dCgpXSB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBidGNUeCA9IGF3YWl0IGJ0Y0J1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGJ0Y1R4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2xpY2UoMCwgMTApLnNob3VsZC5lcXVhbChUU1RYU0lHTkVUX1RYX1BSRUZJWCk7XG5cbiAgICAgIGNvbnN0IGJ0Y1BheWxvYWQgPSBwYXlsb2FkT2YoYnRjVHgpO1xuICAgICAgYnRjUGF5bG9hZC5mdW5jdGlvbk5hbWUuc2hvdWxkLmVxdWFsKCdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgICAgYnRjUGF5bG9hZC5mdW5jdGlvbkFyZ3NbM10udHlwZS5zaG91bGQuZXF1YWwoQ2xhcml0eVR5cGUuUmVzcG9uc2VPayk7XG5cbiAgICAgIGNvbnN0IHNidGNCdWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICBzYnRjQnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgICBib25kSW5kZXg6IDIxMCxcbiAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgICBsb2NrdXA6IHsga2luZDogJ3NidGMnLCBzYnRjU2F0czogMTAwMDAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2J0Y1R4ID0gYXdhaXQgc2J0Y0J1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNidGNUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNsaWNlKDAsIDEwKS5zaG91bGQuZXF1YWwoVFNUWFNJR05FVF9UWF9QUkVGSVgpO1xuXG4gICAgICBjb25zdCBzYnRjUGF5bG9hZCA9IHBheWxvYWRPZihzYnRjVHgpO1xuICAgICAgc2J0Y1BheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnR5cGUuc2hvdWxkLmVxdWFsKENsYXJpdHlUeXBlLlJlc3BvbnNlRXJyKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWJ1aWxkcyBldmVyeSBzdGFraW5nIGZsb3cgYnl0ZS1pZGVudGljYWxseSBmcm9tIHJhdyBoZXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzdGFrZUJ1aWxkZXIgPSBjb25maWd1cmUoc2lnbmV0RmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICAgIHN0YWtlQnVpbGRlci5zdGFrZSh7XG4gICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDAwMDAwMDAnLFxuICAgICAgICBudW1DeWNsZXM6IDEsXG4gICAgICAgIHN0YXJ0QnVybkh0OiA2Njg0OSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3Rha2VUeCA9IGF3YWl0IHN0YWtlQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCBzdGFrZVJlYnVpbHQgPSBzaWduZXRGYWN0b3J5LmZyb20oc3Rha2VUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHN0YWtlUmVidWlsdC5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgKGF3YWl0IHN0YWtlUmVidWlsdC5idWlsZCgpKS50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChzdGFrZVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgICBjb25zdCB1bnN0YWtlQnVpbGRlciA9IGNvbmZpZ3VyZShzaWduZXRGYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgICAgdW5zdGFrZUJ1aWxkZXIudW5zdGFrZShvbGRTaWduZXJNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHVuc3Rha2VUeCA9IGF3YWl0IHVuc3Rha2VCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHVuc3Rha2VSZWJ1aWx0ID0gc2lnbmV0RmFjdG9yeS5mcm9tKHVuc3Rha2VUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHVuc3Rha2VSZWJ1aWx0LmZyb21QdWJLZXkodGVzdERhdGEuVFhfU0VOREVSLnB1Yik7XG4gICAgICAoYXdhaXQgdW5zdGFrZVJlYnVpbHQuYnVpbGQoKSkudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodW5zdGFrZVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuXG4gICAgICBjb25zdCByZWdpc3RlckJ1aWxkZXIgPSBjb25maWd1cmUoc2lnbmV0RmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICAgIHJlZ2lzdGVyQnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgICBib25kSW5kZXg6IDIxMCxcbiAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgICBsb2NrdXA6IHsga2luZDogJ3NidGMnLCBzYnRjU2F0czogMTAwMDAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVnaXN0ZXJUeCA9IGF3YWl0IHJlZ2lzdGVyQnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCByZWdpc3RlclJlYnVpbHQgPSBzaWduZXRGYWN0b3J5LmZyb20ocmVnaXN0ZXJUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHJlZ2lzdGVyUmVidWlsdC5mcm9tUHViS2V5KHRlc3REYXRhLlRYX1NFTkRFUi5wdWIpO1xuICAgICAgKGF3YWl0IHJlZ2lzdGVyUmVidWlsdC5idWlsZCgpKS50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyZWdpc3RlclR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JvdXRlcyBwYXJzZWQgc3Rha2UgdHJhbnNhY3Rpb25zIHRvIHRoZSBQb1gtNSBidWlsZGVyIG9uIHRzdHhzaWduZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICBidWlsZGVyLnN0YWtlKHtcbiAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgYW1vdW50VXN0eDogJzEwMDAwMDAwMCcsXG4gICAgICAgIG51bUN5Y2xlczogMSxcbiAgICAgICAgc3RhcnRCdXJuSHQ6IDY2ODQ5LFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSAodHggYXMgU3R4TGliLlRyYW5zYWN0aW9uKS5zdHhUcmFuc2FjdGlvbi5wYXlsb2FkIGFzIHVua25vd24gYXMgQ29udHJhY3RDYWxsUGF5bG9hZDtcblxuICAgICAgYnVpbGRlci5zaG91bGQuYmUuYW4uaW5zdGFuY2VPZihTdHhMaWIuUG94NUJ1aWxkZXIpO1xuICAgICAgc2hvdWxkLmVxdWFsKFN0eExpYi5Qb3g1QnVpbGRlci5pc1ZhbGlkQ29udHJhY3RDYWxsKGNvaW5zLmdldCgndHN0eHNpZ25ldCcpLCBwYXlsb2FkKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIFN0eExpYi5Qb3g1QnVpbGRlci5pc1ZhbGlkQ29udHJhY3RDYWxsKGNvaW5zLmdldCgndHN0eHNpZ25ldCcpLCB7XG4gICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICBjb250cmFjdEFkZHJlc3M6IGNyZWF0ZUFkZHJlc3ModGVzdERhdGEuQUNDT1VOVF8xLmFkZHJlc3MpLFxuICAgICAgICB9KSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJvdXRlZCA9IHNpZ25ldEZhY3RvcnkuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIHJvdXRlZC5zaG91bGQuYmUuYW4uaW5zdGFuY2VPZihTdHhMaWIuUG94NUJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2V4cG9zZXMgZmVlLCBub25jZSBhbmQgc2VuZGVyIG9uIHRoZSBidWlsdCBzdGFrZSB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjb25maWd1cmUoc2lnbmV0RmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKTtcbiAgICAgIGJ1aWxkZXIuc3Rha2Uoe1xuICAgICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgICBhbW91bnRVc3R4OiAnMTAwMDAwMDAwJyxcbiAgICAgICAgbnVtQ3ljbGVzOiAxLFxuICAgICAgICBzdGFydEJ1cm5IdDogNjY4NDksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhKc29uID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgICB0eEpzb24uZmVlLnNob3VsZC5lcXVhbCgnMTgwJyk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDApO1xuICAgICAgdHhKc29uLmlkLnNob3VsZC5tYXRjaCgvXlswLTlhLWZdezY0fSQvKTtcbiAgICAgIHR4SnNvbi5mcm9tLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHNpZ25lci1tYW5hZ2VyIHByaW5jaXBhbCB3aXRob3V0IHRoZSBhZGRyZXNzLmNvbnRyYWN0LW5hbWUgc2hhcGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKHNpZ25ldEZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJ1aWxkZXIuc3Rha2Uoe1xuICAgICAgICAgICAgc2lnbmVyTWFuYWdlcjogJ25vLWRvdCcsXG4gICAgICAgICAgICBhbW91bnRVc3R4OiAnMTAwMDAwMDAwJyxcbiAgICAgICAgICAgIG51bUN5Y2xlczogMSxcbiAgICAgICAgICAgIHN0YXJ0QnVybkh0OiA2Njg0OSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgL2FkZHJlc3MuY29udHJhY3QtbmFtZSBmb3JtYXQvXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tstxsignet.d.ts","sourceRoot":"","sources":["../../../test/unit/tstxsignet.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
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 assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
8
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
9
|
+
const sdk_test_1 = require("@bitgo/sdk-test");
|
|
10
|
+
const transactions_1 = require("@stacks/transactions");
|
|
11
|
+
const should_1 = __importDefault(require("should"));
|
|
12
|
+
const src_1 = require("../../src");
|
|
13
|
+
describe('tstxsignet', function () {
|
|
14
|
+
let bitgo;
|
|
15
|
+
let basecoin;
|
|
16
|
+
before(function () {
|
|
17
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
|
|
18
|
+
bitgo.initializeTestVars();
|
|
19
|
+
bitgo.safeRegister('tstxsignet', src_1.Tstxsignet.createInstance);
|
|
20
|
+
basecoin = bitgo.coin('tstxsignet');
|
|
21
|
+
});
|
|
22
|
+
it('uses the statics tstxsignet coin', function () {
|
|
23
|
+
assert_1.default.strictEqual(basecoin.getChain(), 'tstxsignet');
|
|
24
|
+
assert_1.default.strictEqual(basecoin.getFullName(), 'Testnet Stacks (Signet)');
|
|
25
|
+
assert_1.default.strictEqual(basecoin.getFamily(), 'stx');
|
|
26
|
+
});
|
|
27
|
+
it('resolves the staking-testnet public node url', function () {
|
|
28
|
+
assert_1.default.strictEqual(basecoin.getPublicNodeUrl(), 'https://api.staking-testnet.hiro.so');
|
|
29
|
+
});
|
|
30
|
+
describe('wallet creation', function () {
|
|
31
|
+
it('generates a wallet keypair from the coin', function () {
|
|
32
|
+
const keyPair = basecoin.generateKeyPair();
|
|
33
|
+
const { pub, prv } = keyPair;
|
|
34
|
+
if (pub === undefined || prv === undefined) {
|
|
35
|
+
throw new Error('wallet keypair is missing key material');
|
|
36
|
+
}
|
|
37
|
+
pub.should.match(/^xpub/);
|
|
38
|
+
prv.should.match(/^xprv/);
|
|
39
|
+
});
|
|
40
|
+
it('derives a valid testnet wallet address from the generated key', function () {
|
|
41
|
+
const keyPair = basecoin.generateKeyPair();
|
|
42
|
+
if (keyPair.pub === undefined) {
|
|
43
|
+
throw new Error('wallet keypair is missing the extended public key');
|
|
44
|
+
}
|
|
45
|
+
const address = new src_1.StxLib.KeyPair({ pub: keyPair.pub }).getSTXAddress(false, transactions_1.TransactionVersion.Testnet);
|
|
46
|
+
address.startsWith('ST').should.be.true();
|
|
47
|
+
basecoin.isValidAddress(address).should.be.true();
|
|
48
|
+
});
|
|
49
|
+
it('creates a wallet bound to the tstxsignet coin', function () {
|
|
50
|
+
// mirrors the wallet data the API returns for a created tstxsignet wallet
|
|
51
|
+
const wallet = new sdk_core_1.Wallet(bitgo, basecoin, { coin: 'tstxsignet' });
|
|
52
|
+
should_1.default.equal(wallet.coin(), 'tstxsignet');
|
|
53
|
+
});
|
|
54
|
+
it('validates testnet wallet addresses', function () {
|
|
55
|
+
basecoin.isValidAddress('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6').should.be.true();
|
|
56
|
+
basecoin.isValidAddress('not-an-address').should.be.false();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0eHNpZ25ldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90c3R4c2lnbmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLDRDQUEwQztBQUMxQyw4Q0FBeUM7QUFDekMsOENBQTBEO0FBQzFELHVEQUEwRDtBQUMxRCxvREFBNEI7QUFFNUIsbUNBQStDO0FBRS9DLFFBQVEsQ0FBQyxZQUFZLEVBQUU7SUFDckIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBb0IsQ0FBQztJQUV6QixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLGdCQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFlLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7UUFDckMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RELGdCQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3RFLGdCQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtRQUNqRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7WUFDN0IsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRTtZQUNsRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLGlDQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUU7WUFDbEQsMEVBQTBFO1lBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBVyxDQUFDLENBQUM7WUFDNUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLFFBQVEsQ0FBQyxjQUFjLENBQUMsMENBQTBDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JGLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25WZXJzaW9uIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyBTdHhMaWIsIFRzdHhzaWduZXQgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgndHN0eHNpZ25ldCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVHN0eHNpZ25ldDtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndHN0eHNpZ25ldCcsIFRzdHhzaWduZXQuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndHN0eHNpZ25ldCcpIGFzIFRzdHhzaWduZXQ7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIHRoZSBzdGF0aWNzIHRzdHhzaWduZXQgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uZ2V0Q2hhaW4oKSwgJ3RzdHhzaWduZXQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKSwgJ1Rlc3RuZXQgU3RhY2tzIChTaWduZXQpJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhc2Vjb2luLmdldEZhbWlseSgpLCAnc3R4Jyk7XG4gIH0pO1xuXG4gIGl0KCdyZXNvbHZlcyB0aGUgc3Rha2luZy10ZXN0bmV0IHB1YmxpYyBub2RlIHVybCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uZ2V0UHVibGljTm9kZVVybCgpLCAnaHR0cHM6Ly9hcGkuc3Rha2luZy10ZXN0bmV0Lmhpcm8uc28nKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dhbGxldCBjcmVhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZ2VuZXJhdGVzIGEgd2FsbGV0IGtleXBhaXIgZnJvbSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGNvbnN0IHsgcHViLCBwcnYgfSA9IGtleVBhaXI7XG4gICAgICBpZiAocHViID09PSB1bmRlZmluZWQgfHwgcHJ2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXQga2V5cGFpciBpcyBtaXNzaW5nIGtleSBtYXRlcmlhbCcpO1xuICAgICAgfVxuICAgICAgcHViLnNob3VsZC5tYXRjaCgvXnhwdWIvKTtcbiAgICAgIHBydi5zaG91bGQubWF0Y2goL154cHJ2Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVyaXZlcyBhIHZhbGlkIHRlc3RuZXQgd2FsbGV0IGFkZHJlc3MgZnJvbSB0aGUgZ2VuZXJhdGVkIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGlmIChrZXlQYWlyLnB1YiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0IGtleXBhaXIgaXMgbWlzc2luZyB0aGUgZXh0ZW5kZWQgcHVibGljIGtleScpO1xuICAgICAgfVxuICAgICAgY29uc3QgYWRkcmVzcyA9IG5ldyBTdHhMaWIuS2V5UGFpcih7IHB1Yjoga2V5UGFpci5wdWIgfSkuZ2V0U1RYQWRkcmVzcyhmYWxzZSwgVHJhbnNhY3Rpb25WZXJzaW9uLlRlc3RuZXQpO1xuICAgICAgYWRkcmVzcy5zdGFydHNXaXRoKCdTVCcpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZXMgYSB3YWxsZXQgYm91bmQgdG8gdGhlIHRzdHhzaWduZXQgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIG1pcnJvcnMgdGhlIHdhbGxldCBkYXRhIHRoZSBBUEkgcmV0dXJucyBmb3IgYSBjcmVhdGVkIHRzdHhzaWduZXQgd2FsbGV0XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwgeyBjb2luOiAndHN0eHNpZ25ldCcgfSBhcyBuZXZlcik7XG4gICAgICBzaG91bGQuZXF1YWwod2FsbGV0LmNvaW4oKSwgJ3RzdHhzaWduZXQnKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZXMgdGVzdG5ldCB3YWxsZXQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ1NUQjQ0SFlQWUFUMkJCMlFFNTEzTlNQODFIVE1ZV0JKUDAySFBHSzYnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ25vdC1hbi1hZGRyZXNzJykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|