@bitgo-beta/sdk-coin-eos 1.3.19-beta.162 → 1.3.19-beta.1621
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/eos.d.ts +6 -3
- package/dist/src/eos.d.ts.map +1 -1
- package/dist/src/eos.js +48 -26
- package/dist/src/eosToken.d.ts +3 -1
- package/dist/src/eosToken.d.ts.map +1 -1
- package/dist/src/eosToken.js +9 -3
- package/dist/src/eosutil/eosabiprovider.d.ts.map +1 -1
- package/dist/src/eosutil/eosabiprovider.js +15 -1
- package/dist/src/index.js +6 -2
- package/dist/src/lib/enum.js +3 -3
- package/dist/src/lib/keyPair.d.ts +1 -3
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +2 -5
- package/dist/src/lib/utils.d.ts +0 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +1 -1
- package/dist/test/fixtures.d.ts +317 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +377 -0
- package/dist/test/unit/eos.d.ts +2 -0
- package/dist/test/unit/eos.d.ts.map +1 -0
- package/dist/test/unit/eos.js +472 -0
- package/dist/test/unit/eosToken.d.ts +2 -0
- package/dist/test/unit/eosToken.d.ts.map +1 -0
- package/dist/test/unit/eosToken.js +222 -0
- package/dist/test/unit/stringTextDecoder.d.ts +5 -0
- package/dist/test/unit/stringTextDecoder.d.ts.map +1 -0
- package/dist/test/unit/stringTextDecoder.js +48 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -10
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -225
|
@@ -0,0 +1,472 @@
|
|
|
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
|
+
/**
|
|
40
|
+
* @prettier
|
|
41
|
+
*/
|
|
42
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
43
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
44
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
45
|
+
const secp256k1_1 = require("@bitgo-beta/secp256k1");
|
|
46
|
+
const ecc = __importStar(require("eosjs-ecc"));
|
|
47
|
+
const _ = __importStar(require("lodash"));
|
|
48
|
+
const should_1 = __importDefault(require("should"));
|
|
49
|
+
const sinon = __importStar(require("sinon"));
|
|
50
|
+
const src_1 = require("../../src");
|
|
51
|
+
const fixtures_1 = require("../fixtures");
|
|
52
|
+
const assert_1 = __importDefault(require("assert"));
|
|
53
|
+
describe('EOS:', function () {
|
|
54
|
+
let bitgo;
|
|
55
|
+
let basecoin;
|
|
56
|
+
before(function () {
|
|
57
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
58
|
+
bitgo.safeRegister('eos', src_1.Eos.createInstance);
|
|
59
|
+
bitgo.safeRegister('teos', src_1.Teos.createInstance);
|
|
60
|
+
bitgo.initializeTestVars();
|
|
61
|
+
basecoin = bitgo.coin('teos');
|
|
62
|
+
});
|
|
63
|
+
it('should get address details', function () {
|
|
64
|
+
let addressDetails = basecoin.getAddressDetails('i1skda3kso43');
|
|
65
|
+
addressDetails.address.should.equal('i1skda3kso43');
|
|
66
|
+
(0, should_1.default)(addressDetails.memoId).be.undefined();
|
|
67
|
+
addressDetails = basecoin.getAddressDetails('ks13k3hdui24?memoId=1');
|
|
68
|
+
addressDetails.address.should.equal('ks13k3hdui24');
|
|
69
|
+
addressDetails.memoId.should.equal('1');
|
|
70
|
+
(() => {
|
|
71
|
+
basecoin.getAddressDetails('ks13k3hdui24?memoId=1&memoId=2');
|
|
72
|
+
}).should.throw();
|
|
73
|
+
});
|
|
74
|
+
it('should get address details with alphanumeric memoid', function () {
|
|
75
|
+
const addressDetails = basecoin.getAddressDetails('i1skda3kso43?memoId=123abc');
|
|
76
|
+
addressDetails.address.should.equal('i1skda3kso43');
|
|
77
|
+
addressDetails.memoId.should.equal('123abc');
|
|
78
|
+
});
|
|
79
|
+
it('should validate address', function () {
|
|
80
|
+
basecoin.isValidAddress('i1skda3kso43').should.equal(true);
|
|
81
|
+
basecoin.isValidAddress('ks13kdh245ls').should.equal(true);
|
|
82
|
+
basecoin.isValidAddress('ks13k3hdui24?memoId=1').should.equal(true);
|
|
83
|
+
basecoin.isValidAddress('ks13k3hdui24?memoId=x').should.equal(true);
|
|
84
|
+
});
|
|
85
|
+
it('verifyAddress should work', async function () {
|
|
86
|
+
await basecoin.verifyAddress({
|
|
87
|
+
address: 'i1skda3kso43',
|
|
88
|
+
rootAddress: 'i1skda3kso43',
|
|
89
|
+
});
|
|
90
|
+
await basecoin.verifyAddress({
|
|
91
|
+
address: 'ks13kdh245ls?memoId=1',
|
|
92
|
+
rootAddress: 'ks13kdh245ls',
|
|
93
|
+
});
|
|
94
|
+
assert_1.default.rejects(basecoin.verifyAddress({ address: 'i1skda3kso43=x', rootAddress: 'i1skda3kso43' }));
|
|
95
|
+
assert_1.default.rejects(basecoin.verifyAddress({ address: 'i1skda3kso43?memoId=243432', rootAddress: 'ks13kdh245ls' }));
|
|
96
|
+
assert_1.default.rejects(basecoin.verifyAddress({ address: 'i1skda3kso43' }));
|
|
97
|
+
});
|
|
98
|
+
it('should generate valid random addresses', () => {
|
|
99
|
+
for (let i = 0; i < 100; i++) {
|
|
100
|
+
const address = basecoin.generateRandomAddress();
|
|
101
|
+
basecoin.isValidAddress(address).should.be.true();
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
it('isValidMemo should work', function () {
|
|
105
|
+
basecoin.isValidMemo({ value: '1' }).should.equal(true);
|
|
106
|
+
basecoin.isValidMemo({ value: 'uno' }).should.equal(true);
|
|
107
|
+
basecoin.isValidMemo({ value: fixtures_1.EosInputs.string257CharsLong }).should.equal(false);
|
|
108
|
+
});
|
|
109
|
+
it('isValidMemoId should work', function () {
|
|
110
|
+
basecoin.isValidMemoId('1').should.equal(true);
|
|
111
|
+
basecoin.isValidMemoId('123abc').should.equal(true);
|
|
112
|
+
basecoin.isValidMemoId(fixtures_1.EosInputs.string257CharsLong).should.equal(false);
|
|
113
|
+
});
|
|
114
|
+
it('should validate pub key', () => {
|
|
115
|
+
const { pub } = basecoin.keychains().create();
|
|
116
|
+
basecoin.isValidPub(pub).should.equal(true);
|
|
117
|
+
});
|
|
118
|
+
describe('Keypairs:', () => {
|
|
119
|
+
it('should generate a keypair from random seed', function () {
|
|
120
|
+
const keyPair = basecoin.generateKeyPair();
|
|
121
|
+
keyPair.should.have.property('pub');
|
|
122
|
+
keyPair.should.have.property('prv');
|
|
123
|
+
basecoin.isValidPub(keyPair.pub).should.equal(true);
|
|
124
|
+
basecoin.isValidPrv(keyPair.prv).should.equal(true);
|
|
125
|
+
});
|
|
126
|
+
it('should generate a keypair from seed', function () {
|
|
127
|
+
const seed = Buffer.from('c3b09c24731be2851b641d9d5b3f60fa129695c24071768d15654bea207b7bb6', 'hex');
|
|
128
|
+
const keyPair = basecoin.generateKeyPair(seed);
|
|
129
|
+
keyPair.pub.should.equal('xpub661MyMwAqRbcF2SUqUMiqxWGwaVX6sH4okTtX8jxJ1A14wfL8W7jZEoNE537JqSESXFpTcXCZahPz7RKQLpAEGsVp233dc5CffLSecpU13X');
|
|
130
|
+
keyPair.prv.should.equal('xprv9s21ZrQH143K2YN1jSpiUpZYPYf2hQZDSXYHikLLjfd2C9LBaxoV1SUtNnZGnXeyJ6uFWMbQTfjXqVfgNqRBw5yyaCtBK1AM8PF3XZtKjQp');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
it('should create unsigned recovery transaction without Bitgo', async function () {
|
|
134
|
+
const userKey = 'xpub661MyMwAqRbcH1oUADxatLuKkVjaDB2zTNJoZQsGVQEvoogpbXJw24QMokNwFKj9Qhci6KWaCcQKrzpL4LCQXXX3YpTQxgD9KLBjhDrUWo4';
|
|
135
|
+
const backupKey = 'xpub661MyMwAqRbcH1n6sgY29G7dAxL7twS8rt1jyuuQb1kfnA7s3FJPGoVqb9JenXkeJmC4jZ8iVscn3AH6MkYAVc61FTYCHpxv5cxWar5Jw3C';
|
|
136
|
+
const rootAddress = 'i1skda3kso43';
|
|
137
|
+
const destinationAddress = 'ks13kdh245ls';
|
|
138
|
+
// mock responses to the block chain
|
|
139
|
+
const sandBox = sinon.createSandbox();
|
|
140
|
+
const callBack = sandBox.stub(src_1.Eos.prototype, 'getDataFromNode');
|
|
141
|
+
callBack
|
|
142
|
+
.withArgs({
|
|
143
|
+
endpoint: '/v1/chain/get_account',
|
|
144
|
+
payload: { account_name: rootAddress },
|
|
145
|
+
})
|
|
146
|
+
.resolves(fixtures_1.EosResponses.getAccountResponseSuccess1);
|
|
147
|
+
callBack
|
|
148
|
+
.withArgs({
|
|
149
|
+
endpoint: '/v1/chain/get_account',
|
|
150
|
+
payload: { account_name: destinationAddress },
|
|
151
|
+
})
|
|
152
|
+
.resolves(fixtures_1.EosResponses.getAccountResponseSuccess2);
|
|
153
|
+
callBack
|
|
154
|
+
.withArgs({
|
|
155
|
+
endpoint: '/v1/chain/get_info',
|
|
156
|
+
})
|
|
157
|
+
.resolves(fixtures_1.EosResponses.getInfoResponseSuccess1);
|
|
158
|
+
callBack
|
|
159
|
+
.withArgs({
|
|
160
|
+
endpoint: '/v1/chain/get_block',
|
|
161
|
+
payload: { block_num_or_id: 191839472 },
|
|
162
|
+
})
|
|
163
|
+
.resolves(fixtures_1.EosResponses.getBlockResponseSuccess1);
|
|
164
|
+
// can create unsigned recovery transaction
|
|
165
|
+
const unsignedRecoveryTransaction = await basecoin.recover({
|
|
166
|
+
userKey,
|
|
167
|
+
backupKey,
|
|
168
|
+
bitgoKey: 'key',
|
|
169
|
+
recoveryDestination: destinationAddress,
|
|
170
|
+
rootAddress,
|
|
171
|
+
});
|
|
172
|
+
unsignedRecoveryTransaction.recoveryAmount.should.equal('5.0000');
|
|
173
|
+
unsignedRecoveryTransaction.transaction.signatures.length.should.equal(0);
|
|
174
|
+
// coin and txHex fields are expected during recovery of unsigned transaction using OVC
|
|
175
|
+
unsignedRecoveryTransaction.coin.should.equal('teos');
|
|
176
|
+
unsignedRecoveryTransaction.txHex.should.equal('2a02a0053e5a8cf73a56ba0fda11e4d92e0238a4a2aa74fccf46d5a9107468408cdcdb60f03cf4a9e53c000000000100a6823403ea3055000000572d3ccdcd013008c5709804717000000000a8ed3232213008c57098047170806321a22538028650c300000000000004454f530000000000000000000000000000000000000000000000000000000000000000000000000000');
|
|
177
|
+
// destination address and root address can include memoId
|
|
178
|
+
const unsignedRecoveryTransaction2 = await basecoin.recover({
|
|
179
|
+
userKey,
|
|
180
|
+
backupKey,
|
|
181
|
+
bitgoKey: 'key',
|
|
182
|
+
recoveryDestination: `${destinationAddress}?memoId=0`,
|
|
183
|
+
rootAddress: `${rootAddress}?memoId=0`,
|
|
184
|
+
});
|
|
185
|
+
unsignedRecoveryTransaction2.recoveryAmount.should.equal('5.0000');
|
|
186
|
+
unsignedRecoveryTransaction2.transaction.signatures.length.should.equal(0);
|
|
187
|
+
// coin and txHex fields are expected during recovery of unsigned transaction using OVC
|
|
188
|
+
unsignedRecoveryTransaction.coin.should.equal('teos');
|
|
189
|
+
unsignedRecoveryTransaction.txHex.should.equal('2a02a0053e5a8cf73a56ba0fda11e4d92e0238a4a2aa74fccf46d5a9107468408cdcdb60f03cf4a9e53c000000000100a6823403ea3055000000572d3ccdcd013008c5709804717000000000a8ed3232213008c57098047170806321a22538028650c300000000000004454f530000000000000000000000000000000000000000000000000000000000000000000000000000');
|
|
190
|
+
sandBox.restore();
|
|
191
|
+
});
|
|
192
|
+
describe('Transactions:', function () {
|
|
193
|
+
const testExplainTransaction = (input, expectedOutput) => async function () {
|
|
194
|
+
const explainedTransaction = await basecoin.explainTransaction(input);
|
|
195
|
+
should_1.default.exist(explainedTransaction);
|
|
196
|
+
explainedTransaction.should.deepEqual(expectedOutput);
|
|
197
|
+
};
|
|
198
|
+
it('should generate a valid transaction signature', async function () {
|
|
199
|
+
const signatureData = 'abcd';
|
|
200
|
+
const tx = {
|
|
201
|
+
txHex: signatureData,
|
|
202
|
+
headers: {
|
|
203
|
+
ref_block_num: 1,
|
|
204
|
+
ref_block_prefix: 'asd',
|
|
205
|
+
},
|
|
206
|
+
transaction: {
|
|
207
|
+
signatures: [],
|
|
208
|
+
packed_trx: signatureData,
|
|
209
|
+
compression: 'none',
|
|
210
|
+
},
|
|
211
|
+
recipients: [{}],
|
|
212
|
+
};
|
|
213
|
+
const seed = Buffer.from('c3b09c24731be2851b624d9d5b3f60fa129695c24071768d15654bea207b7bb6', 'hex');
|
|
214
|
+
const keyPair = basecoin.generateKeyPair(seed);
|
|
215
|
+
const { halfSigned } = await basecoin.signTransaction({ txPrebuild: tx, prv: keyPair.prv });
|
|
216
|
+
const signature = halfSigned.transaction.signatures[0];
|
|
217
|
+
const hdNode = secp256k1_1.bip32.fromBase58(keyPair.pub);
|
|
218
|
+
const eosPubkey = ecc.PublicKey.fromBuffer(hdNode.publicKey).toString();
|
|
219
|
+
ecc.verify(signature, Buffer.from(signatureData, 'hex'), eosPubkey).should.eql(true);
|
|
220
|
+
});
|
|
221
|
+
it('should explain an EOS transaction', async function () {
|
|
222
|
+
const explainTransactionParams = {
|
|
223
|
+
headers: {
|
|
224
|
+
ref_block_prefix: 100,
|
|
225
|
+
ref_block_num: 995,
|
|
226
|
+
expiration: '2018-04-27T18:40:34.000Z',
|
|
227
|
+
},
|
|
228
|
+
transaction: {
|
|
229
|
+
packed_trx: 'a26ee35ae30364000000000000000100a6823403ea3055000000572d3ccdcd019013e48c8ce5eed400000000a8ed3232229013e48c8ce5eed4b012362b61b31236640000000000000004454f5300000000013100',
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
const explainedTx = await basecoin.explainTransaction(explainTransactionParams);
|
|
233
|
+
explainedTx.outputAmount.should.equal('100');
|
|
234
|
+
explainedTx.outputs.length.should.equal(1);
|
|
235
|
+
explainedTx.outputs[0].amount.should.equal('100');
|
|
236
|
+
explainedTx.outputs[0].address.should.equal('asdfasdfasdf');
|
|
237
|
+
explainedTx.id.should.equal('6132f3bf4a746e6ecad8a31df67d71b4741fc5b7c868ae36dde18309a91df8a6');
|
|
238
|
+
explainedTx.memo.should.equal('1');
|
|
239
|
+
});
|
|
240
|
+
it('explains EOS native transfer transaction', testExplainTransaction(fixtures_1.EosInputs.explainTransactionInputNative, fixtures_1.EosResponses.explainTransactionOutputNative));
|
|
241
|
+
it('explains CHEX token transfer transaction', testExplainTransaction(fixtures_1.EosInputs.explainTransactionInputChex, fixtures_1.EosResponses.explainTransactionOutputChex));
|
|
242
|
+
it('explain EOS Unstake1 transaction', testExplainTransaction(fixtures_1.EosInputs.explainUnstakeInput1, fixtures_1.EosResponses.explainUnstakeOutput1));
|
|
243
|
+
it('explain EOS Unstake2 transaction', testExplainTransaction(fixtures_1.EosInputs.explainUnstakeInput2, fixtures_1.EosResponses.explainUnstakeOutput2));
|
|
244
|
+
it('explain EOS Refund transaction', testExplainTransaction(fixtures_1.EosInputs.explainRefundInput, fixtures_1.EosResponses.explainRefundOutput));
|
|
245
|
+
});
|
|
246
|
+
describe('Transaction Verification', function () {
|
|
247
|
+
let wallet;
|
|
248
|
+
let basecoin;
|
|
249
|
+
let verification;
|
|
250
|
+
let sandBox;
|
|
251
|
+
let newTxPrebuild;
|
|
252
|
+
let newTxParams;
|
|
253
|
+
before(async () => {
|
|
254
|
+
basecoin = bitgo.coin('teos');
|
|
255
|
+
const walletData = {
|
|
256
|
+
id: '5a78dd561c6258a907f1eeaee132f796',
|
|
257
|
+
users: [
|
|
258
|
+
{
|
|
259
|
+
user: '543c11ed356d00cb7600000b98794503',
|
|
260
|
+
permissions: ['admin', 'view', 'spend'],
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
coin: 'teos',
|
|
264
|
+
label: 'Verification Wallet',
|
|
265
|
+
m: 2,
|
|
266
|
+
n: 3,
|
|
267
|
+
keys: [
|
|
268
|
+
'5a78dd56bfe424aa07aa068651b194fd',
|
|
269
|
+
'5a78dd5674a70eb4079f58797dfe2f5e',
|
|
270
|
+
'5a78dd561c6258a907f1eea9f1d079e2',
|
|
271
|
+
],
|
|
272
|
+
tags: ['5a78dd561c6258a907f1eeaee132f796'],
|
|
273
|
+
disableTransactionNotifications: false,
|
|
274
|
+
freeze: {},
|
|
275
|
+
deleted: false,
|
|
276
|
+
approvalsRequired: 1,
|
|
277
|
+
isCold: true,
|
|
278
|
+
coinSpecific: {},
|
|
279
|
+
clientFlags: [],
|
|
280
|
+
balance: 650000000,
|
|
281
|
+
confirmedBalance: 650000000,
|
|
282
|
+
spendableBalance: 650000000,
|
|
283
|
+
balanceString: '650000000',
|
|
284
|
+
confirmedBalanceString: '650000000',
|
|
285
|
+
spendableBalanceString: '650000000',
|
|
286
|
+
receiveAddress: {
|
|
287
|
+
id: '5a78de2bbfe424aa07aa131ec03c8dc1',
|
|
288
|
+
address: '78xczhaijyhek2',
|
|
289
|
+
chain: 0,
|
|
290
|
+
index: 0,
|
|
291
|
+
coin: 'teos',
|
|
292
|
+
wallet: '5a78dd561c6258a907f1eeaee132f796',
|
|
293
|
+
coinSpecific: {},
|
|
294
|
+
},
|
|
295
|
+
pendingApprovals: [],
|
|
296
|
+
};
|
|
297
|
+
wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
|
|
298
|
+
const userKeychain = {
|
|
299
|
+
prv: '5KJq565HTrgEJG9EbvJH5BLYTgioAyY27dT9am1kCtn2YVAJEYK',
|
|
300
|
+
pub: 'EOS6g7AAMQkhXp8j73E8BD4KRwtQevEsFgYx8htaQkRVhhXJMgkMZ',
|
|
301
|
+
};
|
|
302
|
+
const backupKeychain = {
|
|
303
|
+
prv: '5KZ1nXXCi5yXH8AjCJqjnCYHCVnhQa9YWGV2D14i8g221dxNwLW',
|
|
304
|
+
pub: 'EOS7gyDLNk12faVb1aqNxj1L2DpBerFkhAsxBs95yW3yxJpqvg9Mt',
|
|
305
|
+
};
|
|
306
|
+
const txPrebuild = {
|
|
307
|
+
recipients: [
|
|
308
|
+
{
|
|
309
|
+
address: 'lionteste212',
|
|
310
|
+
amount: '1000',
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
headers: {
|
|
314
|
+
expiration: '2021-10-28T02:34:05.848',
|
|
315
|
+
ref_block_num: 42915,
|
|
316
|
+
ref_block_prefix: 1204086709,
|
|
317
|
+
},
|
|
318
|
+
txHex: '2a02a0053e5a8cf73a56ba0fda11e4d92e0238a4a2aa74fccf46d5a9107468401e0c7a61a3a7b5e7c4470000000100408c7a02ea3055000000000085269d00030233330100a6823403ea3055000000572d3ccdcd0120ceb8437333427c00000000a8ed32322220ceb8437333427c20825019ab3ca98be80300000000000004454f53000000000131000000000000000000000000000000000000000000000000000000000000000000',
|
|
319
|
+
transaction: {
|
|
320
|
+
compression: 'none',
|
|
321
|
+
packed_trx: '1e0c7a61a3a7b5e7c4470000000100408c7a02ea3055000000000085269d00030233330100a6823403ea3055000000572d3ccdcd0120ceb8437333427c00000000a8ed32322220ceb8437333427c20825019ab3ca98be80300000000000004454f5300000000013100',
|
|
322
|
+
signatures: [],
|
|
323
|
+
},
|
|
324
|
+
txid: '586c5b59b10b134d04c16ac1b273fe3c5529f34aef75db4456cd469c5cdac7e2',
|
|
325
|
+
isVotingTransaction: false,
|
|
326
|
+
coin: 'teos',
|
|
327
|
+
};
|
|
328
|
+
verification = {
|
|
329
|
+
disableNetworking: true,
|
|
330
|
+
keychains: {
|
|
331
|
+
user: { pub: userKeychain.pub },
|
|
332
|
+
backup: { pub: backupKeychain.pub },
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
const seed = Buffer.from('c3b09c24731be2851b624d9d5b3f60fa129695c24071768d15654bea207b7bb6', 'hex');
|
|
336
|
+
const keyPair = basecoin.generateKeyPair(seed);
|
|
337
|
+
const txParams = {
|
|
338
|
+
txPrebuild,
|
|
339
|
+
prv: keyPair.prv,
|
|
340
|
+
recipients: [
|
|
341
|
+
{
|
|
342
|
+
address: 'lionteste212?memoId=1',
|
|
343
|
+
amount: '1000',
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
};
|
|
347
|
+
newTxPrebuild = () => {
|
|
348
|
+
return _.cloneDeep(txPrebuild);
|
|
349
|
+
};
|
|
350
|
+
newTxParams = () => {
|
|
351
|
+
return _.cloneDeep(txParams);
|
|
352
|
+
};
|
|
353
|
+
});
|
|
354
|
+
beforeEach(async () => {
|
|
355
|
+
// mock responses to the block chain
|
|
356
|
+
sandBox = sinon.createSandbox();
|
|
357
|
+
const callBack = sandBox.stub(src_1.Eos.prototype, 'getDataFromNode');
|
|
358
|
+
callBack
|
|
359
|
+
.withArgs({
|
|
360
|
+
endpoint: '/v1/chain/get_info',
|
|
361
|
+
})
|
|
362
|
+
.resolves(fixtures_1.EosResponses.getInfoResponseSuccess1);
|
|
363
|
+
callBack
|
|
364
|
+
.withArgs({
|
|
365
|
+
endpoint: '/v1/chain/get_block',
|
|
366
|
+
payload: { block_num_or_id: 191839472 },
|
|
367
|
+
})
|
|
368
|
+
.resolves(fixtures_1.EosResponses.getBlockResponseSuccess1);
|
|
369
|
+
});
|
|
370
|
+
afterEach(async () => {
|
|
371
|
+
sandBox.restore();
|
|
372
|
+
});
|
|
373
|
+
it('should verify a transaction', async function () {
|
|
374
|
+
const txParams = newTxParams();
|
|
375
|
+
const txPrebuild = newTxPrebuild();
|
|
376
|
+
const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
|
|
377
|
+
validTransaction.should.equal(true);
|
|
378
|
+
});
|
|
379
|
+
it('should verify a transaction without a memoId', async function () {
|
|
380
|
+
const txPrebuild = newTxPrebuild();
|
|
381
|
+
// txParams with different txPrebuild
|
|
382
|
+
const txPrebuild2 = newTxPrebuild();
|
|
383
|
+
txPrebuild2.recipients[0].address = 'lionteste212';
|
|
384
|
+
const txParams = newTxParams();
|
|
385
|
+
txParams.txPrebuild = txPrebuild2;
|
|
386
|
+
const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
|
|
387
|
+
validTransaction.should.equal(true);
|
|
388
|
+
});
|
|
389
|
+
it('should throw if different prebuilds are provided in txParams and txPrebuild', async function () {
|
|
390
|
+
const txPrebuild = newTxPrebuild();
|
|
391
|
+
// txParams with different txPrebuild
|
|
392
|
+
const txPrebuild2 = newTxPrebuild();
|
|
393
|
+
txPrebuild2.recipients[0].address = 'sadjghaslsdgo';
|
|
394
|
+
const txParams = newTxParams();
|
|
395
|
+
txParams.txPrebuild = txPrebuild2;
|
|
396
|
+
await basecoin
|
|
397
|
+
.verifyTransaction({ txParams, txPrebuild, wallet, verification })
|
|
398
|
+
.should.be.rejectedWith('inputs txParams.txPrebuild and txPrebuild expected to be equal but were not');
|
|
399
|
+
});
|
|
400
|
+
it('should throw if unpacked txHex is not the same as the unpacked packed_trx', async function () {
|
|
401
|
+
const txPrebuild = newTxPrebuild();
|
|
402
|
+
txPrebuild.txHex =
|
|
403
|
+
'e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf9111111111111111111111111111111111640000000000000100408c7a02ea3055000000000085269d000201310100a6823403ea3055000000572d3ccdcd01d0f9ce64f437f7cf00000000a8ed323222d0f9ce64f437f7cfb012362b61b31236640000000000000004454f53000000000131000000000000000000000000000000000000000000000000000000000000000000';
|
|
404
|
+
const txParams = newTxParams();
|
|
405
|
+
txParams.txPrebuild = txPrebuild;
|
|
406
|
+
await basecoin
|
|
407
|
+
.verifyTransaction({ txParams, txPrebuild, wallet, verification })
|
|
408
|
+
.should.be.rejectedWith('unpacked packed_trx and unpacked txHex are not equal');
|
|
409
|
+
});
|
|
410
|
+
it('should throw if the expected amount is different than actual amount', async function () {
|
|
411
|
+
const txPrebuild = newTxPrebuild();
|
|
412
|
+
const txParams = newTxParams();
|
|
413
|
+
txParams.recipients[0].amount = 10000;
|
|
414
|
+
await basecoin
|
|
415
|
+
.verifyTransaction({ txParams, txPrebuild, wallet, verification })
|
|
416
|
+
.should.be.rejectedWith('txHex receive amount does not match expected recipient amount');
|
|
417
|
+
});
|
|
418
|
+
it('should throw if the expected recipient is different than actual recipient', async function () {
|
|
419
|
+
const txPrebuild = newTxPrebuild();
|
|
420
|
+
const txParams = newTxParams();
|
|
421
|
+
txParams.recipients[0].address = 'aaaaaaaaaaaa';
|
|
422
|
+
await basecoin
|
|
423
|
+
.verifyTransaction({ txParams, txPrebuild, wallet, verification })
|
|
424
|
+
.should.be.rejectedWith('txHex receive address does not match expected recipient address');
|
|
425
|
+
});
|
|
426
|
+
it('should throw if the expected memo is different than actual memo', async function () {
|
|
427
|
+
const txPrebuild = newTxPrebuild();
|
|
428
|
+
const txParams = newTxParams();
|
|
429
|
+
txParams.recipients[0].address = 'lionteste212?memoId=10';
|
|
430
|
+
await basecoin
|
|
431
|
+
.verifyTransaction({ txParams, txPrebuild, wallet, verification })
|
|
432
|
+
.should.be.rejectedWith('txHex receive memoId does not match expected recipient memoId');
|
|
433
|
+
});
|
|
434
|
+
it('should verify transaction with memo id in params only', async function () {
|
|
435
|
+
const txPrebuild = newTxPrebuild();
|
|
436
|
+
txPrebuild.headers = {
|
|
437
|
+
expiration: '2021-11-08T17:24:47.792',
|
|
438
|
+
ref_block_num: 1,
|
|
439
|
+
ref_block_prefix: 100,
|
|
440
|
+
};
|
|
441
|
+
// has memoid in the txaction with value of '1'
|
|
442
|
+
txPrebuild.txHex =
|
|
443
|
+
'e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473605d89610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd01001dd9f9a000a53d00000000a8ed323222001dd9f9a000a53d20825019ab3ca98be80300000000000004454f53000000000131000000000000000000000000000000000000000000000000000000000000000000';
|
|
444
|
+
txPrebuild.transaction.packed_trx =
|
|
445
|
+
'605d89610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd01001dd9f9a000a53d00000000a8ed323222001dd9f9a000a53d20825019ab3ca98be80300000000000004454f5300000000013100';
|
|
446
|
+
const txParams = newTxParams();
|
|
447
|
+
txParams.recipients[0].address = 'lionteste212';
|
|
448
|
+
txParams.txPrebuild = txPrebuild;
|
|
449
|
+
const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
|
|
450
|
+
validTransaction.should.equal(true);
|
|
451
|
+
});
|
|
452
|
+
it('should verify transaction with alpha numeric memo id params', async function () {
|
|
453
|
+
const txPrebuild = newTxPrebuild();
|
|
454
|
+
txPrebuild.headers = {
|
|
455
|
+
expiration: '2021-11-08T17:55:17.518',
|
|
456
|
+
ref_block_num: 1,
|
|
457
|
+
ref_block_prefix: 100,
|
|
458
|
+
};
|
|
459
|
+
// has memoid in the txaction with value of 'QG73WAXXG'
|
|
460
|
+
txPrebuild.txHex =
|
|
461
|
+
'e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473866489610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd013085b943b1b54ed700000000a8ed32322a3085b943b1b54ed720825019ab3ca98be80300000000000004454f530000000009514737335741585847000000000000000000000000000000000000000000000000000000000000000000';
|
|
462
|
+
txPrebuild.transaction.packed_trx =
|
|
463
|
+
'866489610100640000000000000100408c7a02ea3055000000000085269d000201300100a6823403ea3055000000572d3ccdcd013085b943b1b54ed700000000a8ed32322a3085b943b1b54ed720825019ab3ca98be80300000000000004454f53000000000951473733574158584700';
|
|
464
|
+
const txParams = newTxParams();
|
|
465
|
+
txParams.recipients[0].address = 'lionteste212';
|
|
466
|
+
txParams.txPrebuild = txPrebuild;
|
|
467
|
+
const validTransaction = await basecoin.verifyTransaction({ txParams, txPrebuild, wallet, verification });
|
|
468
|
+
validTransaction.should.equal(true);
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2Vvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsaURBQStDO0FBQy9DLG1EQUE4QztBQUM5QyxtREFBK0Q7QUFDL0QscURBQThDO0FBQzlDLCtDQUFpQztBQUNqQywwQ0FBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUMvQixtQ0FBc0M7QUFDdEMsMENBQXNEO0FBQ3RELG9EQUE0QjtBQUU1QixRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBUSxDQUFDO0lBRWIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFO1FBQy9CLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoRSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsSUFBQSxnQkFBTSxFQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxF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LEVBQUUsQ0FBQztnQkFDaEIsZ0JBQWdCLEVBQUUsR0FBRzthQUN0QixDQUFDO1lBQ0YsdURBQXVEO1lBQ3ZELFVBQVUsQ0FBQyxLQUFLO2dCQUNkLGtXQUFrVyxDQUFDO1lBQ3JXLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVTtnQkFDL0Isa09BQWtPLENBQUM7WUFDck8sTUFBTSxRQUFRLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDL0IsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO1lBQ2hELFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBRWpDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0ICogYXMgZWNjIGZyb20gJ2Vvc2pzLWVjYyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBFb3MsIFRlb3MgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgRW9zSW5wdXRzLCBFb3NSZXNwb25zZXMgfSBmcm9tICcuLi9maXh0dXJlcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmRlc2NyaWJlKCdFT1M6JywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdlb3MnLCBFb3MuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGVvcycsIFRlb3MuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVvcycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdldCBhZGRyZXNzIGRldGFpbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFkZHJlc3NEZXRhaWxzID0gYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoJ2kxc2tkYTNrc280MycpO1xuXG4gICAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcy5zaG91bGQuZXF1YWwoJ2kxc2tkYTNrc280MycpO1xuICAgIHNob3VsZChhZGRyZXNzRGV0YWlscy5tZW1vSWQpLmJlLnVuZGVmaW5lZCgpO1xuXG4gICAgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygna3MxM2szaGR1aTI0P21lbW9JZD0xJyk7XG4gICAgYWRkcmVzc0RldGFpbHMuYWRkcmVzcy5zaG91bGQuZXF1YWwoJ2tzMTNrM2hkdWkyNCcpO1xuICAgIGFkZHJlc3NEZXRhaWxzLm1lbW9JZC5zaG91bGQuZXF1YWwoJzEnKTtcblxuICAgICgoKSA9PiB7XG4gICAgICBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygna3MxM2szaGR1aTI0P21lbW9JZD0xJm1lbW9JZD0yJyk7XG4gICAgfSkuc2hvdWxkLnRocm93KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2V0IGFkZHJlc3MgZGV0YWlscyB3aXRoIGFscGhhbnVtZXJpYyBtZW1vaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnaTFza2RhM2tzbzQzP21lbW9JZD0xMjNhYmMnKTtcblxuICAgIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdpMXNrZGEza3NvNDMnKTtcbiAgICBhZGRyZXNzRGV0YWlscy5tZW1vSWQuc2hvdWxkLmVxdWFsKCcxMjNhYmMnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCdpMXNrZGEza3NvNDMnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ2tzMTNrZGgyNDVscycpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygna3MxM2szaGR1aTI0P21lbW9JZD0xJykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCdrczEzazNoZHVpMjQ/bWVtb0lkPXgnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCd2ZXJpZnlBZGRyZXNzIHNob3VsZCB3b3JrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGJhc2Vjb2luLnZlcmlmeUFkZHJlc3Moe1xuICAgICAgYWRkcmVzczogJ2kxc2tkYTNrc280MycsXG4gICAgICByb290QWRkcmVzczogJ2kxc2tkYTNrc280MycsXG4gICAgfSk7XG4gICAgYXdhaXQgYmFzZWNvaW4udmVyaWZ5QWRkcmVzcyh7XG4gICAgICBhZGRyZXNzOiAna3MxM2tkaDI0NWxzP21lbW9JZD0xJyxcbiAgICAgIHJvb3RBZGRyZXNzOiAna3MxM2tkaDI0NWxzJyxcbiAgICB9KTtcblxuICAgIGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAnaTFza2RhM2tzbzQzPXgnLCByb290QWRkcmVzczogJ2kxc2tkYTNrc280MycgfSkpO1xuICAgIGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAnaTFza2RhM2tzbzQzP21lbW9JZD0yNDM0MzInLCByb290QWRkcmVzczogJ2tzMTNrZGgyNDVscycgfSkpO1xuICAgIGFzc2VydC5yZWplY3RzKGJhc2Vjb2luLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAnaTFza2RhM2tzbzQzJyB9KSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgdmFsaWQgcmFuZG9tIGFkZHJlc3NlcycsICgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gYmFzZWNvaW4uZ2VuZXJhdGVSYW5kb21BZGRyZXNzKCk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRNZW1vIHNob3VsZCB3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vKHsgdmFsdWU6ICcxJyB9KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgYmFzZWNvaW4uaXNWYWxpZE1lbW8oeyB2YWx1ZTogJ3VubycgfSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vKHsgdmFsdWU6IEVvc0lucHV0cy5zdHJpbmcyNTdDaGFyc0xvbmcgfSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRNZW1vSWQgc2hvdWxkIHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnMScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcxMjNhYmMnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZChFb3NJbnB1dHMuc3RyaW5nMjU3Q2hhcnNMb25nKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIHB1YiBrZXknLCAoKSA9PiB7XG4gICAgY29uc3QgeyBwdWIgfSA9IGJhc2Vjb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIocHViKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXlwYWlyczonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIGtleXBhaXIgZnJvbSByYW5kb20gc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicpO1xuICAgICAga2V5UGFpci5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJ2Jyk7XG5cbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIoa2V5UGFpci5wdWIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRQcnYoa2V5UGFpci5wcnYpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBrZXlwYWlyIGZyb20gc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSBCdWZmZXIuZnJvbSgnYzNiMDljMjQ3MzFiZTI4NTFiNjQxZDlkNWIzZjYwZmExMjk2OTVjMjQwNzE3NjhkMTU2NTRiZWEyMDdiN2JiNicsICdoZXgnKTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoc2VlZCk7XG5cbiAgICAgIGtleVBhaXIucHViLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGMlNVcVVNaXF4V0d3YVZYNnNING9rVHRYOGp4SjFBMTR3Zkw4VzdqWkVvTkU1MzdKcVNFU1hGcFRjWENaYWhQejdSS1FMcEFFR3NWcDIzM2RjNUNmZkxTZWNwVTEzWCdcbiAgICAgICk7XG4gICAgICBrZXlQYWlyLnBydi5zaG91bGQuZXF1YWwoXG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLMllOMWpTcGlVcFpZUFlmMmhRWkRTWFlIaWtMTGpmZDJDOUxCYXhvVjFTVXROblpHblhleUo2dUZXTWJRVGZqWHFWZmdOcVJCdzV5eWFDdEJLMUFNOFBGM1hadEtqUXAnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNyZWF0ZSB1bnNpZ25lZCByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdGdvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJLZXkgPVxuICAgICAgJ3hwdWI2NjFNeU13QXFSYmNIMW9VQUR4YXRMdUtrVmphREIyelROSm9aUXNHVlFFdm9vZ3BiWEp3MjRRTW9rTndGS2o5UWhjaTZLV2FDY1FLcnpwTDRMQ1FYWFgzWXBUUXhnRDlLTEJqaERyVVdvNCc7XG4gICAgY29uc3QgYmFja3VwS2V5ID1cbiAgICAgICd4cHViNjYxTXlNd0FxUmJjSDFuNnNnWTI5RzdkQXhMN3R3UzhydDFqeXV1UWIxa2ZuQTdzM0ZKUEdvVnFiOUplblhrZUptQzRqWjhpVnNjbjNBSDZNa1lBVmM2MUZUWUNIcHh2NWN4V2FyNUp3M0MnO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gJ2kxc2tkYTNrc280Myc7XG4gICAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID0gJ2tzMTNrZGgyNDVscyc7XG5cbiAgICAvLyBtb2NrIHJlc3BvbnNlcyB0byB0aGUgYmxvY2sgY2hhaW5cbiAgICBjb25zdCBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGNvbnN0IGNhbGxCYWNrID0gc2FuZEJveC5zdHViKEVvcy5wcm90b3R5cGUsICdnZXREYXRhRnJvbU5vZGUnIGFzIGFueSk7XG4gICAgY2FsbEJhY2tcbiAgICAgIC53aXRoQXJncyh7XG4gICAgICAgIGVuZHBvaW50OiAnL3YxL2NoYWluL2dldF9hY2NvdW50JyxcbiAgICAgICAgcGF5bG9hZDogeyBhY2NvdW50X25hbWU6IHJvb3RBZGRyZXNzIH0sXG4gICAgICB9KVxuICAgICAgLnJlc29sdmVzKEVvc1Jlc3BvbnNlcy5nZXRBY2NvdW50UmVzcG9uc2VTdWNjZXNzMSk7XG4gICAgY2FsbEJhY2tcbiAgICAgIC53aXRoQXJncyh7XG4gICAgICAgIGVuZHBvaW50OiAnL3YxL2NoYWluL2dldF9hY2NvdW50JyxcbiAgICAgICAgcGF5bG9hZDogeyBhY2NvdW50X25hbWU6IGRlc3RpbmF0aW9uQWRkcmVzcyB9LFxuICAgICAgfSlcbiAgICAgIC5yZXNvbHZlcyhFb3NSZXNwb25zZXMuZ2V0QWNjb3VudFJlc3BvbnNlU3VjY2VzczIpO1xuICAgIGNhbGxCYWNrXG4gICAgICAud2l0aEFyZ3Moe1xuICAgICAgICBlbmRwb2ludDogJy92MS9jaGFpbi9nZXRfaW5mbycsXG4gICAgICB9KVxuICAgICAgLnJlc29sdmVzKEVvc1Jlc3BvbnNlcy5nZXRJbmZvUmVzcG9uc2VTdWNjZXNzMSk7XG4gICAgY2FsbEJhY2tcbiAgICAgIC53aXRoQXJncyh7XG4gICAgICAgIGVuZHBvaW50OiAnL3YxL2NoYWluL2dldF9ibG9jaycsXG4gICAgICAgIHBheWxvYWQ6IHsgYmxvY2tfbnVtX29yX2lkOiAxOTE4Mzk0NzIgfSxcbiAgICAgIH0pXG4gICAgICAucmVzb2x2ZXMoRW9zUmVzcG9uc2VzLmdldEJsb2NrUmVzcG9uc2VTdWNjZXNzMSk7XG5cbiAgICAvLyBjYW4gY3JlYXRlIHVuc2lnbmVkIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4ucmVjb3Zlcih7XG4gICAgICB1c2VyS2V5LFxuICAgICAgYmFja3VwS2V5LFxuICAgICAgYml0Z29LZXk6ICdrZXknLFxuICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgcm9vdEFkZHJlc3MsXG4gICAgfSk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLnJlY292ZXJ5QW1vdW50LnNob3VsZC5lcXVhbCgnNS4wMDAwJyk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uLnNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgIC8vIGNvaW4gYW5kIHR4SGV4IGZpZWxkcyBhcmUgZXhwZWN0ZWQgZHVyaW5nIHJlY292ZXJ5IG9mIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHVzaW5nIE9WQ1xuICAgIHVuc2lnbmVkUmVjb3ZlcnlUcmFuc2FjdGlvbi5jb2luLnNob3VsZC5lcXVhbCgndGVvcycpO1xuICAgIHVuc2lnbmVkUmVjb3ZlcnlUcmFuc2FjdGlvbi50eEhleC5zaG91bGQuZXF1YWwoXG4gICAgICAnMmEwMmEwMDUzZTVhOGNmNzNhNTZiYTBmZGExMWU0ZDkyZTAyMzhhNGEyYWE3NGZjY2Y0NmQ1YTkxMDc0Njg0MDhjZGNkYjYwZjAzY2Y0YTllNTNjMDAwMDAwMDAwMTAwYTY4MjM0MDNlYTMwNTUwMDAwMDA1NzJkM2NjZGNkMDEzMDA4YzU3MDk4MDQ3MTcwMDAwMDAwMDBhOGVkMzIzMjIxMzAwOGM1NzA5ODA0NzE3MDgwNjMyMWEyMjUzODAyODY1MGMzMDAwMDAwMDAwMDAwMDQ0NTRmNTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICk7XG5cbiAgICAvLyBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCByb290IGFkZHJlc3MgY2FuIGluY2x1ZGUgbWVtb0lkXG4gICAgY29uc3QgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uMiA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgdXNlcktleSxcbiAgICAgIGJhY2t1cEtleSxcbiAgICAgIGJpdGdvS2V5OiAna2V5JyxcbiAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IGAke2Rlc3RpbmF0aW9uQWRkcmVzc30/bWVtb0lkPTBgLFxuICAgICAgcm9vdEFkZHJlc3M6IGAke3Jvb3RBZGRyZXNzfT9tZW1vSWQ9MGAsXG4gICAgfSk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uMi5yZWNvdmVyeUFtb3VudC5zaG91bGQuZXF1YWwoJzUuMDAwMCcpO1xuICAgIHVuc2lnbmVkUmVjb3ZlcnlUcmFuc2FjdGlvbjIudHJhbnNhY3Rpb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgLy8gY29pbiBhbmQgdHhIZXggZmllbGRzIGFyZSBleHBlY3RlZCBkdXJpbmcgcmVjb3Zlcnkgb2YgdW5zaWduZWQgdHJhbnNhY3Rpb24gdXNpbmcgT1ZDXG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLmNvaW4uc2hvdWxkLmVxdWFsKCd0ZW9zJyk7XG4gICAgdW5zaWduZWRSZWNvdmVyeVRyYW5zYWN0aW9uLnR4SGV4LnNob3VsZC5lcXVhbChcbiAgICAgICcyYTAyYTAwNTNlNWE4Y2Y3M2E1NmJhMGZkYTExZTRkOTJlMDIzOGE0YTJhYTc0ZmNjZjQ2ZDVhOTEwNzQ2ODQwOGNkY2RiNjBmMDNjZjRhOWU1M2MwMDAwMDAwMDAxMDBhNjgyMzQwM2VhMzA1NTAwMDAwMDU3MmQzY2NkY2QwMTMwMDhjNTcwOTgwNDcxNzAwMDAwMDAwMGE4ZWQzMjMyMjEzMDA4YzU3MDk4MDQ3MTcwODA2MzIxYTIyNTM4MDI4NjUwYzMwMDAwMDAwMDAwMDAwNDQ1NGY1MzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gICAgKTtcblxuICAgIHNhbmRCb3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb25zOicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0ZXN0RXhwbGFpblRyYW5zYWN0aW9uID0gKGlucHV0LCBleHBlY3RlZE91dHB1dCkgPT5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oaW5wdXQpO1xuICAgICAgICBzaG91bGQuZXhpc3QoZXhwbGFpbmVkVHJhbnNhY3Rpb24pO1xuICAgICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkT3V0cHV0KTtcbiAgICAgIH07XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHZhbGlkIHRyYW5zYWN0aW9uIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZURhdGEgPSAnYWJjZCc7XG4gICAgICBjb25zdCB0eCA9IHtcbiAgICAgICAgdHhIZXg6IHNpZ25hdHVyZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICByZWZfYmxvY2tfbnVtOiAxLFxuICAgICAgICAgIHJlZl9ibG9ja19wcmVmaXg6ICdhc2QnLFxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2FjdGlvbjoge1xuICAgICAgICAgIHNpZ25hdHVyZXM6IFtdLFxuICAgICAgICAgIHBhY2tlZF90cng6IHNpZ25hdHVyZURhdGEsXG4gICAgICAgICAgY29tcHJlc3Npb246ICdub25lJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVjaXBpZW50czogW3t9XSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNlZWQgPSBCdWZmZXIuZnJvbSgnYzNiMDljMjQ3MzFiZTI4NTFiNjI0ZDlkNWIzZjYwZmExMjk2OTVjMjQwNzE3NjhkMTU2NTRiZWEyMDdiN2JiNicsICdoZXgnKTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoc2VlZCk7XG5cbiAgICAgIGNvbnN0IHsgaGFsZlNpZ25lZCB9ID0gYXdhaXQgYmFzZWNvaW4uc2lnblRyYW5zYWN0aW9uKHsgdHhQcmVidWlsZDogdHgsIHBydjoga2V5UGFpci5wcnYgfSk7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBoYWxmU2lnbmVkLnRyYW5zYWN0aW9uLnNpZ25hdHVyZXNbMF07XG4gICAgICBjb25zdCBoZE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGtleVBhaXIucHViKTtcbiAgICAgIGNvbnN0IGVvc1B1YmtleSA9IGVjYy5QdWJsaWNLZXkuZnJvbUJ1ZmZlcihoZE5vZGUucHVibGljS2V5KS50b1N0cmluZygpO1xuICAgICAgZWNjLnZlcmlmeShzaWduYXR1cmUsIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZURhdGEsICdoZXgnKSwgZW9zUHVia2V5KS5zaG91bGQuZXFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGFuIEVPUyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhaW5UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIHJlZl9ibG9ja19wcmVmaXg6IDEwMCxcbiAgICAgICAgICByZWZfYmxvY2tfbnVtOiA5OTUsXG4gICAgICAgICAgZXhwaXJhdGlvbjogJzIwMTgtMDQtMjdUMTg6NDA6MzQuMDAwWicsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgcGFja2VkX3RyeDpcbiAgICAgICAgICAgICdhMjZlZTM1YWUzMDM2NDAwMDAwMDAwMDAwMDAwMDEwMGE2ODIzNDAzZWEzMDU1MDAwMDAwNTcyZDNjY2RjZDAxOTAxM2U0OGM4Y2U1ZWVkNDAwMDAwMDAwYThlZDMyMzIyMjkwMTNlNDhjOGNlNWVlZDRiMDEyMzYyYjYxYjMxMjM2NjQwMDAwMDAwMDAwMDAwMDA0NDU0ZjUzMDAwMDAwMDAwMTMxMDAnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oZXhwbGFpblRyYW5zYWN0aW9uUGFyYW1zKTtcbiAgICAgIGV4cGxhaW5lZFR4Lm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgZXhwbGFpbmVkVHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgZXhwbGFpbmVkVHgub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIGV4cGxhaW5lZFR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ2FzZGZhc2RmYXNkZicpO1xuICAgICAgZXhwbGFpbmVkVHguaWQuc2hvdWxkLmVxdWFsKCc2MTMyZjNiZjRhNzQ2ZTZlY2FkOGEzMWRmNjdkNzFiNDc0MWZjNWI3Yzg2OGFlMzZkZGUxODMwOWE5MWRmOGE2Jyk7XG4gICAgICBleHBsYWluZWRUeC5tZW1vLnNob3VsZC5lcXVhbCgnMScpO1xuICAgIH0pO1xuICAgIGl0KFxuICAgICAgJ2V4cGxhaW5zIEVPUyBuYXRpdmUgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLFxuICAgICAgdGVzdEV4cGxhaW5UcmFuc2FjdGlvbihFb3NJbnB1dHMuZXhwbGFpblRyYW5zYWN0aW9uSW5wdXROYXRpdmUsIEVvc1Jlc3BvbnNlcy5leHBsYWluVHJhbnNhY3Rpb25PdXRwdXROYXRpdmUpXG4gICAgKTtcbiAgICBpdChcbiAgICAgICdleHBsYWlucyBDSEVYIHRva2VuIHRyYW5zZmVyIHRyYW5zYWN0aW9uJyxcbiAgICAgIHRlc3RFeHBsYWluVHJhbnNhY3Rpb24oRW9zSW5wdXRzLmV4cGxhaW5UcmFuc2FjdGlvbklucHV0Q2hleCwgRW9zUmVzcG9uc2VzLmV4cGxhaW5UcmFuc2FjdGlvbk91dHB1dENoZXgpXG4gICAgKTtcbiAgICBpdChcbiAgICAgICdleHBsYWluIEVPUyBVbnN0YWtlMSB0cmFuc2FjdGlvbicsXG4gICAgICB0ZXN0RXhwbGFpblRyYW5zYWN0aW9uKEVvc0lucHV0cy5leHBsYWluVW5zdGFrZUlucHV0MSwgRW9zUmVzcG9uc2VzLmV4cGxhaW5VbnN0YWtlT3V0cHV0MSlcbiAgICApO1xuICAgIGl0KFxuICAgICAgJ2V4cGxhaW4gRU9TIFVuc3Rha2UyIHRyYW5zYWN0aW9uJyxcbiAgICAgIHRlc3RFeHBsYWluVHJhbnNhY3Rpb24oRW9zSW5wdXRzLmV4cGxhaW5VbnN0YWtlSW5wdXQyLCBFb3NSZXNwb25zZXMuZXhwbGFpblVuc3Rha2VPdXRwdXQyKVxuICAgICk7XG4gICAgaXQoXG4gICAgICAnZXhwbGFpbiBFT1MgUmVmdW5kIHRyYW5zYWN0aW9uJyxcbiAgICAgIHRlc3RFeHBsYWluVHJhbnNhY3Rpb24oRW9zSW5wdXRzLmV4cGxhaW5SZWZ1bmRJbnB1dCwgRW9zUmVzcG9uc2VzLmV4cGxhaW5SZWZ1bmRPdXRwdXQpXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFZlcmlmaWNhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgd2FsbGV0O1xuICAgIGxldCBiYXNlY29pbjtcbiAgICBsZXQgdmVyaWZpY2F0aW9uO1xuICAgIGxldCBzYW5kQm94O1xuICAgIGxldCBuZXdUeFByZWJ1aWxkO1xuICAgIGxldCBuZXdUeFBhcmFtcztcblxuICAgIGJlZm9yZShhc3luYyAoKSA9PiB7XG4gICAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3Rlb3MnKTtcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNWE3OGRkNTYxYzYyNThhOTA3ZjFlZWFlZTEzMmY3OTYnLFxuICAgICAgICB1c2VyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXI6ICc1NDNjMTFlZDM1NmQwMGNiNzYwMDAwMGI5ODc5NDUwMycsXG4gICAgICAgICAgICBwZXJtaXNzaW9uczogWydhZG1pbicsICd2aWV3JywgJ3NwZW5kJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29pbjogJ3Rlb3MnLFxuICAgICAgICBsYWJlbDogJ1ZlcmlmaWNhdGlvbiBXYWxsZXQnLFxuICAgICAgICBtOiAyLFxuICAgICAgICBuOiAzLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzVhNzhkZDU2YmZlNDI0YWEwN2FhMDY4NjUxYjE5NGZkJyxcbiAgICAgICAgICAnNWE3OGRkNTY3NGE3MGViNDA3OWY1ODc5N2RmZTJmNWUnLFxuICAgICAgICAgICc1YTc4ZGQ1NjFjNjI1OGE5MDdmMWVlYTlmMWQwNzllMicsXG4gICAgICAgIF0sXG4gICAgICAgIHRhZ3M6IFsnNWE3OGRkNTYxYzYyNThhOTA3ZjFlZWFlZTEzMmY3OTYnXSxcbiAgICAgICAgZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9uczogZmFsc2UsXG4gICAgICAgIGZyZWV6ZToge30sXG4gICAgICAgIGRlbGV0ZWQ6IGZhbHNlLFxuICAgICAgICBhcHByb3ZhbHNSZXF1aXJlZDogMSxcbiAgICAgICAgaXNDb2xkOiB0cnVlLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgICAgICBjbGllbnRGbGFnczogW10sXG4gICAgICAgIGJhbGFuY2U6IDY1MDAwMDAwMCxcbiAgICAgICAgY29uZmlybWVkQmFsYW5jZTogNjUwMDAwMDAwLFxuICAgICAgICBzcGVuZGFibGVCYWxhbmNlOiA2NTAwMDAwMDAsXG4gICAgICAgIGJhbGFuY2VTdHJpbmc6ICc2NTAwMDAwMDAnLFxuICAgICAgICBjb25maXJtZWRCYWxhbmNlU3RyaW5nOiAnNjUwMDAwMDAwJyxcbiAgICAgICAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZzogJzY1MDAwMDAwMCcsXG4gICAgICAgIHJlY2VpdmVBZGRyZXNzOiB7XG4gICAgICAgICAgaWQ6ICc1YTc4ZGUyYmJmZTQyNGFhMDdhYTEzMWVjMDNjOGRjMScsXG4gICAgICAgICAgYWRkcmVzczogJzc4eGN6aGFpanloZWsyJyxcbiAgICAgICAgICBjaGFpbjogMCxcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICBjb2luOiAndGVvcycsXG4gICAgICAgICAgd2FsbGV0OiAnNWE3OGRkNTYxYzYyNThhOTA3ZjFlZWFlZTEzMmY3OTYnLFxuICAgICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHBlbmRpbmdBcHByb3ZhbHM6IFtdLFxuICAgICAgfTtcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB3YWxsZXREYXRhKTtcbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHtcbiAgICAgICAgcHJ2OiAnNUtKcTU2NUhUcmdFSkc5RWJ2Skg1QkxZVGdpb0F5WTI3ZFQ5YW0xa0N0bjJZVkFKRVlLJyxcbiAgICAgICAgcHViOiAnRU9TNmc3QUFNUWtoWHA4ajczRThCRDRLUnd0UWV2RXNGZ1l4OGh0YVFrUlZoaFhKTWdrTVonLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluID0ge1xuICAgICAgICBwcnY6ICc1S1oxblhYQ2k1eVhIOEFqQ0pxam5DWUhDVm5oUWE5WVdHVjJEMTRpOGcyMjFkeE53TFcnLFxuICAgICAgICBwdWI6ICdFT1M3Z3lETE5rMTJmYVZiMWFxTnhqMUwyRHBCZXJGa2hBc3hCczk1eVczeXhKcHF2ZzlNdCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdsaW9udGVzdGUyMTInLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGV4cGlyYXRpb246ICcyMDIxLTEwLTI4VDAyOjM0OjA1Ljg0OCcsXG4gICAgICAgICAgcmVmX2Jsb2NrX251bTogNDI5MTUsXG4gICAgICAgICAgcmVmX2Jsb2NrX3ByZWZpeDogMTIwNDA4NjcwOSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhIZXg6XG4gICAgICAgICAgJzJhMDJhMDA1M2U1YThjZjczYTU2YmEwZmRhMTFlNGQ5MmUwMjM4YTRhMmFhNzRmY2NmNDZkNWE5MTA3NDY4NDAxZTBjN2E2MWEzYTdiNWU3YzQ0NzAwMDAwMDAxMDA0MDhjN2EwMmVhMzA1NTAwMDAwMDAwMDA4NTI2OWQwMDAzMDIzMzMzMDEwMGE2ODIzNDAzZWEzMDU1MDAwMDAwNTcyZDNjY2RjZDAxMjBjZWI4NDM3MzMzNDI3YzAwMDAwMDAwYThlZDMyMzIyMjIwY2ViODQzNzMzMzQyN2MyMDgyNTAxOWFiM2NhOThiZTgwMzAwMDAwMDAwMDAwMDA0NDU0ZjUzMDAwMDAwMDAwMTMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgdHJhbnNhY3Rpb246IHtcbiAgICAgICAgICBjb21wcmVzc2lvbjogJ25vbmUnLFxuICAgICAgICAgIHBhY2tlZF90cng6XG4gICAgICAgICAgICAnMWUwYzdhNjFhM2E3YjVlN2M0NDcwMDAwMDAwMTAwNDA4YzdhMDJlYTMwNTUwMDAwMDAwMDAwODUyNjlkMDAwMzAyMzMzMzAxMDBhNjgyMzQwM2VhMzA1NTAwMDAwMDU3MmQzY2NkY2QwMTIwY2ViODQzNzMzMzQyN2MwMDAwMDAwMGE4ZWQzMjMyMjIyMGNlYjg0MzczMzM0MjdjMjA4MjUwMTlhYjNjYTk4YmU4MDMwMDAwMDAwMDAwMDAwNDQ1NGY1MzAwMDAwMDAwMDEzMTAwJyxcbiAgICAgICAgICBzaWduYXR1cmVzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhpZDogJzU4NmM1YjU5YjEwYjEzNGQwNGMxNmFjMWIyNzNmZTNjNTUyOWYzNGFlZjc1ZGI0NDU2Y2Q0NjljNWNkYWM3ZTInLFxuICAgICAgICBpc1ZvdGluZ1RyYW5zYWN0aW9uOiBmYWxzZSxcbiAgICAgICAgY29pbjogJ3Rlb3MnLFxuICAgICAgfTtcbiAgICAgIHZlcmlmaWNhdGlvbiA9IHtcbiAgICAgICAgZGlzYWJsZU5ldHdvcmtpbmc6IHRydWUsXG4gICAgICAgIGtleWNoYWluczoge1xuICAgICAgICAgIHVzZXI6IHsgcHViOiB1c2VyS2V5Y2hhaW4ucHViIH0sXG4gICAgICAgICAgYmFja3VwOiB7IHB1YjogYmFja3VwS2V5Y2hhaW4ucHViIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3Qgc2VlZCA9IEJ1ZmZlci5mcm9tKCdjM2IwOWMyNDczMWJlMjg1MWI2MjRkOWQ1YjNmNjBmYTEyOTY5NWMyNDA3MTc2OGQxNTY1NGJlYTIwN2I3YmI2JywgJ2hleCcpO1xuICAgICAgY29uc3Qga2V5UGFpciA9IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICBwcnY6IGtleVBhaXIucHJ2LFxuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ2xpb250ZXN0ZTIxMj9tZW1vSWQ9MScsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgbmV3VHhQcmVidWlsZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKHR4UHJlYnVpbGQpO1xuICAgICAgfTtcbiAgICAgIG5ld1R4UGFyYW1zID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXMpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gbW9jayByZXNwb25zZXMgdG8gdGhlIGJsb2NrIGNoYWluXG4gICAgICBzYW5kQm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgY29uc3QgY2FsbEJhY2sgPSBzYW5kQm94LnN0dWIoRW9zLnByb3RvdHlwZSwgJ2dldERhdGFGcm9tTm9kZScgYXMgYW55KTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgZW5kcG9pbnQ6ICcvdjEvY2hhaW4vZ2V0X2luZm8nLFxuICAgICAgICB9KVxuICAgICAgICAucmVzb2x2ZXMoRW9zUmVzcG9uc2VzLmdldEluZm9SZXNwb25zZVN1Y2Nlc3MxKTtcbiAgICAgIGNhbGxCYWNrXG4gICAgICAgIC53aXRoQXJncyh7XG4gICAgICAgICAgZW5kcG9pbnQ6ICcvdjEvY2hhaW4vZ2V0X2Jsb2NrJyxcbiAgICAgICAgICBwYXlsb2FkOiB7IGJsb2NrX251bV9vcl9pZDogMTkxODM5NDcyIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNvbHZlcyhFb3NSZXNwb25zZXMuZ2V0QmxvY2tSZXNwb25zZVN1Y2Nlc3MxKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICBzYW5kQm94LnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuICAgICAgY29uc3QgdmFsaWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pO1xuICAgICAgdmFsaWRUcmFuc2FjdGlvbi5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHRyYW5zYWN0aW9uIHdpdGhvdXQgYSBtZW1vSWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuXG4gICAgICAvLyB0eFBhcmFtcyB3aXRoIGRpZmZlcmVudCB0eFByZWJ1aWxkXG4gICAgICBjb25zdCB0eFByZWJ1aWxkMiA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIHR4UHJlYnVpbGQyLnJlY2lwaWVudHNbMF0uYWRkcmVzcyA9ICdsaW9udGVzdGUyMTInO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXMudHhQcmVidWlsZCA9IHR4UHJlYnVpbGQyO1xuXG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICB2YWxpZFRyYW5zYWN0aW9uLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgZGlmZmVyZW50IHByZWJ1aWxkcyBhcmUgcHJvdmlkZWQgaW4gdHhQYXJhbXMgYW5kIHR4UHJlYnVpbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eFByZWJ1aWxkID0gbmV3VHhQcmVidWlsZCgpO1xuXG4gICAgICAvLyB0eFBhcmFtcyB3aXRoIGRpZmZlcmVudCB0eFByZWJ1aWxkXG4gICAgICBjb25zdCB0eFByZWJ1aWxkMiA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIHR4UHJlYnVpbGQyLnJlY2lwaWVudHNbMF0uYWRkcmVzcyA9ICdzYWRqZ2hhc2xzZGdvJztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnR4UHJlYnVpbGQgPSB0eFByZWJ1aWxkMjtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdpbnB1dHMgdHhQYXJhbXMudHhQcmVidWlsZCBhbmQgdHhQcmVidWlsZCBleHBlY3RlZCB0byBiZSBlcXVhbCBidXQgd2VyZSBub3QnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdW5wYWNrZWQgdHhIZXggaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB1bnBhY2tlZCBwYWNrZWRfdHJ4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIHR4UHJlYnVpbGQudHhIZXggPVxuICAgICAgICAnZTcwYWFhYjg5OTdlMWRmY2U1OGZiZmFjODBjYmJiOGZlY2VjN2I5OWNmOTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTY0MDAwMDAwMDAwMDAwMDEwMDQwOGM3YTAyZWEzMDU1MDAwMDAwMDAwMDg1MjY5ZDAwMDIwMTMxMDEwMGE2ODIzNDAzZWEzMDU1MDAwMDAwNTcyZDNjY2RjZDAxZDBmOWNlNjRmNDM3ZjdjZjAwMDAwMDAwYThlZDMyMzIyMmQwZjljZTY0ZjQzN2Y3Y2ZiMDEyMzYyYjYxYjMxMjM2NjQwMDAwMDAwMDAwMDAwMDA0NDU0ZjUzMDAwMDAwMDAwMTMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnR4UHJlYnVpbGQgPSB0eFByZWJ1aWxkO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd1bnBhY2tlZCBwYWNrZWRfdHJ4IGFuZCB1bnBhY2tlZCB0eEhleCBhcmUgbm90IGVxdWFsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHRoZSBleHBlY3RlZCBhbW91bnQgaXMgZGlmZmVyZW50IHRoYW4gYWN0dWFsIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFtb3VudCA9IDEwMDAwO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHdhbGxldCwgdmVyaWZpY2F0aW9uIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd0eEhleCByZWNlaXZlIGFtb3VudCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCByZWNpcGllbnQgYW1vdW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHRoZSBleHBlY3RlZCByZWNpcGllbnQgaXMgZGlmZmVyZW50IHRoYW4gYWN0dWFsIHJlY2lwaWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3MgPSAnYWFhYWFhYWFhYWFhJztcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgndHhIZXggcmVjZWl2ZSBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHJlY2lwaWVudCBhZGRyZXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHRoZSBleHBlY3RlZCBtZW1vIGlzIGRpZmZlcmVudCB0aGFuIGFjdHVhbCBtZW1vJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyA9ICdsaW9udGVzdGUyMTI/bWVtb0lkPTEwJztcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgndHhIZXggcmVjZWl2ZSBtZW1vSWQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgcmVjaXBpZW50IG1lbW9JZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCBtZW1vIGlkIGluIHBhcmFtcyBvbmx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcblxuICAgICAgdHhQcmVidWlsZC5oZWFkZXJzID0ge1xuICAgICAgICBleHBpcmF0aW9uOiAnMjAyMS0xMS0wOFQxNzoyNDo0Ny43OTInLFxuICAgICAgICByZWZfYmxvY2tfbnVtOiAxLFxuICAgICAgICByZWZfYmxvY2tfcHJlZml4OiAxMDAsXG4gICAgICB9O1xuICAgICAgLy8gaGFzIG1lbW9pZCBpbiB0aGUgdHhhY3Rpb24gd2l0aCB2YWx1ZSBvZiAnMSdcbiAgICAgIHR4UHJlYnVpbGQudHhIZXggPVxuICAgICAgICAnZTcwYWFhYjg5OTdlMWRmY2U1OGZiZmFjODBjYmJiOGZlY2VjN2I5OWNmOTgyYTk0NDQyNzNjYmM2NGM0MTQ3MzYwNWQ4OTYxMDEwMDY0MDAwMDAwMDAwMDAwMDEwMDQwOGM3YTAyZWEzMDU1MDAwMDAwMDAwMDg1MjY5ZDAwMDIwMTMwMDEwMGE2ODIzNDAzZWEzMDU1MDAwMDAwNTcyZDNjY2RjZDAxMDAxZGQ5ZjlhMDAwYTUzZDAwMDAwMDAwYThlZDMyMzIyMjAwMWRkOWY5YTAwMGE1M2QyMDgyNTAxOWFiM2NhOThiZTgwMzAwMDAwMDAwMDAwMDA0NDU0ZjUzMDAwMDAwMDAwMTMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICAgIHR4UHJlYnVpbGQudHJhbnNhY3Rpb24ucGFja2VkX3RyeCA9XG4gICAgICAgICc2MDVkODk2MTAxMDA2NDAwMDAwMDAwMDAwMDAxMDA0MDhjN2EwMmVhMzA1NTAwMDAwMDAwMDA4NTI2OWQwMDAyMDEzMDAxMDBhNjgyMzQwM2VhMzA1NTAwMDAwMDU3MmQzY2NkY2QwMTAwMWRkOWY5YTAwMGE1M2QwMDAwMDAwMGE4ZWQzMjMyMjIwMDFkZDlmOWEwMDBhNTNkMjA4MjUwMTlhYjNjYTk4YmU4MDMwMDAwMDAwMDAwMDAwNDQ1NGY1MzAwMDAwMDAwMDEzMTAwJztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyA9ICdsaW9udGVzdGUyMTInO1xuICAgICAgdHhQYXJhbXMudHhQcmVidWlsZCA9IHR4UHJlYnVpbGQ7XG5cbiAgICAgIGNvbnN0IHZhbGlkVHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiB9KTtcbiAgICAgIHZhbGlkVHJhbnNhY3Rpb24uc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCBhbHBoYSBudW1lcmljIG1lbW8gaWQgcGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcblxuICAgICAgdHhQcmVidWlsZC5oZWFkZXJzID0ge1xuICAgICAgICBleHBpcmF0aW9uOiAnMjAyMS0xMS0wOFQxNzo1NToxNy41MTgnLFxuICAgICAgICByZWZfYmxvY2tfbnVtOiAxLFxuICAgICAgICByZWZfYmxvY2tfcHJlZml4OiAxMDAsXG4gICAgICB9O1xuICAgICAgLy8gaGFzIG1lbW9pZCBpbiB0aGUgdHhhY3Rpb24gd2l0aCB2YWx1ZSBvZiAnUUc3M1dBWFhHJ1xuICAgICAgdHhQcmVidWlsZC50eEhleCA9XG4gICAgICAgICdlNzBhYWFiODk5N2UxZGZjZTU4ZmJmYWM4MGNiYmI4ZmVjZWM3Yjk5Y2Y5ODJhOTQ0NDI3M2NiYzY0YzQxNDczODY2NDg5NjEwMTAwNjQwMDAwMDAwMDAwMDAwMTAwNDA4YzdhMDJlYTMwNTUwMDAwMDAwMDAwODUyNjlkMDAwMjAxMzAwMTAwYTY4MjM0MDNlYTMwNTUwMDAwMDA1NzJkM2NjZGNkMDEzMDg1Yjk0M2IxYjU0ZWQ3MDAwMDAwMDBhOGVkMzIzMjJhMzA4NWI5NDNiMWI1NGVkNzIwODI1MDE5YWIzY2E5OGJlODAzMDAwMDAwMDAwMDAwMDQ0NTRmNTMwMDAwMDAwMDA5NTE0NzM3MzM1NzQxNTg1ODQ3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICAgIHR4UHJlYnVpbGQudHJhbnNhY3Rpb24ucGFja2VkX3RyeCA9XG4gICAgICAgICc4NjY0ODk2MTAxMDA2NDAwMDAwMDAwMDAwMDAxMDA0MDhjN2EwMmVhMzA1NTAwMDAwMDAwMDA4NTI2OWQwMDAyMDEzMDAxMDBhNjgyMzQwM2VhMzA1NTAwMDAwMDU3MmQzY2NkY2QwMTMwODViOTQzYjFiNTRlZDcwMDAwMDAwMGE4ZWQzMjMyMmEzMDg1Yjk0M2IxYjU0ZWQ3MjA4MjUwMTlhYjNjYTk4YmU4MDMwMDAwMDAwMDAwMDAwNDQ1NGY1MzAwMDAwMDAwMDk1MTQ3MzczMzU3NDE1ODU4NDcwMCc7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IG5ld1R4UGFyYW1zKCk7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3MgPSAnbGlvbnRlc3RlMjEyJztcbiAgICAgIHR4UGFyYW1zLnR4UHJlYnVpbGQgPSB0eFByZWJ1aWxkO1xuXG4gICAgICBjb25zdCB2YWxpZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gfSk7XG4gICAgICB2YWxpZFRyYW5zYWN0aW9uLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eosToken.d.ts","sourceRoot":"","sources":["../../../test/unit/eosToken.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|