@bitgo/sdk-coin-ton 3.11.5 → 3.13.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.
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const sdk_core_1 = require("@bitgo/sdk-core");
41
+ const src_1 = require("../../src"); // Adjust path as needed
42
+ const statics_1 = require("@bitgo/statics");
43
+ const testData = __importStar(require("../resources/ton"));
44
+ const constants_1 = require("../../src/lib/constants");
45
+ describe('Ton Whales Withdrawal Builder', () => {
46
+ const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tton'));
47
+ // Define the scenarios we want to test
48
+ const scenarios = [
49
+ {
50
+ name: 'Partial Withdrawal (10 TON)',
51
+ fixture: testData.signedTonWhalesWithdrawalTransaction,
52
+ },
53
+ {
54
+ name: 'Full Withdrawal (Amount 0)',
55
+ fixture: testData.signedTonWhalesFullWithdrawalTransaction,
56
+ },
57
+ ];
58
+ scenarios.forEach((scenario) => {
59
+ describe(scenario.name, () => {
60
+ const fixture = scenario.fixture;
61
+ it('should parse a raw transaction and extract correct parameters', async function () {
62
+ const txBuilder = factory.from(fixture.tx);
63
+ const builtTx = await txBuilder.build();
64
+ const jsonTx = builtTx.toJson();
65
+ // Verify Business Logic Fields
66
+ should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.TonWhalesWithdrawal);
67
+ // NOTE: In withdrawals, recipient.amount is the FEE, withdrawAmount is the STAKE
68
+ should_1.default.equal(jsonTx.amount, fixture.recipient.amount);
69
+ should_1.default.equal(jsonTx.withdrawAmount, fixture.withdrawAmount);
70
+ should_1.default.equal(jsonTx.destination, fixture.recipient.address);
71
+ should_1.default.equal(jsonTx.sender, fixture.sender);
72
+ // Verify Network Constraints
73
+ should_1.default.equal(jsonTx.seqno, fixture.seqno);
74
+ should_1.default.equal(jsonTx.expirationTime, fixture.expireTime);
75
+ should_1.default.equal(jsonTx.bounceable, fixture.bounceable);
76
+ // Verify Payload Structure
77
+ // Logic: DecimalOpCode + HexQueryId + DecimalAmount
78
+ const msg = builtTx['message'] || '';
79
+ should_1.default.equal(msg.startsWith(constants_1.TON_WHALES_WITHDRAW_OPCODE), true);
80
+ // Ensure the payload ENDS with the decimal amount (either "1000..." or "0")
81
+ should_1.default.equal(msg.endsWith(fixture.withdrawAmount), true);
82
+ });
83
+ it('should parse and rebuild the transaction resulting in the same hex', async function () {
84
+ const txBuilder = factory.from(fixture.tx);
85
+ const builtTx = await txBuilder.build();
86
+ // Verify the parser extracted the signature
87
+ const signature = builtTx.signature[0];
88
+ should_1.default.exist(signature);
89
+ signature.should.not.be.empty();
90
+ // Rebuild from the parsed object
91
+ const builder2 = factory.from(builtTx.toBroadcastFormat());
92
+ const builtTx2 = await builder2.build();
93
+ // The output of the second build should match the original raw transaction
94
+ should_1.default.equal(builtTx2.toBroadcastFormat(), fixture.tx);
95
+ should_1.default.equal(builtTx2.type, sdk_core_1.TransactionType.TonWhalesWithdrawal);
96
+ });
97
+ it('should build a transaction from scratch that byte-for-byte matches the raw fixture', async function () {
98
+ // Get the specific Withdrawal Builder
99
+ const builder = factory.getTonWhalesWithdrawalBuilder();
100
+ // Set Header Info from Fixture
101
+ builder.sender(fixture.sender);
102
+ builder.publicKey(fixture.publicKey);
103
+ builder.sequenceNumber(fixture.seqno);
104
+ builder.expireTime(fixture.expireTime);
105
+ builder.bounceable(fixture.bounceable);
106
+ // Set Destination and ATTACHED VALUE (The Fee)
107
+ builder.send({
108
+ address: fixture.recipient.address,
109
+ amount: fixture.recipient.amount,
110
+ });
111
+ // Set Payload Data (The Unstake Amount)
112
+ // Note: This works for both partial (amount > 0) and full (amount = "0")
113
+ builder.setWithdrawalMessage(fixture.withdrawAmount, fixture.queryId);
114
+ // Attach Signature from Fixture (Mocking the HSM signing process)
115
+ if (fixture.signature) {
116
+ builder.addSignature({ pub: fixture.publicKey }, Buffer.from(fixture.signature, 'hex'));
117
+ }
118
+ // Build Signed Transaction
119
+ const signedBuiltTx = await builder.build();
120
+ const jsonTx = signedBuiltTx.toJson();
121
+ // Verify that the builder correctly set the withdrawal amount on the transaction object
122
+ should_1.default.equal(jsonTx.withdrawAmount, fixture.withdrawAmount);
123
+ // Byte-for-byte equality with the Sandbox output
124
+ should_1.default.equal(signedBuiltTx.toBroadcastFormat(), fixture.tx);
125
+ should_1.default.equal(signedBuiltTx.type, sdk_core_1.TransactionType.TonWhalesWithdrawal);
126
+ });
127
+ });
128
+ });
129
+ });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9uV2hhbGVzV2l0aGRyYXdhbEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdG9uV2hhbGVzV2l0aGRyYXdhbEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsOENBQWtEO0FBQ2xELG1DQUFzRCxDQUFDLHdCQUF3QjtBQUMvRSw0Q0FBdUM7QUFDdkMsMkRBQTZDO0FBQzdDLHVEQUFxRTtBQUVyRSxRQUFRLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO0lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWpFLHVDQUF1QztJQUN2QyxNQUFNLFNBQVMsR0FBRztRQUNoQjtZQUNFLElBQUksRUFBRSw2QkFBNkI7WUFDbkMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxvQ0FBb0M7U0FDdkQ7UUFDRDtZQUNFLElBQUksRUFBRSw0QkFBNEI7WUFDbEMsT0FBTyxFQUFFLFFBQVEsQ0FBQyx3Q0FBd0M7U0FDM0Q7S0FDRixDQUFDO0lBRUYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQzdCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUMzQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBRWpDLEVBQUUsQ0FBQywrREFBK0QsRUFBRSxLQUFLO2dCQUN2RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUs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LGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMnOyAvLyBBZGp1c3QgcGF0aCBhcyBuZWVkZWRcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5pbXBvcnQgeyBUT05fV0hBTEVTX1dJVEhEUkFXX09QQ09ERSB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcblxuZGVzY3JpYmUoJ1RvbiBXaGFsZXMgV2l0aGRyYXdhbCBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0dG9uJykpO1xuXG4gIC8vIERlZmluZSB0aGUgc2NlbmFyaW9zIHdlIHdhbnQgdG8gdGVzdFxuICBjb25zdCBzY2VuYXJpb3MgPSBbXG4gICAge1xuICAgICAgbmFtZTogJ1BhcnRpYWwgV2l0aGRyYXdhbCAoMTAgVE9OKScsXG4gICAgICBmaXh0dXJlOiB0ZXN0RGF0YS5zaWduZWRUb25XaGFsZXNXaXRoZHJhd2FsVHJhbnNhY3Rpb24sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRnVsbCBXaXRoZHJhd2FsIChBbW91bnQgMCknLFxuICAgICAgZml4dHVyZTogdGVzdERhdGEuc2lnbmVkVG9uV2hhbGVzRnVsbFdpdGhkcmF3YWxUcmFuc2FjdGlvbixcbiAgICB9LFxuICBdO1xuXG4gIHNjZW5hcmlvcy5mb3JFYWNoKChzY2VuYXJpbykgPT4ge1xuICAgIGRlc2NyaWJlKHNjZW5hcmlvLm5hbWUsICgpID0+IHtcbiAgICAgIGNvbnN0IGZpeHR1cmUgPSBzY2VuYXJpby5maXh0dXJlO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhcnNlIGEgcmF3IHRyYW5zYWN0aW9uIGFuZCBleHRyYWN0IGNvcnJlY3QgcGFyYW1ldGVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGZpeHR1cmUudHgpO1xuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IEJ1c2luZXNzIExvZ2ljIEZpZWxkc1xuICAgICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuVG9uV2hhbGVzV2l0aGRyYXdhbCk7XG5cbiAgICAgICAgLy8gTk9URTogSW4gd2l0aGRyYXdhbHMsIHJlY2lwaWVudC5hbW91bnQgaXMgdGhlIEZFRSwgd2l0aGRyYXdBbW91bnQgaXMgdGhlIFNUQUtFXG4gICAgICAgIHNob3VsZC5lcXVhbChqc29uVHguYW1vdW50LCBmaXh0dXJlLnJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgICBzaG91bGQuZXF1YWwoanNvblR4LndpdGhkcmF3QW1vdW50LCBmaXh0dXJlLndpdGhkcmF3QW1vdW50KTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoanNvblR4LmRlc3RpbmF0aW9uLCBmaXh0dXJlLnJlY2lwaWVudC5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC5zZW5kZXIsIGZpeHR1cmUuc2VuZGVyKTtcblxuICAgICAgICAvLyBWZXJpZnkgTmV0d29yayBDb25zdHJhaW50c1xuICAgICAgICBzaG91bGQuZXF1YWwoanNvblR4LnNlcW5vLCBmaXh0dXJlLnNlcW5vKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC5leHBpcmF0aW9uVGltZSwgZml4dHVyZS5leHBpcmVUaW1lKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC5ib3VuY2VhYmxlLCBmaXh0dXJlLmJvdW5jZWFibGUpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBQYXlsb2FkIFN0cnVjdHVyZVxuICAgICAgICAvLyBMb2dpYzogRGVjaW1hbE9wQ29kZSArIEhleFF1ZXJ5SWQgKyBEZWNpbWFsQW1vdW50XG4gICAgICAgIGNvbnN0IG1zZyA9IGJ1aWx0VHhbJ21lc3NhZ2UnXSB8fCAnJztcbiAgICAgICAgc2hvdWxkLmVxdWFsKG1zZy5zdGFydHNXaXRoKFRPTl9XSEFMRVNfV0lUSERSQVdfT1BDT0RFKSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBwYXlsb2FkIEVORFMgd2l0aCB0aGUgZGVjaW1hbCBhbW91bnQgKGVpdGhlciBcIjEwMDAuLi5cIiBvciBcIjBcIilcbiAgICAgICAgc2hvdWxkLmVxdWFsKG1zZy5lbmRzV2l0aChmaXh0dXJlLndpdGhkcmF3QW1vdW50KSwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSBhbmQgcmVidWlsZCB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0aW5nIGluIHRoZSBzYW1lIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGZpeHR1cmUudHgpO1xuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBwYXJzZXIgZXh0cmFjdGVkIHRoZSBzaWduYXR1cmVcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYnVpbHRUeC5zaWduYXR1cmVbMF07XG4gICAgICAgIHNob3VsZC5leGlzdChzaWduYXR1cmUpO1xuICAgICAgICBzaWduYXR1cmUuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuXG4gICAgICAgIC8vIFJlYnVpbGQgZnJvbSB0aGUgcGFyc2VkIG9iamVjdFxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbShidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCBidWlsdFR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgICAgLy8gVGhlIG91dHB1dCBvZiB0aGUgc2Vjb25kIGJ1aWxkIHNob3VsZCBtYXRjaCB0aGUgb3JpZ2luYWwgcmF3IHRyYW5zYWN0aW9uXG4gICAgICAgIHNob3VsZC5lcXVhbChidWlsdFR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpLCBmaXh0dXJlLnR4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgyLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5Ub25XaGFsZXNXaXRoZHJhd2FsKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNhY3Rpb24gZnJvbSBzY3JhdGNoIHRoYXQgYnl0ZS1mb3ItYnl0ZSBtYXRjaGVzIHRoZSByYXcgZml4dHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzcGVjaWZpYyBXaXRoZHJhd2FsIEJ1aWxkZXJcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9uV2hhbGVzV2l0aGRyYXdhbEJ1aWxkZXIoKTtcblxuICAgICAgICAvLyBTZXQgSGVhZGVyIEluZm8gZnJvbSBGaXh0dXJlXG4gICAgICAgIGJ1aWxkZXIuc2VuZGVyKGZpeHR1cmUuc2VuZGVyKTtcbiAgICAgICAgYnVpbGRlci5wdWJsaWNLZXkoZml4dHVyZS5wdWJsaWNLZXkpO1xuICAgICAgICBidWlsZGVyLnNlcXVlbmNlTnVtYmVyKGZpeHR1cmUuc2Vxbm8pO1xuICAgICAgICBidWlsZGVyLmV4cGlyZVRpbWUoZml4dHVyZS5leHBpcmVUaW1lKTtcbiAgICAgICAgYnVpbGRlci5ib3VuY2VhYmxlKGZpeHR1cmUuYm91bmNlYWJsZSk7XG5cbiAgICAgICAgLy8gU2V0IERlc3RpbmF0aW9uIGFuZCBBVFRBQ0hFRCBWQUxVRSAoVGhlIEZlZSlcbiAgICAgICAgYnVpbGRlci5zZW5kKHtcbiAgICAgICAgICBhZGRyZXNzOiBmaXh0dXJlLnJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogZml4dHVyZS5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgUGF5bG9hZCBEYXRhIChUaGUgVW5zdGFrZSBBbW91bnQpXG4gICAgICAgIC8vIE5vdGU6IFRoaXMgd29ya3MgZm9yIGJvdGggcGFydGlhbCAoYW1vdW50ID4gMCkgYW5kIGZ1bGwgKGFtb3VudCA9IFwiMFwiKVxuICAgICAgICBidWlsZGVyLnNldFdpdGhkcmF3YWxNZXNzYWdlKGZpeHR1cmUud2l0aGRyYXdBbW91bnQsIGZpeHR1cmUucXVlcnlJZCk7XG5cbiAgICAgICAgLy8gQXR0YWNoIFNpZ25hdHVyZSBmcm9tIEZpeHR1cmUgKE1vY2tpbmcgdGhlIEhTTSBzaWduaW5nIHByb2Nlc3MpXG4gICAgICAgIGlmIChmaXh0dXJlLnNpZ25hdHVyZSkge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBmaXh0dXJlLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShmaXh0dXJlLnNpZ25hdHVyZSwgJ2hleCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIFNpZ25lZCBUcmFuc2FjdGlvblxuICAgICAgICBjb25zdCBzaWduZWRCdWlsdFR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uVHggPSBzaWduZWRCdWlsdFR4LnRvSnNvbigpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBidWlsZGVyIGNvcnJlY3RseSBzZXQgdGhlIHdpdGhkcmF3YWwgYW1vdW50IG9uIHRoZSB0cmFuc2FjdGlvbiBvYmplY3RcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC53aXRoZHJhd0Ftb3VudCwgZml4dHVyZS53aXRoZHJhd0Ftb3VudCk7XG5cbiAgICAgICAgLy8gQnl0ZS1mb3ItYnl0ZSBlcXVhbGl0eSB3aXRoIHRoZSBTYW5kYm94IG91dHB1dFxuICAgICAgICBzaG91bGQuZXF1YWwoc2lnbmVkQnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCBmaXh0dXJlLnR4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZEJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlRvbldoYWxlc1dpdGhkcmF3YWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=