bit-ng-library 13.1.0 → 13.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,17 +26,20 @@ To get more help on the Angular CLI use `ng help` or go check out the [Angular C
26
26
 
27
27
  ## changelog
28
28
 
29
- <<<<<<< HEAD
30
- ## [13.0.2] - 2022-02-03
29
+ ## [13.1.1] - 2022-02-22
31
30
 
32
- Se añade allowSyntheticDefaultImports a true en las opciones de compilacion de tsconfig para que se importe correctamente la librería
33
- moment. También se modifica la forma de importar en el código pasando a import momento from 'moment' en vez de import \* as moment from
34
- 'moment'
31
+ Corregido bug de CustomValidators cuando se usaba en forms con diversos campos de longitud limitada. Se mostraba siempre el mismo mensaje para todos, aunque se especificase un validador con longitud diferente en cada campo.
35
32
 
36
33
  ## [13.1.0] - 2022-02-03
37
34
 
38
35
  Incluir el nuevo tipo de bit-footer para las páginas con infinity-scroll en la rama angular 13
39
36
 
37
+ ## [13.0.2] - 2022-02-03
38
+
39
+ Se añade allowSyntheticDefaultImports a true en las opciones de compilacion de tsconfig para que se importe correctamente la librería
40
+ moment. También se modifica la forma de importar en el código pasando a import momento from 'moment' en vez de import \* as moment from
41
+ 'moment'
42
+
40
43
  ## [13.0.1] - 2022-02-03
41
44
 
42
45
  Se elimina moment-mini-ts al presentar problemas de carga con angular 13
@@ -115,7 +115,7 @@ export class CustomValidators {
115
115
  }
116
116
  return { invalidCantidad: true };
117
117
  }
