@bitgo/abstract-utxo 12.7.0 → 13.0.0

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.
Files changed (64) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  2. package/dist/cjs/src/abstractUtxoCoin.js +3 -3
  3. package/dist/cjs/src/impl/zec/address.d.ts +6 -0
  4. package/dist/cjs/src/impl/zec/address.d.ts.map +1 -1
  5. package/dist/cjs/src/impl/zec/address.js +38 -1
  6. package/dist/cjs/src/impl/zec/recipients.d.ts +2 -1
  7. package/dist/cjs/src/impl/zec/recipients.d.ts.map +1 -1
  8. package/dist/cjs/src/impl/zec/recipients.js +7 -3
  9. package/dist/cjs/src/impl/zec/types.d.ts +5 -0
  10. package/dist/cjs/src/impl/zec/types.d.ts.map +1 -1
  11. package/dist/cjs/src/impl/zec/types.js +1 -1
  12. package/dist/cjs/src/impl/zec/zec.d.ts +21 -2
  13. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -1
  14. package/dist/cjs/src/impl/zec/zec.js +57 -1
  15. package/dist/cjs/src/transaction/explainTransaction.d.ts +2 -1
  16. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
  17. package/dist/cjs/src/transaction/explainTransaction.js +3 -2
  18. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +2 -0
  19. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
  20. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +4 -1
  21. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  22. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +9 -3
  23. package/dist/cjs/src/transaction/recipient.d.ts +24 -1
  24. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -1
  25. package/dist/cjs/src/transaction/recipient.js +32 -4
  26. package/dist/cjs/test/unit/bip322.js +14 -4
  27. package/dist/cjs/test/unit/customChangeWallet.js +3 -1
  28. package/dist/cjs/test/unit/impl/zec/psbtDecode.d.ts +2 -0
  29. package/dist/cjs/test/unit/impl/zec/psbtDecode.d.ts.map +1 -0
  30. package/dist/cjs/test/unit/impl/zec/psbtDecode.js +69 -0
  31. package/dist/cjs/test/unit/impl/zec/shieldedPrebuildAndSign.d.ts +2 -0
  32. package/dist/cjs/test/unit/impl/zec/shieldedPrebuildAndSign.d.ts.map +1 -0
  33. package/dist/cjs/test/unit/impl/zec/shieldedPrebuildAndSign.js +329 -0
  34. package/dist/cjs/test/unit/impl/zec/unit/address.js +23 -1
  35. package/dist/cjs/test/unit/impl/zec/unit/resolvePsbtRecipients.js +7 -5
  36. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +9 -1
  37. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +2 -1
  38. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  39. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  40. package/dist/esm/abstractUtxoCoin.js +3 -3
  41. package/dist/esm/impl/zec/address.d.ts +6 -0
  42. package/dist/esm/impl/zec/address.d.ts.map +1 -1
  43. package/dist/esm/impl/zec/address.js +38 -1
  44. package/dist/esm/impl/zec/recipients.d.ts +2 -1
  45. package/dist/esm/impl/zec/recipients.d.ts.map +1 -1
  46. package/dist/esm/impl/zec/recipients.js +7 -3
  47. package/dist/esm/impl/zec/types.d.ts +5 -0
  48. package/dist/esm/impl/zec/types.d.ts.map +1 -1
  49. package/dist/esm/impl/zec/types.js +1 -1
  50. package/dist/esm/impl/zec/zec.d.ts +21 -2
  51. package/dist/esm/impl/zec/zec.d.ts.map +1 -1
  52. package/dist/esm/impl/zec/zec.js +57 -1
  53. package/dist/esm/transaction/explainTransaction.d.ts +2 -1
  54. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
  55. package/dist/esm/transaction/explainTransaction.js +3 -2
  56. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +2 -0
  57. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
  58. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +4 -1
  59. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  60. package/dist/esm/transaction/fixedScript/parseTransaction.js +9 -3
  61. package/dist/esm/transaction/recipient.d.ts +24 -1
  62. package/dist/esm/transaction/recipient.d.ts.map +1 -1
  63. package/dist/esm/transaction/recipient.js +32 -4
  64. package/package.json +6 -6
