@bitgo/sdk-coin-flrp 1.3.3 → 1.4.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 (130) 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 +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +186 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +273 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +215 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +180 -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 +42 -79
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +138 -281
  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 -73
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +159 -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 +113 -70
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +35 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +133 -74
  46. package/dist/src/lib/utils.d.ts +73 -151
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +197 -390
  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 +34 -0
  52. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  53. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInP.js +140 -0
  55. package/dist/test/resources/transactionData/importInC.d.ts +27 -0
  56. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/importInC.js +44 -0
  58. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  59. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInP.js +58 -0
  61. package/dist/test/unit/lib/exportInCTxBuilder.js +95 -513
  62. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
  63. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
  64. package/dist/test/unit/lib/exportInPTxBuilder.js +110 -366
  65. package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
  66. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
  67. package/dist/test/unit/lib/importInCTxBuilder.js +40 -251
  68. package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
  69. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
  70. package/dist/test/unit/lib/importInPTxBuilder.js +61 -489
  71. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  72. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  73. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  74. package/dist/test/unit/lib/utils.js +29 -302
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +8 -10
  77. package/dist/src/iface.d.ts +0 -25
  78. package/dist/src/iface.d.ts.map +0 -1
  79. package/dist/src/iface.js +0 -3
  80. package/dist/src/lib/constants.d.ts +0 -170
  81. package/dist/src/lib/constants.d.ts.map +0 -1
  82. package/dist/src/lib/constants.js +0 -227
  83. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  84. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  85. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  86. package/dist/src/lib/errors.d.ts +0 -8
  87. package/dist/src/lib/errors.d.ts.map +0 -1
  88. package/dist/src/lib/errors.js +0 -19
  89. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  90. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  91. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  92. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  93. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  94. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  95. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  96. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  97. package/dist/src/lib/importInCTxBuilder.js +0 -403
  98. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  99. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  100. package/dist/src/lib/importInPTxBuilder.js +0 -464
  101. package/dist/src/lib/types.d.ts +0 -78
  102. package/dist/src/lib/types.d.ts.map +0 -1
  103. package/dist/src/lib/types.js +0 -5
  104. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  105. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  106. package/dist/src/lib/validatorTxBuilder.js +0 -180
  107. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  108. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  109. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  110. package/dist/test/unit/flrp.d.ts +0 -2
  111. package/dist/test/unit/flrp.d.ts.map +0 -1
  112. package/dist/test/unit/flrp.js +0 -118
  113. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  114. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  115. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  116. package/dist/test/unit/lib/transaction.d.ts +0 -2
  117. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  118. package/dist/test/unit/lib/transaction.js +0 -460
  119. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  120. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  121. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  122. package/dist/test/unit/smoke.d.ts +0 -2
  123. package/dist/test/unit/smoke.d.ts.map +0 -1
  124. package/dist/test/unit/smoke.js +0 -23
  125. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  126. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  127. package/dist/test/unit/transactionBuilder.test.js +0 -114
  128. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  129. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  130. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -1,501 +1,73 @@
1
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
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ require("should");
8
+ const importInP_1 = require("../../resources/transactionData/importInP");
9
+ const lib_1 = require("../../../src/lib");
39
10
  const statics_1 = require("@bitgo/statics");
