@bitgo-beta/sdk-coin-sol 7.6.4-beta.728 → 7.6.4-beta.729

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,138 @@
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 tweetnacl_1 = __importDefault(require("tweetnacl"));
41
+ const statics_1 = require("@bitgo-beta/statics");
42
+ const web3_js_1 = require("@solana/web3.js");
43
+ const src_1 = require("../../../src");
44
+ const parseWireTransaction_1 = require("../../../src/lib/serialization/parseWireTransaction");
45
+ const testData = __importStar(require("../../resources/sol"));
46
+ describe('Solana V1 Payment Builder (SIMD-0296/0385) — server-side construction surface', () => {
47
+ const coinConfig = statics_1.coins.get('tsol');
48
+ const user = new src_1.KeyPair(testData.authAccount).getKeys();
49
+ const gasTank = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
50
+ const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
51
+ const recipient = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
52
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
53
+ const amount = '300000';
54
+ const v1Config = {
55
+ computeUnitLimit: 200000,
56
+ heapSize: 32768,
57
+ loadedAccountsDataSizeLimit: 65536,
58
+ priorityFee: 5000,
59
+ };
60
+ const newBuilder = () => {
61
+ const builder = new src_1.V1PaymentBuilder(coinConfig);
62
+ builder.sender(user.pub);
63
+ builder.send({ address: recipient, amount });
64
+ builder.nonce(recentBlockHash);
65
+ builder.transactionConfig(v1Config);
66
+ return builder;
67
+ };
68
+ const signWith = (keyPair, messageBytes) => {
69
+ const prv = keyPair.prv;
70
+ if (typeof prv !== 'string') {
71
+ throw new Error('Missing private key for test signer');
72
+ }
73
+ const kp = new src_1.KeyPair({ prv });
74
+ return tweetnacl_1.default.sign.detached(messageBytes, kp.getKeys(true).prv);
75
+ };
76
+ it('exposes the structured send() surface', () => {
77
+ const builder = newBuilder();
78
+ builder.send({ address: recipient, amount }).should.equal(builder);
79
+ });
80
+ it('builds a v1 transfer message + signed wire and round-trips through parse', async () => {
81
+ const builder = newBuilder();
82
+ builder.sign({ key: user.prv });
83
+ const tx = (await builder.build());
84
+ tx.v1MessageBytes[0].should.equal(0x81);
85
+ tx.v1TransactionBytes.length.should.equal(tx.v1MessageBytes.length + 64);
86
+ tx.signablePayload.equals(Buffer.from(tx.v1MessageBytes)).should.be.true();
87
+ // the transfer instruction is a SystemProgram transfer (discriminator 2)
88
+ const decoded = (0, src_1.decodeV1Message)(tx.v1MessageBytes);
89
+ decoded.compiledInstructions[0].data[0].should.equal(2);
90
+ decoded.staticAccounts[decoded.compiledInstructions[0].programAddressIndex].should.equal(web3_js_1.SystemProgram.programId.toBase58());
91
+ const parsed = (0, src_1.parseWireTransaction)(tx.v1TransactionBytes);
92
+ parsed.signerPublicKeys.should.deepEqual([user.pub]);
93
+ (0, parseWireTransaction_1.verifyV1Signatures)(parsed.messageBytes, parsed.signatures, parsed.signerPublicKeys);
94
+ });
95
+ it('injects the AdvanceNonceAccount instruction and assembles user + gas-tank signatures in signer order', async () => {
96
+ const builder = newBuilder();
97
+ builder.nonce(recentBlockHash, {
98
+ walletNonceAddress: nonceAccount.pub,
99
+ authWalletAddress: gasTank.pub,
100
+ });
101
+ builder.sign({ key: user.prv });
102
+ const unsigned = (await builder.build());
103
+ const messageBytes = unsigned.v1MessageBytes;
104
+ // 2 required signers: user (fee payer) + gas-tank nonce authority
105
+ messageBytes[1].should.equal(2);
106
+ const decoded = (0, src_1.decodeV1Message)(messageBytes);
107
+ // nonce hash occupies the blockhash field
108
+ decoded.blockhash.should.equal(recentBlockHash);
109
+ // first instruction is AdvanceNonceAccount (System Program, discriminator 4)
110
+ decoded.compiledInstructions[0].data[0].should.equal(4);
111
+ decoded.staticAccounts[decoded.compiledInstructions[0].programAddressIndex].should.equal(web3_js_1.SystemProgram.programId.toBase58());
112
+ // signer order: fee payer (user) first, then gas tank
113
+ decoded.staticAccounts.slice(0, 2).should.deepEqual([user.pub, gasTank.pub]);
114
+ // attach the gas-tank HSM signature over the same message bytes
115
+ const gasTankSig = signWith(gasTank, messageBytes);
116
+ builder.addSignature({ pub: gasTank.pub }, Buffer.from(gasTankSig));
117
+ const signed = (await builder.build());
118
+ // message byte-identity between build and sign
119
+ Buffer.from(signed.v1MessageBytes).equals(Buffer.from(messageBytes)).should.be.true();
120
+ signed.v1TransactionBytes.length.should.equal(messageBytes.length + 2 * 64);
121
+ const parsed = (0, src_1.parseWireTransaction)(signed.v1TransactionBytes);
122
+ parsed.signerPublicKeys.should.deepEqual([user.pub, gasTank.pub]);
123
+ (0, parseWireTransaction_1.verifyV1Signatures)(parsed.messageBytes, parsed.signatures, parsed.signerPublicKeys);
124
+ });
125
+ it('throws when transactionConfig is missing', async () => {
126
+ const builder = new src_1.V1PaymentBuilder(coinConfig);
127
+ builder.sender(user.pub);
128
+ builder.send({ address: recipient, amount });
129
+ builder.nonce(recentBlockHash);
130
+ await builder.build().should.be.rejectedWith(/transactionConfig is required/);
131
+ });
132
+ it('validates recipient address and amount', () => {
133
+ const builder = new src_1.V1PaymentBuilder(coinConfig);
134
+ should_1.default.throws(() => builder.send({ address: 'not-an-address', amount }), /address/);
135
+ should_1.default.throws(() => builder.send({ address: recipient, amount: 'abc' }), /amount/);
136
+ });
137
+ });
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjFQYXltZW50QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvdjFQYXltZW50QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwwREFBNkI7QUFDN0IsaURBQTRDO0FBQzVDLDZDQUFnRDtBQUNoRCxzQ0FBNkc7QUFDN0csOEZBQXlGO0FBRXpGLDhEQUFnRDtBQUVoRCxRQUFRLENBQUMsK0VBQStFLEVBQUUsR0FBRyxFQUFFO0lBQzdGLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xFLE1BQU0sU0FBUyxHQUFHLDhDQUE4QyxDQUFDO0lBQ2pFLE1BQU0sZUFBZSxHQUFHLDhDQUE4QyxDQUFDO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUV4QixNQUFNLFFBQVEsR0FBRztRQUNmLGdCQUFnQixFQUFFLE1BQU87UUFDekIsUUFBUSxFQUFFLEtBQU07UUFDaEIsMkJBQTJCLEVBQUUsS0FBTTtRQUNuQyxXQUFXLEVBQUUsSUFBSztLQUNuQixDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1FBQ3RC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cnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFN5c3RlbVByb2dyYW0gfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHsgZGVjb2RlVjFNZXNzYWdlLCBLZXlQYWlyLCBwYXJzZVdpcmVUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb24sIFYxUGF5bWVudEJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgdmVyaWZ5VjFTaWduYXR1cmVzIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL3BhcnNlV2lyZVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFNvbGFuYUtleXMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9zb2wnO1xuXG5kZXNjcmliZSgnU29sYW5hIFYxIFBheW1lbnQgQnVpbGRlciAoU0lNRC0wMjk2LzAzODUpIOKAlCBzZXJ2ZXItc2lkZSBjb25zdHJ1Y3Rpb24gc3VyZmFjZScsICgpID0+IHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndHNvbCcpO1xuICBjb25zdCB1c2VyID0gbmV3IEtleVBhaXIodGVzdERhdGEuYXV0aEFjY291bnQpLmdldEtleXMoKTtcbiAgY29uc3QgZ2FzVGFuayA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcnZLZXlzLnBydktleTEuYmFzZTU4IH0pLmdldEtleXMoKTtcbiAgY29uc3Qgbm9uY2VBY2NvdW50ID0gbmV3IEtleVBhaXIodGVzdERhdGEubm9uY2VBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IHJlY2lwaWVudCA9ICdFTm44YTJ0R01TOWJSNVhWN3NtR0hKdk5nemt5eEptbkQyZVV2UXhZNWpTUCc7XG4gIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG4gIGNvbnN0IGFtb3VudCA9ICczMDAwMDAnO1xuXG4gIGNvbnN0IHYxQ29uZmlnID0ge1xuICAgIGNvbXB1dGVVbml0TGltaXQ6IDIwMF8wMDAsXG4gICAgaGVhcFNpemU6IDMyXzc2OCxcbiAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IDY1XzUzNixcbiAgICBwcmlvcml0eUZlZTogNV8wMDAsXG4gIH07XG5cbiAgY29uc3QgbmV3QnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IFYxUGF5bWVudEJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgYnVpbGRlci5zZW5kZXIodXNlci5wdWIpO1xuICAgIGJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IHJlY2lwaWVudCwgYW1vdW50IH0pO1xuICAgIGJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICBidWlsZGVyLnRyYW5zYWN0aW9uQ29uZmlnKHYxQ29uZmlnKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBzaWduV2l0aCA9IChrZXlQYWlyOiBTb2xhbmFLZXlzLCBtZXNzYWdlQnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5ID0+IHtcbiAgICBjb25zdCBwcnYgPSBrZXlQYWlyLnBydjtcbiAgICBpZiAodHlwZW9mIHBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcml2YXRlIGtleSBmb3IgdGVzdCBzaWduZXInKTtcbiAgICB9XG4gICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHBydiB9KTtcbiAgICByZXR1cm4gbmFjbC5zaWduLmRldGFjaGVkKG1lc3NhZ2VCeXRlcywga3AuZ2V0S2V5cyh0cnVlKS5wcnYgYXMgVWludDhBcnJheSk7XG4gIH07XG5cbiAgaXQoJ2V4cG9zZXMgdGhlIHN0cnVjdHVyZWQgc2VuZCgpIHN1cmZhY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTtcbiAgICBidWlsZGVyLnNlbmQoeyBhZGRyZXNzOiByZWNpcGllbnQsIGFtb3VudCB9KS5zaG91bGQuZXF1YWwoYnVpbGRlcik7XG4gIH0pO1xuXG4gIGl0KCdidWlsZHMgYSB2MSB0cmFuc2ZlciBtZXNzYWdlICsgc2lnbmVkIHdpcmUgYW5kIHJvdW5kLXRyaXBzIHRocm91Z2ggcGFyc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTtcbiAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHVzZXIucHJ2IH0pO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICB0eC52MU1lc3NhZ2VCeXRlcyFbMF0uc2hvdWxkLmVxdWFsKDB4ODEpO1xuICAgIHR4LnYxVHJhbnNhY3Rpb25CeXRlcyEubGVuZ3RoLnNob3VsZC5lcXVhbCh0eC52MU1lc3NhZ2VCeXRlcyEubGVuZ3RoICsgNjQpO1xuICAgIHR4LnNpZ25hYmxlUGF5bG9hZC5lcXVhbHMoQnVmZmVyLmZyb20odHgudjFNZXNzYWdlQnl0ZXMhKSkuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgIC8vIHRoZSB0cmFuc2ZlciBpbnN0cnVjdGlvbiBpcyBhIFN5c3RlbVByb2dyYW0gdHJhbnNmZXIgKGRpc2NyaW1pbmF0b3IgMilcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVjFNZXNzYWdlKHR4LnYxTWVzc2FnZUJ5dGVzISk7XG4gICAgZGVjb2RlZC5jb21waWxlZEluc3RydWN0aW9uc1swXS5kYXRhWzBdLnNob3VsZC5lcXVhbCgyKTtcbiAgICBkZWNvZGVkLnN0YXRpY0FjY291bnRzW2RlY29kZWQuY29tcGlsZWRJbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUFkZHJlc3NJbmRleF0uc2hvdWxkLmVxdWFsKFxuICAgICAgU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9CYXNlNTgoKVxuICAgICk7XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVdpcmVUcmFuc2FjdGlvbih0eC52MVRyYW5zYWN0aW9uQnl0ZXMhKTtcbiAgICBwYXJzZWQuc2lnbmVyUHVibGljS2V5cy5zaG91bGQuZGVlcEVxdWFsKFt1c2VyLnB1Yl0pO1xuICAgIHZlcmlmeVYxU2lnbmF0dXJlcyhwYXJzZWQubWVzc2FnZUJ5dGVzLCBwYXJzZWQuc2lnbmF0dXJlcywgcGFyc2VkLnNpZ25lclB1YmxpY0tleXMpO1xuICB9KTtcblxuICBpdCgnaW5qZWN0cyB0aGUgQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbiBhbmQgYXNzZW1ibGVzIHVzZXIgKyBnYXMtdGFuayBzaWduYXR1cmVzIGluIHNpZ25lciBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3QnVpbGRlcigpO1xuICAgIGJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogZ2FzVGFuay5wdWIsXG4gICAgfSk7XG4gICAgYnVpbGRlci5zaWduKHsga2V5OiB1c2VyLnBydiB9KTtcblxuICAgIGNvbnN0IHVuc2lnbmVkID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgY29uc3QgbWVzc2FnZUJ5dGVzID0gdW5zaWduZWQudjFNZXNzYWdlQnl0ZXMhO1xuXG4gICAgLy8gMiByZXF1aXJlZCBzaWduZXJzOiB1c2VyIChmZWUgcGF5ZXIpICsgZ2FzLXRhbmsgbm9uY2UgYXV0aG9yaXR5XG4gICAgbWVzc2FnZUJ5dGVzWzFdLnNob3VsZC5lcXVhbCgyKTtcblxuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWMU1lc3NhZ2UobWVzc2FnZUJ5dGVzKTtcbiAgICAvLyBub25jZSBoYXNoIG9jY3VwaWVzIHRoZSBibG9ja2hhc2ggZmllbGRcbiAgICBkZWNvZGVkLmJsb2NraGFzaC5zaG91bGQuZXF1YWwocmVjZW50QmxvY2tIYXNoKTtcbiAgICAvLyBmaXJzdCBpbnN0cnVjdGlvbiBpcyBBZHZhbmNlTm9uY2VBY2NvdW50IChTeXN0ZW0gUHJvZ3JhbSwgZGlzY3JpbWluYXRvciA0KVxuICAgIGRlY29kZWQuY29tcGlsZWRJbnN0cnVjdGlvbnNbMF0uZGF0YVswXS5zaG91bGQuZXF1YWwoNCk7XG4gICAgZGVjb2RlZC5zdGF0aWNBY2NvdW50c1tkZWNvZGVkLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1BZGRyZXNzSW5kZXhdLnNob3VsZC5lcXVhbChcbiAgICAgIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvQmFzZTU4KClcbiAgICApO1xuICAgIC8vIHNpZ25lciBvcmRlcjogZmVlIHBheWVyICh1c2VyKSBmaXJzdCwgdGhlbiBnYXMgdGFua1xuICAgIGRlY29kZWQuc3RhdGljQWNjb3VudHMuc2xpY2UoMCwgMikuc2hvdWxkLmRlZXBFcXVhbChbdXNlci5wdWIsIGdhc1RhbmsucHViXSk7XG5cbiAgICAvLyBhdHRhY2ggdGhlIGdhcy10YW5rIEhTTSBzaWduYXR1cmUgb3ZlciB0aGUgc2FtZSBtZXNzYWdlIGJ5dGVzXG4gICAgY29uc3QgZ2FzVGFua1NpZyA9IHNpZ25XaXRoKGdhc1RhbmssIG1lc3NhZ2VCeXRlcyk7XG4gICAgYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IGdhc1RhbmsucHViIH0sIEJ1ZmZlci5mcm9tKGdhc1RhbmtTaWcpKTtcbiAgICBjb25zdCBzaWduZWQgPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcblxuICAgIC8vIG1lc3NhZ2UgYnl0ZS1pZGVudGl0eSBiZXR3ZWVuIGJ1aWxkIGFuZCBzaWduXG4gICAgQnVmZmVyLmZyb20oc2lnbmVkLnYxTWVzc2FnZUJ5dGVzISkuZXF1YWxzKEJ1ZmZlci5mcm9tKG1lc3NhZ2VCeXRlcykpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgc2lnbmVkLnYxVHJhbnNhY3Rpb25CeXRlcyEubGVuZ3RoLnNob3VsZC5lcXVhbChtZXNzYWdlQnl0ZXMubGVuZ3RoICsgMiAqIDY0KTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlV2lyZVRyYW5zYWN0aW9uKHNpZ25lZC52MVRyYW5zYWN0aW9uQnl0ZXMhKTtcbiAgICBwYXJzZWQuc2lnbmVyUHVibGljS2V5cy5zaG91bGQuZGVlcEVxdWFsKFt1c2VyLnB1YiwgZ2FzVGFuay5wdWJdKTtcbiAgICB2ZXJpZnlWMVNpZ25hdHVyZXMocGFyc2VkLm1lc3NhZ2VCeXRlcywgcGFyc2VkLnNpZ25hdHVyZXMsIHBhcnNlZC5zaWduZXJQdWJsaWNLZXlzKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIHRyYW5zYWN0aW9uQ29uZmlnIGlzIG1pc3NpbmcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBWMVBheW1lbnRCdWlsZGVyKGNvaW5Db25maWcpO1xuICAgIGJ1aWxkZXIuc2VuZGVyKHVzZXIucHViKTtcbiAgICBidWlsZGVyLnNlbmQoeyBhZGRyZXNzOiByZWNpcGllbnQsIGFtb3VudCB9KTtcbiAgICBidWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3RyYW5zYWN0aW9uQ29uZmlnIGlzIHJlcXVpcmVkLyk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZXMgcmVjaXBpZW50IGFkZHJlc3MgYW5kIGFtb3VudCcsICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IFYxUGF5bWVudEJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBidWlsZGVyLnNlbmQoeyBhZGRyZXNzOiAnbm90LWFuLWFkZHJlc3MnLCBhbW91bnQgfSksIC9hZGRyZXNzLyk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBidWlsZGVyLnNlbmQoeyBhZGRyZXNzOiByZWNpcGllbnQsIGFtb3VudDogJ2FiYycgfSksIC9hbW91bnQvKTtcbiAgfSk7XG59KTtcbiJdfQ==