@@ -0,0 +1,329 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const sinon = __importStar(require("sinon"));
38
+ const nock = require("nock");
39
+ const sdk_core_1 = require("@bitgo/sdk-core");
40
+ const sdk_test_1 = require("@bitgo/sdk-test");
41
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
42
+ const util_1 = require("../../util");
43
+ const keychains_1 = require("../../util/keychains");
44
+ // ZIP-316 testnet vectors (testnetWallet from the wasm-utxo unified_address fixtures).
45
+ const TESTNET_UNIFIED = 'utest1w5m0qcnp8egl8qa296n70n8nvj0tqnzk90p7f48v7mjhhdrdqs8vgqydslg5plmzefawefnpmgmlm6hcy38m972erwxs04s02cq2prhguz8kqly75m6zjy56m08d5jnycgtpqtjeprte576gkmrxyszepgx76yzuwhh7m4lfz9jaq7unjk0x5ant46juxz73hsc6q4v3dqtzww00vps';
46
+ const TESTNET_TRANSPARENT_ADDRESS = 'tmM4DvLVJKXZt5ydn1tqYTHvahpKSwgjuRk';
47
+ /**
48
+ * Exercises every client-side flow that runs BEFORE verifyTransaction/signTransaction on a
49
+ * shielded (v6 Ironwood) prebuild: prebuild post-processing, explanation, and recipient
50
+ * validation. Each of them must decode the v6 PSBT — via `Zec.decodeTransaction` ->
51
+ * `ZcashPsbt.fromBytes`, which auto-detects the transaction version — and handle the shielded
52
+ * recipient without error.
53
+ */
54
+ const IRONWOOD_RECEIVER = Buffer.from('d632c28aa0831d671be17709a42c9627e2eb687a1b2a55768ea470c9bae7499cd0bd3d0eb0484e307236b5', 'hex');
55
+ let unifiedAddress;
56
+ let walletKeys;
57
+ before(function () {
58
+ unifiedAddress = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.encodeOrchardReceiver(new Uint8Array(IRONWOOD_RECEIVER), 'tzec');
59
+ walletKeys = (0, keychains_1.getDefaultWasmWalletKeys)().walletKeys;
60
+ });
61
+ function buildShieldedV6PrebuildHex() {
62
+ const psbt = wasm_utxo_1.fixedScriptWallet.ZcashIronwoodBitGoPsbt.createEmpty('tzec', walletKeys, { blockHeight: 4200000 });
63
+ psbt.addWalletInput({ txid: '11'.repeat(32), vout: 0, value: 100000n }, walletKeys, {
64
+ scriptId: { chain: 0, index: 0 },
65
+ });
66
+ psbt.addWalletOutput(walletKeys, { chain: 1, index: 0, value: 90000n });
67
+ psbt.addShieldedOutputs([{ recipient: new Uint8Array(IRONWOOD_RECEIVER), amount: 5000n, unifiedAddress }], new Uint8Array(32));
68
+ return Buffer.from(psbt.serialize()).toString('hex');
69
+ }
70
+ function mutateSerializedUnifiedAddress(psbtHex, unifiedAddress) {
71
+ const bytes = Buffer.from(psbtHex, 'hex');
72
+ const metadata = Buffer.from(unifiedAddress, 'utf8');
73
+ const offset = bytes.indexOf(metadata);
74
+ assert.notStrictEqual(offset, -1, 'Unified Address metadata must be present in the serialized PSBT');
75
+ // Change only the metadata bytes. The resulting address is intentionally invalid, which
76
+ // verifies that deserialization does not expose attacker-controlled proprietary metadata.
77
+ bytes[offset] = bytes[offset] === 0x75 ? 0x76 : 0x75;
78
+ return bytes.toString('hex');
79
+ }
80
+ describe('Zec shielded pre-verify flows (v6 Ironwood PSBT)', function () {
81
+ const zec = (0, util_1.getUtxoCoin)('tzec');
82
+ const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
83
+ const keyDocumentObjects = util_1.keychainsBase58.map((keychain, keyIdx) => {
84
+ return {
85
+ id: (0, sdk_test_1.getSeed)(keychain.pub).toString('hex'),
86
+ pub: keychain.pub,
87
+ source: ['user', 'backup', 'bitgo'][keyIdx],
88
+ coinSpecific: {},
89
+ };
90
+ });
91
+ afterEach(function () {
92
+ nock.cleanAll();
93
+ });
94
+ it('sendMany recipient validation accepts the unified address', function () {
95
+ zec.checkRecipient({ address: unifiedAddress, amount: '5000' });
96
+ });
97
+ it('postProcessPrebuild decodes the v6 psbt and re-encodes it unchanged', async function () {
98
+ const prebuildHex = buildShieldedV6PrebuildHex();
99
+ nock(bgUrl).get('/api/v2/tzec/public/block/latest').reply(200, { height: 4200000 });
100
+ const prebuild = await zec.postProcessPrebuild({ txHex: prebuildHex, txInfo: {} });
101
+ assert.match(prebuild.txHex, /^70736274/); // PSBT magic preserved
102
+ const decoded = zec.decodeTransaction(prebuild.txHex);
103
+ assert.ok(decoded instanceof wasm_utxo_1.fixedScriptWallet.ZcashIronwoodBitGoPsbt);
104
+ });
105
+ it('explainTransaction decodes the v6 psbt and resolves the shielded recipient', async function () {
106
+ const explained = await zec.explainTransaction({
107
+ txHex: buildShieldedV6PrebuildHex(),
108
+ pubs: [keyDocumentObjects[0].pub, keyDocumentObjects[1].pub, keyDocumentObjects[2].pub],
109
+ });
110
+ assert.strictEqual(explained.outputs.length, 1);
111
+ assert.strictEqual(explained.outputs[0].address, unifiedAddress);
112
+ assert.strictEqual(explained.outputs[0].amount.toString(), '5000');
113
+ assert.strictEqual(explained.changeOutputs.length, 1);
114
+ });
115
+ it('rejects a v6 PSBT whose preserved UA metadata was mutated after serialization', async function () {
116
+ const mutatedHex = mutateSerializedUnifiedAddress(buildShieldedV6PrebuildHex(), unifiedAddress);
117
+ await assert.rejects(zec.explainTransaction({
118
+ txHex: mutatedHex,
119
+ pubs: [keyDocumentObjects[0].pub, keyDocumentObjects[1].pub, keyDocumentObjects[2].pub],
120
+ }), /does not match its raw script/);
121
+ });
122
+ });
123
+ /**
124
+ * `parseTransaction` must take `unifiedRecipientPreference` into account when decoding a
125
+ * prebuild: a shielded recipient resolves to its 43-byte Orchard receiver, which only matches
126
+ * the PSBT's shielded output when the decode uses the 'shielded' preference. The preference is
127
+ * the caller's explicit `unifiedRecipientPreference`, or — when absent — inferred from the
128
+ * recipients themselves.
129
+ */
130
+ describe('Zec parseTransaction unifiedRecipientPreference (v6 Ironwood PSBT)', function () {
131
+ const tzec = (0, util_1.getUtxoCoin)('tzec');
132
+ function getMockWallet() {
133
+ const mockWallet = sinon.createStubInstance(sdk_core_1.Wallet);
134
+ mockWallet.id.returns('test-wallet-id');
135
+ mockWallet.coin.returns('tzec');
136
+ mockWallet.coinSpecific.returns(undefined);
137
+ return mockWallet;
138
+ }
139
+ function getVerification() {
140
+ const pubs = util_1.keychainsBase58.map((k) => k.pub);
141
+ return {
142
+ disableNetworking: true,
143
+ keychains: {
144
+ user: { id: '0', pub: pubs[0], type: 'independent' },
145
+ backup: { id: '1', pub: pubs[1], type: 'independent' },
146
+ bitgo: { id: '2', pub: pubs[2], type: 'independent' },
147
+ },
148
+ };
149
+ }
150
+ async function parseShieldedV6Prebuild(txParams, txHex = buildShieldedV6PrebuildHex()) {
151
+ return tzec.parseTransaction({
152
+ wallet: getMockWallet(),
153
+ txParams,
154
+ txPrebuild: { txHex },
155
+ verification: getVerification(),
156
+ });
157
+ }
158
+ it('infers the shielded preference from an Orchard-only Unified Address recipient', async function () {
159
+ const parsed = await parseShieldedV6Prebuild({
160
+ recipients: [{ address: unifiedAddress, amount: '5000' }],
161
+ });
162
+ const externalOutputs = parsed.outputs.filter((o) => o.external);
163
+ assert.strictEqual(externalOutputs.length, 1);
164
+ assert.strictEqual(externalOutputs[0].address, unifiedAddress);
165
+ });
166
+ it('rejects a v6 PSBT with mutated UA metadata during parseTransaction', async function () {
167
+ const mutatedHex = mutateSerializedUnifiedAddress(buildShieldedV6PrebuildHex(), unifiedAddress);
168
+ await assert.rejects(parseShieldedV6Prebuild({ recipients: [{ address: unifiedAddress, amount: '5000' }] }, mutatedHex), /does not match its raw script/);
169
+ });
170
+ it('honors an explicit shielded preference', async function () {
171
+ const parsed = await parseShieldedV6Prebuild({
172
+ recipients: [{ address: unifiedAddress, amount: '5000' }],
173
+ unifiedRecipientPreference: 'shielded',
174
+ });
175
+ const externalOutputs = parsed.outputs.filter((o) => o.external);
176
+ assert.strictEqual(externalOutputs.length, 1);
177
+ assert.strictEqual(externalOutputs[0].address, unifiedAddress);
178
+ });
179
+ it('rejects a transparent resolution of a shielded recipient (intent mismatch)', async function () {
180
+ // Forcing the 'transparent' preference resolves the recipient's script — but an
181
+ // Orchard-only UA has no transparent receiver, so the decode must fail rather than
182
+ // silently mismatch.
183
+ await assert.rejects(parseShieldedV6Prebuild({
184
+ recipients: [{ address: unifiedAddress, amount: '5000' }],
185
+ unifiedRecipientPreference: 'transparent',
186
+ }));
187
+ });
188
+ });
189
+ describe('Zec resolveRecipientsFromPsbt (decode + recipient resolution)', function () {
190
+ const tzec = (0, util_1.getUtxoCoin)('tzec');
191
+ const { walletKeys } = (0, keychains_1.getDefaultWasmWalletKeys)();
192
+ const IRONWOOD_HEIGHT = 4200000; // after the NU6.3 testnet activation (4134000)
193
+ function buildShieldedV6Psbt(unifiedAddress = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.encodeOrchardReceiver(new Uint8Array(IRONWOOD_RECEIVER), 'tzec')) {
194
+ const psbt = wasm_utxo_1.fixedScriptWallet.ZcashIronwoodBitGoPsbt.createEmpty('tzec', walletKeys, {
195
+ blockHeight: IRONWOOD_HEIGHT,
196
+ });
197
+ psbt.addWalletInput({ txid: '11'.repeat(32), vout: 0, value: 100000n }, walletKeys, {
198
+ scriptId: { chain: 0, index: 0 },
199
+ });
200
+ psbt.addWalletOutput(walletKeys, { chain: 1, index: 0, value: 90000n });
201
+ psbt.addShieldedOutputs([{ recipient: new Uint8Array(IRONWOOD_RECEIVER), amount: 5000n, unifiedAddress }], new Uint8Array(32) // all-zero anchor, as in the utxo-core shielded build tests
202
+ );
203
+ return psbt;
204
+ }
205
+ function buildTransparentV4Psbt(unifiedAddress) {
206
+ const psbt = wasm_utxo_1.fixedScriptWallet.ZcashBitGoPsbt.createEmpty('tzec', walletKeys, { blockHeight: 3146400 });
207
+ psbt.addWalletInput({ txid: '22'.repeat(32), vout: 0, value: 200000n }, walletKeys, {
208
+ scriptId: { chain: 0, index: 1 },
209
+ });
210
+ psbt.addWalletOutput(walletKeys, { chain: 1, index: 0, value: 100000n });
211
+ const externalScript = tzec.addressCodec.decode(TESTNET_TRANSPARENT_ADDRESS);
212
+ psbt.addTransparentOutput(externalScript, 12345n, unifiedAddress);
213
+ return psbt;
214
+ }
215
+ /** Decode a UA back to its receivers and assert they match the testnet fixture. */
216
+ function assertDecodesBackToFixtureRecipients(unifiedAddress) {
217
+ const parsed = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.parse(unifiedAddress, 'tzec');
218
+ assert.strictEqual(parsed.hasOrchardReceiver, true);
219
+ assert.ok(parsed.orchardReceiver);
220
+ assert.strictEqual(Buffer.from(parsed.orchardReceiver).toString('hex'), IRONWOOD_RECEIVER.toString('hex'));
221
+ assert.strictEqual(parsed.hasTransparentReceiver, true);
222
+ assert.ok(parsed.transparentScript);
223
+ assert.strictEqual(Buffer.from(parsed.transparentScript).toString('hex'), Buffer.from(tzec.addressCodec.decode(TESTNET_TRANSPARENT_ADDRESS)).toString('hex'));
224
+ }
225
+ it('rejects a v4 PSBT whose preserved UA metadata was mutated after serialization', function () {
226
+ const mutatedHex = mutateSerializedUnifiedAddress(Buffer.from(buildTransparentV4Psbt(TESTNET_UNIFIED).serialize()).toString('hex'), TESTNET_UNIFIED);
227
+ assert.throws(() => tzec.resolveRecipientsFromPsbt(mutatedHex, walletKeys), /does not match its raw recipient/);
228
+ });
229
+ it('explainTransaction rejects a v4 PSBT whose preserved UA metadata was mutated', async function () {
230
+ const mutatedHex = mutateSerializedUnifiedAddress(Buffer.from(buildTransparentV4Psbt(TESTNET_UNIFIED).serialize()).toString('hex'), TESTNET_UNIFIED);
231
+ await assert.rejects(tzec.explainTransaction({
232
+ txHex: mutatedHex,
233
+ pubs: util_1.keychainsBase58.map((keychain) => keychain.pub),
234
+ }), /does not match its raw script/);
235
+ });
236
+ it('resolves a shielded v6 (Ironwood) output to its Orchard Unified Address recipient', function () {
237
+ const recipients = tzec.resolveRecipientsFromPsbt(Buffer.from(buildShieldedV6Psbt().serialize()), walletKeys);
238
+ assert.strictEqual(recipients.length, 1);
239
+ const recipient = recipients[0];
240
+ assert.strictEqual(recipient.destination.kind, 'zcashShielded');
241
+ assert.strictEqual(recipient.amount, 5000n);
242
+ assert.ok(recipient.address.startsWith('utest1'));
243
+ assert.strictEqual(recipient.address, recipient.destination.unifiedAddress);
244
+ assert.strictEqual(Buffer.from(recipient.script).toString('hex'), IRONWOOD_RECEIVER.toString('hex'));
245
+ });
246
+ it('rejects a v6 PSBT whose preserved UA metadata was mutated after serialization', function () {
247
+ const mutatedHex = mutateSerializedUnifiedAddress(Buffer.from(buildShieldedV6Psbt(TESTNET_UNIFIED).serialize()).toString('hex'), TESTNET_UNIFIED);
248
+ assert.throws(() => tzec.resolveRecipientsFromPsbt(mutatedHex, walletKeys), /does not match its raw recipient/);
249
+ });
250
+ it('explainTransaction rejects a v6 PSBT whose preserved UA metadata was mutated', async function () {
251
+ const mutatedHex = mutateSerializedUnifiedAddress(Buffer.from(buildShieldedV6Psbt(TESTNET_UNIFIED).serialize()).toString('hex'), TESTNET_UNIFIED);
252
+ await assert.rejects(tzec.explainTransaction({
253
+ txHex: mutatedHex,
254
+ pubs: util_1.keychainsBase58.map((keychain) => keychain.pub),
255
+ }), /does not match its raw script/);
256
+ });
257
+ it('resolves transparent external outputs and excludes change', function () {
258
+ const recipients = tzec.resolveRecipientsFromPsbt(Buffer.from(buildTransparentV4Psbt().serialize()), walletKeys);
259
+ assert.strictEqual(recipients.length, 1);
260
+ const recipient = recipients[0];
261
+ assert.strictEqual(recipient.destination.kind, 'transparent');
262
+ assert.strictEqual(recipient.address, TESTNET_TRANSPARENT_ADDRESS);
263
+ assert.strictEqual(recipient.amount, 12345n);
264
+ });
265
+ it('reports the original multi-receiver UA for a shielded output and decodes it back', function () {
266
+ const recipients = tzec.resolveRecipientsFromPsbt(Buffer.from(buildShieldedV6Psbt(TESTNET_UNIFIED).serialize()), walletKeys);
267
+ assert.strictEqual(recipients.length, 1);
268
+ const recipient = recipients[0];
269
+ assert.strictEqual(recipient.destination.kind, 'zcashShielded');
270
+ assert.strictEqual(recipient.address, TESTNET_UNIFIED);
271
+ assert.strictEqual(recipient.unifiedAddress, TESTNET_UNIFIED);
272
+ assert.strictEqual(recipient.destination.unifiedAddress, TESTNET_UNIFIED);
273
+ assert.strictEqual(Buffer.from(recipient.script).toString('hex'), IRONWOOD_RECEIVER.toString('hex'));
274
+ assertDecodesBackToFixtureRecipients(recipient.unifiedAddress);
275
+ });
276
+ it('reports the original multi-receiver UA for a transparent v4 output and decodes it back', function () {
277
+ const recipients = tzec.resolveRecipientsFromPsbt(Buffer.from(buildTransparentV4Psbt(TESTNET_UNIFIED).serialize()), walletKeys);
278
+ assert.strictEqual(recipients.length, 1);
279
+ const recipient = recipients[0];
280
+ assert.strictEqual(recipient.destination.kind, 'zcashUnifiedTransparent');
281
+ assert.strictEqual(recipient.address, TESTNET_UNIFIED);
282
+ assert.strictEqual(recipient.unifiedAddress, TESTNET_UNIFIED);
283
+ assert.strictEqual(recipient.destination.unifiedAddress, TESTNET_UNIFIED);
284
+ assertDecodesBackToFixtureRecipients(recipient.unifiedAddress);
285
+ });
286
+ it('resolves recipients from a hex PSBT string', function () {
287
+ const hex = Buffer.from(buildShieldedV6Psbt().serialize()).toString('hex');
288
+ const recipients = tzec.resolveRecipientsFromPsbt(hex, walletKeys);
289
+ assert.strictEqual(recipients.length, 1);
290
+ assert.strictEqual(recipients[0].destination.kind, 'zcashShielded');
291
+ });
292
+ it('throws for a non-Zcash PSBT', function () {
293
+ const psbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.createEmpty('btc', walletKeys, {});
294
+ psbt.addWalletInput({ txid: '33'.repeat(32), vout: 0, value: 1000n }, walletKeys, {
295
+ scriptId: { chain: 0, index: 0 },
296
+ });
297
+ // Zec.decodeTransaction hands the btc PSBT to ZcashPsbt.fromBytes, which rejects it for
298
+ // its missing Zcash consensus branch ID before the Zcash-type guard is ever reached.
299
+ assert.throws(() => tzec.resolveRecipientsFromPsbt(Buffer.from(psbt.serialize()), walletKeys));
300
+ });
301
+ });
302
+ describe('Zec getExtraPrebuildParams (unifiedRecipientPreference forwarding)', function () {
303
+ const zec = (0, util_1.getUtxoCoin)('zec');
304
+ function mockWallet(coin = zec) {
305
+ return new sdk_core_1.Wallet(util_1.defaultBitGo, coin, { id: '5b34252f1bf349930e34020a', coin: coin.getChain(), type: 'hot' });
306
+ }
307
+ it('forwards unifiedRecipientPreference when present', async function () {
308
+ const wallet = mockWallet();
309
+ const result = await zec.getExtraPrebuildParams({
310
+ wallet,
311
+ unifiedRecipientPreference: 'shielded',
312
+ });
313
+ assert.strictEqual(result.unifiedRecipientPreference, 'shielded');
314
+ });
315
+ it('does not set unifiedRecipientPreference when absent', async function () {
316
+ const wallet = mockWallet();
317
+ const result = await zec.getExtraPrebuildParams({ wallet });
318
+ assert.strictEqual('unifiedRecipientPreference' in result, false);
319
+ });
320
+ it('still returns the standard extra prebuild params (txFormat) unchanged', async function () {
321
+ const wallet = mockWallet();
322
+ const result = await zec.getExtraPrebuildParams({
323
+ wallet,
324
+ unifiedRecipientPreference: 'shielded',
325
+ });
326
+ assert.strictEqual(result.txFormat, 'psbt-lite');
327
+ });
328
+ });
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpZWxkZWRQcmVidWlsZEFuZFNpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvaW1wbC96ZWMvc2hpZWxkZWRQcmVidWlsZEFuZFNpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFFakMsNkNBQStCO0FBQy9CLDZCQUE4QjtBQUM5Qiw4Q0FBc0U7QUFDdEUsOENBQTBDO0FBQzFDLGdEQUFxRDtBQUVyRCxxQ0FBd0U7QUFDeEUsb0RBQWdFO0FBSWhFLHVGQUF1RjtBQUN2RixNQUFNLGVBQWUsR0FDbkIsMk5BQTJOLENBQUM7QUFDOU4sTUFBTSwyQkFBMkIsR0FBRyxxQ0FBcUMsQ0FBQztBQUUxRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ25DLHdGQUF3RixFQUN4RixLQUFLLENBQ04sQ0FBQztBQUNGLElBQUksY0FBc0IsQ0FBQztBQUMzQixJQUFJLFVBQTRDLENBQUM7QUFFakQsTUFBTSxDQUFDO0lBQ0wsY0FBYyxHQUFHLDZCQUFpQixDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUMxRSxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNqQyxNQUFNLENBQ1AsQ0FBQztJQUNGLFVBQVUsR0FBRyxJQUFBLG9DQUF3QixHQUFFLENBQUMsVUFBVSxDQUFDO0FBQ3JELENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUywwQkFBMEI7SUFDakMsTUFBTSxJQUFJLEdBQUcsNkJBQWlCLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoSCxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFO1FBQ2xGLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUNqQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN4RSxJQUFJLENBQUMsa0JBQWtCLENBQ3JCLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQ2pGLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUNuQixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsU0FBUyw4QkFBOEIsQ0FBQyxPQUFlLEVBQUUsY0FBc0I7SUFDN0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxpRUFBaUUsQ0FBQyxDQUFDO0lBQ3JHLHdGQUF3RjtJQUN4RiwwRkFBMEY7SUFDMUYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JELE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBQ0QsUUFBUSxDQUFDLGtEQUFrRCxFQUFFO0lBQzNELE1BQU0sR0FBRyxHQUFHLElBQUEsa0JBQVcsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTdELE1BQU0sa0JBQWtCLEdBQUcsc0JBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbEUsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFBLGtCQUFPLEVBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDekMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzNDLFlBQVksRUFBRSxFQUFFO1NBQ2pCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRTtRQUM5RCxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxRUFBcUUsRUFBRSxLQUFLO1FBQzdFLE1BQU0sV0FBVyxHQUFHLDBCQUEwQixFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsdUJBQXVCO1FBQzVFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFlBQVksNkJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxLQUFLO1FBQ3BGLE1BQU0sU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixDQUFDO1lBQzdDLEtBQUssRUFBRSwwQkFBMEIsRUFBRTtZQUNuQyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUN4RixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtFQUErRSxFQUFFLEtBQUs7UUFDdkYsTUFBTSxVQUFVLEdBQUcsOEJBQThCLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNoRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQ2xCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztZQUNyQixLQUFLLEVBQUUsVUFBVTtZQUNqQixJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUN4RixDQUFDLEVBQ0YsK0JBQStCLENBQ2hDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7OztHQU1HO0FBQ0gsUUFBUSxDQUFDLG9FQUFvRSxFQUFFO0lBQzdFLE1BQU0sSUFBSSxHQUFHLElBQUEsa0JBQVcsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxTQUFTLGFBQWE7UUFDcEIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGlCQUFNLENBQUMsQ0FBQztRQUNwRCxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sVUFBbUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsU0FBUyxlQUFlO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLHNCQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsT0FBTztZQUNMLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQUNwRCxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRTtnQkFDdEQsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7YUFDdEQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssVUFBVSx1QkFBdUIsQ0FDcEMsUUFHQyxFQUNELEtBQUssR0FBRywwQkFBMEIsRUFBRTtRQUVwQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUMzQixNQUFNLEVBQUUsYUFBYSxFQUFFO1lBQ3ZCLFFBQVE7WUFDUixVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUU7WUFDckIsWUFBWSxFQUFFLGVBQWUsRUFBRTtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsRUFBRSxDQUFDLCtFQUErRSxFQUFFLEtBQUs7UUFDdkYsTUFBTSxNQUFNLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztZQUMzQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQzFELENBQUMsQ0FBQztRQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxLQUFLO1FBQzVFLE1BQU0sVUFBVSxHQUFHLDhCQUE4QixDQUFDLDBCQUEwQixFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUNsQix1QkFBdUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUNsRywrQkFBK0IsQ0FDaEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUs7UUFDaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztZQUMzQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3pELDBCQUEwQixFQUFFLFVBQVU7U0FDdkMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEtBQUs7UUFDcEYsZ0ZBQWdGO1FBQ2hGLG1GQUFtRjtRQUNuRixxQkFBcUI7UUFDckIsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUNsQix1QkFBdUIsQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3pELDBCQUEwQixFQUFFLGFBQWE7U0FDMUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLCtEQUErRCxFQUFFO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUEsa0JBQVcsRUFBQyxNQUFNLENBQVEsQ0FBQztJQUN4QyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBQSxvQ0FBd0IsR0FBRSxDQUFDO0lBQ2xELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxDQUFDLCtDQUErQztJQUVoRixTQUFTLG1CQUFtQixDQUMxQixjQUFjLEdBQUcsNkJBQWlCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQzFFLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQ2pDLE1BQU0sQ0FDUDtRQUVELE1BQU0sSUFBSSxHQUFHLDZCQUFpQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFO1lBQ3BGLFdBQVcsRUFBRSxlQUFlO1NBQzdCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUU7WUFDbEYsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFDakYsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsNERBQTREO1NBQ2hGLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTLHNCQUFzQixDQUFDLGNBQXVCO1FBQ3JELE1BQU0sSUFBSSxHQUFHLDZCQUFpQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUU7WUFDbEYsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLFNBQVMsb0NBQW9DLENBQUMsY0FBc0I7UUFDbEUsTUFBTSxNQUFNLEdBQUcsNkJBQWlCLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRixNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ25GLENBQUM7SUFDSixDQUFDO0lBQ0QsRUFBRSxDQUFDLCtFQUErRSxFQUFFO1FBQ2xGLE1BQU0sVUFBVSxHQUFHLDhCQUE4QixDQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUNoRixlQUFlLENBQ2hCLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUNsSCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4RUFBOEUsRUFBRSxLQUFLO1FBQ3RGLE1BQU0sVUFBVSxHQUFHLDhCQUE4QixDQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUNoRixlQUFlLENBQ2hCLENBQUM7UUFDRixNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN0QixLQUFLLEVBQUUsVUFBVTtZQUNqQixJQUFJLEVBQUUsc0JBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQTZCO1NBQ2xGLENBQUMsRUFDRiwrQkFBK0IsQ0FDaEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLG1GQUFtRixFQUFFO1FBQ3RGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5RyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1RSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrRUFBK0UsRUFBRTtRQUNsRixNQUFNLFVBQVUsR0FBRyw4QkFBOEIsQ0FDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDN0UsZUFBZSxDQUNoQixDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7SUFDbEgsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEVBQThFLEVBQUUsS0FBSztRQUN0RixNQUFNLFVBQVUsR0FBRyw4QkFBOEIsQ0FDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDN0UsZUFBZSxDQUNoQixDQUFDO1FBQ0YsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDdEIsS0FBSyxFQUFFLFVBQVU7WUFDakIsSUFBSSxFQUFFLHNCQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUE2QjtTQUNsRixDQUFDLEVBQ0YsK0JBQStCLENBQ2hDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQywyREFBMkQsRUFBRTtRQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDakgsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrRkFBa0YsRUFBRTtRQUNyRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsRUFDN0QsVUFBVSxDQUNYLENBQUM7UUFDRixNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM5RCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLG9DQUFvQyxDQUFDLFNBQVMsQ0FBQyxjQUF3QixDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0ZBQXdGLEVBQUU7UUFDM0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQ2hFLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM5RCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzFFLG9DQUFvQyxDQUFDLFNBQVMsQ0FBQyxjQUF3QixDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUU7UUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7UUFDaEMsTUFBTSxJQUFJLEdBQUcsNkJBQWlCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUU7WUFDaEYsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUNILHdGQUF3RjtRQUN4RixxRkFBcUY7UUFDckYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsb0VBQW9FLEVBQUU7SUFDN0UsTUFBTSxHQUFHLEdBQUcsSUFBQSxrQkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9CLFNBQVMsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHO1FBQzVCLE9BQU8sSUFBSSxpQkFBTSxDQUFDLG1CQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUVELEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLO1FBQzFELE1BQU0sTUFBTSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUE0QixNQUFNLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztZQUN2RSxNQUFNO1lBQ04sMEJBQTBCLEVBQUUsVUFBVTtTQUN2QyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxLQUFLO1FBQzdELE1BQU0sTUFBTSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsV0FBVyxDQUFDLDRCQUE0QixJQUFJLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1RUFBdUUsRUFBRSxLQUFLO1FBQy9FLE1BQU0sTUFBTSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLHNCQUFzQixDQUFDO1lBQzlDLE1BQU07WUFDTiwwQkFBMEIsRUFBRSxVQUFVO1NBQ3ZDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgY29tbW9uLCBWZXJpZmljYXRpb25PcHRpb25zLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZ2V0U2VlZCB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBkZWZhdWx0Qml0R28sIGdldFV0eG9Db2luLCBrZXljaGFpbnNCYXNlNTggfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cyB9IGZyb20gJy4uLy4uL3V0aWwva2V5Y2hhaW5zJztcbmltcG9ydCB0eXBlIHsgWmVjIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjJztcbmltcG9ydCB7IFV0eG9XYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvd2FsbGV0JztcblxuLy8gWklQLTMxNiB0ZXN0bmV0IHZlY3RvcnMgKHRlc3RuZXRXYWxsZXQgZnJvbSB0aGUgd2FzbS11dHhvIHVuaWZpZWRfYWRkcmVzcyBmaXh0dXJlcykuXG5jb25zdCBURVNUTkVUX1VOSUZJRUQgPVxuICAndXRlc3QxdzVtMHFjbnA4ZWdsOHFhMjk2bjcwbjhudmowdHFuems5MHA3ZjQ4djdtamhoZHJkcXM4dmdxeWRzbGc1cGxtemVmYXdlZm5wbWdtbG02aGN5MzhtOTcyZXJ3eHMwNHMwMmNxMnByaGd1ejhrcWx5NzVtNnpqeTU2bTA4ZDVqbnljZ3RwcXRqZXBydGU1NzZna21yeHlzemVwZ3g3Nnl6dXdoaDdtNGxmejlqYXE3dW5qazB4NWFudDQ2anV4ejczaHNjNnE0djNkcXR6d3cwMHZwcyc7XG5jb25zdCBURVNUTkVUX1RSQU5TUEFSRU5UX0FERFJFU1MgPSAndG1NNER2TFZKS1hadDV5ZG4xdHFZVEh2YWhwS1N3Z2p1UmsnO1xuXG4vKipcbiAqIEV4ZXJjaXNlcyBldmVyeSBjbGllbnQtc2lkZSBmbG93IHRoYXQgcnVucyBCRUZPUkUgdmVyaWZ5VHJhbnNhY3Rpb24vc2lnblRyYW5zYWN0aW9uIG9uIGFcbiAqIHNoaWVsZGVkICh2NiBJcm9ud29vZCkgcHJlYnVpbGQ6IHByZWJ1aWxkIHBvc3QtcHJvY2Vzc2luZywgZXhwbGFuYXRpb24sIGFuZCByZWNpcGllbnRcbiAqIHZhbGlkYXRpb24uIEVhY2ggb2YgdGhlbSBtdXN0IGRlY29kZSB0aGUgdjYgUFNCVCDigJQgdmlhIGBaZWMuZGVjb2RlVHJhbnNhY3Rpb25gIC0+XG4gKiBgWmNhc2hQc2J0LmZyb21CeXRlc2AsIHdoaWNoIGF1dG8tZGV0ZWN0cyB0aGUgdHJhbnNhY3Rpb24gdmVyc2lvbiDigJQgYW5kIGhhbmRsZSB0aGUgc2hpZWxkZWRcbiAqIHJlY2lwaWVudCB3aXRob3V0IGVycm9yLlxuICovXG5jb25zdCBJUk9OV09PRF9SRUNFSVZFUiA9IEJ1ZmZlci5mcm9tKFxuICAnZDYzMmMyOGFhMDgzMWQ2NzFiZTE3NzA5YTQyYzk2MjdlMmViNjg3YTFiMmE1NTc2OGVhNDcwYzliYWU3NDk5Y2QwYmQzZDBlYjA0ODRlMzA3MjM2YjUnLFxuICAnaGV4J1xuKTtcbmxldCB1bmlmaWVkQWRkcmVzczogc3RyaW5nO1xubGV0IHdhbGxldEtleXM6IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzO1xuXG5iZWZvcmUoZnVuY3Rpb24gKCkge1xuICB1bmlmaWVkQWRkcmVzcyA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MuZW5jb2RlT3JjaGFyZFJlY2VpdmVyKFxuICAgIG5ldyBVaW50OEFycmF5KElST05XT09EX1JFQ0VJVkVSKSxcbiAgICAndHplYydcbiAgKTtcbiAgd2FsbGV0S2V5cyA9IGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cygpLndhbGxldEtleXM7XG59KTtcblxuZnVuY3Rpb24gYnVpbGRTaGllbGRlZFY2UHJlYnVpbGRIZXgoKTogc3RyaW5nIHtcbiAgY29uc3QgcHNidCA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoSXJvbndvb2RCaXRHb1BzYnQuY3JlYXRlRW1wdHkoJ3R6ZWMnLCB3YWxsZXRLZXlzLCB7IGJsb2NrSGVpZ2h0OiA0MjAwMDAwIH0pO1xuICBwc2J0LmFkZFdhbGxldElucHV0KHsgdHhpZDogJzExJy5yZXBlYXQoMzIpLCB2b3V0OiAwLCB2YWx1ZTogMTAwMDAwbiB9LCB3YWxsZXRLZXlzLCB7XG4gICAgc2NyaXB0SWQ6IHsgY2hhaW46IDAsIGluZGV4OiAwIH0sXG4gIH0pO1xuICBwc2J0LmFkZFdhbGxldE91dHB1dCh3YWxsZXRLZXlzLCB7IGNoYWluOiAxLCBpbmRleDogMCwgdmFsdWU6IDkwMDAwbiB9KTtcbiAgcHNidC5hZGRTaGllbGRlZE91dHB1dHMoXG4gICAgW3sgcmVjaXBpZW50OiBuZXcgVWludDhBcnJheShJUk9OV09PRF9SRUNFSVZFUiksIGFtb3VudDogNTAwMG4sIHVuaWZpZWRBZGRyZXNzIH1dLFxuICAgIG5ldyBVaW50OEFycmF5KDMyKVxuICApO1xuICByZXR1cm4gQnVmZmVyLmZyb20ocHNidC5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpO1xufVxuXG5mdW5jdGlvbiBtdXRhdGVTZXJpYWxpemVkVW5pZmllZEFkZHJlc3MocHNidEhleDogc3RyaW5nLCB1bmlmaWVkQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbShwc2J0SGV4LCAnaGV4Jyk7XG4gIGNvbnN0IG1ldGFkYXRhID0gQnVmZmVyLmZyb20odW5pZmllZEFkZHJlc3MsICd1dGY4Jyk7XG4gIGNvbnN0IG9mZnNldCA9IGJ5dGVzLmluZGV4T2YobWV0YWRhdGEpO1xuICBhc3NlcnQubm90U3RyaWN0RXF1YWwob2Zmc2V0LCAtMSwgJ1VuaWZpZWQgQWRkcmVzcyBtZXRhZGF0YSBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIHNlcmlhbGl6ZWQgUFNCVCcpO1xuICAvLyBDaGFuZ2Ugb25seSB0aGUgbWV0YWRhdGEgYnl0ZXMuIFRoZSByZXN1bHRpbmcgYWRkcmVzcyBpcyBpbnRlbnRpb25hbGx5IGludmFsaWQsIHdoaWNoXG4gIC8vIHZlcmlmaWVzIHRoYXQgZGVzZXJpYWxpemF0aW9uIGRvZXMgbm90IGV4cG9zZSBhdHRhY2tlci1jb250cm9sbGVkIHByb3ByaWV0YXJ5IG1ldGFkYXRhLlxuICBieXRlc1tvZmZzZXRdID0gYnl0ZXNbb2Zmc2V0XSA9PT0gMHg3NSA/IDB4NzYgOiAweDc1O1xuICByZXR1cm4gYnl0ZXMudG9TdHJpbmcoJ2hleCcpO1xufVxuZGVzY3JpYmUoJ1plYyBzaGllbGRlZCBwcmUtdmVyaWZ5IGZsb3dzICh2NiBJcm9ud29vZCBQU0JUKScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgemVjID0gZ2V0VXR4b0NvaW4oJ3R6ZWMnKTtcbiAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2RlZmF1bHRCaXRHby5nZXRFbnYoKV0udXJpO1xuXG4gIGNvbnN0IGtleURvY3VtZW50T2JqZWN0cyA9IGtleWNoYWluc0Jhc2U1OC5tYXAoKGtleWNoYWluLCBrZXlJZHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGdldFNlZWQoa2V5Y2hhaW4ucHViKS50b1N0cmluZygnaGV4JyksXG4gICAgICBwdWI6IGtleWNoYWluLnB1YixcbiAgICAgIHNvdXJjZTogWyd1c2VyJywgJ2JhY2t1cCcsICdiaXRnbyddW2tleUlkeF0sXG4gICAgICBjb2luU3BlY2lmaWM6IHt9LFxuICAgIH07XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICB9KTtcblxuICBpdCgnc2VuZE1hbnkgcmVjaXBpZW50IHZhbGlkYXRpb24gYWNjZXB0cyB0aGUgdW5pZmllZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIHplYy5jaGVja1JlY2lwaWVudCh7IGFkZHJlc3M6IHVuaWZpZWRBZGRyZXNzLCBhbW91bnQ6ICc1MDAwJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Bvc3RQcm9jZXNzUHJlYnVpbGQgZGVjb2RlcyB0aGUgdjYgcHNidCBhbmQgcmUtZW5jb2RlcyBpdCB1bmNoYW5nZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcHJlYnVpbGRIZXggPSBidWlsZFNoaWVsZGVkVjZQcmVidWlsZEhleCgpO1xuICAgIG5vY2soYmdVcmwpLmdldCgnL2FwaS92Mi90emVjL3B1YmxpYy9ibG9jay9sYXRlc3QnKS5yZXBseSgyMDAsIHsgaGVpZ2h0OiA0MjAwMDAwIH0pO1xuICAgIGNvbnN0IHByZWJ1aWxkID0gYXdhaXQgemVjLnBvc3RQcm9jZXNzUHJlYnVpbGQoeyB0eEhleDogcHJlYnVpbGRIZXgsIHR4SW5mbzoge30gfSk7XG4gICAgYXNzZXJ0Lm1hdGNoKHByZWJ1aWxkLnR4SGV4IGFzIHN0cmluZywgL143MDczNjI3NC8pOyAvLyBQU0JUIG1hZ2ljIHByZXNlcnZlZFxuICAgIGNvbnN0IGRlY29kZWQgPSB6ZWMuZGVjb2RlVHJhbnNhY3Rpb24ocHJlYnVpbGQudHhIZXggYXMgc3RyaW5nKTtcbiAgICBhc3NlcnQub2soZGVjb2RlZCBpbnN0YW5jZW9mIGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoSXJvbndvb2RCaXRHb1BzYnQpO1xuICB9KTtcblxuICBpdCgnZXhwbGFpblRyYW5zYWN0aW9uIGRlY29kZXMgdGhlIHY2IHBzYnQgYW5kIHJlc29sdmVzIHRoZSBzaGllbGRlZCByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpbmVkID0gYXdhaXQgemVjLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogYnVpbGRTaGllbGRlZFY2UHJlYnVpbGRIZXgoKSxcbiAgICAgIHB1YnM6IFtrZXlEb2N1bWVudE9iamVjdHNbMF0ucHViLCBrZXlEb2N1bWVudE9iamVjdHNbMV0ucHViLCBrZXlEb2N1bWVudE9iamVjdHNbMl0ucHViXSxcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFpbmVkLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFpbmVkLm91dHB1dHNbMF0uYWRkcmVzcywgdW5pZmllZEFkZHJlc3MpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYWluZWQub3V0cHV0c1swXS5hbW91bnQudG9TdHJpbmcoKSwgJzUwMDAnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFpbmVkLmNoYW5nZU91dHB1dHMubGVuZ3RoLCAxKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSB2NiBQU0JUIHdob3NlIHByZXNlcnZlZCBVQSBtZXRhZGF0YSB3YXMgbXV0YXRlZCBhZnRlciBzZXJpYWxpemF0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG11dGF0ZWRIZXggPSBtdXRhdGVTZXJpYWxpemVkVW5pZmllZEFkZHJlc3MoYnVpbGRTaGllbGRlZFY2UHJlYnVpbGRIZXgoKSwgdW5pZmllZEFkZHJlc3MpO1xuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgemVjLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiBtdXRhdGVkSGV4LFxuICAgICAgICBwdWJzOiBba2V5RG9jdW1lbnRPYmplY3RzWzBdLnB1Yiwga2V5RG9jdW1lbnRPYmplY3RzWzFdLnB1Yiwga2V5RG9jdW1lbnRPYmplY3RzWzJdLnB1Yl0sXG4gICAgICB9KSxcbiAgICAgIC9kb2VzIG5vdCBtYXRjaCBpdHMgcmF3IHNjcmlwdC9cbiAgICApO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIGBwYXJzZVRyYW5zYWN0aW9uYCBtdXN0IHRha2UgYHVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlYCBpbnRvIGFjY291bnQgd2hlbiBkZWNvZGluZyBhXG4gKiBwcmVidWlsZDogYSBzaGllbGRlZCByZWNpcGllbnQgcmVzb2x2ZXMgdG8gaXRzIDQzLWJ5dGUgT3JjaGFyZCByZWNlaXZlciwgd2hpY2ggb25seSBtYXRjaGVzXG4gKiB0aGUgUFNCVCdzIHNoaWVsZGVkIG91dHB1dCB3aGVuIHRoZSBkZWNvZGUgdXNlcyB0aGUgJ3NoaWVsZGVkJyBwcmVmZXJlbmNlLiBUaGUgcHJlZmVyZW5jZSBpc1xuICogdGhlIGNhbGxlcidzIGV4cGxpY2l0IGB1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZWAsIG9yIOKAlCB3aGVuIGFic2VudCDigJQgaW5mZXJyZWQgZnJvbSB0aGVcbiAqIHJlY2lwaWVudHMgdGhlbXNlbHZlcy5cbiAqL1xuZGVzY3JpYmUoJ1plYyBwYXJzZVRyYW5zYWN0aW9uIHVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlICh2NiBJcm9ud29vZCBQU0JUKScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgdHplYyA9IGdldFV0eG9Db2luKCd0emVjJyk7XG5cbiAgZnVuY3Rpb24gZ2V0TW9ja1dhbGxldCgpOiBVdHhvV2FsbGV0IHtcbiAgICBjb25zdCBtb2NrV2FsbGV0ID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFdhbGxldCk7XG4gICAgbW9ja1dhbGxldC5pZC5yZXR1cm5zKCd0ZXN0LXdhbGxldC1pZCcpO1xuICAgIG1vY2tXYWxsZXQuY29pbi5yZXR1cm5zKCd0emVjJyk7XG4gICAgbW9ja1dhbGxldC5jb2luU3BlY2lmaWMucmV0dXJucyh1bmRlZmluZWQpO1xuICAgIHJldHVybiBtb2NrV2FsbGV0IGFzIHVua25vd24gYXMgVXR4b1dhbGxldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFZlcmlmaWNhdGlvbigpOiBWZXJpZmljYXRpb25PcHRpb25zIHtcbiAgICBjb25zdCBwdWJzID0ga2V5Y2hhaW5zQmFzZTU4Lm1hcCgoaykgPT4gay5wdWIpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNhYmxlTmV0d29ya2luZzogdHJ1ZSxcbiAgICAgIGtleWNoYWluczoge1xuICAgICAgICB1c2VyOiB7IGlkOiAnMCcsIHB1YjogcHVic1swXSwgdHlwZTogJ2luZGVwZW5kZW50JyB9LFxuICAgICAgICBiYWNrdXA6IHsgaWQ6ICcxJywgcHViOiBwdWJzWzFdLCB0eXBlOiAnaW5kZXBlbmRlbnQnIH0sXG4gICAgICAgIGJpdGdvOiB7IGlkOiAnMicsIHB1YjogcHVic1syXSwgdHlwZTogJ2luZGVwZW5kZW50JyB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcGFyc2VTaGllbGRlZFY2UHJlYnVpbGQoXG4gICAgdHhQYXJhbXM6IHtcbiAgICAgIHJlY2lwaWVudHM6IHsgYWRkcmVzczogc3RyaW5nOyBhbW91bnQ6IHN0cmluZyB9W107XG4gICAgICB1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZT86ICdzaGllbGRlZCcgfCAndHJhbnNwYXJlbnQnO1xuICAgIH0sXG4gICAgdHhIZXggPSBidWlsZFNoaWVsZGVkVjZQcmVidWlsZEhleCgpXG4gICkge1xuICAgIHJldHVybiB0emVjLnBhcnNlVHJhbnNhY3Rpb24oe1xuICAgICAgd2FsbGV0OiBnZXRNb2NrV2FsbGV0KCksXG4gICAgICB0eFBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSxcbiAgICAgIHZlcmlmaWNhdGlvbjogZ2V0VmVyaWZpY2F0aW9uKCksXG4gICAgfSk7XG4gIH1cblxuICBpdCgnaW5mZXJzIHRoZSBzaGllbGRlZCBwcmVmZXJlbmNlIGZyb20gYW4gT3JjaGFyZC1vbmx5IFVuaWZpZWQgQWRkcmVzcyByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGFyc2VkID0gYXdhaXQgcGFyc2VTaGllbGRlZFY2UHJlYnVpbGQoe1xuICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdW5pZmllZEFkZHJlc3MsIGFtb3VudDogJzUwMDAnIH1dLFxuICAgIH0pO1xuICAgIGNvbnN0IGV4dGVybmFsT3V0cHV0cyA9IHBhcnNlZC5vdXRwdXRzLmZpbHRlcigobykgPT4gby5leHRlcm5hbCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4dGVybmFsT3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHRlcm5hbE91dHB1dHNbMF0uYWRkcmVzcywgdW5pZmllZEFkZHJlc3MpO1xuICB9KTtcbiAgaXQoJ3JlamVjdHMgYSB2NiBQU0JUIHdpdGggbXV0YXRlZCBVQSBtZXRhZGF0YSBkdXJpbmcgcGFyc2VUcmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtdXRhdGVkSGV4ID0gbXV0YXRlU2VyaWFsaXplZFVuaWZpZWRBZGRyZXNzKGJ1aWxkU2hpZWxkZWRWNlByZWJ1aWxkSGV4KCksIHVuaWZpZWRBZGRyZXNzKTtcbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHBhcnNlU2hpZWxkZWRWNlByZWJ1aWxkKHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogdW5pZmllZEFkZHJlc3MsIGFtb3VudDogJzUwMDAnIH1dIH0sIG11dGF0ZWRIZXgpLFxuICAgICAgL2RvZXMgbm90IG1hdGNoIGl0cyByYXcgc2NyaXB0L1xuICAgICk7XG4gIH0pO1xuICBpdCgnaG9ub3JzIGFuIGV4cGxpY2l0IHNoaWVsZGVkIHByZWZlcmVuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGFyc2VkID0gYXdhaXQgcGFyc2VTaGllbGRlZFY2UHJlYnVpbGQoe1xuICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdW5pZmllZEFkZHJlc3MsIGFtb3VudDogJzUwMDAnIH1dLFxuICAgICAgdW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2U6ICdzaGllbGRlZCcsXG4gICAgfSk7XG4gICAgY29uc3QgZXh0ZXJuYWxPdXRwdXRzID0gcGFyc2VkLm91dHB1dHMuZmlsdGVyKChvKSA9PiBvLmV4dGVybmFsKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXh0ZXJuYWxPdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4dGVybmFsT3V0cHV0c1swXS5hZGRyZXNzLCB1bmlmaWVkQWRkcmVzcyk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgdHJhbnNwYXJlbnQgcmVzb2x1dGlvbiBvZiBhIHNoaWVsZGVkIHJlY2lwaWVudCAoaW50ZW50IG1pc21hdGNoKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBGb3JjaW5nIHRoZSAndHJhbnNwYXJlbnQnIHByZWZlcmVuY2UgcmVzb2x2ZXMgdGhlIHJlY2lwaWVudCdzIHNjcmlwdCDigJQgYnV0IGFuXG4gICAgLy8gT3JjaGFyZC1vbmx5IFVBIGhhcyBubyB0cmFuc3BhcmVudCByZWNlaXZlciwgc28gdGhlIGRlY29kZSBtdXN0IGZhaWwgcmF0aGVyIHRoYW5cbiAgICAvLyBzaWxlbnRseSBtaXNtYXRjaC5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHBhcnNlU2hpZWxkZWRWNlByZWJ1aWxkKHtcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogdW5pZmllZEFkZHJlc3MsIGFtb3VudDogJzUwMDAnIH1dLFxuICAgICAgICB1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZTogJ3RyYW5zcGFyZW50JyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1plYyByZXNvbHZlUmVjaXBpZW50c0Zyb21Qc2J0IChkZWNvZGUgKyByZWNpcGllbnQgcmVzb2x1dGlvbiknLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHR6ZWMgPSBnZXRVdHhvQ29pbigndHplYycpIGFzIFplYztcbiAgY29uc3QgeyB3YWxsZXRLZXlzIH0gPSBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMoKTtcbiAgY29uc3QgSVJPTldPT0RfSEVJR0hUID0gNDIwMDAwMDsgLy8gYWZ0ZXIgdGhlIE5VNi4zIHRlc3RuZXQgYWN0aXZhdGlvbiAoNDEzNDAwMClcblxuICBmdW5jdGlvbiBidWlsZFNoaWVsZGVkVjZQc2J0KFxuICAgIHVuaWZpZWRBZGRyZXNzID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5lbmNvZGVPcmNoYXJkUmVjZWl2ZXIoXG4gICAgICBuZXcgVWludDhBcnJheShJUk9OV09PRF9SRUNFSVZFUiksXG4gICAgICAndHplYydcbiAgICApXG4gICk6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoSXJvbndvb2RCaXRHb1BzYnQge1xuICAgIGNvbnN0IHBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaElyb253b29kQml0R29Qc2J0LmNyZWF0ZUVtcHR5KCd0emVjJywgd2FsbGV0S2V5cywge1xuICAgICAgYmxvY2tIZWlnaHQ6IElST05XT09EX0hFSUdIVCxcbiAgICB9KTtcbiAgICBwc2J0LmFkZFdhbGxldElucHV0KHsgdHhpZDogJzExJy5yZXBlYXQoMzIpLCB2b3V0OiAwLCB2YWx1ZTogMTAwMDAwbiB9LCB3YWxsZXRLZXlzLCB7XG4gICAgICBzY3JpcHRJZDogeyBjaGFpbjogMCwgaW5kZXg6IDAgfSxcbiAgICB9KTtcbiAgICBwc2J0LmFkZFdhbGxldE91dHB1dCh3YWxsZXRLZXlzLCB7IGNoYWluOiAxLCBpbmRleDogMCwgdmFsdWU6IDkwMDAwbiB9KTtcbiAgICBwc2J0LmFkZFNoaWVsZGVkT3V0cHV0cyhcbiAgICAgIFt7IHJlY2lwaWVudDogbmV3IFVpbnQ4QXJyYXkoSVJPTldPT0RfUkVDRUlWRVIpLCBhbW91bnQ6IDUwMDBuLCB1bmlmaWVkQWRkcmVzcyB9XSxcbiAgICAgIG5ldyBVaW50OEFycmF5KDMyKSAvLyBhbGwtemVybyBhbmNob3IsIGFzIGluIHRoZSB1dHhvLWNvcmUgc2hpZWxkZWQgYnVpbGQgdGVzdHNcbiAgICApO1xuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRUcmFuc3BhcmVudFY0UHNidCh1bmlmaWVkQWRkcmVzcz86IHN0cmluZyk6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoQml0R29Qc2J0IHtcbiAgICBjb25zdCBwc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hCaXRHb1BzYnQuY3JlYXRlRW1wdHkoJ3R6ZWMnLCB3YWxsZXRLZXlzLCB7IGJsb2NrSGVpZ2h0OiAzMTQ2NDAwIH0pO1xuICAgIHBzYnQuYWRkV2FsbGV0SW5wdXQoeyB0eGlkOiAnMjInLnJlcGVhdCgzMiksIHZvdXQ6IDAsIHZhbHVlOiAyMDAwMDBuIH0sIHdhbGxldEtleXMsIHtcbiAgICAgIHNjcmlwdElkOiB7IGNoYWluOiAwLCBpbmRleDogMSB9LFxuICAgIH0pO1xuICAgIHBzYnQuYWRkV2FsbGV0T3V0cHV0KHdhbGxldEtleXMsIHsgY2hhaW46IDEsIGluZGV4OiAwLCB2YWx1ZTogMTAwMDAwbiB9KTtcbiAgICBjb25zdCBleHRlcm5hbFNjcmlwdCA9IHR6ZWMuYWRkcmVzc0NvZGVjLmRlY29kZShURVNUTkVUX1RSQU5TUEFSRU5UX0FERFJFU1MpO1xuICAgIHBzYnQuYWRkVHJhbnNwYXJlbnRPdXRwdXQoZXh0ZXJuYWxTY3JpcHQsIDEyMzQ1biwgdW5pZmllZEFkZHJlc3MpO1xuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgLyoqIERlY29kZSBhIFVBIGJhY2sgdG8gaXRzIHJlY2VpdmVycyBhbmQgYXNzZXJ0IHRoZXkgbWF0Y2ggdGhlIHRlc3RuZXQgZml4dHVyZS4gKi9cbiAgZnVuY3Rpb24gYXNzZXJ0RGVjb2Rlc0JhY2tUb0ZpeHR1cmVSZWNpcGllbnRzKHVuaWZpZWRBZGRyZXNzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWQgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzLnBhcnNlKHVuaWZpZWRBZGRyZXNzLCAndHplYycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZWQuaGFzT3JjaGFyZFJlY2VpdmVyLCB0cnVlKTtcbiAgICBhc3NlcnQub2socGFyc2VkLm9yY2hhcmRSZWNlaXZlcik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKHBhcnNlZC5vcmNoYXJkUmVjZWl2ZXIpLnRvU3RyaW5nKCdoZXgnKSwgSVJPTldPT0RfUkVDRUlWRVIudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLmhhc1RyYW5zcGFyZW50UmVjZWl2ZXIsIHRydWUpO1xuICAgIGFzc2VydC5vayhwYXJzZWQudHJhbnNwYXJlbnRTY3JpcHQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIEJ1ZmZlci5mcm9tKHBhcnNlZC50cmFuc3BhcmVudFNjcmlwdCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20odHplYy5hZGRyZXNzQ29kZWMuZGVjb2RlKFRFU1RORVRfVFJBTlNQQVJFTlRfQUREUkVTUykpLnRvU3RyaW5nKCdoZXgnKVxuICAgICk7XG4gIH1cbiAgaXQoJ3JlamVjdHMgYSB2NCBQU0JUIHdob3NlIHByZXNlcnZlZCBVQSBtZXRhZGF0YSB3YXMgbXV0YXRlZCBhZnRlciBzZXJpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG11dGF0ZWRIZXggPSBtdXRhdGVTZXJpYWxpemVkVW5pZmllZEFkZHJlc3MoXG4gICAgICBCdWZmZXIuZnJvbShidWlsZFRyYW5zcGFyZW50VjRQc2J0KFRFU1RORVRfVU5JRklFRCkuc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIFRFU1RORVRfVU5JRklFRFxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0emVjLnJlc29sdmVSZWNpcGllbnRzRnJvbVBzYnQobXV0YXRlZEhleCwgd2FsbGV0S2V5cyksIC9kb2VzIG5vdCBtYXRjaCBpdHMgcmF3IHJlY2lwaWVudC8pO1xuICB9KTtcblxuICBpdCgnZXhwbGFpblRyYW5zYWN0aW9uIHJlamVjdHMgYSB2NCBQU0JUIHdob3NlIHByZXNlcnZlZCBVQSBtZXRhZGF0YSB3YXMgbXV0YXRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtdXRhdGVkSGV4ID0gbXV0YXRlU2VyaWFsaXplZFVuaWZpZWRBZGRyZXNzKFxuICAgICAgQnVmZmVyLmZyb20oYnVpbGRUcmFuc3BhcmVudFY0UHNidChURVNUTkVUX1VOSUZJRUQpLnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4JyksXG4gICAgICBURVNUTkVUX1VOSUZJRURcbiAgICApO1xuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgdHplYy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogbXV0YXRlZEhleCxcbiAgICAgICAgcHViczoga2V5Y2hhaW5zQmFzZTU4Lm1hcCgoa2V5Y2hhaW4pID0+IGtleWNoYWluLnB1YikgYXMgW3N0cmluZywgc3RyaW5nLCBzdHJpbmddLFxuICAgICAgfSksXG4gICAgICAvZG9lcyBub3QgbWF0Y2ggaXRzIHJhdyBzY3JpcHQvXG4gICAgKTtcbiAgfSk7XG4gIGl0KCdyZXNvbHZlcyBhIHNoaWVsZGVkIHY2IChJcm9ud29vZCkgb3V0cHV0IHRvIGl0cyBPcmNoYXJkIFVuaWZpZWQgQWRkcmVzcyByZWNpcGllbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHR6ZWMucmVzb2x2ZVJlY2lwaWVudHNGcm9tUHNidChCdWZmZXIuZnJvbShidWlsZFNoaWVsZGVkVjZQc2J0KCkuc2VyaWFsaXplKCkpLCB3YWxsZXRLZXlzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50cy5sZW5ndGgsIDEpO1xuICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbMF07XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5kZXN0aW5hdGlvbi5raW5kLCAnemNhc2hTaGllbGRlZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQuYW1vdW50LCA1MDAwbik7XG4gICAgYXNzZXJ0Lm9rKHJlY2lwaWVudC5hZGRyZXNzLnN0YXJ0c1dpdGgoJ3V0ZXN0MScpKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50LmFkZHJlc3MsIHJlY2lwaWVudC5kZXN0aW5hdGlvbi51bmlmaWVkQWRkcmVzcyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKHJlY2lwaWVudC5zY3JpcHQpLnRvU3RyaW5nKCdoZXgnKSwgSVJPTldPT0RfUkVDRUlWRVIudG9TdHJpbmcoJ2hleCcpKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSB2NiBQU0JUIHdob3NlIHByZXNlcnZlZCBVQSBtZXRhZGF0YSB3YXMgbXV0YXRlZCBhZnRlciBzZXJpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG11dGF0ZWRIZXggPSBtdXRhdGVTZXJpYWxpemVkVW5pZmllZEFkZHJlc3MoXG4gICAgICBCdWZmZXIuZnJvbShidWlsZFNoaWVsZGVkVjZQc2J0KFRFU1RORVRfVU5JRklFRCkuc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIFRFU1RORVRfVU5JRklFRFxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0emVjLnJlc29sdmVSZWNpcGllbnRzRnJvbVBzYnQobXV0YXRlZEhleCwgd2FsbGV0S2V5cyksIC9kb2VzIG5vdCBtYXRjaCBpdHMgcmF3IHJlY2lwaWVudC8pO1xuICB9KTtcblxuICBpdCgnZXhwbGFpblRyYW5zYWN0aW9uIHJlamVjdHMgYSB2NiBQU0JUIHdob3NlIHByZXNlcnZlZCBVQSBtZXRhZGF0YSB3YXMgbXV0YXRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtdXRhdGVkSGV4ID0gbXV0YXRlU2VyaWFsaXplZFVuaWZpZWRBZGRyZXNzKFxuICAgICAgQnVmZmVyLmZyb20oYnVpbGRTaGllbGRlZFY2UHNidChURVNUTkVUX1VOSUZJRUQpLnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4JyksXG4gICAgICBURVNUTkVUX1VOSUZJRURcbiAgICApO1xuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgdHplYy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogbXV0YXRlZEhleCxcbiAgICAgICAgcHViczoga2V5Y2hhaW5zQmFzZTU4Lm1hcCgoa2V5Y2hhaW4pID0+IGtleWNoYWluLnB1YikgYXMgW3N0cmluZywgc3RyaW5nLCBzdHJpbmddLFxuICAgICAgfSksXG4gICAgICAvZG9lcyBub3QgbWF0Y2ggaXRzIHJhdyBzY3JpcHQvXG4gICAgKTtcbiAgfSk7XG4gIGl0KCdyZXNvbHZlcyB0cmFuc3BhcmVudCBleHRlcm5hbCBvdXRwdXRzIGFuZCBleGNsdWRlcyBjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHR6ZWMucmVzb2x2ZVJlY2lwaWVudHNGcm9tUHNidChCdWZmZXIuZnJvbShidWlsZFRyYW5zcGFyZW50VjRQc2J0KCkuc2VyaWFsaXplKCkpLCB3YWxsZXRLZXlzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50cy5sZW5ndGgsIDEpO1xuICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbMF07XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5kZXN0aW5hdGlvbi5raW5kLCAndHJhbnNwYXJlbnQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50LmFkZHJlc3MsIFRFU1RORVRfVFJBTlNQQVJFTlRfQUREUkVTUyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5hbW91bnQsIDEyMzQ1bik7XG4gIH0pO1xuXG4gIGl0KCdyZXBvcnRzIHRoZSBvcmlnaW5hbCBtdWx0aS1yZWNlaXZlciBVQSBmb3IgYSBzaGllbGRlZCBvdXRwdXQgYW5kIGRlY29kZXMgaXQgYmFjaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZWNpcGllbnRzID0gdHplYy5yZXNvbHZlUmVjaXBpZW50c0Zyb21Qc2J0KFxuICAgICAgQnVmZmVyLmZyb20oYnVpbGRTaGllbGRlZFY2UHNidChURVNUTkVUX1VOSUZJRUQpLnNlcmlhbGl6ZSgpKSxcbiAgICAgIHdhbGxldEtleXNcbiAgICApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnRzLmxlbmd0aCwgMSk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gcmVjaXBpZW50c1swXTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVjaXBpZW50LmRlc3RpbmF0aW9uLmtpbmQsICd6Y2FzaFNoaWVsZGVkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5hZGRyZXNzLCBURVNUTkVUX1VOSUZJRUQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQudW5pZmllZEFkZHJlc3MsIFRFU1RORVRfVU5JRklFRCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5kZXN0aW5hdGlvbi51bmlmaWVkQWRkcmVzcywgVEVTVE5FVF9VTklGSUVEKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoQnVmZmVyLmZyb20ocmVjaXBpZW50LnNjcmlwdCkudG9TdHJpbmcoJ2hleCcpLCBJUk9OV09PRF9SRUNFSVZFUi50b1N0cmluZygnaGV4JykpO1xuICAgIGFzc2VydERlY29kZXNCYWNrVG9GaXh0dXJlUmVjaXBpZW50cyhyZWNpcGllbnQudW5pZmllZEFkZHJlc3MgYXMgc3RyaW5nKTtcbiAgfSk7XG5cbiAgaXQoJ3JlcG9ydHMgdGhlIG9yaWdpbmFsIG11bHRpLXJlY2VpdmVyIFVBIGZvciBhIHRyYW5zcGFyZW50IHY0IG91dHB1dCBhbmQgZGVjb2RlcyBpdCBiYWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0emVjLnJlc29sdmVSZWNpcGllbnRzRnJvbVBzYnQoXG4gICAgICBCdWZmZXIuZnJvbShidWlsZFRyYW5zcGFyZW50VjRQc2J0KFRFU1RORVRfVU5JRklFRCkuc2VyaWFsaXplKCkpLFxuICAgICAgd2FsbGV0S2V5c1xuICAgICk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudHMubGVuZ3RoLCAxKTtcbiAgICBjb25zdCByZWNpcGllbnQgPSByZWNpcGllbnRzWzBdO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQuZGVzdGluYXRpb24ua2luZCwgJ3pjYXNoVW5pZmllZFRyYW5zcGFyZW50Jyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5hZGRyZXNzLCBURVNUTkVUX1VOSUZJRUQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnQudW5pZmllZEFkZHJlc3MsIFRFU1RORVRfVU5JRklFRCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudC5kZXN0aW5hdGlvbi51bmlmaWVkQWRkcmVzcywgVEVTVE5FVF9VTklGSUVEKTtcbiAgICBhc3NlcnREZWNvZGVzQmFja1RvRml4dHVyZVJlY2lwaWVudHMocmVjaXBpZW50LnVuaWZpZWRBZGRyZXNzIGFzIHN0cmluZyk7XG4gIH0pO1xuXG4gIGl0KCdyZXNvbHZlcyByZWNpcGllbnRzIGZyb20gYSBoZXggUFNCVCBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaGV4ID0gQnVmZmVyLmZyb20oYnVpbGRTaGllbGRlZFY2UHNidCgpLnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHR6ZWMucmVzb2x2ZVJlY2lwaWVudHNGcm9tUHNidChoZXgsIHdhbGxldEtleXMpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNpcGllbnRzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2lwaWVudHNbMF0uZGVzdGluYXRpb24ua2luZCwgJ3pjYXNoU2hpZWxkZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBmb3IgYSBub24tWmNhc2ggUFNCVCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LmNyZWF0ZUVtcHR5KCdidGMnLCB3YWxsZXRLZXlzLCB7fSk7XG4gICAgcHNidC5hZGRXYWxsZXRJbnB1dCh7IHR4aWQ6ICczMycucmVwZWF0KDMyKSwgdm91dDogMCwgdmFsdWU6IDEwMDBuIH0sIHdhbGxldEtleXMsIHtcbiAgICAgIHNjcmlwdElkOiB7IGNoYWluOiAwLCBpbmRleDogMCB9LFxuICAgIH0pO1xuICAgIC8vIFplYy5kZWNvZGVUcmFuc2FjdGlvbiBoYW5kcyB0aGUgYnRjIFBTQlQgdG8gWmNhc2hQc2J0LmZyb21CeXRlcywgd2hpY2ggcmVqZWN0cyBpdCBmb3JcbiAgICAvLyBpdHMgbWlzc2luZyBaY2FzaCBjb25zZW5zdXMgYnJhbmNoIElEIGJlZm9yZSB0aGUgWmNhc2gtdHlwZSBndWFyZCBpcyBldmVyIHJlYWNoZWQuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0emVjLnJlc29sdmVSZWNpcGllbnRzRnJvbVBzYnQoQnVmZmVyLmZyb20ocHNidC5zZXJpYWxpemUoKSksIHdhbGxldEtleXMpKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1plYyBnZXRFeHRyYVByZWJ1aWxkUGFyYW1zICh1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSBmb3J3YXJkaW5nKScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgemVjID0gZ2V0VXR4b0NvaW4oJ3plYycpO1xuXG4gIGZ1bmN0aW9uIG1vY2tXYWxsZXQoY29pbiA9IHplYyk6IFdhbGxldCB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQoZGVmYXVsdEJpdEdvLCBjb2luLCB7IGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhJywgY29pbjogY29pbi5nZXRDaGFpbigpLCB0eXBlOiAnaG90JyB9KTtcbiAgfVxuXG4gIGl0KCdmb3J3YXJkcyB1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSB3aGVuIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2FsbGV0ID0gbW9ja1dhbGxldCgpO1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBhd2FpdCB6ZWMuZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyh7XG4gICAgICB3YWxsZXQsXG4gICAgICB1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZTogJ3NoaWVsZGVkJyxcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LnVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlLCAnc2hpZWxkZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IHNldCB1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSB3aGVuIGFic2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB3YWxsZXQgPSBtb2NrV2FsbGV0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgemVjLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoeyB3YWxsZXQgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKCd1bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZScgaW4gcmVzdWx0LCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzdGlsbCByZXR1cm5zIHRoZSBzdGFuZGFyZCBleHRyYSBwcmVidWlsZCBwYXJhbXMgKHR4Rm9ybWF0KSB1bmNoYW5nZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2FsbGV0ID0gbW9ja1dhbGxldCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHplYy5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlOiAnc2hpZWxkZWQnLFxuICAgIH0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQudHhGb3JtYXQsICdwc2J0LWxpdGUnKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -176,6 +176,28 @@ describe('ZecAddressCodec', function () {
176
176
  const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
177
177
  strict_1.default.throws(() => codec.decode('not-a-real-address'));
178
178
  });