40
- const sdk_core_1 = require("@bitgo/sdk-core");
41
- const assert = __importStar(require("assert"));
42
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
43
- const importInPTxBuilder_1 = require("../../../src/lib/importInPTxBuilder");
44
- describe('ImportInPTxBuilder', function () {
45
- const coinConfig = statics_1.coins.get('tflrp');
46
- let builder;
47
- beforeEach(function () {
48
- builder = new importInPTxBuilder_1.ImportInPTxBuilder(coinConfig);
49
- });
50
- describe('Constructor', function () {
51
- it('should initialize with coin config', function () {
52
- assert.ok(builder);
53
- assert.ok(builder instanceof importInPTxBuilder_1.ImportInPTxBuilder);
54
- });
55
- it('should initialize with default values', function () {
56
- // Builder should be initialized without throwing errors
57
- assert.ok(builder);
58
- });
59
- });
60
- describe('UTXO Management', function () {
61
- it('should add single UTXO', function () {
62
- const utxo = {
63
- outputID: 1,
64
- amount: '1000000000000000000', // 1 FLR
65
- txid: 'test-txid-single',
66
- outputidx: '0',
67
- threshold: 1,
68
- addresses: ['C-flare1test'],
69
- };
70
- assert.doesNotThrow(() => {
71
- builder.addUtxos([utxo]);
72
- });
73
- });
74
- it('should add multiple UTXOs', function () {
75
- const utxos = [
76
- {
77
- outputID: 1,
78
- amount: '1000000000000000000', // 1 FLR
79
- txid: 'test-txid-1',
80
- outputidx: '0',
81
- threshold: 1,
82
- addresses: ['C-flare1test1'],
83
- },
84
- {
85
- outputID: 2,
86
- amount: '2000000000000000000', // 2 FLR
87
- txid: 'test-txid-2',
88
- outputidx: '1',
89
- threshold: 2,
90
- addresses: ['C-flare1test2', 'C-flare1test3'],
91
- },
92
- {
93
- outputID: 3,
94
- amount: '500000000000000000', // 0.5 FLR
95
- txid: 'test-txid-3',
96
- outputidx: '0',
97
- threshold: 1,
98
- addresses: ['C-flare1test4'],
99
- },
100
- ];
101
- assert.doesNotThrow(() => {
102
- builder.addUtxos(utxos);
103
- });
104
- });
105
- it('should handle empty UTXO array', function () {
106
- assert.doesNotThrow(() => {
107
- builder.addUtxos([]);
108
- });
109
- });
110
- it('should accumulate UTXOs from multiple calls', function () {
111
- const utxos1 = [
112
- {
113
- outputID: 1,
114
- amount: '1000000000000000000',
115
- txid: 'test-txid-1',
116
- outputidx: '0',
117
- threshold: 1,
118
- addresses: ['C-flare1test1'],
119
- },
120
- ];
121
- const utxos2 = [
122
- {
123
- outputID: 2,
124
- amount: '2000000000000000000',
125
- txid: 'test-txid-2',
126
- outputidx: '0',
127
- threshold: 1,
128
- addresses: ['C-flare1test2'],
129
- },
130
- ];
131
- builder.addUtxos(utxos1);
132
- builder.addUtxos(utxos2);
133
- // Should not throw
134
- assert.ok(true);
135
- });
136
- });
137
- describe('Fee Management', function () {
138
- it('should set valid positive fee', function () {
139
- const validFees = ['1000', '0', '1000000000000000000', '999999999999999999'];
140
- validFees.forEach((fee) => {
141
- assert.doesNotThrow(() => {
142
- builder.fee(fee);
143
- }, `Should accept fee: ${fee}`);
144
- });
145
- });
146
- it('should reject negative fees', function () {
147
- const negativeFees = ['-1', '-1000', '-1000000000000000000'];
148
- negativeFees.forEach((fee) => {
149
- assert.throws(() => {
150
- builder.fee(fee);
151
- }, sdk_core_1.BuildTransactionError, `Should reject negative fee: ${fee}`);
152
- });
153
- });
154
- it('should handle invalid fee formats (BigNumber behavior)', function () {
155
- const invalidFees = ['abc', 'not-a-number', '1.5.5', 'infinity'];
156
- invalidFees.forEach((fee) => {
157
- // BigNumber doesn't throw for invalid strings, it creates NaN values
158
- // But our implementation should still accept them (no additional validation)
159
- assert.doesNotThrow(() => {
160
- builder.fee(fee);
161
- }, `BigNumber accepts invalid strings: ${fee}`);
162
- });
163
- });
164
- it('should handle BigNumber fee inputs', function () {
165
- const bigNumberFee = new bignumber_js_1.default('1000000000000000000');
166
- assert.doesNotThrow(() => {
167
- builder.fee(bigNumberFee.toString());
168
- });
169
- });
170
- it('should chain fee setting with other methods', function () {
171
- const fee = '1000';
172
- const utxo = {
173
- outputID: 1,
174
- amount: '1000000000000000000',
175
- txid: 'test-txid',
176
- outputidx: '0',
177
- threshold: 1,
178
- addresses: ['C-flare1test'],
179
- };
180
- assert.doesNotThrow(() => {
181
- builder.fee(fee).addUtxos([utxo]);
182
- });
183
- });
184
- });
185
- describe('Locktime Management', function () {
186
- it('should set valid locktime values', function () {
187
- const validLocktimes = [0, 1, 1000, 4294967295]; // Max uint32
188
- validLocktimes.forEach((locktime) => {
189
- assert.doesNotThrow(() => {
190
- builder.locktime(locktime);
191
- }, `Should accept locktime: ${locktime}`);
192
- });
193
- });
194
- it('should handle negative locktime (no validation)', function () {
195
- const negativeLocktimes = [-1, -1000];
196
- negativeLocktimes.forEach((locktime) => {
197
- assert.doesNotThrow(() => {
198
- builder.locktime(locktime);
199
- }, `Should accept negative locktime: ${locktime} (no validation in implementation)`);
200
- });
201
- });
202
- it('should handle boundary values', function () {
203
- const boundaryValues = [0, 4294967295]; // Min and max uint32
204
- boundaryValues.forEach((locktime) => {
205
- assert.doesNotThrow(() => {
206
- builder.locktime(locktime);
207
- });
208
- });
209
- });
210
- it('should chain locktime setting with other methods', function () {
211
- const locktime = 123456;
212
- const fee = '1000';
213
- assert.doesNotThrow(() => {
214
- builder.locktime(locktime).fee(fee);
215
- });
11
+ const signFlowTestSuit_1 = __importDefault(require("./signFlowTestSuit"));
12
+ describe('Flrp Import In P Tx Builder', () => {
13
+ const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'));
14
+ describe('validate txBuilder fields', () => {
15
+ const txBuilder = factory.getImportInPBuilder();
16
+ it('should fail target chain id length incorrect', () => {
17
+ assert_1.default.throws(() => {
18
+ txBuilder.externalChainId(Buffer.from(importInP_1.IMPORT_IN_P.INVALID_CHAIN_ID));
19
+ }, (e) => e.message === 'Chain id are 32 byte size');
20
+ });
21
+ it('should fail target chain id not a valid base58 string', () => {
22
+ assert_1.default.throws(() => {
23
+ txBuilder.externalChainId(importInP_1.IMPORT_IN_P.INVALID_CHAIN_ID);
24
+ }, (e) => e.message === 'Non-base58 character');
25
+ });
26
+ it('should fail target chain id cb58 invalid checksum', () => {
27
+ assert_1.default.throws(() => {
28
+ txBuilder.externalChainId(importInP_1.IMPORT_IN_P.VALID_C_CHAIN_ID.slice(2));
29
+ }, (e) => e.message === 'Invalid checksum');
30
+ });
31
+ it('should fail validate Utxos empty string', () => {
32
+ assert_1.default.throws(() => {
33
+ txBuilder.validateUtxos([]);
34
+ }, (e) => e.message === 'UTXOs array cannot be empty');
35
+ });
36
+ it('should fail validate Utxos without amount field', () => {
37
+ assert_1.default.throws(() => {
38
+ txBuilder.validateUtxos([{ outputID: '' }]);
39
+ }, (e) => e.message === 'UTXO missing required field: amount');
216
40
  });
217
41
  });
218
- describe('Threshold Management', function () {
219
- it('should set valid threshold values', function () {
220
- const validThresholds = [1, 2, 5, 10];
221
- validThresholds.forEach((threshold) => {
222
- assert.doesNotThrow(() => {
223
- builder.threshold(threshold);
224
- }, `Should accept threshold: ${threshold}`);
225
- });
226
- });
227
- it('should reject invalid threshold values', function () {
228
- const invalidThresholds = [0, -1, -10];
229
- invalidThresholds.forEach((threshold) => {
230
- assert.throws(() => {
231
- builder.threshold(threshold);
232
- }, sdk_core_1.BuildTransactionError, `Should reject threshold: ${threshold}`);
233
- });
234
- });
235
- it('should handle typical threshold scenarios', function () {
236
- // Single signature
237
- assert.doesNotThrow(() => {
238
- builder.threshold(1);
239
- });
240
- // Multi-signature
241
- assert.doesNotThrow(() => {
242
- builder.threshold(3);
243
- });
244
- });
245
- it('should chain threshold setting with other methods', function () {
246
- const threshold = 2;
247
- const locktime = 123456;
248
- assert.doesNotThrow(() => {
249
- builder.threshold(threshold).locktime(locktime);
250
- });
251
- });
42
+ (0, signFlowTestSuit_1.default)({
43
+ transactionType: 'Import P2C',
44
+ newTxFactory: () => new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')),
45
+ newTxBuilder: () => new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
46
+ .getImportInPBuilder()
47
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
48
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
49
+ .fromPubKey(importInP_1.IMPORT_IN_P.pAddresses)
50
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
51
+ .fee(importInP_1.IMPORT_IN_P.fee)
52
+ .utxos(importInP_1.IMPORT_IN_P.outputs),
53
+ unsignedTxHex: importInP_1.IMPORT_IN_P.unsignedHex,
54
+ halfSignedTxHex: importInP_1.IMPORT_IN_P.halfSigntxHex,
55
+ fullSignedTxHex: importInP_1.IMPORT_IN_P.fullSigntxHex,
56
+ privateKey: {
57
+ prv1: importInP_1.IMPORT_IN_P.privateKeys[0],
58
+ prv2: importInP_1.IMPORT_IN_P.privateKeys[1],
59
+ },
60
+ txHash: importInP_1.IMPORT_IN_P.txhash,
252
61
  });
253
- describe('Source Chain Management', function () {
254
- // TODO : Enable these tests after fixing sourceChain method to accept P-chain IDs
255
- it.skip('should set valid source chain IDs', function () {
256
- const validChainIds = ['C-flare12345', 'NodeID-flare67890', '0x123456789abcdef', 'abc123def456'];
257
- validChainIds.forEach((chainId) => {
258
- assert.doesNotThrow(() => {
259
- builder.sourceChain(chainId);
260
- }, `Should accept chain ID: ${chainId}`);
261
- });
262
- });
263
- it('should handle different chain ID formats', function () {
264
- const chainIds = ['C-chain-id-123', 'P-chain-id-456', 'hex-formatted-id', '1234567890abcdef'];
265
- chainIds.forEach((chainId) => {
266
- assert.doesNotThrow(() => {
267
- builder.sourceChain(chainId);
268
- });
269
- });
270
- });
271
- });
272
- describe('Input/Output Creation', function () {
273
- it('should test public methods only due to protected access', function () {
274
- // Note: createInputOutput is protected, so we test through public interface
275
- // Test that we can set parameters that would be used by createInputOutput
276
- assert.doesNotThrow(() => {
277
- builder.fee('1000');
278
- builder.threshold(1);
279
- // Protected method cannot be tested directly
280
- });
281
- });
282
- it('should handle configuration for output creation', function () {
283
- const fee = '1000';
284
- const locktime = 0;
285
- const threshold = 1;
286
- assert.doesNotThrow(() => {
287
- builder.fee(fee).locktime(locktime).threshold(threshold);
288
- });
289
- });
290
- it('should allow setting parameters for large amounts', function () {
291
- const locktime = 0;
292
- const threshold = 1;
293
- assert.doesNotThrow(() => {
294
- builder.fee('1000').locktime(locktime).threshold(threshold);
295
- });
296
- });
297
- it('should configure for different threshold scenarios', function () {
298
- const locktime = 0;
299
- // Test different thresholds
300
- [1, 2, 3].forEach((threshold) => {
301
- assert.doesNotThrow(() => {
302
- builder.threshold(threshold).locktime(locktime);
303
- });
304
- });
305
- });
306
- });
307
- describe('Transaction Type Verification', function () {
308
- it('should verify transaction type (placeholder)', function () {
309
- const mockTx = { type: 'import' };
310
- const result = importInPTxBuilder_1.ImportInPTxBuilder.verifyTxType(mockTx);
311
- assert.strictEqual(result, true); // Placeholder returns true
312
- });
313
- it('should handle different transaction objects', function () {
314
- const testCases = [{}, null, undefined, { type: 'export' }, { data: 'test' }];
315
- testCases.forEach((testCase, index) => {
316
- const result = importInPTxBuilder_1.ImportInPTxBuilder.verifyTxType(testCase);
317
- assert.strictEqual(result, true, `Test case ${index} should return true (placeholder)`);
318
- });
319
- });
320
- it('should verify via instance method', function () {
321
- const mockTx = { type: 'import' };
322
- const result = builder.verifyTxType(mockTx);
323
- assert.strictEqual(result, true);
324
- });
325
- });
326
- describe('Transaction Building Preparation', function () {
327
- it('should prepare basic import transaction parameters', function () {
328
- const fee = '1000';
329
- const locktime = 123456;
330
- const threshold = 2;
331
- const chainId = 'C-source-chain-123';
332
- const utxos = [
333
- {
334
- outputID: 1,
335
- amount: '1000000000000000000',
336
- txid: 'test-txid',
337
- outputidx: '0',
338
- threshold: 1,
339
- addresses: ['C-flare1test'],
340
- },
341
- ];
342
- // Set all parameters
343
- builder.fee(fee).locktime(locktime).threshold(threshold).sourceChain(chainId).addUtxos(utxos);
344
- // Should not throw
345
- assert.ok(true);
346
- });
347
- it('should handle minimal configuration', function () {
348
- const fee = '0';
349
- const utxos = [
350
- {
351
- outputID: 1,
352
- amount: '1000000000000000000',
353
- txid: 'test-txid',
354
- outputidx: '0',
355
- threshold: 1,
356
- addresses: ['C-flare1test'],
357
- },
358
- ];
359
- builder.fee(fee).addUtxos(utxos);
360
- // Should not throw
361
- assert.ok(true);
362
- });
363
- });
364
- describe('Complex Scenarios', function () {
365
- it('should handle multiple UTXOs with different properties', function () {
366
- const utxos = [
367
- {
368
- outputID: 1,
369
- amount: '1000000000000000000',
370
- txid: 'test-txid-1',
371
- outputidx: '0',
372
- threshold: 1,
373
- addresses: ['C-flare1single'],
374
- },
375
- {
376
- outputID: 2,
377
- amount: '2000000000000000000',
378
- txid: 'test-txid-2',
379
- outputidx: '1',
380
- threshold: 2,
381
- addresses: ['C-flare1multi1', 'C-flare1multi2'],
382
- },
383
- {
384
- outputID: 3,
385
- amount: '3000000000000000000',
386
- txid: 'test-txid-3',
387
- outputidx: '0',
388
- threshold: 3,
389
- addresses: ['C-flare1multi1', 'C-flare1multi2', 'C-flare1multi3'],
390
- },
391
- ];
392
- builder.addUtxos(utxos);
393
- builder.fee('5000'); // Higher fee for complex transaction
394
- builder.threshold(2);
395
- // Should handle complex UTXO set
396
- assert.ok(true);
397
- });
398
- it('should handle large transaction parameters', function () {
399
- const fee = '1000000000000000000'; // 1 FLR fee
400
- const locktime = 4294967295; // Max uint32
401
- const threshold = 10; // High threshold
402
- const chainId = 'very-long-chain-id-with-lots-of-characters-0x123456789abcdef0123456789abcdef';
403
- builder.fee(fee).locktime(locktime).threshold(threshold).sourceChain(chainId);
404
- // Should handle large values
405
- assert.ok(true);
406
- });
407
- it('should handle rapid parameter changes', function () {
408
- // Simulate rapid parameter updates
409
- builder.fee('1000').fee('2000').fee('3000');
410
- builder.locktime(100).locktime(200).locktime(300);
411
- builder.threshold(1).threshold(2).threshold(3);
412
- // Should handle rapid changes without issues
413
- assert.ok(true);
414
- });
415
- });
416
- describe('Edge Cases', function () {
417
- it('should handle zero values where appropriate', function () {
418
- builder.fee('0');
419
- builder.locktime(0);
420
- // threshold of 0 should be invalid
421
- assert.throws(() => {
422
- builder.threshold(0);
423
- }, sdk_core_1.BuildTransactionError);
424
- });
425
- it('should handle maximum values', function () {
426
- const maxFee = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // Max uint256
427
- const maxLocktime = 4294967295; // Max uint32
428
- assert.doesNotThrow(() => {
429
- builder.fee(maxFee);
430
- });
431
- assert.doesNotThrow(() => {
432
- builder.locktime(maxLocktime);
433
- });
434
- });
435
- it('should maintain state across multiple operations', function () {
436
- const utxo1 = {
437
- outputID: 1,
438
- amount: '1000000000000000000',
439
- txid: 'test-txid-1',
440
- outputidx: '0',
441
- threshold: 1,
442
- addresses: ['C-flare1test1'],
443
- };
444
- const utxo2 = {
445
- outputID: 2,
446
- amount: '2000000000000000000',
447
- txid: 'test-txid-2',
448
- outputidx: '0',
449
- threshold: 1,
450
- addresses: ['C-flare1test2'],
451
- };
452
- // Build state incrementally
453
- builder.fee('1000');
454
- builder.addUtxos([utxo1]);
455
- builder.locktime(123456);
456
- builder.addUtxos([utxo2]);
457
- builder.threshold(2);
458
- // State should be maintained across operations
459
- assert.ok(true);
460
- });
461
- });
462
- describe('Integration Tests', function () {
463
- it('should handle complete P-chain import flow preparation', function () {
464
- const fee = '2000';
465
- const locktime = 654321;
466
- const threshold = 1;
467
- const chainId = 'C-source-chain-456';
468
- const utxos = [
469
- {
470
- outputID: 1,
471
- amount: '6000000000000000000', // 6 FLR (more than output for fees)
472
- txid: 'integration-test-txid',
473
- outputidx: '0',
474
- threshold: 1,
475
- addresses: ['C-flare1source'],
476
- },
477
- ];
478
- // Complete setup
479
- builder.fee(fee).locktime(locktime).threshold(threshold).sourceChain(chainId).addUtxos(utxos);
480
- // All operations should complete without throwing
481
- assert.ok(true);
482
- });
483
- it('should handle method chaining extensively', function () {
484
- const utxos = [
485
- {
486
- outputID: 1,
487
- amount: '10000000000000000000', // 10 FLR
488
- txid: 'chain-test-txid',
489
- outputidx: '0',
490
- threshold: 1,
491
- addresses: ['C-flare1test'],
492
- },
493
- ];
494
- // Test extensive method chaining
495
- assert.doesNotThrow(() => {
496
- builder.fee('1000').locktime(100000).threshold(1).sourceChain('C-chain-123').addUtxos(utxos);
497
- });
62
+ it('Should full sign a import tx from unsigned raw tx', () => {
63
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInP_1.IMPORT_IN_P.unsignedHex);
64
+ txBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
65
+ txBuilder
66
+ .build()
67
+ .then(() => assert_1.default.fail('it can sign'))
68
+ .catch((err) => {
69
+ err.message.should.be.equal('Private key cannot sign the transaction');
498
70
  });
499
71
  });
500
72
  });
501
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsOENBQXdEO0FBQ3hELCtDQUFpQztBQUNqQyxnRUFBcUM7QUFDckMsNEVBQXlFO0FBR3pFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksT0FBMkIsQ0FBQztJQUVoQyxVQUFVLENBQUM7UUFDVCxPQUFPLEdBQUcsSUFBSSx1Q0FBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFlBQVksdUNBQWtCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyx3REFBd0Q7WUFDeEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRTtZQUMzQixNQUFNLElBQUksR0FBbUI7Z0JBQzNCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxRQUFRO2dCQUN2QyxJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixTQUFTLEVBQUUsR0FBRztnQkFDZCxTQUFTLEVBQUUsQ0FBQztnQkFDWixTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7YUFDNUIsQ0FBQztZQUVGLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1lBQzlCLE1BQU0sS0FBSyxHQUFxQjtnQkFDOUI7b0JBQ0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLHFCQUFxQixFQUFFLFFBQVE7b0JBQ3ZDLElBQUksRUFBRSxhQUFhO29CQUNuQixTQUFTLEVBQUUsR0FBRztvQkFDZCxTQUFTLEVBQUUsQ0FBQztvQkFDWixTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQzdCO2dCQUNEO29CQUNFLFFBQVEsRUFBRSxDQUFDO29CQUNYLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxRQUFRO29CQUN2QyxJQUFJLEVBQUUsYUFBYTtvQkFDbkIsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsU0FBUyxFQUFFLENBQUM7b0JBQ1osU0FBUyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztpQkFDOUM7Z0JBQ0Q7b0JBQ0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLG9CQUFvQixFQUFFLFVBQVU7b0JBQ3hDLElBQUksRUFBRSxhQUFhO29CQUNuQixTQUFTLEVBQUUsR0FBRztvQkFDZCxTQUFTLEVBQUUsQ0FBQztvQkFDWixTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQzdCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxNQUFNLE1BQU0sR0FBcUI7Z0JBQy9CO29CQUNFLFFBQVEsRUFBRSxDQUFDO29CQUNYLE1BQU0sRUFBRSxxQkFBcUI7b0JBQzdCLElBQUksRUFBRSxhQUFhO29CQUNuQixTQUFTLEVBQUUsR0FBRztvQkFDZCxTQUFTLEVBQUUsQ0FBQztvQkFDWixTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQzdCO2FBQ0YsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFxQjtnQkFDL0I7b0JBQ0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLHFCQUFxQjtvQkFDN0IsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLFNBQVMsRUFBRSxHQUFHO29CQUNkLFNBQVMsRUFBRSxDQUFDO29CQUNaLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQztpQkFDN0I7YUFDRixDQUFDO1lBRUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXpCLG1CQUFtQjtZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLCtCQUErQixFQUFFO1lBQ2xDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1lBRTdFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDeEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLENBQUMsRUFBRSxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZCQUE2QixFQUFFO1lBQ2hDLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBRTdELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxFQUNELGdDQUFxQixFQUNyQiwrQkFBK0IsR0FBRyxFQUFFLENBQ3JDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFO1lBQzNELE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFakUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixxRUFBcUU7Z0JBQ3JFLDZFQUE2RTtnQkFDN0UsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLENBQUMsRUFBRSxzQ0FBc0MsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLElBQUksc0JBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFtQjtnQkFDM0IsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUM1QixDQUFDO1lBRUYsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1lBQ3JDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBRTlELGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLENBQUMsRUFBRSwyQkFBMkIsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtvQkFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDN0IsQ0FBQyxFQUFFLG9DQUFvQyxRQUFRLG9DQUFvQyxDQUFDLENBQUM7WUFDdkYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtZQUNsQyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtZQUU3RCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2xDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO29CQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7WUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUVuQixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFO1FBQy9CLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtZQUN0QyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXRDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDcEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9CLENBQUMsRUFBRSw0QkFBNEIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFO1lBQzNDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUV2QyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7b0JBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxFQUNELGdDQUFxQixFQUNyQiw0QkFBNEIsU0FBUyxFQUFFLENBQ3hDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLG1CQUFtQjtZQUNuQixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztZQUVILGtCQUFrQjtZQUNsQixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1lBQ3RELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNwQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFFeEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNsQyxrRkFBa0Y7UUFDbEYsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRTtZQUMzQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUVqRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO29CQUN2QixPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixDQUFDLEVBQUUsMkJBQTJCLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxNQUFNLFFBQVEsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFFOUYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMzQixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtvQkFDdkIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsRUFBRSxDQUFDLHlEQUF5RCxFQUFFO1lBQzVELDRFQUE0RTtZQUM1RSwwRUFBMEU7WUFDMUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLDZDQUE2QztZQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUNuQixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDbkIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBRXBCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRTtZQUN0RCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDbkIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBRXBCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvREFBb0QsRUFBRTtZQUN2RCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFFbkIsNEJBQTRCO1lBQzVCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsRCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywrQkFBK0IsRUFBRTtRQUN4QyxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsdUNBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUU5RSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyx1Q0FBa0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEtBQUssbUNBQW1DLENBQUMsQ0FBQztZQUMxRixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1lBQ3RDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRTtRQUMzQyxFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBQ25CLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztZQUN4QixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDcEIsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUM7WUFDckMsTUFBTSxLQUFLLEdBQXFCO2dCQUM5QjtvQkFDRSxRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUscUJBQXFCO29CQUM3QixJQUFJLEVBQUUsV0FBVztvQkFDakIsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsU0FBUyxFQUFFLENBQUM7b0JBQ1osU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDO2lCQUM1QjthQUNGLENBQUM7WUFFRixxQkFBcUI7WUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUYsbUJBQW1CO1lBQ25CLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7WUFDeEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ2hCLE1BQU0sS0FBSyxHQUFxQjtnQkFDOUI7b0JBQ0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLHFCQUFxQjtvQkFDN0IsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLFNBQVMsRUFBRSxHQUFHO29CQUNkLFNBQVMsRUFBRSxDQUFDO29CQUNaLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztpQkFDNUI7YUFDRixDQUFDO1lBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFakMsbUJBQW1CO1lBQ25CLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsTUFBTSxLQUFLLEdBQXFCO2dCQUM5QjtvQkFDRSxRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUscUJBQXFCO29CQUM3QixJQUFJLEVBQUUsYUFBYTtvQkFDbkIsU0FBUyxFQUFFLEdBQUc7b0JBQ2QsU0FBUyxFQUFFLENBQUM7b0JBQ1osU0FBUyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQzlCO2dCQUNEO29CQUNFLFFBQVEsRUFBRSxDQUFDO29CQUNYLE1BQU0sRUFBRSxxQkFBcUI7b0JBQzdCLElBQUksRUFBRSxhQUFhO29CQUNuQixTQUFTLEVBQUUsR0FBRztvQkFDZCxTQUFTLEVBQUUsQ0FBQztvQkFDWixTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztpQkFDaEQ7Z0JBQ0Q7b0JBQ0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLHFCQUFxQjtvQkFDN0IsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLFNBQVMsRUFBRSxHQUFHO29CQUNkLFNBQVMsRUFBRSxDQUFDO29CQUNaLFNBQVMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO2lCQUNsRTthQUNGLENBQUM7WUFFRixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7WUFDMUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyQixpQ0FBaUM7WUFDakMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRTtZQUMvQyxNQUFNLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLFlBQVk7WUFDL0MsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsYUFBYTtZQUMxQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxpQkFBaUI7WUFDdkMsTUFBTSxPQUFPLEdBQUcsOEVBQThFLENBQUM7WUFFL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5RSw2QkFBNkI7WUFDN0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxtQ0FBbUM7WUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFL0MsNkNBQTZDO1lBQzdDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLEVBQUU7UUFDckIsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixtQ0FBbUM7WUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFFLGdDQUFxQixDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMsTUFBTSxNQUFNLEdBQUcsZ0ZBQWdGLENBQUMsQ0FBQyxjQUFjO1lBQy9HLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLGFBQWE7WUFFN0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFtQjtnQkFDNUIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQzthQUM3QixDQUFDO1lBRUYsTUFBTSxLQUFLLEdBQW1CO2dCQUM1QixRQUFRLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUscUJBQXFCO2dCQUM3QixJQUFJLEVBQUUsYUFBYTtnQkFDbkIsU0FBUyxFQUFFLEdBQUc7Z0JBQ2QsU0FBUyxFQUFFLENBQUM7Z0JBQ1osU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDO2FBQzdCLENBQUM7WUFFRiw0QkFBNEI7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckIsK0NBQStDO1lBQy9DLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBQ25CLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztZQUN4QixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDcEIsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUM7WUFDckMsTUFBTSxLQUFLLEdBQXFCO2dCQUM5QjtvQkFDRSxRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUscUJBQXFCLEVBQUUsb0NBQW9DO29CQUNuRSxJQUFJLEVBQUUsdUJBQXVCO29CQUM3QixTQUFTLEVBQUUsR0FBRztvQkFDZCxTQUFTLEVBQUUsQ0FBQztvQkFDWixTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDOUI7YUFDRixDQUFDO1lBRUYsaUJBQWlCO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlGLGtEQUFrRDtZQUNsRCxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLE1BQU0sS0FBSyxHQUFxQjtnQkFDOUI7b0JBQ0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFNBQVM7b0JBQ3pDLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLFNBQVMsRUFBRSxHQUFHO29CQUNkLFNBQVMsRUFBRSxDQUFDO29CQUNaLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztpQkFDNUI7YUFDRixDQUFDO1lBRUYsaUNBQWlDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgSW1wb3J0SW5QVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pbXBvcnRJblBUeEJ1aWxkZXInO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcblxuZGVzY3JpYmUoJ0ltcG9ydEluUFR4QnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgbGV0IGJ1aWxkZXI6IEltcG9ydEluUFR4QnVpbGRlcjtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBidWlsZGVyID0gbmV3IEltcG9ydEluUFR4QnVpbGRlcihjb2luQ29uZmlnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbnN0cnVjdG9yJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB3aXRoIGNvaW4gY29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBJbXBvcnRJblBUeEJ1aWxkZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHdpdGggZGVmYXVsdCB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBCdWlsZGVyIHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRob3V0IHRocm93aW5nIGVycm9yc1xuICAgICAgYXNzZXJ0Lm9rKGJ1aWxkZXIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVVRYTyBNYW5hZ2VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIHNpbmdsZSBVVFhPJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXR4bzogRGVjb2RlZFV0eG9PYmogPSB7XG4gICAgICAgIG91dHB1dElEOiAxLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwJywgLy8gMSBGTFJcbiAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC1zaW5nbGUnLFxuICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0J10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hZGRVdHhvcyhbdXR4b10pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBtdWx0aXBsZSBVVFhPcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHV0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDEsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIDEgRkxSXG4gICAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC0xJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdDEnXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAyLFxuICAgICAgICAgIGFtb3VudDogJzIwMDAwMDAwMDAwMDAwMDAwMDAnLCAvLyAyIEZMUlxuICAgICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQtMicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMScsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMXRlc3QyJywgJ0MtZmxhcmUxdGVzdDMnXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAzLFxuICAgICAgICAgIGFtb3VudDogJzUwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIDAuNSBGTFJcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkLTMnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0NCddLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYWRkVXR4b3ModXR4b3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBVVFhPIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYWRkVXR4b3MoW10pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY3VtdWxhdGUgVVRYT3MgZnJvbSBtdWx0aXBsZSBjYWxscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHV0eG9zMTogRGVjb2RlZFV0eG9PYmpbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAxLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQtMScsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMXRlc3QxJ10sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB1dHhvczI6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMixcbiAgICAgICAgICBhbW91bnQ6ICcyMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkLTInLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0MiddLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYnVpbGRlci5hZGRVdHhvcyh1dHhvczEpO1xuICAgICAgYnVpbGRlci5hZGRVdHhvcyh1dHhvczIpO1xuXG4gICAgICAvLyBTaG91bGQgbm90IHRocm93XG4gICAgICBhc3NlcnQub2sodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGZWUgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBwb3NpdGl2ZSBmZWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZEZlZXMgPSBbJzEwMDAnLCAnMCcsICcxMDAwMDAwMDAwMDAwMDAwMDAwJywgJzk5OTk5OTk5OTk5OTk5OTk5OSddO1xuXG4gICAgICB2YWxpZEZlZXMuZm9yRWFjaCgoZmVlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuZmVlKGZlZSk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IGZlZTogJHtmZWV9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGZlZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZUZlZXMgPSBbJy0xJywgJy0xMDAwJywgJy0xMDAwMDAwMDAwMDAwMDAwMDAwJ107XG5cbiAgICAgIG5lZ2F0aXZlRmVlcy5mb3JFYWNoKChmZWUpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBidWlsZGVyLmZlZShmZWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAgIGBTaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGZlZTogJHtmZWV9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBpbnZhbGlkIGZlZSBmb3JtYXRzIChCaWdOdW1iZXIgYmVoYXZpb3IpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEZlZXMgPSBbJ2FiYycsICdub3QtYS1udW1iZXInLCAnMS41LjUnLCAnaW5maW5pdHknXTtcblxuICAgICAgaW52YWxpZEZlZXMuZm9yRWFjaCgoZmVlKSA9PiB7XG4gICAgICAgIC8vIEJpZ051bWJlciBkb2Vzbid0IHRocm93IGZvciBpbnZhbGlkIHN0cmluZ3MsIGl0IGNyZWF0ZXMgTmFOIHZhbHVlc1xuICAgICAgICAvLyBCdXQgb3VyIGltcGxlbWVudGF0aW9uIHNob3VsZCBzdGlsbCBhY2NlcHQgdGhlbSAobm8gYWRkaXRpb25hbCB2YWxpZGF0aW9uKVxuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmZlZShmZWUpO1xuICAgICAgICB9LCBgQmlnTnVtYmVyIGFjY2VwdHMgaW52YWxpZCBzdHJpbmdzOiAke2ZlZX1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgQmlnTnVtYmVyIGZlZSBpbnB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaWdOdW1iZXJGZWUgPSBuZXcgQmlnTnVtYmVyKCcxMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5mZWUoYmlnTnVtYmVyRmVlLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIGZlZSBzZXR0aW5nIHdpdGggb3RoZXIgbWV0aG9kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZlZSA9ICcxMDAwJztcbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQnLFxuICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0J10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5mZWUoZmVlKS5hZGRVdHhvcyhbdXR4b10pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdMb2NrdGltZSBNYW5hZ2VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHZhbGlkIGxvY2t0aW1lIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkTG9ja3RpbWVzID0gWzAsIDEsIDEwMDAsIDQyOTQ5NjcyOTVdOyAvLyBNYXggdWludDMyXG5cbiAgICAgIHZhbGlkTG9ja3RpbWVzLmZvckVhY2goKGxvY2t0aW1lKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubG9ja3RpbWUobG9ja3RpbWUpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBsb2NrdGltZTogJHtsb2NrdGltZX1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmVnYXRpdmUgbG9ja3RpbWUgKG5vIHZhbGlkYXRpb24pJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVMb2NrdGltZXMgPSBbLTEsIC0xMDAwXTtcblxuICAgICAgbmVnYXRpdmVMb2NrdGltZXMuZm9yRWFjaCgobG9ja3RpbWUpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5sb2NrdGltZShsb2NrdGltZSk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IG5lZ2F0aXZlIGxvY2t0aW1lOiAke2xvY2t0aW1lfSAobm8gdmFsaWRhdGlvbiBpbiBpbXBsZW1lbnRhdGlvbilgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYm91bmRhcnkgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYm91bmRhcnlWYWx1ZXMgPSBbMCwgNDI5NDk2NzI5NV07IC8vIE1pbiBhbmQgbWF4IHVpbnQzMlxuXG4gICAgICBib3VuZGFyeVZhbHVlcy5mb3JFYWNoKChsb2NrdGltZSkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmxvY2t0aW1lKGxvY2t0aW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2hhaW4gbG9ja3RpbWUgc2V0dGluZyB3aXRoIG90aGVyIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsb2NrdGltZSA9IDEyMzQ1NjtcbiAgICAgIGNvbnN0IGZlZSA9ICcxMDAwJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIubG9ja3RpbWUobG9ja3RpbWUpLmZlZShmZWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUaHJlc2hvbGQgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCB0aHJlc2hvbGQgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRUaHJlc2hvbGRzID0gWzEsIDIsIDUsIDEwXTtcblxuICAgICAgdmFsaWRUaHJlc2hvbGRzLmZvckVhY2goKHRocmVzaG9sZCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLnRocmVzaG9sZCh0aHJlc2hvbGQpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIHRocmVzaG9sZCB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkVGhyZXNob2xkcyA9IFswLCAtMSwgLTEwXTtcblxuICAgICAgaW52YWxpZFRocmVzaG9sZHMuZm9yRWFjaCgodGhyZXNob2xkKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci50aHJlc2hvbGQodGhyZXNob2xkKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgICBgU2hvdWxkIHJlamVjdCB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdHlwaWNhbCB0aHJlc2hvbGQgc2NlbmFyaW9zJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gU2luZ2xlIHNpZ25hdHVyZVxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudGhyZXNob2xkKDEpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE11bHRpLXNpZ25hdHVyZVxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudGhyZXNob2xkKDMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIHRocmVzaG9sZCBzZXR0aW5nIHdpdGggb3RoZXIgbWV0aG9kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG4gICAgICBjb25zdCBsb2NrdGltZSA9IDEyMzQ1NjtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudGhyZXNob2xkKHRocmVzaG9sZCkubG9ja3RpbWUobG9ja3RpbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTb3VyY2UgQ2hhaW4gTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUT0RPIDogRW5hYmxlIHRoZXNlIHRlc3RzIGFmdGVyIGZpeGluZyBzb3VyY2VDaGFpbiBtZXRob2QgdG8gYWNjZXB0IFAtY2hhaW4gSURzXG4gICAgaXQuc2tpcCgnc2hvdWxkIHNldCB2YWxpZCBzb3VyY2UgY2hhaW4gSURzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRDaGFpbklkcyA9IFsnQy1mbGFyZTEyMzQ1JywgJ05vZGVJRC1mbGFyZTY3ODkwJywgJzB4MTIzNDU2Nzg5YWJjZGVmJywgJ2FiYzEyM2RlZjQ1NiddO1xuXG4gICAgICB2YWxpZENoYWluSWRzLmZvckVhY2goKGNoYWluSWQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5zb3VyY2VDaGFpbihjaGFpbklkKTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgY2hhaW4gSUQ6ICR7Y2hhaW5JZH1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZGlmZmVyZW50IGNoYWluIElEIGZvcm1hdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjaGFpbklkcyA9IFsnQy1jaGFpbi1pZC0xMjMnLCAnUC1jaGFpbi1pZC00NTYnLCAnaGV4LWZvcm1hdHRlZC1pZCcsICcxMjM0NTY3ODkwYWJjZGVmJ107XG5cbiAgICAgIGNoYWluSWRzLmZvckVhY2goKGNoYWluSWQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5zb3VyY2VDaGFpbihjaGFpbklkKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0lucHV0L091dHB1dCBDcmVhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRlc3QgcHVibGljIG1ldGhvZHMgb25seSBkdWUgdG8gcHJvdGVjdGVkIGFjY2VzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE5vdGU6IGNyZWF0ZUlucHV0T3V0cHV0IGlzIHByb3RlY3RlZCwgc28gd2UgdGVzdCB0aHJvdWdoIHB1YmxpYyBpbnRlcmZhY2VcbiAgICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gc2V0IHBhcmFtZXRlcnMgdGhhdCB3b3VsZCBiZSB1c2VkIGJ5IGNyZWF0ZUlucHV0T3V0cHV0XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5mZWUoJzEwMDAnKTtcbiAgICAgICAgYnVpbGRlci50aHJlc2hvbGQoMSk7XG4gICAgICAgIC8vIFByb3RlY3RlZCBtZXRob2QgY2Fubm90IGJlIHRlc3RlZCBkaXJlY3RseVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjb25maWd1cmF0aW9uIGZvciBvdXRwdXQgY3JlYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZWUgPSAnMTAwMCc7XG4gICAgICBjb25zdCBsb2NrdGltZSA9IDA7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSAxO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5mZWUoZmVlKS5sb2NrdGltZShsb2NrdGltZSkudGhyZXNob2xkKHRocmVzaG9sZCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgc2V0dGluZyBwYXJhbWV0ZXJzIGZvciBsYXJnZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbG9ja3RpbWUgPSAwO1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gMTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZmVlKCcxMDAwJykubG9ja3RpbWUobG9ja3RpbWUpLnRocmVzaG9sZCh0aHJlc2hvbGQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbmZpZ3VyZSBmb3IgZGlmZmVyZW50IHRocmVzaG9sZCBzY2VuYXJpb3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsb2NrdGltZSA9IDA7XG5cbiAgICAgIC8vIFRlc3QgZGlmZmVyZW50IHRocmVzaG9sZHNcbiAgICAgIFsxLCAyLCAzXS5mb3JFYWNoKCh0aHJlc2hvbGQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci50aHJlc2hvbGQodGhyZXNob2xkKS5sb2NrdGltZShsb2NrdGltZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBUeXBlIFZlcmlmaWNhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0cmFuc2FjdGlvbiB0eXBlIChwbGFjZWhvbGRlciknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrVHggPSB7IHR5cGU6ICdpbXBvcnQnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBJbXBvcnRJblBUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKG1vY2tUeCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTsgLy8gUGxhY2Vob2xkZXIgcmV0dXJucyB0cnVlXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkaWZmZXJlbnQgdHJhbnNhY3Rpb24gb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFt7fSwgbnVsbCwgdW5kZWZpbmVkLCB7IHR5cGU6ICdleHBvcnQnIH0sIHsgZGF0YTogJ3Rlc3QnIH1dO1xuXG4gICAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgodGVzdENhc2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEltcG9ydEluUFR4QnVpbGRlci52ZXJpZnlUeFR5cGUodGVzdENhc2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlLCBgVGVzdCBjYXNlICR7aW5kZXh9IHNob3VsZCByZXR1cm4gdHJ1ZSAocGxhY2Vob2xkZXIpYCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHZpYSBpbnN0YW5jZSBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrVHggPSB7IHR5cGU6ICdpbXBvcnQnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnZlcmlmeVR4VHlwZShtb2NrVHgpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBCdWlsZGluZyBQcmVwYXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByZXBhcmUgYmFzaWMgaW1wb3J0IHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZWUgPSAnMTAwMCc7XG4gICAgICBjb25zdCBsb2NrdGltZSA9IDEyMzQ1NjtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG4gICAgICBjb25zdCBjaGFpbklkID0gJ0Mtc291cmNlLWNoYWluLTEyMyc7XG4gICAgICBjb25zdCB1dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAxLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0J10sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBTZXQgYWxsIHBhcmFtZXRlcnNcbiAgICAgIGJ1aWxkZXIuZmVlKGZlZSkubG9ja3RpbWUobG9ja3RpbWUpLnRocmVzaG9sZCh0aHJlc2hvbGQpLnNvdXJjZUNoYWluKGNoYWluSWQpLmFkZFV0eG9zKHV0eG9zKTtcblxuICAgICAgLy8gU2hvdWxkIG5vdCB0aHJvd1xuICAgICAgYXNzZXJ0Lm9rKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWluaW1hbCBjb25maWd1cmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmVlID0gJzAnO1xuICAgICAgY29uc3QgdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdCddLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgYnVpbGRlci5mZWUoZmVlKS5hZGRVdHhvcyh1dHhvcyk7XG5cbiAgICAgIC8vIFNob3VsZCBub3QgdGhyb3dcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbXBsZXggU2NlbmFyaW9zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIG11bHRpcGxlIFVUWE9zIHdpdGggZGlmZmVyZW50IHByb3BlcnRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAxLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQtMScsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMXNpbmdsZSddLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDIsXG4gICAgICAgICAgYW1vdW50OiAnMjAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC0yJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcxJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxbXVsdGkxJywgJ0MtZmxhcmUxbXVsdGkyJ10sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMyxcbiAgICAgICAgICBhbW91bnQ6ICczMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkLTMnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMyxcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTFtdWx0aTEnLCAnQy1mbGFyZTFtdWx0aTInLCAnQy1mbGFyZTFtdWx0aTMnXSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGJ1aWxkZXIuYWRkVXR4b3ModXR4b3MpO1xuICAgICAgYnVpbGRlci5mZWUoJzUwMDAnKTsgLy8gSGlnaGVyIGZlZSBmb3IgY29tcGxleCB0cmFuc2FjdGlvblxuICAgICAgYnVpbGRlci50aHJlc2hvbGQoMik7XG5cbiAgICAgIC8vIFNob3VsZCBoYW5kbGUgY29tcGxleCBVVFhPIHNldFxuICAgICAgYXNzZXJ0Lm9rKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdHJhbnNhY3Rpb24gcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZlZSA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJzsgLy8gMSBGTFIgZmVlXG4gICAgICBjb25zdCBsb2NrdGltZSA9IDQyOTQ5NjcyOTU7IC8vIE1heCB1aW50MzJcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwOyAvLyBIaWdoIHRocmVzaG9sZFxuICAgICAgY29uc3QgY2hhaW5JZCA9ICd2ZXJ5LWxvbmctY2hhaW4taWQtd2l0aC1sb3RzLW9mLWNoYXJhY3RlcnMtMHgxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmJztcblxuICAgICAgYnVpbGRlci5mZWUoZmVlKS5sb2NrdGltZShsb2NrdGltZSkudGhyZXNob2xkKHRocmVzaG9sZCkuc291cmNlQ2hhaW4oY2hhaW5JZCk7XG5cbiAgICAgIC8vIFNob3VsZCBoYW5kbGUgbGFyZ2UgdmFsdWVzXG4gICAgICBhc3NlcnQub2sodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSByYXBpZCBwYXJhbWV0ZXIgY2hhbmdlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNpbXVsYXRlIHJhcGlkIHBhcmFtZXRlciB1cGRhdGVzXG4gICAgICBidWlsZGVyLmZlZSgnMTAwMCcpLmZlZSgnMjAwMCcpLmZlZSgnMzAwMCcpO1xuICAgICAgYnVpbGRlci5sb2NrdGltZSgxMDApLmxvY2t0aW1lKDIwMCkubG9ja3RpbWUoMzAwKTtcbiAgICAgIGJ1aWxkZXIudGhyZXNob2xkKDEpLnRocmVzaG9sZCgyKS50aHJlc2hvbGQoMyk7XG5cbiAgICAgIC8vIFNob3VsZCBoYW5kbGUgcmFwaWQgY2hhbmdlcyB3aXRob3V0IGlzc3Vlc1xuICAgICAgYXNzZXJ0Lm9rKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRWRnZSBDYXNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB6ZXJvIHZhbHVlcyB3aGVyZSBhcHByb3ByaWF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuZmVlKCcwJyk7XG4gICAgICBidWlsZGVyLmxvY2t0aW1lKDApO1xuICAgICAgLy8gdGhyZXNob2xkIG9mIDAgc2hvdWxkIGJlIGludmFsaWRcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRocmVzaG9sZCgwKTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtYXhpbXVtIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1heEZlZSA9ICcxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUnOyAvLyBNYXggdWludDI1NlxuICAgICAgY29uc3QgbWF4TG9ja3RpbWUgPSA0Mjk0OTY3Mjk1OyAvLyBNYXggdWludDMyXG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmZlZShtYXhGZWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmxvY2t0aW1lKG1heExvY2t0aW1lKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYWludGFpbiBzdGF0ZSBhY3Jvc3MgbXVsdGlwbGUgb3BlcmF0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHV0eG8xOiBEZWNvZGVkVXR4b09iaiA9IHtcbiAgICAgICAgb3V0cHV0SUQ6IDEsXG4gICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICB0eGlkOiAndGVzdC10eGlkLTEnLFxuICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0MSddLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdXR4bzI6IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogMixcbiAgICAgICAgYW1vdW50OiAnMjAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQtMicsXG4gICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMXRlc3QyJ10sXG4gICAgICB9O1xuXG4gICAgICAvLyBCdWlsZCBzdGF0ZSBpbmNyZW1lbnRhbGx5XG4gICAgICBidWlsZGVyLmZlZSgnMTAwMCcpO1xuICAgICAgYnVpbGRlci5hZGRVdHhvcyhbdXR4bzFdKTtcbiAgICAgIGJ1aWxkZXIubG9ja3RpbWUoMTIzNDU2KTtcbiAgICAgIGJ1aWxkZXIuYWRkVXR4b3MoW3V0eG8yXSk7XG4gICAgICBidWlsZGVyLnRocmVzaG9sZCgyKTtcblxuICAgICAgLy8gU3RhdGUgc2hvdWxkIGJlIG1haW50YWluZWQgYWNyb3NzIG9wZXJhdGlvbnNcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ludGVncmF0aW9uIFRlc3RzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvbXBsZXRlIFAtY2hhaW4gaW1wb3J0IGZsb3cgcHJlcGFyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZWUgPSAnMjAwMCc7XG4gICAgICBjb25zdCBsb2NrdGltZSA9IDY1NDMyMTtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDE7XG4gICAgICBjb25zdCBjaGFpbklkID0gJ0Mtc291cmNlLWNoYWluLTQ1Nic7XG4gICAgICBjb25zdCB1dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAxLFxuICAgICAgICAgIGFtb3VudDogJzYwMDAwMDAwMDAwMDAwMDAwMDAnLCAvLyA2IEZMUiAobW9yZSB0aGFuIG91dHB1dCBmb3IgZmVlcylcbiAgICAgICAgICB0eGlkOiAnaW50ZWdyYXRpb24tdGVzdC10eGlkJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxc291cmNlJ10sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBDb21wbGV0ZSBzZXR1cFxuICAgICAgYnVpbGRlci5mZWUoZmVlKS5sb2NrdGltZShsb2NrdGltZSkudGhyZXNob2xkKHRocmVzaG9sZCkuc291cmNlQ2hhaW4oY2hhaW5JZCkuYWRkVXR4b3ModXR4b3MpO1xuXG4gICAgICAvLyBBbGwgb3BlcmF0aW9ucyBzaG91bGQgY29tcGxldGUgd2l0aG91dCB0aHJvd2luZ1xuICAgICAgYXNzZXJ0Lm9rKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWV0aG9kIGNoYWluaW5nIGV4dGVuc2l2ZWx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIDEwIEZMUlxuICAgICAgICAgIHR4aWQ6ICdjaGFpbi10ZXN0LXR4aWQnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0J10sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICAvLyBUZXN0IGV4dGVuc2l2ZSBtZXRob2QgY2hhaW5pbmdcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmZlZSgnMTAwMCcpLmxvY2t0aW1lKDEwMDAwMCkudGhyZXNob2xkKDEpLnNvdXJjZUNoYWluKCdDLWNoYWluLTEyMycpLmFkZFV0eG9zKHV0eG9zKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLHlFQUFvRjtBQUNwRiwwQ0FBNkU7QUFDN0UsNENBQXVDO0FBQ3ZDLDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsU0FBUyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSywyQkFBMkIsQ0FDdEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEdBQUcsRUFBRTtZQUMvRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsU0FBUyxDQUFDLGVBQWUsQ0FBQyx1QkFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdkQsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLHNCQUFzQixDQUNqRCxDQUFDO1FBQ0osQ0FBQyxD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RyxFQUFFLEVBQUU7WUFDYixHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgSU1QT1JUX0lOX1AgYXMgdGVzdERhdGEgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL2ltcG9ydEluUCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgc2lnbkZsb3dUZXN0IGZyb20gJy4vc2lnbkZsb3dUZXN0U3VpdCc7XG5cbmRlc2NyaWJlKCdGbHJwIEltcG9ydCBJbiBQIFR4IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpO1xuICBkZXNjcmliZSgndmFsaWRhdGUgdHhCdWlsZGVyIGZpZWxkcycsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluUEJ1aWxkZXIoKTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbGVuZ3RoIGluY29ycmVjdCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKEJ1ZmZlci5mcm9tKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnQ2hhaW4gaWQgYXJlIDMyIGJ5dGUgc2l6ZSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIG5vdCBhIHZhbGlkIGJhc2U1OCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5JTlZBTElEX0NIQUlOX0lEKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnTm9uLWJhc2U1OCBjaGFyYWN0ZXInXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBjYjU4IGludmFsaWQgY2hlY2tzdW0nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5WQUxJRF9DX0NIQUlOX0lELnNsaWNlKDIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnSW52YWxpZCBjaGVja3N1bSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3MgZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYT3MgYXJyYXkgY2Fubm90IGJlIGVtcHR5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyB3aXRob3V0IGFtb3VudCBmaWVsZCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbeyBvdXRwdXRJRDogJycgfSBhcyBhbnkgYXMgRGVjb2RlZFV0eG9PYmpdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYTyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiBhbW91bnQnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0ltcG9ydCBQMkMnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLnVuc2lnbmVkSGV4LFxuICAgIGhhbGZTaWduZWRUeEhleDogdGVzdERhdGEuaGFsZlNpZ250eEhleCxcbiAgICBmdWxsU2lnbmVkVHhIZXg6IHRlc3REYXRhLmZ1bGxTaWdudHhIZXgsXG4gICAgcHJpdmF0ZUtleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1sxXSxcbiAgICB9LFxuICAgIHR4SGFzaDogdGVzdERhdGEudHhoYXNoLFxuICB9KTtcblxuICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIGltcG9ydCB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5idWlsZCgpXG4gICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbCgnUHJpdmF0ZSBrZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==