@bitgo-beta/sdk-coin-flrp 1.0.1-beta.266 → 1.0.1-beta.267

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 (120) hide show
  1. package/dist/src/flrp.d.ts +6 -75
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +13 -298
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +50 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +163 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +36 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +128 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +47 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +213 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +23 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +101 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +34 -84
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +119 -288
  25. package/dist/src/lib/iface.d.ts +50 -51
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +22 -10
  28. package/dist/src/lib/index.d.ts +2 -3
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +5 -6
  31. package/dist/src/lib/keyPair.d.ts +1 -1
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +9 -5
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
  37. package/dist/src/lib/transaction.d.ts +8 -74
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +61 -210
  40. package/dist/src/lib/transactionBuilder.d.ts +56 -34
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilder.js +112 -69
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +27 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +69 -75
  46. package/dist/src/lib/utils.d.ts +58 -157
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +134 -399
  49. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  50. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  51. package/dist/test/resources/transactionData/exportInC.js +30 -0
  52. package/dist/test/unit/lib/exportInCTxBuilder.js +92 -513
  53. package/dist/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +9 -11
  55. package/dist/src/iface.d.ts +0 -25
  56. package/dist/src/iface.d.ts.map +0 -1
  57. package/dist/src/iface.js +0 -3
  58. package/dist/src/lib/constants.d.ts +0 -170
  59. package/dist/src/lib/constants.d.ts.map +0 -1
  60. package/dist/src/lib/constants.js +0 -227
  61. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  62. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  63. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  64. package/dist/src/lib/errors.d.ts +0 -8
  65. package/dist/src/lib/errors.d.ts.map +0 -1
  66. package/dist/src/lib/errors.js +0 -19
  67. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  68. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  69. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  70. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  71. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  72. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  73. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  74. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  75. package/dist/src/lib/importInCTxBuilder.js +0 -403
  76. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  77. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  78. package/dist/src/lib/importInPTxBuilder.js +0 -464
  79. package/dist/src/lib/types.d.ts +0 -78
  80. package/dist/src/lib/types.d.ts.map +0 -1
  81. package/dist/src/lib/types.js +0 -5
  82. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  83. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  84. package/dist/src/lib/validatorTxBuilder.js +0 -180
  85. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  86. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  87. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  88. package/dist/test/unit/flrp.d.ts +0 -2
  89. package/dist/test/unit/flrp.d.ts.map +0 -1
  90. package/dist/test/unit/flrp.js +0 -118
  91. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  92. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  93. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  94. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +0 -2
  95. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
  96. package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
  97. package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
  98. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
  99. package/dist/test/unit/lib/importInCTxBuilder.js +0 -258
  100. package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
  101. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
  102. package/dist/test/unit/lib/importInPTxBuilder.js +0 -501
  103. package/dist/test/unit/lib/transaction.d.ts +0 -2
  104. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  105. package/dist/test/unit/lib/transaction.js +0 -460
  106. package/dist/test/unit/lib/utils.d.ts +0 -2
  107. package/dist/test/unit/lib/utils.d.ts.map +0 -1
  108. package/dist/test/unit/lib/utils.js +0 -365
  109. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  110. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  111. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  112. package/dist/test/unit/smoke.d.ts +0 -2
  113. package/dist/test/unit/smoke.d.ts.map +0 -1
  114. package/dist/test/unit/smoke.js +0 -23
  115. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  116. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  117. package/dist/test/unit/transactionBuilder.test.js +0 -114
  118. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  119. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  120. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -36,549 +36,128 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const statics_1 = require("@bitgo-beta/statics");
37
37
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
38
38
  const assert = __importStar(require("assert"));
