@bitgo-beta/sdk-coin-sol 2.4.3-beta.998 → 7.6.3
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/bigint-buffer-guard.d.ts +1 -0
- package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/src/bigint-buffer-guard.js +29 -0
- package/dist/src/config/token2022StaticConfig.d.ts +3 -0
- package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/src/config/token2022StaticConfig.js +50 -0
- 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/constants.d.ts +35 -2
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +41 -2
- package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/customInstructionBuilder.js +289 -0
- package/dist/src/lib/iface.d.ts +79 -5
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -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 +4 -2
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +364 -78
- package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +266 -69
- package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +23 -10
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
- package/dist/src/lib/token2022Config.d.ts +44 -0
- package/dist/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/src/lib/token2022Config.js +27 -0
- package/dist/src/lib/tokenTransferBuilder.js +7 -7
- package/dist/src/lib/transaction.d.ts +31 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +134 -46
- package/dist/src/lib/transactionBuilder.d.ts +18 -2
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +78 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +10 -1
- package/dist/src/lib/utils.d.ts +34 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +88 -24
- package/dist/src/sol.d.ts +36 -13
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +230 -38
- package/dist/test/fixtures/sol.d.ts +1152 -0
- package/dist/test/fixtures/sol.d.ts.map +1 -0
- package/dist/test/fixtures/sol.js +1433 -0
- package/dist/test/resources/sol.d.ts +238 -0
- package/dist/test/resources/sol.d.ts.map +1 -0
- package/dist/test/resources/sol.js +320 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.js +412 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +177 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/test/unit/sol.d.ts +2 -0
- package/dist/test/unit/sol.d.ts.map +1 -0
- package/dist/test/unit/sol.js +3108 -0
- package/dist/test/unit/solInstructionFactory.d.ts +2 -0
- package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/test/unit/solInstructionFactory.js +454 -0
- package/dist/test/unit/solToken.d.ts +2 -0
- package/dist/test/unit/solToken.d.ts.map +1 -0
- package/dist/test/unit/solToken.js +31 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +983 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +505 -0
- package/dist/test/unit/versionedTransaction.d.ts +2 -0
- package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/test/unit/versionedTransaction.js +207 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -9
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -1223
|
@@ -0,0 +1,862 @@
|
|
|
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 getBuilderFactory_1 = require("../getBuilderFactory");
|
|
40
|
+
const src_1 = require("../../../src");
|
|
41
|
+
const testData = __importStar(require("../../resources/sol"));
|
|
42
|
+
const should_1 = __importDefault(require("should"));
|
|
43
|
+
describe('Sol Transfer Builder V2', () => {
|
|
44
|
+
let ataAddress;
|
|
45
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
46
|
+
const authAccount = new src_1.KeyPair(testData.authAccount).getKeys();
|
|
47
|
+
const nonceAccount = new src_1.KeyPair(testData.nonceAccount).getKeys();
|
|
48
|
+
const otherAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
|
|
49
|
+
const feePayerAccount = new src_1.KeyPair(testData.feePayerAccount).getKeys();
|
|
50
|
+
const invalidPubKey = testData.pubKeys.invalidPubKeys[0];
|
|
51
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
52
|
+
const amount = '300000';
|
|
53
|
+
const memo = 'test memo';
|
|
54
|
+
const nameUSDC = testData.tokenTransfers.nameUSDC;
|
|
55
|
+
const mintUSDC = testData.tokenTransfers.mintUSDC;
|
|
56
|
+
const nameAMS = testData.amsTokenTransfers.nameAMSToken;
|
|
57
|
+
const mintAMS = testData.amsTokenTransfers.mintAMS;
|
|
58
|
+
const amsProgramID = testData.amsTokenTransfers.programID;
|
|
59
|
+
const owner = testData.tokenTransfers.owner;
|
|
60
|
+
const walletPK = testData.associatedTokenAccounts.accounts[0].pub;
|
|
61
|
+
const walletSK = testData.associatedTokenAccounts.accounts[0].prv;
|
|
62
|
+
const prioFeeMicroLamports = '10000000';
|
|
63
|
+
const priorityFee = {
|
|
64
|
+
amount: prioFeeMicroLamports,
|
|
65
|
+
};
|
|
66
|
+
const transferBuilderV2 = () => {
|
|
67
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
68
|
+
txBuilder.nonce(recentBlockHash);
|
|
69
|
+
txBuilder.sender(authAccount.pub);
|
|
70
|
+
return txBuilder;
|
|
71
|
+
};
|
|
72
|
+
describe('Succeed Native Transfer', () => {
|
|
73
|
+
it('build a transfer tx unsigned with memo', async () => {
|
|
74
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
75
|
+
txBuilder.nonce(recentBlockHash);
|
|
76
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
77
|
+
txBuilder.sender(authAccount.pub);
|
|
78
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
79
|
+
txBuilder.memo(memo);
|
|
80
|
+
const tx = await txBuilder.build();
|
|
81
|
+
tx.inputs.length.should.equal(1);
|
|
82
|
+
tx.inputs[0].should.deepEqual({
|
|
83
|
+
address: authAccount.pub,
|
|
84
|
+
value: amount,
|
|
85
|
+
coin: 'tsol',
|
|
86
|
+
});
|
|
87
|
+
tx.outputs.length.should.equal(1);
|
|
88
|
+
tx.outputs[0].should.deepEqual({
|
|
89
|
+
address: otherAccount.pub,
|
|
90
|
+
value: amount,
|
|
91
|
+
coin: 'tsol',
|
|
92
|
+
});
|
|
93
|
+
const rawTx = tx.toBroadcastFormat();
|
|
94
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
95
|
+
should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_UNSIGNED_WITH_MEMO);
|
|
96
|
+
const reserialized = await factory.from(rawTx).build();
|
|
97
|
+
// reserialized.should.be.deepEqual(tx); // we have extra param _useTokenAddressTokenName for factory.from method
|
|
98
|
+
reserialized.toBroadcastFormat().should.equal(rawTx);
|
|
99
|
+
});
|
|
100
|
+
it('build a transfer tx unsigned with durable nonce', async () => {
|
|
101
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
102
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
|
|
103
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
104
|
+
txBuilder.sender(authAccount.pub);
|
|
105
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
106
|
+
const tx = await txBuilder.build();
|
|
107
|
+
tx.inputs.length.should.equal(1);
|
|
108
|
+
tx.inputs[0].should.deepEqual({
|
|
109
|
+
address: authAccount.pub,
|
|
110
|
+
value: amount,
|
|
111
|
+
coin: 'tsol',
|
|
112
|
+
});
|
|
113
|
+
tx.outputs.length.should.equal(1);
|
|
114
|
+
tx.outputs[0].should.deepEqual({
|
|
115
|
+
address: otherAccount.pub,
|
|
116
|
+
value: amount,
|
|
117
|
+
coin: 'tsol',
|
|
118
|
+
});
|
|
119
|
+
const rawTx = tx.toBroadcastFormat();
|
|
120
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
121
|
+
should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_WITH_DURABLE_NONCE);
|
|
122
|
+
const txJson = tx.toJson();
|
|
123
|
+
txJson.durableNonce.should.deepEqual({
|
|
124
|
+
walletNonceAddress: nonceAccount.pub,
|
|
125
|
+
authWalletAddress: authAccount.pub,
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
it('build a transfer tx unsigned with memo and durable nonce', async () => {
|
|
129
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
130
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
|
|
131
|
+
txBuilder.sender(authAccount.pub);
|
|
132
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
133
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
134
|
+
txBuilder.memo(memo);
|
|
135
|
+
const tx = await txBuilder.build();
|
|
136
|
+
tx.inputs.length.should.equal(1);
|
|
137
|
+
tx.inputs[0].should.deepEqual({
|
|
138
|
+
address: authAccount.pub,
|
|
139
|
+
value: amount,
|
|
140
|
+
coin: 'tsol',
|
|
141
|
+
});
|
|
142
|
+
tx.outputs.length.should.equal(1);
|
|
143
|
+
tx.outputs[0].should.deepEqual({
|
|
144
|
+
address: otherAccount.pub,
|
|
145
|
+
value: amount,
|
|
146
|
+
coin: 'tsol',
|
|
147
|
+
});
|
|
148
|
+
const rawTx = tx.toBroadcastFormat();
|
|
149
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
150
|
+
should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
151
|
+
});
|
|
152
|
+
it('build a transfer tx unsigned without memo or durable nonce', async () => {
|
|
153
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
154
|
+
txBuilder.nonce(recentBlockHash);
|
|
155
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
156
|
+
txBuilder.sender(authAccount.pub);
|
|
157
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
158
|
+
const tx = await txBuilder.build();
|
|
159
|
+
tx.inputs.length.should.equal(1);
|
|
160
|
+
tx.inputs[0].should.deepEqual({
|
|
161
|
+
address: authAccount.pub,
|
|
162
|
+
value: amount,
|
|
163
|
+
coin: 'tsol',
|
|
164
|
+
});
|
|
165
|
+
tx.outputs.length.should.equal(1);
|
|
166
|
+
tx.outputs[0].should.deepEqual({
|
|
167
|
+
address: otherAccount.pub,
|
|
168
|
+
value: amount,
|
|
169
|
+
coin: 'tsol',
|
|
170
|
+
});
|
|
171
|
+
const rawTx = tx.toBroadcastFormat();
|
|
172
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
173
|
+
should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_UNSIGNED_TX_WITHOUT_MEMO);
|
|
174
|
+
});
|
|
175
|
+
it('build a transfer tx signed with memo and durable nonce', async () => {
|
|
176
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
177
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
|
|
178
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
179
|
+
txBuilder.sender(authAccount.pub);
|
|
180
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
181
|
+
txBuilder.memo(memo);
|
|
182
|
+
txBuilder.sign({ key: authAccount.prv });
|
|
183
|
+
const tx = await txBuilder.build();
|
|
184
|
+
tx.inputs.length.should.equal(1);
|
|
185
|
+
tx.inputs[0].should.deepEqual({
|
|
186
|
+
address: authAccount.pub,
|
|
187
|
+
value: amount,
|
|
188
|
+
coin: 'tsol',
|
|
189
|
+
});
|
|
190
|
+
tx.outputs.length.should.equal(1);
|
|
191
|
+
tx.outputs[0].should.deepEqual({
|
|
192
|
+
address: otherAccount.pub,
|
|
193
|
+
value: amount,
|
|
194
|
+
coin: 'tsol',
|
|
195
|
+
});
|
|
196
|
+
const rawTx = tx.toBroadcastFormat();
|
|
197
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
198
|
+
should_1.default.equal(rawTx, testData.NATIVE_TRANSFERV2_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
199
|
+
});
|
|
200
|
+
it('build a multi transfer tx signed with memo and durable nonce', async () => {
|
|
201
|
+
const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
|
|
202
|
+
const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
|
|
203
|
+
const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
|
|
204
|
+
const account4 = new src_1.KeyPair({ prv: testData.extraAccounts.prv4 }).getKeys();
|
|
205
|
+
const account5 = new src_1.KeyPair({ prv: testData.extraAccounts.prv5 }).getKeys();
|
|
206
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
207
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
|
|
208
|
+
txBuilder.sender(authAccount.pub);
|
|
209
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
210
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
211
|
+
txBuilder.send({ address: account1.pub, amount });
|
|
212
|
+
txBuilder.send({ address: account2.pub, amount });
|
|
213
|
+
txBuilder.send({ address: account3.pub, amount });
|
|
214
|
+
txBuilder.send({ address: account4.pub, amount });
|
|
215
|
+
txBuilder.send({ address: account5.pub, amount });
|
|
216
|
+
txBuilder.memo(memo);
|
|
217
|
+
txBuilder.sign({ key: authAccount.prv });
|
|
218
|
+
const tx = await txBuilder.build();
|
|
219
|
+
tx.inputs.length.should.equal(6);
|
|
220
|
+
tx.inputs[0].should.deepEqual({
|
|
221
|
+
address: authAccount.pub,
|
|
222
|
+
value: amount,
|
|
223
|
+
coin: 'tsol',
|
|
224
|
+
});
|
|
225
|
+
tx.inputs[1].should.deepEqual({
|
|
226
|
+
address: authAccount.pub,
|
|
227
|
+
value: amount,
|
|
228
|
+
coin: 'tsol',
|
|
229
|
+
});
|
|
230
|
+
tx.inputs[2].should.deepEqual({
|
|
231
|
+
address: authAccount.pub,
|
|
232
|
+
value: amount,
|
|
233
|
+
coin: 'tsol',
|
|
234
|
+
});
|
|
235
|
+
tx.inputs[3].should.deepEqual({
|
|
236
|
+
address: authAccount.pub,
|
|
237
|
+
value: amount,
|
|
238
|
+
coin: 'tsol',
|
|
239
|
+
});
|
|
240
|
+
tx.inputs[4].should.deepEqual({
|
|
241
|
+
address: authAccount.pub,
|
|
242
|
+
value: amount,
|
|
243
|
+
coin: 'tsol',
|
|
244
|
+
});
|
|
245
|
+
tx.inputs[5].should.deepEqual({
|
|
246
|
+
address: authAccount.pub,
|
|
247
|
+
value: amount,
|
|
248
|
+
coin: 'tsol',
|
|
249
|
+
});
|
|
250
|
+
tx.outputs.length.should.equal(6);
|
|
251
|
+
tx.outputs[0].should.deepEqual({
|
|
252
|
+
address: otherAccount.pub,
|
|
253
|
+
value: amount,
|
|
254
|
+
coin: 'tsol',
|
|
255
|
+
});
|
|
256
|
+
tx.outputs[1].should.deepEqual({
|
|
257
|
+
address: account1.pub,
|
|
258
|
+
value: amount,
|
|
259
|
+
coin: 'tsol',
|
|
260
|
+
});
|
|
261
|
+
tx.outputs[2].should.deepEqual({
|
|
262
|
+
address: account2.pub,
|
|
263
|
+
value: amount,
|
|
264
|
+
coin: 'tsol',
|
|
265
|
+
});
|
|
266
|
+
tx.outputs[3].should.deepEqual({
|
|
267
|
+
address: account3.pub,
|
|
268
|
+
value: amount,
|
|
269
|
+
coin: 'tsol',
|
|
270
|
+
});
|
|
271
|
+
tx.outputs[4].should.deepEqual({
|
|
272
|
+
address: account4.pub,
|
|
273
|
+
value: amount,
|
|
274
|
+
coin: 'tsol',
|
|
275
|
+
});
|
|
276
|
+
tx.outputs[5].should.deepEqual({
|
|
277
|
+
address: account5.pub,
|
|
278
|
+
value: amount,
|
|
279
|
+
coin: 'tsol',
|
|
280
|
+
});
|
|
281
|
+
const rawTx = tx.toBroadcastFormat();
|
|
282
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
283
|
+
should_1.default.equal(rawTx, testData.NATIVE_MULTI_TRANSFERV2_SIGNED);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('Fail Native Transfer', () => {
|
|
287
|
+
it('for invalid sender', () => {
|
|
288
|
+
const txBuilder = transferBuilderV2();
|
|
289
|
+
(0, should_1.default)(() => txBuilder.sender(invalidPubKey)).throwError('Invalid or missing sender, got: ' + invalidPubKey);
|
|
290
|
+
});
|
|
291
|
+
it('for invalid toAddress', () => {
|
|
292
|
+
const txBuilder = transferBuilderV2();
|
|
293
|
+
(0, should_1.default)(() => txBuilder.send({ address: invalidPubKey, amount })).throwError('Invalid or missing address, got: ' + invalidPubKey);
|
|
294
|
+
});
|
|
295
|
+
it('for invalid amount', () => {
|
|
296
|
+
const invalidAmount = 'randomstring';
|
|
297
|
+
const txBuilder = transferBuilderV2();
|
|
298
|
+
(0, should_1.default)(() => txBuilder.send({ address: nonceAccount.pub, amount: invalidAmount })).throwError('Invalid or missing amount, got: ' + invalidAmount);
|
|
299
|
+
});
|
|
300
|
+
it('to sign twice with the same key', () => {
|
|
301
|
+
const txBuilder = factory.from(testData.TRANSFER_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
302
|
+
txBuilder.sign({ key: authAccount.prv });
|
|
303
|
+
(0, should_1.default)(() => txBuilder.sign({ key: authAccount.prv })).throwError('Duplicated signer: ' + authAccount.prv?.toString());
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
describe('Succeed Token Transfer', () => {
|
|
307
|
+
before(async () => {
|
|
308
|
+
ataAddress = await src_1.Utils.getAssociatedTokenAccountAddress(mintUSDC, otherAccount.pub);
|
|
309
|
+
});
|
|
310
|
+
it('build a token transfer tx unsigned with memo', async () => {
|
|
311
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
312
|
+
txBuilder.nonce(recentBlockHash);
|
|
313
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
314
|
+
txBuilder.sender(walletPK);
|
|
315
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
316
|
+
txBuilder.memo(memo);
|
|
317
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
318
|
+
const tx = await txBuilder.build();
|
|
319
|
+
tx.inputs.length.should.equal(1);
|
|
320
|
+
tx.inputs[0].should.deepEqual({
|
|
321
|
+
address: walletPK,
|
|
322
|
+
value: amount,
|
|
323
|
+
coin: nameUSDC,
|
|
324
|
+
});
|
|
325
|
+
tx.outputs.length.should.equal(1);
|
|
326
|
+
tx.outputs[0].should.deepEqual({
|
|
327
|
+
address: otherAccount.pub,
|
|
328
|
+
value: amount,
|
|
329
|
+
coin: nameUSDC,
|
|
330
|
+
});
|
|
331
|
+
const rawTx = tx.toBroadcastFormat();
|
|
332
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
333
|
+
should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITH_MEMO);
|
|
334
|
+
});
|
|
335
|
+
it('build a token transfer tx unsigned with durable nonce', async () => {
|
|
336
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
337
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
|
|
338
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
339
|
+
txBuilder.sender(walletPK);
|
|
340
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
341
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
342
|
+
const tx = await txBuilder.build();
|
|
343
|
+
tx.inputs.length.should.equal(1);
|
|
344
|
+
tx.inputs[0].should.deepEqual({
|
|
345
|
+
address: walletPK,
|
|
346
|
+
value: amount,
|
|
347
|
+
coin: nameUSDC,
|
|
348
|
+
});
|
|
349
|
+
tx.outputs.length.should.equal(1);
|
|
350
|
+
tx.outputs[0].should.deepEqual({
|
|
351
|
+
address: otherAccount.pub,
|
|
352
|
+
value: amount,
|
|
353
|
+
coin: nameUSDC,
|
|
354
|
+
});
|
|
355
|
+
const rawTx = tx.toBroadcastFormat();
|
|
356
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
357
|
+
should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITH_DURABLE_NONCE);
|
|
358
|
+
const txJson = tx.toJson();
|
|
359
|
+
txJson.durableNonce.should.deepEqual({
|
|
360
|
+
walletNonceAddress: nonceAccount.pub,
|
|
361
|
+
authWalletAddress: walletPK,
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
it('build a token transfer tx unsigned with memo and durable nonce', async () => {
|
|
365
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
366
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: walletPK });
|
|
367
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
368
|
+
txBuilder.sender(walletPK);
|
|
369
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
370
|
+
txBuilder.memo(memo);
|
|
371
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
372
|
+
const tx = await txBuilder.build();
|
|
373
|
+
tx.inputs.length.should.equal(1);
|
|
374
|
+
tx.inputs[0].should.deepEqual({
|
|
375
|
+
address: walletPK,
|
|
376
|
+
value: amount,
|
|
377
|
+
coin: nameUSDC,
|
|
378
|
+
});
|
|
379
|
+
tx.outputs.length.should.equal(1);
|
|
380
|
+
tx.outputs[0].should.deepEqual({
|
|
381
|
+
address: otherAccount.pub,
|
|
382
|
+
value: amount,
|
|
383
|
+
coin: nameUSDC,
|
|
384
|
+
});
|
|
385
|
+
const rawTx = tx.toBroadcastFormat();
|
|
386
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
387
|
+
should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
388
|
+
});
|
|
389
|
+
it('build a token transfer tx unsigned without memo or durable nonce', async () => {
|
|
390
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
391
|
+
txBuilder.nonce(recentBlockHash);
|
|
392
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
393
|
+
txBuilder.sender(walletPK);
|
|
394
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
395
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
396
|
+
const tx = await txBuilder.build();
|
|
397
|
+
tx.inputs.length.should.equal(1);
|
|
398
|
+
tx.inputs[0].should.deepEqual({
|
|
399
|
+
address: walletPK,
|
|
400
|
+
value: amount,
|
|
401
|
+
coin: nameUSDC,
|
|
402
|
+
});
|
|
403
|
+
tx.outputs.length.should.equal(1);
|
|
404
|
+
tx.outputs[0].should.deepEqual({
|
|
405
|
+
address: otherAccount.pub,
|
|
406
|
+
value: amount,
|
|
407
|
+
coin: nameUSDC,
|
|
408
|
+
});
|
|
409
|
+
const rawTx = tx.toBroadcastFormat();
|
|
410
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
411
|
+
should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_UNSIGNED_TX_WITHOUT_MEMO);
|
|
412
|
+
});
|
|
413
|
+
it('build a token transfer tx signed with memo and durable nonce', async () => {
|
|
414
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
415
|
+
txBuilder.nonce(recentBlockHash, {
|
|
416
|
+
walletNonceAddress: nonceAccount.pub,
|
|
417
|
+
authWalletAddress: walletPK,
|
|
418
|
+
});
|
|
419
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
420
|
+
txBuilder.sender(walletPK);
|
|
421
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
422
|
+
txBuilder.memo(memo);
|
|
423
|
+
txBuilder.sign({ key: walletSK });
|
|
424
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
425
|
+
const tx = await txBuilder.build();
|
|
426
|
+
tx.id.should.not.equal(undefined);
|
|
427
|
+
tx.inputs.length.should.equal(1);
|
|
428
|
+
tx.inputs[0].should.deepEqual({
|
|
429
|
+
address: walletPK,
|
|
430
|
+
value: amount,
|
|
431
|
+
coin: nameUSDC,
|
|
432
|
+
});
|
|
433
|
+
tx.outputs.length.should.equal(1);
|
|
434
|
+
tx.outputs[0].should.deepEqual({
|
|
435
|
+
address: otherAccount.pub,
|
|
436
|
+
value: amount,
|
|
437
|
+
coin: nameUSDC,
|
|
438
|
+
});
|
|
439
|
+
const rawTx = tx.toBroadcastFormat();
|
|
440
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
441
|
+
should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_SIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
442
|
+
});
|
|
443
|
+
it('build a token transfer tx unsigned with create ATA, memo and durable nonce', async () => {
|
|
444
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
445
|
+
txBuilder.nonce(recentBlockHash, {
|
|
446
|
+
walletNonceAddress: nonceAccount.pub,
|
|
447
|
+
authWalletAddress: walletPK,
|
|
448
|
+
});
|
|
449
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
450
|
+
txBuilder.sender(walletPK);
|
|
451
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
452
|
+
txBuilder.memo(memo);
|
|
453
|
+
txBuilder.createAssociatedTokenAccount({ ownerAddress: otherAccount.pub, tokenName: nameUSDC });
|
|
454
|
+
txBuilder.sign({ key: walletSK });
|
|
455
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
456
|
+
const tx = await txBuilder.build();
|
|
457
|
+
tx.id.should.not.equal(undefined);
|
|
458
|
+
tx.inputs.length.should.equal(1);
|
|
459
|
+
tx.inputs[0].should.deepEqual({
|
|
460
|
+
address: walletPK,
|
|
461
|
+
value: amount,
|
|
462
|
+
coin: nameUSDC,
|
|
463
|
+
});
|
|
464
|
+
tx.outputs.length.should.equal(1);
|
|
465
|
+
tx.outputs[0].should.deepEqual({
|
|
466
|
+
address: otherAccount.pub,
|
|
467
|
+
value: amount,
|
|
468
|
+
coin: nameUSDC,
|
|
469
|
+
});
|
|
470
|
+
const txJson = tx.toJson();
|
|
471
|
+
txJson.instructionsData.length.should.equal(4);
|
|
472
|
+
txJson.instructionsData[0].type.should.equal('SetPriorityFee');
|
|
473
|
+
txJson.instructionsData[1].type.should.equal('CreateAssociatedTokenAccount');
|
|
474
|
+
txJson.instructionsData[1].params.should.deepEqual({
|
|
475
|
+
mintAddress: mintUSDC,
|
|
476
|
+
ataAddress: ataAddress,
|
|
477
|
+
ownerAddress: otherAccount.pub,
|
|
478
|
+
payerAddress: walletPK,
|
|
479
|
+
tokenName: nameUSDC,
|
|
480
|
+
programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
|
|
481
|
+
});
|
|
482
|
+
txJson.instructionsData[2].type.should.equal('TokenTransfer');
|
|
483
|
+
txJson.instructionsData[2].params.should.deepEqual({
|
|
484
|
+
fromAddress: walletPK,
|
|
485
|
+
toAddress: otherAccount.pub,
|
|
486
|
+
amount: amount,
|
|
487
|
+
tokenName: nameUSDC,
|
|
488
|
+
sourceAddress: 'B5rJjuVi7En63iK6o3ijKdJwAoTe2gwCYmJsVdHQ2aKV',
|
|
489
|
+
tokenAddress: 'F4uLeXJoFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
|
|
490
|
+
programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
|
|
491
|
+
decimalPlaces: 9,
|
|
492
|
+
});
|
|
493
|
+
txJson.instructionsData[3].type.should.equal('Memo');
|
|
494
|
+
txJson.instructionsData[3].params.memo.should.equal(memo);
|
|
495
|
+
const rawTx = tx.toBroadcastFormat();
|
|
496
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
497
|
+
should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_SIGNED_TX_WITH_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE);
|
|
498
|
+
});
|
|
499
|
+
it('build a token transfer tx unsigned with create ATA, memo, tokenAddress and durable nonce', async () => {
|
|
500
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
501
|
+
txBuilder.nonce(recentBlockHash, {
|
|
502
|
+
walletNonceAddress: nonceAccount.pub,
|
|
503
|
+
authWalletAddress: walletPK,
|
|
504
|
+
});
|
|
505
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
506
|
+
txBuilder.sender(walletPK);
|
|
507
|
+
txBuilder.send({
|
|
508
|
+
address: otherAccount.pub,
|
|
509
|
+
amount,
|
|
510
|
+
tokenName: nameAMS,
|
|
511
|
+
tokenAddress: mintAMS,
|
|
512
|
+
programId: amsProgramID,
|
|
513
|
+
decimalPlaces: 9,
|
|
514
|
+
});
|
|
515
|
+
txBuilder.memo(memo);
|
|
516
|
+
txBuilder.createAssociatedTokenAccount({
|
|
517
|
+
ownerAddress: otherAccount.pub,
|
|
518
|
+
tokenName: nameAMS,
|
|
519
|
+
tokenAddress: mintAMS,
|
|
520
|
+
programId: amsProgramID,
|
|
521
|
+
});
|
|
522
|
+
txBuilder.sign({ key: walletSK });
|
|
523
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
524
|
+
const tx = await txBuilder.build();
|
|
525
|
+
tx.id.should.not.equal(undefined);
|
|
526
|
+
tx.inputs.length.should.equal(1);
|
|
527
|
+
tx.inputs[0].should.deepEqual({
|
|
528
|
+
address: walletPK,
|
|
529
|
+
value: amount,
|
|
530
|
+
coin: nameAMS,
|
|
531
|
+
});
|
|
532
|
+
tx.outputs.length.should.equal(1);
|
|
533
|
+
tx.outputs[0].should.deepEqual({
|
|
534
|
+
address: otherAccount.pub,
|
|
535
|
+
value: amount,
|
|
536
|
+
coin: nameAMS,
|
|
537
|
+
});
|
|
538
|
+
const txJson = tx.toJson();
|
|
539
|
+
txJson.instructionsData.length.should.equal(4);
|
|
540
|
+
txJson.instructionsData[0].type.should.equal('SetPriorityFee');
|
|
541
|
+
txJson.instructionsData[1].type.should.equal('CreateAssociatedTokenAccount');
|
|
542
|
+
txJson.instructionsData[1].params.should.deepEqual({
|
|
543
|
+
mintAddress: mintAMS,
|
|
544
|
+
ataAddress: '8KLnroP6hHkr1ZsQL4k6A3i2yhhnv2kr2Teedx7a26Eg',
|
|
545
|
+
ownerAddress: otherAccount.pub,
|
|
546
|
+
payerAddress: walletPK,
|
|
547
|
+
tokenName: nameAMS,
|
|
548
|
+
programId: 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',
|
|
549
|
+
});
|
|
550
|
+
txJson.instructionsData[2].type.should.equal('TokenTransfer');
|
|
551
|
+
txJson.instructionsData[2].params.should.deepEqual({
|
|
552
|
+
fromAddress: walletPK,
|
|
553
|
+
toAddress: otherAccount.pub,
|
|
554
|
+
amount: amount,
|
|
555
|
+
tokenName: nameAMS,
|
|
556
|
+
sourceAddress: 'EytHm3gWSmaTkuF1datepgDzx7grGuDG7ws5QA7tCmU4',
|
|
557
|
+
tokenAddress: 'F4uLeXioFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
|
|
558
|
+
programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
|
|
559
|
+
decimalPlaces: 9,
|
|
560
|
+
});
|
|
561
|
+
txJson.instructionsData[3].type.should.equal('Memo');
|
|
562
|
+
txJson.instructionsData[3].params.memo.should.equal(memo);
|
|
563
|
+
const rawTx = tx.toBroadcastFormat();
|
|
564
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
565
|
+
should_1.default.equal(rawTx, testData.TOKEN_TRANSFERV2_SIGNED_TX_WITH_WITH_CREATE_ATA_AND_MEMO_AND_DURABLE_NONCE_WITH_OPTIONAL_PARAMS);
|
|
566
|
+
});
|
|
567
|
+
it('build a token multi transfer tx signed with memo and durable nonce', async () => {
|
|
568
|
+
const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
|
|
569
|
+
const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
|
|
570
|
+
const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
|
|
571
|
+
const account4 = new src_1.KeyPair({ prv: testData.extraAccounts.prv4 }).getKeys();
|
|
572
|
+
const account5 = new src_1.KeyPair({ prv: testData.extraAccounts.prv5 }).getKeys();
|
|
573
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
574
|
+
txBuilder.nonce(recentBlockHash, { walletNonceAddress: nonceAccount.pub, authWalletAddress: authAccount.pub });
|
|
575
|
+
txBuilder.sender(owner);
|
|
576
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
577
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
578
|
+
txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
|
|
579
|
+
txBuilder.send({ address: account2.pub, amount, tokenName: nameUSDC });
|
|
580
|
+
txBuilder.send({ address: account3.pub, amount, tokenName: nameUSDC });
|
|
581
|
+
txBuilder.send({ address: account4.pub, amount, tokenName: nameUSDC });
|
|
582
|
+
txBuilder.send({ address: account5.pub, amount, tokenName: nameUSDC });
|
|
583
|
+
txBuilder.memo(memo);
|
|
584
|
+
txBuilder.sign({ key: authAccount.prv });
|
|
585
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
586
|
+
const tx = await txBuilder.build();
|
|
587
|
+
tx.inputs.length.should.equal(6);
|
|
588
|
+
tx.inputs[0].should.deepEqual({
|
|
589
|
+
address: owner,
|
|
590
|
+
value: amount,
|
|
591
|
+
coin: nameUSDC,
|
|
592
|
+
});
|
|
593
|
+
tx.inputs[1].should.deepEqual({
|
|
594
|
+
address: owner,
|
|
595
|
+
value: amount,
|
|
596
|
+
coin: nameUSDC,
|
|
597
|
+
});
|
|
598
|
+
tx.inputs[2].should.deepEqual({
|
|
599
|
+
address: owner,
|
|
600
|
+
value: amount,
|
|
601
|
+
coin: nameUSDC,
|
|
602
|
+
});
|
|
603
|
+
tx.inputs[3].should.deepEqual({
|
|
604
|
+
address: owner,
|
|
605
|
+
value: amount,
|
|
606
|
+
coin: nameUSDC,
|
|
607
|
+
});
|
|
608
|
+
tx.inputs[4].should.deepEqual({
|
|
609
|
+
address: owner,
|
|
610
|
+
value: amount,
|
|
611
|
+
coin: nameUSDC,
|
|
612
|
+
});
|
|
613
|
+
tx.inputs[5].should.deepEqual({
|
|
614
|
+
address: owner,
|
|
615
|
+
value: amount,
|
|
616
|
+
coin: nameUSDC,
|
|
617
|
+
});
|
|
618
|
+
tx.outputs.length.should.equal(6);
|
|
619
|
+
tx.outputs[0].should.deepEqual({
|
|
620
|
+
address: otherAccount.pub,
|
|
621
|
+
value: amount,
|
|
622
|
+
coin: nameUSDC,
|
|
623
|
+
});
|
|
624
|
+
tx.outputs[1].should.deepEqual({
|
|
625
|
+
address: account1.pub,
|
|
626
|
+
value: amount,
|
|
627
|
+
coin: nameUSDC,
|
|
628
|
+
});
|
|
629
|
+
tx.outputs[2].should.deepEqual({
|
|
630
|
+
address: account2.pub,
|
|
631
|
+
value: amount,
|
|
632
|
+
coin: nameUSDC,
|
|
633
|
+
});
|
|
634
|
+
tx.outputs[3].should.deepEqual({
|
|
635
|
+
address: account3.pub,
|
|
636
|
+
value: amount,
|
|
637
|
+
coin: nameUSDC,
|
|
638
|
+
});
|
|
639
|
+
tx.outputs[4].should.deepEqual({
|
|
640
|
+
address: account4.pub,
|
|
641
|
+
value: amount,
|
|
642
|
+
coin: nameUSDC,
|
|
643
|
+
});
|
|
644
|
+
tx.outputs[5].should.deepEqual({
|
|
645
|
+
address: account5.pub,
|
|
646
|
+
value: amount,
|
|
647
|
+
coin: nameUSDC,
|
|
648
|
+
});
|
|
649
|
+
const rawTx = tx.toBroadcastFormat();
|
|
650
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
651
|
+
should_1.default.equal(rawTx, testData.MULTI_TOKEN_TRANSFERV2_SIGNED);
|
|
652
|
+
});
|
|
653
|
+
it('build a token multi asset transfer tx unsigned', async () => {
|
|
654
|
+
const account1 = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 }).getKeys();
|
|
655
|
+
const account2 = new src_1.KeyPair({ prv: testData.extraAccounts.prv2 }).getKeys();
|
|
656
|
+
const account3 = new src_1.KeyPair({ prv: testData.extraAccounts.prv3 }).getKeys();
|
|
657
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
658
|
+
const nameSRM = 'tsol:srm';
|
|
659
|
+
const nameRAY = 'tsol:ray';
|
|
660
|
+
txBuilder.nonce(recentBlockHash);
|
|
661
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
662
|
+
txBuilder.sender(owner);
|
|
663
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
664
|
+
txBuilder.send({ address: account1.pub, amount, tokenName: nameUSDC });
|
|
665
|
+
txBuilder.send({ address: account2.pub, amount, tokenName: nameSRM });
|
|
666
|
+
txBuilder.send({ address: account3.pub, amount, tokenName: nameRAY });
|
|
667
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
668
|
+
const tx = await txBuilder.build();
|
|
669
|
+
tx.inputs.length.should.equal(4);
|
|
670
|
+
tx.inputs[0].should.deepEqual({
|
|
671
|
+
address: owner,
|
|
672
|
+
value: amount,
|
|
673
|
+
coin: nameUSDC,
|
|
674
|
+
});
|
|
675
|
+
tx.inputs[1].should.deepEqual({
|
|
676
|
+
address: owner,
|
|
677
|
+
value: amount,
|
|
678
|
+
coin: nameUSDC,
|
|
679
|
+
});
|
|
680
|
+
tx.inputs[2].should.deepEqual({
|
|
681
|
+
address: owner,
|
|
682
|
+
value: amount,
|
|
683
|
+
coin: nameSRM,
|
|
684
|
+
});
|
|
685
|
+
tx.inputs[3].should.deepEqual({
|
|
686
|
+
address: owner,
|
|
687
|
+
value: amount,
|
|
688
|
+
coin: nameRAY,
|
|
689
|
+
});
|
|
690
|
+
tx.outputs.length.should.equal(4);
|
|
691
|
+
tx.outputs[0].should.deepEqual({
|
|
692
|
+
address: otherAccount.pub,
|
|
693
|
+
value: amount,
|
|
694
|
+
coin: nameUSDC,
|
|
695
|
+
});
|
|
696
|
+
tx.outputs[1].should.deepEqual({
|
|
697
|
+
address: account1.pub,
|
|
698
|
+
value: amount,
|
|
699
|
+
coin: nameUSDC,
|
|
700
|
+
});
|
|
701
|
+
tx.outputs[2].should.deepEqual({
|
|
702
|
+
address: account2.pub,
|
|
703
|
+
value: amount,
|
|
704
|
+
coin: nameSRM,
|
|
705
|
+
});
|
|
706
|
+
tx.outputs[3].should.deepEqual({
|
|
707
|
+
address: account3.pub,
|
|
708
|
+
value: amount,
|
|
709
|
+
coin: nameRAY,
|
|
710
|
+
});
|
|
711
|
+
const txJson = tx.toJson();
|
|
712
|
+
txJson.instructionsData.length.should.equal(5);
|
|
713
|
+
txJson.instructionsData[1].params.sourceAddress.should.equal(testData.tokenTransfers.sourceUSDC);
|
|
714
|
+
txJson.instructionsData[2].params.sourceAddress.should.equal(testData.tokenTransfers.sourceUSDC);
|
|
715
|
+
txJson.instructionsData[3].params.sourceAddress.should.equal(testData.tokenTransfers.sourceSRM);
|
|
716
|
+
txJson.instructionsData[4].params.sourceAddress.should.equal(testData.tokenTransfers.sourceRAY);
|
|
717
|
+
const rawTx = tx.toBroadcastFormat();
|
|
718
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
719
|
+
should_1.default.equal(rawTx, testData.MULTI_ASSET_TOKEN_TRANSFERV2_UNSIGNED);
|
|
720
|
+
});
|
|
721
|
+
});
|
|
722
|
+
describe('Fail Token Transfer', () => {
|
|
723
|
+
it('for invalid sender', () => {
|
|
724
|
+
const txBuilder = transferBuilderV2();
|
|
725
|
+
(0, should_1.default)(() => txBuilder.sender(invalidPubKey)).throwError('Invalid or missing sender, got: ' + invalidPubKey);
|
|
726
|
+
});
|
|
727
|
+
it('for invalid toAddress', () => {
|
|
728
|
+
const txBuilder = transferBuilderV2();
|
|
729
|
+
(0, should_1.default)(() => txBuilder.send({ address: invalidPubKey, amount, tokenName: nameUSDC })).throwError('Invalid or missing address, got: ' + invalidPubKey);
|
|
730
|
+
});
|
|
731
|
+
it('for invalid amount', () => {
|
|
732
|
+
const invalidAmount = 'randomstring';
|
|
733
|
+
const txBuilder = transferBuilderV2();
|
|
734
|
+
(0, should_1.default)(() => txBuilder.send({
|
|
735
|
+
address: nonceAccount.pub,
|
|
736
|
+
amount: invalidAmount,
|
|
737
|
+
tokenName: nameUSDC,
|
|
738
|
+
})).throwError('Invalid or missing amount, got: ' + invalidAmount);
|
|
739
|
+
});
|
|
740
|
+
});
|
|
741
|
+
describe('Suceed Native and Token Transfer', () => {
|
|
742
|
+
it('build a transfer tx with both native and token', async () => {
|
|
743
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
744
|
+
txBuilder.nonce(recentBlockHash);
|
|
745
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
746
|
+
txBuilder.sender(authAccount.pub);
|
|
747
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
748
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
749
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
750
|
+
const tx = await txBuilder.build();
|
|
751
|
+
tx.inputs.length.should.equal(2);
|
|
752
|
+
tx.inputs[0].should.deepEqual({
|
|
753
|
+
address: authAccount.pub,
|
|
754
|
+
value: amount,
|
|
755
|
+
coin: 'tsol',
|
|
756
|
+
});
|
|
757
|
+
tx.inputs[1].should.deepEqual({
|
|
758
|
+
address: authAccount.pub,
|
|
759
|
+
value: amount,
|
|
760
|
+
coin: nameUSDC,
|
|
761
|
+
});
|
|
762
|
+
tx.outputs.length.should.equal(2);
|
|
763
|
+
tx.outputs[0].should.deepEqual({
|
|
764
|
+
address: otherAccount.pub,
|
|
765
|
+
value: amount,
|
|
766
|
+
coin: 'tsol',
|
|
767
|
+
});
|
|
768
|
+
tx.outputs[1].should.deepEqual({
|
|
769
|
+
address: otherAccount.pub,
|
|
770
|
+
value: amount,
|
|
771
|
+
coin: nameUSDC,
|
|
772
|
+
});
|
|
773
|
+
const rawTx = tx.toBroadcastFormat();
|
|
774
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
775
|
+
should_1.default.equal(rawTx, testData.NATIVE_AND_TOKEN_TRANSFERV2_UNSIGNED);
|
|
776
|
+
});
|
|
777
|
+
it('build a multi transfer tx with both native and multiple token', async () => {
|
|
778
|
+
const txBuilder = factory.getTransferBuilderV2();
|
|
779
|
+
txBuilder.nonce(recentBlockHash);
|
|
780
|
+
txBuilder.feePayer(feePayerAccount.pub);
|
|
781
|
+
txBuilder.sender(authAccount.pub);
|
|
782
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
783
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
784
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
785
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
786
|
+
txBuilder.setPriorityFee(priorityFee);
|
|
787
|
+
const tx = await txBuilder.build();
|
|
788
|
+
tx.inputs.length.should.equal(4);
|
|
789
|
+
tx.inputs[0].should.deepEqual({
|
|
790
|
+
address: authAccount.pub,
|
|
791
|
+
value: amount,
|
|
792
|
+
coin: 'tsol',
|
|
793
|
+
});
|
|
794
|
+
tx.inputs[1].should.deepEqual({
|
|
795
|
+
address: authAccount.pub,
|
|
796
|
+
value: amount,
|
|
797
|
+
coin: nameUSDC,
|
|
798
|
+
});
|
|
799
|
+
tx.inputs[2].should.deepEqual({
|
|
800
|
+
address: authAccount.pub,
|
|
801
|
+
value: amount,
|
|
802
|
+
coin: nameUSDC,
|
|
803
|
+
});
|
|
804
|
+
tx.inputs[3].should.deepEqual({
|
|
805
|
+
address: authAccount.pub,
|
|
806
|
+
value: amount,
|
|
807
|
+
coin: nameUSDC,
|
|
808
|
+
});
|
|
809
|
+
tx.outputs.length.should.equal(4);
|
|
810
|
+
tx.outputs[0].should.deepEqual({
|
|
811
|
+
address: otherAccount.pub,
|
|
812
|
+
value: amount,
|
|
813
|
+
coin: 'tsol',
|
|
814
|
+
});
|
|
815
|
+
tx.outputs[1].should.deepEqual({
|
|
816
|
+
address: otherAccount.pub,
|
|
817
|
+
value: amount,
|
|
818
|
+
coin: nameUSDC,
|
|
819
|
+
});
|
|
820
|
+
tx.outputs[2].should.deepEqual({
|
|
821
|
+
address: otherAccount.pub,
|
|
822
|
+
value: amount,
|
|
823
|
+
coin: nameUSDC,
|
|
824
|
+
});
|
|
825
|
+
tx.outputs[3].should.deepEqual({
|
|
826
|
+
address: otherAccount.pub,
|
|
827
|
+
value: amount,
|
|
828
|
+
coin: nameUSDC,
|
|
829
|
+
});
|
|
830
|
+
const rawTx = tx.toBroadcastFormat();
|
|
831
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
832
|
+
should_1.default.equal(rawTx, testData.MULTI_NATIVE_AND_TOKEN_TRANSFERV2_UNSIGNED);
|
|
833
|
+
});
|
|
834
|
+
});
|
|
835
|
+
describe('Fail Native and Token Transfer', () => {
|
|
836
|
+
it('for invalid toAddress', () => {
|
|
837
|
+
const txBuilder = transferBuilderV2();
|
|
838
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
839
|
+
(0, should_1.default)(() => txBuilder.send({ address: invalidPubKey, amount, tokenName: nameUSDC })).throwError('Invalid or missing address, got: ' + invalidPubKey);
|
|
840
|
+
});
|
|
841
|
+
it('for invalid amount', () => {
|
|
842
|
+
const invalidAmount = 'randomstring';
|
|
843
|
+
const txBuilder = transferBuilderV2();
|
|
844
|
+
txBuilder.send({ address: otherAccount.pub, amount });
|
|
845
|
+
txBuilder.send({ address: otherAccount.pub, amount, tokenName: nameUSDC });
|
|
846
|
+
(0, should_1.default)(() => txBuilder.send({
|
|
847
|
+
address: nonceAccount.pub,
|
|
848
|
+
amount: invalidAmount,
|
|
849
|
+
tokenName: nameUSDC,
|
|
850
|
+
})).throwError('Invalid or missing amount, got: ' + invalidAmount);
|
|
851
|
+
const excessiveTokenAmount = '18446744073709551616';
|
|
852
|
+
(0, should_1.default)(() => txBuilder.send({
|
|
853
|
+
address: nonceAccount.pub,
|
|
854
|
+
amount: excessiveTokenAmount,
|
|
855
|
+
tokenName: nameUSDC,
|
|
856
|
+
})).throwError(`input amount ${excessiveTokenAmount} exceeds big int limit 18446744073709551615`);
|
|
857
|
+
const excessiveAmount = '9007199254740992';
|
|
858
|
+
(0, should_1.default)(() => txBuilder.send({ address: nonceAccount.pub, amount: excessiveAmount })).throwError(`input amount ${excessiveAmount} exceeds max safe int 9007199254740991`);
|
|
859
|
+
});
|
|
860
|
+
});
|
|
861
|
+
});
|
|
862
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3RyYW5zZmVyQnVpbGRlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNERBQXlEO0FBQ3pELHNDQUE4QztBQUM5Qyw4REFBZ0Q7QUFDaEQsb0RBQTRCO0FBRzVCLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7SUFDdkMsSUFBSSxVQUFVLENBQUM7SUFDZixNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRixNQUFNLGVBQWUsR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEUsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsTUFBTSxlQUFlLEdBQUcsOENBQThDLENBQUM7SUFDdkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUN6QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsY0FBYyxD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LEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsV0FBVyxD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QUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsWUFBWSxDQUFDLEdBQUc7Z0JBQ3pCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QixPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUc7Z0JBQ3JCLEtBQUssRUFBRSxNQUFNO2dCQUNiLElBQUksRUFBRSxRQUFRO2FBQ2Ys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QUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDekIsTUFBTSxFQUFFLG9CQUFvQjtnQkFDNUIsU0FBUyxFQUFFLFFBQVE7YUFDcEIsQ0FBQyxDQUNILENBQUMsVUFBVSxDQUFDLGdCQUFnQixvQkFBb0IsNkNBQTZDLENBQUMsQ0FBQztZQUVoRyxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztZQUMzQyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUM3RixnQkFBZ0IsZUFBZSx3Q0FBd0MsQ0FDeEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgS2V5UGFpciwgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBGZWVPcHRpb25zIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5kZXNjcmliZSgnU29sIFRyYW5zZmVyIEJ1aWxkZXIgVjInLCAoKSA9PiB7XG4gIGxldCBhdGFBZGRyZXNzO1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcblxuICBjb25zdCBhdXRoQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gIGNvbnN0IG5vbmNlQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLm5vbmNlQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBvdGhlckFjY291bnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG4gIGNvbnN0IGZlZVBheWVyQWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmZlZVBheWVyQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBpbnZhbGlkUHViS2V5ID0gdGVzdERhdGEucHViS2V5cy5pbnZhbGlkUHViS2V5c1swXTtcbiAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcbiAgY29uc3QgYW1vdW50ID0gJzMwMDAwMCc7XG4gIGNvbnN0IG1lbW8gPSAndGVzdCBtZW1vJztcbiAgY29uc3QgbmFtZVVTREMgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5uYW1lVVNEQztcbiAgY29uc3QgbWludFVTREMgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5taW50VVNEQztcbiAgY29uc3QgbmFtZUFNUyA9IHRlc3REYXRhLmFtc1Rva2VuVHJhbnNmZXJzLm5hbWVBTVNUb2tlbjtcbiAgY29uc3QgbWludEFNUyA9IHRlc3REYXRhLmFtc1Rva2VuVHJhbnNmZXJzLm1pbnRBTVM7XG4gIGNvbnN0IGFtc1Byb2dyYW1JRCA9IHRlc3REYXRhLmFtc1Rva2VuVHJhbnNmZXJzLnByb2dyYW1JRDtcbiAgY29uc3Qgb3duZXIgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5vd25lcjtcbiAgY29uc3Qgd2FsbGV0UEsgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5wdWI7XG4gIGNvbnN0IHdhbGxldFNLID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHJ2O1xuICBjb25zdCBwcmlvRmVlTWljcm9MYW1wb3J0cyA9ICcxMDAwMDAwMCc7XG4gIGNvbnN0IHByaW9yaXR5RmVlOiBGZWVPcHRpb25zID0ge1xuICAgIGFtb3VudDogcHJpb0ZlZU1pY3JvTGFtcG9ydHMsXG4gIH07XG4gIGNvbnN0IHRyYW5zZmVyQnVpbGRlclYyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCBOYXRpdmUgVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1VOU0lHTkVEX1dJVEhfTUVNTyk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCk7XG4gICAgICAvLyByZXNlcmlhbGl6ZWQuc2hvdWxkLmJlLmRlZXBFcXVhbCh0eCk7IC8vIHdlIGhhdmUgZXh0cmEgcGFyYW0gX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSBmb3IgZmFjdG9yeS5mcm9tIG1ldGhvZFxuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YiB9KTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1dJVEhfRFVSQUJMRV9OT05DRSk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5kdXJhYmxlTm9uY2Uuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKGF1dGhBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1VOU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRob3V0IG1lbW8gb3IgZHVyYWJsZSBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihhdXRoQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTkFUSVZFX1RSQU5TRkVSVjJfVU5TSUdORURfVFhfV0lUSE9VVF9NRU1PKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zZmVyIHR4IHNpZ25lZCB3aXRoIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YiB9KTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYXV0aEFjY291bnQucHJ2IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9UUkFOU0ZFUlYyX1NJR05FRF9UWF9XSVRIX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgbXVsdGkgdHJhbnNmZXIgdHggc2lnbmVkIHdpdGggbWVtbyBhbmQgZHVyYWJsZSBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFjY291bnQxID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MSB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50MiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjIgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgYWNjb3VudDMgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYzIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQ0ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2NCB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50NSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjUgfSkuZ2V0S2V5cygpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YiB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50MS5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDIucHViLCBhbW91bnQgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQzLnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50NC5wdWIsIGFtb3VudCB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDUucHViLCBhbW91bnQgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNik7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbM10uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbNF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbNV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50Mi5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYWNjb3VudDMucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbNF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQ0LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogJ3Rzb2wnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzVdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50NS5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5OQVRJVkVfTVVMVElfVFJBTlNGRVJWMl9TSUdORUQpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ0ZhaWwgTmF0aXZlIFRyYW5zZmVyJywgKCkgPT4ge1xuICAgIGl0KCdmb3IgaW52YWxpZCBzZW5kZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0cmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kZXIoaW52YWxpZFB1YktleSkpLnRocm93RXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBzZW5kZXIsIGdvdDogJyArIGludmFsaWRQdWJLZXkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBpbnZhbGlkIHRvQWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBpbnZhbGlkUHViS2V5LCBhbW91bnQgfSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIG9yIG1pc3NpbmcgYWRkcmVzcywgZ290OiAnICsgaW52YWxpZFB1YktleVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW52YWxpZCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkQW1vdW50ID0gJ3JhbmRvbXN0cmluZyc7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0cmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYW1vdW50OiBpbnZhbGlkQW1vdW50IH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgaW52YWxpZEFtb3VudFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd0byBzaWduIHR3aWNlIHdpdGggdGhlIHNhbWUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlRSQU5TRkVSX1VOU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYXV0aEFjY291bnQucHJ2IH0pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSkpLnRocm93RXJyb3IoXG4gICAgICAgICdEdXBsaWNhdGVkIHNpZ25lcjogJyArIGF1dGhBY2NvdW50LnBydj8udG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdTdWNjZWVkIFRva2VuIFRyYW5zZmVyJywgKCkgPT4ge1xuICAgIGJlZm9yZShhc3luYyAoKSA9PiB7XG4gICAgICBhdGFBZGRyZXNzID0gYXdhaXQgVXRpbHMuZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MobWludFVTREMsIG90aGVyQWNjb3VudC5wdWIpO1xuICAgIH0pO1xuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHVuc2lnbmVkIHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UT0tFTl9UUkFOU0ZFUlYyX1VOU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLIH0pO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRF9UWF9XSVRIX0RVUkFCTEVfTk9OQ0UpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uZHVyYWJsZU5vbmNlLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdG9rZW4gdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyB9KTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRF9UWF9XSVRIX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgdG9rZW4gdHJhbnNmZXIgdHggdW5zaWduZWQgd2l0aG91dCBtZW1vIG9yIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0UEspO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSVjJfVU5TSUdORURfVFhfV0lUSE9VVF9NRU1PKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHNpZ25lZCB3aXRoIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0U0sgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlkLnNob3VsZC5ub3QuZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSVjJfU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiB0cmFuc2ZlciB0eCB1bnNpZ25lZCB3aXRoIGNyZWF0ZSBBVEEsIG1lbW8gYW5kIGR1cmFibGUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoLCB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldFBLKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCh7IG93bmVyQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXRTSyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaWQuc2hvdWxkLm5vdC5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg0KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdTZXRQcmlvcml0eUZlZScpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMV0udHlwZS5zaG91bGQuZXF1YWwoJ0NyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgbWludEFkZHJlc3M6IG1pbnRVU0RDLFxuICAgICAgICBhdGFBZGRyZXNzOiBhdGFBZGRyZXNzLFxuICAgICAgICBvd25lckFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIHByb2dyYW1JZDogJ0FUb2tlbkdQdmJkR1Z4cjFiMmh2WmJzaXFXNXhXSDI1ZWZUTnNMSkE4a25MJyxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0udHlwZS5zaG91bGQuZXF1YWwoJ1Rva2VuVHJhbnNmZXInKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzJdLnBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZnJvbUFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB0b0FkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICBzb3VyY2VBZGRyZXNzOiAnQjVySmp1Vmk3RW42M2lLNm8zaWpLZEp3QW9UZTJnd0NZbUpzVmRIUTJhS1YnLFxuICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhKb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVszXS50eXBlLnNob3VsZC5lcXVhbCgnTWVtbycpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbM10ucGFyYW1zLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlRPS0VOX1RSQU5TRkVSVjJfU0lHTkVEX1RYX1dJVEhfV0lUSF9DUkVBVEVfQVRBX0FORF9NRU1PX0FORF9EVVJBQkxFX05PTkNFKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIHRyYW5zZmVyIHR4IHVuc2lnbmVkIHdpdGggY3JlYXRlIEFUQSwgbWVtbywgdG9rZW5BZGRyZXNzIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCwge1xuICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiB3YWxsZXRQSyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmZlZVBheWVyKGZlZVBheWVyQWNjb3VudC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXRQSyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgdG9rZW5OYW1lOiBuYW1lQU1TLFxuICAgICAgICB0b2tlbkFkZHJlc3M6IG1pbnRBTVMsXG4gICAgICAgIHByb2dyYW1JZDogYW1zUHJvZ3JhbUlELFxuICAgICAgICBkZWNpbWFsUGxhY2VzOiA5LFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIHR4QnVpbGRlci5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50KHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB0b2tlbk5hbWU6IG5hbWVBTVMsXG4gICAgICAgIHRva2VuQWRkcmVzczogbWludEFNUyxcbiAgICAgICAgcHJvZ3JhbUlkOiBhbXNQcm9ncmFtSUQsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXRTSyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaWQuc2hvdWxkLm5vdC5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHdhbGxldFBLLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lQU1TLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lQU1TLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVswXS50eXBlLnNob3VsZC5lcXVhbCgnU2V0UHJpb3JpdHlGZWUnKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdDcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50Jyk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsxXS5wYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIG1pbnRBZGRyZXNzOiBtaW50QU1TLFxuICAgICAgICBhdGFBZGRyZXNzOiAnOEtMbnJvUDZoSGtyMVpzUUw0azZBM2kyeWhobnYya3IyVGVlZHg3YTI2RWcnLFxuICAgICAgICBvd25lckFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRva2VuTmFtZTogbmFtZUFNUyxcbiAgICAgICAgcHJvZ3JhbUlkOiAnQVRva2VuR1B2YmRHVnhyMWIyaHZaYnNpcVc1eFdIMjVlZlROc0xKQThrbkwnLFxuICAgICAgfSk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YVsyXS50eXBlLnNob3VsZC5lcXVhbCgnVG9rZW5UcmFuc2ZlcicpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbMl0ucGFyYW1zLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBmcm9tQWRkcmVzczogd2FsbGV0UEssXG4gICAgICAgIHRvQWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgYW1vdW50OiBhbW91bnQsXG4gICAgICAgIHRva2VuTmFtZTogbmFtZUFNUyxcbiAgICAgICAgc291cmNlQWRkcmVzczogJ0V5dEhtM2dXU21hVGt1RjFkYXRlcGdEeng3Z3JHdURHN3dzNVFBN3RDbVU0JyxcbiAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYaW9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICBwcm9ncmFtSWQ6ICdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyxcbiAgICAgICAgZGVjaW1hbFBsYWNlczogOSxcbiAgICAgIH0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbM10udHlwZS5zaG91bGQuZXF1YWwoJ01lbW8nKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzNdLnBhcmFtcy5tZW1vLnNob3VsZC5lcXVhbChtZW1vKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICByYXdUeCxcbiAgICAgICAgdGVzdERhdGEuVE9LRU5fVFJBTlNGRVJWMl9TSUdORURfVFhfV0lUSF9XSVRIX0NSRUFURV9BVEFfQU5EX01FTU9fQU5EX0RVUkFCTEVfTk9OQ0VfV0lUSF9PUFRJT05BTF9QQVJBTVNcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSB0b2tlbiBtdWx0aSB0cmFuc2ZlciB0eCBzaWduZWQgd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWNjb3VudDEgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYxIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MiB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50MyA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjMgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgYWNjb3VudDQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnY0IH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQ1ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2NSB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG5cbiAgICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFjY291bnQucHViLCBhdXRoV2FsbGV0QWRkcmVzczogYXV0aEFjY291bnQucHViIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihvd25lcik7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDEucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQyLnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50My5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGFjY291bnQ1LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogYXV0aEFjY291bnQucHJ2IH0pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg2KTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbNF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzVdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg2KTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50MS5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50Mi5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzNdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50My5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzRdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50NC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzVdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhY2NvdW50NS5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1VTFRJX1RPS0VOX1RSQU5TRkVSVjJfU0lHTkVEKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRva2VuIG11bHRpIGFzc2V0IHRyYW5zZmVyIHR4IHVuc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWNjb3VudDEgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuZXh0cmFBY2NvdW50cy5wcnYxIH0pLmdldEtleXMoKTtcbiAgICAgIGNvbnN0IGFjY291bnQyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MiB9KS5nZXRLZXlzKCk7XG4gICAgICBjb25zdCBhY2NvdW50MyA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5leHRyYUFjY291bnRzLnBydjMgfSkuZ2V0S2V5cygpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgY29uc3QgbmFtZVNSTSA9ICd0c29sOnNybSc7XG4gICAgICBjb25zdCBuYW1lUkFZID0gJ3Rzb2w6cmF5JztcblxuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlUGF5ZXIoZmVlUGF5ZXJBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKG93bmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBhY2NvdW50MS5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDIucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVNSTSB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogYWNjb3VudDMucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVJBWSB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXRQcmlvcml0eUZlZShwcmlvcml0eUZlZSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG93bmVyLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvd25lcixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1syXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVTUk0sXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3duZXIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVSQVksXG4gICAgICB9KTtcblxuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQxLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGFjY291bnQyLnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVNSTSxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1szXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYWNjb3VudDMucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lUkFZLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg1KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzFdLnBhcmFtcy5zb3VyY2VBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5zb3VyY2VVU0RDKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzJdLnBhcmFtcy5zb3VyY2VBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5zb3VyY2VVU0RDKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhWzNdLnBhcmFtcy5zb3VyY2VBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5zb3VyY2VTUk0pO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGFbNF0ucGFyYW1zLnNvdXJjZUFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLnNvdXJjZVJBWSk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuTVVMVElfQVNTRVRfVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnRmFpbCBUb2tlbiBUcmFuc2ZlcicsICgpID0+IHtcbiAgICBpdCgnZm9yIGludmFsaWQgc2VuZGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZGVyKGludmFsaWRQdWJLZXkpKS50aHJvd0Vycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgc2VuZGVyLCBnb3Q6ICcgKyBpbnZhbGlkUHViS2V5KTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW52YWxpZCB0b0FkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0cmFuc2ZlckJ1aWxkZXJWMigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogaW52YWxpZFB1YktleSwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCBvciBtaXNzaW5nIGFkZHJlc3MsIGdvdDogJyArIGludmFsaWRQdWJLZXlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudCA9ICdyYW5kb21zdHJpbmcnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuc2VuZCh7XG4gICAgICAgICAgYWRkcmVzczogbm9uY2VBY2NvdW50LnB1YixcbiAgICAgICAgICBhbW91bnQ6IGludmFsaWRBbW91bnQsXG4gICAgICAgICAgdG9rZW5OYW1lOiBuYW1lVVNEQyxcbiAgICAgICAgfSlcbiAgICAgICkudGhyb3dFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGFtb3VudCwgZ290OiAnICsgaW52YWxpZEFtb3VudCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnU3VjZWVkIE5hdGl2ZSBhbmQgVG9rZW4gVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkIGEgdHJhbnNmZXIgdHggd2l0aCBib3RoIG5hdGl2ZSBhbmQgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2V0UHJpb3JpdHlGZWUocHJpb3JpdHlGZWUpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzFdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk5BVElWRV9BTkRfVE9LRU5fVFJBTlNGRVJWMl9VTlNJR05FRCk7XG4gICAgfSk7XG4gICAgaXQoJ2J1aWxkIGEgbXVsdGkgdHJhbnNmZXIgdHggd2l0aCBib3RoIG5hdGl2ZSBhbmQgbXVsdGlwbGUgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlclYyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5mZWVQYXllcihmZWVQYXllckFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsIGFtb3VudCwgdG9rZW5OYW1lOiBuYW1lVVNEQyB9KTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pO1xuICAgICAgdHhCdWlsZGVyLnNldFByaW9yaXR5RmVlKHByaW9yaXR5RmVlKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg0KTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYXV0aEFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogYXV0aEFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzWzJdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBhdXRoQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5pbnB1dHNbM10uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IGF1dGhBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCg0KTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0c1sxXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YixcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogbmFtZVVTREMsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMl0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IG90aGVyQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46IG5hbWVVU0RDLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzWzNdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBuYW1lVVNEQyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5NVUxUSV9OQVRJVkVfQU5EX1RPS0VOX1RSQU5TRkVSVjJfVU5TSUdORUQpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ0ZhaWwgTmF0aXZlIGFuZCBUb2tlbiBUcmFuc2ZlcicsICgpID0+IHtcbiAgICBpdCgnZm9yIGludmFsaWQgdG9BZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogaW52YWxpZFB1YktleSwgYW1vdW50LCB0b2tlbk5hbWU6IG5hbWVVU0RDIH0pKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCBvciBtaXNzaW5nIGFkZHJlc3MsIGdvdDogJyArIGludmFsaWRQdWJLZXlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGludmFsaWQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudCA9ICdyYW5kb21zdHJpbmcnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHJhbnNmZXJCdWlsZGVyVjIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHsgYWRkcmVzczogb3RoZXJBY2NvdW50LnB1YiwgYW1vdW50IH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBvdGhlckFjY291bnQucHViLCBhbW91bnQsIHRva2VuTmFtZTogbmFtZVVTREMgfSk7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgYW1vdW50OiBpbnZhbGlkQW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBhbW91bnQsIGdvdDogJyArIGludmFsaWRBbW91bnQpO1xuXG4gICAgICBjb25zdCBleGNlc3NpdmVUb2tlbkFtb3VudCA9ICcxODQ0Njc0NDA3MzcwOTU1MTYxNic7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgYW1vdW50OiBleGNlc3NpdmVUb2tlbkFtb3VudCxcbiAgICAgICAgICB0b2tlbk5hbWU6IG5hbWVVU0RDLFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKGBpbnB1dCBhbW91bnQgJHtleGNlc3NpdmVUb2tlbkFtb3VudH0gZXhjZWVkcyBiaWcgaW50IGxpbWl0IDE4NDQ2NzQ0MDczNzA5NTUxNjE1YCk7XG5cbiAgICAgIGNvbnN0IGV4Y2Vzc2l2ZUFtb3VudCA9ICc5MDA3MTk5MjU0NzQwOTkyJztcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IG5vbmNlQWNjb3VudC5wdWIsIGFtb3VudDogZXhjZXNzaXZlQW1vdW50IH0pKS50aHJvd0Vycm9yKFxuICAgICAgICBgaW5wdXQgYW1vdW50ICR7ZXhjZXNzaXZlQW1vdW50fSBleGNlZWRzIG1heCBzYWZlIGludCA5MDA3MTk5MjU0NzQwOTkxYFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|