@experteam-mx/ngx-services 18.5.9 → 18.6.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.
@@ -24,9 +24,8 @@ export class ApiCompaniesService {
24
24
  * @return {Observable<InstallationsOut>} An observable that emits the installation's data.
25
25
  */
26
26
  getInstallations(params) {
27
- return this.http.get(`${this.url}/installations`, {
28
- params,
29
- }).pipe(map(({ data }) => data));
27
+ return this.http.get(`${this.url}/installations`, { params })
28
+ .pipe(map(({ data }) => data));
30
29
  }
31
30
  /**
32
31
  * Retrieves the installation details based on the given installation ID.
@@ -38,6 +37,37 @@ export class ApiCompaniesService {
38
37
  return this.http.get(`${this.url}/installations/${id}`)
39
38
  .pipe(map(({ data }) => data));
40
39
  }
40
+ /**
41
+ * Sends a post-installation request to the server and retrieves the installation details.
42
+ *
43
+ * @param {InstallationIn} body - The installation details to be sent in the request body.
44
+ * @return {Observable<InstallationOut>} An observable that emits the response containing installation output details.
45
+ */
46
+ postInstallation(body) {
47
+ return this.http.post(`${this.url}/installations`, body)
48
+ .pipe(map(({ data }) => data));
49
+ }
50
+ /**
51
+ * Updates an existing installation record by its ID.
52
+ *
53
+ * @param id The unique identifier of the installation to update.
54
+ * @param body The data payload containing the updated installation information.
55
+ * @return An observable that emits the updated installation data upon a successful update.
56
+ */
57
+ putInstallation(id, body) {
58
+ return this.http.put(`${this.url}/installations/${id}`, body)
59
+ .pipe(map(({ data }) => data));
60
+ }
61
+ /**
62
+ * Deletes an installation by its unique identifier.
63
+ *
64
+ * @param {number} id - The unique identifier of the installation to be deleted.
65
+ * @return {Observable<{}>} An observable that emits the response after the installation is deleted.
66
+ */
67
+ deleteInstallation(id) {
68
+ return this.http.delete(`${this.url}/installations/${id}`)
69
+ .pipe(map(({ data }) => data));
70
+ }
41
71
  /**
42
72
  * Retrieves a list of locations based on the provided query parameters.
43
73
  *
@@ -45,9 +75,8 @@ export class ApiCompaniesService {
45
75
  * @return {Observable<LocationsOut>} An observable that emits the location's data.
46
76
  */
47
77
  getLocations(params) {
48
- return this.http.get(`${this.url}/locations`, {
49
- params,
50
- }).pipe(map(({ data }) => data));
78
+ return this.http.get(`${this.url}/locations`, { params })
79
+ .pipe(map(({ data }) => data));
51
80
  }
52
81
  /**
53
82
  * Fetches the location details for a given location ID.
@@ -59,16 +88,66 @@ export class ApiCompaniesService {
59
88
  return this.http.get(`${this.url}/locations/${id}`)
60
89
  .pipe(map(({ data }) => data));
61
90
  }
91
+ /**
92
+ * Sends a location object to the server and returns the created location data.
93
+ *
94
+ * @param {LocationIn} body - The location input object to be sent in the request body.
95
+ * @return {Observable<LocationOut>} An observable emitting the created location output object.
96
+ */
97
+ postLocation(body) {
98
+ return this.http.post(`${this.url}/locations`, body)
99
+ .pipe(map(({ data }) => data));
100
+ }
101
+ /**
102
+ * Updates the location information for the specified ID.
103
+ *
104
+ * @param {number} id - The unique identifier of the location to be updated.
105
+ * @param {LocationIn} body - The updated location data to be sent in the request body.
106
+ * @return {Observable<LocationOut>} An observable containing the updated location information.
107
+ */
108
+ putLocation(id, body) {
109
+ return this.http.put(`${this.url}/locations/${id}`, body)
110
+ .pipe(map(({ data }) => data));
111
+ }
112
+ /**
113
+ * Deletes a location by its unique identifier.
114
+ *
115
+ * @param {number} id - The unique identifier of the location to be deleted.
116
+ * @return {Observable<{}>} An observable that emits an empty object upon successful deletion.
117
+ */
118
+ deleteLocation(id) {
119
+ return this.http.delete(`${this.url}/locations/${id}`)
120
+ .pipe(map(({ data }) => data));
121
+ }
62
122
  /**
63
123
  * Retrieves a list of active supply entities.
64
124
  *
65
125
  * @param {QueryParams} params - The query parameters to filter supply entities.
66
- * @return {Observable<SupplyEntitiesActivesOut>} Observable emitting supply entities data.
126
+ * @return {Observable<SupplyEntitiesOut>} Observable emitting supply entities data.
67
127
  */
68
128
  getSupplyEntitiesActives(params) {
69
- return this.http.get(`${this.url}/supply-entities/actives`, {
70
- params,
71
- }).pipe(map(({ data }) => data));
129
+ return this.http.get(`${this.url}/supply-entities/actives`, { params })
130
+ .pipe(map(({ data }) => data));
131
+ }
132
+ /**
133
+ * Retrieves supply entities based on the provided query parameters.
134
+ *
135
+ * @param {QueryParams} params - The query parameters used to filter and fetch the supply entities.
136
+ * @return {Observable<SupplyEntitiesOut>} An observable that emits the supply entities data.
137
+ */
138
+ getSupplyEntities(params) {
139
+ return this.http.get(`${this.url}/supply-entities`, { params })
140
+ .pipe(map(({ data }) => data));
141
+ }
142
+ /**
143
+ * Sends supply entities information to the server and receives the processed supply entities data in response.
144
+ *
145
+ * @param {SupplyEntitiesIn} body - The supply entities data to be sent to the server.
146
+ * @return {Observable<SupplyEntitiesOut>} An observable containing the processed supply entities data.
147
+ */
148
+ putSupplyEntities(body) {
149
+ return this.http.post(`${this.url}/accounts`, body)
150
+ .pipe(map(({ data }) => data));
72
151
  }
73
152
  /**
74
153
  * Fetches a list of employees based on the specified query parameters.
@@ -91,6 +170,37 @@ export class ApiCompaniesService {
91
170
  return this.http.get(`${this.url}/employees/${id}`)
92
171
  .pipe(map(({ data }) => data));
93
172
  }
173
+ /**
174
+ * Sends a POST request to create a new employee record.
175
+ *
176
+ * @param {EmployeeIn} body - The data of the employee to be created.
177
+ * @return {Observable<EmployeeOut>} An observable containing the created employee data.
178
+ */
179
+ postEmployee(body) {
180
+ return this.http.post(`${this.url}/employees`, body)
181
+ .pipe(map(({ data }) => data));
182
+ }
183
+ /**
184
+ * Updates an existing employee record with the specified data.
185
+ *
186
+ * @param {number} id - The unique identifier of the employee to be updated.
187
+ * @param {EmployeeIn} body - The employee data to update the record with.
188
+ * @return {Observable<EmployeeOut>} An observable containing the updated employee data.
189
+ */
190
+ putEmployee(id, body) {
191
+ return this.http.put(`${this.url}/employees/${id}`, body)
192
+ .pipe(map(({ data }) => data));
193
+ }
194
+ /**
195
+ * Deletes an employee based on the provided ID.
196
+ *
197
+ * @param {number} id - The unique identifier of the employee to delete.
198
+ * @return {Observable<{}>} An observable containing the response data after the employee is deleted.
199
+ */
200
+ deleteEmployee(id) {
201
+ return this.http.delete(`${this.url}/employees/${id}`)
202
+ .pipe(map(({ data }) => data));
203
+ }
94
204
  /**
95
205
  * Retrieves the list of employees for a specified location based on provided query parameters.
96
206
  *
@@ -102,6 +212,36 @@ export class ApiCompaniesService {
102
212
  params,
103
213
  }).pipe(map(({ data }) => data));
104
214
  }
215
+ /**
216
+ * Fetches the location employee details for a given employee ID.
217
+ *
218
+ * @param {number} id - The unique identifier of the employee whose location details are to be retrieved.
219
+ * @return {Observable<LocationEmployeeOut>} An observable containing the location employee details.
220
+ */
221
+ getLocationEmployee(id) {
222
+ return this.http.get(`${this.url}/location-employees/${id}`)
223
+ .pipe(map(({ data }) => data));
224
+ }
225
+ /**
226
+ * Deletes a specific location employee by their unique identifier.
227
+ *
228
+ * @param {number} id - The unique identifier of the employee to be deleted.
229
+ * @return {Observable<{}>} - An observable emitting the server's response after the deletion.
230
+ */
231
+ deleteLocationEmployee(id) {
232
+ return this.http.delete(`${this.url}/location-employees/${id}`)
233
+ .pipe(map(({ data }) => data));
234
+ }
235
+ /**
236
+ * Sends a batch of location-employee associations to the server for processing.
237
+ *
238
+ * @param {LocationEmployeeBatchIn} body - The object containing a batch of location-employee data to be posted.
239
+ * @return {Observable<EmployeeOut>} An observable emitting the processed employee data from the server's response.
240
+ */
241
+ postLocationEmployeeBatch(body) {
242
+ return this.http.post(`${this.url}/location-employees/batch`, body)
243
+ .pipe(map(({ data }) => data));
244
+ }
105
245
  /**
106
246
  * Retrieves a list of countries where the company operates.
107
247
  *
@@ -109,9 +249,8 @@ export class ApiCompaniesService {
109
249
  * @return {Observable<CompanyCountriesOut>} An observable containing the list of company countries.
110
250
  */
111
251
  getCompanyCountries(params) {
112
- return this.http.get(`${this.url}/company-countries`, {
113
- params,
114
- }).pipe(map(({ data }) => data));
252
+ return this.http.get(`${this.url}/company-countries`, { params })
253
+ .pipe(map(({ data }) => data));
115
254
  }
116
255
  /**
117
256
  * Retrieves the country information for a specified company by its ID.
@@ -123,6 +262,37 @@ export class ApiCompaniesService {
123
262
  return this.http.get(`${this.url}/company-countries/${id}`)
124
263
  .pipe(map(({ data }) => data));
125
264
  }
265
+ /**
266
+ * Sends a request to update or create a company country entry on the server.
267
+ *
268
+ * @param {CompanyCountryIn} body The data object representing the company country information to be sent to the server.
269
+ * @return {Observable<CompanyCountryOut>} An observable containing the server response with the updated or created company country data.
270
+ */
271
+ postCompanyCountry(body) {
272
+ return this.http.put(`${this.url}/company-countries`, body)
273
+ .pipe(map(({ data }) => data));
274
+ }
275
+ /**
276
+ * Updates the country information for a specific company.
277
+ *
278
+ * @param {number} id - The unique identifier of the company whose country information needs to be updated.
279
+ * @param {CompanyCountryIn} body - The updated country information to be applied to the company.
280
+ * @return {Observable<CompanyCountryOut>} An observable that emits the updated company country information.
281
+ */
282
+ putCompanyCountry(id, body) {
283
+ return this.http.put(`${this.url}/company-countries/${id}`, body)
284
+ .pipe(map(({ data }) => data));
285
+ }
286
+ /**
287
+ * Deletes a company-country association by its unique identifier.
288
+ *
289
+ * @param {number} id - The unique identifier of the company-country record to be deleted.
290
+ * @return {Observable<{}>} An observable emitting the result of the delete operation.
291
+ */
292
+ deleteCompanyCountry(id) {
293
+ return this.http.delete(`${this.url}/company-countries/${id}`)
294
+ .pipe(map(({ data }) => data));
295
+ }
126
296
  /**
127
297
  * Fetches the reference currencies for a given country.
128
298
  *
@@ -130,7 +300,18 @@ export class ApiCompaniesService {
130
300
  * @return {Observable<CountryReferenceCurrenciesOut>} The observable containing the country reference currencies data.
131
301
  */
132
302
  getCountryReferenceCurrencies(params) {
133
- return this.http.get(`${this.url}/country-reference-currencies`, { params }).pipe(map(({ data }) => data));
303
+ return this.http.get(`${this.url}/country-reference-currencies`, { params })
304
+ .pipe(map(({ data }) => data));
305
+ }
306
+ /**
307
+ * Retrieves the reference currency details for a specific country using its ID.
308
+ *
309
+ * @param {number} id - The unique identifier of the country.
310
+ * @return {Observable<CountryReferenceCurrencyOut>} An observable emitting the country's reference currency details.
311
+ */
312
+ getCountryReferenceCurrency(id) {
313
+ return this.http.get(`${this.url}/country-reference-currencies/${id}`)
314
+ .pipe(map(({ data }) => data));
134
315
  }
135
316
  /**
136
317
  * Retrieves a list of currencies for different countries along with their current exchange rates.
@@ -151,6 +332,61 @@ export class ApiCompaniesService {
151
332
  return forkJoin($observables);
152
333
  }));
153
334
  }
335
+ /**
336
+ * Updates the reference currency for a specified country.
337
+ *
338
+ * @param {number} id - The unique identifier of the country.
339
+ * @param {CountryReferenceCurrencyIn} body - The data for updating the country's reference currency.
340
+ * @return {Observable<CountryReferenceCurrencyOut>} An Observable emitting the updated country reference currency data.
341
+ */
342
+ putCountryReferenceCurrency(id, body) {
343
+ return this.http.put(`${this.url}/country-reference-currencies/${id}`, body)
344
+ .pipe(map(({ data }) => data));
345
+ }
346
+ /**
347
+ * Sends a POST request to create a country reference currency.
348
+ *
349
+ * @param {CountryReferenceCurrencyIn} body - The payload containing the country reference currency data.
350
+ * @return {Observable<CountryReferenceCurrencyOut>} An observable emitting the created country reference currency.
351
+ */
352
+ postCountryReferenceCurrency(body) {
353
+ return this.http.post(`${this.url}/country-reference-currencies`, body)
354
+ .pipe(map(({ data }) => data));
355
+ }
356
+ /**
357
+ * Sends a POST request to create or update a country reference extra charge.
358
+ *
359
+ * @param {CountryReferenceExtraChargeIn} body - The request payload containing details about the country reference extra charge.
360
+ * @return {Observable<CountryReferenceExtraChargeOut>} An observable containing the response with the created or updated country reference extra charge.
361
+ */
362
+ postCountryReferenceExtraCharge(body) {
363
+ return this.http.post(`${this.url}/country-reference-extra-charges`, body)
364
+ .pipe(map(({ data }) => data));
365
+ }
366
+ /**
367
+ * Updates a country reference extra charge by its ID.
368
+ *
369
+ * @param {number} id - The unique identifier of the country reference extra charge to be updated.
370
+ * @param {CountryReferenceExtraChargeIn} body - The data to update the country reference extra charge with.
371
+ * @return {Observable<CountryReferenceExtraChargeOut>} An observable that emits the updated country reference extra charge.
372
+ */
373
+ putCountryReferenceExtraCharge(id, body) {
374
+ return this.http.put(`${this.url}/country-reference-extra-charges/${id}`, body)
375
+ .pipe(map(({ data }) => data));
376
+ }
377
+ /**
378
+ * Enables or disables a country reference extra charge based on the provided parameters.
379
+ *
380
+ * @param {CountryReferenceExtraCharge} extraCharge - The country reference extra charge object to be updated.
381
+ * @param {boolean} [isActive] - Optional parameter to explicitly set the active status of the extra charge.
382
+ * If not provided, the current active status will be toggled.
383
+ * @return {Observable<EmployeeCustomersOut>} An Observable that emits the updated employee customers output.
384
+ */
385
+ patchCountryReferenceExtraCharge(extraCharge, isActive) {
386
+ return this.http.patch(`${this.url}/country-reference-extra-charges/${extraCharge.id}`, {
387
+ is_active: isActive ?? !extraCharge.is_active
388
+ }).pipe(map(({ data }) => data));
389
+ }
154
390
  /**
155
391
  * Fetches exchange data based on the provided query parameters.
156
392
  *
@@ -158,9 +394,29 @@ export class ApiCompaniesService {
158
394
  * @return {Observable<ExchangesOut>} An observable containing the exchange data.
159
395
  */
160
396
  getExchanges(params) {
161
- return this.http.get(`${this.url}/exchanges`, {
162
- params,
163
- }).pipe(map(({ data }) => data));
397
+ return this.http.get(`${this.url}/exchanges`, { params })
398
+ .pipe(map(({ data }) => data));
399
+ }
400
+ /**
401
+ * Sends a POST request to create or update an exchange.
402
+ *
403
+ * @param {ExchangeIn} body - The request body containing the exchange data to be sent.
404
+ * @return {Observable<ExchangeOut>} An observable that emits the response containing the created or updated exchange data.
405
+ */
406
+ postExchange(body) {
407
+ return this.http.put(`${this.url}/exchanges`, body)
408
+ .pipe(map(({ data }) => data));
409
+ }
410
+ /**
411
+ * Updates an existing exchange with new data.
412
+ *
413
+ * @param {number} id - The unique identifier of the exchange to update.
414
+ * @param {ExchangeIn} body - The data to update the exchange with.
415
+ * @return {Observable<ExchangeOut>} An observable that emits the updated exchange data.
416
+ */
417
+ putExchange(id, body) {
418
+ return this.http.put(`${this.url}/exchanges/${id}`, body)
419
+ .pipe(map(({ data }) => data));
164
420
  }
165
421
  /**
166
422
  * Retrieves the current exchanges based on the given query parameters.
@@ -170,9 +426,8 @@ export class ApiCompaniesService {
170
426
  * @returns {Observable<ExchangesOut>} - An observable that emits the API response data containing the current exchanges.
171
427
  */
172
428
  getCurrentExchanges(params) {
173
- return this.http.get(`${this.url}/exchanges/current`, {
174
- params,
175
- }).pipe(map(({ data }) => data));
429
+ return this.http.get(`${this.url}/exchanges/current`, { params })
430
+ .pipe(map(({ data }) => data));
176
431
  }
177
432
  /**
178
433
  * Fetches the country-specific tax information for a company.
@@ -181,20 +436,140 @@ export class ApiCompaniesService {
181
436
  * @return {Observable<CompanyCountryTaxesOut>} An observable that emits the tax information.
182
437
  */
183
438
  getCompanyCountryTaxes(params) {
184
- return this.http.get(`${this.url}/company-country-taxes`, {
185
- params,
186
- }).pipe(map(({ data }) => data));
439
+ return this.http.get(`${this.url}/company-country-taxes`, { params })
440
+ .pipe(map(({ data }) => data));
441
+ }
442
+ /**
443
+ * Fetches account information based on the provided query parameters.
444
+ *
445
+ * @param {QueryParams} params - The query parameters for fetching account data.
446
+ * @return {Observable<AccountsOut>} An observable emitting the account data.
447
+ */
448
+ getAccounts(params) {
449
+ return this.http.get(`${this.url}/accounts`)
450
+ .pipe(map(({ data }) => data));
451
+ }
452
+ /**
453
+ * Fetches the account information for the specified account ID.
454
+ *
455
+ * @param {number} id - The unique identifier of the account to retrieve.
456
+ * @return {Observable<AccountOut>} An observable that emits the account details.
457
+ */
458
+ getAccount(id) {
459
+ return this.http.get(`${this.url}/accounts/${id}`)
460
+ .pipe(map(({ data }) => data));
461
+ }
462
+ /**
463
+ * Creates a new account by sending account details in the body.
464
+ *
465
+ * @param {AccountIn} body - The account information to be sent in the request body.
466
+ * @return {Observable<AccountOut>} Observable that emits the created account details upon success.
467
+ */
468
+ postAccount(body) {
469
+ return this.http.post(`${this.url}/accounts`, body)
470
+ .pipe(map(({ data }) => data));
471
+ }
472
+ /**
473
+ * Updates an account with the specified ID using the provided data.
474
+ *
475
+ * @param {number} id - The unique identifier of the account to be updated.
476
+ * @param {AccountIn} body - The data to update the account with.
477
+ * @return {Observable<AccountOut>} An observable emitting the updated account details.
478
+ */
479
+ putAccount(id, body) {
480
+ return this.http.post(`${this.url}/accounts/${id}`, body)
481
+ .pipe(map(({ data }) => data));
482
+ }
483
+ /**
484
+ * Fetches account entity data from the server based on the provided query parameters.
485
+ *
486
+ * @param {QueryParams} params - The query parameters to be sent with the HTTP request.
487
+ * @return {Observable<AccountEntitiesOut>} An observable that emits the account entities data.
488
+ */
489
+ getAccountEntities(params) {
490
+ return this.http.get(`${this.url}/account-entities`, { params })
491
+ .pipe(map(({ data }) => data));
492
+ }
493
+ /**
494
+ * Updates an account entity using the provided details.
495
+ *
496
+ * @param {AccountEntitiesIn} body The account entity data to be updated.
497
+ * @return {Observable<AccountEntitiesOut>} An observable containing the updated account entity details.
498
+ */
499
+ putAccountEntity(body) {
500
+ return this.http.put(`${this.url}/account-entities`, body)
501
+ .pipe(map(({ data }) => data));
187
502
  }
188
503
  /**
189
504
  * Retrieves the list of active account entities based on the provided query parameters.
190
505
  *
191
506
  * @param {QueryParams} params - The parameters to filter and query active account entities.
192
- * @return {Observable<AccountEntitiesActivesOut>} An observable that emits the list of active account entities.
507
+ * @return {Observable<AccountEntitiesOut>} An observable that emits the list of active account entities.
193
508
  */
194
509
  getAccountEntitiesActives(params) {
195
- return this.http.get(`${this.url}/account-entities/actives`, {
196
- params,
197
- }).pipe(map(({ data }) => data));
510
+ return this.http.get(`${this.url}/account-entities/actives`, { params })
511
+ .pipe(map(({ data }) => data));
512
+ }
513
+ /**
514
+ * Fetches a list of account categories based on the provided query parameters.
515
+ *
516
+ * @param {QueryParams} params - The query parameters used to filter the account categories.
517
+ * @return {Observable<AccountCategoriesOut>} An observable that emits the fetched account categories data.
518
+ */
519
+ getAccountCategories(params) {
520
+ return this.http.get(`${this.url}/account-categories`, { params, })
521
+ .pipe(map(({ data }) => data));
522
+ }
523
+ /**
524
+ * Retrieves a list of account types from the server.
525
+ *
526
+ * @param {QueryParams} params - The query parameters to filter or customize the request.
527
+ * @return {Observable<AccountTypesOut>} An observable emitting the account types data.
528
+ */
529
+ getAccountTypes(params) {
530
+ return this.http.get(`${this.url}/account-types`, { params, })
531
+ .pipe(map(({ data }) => data));
532
+ }
533
+ /**
534
+ * Retrieves the account type for the given account ID.
535
+ *
536
+ * @param {number} id - The unique identifier of the account.
537
+ * @return {Observable<AccountTypeOut>} An observable that emits the account type data.
538
+ */
539
+ getAccountType(id) {
540
+ return this.http.get(`${this.url}/account-types/${id}`)
541
+ .pipe(map(({ data }) => data));
542
+ }
543
+ /**
544
+ * Sends a POST request to create a new account type.
545
+ *
546
+ * @param {AccountTypeIn} body - The data for the account type to be created.
547
+ * @return {Observable<AccountTypeOut>} An observable that emits the created account type object.
548
+ */
549
+ postAccountType(body) {
550
+ return this.http.post(`${this.url}/account-types`, body)
551
+ .pipe(map(({ data }) => data));
552
+ }
553
+ /**
554
+ * Updates an account type with the specified ID using the provided data.
555
+ *
556
+ * @param {number} id - The unique identifier of the account type to update.
557
+ * @param {AccountTypeIn} body - The data to update the account type with.
558
+ * @return {Observable<AccountTypeOut>} An observable containing the updated account type data.
559
+ */
560
+ putAccountType(id, body) {
561
+ return this.http.put(`${this.url}/account-types/${id}`, body)
562
+ .pipe(map(({ data }) => data));
563
+ }
564
+ /**
565
+ * Retrieves parameters based on the provided query parameters.
566
+ *
567
+ * @param {QueryParams} params - The query parameters used to filter or fetch the desired parameters.
568
+ * @return {Observable<ParametersOut>} An observable that emits the fetched parameters.
569
+ */
570
+ getParameters(params) {
571
+ return this.http.get(`${this.url}/parameters`, { params, })
572
+ .pipe(map(({ data }) => data));
198
573
  }
199
574
  /**
200
575
  * Retrieves the parameter values based on the provided parameter names.
@@ -203,11 +578,20 @@ export class ApiCompaniesService {
203
578
  * @param {string[]} params.paramNames - An array of parameter names for which the values need to be fetched.
204
579
  * @return {Observable<ParametersValuesOut>} An observable that emits the fetched parameter values.
205
580
  */
206
- getParametersValues({ paramNames, }) {
581
+ getParametersValues({ paramNames }) {
207
582
  const parameters = paramNames.map((p) => ({ name: p }));
208
- return this.http.post(`${this.url}/parameters-values`, {
209
- parameters
210
- }).pipe(map(({ data }) => data));
583
+ return this.http.post(`${this.url}/parameters-values`, { parameters })
584
+ .pipe(map(({ data }) => data));
585
+ }
586
+ /**
587
+ * Retrieves parameter values based on the provided level configuration.
588
+ *
589
+ * @param {ParametersByLevelIn} parameters - The input object containing the criteria or level details to retrieve the parameters.
590
+ * @return {Observable<ParametersValuesOut>} An observable that emits the parameter values fetched from the server.
591
+ */
592
+ getParameterValueByModel(parameters) {
593
+ return this.http.post(`${this.url}/parameters-values`, { parameters })
594
+ .pipe(map(({ data }) => data));
211
595
  }
212
596
  /**
213
597
  * Retrieves the value of a specified parameter.
@@ -227,9 +611,8 @@ export class ApiCompaniesService {
227
611
  * @return {Observable<CountryReferencesOut>} An observable containing the country reference data.
228
612
  */
229
613
  getCountryReferences(params) {
230
- return this.http.get(`${this.url}/country-references`, {
231
- params,
232
- }).pipe(map(({ data }) => data));
614
+ return this.http.get(`${this.url}/country-references`, { params })
615
+ .pipe(map(({ data }) => data));
233
616
  }
234
617
  /**
235
618
  * Fetches the country reference data for a given country ID.
@@ -241,6 +624,17 @@ export class ApiCompaniesService {
241
624
  return this.http.get(`${this.url}/country-references/${id}`)
242
625
  .pipe(map(({ data }) => data));
243
626
  }
627
+ /**
628
+ * Updates a country reference resource with the specified ID and data.
629
+ *
630
+ * @param {number} id - The unique identifier of the country reference to be updated.
631
+ * @param {CountryReferenceIn} body - The data to update the country reference with.
632
+ * @return {Observable<CountryReferenceOut>} An observable that emits the updated country reference object.
633
+ */
634
+ putCountryReference(id, body) {
635
+ return this.http.put(`${this.url}/country-references/${id}`, body)
636
+ .pipe(map(({ data }) => data));
637
+ }
244
638
  /**
245
639
  * Fetches the list of workflows based on the provided query parameters.
246
640
  *
@@ -248,9 +642,8 @@ export class ApiCompaniesService {
248
642
  * @return {Observable<WorkflowsOut>} An observable containing the workflow data.
249
643
  */
250
644
  getWorkflows(params) {
251
- return this.http.get(`${this.url}/workflows`, {
252
- params,
253
- }).pipe(map(({ data }) => data));
645
+ return this.http.get(`${this.url}/workflows`, { params })
646
+ .pipe(map(({ data }) => data));
254
647
  }
255
648
  /**
256
649
  * Fetches the list of employee customer
@@ -259,9 +652,8 @@ export class ApiCompaniesService {
259
652
  * @return {Observable<EmployeeCustomersOut>} An observable containing the employee customer data.
260
653
  */
261
654
  getEmployeesCustomers(params) {
262
- return this.http.get(`${this.url}/employee-customers`, {
263
- params,
264
- }).pipe(map(({ data }) => data));
655
+ return this.http.get(`${this.url}/employee-customers`, { params })
656
+ .pipe(map(({ data }) => data));
265
657
  }
266
658
  /**
267
659
  * Sends a POST request to create or update employee customer records and processes the server response.
@@ -270,7 +662,8 @@ export class ApiCompaniesService {
270
662
  * @return {Observable<EmployeeCustomersOut>} An observable that emits the updated employee customer data on successful response.
271
663
  */
272
664
  postEmployeeCustomers(body) {
273
- return this.http.post(`${this.url}/employee-customers`, body).pipe(map(({ data }) => data));
665
+ return this.http.post(`${this.url}/employee-customers`, body)
666
+ .pipe(map(({ data }) => data));
274
667
  }
275
668
  /**
276
669
  * Updates the employee-customer association record identified by the given ID with the provided data.
@@ -280,7 +673,8 @@ export class ApiCompaniesService {
280
673
  * @return {Observable<EmployeeCustomersOut>} An observable that emits the updated employee-customer data.
281
674
  */
282
675
  putEmployeeCustomers(id, body) {
283
- return this.http.put(`${this.url}/employee-customers/${id}`, body).pipe(map(({ data }) => data));
676
+ return this.http.put(`${this.url}/employee-customers/${id}`, body)
677
+ .pipe(map(({ data }) => data));
284
678
  }
285
679
  /**
286
680
  * Fetches the employee-customer details based on the provided employee customer ID.
@@ -289,7 +683,8 @@ export class ApiCompaniesService {
289
683
  * @return {Observable<EmployeeCustomersOut>} An observable that emits the updated employee-customer data.
290
684
  */
291
685
  getEmployeeCustomer(id) {
292
- return this.http.get(`${this.url}/employee-customers/${id}`).pipe(map(({ data }) => data));
686
+ return this.http.get(`${this.url}/employee-customers/${id}`)
687
+ .pipe(map(({ data }) => data));
293
688
  }
294
689
  /**
295
690
  * Enables or disables an employee customer's active state.
@@ -299,7 +694,7 @@ export class ApiCompaniesService {
299
694
  * If null or undefined, the active state will be toggled.
300
695
  * @return {Observable<EmployeeCustomersOut>} An observable containing the updated employee customer output.
301
696
  */
302
- enableDisableEmployeeCustomers(employee, isActive) {
697
+ patchEmployeeCustomers(employee, isActive) {
303
698
  return this.http.patch(`${this.url}/employee-customers/${employee.id}`, {
304
699
  is_active: isActive ?? !employee.is_active
305
700
  }).pipe(map(({ data }) => data));
@@ -308,14 +703,15 @@ export class ApiCompaniesService {
308
703
  * Submits a file containing employee customer data for a specific country to the server.
309
704
  *
310
705
  * @param {number} countryId - The identifier of the country for which the data is being uploaded.
311
- * @param {File} file - The file containing employee customer data to be uploaded.
706
+ * @param {File} file - The file contains employee customer data to be uploaded.
312
707
  * @return {Observable<BoardingProcessIdIn>} Observable that emits the processed boarding process ID on success.
313
708
  */
314
709
  postEmployeeCustomersLoad(countryId, file) {
315
- const formData = new FormData();
316
- formData.append('file', file);
317
- formData.append('country_id', countryId.toString());
318
- return this.http.post(`${this.url}/employee-customers/load`, formData).pipe(map(({ data }) => data));
710
+ const body = new FormData();
711
+ body.append('file', file);
712
+ body.append('country_id', countryId.toString());
713
+ return this.http.post(`${this.url}/employee-customers/load`, body)
714
+ .pipe(map(({ data }) => data));
319
715
  }
320
716
  /**
321
717
  * Downloads a file containing customer data for a specific employee based on the provided country ID.
@@ -336,7 +732,232 @@ export class ApiCompaniesService {
336
732
  * @return {Observable<BoardingProcessIn>} An observable containing the boarding process details.
337
733
  */
338
734
  getBoardingProcess(id) {
339
- return this.http.get(`${this.url}/boarding-process/${id}`).pipe(map(({ data }) => data));
735
+ return this.http.get(`${this.url}/boarding-process/${id}`)
736
+ .pipe(map(({ data }) => data));
737
+ }
738
+ /**
739
+ * Fetches a list of systems based on the provided query parameters.
740
+ *
741
+ * @param {QueryParams} params - The parameters used to filter the systems.
742
+ * @return {Observable<SystemsOut>} An observable that emits the retrieved systems data.
743
+ */
744
+ getSystems(params) {
745
+ return this.http.get(`${this.url}/systems`, { params })
746
+ .pipe(map(({ data }) => data));
747
+ }
748
+ /**
749
+ * Retrieves the system by the specified ID.
750
+ *
751
+ * @param {number} id - The unique identifier of the system to be retrieved.
752
+ * @return {Observable<SystemOut>} An observable that emits the requested system information.
753
+ */
754
+ getSystem(id) {
755
+ return this.http.get(`${this.url}/systems/${id}`)
756
+ .pipe(map(({ data }) => data));
757
+ }
758
+ /**
759
+ * Sends a POST request to create or update a system.
760
+ *
761
+ * @param {SystemIn} body - The data representing the system to be created or updated.
762
+ * @return {Observable<SystemOut>} An observable emitting the resulting system output after the API request succeeds.
763
+ */
764
+ postSystem(body) {
765
+ return this.http.post(`${this.url}/systems`, body)
766
+ .pipe(map(({ data }) => data));
767
+ }
768
+ /**
769
+ * Updates the system identified by the given ID with the provided request body and returns the updated system details.
770
+ *
771
+ * @param {number} id - The unique identifier of the system to be updated.
772
+ * @param {SystemIn} body - The payload containing the updated system details.
773
+ * @return {Observable<SystemOut>} An observable emitting the updated system data.
774
+ */
775
+ putSystem(id, body) {
776
+ return this.http.post(`${this.url}/systems/${id}`, body)
777
+ .pipe(map(({ data }) => data));
778
+ }
779
+ /**
780
+ * Retrieves a list of system entities based on the specified query parameters.
781
+ *
782
+ * @param {QueryParams} params - The query parameters used to filter or specify the system entities to retrieve.
783
+ * @return {Observable<SystemEntitiesOut>} An Observable that emits the retrieved system entities.
784
+ */
785
+ getSystemEntities(params) {
786
+ return this.http.get(`${this.url}/system-entities`, { params })
787
+ .pipe(map(({ data }) => data));
788
+ }
789
+ /**
790
+ * Updates the system entities by sending the provided data to the server.
791
+ *
792
+ * @param {SystemEntitiesIn} body - The data object representing the system entities to be updated.
793
+ * @return {Observable<SystemEntitiesOut>} An observable containing the updated system entities data.
794
+ */
795
+ putSystemEntities(body) {
796
+ return this.http.put(`${this.url}/system-entities`, body)
797
+ .pipe(map(({ data }) => data));
798
+ }
799
+ /**
800
+ * Retrieves workflow configurations based on the provided query parameters.
801
+ *
802
+ * @param {QueryParams} params - The query parameters to filter the workflow configurations.
803
+ * @return {Observable<WorkflowConfigsOut>} An observable emitting the workflow configurations.
804
+ */
805
+ getWorkflowConfigs(params) {
806
+ return this.http.get(`${this.url}/workflow-configs`, { params })
807
+ .pipe(map(({ data }) => data));
808
+ }
809
+ /**
810
+ * Sends a batch of workflow configuration data to the server for processing.
811
+ *
812
+ * @param {WorkflowConfigsBatchIn} body - The input data containing a batch of workflow configurations to be sent.
813
+ * @return {Observable<WorkflowConfigsOut>} An observable that emits the processed batch of workflow configuration data as a response.
814
+ */
815
+ postWorkflowConfigsBatch(body) {
816
+ return this.http.post(`${this.url}/workflow-configs/batch`, body)
817
+ .pipe(map(({ data }) => data));
818
+ }
819
+ /**
820
+ * Sends a POST request to create a new company and returns the created company's details.
821
+ *
822
+ * @param {CompanyIn} body - The payload containing the details of the company to be created.
823
+ * @return {Observable<CompanyOut>} An Observable emitting the response with the created company's details.
824
+ */
825
+ postCompany(body) {
826
+ return this.http.post(`${this.url}/companies`, body)
827
+ .pipe(map(({ data }) => data));
828
+ }
829
+ /**
830
+ * Updates the details of an existing company using its ID.
831
+ *
832
+ * @param {number} id - The unique identifier of the company to update.
833
+ * @param {CompanyIn} body - The object containing the updated company data.
834
+ * @return {Observable<CompanyOut>} An observable that emits the updated company details.
835
+ */
836
+ putCompany(id, body) {
837
+ return this.http.put(`${this.url}/companies/${id}`, body)
838
+ .pipe(map(({ data }) => data));
839
+ }
840
+ /**
841
+ * Deletes a company by its unique identifier.
842
+ *
843
+ * @param {number} id - The unique identifier of the company to be deleted.
844
+ * @return {Observable<{}>} An observable that emits an empty object upon successful deletion or an error if the operation fails.
845
+ */
846
+ deleteCompany(id) {
847
+ return this.http.delete(`${this.url}/companies/${id}`)
848
+ .pipe(map(({ data }) => data));
849
+ }
850
+ /**
851
+ * Fetches product entities from the server based on the provided query parameters.
852
+ *
853
+ * @param {QueryParams} params The query parameters used to modify the request for product entities.
854
+ * @return {Observable<ProductEntitiesOut>} An observable that emits the product entities retrieved from the server.
855
+ */
856
+ getProductEntities(params) {
857
+ return this.http.get(`${this.url}/product-entities`, { params })
858
+ .pipe(map(({ data }) => data));
859
+ }
860
+ /**
861
+ * Sends a PUT request to update product entities and returns the updated entity.
862
+ *
863
+ * @param {ProductEntitiesIn} body - The payload containing the data to update the product entity.
864
+ * @return {Observable<ProductEntitiesOut>} Observable that emits the updated product entity.
865
+ */
866
+ putProductEntities(body) {
867
+ return this.http.put(`${this.url}/product-entities`, body)
868
+ .pipe(map(({ data }) => data));
869
+ }
870
+ /**
871
+ * Retrieves the country reference products based on the given query parameters.
872
+ *
873
+ * @param {QueryParams} params The query parameters used to filter and retrieve the country reference products.
874
+ * @return {Observable<CountryReferenceProductsOut>} An observable emitting the fetched country reference products data.
875
+ */
876
+ getCountryReferenceProducts(params) {
877
+ return this.http.get(`${this.url}/country-reference-products`, { params })
878
+ .pipe(map(({ data }) => data));
879
+ }
880
+ /**
881
+ * Sends a request to update or create country reference products.
882
+ *
883
+ * @param {CountryReferenceProductIn} body - The payload containing the details of the country reference products to post.
884
+ * @return {Observable<CountryReferenceProductOut>} An observable that emits the updated or created country reference product data.
885
+ */
886
+ postCountryReferenceProducts(body) {
887
+ return this.http.put(`${this.url}/country-reference-products`, body)
888
+ .pipe(map(({ data }) => data));
889
+ }
890
+ /**
891
+ * Updates a country reference product with the specified ID using the provided data.
892
+ *
893
+ * @param {number} id - The unique identifier of the country reference product to update.
894
+ * @param {CountryReferenceProductIn} body - The updated country reference product data to be sent in the request body.
895
+ * @return {Observable<CountryReferenceProductOut>} An observable emitting the updated country reference product.
896
+ */
897
+ putCountryReferenceProducts(id, body) {
898
+ return this.http.put(`${this.url}/country-reference-products/${id}`, body)
899
+ .pipe(map(({ data }) => data));
900
+ }
901
+ /**
902
+ * Fetches the extra charge entities from the server based on the provided query parameters.
903
+ *
904
+ * @param {QueryParams} params - An object containing the query parameters to filter the extra charge entities.
905
+ * @return {Observable<ExtraChargeEntitiesOut>} An observable that emits the extra charge entities retrieved from the server.
906
+ */
907
+ getExtraChargeEntities(params) {
908
+ return this.http.get(`${this.url}/extracharge-entities`, { params })
909
+ .pipe(map(({ data }) => data));
910
+ }
911
+ /**
912
+ * Updates extra charge entities by sending the provided data to the server.
913
+ *
914
+ * @param {ExtraChargeEntitiesIn} body - The data to update the extra charge entities.
915
+ * @return {Observable<ExtraChargeEntitiesOut>} An observable that emits the updated extra charge entities.
916
+ */
917
+ putExtraChargeEntities(body) {
918
+ return this.http.put(`${this.url}/extracharge-entities`, body)
919
+ .pipe(map(({ data }) => data));
920
+ }
921
+ /**
922
+ * Retrieves the parameter configurations based on the provided query parameters.
923
+ *
924
+ * @param {QueryParams} params - The query parameters to filter the parameter configurations.
925
+ * @return {Observable<ParameterConfigsOut>} An observable that emits the parameter configurations data.
926
+ */
927
+ getParameterConfigs(params) {
928
+ return this.http.get(`${this.url}/parameter-configs`, { params })
929
+ .pipe(map(({ data }) => data));
930
+ }
931
+ /**
932
+ * Submits a configuration for parameters to the server.
933
+ *
934
+ * @param {ParameterConfigIn} body - The input configuration object containing the parameters to be submitted.
935
+ * @return {Observable<ParameterConfigOut>} An observable emitting the server's response containing the updated parameter configuration.
936
+ */
937
+ postParameterConfig(body) {
938
+ return this.http.delete(`${this.url}/parameter-configs`)
939
+ .pipe(map(({ data }) => data));
940
+ }
941
+ /**
942
+ * Updates the configuration of a parameter with the provided ID and input data.
943
+ *
944
+ * @param {number} id - The unique identifier of the parameter configuration to be updated.
945
+ * @param {ParameterConfigIn} body - The input data containing the updated configuration for the parameter.
946
+ * @return {Observable<ParameterConfigOut>} An observable that emits the updated parameter configuration.
947
+ */
948
+ putParameterConfig(id, body) {
949
+ return this.http.delete(`${this.url}/parameter-configs/${id}`)
950
+ .pipe(map(({ data }) => data));
951
+ }
952
+ /**
953
+ * Deletes a parameter configuration specified by its ID.
954
+ *
955
+ * @param {number} id - The unique identifier of the parameter configuration to be deleted.
956
+ * @return {Observable<ParameterConfigOut>} An observable containing the deleted parameter configuration data.
957
+ */
958
+ deleteParameterConfig(id) {
959
+ return this.http.delete(`${this.url}/parameter-configs/${id}`)
960
+ .pipe(map(({ data }) => data));
340
961
  }
341
962
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiCompaniesService, deps: [{ token: 'env' }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
342
963
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApiCompaniesService, providedIn: 'root' });
@@ -350,4 +971,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
350
971
  type: Inject,
351
972
  args: ['env']
352
973
  }] }, { type: i1.HttpClient }] });