179
+ it('isMatchingScript validates the receiver represented by parsed output metadata', function () {
180
+ const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
181
+ const transparentScript = codec.decode(testnetWallet.unified);
182
+ const shieldedScript = wasm_utxo_1.zcashAddress.toShieldedReceiverWithCoin(testnetWallet.unified, 'tzec');
183
+ const transparentOutput = {
184
+ address: testnetWallet.unified,
185
+ script: transparentScript,
186
+ isShielded: false,
187
+ };
188
+ const shieldedOutput = {
189
+ address: testnetWallet.unified,
190
+ script: shieldedScript,
191
+ isShielded: true,
192
+ };
193
+ const transparentMetadataForShieldedOutput = { ...transparentOutput, isShielded: true };
194
+ const shieldedMetadataForTransparentOutput = { ...shieldedOutput, isShielded: false };
195
+ strict_1.default.strictEqual(codec.isMatchingScript(transparentMetadataForShieldedOutput), false);
196
+ strict_1.default.strictEqual(codec.isMatchingScript(shieldedMetadataForTransparentOutput), false);
197
+ strict_1.default.strictEqual(codec.isMatchingScript({ address: testnetWallet.unified, script: Buffer.from('00', 'hex') }), false);
198
+ strict_1.default.strictEqual(codec.toExtendedAddressFormat(Buffer.from(shieldedScript), testnetWallet.unified), testnetWallet.unified);
199
+ strict_1.default.throws(() => codec.toExtendedAddressFormat(Buffer.from(transparentScript), 'not-a-real-address'));
200
+ });
179
201
  // -- encode (inherited) ----------------------------------------------------
