@bitgo-beta/sdk-coin-stx 1.1.1-beta.232 → 1.1.1-beta.2321
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/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +25 -9
- package/dist/src/lib/abstractContractBuilder.js +4 -4
- package/dist/src/lib/btcAddressUtils.d.ts +30 -0
- package/dist/src/lib/btcAddressUtils.d.ts.map +1 -0
- package/dist/src/lib/btcAddressUtils.js +134 -0
- package/dist/src/lib/constants.d.ts +16 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +30 -3
- package/dist/src/lib/contractBuilder.d.ts.map +1 -1
- package/dist/src/lib/contractBuilder.js +44 -12
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts +62 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.js +131 -0
- package/dist/src/lib/iface.d.ts +61 -0
- 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 +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +28 -9
- package/dist/src/lib/keyPair.js +18 -19
- package/dist/src/lib/network.d.ts +16 -0
- package/dist/src/lib/network.d.ts.map +1 -0
- package/dist/src/lib/network.js +29 -0
- package/dist/src/lib/pox5Builder.d.ts +78 -0
- package/dist/src/lib/pox5Builder.d.ts.map +1 -0
- package/dist/src/lib/pox5Builder.js +148 -0
- package/dist/src/lib/sbtcWithdrawBuilder.d.ts +38 -0
- package/dist/src/lib/sbtcWithdrawBuilder.d.ts.map +1 -0
- package/dist/src/lib/sbtcWithdrawBuilder.js +150 -0
- package/dist/src/lib/sendmanyBuilder.js +12 -12
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +31 -15
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +16 -17
- package/dist/src/lib/transactionBuilderFactory.d.ts +6 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +23 -2
- package/dist/src/lib/transferBuilder.js +7 -7
- package/dist/src/lib/utils.d.ts +45 -3
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +199 -64
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +7 -1
- package/dist/src/sip10Token.d.ts +22 -0
- package/dist/src/sip10Token.d.ts.map +1 -0
- package/dist/src/sip10Token.js +130 -0
- package/dist/src/stx.d.ts +154 -2
- package/dist/src/stx.d.ts.map +1 -1
- package/dist/src/stx.js +489 -11
- package/dist/src/tstx.js +1 -1
- package/dist/src/tstxsignet.d.ts +20 -0
- package/dist/src/tstxsignet.d.ts.map +1 -0
- package/dist/src/tstxsignet.js +36 -0
- package/dist/test/fixtures.d.ts +119 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +147 -0
- package/dist/test/unit/btcAddressUtils.d.ts +2 -0
- package/dist/test/unit/btcAddressUtils.d.ts.map +1 -0
- package/dist/test/unit/btcAddressUtils.js +82 -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 +144 -0
- package/dist/test/unit/network.d.ts +2 -0
- package/dist/test/unit/network.d.ts.map +1 -0
- package/dist/test/unit/network.js +50 -0
- package/dist/test/unit/resources.d.ts +97 -0
- package/dist/test/unit/resources.d.ts.map +1 -0
- package/dist/test/unit/resources.js +144 -0
- package/dist/test/unit/sip10Token.d.ts +2 -0
- package/dist/test/unit/sip10Token.d.ts.map +1 -0
- package/dist/test/unit/sip10Token.js +374 -0
- package/dist/test/unit/stx.d.ts +2 -0
- package/dist/test/unit/stx.d.ts.map +1 -0
- package/dist/test/unit/stx.js +624 -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 +83 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.js +463 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +191 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.js +418 -0
- package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.js +306 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.js +140 -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 +347 -0
- package/dist/test/unit/tstxsignet.d.ts +2 -0
- package/dist/test/unit/tstxsignet.d.ts.map +1 -0
- package/dist/test/unit/tstxsignet.js +60 -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 +340 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -127
|
@@ -0,0 +1,340 @@
|
|
|
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 assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const transactions_1 = require("@stacks/transactions");
|
|
42
|
+
const bn_js_1 = __importDefault(require("bn.js"));
|
|
43
|
+
const testData = __importStar(require("./resources"));
|
|
44
|
+
const src_1 = require("../../src");
|
|
45
|
+
const { KeyPair, Utils } = src_1.StxLib;
|
|
46
|
+
describe('Stx util library', function () {
|
|
47
|
+
describe('address', function () {
|
|
48
|
+
it('should validate addresses', function () {
|
|
49
|
+
const validAddresses = [
|
|
50
|
+
'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6',
|
|
51
|
+
'ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y',
|
|
52
|
+
'SP2T758K6T2YRKG9Q0TJ16B6FP5QQREWZSESRS0PY',
|
|
53
|
+
'ST1WVJMS5VS41F0YMH7D2M0VHXRG4CY43ZJZBS60A?memoId=4',
|
|
54
|
+
'SPSZBZ3W0JC2MEBN0M9PAM2QB5SH72QYEQAMN6HD?memoId=0',
|
|
55
|
+
'SP3BV7092K9ZS9NJ9ZYMPXE69SV6Y6072M7HEZ49E?memoId=255',
|
|
56
|
+
];
|
|
57
|
+
for (const address of validAddresses) {
|
|
58
|
+
Utils.isValidAddressWithPaymentId(address).should.be.true();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it('should fail to validate invalid addresses', function () {
|
|
62
|
+
const invalidAddresses = [
|
|
63
|
+
'SP244HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6',
|
|
64
|
+
'ST1T758K6T2YRKG9Q0TJ16B6FP5QQREWZSESRS0PY',
|
|
65
|
+
'ST1WVJMS5VS41F0YMH7D2M0VHXRG4CY43ZJZBS60A?memoId=NaN',
|
|
66
|
+
'SPSZBZ3W0JC2MEBN0M9PAM2QB5SH72QYEQAMN6HD?memoId=',
|
|
67
|
+
'SP3BV7092K9ZS9NJ9ZYMPXE69SV6Y6072M7HEZ49E?memoId=testing',
|
|
68
|
+
'',
|
|
69
|
+
'abc',
|
|
70
|
+
];
|
|
71
|
+
for (const address of invalidAddresses) {
|
|
72
|
+
should_1.default.doesNotThrow(() => Utils.isValidAddress(address));
|
|
73
|
+
Utils.isValidAddressWithPaymentId(address).should.be.false();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
it('should generate multisig addresses from compressed public keys', function () {
|
|
77
|
+
const pubKeys = [
|
|
78
|
+
'0263e1f2f322fb74224e210f9d616fce14d10fa89520dcde3d6d02514cdb16846a',
|
|
79
|
+
'02d5de9e1b9c13fc7b67446ebcff4fbb9aa6b1933f907e9aabf32f48d6e0a5064d',
|
|
80
|
+
'0296c4b8353c4a938173f80706df480cf6f85523b428d59ee81d9effcf61e5eae8',
|
|
81
|
+
];
|
|
82
|
+
const address = Utils.getSTXAddressFromPubKeys(pubKeys);
|
|
83
|
+
address.address.should.equal('SM1W9PBVTZA9SRNBQJ2A05R3T0ZVYC94PD0AN9KDG');
|
|
84
|
+
address.hash160.should.equal('789b2f7afa939c5577909402e07a07f7e6249668');
|
|
85
|
+
Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.TestnetMultiSig).address.should.equal('SN1W9PBVTZA9SRNBQJ2A05R3T0ZVYC94PD0A9GGMZ');
|
|
86
|
+
Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.MainnetMultiSig).address.should.equal('SM1W9PBVTZA9SRNBQJ2A05R3T0ZVYC94PD0AN9KDG');
|
|
87
|
+
});
|
|
88
|
+
it('should generate multisig addresses from uncompressed public keys', function () {
|
|
89
|
+
const pubKeys = [
|
|
90
|
+
'049742b908579ffd225d5e1d9486471f19a101dd04b7a81d11da882e7ac7f3e042989c311524a3335e15dec9338a07bd21b6e4444b6b7744d314cc926a1f0383db',
|
|
91
|
+
'0464097ccbc22905ec6f678c846346294033e11a216d133abf6af252294695b3538d65f65b188b6e72e1890e7738f9e221944e618dea1178ef749717b35492de6a',
|
|
92
|
+
'042c608408352ab41477ad9dd1cabca9e712de2dff3c5c8bfa4b5f7f1a0f74a32402a826d2ce5f3a6b01c16aeebdd304e235791958bbf97a08b5d4e9dd4db399b7',
|
|
93
|
+
];
|
|
94
|
+
Utils.getSTXAddressFromPubKeys(pubKeys).address.should.equal('SM2TF8C003JE5YA8B43C2ZAY0K95QFVJNV86FCCQ4');
|
|
95
|
+
Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.TestnetMultiSig).address.should.equal('SN2TF8C003JE5YA8B43C2ZAY0K95QFVJNV90P7YGS');
|
|
96
|
+
Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.MainnetMultiSig).address.should.equal('SM2TF8C003JE5YA8B43C2ZAY0K95QFVJNV86FCCQ4');
|
|
97
|
+
});
|
|
98
|
+
it('should generate multisig addresses from compressed and uncompressed public keys', function () {
|
|
99
|
+
const pubKeys = [
|
|
100
|
+
'04d6f0f7d97a72979596a17fa2946eaeff3703250a62640271eea59477f5b19f39ad01ce2a53025eba365a4f40dd085234194d1d06aefec2a9d4439be0f3c2df34',
|
|
101
|
+
'02f6d0597fb6d5467203d080e17f7b4f767ead59fc303b7d7261a832cb44305bb0',
|
|
102
|
+
'034c80f991410082824aee4ca48147082997d44e800da9877e694f9cb64b3cb64a',
|
|
103
|
+
];
|
|
104
|
+
Utils.getSTXAddressFromPubKeys(pubKeys).address.should.equal('SME8PKRHSCB699FEK59F7T7CBB225KH1MCKM67EV');
|
|
105
|
+
Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.TestnetMultiSig).address.should.equal('SNE8PKRHSCB699FEK59F7T7CBB225KH1MDPBVKF9');
|
|
106
|
+
Utils.getSTXAddressFromPubKeys(pubKeys, transactions_1.AddressVersion.MainnetMultiSig).address.should.equal('SME8PKRHSCB699FEK59F7T7CBB225KH1MCKM67EV');
|
|
107
|
+
});
|
|
108
|
+
it('should not generate multisig addresses from invalid input', function () {
|
|
109
|
+
assert_1.default.throws(() => Utils.getSTXAddressFromPubKeys([]), /Invalid number of public keys/);
|
|
110
|
+
assert_1.default.throws(() => Utils.getSTXAddressFromPubKeys(['badkey', 'badkey2']), /Invalid public key/);
|
|
111
|
+
assert_1.default.throws(() => Utils.getSTXAddressFromPubKeys([
|
|
112
|
+
'02f6d0597fb6d5467203d080e17f7b4f767ead59fc303b7d7261a832cb44305bb0',
|
|
113
|
+
'badkey',
|
|
114
|
+
]), /Invalid public key/);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('amount', function () {
|
|
118
|
+
it('valid amount', function () {
|
|
119
|
+
Utils.isValidAmount('10').should.be.true();
|
|
120
|
+
});
|
|
121
|
+
it('invalid amount', function () {
|
|
122
|
+
Utils.isValidAmount('-10').should.be.false();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('private key', function () {
|
|
126
|
+
it('should validate proper keys', function () {
|
|
127
|
+
const keys = [testData.secretKey1, testData.secretKey2, testData.ACCOUNT_1.prv];
|
|
128
|
+
for (const key of keys) {
|
|
129
|
+
Utils.isValidPrivateKey(key).should.be.true();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
it('should not validate invalid keys', function () {
|
|
133
|
+
const keys = [
|
|
134
|
+
'66c88648116b721bb2f394e0007f9d348ea08017b6e604de51a3a7d957d5852409',
|
|
135
|
+
'688648116b721bb2f394e0007f9d348ea08017b6e604de51a3a7d957d58524',
|
|
136
|
+
'0x66c88648116b721bb2f394e0007f9d348ea08017b6e604de51a3a7d957d58524',
|
|
137
|
+
'',
|
|
138
|
+
'bitgo-stacks',
|
|
139
|
+
'66c88648116b721bb2f394e0007f9d34 8ea08017b6e604de51a3a7d957d58524',
|
|
140
|
+
'66c88648116b721bb2f394e0007f9d3rrxx908017b6e604de51a3a7d957d58524',
|
|
141
|
+
];
|
|
142
|
+
for (const key of keys) {
|
|
143
|
+
Utils.isValidPrivateKey(key).should.be.false();
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('public key', function () {
|
|
148
|
+
it('should validate proper keys', function () {
|
|
149
|
+
const keys = [testData.pubKey1, testData.pubKey2, testData.pubKey2Compressed];
|
|
150
|
+
for (const key of keys) {
|
|
151
|
+
Utils.isValidPublicKey(key).should.be.true();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
it('should not validate invalid keys', function () {
|
|
155
|
+
const keys = [
|
|
156
|
+
'0421d6f42c97d23ec2c0dc21208a9c5edfce4e5bc7b63972e68e86e3cea6f41a94a9a7c24a1ccd83792173f475fdb590cc82f94ff615df39142766e759ce6387',
|
|
157
|
+
'0321d6f42c99f7d23ec 2c0dc21208a9c5edfce4e5bc7b63972e68e6e3cea6f41a',
|
|
158
|
+
'0aa68c2d6fdb3706b39f32d6f4225275ce062561908fd7ca540a44c92eb8594ea6db9fcfe0b390c0ead3f45c36afd682eab62eb124a63b460945fe1f7c7f8a09e2',
|
|
159
|
+
'',
|
|
160
|
+
'bitgo-stacks',
|
|
161
|
+
'0921d6f42c99f7d23ec2c0dc21208a9c5edfce4e5bc7b63972e68e86e3cea6f41a',
|
|
162
|
+
'0321d6f42c99f7d23ec2c0dc21208a9c5edfce4e5bc7b63972e68ezze3cea6f41a',
|
|
163
|
+
'0x0321d6f42c99f7d23ec2c0dc21208a9c5edfce4e5bc7b63972e68e86e3cea6f41a',
|
|
164
|
+
testData.invalidPubKey1,
|
|
165
|
+
testData.invalidPubKey2,
|
|
166
|
+
];
|
|
167
|
+
for (const key of keys) {
|
|
168
|
+
Utils.isValidPublicKey(key).should.be.false();
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('transaction id', function () {
|
|
173
|
+
it('should validate proper ids', function () {
|
|
174
|
+
const txIds = [
|
|
175
|
+
'0x209a3e196195063b2e5195232087a71fe2329a6dc8d2fca531d48c5a7824f679',
|
|
176
|
+
'6a590378c059f78fb698ec0af1ff610586cb1a52ee79fdae69e56430fde08cf4',
|
|
177
|
+
'0e0149bc2c819f3ae40cef95ca58955c80bbc9e15f8c7c651c7b86c2214b7f02',
|
|
178
|
+
];
|
|
179
|
+
for (const txId of txIds) {
|
|
180
|
+
Utils.isValidTransactionId(txId).should.be.true();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
it('should not validate invalid ids', function () {
|
|
184
|
+
const txIds = [
|
|
185
|
+
'',
|
|
186
|
+
'bitgo-stacks',
|
|
187
|
+
'0x209a3e196195063b2e5195232087a71fe2329a6dc8d2fca531d48c5a7824f67',
|
|
188
|
+
'6a590378c059f78fb698ec0af1ff610586cb52ee79fdae69e56430fde08cf4',
|
|
189
|
+
'1x209a3e196195063b2e5195232087a71fe2329a6dc8d2fca531d48c5a7824f679',
|
|
190
|
+
'6a590378c059f78fb698ec0af1ff610586cb1azz2ee79fdae69e56430fde08cf4',
|
|
191
|
+
'0e0149bc2c819f3ae40cef95ca58955c80bbc9e1 5f8c7c651c7b86c2214b7f02',
|
|
192
|
+
];
|
|
193
|
+
for (const txId of txIds) {
|
|
194
|
+
Utils.isValidTransactionId(txId).should.be.false();
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('transaction memo', function () {
|
|
199
|
+
it('check for valid memo strings', function () {
|
|
200
|
+
const memoStrings = ['', 'This is a test.', 'Okay', '!!This is thirty four bytes long!!'];
|
|
201
|
+
for (const memo of memoStrings) {
|
|
202
|
+
Utils.isValidMemo(memo).should.be.true();
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
it('check for valid memo strings', function () {
|
|
206
|
+
const memoStrings = ['ꜟꜟThis is thirty four chars long!!', 'It was the best of times, it was the worst of times'];
|
|
207
|
+
for (const memo of memoStrings) {
|
|
208
|
+
Utils.isValidMemo(memo).should.be.false();
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('sign and verify', function () {
|
|
213
|
+
const keyPair1 = new KeyPair({ prv: testData.secretKey1 });
|
|
214
|
+
const keyPair2 = new KeyPair({ prv: testData.secretKey2 });
|
|
215
|
+
it('sign a message', function () {
|
|
216
|
+
should_1.default.equal(Utils.signMessage(keyPair1, testData.message1), testData.expectedSignature1);
|
|
217
|
+
should_1.default.equal(Utils.signMessage(keyPair2, testData.message2), testData.expectedSignature2);
|
|
218
|
+
});
|
|
219
|
+
it('verify a signature', function () {
|
|
220
|
+
Utils.verifySignature(testData.message1, testData.expectedSignature1, keyPair1.getKeys().pub).should.be.true();
|
|
221
|
+
// handle compressed and uncompressed public keys properly
|
|
222
|
+
Utils.verifySignature(testData.message2, testData.expectedSignature2, keyPair2.getKeys(false).pub).should.be.true();
|
|
223
|
+
Utils.verifySignature(testData.message2, testData.expectedSignature2, keyPair2.getKeys(true).pub).should.be.true();
|
|
224
|
+
});
|
|
225
|
+
it('should not verify signatures', function () {
|
|
226
|
+
// empty message
|
|
227
|
+
assert_1.default.throws(() => Utils.verifySignature('', testData.expectedSignature1, keyPair1.getKeys().pub), new RegExp('Cannot verify empty messages'));
|
|
228
|
+
// wrong public key
|
|
229
|
+
Utils.verifySignature(testData.message1, testData.expectedSignature1, keyPair2.getKeys().pub).should.be.false();
|
|
230
|
+
// wrong signature
|
|
231
|
+
Utils.verifySignature(testData.message2, testData.expectedSignature1, keyPair2.getKeys().pub).should.be.false();
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe('stringifyCv', function () {
|
|
235
|
+
it('Int type', function () {
|
|
236
|
+
const input = { type: transactions_1.ClarityType.Int, value: BigInt('100000') };
|
|
237
|
+
Utils.stringifyCv(input).should.deepEqual({ type: 0, value: '100000' });
|
|
238
|
+
});
|
|
239
|
+
it('UInt type', function () {
|
|
240
|
+
const input = { type: transactions_1.ClarityType.UInt, value: BigInt('100000') };
|
|
241
|
+
Utils.stringifyCv(input).should.deepEqual({ type: 1, value: '100000' });
|
|
242
|
+
});
|
|
243
|
+
it('OptionalNone type', function () {
|
|
244
|
+
const input = { type: transactions_1.ClarityType.OptionalNone };
|
|
245
|
+
Utils.stringifyCv(input).should.deepEqual(input);
|
|
246
|
+
});
|
|
247
|
+
it('OptionalSome type with uint value', function () {
|
|
248
|
+
const input = {
|
|
249
|
+
type: transactions_1.ClarityType.OptionalSome,
|
|
250
|
+
value: { type: transactions_1.ClarityType.UInt, value: BigInt('100000') },
|
|
251
|
+
};
|
|
252
|
+
Utils.stringifyCv(input).should.deepEqual({ type: 10, value: { type: 1, value: '100000' } });
|
|
253
|
+
});
|
|
254
|
+
it('OptionalSome type with tuple value', function () {
|
|
255
|
+
const input = {
|
|
256
|
+
type: transactions_1.ClarityType.OptionalSome,
|
|
257
|
+
value: {
|
|
258
|
+
type: transactions_1.ClarityType.Tuple,
|
|
259
|
+
data: {
|
|
260
|
+
hashbytes: { type: transactions_1.ClarityType.Buffer, buffer: Buffer.from('some-hash') },
|
|
261
|
+
version: { type: transactions_1.ClarityType.Buffer, buffer: new bn_js_1.default(1).toBuffer() },
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
Utils.stringifyCv(input).should.deepEqual(input);
|
|
266
|
+
});
|
|
267
|
+
it('List type', function () {
|
|
268
|
+
const input = { type: transactions_1.ClarityType.List, list: [{ type: transactions_1.ClarityType.UInt, value: BigInt('100000') }] };
|
|
269
|
+
Utils.stringifyCv(input).should.deepEqual({ type: 11, list: [{ type: 1, value: '100000' }] });
|
|
270
|
+
});
|
|
271
|
+
it('List type with empty list', function () {
|
|
272
|
+
const input = { type: transactions_1.ClarityType.List, list: [] };
|
|
273
|
+
Utils.stringifyCv(input).should.deepEqual({ type: 11, list: [] });
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe('getAddressVersion', function () {
|
|
277
|
+
it('should succeed to for valid addresses', function () {
|
|
278
|
+
// Mainnet single sig
|
|
279
|
+
Utils.getAddressVersion('SP1DN2NGRB2R3W75ST0GAA7DBV1VEBBWYZ1D33DEQ').should.equal(22);
|
|
280
|
+
// Mainnet multi sig
|
|
281
|
+
Utils.getAddressVersion('SM468VETKA5DB15HWG2QM7Y04EFQKV44R9D6D0QC').should.equal(20);
|
|
282
|
+
// Testnet single sig
|
|
283
|
+
Utils.getAddressVersion('ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0').should.equal(26);
|
|
284
|
+
// Testnet multi sig
|
|
285
|
+
Utils.getAddressVersion('SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX').should.equal(21);
|
|
286
|
+
// With Memo Id
|
|
287
|
+
Utils.getAddressVersion('SP1DN2NGRB2R3W75ST0GAA7DBV1VEBBWYZ1D33DEQ?memoId=0').should.equal(22);
|
|
288
|
+
Utils.getAddressVersion('SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255').should.equal(21);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
describe('getEncodedPrincipal', function () {
|
|
292
|
+
it('should encode a testnet standard principal as the 22-byte Clarity blob', function () {
|
|
293
|
+
Utils.getEncodedPrincipal('ST390D0WBF60T25P36KMCP6WN1BXQ7TTMMQKNV15C').should.equal('051ad206838b7981a116c334e8cb1b950afb73eb54a5');
|
|
294
|
+
});
|
|
295
|
+
it('should reject contract principals', function () {
|
|
296
|
+
should_1.default.throws(() => Utils.getEncodedPrincipal('ST390D0WBF60T25P36KMCP6WN1BXQ7TTMMQKNV15C.my-contract'), /contract principals are not supported/);
|
|
297
|
+
});
|
|
298
|
+
it('should reject addresses with a memoId suffix', function () {
|
|
299
|
+
should_1.default.throws(() => Utils.getEncodedPrincipal('ST390D0WBF60T25P36KMCP6WN1BXQ7TTMMQKNV15C?memoId=0'), /must not include a query string/);
|
|
300
|
+
});
|
|
301
|
+
it('should reject invalid addresses', function () {
|
|
302
|
+
should_1.default.throws(() => Utils.getEncodedPrincipal('not-a-stacks-address'), /invalid Stacks address/);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
describe('xpubToSTXPubkey', function () {
|
|
306
|
+
it('should succeed to convert for valid xpubs', function () {
|
|
307
|
+
Utils.xpubToSTXPubkey('xpub661MyMwAqRbcGS2HMdvANN7o8ESWqwvr5U4ry5fZdD9VHhymWyfoDQF4vzfKotXgGtJTrwrFRz7XbGFov4FqdKKo6mRYNWvMp7P23DjuJnS').should.equal('03f0f3581a4256797fa8478cb6b1da6588f4c4bedc80ab2601e3a1572cf57b6156');
|
|
308
|
+
Utils.xpubToSTXPubkey('xpub661MyMwAqRbcFEzr5CcpFzPG45rmPf75DTvDobN5gJimCatbHtzR53SbHzDZ1J56byKSsdc8vSujGuQpyPjb7Lsua2NfADJewPxNzL3N6Tj').should.equal('0262b7e86c1e36e45d451263b54a1c3d740abeab61d221d1175fc3fdad752853ab');
|
|
309
|
+
Utils.xpubToSTXPubkey('xpub661MyMwAqRbcGP1adk34VzRQJEMX25rCxjEyU9YFFWNhWNzwPoqgjLoKfnqotLwrz7kBevWbRZnqTSQrQDuJuYUQaDQ5DDPEzEXMwPS9PEf').should.equal('036529a0e41cfd1a9d265b74f8d0002c92c5aec10d4239000260a25cfd54e4726c');
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
describe('getBaseAddress', function () {
|
|
313
|
+
it('should return the base address', async function () {
|
|
314
|
+
const addressWithMemo = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255';
|
|
315
|
+
const baseAddress = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
|
|
316
|
+
Utils.getBaseAddress(addressWithMemo).should.equal(baseAddress);
|
|
317
|
+
Utils.getBaseAddress(baseAddress).should.equal(baseAddress);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
describe('isSameBaseAddress', function () {
|
|
321
|
+
it('should validate if base address match', async function () {
|
|
322
|
+
const address = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255';
|
|
323
|
+
const baseAddress = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
|
|
324
|
+
Utils.isSameBaseAddress(address, baseAddress).should.true();
|
|
325
|
+
const address2 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
|
|
326
|
+
const baseAddress2 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
|
|
327
|
+
Utils.isSameBaseAddress(address2, baseAddress2).should.true();
|
|
328
|
+
const address3 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX?memoId=255';
|
|
329
|
+
const baseAddress3 = 'ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0';
|
|
330
|
+
Utils.isSameBaseAddress(address3, baseAddress3).should.false();
|
|
331
|
+
const address4 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDX';
|
|
332
|
+
const baseAddress4 = 'ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0';
|
|
333
|
+
Utils.isSameBaseAddress(address4, baseAddress4).should.false();
|
|
334
|
+
const address5 = 'SN237KBNCA2CZZ32CWMNTF74DFAYCPNJ3MNN6ANDF';
|
|
335
|
+
const baseAddress5 = 'ST1SRCA93CE1WD8TEG28BSWBFR68J24ZTAB2FAJ0';
|
|
336
|
+
assert_1.default.throws(() => Utils.isSameBaseAddress(address5, baseAddress5).should.false(), new RegExp(`invalid address: ${address5}`));
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1Qix1REFBMEc7QUFDMUcsa0RBQTJCO0FBQzNCLHNEQUF3QztBQUN4QyxtQ0FBbUM7QUFFbkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFNLENBQUM7QUFFbEMsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLFFBQVEsQ0FBQyxTQUFTLEVBQUU7UUFDbEIsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1lBQzlCLE1BQU0sY0FBYyxHQUFHO2dCQUNyQiwwQ0FBMEM7Z0JBQzFDLDJDQUEyQztnQkFDM0MsMkNBQTJDO2dCQUMzQyxvREFBb0Q7Z0JBQ3BELG1EQUFtRDtnQkFDbkQsc0RBQXNEO2FBQ3ZELENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNyQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsMENBQTBDO2dCQUMxQywyQ0FBMkM7Z0JBQzNDLHNEQUFzRDtnQkFDdEQsa0RBQWtEO2dCQUNsRCwwREFBMEQ7Z0JBQzFELEVBQUU7Z0JBQ0YsS0FBSzthQUNOLENBQUM7WUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZDLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDekQsS0FBSyxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0QsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdFQUFnRSxFQUFFO1lBQ25FLE1BQU0sT0FBTyxHQUFHO2dCQUNkLG9FQUFvRTtnQkFDcEUsb0VBQW9FO2dCQUNwRSxvRUFBb0U7YUFDckUsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV4RCxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUMxRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztZQUV6RSxLQUFLLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLDZCQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQzFGLDJDQUEyQyxDQUM1QyxDQUFDO1lBQ0YsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSw2QkFBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMxRiwyQ0FBMkMsQ0FDNUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtFQUFrRSxFQUFFO1lBQ3JFLE1BQU0sT0FBTyxHQUFHO2dCQUNkLG9JQUFvSTtnQkFDcEksb0lBQW9JO2dCQUNwSSxvSUFBb0k7YUFDckksQ0FBQztZQUVGLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQzFHLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsNkJBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDMUYsMkNBQTJDLENBQzVDLENBQUM7WUFDRixLQUFLLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLDZCQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQzFGLDJDQUEyQyxDQUM1QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUZBQWlGLEVBQUU7WUFDcEYsTUFBTSxPQUFPLEdBQUc7Z0JBQ2Qsb0lBQW9JO2dCQUNwSSxvRUFBb0U7Z0JBQ3BFLG9FQUFvRTthQUNyRSxDQUFDO1lBRUYsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7WUFDekcsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSw2QkFBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMxRiwwQ0FBMEMsQ0FDM0MsQ0FBQztZQUNGLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsNkJBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDMUYsMENBQTBDLENBQzNDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRTtZQUM5RCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLEVBQUUsK0JBQStCLENBQUMsQ0FBQztZQUN6RixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2pHLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztnQkFDN0Isb0VBQW9FO2dCQUNwRSxRQUFRO2FBQ1QsQ0FBQyxFQUNKLG9CQUFvQixDQUNyQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxRQUFRLEVBQUU7UUFDakIsRUFBRSxDQUFDLGNBQWMsRUFBRTtZQUNqQixLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0JBQWdCLEVBQUU7WUFDbkIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsYUFBYSxFQUFFO1FBQ3RCLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhGLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLElBQUksR0FBRztnQkFDWCxvRUFBb0U7Z0JBQ3BFLGdFQUFnRTtnQkFDaEUsb0VBQW9FO2dCQUNwRSxFQUFFO2dCQUNGLGNBQWM7Z0JBQ2QsbUVBQW1FO2dCQUNuRSxtRUFBbUU7YUFDcEUsQ0FBQztZQUVGLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksRUFBRTtRQUNyQixFQUFFLENBQUMsNkJBQTZCLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFOUUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxHQUFHO2dCQUNYLGtJQUFrSTtnQkFDbEksb0VBQW9FO2dCQUNwRSxvSUFBb0k7Z0JBQ3BJLEVBQUU7Z0JBQ0YsY0FBYztnQkFDZCxvRUFBb0U7Z0JBQ3BFLG9FQUFvRTtnQkFDcEUsc0VBQXNFO2dCQUN0RSxRQUFRLENBQUMsY0FBYztnQkFDdkIsUUFBUSxDQUFDLGNBQWM7YUFDeEIsQ0FBQztZQUVGLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRTtZQUMvQixNQUFNLEtBQUssR0FBRztnQkFDWixvRUFBb0U7Z0JBQ3BFLGtFQUFrRTtnQkFDbEUsa0VBQWtFO2FBQ25FLENBQUM7WUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUU7WUFDcEMsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osRUFBRTtnQkFDRixjQUFjO2dCQUNkLG1FQUFtRTtnQkFDbkUsZ0VBQWdFO2dCQUNoRSxvRUFBb0U7Z0JBQ3BFLG1FQUFtRTtnQkFDbkUscUVBQXFFO2FBQ3RFLENBQUM7WUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7WUFDMUYsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDL0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtZQUNqQyxNQUFNLFdBQVcsR0FBRyxDQUFDLG9DQUFvQyxFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDbEgsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDL0IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTNELEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNuQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9CQUFvQixFQUFFO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFL0csMERBQTBEO1lBQzFELEtBQUssQ0FBQyxlQUFlLENBQ25CLFFBQVEsQ0FBQyxRQUFRLEVBQ2pCLFFBQVEsQ0FBQyxrQkFBa0IsRUFDM0IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQzVCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuQixLQUFLLENBQUMsZUFBZSxDQUNuQixRQUFRLENBQUMsUUFBUSxFQUNqQixRQUFRLENBQUMsa0JBQWtCLEVBQzNCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUMzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMsZ0JBQWdCO1lBQ2hCLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQ3BGLElBQUksTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQzNDLENBQUM7WUFFRixtQkFBbUI7WUFDbkIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVoSCxrQkFBa0I7WUFDbEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsVUFBVSxFQUFFO1lBQ2IsTUFBTSxLQUFLLEdBQVUsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3hFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFFLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6RCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsTUFBTSxLQUFLLEdBQVc7Z0JBQ3BCLElBQUksRUFBRSwwQkFBVyxDQUFDLFlBQVk7Z0JBQzlCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2FBQzNELENBQUM7WUFDRixLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtZQUN2QyxNQUFNLEtBQUssR0FBVztnQkFDcEIsSUFBSSxFQUFFLDBCQUFXLENBQUMsWUFBWTtnQkFDOUIsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRSwwQkFBVyxDQUFDLEtBQUs7b0JBQ3ZCLElBQUksRUFBRTt3QkFDSixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ3pFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxlQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7cUJBQ3hFO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDZCxNQUFNLEtBQUssR0FBVyxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzlHLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixNQUFNLEtBQUssR0FBVyxFQUFFLElBQUksRUFBRSwwQkFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDM0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1FBQzVCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxxQkFBcUI7WUFDckIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RixvQkFBb0I7WUFDcEIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRixxQkFBcUI7WUFDckIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRixvQkFBb0I7WUFDcEIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RixlQUFlO1lBQ2YsS0FBSyxDQUFDLGlCQUFpQixDQUFDLG9EQUFvRCxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRixLQUFLLENBQUMsaUJBQWlCLENBQUMsc0RBQXNELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLHdFQUF3RSxFQUFFO1lBQzNFLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2pGLDhDQUE4QyxDQUMvQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLHVEQUF1RCxDQUFDLEVBQ3hGLHVDQUF1QyxDQUN4QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLG9EQUFvRCxDQUFDLEVBQ3JGLGlDQUFpQyxDQUNsQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUU7WUFDcEMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUNuRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxLQUFLLENBQUMsZUFBZSxDQUNuQixpSEFBaUgsQ0FDbEgsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDckYsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsaUhBQWlILENBQ2xILENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1lBQ3JGLEtBQUssQ0FBQyxlQUFlLENBQ25CLGlIQUFpSCxDQUNsSCxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztRQUN2RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLO1lBQ3hDLE1BQU0sZUFBZSxHQUFHLHNEQUFzRCxDQUFDO1lBQy9FLE1BQU0sV0FBVyxHQUFHLDJDQUEyQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSxLQUFLLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSztZQUMvQyxNQUFNLE9BQU8sR0FBRyxzREFBc0QsQ0FBQztZQUN2RSxNQUFNLFdBQVcsR0FBRywyQ0FBMkMsQ0FBQztZQUNoRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU1RCxNQUFNLFFBQVEsR0FBRywyQ0FBMkMsQ0FBQztZQUM3RCxNQUFNLFlBQVksR0FBRywyQ0FBMkMsQ0FBQztZQUNqRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU5RCxNQUFNLFFBQVEsR0FBRyxzREFBc0QsQ0FBQztZQUN4RSxNQUFNLFlBQVksR0FBRywwQ0FBMEMsQ0FBQztZQUNoRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUvRCxNQUFNLFFBQVEsR0FBRywyQ0FBMkMsQ0FBQztZQUM3RCxNQUFNLFlBQVksR0FBRywwQ0FBMEMsQ0FBQztZQUNoRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUvRCxNQUFNLFFBQVEsR0FBRywyQ0FBMkMsQ0FBQztZQUM3RCxNQUFNLFlBQVksR0FBRywwQ0FBMEMsQ0FBQztZQUNoRSxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFDcEUsSUFBSSxNQUFNLENBQUMsb0JBQW9CLFFBQVEsRUFBRSxDQUFDLENBQzNDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBBZGRyZXNzVmVyc2lvbiwgQ2xhcml0eVR5cGUsIEludENWLCBOb25lQ1YsIFNvbWVDViwgVUludENWLCBMaXN0Q1YgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgQmlnTnVtIGZyb20gJ2JuLmpzJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4vcmVzb3VyY2VzJztcbmltcG9ydCB7IFN0eExpYiB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmNvbnN0IHsgS2V5UGFpciwgVXRpbHMgfSA9IFN0eExpYjtcblxuZGVzY3JpYmUoJ1N0eCB1dGlsIGxpYnJhcnknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRBZGRyZXNzZXMgPSBbXG4gICAgICAgICdTVEI0NEhZUFlBVDJCQjJRRTUxM05TUDgxSFRNWVdCSlAwMkhQR0s2JyxcbiAgICAgICAgJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZJyxcbiAgICAgICAgJ1NQMlQ3NThLNlQyWVJLRzlRMFRKMTZCNkZQNVFRUkVXWlNFU1JTMFBZJyxcbiAgICAgICAgJ1NUMVdWSk1TNVZTNDFGMFlNSDdEMk0wVkhYUkc0Q1k0M1pKWkJTNjBBP21lbW9JZD00JyxcbiAgICAgICAgJ1NQU1pCWjNXMEpDMk1FQk4wTTlQQU0yUUI1U0g3MlFZRVFBTU42SEQ/bWVtb0lkPTAnLFxuICAgICAgICAnU1AzQlY3MDkySzlaUzlOSjlaWU1QWEU2OVNWNlk2MDcyTTdIRVo0OUU/bWVtb0lkPTI1NScsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZEFkZHJlc3NXaXRoUGF5bWVudElkKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkQWRkcmVzc2VzID0gW1xuICAgICAgICAnU1AyNDRIWVBZQVQyQkIyUUU1MTNOU1A4MUhUTVlXQkpQMDJIUEdLNicsXG4gICAgICAgICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWScsXG4gICAgICAgICdTVDFXVkpNUzVWUzQxRjBZTUg3RDJNMFZIWFJHNENZNDNaSlpCUzYwQT9tZW1vSWQ9TmFOJyxcbiAgICAgICAgJ1NQU1pCWjNXMEpDMk1FQk4wTTlQQU0yUUI1U0g3MlFZRVFBTU42SEQ/bWVtb0lkPScsXG4gICAgICAgICdTUDNCVjcwOTJLOVpTOU5KOVpZTVBYRTY5U1Y2WTYwNzJNN0hFWjQ5RT9tZW1vSWQ9dGVzdGluZycsXG4gICAgICAgICcnLFxuICAgICAgICAnYWJjJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBpbnZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgICBVdGlscy5pc1ZhbGlkQWRkcmVzc1dpdGhQYXltZW50SWQoYWRkcmVzcykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIG11bHRpc2lnIGFkZHJlc3NlcyBmcm9tIGNvbXByZXNzZWQgcHVibGljIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwdWJLZXlzID0gW1xuICAgICAgICAnMDI2M2UxZjJmMzIyZmI3NDIyNGUyMTBmOWQ2MTZmY2UxNGQxMGZhODk1MjBkY2RlM2Q2ZDAyNTE0Y2RiMTY4NDZhJyxcbiAgICAgICAgJzAyZDVkZTllMWI5YzEzZmM3YjY3NDQ2ZWJjZmY0ZmJiOWFhNmIxOTMzZjkwN2U5YWFiZjMyZjQ4ZDZlMGE1MDY0ZCcsXG4gICAgICAgICcwMjk2YzRiODM1M2M0YTkzODE3M2Y4MDcwNmRmNDgwY2Y2Zjg1NTIzYjQyOGQ1OWVlODFkOWVmZmNmNjFlNWVhZTgnLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYWRkcmVzcyA9IFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzKTtcblxuICAgICAgYWRkcmVzcy5hZGRyZXNzLnNob3VsZC5lcXVhbCgnU00xVzlQQlZUWkE5U1JOQlFKMkEwNVIzVDBaVllDOTRQRDBBTjlLREcnKTtcbiAgICAgIGFkZHJlc3MuaGFzaDE2MC5zaG91bGQuZXF1YWwoJzc4OWIyZjdhZmE5MzljNTU3NzkwOTQwMmUwN2EwN2Y3ZTYyNDk2NjgnKTtcblxuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLlRlc3RuZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTjFXOVBCVlRaQTlTUk5CUUoyQTA1UjNUMFpWWUM5NFBEMEE5R0dNWidcbiAgICAgICk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uTWFpbm5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NNMVc5UEJWVFpBOVNSTkJRSjJBMDVSM1QwWlZZQzk0UEQwQU45S0RHJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbXVsdGlzaWcgYWRkcmVzc2VzIGZyb20gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHViS2V5cyA9IFtcbiAgICAgICAgJzA0OTc0MmI5MDg1NzlmZmQyMjVkNWUxZDk0ODY0NzFmMTlhMTAxZGQwNGI3YTgxZDExZGE4ODJlN2FjN2YzZTA0Mjk4OWMzMTE1MjRhMzMzNWUxNWRlYzkzMzhhMDdiZDIxYjZlNDQ0NGI2Yjc3NDRkMzE0Y2M5MjZhMWYwMzgzZGInLFxuICAgICAgICAnMDQ2NDA5N2NjYmMyMjkwNWVjNmY2NzhjODQ2MzQ2Mjk0MDMzZTExYTIxNmQxMzNhYmY2YWYyNTIyOTQ2OTViMzUzOGQ2NWY2NWIxODhiNmU3MmUxODkwZTc3MzhmOWUyMjE5NDRlNjE4ZGVhMTE3OGVmNzQ5NzE3YjM1NDkyZGU2YScsXG4gICAgICAgICcwNDJjNjA4NDA4MzUyYWI0MTQ3N2FkOWRkMWNhYmNhOWU3MTJkZTJkZmYzYzVjOGJmYTRiNWY3ZjFhMGY3NGEzMjQwMmE4MjZkMmNlNWYzYTZiMDFjMTZhZWViZGQzMDRlMjM1NzkxOTU4YmJmOTdhMDhiNWQ0ZTlkZDRkYjM5OWI3JyxcbiAgICAgIF07XG5cbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzKS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnU00yVEY4QzAwM0pFNVlBOEI0M0MyWkFZMEs5NVFGVkpOVjg2RkNDUTQnKTtcbiAgICAgIFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhwdWJLZXlzLCBBZGRyZXNzVmVyc2lvbi5UZXN0bmV0TXVsdGlTaWcpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKFxuICAgICAgICAnU04yVEY4QzAwM0pFNVlBOEI0M0MyWkFZMEs5NVFGVkpOVjkwUDdZR1MnXG4gICAgICApO1xuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLk1haW5uZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTTJURjhDMDAzSkU1WUE4QjQzQzJaQVkwSzk1UUZWSk5WODZGQ0NRNCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIG11bHRpc2lnIGFkZHJlc3NlcyBmcm9tIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHB1YktleXMgPSBbXG4gICAgICAgICcwNGQ2ZjBmN2Q5N2E3Mjk3OTU5NmExN2ZhMjk0NmVhZWZmMzcwMzI1MGE2MjY0MDI3MWVlYTU5NDc3ZjViMTlmMzlhZDAxY2UyYTUzMDI1ZWJhMzY1YTRmNDBkZDA4NTIzNDE5NGQxZDA2YWVmZWMyYTlkNDQzOWJlMGYzYzJkZjM0JyxcbiAgICAgICAgJzAyZjZkMDU5N2ZiNmQ1NDY3MjAzZDA4MGUxN2Y3YjRmNzY3ZWFkNTlmYzMwM2I3ZDcyNjFhODMyY2I0NDMwNWJiMCcsXG4gICAgICAgICcwMzRjODBmOTkxNDEwMDgyODI0YWVlNGNhNDgxNDcwODI5OTdkNDRlODAwZGE5ODc3ZTY5NGY5Y2I2NGIzY2I2NGEnLFxuICAgICAgXTtcblxuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMpLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdTTUU4UEtSSFNDQjY5OUZFSzU5RjdUN0NCQjIyNUtIMU1DS002N0VWJyk7XG4gICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMocHViS2V5cywgQWRkcmVzc1ZlcnNpb24uVGVzdG5ldE11bHRpU2lnKS5hZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ1NORThQS1JIU0NCNjk5RkVLNTlGN1Q3Q0JCMjI1S0gxTURQQlZLRjknXG4gICAgICApO1xuICAgICAgVXRpbHMuZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKHB1YktleXMsIEFkZHJlc3NWZXJzaW9uLk1haW5uZXRNdWx0aVNpZykuYWRkcmVzcy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdTTUU4UEtSSFNDQjY5OUZFSzU5RjdUN0NCQjIyNUtIMU1DS002N0VWJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGdlbmVyYXRlIG11bHRpc2lnIGFkZHJlc3NlcyBmcm9tIGludmFsaWQgaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLmdldFNUWEFkZHJlc3NGcm9tUHViS2V5cyhbXSksIC9JbnZhbGlkIG51bWJlciBvZiBwdWJsaWMga2V5cy8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMoWydiYWRrZXknLCAnYmFka2V5MiddKSwgL0ludmFsaWQgcHVibGljIGtleS8pO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBVdGlscy5nZXRTVFhBZGRyZXNzRnJvbVB1YktleXMoW1xuICAgICAgICAgICAgJzAyZjZkMDU5N2ZiNmQ1NDY3MjAzZDA4MGUxN2Y3YjRmNzY3ZWFkNTlmYzMwM2I3ZDcyNjFhODMyY2I0NDMwNWJiMCcsXG4gICAgICAgICAgICAnYmFka2V5JyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgL0ludmFsaWQgcHVibGljIGtleS9cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3ZhbGlkIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLmlzVmFsaWRBbW91bnQoJzEwJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdpbnZhbGlkIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLmlzVmFsaWRBbW91bnQoJy0xMCcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJpdmF0ZSBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXIga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBbdGVzdERhdGEuc2VjcmV0S2V5MSwgdGVzdERhdGEuc2VjcmV0S2V5MiwgdGVzdERhdGEuQUNDT1VOVF8xLnBydl07XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoa2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgaW52YWxpZCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgJzY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDM0OGVhMDgwMTdiNmU2MDRkZTUxYTNhN2Q5NTdkNTg1MjQwOScsXG4gICAgICAgICc2ODg2NDgxMTZiNzIxYmIyZjM5NGUwMDA3ZjlkMzQ4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICAgICcweDY2Yzg4NjQ4MTE2YjcyMWJiMmYzOTRlMDAwN2Y5ZDM0OGVhMDgwMTdiNmU2MDRkZTUxYTNhN2Q5NTdkNTg1MjQnLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2JpdGdvLXN0YWNrcycsXG4gICAgICAgICc2NmM4ODY0ODExNmI3MjFiYjJmMzk0ZTAwMDdmOWQzNCA4ZWEwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICAgICc2NmM4ODY0ODExNmI3MjFiYjJmMzk0ZTAwMDdmOWQzcnJ4eDkwODAxN2I2ZTYwNGRlNTFhM2E3ZDk1N2Q1ODUyNCcsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KGtleSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHJvcGVyIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXlzID0gW3Rlc3REYXRhLnB1YktleTEsIHRlc3REYXRhLnB1YktleTIsIHRlc3REYXRhLnB1YktleTJDb21wcmVzc2VkXTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkUHVibGljS2V5KGtleSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIGludmFsaWQga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICAgICcwNDIxZDZmNDJjOTdkMjNlYzJjMGRjMjEyMDhhOWM1ZWRmY2U0ZTViYzdiNjM5NzJlNjhlODZlM2NlYTZmNDFhOTRhOWE3YzI0YTFjY2Q4Mzc5MjE3M2Y0NzVmZGI1OTBjYzgyZjk0ZmY2MTVkZjM5MTQyNzY2ZTc1OWNlNjM4NycsXG4gICAgICAgICcwMzIxZDZmNDJjOTlmN2QyM2VjIDJjMGRjMjEyMDhhOWM1ZWRmY2U0ZTViYzdiNjM5NzJlNjhlNmUzY2VhNmY0MWEnLFxuICAgICAgICAnMGFhNjhjMmQ2ZmRiMzcwNmIzOWYzMmQ2ZjQyMjUyNzVjZTA2MjU2MTkwOGZkN2NhNTQwYTQ0YzkyZWI4NTk0ZWE2ZGI5ZmNmZTBiMzkwYzBlYWQzZjQ1YzM2YWZkNjgyZWFiNjJlYjEyNGE2M2I0NjA5NDVmZTFmN2M3ZjhhMDllMicsXG4gICAgICAgICcnLFxuICAgICAgICAnYml0Z28tc3RhY2tzJyxcbiAgICAgICAgJzA5MjFkNmY0MmM5OWY3ZDIzZWMyYzBkYzIxMjA4YTljNWVkZmNlNGU1YmM3YjYzOTcyZTY4ZTg2ZTNjZWE2ZjQxYScsXG4gICAgICAgICcwMzIxZDZmNDJjOTlmN2QyM2VjMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGV6emUzY2VhNmY0MWEnLFxuICAgICAgICAnMHgwMzIxZDZmNDJjOTlmN2QyM2VjMmMwZGMyMTIwOGE5YzVlZGZjZTRlNWJjN2I2Mzk3MmU2OGU4NmUzY2VhNmY0MWEnLFxuICAgICAgICB0ZXN0RGF0YS5pbnZhbGlkUHViS2V5MSxcbiAgICAgICAgdGVzdERhdGEuaW52YWxpZFB1YktleTIsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoa2V5KS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIGlkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHJvcGVyIGlkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4SWRzID0gW1xuICAgICAgICAnMHgyMDlhM2UxOTYxOTUwNjNiMmU1MTk1MjMyMDg3YTcxZmUyMzI5YTZkYzhkMmZjYTUzMWQ0OGM1YTc4MjRmNjc5JyxcbiAgICAgICAgJzZhNTkwMzc4YzA1OWY3OGZiNjk4ZWMwYWYxZmY2MTA1ODZjYjFhNTJlZTc5ZmRhZTY5ZTU2NDMwZmRlMDhjZjQnLFxuICAgICAgICAnMGUwMTQ5YmMyYzgxOWYzYWU0MGNlZjk1Y2E1ODk1NWM4MGJiYzllMTVmOGM3YzY1MWM3Yjg2YzIyMTRiN2YwMicsXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IHR4SWQgb2YgdHhJZHMpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIGludmFsaWQgaWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhJZHMgPSBbXG4gICAgICAgICcnLFxuICAgICAgICAnYml0Z28tc3RhY2tzJyxcbiAgICAgICAgJzB4MjA5YTNlMTk2MTk1MDYzYjJlNTE5NTIzMjA4N2E3MWZlMjMyOWE2ZGM4ZDJmY2E1MzFkNDhjNWE3ODI0ZjY3JyxcbiAgICAgICAgJzZhNTkwMzc4YzA1OWY3OGZiNjk4ZWMwYWYxZmY2MTA1ODZjYjUyZWU3OWZkYWU2OWU1NjQzMGZkZTA4Y2Y0JyxcbiAgICAgICAgJzF4MjA5YTNlMTk2MTk1MDYzYjJlNTE5NTIzMjA4N2E3MWZlMjMyOWE2ZGM4ZDJmY2E1MzFkNDhjNWE3ODI0ZjY3OScsXG4gICAgICAgICc2YTU5MDM3OGMwNTlmNzhmYjY5OGVjMGFmMWZmNjEwNTg2Y2IxYXp6MmVlNzlmZGFlNjllNTY0MzBmZGUwOGNmNCcsXG4gICAgICAgICcwZTAxNDliYzJjODE5ZjNhZTQwY2VmOTVjYTU4OTU1YzgwYmJjOWUxICAgNWY4YzdjNjUxYzdiODZjMjIxNGI3ZjAyJyxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgdHhJZCBvZiB0eElkcykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIG1lbW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2NoZWNrIGZvciB2YWxpZCBtZW1vIHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtZW1vU3RyaW5ncyA9IFsnJywgJ1RoaXMgaXMgYSB0ZXN0LicsICdPa2F5JywgJyEhVGhpcyBpcyB0aGlydHkgZm91ciBieXRlcyBsb25nISEnXTtcbiAgICAgIGZvciAoY29uc3QgbWVtbyBvZiBtZW1vU3RyaW5ncykge1xuICAgICAgICBVdGlscy5pc1ZhbGlkTWVtbyhtZW1vKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdjaGVjayBmb3IgdmFsaWQgbWVtbyBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWVtb1N0cmluZ3MgPSBbJ+qcn+qcn1RoaXMgaXMgdGhpcnR5IGZvdXIgY2hhcnMgbG9uZyEhJywgJ0l0IHdhcyB0aGUgYmVzdCBvZiB0aW1lcywgaXQgd2FzIHRoZSB3b3JzdCBvZiB0aW1lcyddO1xuICAgICAgZm9yIChjb25zdCBtZW1vIG9mIG1lbW9TdHJpbmdzKSB7XG4gICAgICAgIFV0aWxzLmlzVmFsaWRNZW1vKG1lbW8pLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbiBhbmQgdmVyaWZ5JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGtleVBhaXIxID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnNlY3JldEtleTEgfSk7XG4gICAgY29uc3Qga2V5UGFpcjIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuc2VjcmV0S2V5MiB9KTtcblxuICAgIGl0KCdzaWduIGEgbWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5zaWduTWVzc2FnZShrZXlQYWlyMSwgdGVzdERhdGEubWVzc2FnZTEpLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEpO1xuICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLnNpZ25NZXNzYWdlKGtleVBhaXIyLCB0ZXN0RGF0YS5tZXNzYWdlMiksIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMik7XG4gICAgfSk7XG5cbiAgICBpdCgndmVyaWZ5IGEgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgVXRpbHMudmVyaWZ5U2lnbmF0dXJlKHRlc3REYXRhLm1lc3NhZ2UxLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEsIGtleVBhaXIxLmdldEtleXMoKS5wdWIpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIC8vIGhhbmRsZSBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgcHVibGljIGtleXMgcHJvcGVybHlcbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEubWVzc2FnZTIsXG4gICAgICAgIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMixcbiAgICAgICAga2V5UGFpcjIuZ2V0S2V5cyhmYWxzZSkucHViXG4gICAgICApLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEubWVzc2FnZTIsXG4gICAgICAgIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMixcbiAgICAgICAga2V5UGFpcjIuZ2V0S2V5cyh0cnVlKS5wdWJcbiAgICAgICkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHZlcmlmeSBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZW1wdHkgbWVzc2FnZVxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gVXRpbHMudmVyaWZ5U2lnbmF0dXJlKCcnLCB0ZXN0RGF0YS5leHBlY3RlZFNpZ25hdHVyZTEsIGtleVBhaXIxLmdldEtleXMoKS5wdWIpLFxuICAgICAgICBuZXcgUmVnRXhwKCdDYW5ub3QgdmVyaWZ5IGVtcHR5IG1lc3NhZ2VzJylcbiAgICAgICk7XG5cbiAgICAgIC8vIHdyb25nIHB1YmxpYyBrZXlcbiAgICAgIFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0ZXN0RGF0YS5tZXNzYWdlMSwgdGVzdERhdGEuZXhwZWN0ZWRTaWduYXR1cmUxLCBrZXlQYWlyMi5nZXRLZXlzKCkucHViKS5zaG91bGQuYmUuZmFsc2UoKTtcblxuICAgICAgLy8gd3Jvbmcgc2lnbmF0dXJlXG4gICAgICBVdGlscy52ZXJpZnlTaWduYXR1cmUodGVzdERhdGEubWVzc2FnZTIsIHRlc3REYXRhLmV4cGVjdGVkU2lnbmF0dXJlMSwga2V5UGFpcjIuZ2V0S2V5cygpLnB1Yikuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJpbmdpZnlDdicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnSW50IHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogSW50Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLkludCwgdmFsdWU6IEJpZ0ludCgnMTAwMDAwJykgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKHsgdHlwZTogMCwgdmFsdWU6ICcxMDAwMDAnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1VJbnQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBVSW50Q1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLlVJbnQsIHZhbHVlOiBCaWdJbnQoJzEwMDAwMCcpIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDEsIHZhbHVlOiAnMTAwMDAwJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdPcHRpb25hbE5vbmUgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBOb25lQ1YgPSB7IHR5cGU6IENsYXJpdHlUeXBlLk9wdGlvbmFsTm9uZSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ09wdGlvbmFsU29tZSB0eXBlIHdpdGggdWludCB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0OiBTb21lQ1YgPSB7XG4gICAgICAgIHR5cGU6IENsYXJpdHlUeXBlLk9wdGlvbmFsU29tZSxcbiAgICAgICAgdmFsdWU6IHsgdHlwZTogQ2xhcml0eVR5cGUuVUludCwgdmFsdWU6IEJpZ0ludCgnMTAwMDAwJykgfSxcbiAgICAgIH07XG4gICAgICBVdGlscy5zdHJpbmdpZnlDdihpbnB1dCkuc2hvdWxkLmRlZXBFcXVhbCh7IHR5cGU6IDEwLCB2YWx1ZTogeyB0eXBlOiAxLCB2YWx1ZTogJzEwMDAwMCcgfSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdPcHRpb25hbFNvbWUgdHlwZSB3aXRoIHR1cGxlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXQ6IFNvbWVDViA9IHtcbiAgICAgICAgdHlwZTogQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHR5cGU6IENsYXJpdHlUeXBlLlR1cGxlLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGhhc2hieXRlczogeyB0eXBlOiBDbGFyaXR5VHlwZS5CdWZmZXIsIGJ1ZmZlcjogQnVmZmVyLmZyb20oJ3NvbWUtaGFzaCcpIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IHR5cGU6IENsYXJpdHlUeXBlLkJ1ZmZlciwgYnVmZmVyOiBuZXcgQmlnTnVtKDEpLnRvQnVmZmVyKCkgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIFV0aWxzLnN0cmluZ2lmeUN2KGlucHV0KS5zaG91bGQuZGVlcEVxdWFsKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdMaXN0IHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogTGlzdENWID0geyB0eXBlOiBDbGFyaXR5VHlwZS5MaXN0LCBsaXN0OiBbeyB0eXBlOiBDbGFyaXR5VHlwZS5VSW50LCB2YWx1ZTogQmlnSW50KCcxMDAwMDAnKSB9XSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoeyB0eXBlOiAxMSwgbGlzdDogW3sgdHlwZTogMSwgdmFsdWU6ICcxMDAwMDAnIH1dIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ0xpc3QgdHlwZSB3aXRoIGVtcHR5IGxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dDogTGlzdENWID0geyB0eXBlOiBDbGFyaXR5VHlwZS5MaXN0LCBsaXN0OiBbXSB9O1xuICAgICAgVXRpbHMuc3RyaW5naWZ5Q3YoaW5wdXQpLnNob3VsZC5kZWVwRXF1YWwoeyB0eXBlOiAxMSwgbGlzdDogW10gfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzVmVyc2lvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gZm9yIHZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE1haW5uZXQgc2luZ2xlIHNpZ1xuICAgICAgVXRpbHMuZ2V0QWRkcmVzc1ZlcnNpb24oJ1NQMUROMk5HUkIyUjNXNzVTVDBHQUE3REJWMVZFQkJXWVoxRDMzREVRJykuc2hvdWxkLmVxdWFsKDIyKTtcbiAgICAgIC8vIE1haW5uZXQgbXVsdGkgc2lnXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU000NjhWRVRLQTVEQjE1SFdHMlFNN1kwNEVGUUtWNDRSOUQ2RDBRQycpLnNob3VsZC5lcXVhbCgyMCk7XG4gICAgICAvLyBUZXN0bmV0IHNpbmdsZSBzaWdcbiAgICAgIFV0aWxzLmdldEFkZHJlc3NWZXJzaW9uKCdTVDFTUkNBOTNDRTFXRDhURUcyOEJTV0JGUjY4SjI0WlRBQjJGQUowJykuc2hvdWxkLmVxdWFsKDI2KTtcbiAgICAgIC8vIFRlc3RuZXQgbXVsdGkgc2lnXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnKS5zaG91bGQuZXF1YWwoMjEpO1xuICAgICAgLy8gV2l0aCBNZW1vIElkXG4gICAgICBVdGlscy5nZXRBZGRyZXNzVmVyc2lvbignU1AxRE4yTkdSQjJSM1c3NVNUMEdBQTdEQlYxVkVCQldZWjFEMzNERVE/bWVtb0lkPTAnKS5zaG91bGQuZXF1YWwoMjIpO1xuICAgICAgVXRpbHMuZ2V0QWRkcmVzc1ZlcnNpb24oJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYP21lbW9JZD0yNTUnKS5zaG91bGQuZXF1YWwoMjEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0RW5jb2RlZFByaW5jaXBhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGVuY29kZSBhIHRlc3RuZXQgc3RhbmRhcmQgcHJpbmNpcGFsIGFzIHRoZSAyMi1ieXRlIENsYXJpdHkgYmxvYicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLmdldEVuY29kZWRQcmluY2lwYWwoJ1NUMzkwRDBXQkY2MFQyNVAzNktNQ1A2V04xQlhRN1RUTU1RS05WMTVDJykuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMDUxYWQyMDY4MzhiNzk4MWExMTZjMzM0ZThjYjFiOTUwYWZiNzNlYjU0YTUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgY29udHJhY3QgcHJpbmNpcGFscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICgpID0+IFV0aWxzLmdldEVuY29kZWRQcmluY2lwYWwoJ1NUMzkwRDBXQkY2MFQyNVAzNktNQ1A2V04xQlhRN1RUTU1RS05WMTVDLm15LWNvbnRyYWN0JyksXG4gICAgICAgIC9jb250cmFjdCBwcmluY2lwYWxzIGFyZSBub3Qgc3VwcG9ydGVkL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3NlcyB3aXRoIGEgbWVtb0lkIHN1ZmZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoXG4gICAgICAgICgpID0+IFV0aWxzLmdldEVuY29kZWRQcmluY2lwYWwoJ1NUMzkwRDBXQkY2MFQyNVAzNktNQ1A2V04xQlhRN1RUTU1RS05WMTVDP21lbW9JZD0wJyksXG4gICAgICAgIC9tdXN0IG5vdCBpbmNsdWRlIGEgcXVlcnkgc3RyaW5nL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBVdGlscy5nZXRFbmNvZGVkUHJpbmNpcGFsKCdub3QtYS1zdGFja3MtYWRkcmVzcycpLCAvaW52YWxpZCBTdGFja3MgYWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgneHB1YlRvU1RYUHVia2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byBjb252ZXJ0IGZvciB2YWxpZCB4cHVicycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFV0aWxzLnhwdWJUb1NUWFB1YmtleShcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHUzJITWR2QU5ON284RVNXcXd2cjVVNHJ5NWZaZEQ5VkhoeW1XeWZvRFFGNHZ6ZktvdFhnR3RKVHJ3ckZSejdYYkdGb3Y0RnFkS0tvNm1SWU5Xdk1wN1AyM0RqdUpuUydcbiAgICAgICkuc2hvdWxkLmVxdWFsKCcwM2YwZjM1ODFhNDI1Njc5N2ZhODQ3OGNiNmIxZGE2NTg4ZjRjNGJlZGM4MGFiMjYwMWUzYTE1NzJjZjU3YjYxNTYnKTtcbiAgICAgIFV0aWxzLnhwdWJUb1NUWFB1YmtleShcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGRXpyNUNjcEZ6UEc0NXJtUGY3NURUdkRvYk41Z0ppbUNhdGJIdHpSNTNTYkh6RFoxSjU2YnlLU3NkYzh2U3VqR3VRcHlQamI3THN1YTJOZkFESmV3UHhOekwzTjZUaidcbiAgICAgICkuc2hvdWxkLmVxdWFsKCcwMjYyYjdlODZjMWUzNmU0NWQ0NTEyNjNiNTRhMWMzZDc0MGFiZWFiNjFkMjIxZDExNzVmYzNmZGFkNzUyODUzYWInKTtcbiAgICAgIFV0aWxzLnhwdWJUb1NUWFB1YmtleShcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHUDFhZGszNFZ6UlFKRU1YMjVyQ3hqRXlVOVlGRldOaFdOendQb3FnakxvS2ZucW90THdyejdrQmV2V2JSWm5xVFNRclFEdUp1WVVRYURRNUREUEV6RVhNd1BTOVBFZidcbiAgICAgICkuc2hvdWxkLmVxdWFsKCcwMzY1MjlhMGU0MWNmZDFhOWQyNjViNzRmOGQwMDAyYzkyYzVhZWMxMGQ0MjM5MDAwMjYwYTI1Y2ZkNTRlNDcyNmMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJhc2VBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzV2l0aE1lbW8gPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFg/bWVtb0lkPTI1NSc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzcyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBVdGlscy5nZXRCYXNlQWRkcmVzcyhhZGRyZXNzV2l0aE1lbW8pLnNob3VsZC5lcXVhbChiYXNlQWRkcmVzcyk7XG4gICAgICBVdGlscy5nZXRCYXNlQWRkcmVzcyhiYXNlQWRkcmVzcykuc2hvdWxkLmVxdWFsKGJhc2VBZGRyZXNzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzU2FtZUJhc2VBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgaWYgYmFzZSBhZGRyZXNzIG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWD9tZW1vSWQ9MjU1JztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRYJztcbiAgICAgIFV0aWxzLmlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3MsIGJhc2VBZGRyZXNzKS5zaG91bGQudHJ1ZSgpO1xuXG4gICAgICBjb25zdCBhZGRyZXNzMiA9ICdTTjIzN0tCTkNBMkNaWjMyQ1dNTlRGNzRERkFZQ1BOSjNNTk42QU5EWCc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzczIgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnO1xuICAgICAgVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzczIsIGJhc2VBZGRyZXNzMikuc2hvdWxkLnRydWUoKTtcblxuICAgICAgY29uc3QgYWRkcmVzczMgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFg/bWVtb0lkPTI1NSc7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzczMgPSAnU1QxU1JDQTkzQ0UxV0Q4VEVHMjhCU1dCRlI2OEoyNFpUQUIyRkFKMCc7XG4gICAgICBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzMywgYmFzZUFkZHJlc3MzKS5zaG91bGQuZmFsc2UoKTtcblxuICAgICAgY29uc3QgYWRkcmVzczQgPSAnU04yMzdLQk5DQTJDWlozMkNXTU5URjc0REZBWUNQTkozTU5ONkFORFgnO1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3M0ID0gJ1NUMVNSQ0E5M0NFMVdEOFRFRzI4QlNXQkZSNjhKMjRaVEFCMkZBSjAnO1xuICAgICAgVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzczQsIGJhc2VBZGRyZXNzNCkuc2hvdWxkLmZhbHNlKCk7XG5cbiAgICAgIGNvbnN0IGFkZHJlc3M1ID0gJ1NOMjM3S0JOQ0EyQ1paMzJDV01OVEY3NERGQVlDUE5KM01OTjZBTkRGJztcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzNSA9ICdTVDFTUkNBOTNDRTFXRDhURUcyOEJTV0JGUjY4SjI0WlRBQjJGQUowJztcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IFV0aWxzLmlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3M1LCBiYXNlQWRkcmVzczUpLnNob3VsZC5mYWxzZSgpLFxuICAgICAgICBuZXcgUmVnRXhwKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzczV9YClcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|