@bitgo-beta/sdk-coin-sol 7.6.4-beta.727 → 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.
- package/dist/cjs/src/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +4 -2
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts +10 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/transactionBuilderFactory.js +13 -1
- package/dist/cjs/src/lib/v1PaymentBuilder.d.ts +36 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.js +70 -0
- package/dist/cjs/src/sol.d.ts.map +1 -1
- package/dist/cjs/src/sol.js +26 -21
- package/dist/cjs/test/unit/sol.js +25 -1
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/index.d.ts +1 -0
- package/dist/esm/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +2 -1
- package/dist/esm/lib/transactionBuilderFactory.d.ts +10 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/esm/lib/transactionBuilderFactory.js +13 -1
- package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
- package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/esm/lib/v1PaymentBuilder.js +63 -0
- package/dist/esm/sol.d.ts.map +1 -1
- package/dist/esm/sol.js +27 -22
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v1PaymentBuilder.d.ts","sourceRoot":"","sources":["../../../../../test/unit/transactionBuilder/v1PaymentBuilder.ts"],"names":[],"mappings":""}
|
|
@@ -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==
|