118
- /* Valida numeros enteros (sin decimales) positivos (>=0) */
118
+ /* Valida números enteros (sin decimales) positivos (>=0) */
119
119
  static enteroPositivoValidator(control) {
120
120
  // value is either empty, or a number without decimals
121
121
  if (!control.value || control.value === "") {
@@ -138,7 +138,7 @@ export class CustomValidators {
138
138
  }
139
139
  return { invalidEnteroPositivoIncluyeCero: true };
140
140
  }
141
- /* Valida numeros enteros (con decimales) */
141
+ /* Valida números enteros (con decimales) */
142
142
  static cantidadDecimalValidator(control) {
143
143
  // value is either empty, or a number (including decimals)
144
144
  if (!control.value || control.value === "" || !isNaN(Number(control.value))) {
@@ -148,7 +148,7 @@ export class CustomValidators {
148
148
  return { invalidCantidadDecimal: true };
149
149
  }
150
150
  }
151
- /* Valida numeros enteros (con decimales) positivos (>=0) */
151
+ /* Valida números enteros (con decimales) positivos (>=0) */
152
152
  static numeroPositivoValidator(control) {
153
153
  if (!control.value || control.value === "" || (!isNaN(Number(control.value)) && Number(control.value) >= 0)) {
154
154
  return null;
@@ -157,7 +157,7 @@ export class CustomValidators {
157
157
  return { invalidNumeroPositivo: true };
158
158
  }
159
159
  }
160
- /* Valida codigo postal (numero de 5 digitos) */
160
+ /* Valida código postal (numero de 5 dígitos) */
161
161
  static codigoPostalValidator(control) {
162
162
  if (!control.value || (control.value.match(/^([0-9])+$/) && control.value.length == 5)) {
163
163
  return null;
@@ -166,7 +166,7 @@ export class CustomValidators {
166
166
  return { invalidCodigoPostal: true };
167
167
  }
168
168
  }
169
- /* Valida telefono (numero de 9 digitos) */
169
+ /* Valida telefono (numero de 9 dígitos) */
170
170
  static telefonoValidator(control) {
171
171
  if (!control.value || control.value.match(/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/)) {
172
172
  return null;
@@ -175,7 +175,7 @@ export class CustomValidators {
175
175
  return { invalidTelefono: true };
176
176
  }
177
177
  }
178
- /* Valida telefono (numero de 9 digitos) */
178
+ /* Valida telefono (numero de 9 dígitos) */
179
179
  static telefonoCSVValidator(control) {
180
180
  if (!control.value || control.value.match(/^[0-9]{9}(( *, *)[0-9]{9})*$/g)) {
181
181
  return null;
@@ -186,59 +186,66 @@ export class CustomValidators {
186
186
  }
187
187
  static buildLongitudValidator(lon) {
188
188
  let errorKey = "invalidLongitud";
189
- CustomValidators.config[errorKey] = CustomValidators.buildErrorMessage(errorKey, { lon: lon });
189
+ let errorKeyIndex = errorKey + " _" + lon.toString();
190
+ CustomValidators.config[errorKeyIndex] = CustomValidators.buildErrorMessage(errorKey, { lon: lon });
190
191
  return (control) => {
191
192
  if (!control.value || control.value.length <= lon) {
192
193
  return null;
193
194
  }
194
195
  else {
195
196
  let ret = {};
196
- ret[errorKey] = true;
197
+ ret[errorKeyIndex] = true;
197
198
  return ret;
198
199
  }
199
200
  };
200
201
  }
201
202
  static buildCantidadMinValidator(min) {
202
203
  let errorKey = "invalidCantidadMin";
203
- CustomValidators.config[errorKey] = CustomValidators.buildErrorMessage(errorKey, { min: min });
204
+ let errorKeyIndex = errorKey + " _" + min.toString();
205
+ CustomValidators.config[errorKeyIndex] = CustomValidators.buildErrorMessage(errorKey, { min: min });
204
206
  return (control) => {
205
207
  let num = Number(control.value);
206
208
  if (control.value === "") {
207
209
  return null;
208
210
  }
209
211
  else if (isNaN(num) || num >= min) {
210
- // si no es numerico o el valor >= min, pasa la validacion
212
+ // si no es numérico o el valor >= min, pasa la validación
211
213
  return null;
212
214
  }
213
215
  else {
214
216
  let ret = {};
215
- ret[errorKey] = true;
217
+ ret[errorKeyIndex] = true;
216
218
  return ret;
217
219
  }
218
220
  };
219
221
  }
220
222
  static buildCantidadMaxValidator(max) {
221
223
  let errorKey = "invalidCantidadMax";
222
- CustomValidators.config[errorKey] = CustomValidators.buildErrorMessage(errorKey, { max: max });
224
+ let errorKeyIndex = errorKey + "_" + max.toString();
225
+ CustomValidators.config[errorKeyIndex] = CustomValidators.buildErrorMessage(errorKey, { max: max });
223
226
  return (control) => {
224
227
  let num = Number(control.value);
225
228
  if (control.value === "") {
226
229
  return null;
227
230
  }
228
231
  else if (isNaN(num) || num <= max) {
229
- // si no es numerico o el valor <= max, pasa la validacion
232
+ // si no es numérico o el valor max, pasa la validación
230
233
  return null;
231
234
  }
232
235
  else {
233
236
  let ret = {};
234
- ret[errorKey] = true;
237
+ ret[errorKeyIndex] = true;
235
238
  return ret;
236
239
  }
237
240
  };
238
241
  }
239
242
  static buildCantidadMinMaxValidator(min, max) {
240
243
  let errorKey = "invalidCantidadMinMax";
241
- CustomValidators.config[errorKey] = CustomValidators.buildErrorMessage(errorKey, { min: min, max: max });
244
+ let errorKeyIndex = errorKey + "_" + min.toString() + "_" + max.toString();
245
+ CustomValidators.config[errorKeyIndex] = CustomValidators.buildErrorMessage(errorKey, {
246
+ min: min,
247
+ max: max
248
+ });
242
249
  return (control) => {
243
250
  let num = Number(control.value);
244
251
  if (control.value === "") {
@@ -249,7 +256,7 @@ export class CustomValidators {
249
256
  }
250
257
  else {
251
258
  let ret = {};
252
- ret[errorKey] = true;
259
+ ret[errorKeyIndex] = true;
253
260
  return ret;
254
261
  }
255
262
  };
@@ -270,7 +277,7 @@ export class CustomValidators {
270
277
  }
271
278
  }
272
279
  static urlValidator(control) {
273
- var pattern = new RegExp("^(https?:\\/\\/)?" + // protocol
280
+ let pattern = new RegExp("^(https?:\\/\\/)?" + // protocol
274
281
  "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|" + // domain name
275
282
  "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address
276
283
  "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path
@@ -284,7 +291,7 @@ export class CustomValidators {
284
291
  }
285
292
  }
286
293
  static pathValidator(control) {
287
- var pattern = new RegExp("^((\\/)?[-a-z\\d%_.~+]*)*" + // port and path
294
+ let pattern = new RegExp("^((\\/)?[-a-z\\d%_.~+]*)*" + // port and path
288
295
  "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string
289
296
  "(\\#[-a-z\\d_]*)?$", "i"); // fragment locator
290
297
  if (!control.value || pattern.test(control.value)) {
@@ -295,11 +302,11 @@ export class CustomValidators {
295
302
  }
296
303
  }
297
304
  /**
298
- * Retorna un string con todos los errores que contiene el formulario separados por saltos de línea.
305
+ * Retorna un string con todos los errores que contiene el formulario, separados por saltos de línea.
299
306
  */
300
307
  static validateForm(form, prefix = []) {
301
308
  let mensajes = [];
302
- // errores a nivel de grupo
309
+ // errores en términos de grupo
303
310
  for (let errorKey in form.errors) {
304
311
  let pr = prefix ? `${prefix}: ` : "";
305
312
  mensajes.push({ prefixes: [pr], errorMessage: CustomValidators.config[errorKey] });
@@ -406,7 +413,7 @@ export class CustomValidators {
406
413
  }
407
414
  }
408
415
  static cifValidator(control) {
409
- var pattern = new RegExp(/^[a-z|A-Z][0-9]{7}[a-z|A-Z|0-9]/); // TODO
416
+ let pattern = new RegExp(/^[a-z|A-Z][0-9]{7}[a-z|A-Z|0-9]/); // TODO
410
417
  if (!control.value || pattern.test(control.value)) {
411
418
  return null;
412
419
  }
@@ -415,7 +422,7 @@ export class CustomValidators {
415
422
  }
416
423
  }
417
424
  static anyoValidator(control) {
418
- var pattern = new RegExp(/^[0-9]{4}$/); // TODO
425
+ let pattern = new RegExp(/^[0-9]{4}$/); // TODO
419
426
  if (!control.value || pattern.test(control.value)) {
420
427
  return null;
421
428
  }
@@ -428,8 +435,8 @@ export class CustomValidators {
428
435
  }
429
436
  // https://github.com/jquery-validation/jquery-validation/blob/master/src/additional/cifES.js
430
437
  static isValidCIF(value) {
431
- var cifRegEx = new RegExp(/^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi);
432
- var letter = value.substring(0, 1), // [ T ]
438
+ let cifRegEx = new RegExp(/^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi);
439
+ let letter = value.substring(0, 1), // [ T ]
433
440
  number = value.substring(1, 8), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]
434
441
  control = value.substring(8, 9), // [ C ]
435
442
  all_sum = 0, even_sum = 0, odd_sum = 0, i, n, control_digit, control_letter;
@@ -456,9 +463,9 @@ export class CustomValidators {
456
463
  }
457
464
  }
458
465
  all_sum = even_sum + odd_sum;
459
- control_digit = (10 - Number(all_sum.toString().substr(-1))).toString();
466
+ control_digit = (10 - Number(all_sum.toString().substring(-1))).toString();
460
467
  control_digit = parseInt(control_digit, 10) > 9 ? "0" : control_digit;
461
- control_letter = "JABCDEFGHI".substr(control_digit, 1).toString();
468
+ control_letter = "JABCDEFGHI".substring(control_digit, 1).toString();
462
469
  // Control must be a digit
463
470
  if (letter.match(/[ABEH]/)) {
464
471
  return control === control_digit;
@@ -491,12 +498,12 @@ export class CustomValidators {
491
498
  // Un NIE sigue una validación muy similar a la de un DNI, con la diferencia
492
499
  // de que en lugar de ser ocho números + letra debe ser letra + siete números + letra,
493
500
  // siendo la primera letra X, Y o Z sustituible por 0, 1 o 2 respectivamente.
494
- var nieRegEx = new RegExp(/^[XYZ]{1}[0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi);
501
+ let nieRegEx = new RegExp(/^[XYZ]{1}[0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi);
495
502
  // Si no tiene el formato básico, no es válido
496
503
  if (!nieRegEx.test(value)) {
497
504
  return false;
498
505
  }
499
- // Sustituimos la primera letra por el número equivalente y reaprovechamos la validación de NIF
506
+ // Sustituimos la primera letra por el número equivalente y aprovechamos la validación de NIF
500
507
  value = value.toString().toUpperCase().replace(/^[X]/, "0").replace(/^[Y]/, "1").replace(/^[Z]/, "2");
501
508
  return CustomValidators.isValidNIF(value);
502
509
  }
@@ -555,14 +562,15 @@ export class CustomValidators {
555
562
  }
556
563
  static buildMinLongitudValidator(lon) {
557
564
  let errorKey = "invalidMinLongitud";
558
- CustomValidators.config[errorKey] = CustomValidators.buildErrorMessage(errorKey, { lon: lon });
565
+ let errorKeyIndex = errorKey + "_" + lon.toString();
566
+ CustomValidators.config[errorKeyIndex] = CustomValidators.buildErrorMessage(errorKey, { lon: lon });
559
567
  let result = (control) => {
560
568
  if (!control.value || control.value.length >= lon) {
561
569
  return null;
562
570
  }
563
571
  else {
564
572
  let ret = {};
565
- ret[errorKey] = true;
573
+ ret[errorKeyIndex] = true;
566
574
  return ret;
567
575
  }
568
576
  };
@@ -624,4 +632,4 @@ CustomValidators.CustomValidatorsMap = {
624
632
  fecha: CustomValidators.dataValidator,
625
633
  anyo: CustomValidators.anyoValidator
626
634
  };
627
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXZhbGlkYXRvcnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JpdC1uZy1saWJyYXJ5L3NyYy9saWIvc2hhcmVkbGlicmFyeS9zZXJ2aWNlcy9jdXN0b20tdmFsaWRhdG9ycy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxNQUFNLE9BQU8sZ0JBQWdCO0lBMEQzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBWSxFQUFFLE1BQVc7UUFDaEQsT0FBTyxzQkFBc0IsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBWTtRQUMxQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBc0I7UUFDbkMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFZO1lBQ2pDLGlFQUFpRTtZQUNqRSxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0gs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Z0IsQ0FBQyxlQUFlO0lBQ3hDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyx3QkFBd0I7SUFDakQsTUFBTSxFQUFFLGdCQUFnQixDQUFDLGlCQUFpQjtJQUMxQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsdUJBQXVCO0lBQ3hELGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyx1QkFBdUI7SUFDeEQsR0FBRyxFQUFFLGdCQUFnQixDQUFDLFlBQVk7SUFDbEMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLFlBQVk7SUFDbEMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLFlBQVk7SUFDbEMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLGVBQWU7SUFDeEMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLHFCQUFxQjtJQUMxQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsaUJBQWlCO0lBQzVDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxvQkFBb0I7SUFDbEQsUUFBUSxFQUFFLGdCQUFnQixDQUFDLGlCQUFpQjtJQUM1QyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsY0FBYztJQUN0QyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsYUFBYTtJQUNyQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsYUFBYTtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEdlbmVyYWxVdGlscyB9IGZyb20gXCIuL2dlbmVyYWwtdXRpbHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVkTWVzc2FnZSwgRXJyb3JWYWxpZGF0ZUZvcm0gfSBmcm9tIFwiLi4vLi4vYmFzZS9tb2RlbHMvdHlwZXNcIjtcclxuaW1wb3J0IHsgYnVpbGRUcmFuc2xhdGVkTWVzc2FnZSB9IGZyb20gXCIuL3RyYW5zbGF0ZS5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdG9ycyB7XHJcbiAgc3RhdGljIGNvbmZpZyA9IHtcclxuICAgIHJlcXVpcmVkOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwicmVxdWlyZWRcIiksXHJcbiAgICBpbnZhbGlkRGF0ZTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcIkRhdGEgaW5jb3JyZWN0YVwiKSxcclxuICAgIGludmFsaWRUaW1lOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFRpbWVcIiksXHJcbiAgICBpbnZhbGlkRW1haWxBZGRyZXNzOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZEVtYWlsQWRkcmVzc1wiKSxcclxuICAgIGludmFsaWRFbWFpbENTVkFkZHJlc3M6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkRW1haWxDU1ZBZGRyZXNzXCIpLFxyXG4gICAgaW52YWxpZExvZ2luOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZExvZ2luXCIpLFxyXG4gICAgaW52YWxpZEV0aXF1ZXRhOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZEV0aXF1ZXRhXCIpLFxyXG4gICAgaW52YWxpZE5hbWU6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkTmFtZVwiKSxcclxuICAgIGludmFsaWRDb2RpZ286IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkQ29kaWdvXCIpLFxyXG4gICAgaW52YWxpZEFsZmFudW1lcmljbzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRBbGZhbnVtZXJpY29cIiksXHJcbiAgICBpbnZhbGlkQ2FudGlkYWQ6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkQ2FudGlkYWRcIiksXHJcbiAgICBpbnZhbGlkRW50ZXJvUG9zaXRpdm86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkRW50ZXJvUG9zaXRpdm9cIiksXHJcbiAgICBpbnZhbGlkRW50ZXJvUG9zaXRpdm9JbmNsdXllQ2VybzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRFbnRlcm9Qb3NpdGl2b0luY2x1eWVDZXJvXCIpLFxyXG4gICAgaW52YWxpZENhbnRpZGFkRGVjaW1hbDogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRDYW50aWRhZERlY2ltYWxcIiksXHJcbiAgICBpbnZhbGlkTnVtZXJvUG9zaXRpdm86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkTnVtZXJvUG9zaXRpdm9cIiksXHJcbiAgICBpbnZhbGlkQ29kaWdvUG9zdGFsOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZENvZGlnb1Bvc3RhbFwiKSxcclxuICAgIGludmFsaWRUZWxlZm9ubzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRUZWxlZm9ub1wiKSxcclxuICAgIGludmFsaWRUZWxlZm9ub0NTVjogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRUZWxlZm9ub0NTVlwiKSxcclxuICAgIGludmFsaWRQb3JjZW50YWplOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFBvcmNlbnRhamVcIiksXHJcbiAgICBpbnZhbGlkVXJsOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFVybFwiKSxcclxuICAgIGludmFsaWRQYXRoOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFBhdGhcIiksXHJcbiAgICBpbnZhbGlkTklGOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZE5JRlwiKSxcclxuICAgIGludmFsaWROSUU6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkTklFXCIpLFxyXG4gICAgaW52YWxpZENJRjogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRDSUZcIiksXHJcbiAgICBpbnZhbGlkTklGTklFOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZE5JRk5JRVwiKSxcclxuICAgIGludmFsaWRBbnlvOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZEFueW9cIiksXHJcbiAgICBtYXhsZW5ndGg6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJtYXhsZW5ndGhcIiksXHJcbiAgICBpbnZhbGlkTnVtZXJvRG9jdW1lbnRvVGlwb0RvY3VtZW50bzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWROdW1lcm9Eb2N1bWVudG9UaXBvRG9jdW1lbnRvXCIpLFxyXG4gICAgZGlyZWNjaW9uSW5jb21wbGV0YTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImRpcmVjY2lvbkluY29tcGxldGFcIiksXHJcbiAgICByZXF1aXJlZEV4dHJhRGF0YTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcInJlcXVpcmVkRXh0cmFEYXRhXCIpLFxyXG4gICAgaW52YWxpZFJhbmdvRmVjaGFGaW5Qb3N0ZXJpb3JJbmljaW86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkUmFuZ29GZWNoYUZpblBvc3RlcmlvckluaWNpb1wiKSxcclxuICAgIGludmFsaWRSYW5nb0hvcmFGaW5Qb3N0ZXJpb3JJbmljaW86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkUmFuZ29Ib3JhRmluUG9zdGVyaW9ySW5pY2lvXCIpLFxyXG4gICAgaW52YWxpZERhdGVUaW1lTm90QWZ0ZXJDdXJyZW50RGF0ZTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWREYXRlVGltZU5vdEFmdGVyQ3VycmVudERhdGVcIilcclxuICB9O1xyXG5cclxuICBzdGF0aWMgQ3VzdG9tVmFsaWRhdG9yc01hcCA9IHtcclxuICAgIGNvZGlnb051bWVyaWNvOiBDdXN0b21WYWxpZGF0b3JzLmNvZGlnb1ZhbGlkYXRvcixcclxuICAgIGNvZGlnb0FsZmFudW1lcmljbzogQ3VzdG9tVmFsaWRhdG9ycy5hbGZhbnVtZXJpY29WYWxpZGF0b3IsXHJcbiAgICBub21icmU6IEN1c3RvbVZhbGlkYXRvcnMubm9tYnJlVmFsaWRhdG9yLFxyXG4gICAgbnVtZXJvOiBDdXN0b21WYWxpZGF0b3JzLmNhbnRpZGFkRGVjaW1hbFZhbGlkYXRvcixcclxuICAgIGVudGVybzogQ3VzdG9tVmFsaWRhdG9ycy5jYW50aWRhZFZhbGlkYXRvcixcclxuICAgIG51bWVyb1Bvc2l0aXZvOiBDdXN0b21WYWxpZGF0b3JzLm51bWVyb1Bvc2l0aXZvVmFsaWRhdG9yLFxyXG4gICAgZW50ZXJvUG9zaXRpdm86IEN1c3RvbVZhbGlkYXRvcnMuZW50ZXJvUG9zaXRpdm9WYWxpZGF0b3IsXHJcbiAgICBuaWY6IEN1c3RvbVZhbGlkYXRvcnMubmlmVmFsaWRhdG9yLFxyXG4gICAgbmllOiBDdXN0b21WYWxpZGF0b3JzLm5pZVZhbGlkYXRvcixcclxuICAgIGNpZjogQ3VzdG9tVmFsaWRhdG9ycy5jaWZWYWxpZGF0b3IsXHJcbiAgICBuaWZuaWU6IEN1c3RvbVZhbGlkYXRvcnMubmlmTmllVmFsaWRhdG9yLFxyXG4gICAgY3A6IEN1c3RvbVZhbGlkYXRvcnMuY29kaWdvUG9zdGFsVmFsaWRhdG9yLFxyXG4gICAgdGVsZWZvbm86IEN1c3RvbVZhbGlkYXRvcnMudGVsZWZvbm9WYWxpZGF0b3IsXHJcbiAgICB0ZWxlZm9ub0NTVjogQ3VzdG9tVmFsaWRhdG9ycy50ZWxlZm9ub0NTVlZhbGlkYXRvcixcclxuICAgIGVtYWlsQ1NWOiBDdXN0b21WYWxpZGF0b3JzLmVtYWlsQ1NWVmFsaWRhdG9yLFxyXG4gICAgZW1haWw6IEN1c3RvbVZhbGlkYXRvcnMuZW1haWxWYWxpZGF0b3IsXHJcbiAgICBmZWNoYTogQ3VzdG9tVmFsaWRhdG9ycy5kYXRhVmFsaWRhdG9yLFxyXG4gICAgYW55bzogQ3VzdG9tVmFsaWRhdG9ycy5hbnlvVmFsaWRhdG9yXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIGJ1aWxkRXJyb3JNZXNzYWdlKGNvZGU6IHN0cmluZywgcGFyYW1zPzoge30pOiBUcmFuc2xhdGVkTWVzc2FnZSB7XHJcbiAgICByZXR1cm4gYnVpbGRUcmFuc2xhdGVkTWVzc2FnZShcImZvcm0ubWVzc2FnZXMuXCIgKyBjb2RlLCBcImJpdG5nbGlicmFyeVwiLCBwYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFZhbGlkYXRvckVycm9yTWVzc2FnZShjb2RlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBDdXN0b21WYWxpZGF0b3JzLmNvbmZpZ1tjb2RlXTtcclxuICB9XHJcblxyXG4gIC8vIG3DqXRvZG8gcGFyYSB1bmlyIHZhbGlkYWRvcmVzXHJcbiAgc3RhdGljIGNvbXBvc2UodmFsaWRhdG9yczogRnVuY3Rpb25bXSk6IEZ1bmN0aW9uIHtcclxuICAgIGxldCByZXN1bHQgPSBmdW5jdGlvbiAoZzogRm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIGVqZWN1dGFtb3MgY2FkYSB1bm8gZGUgbG9zIHZhbGlkYWRvcmVzIHkgdW5pbW9zIHN1cyByZXN1bHRhZG9zXHJcbiAgICAgIGxldCBpbm5lclJlc3VsdCA9IHZhbGlkYXRvcnMubWFwKCh2YWxpZGF0b3IpID0+IHZhbGlkYXRvcihnKSkucmVkdWNlKChhY2MsIHJlc3VsdCA9IHt9KSA9PiBPYmplY3QuYXNzaWduKGFjYywgcmVzdWx0KSwge30pO1xyXG4gICAgICByZXR1cm4gaW5uZXJSZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZXF1aXJlZChjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICByZXR1cm4geyByZXF1aXJlZDogdHJ1ZSB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBlc3RlIHZhbGlkYWRvciBlbiByZWFsaWRhZCBubyBlc3TDoSBoYWNpZW5kbyBuYWRhIHBvcnF1ZSBiaXQtaW5wdXQsIHBhcmEgZmVjaGFzIG5vIHbDoWxpZGFzLCBzdXN0aXR1eWVcclxuICAvLyBjb250cm9sLnZhbHVlIHBvciB1biBudWxsIHkgZWwgdmFsaWRhZG9yIHBhc2Egc2llbXByZVxyXG4gIHN0YXRpYyBkYXRhVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgLy8gZm9ybWF0byBkZC9NTS95eXl5XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5tYXRjaCgvXigwWzEtOV18MVxcZHwyXFxkfDNbMDFdKVxcLygwWzEtOV18MVswLTJdKVxcLygxOXwyMClcXGR7Mn0kLykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkRGF0ZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIHRpbWVWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICAvLyBmb3JtYXRvIGhoOm1tXHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgKGNvbnRyb2wudmFsdWUgJiYgY29udHJvbC52YWx1ZS5tYXRjaCgvXlswLTldWzAtOV06WzAtOV1bMC05XSQvKSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkVGltZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGVtYWlsVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgLy8gUkZDIDI4MjIgY29tcGxpYW50IHJlZ2V4XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5tYXRjaCgvXFxTK0AoWy1cXHddK1xcLikrXFx3Ky9nKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGludmFsaWRFbWFpbEFkZHJlc3M6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBlbWFpbENTVlZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIC8vIFJGQyAyODIyIGNvbXBsaWFudCByZWdleFxyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubWF0Y2goL14oKCApKltcXHdcXC5dK0AoWy1cXHddK1xcLikrXFx3KyggKSopKCwoICkqW1xcd1xcLl0rQChbLVxcd10rXFwuKStcXHcrKCApKikqJC9nKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGludmFsaWRFbWFpbENTVkFkZHJlc3M6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBsb2dpblZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlLm1hdGNoKC9eW2EtejAtOV8tXXszLDE1fS8pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHsgaW52YWxpZExvZ2luOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXRpcXVldGFWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5tYXRjaCgvXlthLXpBLVowLTlfLV0rLykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkRXRpcXVldGE6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBub21icmVWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICFjb250cm9sLnZhbHVlIHx8XHJcbiAgICAgIC9eKFtBLVphLXowLTlfXFwuXFwsXFwnXFxcIlxcKFxcKVxcO1xcOlxcLVxcL1xcQFxcP1xcJVxcP1xcwr9cXCZcXCtcXC1cXCpcXC9cXCBcXG5cXHLCusKqJ8K04oCZwrfDr8O8P2DDocOpw63Ds8O6w4HDicONw5PDmsOgw6jDrMOyw7nDgMOIw4zDksOZw4TDi8OPw5bDnMOkw6vDr8O2w7zDscORw6fDh8KhISNdKSskLy50ZXN0KGNvbnRyb2wudmFsdWUpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkTmFtZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvZGlnb1ZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlLm1hdGNoKC9eKFswLTldKSskLykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkQ29kaWdvOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYWxmYW51bWVyaWNvVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubWF0Y2goL14oW0EtWjAtOV9cXC5cXC3DkcOHXSkrJC8pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHsgaW52YWxpZEFsZmFudW1lcmljbzogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbnRpZGFkVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgLy8gdmFsdWUgaXMgZWl0aGVyIGVtcHR5LCBvciBhIG51bWJlciB3aXRob3V0IGRlY2ltYWxzXHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGxldCBudW0gPSBOdW1iZXIoY29udHJvbC52YWx1ZSk7XHJcbiAgICBpZiAoIWlzTmFOKG51bSkgJiYgbnVtICUgMSA9PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgaW52YWxpZENhbnRpZGFkOiB0cnVlIH07XHJcbiAgfVxyXG5cclxuICAvKiBWYWxpZGEgbnVtZXJvcyBlbnRlcm9zIChzaW4gZGVjaW1hbGVzKSBwb3NpdGl2b3MgKD49MCkgKi9cclxuICBzdGF0aWMgZW50ZXJvUG9zaXRpdm9WYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICAvLyB2YWx1ZSBpcyBlaXRoZXIgZW1wdHksIG9yIGEgbnVtYmVyIHdpdGhvdXQgZGVjaW1hbHNcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgbGV0IG51bSA9IE51bWJlcihjb250cm9sLnZhbHVlKTtcclxuICAgIGlmICghaXNOYU4obnVtKSAmJiBudW0gJSAxID09IDAgJiYgbnVtID49IDApIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBpbnZhbGlkRW50ZXJvUG9zaXRpdm86IHRydWUgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBlbnRlcm9Qb3NpdGl2b1ZhbGlkYXRvckluY2x1eWVDZXJvVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgLy8gdmFsdWUgaXMgZWl0aGVyIGVtcHR5LCBvciBhIHBvc2l0aXZlIG51bWJlciAoaW5jbHVkaW5nIDApIHdpdGhvdXQgZGVjaW1hbHNcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgbGV0IG51bSA9IE51bWJlcihjb250cm9sLnZhbHVlKTtcclxuICAgIGlmICghaXNOYU4obnVtKSAmJiBudW0gJSAxID09IDAgJiYgbnVtID49IDApIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBpbnZhbGlkRW50ZXJvUG9zaXRpdm9JbmNsdXllQ2VybzogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyogVmFsaWRhIG51bWVyb3MgZW50ZXJvcyAoY29uIGRlY2ltYWxlcykgKi9cclxuICBzdGF0aWMgY2FudGlkYWREZWNpbWFsVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgLy8gdmFsdWUgaXMgZWl0aGVyIGVtcHR5LCBvciBhIG51bWJlciAoaW5jbHVkaW5nIGRlY2ltYWxzKVxyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUgPT09IFwiXCIgfHwgIWlzTmFOKE51bWJlcihjb250cm9sLnZhbHVlKSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkQ2FudGlkYWREZWNpbWFsOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBWYWxpZGEgbnVtZXJvcyBlbnRlcm9zIChjb24gZGVjaW1hbGVzKSBwb3NpdGl2b3MgKD49MCkgKi9cclxuICBzdGF0aWMgbnVtZXJvUG9zaXRpdm9WYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZSA9PT0gXCJcIiB8fCAoIWlzTmFOKE51bWJlcihjb250cm9sLnZhbHVlKSkgJiYgTnVtYmVyKGNvbnRyb2wudmFsdWUpID49IDApKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHsgaW52YWxpZE51bWVyb1Bvc2l0aXZvOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBWYWxpZGEgY29kaWdvIHBvc3RhbCAobnVtZXJvIGRlIDUgZGlnaXRvcykgKi9cclxuICBzdGF0aWMgY29kaWdvUG9zdGFsVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IChjb250cm9sLnZhbHVlLm1hdGNoKC9eKFswLTldKSskLykgJiYgY29udHJvbC52YWx1ZS5sZW5ndGggPT0gNSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkQ29kaWdvUG9zdGFsOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBWYWxpZGEgdGVsZWZvbm8gKG51bWVybyBkZSA5IGRpZ2l0b3MpICovXHJcbiAgc3RhdGljIHRlbGVmb25vVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubWF0Y2goL15bMC05XVswLTldWzAtOV1bMC05XVswLTldWzAtOV1bMC05XVswLTldWzAtOV0kLykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkVGVsZWZvbm86IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIFZhbGlkYSB0ZWxlZm9ubyAobnVtZXJvIGRlIDkgZGlnaXRvcykgKi9cclxuICBzdGF0aWMgdGVsZWZvbm9DU1ZWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5tYXRjaCgvXlswLTldezl9KCggKiwgKilbMC05XXs5fSkqJC9nKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGludmFsaWRUZWxlZm9ub0NTVjogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGJ1aWxkTG9uZ2l0dWRWYWxpZGF0b3IobG9uOiBudW1iZXIpIHtcclxuICAgIGxldCBlcnJvcktleSA9IFwiaW52YWxpZExvbmdpdHVkXCI7XHJcbiAgICBDdXN0b21WYWxpZGF0b3JzLmNvbmZpZ1tlcnJvcktleV0gPSBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKGVycm9yS2V5LCB7IGxvbjogbG9uIH0pO1xyXG4gICAgcmV0dXJuIChjb250cm9sKSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlLmxlbmd0aCA8PSBsb24pIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmV0ID0ge307XHJcbiAgICAgICAgcmV0W2Vycm9yS2V5XSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBidWlsZENhbnRpZGFkTWluVmFsaWRhdG9yKG1pbjogbnVtYmVyKSB7XHJcbiAgICBsZXQgZXJyb3JLZXkgPSBcImludmFsaWRDYW50aWRhZE1pblwiO1xyXG4gICAgQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXldID0gQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShlcnJvcktleSwgeyBtaW46IG1pbiB9KTtcclxuICAgIHJldHVybiAoY29udHJvbCkgPT4ge1xyXG4gICAgICBsZXQgbnVtID0gTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xyXG4gICAgICBpZiAoY29udHJvbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKG51bSkgfHwgbnVtID49IG1pbikge1xyXG4gICAgICAgIC8vIHNpIG5vIGVzIG51bWVyaWNvIG8gZWwgdmFsb3IgPj0gbWluLCBwYXNhIGxhIHZhbGlkYWNpb25cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmV0ID0ge307XHJcbiAgICAgICAgcmV0W2Vycm9yS2V5XSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBidWlsZENhbnRpZGFkTWF4VmFsaWRhdG9yKG1heDogbnVtYmVyKSB7XHJcbiAgICBsZXQgZXJyb3JLZXkgPSBcImludmFsaWRDYW50aWRhZE1heFwiO1xyXG4gICAgQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXldID0gQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShlcnJvcktleSwgeyBtYXg6IG1heCB9KTtcclxuICAgIHJldHVybiAoY29udHJvbCkgPT4ge1xyXG4gICAgICBsZXQgbnVtID0gTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xyXG4gICAgICBpZiAoY29udHJvbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKG51bSkgfHwgbnVtIDw9IG1heCkge1xyXG4gICAgICAgIC8vIHNpIG5vIGVzIG51bWVyaWNvIG8gZWwgdmFsb3IgPD0gbWF4LCBwYXNhIGxhIHZhbGlkYWNpb25cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmV0ID0ge307XHJcbiAgICAgICAgcmV0W2Vycm9yS2V5XSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBidWlsZENhbnRpZGFkTWluTWF4VmFsaWRhdG9yKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xyXG4gICAgbGV0IGVycm9yS2V5ID0gXCJpbnZhbGlkQ2FudGlkYWRNaW5NYXhcIjtcclxuICAgIEN1c3RvbVZhbGlkYXRvcnMuY29uZmlnW2Vycm9yS2V5XSA9IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoZXJyb3JLZXksIHsgbWluOiBtaW4sIG1heDogbWF4IH0pO1xyXG4gICAgcmV0dXJuIChjb250cm9sKSA9PiB7XHJcbiAgICAgIGxldCBudW0gPSBOdW1iZXIoY29udHJvbC52YWx1ZSk7XHJcbiAgICAgIGlmIChjb250cm9sLnZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKG51bSkgJiYgbnVtID49IG1pbiAmJiBudW0gPD0gbWF4KSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHJldCA9IHt9O1xyXG4gICAgICAgIHJldFtlcnJvcktleV0gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcG9yY2VudGFqZVZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIC8vIGV4cGVjdGVkIGEgbnVtZXJpYyB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMFxyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbiA9IE51bWJlcihjb250cm9sLnZhbHVlKTtcclxuICAgICAgaWYgKCFpc05hTihuKSAmJiBuID49IDAgJiYgbiA8PSAxMDApIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4geyBpbnZhbGlkUG9yY2VudGFqZTogdHJ1ZSB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgdXJsVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgdmFyIHBhdHRlcm4gPSBuZXcgUmVnRXhwKFxyXG4gICAgICBcIl4oaHR0cHM/OlxcXFwvXFxcXC8pP1wiICsgLy8gcHJvdG9jb2xcclxuICAgICAgICBcIigoKFthLXpcXFxcZF0oW2EtelxcXFxkLV0qW2EtelxcXFxkXSkqKVxcXFwuPykrW2Etel17Mix9fFwiICsgLy8gZG9tYWluIG5hbWVcclxuICAgICAgICBcIigoXFxcXGR7MSwzfVxcXFwuKXszfVxcXFxkezEsM30pKVwiICsgLy8gT1IgaXAgKHY0KSBhZGRyZXNzXHJcbiAgICAgICAgXCIoXFxcXDpcXFxcZCspPyhcXFxcL1stYS16XFxcXGQlXy5+K10qKSpcIiArIC8vIHBvcnQgYW5kIHBhdGhcclxuICAgICAgICBcIihcXFxcP1s7JmEtelxcXFxkJV8ufis9LV0qKT9cIiArIC8vIHF1ZXJ5IHN0cmluZ1xyXG4gICAgICAgIFwiKFxcXFwjWy1hLXpcXFxcZF9dKik/JFwiLFxyXG4gICAgICBcImlcIlxyXG4gICAgKTsgLy8gZnJhZ21lbnQgbG9jYXRvclxyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IHBhdHRlcm4udGVzdChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGludmFsaWRVcmw6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBwYXRoVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgdmFyIHBhdHRlcm4gPSBuZXcgUmVnRXhwKFxyXG4gICAgICBcIl4oKFxcXFwvKT9bLWEtelxcXFxkJV8ufitdKikqXCIgKyAvLyBwb3J0IGFuZCBwYXRoXHJcbiAgICAgICAgXCIoXFxcXD9bOyZhLXpcXFxcZCVfLn4rPS1dKik/XCIgKyAvLyBxdWVyeSBzdHJpbmdcclxuICAgICAgICBcIihcXFxcI1stYS16XFxcXGRfXSopPyRcIixcclxuICAgICAgXCJpXCJcclxuICAgICk7IC8vIGZyYWdtZW50IGxvY2F0b3JcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBwYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkUGF0aDogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0b3JuYSB1biBzdHJpbmcgY29uIHRvZG9zIGxvcyBlcnJvcmVzIHF1ZSBjb250aWVuZSBlbCBmb3JtdWxhcmlvIHNlcGFyYWRvcyBwb3Igc2FsdG9zIGRlIGzDrW5lYS5cclxuICAgKi9cclxuICBzdGF0aWMgdmFsaWRhdGVGb3JtKGZvcm06IEZvcm1Hcm91cCwgcHJlZml4OiBzdHJpbmdbXSA9IFtdKTogRXJyb3JWYWxpZGF0ZUZvcm1bXSB7XHJcbiAgICBsZXQgbWVuc2FqZXM6IEVycm9yVmFsaWRhdGVGb3JtW10gPSBbXTtcclxuICAgIC8vIGVycm9yZXMgYSBuaXZlbCBkZSBncnVwb1xyXG4gICAgZm9yIChsZXQgZXJyb3JLZXkgaW4gZm9ybS5lcnJvcnMpIHtcclxuICAgICAgbGV0IHByID0gcHJlZml4ID8gYCR7cHJlZml4fTogYCA6IFwiXCI7XHJcbiAgICAgIG1lbnNhamVzLnB1c2goeyBwcmVmaXhlczogW3ByXSwgZXJyb3JNZXNzYWdlOiBDdXN0b21WYWxpZGF0b3JzLmNvbmZpZ1tlcnJvcktleV0gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgY29udHJvbEtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgIGxldCBjb250cm9sID0gZm9ybS5jb250cm9sc1tjb250cm9sS2V5XTtcclxuICAgICAgaWYgKCFjb250cm9sLnZhbGlkKSB7XHJcbiAgICAgICAgLy8gbm8gZXMgdsOhbGlkbywgaGF5IG1lbnNhamVzIHF1ZSByZWN1cGVyYXJcclxuICAgICAgICBsZXQgY29udHJvbExhYmVsOiBzdHJpbmdbXSA9IHByZWZpeC5jb25jYXQoW2NvbnRyb2xLZXldKTsgLy8gbm9tYnJlIGFwaWxhZG9cclxuXHJcbiAgICAgICAgLy8gZGV0ZWN0YW1vcyBzaSBlcyB1biBjYW1wbyBvIHVuIGZvcm11bGFyaW8gYW5pZGFkb1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAvLyBlcyB1biBmb3JtdWxhcmlvIGFuaWRhZG8sIHNlZ3VpbW9zIGJhamFuZG8gcmVjdXJzaXZhbWVudGVcclxuICAgICAgICAgIG1lbnNhamVzID0gbWVuc2FqZXMuY29uY2F0KEN1c3RvbVZhbGlkYXRvcnMudmFsaWRhdGVGb3JtKGNvbnRyb2wsIGNvbnRyb2xMYWJlbCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgICAvLyBlcyB1biBjYW1wbyBmaW5hbCwgYcOxYWRpbW9zIHN1cyBtZW5zYWplcyBkZSBlcnJvclxyXG4gICAgICAgICAgZm9yIChsZXQgZXJyb3JLZXkgaW4gY29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgICAgICAgbWVuc2FqZXMucHVzaCh7IHByZWZpeGVzOiBjb250cm9sTGFiZWwsIGVycm9yTWVzc2FnZTogQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXldIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgLy8gZXMgdW5hIGxpc3RhIGRlIGNvbnRyb2xlcyBhbmlkYWRhLCBsYSByZWNvcnJlbW9zXHJcbiAgICAgICAgICBjb250cm9sLmNvbnRyb2xzICYmXHJcbiAgICAgICAgICAgIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaCgoYXJyQ29udHJvbCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgYXJyQ29udHJvbExhYmVsOiBzdHJpbmdbXSA9IGNvbnRyb2xMYWJlbC5jb25jYXQoW2luZGV4LnRvU3RyaW5nKCldKTtcclxuICAgICAgICAgICAgICBpZiAoYXJyQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXMgdW5hIGxpc3RhIGRlIEZvcm1Hcm91cHMsIGJhamFtb3MgYSBlbGxvcyByZWN1cnNpdmFtZW50ZVxyXG4gICAgICAgICAgICAgICAgbWVuc2FqZXMgPSBtZW5zYWplcy5jb25jYXQoQ3VzdG9tVmFsaWRhdG9ycy52YWxpZGF0ZUZvcm0oYXJyQ29udHJvbCwgYXJyQ29udHJvbExhYmVsKSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcnJDb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIC8vIGVzIHVuYSBsaXN0YSBkZSBGb3JtQ29udHJvbHMsIGxvcyB0cmF0YW1vcyBkZXNkZSBhcXXDrVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZXJyb3JLZXkgaW4gY29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgICAgICAgICAgICAgbWVuc2FqZXMucHVzaCh7IHByZWZpeGVzOiBhcnJDb250cm9sTGFiZWwsIGVycm9yTWVzc2FnZTogQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXldIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyA/Pz8gwr9VbiBhcnJheSBkZSBhcnJheXM/IE5vIGVzdMOhIHByZXZpc3RvLlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJbQ3VzdG9tVmFsaWRhdG9yc10gVW5leHBlY3RlZCBGb3JtQXJyYXkgd2l0aCBuZXN0ZWQgRm9ybUFycmF5c1wiKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1lbnNhamVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVjaWJlIHVuIG9iamV0byBjb24gbGFzIHByb3BpZWRhZGVzIHtmaWVsZFRpcG8sIGZpZWxkTnVtZXJvfSB5IGRldnVlbHZlIHVuIHZhbGlkYWRvciBkZSBmb3JtdWxhcmlvIHBhcmEgZG9jdW1lbnRvcyBkZSBpZGVudGlmaWNhY2nDs24uXHJcbiAgICogRWwgZXJyb3IgcXVlIHB1ZWRlIGdlbmVyYXJzZSBlcyBkZWwgdGlwbyAnaW52YWxpZE51bWVyb0RvY3VtZW50b1RpcG9Eb2N1bWVudG8nLlxyXG4gICAqL1xyXG4gIHN0YXRpYyBidWlsZE51bWVyb0RvY3VtZW50b1ZhbGlkYXRvcih7IGZpZWxkVGlwbyA9IFwiZG9jdW1lbnRvVGlwb1wiLCBmaWVsZE51bWVybyA9IFwiZG9jdW1lbnRvTnVtZXJvXCIgfSA9IHt9KTogRnVuY3Rpb24ge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZ1bmN0aW9uIChnOiBGb3JtR3JvdXApIHtcclxuICAgICAgaWYgKCFnKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGRvY3VtZW50b1RpcG8gPSBnLmdldChmaWVsZFRpcG8pICYmIGcuZ2V0KGZpZWxkVGlwbykudmFsdWU7XHJcbiAgICAgIGxldCBkb2N1bWVudG9OdW1lcm8gPSBnICYmIGcuZ2V0KGZpZWxkTnVtZXJvKSAmJiBnLmdldChmaWVsZE51bWVybykudmFsdWU7XHJcbiAgICAgIGxldCBpbnZhbGlkID0gZmFsc2U7XHJcbiAgICAgIGlmIChkb2N1bWVudG9UaXBvICYmIGRvY3VtZW50b051bWVybykge1xyXG4gICAgICAgIGlmIChkb2N1bWVudG9UaXBvID09IFwiRE5JXCIpIHtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkRE5JKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudG9UaXBvID09IFwiQ0lGXCIpIHtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkQ0lGKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudG9UaXBvID09IFwiTklGXCIpIHtcclxuICAgICAgICAgIC8vaW52YWxpZCA9ICFkb2N1bWVudG9OdW1lcm8ubWF0Y2goL15bMC05XXs4fVthLXp8QS1aXSQvKTtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklGKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudG9UaXBvID09IFwiTklFXCIpIHtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklFKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW52YWxpZCkge1xyXG4gICAgICAgIHJldHVybiB7IGludmFsaWROdW1lcm9Eb2N1bWVudG9UaXBvRG9jdW1lbnRvOiB0cnVlIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG5pZlZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBDdXN0b21WYWxpZGF0b3JzLmlzVmFsaWROSUYoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkTklGOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbmllVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IEN1c3RvbVZhbGlkYXRvcnMuaXNWYWxpZE5JRShjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGludmFsaWROSUU6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBuaWZOaWVWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklGKGNvbnRyb2wudmFsdWUpIHx8IEN1c3RvbVZhbGlkYXRvcnMuaXNWYWxpZE5JRShjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGludmFsaWROSUZOSUU6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjaWZWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICB2YXIgcGF0dGVybiA9IG5ldyBSZWdFeHAoL15bYS16fEEtWl1bMC05XXs3fVthLXp8QS1afDAtOV0vKTsgLy8gVE9ET1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IHBhdHRlcm4udGVzdChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IGludmFsaWRDSUY6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBhbnlvVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgdmFyIHBhdHRlcm4gPSBuZXcgUmVnRXhwKC9eWzAtOV17NH0kLyk7IC8vIFRPRE9cclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBwYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4geyBpbnZhbGlkQW55bzogdHJ1ZSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzVmFsaWRETkkodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7IC8vIMK/ZGViZXLDrWFtb3MgdmFsaWRhciBhbGdvPyBDb24gbGV0cmEgeWEgdGVuZW1vcyBlbCBOSUZcclxuICB9XHJcblxyXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnktdmFsaWRhdGlvbi9qcXVlcnktdmFsaWRhdGlvbi9ibG9iL21hc3Rlci9zcmMvYWRkaXRpb25hbC9jaWZFUy5qc1xyXG4gIHN0YXRpYyBpc1ZhbGlkQ0lGKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHZhciBjaWZSZWdFeCA9IG5ldyBSZWdFeHAoL14oW0FCQ0RFRkdISktMTU5QUVJTVVZXXSkoXFxkezd9KShbMC05QS1KXSkkL2dpKTtcclxuICAgIHZhciBsZXR0ZXIgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgMSksIC8vIFsgVCBdXHJcbiAgICAgIG51bWJlciA9IHZhbHVlLnN1YnN0cmluZygxLCA4KSwgLy8gWyBQIF1bIFAgXVsgTiBdWyBOIF1bIE4gXVsgTiBdWyBOIF1cclxuICAgICAgY29udHJvbCA9IHZhbHVlLnN1YnN0cmluZyg4LCA5KSwgLy8gWyBDIF1cclxuICAgICAgYWxsX3N1bSA9IDAsXHJcbiAgICAgIGV2ZW5fc3VtID0gMCxcclxuICAgICAgb2RkX3N1bSA9IDAsXHJcbiAgICAgIGksXHJcbiAgICAgIG4sXHJcbiAgICAgIGNvbnRyb2xfZGlnaXQsXHJcbiAgICAgIGNvbnRyb2xfbGV0dGVyO1xyXG5cclxuICAgIGZ1bmN0aW9uIGlzT2RkKG4pIHtcclxuICAgICAgcmV0dXJuIG4gJSAyID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFF1aWNrIGZvcm1hdCB0ZXN0XHJcbiAgICBpZiAodmFsdWUubGVuZ3RoICE9PSA5IHx8ICFjaWZSZWdFeC50ZXN0KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBuID0gcGFyc2VJbnQobnVtYmVyW2ldLCAxMCk7XHJcbiAgICAgIC8vIE9kZCBwb3NpdGlvbnNcclxuICAgICAgaWYgKGlzT2RkKGkpKSB7XHJcbiAgICAgICAgLy8gT2RkIHBvc2l0aW9ucyBhcmUgbXVsdGlwbGllZCBmaXJzdC5cclxuICAgICAgICBuICo9IDI7XHJcbiAgICAgICAgLy8gSWYgdGhlIG11bHRpcGxpY2F0aW9uIGlzIGJpZ2dlciB0aGFuIDEwIHdlIG5lZWQgdG8gYWRqdXN0XHJcbiAgICAgICAgb2RkX3N1bSArPSBuIDwgMTAgPyBuIDogbiAtIDk7XHJcbiAgICAgICAgLy8gRXZlbiBwb3NpdGlvbnNcclxuICAgICAgICAvLyBKdXN0IHN1bSB0aGVtXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZXZlbl9zdW0gKz0gbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFsbF9zdW0gPSBldmVuX3N1bSArIG9kZF9zdW07XHJcbiAgICBjb250cm9sX2RpZ2l0ID0gKDEwIC0gTnVtYmVyKGFsbF9zdW0udG9TdHJpbmcoKS5zdWJzdHIoLTEpKSkudG9TdHJpbmcoKTtcclxuICAgIGNvbnRyb2xfZGlnaXQgPSBwYXJzZUludChjb250cm9sX2RpZ2l0LCAxMCkgPiA5ID8gXCIwXCIgOiBjb250cm9sX2RpZ2l0O1xyXG4gICAgY29udHJvbF9sZXR0ZXIgPSBcIkpBQkNERUZHSElcIi5zdWJzdHIoY29udHJvbF9kaWdpdCwgMSkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAvLyBDb250cm9sIG11c3QgYmUgYSBkaWdpdFxyXG4gICAgaWYgKGxldHRlci5tYXRjaCgvW0FCRUhdLykpIHtcclxuICAgICAgcmV0dXJuIGNvbnRyb2wgPT09IGNvbnRyb2xfZGlnaXQ7XHJcbiAgICAgIC8vIENvbnRyb2wgbXVzdCBiZSBhIGxldHRlclxyXG4gICAgfSBlbHNlIGlmIChsZXR0ZXIubWF0Y2goL1tLUFFTXS8pKSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sID09PSBjb250cm9sX2xldHRlcjtcclxuICAgIH1cclxuICAgIC8vIENhbiBiZSBlaXRoZXJcclxuICAgIHJldHVybiBjb250cm9sID09PSBjb250cm9sX2RpZ2l0IHx8IGNvbnRyb2wgPT09IGNvbnRyb2xfbGV0dGVyO1xyXG4gIH1cclxuXHJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS12YWxpZGF0aW9uL2pxdWVyeS12YWxpZGF0aW9uL2Jsb2IvbWFzdGVyL3NyYy9hZGRpdGlvbmFsL25pZkVTLmpzXHJcbiAgc3RhdGljIGlzVmFsaWROSUYodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gQmFzaWMgZm9ybWF0IHRlc3RcclxuICAgIGlmICghdmFsdWUubWF0Y2goXCIoKF5bQS1aXXsxfVswLTldezd9W0EtWjAtOV17MX0kfF5bVF17MX1bQS1aMC05XXs4fSQpfF5bMC05XXs4fVtBLVpdezF9JClcIikpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gVGVzdCBOSUZcclxuICAgIGlmICgvXlswLTldezh9W0EtWl17MX0kLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gXCJUUldBR01ZRlBEWEJOSlpTUVZITENLRVwiLmNoYXJBdChOdW1iZXIodmFsdWUuc3Vic3RyaW5nKDgsIDApKSAlIDIzKSA9PT0gdmFsdWUuY2hhckF0KDgpO1xyXG4gICAgfVxyXG4gICAgLy8gVGVzdCBzcGVjaWFscyBOSUYgKHN0YXJ0cyB3aXRoIEssIEwgb3IgTSlcclxuICAgIGlmICgvXltLTE1dezF9Ly50ZXN0KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWVbOF0gIT09IFwiVFJXQUdNWUZQRFhCTkpaU1FWSExDS0VcIi5jaGFyQXQoTnVtYmVyKHZhbHVlLnN1YnN0cmluZyg4LCAxKSkgJSAyMyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaXNWYWxpZE5JRSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBVbiBOSUUgc2lndWUgdW5hIHZhbGlkYWNpw7NuIG11eSBzaW1pbGFyIGEgbGEgZGUgdW4gRE5JLCBjb24gbGEgZGlmZXJlbmNpYVxyXG4gICAgLy8gZGUgcXVlIGVuIGx1Z2FyIGRlIHNlciBvY2hvIG7Dum1lcm9zICsgbGV0cmEgZGViZSBzZXIgbGV0cmEgKyBzaWV0ZSBuw7ptZXJvcyArIGxldHJhLFxyXG4gICAgLy8gc2llbmRvIGxhIHByaW1lcmEgbGV0cmEgWCwgWSBvIFogc3VzdGl0dWlibGUgcG9yIDAsIDEgbyAyIHJlc3BlY3RpdmFtZW50ZS5cclxuICAgIHZhciBuaWVSZWdFeCA9IG5ldyBSZWdFeHAoL15bWFlaXXsxfVswLTldezd9W1RSV0FHTVlGUERYQk5KWlNRVkhMQ0tFVF17MX0kL2dpKTtcclxuXHJcbiAgICAvLyBTaSBubyB0aWVuZSBlbCBmb3JtYXRvIGLDoXNpY28sIG5vIGVzIHbDoWxpZG9cclxuICAgIGlmICghbmllUmVnRXgudGVzdCh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN1c3RpdHVpbW9zIGxhIHByaW1lcmEgbGV0cmEgcG9yIGVsIG7Dum1lcm8gZXF1aXZhbGVudGUgeSByZWFwcm92ZWNoYW1vcyBsYSB2YWxpZGFjacOzbiBkZSBOSUZcclxuICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL15bWF0vLCBcIjBcIikucmVwbGFjZSgvXltZXS8sIFwiMVwiKS5yZXBsYWNlKC9eW1pdLywgXCIyXCIpO1xyXG5cclxuICAgIHJldHVybiBDdXN0b21WYWxpZGF0b3JzLmlzVmFsaWROSUYodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJhbmdvRmVjaGFzVmFsaWRhdG9yKHsgZmllbGRGZWNoYUluaWNpbyA9IFwiZmVjaGFJbmljaW9cIiwgZmllbGRGZWNoYUZpbiA9IFwiZmVjaGFGaW5cIiB9ID0ge30pOiBGdW5jdGlvbiB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZnVuY3Rpb24gKGc6IEZvcm1Hcm91cCkge1xyXG4gICAgICBpZiAoIWcpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZmVjaGFJbmljaW8gPSBnLmdldChmaWVsZEZlY2hhSW5pY2lvKSAmJiBnLmdldChmaWVsZEZlY2hhSW5pY2lvKS52YWx1ZTtcclxuICAgICAgbGV0IGZlY2hhRmluID0gZyAmJiBnLmdldChmaWVsZEZlY2hhRmluKSAmJiBnLmdldChmaWVsZEZlY2hhRmluKS52YWx1ZTtcclxuICAgICAgaWYgKGZlY2hhSW5pY2lvICYmIGZlY2hhRmluKSB7XHJcbiAgICAgICAgbGV0IGluaWNpbyA9IEdlbmVyYWxVdGlscy5zdHJpbmdTaG9ydFRvRGF0ZShmZWNoYUluaWNpbyk7XHJcbiAgICAgICAgbGV0IGZpbiA9IEdlbmVyYWxVdGlscy5zdHJpbmdTaG9ydFRvRGF0ZShmZWNoYUZpbik7XHJcbiAgICAgICAgaWYgKGluaWNpbyA+IGZpbikge1xyXG4gICAgICAgICAgcmV0dXJuIHsgaW52YWxpZFJhbmdvRmVjaGFGaW5Qb3N0ZXJpb3JJbmljaW86IHRydWUsIHJlcXVpcmVkVGlwb0RhdG9UaXBvQ2hlY2s6IHRydWUgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByYW5nb0hvcmFzVmFsaWRhdG9yKHsgZmllbGRIb3JhSW5pY2lvID0gXCJob3JhSW5pY2lvXCIsIGZpZWxkSG9yYUZpbiA9IFwiaG9yYUZpblwiIH0gPSB7fSk6IEZ1bmN0aW9uIHtcclxuICAgIGxldCByZXN1bHQgPSBmdW5jdGlvbiAoZzogRm9ybUdyb3VwKSB7XHJcbiAgICAgIGlmICghZykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBpbmljaW8gPSBnLmdldChmaWVsZEhvcmFJbmljaW8pICYmIGcuZ2V0KGZpZWxkSG9yYUluaWNpbykudmFsdWUgJiYgR2VuZXJhbFV0aWxzLnN0cmluZ1RvVGltZShnLmdldChmaWVsZEhvcmFJbmljaW8pLnZhbHVlKTtcclxuICAgICAgbGV0IGZpbiA9IGcgJiYgZy5nZXQoZmllbGRIb3JhRmluKSAmJiBnLmdldChmaWVsZEhvcmFGaW4pLnZhbHVlICYmIEdlbmVyYWxVdGlscy5zdHJpbmdUb1RpbWUoZy5nZXQoZmllbGRIb3JhRmluKS52YWx1ZSk7XHJcbiAgICAgIGlmIChpbmljaW8gJiYgZmluICYmIGluaWNpbyA+PSBmaW4pIHtcclxuICAgICAgICByZXR1cm4geyBpbnZhbGlkUmFuZ29Ib3JhRmluUG9zdGVyaW9ySW5pY2lvOiB0cnVlIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkYXRlVGltZU5vdEFmdGVyQ3VycmVudERhdGVWYWxpZGF0b3IoeyBmaWVsZGZlY2hhID0gXCJmZWNoYVwiLCBmaWVsZEhvcmEgPSBcImhvcmFcIiB9ID0ge30pOiBGdW5jdGlvbiB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZnVuY3Rpb24gKGc6IEZvcm1Hcm91cCkge1xyXG4gICAgICBpZiAoIWcpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY2FtcG9GZWNoYSA9IGcuZ2V0KGZpZWxkZmVjaGEpO1xyXG4gICAgICBsZXQgY2FtcG9Ib3JhID0gZy5nZXQoZmllbGRIb3JhKTtcclxuICAgICAgaWYgKGNhbXBvRmVjaGEgJiYgY2FtcG9GZWNoYS52YWx1ZSAmJiBjYW1wb0ZlY2hhLnZhbHVlLm1hdGNoKC9eKDBbMS05XXwxXFxkfDJcXGR8M1swMV0pXFwvKDBbMS05XXwxWzAtMl0pXFwvKDE5fDIwKVxcZHsyfSQvKSkge1xyXG4gICAgICAgIGxldCBkYXRlID0gR2VuZXJhbFV0aWxzLmdldFN0cmluZ0FzRGF0ZShjYW1wb0ZlY2hhLnZhbHVlKTtcclxuICAgICAgICBpZiAoY2FtcG9Ib3JhICYmIGNhbXBvSG9yYS52YWx1ZSAmJiBjYW1wb0hvcmEudmFsdWUubWF0Y2goL15bMC05XVswLTldOlswLTldWzAtOV0kLykpIHtcclxuICAgICAgICAgIGRhdGUuc2V0SG91cnMoY2FtcG9Ib3JhLnZhbHVlLnNwbGl0KFwiOlwiKVswXSk7XHJcbiAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMoY2FtcG9Ib3JhLnZhbHVlLnNwbGl0KFwiOlwiKVsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRlIDwgbmV3IERhdGUoKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHsgaW52YWxpZERhdGVUaW1lTm90QWZ0ZXJDdXJyZW50RGF0ZTogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGJ1aWxkTWluTG9uZ2l0dWRWYWxpZGF0b3IobG9uOiBudW1iZXIpIHtcclxuICAgIGxldCBlcnJvcktleSA9IFwiaW52YWxpZE1pbkxvbmdpdHVkXCI7XHJcbiAgICBDdXN0b21WYWxpZGF0b3JzLmNvbmZpZ1tlcnJvcktleV0gPSBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKGVycm9yS2V5LCB7IGxvbjogbG9uIH0pO1xyXG4gICAgbGV0IHJlc3VsdCA9IChjb250cm9sKSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlLmxlbmd0aCA+PSBsb24pIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmV0ID0ge307XHJcbiAgICAgICAgcmV0W2Vycm9yS2V5XSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
635
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXZhbGlkYXRvcnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JpdC1uZy1saWJyYXJ5L3NyYy9saWIvc2hhcmVkbGlicmFyeS9zZXJ2aWNlcy9jdXN0b20tdmFsaWRhdG9ycy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxNQUFNLE9BQU8sZ0JBQWdCO0lBMEQzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBWSxFQUFFLE1BQVc7UUFDaEQsT0FBTyxzQkFBc0IsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBWTtRQUMxQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBc0I7UUFDbkMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFZO1lBQ2pDLGlFQUFpRTtZQUNqRSxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0gs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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEdlbmVyYWxVdGlscyB9IGZyb20gXCIuL2dlbmVyYWwtdXRpbHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVkTWVzc2FnZSwgRXJyb3JWYWxpZGF0ZUZvcm0gfSBmcm9tIFwiLi4vLi4vYmFzZS9tb2RlbHMvdHlwZXNcIjtcclxuaW1wb3J0IHsgYnVpbGRUcmFuc2xhdGVkTWVzc2FnZSB9IGZyb20gXCIuL3RyYW5zbGF0ZS5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tVmFsaWRhdG9ycyB7XHJcbiAgc3RhdGljIGNvbmZpZyA9IHtcclxuICAgIHJlcXVpcmVkOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwicmVxdWlyZWRcIiksXHJcbiAgICBpbnZhbGlkRGF0ZTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcIkRhdGEgaW5jb3JyZWN0YVwiKSxcclxuICAgIGludmFsaWRUaW1lOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFRpbWVcIiksXHJcbiAgICBpbnZhbGlkRW1haWxBZGRyZXNzOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZEVtYWlsQWRkcmVzc1wiKSxcclxuICAgIGludmFsaWRFbWFpbENTVkFkZHJlc3M6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkRW1haWxDU1ZBZGRyZXNzXCIpLFxyXG4gICAgaW52YWxpZExvZ2luOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZExvZ2luXCIpLFxyXG4gICAgaW52YWxpZEV0aXF1ZXRhOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZEV0aXF1ZXRhXCIpLFxyXG4gICAgaW52YWxpZE5hbWU6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkTmFtZVwiKSxcclxuICAgIGludmFsaWRDb2RpZ286IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkQ29kaWdvXCIpLFxyXG4gICAgaW52YWxpZEFsZmFudW1lcmljbzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRBbGZhbnVtZXJpY29cIiksXHJcbiAgICBpbnZhbGlkQ2FudGlkYWQ6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkQ2FudGlkYWRcIiksXHJcbiAgICBpbnZhbGlkRW50ZXJvUG9zaXRpdm86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkRW50ZXJvUG9zaXRpdm9cIiksXHJcbiAgICBpbnZhbGlkRW50ZXJvUG9zaXRpdm9JbmNsdXllQ2VybzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRFbnRlcm9Qb3NpdGl2b0luY2x1eWVDZXJvXCIpLFxyXG4gICAgaW52YWxpZENhbnRpZGFkRGVjaW1hbDogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRDYW50aWRhZERlY2ltYWxcIiksXHJcbiAgICBpbnZhbGlkTnVtZXJvUG9zaXRpdm86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkTnVtZXJvUG9zaXRpdm9cIiksXHJcbiAgICBpbnZhbGlkQ29kaWdvUG9zdGFsOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZENvZGlnb1Bvc3RhbFwiKSxcclxuICAgIGludmFsaWRUZWxlZm9ubzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRUZWxlZm9ub1wiKSxcclxuICAgIGludmFsaWRUZWxlZm9ub0NTVjogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRUZWxlZm9ub0NTVlwiKSxcclxuICAgIGludmFsaWRQb3JjZW50YWplOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFBvcmNlbnRhamVcIiksXHJcbiAgICBpbnZhbGlkVXJsOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFVybFwiKSxcclxuICAgIGludmFsaWRQYXRoOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZFBhdGhcIiksXHJcbiAgICBpbnZhbGlkTklGOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZE5JRlwiKSxcclxuICAgIGludmFsaWROSUU6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkTklFXCIpLFxyXG4gICAgaW52YWxpZENJRjogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWRDSUZcIiksXHJcbiAgICBpbnZhbGlkTklGTklFOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZE5JRk5JRVwiKSxcclxuICAgIGludmFsaWRBbnlvOiBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKFwiaW52YWxpZEFueW9cIiksXHJcbiAgICBtYXhsZW5ndGg6IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJtYXhsZW5ndGhcIiksXHJcbiAgICBpbnZhbGlkTnVtZXJvRG9jdW1lbnRvVGlwb0RvY3VtZW50bzogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWROdW1lcm9Eb2N1bWVudG9UaXBvRG9jdW1lbnRvXCIpLFxyXG4gICAgZGlyZWNjaW9uSW5jb21wbGV0YTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImRpcmVjY2lvbkluY29tcGxldGFcIiksXHJcbiAgICByZXF1aXJlZEV4dHJhRGF0YTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcInJlcXVpcmVkRXh0cmFEYXRhXCIpLFxyXG4gICAgaW52YWxpZFJhbmdvRmVjaGFGaW5Qb3N0ZXJpb3JJbmljaW86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkUmFuZ29GZWNoYUZpblBvc3RlcmlvckluaWNpb1wiKSxcclxuICAgIGludmFsaWRSYW5nb0hvcmFGaW5Qb3N0ZXJpb3JJbmljaW86IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoXCJpbnZhbGlkUmFuZ29Ib3JhRmluUG9zdGVyaW9ySW5pY2lvXCIpLFxyXG4gICAgaW52YWxpZERhdGVUaW1lTm90QWZ0ZXJDdXJyZW50RGF0ZTogQ3VzdG9tVmFsaWRhdG9ycy5idWlsZEVycm9yTWVzc2FnZShcImludmFsaWREYXRlVGltZU5vdEFmdGVyQ3VycmVudERhdGVcIilcclxuICB9O1xyXG5cclxuICBzdGF0aWMgQ3VzdG9tVmFsaWRhdG9yc01hcCA9IHtcclxuICAgIGNvZGlnb051bWVyaWNvOiBDdXN0b21WYWxpZGF0b3JzLmNvZGlnb1ZhbGlkYXRvcixcclxuICAgIGNvZGlnb0FsZmFudW1lcmljbzogQ3VzdG9tVmFsaWRhdG9ycy5hbGZhbnVtZXJpY29WYWxpZGF0b3IsXHJcbiAgICBub21icmU6IEN1c3RvbVZhbGlkYXRvcnMubm9tYnJlVmFsaWRhdG9yLFxyXG4gICAgbnVtZXJvOiBDdXN0b21WYWxpZGF0b3JzLmNhbnRpZGFkRGVjaW1hbFZhbGlkYXRvcixcclxuICAgIGVudGVybzogQ3VzdG9tVmFsaWRhdG9ycy5jYW50aWRhZFZhbGlkYXRvcixcclxuICAgIG51bWVyb1Bvc2l0aXZvOiBDdXN0b21WYWxpZGF0b3JzLm51bWVyb1Bvc2l0aXZvVmFsaWRhdG9yLFxyXG4gICAgZW50ZXJvUG9zaXRpdm86IEN1c3RvbVZhbGlkYXRvcnMuZW50ZXJvUG9zaXRpdm9WYWxpZGF0b3IsXHJcbiAgICBuaWY6IEN1c3RvbVZhbGlkYXRvcnMubmlmVmFsaWRhdG9yLFxyXG4gICAgbmllOiBDdXN0b21WYWxpZGF0b3JzLm5pZVZhbGlkYXRvcixcclxuICAgIGNpZjogQ3VzdG9tVmFsaWRhdG9ycy5jaWZWYWxpZGF0b3IsXHJcbiAgICBuaWZuaWU6IEN1c3RvbVZhbGlkYXRvcnMubmlmTmllVmFsaWRhdG9yLFxyXG4gICAgY3A6IEN1c3RvbVZhbGlkYXRvcnMuY29kaWdvUG9zdGFsVmFsaWRhdG9yLFxyXG4gICAgdGVsZWZvbm86IEN1c3RvbVZhbGlkYXRvcnMudGVsZWZvbm9WYWxpZGF0b3IsXHJcbiAgICB0ZWxlZm9ub0NTVjogQ3VzdG9tVmFsaWRhdG9ycy50ZWxlZm9ub0NTVlZhbGlkYXRvcixcclxuICAgIGVtYWlsQ1NWOiBDdXN0b21WYWxpZGF0b3JzLmVtYWlsQ1NWVmFsaWRhdG9yLFxyXG4gICAgZW1haWw6IEN1c3RvbVZhbGlkYXRvcnMuZW1haWxWYWxpZGF0b3IsXHJcbiAgICBmZWNoYTogQ3VzdG9tVmFsaWRhdG9ycy5kYXRhVmFsaWRhdG9yLFxyXG4gICAgYW55bzogQ3VzdG9tVmFsaWRhdG9ycy5hbnlvVmFsaWRhdG9yXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIGJ1aWxkRXJyb3JNZXNzYWdlKGNvZGU6IHN0cmluZywgcGFyYW1zPzoge30pOiBUcmFuc2xhdGVkTWVzc2FnZSB7XHJcbiAgICByZXR1cm4gYnVpbGRUcmFuc2xhdGVkTWVzc2FnZShcImZvcm0ubWVzc2FnZXMuXCIgKyBjb2RlLCBcImJpdG5nbGlicmFyeVwiLCBwYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFZhbGlkYXRvckVycm9yTWVzc2FnZShjb2RlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBDdXN0b21WYWxpZGF0b3JzLmNvbmZpZ1tjb2RlXTtcclxuICB9XHJcblxyXG4gIC8vIG3DqXRvZG8gcGFyYSB1bmlyIHZhbGlkYWRvcmVzXHJcbiAgc3RhdGljIGNvbXBvc2UodmFsaWRhdG9yczogRnVuY3Rpb25bXSk6IEZ1bmN0aW9uIHtcclxuICAgIGxldCByZXN1bHQgPSBmdW5jdGlvbiAoZzogRm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIGVqZWN1dGFtb3MgY2FkYSB1bm8gZGUgbG9zIHZhbGlkYWRvcmVzIHkgdW5pbW9zIHN1cyByZXN1bHRhZG9zXHJcbiAgICAgIGxldCBpbm5lclJlc3VsdCA9IHZhbGlkYXRvcnMubWFwKCh2YWxpZGF0b3IpID0+IHZhbGlkYXRvcihnKSkucmVkdWNlKChhY2MsIHJlc3VsdCA9IHt9KSA9PiBPYmplY3QuYXNzaWduKGFjYywgcmVzdWx0KSwge30pO1xyXG4gICAgICByZXR1cm4gaW5uZXJSZXN1bHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZXF1aXJlZChjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICByZXR1cm4ge3JlcXVpcmVkOiB0cnVlfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZXN0ZSB2YWxpZGFkb3IgZW4gcmVhbGlkYWQgbm8gZXN0w6EgaGFjaWVuZG8gbmFkYSBwb3JxdWUgYml0LWlucHV0LCBwYXJhIGZlY2hhcyBubyB2w6FsaWRhcywgc3VzdGl0dXllXHJcbiAgLy8gY29udHJvbC52YWx1ZSBwb3IgdW4gbnVsbCB5IGVsIHZhbGlkYWRvciBwYXNhIHNpZW1wcmVcclxuICBzdGF0aWMgZGF0YVZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIC8vIGZvcm1hdG8gZGQvTU0veXl5eVxyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubWF0Y2goL14oMFsxLTldfDFcXGR8MlxcZHwzWzAxXSlcXC8oMFsxLTldfDFbMC0yXSlcXC8oMTl8MjApXFxkezJ9JC8pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtpbnZhbGlkRGF0ZTogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgdGltZVZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIC8vIGZvcm1hdG8gaGg6bW1cclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCAoY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlLm1hdGNoKC9eWzAtOV1bMC05XTpbMC05XVswLTldJC8pKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7aW52YWxpZFRpbWU6IHRydWV9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGVtYWlsVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgLy8gUkZDIDI4MjIgY29tcGxpYW50IHJlZ2V4XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5tYXRjaCgvXFxTK0AoWy1cXHddK1xcLikrXFx3Ky9nKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7aW52YWxpZEVtYWlsQWRkcmVzczogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZW1haWxDU1ZWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICAvLyBSRkMgMjgyMiBjb21wbGlhbnQgcmVnZXhcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlLm1hdGNoKC9eKCggKSpbXFx3XFwuXStAKFstXFx3XStcXC4pK1xcdysoICkqKSgsKCApKltcXHdcXC5dK0AoWy1cXHddK1xcLikrXFx3KyggKSopKiQvZykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge2ludmFsaWRFbWFpbENTVkFkZHJlc3M6IHRydWV9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGxvZ2luVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubWF0Y2goL15bYS16MC05Xy1dezMsMTV9LykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge2ludmFsaWRMb2dpbjogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXRpcXVldGFWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5tYXRjaCgvXlthLXpBLVowLTlfLV0rLykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge2ludmFsaWRFdGlxdWV0YTogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbm9tYnJlVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKFxyXG4gICAgICAhY29udHJvbC52YWx1ZSB8fFxyXG4gICAgICAvXihbQS1aYS16MC05X1xcLlxcLFxcJ1xcXCJcXChcXClcXDtcXDpcXC1cXC9cXEBcXD9cXCVcXD9cXMK/XFwmXFwrXFwtXFwqXFwvXFwgXFxuXFxywrrCqifCtOKAmcK3w6/DvD9gw6HDqcOtw7PDusOBw4nDjcOTw5rDoMOow6zDssO5w4DDiMOMw5LDmcOEw4vDj8OWw5zDpMOrw6/DtsO8w7HDkcOnw4fCoSEjXSkrJC8udGVzdChjb250cm9sLnZhbHVlKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtpbnZhbGlkTmFtZTogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29kaWdvVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubWF0Y2goL14oWzAtOV0pKyQvKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7aW52YWxpZENvZGlnbzogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYWxmYW51bWVyaWNvVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubWF0Y2goL14oW0EtWjAtOV9cXC5cXC3DkcOHXSkrJC8pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtpbnZhbGlkQWxmYW51bWVyaWNvOiB0cnVlfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjYW50aWRhZFZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIC8vIHZhbHVlIGlzIGVpdGhlciBlbXB0eSwgb3IgYSBudW1iZXIgd2l0aG91dCBkZWNpbWFsc1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBsZXQgbnVtID0gTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xyXG4gICAgaWYgKCFpc05hTihudW0pICYmIG51bSAlIDEgPT0gMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB7aW52YWxpZENhbnRpZGFkOiB0cnVlfTtcclxuICB9XHJcblxyXG4gIC8qIFZhbGlkYSBuw7ptZXJvcyBlbnRlcm9zIChzaW4gZGVjaW1hbGVzKSBwb3NpdGl2b3MgKD49MCkgKi9cclxuICBzdGF0aWMgZW50ZXJvUG9zaXRpdm9WYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICAvLyB2YWx1ZSBpcyBlaXRoZXIgZW1wdHksIG9yIGEgbnVtYmVyIHdpdGhvdXQgZGVjaW1hbHNcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgbGV0IG51bSA9IE51bWJlcihjb250cm9sLnZhbHVlKTtcclxuICAgIGlmICghaXNOYU4obnVtKSAmJiBudW0gJSAxID09IDAgJiYgbnVtID49IDApIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge2ludmFsaWRFbnRlcm9Qb3NpdGl2bzogdHJ1ZX07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZW50ZXJvUG9zaXRpdm9WYWxpZGF0b3JJbmNsdXllQ2Vyb1ZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIC8vIHZhbHVlIGlzIGVpdGhlciBlbXB0eSwgb3IgYSBwb3NpdGl2ZSBudW1iZXIgKGluY2x1ZGluZyAwKSB3aXRob3V0IGRlY2ltYWxzXHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGxldCBudW0gPSBOdW1iZXIoY29udHJvbC52YWx1ZSk7XHJcbiAgICBpZiAoIWlzTmFOKG51bSkgJiYgbnVtICUgMSA9PSAwICYmIG51bSA+PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtpbnZhbGlkRW50ZXJvUG9zaXRpdm9JbmNsdXllQ2VybzogdHJ1ZX07XHJcbiAgfVxyXG5cclxuICAvKiBWYWxpZGEgbsO6bWVyb3MgZW50ZXJvcyAoY29uIGRlY2ltYWxlcykgKi9cclxuICBzdGF0aWMgY2FudGlkYWREZWNpbWFsVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgLy8gdmFsdWUgaXMgZWl0aGVyIGVtcHR5LCBvciBhIG51bWJlciAoaW5jbHVkaW5nIGRlY2ltYWxzKVxyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IGNvbnRyb2wudmFsdWUgPT09IFwiXCIgfHwgIWlzTmFOKE51bWJlcihjb250cm9sLnZhbHVlKSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge2ludmFsaWRDYW50aWRhZERlY2ltYWw6IHRydWV9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogVmFsaWRhIG7Dum1lcm9zIGVudGVyb3MgKGNvbiBkZWNpbWFsZXMpIHBvc2l0aXZvcyAoPj0wKSAqL1xyXG4gIHN0YXRpYyBudW1lcm9Qb3NpdGl2b1ZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlID09PSBcIlwiIHx8ICghaXNOYU4oTnVtYmVyKGNvbnRyb2wudmFsdWUpKSAmJiBOdW1iZXIoY29udHJvbC52YWx1ZSkgPj0gMCkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge2ludmFsaWROdW1lcm9Qb3NpdGl2bzogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBWYWxpZGEgY8OzZGlnbyBwb3N0YWwgKG51bWVybyBkZSA1IGTDrWdpdG9zKSAqL1xyXG4gIHN0YXRpYyBjb2RpZ29Qb3N0YWxWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgKGNvbnRyb2wudmFsdWUubWF0Y2goL14oWzAtOV0pKyQvKSAmJiBjb250cm9sLnZhbHVlLmxlbmd0aCA9PSA1KSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7aW52YWxpZENvZGlnb1Bvc3RhbDogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBWYWxpZGEgdGVsZWZvbm8gKG51bWVybyBkZSA5IGTDrWdpdG9zKSAqL1xyXG4gIHN0YXRpYyB0ZWxlZm9ub1ZhbGlkYXRvcihjb250cm9sKTogeyBbczogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlLm1hdGNoKC9eWzAtOV1bMC05XVswLTldWzAtOV1bMC05XVswLTldWzAtOV1bMC05XVswLTldJC8pKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtpbnZhbGlkVGVsZWZvbm86IHRydWV9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogVmFsaWRhIHRlbGVmb25vIChudW1lcm8gZGUgOSBkw61naXRvcykgKi9cclxuICBzdGF0aWMgdGVsZWZvbm9DU1ZWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5tYXRjaCgvXlswLTldezl9KCggKiwgKilbMC05XXs5fSkqJC9nKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7aW52YWxpZFRlbGVmb25vQ1NWOiB0cnVlfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBidWlsZExvbmdpdHVkVmFsaWRhdG9yKGxvbjogbnVtYmVyKSB7XHJcbiAgICBsZXQgZXJyb3JLZXkgPSBcImludmFsaWRMb25naXR1ZFwiO1xyXG4gICAgbGV0IGVycm9yS2V5SW5kZXggPSBlcnJvcktleSArIFwiIF9cIiArIGxvbi50b1N0cmluZygpO1xyXG4gICAgQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXlJbmRleF0gPSBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKGVycm9yS2V5LCB7bG9uOiBsb259KTtcclxuICAgIHJldHVybiAoY29udHJvbCkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZS5sZW5ndGggPD0gbG9uKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHJldCA9IHt9O1xyXG4gICAgICAgIHJldFtlcnJvcktleUluZGV4XSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBidWlsZENhbnRpZGFkTWluVmFsaWRhdG9yKG1pbjogbnVtYmVyKSB7XHJcbiAgICBsZXQgZXJyb3JLZXkgPSBcImludmFsaWRDYW50aWRhZE1pblwiO1xyXG4gICAgbGV0IGVycm9yS2V5SW5kZXggPSBlcnJvcktleSArIFwiIF9cIiArIG1pbi50b1N0cmluZygpO1xyXG4gICAgQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXlJbmRleF0gPSBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKGVycm9yS2V5LCB7bWluOiBtaW59KTtcclxuICAgIHJldHVybiAoY29udHJvbCkgPT4ge1xyXG4gICAgICBsZXQgbnVtID0gTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xyXG4gICAgICBpZiAoY29udHJvbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKG51bSkgfHwgbnVtID49IG1pbikge1xyXG4gICAgICAgIC8vIHNpIG5vIGVzIG51bcOpcmljbyBvIGVsIHZhbG9yID49IG1pbiwgcGFzYSBsYSB2YWxpZGFjacOzblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCByZXQgPSB7fTtcclxuICAgICAgICByZXRbZXJyb3JLZXlJbmRleF0gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYnVpbGRDYW50aWRhZE1heFZhbGlkYXRvcihtYXg6IG51bWJlcikge1xyXG4gICAgbGV0IGVycm9yS2V5ID0gXCJpbnZhbGlkQ2FudGlkYWRNYXhcIjtcclxuICAgIGxldCBlcnJvcktleUluZGV4ID0gZXJyb3JLZXkgKyBcIl9cIiArIG1heC50b1N0cmluZygpO1xyXG4gICAgQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXlJbmRleF0gPSBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKGVycm9yS2V5LCB7bWF4OiBtYXh9KTtcclxuICAgIHJldHVybiAoY29udHJvbCkgPT4ge1xyXG4gICAgICBsZXQgbnVtID0gTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xyXG4gICAgICBpZiAoY29udHJvbC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKG51bSkgfHwgbnVtIDw9IG1heCkge1xyXG4gICAgICAgIC8vIHNpIG5vIGVzIG51bcOpcmljbyBvIGVsIHZhbG9yIOKJpCBtYXgsIHBhc2EgbGEgdmFsaWRhY2nDs25cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmV0ID0ge307XHJcbiAgICAgICAgcmV0W2Vycm9yS2V5SW5kZXhdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGJ1aWxkQ2FudGlkYWRNaW5NYXhWYWxpZGF0b3IobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgICBsZXQgZXJyb3JLZXkgPSBcImludmFsaWRDYW50aWRhZE1pbk1heFwiO1xyXG4gICAgbGV0IGVycm9yS2V5SW5kZXggPSBlcnJvcktleSArIFwiX1wiICsgbWluLnRvU3RyaW5nKCkgKyBcIl9cIiArIG1heC50b1N0cmluZygpO1xyXG4gICAgQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXlJbmRleF0gPSBDdXN0b21WYWxpZGF0b3JzLmJ1aWxkRXJyb3JNZXNzYWdlKGVycm9yS2V5LCB7XHJcbiAgICAgIG1pbjogbWluLFxyXG4gICAgICBtYXg6IG1heFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gKGNvbnRyb2wpID0+IHtcclxuICAgICAgbGV0IG51bSA9IE51bWJlcihjb250cm9sLnZhbHVlKTtcclxuICAgICAgaWYgKGNvbnRyb2wudmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIGlmICghaXNOYU4obnVtKSAmJiBudW0gPj0gbWluICYmIG51bSA8PSBtYXgpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmV0ID0ge307XHJcbiAgICAgICAgcmV0W2Vycm9yS2V5SW5kZXhdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHBvcmNlbnRhamVWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICAvLyBleHBlY3RlZCBhIG51bWVyaWMgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDBcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG4gPSBOdW1iZXIoY29udHJvbC52YWx1ZSk7XHJcbiAgICAgIGlmICghaXNOYU4obikgJiYgbiA+PSAwICYmIG4gPD0gMTAwKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHtpbnZhbGlkUG9yY2VudGFqZTogdHJ1ZX07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyB1cmxWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBsZXQgcGF0dGVybiA9IG5ldyBSZWdFeHAoXHJcbiAgICAgIFwiXihodHRwcz86XFxcXC9cXFxcLyk/XCIgKyAvLyBwcm90b2NvbFxyXG4gICAgICBcIigoKFthLXpcXFxcZF0oW2EtelxcXFxkLV0qW2EtelxcXFxkXSkqKVxcXFwuPykrW2Etel17Mix9fFwiICsgLy8gZG9tYWluIG5hbWVcclxuICAgICAgXCIoKFxcXFxkezEsM31cXFxcLil7M31cXFxcZHsxLDN9KSlcIiArIC8vIE9SIGlwICh2NCkgYWRkcmVzc1xyXG4gICAgICBcIihcXFxcOlxcXFxkKyk/KFxcXFwvWy1hLXpcXFxcZCVfLn4rXSopKlwiICsgLy8gcG9ydCBhbmQgcGF0aFxyXG4gICAgICBcIihcXFxcP1s7JmEtelxcXFxkJV8ufis9LV0qKT9cIiArIC8vIHF1ZXJ5IHN0cmluZ1xyXG4gICAgICBcIihcXFxcI1stYS16XFxcXGRfXSopPyRcIixcclxuICAgICAgXCJpXCJcclxuICAgICk7IC8vIGZyYWdtZW50IGxvY2F0b3JcclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBwYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge2ludmFsaWRVcmw6IHRydWV9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIHBhdGhWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBsZXQgcGF0dGVybiA9IG5ldyBSZWdFeHAoXHJcbiAgICAgIFwiXigoXFxcXC8pP1stYS16XFxcXGQlXy5+K10qKSpcIiArIC8vIHBvcnQgYW5kIHBhdGhcclxuICAgICAgXCIoXFxcXD9bOyZhLXpcXFxcZCVfLn4rPS1dKik/XCIgKyAvLyBxdWVyeSBzdHJpbmdcclxuICAgICAgXCIoXFxcXCNbLWEtelxcXFxkX10qKT8kXCIsXHJcbiAgICAgIFwiaVwiXHJcbiAgICApOyAvLyBmcmFnbWVudCBsb2NhdG9yXHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgcGF0dGVybi50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtpbnZhbGlkUGF0aDogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRvcm5hIHVuIHN0cmluZyBjb24gdG9kb3MgbG9zIGVycm9yZXMgcXVlIGNvbnRpZW5lIGVsIGZvcm11bGFyaW8sIHNlcGFyYWRvcyBwb3Igc2FsdG9zIGRlIGzDrW5lYS5cclxuICAgKi9cclxuICBzdGF0aWMgdmFsaWRhdGVGb3JtKGZvcm06IEZvcm1Hcm91cCwgcHJlZml4OiBzdHJpbmdbXSA9IFtdKTogRXJyb3JWYWxpZGF0ZUZvcm1bXSB7XHJcbiAgICBsZXQgbWVuc2FqZXM6IEVycm9yVmFsaWRhdGVGb3JtW10gPSBbXTtcclxuICAgIC8vIGVycm9yZXMgZW4gdMOpcm1pbm9zIGRlIGdydXBvXHJcbiAgICBmb3IgKGxldCBlcnJvcktleSBpbiBmb3JtLmVycm9ycykge1xyXG4gICAgICBsZXQgcHIgPSBwcmVmaXggPyBgJHtwcmVmaXh9OiBgIDogXCJcIjtcclxuICAgICAgbWVuc2FqZXMucHVzaCh7cHJlZml4ZXM6IFtwcl0sIGVycm9yTWVzc2FnZTogQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXldfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgY29udHJvbEtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgIGxldCBjb250cm9sID0gZm9ybS5jb250cm9sc1tjb250cm9sS2V5XTtcclxuICAgICAgaWYgKCFjb250cm9sLnZhbGlkKSB7XHJcbiAgICAgICAgLy8gbm8gZXMgdsOhbGlkbywgaGF5IG1lbnNhamVzIHF1ZSByZWN1cGVyYXJcclxuICAgICAgICBsZXQgY29udHJvbExhYmVsOiBzdHJpbmdbXSA9IHByZWZpeC5jb25jYXQoW2NvbnRyb2xLZXldKTsgLy8gbm9tYnJlIGFwaWxhZG9cclxuXHJcbiAgICAgICAgLy8gZGV0ZWN0YW1vcyBzaSBlcyB1biBjYW1wbyBvIHVuIGZvcm11bGFyaW8gYW5pZGFkb1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAvLyBlcyB1biBmb3JtdWxhcmlvIGFuaWRhZG8sIHNlZ3VpbW9zIGJhamFuZG8gcmVjdXJzaXZhbWVudGVcclxuICAgICAgICAgIG1lbnNhamVzID0gbWVuc2FqZXMuY29uY2F0KEN1c3RvbVZhbGlkYXRvcnMudmFsaWRhdGVGb3JtKGNvbnRyb2wsIGNvbnRyb2xMYWJlbCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgICAvLyBlcyB1biBjYW1wbyBmaW5hbCwgYcOxYWRpbW9zIHN1cyBtZW5zYWplcyBkZSBlcnJvclxyXG4gICAgICAgICAgZm9yIChsZXQgZXJyb3JLZXkgaW4gY29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgICAgICAgbWVuc2FqZXMucHVzaCh7cHJlZml4ZXM6IGNvbnRyb2xMYWJlbCwgZXJyb3JNZXNzYWdlOiBDdXN0b21WYWxpZGF0b3JzLmNvbmZpZ1tlcnJvcktleV19KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgIC8vIGVzIHVuYSBsaXN0YSBkZSBjb250cm9sZXMgYW5pZGFkYSwgbGEgcmVjb3JyZW1vc1xyXG4gICAgICAgICAgY29udHJvbC5jb250cm9scyAmJlxyXG4gICAgICAgICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKChhcnJDb250cm9sLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYXJyQ29udHJvbExhYmVsOiBzdHJpbmdbXSA9IGNvbnRyb2xMYWJlbC5jb25jYXQoW2luZGV4LnRvU3RyaW5nKCldKTtcclxuICAgICAgICAgICAgaWYgKGFyckNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAvLyBlcyB1bmEgbGlzdGEgZGUgRm9ybUdyb3VwcywgYmFqYW1vcyBhIGVsbG9zIHJlY3Vyc2l2YW1lbnRlXHJcbiAgICAgICAgICAgICAgbWVuc2FqZXMgPSBtZW5zYWplcy5jb25jYXQoQ3VzdG9tVmFsaWRhdG9ycy52YWxpZGF0ZUZvcm0oYXJyQ29udHJvbCwgYXJyQ29udHJvbExhYmVsKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJyQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgLy8gZXMgdW5hIGxpc3RhIGRlIEZvcm1Db250cm9scywgbG9zIHRyYXRhbW9zIGRlc2RlIGFxdcOtXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgZXJyb3JLZXkgaW4gY29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgICAgICAgICAgIG1lbnNhamVzLnB1c2goe3ByZWZpeGVzOiBhcnJDb250cm9sTGFiZWwsIGVycm9yTWVzc2FnZTogQ3VzdG9tVmFsaWRhdG9ycy5jb25maWdbZXJyb3JLZXldfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vID8/PyDCv1VuIGFycmF5IGRlIGFycmF5cz8gTm8gZXN0w6EgcHJldmlzdG8uXHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJbQ3VzdG9tVmFsaWRhdG9yc10gVW5leHBlY3RlZCBGb3JtQXJyYXkgd2l0aCBuZXN0ZWQgRm9ybUFycmF5c1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVuc2FqZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWNpYmUgdW4gb2JqZXRvIGNvbiBsYXMgcHJvcGllZGFkZXMge2ZpZWxkVGlwbywgZmllbGROdW1lcm99IHkgZGV2dWVsdmUgdW4gdmFsaWRhZG9yIGRlIGZvcm11bGFyaW8gcGFyYSBkb2N1bWVudG9zIGRlIGlkZW50aWZpY2FjacOzbi5cclxuICAgKiBFbCBlcnJvciBxdWUgcHVlZGUgZ2VuZXJhcnNlIGVzIGRlbCB0aXBvICdpbnZhbGlkTnVtZXJvRG9jdW1lbnRvVGlwb0RvY3VtZW50bycuXHJcbiAgICovXHJcbiAgc3RhdGljIGJ1aWxkTnVtZXJvRG9jdW1lbnRvVmFsaWRhdG9yKHtmaWVsZFRpcG8gPSBcImRvY3VtZW50b1RpcG9cIiwgZmllbGROdW1lcm8gPSBcImRvY3VtZW50b051bWVyb1wifSA9IHt9KTogRnVuY3Rpb24ge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZ1bmN0aW9uIChnOiBGb3JtR3JvdXApIHtcclxuICAgICAgaWYgKCFnKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGRvY3VtZW50b1RpcG8gPSBnLmdldChmaWVsZFRpcG8pICYmIGcuZ2V0KGZpZWxkVGlwbykudmFsdWU7XHJcbiAgICAgIGxldCBkb2N1bWVudG9OdW1lcm8gPSBnICYmIGcuZ2V0KGZpZWxkTnVtZXJvKSAmJiBnLmdldChmaWVsZE51bWVybykudmFsdWU7XHJcbiAgICAgIGxldCBpbnZhbGlkID0gZmFsc2U7XHJcbiAgICAgIGlmIChkb2N1bWVudG9UaXBvICYmIGRvY3VtZW50b051bWVybykge1xyXG4gICAgICAgIGlmIChkb2N1bWVudG9UaXBvID09IFwiRE5JXCIpIHtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkRE5JKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudG9UaXBvID09IFwiQ0lGXCIpIHtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkQ0lGKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudG9UaXBvID09IFwiTklGXCIpIHtcclxuICAgICAgICAgIC8vaW52YWxpZCA9ICFkb2N1bWVudG9OdW1lcm8ubWF0Y2goL15bMC05XXs4fVthLXp8QS1aXSQvKTtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklGKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudG9UaXBvID09IFwiTklFXCIpIHtcclxuICAgICAgICAgIGludmFsaWQgPSAhQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklFKGRvY3VtZW50b051bWVybyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW52YWxpZCkge1xyXG4gICAgICAgIHJldHVybiB7aW52YWxpZE51bWVyb0RvY3VtZW50b1RpcG9Eb2N1bWVudG86IHRydWV9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBuaWZWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklGKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtpbnZhbGlkTklGOiB0cnVlfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBuaWVWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklFKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtpbnZhbGlkTklFOiB0cnVlfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBuaWZOaWVWYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklGKGNvbnRyb2wudmFsdWUpIHx8IEN1c3RvbVZhbGlkYXRvcnMuaXNWYWxpZE5JRShjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7aW52YWxpZE5JRk5JRTogdHJ1ZX07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2lmVmFsaWRhdG9yKGNvbnRyb2wpOiB7IFtzOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgbGV0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKC9eW2EtenxBLVpdWzAtOV17N31bYS16fEEtWnwwLTldLyk7IC8vIFRPRE9cclxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBwYXR0ZXJuLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge2ludmFsaWRDSUY6IHRydWV9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFueW9WYWxpZGF0b3IoY29udHJvbCk6IHsgW3M6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBsZXQgcGF0dGVybiA9IG5ldyBSZWdFeHAoL15bMC05XXs0fSQvKTsgLy8gVE9ET1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlIHx8IHBhdHRlcm4udGVzdChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7aW52YWxpZEFueW86IHRydWV9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzVmFsaWRETkkodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7IC8vIMK/ZGViZXLDrWFtb3MgdmFsaWRhciBhbGdvPyBDb24gbGV0cmEgeWEgdGVuZW1vcyBlbCBOSUZcclxuICB9XHJcblxyXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnktdmFsaWRhdGlvbi9qcXVlcnktdmFsaWRhdGlvbi9ibG9iL21hc3Rlci9zcmMvYWRkaXRpb25hbC9jaWZFUy5qc1xyXG4gIHN0YXRpYyBpc1ZhbGlkQ0lGKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBjaWZSZWdFeCA9IG5ldyBSZWdFeHAoL14oW0FCQ0RFRkdISktMTU5QUVJTVVZXXSkoXFxkezd9KShbMC05QS1KXSkkL2dpKTtcclxuICAgIGxldCBsZXR0ZXIgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgMSksIC8vIFsgVCBdXHJcbiAgICAgIG51bWJlciA9IHZhbHVlLnN1YnN0cmluZygxLCA4KSwgLy8gWyBQIF1bIFAgXVsgTiBdWyBOIF1bIE4gXVsgTiBdWyBOIF1cclxuICAgICAgY29udHJvbCA9IHZhbHVlLnN1YnN0cmluZyg4LCA5KSwgLy8gWyBDIF1cclxuICAgICAgYWxsX3N1bSA9IDAsXHJcbiAgICAgIGV2ZW5fc3VtID0gMCxcclxuICAgICAgb2RkX3N1bSA9IDAsXHJcbiAgICAgIGksXHJcbiAgICAgIG4sXHJcbiAgICAgIGNvbnRyb2xfZGlnaXQsXHJcbiAgICAgIGNvbnRyb2xfbGV0dGVyO1xyXG5cclxuICAgIGZ1bmN0aW9uIGlzT2RkKG4pIHtcclxuICAgICAgcmV0dXJuIG4gJSAyID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFF1aWNrIGZvcm1hdCB0ZXN0XHJcbiAgICBpZiAodmFsdWUubGVuZ3RoICE9PSA5IHx8ICFjaWZSZWdFeC50ZXN0KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBuID0gcGFyc2VJbnQobnVtYmVyW2ldLCAxMCk7XHJcbiAgICAgIC8vIE9kZCBwb3NpdGlvbnNcclxuICAgICAgaWYgKGlzT2RkKGkpKSB7XHJcbiAgICAgICAgLy8gT2RkIHBvc2l0aW9ucyBhcmUgbXVsdGlwbGllZCBmaXJzdC5cclxuICAgICAgICBuICo9IDI7XHJcbiAgICAgICAgLy8gSWYgdGhlIG11bHRpcGxpY2F0aW9uIGlzIGJpZ2dlciB0aGFuIDEwIHdlIG5lZWQgdG8gYWRqdXN0XHJcbiAgICAgICAgb2RkX3N1bSArPSBuIDwgMTAgPyBuIDogbiAtIDk7XHJcbiAgICAgICAgLy8gRXZlbiBwb3NpdGlvbnNcclxuICAgICAgICAvLyBKdXN0IHN1bSB0aGVtXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZXZlbl9zdW0gKz0gbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFsbF9zdW0gPSBldmVuX3N1bSArIG9kZF9zdW07XHJcbiAgICBjb250cm9sX2RpZ2l0ID0gKDEwIC0gTnVtYmVyKGFsbF9zdW0udG9TdHJpbmcoKS5zdWJzdHJpbmcoLTEpKSkudG9TdHJpbmcoKTtcclxuICAgIGNvbnRyb2xfZGlnaXQgPSBwYXJzZUludChjb250cm9sX2RpZ2l0LCAxMCkgPiA5ID8gXCIwXCIgOiBjb250cm9sX2RpZ2l0O1xyXG4gICAgY29udHJvbF9sZXR0ZXIgPSBcIkpBQkNERUZHSElcIi5zdWJzdHJpbmcoY29udHJvbF9kaWdpdCwgMSkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAvLyBDb250cm9sIG11c3QgYmUgYSBkaWdpdFxyXG4gICAgaWYgKGxldHRlci5tYXRjaCgvW0FCRUhdLykpIHtcclxuICAgICAgcmV0dXJuIGNvbnRyb2wgPT09IGNvbnRyb2xfZGlnaXQ7XHJcbiAgICAgIC8vIENvbnRyb2wgbXVzdCBiZSBhIGxldHRlclxyXG4gICAgfSBlbHNlIGlmIChsZXR0ZXIubWF0Y2goL1tLUFFTXS8pKSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sID09PSBjb250cm9sX2xldHRlcjtcclxuICAgIH1cclxuICAgIC8vIENhbiBiZSBlaXRoZXJcclxuICAgIHJldHVybiBjb250cm9sID09PSBjb250cm9sX2RpZ2l0IHx8IGNvbnRyb2wgPT09IGNvbnRyb2xfbGV0dGVyO1xyXG4gIH1cclxuXHJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS12YWxpZGF0aW9uL2pxdWVyeS12YWxpZGF0aW9uL2Jsb2IvbWFzdGVyL3NyYy9hZGRpdGlvbmFsL25pZkVTLmpzXHJcbiAgc3RhdGljIGlzVmFsaWROSUYodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gQmFzaWMgZm9ybWF0IHRlc3RcclxuICAgIGlmICghdmFsdWUubWF0Y2goXCIoKF5bQS1aXXsxfVswLTldezd9W0EtWjAtOV17MX0kfF5bVF17MX1bQS1aMC05XXs4fSQpfF5bMC05XXs4fVtBLVpdezF9JClcIikpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gVGVzdCBOSUZcclxuICAgIGlmICgvXlswLTldezh9W0EtWl17MX0kLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gXCJUUldBR01ZRlBEWEJOSlpTUVZITENLRVwiLmNoYXJBdChOdW1iZXIodmFsdWUuc3Vic3RyaW5nKDgsIDApKSAlIDIzKSA9PT0gdmFsdWUuY2hhckF0KDgpO1xyXG4gICAgfVxyXG4gICAgLy8gVGVzdCBzcGVjaWFscyBOSUYgKHN0YXJ0cyB3aXRoIEssIEwgb3IgTSlcclxuICAgIGlmICgvXltLTE1dezF9Ly50ZXN0KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWVbOF0gIT09IFwiVFJXQUdNWUZQRFhCTkpaU1FWSExDS0VcIi5jaGFyQXQoTnVtYmVyKHZhbHVlLnN1YnN0cmluZyg4LCAxKSkgJSAyMyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaXNWYWxpZE5JRSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBVbiBOSUUgc2lndWUgdW5hIHZhbGlkYWNpw7NuIG11eSBzaW1pbGFyIGEgbGEgZGUgdW4gRE5JLCBjb24gbGEgZGlmZXJlbmNpYVxyXG4gICAgLy8gZGUgcXVlIGVuIGx1Z2FyIGRlIHNlciBvY2hvIG7Dum1lcm9zICsgbGV0cmEgZGViZSBzZXIgbGV0cmEgKyBzaWV0ZSBuw7ptZXJvcyArIGxldHJhLFxyXG4gICAgLy8gc2llbmRvIGxhIHByaW1lcmEgbGV0cmEgWCwgWSBvIFogc3VzdGl0dWlibGUgcG9yIDAsIDEgbyAyIHJlc3BlY3RpdmFtZW50ZS5cclxuICAgIGxldCBuaWVSZWdFeCA9IG5ldyBSZWdFeHAoL15bWFlaXXsxfVswLTldezd9W1RSV0FHTVlGUERYQk5KWlNRVkhMQ0tFVF17MX0kL2dpKTtcclxuXHJcbiAgICAvLyBTaSBubyB0aWVuZSBlbCBmb3JtYXRvIGLDoXNpY28sIG5vIGVzIHbDoWxpZG9cclxuICAgIGlmICghbmllUmVnRXgudGVzdCh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN1c3RpdHVpbW9zIGxhIHByaW1lcmEgbGV0cmEgcG9yIGVsIG7Dum1lcm8gZXF1aXZhbGVudGUgeSBhcHJvdmVjaGFtb3MgbGEgdmFsaWRhY2nDs24gZGUgTklGXHJcbiAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9eW1hdLywgXCIwXCIpLnJlcGxhY2UoL15bWV0vLCBcIjFcIikucmVwbGFjZSgvXltaXS8sIFwiMlwiKTtcclxuXHJcbiAgICByZXR1cm4gQ3VzdG9tVmFsaWRhdG9ycy5pc1ZhbGlkTklGKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByYW5nb0ZlY2hhc1ZhbGlkYXRvcih7ZmllbGRGZWNoYUluaWNpbyA9IFwiZmVjaGFJbmljaW9cIiwgZmllbGRGZWNoYUZpbiA9IFwiZmVjaGFGaW5cIn0gPSB7fSk6IEZ1bmN0aW9uIHtcclxuICAgIGxldCByZXN1bHQgPSBmdW5jdGlvbiAoZzogRm9ybUdyb3VwKSB7XHJcbiAgICAgIGlmICghZykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBmZWNoYUluaWNpbyA9IGcuZ2V0KGZpZWxkRmVjaGFJbmljaW8pICYmIGcuZ2V0KGZpZWxkRmVjaGFJbmljaW8pLnZhbHVlO1xyXG4gICAgICBsZXQgZmVjaGFGaW4gPSBnICYmIGcuZ2V0KGZpZWxkRmVjaGFGaW4pICYmIGcuZ2V0KGZpZWxkRmVjaGFGaW4pLnZhbHVlO1xyXG4gICAgICBpZiAoZmVjaGFJbmljaW8gJiYgZmVjaGFGaW4pIHtcclxuICAgICAgICBsZXQgaW5pY2lvID0gR2VuZXJhbFV0aWxzLnN0cmluZ1Nob3J0VG9EYXRlKGZlY2hhSW5pY2lvKTtcclxuICAgICAgICBsZXQgZmluID0gR2VuZXJhbFV0aWxzLnN0cmluZ1Nob3J0VG9EYXRlKGZlY2hhRmluKTtcclxuICAgICAgICBpZiAoaW5pY2lvID4gZmluKSB7XHJcbiAgICAgICAgICByZXR1cm4ge2ludmFsaWRSYW5nb0ZlY2hhRmluUG9zdGVyaW9ySW5pY2lvOiB0cnVlLCByZXF1aXJlZFRpcG9EYXRvVGlwb0NoZWNrOiB0cnVlfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByYW5nb0hvcmFzVmFsaWRhdG9yKHtmaWVsZEhvcmFJbmljaW8gPSBcImhvcmFJbmljaW9cIiwgZmllbGRIb3JhRmluID0gXCJob3JhRmluXCJ9ID0ge30pOiBGdW5jdGlvbiB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZnVuY3Rpb24gKGc6IEZvcm1Hcm91cCkge1xyXG4gICAgICBpZiAoIWcpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaW5pY2lvID0gZy5nZXQoZmllbGRIb3JhSW5pY2lvKSAmJiBnLmdldChmaWVsZEhvcmFJbmljaW8pLnZhbHVlICYmIEdlbmVyYWxVdGlscy5zdHJpbmdUb1RpbWUoZy5nZXQoZmllbGRIb3JhSW5pY2lvKS52YWx1ZSk7XHJcbiAgICAgIGxldCBmaW4gPSBnICYmIGcuZ2V0KGZpZWxkSG9yYUZpbikgJiYgZy5nZXQoZmllbGRIb3JhRmluKS52YWx1ZSAmJiBHZW5lcmFsVXRpbHMuc3RyaW5nVG9UaW1lKGcuZ2V0KGZpZWxkSG9yYUZpbikudmFsdWUpO1xyXG4gICAgICBpZiAoaW5pY2lvICYmIGZpbiAmJiBpbmljaW8gPj0gZmluKSB7XHJcbiAgICAgICAgcmV0dXJuIHtpbnZhbGlkUmFuZ29Ib3JhRmluUG9zdGVyaW9ySW5pY2lvOiB0cnVlfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRhdGVUaW1lTm90QWZ0ZXJDdXJyZW50RGF0ZVZhbGlkYXRvcih7ZmllbGRmZWNoYSA9IFwiZmVjaGFcIiwgZmllbGRIb3JhID0gXCJob3JhXCJ9ID0ge30pOiBGdW5jdGlvbiB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZnVuY3Rpb24gKGc6IEZvcm1Hcm91cCkge1xyXG4gICAgICBpZiAoIWcpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY2FtcG9GZWNoYSA9IGcuZ2V0KGZpZWxkZmVjaGEpO1xyXG4gICAgICBsZXQgY2FtcG9Ib3JhID0gZy5nZXQoZmllbGRIb3JhKTtcclxuICAgICAgaWYgKGNhbXBvRmVjaGEgJiYgY2FtcG9GZWNoYS52YWx1ZSAmJiBjYW1wb0ZlY2hhLnZhbHVlLm1hdGNoKC9eKDBbMS05XXwxXFxkfDJcXGR8M1swMV0pXFwvKDBbMS05XXwxWzAtMl0pXFwvKDE5fDIwKVxcZHsyfSQvKSkge1xyXG4gICAgICAgIGxldCBkYXRlID0gR2VuZXJhbFV0aWxzLmdldFN0cmluZ0FzRGF0ZShjYW1wb0ZlY2hhLnZhbHVlKTtcclxuICAgICAgICBpZiAoY2FtcG9Ib3JhICYmIGNhbXBvSG9yYS52YWx1ZSAmJiBjYW1wb0hvcmEudmFsdWUubWF0Y2goL15bMC05XVswLTldOlswLTldWzAtOV0kLykpIHtcclxuICAgICAgICAgIGRhdGUuc2V0SG91cnMoY2FtcG9Ib3JhLnZhbHVlLnNwbGl0KFwiOlwiKVswXSk7XHJcbiAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMoY2FtcG9Ib3JhLnZhbHVlLnNwbGl0KFwiOlwiKVsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRlIDwgbmV3IERhdGUoKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHtpbnZhbGlkRGF0ZVRpbWVOb3RBZnRlckN1cnJlbnREYXRlOiB0cnVlfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBidWlsZE1pbkxvbmdpdHVkVmFsaWRhdG9yKGxvbjogbnVtYmVyKSB7XHJcbiAgICBsZXQgZXJyb3JLZXkgPSBcImludmFsaWRNaW5Mb25naXR1ZFwiO1xyXG4gICAgbGV0IGVycm9yS2V5SW5kZXggPSBlcnJvcktleSArIFwiX1wiICsgbG9uLnRvU3RyaW5nKCk7XHJcbiAgICBDdXN0b21WYWxpZGF0b3JzLmNvbmZpZ1tlcnJvcktleUluZGV4XSA9IEN1c3RvbVZhbGlkYXRvcnMuYnVpbGRFcnJvck1lc3NhZ2UoZXJyb3JLZXksIHtsb246IGxvbn0pO1xyXG4gICAgbGV0IHJlc3VsdCA9IChjb250cm9sKSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlLmxlbmd0aCA+PSBsb24pIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmV0ID0ge307XHJcbiAgICAgICAgcmV0W2Vycm9yS2V5SW5kZXhdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbn1cclxuIl19