353
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbXBhbmllcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXhwZXJ0ZWFtLW14L25neC1zZXJ2aWNlcy9zcmMvbGliL2FwaXMvYXBpLWNvbXBhbmllcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBZ0NsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQWMsTUFBTSxNQUFNLENBQUE7OztBQU0xRCxNQUFNLE9BQU8sbUJBQW1CO0lBRUw7SUFDZjtJQUZWLFlBQ3lCLFlBQXlCLEVBQ3hDLElBQWdCO1FBREQsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUN0QixDQUFDO0lBRUw7Ozs7T0FJRztJQUNILElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFBO0lBQ2hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFFLE1BQW1CO1FBQ25DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQStCLEdBQUcsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUU7WUFDOUUsTUFBTTtTQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUUsRUFBVTtRQUN6QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUE4QixHQUFHLElBQUksQ0FBQyxHQUFHLGtCQUFrQixFQUFFLEVBQUUsQ0FBQzthQUNqRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJ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OUQsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRTtZQUMxQixZQUFZLEVBQUUsTUFBTTtTQUNyQixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FBRSxFQUFTO1FBQzNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWdDLEdBQUcsSUFBSSxDQUFDLEdBQUcscUJBQXFCLEVBQUUsRUFBRSxDQUN2RixDQUFDLElBQUksQ0FDSixHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDeEIsQ0FBQTtJQUNILENBQUM7d0dBNVlVLG1CQUFtQixrQkFFcEIsS0FBSzs0R0FGSixtQkFBbUIsY0FGbEIsTUFBTTs7NEZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBR0ksTUFBTTsyQkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9uZ3gtc2VydmljZXMubW9kZWxzJ1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXHJcbmltcG9ydCB7XHJcbiAgQWNjb3VudEVudGl0aWVzQWN0aXZlc091dCxcclxuICBCb2FyZGluZ1Byb2Nlc3NJZEluLFxyXG4gIEJvYXJkaW5nUHJvY2Vzc0luLFxyXG4gIENvbXBhbnlDb3VudHJpZXNPdXQsXHJcbiAgQ29tcGFueUNvdW50cnlPdXQsXHJcbiAgQ29tcGFueUNvdW50cnlUYXhlc091dCxcclxuICBDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY2llc091dCxcclxuICBDb3VudHJ5UmVmZXJlbmNlT3V0LFxyXG4gIENvdW50cnlSZWZlcmVuY2VzT3V0LFxyXG4gIEVtcGxveWVlQ3VzdG9tZXJzSW4sXHJcbiAgRW1wbG95ZWVDdXN0b21lcnNPdXQsXHJcbiAgRW1wbG95ZWVPdXQsXHJcbiAgRW1wbG95ZWVzQ3VzdG9tZXJzT3V0LFxyXG4gIEVtcGxveWVlc091dCxcclxuICBFeGNoYW5nZXNPdXQsXHJcbiAgSW5zdGFsbGF0aW9uT3V0LFxyXG4gIEluc3RhbGxhdGlvbnNPdXQsXHJcbiAgTG9jYXRpb25FbXBsb3llZXNPdXQsXHJcbiAgTG9jYXRpb25PdXQsXHJcbiAgTG9jYXRpb25zT3V0LFxyXG4gIFBhcmFtZXRlcnNJbixcclxuICBQYXJhbWV0ZXJzVmFsdWVzT3V0LFxyXG4gIFBhcmFtZXRlclZhbHVlSW4sXHJcbiAgUGFyYW1ldGVyVmFsdWVPdXQsXHJcbiAgU3VwcGx5RW50aXRpZXNBY3RpdmVzT3V0LFxyXG4gIFdvcmtmbG93c091dFxyXG59IGZyb20gJy4vbW9kZWxzL2FwaS1jb21wYW5pZXMudHlwZXMnXHJcbmltcG9ydCB7IEFwaVN1Y2Nlc3MsIFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi9tb2RlbHMvYXBpLm1vZGVscydcclxuaW1wb3J0IHsgZm9ya0pvaW4sIG1hcCwgbWVyZ2VNYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBDb3VudHJ5Q3VycmVuY3lSYXRlLCBFbXBsb3llZUN1c3RvbWVyRGhsLCB9IGZyb20gJy4vbW9kZWxzL2FwaS1jb21wYW5pZXMuaW50ZXJmYWNlcydcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwaUNvbXBhbmllc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yIChcclxuICAgIEBJbmplY3QoJ2VudicpIHByaXZhdGUgZW52aXJvbm1lbnRzOiBFbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgVVJMIGZvciB0aGUgY29tcGFuaWVzIEFQSSBmcm9tIHRoZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9ucy5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVSTCBvZiB0aGUgY29tcGFuaWVzIEFQSS5cclxuICAgKi9cclxuICBnZXQgdXJsICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRzLmFwaUNvbXBhbmllc1VybCA/PyAnJ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyB0aGUgaW5zdGFsbGF0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnN0YWxsYXRpb25zIHF1ZXJ5LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8SW5zdGFsbGF0aW9uc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgaW5zdGFsbGF0aW9uJ3MgZGF0YS5cclxuICAgKi9cclxuICBnZXRJbnN0YWxsYXRpb25zIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxJbnN0YWxsYXRpb25zT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEluc3RhbGxhdGlvbnNPdXQ+PihgJHt0aGlzLnVybH0vaW5zdGFsbGF0aW9uc2AsIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgaW5zdGFsbGF0aW9uIGRldGFpbHMgYmFzZWQgb24gdGhlIGdpdmVuIGluc3RhbGxhdGlvbiBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFsbGF0aW9uIHRvIHJldHJpZXZlLlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEluc3RhbGxhdGlvbk91dD59IEFuIG9ic2VydmFibGUgb2YgdGhlIGluc3RhbGxhdGlvbiBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIGdldEluc3RhbGxhdGlvbiAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8SW5zdGFsbGF0aW9uT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEluc3RhbGxhdGlvbk91dD4+KGAke3RoaXMudXJsfS9pbnN0YWxsYXRpb25zLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGxvY2F0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgcXVlcnlpbmcgbG9jYXRpb25zLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG9jYXRpb25zT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBsb2NhdGlvbidzIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0TG9jYXRpb25zIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxMb2NhdGlvbnNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8TG9jYXRpb25zT3V0Pj4oYCR7dGhpcy51cmx9L2xvY2F0aW9uc2AsIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGxvY2F0aW9uIGRldGFpbHMgZm9yIGEgZ2l2ZW4gbG9jYXRpb24gSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGxvY2F0aW9uLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG9jYXRpb25PdXQ+fSBBbiBPYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGxvY2F0aW9uIGRldGFpbHMuXHJcbiAgICovXHJcbiAgZ2V0TG9jYXRpb24gKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPExvY2F0aW9uT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPExvY2F0aW9uT3V0Pj4oYCR7dGhpcy51cmx9L2xvY2F0aW9ucy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBhY3RpdmUgc3VwcGx5IGVudGl0aWVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIHN1cHBseSBlbnRpdGllcy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFN1cHBseUVudGl0aWVzQWN0aXZlc091dD59IE9ic2VydmFibGUgZW1pdHRpbmcgc3VwcGx5IGVudGl0aWVzIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0U3VwcGx5RW50aXRpZXNBY3RpdmVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxTdXBwbHlFbnRpdGllc0FjdGl2ZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8U3VwcGx5RW50aXRpZXNBY3RpdmVzT3V0Pj4oYCR7dGhpcy51cmx9L3N1cHBseS1lbnRpdGllcy9hY3RpdmVzYCwge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICB9KS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBhIGxpc3Qgb2YgZW1wbG95ZWVzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGZpbHRlciBhbmQgc29ydCB0aGUgZW1wbG95ZWVzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RW1wbG95ZWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBsaXN0IG9mIGVtcGxveWVlcy5cclxuICAgKi9cclxuICBnZXRFbXBsb3llZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEVtcGxveWVlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxFbXBsb3llZXNPdXQ+PihgJHt0aGlzLnVybH0vZW1wbG95ZWVzYCwge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICB9KS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBhbiBlbXBsb3llZSdzIGRldGFpbHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGVtcGxveWVlIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBlbXBsb3llZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEVtcGxveWVlT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBlbXBsb3llZSdzIGRldGFpbHMuXHJcbiAgICovXHJcbiAgZ2V0RW1wbG95ZWUgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPEVtcGxveWVlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEVtcGxveWVlT3V0Pj4oYCR7dGhpcy51cmx9L2VtcGxveWVlcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGVtcGxveWVlcyBmb3IgYSBzcGVjaWZpZWQgbG9jYXRpb24gYmFzZWQgb24gcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIGFuZCByZXRyaWV2ZSB0aGUgbG9jYXRpb24gZW1wbG95ZWVzLlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPExvY2F0aW9uRW1wbG95ZWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBsaXN0IG9mIGVtcGxveWVlcyBmb3IgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cclxuICAgKi9cclxuICBnZXRMb2NhdGlvbkVtcGxveWVlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8TG9jYXRpb25FbXBsb3llZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8TG9jYXRpb25FbXBsb3llZXNPdXQ+PihgJHt0aGlzLnVybH0vbG9jYXRpb24tZW1wbG95ZWVzYCwge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICB9KS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBjb3VudHJpZXMgd2hlcmUgdGhlIGNvbXBhbnkgb3BlcmF0ZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhlIEFQSSByZXF1ZXN0LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q29tcGFueUNvdW50cmllc091dD59IEFuIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiBjb21wYW55IGNvdW50cmllcy5cclxuICAgKi9cclxuICBnZXRDb21wYW55Q291bnRyaWVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxDb21wYW55Q291bnRyaWVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPENvbXBhbnlDb3VudHJpZXNPdXQ+PihgJHt0aGlzLnVybH0vY29tcGFueS1jb3VudHJpZXNgLCB7XHJcbiAgICAgIHBhcmFtcyxcclxuICAgIH0pLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIGNvdW50cnkgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWVkIGNvbXBhbnkgYnkgaXRzIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21wYW55LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q29tcGFueUNvdW50cnlPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGNvdW50cnkgaW5mb3JtYXRpb24gb2YgdGhlIGNvbXBhbnkuXHJcbiAgICovXHJcbiAgZ2V0Q29tcGFueUNvdW50cnkgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbXBhbnlDb3VudHJ5T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPENvbXBhbnlDb3VudHJ5T3V0Pj4oYCR7dGhpcy51cmx9L2NvbXBhbnktY291bnRyaWVzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSByZWZlcmVuY2UgY3VycmVuY2llcyBmb3IgYSBnaXZlbiBjb3VudHJ5LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VDdXJyZW5jaWVzT3V0Pn0gVGhlIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgY291bnRyeSByZWZlcmVuY2UgY3VycmVuY2llcyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldENvdW50cnlSZWZlcmVuY2VDdXJyZW5jaWVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY2llc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY2llc091dD4+KFxyXG4gICAgICBgJHt0aGlzLnVybH0vY291bnRyeS1yZWZlcmVuY2UtY3VycmVuY2llc2AsXHJcbiAgICAgIHsgcGFyYW1zIH1cclxuICAgICkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgY3VycmVuY2llcyBmb3IgZGlmZmVyZW50IGNvdW50cmllcyBhbG9uZyB3aXRoIHRoZWlyIGN1cnJlbnQgZXhjaGFuZ2UgcmF0ZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB1c2VkIHRvIGZldGNoIHRoZSBjb3VudHJ5IHJlZmVyZW5jZSBjdXJyZW5jaWVzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q291bnRyeUN1cnJlbmN5UmF0ZVtdPn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGFycmF5IG9mIGNvdW50cnkgY3VycmVuY3kgcmF0ZXMuXHJcbiAgICovXHJcbiAgZ2V0Q291bnRyeUN1cnJlbmNpZXNXaXRoUmF0ZSAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8Q291bnRyeUN1cnJlbmN5UmF0ZVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY2llcyhwYXJhbXMpXHJcbiAgICAgIC5waXBlKG1lcmdlTWFwKChjdXJyZW5jaWVzRGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRvYnNlcnZhYmxlcyA9IGN1cnJlbmNpZXNEYXRhLmNvdW50cnlfcmVmZXJlbmNlX2N1cnJlbmNpZXNcclxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q3VycmVudEV4Y2hhbmdlcyh7XHJcbiAgICAgICAgICAgICAgY3VycmVuY3lfaWQ6IGl0ZW0uY3VycmVuY3kuaWQsXHJcbiAgICAgICAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgbWFwKChleGNoYW5nZXNEYXRhKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICAgIHJhdGU6IGV4Y2hhbmdlc0RhdGEuZXhjaGFuZ2VzWzBdPy52YWx1ZSxcclxuICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKVxyXG5cclxuICAgICAgICByZXR1cm4gZm9ya0pvaW4oJG9ic2VydmFibGVzKVxyXG4gICAgICB9KSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgZXhjaGFuZ2UgZGF0YSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIGV4Y2hhbmdlIGRhdGEuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFeGNoYW5nZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGV4Y2hhbmdlIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0RXhjaGFuZ2VzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxFeGNoYW5nZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8RXhjaGFuZ2VzT3V0Pj4oYCR7dGhpcy51cmx9L2V4Y2hhbmdlc2AsIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBleGNoYW5nZXMgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgdGhlIGV4Y2hhbmdlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEV4Y2hhbmdlc091dD59IC0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBBUEkgcmVzcG9uc2UgZGF0YSBjb250YWluaW5nIHRoZSBjdXJyZW50IGV4Y2hhbmdlcy5cclxuICAgKi9cclxuICBnZXRDdXJyZW50RXhjaGFuZ2VzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxFeGNoYW5nZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8RXhjaGFuZ2VzT3V0Pj4oYCR7dGhpcy51cmx9L2V4Y2hhbmdlcy9jdXJyZW50YCwge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICB9KS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyB0aGUgY291bnRyeS1zcGVjaWZpYyB0YXggaW5mb3JtYXRpb24gZm9yIGEgY29tcGFueS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIGFuZCBxdWVyeSB0aGUgdGF4ZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb21wYW55Q291bnRyeVRheGVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB0YXggaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgZ2V0Q29tcGFueUNvdW50cnlUYXhlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8Q29tcGFueUNvdW50cnlUYXhlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDb21wYW55Q291bnRyeVRheGVzT3V0Pj4oYCR7dGhpcy51cmx9L2NvbXBhbnktY291bnRyeS10YXhlc2AsIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBhY3RpdmUgYWNjb3VudCBlbnRpdGllcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGZpbHRlciBhbmQgcXVlcnkgYWN0aXZlIGFjY291bnQgZW50aXRpZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxBY2NvdW50RW50aXRpZXNBY3RpdmVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBsaXN0IG9mIGFjdGl2ZSBhY2NvdW50IGVudGl0aWVzLlxyXG4gICAqL1xyXG4gIGdldEFjY291bnRFbnRpdGllc0FjdGl2ZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEFjY291bnRFbnRpdGllc0FjdGl2ZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8QWNjb3VudEVudGl0aWVzQWN0aXZlc091dD4+KGAke3RoaXMudXJsfS9hY2NvdW50LWVudGl0aWVzL2FjdGl2ZXNgLCB7XHJcbiAgICAgIHBhcmFtcyxcclxuICAgIH0pLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlciBuYW1lcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXJhbXMucGFyYW1OYW1lcyAtIEFuIGFycmF5IG9mIHBhcmFtZXRlciBuYW1lcyBmb3Igd2hpY2ggdGhlIHZhbHVlcyBuZWVkIHRvIGJlIGZldGNoZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYXJhbWV0ZXJzVmFsdWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBmZXRjaGVkIHBhcmFtZXRlciB2YWx1ZXMuXHJcbiAgICovXHJcbiAgZ2V0UGFyYW1ldGVyc1ZhbHVlcyAoe1xyXG4gICAgcGFyYW1OYW1lcyxcclxuICB9OiBQYXJhbWV0ZXJzSW4pOiBPYnNlcnZhYmxlPFBhcmFtZXRlcnNWYWx1ZXNPdXQ+IHtcclxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJhbU5hbWVzLm1hcCgocCkgPT4gKHsgbmFtZTogcCB9KSlcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxQYXJhbWV0ZXJzVmFsdWVzT3V0Pj4oYCR7dGhpcy51cmx9L3BhcmFtZXRlcnMtdmFsdWVzYCwge1xyXG4gICAgICBwYXJhbWV0ZXJzXHJcbiAgICB9KS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwYXJhbWV0ZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5wYXJhbU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGlzIHRvIGJlIHJldHJpZXZlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFBhcmFtZXRlclZhbHVlT3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIuXHJcbiAgICovXHJcbiAgZ2V0UGFyYW1ldGVyVmFsdWUgKHtcclxuICAgIHBhcmFtTmFtZSxcclxuICB9OiBQYXJhbWV0ZXJWYWx1ZUluKTogT2JzZXJ2YWJsZTxQYXJhbWV0ZXJWYWx1ZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxQYXJhbWV0ZXJWYWx1ZU91dD4+KGAke3RoaXMudXJsfS9wYXJhbWV0ZXJzLXZhbHVlcy8ke3BhcmFtTmFtZX1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgY291bnRyeSByZWZlcmVuY2VzIGJhc2VkIG9uIHRoZSBnaXZlbiBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgY291bnRyeSByZWZlcmVuY2VzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q291bnRyeVJlZmVyZW5jZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGNvdW50cnkgcmVmZXJlbmNlIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0Q291bnRyeVJlZmVyZW5jZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPENvdW50cnlSZWZlcmVuY2VzT3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcmVmZXJlbmNlc2AsIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGNvdW50cnkgcmVmZXJlbmNlIGRhdGEgZm9yIGEgZ2l2ZW4gY291bnRyeSBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY291bnRyeSBmb3Igd2hpY2ggdGhlIHJlZmVyZW5jZSBkYXRhIGlzIHRvIGJlIHJldHJpZXZlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGNvdW50cnkgcmVmZXJlbmNlIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0Q291bnRyeVJlZmVyZW5jZSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8Q291bnRyeVJlZmVyZW5jZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDb3VudHJ5UmVmZXJlbmNlT3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcmVmZXJlbmNlcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyB0aGUgbGlzdCBvZiB3b3JrZmxvd3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB1c2VkIHRvIGZpbHRlciB3b3JrZmxvd3MuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxXb3JrZmxvd3NPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHdvcmtmbG93IGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0V29ya2Zsb3dzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxXb3JrZmxvd3NPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8V29ya2Zsb3dzT3V0Pj4oYCR7dGhpcy51cmx9L3dvcmtmbG93c2AsIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgZW1wbG95ZWUgY3VzdG9tZXJcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIGVtcGxveWVlIGN1c3RvbWVycy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBlbXBsb3llZSBjdXN0b21lciBkYXRhLlxyXG4gICAqL1xyXG4gIGdldEVtcGxveWVlc0N1c3RvbWVycyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8RW1wbG95ZWVzQ3VzdG9tZXJzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEVtcGxveWVlc0N1c3RvbWVyc091dD4+KGAke3RoaXMudXJsfS9lbXBsb3llZS1jdXN0b21lcnNgLCB7XHJcbiAgICAgIHBhcmFtcyxcclxuICAgIH0pLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgb3IgdXBkYXRlIGVtcGxveWVlIGN1c3RvbWVyIHJlY29yZHMgYW5kIHByb2Nlc3NlcyB0aGUgc2VydmVyIHJlc3BvbnNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFbXBsb3llZUN1c3RvbWVyc0lufSBib2R5IC0gVGhlIHJlcXVlc3QgcGF5bG9hZCBjb250YWluaW5nIGVtcGxveWVlIGN1c3RvbWVyIGRhdGEgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RW1wbG95ZWVDdXN0b21lcnNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVwZGF0ZWQgZW1wbG95ZWUgY3VzdG9tZXIgZGF0YSBvbiBzdWNjZXNzZnVsIHJlc3BvbnNlLlxyXG4gICAqL1xyXG4gIHBvc3RFbXBsb3llZUN1c3RvbWVycyAoYm9keTogRW1wbG95ZWVDdXN0b21lcnNJbikge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8RW1wbG95ZWVDdXN0b21lcnNPdXQ+PihgJHt0aGlzLnVybH0vZW1wbG95ZWUtY3VzdG9tZXJzYCxcclxuICAgICAgYm9keVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgZW1wbG95ZWUtY3VzdG9tZXIgYXNzb2NpYXRpb24gcmVjb3JkIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIElEIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgZW1wbG95ZWUtY3VzdG9tZXIgcmVjb3JkIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge0VtcGxveWVlQ3VzdG9tZXJzSW59IGJvZHkgLSBUaGUgZGF0YSB0byB1cGRhdGUgdGhlIGVtcGxveWVlLWN1c3RvbWVyIHJlY29yZCB3aXRoLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RW1wbG95ZWVDdXN0b21lcnNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVwZGF0ZWQgZW1wbG95ZWUtY3VzdG9tZXIgZGF0YS5cclxuICAgKi9cclxuICBwdXRFbXBsb3llZUN1c3RvbWVycyAoaWQ6IG51bWJlciwgYm9keTogRW1wbG95ZWVDdXN0b21lcnNJbikge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxFbXBsb3llZUN1c3RvbWVyc091dD4+KGAke3RoaXMudXJsfS9lbXBsb3llZS1jdXN0b21lcnMvJHtpZH1gLCBib2R5XHJcbiAgICApLnBpcGUoXHJcbiAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBlbXBsb3llZS1jdXN0b21lciBkZXRhaWxzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBlbXBsb3llZSBjdXN0b21lciBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBlbXBsb3llZS1jdXN0b21lciByZWNvcmQgdG8gdXBkYXRlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RW1wbG95ZWVDdXN0b21lcnNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVwZGF0ZWQgZW1wbG95ZWUtY3VzdG9tZXIgZGF0YS5cclxuICAgKi9cclxuICBnZXRFbXBsb3llZUN1c3RvbWVyIChpZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pj4oYCR7dGhpcy51cmx9L2VtcGxveWVlLWN1c3RvbWVycy8ke2lkfWBcclxuICAgICkucGlwZShcclxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSlcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYW4gZW1wbG95ZWUgY3VzdG9tZXIncyBhY3RpdmUgc3RhdGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0VtcGxveWVlQ3VzdG9tZXJEaGx9IGVtcGxveWVlIC0gVGhlIGVtcGxveWVlIGN1c3RvbWVyIG9iamVjdCB0byBiZSB1cGRhdGVkLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzQWN0aXZlXSAtIE9wdGlvbmFsIHBhcmFtZXRlciB0byBleHBsaWNpdGx5IHNldCB0aGUgYWN0aXZlIHN0YXRlLlxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBudWxsIG9yIHVuZGVmaW5lZCwgdGhlIGFjdGl2ZSBzdGF0ZSB3aWxsIGJlIHRvZ2dsZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD59IEFuIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgdXBkYXRlZCBlbXBsb3llZSBjdXN0b21lciBvdXRwdXQuXHJcbiAgICovXHJcbiAgZW5hYmxlRGlzYWJsZUVtcGxveWVlQ3VzdG9tZXJzIChlbXBsb3llZTogRW1wbG95ZWVDdXN0b21lckRobCwgaXNBY3RpdmU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxBcGlTdWNjZXNzPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pj4oYCR7dGhpcy51cmx9L2VtcGxveWVlLWN1c3RvbWVycy8ke2VtcGxveWVlLmlkfWAsIHtcclxuICAgICAgaXNfYWN0aXZlOiBpc0FjdGl2ZSA/PyAhZW1wbG95ZWUuaXNfYWN0aXZlXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICBtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0cyBhIGZpbGUgY29udGFpbmluZyBlbXBsb3llZSBjdXN0b21lciBkYXRhIGZvciBhIHNwZWNpZmljIGNvdW50cnkgdG8gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudHJ5SWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgY291bnRyeSBmb3Igd2hpY2ggdGhlIGRhdGEgaXMgYmVpbmcgdXBsb2FkZWQuXHJcbiAgICogQHBhcmFtIHtGaWxlfSBmaWxlIC0gVGhlIGZpbGUgY29udGFpbmluZyBlbXBsb3llZSBjdXN0b21lciBkYXRhIHRvIGJlIHVwbG9hZGVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Qm9hcmRpbmdQcm9jZXNzSWRJbj59IE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcHJvY2Vzc2VkIGJvYXJkaW5nIHByb2Nlc3MgSUQgb24gc3VjY2Vzcy5cclxuICAgKi9cclxuICBwb3N0RW1wbG95ZWVDdXN0b21lcnNMb2FkIChjb3VudHJ5SWQ6IG51bWJlciwgZmlsZTogRmlsZSkge1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxyXG4gICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSlcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnY291bnRyeV9pZCcsIGNvdW50cnlJZC50b1N0cmluZygpKVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8Qm9hcmRpbmdQcm9jZXNzSWRJbj4+KFxyXG4gICAgICBgJHt0aGlzLnVybH0vZW1wbG95ZWUtY3VzdG9tZXJzL2xvYWRgLFxyXG4gICAgICBmb3JtRGF0YVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWRzIGEgZmlsZSBjb250YWluaW5nIGN1c3RvbWVyIGRhdGEgZm9yIGEgc3BlY2lmaWMgZW1wbG95ZWUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvdW50cnkgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIGNvdW50cnkgdXNlZCBhcyBhIGZpbHRlciBmb3IgZmV0Y2hpbmcgdGhlIGVtcGxveWVlJ3MgY3VzdG9tZXJzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QmxvYj59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgZmlsZSBibG9iIGNvbnRhaW5pbmcgdGhlIGN1c3RvbWVyIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0RW1wbG95ZWVDdXN0b21lcnNEb3dubG9hZCAoaWQ6bnVtYmVyKTpPYnNlcnZhYmxlPEJsb2I+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMudXJsfS9lbXBsb3llZS1jdXN0b21lcnMvZG93bmxvYWRgLCB7XHJcbiAgICAgIHBhcmFtczogeyBjb3VudHJ5X2lkOiBpZCB9LFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJ1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgYm9hcmRpbmcgcHJvY2VzcyBkZXRhaWxzIGZvciBhIGdpdmVuIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBib2FyZGluZyBwcm9jZXNzIHRvIHJldHJpZXZlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Qm9hcmRpbmdQcm9jZXNzSW4+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGJvYXJkaW5nIHByb2Nlc3MgZGV0YWlscy5cclxuICAgKi9cclxuICBnZXRCb2FyZGluZ1Byb2Nlc3MgKGlkOm51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxCb2FyZGluZ1Byb2Nlc3NJbj4+KGAke3RoaXMudXJsfS9ib2FyZGluZy1wcm9jZXNzLyR7aWR9YFxyXG4gICAgKS5waXBlKFxyXG4gICAgICBtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKVxyXG4gICAgKVxyXG4gIH1cclxufVxyXG4iXX0=
974
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbXBhbmllcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXhwZXJ0ZWFtLW14L25neC1zZXJ2aWNlcy9zcmMvbGliL2FwaXMvYXBpLWNvbXBhbmllcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBMkVsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQWMsTUFBTSxNQUFNLENBQUE7OztBQVUxRCxNQUFNLE9BQU8sbUJBQW1CO0lBRUw7SUFDZjtJQUZWLFlBQ3lCLFlBQXlCLEVBQ3hDLElBQWdCO1FBREQsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUN0QixDQUFDO0lBRUw7Ozs7T0FJRztJQUNILElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFBO0lBQ2hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFFLE1BQW1CO1FBQ25DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQStCLEdBQUcsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQzthQUN4RixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUUsRUFBVTtRQUN6QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUE4QixHQUFHLElBQUksQ0FBQyxHQUFHLGtCQUFrQixFQUFFLEVBQUUsQ0FBQzthQUNqRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJ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QUFJLENBQUMsTUFBTSxDQUFpQyxHQUFHLElBQUksQ0FBQyxHQUFHLHNCQUFzQixFQUFFLEVBQUUsQ0FBQzthQUMzRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxDQUFDO3dHQS9oQ1UsbUJBQW1CLGtCQUVwQixLQUFLOzRHQUZKLG1CQUFtQixjQUZsQixNQUFNOzs0RkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFHSSxNQUFNOzJCQUFDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL25neC1zZXJ2aWNlcy5tb2RlbHMnXHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcclxuaW1wb3J0IHtcclxuICBBY2NvdW50Q2F0ZWdvcmllc091dCxcclxuICBBY2NvdW50RW50aXRpZXNJbixcclxuICBBY2NvdW50RW50aXRpZXNPdXQsXHJcbiAgQWNjb3VudEluLFxyXG4gIEFjY291bnRPdXQsXHJcbiAgQWNjb3VudHNPdXQsXHJcbiAgQWNjb3VudFR5cGVJbixcclxuICBBY2NvdW50VHlwZU91dCxcclxuICBBY2NvdW50VHlwZXNPdXQsXHJcbiAgQm9hcmRpbmdQcm9jZXNzSWRJbixcclxuICBCb2FyZGluZ1Byb2Nlc3NJbixcclxuICBDb21wYW55Q291bnRyaWVzT3V0LFxyXG4gIENvbXBhbnlDb3VudHJ5SW4sXHJcbiAgQ29tcGFueUNvdW50cnlPdXQsXHJcbiAgQ29tcGFueUNvdW50cnlUYXhlc091dCxcclxuICBDb21wYW55SW4sXHJcbiAgQ29tcGFueU91dCxcclxuICBDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY2llc091dCxcclxuICBDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3lJbixcclxuICBDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3lPdXQsXHJcbiAgQ291bnRyeVJlZmVyZW5jZUV4dHJhQ2hhcmdlSW4sXHJcbiAgQ291bnRyeVJlZmVyZW5jZUV4dHJhQ2hhcmdlT3V0LFxyXG4gIENvdW50cnlSZWZlcmVuY2VJbixcclxuICBDb3VudHJ5UmVmZXJlbmNlT3V0LFxyXG4gIENvdW50cnlSZWZlcmVuY2VQcm9kdWN0SW4sXHJcbiAgQ291bnRyeVJlZmVyZW5jZVByb2R1Y3RPdXQsXHJcbiAgQ291bnRyeVJlZmVyZW5jZVByb2R1Y3RzT3V0LFxyXG4gIENvdW50cnlSZWZlcmVuY2VzT3V0LFxyXG4gIEVtcGxveWVlQ3VzdG9tZXJzSW4sXHJcbiAgRW1wbG95ZWVDdXN0b21lcnNPdXQsXHJcbiAgRW1wbG95ZWVJbixcclxuICBFbXBsb3llZU91dCxcclxuICBFbXBsb3llZXNDdXN0b21lcnNPdXQsXHJcbiAgRW1wbG95ZWVzT3V0LFxyXG4gIEV4Y2hhbmdlSW4sXHJcbiAgRXhjaGFuZ2VPdXQsXHJcbiAgRXhjaGFuZ2VzT3V0LFxyXG4gIEV4dHJhQ2hhcmdlRW50aXRpZXNJbixcclxuICBFeHRyYUNoYXJnZUVudGl0aWVzT3V0LFxyXG4gIEluc3RhbGxhdGlvbkluLFxyXG4gIEluc3RhbGxhdGlvbk91dCxcclxuICBJbnN0YWxsYXRpb25zT3V0LFxyXG4gIExvY2F0aW9uRW1wbG95ZWVCYXRjaEluLFxyXG4gIExvY2F0aW9uRW1wbG95ZWVPdXQsXHJcbiAgTG9jYXRpb25FbXBsb3llZXNPdXQsXHJcbiAgTG9jYXRpb25JbixcclxuICBMb2NhdGlvbk91dCxcclxuICBMb2NhdGlvbnNPdXQsXHJcbiAgUGFyYW1ldGVyQ29uZmlnSW4sXHJcbiAgUGFyYW1ldGVyQ29uZmlnT3V0LFxyXG4gIFBhcmFtZXRlckNvbmZpZ3NPdXQsXHJcbiAgUGFyYW1ldGVyc0J5TGV2ZWxJbixcclxuICBQYXJhbWV0ZXJzT3V0LFxyXG4gIFBhcmFtZXRlcnNWYWx1ZXNJbixcclxuICBQYXJhbWV0ZXJzVmFsdWVzT3V0LFxyXG4gIFBhcmFtZXRlclZhbHVlSW4sXHJcbiAgUGFyYW1ldGVyVmFsdWVPdXQsXHJcbiAgUHJvZHVjdEVudGl0aWVzSW4sXHJcbiAgUHJvZHVjdEVudGl0aWVzT3V0LFxyXG4gIFN1cHBseUVudGl0aWVzSW4sXHJcbiAgU3VwcGx5RW50aXRpZXNPdXQsXHJcbiAgU3lzdGVtRW50aXRpZXNJbixcclxuICBTeXN0ZW1FbnRpdGllc091dCxcclxuICBTeXN0ZW1JbixcclxuICBTeXN0ZW1PdXQsXHJcbiAgU3lzdGVtc091dCxcclxuICBXb3JrZmxvd0NvbmZpZ3NCYXRjaEluLFxyXG4gIFdvcmtmbG93Q29uZmlnc091dCxcclxuICBXb3JrZmxvd3NPdXRcclxufSBmcm9tICcuL21vZGVscy9hcGktY29tcGFuaWVzLnR5cGVzJ1xyXG5pbXBvcnQgeyBBcGlTdWNjZXNzLCBRdWVyeVBhcmFtcyB9IGZyb20gJy4vbW9kZWxzL2FwaS5tb2RlbHMnXHJcbmltcG9ydCB7IGZvcmtKb2luLCBtYXAsIG1lcmdlTWFwLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHtcclxuICBDb3VudHJ5Q3VycmVuY3lSYXRlLFxyXG4gIENvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZSxcclxuICBFbXBsb3llZUN1c3RvbWVyRGhsLFxyXG59IGZyb20gJy4vbW9kZWxzL2FwaS1jb21wYW5pZXMuaW50ZXJmYWNlcydcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwaUNvbXBhbmllc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yIChcclxuICAgIEBJbmplY3QoJ2VudicpIHByaXZhdGUgZW52aXJvbm1lbnRzOiBFbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudFxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgVVJMIGZvciB0aGUgY29tcGFuaWVzIEFQSSBmcm9tIHRoZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9ucy5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVSTCBvZiB0aGUgY29tcGFuaWVzIEFQSS5cclxuICAgKi9cclxuICBnZXQgdXJsICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRzLmFwaUNvbXBhbmllc1VybCA/PyAnJ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyB0aGUgaW5zdGFsbGF0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnN0YWxsYXRpb25zIHF1ZXJ5LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8SW5zdGFsbGF0aW9uc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgaW5zdGFsbGF0aW9uJ3MgZGF0YS5cclxuICAgKi9cclxuICBnZXRJbnN0YWxsYXRpb25zIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxJbnN0YWxsYXRpb25zT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEluc3RhbGxhdGlvbnNPdXQ+PihgJHt0aGlzLnVybH0vaW5zdGFsbGF0aW9uc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBpbnN0YWxsYXRpb24gZGV0YWlscyBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW5zdGFsbGF0aW9uIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YWxsYXRpb24gdG8gcmV0cmlldmUuXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8SW5zdGFsbGF0aW9uT3V0Pn0gQW4gb2JzZXJ2YWJsZSBvZiB0aGUgaW5zdGFsbGF0aW9uIGRldGFpbHMuXHJcbiAgICovXHJcbiAgZ2V0SW5zdGFsbGF0aW9uIChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxJbnN0YWxsYXRpb25PdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8SW5zdGFsbGF0aW9uT3V0Pj4oYCR7dGhpcy51cmx9L2luc3RhbGxhdGlvbnMvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgcG9zdC1pbnN0YWxsYXRpb24gcmVxdWVzdCB0byB0aGUgc2VydmVyIGFuZCByZXRyaWV2ZXMgdGhlIGluc3RhbGxhdGlvbiBkZXRhaWxzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtJbnN0YWxsYXRpb25Jbn0gYm9keSAtIFRoZSBpbnN0YWxsYXRpb24gZGV0YWlscyB0byBiZSBzZW50IGluIHRoZSByZXF1ZXN0IGJvZHkuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxJbnN0YWxsYXRpb25PdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3BvbnNlIGNvbnRhaW5pbmcgaW5zdGFsbGF0aW9uIG91dHB1dCBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHBvc3RJbnN0YWxsYXRpb24gKGJvZHk6IEluc3RhbGxhdGlvbkluKTogT2JzZXJ2YWJsZTxJbnN0YWxsYXRpb25PdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPEluc3RhbGxhdGlvbk91dD4+KGAke3RoaXMudXJsfS9pbnN0YWxsYXRpb25zYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGFuIGV4aXN0aW5nIGluc3RhbGxhdGlvbiByZWNvcmQgYnkgaXRzIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFsbGF0aW9uIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0gYm9keSBUaGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIHVwZGF0ZWQgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uLlxyXG4gICAqIEByZXR1cm4gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB1cGRhdGVkIGluc3RhbGxhdGlvbiBkYXRhIHVwb24gYSBzdWNjZXNzZnVsIHVwZGF0ZS5cclxuICAgKi9cclxuICBwdXRJbnN0YWxsYXRpb24gKGlkOiBudW1iZXIsIGJvZHk6IEluc3RhbGxhdGlvbkluKTogT2JzZXJ2YWJsZTxJbnN0YWxsYXRpb25PdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8SW5zdGFsbGF0aW9uT3V0Pj4oYCR7dGhpcy51cmx9L2luc3RhbGxhdGlvbnMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgYW4gaW5zdGFsbGF0aW9uIGJ5IGl0cyB1bmlxdWUgaWRlbnRpZmllci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFsbGF0aW9uIHRvIGJlIGRlbGV0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTx7fT59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzcG9uc2UgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBkZWxldGVkLlxyXG4gICAqL1xyXG4gIGRlbGV0ZUluc3RhbGxhdGlvbiAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8e30+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPEFwaVN1Y2Nlc3M8e30+PihgJHt0aGlzLnVybH0vaW5zdGFsbGF0aW9ucy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBsb2NhdGlvbnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byB1c2UgZm9yIHF1ZXJ5aW5nIGxvY2F0aW9ucy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPExvY2F0aW9uc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgbG9jYXRpb24ncyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldExvY2F0aW9ucyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8TG9jYXRpb25zT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPExvY2F0aW9uc091dD4+KGAke3RoaXMudXJsfS9sb2NhdGlvbnNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGxvY2F0aW9uIGRldGFpbHMgZm9yIGEgZ2l2ZW4gbG9jYXRpb24gSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGxvY2F0aW9uLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG9jYXRpb25PdXQ+fSBBbiBPYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGxvY2F0aW9uIGRldGFpbHMuXHJcbiAgICovXHJcbiAgZ2V0TG9jYXRpb24gKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPExvY2F0aW9uT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPExvY2F0aW9uT3V0Pj4oYCR7dGhpcy51cmx9L2xvY2F0aW9ucy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSBsb2NhdGlvbiBvYmplY3QgdG8gdGhlIHNlcnZlciBhbmQgcmV0dXJucyB0aGUgY3JlYXRlZCBsb2NhdGlvbiBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtMb2NhdGlvbklufSBib2R5IC0gVGhlIGxvY2F0aW9uIGlucHV0IG9iamVjdCB0byBiZSBzZW50IGluIHRoZSByZXF1ZXN0IGJvZHkuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxMb2NhdGlvbk91dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIGNyZWF0ZWQgbG9jYXRpb24gb3V0cHV0IG9iamVjdC5cclxuICAgKi9cclxuICBwb3N0TG9jYXRpb24gKGJvZHk6IExvY2F0aW9uSW4pOiBPYnNlcnZhYmxlPExvY2F0aW9uT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxMb2NhdGlvbk91dD4+KGAke3RoaXMudXJsfS9sb2NhdGlvbnNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsb2NhdGlvbiB0byBiZSB1cGRhdGVkLlxyXG4gICAqIEBwYXJhbSB7TG9jYXRpb25Jbn0gYm9keSAtIFRoZSB1cGRhdGVkIGxvY2F0aW9uIGRhdGEgdG8gYmUgc2VudCBpbiB0aGUgcmVxdWVzdCBib2R5LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8TG9jYXRpb25PdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHVwZGF0ZWQgbG9jYXRpb24gaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgcHV0TG9jYXRpb24gKGlkOiBudW1iZXIsIGJvZHk6IExvY2F0aW9uSW4pOiBPYnNlcnZhYmxlPExvY2F0aW9uT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPExvY2F0aW9uT3V0Pj4oYCR7dGhpcy51cmx9L2xvY2F0aW9ucy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhIGxvY2F0aW9uIGJ5IGl0cyB1bmlxdWUgaWRlbnRpZmllci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbG9jYXRpb24gdG8gYmUgZGVsZXRlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPHt9Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGVtcHR5IG9iamVjdCB1cG9uIHN1Y2Nlc3NmdWwgZGVsZXRpb24uXHJcbiAgICovXHJcbiAgZGVsZXRlTG9jYXRpb24gKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxBcGlTdWNjZXNzPHt9Pj4oYCR7dGhpcy51cmx9L2xvY2F0aW9ucy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBhY3RpdmUgc3VwcGx5IGVudGl0aWVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIHN1cHBseSBlbnRpdGllcy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFN1cHBseUVudGl0aWVzT3V0Pn0gT2JzZXJ2YWJsZSBlbWl0dGluZyBzdXBwbHkgZW50aXRpZXMgZGF0YS5cclxuICAgKi9cclxuICBnZXRTdXBwbHlFbnRpdGllc0FjdGl2ZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFN1cHBseUVudGl0aWVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFN1cHBseUVudGl0aWVzT3V0Pj4oYCR7dGhpcy51cmx9L3N1cHBseS1lbnRpdGllcy9hY3RpdmVzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgc3VwcGx5IGVudGl0aWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCB0byBmaWx0ZXIgYW5kIGZldGNoIHRoZSBzdXBwbHkgZW50aXRpZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxTdXBwbHlFbnRpdGllc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgc3VwcGx5IGVudGl0aWVzIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0U3VwcGx5RW50aXRpZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFN1cHBseUVudGl0aWVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFN1cHBseUVudGl0aWVzT3V0Pj4oYCR7dGhpcy51cmx9L3N1cHBseS1lbnRpdGllc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgc3VwcGx5IGVudGl0aWVzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXJ2ZXIgYW5kIHJlY2VpdmVzIHRoZSBwcm9jZXNzZWQgc3VwcGx5IGVudGl0aWVzIGRhdGEgaW4gcmVzcG9uc2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1N1cHBseUVudGl0aWVzSW59IGJvZHkgLSBUaGUgc3VwcGx5IGVudGl0aWVzIGRhdGEgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8U3VwcGx5RW50aXRpZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHByb2Nlc3NlZCBzdXBwbHkgZW50aXRpZXMgZGF0YS5cclxuICAgKi9cclxuICBwdXRTdXBwbHlFbnRpdGllcyAoYm9keTogU3VwcGx5RW50aXRpZXNJbik6IE9ic2VydmFibGU8U3VwcGx5RW50aXRpZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPFN1cHBseUVudGl0aWVzT3V0Pj4oYCR7dGhpcy51cmx9L2FjY291bnRzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGEgbGlzdCBvZiBlbXBsb3llZXMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gZmlsdGVyIGFuZCBzb3J0IHRoZSBlbXBsb3llZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFbXBsb3llZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGxpc3Qgb2YgZW1wbG95ZWVzLlxyXG4gICAqL1xyXG4gIGdldEVtcGxveWVlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8RW1wbG95ZWVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEVtcGxveWVlc091dD4+KGAke3RoaXMudXJsfS9lbXBsb3llZXNgLCB7XHJcbiAgICAgIHBhcmFtcyxcclxuICAgIH0pLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGFuIGVtcGxveWVlJ3MgZGV0YWlscyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZW1wbG95ZWUgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGVtcGxveWVlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RW1wbG95ZWVPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGVtcGxveWVlJ3MgZGV0YWlscy5cclxuICAgKi9cclxuICBnZXRFbXBsb3llZSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8RW1wbG95ZWVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8RW1wbG95ZWVPdXQ+PihgJHt0aGlzLnVybH0vZW1wbG95ZWVzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgYSBuZXcgZW1wbG95ZWUgcmVjb3JkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtFbXBsb3llZUlufSBib2R5IC0gVGhlIGRhdGEgb2YgdGhlIGVtcGxveWVlIHRvIGJlIGNyZWF0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFbXBsb3llZU91dD59IEFuIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgY3JlYXRlZCBlbXBsb3llZSBkYXRhLlxyXG4gICAqL1xyXG4gIHBvc3RFbXBsb3llZSAoYm9keTogRW1wbG95ZWVJbik6IE9ic2VydmFibGU8RW1wbG95ZWVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPEVtcGxveWVlT3V0Pj4oYCR7dGhpcy51cmx9L2VtcGxveWVlc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyBhbiBleGlzdGluZyBlbXBsb3llZSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGVtcGxveWVlIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHBhcmFtIHtFbXBsb3llZUlufSBib2R5IC0gVGhlIGVtcGxveWVlIGRhdGEgdG8gdXBkYXRlIHRoZSByZWNvcmQgd2l0aC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEVtcGxveWVlT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB1cGRhdGVkIGVtcGxveWVlIGRhdGEuXHJcbiAgICovXHJcbiAgcHV0RW1wbG95ZWUgKGlkOiBudW1iZXIsIGJvZHk6IEVtcGxveWVlSW4pOiBPYnNlcnZhYmxlPEVtcGxveWVlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPEVtcGxveWVlT3V0Pj4oYCR7dGhpcy51cmx9L2VtcGxveWVlcy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhbiBlbXBsb3llZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGVtcGxveWVlIHRvIGRlbGV0ZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPHt9Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSByZXNwb25zZSBkYXRhIGFmdGVyIHRoZSBlbXBsb3llZSBpcyBkZWxldGVkLlxyXG4gICAqL1xyXG4gIGRlbGV0ZUVtcGxveWVlIChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx7fT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8QXBpU3VjY2Vzczx7fT4+KGAke3RoaXMudXJsfS9lbXBsb3llZXMvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBlbXBsb3llZXMgZm9yIGEgc3BlY2lmaWVkIGxvY2F0aW9uIGJhc2VkIG9uIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB1c2VkIHRvIGZpbHRlciBhbmQgcmV0cmlldmUgdGhlIGxvY2F0aW9uIGVtcGxveWVlcy5cclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxMb2NhdGlvbkVtcGxveWVlc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgbGlzdCBvZiBlbXBsb3llZXMgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXHJcbiAgICovXHJcbiAgZ2V0TG9jYXRpb25FbXBsb3llZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPExvY2F0aW9uRW1wbG95ZWVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPExvY2F0aW9uRW1wbG95ZWVzT3V0Pj4oYCR7dGhpcy51cmx9L2xvY2F0aW9uLWVtcGxveWVlc2AsIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGxvY2F0aW9uIGVtcGxveWVlIGRldGFpbHMgZm9yIGEgZ2l2ZW4gZW1wbG95ZWUgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGVtcGxveWVlIHdob3NlIGxvY2F0aW9uIGRldGFpbHMgYXJlIHRvIGJlIHJldHJpZXZlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPExvY2F0aW9uRW1wbG95ZWVPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGxvY2F0aW9uIGVtcGxveWVlIGRldGFpbHMuXHJcbiAgICovXHJcbiAgZ2V0TG9jYXRpb25FbXBsb3llZSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8TG9jYXRpb25FbXBsb3llZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxMb2NhdGlvbkVtcGxveWVlT3V0Pj4oYCR7dGhpcy51cmx9L2xvY2F0aW9uLWVtcGxveWVlcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhIHNwZWNpZmljIGxvY2F0aW9uIGVtcGxveWVlIGJ5IHRoZWlyIHVuaXF1ZSBpZGVudGlmaWVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBlbXBsb3llZSB0byBiZSBkZWxldGVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8e30+fSAtIEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGFmdGVyIHRoZSBkZWxldGlvbi5cclxuICAgKi9cclxuICBkZWxldGVMb2NhdGlvbkVtcGxveWVlIChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx7fT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8QXBpU3VjY2Vzczx7fT4+KGAke3RoaXMudXJsfS9sb2NhdGlvbi1lbXBsb3llZXMvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgYmF0Y2ggb2YgbG9jYXRpb24tZW1wbG95ZWUgYXNzb2NpYXRpb25zIHRvIHRoZSBzZXJ2ZXIgZm9yIHByb2Nlc3NpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0xvY2F0aW9uRW1wbG95ZWVCYXRjaElufSBib2R5IC0gVGhlIG9iamVjdCBjb250YWluaW5nIGEgYmF0Y2ggb2YgbG9jYXRpb24tZW1wbG95ZWUgZGF0YSB0byBiZSBwb3N0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFbXBsb3llZU91dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHByb2Nlc3NlZCBlbXBsb3llZSBkYXRhIGZyb20gdGhlIHNlcnZlcidzIHJlc3BvbnNlLlxyXG4gICAqL1xyXG4gIHBvc3RMb2NhdGlvbkVtcGxveWVlQmF0Y2ggKGJvZHk6IExvY2F0aW9uRW1wbG95ZWVCYXRjaEluKTogT2JzZXJ2YWJsZTxFbXBsb3llZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8RW1wbG95ZWVPdXQ+PihgJHt0aGlzLnVybH0vbG9jYXRpb24tZW1wbG95ZWVzL2JhdGNoYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGNvdW50cmllcyB3aGVyZSB0aGUgY29tcGFueSBvcGVyYXRlcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgQVBJIHJlcXVlc3QuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb21wYW55Q291bnRyaWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIGNvbXBhbnkgY291bnRyaWVzLlxyXG4gICAqL1xyXG4gIGdldENvbXBhbnlDb3VudHJpZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPENvbXBhbnlDb3VudHJpZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8Q29tcGFueUNvdW50cmllc091dD4+KGAke3RoaXMudXJsfS9jb21wYW55LWNvdW50cmllc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBjb3VudHJ5IGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmllZCBjb21wYW55IGJ5IGl0cyBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29tcGFueS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvbXBhbnlDb3VudHJ5T3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBjb3VudHJ5IGluZm9ybWF0aW9uIG9mIHRoZSBjb21wYW55LlxyXG4gICAqL1xyXG4gIGdldENvbXBhbnlDb3VudHJ5IChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb21wYW55Q291bnRyeU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDb21wYW55Q291bnRyeU91dD4+KGAke3RoaXMudXJsfS9jb21wYW55LWNvdW50cmllcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBjcmVhdGUgYSBjb21wYW55IGNvdW50cnkgZW50cnkgb24gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Q29tcGFueUNvdW50cnlJbn0gYm9keSBUaGUgZGF0YSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb21wYW55IGNvdW50cnkgaW5mb3JtYXRpb24gdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q29tcGFueUNvdW50cnlPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHNlcnZlciByZXNwb25zZSB3aXRoIHRoZSB1cGRhdGVkIG9yIGNyZWF0ZWQgY29tcGFueSBjb3VudHJ5IGRhdGEuXHJcbiAgICovXHJcbiAgcG9zdENvbXBhbnlDb3VudHJ5IChib2R5OiBDb21wYW55Q291bnRyeUluKTogT2JzZXJ2YWJsZTxDb21wYW55Q291bnRyeU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxDb21wYW55Q291bnRyeU91dD4+KGAke3RoaXMudXJsfS9jb21wYW55LWNvdW50cmllc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgY291bnRyeSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBjb21wYW55LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21wYW55IHdob3NlIGNvdW50cnkgaW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgdXBkYXRlZC5cclxuICAgKiBAcGFyYW0ge0NvbXBhbnlDb3VudHJ5SW59IGJvZHkgLSBUaGUgdXBkYXRlZCBjb3VudHJ5IGluZm9ybWF0aW9uIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXBhbnkuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb21wYW55Q291bnRyeU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBjb21wYW55IGNvdW50cnkgaW5mb3JtYXRpb24uXHJcbiAgICovXHJcbiAgcHV0Q29tcGFueUNvdW50cnkgKGlkOiBudW1iZXIsIGJvZHk6IENvbXBhbnlDb3VudHJ5SW4pOiBPYnNlcnZhYmxlPENvbXBhbnlDb3VudHJ5T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPENvbXBhbnlDb3VudHJ5T3V0Pj4oYCR7dGhpcy51cmx9L2NvbXBhbnktY291bnRyaWVzLyR7aWR9YCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIGEgY29tcGFueS1jb3VudHJ5IGFzc29jaWF0aW9uIGJ5IGl0cyB1bmlxdWUgaWRlbnRpZmllci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29tcGFueS1jb3VudHJ5IHJlY29yZCB0byBiZSBkZWxldGVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8e30+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXN1bHQgb2YgdGhlIGRlbGV0ZSBvcGVyYXRpb24uXHJcbiAgICovXHJcbiAgZGVsZXRlQ29tcGFueUNvdW50cnkgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxBcGlTdWNjZXNzPHt9Pj4oYCR7dGhpcy51cmx9L2NvbXBhbnktY291bnRyaWVzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSByZWZlcmVuY2UgY3VycmVuY2llcyBmb3IgYSBnaXZlbiBjb3VudHJ5LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VDdXJyZW5jaWVzT3V0Pn0gVGhlIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgY291bnRyeSByZWZlcmVuY2UgY3VycmVuY2llcyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldENvdW50cnlSZWZlcmVuY2VDdXJyZW5jaWVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY2llc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY2llc091dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXJlZmVyZW5jZS1jdXJyZW5jaWVzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSBjdXJyZW5jeSBkZXRhaWxzIGZvciBhIHNwZWNpZmljIGNvdW50cnkgdXNpbmcgaXRzIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb3VudHJ5LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q291bnRyeVJlZmVyZW5jZUN1cnJlbmN5T3V0Pn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgY291bnRyeSdzIHJlZmVyZW5jZSBjdXJyZW5jeSBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIGdldENvdW50cnlSZWZlcmVuY2VDdXJyZW5jeSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8Q291bnRyeVJlZmVyZW5jZUN1cnJlbmN5T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPENvdW50cnlSZWZlcmVuY2VDdXJyZW5jeU91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXJlZmVyZW5jZS1jdXJyZW5jaWVzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGN1cnJlbmNpZXMgZm9yIGRpZmZlcmVudCBjb3VudHJpZXMgYWxvbmcgd2l0aCB0aGVpciBjdXJyZW50IGV4Y2hhbmdlIHJhdGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCB0byBmZXRjaCB0aGUgY291bnRyeSByZWZlcmVuY2UgY3VycmVuY2llcy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlDdXJyZW5jeVJhdGVbXT59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyBhbiBhcnJheSBvZiBjb3VudHJ5IGN1cnJlbmN5IHJhdGVzLlxyXG4gICAqL1xyXG4gIGdldENvdW50cnlDdXJyZW5jaWVzV2l0aFJhdGUgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPENvdW50cnlDdXJyZW5jeVJhdGVbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q291bnRyeVJlZmVyZW5jZUN1cnJlbmNpZXMocGFyYW1zKVxyXG4gICAgICAucGlwZShtZXJnZU1hcCgoY3VycmVuY2llc0RhdGEpID0+IHtcclxuICAgICAgICBjb25zdCAkb2JzZXJ2YWJsZXMgPSBjdXJyZW5jaWVzRGF0YS5jb3VudHJ5X3JlZmVyZW5jZV9jdXJyZW5jaWVzXHJcbiAgICAgICAgICAubWFwKChpdGVtKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmdldEN1cnJlbnRFeGNoYW5nZXMoe1xyXG4gICAgICAgICAgICAgIGN1cnJlbmN5X2lkOiBpdGVtLmN1cnJlbmN5LmlkLFxyXG4gICAgICAgICAgICB9KS5waXBlKFxyXG4gICAgICAgICAgICAgIG1hcCgoZXhjaGFuZ2VzRGF0YSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgICByYXRlOiBleGNoYW5nZXNEYXRhLmV4Y2hhbmdlc1swXT8udmFsdWUsXHJcbiAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIClcclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKCRvYnNlcnZhYmxlcylcclxuICAgICAgfSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSByZWZlcmVuY2UgY3VycmVuY3kgZm9yIGEgc3BlY2lmaWVkIGNvdW50cnkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50cnkuXHJcbiAgICogQHBhcmFtIHtDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3lJbn0gYm9keSAtIFRoZSBkYXRhIGZvciB1cGRhdGluZyB0aGUgY291bnRyeSdzIHJlZmVyZW5jZSBjdXJyZW5jeS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VDdXJyZW5jeU91dD59IEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHVwZGF0ZWQgY291bnRyeSByZWZlcmVuY2UgY3VycmVuY3kgZGF0YS5cclxuICAgKi9cclxuICBwdXRDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3kgKGlkOiBudW1iZXIsIGJvZHk6IENvdW50cnlSZWZlcmVuY2VDdXJyZW5jeUluKTogT2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3lPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8Q291bnRyeVJlZmVyZW5jZUN1cnJlbmN5T3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcmVmZXJlbmNlLWN1cnJlbmNpZXMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgUE9TVCByZXF1ZXN0IHRvIGNyZWF0ZSBhIGNvdW50cnkgcmVmZXJlbmNlIGN1cnJlbmN5LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3lJbn0gYm9keSAtIFRoZSBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGNvdW50cnkgcmVmZXJlbmNlIGN1cnJlbmN5IGRhdGEuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3lPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBjcmVhdGVkIGNvdW50cnkgcmVmZXJlbmNlIGN1cnJlbmN5LlxyXG4gICAqL1xyXG4gIHBvc3RDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3kgKGJvZHk6IENvdW50cnlSZWZlcmVuY2VDdXJyZW5jeUluKTogT2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlQ3VycmVuY3lPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPENvdW50cnlSZWZlcmVuY2VDdXJyZW5jeU91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXJlZmVyZW5jZS1jdXJyZW5jaWVzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgb3IgdXBkYXRlIGEgY291bnRyeSByZWZlcmVuY2UgZXh0cmEgY2hhcmdlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDb3VudHJ5UmVmZXJlbmNlRXh0cmFDaGFyZ2VJbn0gYm9keSAtIFRoZSByZXF1ZXN0IHBheWxvYWQgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjb3VudHJ5IHJlZmVyZW5jZSBleHRyYSBjaGFyZ2UuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlRXh0cmFDaGFyZ2VPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHJlc3BvbnNlIHdpdGggdGhlIGNyZWF0ZWQgb3IgdXBkYXRlZCBjb3VudHJ5IHJlZmVyZW5jZSBleHRyYSBjaGFyZ2UuXHJcbiAgICovXHJcbiAgcG9zdENvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZSAoYm9keTogQ291bnRyeVJlZmVyZW5jZUV4dHJhQ2hhcmdlSW4pOiBPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8Q291bnRyeVJlZmVyZW5jZUV4dHJhQ2hhcmdlT3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcmVmZXJlbmNlLWV4dHJhLWNoYXJnZXNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgYSBjb3VudHJ5IHJlZmVyZW5jZSBleHRyYSBjaGFyZ2UgYnkgaXRzIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb3VudHJ5IHJlZmVyZW5jZSBleHRyYSBjaGFyZ2UgdG8gYmUgdXBkYXRlZC5cclxuICAgKiBAcGFyYW0ge0NvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZUlufSBib2R5IC0gVGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjb3VudHJ5IHJlZmVyZW5jZSBleHRyYSBjaGFyZ2Ugd2l0aC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBjb3VudHJ5IHJlZmVyZW5jZSBleHRyYSBjaGFyZ2UuXHJcbiAgICovXHJcbiAgcHV0Q291bnRyeVJlZmVyZW5jZUV4dHJhQ2hhcmdlIChpZDogbnVtYmVyLCBib2R5OiBDb3VudHJ5UmVmZXJlbmNlRXh0cmFDaGFyZ2VJbik6IE9ic2VydmFibGU8Q291bnRyeVJlZmVyZW5jZUV4dHJhQ2hhcmdlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPENvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZU91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXJlZmVyZW5jZS1leHRyYS1jaGFyZ2VzLyR7aWR9YCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgY291bnRyeSByZWZlcmVuY2UgZXh0cmEgY2hhcmdlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDb3VudHJ5UmVmZXJlbmNlRXh0cmFDaGFyZ2V9IGV4dHJhQ2hhcmdlIC0gVGhlIGNvdW50cnkgcmVmZXJlbmNlIGV4dHJhIGNoYXJnZSBvYmplY3QgdG8gYmUgdXBkYXRlZC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0FjdGl2ZV0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgdG8gZXhwbGljaXRseSBzZXQgdGhlIGFjdGl2ZSBzdGF0dXMgb2YgdGhlIGV4dHJhIGNoYXJnZS5cclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IGFjdGl2ZSBzdGF0dXMgd2lsbCBiZSB0b2dnbGVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RW1wbG95ZWVDdXN0b21lcnNPdXQ+fSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVwZGF0ZWQgZW1wbG95ZWUgY3VzdG9tZXJzIG91dHB1dC5cclxuICAgKi9cclxuICBwYXRjaENvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZSAoZXh0cmFDaGFyZ2U6IENvdW50cnlSZWZlcmVuY2VFeHRyYUNoYXJnZSwgaXNBY3RpdmU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxBcGlTdWNjZXNzPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcmVmZXJlbmNlLWV4dHJhLWNoYXJnZXMvJHtleHRyYUNoYXJnZS5pZH1gLCB7XHJcbiAgICAgIGlzX2FjdGl2ZTogaXNBY3RpdmUgPz8gIWV4dHJhQ2hhcmdlLmlzX2FjdGl2ZVxyXG4gICAgfSkucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgZXhjaGFuZ2UgZGF0YSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciByZXRyaWV2aW5nIGV4Y2hhbmdlIGRhdGEuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFeGNoYW5nZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGV4Y2hhbmdlIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0RXhjaGFuZ2VzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxFeGNoYW5nZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8RXhjaGFuZ2VzT3V0Pj4oYCR7dGhpcy51cmx9L2V4Y2hhbmdlc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gY3JlYXRlIG9yIHVwZGF0ZSBhbiBleGNoYW5nZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RXhjaGFuZ2VJbn0gYm9keSAtIFRoZSByZXF1ZXN0IGJvZHkgY29udGFpbmluZyB0aGUgZXhjaGFuZ2UgZGF0YSB0byBiZSBzZW50LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RXhjaGFuZ2VPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHJlc3BvbnNlIGNvbnRhaW5pbmcgdGhlIGNyZWF0ZWQgb3IgdXBkYXRlZCBleGNoYW5nZSBkYXRhLlxyXG4gICAqL1xyXG4gIHBvc3RFeGNoYW5nZSAoYm9keTogRXhjaGFuZ2VJbik6IE9ic2VydmFibGU8RXhjaGFuZ2VPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8RXhjaGFuZ2VPdXQ+PihgJHt0aGlzLnVybH0vZXhjaGFuZ2VzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGFuIGV4aXN0aW5nIGV4Y2hhbmdlIHdpdGggbmV3IGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGV4Y2hhbmdlIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge0V4Y2hhbmdlSW59IGJvZHkgLSBUaGUgZGF0YSB0byB1cGRhdGUgdGhlIGV4Y2hhbmdlIHdpdGguXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFeGNoYW5nZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBleGNoYW5nZSBkYXRhLlxyXG4gICAqL1xyXG4gIHB1dEV4Y2hhbmdlIChpZDogbnVtYmVyLCBib2R5OiBFeGNoYW5nZUluKTogT2JzZXJ2YWJsZTxFeGNoYW5nZU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxFeGNoYW5nZU91dD4+KGAke3RoaXMudXJsfS9leGNoYW5nZXMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBleGNoYW5nZXMgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgdGhlIGV4Y2hhbmdlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEV4Y2hhbmdlc091dD59IC0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBBUEkgcmVzcG9uc2UgZGF0YSBjb250YWluaW5nIHRoZSBjdXJyZW50IGV4Y2hhbmdlcy5cclxuICAgKi9cclxuICBnZXRDdXJyZW50RXhjaGFuZ2VzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxFeGNoYW5nZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8RXhjaGFuZ2VzT3V0Pj4oYCR7dGhpcy51cmx9L2V4Y2hhbmdlcy9jdXJyZW50YCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBjb3VudHJ5LXNwZWNpZmljIHRheCBpbmZvcm1hdGlvbiBmb3IgYSBjb21wYW55LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdXNlZCB0byBmaWx0ZXIgYW5kIHF1ZXJ5IHRoZSB0YXhlcy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvbXBhbnlDb3VudHJ5VGF4ZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHRheCBpbmZvcm1hdGlvbi5cclxuICAgKi9cclxuICBnZXRDb21wYW55Q291bnRyeVRheGVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxDb21wYW55Q291bnRyeVRheGVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPENvbXBhbnlDb3VudHJ5VGF4ZXNPdXQ+PihgJHt0aGlzLnVybH0vY29tcGFueS1jb3VudHJ5LXRheGVzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGFjY291bnQgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyBmb3IgZmV0Y2hpbmcgYWNjb3VudCBkYXRhLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QWNjb3VudHNPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBhY2NvdW50IGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0QWNjb3VudHMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEFjY291bnRzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEFjY291bnRzT3V0Pj4oYCR7dGhpcy51cmx9L2FjY291bnRzYClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBhY2NvdW50IGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGFjY291bnQgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFjY291bnQgdG8gcmV0cmlldmUuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxBY2NvdW50T3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBhY2NvdW50IGRldGFpbHMuXHJcbiAgICovXHJcbiAgZ2V0QWNjb3VudCAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8QWNjb3VudE91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxBY2NvdW50T3V0Pj4oYCR7dGhpcy51cmx9L2FjY291bnRzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgbmV3IGFjY291bnQgYnkgc2VuZGluZyBhY2NvdW50IGRldGFpbHMgaW4gdGhlIGJvZHkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0FjY291bnRJbn0gYm9keSAtIFRoZSBhY2NvdW50IGluZm9ybWF0aW9uIHRvIGJlIHNlbnQgaW4gdGhlIHJlcXVlc3QgYm9keS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFjY291bnRPdXQ+fSBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGNyZWF0ZWQgYWNjb3VudCBkZXRhaWxzIHVwb24gc3VjY2Vzcy5cclxuICAgKi9cclxuICBwb3N0QWNjb3VudCAoYm9keTogQWNjb3VudEluKTogT2JzZXJ2YWJsZTxBY2NvdW50T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxBY2NvdW50T3V0Pj4oYCR7dGhpcy51cmx9L2FjY291bnRzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGFuIGFjY291bnQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIHVzaW5nIHRoZSBwcm92aWRlZCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhY2NvdW50IHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHBhcmFtIHtBY2NvdW50SW59IGJvZHkgLSBUaGUgZGF0YSB0byB1cGRhdGUgdGhlIGFjY291bnQgd2l0aC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFjY291bnRPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSB1cGRhdGVkIGFjY291bnQgZGV0YWlscy5cclxuICAgKi9cclxuICBwdXRBY2NvdW50IChpZDogbnVtYmVyLCBib2R5OiBBY2NvdW50SW4pOiBPYnNlcnZhYmxlPEFjY291bnRPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPEFjY291bnRPdXQ+PihgJHt0aGlzLnVybH0vYWNjb3VudHMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgYWNjb3VudCBlbnRpdHkgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBiZSBzZW50IHdpdGggdGhlIEhUVFAgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFjY291bnRFbnRpdGllc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgYWNjb3VudCBlbnRpdGllcyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldEFjY291bnRFbnRpdGllcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8QWNjb3VudEVudGl0aWVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEFjY291bnRFbnRpdGllc091dD4+KGAke3RoaXMudXJsfS9hY2NvdW50LWVudGl0aWVzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGFuIGFjY291bnQgZW50aXR5IHVzaW5nIHRoZSBwcm92aWRlZCBkZXRhaWxzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBY2NvdW50RW50aXRpZXNJbn0gYm9keSBUaGUgYWNjb3VudCBlbnRpdHkgZGF0YSB0byBiZSB1cGRhdGVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QWNjb3VudEVudGl0aWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB1cGRhdGVkIGFjY291bnQgZW50aXR5IGRldGFpbHMuXHJcbiAgICovXHJcbiAgcHV0QWNjb3VudEVudGl0eSAoYm9keTogQWNjb3VudEVudGl0aWVzSW4pOiBPYnNlcnZhYmxlPEFjY291bnRFbnRpdGllc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxBY2NvdW50RW50aXRpZXNPdXQ+PihgJHt0aGlzLnVybH0vYWNjb3VudC1lbnRpdGllc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGFjdGl2ZSBhY2NvdW50IGVudGl0aWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gZmlsdGVyIGFuZCBxdWVyeSBhY3RpdmUgYWNjb3VudCBlbnRpdGllcy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFjY291bnRFbnRpdGllc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgbGlzdCBvZiBhY3RpdmUgYWNjb3VudCBlbnRpdGllcy5cclxuICAgKi9cclxuICBnZXRBY2NvdW50RW50aXRpZXNBY3RpdmVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxBY2NvdW50RW50aXRpZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8QWNjb3VudEVudGl0aWVzT3V0Pj4oYCR7dGhpcy51cmx9L2FjY291bnQtZW50aXRpZXMvYWN0aXZlc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBhIGxpc3Qgb2YgYWNjb3VudCBjYXRlZ29yaWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCB0byBmaWx0ZXIgdGhlIGFjY291bnQgY2F0ZWdvcmllcy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFjY291bnRDYXRlZ29yaWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBmZXRjaGVkIGFjY291bnQgY2F0ZWdvcmllcyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldEFjY291bnRDYXRlZ29yaWVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxBY2NvdW50Q2F0ZWdvcmllc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxBY2NvdW50Q2F0ZWdvcmllc091dD4+KGAke3RoaXMudXJsfS9hY2NvdW50LWNhdGVnb3JpZXNgLCB7IHBhcmFtcywgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGFjY291bnQgdHlwZXMgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIG9yIGN1c3RvbWl6ZSB0aGUgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFjY291bnRUeXBlc091dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIGFjY291bnQgdHlwZXMgZGF0YS5cclxuICAgKi9cclxuICBnZXRBY2NvdW50VHlwZXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPEFjY291bnRUeXBlc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxBY2NvdW50VHlwZXNPdXQ+PihgJHt0aGlzLnVybH0vYWNjb3VudC10eXBlc2AsIHsgcGFyYW1zLCB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgYWNjb3VudCB0eXBlIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCBJRC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWNjb3VudC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEFjY291bnRUeXBlT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBhY2NvdW50IHR5cGUgZGF0YS5cclxuICAgKi9cclxuICBnZXRBY2NvdW50VHlwZSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8QWNjb3VudFR5cGVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8QWNjb3VudFR5cGVPdXQ+PihgJHt0aGlzLnVybH0vYWNjb3VudC10eXBlcy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gY3JlYXRlIGEgbmV3IGFjY291bnQgdHlwZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QWNjb3VudFR5cGVJbn0gYm9keSAtIFRoZSBkYXRhIGZvciB0aGUgYWNjb3VudCB0eXBlIHRvIGJlIGNyZWF0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxBY2NvdW50VHlwZU91dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgY3JlYXRlZCBhY2NvdW50IHR5cGUgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHBvc3RBY2NvdW50VHlwZSAoYm9keTogQWNjb3VudFR5cGVJbik6IE9ic2VydmFibGU8QWNjb3VudFR5cGVPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPEFjY291bnRUeXBlT3V0Pj4oYCR7dGhpcy51cmx9L2FjY291bnQtdHlwZXNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgYW4gYWNjb3VudCB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBJRCB1c2luZyB0aGUgcHJvdmlkZWQgZGF0YS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWNjb3VudCB0eXBlIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge0FjY291bnRUeXBlSW59IGJvZHkgLSBUaGUgZGF0YSB0byB1cGRhdGUgdGhlIGFjY291bnQgdHlwZSB3aXRoLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QWNjb3VudFR5cGVPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIHVwZGF0ZWQgYWNjb3VudCB0eXBlIGRhdGEuXHJcbiAgICovXHJcbiAgcHV0QWNjb3VudFR5cGUgKGlkOiBudW1iZXIsIGJvZHk6IEFjY291bnRUeXBlSW4pOiBPYnNlcnZhYmxlPEFjY291bnRUeXBlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPEFjY291bnRUeXBlT3V0Pj4oYCR7dGhpcy51cmx9L2FjY291bnQtdHlwZXMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCB0byBmaWx0ZXIgb3IgZmV0Y2ggdGhlIGRlc2lyZWQgcGFyYW1ldGVycy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFBhcmFtZXRlcnNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGZldGNoZWQgcGFyYW1ldGVycy5cclxuICAgKi9cclxuICBnZXRQYXJhbWV0ZXJzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxQYXJhbWV0ZXJzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFBhcmFtZXRlcnNPdXQ+PihgJHt0aGlzLnVybH0vcGFyYW1ldGVyc2AsIHsgcGFyYW1zLCB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyIG5hbWVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhcmFtcy5wYXJhbU5hbWVzIC0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIG5hbWVzIGZvciB3aGljaCB0aGUgdmFsdWVzIG5lZWQgdG8gYmUgZmV0Y2hlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFBhcmFtZXRlcnNWYWx1ZXNPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGZldGNoZWQgcGFyYW1ldGVyIHZhbHVlcy5cclxuICAgKi9cclxuICBnZXRQYXJhbWV0ZXJzVmFsdWVzICh7IHBhcmFtTmFtZXMgfTogUGFyYW1ldGVyc1ZhbHVlc0luKTogT2JzZXJ2YWJsZTxQYXJhbWV0ZXJzVmFsdWVzT3V0PiB7XHJcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gcGFyYW1OYW1lcy5tYXAoKHApID0+ICh7IG5hbWU6IHAgfSkpXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8UGFyYW1ldGVyc1ZhbHVlc091dD4+KGAke3RoaXMudXJsfS9wYXJhbWV0ZXJzLXZhbHVlc2AsIHsgcGFyYW1ldGVycyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBwYXJhbWV0ZXIgdmFsdWVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsZXZlbCBjb25maWd1cmF0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQYXJhbWV0ZXJzQnlMZXZlbElufSBwYXJhbWV0ZXJzIC0gVGhlIGlucHV0IG9iamVjdCBjb250YWluaW5nIHRoZSBjcml0ZXJpYSBvciBsZXZlbCBkZXRhaWxzIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UGFyYW1ldGVyc1ZhbHVlc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBmZXRjaGVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgKi9cclxuICBnZXRQYXJhbWV0ZXJWYWx1ZUJ5TW9kZWwgKHBhcmFtZXRlcnM6IFBhcmFtZXRlcnNCeUxldmVsSW4pOiBPYnNlcnZhYmxlPFBhcmFtZXRlcnNWYWx1ZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPFBhcmFtZXRlcnNWYWx1ZXNPdXQ+PihgJHt0aGlzLnVybH0vcGFyYW1ldGVycy12YWx1ZXNgLCB7IHBhcmFtZXRlcnMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHBhcmFtZXRlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCAtIFRoZSBpbnB1dCBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyIGRldGFpbHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LnBhcmFtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UGFyYW1ldGVyVmFsdWVPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlci5cclxuICAgKi9cclxuICBnZXRQYXJhbWV0ZXJWYWx1ZSAoe1xyXG4gICAgcGFyYW1OYW1lLFxyXG4gIH06IFBhcmFtZXRlclZhbHVlSW4pOiBPYnNlcnZhYmxlPFBhcmFtZXRlclZhbHVlT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFBhcmFtZXRlclZhbHVlT3V0Pj4oYCR7dGhpcy51cmx9L3BhcmFtZXRlcnMtdmFsdWVzLyR7cGFyYW1OYW1lfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBjb3VudHJ5IHJlZmVyZW5jZXMgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBjb3VudHJ5IHJlZmVyZW5jZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlc091dD59IEFuIG9ic2VydmFibGUgY29udGFpbmluZyB0aGUgY291bnRyeSByZWZlcmVuY2UgZGF0YS5cclxuICAgKi9cclxuICBnZXRDb3VudHJ5UmVmZXJlbmNlcyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8Q291bnRyeVJlZmVyZW5jZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8Q291bnRyeVJlZmVyZW5jZXNPdXQ+PihgJHt0aGlzLnVybH0vY291bnRyeS1yZWZlcmVuY2VzYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBjb3VudHJ5IHJlZmVyZW5jZSBkYXRhIGZvciBhIGdpdmVuIGNvdW50cnkgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50cnkgZm9yIHdoaWNoIHRoZSByZWZlcmVuY2UgZGF0YSBpcyB0byBiZSByZXRyaWV2ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBjb3VudHJ5IHJlZmVyZW5jZSBkYXRhLlxyXG4gICAqL1xyXG4gIGdldENvdW50cnlSZWZlcmVuY2UgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8Q291bnRyeVJlZmVyZW5jZU91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXJlZmVyZW5jZXMvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgYSBjb3VudHJ5IHJlZmVyZW5jZSByZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgYW5kIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50cnkgcmVmZXJlbmNlIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHBhcmFtIHtDb3VudHJ5UmVmZXJlbmNlSW59IGJvZHkgLSBUaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNvdW50cnkgcmVmZXJlbmNlIHdpdGguXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB1cGRhdGVkIGNvdW50cnkgcmVmZXJlbmNlIG9iamVjdC5cclxuICAgKi9cclxuICBwdXRDb3VudHJ5UmVmZXJlbmNlIChpZDogbnVtYmVyLCBib2R5OiBDb3VudHJ5UmVmZXJlbmNlSW4pOiBPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8Q291bnRyeVJlZmVyZW5jZU91dD4+KGAke3RoaXMudXJsfS9jb3VudHJ5LXJlZmVyZW5jZXMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2Ygd29ya2Zsb3dzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCB0byBmaWx0ZXIgd29ya2Zsb3dzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8V29ya2Zsb3dzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB3b3JrZmxvdyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldFdvcmtmbG93cyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8V29ya2Zsb3dzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFdvcmtmbG93c091dD4+KGAke3RoaXMudXJsfS93b3JrZmxvd3NgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgZW1wbG95ZWUgY3VzdG9tZXJcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIGVtcGxveWVlIGN1c3RvbWVycy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSBlbXBsb3llZSBjdXN0b21lciBkYXRhLlxyXG4gICAqL1xyXG4gIGdldEVtcGxveWVlc0N1c3RvbWVycyAocGFyYW1zOiBRdWVyeVBhcmFtcyk6IE9ic2VydmFibGU8RW1wbG95ZWVzQ3VzdG9tZXJzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEVtcGxveWVlc0N1c3RvbWVyc091dD4+KGAke3RoaXMudXJsfS9lbXBsb3llZS1jdXN0b21lcnNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgUE9TVCByZXF1ZXN0IHRvIGNyZWF0ZSBvciB1cGRhdGUgZW1wbG95ZWUgY3VzdG9tZXIgcmVjb3JkcyBhbmQgcHJvY2Vzc2VzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0VtcGxveWVlQ3VzdG9tZXJzSW59IGJvZHkgLSBUaGUgcmVxdWVzdCBwYXlsb2FkIGNvbnRhaW5pbmcgZW1wbG95ZWUgY3VzdG9tZXIgZGF0YSB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBlbXBsb3llZSBjdXN0b21lciBkYXRhIG9uIHN1Y2Nlc3NmdWwgcmVzcG9uc2UuXHJcbiAgICovXHJcbiAgcG9zdEVtcGxveWVlQ3VzdG9tZXJzIChib2R5OiBFbXBsb3llZUN1c3RvbWVyc0luKTogT2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8RW1wbG95ZWVDdXN0b21lcnNPdXQ+PihgJHt0aGlzLnVybH0vZW1wbG95ZWUtY3VzdG9tZXJzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBlbXBsb3llZS1jdXN0b21lciBhc3NvY2lhdGlvbiByZWNvcmQgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gSUQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBlbXBsb3llZS1jdXN0b21lciByZWNvcmQgdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7RW1wbG95ZWVDdXN0b21lcnNJbn0gYm9keSAtIFRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgZW1wbG95ZWUtY3VzdG9tZXIgcmVjb3JkIHdpdGguXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBlbXBsb3llZS1jdXN0b21lciBkYXRhLlxyXG4gICAqL1xyXG4gIHB1dEVtcGxveWVlQ3VzdG9tZXJzIChpZDogbnVtYmVyLCBib2R5OiBFbXBsb3llZUN1c3RvbWVyc0luKTogT2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxFbXBsb3llZUN1c3RvbWVyc091dD4+KGAke3RoaXMudXJsfS9lbXBsb3llZS1jdXN0b21lcnMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGVtcGxveWVlLWN1c3RvbWVyIGRldGFpbHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGVtcGxveWVlIGN1c3RvbWVyIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGVtcGxveWVlLWN1c3RvbWVyIHJlY29yZCB0byB1cGRhdGUuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBlbXBsb3llZS1jdXN0b21lciBkYXRhLlxyXG4gICAqL1xyXG4gIGdldEVtcGxveWVlQ3VzdG9tZXIgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPEVtcGxveWVlQ3VzdG9tZXJzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pj4oYCR7dGhpcy51cmx9L2VtcGxveWVlLWN1c3RvbWVycy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBhbiBlbXBsb3llZSBjdXN0b21lcidzIGFjdGl2ZSBzdGF0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RW1wbG95ZWVDdXN0b21lckRobH0gZW1wbG95ZWUgLSBUaGUgZW1wbG95ZWUgY3VzdG9tZXIgb2JqZWN0IHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNBY3RpdmVdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSBhY3RpdmUgc3RhdGUuXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG51bGwgb3IgdW5kZWZpbmVkLCB0aGUgYWN0aXZlIHN0YXRlIHdpbGwgYmUgdG9nZ2xlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB1cGRhdGVkIGVtcGxveWVlIGN1c3RvbWVyIG91dHB1dC5cclxuICAgKi9cclxuICBwYXRjaEVtcGxveWVlQ3VzdG9tZXJzIChlbXBsb3llZTogRW1wbG95ZWVDdXN0b21lckRobCwgaXNBY3RpdmU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxFbXBsb3llZUN1c3RvbWVyc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxBcGlTdWNjZXNzPEVtcGxveWVlQ3VzdG9tZXJzT3V0Pj4oYCR7dGhpcy51cmx9L2VtcGxveWVlLWN1c3RvbWVycy8ke2VtcGxveWVlLmlkfWAsIHtcclxuICAgICAgaXNfYWN0aXZlOiBpc0FjdGl2ZSA/PyAhZW1wbG95ZWUuaXNfYWN0aXZlXHJcbiAgICB9KS5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0cyBhIGZpbGUgY29udGFpbmluZyBlbXBsb3llZSBjdXN0b21lciBkYXRhIGZvciBhIHNwZWNpZmljIGNvdW50cnkgdG8gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudHJ5SWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgY291bnRyeSBmb3Igd2hpY2ggdGhlIGRhdGEgaXMgYmVpbmcgdXBsb2FkZWQuXHJcbiAgICogQHBhcmFtIHtGaWxlfSBmaWxlIC0gVGhlIGZpbGUgY29udGFpbnMgZW1wbG95ZWUgY3VzdG9tZXIgZGF0YSB0byBiZSB1cGxvYWRlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEJvYXJkaW5nUHJvY2Vzc0lkSW4+fSBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHByb2Nlc3NlZCBib2FyZGluZyBwcm9jZXNzIElEIG9uIHN1Y2Nlc3MuXHJcbiAgICovXHJcbiAgcG9zdEVtcGxveWVlQ3VzdG9tZXJzTG9hZCAoY291bnRyeUlkOiBudW1iZXIsIGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPEJvYXJkaW5nUHJvY2Vzc0lkSW4+IHtcclxuICAgIGNvbnN0IGJvZHkgPSBuZXcgRm9ybURhdGEoKVxyXG5cclxuICAgIGJvZHkuYXBwZW5kKCdmaWxlJywgZmlsZSlcclxuICAgIGJvZHkuYXBwZW5kKCdjb3VudHJ5X2lkJywgY291bnRyeUlkLnRvU3RyaW5nKCkpXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8Qm9hcmRpbmdQcm9jZXNzSWRJbj4+KGAke3RoaXMudXJsfS9lbXBsb3llZS1jdXN0b21lcnMvbG9hZGAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWRzIGEgZmlsZSBjb250YWluaW5nIGN1c3RvbWVyIGRhdGEgZm9yIGEgc3BlY2lmaWMgZW1wbG95ZWUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvdW50cnkgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIGNvdW50cnkgdXNlZCBhcyBhIGZpbHRlciBmb3IgZmV0Y2hpbmcgdGhlIGVtcGxveWVlJ3MgY3VzdG9tZXJzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8QmxvYj59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgZmlsZSBibG9iIGNvbnRhaW5pbmcgdGhlIGN1c3RvbWVyIGRhdGEuXHJcbiAgICovXHJcbiAgZ2V0RW1wbG95ZWVDdXN0b21lcnNEb3dubG9hZCAoaWQ6bnVtYmVyKTpPYnNlcnZhYmxlPEJsb2I+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMudXJsfS9lbXBsb3llZS1jdXN0b21lcnMvZG93bmxvYWRgLCB7XHJcbiAgICAgIHBhcmFtczogeyBjb3VudHJ5X2lkOiBpZCB9LFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJ1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgYm9hcmRpbmcgcHJvY2VzcyBkZXRhaWxzIGZvciBhIGdpdmVuIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBib2FyZGluZyBwcm9jZXNzIHRvIHJldHJpZXZlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Qm9hcmRpbmdQcm9jZXNzSW4+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGJvYXJkaW5nIHByb2Nlc3MgZGV0YWlscy5cclxuICAgKi9cclxuICBnZXRCb2FyZGluZ1Byb2Nlc3MgKGlkOm51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxCb2FyZGluZ1Byb2Nlc3NJbj4+KGAke3RoaXMudXJsfS9ib2FyZGluZy1wcm9jZXNzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGEgbGlzdCBvZiBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdXNlZCB0byBmaWx0ZXIgdGhlIHN5c3RlbXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxTeXN0ZW1zT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXRyaWV2ZWQgc3lzdGVtcyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldFN5c3RlbXMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFN5c3RlbXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8U3lzdGVtc091dD4+KGAke3RoaXMudXJsfS9zeXN0ZW1zYCwgeyBwYXJhbXMgfSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIHN5c3RlbSBieSB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBzeXN0ZW0gdG8gYmUgcmV0cmlldmVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8U3lzdGVtT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXF1ZXN0ZWQgc3lzdGVtIGluZm9ybWF0aW9uLlxyXG4gICAqL1xyXG4gIGdldFN5c3RlbSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8U3lzdGVtT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPFN5c3RlbU91dD4+KGAke3RoaXMudXJsfS9zeXN0ZW1zLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgb3IgdXBkYXRlIGEgc3lzdGVtLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTeXN0ZW1Jbn0gYm9keSAtIFRoZSBkYXRhIHJlcHJlc2VudGluZyB0aGUgc3lzdGVtIHRvIGJlIGNyZWF0ZWQgb3IgdXBkYXRlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFN5c3RlbU91dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3VsdGluZyBzeXN0ZW0gb3V0cHV0IGFmdGVyIHRoZSBBUEkgcmVxdWVzdCBzdWNjZWVkcy5cclxuICAgKi9cclxuICBwb3N0U3lzdGVtIChib2R5OiBTeXN0ZW1Jbik6IE9ic2VydmFibGU8U3lzdGVtT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8QXBpU3VjY2VzczxTeXN0ZW1PdXQ+PihgJHt0aGlzLnVybH0vc3lzdGVtc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgc3lzdGVtIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIElEIHdpdGggdGhlIHByb3ZpZGVkIHJlcXVlc3QgYm9keSBhbmQgcmV0dXJucyB0aGUgdXBkYXRlZCBzeXN0ZW0gZGV0YWlscy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgc3lzdGVtIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICogQHBhcmFtIHtTeXN0ZW1Jbn0gYm9keSAtIFRoZSBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIHVwZGF0ZWQgc3lzdGVtIGRldGFpbHMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxTeXN0ZW1PdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSB1cGRhdGVkIHN5c3RlbSBkYXRhLlxyXG4gICAqL1xyXG4gIHB1dFN5c3RlbSAoaWQ6IG51bWJlciwgYm9keTogU3lzdGVtSW4pOiBPYnNlcnZhYmxlPFN5c3RlbU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8U3lzdGVtT3V0Pj4oYCR7dGhpcy51cmx9L3N5c3RlbXMvJHtpZH1gLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIGxpc3Qgb2Ygc3lzdGVtIGVudGl0aWVzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHVzZWQgdG8gZmlsdGVyIG9yIHNwZWNpZnkgdGhlIHN5c3RlbSBlbnRpdGllcyB0byByZXRyaWV2ZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFN5c3RlbUVudGl0aWVzT3V0Pn0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXRyaWV2ZWQgc3lzdGVtIGVudGl0aWVzLlxyXG4gICAqL1xyXG4gIGdldFN5c3RlbUVudGl0aWVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxTeXN0ZW1FbnRpdGllc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxTeXN0ZW1FbnRpdGllc091dD4+KGAke3RoaXMudXJsfS9zeXN0ZW0tZW50aXRpZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIHN5c3RlbSBlbnRpdGllcyBieSBzZW5kaW5nIHRoZSBwcm92aWRlZCBkYXRhIHRvIHRoZSBzZXJ2ZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1N5c3RlbUVudGl0aWVzSW59IGJvZHkgLSBUaGUgZGF0YSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzeXN0ZW0gZW50aXRpZXMgdG8gYmUgdXBkYXRlZC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFN5c3RlbUVudGl0aWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSBjb250YWluaW5nIHRoZSB1cGRhdGVkIHN5c3RlbSBlbnRpdGllcyBkYXRhLlxyXG4gICAqL1xyXG4gIHB1dFN5c3RlbUVudGl0aWVzIChib2R5OiBTeXN0ZW1FbnRpdGllc0luKTogT2JzZXJ2YWJsZTxTeXN0ZW1FbnRpdGllc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxTeXN0ZW1FbnRpdGllc091dD4+KGAke3RoaXMudXJsfS9zeXN0ZW0tZW50aXRpZXNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB3b3JrZmxvdyBjb25maWd1cmF0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW1ldGVycy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UXVlcnlQYXJhbXN9IHBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIGZpbHRlciB0aGUgd29ya2Zsb3cgY29uZmlndXJhdGlvbnMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxXb3JrZmxvd0NvbmZpZ3NPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSB3b3JrZmxvdyBjb25maWd1cmF0aW9ucy5cclxuICAgKi9cclxuICBnZXRXb3JrZmxvd0NvbmZpZ3MgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFdvcmtmbG93Q29uZmlnc091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxXb3JrZmxvd0NvbmZpZ3NPdXQ+PihgJHt0aGlzLnVybH0vd29ya2Zsb3ctY29uZmlnc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZHMgYSBiYXRjaCBvZiB3b3JrZmxvdyBjb25maWd1cmF0aW9uIGRhdGEgdG8gdGhlIHNlcnZlciBmb3IgcHJvY2Vzc2luZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V29ya2Zsb3dDb25maWdzQmF0Y2hJbn0gYm9keSAtIFRoZSBpbnB1dCBkYXRhIGNvbnRhaW5pbmcgYSBiYXRjaCBvZiB3b3JrZmxvdyBjb25maWd1cmF0aW9ucyB0byBiZSBzZW50LlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8V29ya2Zsb3dDb25maWdzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBwcm9jZXNzZWQgYmF0Y2ggb2Ygd29ya2Zsb3cgY29uZmlndXJhdGlvbiBkYXRhIGFzIGEgcmVzcG9uc2UuXHJcbiAgICovXHJcbiAgcG9zdFdvcmtmbG93Q29uZmlnc0JhdGNoIChib2R5OiBXb3JrZmxvd0NvbmZpZ3NCYXRjaEluKTogT2JzZXJ2YWJsZTxXb3JrZmxvd0NvbmZpZ3NPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxBcGlTdWNjZXNzPFdvcmtmbG93Q29uZmlnc091dD4+KGAke3RoaXMudXJsfS93b3JrZmxvdy1jb25maWdzL2JhdGNoYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgYSBuZXcgY29tcGFueSBhbmQgcmV0dXJucyB0aGUgY3JlYXRlZCBjb21wYW55J3MgZGV0YWlscy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Q29tcGFueUlufSBib2R5IC0gVGhlIHBheWxvYWQgY29udGFpbmluZyB0aGUgZGV0YWlscyBvZiB0aGUgY29tcGFueSB0byBiZSBjcmVhdGVkLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8Q29tcGFueU91dD59IEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIHdpdGggdGhlIGNyZWF0ZWQgY29tcGFueSdzIGRldGFpbHMuXHJcbiAgICovXHJcbiAgcG9zdENvbXBhbnkgKGJvZHk6IENvbXBhbnlJbik6IE9ic2VydmFibGU8Q29tcGFueU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEFwaVN1Y2Nlc3M8Q29tcGFueU91dD4+KGAke3RoaXMudXJsfS9jb21wYW5pZXNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIGRldGFpbHMgb2YgYW4gZXhpc3RpbmcgY29tcGFueSB1c2luZyBpdHMgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbXBhbnkgdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7Q29tcGFueUlufSBib2R5IC0gVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSB1cGRhdGVkIGNvbXBhbnkgZGF0YS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvbXBhbnlPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVwZGF0ZWQgY29tcGFueSBkZXRhaWxzLlxyXG4gICAqL1xyXG4gIHB1dENvbXBhbnkgKGlkOiBudW1iZXIsIGJvZHk6IENvbXBhbnlJbik6IE9ic2VydmFibGU8Q29tcGFueU91dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8QXBpU3VjY2VzczxDb21wYW55T3V0Pj4oYCR7dGhpcy51cmx9L2NvbXBhbmllcy8ke2lkfWAsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhIGNvbXBhbnkgYnkgaXRzIHVuaXF1ZSBpZGVudGlmaWVyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21wYW55IHRvIGJlIGRlbGV0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTx7fT59IEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyBhbiBlbXB0eSBvYmplY3QgdXBvbiBzdWNjZXNzZnVsIGRlbGV0aW9uIG9yIGFuIGVycm9yIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMuXHJcbiAgICovXHJcbiAgZGVsZXRlQ29tcGFueSAoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8e30+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPEFwaVN1Y2Nlc3M8e30+PihgJHt0aGlzLnVybH0vY29tcGFuaWVzLyR7aWR9YClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHByb2R1Y3QgZW50aXRpZXMgZnJvbSB0aGUgc2VydmVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHVzZWQgdG8gbW9kaWZ5IHRoZSByZXF1ZXN0IGZvciBwcm9kdWN0IGVudGl0aWVzLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8UHJvZHVjdEVudGl0aWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBwcm9kdWN0IGVudGl0aWVzIHJldHJpZXZlZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICovXHJcbiAgZ2V0UHJvZHVjdEVudGl0aWVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxQcm9kdWN0RW50aXRpZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8UHJvZHVjdEVudGl0aWVzT3V0Pj4oYCR7dGhpcy51cmx9L3Byb2R1Y3QtZW50aXRpZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgUFVUIHJlcXVlc3QgdG8gdXBkYXRlIHByb2R1Y3QgZW50aXRpZXMgYW5kIHJldHVybnMgdGhlIHVwZGF0ZWQgZW50aXR5LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQcm9kdWN0RW50aXRpZXNJbn0gYm9keSAtIFRoZSBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBwcm9kdWN0IGVudGl0eS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFByb2R1Y3RFbnRpdGllc091dD59IE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdXBkYXRlZCBwcm9kdWN0IGVudGl0eS5cclxuICAgKi9cclxuICBwdXRQcm9kdWN0RW50aXRpZXMgKGJvZHk6IFByb2R1Y3RFbnRpdGllc0luKTogT2JzZXJ2YWJsZTxQcm9kdWN0RW50aXRpZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8UHJvZHVjdEVudGl0aWVzT3V0Pj4oYCR7dGhpcy51cmx9L3Byb2R1Y3QtZW50aXRpZXNgLCBib2R5KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyB0aGUgY291bnRyeSByZWZlcmVuY2UgcHJvZHVjdHMgYmFzZWQgb24gdGhlIGdpdmVuIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNlZCB0byBmaWx0ZXIgYW5kIHJldHJpZXZlIHRoZSBjb3VudHJ5IHJlZmVyZW5jZSBwcm9kdWN0cy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VQcm9kdWN0c091dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIGZldGNoZWQgY291bnRyeSByZWZlcmVuY2UgcHJvZHVjdHMgZGF0YS5cclxuICAgKi9cclxuICBnZXRDb3VudHJ5UmVmZXJlbmNlUHJvZHVjdHMgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VQcm9kdWN0c091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXBpU3VjY2VzczxDb3VudHJ5UmVmZXJlbmNlUHJvZHVjdHNPdXQ+PihgJHt0aGlzLnVybH0vY291bnRyeS1yZWZlcmVuY2UtcHJvZHVjdHNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmRzIGEgcmVxdWVzdCB0byB1cGRhdGUgb3IgY3JlYXRlIGNvdW50cnkgcmVmZXJlbmNlIHByb2R1Y3RzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDb3VudHJ5UmVmZXJlbmNlUHJvZHVjdElufSBib2R5IC0gVGhlIHBheWxvYWQgY29udGFpbmluZyB0aGUgZGV0YWlscyBvZiB0aGUgY291bnRyeSByZWZlcmVuY2UgcHJvZHVjdHMgdG8gcG9zdC5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VQcm9kdWN0T3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB1cGRhdGVkIG9yIGNyZWF0ZWQgY291bnRyeSByZWZlcmVuY2UgcHJvZHVjdCBkYXRhLlxyXG4gICAqL1xyXG4gIHBvc3RDb3VudHJ5UmVmZXJlbmNlUHJvZHVjdHMgKGJvZHk6IENvdW50cnlSZWZlcmVuY2VQcm9kdWN0SW4pOiBPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VQcm9kdWN0T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPENvdW50cnlSZWZlcmVuY2VQcm9kdWN0T3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcmVmZXJlbmNlLXByb2R1Y3RzYCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGEgY291bnRyeSByZWZlcmVuY2UgcHJvZHVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgdXNpbmcgdGhlIHByb3ZpZGVkIGRhdGEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50cnkgcmVmZXJlbmNlIHByb2R1Y3QgdG8gdXBkYXRlLlxyXG4gICAqIEBwYXJhbSB7Q291bnRyeVJlZmVyZW5jZVByb2R1Y3RJbn0gYm9keSAtIFRoZSB1cGRhdGVkIGNvdW50cnkgcmVmZXJlbmNlIHByb2R1Y3QgZGF0YSB0byBiZSBzZW50IGluIHRoZSByZXF1ZXN0IGJvZHkuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDb3VudHJ5UmVmZXJlbmNlUHJvZHVjdE91dD59IEFuIG9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHVwZGF0ZWQgY291bnRyeSByZWZlcmVuY2UgcHJvZHVjdC5cclxuICAgKi9cclxuICBwdXRDb3VudHJ5UmVmZXJlbmNlUHJvZHVjdHMgKGlkOiBudW1iZXIsIGJvZHk6IENvdW50cnlSZWZlcmVuY2VQcm9kdWN0SW4pOiBPYnNlcnZhYmxlPENvdW50cnlSZWZlcmVuY2VQcm9kdWN0T3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxBcGlTdWNjZXNzPENvdW50cnlSZWZlcmVuY2VQcm9kdWN0T3V0Pj4oYCR7dGhpcy51cmx9L2NvdW50cnktcmVmZXJlbmNlLXByb2R1Y3RzLyR7aWR9YCwgYm9keSlcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHRoZSBleHRyYSBjaGFyZ2UgZW50aXRpZXMgZnJvbSB0aGUgc2VydmVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtRdWVyeVBhcmFtc30gcGFyYW1zIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gZmlsdGVyIHRoZSBleHRyYSBjaGFyZ2UgZW50aXRpZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFeHRyYUNoYXJnZUVudGl0aWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBleHRyYSBjaGFyZ2UgZW50aXRpZXMgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgKi9cclxuICBnZXRFeHRyYUNoYXJnZUVudGl0aWVzIChwYXJhbXM6IFF1ZXJ5UGFyYW1zKTogT2JzZXJ2YWJsZTxFeHRyYUNoYXJnZUVudGl0aWVzT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcGlTdWNjZXNzPEV4dHJhQ2hhcmdlRW50aXRpZXNPdXQ+PihgJHt0aGlzLnVybH0vZXh0cmFjaGFyZ2UtZW50aXRpZXNgLCB7IHBhcmFtcyB9KVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgZXh0cmEgY2hhcmdlIGVudGl0aWVzIGJ5IHNlbmRpbmcgdGhlIHByb3ZpZGVkIGRhdGEgdG8gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7RXh0cmFDaGFyZ2VFbnRpdGllc0lufSBib2R5IC0gVGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBleHRyYSBjaGFyZ2UgZW50aXRpZXMuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxFeHRyYUNoYXJnZUVudGl0aWVzT3V0Pn0gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB1cGRhdGVkIGV4dHJhIGNoYXJnZSBlbnRpdGllcy5cclxuICAgKi9cclxuICBwdXRFeHRyYUNoYXJnZUVudGl0aWVzIChib2R5OiBFeHRyYUNoYXJnZUVudGl0aWVzSW4pOiBPYnNlcnZhYmxlPEV4dHJhQ2hhcmdlRW50aXRpZXNPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEFwaVN1Y2Nlc3M8RXh0cmFDaGFyZ2VFbnRpdGllc091dD4+KGAke3RoaXMudXJsfS9leHRyYWNoYXJnZS1lbnRpdGllc2AsIGJvZHkpXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1F1ZXJ5UGFyYW1zfSBwYXJhbXMgLSBUaGUgcXVlcnkgcGFyYW1ldGVycyB0byBmaWx0ZXIgdGhlIHBhcmFtZXRlciBjb25maWd1cmF0aW9ucy5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFBhcmFtZXRlckNvbmZpZ3NPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHBhcmFtZXRlciBjb25maWd1cmF0aW9ucyBkYXRhLlxyXG4gICAqL1xyXG4gIGdldFBhcmFtZXRlckNvbmZpZ3MgKHBhcmFtczogUXVlcnlQYXJhbXMpOiBPYnNlcnZhYmxlPFBhcmFtZXRlckNvbmZpZ3NPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFwaVN1Y2Nlc3M8UGFyYW1ldGVyQ29uZmlnc091dD4+KGAke3RoaXMudXJsfS9wYXJhbWV0ZXItY29uZmlnc2AsIHsgcGFyYW1zIH0pXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0cyBhIGNvbmZpZ3VyYXRpb24gZm9yIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGFyYW1ldGVyQ29uZmlnSW59IGJvZHkgLSBUaGUgaW5wdXQgY29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyB0byBiZSBzdWJtaXR0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYXJhbWV0ZXJDb25maWdPdXQ+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBjb250YWluaW5nIHRoZSB1cGRhdGVkIHBhcmFtZXRlciBjb25maWd1cmF0aW9uLlxyXG4gICAqL1xyXG4gIHBvc3RQYXJhbWV0ZXJDb25maWcgKGJvZHk6IFBhcmFtZXRlckNvbmZpZ0luKTogT2JzZXJ2YWJsZTxQYXJhbWV0ZXJDb25maWdPdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPEFwaVN1Y2Nlc3M8UGFyYW1ldGVyQ29uZmlnT3V0Pj4oYCR7dGhpcy51cmx9L3BhcmFtZXRlci1jb25maWdzYClcclxuICAgICAgLnBpcGUobWFwKCh7IGRhdGEgfSkgPT4gZGF0YSkpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgcGFyYW1ldGVyIHdpdGggdGhlIHByb3ZpZGVkIElEIGFuZCBpbnB1dCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiB0byBiZSB1cGRhdGVkLlxyXG4gICAqIEBwYXJhbSB7UGFyYW1ldGVyQ29uZmlnSW59IGJvZHkgLSBUaGUgaW5wdXQgZGF0YSBjb250YWluaW5nIHRoZSB1cGRhdGVkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwYXJhbWV0ZXIuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYXJhbWV0ZXJDb25maWdPdXQ+fSBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHVwZGF0ZWQgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24uXHJcbiAgICovXHJcbiAgcHV0UGFyYW1ldGVyQ29uZmlnIChpZDogbnVtYmVyLCBib2R5OiBQYXJhbWV0ZXJDb25maWdJbik6IE9ic2VydmFibGU8UGFyYW1ldGVyQ29uZmlnT3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxBcGlTdWNjZXNzPFBhcmFtZXRlckNvbmZpZ091dD4+KGAke3RoaXMudXJsfS9wYXJhbWV0ZXItY29uZmlncy8ke2lkfWApXHJcbiAgICAgIC5waXBlKG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBhIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBieSBpdHMgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIHRvIGJlIGRlbGV0ZWQuXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYXJhbWV0ZXJDb25maWdPdXQ+fSBBbiBvYnNlcnZhYmxlIGNvbnRhaW5pbmcgdGhlIGRlbGV0ZWQgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gZGF0YS5cclxuICAgKi9cclxuICBkZWxldGVQYXJhbWV0ZXJDb25maWcgKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFBhcmFtZXRlckNvbmZpZ091dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8QXBpU3VjY2VzczxQYXJhbWV0ZXJDb25maWdPdXQ+PihgJHt0aGlzLnVybH0vcGFyYW1ldGVyLWNvbmZpZ3MvJHtpZH1gKVxyXG4gICAgICAucGlwZShtYXAoKHsgZGF0YSB9KSA9PiBkYXRhKSlcclxuICB9XHJcbn1cclxuIl19