180
202
  it('encode: round-trips a transparent script to address', function () {
181
203
  const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
@@ -202,4 +224,4 @@ describe('ZecAddressCodec', function () {
202
224
  strict_1.default.strictEqual(zec.addressCodec.isValidAddress('not-a-real-address'), zec.isValidAddress('not-a-real-address'));
203
225
  });
204
226
  });
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9pbXBsL3plYy91bml0L2FkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnRUFBd0M7QUFFeEMsNENBQTBDO0FBQzFDLGdEQUFxRDtBQUVyRCxxREFPcUM7QUFFckMsb0RBQW9EO0FBQ3BELDJFQUEyRTtBQUMzRSxvREFBb0Q7QUFDcEQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsT0FBTyxFQUNMLHVOQUF1TjtDQUMxTixDQUFDO0FBQ0YsTUFBTSxhQUFhLEdBQUc7SUFDcEIsT0FBTyxFQUNMLDJOQUEyTjtJQUM3TixrQkFBa0IsRUFBRSxxQ0FBcUM7Q0FDMUQsQ0FBQztBQUVGLFFBQVEsQ0FBQywwQkFBMEIsRUFBRTtJQUNuQyxJQUFJLEtBQWUsQ0FBQztJQUNwQixJQUFJLEdBQUcsQ0FBQztJQUNSLElBQUksSUFBSSxDQUFDO0lBRVQsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLElBQUksa0JBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7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QkFBTSxDQUFDLFdBQVcsQ0FDaEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUN0RCxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FDMUMsQ0FBQztRQUNGLGdCQUFNLENBQUMsV0FBVyxDQUNoQixHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUN0RSxHQUFHLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxDQUFDLENBQzFELENBQUM7UUFDRixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ3RILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHtcbiAgWmVjLFxuICBUemVjLFxuICBaZWNBZGRyZXNzQ29kZWMsXG4gIGdldFpjYXNoQWRkcmVzc0tpbmQsXG4gIGlzU2hpZWxkZWRaY2FzaEFkZHJlc3MsXG4gIGlzVmFsaWRaY2FzaEFkZHJlc3MsXG59IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYy9pbXBsL3plYyc7XG5cbi8vIFpJUC0zMTYgdW5pZmllZC1hZGRyZXNzIHRlc3QgdmVjdG9ycywgY29waWVkIGZyb21cbi8vIEJpdEdvV0FTTS9wYWNrYWdlcy93YXNtLXV0eG8vdGVzdC9maXh0dXJlcy96Y2FzaC91bmlmaWVkX2FkZHJlc3MuanNvbiBzb1xuLy8gYm90aCByZXBvcyB0ZXN0IGFnYWluc3QgdGhlIHNhbWUga25vd24tZ29vZCBkYXRhLlxuY29uc3QgemlwMzE2TWFpbm5ldCA9IHtcbiAgdW5pZmllZDpcbiAgICAndTFwZzJhYXBoN2pwOHJwZjZ5aHN6YTI1NzIyc2c1ZmNuM3ZhY2E2emUyN2hxanc3anZ2aGh1eGtwY2cwZ2U5eGg2ZHJzZ2RrZGE4cWpxNWNocGVoa2NweGY4N3JuanJ5anF3eW1kaGVwdHB2bmxqcXFyanF6andrYzJtYTZoY3E2NjZrZ3dmeXR4d2FjOGV5ZXg2bmRncjZlenRlNjY3MDZlM3ZhcXJkMjVkenZ6a2M2OWt3MGpneXd0ZDBjbXE1MnE1bGt3NnVoN2h5dnpqc2U4a3N4Jyxcbn07XG5jb25zdCB0ZXN0bmV0V2FsbGV0ID0ge1xuICB1bmlmaWVkOlxuICAgICd1dGVzdDF3NW0wcWNucDhlZ2w4cWEyOTZuNzBuOG52ajB0cW56azkwcDdmNDh2N21qaGhkcmRxczh2Z3F5ZHNsZzVwbG16ZWZhd2VmbnBtZ21sbTZoY3kzOG05NzJlcnd4czA0czAyY3EycHJoZ3V6OGtxbHk3NW02emp5NTZtMDhkNWpueWNndHBxdGplcHJ0ZTU3NmdrbXJ4eXN6ZXBneDc2eXp1d2hoN200bGZ6OWphcTd1bmprMHg1YW50NDZqdXh6NzNoc2M2cTR2M2RxdHp3dzAwdnBzJyxcbiAgdHJhbnNwYXJlbnRBZGRyZXNzOiAndG1NNER2TFZKS1hadDV5ZG4xdHFZVEh2YWhwS1N3Z2p1UmsnLFxufTtcblxuZGVzY3JpYmUoJ1pjYXNoIGFkZHJlc3MgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBCaXRHb0FQSTtcbiAgbGV0IHplYztcbiAgbGV0IHR6ZWM7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnJlZ2lzdGVyKCd6ZWMnLCBaZWMuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnJlZ2lzdGVyKCd0emVjJywgVHplYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgemVjID0gYml0Z28uY29pbignemVjJyk7XG4gICAgdHplYyA9IGJpdGdvLmNvaW4oJ3R6ZWMnKTtcbiAgfSk7XG5cbiAgaXQoJ3JlY29nbml6ZXMgYSBtYWlubmV0IHVuaWZpZWQgYWRkcmVzcyBhcyBzaGllbGRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoemVjLmlzVmFsaWRBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRaY2FzaEFkZHJlc3NLaW5kKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3plYycpLCAnc2hpZWxkZWQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNTaGllbGRlZFpjYXNoQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQsICd6ZWMnKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRaY2FzaEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAnemVjJyksIHRydWUpO1xuICB9KTtcblxuICBpdCgncmVjb2duaXplcyBhIHRlc3RuZXQgdW5pZmllZCBhZGRyZXNzIGFzIHNoaWVsZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0emVjLmlzVmFsaWRBZGRyZXNzKHRlc3RuZXRXYWxsZXQudW5pZmllZCksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRaY2FzaEFkZHJlc3NLaW5kKHRlc3RuZXRXYWxsZXQudW5pZmllZCwgJ3R6ZWMnKSwgJ3NoaWVsZGVkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzU2hpZWxkZWRaY2FzaEFkZHJlc3ModGVzdG5ldFdhbGxldC51bmlmaWVkLCAndHplYycpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFpjYXNoQWRkcmVzcyh0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsICd0emVjJyksIHRydWUpO1xuICB9KTtcblxuICBpdCgncmVjb2duaXplcyBhIHRlc3RuZXQgdHJhbnNwYXJlbnQgYWRkcmVzcyBhcyB0cmFuc3BhcmVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHplYy5pc1ZhbGlkQWRkcmVzcyh0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRaY2FzaEFkZHJlc3NLaW5kKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzLCAndHplYycpLCAndHJhbnNwYXJlbnQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFpjYXNoQWRkcmVzcyh0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcywgJ3R6ZWMnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWNvZ25pemVzIGEgbWFpbm5ldCB0cmFuc3BhcmVudCAoUDJQS0gpIGFkZHJlc3MgYXMgdHJhbnNwYXJlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9ICd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWSc7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHplYy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQoYWRkcmVzcywgJ3plYycpLCAndHJhbnNwYXJlbnQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFpjYXNoQWRkcmVzcyhhZGRyZXNzLCAnemVjJyksIHRydWUpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIGdhcmJhZ2Ugc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGdhcmJhZ2UgPSAnbm90LWEtcmVhbC1hZGRyZXNzJztcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoemVjLmlzVmFsaWRBZGRyZXNzKGdhcmJhZ2UpLCBmYWxzZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQoZ2FyYmFnZSwgJ3plYycpLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKGdhcmJhZ2UsICd6ZWMnKSwgZmFsc2UpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHVuaWZpZWQgYWRkcmVzcyBjaGVja2VkIGFnYWluc3QgdGhlIHdyb25nIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR6ZWMuaXNWYWxpZEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkKSwgZmFsc2UpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChnZXRaY2FzaEFkZHJlc3NLaW5kKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3R6ZWMnKSwgdW5kZWZpbmVkKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNTaGllbGRlZFpjYXNoQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQsICd0emVjJyksIGZhbHNlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFpjYXNoQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQsICd0emVjJyksIGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1plY0FkZHJlc3NDb2RlYycsIGZ1bmN0aW9uICgpIHtcbiAgLy8gLS0gaW5zdGFudGlhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGJpdGdvOiBCaXRHb0FQSTtcbiAgbGV0IHplYztcbiAgbGV0IHR6ZWM7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnJlZ2lzdGVyKCd6ZWMnLCBaZWMuY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJpdGdvLnJlZ2lzdGVyKCd0emVjJywgVHplYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgemVjID0gYml0Z28uY29pbignemVjJyk7XG4gICAgdHplYyA9IGJpdGdvLmNvaW4oJ3R6ZWMnKTtcbiAgfSk7XG5cbiAgaXQoJ2NvbnN0cnVjdHMgZm9yIHplYyBhbmQgdHplYycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtYWlubmV0ID0gbmV3IFplY0FkZHJlc3NDb2RlYygnemVjJywgJ3plYycpO1xuICAgIGNvbnN0IHRlc3RuZXQgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobWFpbm5ldC5jb2luTmFtZSwgJ3plYycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0ZXN0bmV0LmNvaW5OYW1lLCAndHplYycpO1xuICB9KTtcblxuICAvLyAtLSBpc1ZhbGlkQWRkcmVzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGl0KCdpc1ZhbGlkQWRkcmVzczogYWNjZXB0cyBtYWlubmV0IFVBJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChuZXcgWmVjQWRkcmVzc0NvZGVjKCd6ZWMnLCAnemVjJykuaXNWYWxpZEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdpc1ZhbGlkQWRkcmVzczogYWNjZXB0cyB0ZXN0bmV0IFVBJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKS5pc1ZhbGlkQWRkcmVzcyh0ZXN0bmV0V2FsbGV0LnVuaWZpZWQpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiBhY2NlcHRzIG1haW5uZXQgUDJQS0gnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3plYycsICd6ZWMnKS5pc1ZhbGlkQWRkcmVzcygndDFjTjJaVld6V2NWUnJuZmVRem1rcExoelE0ZFlSdjh5UlknKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdpc1ZhbGlkQWRkcmVzczogYWNjZXB0cyB0ZXN0bmV0IHRyYW5zcGFyZW50IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpLmlzVmFsaWRBZGRyZXNzKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdpc1ZhbGlkQWRkcmVzczogcmVqZWN0cyB3cm9uZy1uZXR3b3JrIFVBJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKS5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdpc1ZhbGlkQWRkcmVzczogcmVqZWN0cyBnYXJiYWdlJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKS5pc1ZhbGlkQWRkcmVzcygnbm90LWEtcmVhbC1hZGRyZXNzJyksIGZhbHNlKTtcbiAgfSk7XG5cbiAgLy8gLS0gZGVjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBpdCgnZGVjb2RlOiBwbGFpbiB0cmFuc3BhcmVudCBhZGRyZXNzIGRlY29kZXMgdG8gUDJQS0ggc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgY29uc3Qgc2NyaXB0ID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSk7XG4gICAgLy8gUDJQS0g6IE9QX0RVUCBPUF9IQVNIMTYwIDwyMC1ieXRlIGhhc2g+IE9QX0VRVUFMVkVSSUZZIE9QX0NIRUNLU0lHXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFswXSwgMHg3Nik7IC8vIE9QX0RVUFxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMV0sIDB4YTkpOyAvLyBPUF9IQVNIMTYwXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFsyXSwgMHgxNCk7IC8vIHB1c2ggMjAgYnl0ZXNcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0Lmxlbmd0aCwgMjUpOyAvLyB0b3RhbCBQMlBLSCBsZW5ndGhcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogVUEgd2l0aCB0cmFuc3BhcmVudCByZWNlaXZlciBkZWNvZGVzIHRvIHRoZSBzYW1lIHRyYW5zcGFyZW50IHNjcmlwdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpO1xuICAgIC8vIFRoZSB0ZXN0bmV0IFVBIGNhcnJpZXMgYSB0cmFuc3BhcmVudCByZWNlaXZlcjsgaXQgc2hvdWxkIGRlY29kZSB0byB0aGVcbiAgICAvLyBzYW1lIHNjcmlwdFB1YktleSBhcyB0aGUgc3RhbmRhbG9uZSB0cmFuc3BhcmVudCBhZGRyZXNzLlxuICAgIGNvbnN0IHVhU2NyaXB0ID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudW5pZmllZCkpO1xuICAgIGNvbnN0IHRBZGRyU2NyaXB0ID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh1YVNjcmlwdCwgdEFkZHJTY3JpcHQpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBVQSB3aXRoIHRyYW5zcGFyZW50IHJlY2VpdmVyIGRlY29kZXMgb24gbWFpbm5ldCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3plYycsICd6ZWMnKTtcbiAgICBjb25zdCBzY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUoemlwMzE2TWFpbm5ldC51bmlmaWVkKSk7XG4gICAgLy8gUDJQS0ggc3RydWN0dXJlIHRlc3RcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzBdLCAweDc2KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzFdLCAweGE5KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzJdLCAweDE0KTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogdGhyb3dzIGZvciBhIFVBIHdpdGhvdXQgYSB0cmFuc3BhcmVudCByZWNlaXZlciAob3JjaGFyZC1vbmx5KScsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBDb25zdHJ1Y3QgYW4gT3JjaGFyZC1vbmx5IFVBIGJ5IGVuY29kaW5nIGEgZHVtbXkgcmVjZWl2ZXJcbiAgICBjb25zdCBvcmNoYXJkT25seSA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MuZW5jb2RlT3JjaGFyZFJlY2VpdmVyKFxuICAgICAgbmV3IFVpbnQ4QXJyYXkoNDMpLmZpbGwoMHg0MiksXG4gICAgICAndHplYydcbiAgICApO1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjb2RlYy5kZWNvZGUob3JjaGFyZE9ubHkpKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogZXhwbGljaXQgdHJhbnNwYXJlbnQtYm91bmQgY29kZWMgcmV0dXJucyB0aGUgdHJhbnNwYXJlbnQgc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJywgJ3RyYW5zcGFyZW50Jyk7XG4gICAgY29uc3Qgc2NyaXB0ID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudW5pZmllZCkpO1xuICAgIGNvbnN0IHRBZGRyU2NyaXB0ID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHQsIHRBZGRyU2NyaXB0KTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogc2hpZWxkZWQtYm91bmQgY29kZWMgcmV0dXJucyB0aGUgcmF3IDQzLWJ5dGUgT3JjaGFyZCByZWNlaXZlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGNvbnN0IHJlY2VpdmVyID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudW5pZmllZCkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNlaXZlci5sZW5ndGgsIDQzKTtcbiAgICBjb25zdCBwYXJzZWQgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzLnBhcnNlKHRlc3RuZXRXYWxsZXQudW5pZmllZCwgJ3R6ZWMnKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlY2VpdmVyLCBCdWZmZXIuZnJvbShwYXJzZWQub3JjaGFyZFJlY2VpdmVyIGFzIFVpbnQ4QXJyYXkpKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogc2hpZWxkZWQtYm91bmQgY29kZWMgb24gbWFpbm5ldCByZXR1cm5zIHRoZSByYXcgNDMtYnl0ZSBPcmNoYXJkIHJlY2VpdmVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygnemVjJywgJ3plYycsICdzaGllbGRlZCcpO1xuICAgIGNvbnN0IHJlY2VpdmVyID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKHppcDMxNk1haW5uZXQudW5pZmllZCkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNlaXZlci5sZW5ndGgsIDQzKTtcbiAgICBjb25zdCBwYXJzZWQgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzLnBhcnNlKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3plYycpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjZWl2ZXIsIEJ1ZmZlci5mcm9tKHBhcnNlZC5vcmNoYXJkUmVjZWl2ZXIgYXMgVWludDhBcnJheSkpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBzaGllbGRlZC1ib3VuZCBjb2RlYyByZXNvbHZlcyBhbiBPcmNoYXJkLW9ubHkgVUEgdG8gaXRzIHJlY2VpdmVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG9yY2hhcmRPbmx5ID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5lbmNvZGVPcmNoYXJkUmVjZWl2ZXIoXG4gICAgICBuZXcgVWludDhBcnJheSg0MykuZmlsbCgweDQyKSxcbiAgICAgICd0emVjJ1xuICAgICk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnLCAnc2hpZWxkZWQnKTtcbiAgICBjb25zdCByZWNlaXZlciA9IEJ1ZmZlci5mcm9tKGNvZGVjLmRlY29kZShvcmNoYXJkT25seSkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWNlaXZlci5sZW5ndGgsIDQzKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlY2VpdmVyLCBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheSg0MykuZmlsbCgweDQyKSkpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBzaGllbGRlZC1ib3VuZCBjb2RlYyB0aHJvd3MgaW52YWxpZC1hZGRyZXNzIGVycm9yIGZvciBhIHBsYWluIHRyYW5zcGFyZW50IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnLCAnc2hpZWxkZWQnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNvZGVjLmRlY29kZSh0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcyksIC9pcyBub3QgYSB2YWxpZCBhZGRyZXNzIGZvciBuZXR3b3JrLyk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IHNoaWVsZGVkLWJvdW5kIGNvZGVjIHRocm93cyBpbnZhbGlkLWFkZHJlc3MgZXJyb3IgZm9yIGEgd3JvbmctbmV0d29yayBVQScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY29kZWMuZGVjb2RlKHppcDMxNk1haW5uZXQudW5pZmllZCksIC9pcyBub3QgYSB2YWxpZCBhZGRyZXNzIGZvciBuZXR3b3JrLyk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IHNoaWVsZGVkLWJvdW5kIGNvZGVjIHRocm93cyBpbnZhbGlkLWFkZHJlc3MgZXJyb3IgZm9yIGdhcmJhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnLCAnc2hpZWxkZWQnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNvZGVjLmRlY29kZSgnbm90LWEtcmVhbC1hZGRyZXNzJyksIC9pcyBub3QgYSB2YWxpZCBhZGRyZXNzIGZvciBuZXR3b3JrLyk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IHRocm93cyBmb3IgZ2FyYmFnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY29kZWMuZGVjb2RlKCdub3QtYS1yZWFsLWFkZHJlc3MnKSk7XG4gIH0pO1xuXG4gIC8vIC0tIGVuY29kZSAoaW5oZXJpdGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaXQoJ2VuY29kZTogcm91bmQtdHJpcHMgYSB0cmFuc3BhcmVudCBzY3JpcHQgdG8gYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpO1xuICAgIGNvbnN0IHNjcmlwdCA9IGNvZGVjLmRlY29kZSh0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcyk7XG4gICAgY29uc3QgYWRkcmVzcyA9IGNvZGVjLmVuY29kZShzY3JpcHQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRyZXNzLCB0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcyk7XG4gIH0pO1xuXG4gIGl0KCdlbmNvZGU6IHJvdW5kLXRyaXBzIG9uIG1haW5uZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd6ZWMnLCAnemVjJyk7XG4gICAgY29uc3QgYWRkcmVzcyA9ICd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWSc7XG4gICAgY29uc3Qgc2NyaXB0ID0gY29kZWMuZGVjb2RlKGFkZHJlc3MpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb2RlYy5lbmNvZGUoc2NyaXB0KSwgYWRkcmVzcyk7XG4gIH0pO1xuXG4gIC8vIC0tIGludGVncmF0aW9uOiBjb2luLmFkZHJlc3NDb2RlYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaXQoJ2NvaW4uYWRkcmVzc0NvZGVjOiB6ZWMgcmV0dXJucyBaZWNBZGRyZXNzQ29kZWMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0Lm9rKHplYy5hZGRyZXNzQ29kZWMgaW5zdGFuY2VvZiBaZWNBZGRyZXNzQ29kZWMpO1xuICB9KTtcblxuICBpdCgnY29pbi5hZGRyZXNzQ29kZWM6IHR6ZWMgcmV0dXJucyBaZWNBZGRyZXNzQ29kZWMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0Lm9rKHR6ZWMuYWRkcmVzc0NvZGVjIGluc3RhbmNlb2YgWmVjQWRkcmVzc0NvZGVjKTtcbiAgfSk7XG5cbiAgaXQoJ2NvaW4uYWRkcmVzc0NvZGVjLmlzVmFsaWRBZGRyZXNzIG1hdGNoZXMgWmVjLmlzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIHplYy5hZGRyZXNzQ29kZWMuaXNWYWxpZEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkKSxcbiAgICAgIHplYy5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpXG4gICAgKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICB6ZWMuYWRkcmVzc0NvZGVjLmlzVmFsaWRBZGRyZXNzKCd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWScpLFxuICAgICAgemVjLmlzVmFsaWRBZGRyZXNzKCd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWScpXG4gICAgKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoemVjLmFkZHJlc3NDb2RlYy5pc1ZhbGlkQWRkcmVzcygnbm90LWEtcmVhbC1hZGRyZXNzJyksIHplYy5pc1ZhbGlkQWRkcmVzcygnbm90LWEtcmVhbC1hZGRyZXNzJykpO1xuICB9KTtcbn0pO1xuIl19
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9pbXBsL3plYy91bml0L2FkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnRUFBd0M7QUFFeEMsNENBQTBDO0FBQzFDLGdEQUFtRTtBQUVuRSxxREFPcUM7QUFHckMsb0RBQW9EO0FBQ3BELDJFQUEyRTtBQUMzRSxvREFBb0Q7QUFDcEQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsT0FBTyxFQUNMLHVOQUF1TjtDQUMxTixDQUFDO0FBQ0YsTUFBTSxhQUFhLEdBQUc7SUFDcEIsT0FBTyxFQUNMLDJOQUEyTjtJQUM3TixrQkFBa0IsRUFBRSxxQ0FBcUM7Q0FDMUQsQ0FBQztBQUVGLFFBQVEsQ0FBQywwQkFBMEIsRUFBRTtJQUNuQyxJQUFJLEtBQWUsQ0FBQztJQUNwQixJQUFJLEdBQUcsQ0FBQztJQUNSLElBQUksSUFBSSxDQUFDO0lBRVQsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLElBQUksa0JBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7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QyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsNkVBQTZFO0lBRTdFLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtRQUNuRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxZQUFZLHFCQUFlLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRTtRQUNwRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxZQUFZLHFCQUFlLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2REFBNkQsRUFBRTtRQUNoRSxnQkFBTSxDQUFDLFdBQVcsQ0FDaEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUN0RCxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FDMUMsQ0FBQztRQUNGLGdCQUFNLENBQUMsV0FBVyxDQUNoQixHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUN0RSxHQUFHLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxDQUFDLENBQzFELENBQUM7UUFDRixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ3RILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQsIHpjYXNoQWRkcmVzcyB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQge1xuICBaZWMsXG4gIFR6ZWMsXG4gIFplY0FkZHJlc3NDb2RlYyxcbiAgZ2V0WmNhc2hBZGRyZXNzS2luZCxcbiAgaXNTaGllbGRlZFpjYXNoQWRkcmVzcyxcbiAgaXNWYWxpZFpjYXNoQWRkcmVzcyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjJztcbmltcG9ydCB0eXBlIHsgWmVjQWRkcmVzc0NvZGVjT3V0cHV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjL3R5cGVzJztcblxuLy8gWklQLTMxNiB1bmlmaWVkLWFkZHJlc3MgdGVzdCB2ZWN0b3JzLCBjb3BpZWQgZnJvbVxuLy8gQml0R29XQVNNL3BhY2thZ2VzL3dhc20tdXR4by90ZXN0L2ZpeHR1cmVzL3pjYXNoL3VuaWZpZWRfYWRkcmVzcy5qc29uIHNvXG4vLyBib3RoIHJlcG9zIHRlc3QgYWdhaW5zdCB0aGUgc2FtZSBrbm93bi1nb29kIGRhdGEuXG5jb25zdCB6aXAzMTZNYWlubmV0ID0ge1xuICB1bmlmaWVkOlxuICAgICd1MXBnMmFhcGg3anA4cnBmNnloc3phMjU3MjJzZzVmY24zdmFjYTZ6ZTI3aHFqdzdqdnZoaHV4a3BjZzBnZTl4aDZkcnNnZGtkYThxanE1Y2hwZWhrY3B4Zjg3cm5qcnlqcXd5bWRoZXB0cHZubGpxcXJqcXpqd2tjMm1hNmhjcTY2Nmtnd2Z5dHh3YWM4ZXlleDZuZGdyNmV6dGU2NjcwNmUzdmFxcmQyNWR6dnprYzY5a3cwamd5d3RkMGNtcTUycTVsa3c2dWg3aHl2empzZThrc3gnLFxufTtcbmNvbnN0IHRlc3RuZXRXYWxsZXQgPSB7XG4gIHVuaWZpZWQ6XG4gICAgJ3V0ZXN0MXc1bTBxY25wOGVnbDhxYTI5Nm43MG44bnZqMHRxbnprOTBwN2Y0OHY3bWpoaGRyZHFzOHZncXlkc2xnNXBsbXplZmF3ZWZucG1nbWxtNmhjeTM4bTk3MmVyd3hzMDRzMDJjcTJwcmhndXo4a3FseTc1bTZ6ank1Nm0wOGQ1am55Y2d0cHF0amVwcnRlNTc2Z2ttcnh5c3plcGd4NzZ5enV3aGg3bTRsZno5amFxN3VuamsweDVhbnQ0Nmp1eHo3M2hzYzZxNHYzZHF0end3MDB2cHMnLFxuICB0cmFuc3BhcmVudEFkZHJlc3M6ICd0bU00RHZMVkpLWFp0NXlkbjF0cVlUSHZhaHBLU3dnanVSaycsXG59O1xuXG5kZXNjcmliZSgnWmNhc2ggYWRkcmVzcyB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IEJpdEdvQVBJO1xuICBsZXQgemVjO1xuICBsZXQgdHplYztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gbmV3IEJpdEdvQVBJKHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3plYycsIFplYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3R6ZWMnLCBUemVjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICB6ZWMgPSBiaXRnby5jb2luKCd6ZWMnKTtcbiAgICB0emVjID0gYml0Z28uY29pbigndHplYycpO1xuICB9KTtcblxuICBpdCgncmVjb2duaXplcyBhIG1haW5uZXQgdW5pZmllZCBhZGRyZXNzIGFzIHNoaWVsZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh6ZWMuaXNWYWxpZEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAnemVjJyksICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1NoaWVsZGVkWmNhc2hBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3plYycpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFpjYXNoQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQsICd6ZWMnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWNvZ25pemVzIGEgdGVzdG5ldCB1bmlmaWVkIGFkZHJlc3MgYXMgc2hpZWxkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR6ZWMuaXNWYWxpZEFkZHJlc3ModGVzdG5ldFdhbGxldC51bmlmaWVkKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQodGVzdG5ldFdhbGxldC51bmlmaWVkLCAndHplYycpLCAnc2hpZWxkZWQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNTaGllbGRlZFpjYXNoQWRkcmVzcyh0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsICd0emVjJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKHRlc3RuZXRXYWxsZXQudW5pZmllZCwgJ3R6ZWMnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWNvZ25pemVzIGEgdGVzdG5ldCB0cmFuc3BhcmVudCBhZGRyZXNzIGFzIHRyYW5zcGFyZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0emVjLmlzVmFsaWRBZGRyZXNzKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MsICd0emVjJyksICd0cmFuc3BhcmVudCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzLCAndHplYycpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlY29nbml6ZXMgYSBtYWlubmV0IHRyYW5zcGFyZW50IChQMlBLSCkgYWRkcmVzcyBhcyB0cmFuc3BhcmVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhZGRyZXNzID0gJ3QxY04yWlZXeldjVlJybmZlUXpta3BMaHpRNGRZUnY4eVJZJztcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoemVjLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZChhZGRyZXNzLCAnemVjJyksICd0cmFuc3BhcmVudCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKGFkZHJlc3MsICd6ZWMnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgZ2FyYmFnZSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZ2FyYmFnZSA9ICdub3QtYS1yZWFsLWFkZHJlc3MnO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh6ZWMuaXNWYWxpZEFkZHJlc3MoZ2FyYmFnZSksIGZhbHNlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZChnYXJiYWdlLCAnemVjJyksIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRaY2FzaEFkZHJlc3MoZ2FyYmFnZSwgJ3plYycpLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgdW5pZmllZCBhZGRyZXNzIGNoZWNrZWQgYWdhaW5zdCB0aGUgd3JvbmcgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHplYy5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpLCBmYWxzZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAndHplYycpLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1NoaWVsZGVkWmNhc2hBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3R6ZWMnKSwgZmFsc2UpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3R6ZWMnKSwgZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnWmVjQWRkcmVzc0NvZGVjJywgZnVuY3Rpb24gKCkge1xuICAvLyAtLSBpbnN0YW50aWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsZXQgYml0Z286IEJpdEdvQVBJO1xuICBsZXQgemVjO1xuICBsZXQgdHplYztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gbmV3IEJpdEdvQVBJKHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3plYycsIFplYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3R6ZWMnLCBUemVjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICB6ZWMgPSBiaXRnby5jb2luKCd6ZWMnKTtcbiAgICB0emVjID0gYml0Z28uY29pbigndHplYycpO1xuICB9KTtcblxuICBpdCgnY29uc3RydWN0cyBmb3IgemVjIGFuZCB0emVjJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1haW5uZXQgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd6ZWMnLCAnemVjJyk7XG4gICAgY29uc3QgdGVzdG5ldCA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChtYWlubmV0LmNvaW5OYW1lLCAnemVjJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlc3RuZXQuY29pbk5hbWUsICd0emVjJyk7XG4gIH0pO1xuXG4gIC8vIC0tIGlzVmFsaWRBZGRyZXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiBhY2NlcHRzIG1haW5uZXQgVUEnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3plYycsICd6ZWMnKS5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiBhY2NlcHRzIHRlc3RuZXQgVUEnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpLmlzVmFsaWRBZGRyZXNzKHRlc3RuZXRXYWxsZXQudW5pZmllZCksIHRydWUpO1xuICB9KTtcblxuICBpdCgnaXNWYWxpZEFkZHJlc3M6IGFjY2VwdHMgbWFpbm5ldCBQMlBLSCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmV3IFplY0FkZHJlc3NDb2RlYygnemVjJywgJ3plYycpLmlzVmFsaWRBZGRyZXNzKCd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWScpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiBhY2NlcHRzIHRlc3RuZXQgdHJhbnNwYXJlbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJykuaXNWYWxpZEFkZHJlc3ModGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiByZWplY3RzIHdyb25nLW5ldHdvcmsgVUEnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpLmlzVmFsaWRBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiByZWplY3RzIGdhcmJhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpLmlzVmFsaWRBZGRyZXNzKCdub3QtYS1yZWFsLWFkZHJlc3MnKSwgZmFsc2UpO1xuICB9KTtcblxuICAvLyAtLSBkZWNvZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGl0KCdkZWNvZGU6IHBsYWluIHRyYW5zcGFyZW50IGFkZHJlc3MgZGVjb2RlcyB0byBQMlBLSCBzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKTtcbiAgICBjb25zdCBzY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpKTtcbiAgICAvLyBQMlBLSDogT1BfRFVQIE9QX0hBU0gxNjAgPDIwLWJ5dGUgaGFzaD4gT1BfRVFVQUxWRVJJRlkgT1BfQ0hFQ0tTSUdcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzBdLCAweDc2KTsgLy8gT1BfRFVQXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFsxXSwgMHhhOSk7IC8vIE9QX0hBU0gxNjBcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzJdLCAweDE0KTsgLy8gcHVzaCAyMCBieXRlc1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHQubGVuZ3RoLCAyNSk7IC8vIHRvdGFsIFAyUEtIIGxlbmd0aFxuICB9KTtcblxuICBpdCgnZGVjb2RlOiBVQSB3aXRoIHRyYW5zcGFyZW50IHJlY2VpdmVyIGRlY29kZXMgdG8gdGhlIHNhbWUgdHJhbnNwYXJlbnQgc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgLy8gVGhlIHRlc3RuZXQgVUEgY2FycmllcyBhIHRyYW5zcGFyZW50IHJlY2VpdmVyOyBpdCBzaG91bGQgZGVjb2RlIHRvIHRoZVxuICAgIC8vIHNhbWUgc2NyaXB0UHViS2V5IGFzIHRoZSBzdGFuZGFsb25lIHRyYW5zcGFyZW50IGFkZHJlc3MuXG4gICAgY29uc3QgdWFTY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC51bmlmaWVkKSk7XG4gICAgY29uc3QgdEFkZHJTY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHVhU2NyaXB0LCB0QWRkclNjcmlwdCk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IFVBIHdpdGggdHJhbnNwYXJlbnQgcmVjZWl2ZXIgZGVjb2RlcyBvbiBtYWlubmV0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygnemVjJywgJ3plYycpO1xuICAgIGNvbnN0IHNjcmlwdCA9IEJ1ZmZlci5mcm9tKGNvZGVjLmRlY29kZSh6aXAzMTZNYWlubmV0LnVuaWZpZWQpKTtcbiAgICAvLyBQMlBLSCBzdHJ1Y3R1cmUgdGVzdFxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMF0sIDB4NzYpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMV0sIDB4YTkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMl0sIDB4MTQpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiB0aHJvd3MgZm9yIGEgVUEgd2l0aG91dCBhIHRyYW5zcGFyZW50IHJlY2VpdmVyIChvcmNoYXJkLW9ubHkpJywgZnVuY3Rpb24gKCkge1xuICAgIC8vIENvbnN0cnVjdCBhbiBPcmNoYXJkLW9ubHkgVUEgYnkgZW5jb2RpbmcgYSBkdW1teSByZWNlaXZlclxuICAgIGNvbnN0IG9yY2hhcmRPbmx5ID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5lbmNvZGVPcmNoYXJkUmVjZWl2ZXIoXG4gICAgICBuZXcgVWludDhBcnJheSg0MykuZmlsbCgweDQyKSxcbiAgICAgICd0emVjJ1xuICAgICk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNvZGVjLmRlY29kZShvcmNoYXJkT25seSkpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBleHBsaWNpdCB0cmFuc3BhcmVudC1ib3VuZCBjb2RlYyByZXR1cm5zIHRoZSB0cmFuc3BhcmVudCBzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnLCAndHJhbnNwYXJlbnQnKTtcbiAgICBjb25zdCBzY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC51bmlmaWVkKSk7XG4gICAgY29uc3QgdEFkZHJTY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdCwgdEFkZHJTY3JpcHQpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBzaGllbGRlZC1ib3VuZCBjb2RlYyByZXR1cm5zIHRoZSByYXcgNDMtYnl0ZSBPcmNoYXJkIHJlY2VpdmVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJywgJ3NoaWVsZGVkJyk7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC51bmlmaWVkKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2VpdmVyLmxlbmd0aCwgNDMpO1xuICAgIGNvbnN0IHBhcnNlZCA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MucGFyc2UodGVzdG5ldFdhbGxldC51bmlmaWVkLCAndHplYycpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjZWl2ZXIsIEJ1ZmZlci5mcm9tKHBhcnNlZC5vcmNoYXJkUmVjZWl2ZXIgYXMgVWludDhBcnJheSkpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBzaGllbGRlZC1ib3VuZCBjb2RlYyBvbiBtYWlubmV0IHJldHVybnMgdGhlIHJhdyA0My1ieXRlIE9yY2hhcmQgcmVjZWl2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd6ZWMnLCAnemVjJywgJ3NoaWVsZGVkJyk7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUoemlwMzE2TWFpbm5ldC51bmlmaWVkKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2VpdmVyLmxlbmd0aCwgNDMpO1xuICAgIGNvbnN0IHBhcnNlZCA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MucGFyc2UoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAnemVjJyk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWNlaXZlciwgQnVmZmVyLmZyb20ocGFyc2VkLm9yY2hhcmRSZWNlaXZlciBhcyBVaW50OEFycmF5KSk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IHNoaWVsZGVkLWJvdW5kIGNvZGVjIHJlc29sdmVzIGFuIE9yY2hhcmQtb25seSBVQSB0byBpdHMgcmVjZWl2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgb3JjaGFyZE9ubHkgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzLmVuY29kZU9yY2hhcmRSZWNlaXZlcihcbiAgICAgIG5ldyBVaW50OEFycmF5KDQzKS5maWxsKDB4NDIpLFxuICAgICAgJ3R6ZWMnXG4gICAgKTtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGNvbnN0IHJlY2VpdmVyID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKG9yY2hhcmRPbmx5KSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2VpdmVyLmxlbmd0aCwgNDMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjZWl2ZXIsIEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KDQzKS5maWxsKDB4NDIpKSk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IHNoaWVsZGVkLWJvdW5kIGNvZGVjIHRocm93cyBpbnZhbGlkLWFkZHJlc3MgZXJyb3IgZm9yIGEgcGxhaW4gdHJhbnNwYXJlbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSwgL2lzIG5vdCBhIHZhbGlkIGFkZHJlc3MgZm9yIG5ldHdvcmsvKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogc2hpZWxkZWQtYm91bmQgY29kZWMgdGhyb3dzIGludmFsaWQtYWRkcmVzcyBlcnJvciBmb3IgYSB3cm9uZy1uZXR3b3JrIFVBJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJywgJ3NoaWVsZGVkJyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjb2RlYy5kZWNvZGUoemlwMzE2TWFpbm5ldC51bmlmaWVkKSwgL2lzIG5vdCBhIHZhbGlkIGFkZHJlc3MgZm9yIG5ldHdvcmsvKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogc2hpZWxkZWQtYm91bmQgY29kZWMgdGhyb3dzIGludmFsaWQtYWRkcmVzcyBlcnJvciBmb3IgZ2FyYmFnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY29kZWMuZGVjb2RlKCdub3QtYS1yZWFsLWFkZHJlc3MnKSwgL2lzIG5vdCBhIHZhbGlkIGFkZHJlc3MgZm9yIG5ldHdvcmsvKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogdGhyb3dzIGZvciBnYXJiYWdlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjb2RlYy5kZWNvZGUoJ25vdC1hLXJlYWwtYWRkcmVzcycpKTtcbiAgfSk7XG5cbiAgaXQoJ2lzTWF0Y2hpbmdTY3JpcHQgdmFsaWRhdGVzIHRoZSByZWNlaXZlciByZXByZXNlbnRlZCBieSBwYXJzZWQgb3V0cHV0IG1ldGFkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgY29uc3QgdHJhbnNwYXJlbnRTY3JpcHQgPSBjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC51bmlmaWVkKTtcbiAgICBjb25zdCBzaGllbGRlZFNjcmlwdCA9IHpjYXNoQWRkcmVzcy50b1NoaWVsZGVkUmVjZWl2ZXJXaXRoQ29pbih0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsICd0emVjJyk7XG4gICAgY29uc3QgdHJhbnNwYXJlbnRPdXRwdXQ6IFplY0FkZHJlc3NDb2RlY091dHB1dCA9IHtcbiAgICAgIGFkZHJlc3M6IHRlc3RuZXRXYWxsZXQudW5pZmllZCxcbiAgICAgIHNjcmlwdDogdHJhbnNwYXJlbnRTY3JpcHQsXG4gICAgICBpc1NoaWVsZGVkOiBmYWxzZSxcbiAgICB9O1xuICAgIGNvbnN0IHNoaWVsZGVkT3V0cHV0OiBaZWNBZGRyZXNzQ29kZWNPdXRwdXQgPSB7XG4gICAgICBhZGRyZXNzOiB0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsXG4gICAgICBzY3JpcHQ6IHNoaWVsZGVkU2NyaXB0LFxuICAgICAgaXNTaGllbGRlZDogdHJ1ZSxcbiAgICB9O1xuICAgIGNvbnN0IHRyYW5zcGFyZW50TWV0YWRhdGFGb3JTaGllbGRlZE91dHB1dDogWmVjQWRkcmVzc0NvZGVjT3V0cHV0ID0geyAuLi50cmFuc3BhcmVudE91dHB1dCwgaXNTaGllbGRlZDogdHJ1ZSB9O1xuICAgIGNvbnN0IHNoaWVsZGVkTWV0YWRhdGFGb3JUcmFuc3BhcmVudE91dHB1dDogWmVjQWRkcmVzc0NvZGVjT3V0cHV0ID0geyAuLi5zaGllbGRlZE91dHB1dCwgaXNTaGllbGRlZDogZmFsc2UgfTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29kZWMuaXNNYXRjaGluZ1NjcmlwdCh0cmFuc3BhcmVudE1ldGFkYXRhRm9yU2hpZWxkZWRPdXRwdXQpLCBmYWxzZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvZGVjLmlzTWF0Y2hpbmdTY3JpcHQoc2hpZWxkZWRNZXRhZGF0YUZvclRyYW5zcGFyZW50T3V0cHV0KSwgZmFsc2UpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIGNvZGVjLmlzTWF0Y2hpbmdTY3JpcHQoeyBhZGRyZXNzOiB0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsIHNjcmlwdDogQnVmZmVyLmZyb20oJzAwJywgJ2hleCcpIH0pLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIGNvZGVjLnRvRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KEJ1ZmZlci5mcm9tKHNoaWVsZGVkU2NyaXB0KSwgdGVzdG5ldFdhbGxldC51bmlmaWVkKSxcbiAgICAgIHRlc3RuZXRXYWxsZXQudW5pZmllZFxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjb2RlYy50b0V4dGVuZGVkQWRkcmVzc0Zvcm1hdChCdWZmZXIuZnJvbSh0cmFuc3BhcmVudFNjcmlwdCksICdub3QtYS1yZWFsLWFkZHJlc3MnKSk7XG4gIH0pO1xuXG4gIC8vIC0tIGVuY29kZSAoaW5oZXJpdGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaXQoJ2VuY29kZTogcm91bmQtdHJpcHMgYSB0cmFuc3BhcmVudCBzY3JpcHQgdG8gYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpO1xuICAgIGNvbnN0IHNjcmlwdCA9IGNvZGVjLmRlY29kZSh0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcyk7XG4gICAgY29uc3QgYWRkcmVzcyA9IGNvZGVjLmVuY29kZShzY3JpcHQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRyZXNzLCB0ZXN0bmV0V2FsbGV0LnRyYW5zcGFyZW50QWRkcmVzcyk7XG4gIH0pO1xuXG4gIGl0KCdlbmNvZGU6IHJvdW5kLXRyaXBzIG9uIG1haW5uZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd6ZWMnLCAnemVjJyk7XG4gICAgY29uc3QgYWRkcmVzcyA9ICd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWSc7XG4gICAgY29uc3Qgc2NyaXB0ID0gY29kZWMuZGVjb2RlKGFkZHJlc3MpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb2RlYy5lbmNvZGUoc2NyaXB0KSwgYWRkcmVzcyk7XG4gIH0pO1xuXG4gIC8vIC0tIGludGVncmF0aW9uOiBjb2luLmFkZHJlc3NDb2RlYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaXQoJ2NvaW4uYWRkcmVzc0NvZGVjOiB6ZWMgcmV0dXJucyBaZWNBZGRyZXNzQ29kZWMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0Lm9rKHplYy5hZGRyZXNzQ29kZWMgaW5zdGFuY2VvZiBaZWNBZGRyZXNzQ29kZWMpO1xuICB9KTtcblxuICBpdCgnY29pbi5hZGRyZXNzQ29kZWM6IHR6ZWMgcmV0dXJucyBaZWNBZGRyZXNzQ29kZWMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0Lm9rKHR6ZWMuYWRkcmVzc0NvZGVjIGluc3RhbmNlb2YgWmVjQWRkcmVzc0NvZGVjKTtcbiAgfSk7XG5cbiAgaXQoJ2NvaW4uYWRkcmVzc0NvZGVjLmlzVmFsaWRBZGRyZXNzIG1hdGNoZXMgWmVjLmlzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIHplYy5hZGRyZXNzQ29kZWMuaXNWYWxpZEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkKSxcbiAgICAgIHplYy5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpXG4gICAgKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICB6ZWMuYWRkcmVzc0NvZGVjLmlzVmFsaWRBZGRyZXNzKCd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWScpLFxuICAgICAgemVjLmlzVmFsaWRBZGRyZXNzKCd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWScpXG4gICAgKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoemVjLmFkZHJlc3NDb2RlYy5pc1ZhbGlkQWRkcmVzcygnbm90LWEtcmVhbC1hZGRyZXNzJyksIHplYy5pc1ZhbGlkQWRkcmVzcygnbm90LWEtcmVhbC1hZGRyZXNzJykpO1xuICB9KTtcbn0pO1xuIl19