39
- const exportInCTxBuilder_1 = require("../../../src/lib/exportInCTxBuilder");
39
+ const transactionBuilderFactory_1 = require("../../../src/lib/transactionBuilderFactory");
40
+ const exportInC_1 = require("../../resources/transactionData/exportInC");
40
41
  describe('ExportInCTxBuilder', function () {
41
- const coinConfig = statics_1.coins.get('tflrp');
42
- let builder;
43
- beforeEach(function () {
44
- builder = new exportInCTxBuilder_1.ExportInCTxBuilder(coinConfig);
45
- });
46
- describe('Constructor', function () {
47
- it('should initialize with coin config', function () {
48
- assert.ok(builder);
49
- assert.ok(builder instanceof exportInCTxBuilder_1.ExportInCTxBuilder);
50
- });
51
- it('should extend AtomicInCTransactionBuilder', function () {
52
- // Test inheritance
53
- assert.ok(builder);
54
- });
55
- });
56
- describe('UTXO Override', function () {
57
- it('should throw error when trying to set UTXOs', function () {
58
- const mockUtxos = [{ id: 'test' }];
59
- assert.throws(() => {
60
- builder.utxos(mockUtxos);
61
- }, sdk_core_1.BuildTransactionError, 'Should reject UTXOs for C-chain export transactions');
62
- });
63
- it('should throw error for empty UTXO array', function () {
42
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'));
43
+ const txBuilder = factory.getExportInCBuilder();
44
+ describe('utxos ExportInCTxBuilder', function () {
45
+ it('should throw an error when utxos are used', async function () {
64
46
  assert.throws(() => {
65
- builder.utxos([]);
66
- }, sdk_core_1.BuildTransactionError, 'Should reject empty UTXO array');
67
- });
68
- it('should throw error for any UTXO input', function () {
69
- const testCases = [[], [{}], ['invalid'], null, undefined];
70
- testCases.forEach((testCase, index) => {
71
- assert.throws(() => {
72
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
- builder.utxos(testCase);
74
- }, sdk_core_1.BuildTransactionError, `Test case ${index} should throw error`);
75
- });
47
+ txBuilder.utxos([]);
48
+ }, new sdk_core_1.BuildTransactionError('utxos are not required in Export Tx in C-Chain'));
76
49
  });
77
50
  });
78
- describe('Amount Management', function () {
79
- it('should set valid positive amounts', function () {
80
- const validAmounts = ['1000', '1000000000000000000', '999999999999999999'];
51
+ describe('amount ExportInCTxBuilder', function () {
52
+ it('should accept valid amounts in different formats', function () {
53
+ const validAmounts = [BigInt(1000), '1000'];
81
54
  validAmounts.forEach((amount) => {
82
55
  assert.doesNotThrow(() => {
83
- builder.amount(amount);
84
- }, `Should accept amount: ${amount}`);
85
- });
86
- });
87
- it('should set bigint amounts', function () {
88
- const bigintAmounts = [1000n, 1000000000000000000n, 999999999999999999n];
89
- bigintAmounts.forEach((amount) => {
90
- assert.doesNotThrow(() => {
91
- builder.amount(amount);
92
- }, `Should accept bigint amount: ${amount}`);
56
+ txBuilder.amount(amount);
57
+ });
93
58
  });
94
59
  });
95
- it('should set numeric amounts', function () {
96
- const numericAmounts = [1000, 2000000, 999999999];
97
- numericAmounts.forEach((amount) => {
98
- assert.doesNotThrow(() => {
99
- builder.amount(amount);
100
- }, `Should accept numeric amount: ${amount}`);
101
- });
102
- });
103
- it('should reject zero amount', function () {
104
- assert.throws(() => {
105
- builder.amount(0);
106
- }, /Amount must be positive/);
107
- assert.throws(() => {
108
- builder.amount('0');
109
- }, /Amount must be positive/);
110
- assert.throws(() => {
111
- builder.amount(0n);
112
- }, /Amount must be positive/);
113
- });
114
- it('should reject negative amounts', function () {
115
- const negativeAmounts = ['-1000', '-1'];
116
- negativeAmounts.forEach((amount) => {
60
+ it('should throw error for invalid amounts', function () {
61
+ const invalidAmounts = ['0', '-1'];
62
+ invalidAmounts.forEach((amount) => {
117
63
  assert.throws(() => {
118
- builder.amount(amount);
119
- }, sdk_core_1.BuildTransactionError, `Should reject negative amount: ${amount}`);
120
- });
121
- });
122
- it('should handle large amounts', function () {
123
- const largeAmounts = [
124
- '100000000000000000000000', // Very large amount
125
- '18446744073709551615', // Near uint64 max
126
- BigInt('999999999999999999999999999999'),
127
- ];
128
- largeAmounts.forEach((amount) => {
129
- assert.doesNotThrow(() => {
130
- builder.amount(amount);
131
- }, `Should handle large amount: ${amount}`);
132
- });
133
- });
134
- it('should chain amount setting with other methods', function () {
135
- const amount = '1000000000000000000';
136
- const nonce = 1n;
137
- assert.doesNotThrow(() => {
138
- builder.amount(amount).nonce(nonce);
64
+ txBuilder.amount(amount);
65
+ }, sdk_core_1.BuildTransactionError);
139
66
  });
140
67
  });
141
68
  });
142
- describe('Nonce Management', function () {
143
- it('should set valid nonce values', function () {
144
- const validNonces = [0n, 1n, 1000n, 999999999999n];
69
+ describe('nonce ExportInCTxBuilder', function () {
70
+ it('should accept valid nonces in different formats', function () {
71
+ const validNonces = ['1', 1, 0];
145
72
  validNonces.forEach((nonce) => {
146
73
  assert.doesNotThrow(() => {
147
- builder.nonce(nonce);
148
- }, `Should accept nonce: ${nonce}`);
149
- });
150
- });
151
- it('should set string nonce values', function () {
152
- const stringNonces = ['0', '1', '1000', '999999999999'];
153
- stringNonces.forEach((nonce) => {
154
- assert.doesNotThrow(() => {
155
- builder.nonce(nonce);
156
- }, `Should accept string nonce: ${nonce}`);
157
- });
158
- });
159
- it('should set numeric nonce values', function () {
160
- const numericNonces = [0, 1, 1000, 999999];
161
- numericNonces.forEach((nonce) => {
162
- assert.doesNotThrow(() => {
163
- builder.nonce(nonce);
164
- }, `Should accept numeric nonce: ${nonce}`);
165
- });
166
- });
167
- it('should reject negative nonce values', function () {
168
- const negativeNonces = [-1n, -1000n];
169
- negativeNonces.forEach((nonce) => {
170
- assert.throws(() => {
171
- builder.nonce(nonce);
172
- }, sdk_core_1.BuildTransactionError, `Should reject negative nonce: ${nonce}`);
173
- });
174
- });
175
- it('should reject negative string nonce values', function () {
176
- const negativeStringNonces = ['-1', '-1000'];
177
- negativeStringNonces.forEach((nonce) => {
178
- assert.throws(() => {
179
- builder.nonce(nonce);
180
- }, sdk_core_1.BuildTransactionError, `Should reject negative string nonce: ${nonce}`);
181
- });
182
- });
183
- it('should handle large nonce values', function () {
184
- const largeNonces = [
185
- '18446744073709551615', // Max uint64
186
- BigInt('999999999999999999999999999999'),
187
- 1000000000000000000n,
188
- ];
189
- largeNonces.forEach((nonce) => {
190
- assert.doesNotThrow(() => {
191
- builder.nonce(nonce);
192
- }, `Should handle large nonce: ${nonce}`);
193
- });
194
- });
195
- it('should chain nonce setting with other methods', function () {
196
- const nonce = 123n;
197
- const amount = '1000000000000000000';
198
- assert.doesNotThrow(() => {
199
- builder.nonce(nonce).amount(amount);
200
- });
201
- });
202
- });
203
- describe('Destination Address Management', function () {
204
- it('should set single destination address', function () {
205
- const singleAddress = 'P-flare1destination';
206
- assert.doesNotThrow(() => {
207
- builder.to(singleAddress);
208
- });
209
- });
210
- it('should set multiple destination addresses', function () {
211
- const multipleAddresses = ['P-flare1dest1', 'P-flare1dest2', 'P-flare1dest3'];
212
- assert.doesNotThrow(() => {
213
- builder.to(multipleAddresses);
214
- });
215
- });
216
- it('should handle comma-separated addresses', function () {
217
- const commaSeparated = 'P-flare1dest1~P-flare1dest2~P-flare1dest3';
218
- assert.doesNotThrow(() => {
219
- builder.to(commaSeparated);
220
- });
221
- });
222
- it('should handle empty address array', function () {
223
- assert.doesNotThrow(() => {
224
- builder.to([]);
225
- });
226
- });
227
- it('should chain address setting with other methods', function () {
228
- const addresses = ['P-flare1dest1', 'P-flare1dest2'];
229
- const amount = '1000000000000000000';
230
- assert.doesNotThrow(() => {
231
- builder.to(addresses).amount(amount);
232
- });
233
- });
234
- });
235
- describe('Transaction Type Verification', function () {
236
- it('should verify transaction type (placeholder returns true)', function () {
237
- const mockTx = { type: 'export' };
238
- const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(mockTx);
239
- assert.strictEqual(result, true); // Placeholder always returns true
240
- });
241
- it('should handle different transaction objects', function () {
242
- const testCases = [{}, null, undefined, { type: 'import' }, { data: 'test' }];
243
- testCases.forEach((testCase, index) => {
244
- const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(testCase);
245
- assert.strictEqual(result, true, `Test case ${index} should return true (placeholder)`);
246
- });
247
- });
248
- it('should verify via instance method', function () {
249
- const mockTx = { type: 'export' };
250
- const result = builder.verifyTxType(mockTx);
251
- assert.strictEqual(result, true);
252
- });
253
- });
254
- describe('Transaction Building', function () {
255
- it('should handle building when transaction has credentials', function () {
256
- const mockTx = {
257
- unsignedTx: {
258
- networkId: 0, // Match builder's default
259
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
260
- destinationBlockchainId: Buffer.from('test-dest'),
261
- inputs: [
262
- {
263
- address: 'C-flare1test',
264
- amount: 2000000000000000000n,
265
- assetId: Buffer.alloc(0), // Match builder's default
266
- nonce: 1n,
267
- },
268
- ],
269
- outputs: [
270
- {
271
- addresses: ['P-flare1dest'],
272
- amount: 1000000000000000000n,
273
- assetId: Buffer.alloc(0), // Match builder's default
274
- },
275
- ],
276
- },
277
- credentials: [],
278
- };
279
- builder.initBuilder(mockTx);
280
- // Should not throw when credentials exist
281
- assert.doesNotThrow(() => {
282
- // Access protected method via type assertion
283
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
284
- builder.buildFlareTransaction();
285
- });
286
- });
287
- it('should require amount for building', function () {
288
- builder.nonce(1n);
289
- builder.to(['P-flare1dest']);
290
- // Mock setting from addresses via transaction initialization
291
- const mockRawTx = {
292
- unsignedTx: {
293
- networkId: 0, // Match builder's default
294
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
295
- destinationBlockchainId: Buffer.from('test-dest'),
296
- inputs: [
297
- {
298
- address: 'C-flare1test',
299
- amount: 2000000000000000000n,
300
- assetId: Buffer.alloc(0), // Match builder's default
301
- nonce: 1n,
302
- },
303
- ],
304
- outputs: [
305
- {
306
- addresses: ['P-flare1dest'],
307
- amount: 1000000000000000000n,
308
- assetId: Buffer.alloc(0), // Match builder's default
309
- },
310
- ],
311
- },
312
- credentials: [],
313
- };
314
- builder.initBuilder(mockRawTx);
315
- // Clear amount to test error
316
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
317
- builder._amount = undefined;
318
- assert.throws(() => {
319
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
320
- builder.buildFlareTransaction();
321
- }, Error);
322
- });
323
- });
324
- describe('Transaction Initialization', function () {
325
- it('should initialize from raw transaction object', function () {
326
- const mockRawTx = {
327
- unsignedTx: {
328
- networkId: 0, // Match builder's default
329
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
330
- destinationBlockchainId: Buffer.from('test-dest'),
331
- inputs: [
332
- {
333
- address: 'C-flare1test',
334
- amount: 2000000000000000000n,
335
- assetId: Buffer.alloc(0), // Match builder's default
336
- nonce: 1n,
337
- },
338
- ],
339
- outputs: [
340
- {
341
- addresses: ['P-flare1dest'],
342
- amount: 1000000000000000000n,
343
- assetId: Buffer.alloc(0), // Match builder's default
344
- },
345
- ],
346
- },
347
- credentials: [],
348
- };
349
- assert.doesNotThrow(() => {
350
- builder.initBuilder(mockRawTx);
74
+ txBuilder.nonce(nonce);
75
+ });
351
76
  });
352
77
  });
353
- it('should validate blockchain ID during initialization', function () {
354
- const mockRawTx = {
355
- unsignedTx: {
356
- networkId: 0, // Match builder's default
357
- sourceBlockchainId: Buffer.from('wrong-blockchain'),
358
- destinationBlockchainId: Buffer.from('test-dest'),
359
- inputs: [
360
- {
361
- address: 'C-flare1test',
362
- amount: 2000000000000000000n,
363
- assetId: Buffer.alloc(0), // Match builder's default
364
- nonce: 1n,
365
- },
366
- ],
367
- outputs: [
368
- {
369
- addresses: ['P-flare1dest'],
370
- amount: 1000000000000000000n,
371
- assetId: Buffer.alloc(0), // Match builder's default
372
- },
373
- ],
374
- },
375
- credentials: [],
376
- };
377
- assert.throws(() => {
378
- builder.initBuilder(mockRawTx);
379
- }, Error);
380
- });
381
- it('should validate single output requirement', function () {
382
- const mockRawTx = {
383
- unsignedTx: {
384
- networkId: 0, // Match builder's default
385
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default // Will match default
386
- destinationBlockchainId: Buffer.from('test-dest'),
387
- inputs: [
388
- {
389
- address: 'C-flare1test',
390
- amount: 2000000000000000000n,
391
- assetId: Buffer.alloc(0), // Match builder's default
392
- nonce: 1n,
393
- },
394
- ],
395
- outputs: [
396
- {
397
- addresses: ['P-flare1dest1'],
398
- amount: 500000000000000000n,
399
- assetId: Buffer.alloc(0), // Match builder's default
400
- },
401
- {
402
- addresses: ['P-flare1dest2'],
403
- amount: 500000000000000000n,
404
- assetId: Buffer.alloc(0), // Match builder's default
405
- },
406
- ],
407
- },
408
- credentials: [],
409
- };
410
- assert.throws(() => {
411
- builder.initBuilder(mockRawTx);
412
- }, sdk_core_1.BuildTransactionError);
413
- });
414
- it('should validate single input requirement', function () {
415
- const mockRawTx = {
416
- unsignedTx: {
417
- networkId: 0, // Match builder's default
418
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
419
- destinationBlockchainId: Buffer.from('test-dest'),
420
- inputs: [
421
- {
422
- address: 'C-flare1test1',
423
- amount: 1000000000000000000n,
424
- assetId: Buffer.alloc(0), // Match builder's default
425
- nonce: 1n,
426
- },
427
- {
428
- address: 'C-flare1test2',
429
- amount: 1000000000000000000n,
430
- assetId: Buffer.alloc(0), // Match builder's default
431
- nonce: 2n,
432
- },
433
- ],
434
- outputs: [
435
- {
436
- addresses: ['P-flare1dest'],
437
- amount: 1000000000000000000n,
438
- assetId: Buffer.alloc(0), // Match builder's default
439
- },
440
- ],
441
- },
442
- credentials: [],
443
- };
78
+ it('should throw error for negative nonce', function () {
444
79
  assert.throws(() => {
445
- builder.initBuilder(mockRawTx);
446
- }, sdk_core_1.BuildTransactionError);
447
- });
448
- it('should validate negative fee calculation', function () {
449
- const mockRawTx = {
450
- unsignedTx: {
451
- networkId: 0, // Match builder's default
452
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
453
- destinationBlockchainId: Buffer.from('test-dest'),
454
- inputs: [
455
- {
456
- address: 'C-flare1test',
457
- amount: 500000000000000000n, // Less than output
458
- assetId: Buffer.alloc(0), // Match builder's default
459
- nonce: 1n,
460
- },
461
- ],
462
- outputs: [
463
- {
464
- addresses: ['P-flare1dest'],
465
- amount: 1000000000000000000n, // More than input
466
- assetId: Buffer.alloc(0), // Match builder's default
467
- },
468
- ],
469
- },
470
- credentials: [],
471
- };
472
- assert.throws(() => {
473
- builder.initBuilder(mockRawTx);
474
- }, sdk_core_1.BuildTransactionError);
475
- });
476
- });
477
- describe('From Implementation', function () {
478
- it('should handle string raw transaction', function () {
479
- const rawString = 'hex-encoded-transaction';
480
- assert.doesNotThrow(() => {
481
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
482
- builder.fromImplementation(rawString);
483
- });
484
- });
485
- it('should handle object raw transaction', function () {
486
- const mockRawTx = {
487
- unsignedTx: {
488
- networkId: 0, // Match builder's default
489
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
490
- destinationBlockchainId: Buffer.from('test-dest'),
491
- inputs: [
492
- {
493
- address: 'C-flare1test',
494
- amount: 2000000000000000000n,
495
- assetId: Buffer.alloc(0), // Match builder's default
496
- nonce: 1n,
497
- },
498
- ],
499
- outputs: [
500
- {
501
- addresses: ['P-flare1dest'],
502
- amount: 1000000000000000000n,
503
- assetId: Buffer.alloc(0), // Match builder's default
504
- },
505
- ],
506
- },
507
- credentials: [],
508
- };
509
- assert.doesNotThrow(() => {
510
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
511
- builder.fromImplementation(mockRawTx);
512
- });
80
+ txBuilder.nonce('-1');
81
+ }, new sdk_core_1.BuildTransactionError('Nonce must be greater or equal than 0'));
513
82
  });
514
83
  });
515
- describe('Integration Tests', function () {
516
- it('should handle complete export flow preparation', function () {
517
- const amount = '1000000000000000000'; // 1 FLR
518
- const nonce = 123n;
519
- const toAddresses = ['P-flare1destination'];
520
- // Complete setup
521
- builder.amount(amount).nonce(nonce).to(toAddresses);
522
- // All operations should complete without throwing
523
- assert.ok(true);
524
- });
525
- it('should handle method chaining extensively', function () {
526
- // Test extensive method chaining
84
+ describe('to ExportInCTxBuilder', function () {
85
+ const txBuilder = factory.getExportInCBuilder();
86
+ it('should accept multiple P-addresses', function () {
87
+ const pAddresses = exportInC_1.EXPORT_IN_C.pAddresses;
527
88
  assert.doesNotThrow(() => {
528
- builder
529
- .amount('5000000000000000000') // 5 FLR
530
- .nonce(456n)
531
- .to(['P-flare1receiver1', 'P-flare1receiver2']);
89
+ txBuilder.to(pAddresses);
532
90
  });
533
91
  });
534
- it('should handle large transaction values', function () {
535
- const largeAmount = '100000000000000000000000'; // 100k FLR
536
- const largeNonce = 999999999999n;
92
+ it('should accept single P-address', function () {
537
93
  assert.doesNotThrow(() => {
538
- builder.amount(largeAmount).nonce(largeNonce);
94
+ txBuilder.to(exportInC_1.EXPORT_IN_C.pAddresses[0]);
539
95
  });
540
96
  });
541
- it('should handle multiple destination addresses', function () {
542
- const multipleDestinations = [
543
- 'P-flare1dest1',
544
- 'P-flare1dest2',
545
- 'P-flare1dest3',
546
- 'P-flare1dest4',
547
- 'P-flare1dest5',
548
- ];
97
+ it('should accept tilde-separated P-addresses string', function () {
98
+ const pAddresses = exportInC_1.EXPORT_IN_C.pAddresses.join('~');
549
99
  assert.doesNotThrow(() => {
550
- builder.amount('1000000000000000000').to(multipleDestinations);
100
+ txBuilder.to(pAddresses);
551
101
  });
552
102
  });
553
103
  });
554
- describe('Edge Cases', function () {
555
- it('should handle zero values appropriately', function () {
556
- // Zero amount should be rejected
557
- assert.throws(() => {
558
- builder.amount(0);
559
- }, /Amount must be positive/);
560
- // Zero nonce should be valid
561
- assert.doesNotThrow(() => {
562
- builder.nonce(0n);
104
+ describe('should build a export txn from C to P', () => {
105
+ const newTxBuilder = () => factory
106
+ .getExportInCBuilder()
107
+ .fromPubKey(exportInC_1.EXPORT_IN_C.cHexAddress)
108
+ .nonce(exportInC_1.EXPORT_IN_C.nonce)
109
+ .amount(exportInC_1.EXPORT_IN_C.amount)
110
+ .threshold(exportInC_1.EXPORT_IN_C.threshold)
111
+ .locktime(10)
112
+ .to(exportInC_1.EXPORT_IN_C.pAddresses)
113
+ .feeRate(exportInC_1.EXPORT_IN_C.fee);
114
+ it('Should create export tx for same values', async () => {
115
+ const txBuilder = newTxBuilder();
116
+ const tx = await txBuilder.build();
117
+ const rawTx = tx.toBroadcastFormat();
118
+ rawTx.should.equal(exportInC_1.EXPORT_IN_C.unsignedHex);
119
+ });
120
+ it('Should recover export tx from raw tx', async () => {
121
+ const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.unsignedHex);
122
+ const tx = await txBuilder.build();
123
+ const rawTx = tx.toBroadcastFormat();
124
+ rawTx.should.equal(exportInC_1.EXPORT_IN_C.unsignedHex);
125
+ });
126
+ xit('Should recover signed export from signed raw tx', async () => {
127
+ const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.signedHex);
128
+ const tx = await txBuilder.build();
129
+ const rawTx = tx.toBroadcastFormat();
130
+ rawTx.should.equal(exportInC_1.EXPORT_IN_C.signedHex);
131
+ });
132
+ it('Should full sign a export tx for same values', async () => {
133
+ const txBuilder = newTxBuilder();
134
+ txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
135
+ const tx = await txBuilder.build();
136
+ const rawTx = tx.toBroadcastFormat();
137
+ rawTx.should.equal(exportInC_1.EXPORT_IN_C.signedHex);
138
+ tx.signature.should.eql(exportInC_1.EXPORT_IN_C.signature);
139
+ });
140
+ it('Should full sign a export tx from unsigned raw tx', async () => {
141
+ const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.unsignedHex);
142
+ txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
143
+ const tx = await txBuilder.build();
144
+ const rawTx = tx.toBroadcastFormat();
145
+ rawTx.should.equal(exportInC_1.EXPORT_IN_C.signedHex);
146
+ });
147
+ it('Key cannot sign the transaction', () => {
148
+ it('Should full sign a export tx from unsigned raw tx', () => {
149
+ const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
150
+ .from(exportInC_1.EXPORT_IN_C.unsignedHex)
151
+ .fromPubKey(exportInC_1.EXPORT_IN_C.pAddresses);
152
+ txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
153
+ txBuilder
154
+ .build()
155
+ .then(() => assert.fail('it can sign'))
156
+ .catch((err) => {
157
+ err.message.should.be.equal('Private key cannot sign the transaction');
158
+ });
563
159
  });
564
160
  });
565
- it('should handle maximum values', function () {
566
- const maxBigInt = BigInt('18446744073709551615'); // Max uint64
567
- assert.doesNotThrow(() => {
568
- builder.amount(maxBigInt);
569
- });
570
- assert.doesNotThrow(() => {
571
- builder.nonce(maxBigInt);
572
- });
573
- });
574
- it('should maintain state across multiple operations', function () {
575
- // Build state incrementally
576
- builder.amount('1000000000000000000');
577
- builder.nonce(123n);
578
- builder.to(['P-flare1dest']);
579
- // State should be maintained across operations
580
- assert.ok(true);
581
- });
582
161
  });
583
162
  });
584
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsbURBQTZEO0FBQzdELCtDQUFpQztBQUNqQyw0RUFBeUU7QUFFekUsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSx1Q0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLG1CQUFtQjtZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDLEVBQ0QsZ0NBQXFCLEVBQ3JCLHFEQUFxRCxDQUN0RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixDQUFDLEVBQ0QsZ0NBQXFCLEVBQ3JCLGdDQUFnQyxDQUNqQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUUzRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwQyxNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRTtvQkFDSCw4REFBOEQ7b0JBQzlELE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBZSxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsRUFDRCxnQ0FBcUIsRUFDckIsYUFBYSxLQUFLLHFCQUFxQixDQUN4QyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1FBQzVCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtZQUN0QyxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1lBRTNFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3pCLENBQUMsRUFBRSx5QkFBeUIsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1lBQzlCLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFFekUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUMvQixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtvQkFDdkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekIsQ0FBQyxFQUFFLGdDQUFnQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUU7WUFDL0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWxELGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3pCLENBQUMsRUFBRSxpQ0FBaUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBRTlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBRTlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdDQUFnQyxFQUFFO1lBQ25DLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXhDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7b0JBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekIsQ0FBQyxFQUNELGdDQUFxQixFQUNyQixrQ0FBa0MsTUFBTSxFQUFFLENBQzNDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZCQUE2QixFQUFFO1lBQ2hDLE1BQU0sWUFBWSxHQUFHO2dCQUNuQiwwQkFBMEIsRUFBRSxvQkFBb0I7Z0JBQ2hELHNCQUFzQixFQUFFLGtCQUFrQjtnQkFDMUMsTUFBTSxDQUFDLGdDQUFnQyxDQUFDO2FBQ3pDLENBQUM7WUFFRixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQzlCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO29CQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QixDQUFDLEVBQUUsK0JBQStCLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztZQUNyQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFFakIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsK0JBQStCLEVBQUU7WUFDbEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztZQUVuRCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO29CQUN2QixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixDQUFDLEVBQUUsd0JBQXdCLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRTtZQUNuQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRXhELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUMsRUFBRSwrQkFBK0IsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFO1lBQ3BDLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFM0MsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM5QixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtvQkFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxFQUFFLGdDQUFnQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7WUFDeEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXJDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7b0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxFQUNELGdDQUFxQixFQUNyQixpQ0FBaUMsS0FBSyxFQUFFLENBQ3pDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFN0Msb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO29CQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUMsRUFDRCxnQ0FBcUIsRUFDckIsd0NBQXdDLEtBQUssRUFBRSxDQUNoRCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLFdBQVcsR0FBRztnQkFDbEIsc0JBQXNCLEVBQUUsYUFBYTtnQkFDckMsTUFBTSxDQUFDLGdDQUFnQyxDQUFDO2dCQUN4QyxvQkFBb0I7YUFDckIsQ0FBQztZQUVGLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDNUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUMsRUFBRSw4QkFBOEIsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1lBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQztZQUNuQixNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztZQUVyQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdDQUFnQyxFQUFFO1FBQ3pDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQztZQUU1QyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRTlFLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtZQUM1QyxNQUFNLGNBQWMsR0FBRywyQ0FBMkMsQ0FBQztZQUVuRSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUU7WUFDcEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUM7WUFFckMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywrQkFBK0IsRUFBRTtRQUN4QyxFQUFFLENBQUMsMkRBQTJELEVBQUU7WUFDOUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsdUNBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUU5RSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyx1Q0FBa0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEtBQUssbUNBQW1DLENBQUMsQ0FBQztZQUMxRixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1lBQ3RDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtRQUMvQixFQUFFLENBQUMseURBQXlELEVBQUU7WUFDNUQsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsVUFBVSxFQUFFO29CQUNWLFNBQVMsRUFBRSxDQUFDLEVBQUUsMEJBQTBCO29CQUN4QyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQjtvQkFDL0QsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7b0JBQ2pELE1BQU0sRUFBRTt3QkFDTjs0QkFDRSxPQUFPLEVBQUUsY0FBYzs0QkFDdkIsTUFBTSxFQUFFLG9CQUFvQjs0QkFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCOzRCQUNwRCxLQUFLLEVBQUUsRUFBRTt5QkFDVjtxQkFDRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDOzRCQUMzQixNQUFNLEVBQUUsb0JBQW9COzRCQUM1QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7eUJBQ3JEO3FCQUNGO2lCQUNGO2dCQUNELFdBQVcsRUFBRSxFQUFFO2FBQ2hCLENBQUM7WUFDRixPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTVCLDBDQUEwQztZQUMxQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsNkNBQTZDO2dCQUM3Qyw4REFBOEQ7Z0JBQzdELE9BQWUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUU3Qiw2REFBNkQ7WUFDN0QsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQjtvQkFDeEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7b0JBQy9ELHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUNqRCxNQUFNLEVBQUU7d0JBQ047NEJBQ0UsT0FBTyxFQUFFLGNBQWM7NEJBQ3ZCLE1BQU0sRUFBRSxvQkFBb0I7NEJBQzVCLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQjs0QkFDcEQsS0FBSyxFQUFFLEVBQUU7eUJBQ1Y7cUJBQ0Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQOzRCQUNFLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQzs0QkFDM0IsTUFBTSxFQUFFLG9CQUFvQjs0QkFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCO3lCQUNyRDtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsRUFBRTthQUNoQixDQUFDO1lBRUYsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQiw2QkFBNkI7WUFDN0IsOERBQThEO1lBQzdELE9BQWUsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBRXJDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQiw4REFBOEQ7Z0JBQzdELE9BQWUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzNDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNEJBQTRCLEVBQUU7UUFDckMsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1lBQ2xELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixVQUFVLEVBQUU7b0JBQ1YsU0FBUyxFQUFFLENBQUMsRUFBRSwwQkFBMEI7b0JBQ3hDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCO29CQUMvRCx1QkFBdUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztvQkFDakQsTUFBTSxFQUFFO3dCQUNOOzRCQUNFLE9BQU8sRUFBRSxjQUFjOzRCQUN2QixNQUFNLEVBQUUsb0JBQW9COzRCQUM1QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7NEJBQ3BELEtBQUssRUFBRSxFQUFFO3lCQUNWO3FCQUNGO29CQUNELE9BQU8sRUFBRTt3QkFDUDs0QkFDRSxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7NEJBQzNCLE1BQU0sRUFBRSxvQkFBb0I7NEJBQzVCLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQjt5QkFDckQ7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQztZQUVGLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQjtvQkFDeEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDbkQsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7b0JBQ2pELE1BQU0sRUFBRTt3QkFDTjs0QkFDRSxPQUFPLEVBQUUsY0FBYzs0QkFDdkIsTUFBTSxFQUFFLG9CQUFvQjs0QkFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCOzRCQUNwRCxLQUFLLEVBQUUsRUFBRTt5QkFDVjtxQkFDRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDOzRCQUMzQixNQUFNLEVBQUUsb0JBQW9COzRCQUM1QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7eUJBQ3JEO3FCQUNGO2lCQUNGO2dCQUNELFdBQVcsRUFBRSxFQUFFO2FBQ2hCLENBQUM7WUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxNQUFNLFNBQVMsR0FBRztnQkFDaEIsVUFBVSxFQUFFO29CQUNWLFNBQVMsRUFBRSxDQUFDLEVBQUUsMEJBQTBCO29CQUN4QyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdEQUFnRDtvQkFDckYsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7b0JBQ2pELE1BQU0sRUFBRTt3QkFDTjs0QkFDRSxPQUFPLEVBQUUsY0FBYzs0QkFDdkIsTUFBTSxFQUFFLG9CQUFvQjs0QkFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCOzRCQUNwRCxLQUFLLEVBQUUsRUFBRTt5QkFDVjtxQkFDRjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDOzRCQUM1QixNQUFNLEVBQUUsbUJBQW1COzRCQUMzQixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7eUJBQ3JEO3dCQUNEOzRCQUNFLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQzs0QkFDNUIsTUFBTSxFQUFFLG1CQUFtQjs0QkFDM0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCO3lCQUNyRDtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsRUFBRTthQUNoQixDQUFDO1lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsQ0FBQyxFQUFFLGdDQUFxQixDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQjtvQkFDeEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7b0JBQy9ELHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUNqRCxNQUFNLEVBQUU7d0JBQ047NEJBQ0UsT0FBTyxFQUFFLGVBQWU7NEJBQ3hCLE1BQU0sRUFBRSxvQkFBb0I7NEJBQzVCLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQjs0QkFDcEQsS0FBSyxFQUFFLEVBQUU7eUJBQ1Y7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGVBQWU7NEJBQ3hCLE1BQU0sRUFBRSxvQkFBb0I7NEJBQzVCLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQjs0QkFDcEQsS0FBSyxFQUFFLEVBQUU7eUJBQ1Y7cUJBQ0Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQOzRCQUNFLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQzs0QkFDM0IsTUFBTSxFQUFFLG9CQUFvQjs0QkFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCO3lCQUNyRDtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsRUFBRTthQUNoQixDQUFDO1lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsQ0FBQyxFQUFFLGdDQUFxQixDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQjtvQkFDeEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7b0JBQy9ELHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUNqRCxNQUFNLEVBQUU7d0JBQ047NEJBQ0UsT0FBTyxFQUFFLGNBQWM7NEJBQ3ZCLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUI7NEJBQ2hELE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQjs0QkFDcEQsS0FBSyxFQUFFLEVBQUU7eUJBQ1Y7cUJBQ0Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQOzRCQUNFLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQzs0QkFDM0IsTUFBTSxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQjs0QkFDaEQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCO3lCQUNyRDtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsRUFBRTthQUNoQixDQUFDO1lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsQ0FBQyxFQUFFLGdDQUFxQixDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtRQUM5QixFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsTUFBTSxTQUFTLEdBQUcseUJBQXlCLENBQUM7WUFFNUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLDhEQUE4RDtnQkFDN0QsT0FBZSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsQ0FBQyxFQUFFLDBCQUEwQjtvQkFDeEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSwwQkFBMEI7b0JBQy9ELHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO29CQUNqRCxNQUFNLEVBQUU7d0JBQ047NEJBQ0UsT0FBTyxFQUFFLGNBQWM7NEJBQ3ZCLE1BQU0sRUFBRSxvQkFBb0I7NEJBQzVCLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQjs0QkFDcEQsS0FBSyxFQUFFLEVBQUU7eUJBQ1Y7cUJBQ0Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQOzRCQUNFLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQzs0QkFDM0IsTUFBTSxFQUFFLG9CQUFvQjs0QkFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCO3lCQUNyRDtxQkFDRjtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsRUFBRTthQUNoQixDQUFDO1lBRUYsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLDhEQUE4RDtnQkFDN0QsT0FBZSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxRQUFRO1lBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQztZQUNuQixNQUFNLFdBQVcsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFFNUMsaUJBQWlCO1lBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVwRCxrREFBa0Q7WUFDbEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxpQ0FBaUM7WUFDakMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU87cUJBQ0osTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsUUFBUTtxQkFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQztxQkFDWCxFQUFFLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxNQUFNLFdBQVcsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLFdBQVc7WUFDM0QsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBRWpDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELE1BQU0sb0JBQW9CLEdBQUc7Z0JBQzNCLGVBQWU7Z0JBQ2YsZUFBZTtnQkFDZixlQUFlO2dCQUNmLGVBQWU7Z0JBQ2YsZUFBZTthQUNoQixDQUFDO1lBRUYsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxFQUFFO1FBQ3JCLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtZQUM1QyxpQ0FBaUM7WUFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7WUFFOUIsNkJBQTZCO1lBQzdCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxhQUFhO1lBRS9ELE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrREFBa0QsRUFBRTtZQUNyRCw0QkFBNEI7WUFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFFN0IsK0NBQStDO1lBQy9DLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgRXhwb3J0SW5DVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9leHBvcnRJbkNUeEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBsZXQgYnVpbGRlcjogRXhwb3J0SW5DVHhCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkZXIgPSBuZXcgRXhwb3J0SW5DVHhCdWlsZGVyKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHdpdGggY29pbiBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIEV4cG9ydEluQ1R4QnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4dGVuZCBBdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUZXN0IGluaGVyaXRhbmNlXG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdVVFhPIE92ZXJyaWRlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0cnlpbmcgdG8gc2V0IFVUWE9zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1V0eG9zID0gW3sgaWQ6ICd0ZXN0JyB9XTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIudXR4b3MobW9ja1V0eG9zKTtcbiAgICAgICAgfSxcbiAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAnU2hvdWxkIHJlamVjdCBVVFhPcyBmb3IgQy1jaGFpbiBleHBvcnQgdHJhbnNhY3Rpb25zJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGVtcHR5IFVUWE8gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci51dHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgJ1Nob3VsZCByZWplY3QgZW1wdHkgVVRYTyBhcnJheSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBhbnkgVVRYTyBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFtbXSwgW3t9XSwgWydpbnZhbGlkJ10sIG51bGwsIHVuZGVmaW5lZF07XG5cbiAgICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh0ZXN0Q2FzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgYnVpbGRlci51dHhvcyh0ZXN0Q2FzZSBhcyBhbnkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAgIGBUZXN0IGNhc2UgJHtpbmRleH0gc2hvdWxkIHRocm93IGVycm9yYFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBbW91bnQgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBwb3NpdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRBbW91bnRzID0gWycxMDAwJywgJzEwMDAwMDAwMDAwMDAwMDAwMDAnLCAnOTk5OTk5OTk5OTk5OTk5OTk5J107XG5cbiAgICAgIHZhbGlkQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgYW1vdW50OiAke2Ftb3VudH1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYmlnaW50IGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaWdpbnRBbW91bnRzID0gWzEwMDBuLCAxMDAwMDAwMDAwMDAwMDAwMDAwbiwgOTk5OTk5OTk5OTk5OTk5OTk5bl07XG5cbiAgICAgIGJpZ2ludEFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IGJpZ2ludCBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBudW1lcmljIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBudW1lcmljQW1vdW50cyA9IFsxMDAwLCAyMDAwMDAwLCA5OTk5OTk5OTldO1xuXG4gICAgICBudW1lcmljQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgbnVtZXJpYyBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB6ZXJvIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudCgwKTtcbiAgICAgIH0sIC9BbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS8pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzAnKTtcbiAgICAgIH0sIC9BbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS8pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoMG4pO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVBbW91bnRzID0gWyctMTAwMCcsICctMSddO1xuXG4gICAgICBuZWdhdGl2ZUFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgICBgU2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBhbW91bnQ6ICR7YW1vdW50fWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGxhcmdlQW1vdW50cyA9IFtcbiAgICAgICAgJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIFZlcnkgbGFyZ2UgYW1vdW50XG4gICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIE5lYXIgdWludDY0IG1heFxuICAgICAgICBCaWdJbnQoJzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScpLFxuICAgICAgXTtcblxuICAgICAgbGFyZ2VBbW91bnRzLmZvckVhY2goKGFtb3VudCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB9LCBgU2hvdWxkIGhhbmRsZSBsYXJnZSBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIGFtb3VudCBzZXR0aW5nIHdpdGggb3RoZXIgbWV0aG9kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IG5vbmNlID0gMW47XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpLm5vbmNlKG5vbmNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTm9uY2UgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZE5vbmNlcyA9IFswbiwgMW4sIDEwMDBuLCA5OTk5OTk5OTk5OTluXTtcblxuICAgICAgdmFsaWROb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IG5vbmNlOiAke25vbmNlfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBzdHJpbmcgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3RyaW5nTm9uY2VzID0gWycwJywgJzEnLCAnMTAwMCcsICc5OTk5OTk5OTk5OTknXTtcblxuICAgICAgc3RyaW5nTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBzdHJpbmcgbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG51bWVyaWMgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbnVtZXJpY05vbmNlcyA9IFswLCAxLCAxMDAwLCA5OTk5OTldO1xuXG4gICAgICBudW1lcmljTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBudW1lcmljIG5vbmNlOiAke25vbmNlfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZU5vbmNlcyA9IFstMW4sIC0xMDAwbl07XG5cbiAgICAgIG5lZ2F0aXZlTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFNob3VsZCByZWplY3QgbmVnYXRpdmUgbm9uY2U6ICR7bm9uY2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBzdHJpbmcgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVTdHJpbmdOb25jZXMgPSBbJy0xJywgJy0xMDAwJ107XG5cbiAgICAgIG5lZ2F0aXZlU3RyaW5nTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFNob3VsZCByZWplY3QgbmVnYXRpdmUgc3RyaW5nIG5vbmNlOiAke25vbmNlfWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2Ugbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGFyZ2VOb25jZXMgPSBbXG4gICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIE1heCB1aW50NjRcbiAgICAgICAgQmlnSW50KCc5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknKSxcbiAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICBdO1xuXG4gICAgICBsYXJnZU5vbmNlcy5mb3JFYWNoKChub25jZSkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgfSwgYFNob3VsZCBoYW5kbGUgbGFyZ2Ugbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2hhaW4gbm9uY2Ugc2V0dGluZyB3aXRoIG90aGVyIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBub25jZSA9IDEyM247XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKS5hbW91bnQoYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVzdGluYXRpb24gQWRkcmVzcyBNYW5hZ2VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHNpbmdsZSBkZXN0aW5hdGlvbiBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2luZ2xlQWRkcmVzcyA9ICdQLWZsYXJlMWRlc3RpbmF0aW9uJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oc2luZ2xlQWRkcmVzcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG11bHRpcGxlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG11bHRpcGxlQWRkcmVzc2VzID0gWydQLWZsYXJlMWRlc3QxJywgJ1AtZmxhcmUxZGVzdDInLCAnUC1mbGFyZTFkZXN0MyddO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci50byhtdWx0aXBsZUFkZHJlc3Nlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvbW1hLXNlcGFyYXRlZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb21tYVNlcGFyYXRlZCA9ICdQLWZsYXJlMWRlc3QxflAtZmxhcmUxZGVzdDJ+UC1mbGFyZTFkZXN0Myc7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKGNvbW1hU2VwYXJhdGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgYWRkcmVzcyBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKFtdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjaGFpbiBhZGRyZXNzIHNldHRpbmcgd2l0aCBvdGhlciBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gWydQLWZsYXJlMWRlc3QxJywgJ1AtZmxhcmUxZGVzdDInXTtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oYWRkcmVzc2VzKS5hbW91bnQoYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVHlwZSBWZXJpZmljYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gdHlwZSAocGxhY2Vob2xkZXIgcmV0dXJucyB0cnVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IHsgdHlwZTogJ2V4cG9ydCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUobW9ja1R4KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpOyAvLyBQbGFjZWhvbGRlciBhbHdheXMgcmV0dXJucyB0cnVlXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkaWZmZXJlbnQgdHJhbnNhY3Rpb24gb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFt7fSwgbnVsbCwgdW5kZWZpbmVkLCB7IHR5cGU6ICdpbXBvcnQnIH0sIHsgZGF0YTogJ3Rlc3QnIH1dO1xuXG4gICAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgodGVzdENhc2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUodGVzdENhc2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlLCBgVGVzdCBjYXNlICR7aW5kZXh9IHNob3VsZCByZXR1cm4gdHJ1ZSAocGxhY2Vob2xkZXIpYCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHZpYSBpbnN0YW5jZSBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrVHggPSB7IHR5cGU6ICdleHBvcnQnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnZlcmlmeVR4VHlwZShtb2NrVHgpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBCdWlsZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBidWlsZGluZyB3aGVuIHRyYW5zYWN0aW9uIGhhcyBjcmVkZW50aWFscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1R4KTtcblxuICAgICAgLy8gU2hvdWxkIG5vdCB0aHJvdyB3aGVuIGNyZWRlbnRpYWxzIGV4aXN0XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgLy8gQWNjZXNzIHByb3RlY3RlZCBtZXRob2QgdmlhIHR5cGUgYXNzZXJ0aW9uXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIChidWlsZGVyIGFzIGFueSkuYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVxdWlyZSBhbW91bnQgZm9yIGJ1aWxkaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5ub25jZSgxbik7XG4gICAgICBidWlsZGVyLnRvKFsnUC1mbGFyZTFkZXN0J10pO1xuXG4gICAgICAvLyBNb2NrIHNldHRpbmcgZnJvbSBhZGRyZXNzZXMgdmlhIHRyYW5zYWN0aW9uIGluaXRpYWxpemF0aW9uXG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIC8vIENsZWFyIGFtb3VudCB0byB0ZXN0IGVycm9yXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKGJ1aWxkZXIgYXMgYW55KS5fYW1vdW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIEVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIEluaXRpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSBmcm9tIHJhdyB0cmFuc2FjdGlvbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYmxvY2tjaGFpbiBJRCBkdXJpbmcgaW5pdGlhbGl6YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgnd3JvbmctYmxvY2tjaGFpbicpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QnLFxuICAgICAgICAgICAgICBhbW91bnQ6IDIwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgfSwgRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzaW5nbGUgb3V0cHV0IHJlcXVpcmVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1Jhd1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdCAvLyBXaWxsIG1hdGNoIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0MSddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDUwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QyJ10sXG4gICAgICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgc2luZ2xlIGlucHV0IHJlcXVpcmVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1Jhd1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QxJyxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0MicsXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDJuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBuZWdhdGl2ZSBmZWUgY2FsY3VsYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMDAwMDAwbiwgLy8gTGVzcyB0aGFuIG91dHB1dFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbiwgLy8gTW9yZSB0aGFuIGlucHV0XG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGcm9tIEltcGxlbWVudGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHN0cmluZyByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByYXdTdHJpbmcgPSAnaGV4LWVuY29kZWQtdHJhbnNhY3Rpb24nO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5mcm9tSW1wbGVtZW50YXRpb24ocmF3U3RyaW5nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgb2JqZWN0IHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSYXdUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIChidWlsZGVyIGFzIGFueSkuZnJvbUltcGxlbWVudGF0aW9uKG1vY2tSYXdUeCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ludGVncmF0aW9uIFRlc3RzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvbXBsZXRlIGV4cG9ydCBmbG93IHByZXBhcmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwMDAwMDAwMDAwMDAnOyAvLyAxIEZMUlxuICAgICAgY29uc3Qgbm9uY2UgPSAxMjNuO1xuICAgICAgY29uc3QgdG9BZGRyZXNzZXMgPSBbJ1AtZmxhcmUxZGVzdGluYXRpb24nXTtcblxuICAgICAgLy8gQ29tcGxldGUgc2V0dXBcbiAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCkubm9uY2Uobm9uY2UpLnRvKHRvQWRkcmVzc2VzKTtcblxuICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGNvbXBsZXRlIHdpdGhvdXQgdGhyb3dpbmdcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1ldGhvZCBjaGFpbmluZyBleHRlbnNpdmVseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRlc3QgZXh0ZW5zaXZlIG1ldGhvZCBjaGFpbmluZ1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJcbiAgICAgICAgICAuYW1vdW50KCc1MDAwMDAwMDAwMDAwMDAwMDAwJykgLy8gNSBGTFJcbiAgICAgICAgICAubm9uY2UoNDU2bilcbiAgICAgICAgICAudG8oWydQLWZsYXJlMXJlY2VpdmVyMScsICdQLWZsYXJlMXJlY2VpdmVyMiddKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdHJhbnNhY3Rpb24gdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGFyZ2VBbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJzsgLy8gMTAwayBGTFJcbiAgICAgIGNvbnN0IGxhcmdlTm9uY2UgPSA5OTk5OTk5OTk5OTluO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQobGFyZ2VBbW91bnQpLm5vbmNlKGxhcmdlTm9uY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtdWx0aXBsZURlc3RpbmF0aW9ucyA9IFtcbiAgICAgICAgJ1AtZmxhcmUxZGVzdDEnLFxuICAgICAgICAnUC1mbGFyZTFkZXN0MicsXG4gICAgICAgICdQLWZsYXJlMWRlc3QzJyxcbiAgICAgICAgJ1AtZmxhcmUxZGVzdDQnLFxuICAgICAgICAnUC1mbGFyZTFkZXN0NScsXG4gICAgICBdO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKS50byhtdWx0aXBsZURlc3RpbmF0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VkZ2UgQ2FzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybyB2YWx1ZXMgYXBwcm9wcmlhdGVseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFplcm8gYW1vdW50IHNob3VsZCBiZSByZWplY3RlZFxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYW1vdW50KDApO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG5cbiAgICAgIC8vIFplcm8gbm9uY2Ugc2hvdWxkIGJlIHZhbGlkXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5ub25jZSgwbik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1heGltdW0gdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWF4QmlnSW50ID0gQmlnSW50KCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpOyAvLyBNYXggdWludDY0XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudChtYXhCaWdJbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLm5vbmNlKG1heEJpZ0ludCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gc3RhdGUgYWNyb3NzIG11bHRpcGxlIG9wZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBCdWlsZCBzdGF0ZSBpbmNyZW1lbnRhbGx5XG4gICAgICBidWlsZGVyLmFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgICAgYnVpbGRlci5ub25jZSgxMjNuKTtcbiAgICAgIGJ1aWxkZXIudG8oWydQLWZsYXJlMWRlc3QnXSk7XG5cbiAgICAgIC8vIFN0YXRlIHNob3VsZCBiZSBtYWludGFpbmVkIGFjcm9zcyBvcGVyYXRpb25zXG4gICAgICBhc3NlcnQub2sodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsbURBQTZEO0FBQzdELCtDQUFpQztBQUNqQywwRkFBdUY7QUFDdkYseUVBQW9GO0FBRXBGLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLHFEQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUVoRCxRQUFRLENBQUMsMEJBQTBCLEVBQUU7UUFDbkMsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUs7WUFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQyxFQUFFLElBQUksZ0NBQXFCLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsMkJBQTJCLEVBQUU7UUFDcEMsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTVDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxDQUFD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LENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7WUFDekMsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtnQkFDNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxxREFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNoRSxJQUFJLENBQUMsdUJBQVEsQ0FBQyxXQUFXLENBQUM7cUJBQzFCLFVBQVUsQ0FBQyx1QkFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLHVCQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsU0FBUztxQkFDTixLQUFLLEVBQUU7cUJBQ1AsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7cUJBQ3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztnQkFDekUsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgRVhQT1JUX0lOX0MgYXMgdGVzdERhdGEgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL2V4cG9ydEluQyc7XG5cbmRlc2NyaWJlKCdFeHBvcnRJbkNUeEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpO1xuICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEluQ0J1aWxkZXIoKTtcblxuICBkZXNjcmliZSgndXR4b3MgRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2hlbiB1dHhvcyBhcmUgdXNlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudXR4b3MoW10pO1xuICAgICAgfSwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndXR4b3MgYXJlIG5vdCByZXF1aXJlZCBpbiBFeHBvcnQgVHggaW4gQy1DaGFpbicpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Ftb3VudCBFeHBvcnRJbkNUeEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdmFsaWQgYW1vdW50cyBpbiBkaWZmZXJlbnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkQW1vdW50cyA9IFtCaWdJbnQoMTAwMCksICcxMDAwJ107XG5cbiAgICAgIHZhbGlkQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudHMgPSBbJzAnLCAnLTEnXTtcblxuICAgICAgaW52YWxpZEFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uY2UgRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIG5vbmNlcyBpbiBkaWZmZXJlbnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkTm9uY2VzID0gWycxJywgMSwgMF07XG5cbiAgICAgIHZhbGlkTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSBub25jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UoJy0xJyk7XG4gICAgICB9LCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAwJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG8gRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RXhwb3J0SW5DQnVpbGRlcigpO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgbXVsdGlwbGUgUC1hZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gdGVzdERhdGEucEFkZHJlc3NlcztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50byhwQWRkcmVzc2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgc2luZ2xlIFAtYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudG8odGVzdERhdGEucEFkZHJlc3Nlc1swXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHRpbGRlLXNlcGFyYXRlZCBQLWFkZHJlc3NlcyBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gdGVzdERhdGEucEFkZHJlc3Nlcy5qb2luKCd+Jyk7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudG8ocEFkZHJlc3Nlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBhIGV4cG9ydCB0eG4gZnJvbSBDIHRvIFAnLCAoKSA9PiB7XG4gICAgY29uc3QgbmV3VHhCdWlsZGVyID0gKCkgPT5cbiAgICAgIGZhY3RvcnlcbiAgICAgICAgLmdldEV4cG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5jSGV4QWRkcmVzcylcbiAgICAgICAgLm5vbmNlKHRlc3REYXRhLm5vbmNlKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLmFtb3VudClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSgxMClcbiAgICAgICAgLnRvKHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5mZWVSYXRlKHRlc3REYXRhLmZlZSk7XG5cbiAgICBpdCgnU2hvdWxkIGNyZWF0ZSBleHBvcnQgdHggZm9yIHNhbWUgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3VHhCdWlsZGVyKCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCByZWNvdmVyIGV4cG9ydCB0eCBmcm9tIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgIH0pO1xuXG4gICAgeGl0KCdTaG91bGQgcmVjb3ZlciBzaWduZWQgZXhwb3J0IGZyb20gc2lnbmVkIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBleHBvcnQgdHggZm9yIHNhbWUgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3VHhCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRIZXgpO1xuICAgICAgdHguc2lnbmF0dXJlLnNob3VsZC5lcWwodGVzdERhdGEuc2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0tleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIGV4cG9ydCAgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgICAuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleClcbiAgICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXkgfSk7XG4gICAgICAgIHR4QnVpbGRlclxuICAgICAgICAgIC5idWlsZCgpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbCgnUHJpdmF0ZSBrZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==