@bitgo-beta/sdk-coin-avaxc 2.2.3-alpha.44 → 2.2.3-alpha.441
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/avaxc.d.ts +46 -17
- package/dist/src/avaxc.d.ts.map +1 -1
- package/dist/src/avaxc.js +221 -86
- package/dist/src/avaxcToken.d.ts +1 -1
- package/dist/src/avaxcToken.d.ts.map +1 -1
- package/dist/src/avaxcToken.js +3 -3
- package/dist/src/iface.d.ts +6 -3
- package/dist/src/iface.d.ts.map +1 -1
- package/dist/src/iface.js +1 -1
- package/dist/src/index.js +6 -2
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.js +10 -11
- package/dist/src/lib/transactionBuilder.js +2 -2
- package/dist/src/lib/utils.d.ts +2 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +31 -10
- package/dist/test/resources/avaxc.d.ts +122 -0
- package/dist/test/resources/avaxc.d.ts.map +1 -0
- package/dist/test/resources/avaxc.js +137 -0
- package/dist/test/unit/avaxc.d.ts +2 -0
- package/dist/test/unit/avaxc.d.ts.map +1 -0
- package/dist/test/unit/avaxc.js +1104 -0
- package/dist/test/unit/avaxcToken.d.ts +2 -0
- package/dist/test/unit/avaxcToken.d.ts.map +1 -0
- package/dist/test/unit/avaxcToken.js +68 -0
- package/dist/test/unit/getBuilder.d.ts +3 -0
- package/dist/test/unit/getBuilder.d.ts.map +1 -0
- package/dist/test/unit/getBuilder.js +10 -0
- package/dist/test/unit/helpers.d.ts +15 -0
- package/dist/test/unit/helpers.d.ts.map +1 -0
- package/dist/test/unit/helpers.js +54 -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 +135 -0
- package/dist/test/unit/transactionBuilder/transfer.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transfer.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transfer.js +223 -0
- package/dist/test/unit/transactionBuilder/walletInitializationBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitializationBuilder.js +174 -0
- package/dist/test/unit/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transferBuilder.js +119 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +235 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +22 -16
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -135
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
+
const avaxc_1 = require("../resources/avaxc");
|
|
10
|
+
const utils_1 = require("../../src/lib/utils");
|
|
11
|
+
const getBuilder_1 = require("./getBuilder");
|
|
12
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
13
|
+
const src_1 = require("../../src");
|
|
14
|
+
const sdk_coin_eth_1 = require("@bitgo-beta/sdk-coin-eth");
|
|
15
|
+
describe('AVAX util library', () => {
|
|
16
|
+
describe('keys validations success cases', () => {
|
|
17
|
+
it('validate valid eth private key', () => {
|
|
18
|
+
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey), true);
|
|
19
|
+
});
|
|
20
|
+
it('validate valid eth public key', () => {
|
|
21
|
+
should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey), true);
|
|
22
|
+
});
|
|
23
|
+
it('validate valid eth address', () => {
|
|
24
|
+
should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress), true);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('keys validations failure cases', () => {
|
|
28
|
+
it('validate empty eth private key', () => {
|
|
29
|
+
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(''), false);
|
|
30
|
+
});
|
|
31
|
+
it('validate empty eth public key', () => {
|
|
32
|
+
should_1.default.equal((0, utils_1.isValidEthPublicKey)(''), false);
|
|
33
|
+
});
|
|
34
|
+
it('validate empty eth address', () => {
|
|
35
|
+
should_1.default.equal((0, utils_1.isValidEthAddress)(''), false);
|
|
36
|
+
});
|
|
37
|
+
it('validate eth private key too short', () => {
|
|
38
|
+
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey.slice(1)), false);
|
|
39
|
+
});
|
|
40
|
+
it('validate eth public key too short', () => {
|
|
41
|
+
should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey.slice(1)), false);
|
|
42
|
+
});
|
|
43
|
+
it('validate eth address too short', () => {
|
|
44
|
+
should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress.slice(1)), false);
|
|
45
|
+
});
|
|
46
|
+
it('validate eth private key too long', () => {
|
|
47
|
+
should_1.default.equal((0, utils_1.isValidEthPrivateKey)(avaxc_1.TEST_ACCOUNT.ethPrivateKey + '00'), false);
|
|
48
|
+
});
|
|
49
|
+
it('validate eth public key too long', () => {
|
|
50
|
+
should_1.default.equal((0, utils_1.isValidEthPublicKey)(avaxc_1.TEST_ACCOUNT.ethUncompressedPublicKey + '00'), false);
|
|
51
|
+
});
|
|
52
|
+
it('validate eth address too long', () => {
|
|
53
|
+
should_1.default.equal((0, utils_1.isValidEthAddress)(avaxc_1.TEST_ACCOUNT.ethAddress + '00'), false);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('sign success cases', () => {
|
|
57
|
+
let txBuilder;
|
|
58
|
+
const contractAddress = avaxc_1.TEST_ACCOUNT.ethAddress;
|
|
59
|
+
const initTxBuilder = () => {
|
|
60
|
+
txBuilder = (0, getBuilder_1.getBuilder)('tavaxc');
|
|
61
|
+
txBuilder.fee({
|
|
62
|
+
fee: '280000000000',
|
|
63
|
+
gasLimit: '7000000',
|
|
64
|
+
});
|
|
65
|
+
txBuilder.counter(1);
|
|
66
|
+
txBuilder.type(sdk_core_1.TransactionType.Send);
|
|
67
|
+
txBuilder.contract(contractAddress);
|
|
68
|
+
txBuilder.transfer().amount('10000').to(avaxc_1.TEST_ACCOUNT_2.ethAddress).contractSequenceId(1);
|
|
69
|
+
};
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
initTxBuilder();
|
|
72
|
+
});
|
|
73
|
+
it('sign a valid txData with valid KeyPair', async () => {
|
|
74
|
+
const tx = await txBuilder.build();
|
|
75
|
+
const txData = tx.toJson();
|
|
76
|
+
should_1.default.not.exists(txData.r);
|
|
77
|
+
should_1.default.not.exists(txData.s);
|
|
78
|
+
should_1.default.equal(txData.v, '0x0150f5');
|
|
79
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
80
|
+
const signedTx = await (0, utils_1.sign)(txData, keyPair);
|
|
81
|
+
const txBuilder2 = (0, getBuilder_1.getBuilder)('tavaxc');
|
|
82
|
+
txBuilder2.from(signedTx);
|
|
83
|
+
const tx2 = await txBuilder2.build();
|
|
84
|
+
const tx2Data = tx2.toJson();
|
|
85
|
+
should_1.default.exists(tx2Data.r);
|
|
86
|
+
should_1.default.exists(tx2Data.s);
|
|
87
|
+
should_1.default.exists(tx2Data.v);
|
|
88
|
+
tx2Data.r.length.should.be.above(0);
|
|
89
|
+
tx2Data.s.length.should.be.above(0);
|
|
90
|
+
tx2Data.v.length.should.be.above(0);
|
|
91
|
+
});
|
|
92
|
+
it('sign txData with gasLimit set as number', async () => {
|
|
93
|
+
const txData = {
|
|
94
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
95
|
+
data: '',
|
|
96
|
+
gasLimit: '1',
|
|
97
|
+
gasPrice: '0x0',
|
|
98
|
+
nonce: 1,
|
|
99
|
+
value: '0',
|
|
100
|
+
};
|
|
101
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
102
|
+
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
|
|
103
|
+
});
|
|
104
|
+
it('sign txData with gasPrice set as number', async () => {
|
|
105
|
+
const txData = {
|
|
106
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
107
|
+
data: '',
|
|
108
|
+
gasLimit: '0x1',
|
|
109
|
+
gasPrice: '1',
|
|
110
|
+
nonce: 1,
|
|
111
|
+
value: '0',
|
|
112
|
+
};
|
|
113
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
114
|
+
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
|
|
115
|
+
});
|
|
116
|
+
it('sign txData with hex gasLimit and gasPrice values', async () => {
|
|
117
|
+
const txData = {
|
|
118
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
119
|
+
data: '',
|
|
120
|
+
gasLimit: '0x1',
|
|
121
|
+
gasPrice: '0x1',
|
|
122
|
+
nonce: 1,
|
|
123
|
+
value: '0',
|
|
124
|
+
};
|
|
125
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
126
|
+
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
|
|
127
|
+
});
|
|
128
|
+
it('sign txData with nonce zero', async () => {
|
|
129
|
+
const txData = {
|
|
130
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
131
|
+
data: '',
|
|
132
|
+
gasLimit: '0x1',
|
|
133
|
+
gasPrice: '0x1',
|
|
134
|
+
nonce: 0,
|
|
135
|
+
value: '0',
|
|
136
|
+
};
|
|
137
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
138
|
+
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
|
|
139
|
+
});
|
|
140
|
+
it('sign txData with value set as number', async () => {
|
|
141
|
+
const txData = {
|
|
142
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
143
|
+
data: '',
|
|
144
|
+
gasLimit: '0x1',
|
|
145
|
+
gasPrice: '0x1',
|
|
146
|
+
nonce: 0,
|
|
147
|
+
value: '0',
|
|
148
|
+
};
|
|
149
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
150
|
+
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
|
|
151
|
+
});
|
|
152
|
+
it('sign txData with value set as hex', async () => {
|
|
153
|
+
const txData = {
|
|
154
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
155
|
+
data: '',
|
|
156
|
+
gasLimit: '0x1',
|
|
157
|
+
gasPrice: '0x1',
|
|
158
|
+
nonce: 0,
|
|
159
|
+
value: '0x0',
|
|
160
|
+
};
|
|
161
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
162
|
+
(0, utils_1.sign)(txData, keyPair).should.be.fulfilled();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('sign failure cases', () => {
|
|
166
|
+
it('sign txData with invalid gasLimit', async () => {
|
|
167
|
+
const txData = {
|
|
168
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
169
|
+
data: '',
|
|
170
|
+
gasLimit: '',
|
|
171
|
+
gasPrice: '0x0',
|
|
172
|
+
nonce: 1,
|
|
173
|
+
value: '0',
|
|
174
|
+
};
|
|
175
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
176
|
+
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
|
|
177
|
+
});
|
|
178
|
+
it('sign txData with invalid gasPrice', async () => {
|
|
179
|
+
const txData = {
|
|
180
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
181
|
+
data: '',
|
|
182
|
+
gasLimit: '0x0',
|
|
183
|
+
gasPrice: '',
|
|
184
|
+
nonce: 1,
|
|
185
|
+
value: '0',
|
|
186
|
+
};
|
|
187
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
188
|
+
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
|
|
189
|
+
});
|
|
190
|
+
it('sign txData with invalid nonce', async () => {
|
|
191
|
+
const txData = {
|
|
192
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
193
|
+
data: '',
|
|
194
|
+
gasLimit: '0x0',
|
|
195
|
+
gasPrice: '0x0',
|
|
196
|
+
nonce: -1,
|
|
197
|
+
value: '0',
|
|
198
|
+
};
|
|
199
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
200
|
+
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
|
|
201
|
+
});
|
|
202
|
+
it('sign txData with invalid value', async () => {
|
|
203
|
+
const txData = {
|
|
204
|
+
_type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
|
|
205
|
+
data: '',
|
|
206
|
+
gasLimit: '0x0',
|
|
207
|
+
gasPrice: '0x0',
|
|
208
|
+
nonce: 1,
|
|
209
|
+
value: '',
|
|
210
|
+
};
|
|
211
|
+
const keyPair = new src_1.KeyPair({ prv: avaxc_1.TEST_ACCOUNT_2.ethPrivateKey });
|
|
212
|
+
(0, utils_1.sign)(txData, keyPair).should.be.rejectedWith(new RegExp('Cannot convert string to buffer.+'));
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
describe('network common configuration', () => {
|
|
216
|
+
it('getCommon for mainnet', () => {
|
|
217
|
+
const common = (0, utils_1.getCommon)(statics_1.NetworkType.MAINNET);
|
|
218
|
+
should_1.default.equal(common.chainName(), 'mainnet');
|
|
219
|
+
should_1.default.equal(common.hardfork(), 'london');
|
|
220
|
+
should_1.default.equal(common.chainIdBN().toString(), '43114');
|
|
221
|
+
should_1.default.equal(common.networkIdBN().toString(), '1');
|
|
222
|
+
});
|
|
223
|
+
it('getCommon for testnet', () => {
|
|
224
|
+
const common = (0, utils_1.getCommon)(statics_1.NetworkType.TESTNET);
|
|
225
|
+
should_1.default.equal(common.chainName(), 'fuji');
|
|
226
|
+
should_1.default.equal(common.hardfork(), 'london');
|
|
227
|
+
should_1.default.equal(common.chainIdBN().toString(), '43113');
|
|
228
|
+
should_1.default.equal(common.networkIdBN().toString(), '1');
|
|
229
|
+
});
|
|
230
|
+
it('getCommon for invalid network', () => {
|
|
231
|
+
assert_1.default.throws(() => (0, utils_1.getCommon)('invalidNetwork'), (e) => e.message === 'Missing network common configuration');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixpREFBa0Q7QUFDbEQsOENBQWtFO0FBQ2xFLCtDQUFvSDtBQUVwSCw2Q0FBMEM7QUFDMUMsbURBQXVEO0FBQ3ZELG1DQUF3RDtBQUN4RCwyREFBc0U7QUFFdEUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSw0QkFBb0IsRUFBQyxvQkFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtZQUN2QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFBLDJCQUFtQixFQUFDLG9CQUFZLENBQUMsd0JBQXdCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7WUFDcEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSx5QkFBaUIsRUFBQyxvQkFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBQSw0QkFBb0IsRUFBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENB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RUFBQyxnQkFBK0IsQ0FBQyxFQUNoRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxzQ0FBc0MsQ0FDakUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IE5ldHdvcmtUeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBURVNUX0FDQ09VTlQsIFRFU1RfQUNDT1VOVF8yIH0gZnJvbSAnLi4vcmVzb3VyY2VzL2F2YXhjJztcbmltcG9ydCB7IGlzVmFsaWRFdGhBZGRyZXNzLCBpc1ZhbGlkRXRoUHJpdmF0ZUtleSwgaXNWYWxpZEV0aFB1YmxpY0tleSwgc2lnbiwgZ2V0Q29tbW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmltcG9ydCB7IGdldEJ1aWxkZXIgfSBmcm9tICcuL2dldEJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgS2V5UGFpciwgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IEVUSFRyYW5zYWN0aW9uVHlwZSwgVHhEYXRhIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvaW4tZXRoJztcblxuZGVzY3JpYmUoJ0FWQVggdXRpbCBsaWJyYXJ5JywgKCkgPT4ge1xuICBkZXNjcmliZSgna2V5cyB2YWxpZGF0aW9ucyBzdWNjZXNzIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFByaXZhdGVLZXkoVEVTVF9BQ0NPVU5ULmV0aFByaXZhdGVLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggcHVibGljIGtleScsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHVibGljS2V5KFRFU1RfQUNDT1VOVC5ldGhVbmNvbXByZXNzZWRQdWJsaWNLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSB2YWxpZCBldGggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcyhURVNUX0FDQ09VTlQuZXRoQWRkcmVzcyksIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgna2V5cyB2YWxpZGF0aW9ucyBmYWlsdXJlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd2YWxpZGF0ZSBlbXB0eSBldGggcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFByaXZhdGVLZXkoJycpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZW1wdHkgZXRoIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFB1YmxpY0tleSgnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBlbXB0eSBldGggYWRkcmVzcycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcygnJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggcHJpdmF0ZSBrZXkgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKGlzVmFsaWRFdGhQcml2YXRlS2V5KFRFU1RfQUNDT1VOVC5ldGhQcml2YXRlS2V5LnNsaWNlKDEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBwdWJsaWMga2V5IHRvbyBzaG9ydCcsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHVibGljS2V5KFRFU1RfQUNDT1VOVC5ldGhVbmNvbXByZXNzZWRQdWJsaWNLZXkuc2xpY2UoMSkpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIGFkZHJlc3MgdG9vIHNob3J0JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLmVxdWFsKGlzVmFsaWRFdGhBZGRyZXNzKFRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzLnNsaWNlKDEpKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ZhbGlkYXRlIGV0aCBwcml2YXRlIGtleSB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoUHJpdmF0ZUtleShURVNUX0FDQ09VTlQuZXRoUHJpdmF0ZUtleSArICcwMCcpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGUgZXRoIHB1YmxpYyBrZXkgdG9vIGxvbmcnLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aFB1YmxpY0tleShURVNUX0FDQ09VTlQuZXRoVW5jb21wcmVzc2VkUHVibGljS2V5ICsgJzAwJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWxpZGF0ZSBldGggYWRkcmVzcyB0b28gbG9uZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcyhURVNUX0FDQ09VTlQuZXRoQWRkcmVzcyArICcwMCcpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHN1Y2Nlc3MgY2FzZXMnLCAoKSA9PiB7XG4gICAgbGV0IHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIGNvbnN0IGNvbnRyYWN0QWRkcmVzcyA9IFRFU1RfQUNDT1VOVC5ldGhBZGRyZXNzO1xuICAgIGNvbnN0IGluaXRUeEJ1aWxkZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgICAgZmVlOiAnMjgwMDAwMDAwMDAwJyxcbiAgICAgICAgZ2FzTGltaXQ6ICc3MDAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QoY29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci50cmFuc2ZlcigpLmFtb3VudCgnMTAwMDAnKS50byhURVNUX0FDQ09VTlRfMi5ldGhBZGRyZXNzKS5jb250cmFjdFNlcXVlbmNlSWQoMSk7XG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW5pdFR4QnVpbGRlcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gYSB2YWxpZCB0eERhdGEgd2l0aCB2YWxpZCBLZXlQYWlyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQubm90LmV4aXN0cyh0eERhdGEucik7XG4gICAgICBzaG91bGQubm90LmV4aXN0cyh0eERhdGEucyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhEYXRhLnYsICcweDAxNTBmNScpO1xuXG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHNpZ24odHhEYXRhLCBrZXlQYWlyKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBnZXRCdWlsZGVyKCd0YXZheGMnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIyLmZyb20oc2lnbmVkVHgpO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3QgdHgyRGF0YSA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnIpO1xuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnMpO1xuICAgICAgc2hvdWxkLmV4aXN0cyh0eDJEYXRhLnYpO1xuICAgICAgdHgyRGF0YS5yLmxlbmd0aC5zaG91bGQuYmUuYWJvdmUoMCk7XG4gICAgICB0eDJEYXRhLnMubGVuZ3RoLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgIHR4MkRhdGEudi5sZW5ndGguc2hvdWxkLmJlLmFib3ZlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggZ2FzTGltaXQgc2V0IGFzIG51bWJlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMScsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IDEsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICB9O1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBURVNUX0FDQ09VTlRfMi5ldGhQcml2YXRlS2V5IH0pO1xuICAgICAgc2lnbih0eERhdGEsIGtleVBhaXIpLnNob3VsZC5iZS5mdWxmaWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGdhc1ByaWNlIHNldCBhcyBudW1iZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MScsXG4gICAgICAgIGdhc1ByaWNlOiAnMScsXG4gICAgICAgIG5vbmNlOiAxLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbiB0eERhdGEgd2l0aCBoZXggZ2FzTGltaXQgYW5kIGdhc1ByaWNlIHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMSxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggbm9uY2UgemVybycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggdmFsdWUgc2V0IGFzIG51bWJlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggdmFsdWUgc2V0IGFzIGhleCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnMHgxJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDEnLFxuICAgICAgICBub25jZTogMCxcbiAgICAgICAgdmFsdWU6ICcweDAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIGZhaWx1cmUgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3NpZ24gdHhEYXRhIHdpdGggaW52YWxpZCBnYXNMaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICAgIGdhc0xpbWl0OiAnJyxcbiAgICAgICAgZ2FzUHJpY2U6ICcweDAnLFxuICAgICAgICBub25jZTogMSxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChuZXcgUmVnRXhwKCdDYW5ub3QgY29udmVydCBzdHJpbmcgdG8gYnVmZmVyLisnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbiB0eERhdGEgd2l0aCBpbnZhbGlkIGdhc1ByaWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhEYXRhOiBUeERhdGEgPSB7XG4gICAgICAgIF90eXBlOiBFVEhUcmFuc2FjdGlvblR5cGUuTEVHQUNZLFxuICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgZ2FzTGltaXQ6ICcweDAnLFxuICAgICAgICBnYXNQcmljZTogJycsXG4gICAgICAgIG5vbmNlOiAxLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKG5ldyBSZWdFeHAoJ0Nhbm5vdCBjb252ZXJ0IHN0cmluZyB0byBidWZmZXIuKycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGludmFsaWQgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MCcsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IC0xLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogVEVTVF9BQ0NPVU5UXzIuZXRoUHJpdmF0ZUtleSB9KTtcbiAgICAgIHNpZ24odHhEYXRhLCBrZXlQYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKG5ldyBSZWdFeHAoJ0Nhbm5vdCBjb252ZXJ0IHN0cmluZyB0byBidWZmZXIuKycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduIHR4RGF0YSB3aXRoIGludmFsaWQgdmFsdWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIGRhdGE6ICcnLFxuICAgICAgICBnYXNMaW1pdDogJzB4MCcsXG4gICAgICAgIGdhc1ByaWNlOiAnMHgwJyxcbiAgICAgICAgbm9uY2U6IDEsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IFRFU1RfQUNDT1VOVF8yLmV0aFByaXZhdGVLZXkgfSk7XG4gICAgICBzaWduKHR4RGF0YSwga2V5UGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChuZXcgUmVnRXhwKCdDYW5ub3QgY29udmVydCBzdHJpbmcgdG8gYnVmZmVyLisnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCduZXR3b3JrIGNvbW1vbiBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdnZXRDb21tb24gZm9yIG1haW5uZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21tb24gPSBnZXRDb21tb24oTmV0d29ya1R5cGUuTUFJTk5FVCk7XG4gICAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluTmFtZSgpLCAnbWFpbm5ldCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5oYXJkZm9yaygpLCAnbG9uZG9uJyk7XG4gICAgICBzaG91bGQuZXF1YWwoY29tbW9uLmNoYWluSWRCTigpLnRvU3RyaW5nKCksICc0MzExNCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5uZXR3b3JrSWRCTigpLnRvU3RyaW5nKCksICcxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2V0Q29tbW9uIGZvciB0ZXN0bmV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tbW9uID0gZ2V0Q29tbW9uKE5ldHdvcmtUeXBlLlRFU1RORVQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5jaGFpbk5hbWUoKSwgJ2Z1amknKTtcbiAgICAgIHNob3VsZC5lcXVhbChjb21tb24uaGFyZGZvcmsoKSwgJ2xvbmRvbicpO1xuICAgICAgc2hvdWxkLmVxdWFsKGNvbW1vbi5jaGFpbklkQk4oKS50b1N0cmluZygpLCAnNDMxMTMnKTtcbiAgICAgIHNob3VsZC5lcXVhbChjb21tb24ubmV0d29ya0lkQk4oKS50b1N0cmluZygpLCAnMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dldENvbW1vbiBmb3IgaW52YWxpZCBuZXR3b3JrJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gZ2V0Q29tbW9uKCdpbnZhbGlkTmV0d29yaycgYXMgTmV0d29ya1R5cGUpLFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdNaXNzaW5nIG5ldHdvcmsgY29tbW9uIGNvbmZpZ3VyYXRpb24nXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|