@wavemaker/app-ng-runtime 11.4.0-next.25701 → 11.4.0-next.25703

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. app-ng-runtime/build-task/basic/tree/tree.build.d.ts +2 -1
  2. app-ng-runtime/build-task/bundles/index.umd.js +9 -7
  3. app-ng-runtime/build-task/bundles/index.umd.js.map +1 -1
  4. app-ng-runtime/build-task/esm2015/basic/tree/tree.build.js +4 -3
  5. app-ng-runtime/build-task/esm2015/navigation/popover/popover.build.js +3 -3
  6. app-ng-runtime/build-task/fesm2015/index.js +9 -7
  7. app-ng-runtime/build-task/fesm2015/index.js.map +1 -1
  8. app-ng-runtime/components/base/bundles/index.umd.js +3 -6
  9. app-ng-runtime/components/base/bundles/index.umd.js.map +1 -1
  10. app-ng-runtime/components/base/esm2015/utils/widget-utils.js +4 -7
  11. app-ng-runtime/components/base/fesm2015/index.js +3 -6
  12. app-ng-runtime/components/base/fesm2015/index.js.map +1 -1
  13. app-ng-runtime/components/base/utils/widget-utils.d.ts +1 -1
  14. app-ng-runtime/components/basic/tree/bundles/index.umd.js +256 -280
  15. app-ng-runtime/components/basic/tree/bundles/index.umd.js.map +1 -1
  16. app-ng-runtime/components/basic/tree/esm2015/public_api.js +2 -2
  17. app-ng-runtime/components/basic/tree/esm2015/tree.directive.js +310 -0
  18. app-ng-runtime/components/basic/tree/esm2015/tree.module.js +3 -3
  19. app-ng-runtime/components/basic/tree/fesm2015/index.js +248 -260
  20. app-ng-runtime/components/basic/tree/fesm2015/index.js.map +1 -1
  21. app-ng-runtime/components/basic/tree/index.metadata.json +1 -1
  22. app-ng-runtime/components/basic/tree/public_api.d.ts +1 -1
  23. app-ng-runtime/components/basic/tree/tree.directive.d.ts +35 -0
  24. app-ng-runtime/components/data/list/bundles/index.umd.js +4 -28
  25. app-ng-runtime/components/data/list/bundles/index.umd.js.map +1 -1
  26. app-ng-runtime/components/data/list/esm2015/list.component.js +5 -29
  27. app-ng-runtime/components/data/list/fesm2015/index.js +4 -28
  28. app-ng-runtime/components/data/list/fesm2015/index.js.map +1 -1
  29. app-ng-runtime/components/data/list/index.metadata.json +1 -1
  30. app-ng-runtime/components/dialogs/default/bundles/index.umd.js.map +1 -1
  31. app-ng-runtime/components/dialogs/default/esm2015/base-dialog.js +1 -1
  32. app-ng-runtime/components/dialogs/default/fesm2015/index.js.map +1 -1
  33. app-ng-runtime/components/dialogs/default/index.metadata.json +1 -1
  34. app-ng-runtime/components/input/epoch/bundles/index.umd.js +21 -39
  35. app-ng-runtime/components/input/epoch/bundles/index.umd.js.map +1 -1
  36. app-ng-runtime/components/input/epoch/esm2015/base-date-time.component.js +25 -43
  37. app-ng-runtime/components/input/epoch/esm2015/date/date.component.js +3 -3
  38. app-ng-runtime/components/input/epoch/esm2015/date-time/date-time.component.js +2 -2
  39. app-ng-runtime/components/input/epoch/fesm2015/index.js +27 -45
  40. app-ng-runtime/components/input/epoch/fesm2015/index.js.map +1 -1
  41. app-ng-runtime/components/input/epoch/index.metadata.json +1 -1
  42. app-ng-runtime/components/navigation/popover/bundles/index.umd.js +4 -3
  43. app-ng-runtime/components/navigation/popover/bundles/index.umd.js.map +1 -1
  44. app-ng-runtime/components/navigation/popover/esm2015/popover.component.js +6 -5
  45. app-ng-runtime/components/navigation/popover/fesm2015/index.js +5 -4
  46. app-ng-runtime/components/navigation/popover/fesm2015/index.js.map +1 -1
  47. app-ng-runtime/package.json +1 -1
  48. app-ng-runtime/scripts/datatable/datatable.js +23 -23
  49. app-ng-runtime/variables/bundles/index.umd.js +4 -14
  50. app-ng-runtime/variables/bundles/index.umd.js.map +1 -1
  51. app-ng-runtime/variables/esm2015/manager/action/notification-action.manager.js +6 -5
  52. app-ng-runtime/variables/esm2015/service/variables.service.js +1 -8
  53. app-ng-runtime/variables/fesm2015/index.js +5 -11
  54. app-ng-runtime/variables/fesm2015/index.js.map +1 -1
  55. app-ng-runtime/variables/index.metadata.json +1 -1
  56. app-ng-runtime/variables/service/variables.service.d.ts +0 -4
  57. app-ng-runtime/components/basic/tree/esm2015/tree.component.js +0 -322
  58. app-ng-runtime/components/basic/tree/tree.component.d.ts +0 -34
  59. app-ng-runtime/scripts/tree-keyboard-navigation/keyboard-navigation.js +0 -251
@@ -43,6 +43,7 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
43
43
  this.loadNativeDateInput = isMobile() && !this.showcustompicker;
44
44
  }
45
45
  get timeZone() { return this.inj.get(AbstractI18nService).getTimezone(this); }
46
+ ;
46
47
  /**
47
48
  * returns true if the input value is default (i.e open date picker on input click)
48
49
  * @param1 dropdownvalue, user selected value (by default datepicker opens on input click)
@@ -92,7 +93,7 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
92
93
  };
93
94
  }
94
95
  /* WMS-18269 | Extending the existing validation for 'required' */
95
- if (this['show'] && this['required']) {
96
+ if (this["show"] && this["required"]) {
96
97
  return !!c.value ? null : { required: true };
97
98
  }
98
99
  this.validateType = '';
@@ -233,18 +234,14 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
233
234
  const newDay = newDate.getDate().toString();
234
235
  _.filter($(`span:contains(${newDay})`).not('.is-other-month'), (obj) => {
235
236
  if ($(obj).text() === newDay) {
236
- if ($(obj).hasClass('selected')) {
237
- $(obj).parent().attr('aria-selected', 'true');
238
- }
239
237
  $(obj).attr('aria-label', moment(newDate).format('dddd, MMMM Do YYYY'));
240
- $('[bsdatepickerdaydecorator]').not('.is-other-month').attr('tabindex', '-1');
241
- $(obj).attr('tabindex', '0');
242
238
  $(obj).focus();
243
239
  this.activeDate = newDate;
244
240
  }
245
241
  });
246
242
  if (newDate.getMonth() === new Date().getMonth() && newDate.getFullYear() === new Date().getFullYear()) {
247
243
  this.hightlightToday();
244
+ $(`span:contains(${new Date().getDate().toString()})`).not('.is-other-month').parent().attr('aria-selected', 'true');
248
245
  }
249
246
  });
250
247
  }
@@ -272,7 +269,7 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
272
269
  getMonth(date, inc) {
273
270
  const currentMonth = new Date(date);
274
271
  let month = currentMonth.getMonth();
275
- const year = currentMonth.getFullYear();
272
+ let year = currentMonth.getFullYear();
276
273
  month += inc;
277
274
  const newDate = new Date(year, month);
278
275
  const fullMonth = newDate.toLocaleString('en-US', { month: 'long' });
@@ -294,9 +291,6 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
294
291
  if (event.originalEvent) {
295
292
  this.setFocusForDate(-1);
296
293
  }
297
- setTimeout(() => {
298
- $(`.bs-datepicker-head .previous`).focus();
299
- });
300
294
  });
301
295
  datePickerHead.find(`.next`).click((event) => {
302
296
  this.next = this.getMonth(this.activeDate, 2);
@@ -306,9 +300,6 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
306
300
  if (event.originalEvent) {
307
301
  this.setFocusForDate(1);
308
302
  }
309
- setTimeout(() => {
310
- $(`.bs-datepicker-head .next`).focus();
311
- });
312
303
  });
313
304
  datePickerHead.find(`.current`).click((event) => {
314
305
  // check for original mouse click
@@ -325,22 +316,6 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
325
316
  });
326
317
  datePickerHead.find('.next').attr('aria-label', `Next Month, ${this.next.fullMonth} ${this.next.date.getFullYear()}`);
327
318
  datePickerHead.find('.previous').attr('aria-label', `Previous Month, ${this.prev.fullMonth} ${this.prev.date.getFullYear()}`);
328
- setTimeout(() => {
329
- const currentNodes = datePickerHead.find('.current span');
330
- const msg = 'Changed to month ';
331
- // currentNodes.each((i) => {
332
- // msg =`${msg} ${$(currentNodes[i]).text()}`;
333
- // });
334
- datePickerHead.find('.current').attr("aria-live", "assertive").attr("aria-atomic", "false");
335
- if (this.clicked) {
336
- if ($(currentNodes[0]).text()) {
337
- datePickerHead.find('.ng-star-inserted').prepend(`<div class="sr-only">${msg}</div>`);
338
- }
339
- if ($(currentNodes[1]).text()) {
340
- datePickerHead.find('.current').last().prepend(`<div class="sr-only"> and year </div>`);
341
- }
342
- }
343
- });
344
319
  }
345
320
  /**
346
321
  * This method sets focus for months/days depending on the loaded datepicker table
@@ -504,6 +479,8 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
504
479
  */
505
480
  loadMonths() {
506
481
  setTimeout(() => {
482
+ const datePickerBody = $('.bs-datepicker-body');
483
+ datePickerBody.find('table.months span').attr('tabindex', '0');
507
484
  this.addKeyBoardEventsForMonths();
508
485
  this.addDatepickerMouseEvents();
509
486
  });
@@ -556,6 +533,8 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
556
533
  */
557
534
  loadYears() {
558
535
  setTimeout(() => {
536
+ const datePickerBody = $('.bs-datepicker-body');
537
+ datePickerBody.find('table.years span').attr('tabindex', '0');
559
538
  this.addKeyBoardEventsForYears();
560
539
  this.addDatepickerMouseEvents();
561
540
  });
@@ -576,8 +555,6 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
576
555
  }
577
556
  }
578
557
  setTimeout(() => {
579
- $(`.bs-datepicker-body table.months span`).attr('tabindex', '-1');
580
- $(`.bs-datepicker-body table.months span:contains(${newMonth})`).attr('tabindex', '0');
581
558
  $(`.bs-datepicker-body table.months span:contains(${newMonth})`).focus();
582
559
  this.activeDate = newDate;
583
560
  });
@@ -636,8 +613,6 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
636
613
  }
637
614
  }
638
615
  setTimeout(() => {
639
- $(`.bs-datepicker-body table.years span`).attr('tabindex', '-1');
640
- $(`.bs-datepicker-body table.years span:contains(${newYear})`).attr('tabindex', '0');
641
616
  $(`.bs-datepicker-body table.years span:contains(${newYear})`).focus();
642
617
  this.activeDate = newDate;
643
618
  });
@@ -818,27 +793,37 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
818
793
  }
819
794
  onDateTimeInputBlur() {
820
795
  // removing the opacity on blur of the mobile widget
821
- const displayInputElem = this.getMobileInput();
796
+ let displayInputElem = this.getMobileInput();
822
797
  if (displayInputElem && !hasCordova()) {
823
- const children = this.nativeElement.children;
798
+ let children = this.nativeElement.children;
824
799
  for (let i = 0; i < children.length; i++) {
825
800
  children[i].classList.remove('add-opacity');
826
801
  }
827
802
  displayInputElem.classList.remove('remove-opacity');
803
+ let allDateTimeElements = this.nativeElement.getElementsByTagName('*');
804
+ for (let i = 0; i < allDateTimeElements.length; i++) {
805
+ allDateTimeElements[i].setAttribute('tabindex', this.tabindex);
806
+ }
807
+ displayInputElem.removeAttribute('tabindex');
828
808
  }
829
809
  }
830
810
  onDateTimeInputFocus(skipFocus = false) {
831
811
  if (!this.loadNativeDateInput) {
832
812
  return;
833
813
  }
834
- const displayInputElem = this.getMobileInput();
814
+ let displayInputElem = this.getMobileInput();
835
815
  // toggling the classes to show and hide the native widget using opacity
836
816
  if (skipFocus && !hasCordova()) {
837
- const children = this.nativeElement.children;
817
+ let children = this.nativeElement.children;
838
818
  for (let i = 0; i < children.length; i++) {
839
819
  children[i].classList.add('add-opacity');
840
820
  }
841
821
  displayInputElem.classList.add('remove-opacity');
822
+ let allDateTimeElements = this.nativeElement.getElementsByTagName('*');
823
+ for (let i = 0; i < allDateTimeElements.length; i++) {
824
+ allDateTimeElements[i].setAttribute('tabindex', '-1');
825
+ }
826
+ displayInputElem.setAttribute('tabindex', this.tabindex);
842
827
  return;
843
828
  }
844
829
  if (displayInputElem && this._triggeredByUser) {
@@ -928,12 +913,9 @@ export class BaseDateTimeComponent extends BaseFormCustomComponent {
928
913
  this.containerTarget = getContainerTargetClass(this.nativeElement);
929
914
  this.isReadOnly = this.dataentrymode != 'undefined' && !this.isDataEntryModeEnabledOnInput(this.dataentrymode);
930
915
  // this mobileinput width varies in ios hence setting width here.
931
- const mobileInput = this.getMobileInput();
916
+ let mobileInput = this.getMobileInput();
932
917
  if (mobileInput) {
933
- setTimeout(() => {
934
- mobileInput.style.width = '100%';
935
- mobileInput.style.height = '100%';
936
- });
918
+ mobileInput.style.width = mobileInput.parentElement.clientWidth + 'px';
937
919
  }
938
920
  }
939
921
  ngOnDestroy() {
@@ -962,4 +944,4 @@ BaseDateTimeComponent.propDecorators = {
962
944
  bsTimePicker: [{ type: ViewChild, args: [TimepickerComponent,] }],
963
945
  datetimepickerComponent: [{ type: ViewChild, args: [DateTimePickerComponent,] }]
964
946
  };
965
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRlLXRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2Vwb2NoL3NyYy9iYXNlLWRhdGUtdGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixRQUFRLEVBQWEsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd6RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakYsT0FBTyxFQUNILG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFFBQVEsRUFDUixRQUFRLEVBQ1IsT0FBTyxFQUNWLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQXlCLE1BQU0sMEJBQTBCLENBQUM7QUFDckYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFJbEYsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVB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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIEluamVjdG9yLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3IsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxlRGF5UGVyaW9kcywgRm9ybVN0eWxlLCBUcmFuc2xhdGlvbldpZHRoIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IFRpbWVwaWNrZXJDb21wb25lbnQsIFRpbWVwaWNrZXJDb25maWcgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3RpbWVwaWNrZXInO1xuXG5pbXBvcnQge1xuICAgIEFic3RyYWN0STE4blNlcnZpY2UsXG4gICAgZ2V0RGF0ZU9iaixcbiAgICBnZXRGb3JtYXR0ZWREYXRlLFxuICAgIGdldE5hdGl2ZURhdGVPYmplY3QsXG4gICAgaGFzQ29yZG92YSxcbiAgICBpc0lvcyxcbiAgICBpc01vYmlsZSxcbiAgICBpc1N0cmluZyxcbiAgICBzZXRBdHRyXG59IGZyb20gJ0B3bS9jb3JlJztcblxuaW1wb3J0IHsgZ2V0Q29udGFpbmVyVGFyZ2V0Q2xhc3MsIFRvRGF0ZVBpcGUgfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcbmltcG9ydCB7IEJhc2VGb3JtQ3VzdG9tQ29tcG9uZW50IH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvaW5wdXQnO1xuaW1wb3J0IHsgQnNEYXRlcGlja2VyQ29uZmlnLCBCc0RhdGVwaWNrZXJEaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtdGltZS8vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQnO1xuXG5kZWNsYXJlIGNvbnN0IG1vbWVudCwgXywgJDtcblxuY29uc3QgQ1VSUkVOVF9EQVRFID0gJ0NVUlJFTlRfREFURSc7XG5jb25zdCBtb250aHMgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcbmNvbnN0IERBVEVQSUNLRVJfRFJPUERPV05fT1BUSU9OUyA9IHtcbiAgICBCVVRUT046ICdidXR0b24nLFxuICAgIERFRkFVTFQ6ICdkZWZhdWx0J1xufTtcbmNvbnN0IERBVEFFTlRSWU1PREVfRFJPUERPV05fT1BUSU9OUyA9IHtcbiAgICBQSUNLRVI6ICdwaWNrZXInLFxuICAgIERFRkFVTFQ6ICdkZWZhdWx0J1xufTtcblxuLy8gUHJvdmlkaW5nIG1lcmlkaWFucyB0byB0aGUgdGltZXBpY2tlciBiYWVzZCBvbiBzZWxlY3RlZCBsb2NhbGVcbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lcGlja2VyQ29uZmlnKGkxOG5TZXJ2aWNlKTogVGltZXBpY2tlckNvbmZpZyB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFRpbWVwaWNrZXJDb25maWcoKSwge1xuICAgICAgICBtZXJpZGlhbnM6IGdldExvY2FsZURheVBlcmlvZHMoaTE4blNlcnZpY2UuZ2V0U2VsZWN0ZWRMb2NhbGUoKSwgRm9ybVN0eWxlLkZvcm1hdCwgVHJhbnNsYXRpb25XaWR0aC5BYmJyZXZpYXRlZClcbiAgICB9KTtcbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZURhdGVUaW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1DdXN0b21Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIFZhbGlkYXRvciB7XG4gICAgcHVibGljIHJlcXVpcmVkOiBib29sZWFuO1xuICAgIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgdGFiaW5kZXg6IGFueTtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBhdXRvZm9jdXM6IGJvb2xlYW47XG4gICAgcHVibGljIHJlYWRvbmx5OiBib29sZWFuO1xuICAgIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIHB1YmxpYyBzaG9ydGN1dGtleTogc3RyaW5nO1xuICAgIHB1YmxpYyBfdHJpZ2dlcmVkQnlVc2VyOiBib29sZWFuO1xuXG4gICAgcHVibGljIGV4Y2x1ZGVkYXlzOiBzdHJpbmc7XG4gICAgcHVibGljIGV4Y2x1ZGVkRGF5c1RvRGlzYWJsZTogQXJyYXk8bnVtYmVyPjtcbiAgICBwdWJsaWMgZXhjbHVkZWREYXRlc1RvRGlzYWJsZTogQXJyYXk8RGF0ZT47XG4gICAgcHVibGljIGV4Y2x1ZGVkYXRlcztcbiAgICBwdWJsaWMgb3V0cHV0Zm9ybWF0O1xuICAgIHB1YmxpYyBtaW5kYXRlO1xuICAgIHB1YmxpYyBtYXhkYXRlO1xuICAgIHB1YmxpYyBkYXRhZW50cnltb2RlO1xuICAgIHByb3RlY3RlZCBhY3RpdmVEYXRlO1xuICAgIHByaXZhdGUga2V5RXZlbnRQbHVnaW5JbnN0YW5jZTtcbiAgICBwcml2YXRlIGVsZW1lbnRTY29wZTtcbiAgICBwdWJsaWMgZGF0ZXBhdHRlcm47XG4gICAgcHVibGljIHRpbWVwYXR0ZXJuO1xuICAgIHByb3RlY3RlZCBzaG93c2Vjb25kczogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgaXNtZXJpZGlhbjogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgbWVyaWRpYW5zOiBhbnk7XG4gICAgcHJvdGVjdGVkIGRhdGVQaXBlO1xuICAgIHByb3RlY3RlZCBpMThuU2VydmljZTtcbiAgICBwdWJsaWMgaXNSZWFkT25seSA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBzZWxlY3RlZExvY2FsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzZWxlY3Rmcm9tb3RoZXJtb250aDogYm9vbGVhbjtcbiAgICBwdWJsaWMgdG9kYXlidXR0b246IGJvb2xlYW47XG4gICAgcHVibGljIGNsZWFyYnV0dG9uOiBib29sZWFuO1xuICAgIHB1YmxpYyByZW1vdmVLZXl1cExpc3RlbmVyO1xuICAgIHB1YmxpYyBsb2FkTmF0aXZlRGF0ZUlucHV0O1xuICAgIHB1YmxpYyBzaG93Y3VzdG9tcGlja2VyO1xuICAgIHB1YmxpYyBuZXh0O1xuICAgIHB1YmxpYyBwcmV2O1xuICAgIHB1YmxpYyBjbGlja2VkID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgZGF0ZU5vdEluUmFuZ2U6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIHRpbWVOb3RJblJhbmdlOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBpbnZhbGlkRGF0ZVRpbWVGb3JtYXQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIGRhdGVPblNob3dTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgZ2V0IHRpbWVab25lKCkgeyByZXR1cm4gdGhpcy5pbmouZ2V0KEFic3RyYWN0STE4blNlcnZpY2UpLmdldFRpbWV6b25lKHRoaXMpOyB9XG5cbiAgICBmb3JtYXRzQnlMb2NhbGUgPSB7J3RpbWV6b25lJzogJyd9O1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBwcm9wZXJ0eSB1c2VkIHRvIG1hcCB0aGUgY29udGFpbmVyQ2xhc3MsIHNob3dXZWVrTnVtYmVycyBldGMuLCB0byB0aGUgYnNEYXRlcGlja2VyXG4gICAgICovXG4gICAgcHVibGljIF9kYXRlT3B0aW9uczogQnNEYXRlcGlja2VyQ29uZmlnID0gbmV3IEJzRGF0ZXBpY2tlckNvbmZpZygpO1xuICAgIHByb3RlY3RlZCBic0RhdGVQaWNrZXJEaXJlY3RpdmU6IEJzRGF0ZXBpY2tlckRpcmVjdGl2ZTtcblxuICAgIEBWaWV3Q2hpbGQoQnNEcm9wZG93bkRpcmVjdGl2ZSkgcHJvdGVjdGVkIGJzRHJvcGRvd247XG4gICAgQFZpZXdDaGlsZChUaW1lcGlja2VyQ29tcG9uZW50KSBwcm90ZWN0ZWQgYnNUaW1lUGlja2VyO1xuICAgIEBWaWV3Q2hpbGQoRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQpIGRhdGV0aW1lcGlja2VyQ29tcG9uZW50O1xuICAgIHByaXZhdGUgdmFsaWRhdGVUeXBlOiBzdHJpbmc7XG4gICAgY29udGFpbmVyVGFyZ2V0OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihpbmo6IEluamVjdG9yLCBXSURHRVRfQ09ORklHKSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRyk7XG4gICAgICAgIHRoaXMuaTE4blNlcnZpY2UgPSB0aGlzLmluai5nZXQoQWJzdHJhY3RJMThuU2VydmljZSk7XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3JlbG9hZCcpO1xuXG4gICAgICAgIHRoaXMuZGF0ZVBpcGUgPSB0aGlzLmluai5nZXQoVG9EYXRlUGlwZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhbGUgPSB0aGlzLmkxOG5TZXJ2aWNlLmdldFNlbGVjdGVkTG9jYWxlKCk7XG4gICAgICAgIHRoaXMuX2RhdGVPcHRpb25zLnRvZGF5UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICAgIHRoaXMuX2RhdGVPcHRpb25zLmNsZWFyUG9zaXRpb24gPSAncmlnaHQnO1xuICAgICAgICB0aGlzLm1lcmlkaWFucyA9IGdldExvY2FsZURheVBlcmlvZHModGhpcy5zZWxlY3RlZExvY2FsZSwgRm9ybVN0eWxlLkZvcm1hdCwgVHJhbnNsYXRpb25XaWR0aC5BYmJyZXZpYXRlZCk7XG4gICAgICAgIHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA9IGlzTW9iaWxlKCkgJiYgIXRoaXMuc2hvd2N1c3RvbXBpY2tlcjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgZGVmYXVsdCAoaS5lIG9wZW4gZGF0ZSBwaWNrZXIgb24gaW5wdXQgY2xpY2spXG4gICAgICogQHBhcmFtMSBkcm9wZG93bnZhbHVlLCB1c2VyIHNlbGVjdGVkIHZhbHVlIChieSBkZWZhdWx0IGRhdGVwaWNrZXIgb3BlbnMgb24gaW5wdXQgY2xpY2spXG4gICAgICogKiovXG4gICAgcHJvdGVjdGVkIGlzRHJvcERvd25EaXNwbGF5RW5hYmxlZE9uSW5wdXQoZHJvcGRvd252YWx1ZSkge1xuICAgICAgICByZXR1cm4gZHJvcGRvd252YWx1ZSA9PT0gREFURVBJQ0tFUl9EUk9QRE9XTl9PUFRJT05TLkRFRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCB2YWx1ZSBpcyBkZWZhdWx0IChpLmUgRGF0YSBlbnRyeSBjYW4gYmUgZG9uZSBlaXRoZXIgYnkgc2VsZWN0aW5nIGZyb20gdGhlIERhdGUvRGF0ZVRpbWUvVGltZSBQaWNrZXIgb3IgYnkgZW50ZXJpbmcgIG1hbnVhbGx5IHVzaW5nIHRoZSBrZXlib2FyZC4gKVxuICAgICAqIEBwYXJhbTEgZHJvcGRvd252YWx1ZSwgdXNlciBzZWxlY3RlZCB2YWx1ZVxuICAgICAqICoqL1xuICAgIHByb3RlY3RlZCBpc0RhdGFFbnRyeU1vZGVFbmFibGVkT25JbnB1dChkcm9wZG93bnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkcm9wZG93bnZhbHVlID09PSBEQVRBRU5UUllNT0RFX0RST1BET1dOX09QVElPTlMuREVGQVVMVDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzaG93IHZhbGlkYXRpb24gbWVzc2FnZSBkZXBlbmRpbmcgb24gdGhlIGlzTmF0aXZlUGlja2VyIGZsYWcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzaG93VmFsaWRhdGlvbigkZXZlbnQsIGRpc3BsYXlWYWx1ZSwgaXNOYXRpdmVQaWNrZXIsIG1zZykge1xuICAgICAgICBpZiAoaXNOYXRpdmVQaWNrZXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignbWluIG1heCBkYXRlIHZhbGlkYXRpb24gZmFpbGVkICcsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gJCgkZXZlbnQudGFyZ2V0KS52YWwoZGlzcGxheVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0RGlzcGxheUlucHV0KCkge1xuICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnLmRpc3BsYXktaW5wdXQnKS52YWwoJycpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICAgICAgaWYgKHRoaXMuaW52YWxpZERhdGVUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGludmFsaWREYXRlVGltZUZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmRhdGVOb3RJblJhbmdlKSAmJiB0aGlzLmRhdGVOb3RJblJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGVOb3RJblJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLnRpbWVOb3RJblJhbmdlKSAmJiB0aGlzLnRpbWVOb3RJblJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRpbWVOb3RJblJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8qIFdNUy0xODI2OSB8IEV4dGVuZGluZyB0aGUgZXhpc3RpbmcgdmFsaWRhdGlvbiBmb3IgJ3JlcXVpcmVkJyAqL1xuICAgICAgICBpZiAodGhpc1snc2hvdyddICYmIHRoaXNbJ3JlcXVpcmVkJ10pIHtcbiAgICAgICAgICAgIHJldHVybiAhIWMudmFsdWUgPyBudWxsIDogeyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJyc7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdmFsaWRhdGUgZGF0ZSBwYXR0ZXJuIGFuZCB0aW1lIHBhdHRlcm5cbiAgICAgKiBJZiB1c2VyIHNlbGVjdHMgb25lIHBhdHRlcm4gaW4gZGVzaWduIHRpbWUgYW5kIGlmIGhlIHRyaWVzIHRvIGVudGVyIHRoZSBkYXRlIGluIGFub3RoZXIgcGF0dGVybiB0aGVuIHRoZSBkZXZpY2UgaXMgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0VmFsaWRhdGlvbihuZXdWYWwsIGlucHV0VmFsLCBpc05hdGl2ZVBpY2tlcj86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZGF0ZXBhdHRlcm4gfHwgdGhpcy50aW1lcGF0dGVybjtcbiAgICAgICAgY29uc3QgdGltZVpvbmUgPSB0aGlzLnRpbWVab25lO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBuZXdWYWwsIHBhdHRlcm4sIHRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKTtcbiAgICAgICAgaW5wdXRWYWwgPSBpbnB1dFZhbC50cmltKCk7XG4gICAgICAgIGlmIChpbnB1dFZhbCkge1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfLmlzTmFOKGlucHV0VmFsKSAmJiBfLnBhcnNlSW50KGlucHV0VmFsKSAhPT0gZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlVGltZUZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJ2luY29ycmVjdGZvcm1hdCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYXRpdmVQaWNrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0IHRoZSBkYXRlIHZhbHVlIG9ubHkgd2hlbiBpbnB1dFZhbCBpcyBvYnRhaW5lZCBmcm9tICRldmVudC50YXJnZXQudmFsdWUsIGFzIHRoZSBmb3JtYXQgZG9lc250IG1hdGNoLlxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbCA9IGdldEZvcm1hdHRlZERhdGUodGhpcy5kYXRlUGlwZSwgaW5wdXRWYWwsIHBhdHRlcm4sIHRpbWVab25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0VmFsICE9PSBmb3JtYXR0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGVUaW1lRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUgPSAnaW5jb3JyZWN0Zm9ybWF0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHZhbGlkYXRlIG1pbiBkYXRlLCBtYXggZGF0ZSwgZXhjbHVkZSBkYXRlcyBhbmQgZXhjbHVkZSBkYXlzXG4gICAgICogSW4gbW9iaWxlIGlmIGludmFsaWQgZGF0ZXMgYXJlIGVudGVyZWQsIGRldmljZSBpcyBzaG93aW5nIGFuIGFsZXJ0LlxuICAgICAqIEluIHdlYiBpZiBpbnZhbGlkIGRhdGVzIGFyZSBlbnRlcmVkLCBkZXZpY2UgaXMgc2hvd2luZyB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1pbkRhdGVNYXhEYXRlVmFsaWRhdGlvbk9uSW5wdXQobmV3VmFsLCAkZXZlbnQ/OiBFdmVudCwgZGlzcGxheVZhbHVlPzogc3RyaW5nLCBpc05hdGl2ZVBpY2tlcj86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKG5ld1ZhbCkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVWYWwgPSBuZXdWYWw7XG4gICAgICAgICAgICBuZXdWYWwgPSBtb21lbnQobmV3VmFsKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkRhdGUgPSBtb21lbnQoZ2V0RGF0ZU9iaih0aGlzLm1pbmRhdGUpKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSBtb21lbnQoZ2V0RGF0ZU9iaih0aGlzLm1heGRhdGUpKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pbmRhdGUgJiYgbmV3VmFsIDwgbWluRGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX01JTkRBVEVfVkFMSURBVElPTl9NRVNTQUdFfSAke3RoaXMubWluZGF0ZX0uYDtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYXRpdmVQaWNrZXIgJiYgZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBtaW5EYXRlLCB0aGlzLmRhdGVwYXR0ZXJuLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSA9PT0gZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKCRldmVudC50YXJnZXQpLnZhbChkaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVOb3RJblJhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZSA9ICdtaW5kYXRlJztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaG93VmFsaWRhdGlvbigkZXZlbnQsIGRpc3BsYXlWYWx1ZSwgaXNOYXRpdmVQaWNrZXIsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tYXhkYXRlICYmIG5ld1ZhbCA+IG1heERhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHt0aGlzLmFwcExvY2FsZS5MQUJFTF9NQVhEQVRFX1ZBTElEQVRJT05fTUVTU0FHRX0gJHt0aGlzLm1heGRhdGV9LmA7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmF0aXZlUGlja2VyICYmIGdldEZvcm1hdHRlZERhdGUodGhpcy5kYXRlUGlwZSwgbWF4RGF0ZSwgdGhpcy5kYXRlcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykgPT09IGRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCgkZXZlbnQudGFyZ2V0KS52YWwoZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlTm90SW5SYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUgPSAnbWF4ZGF0ZSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1ZhbGlkYXRpb24oJGV2ZW50LCBkaXNwbGF5VmFsdWUsIGlzTmF0aXZlUGlja2VyLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4Y2x1ZGVEYXRlc0FycmF5O1xuICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZyh0aGlzLmV4Y2x1ZGVkYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZURhdGVzQXJyYXkgPSBfLnNwbGl0KHRoaXMuZXhjbHVkZWRhdGVzLCAnLCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVEYXRlc0FycmF5ID0gdGhpcy5leGNsdWRlZGF0ZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVEYXRlc0FycmF5ID0gZXhjbHVkZURhdGVzQXJyYXkubWFwKGQgPT4gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBkLCB0aGlzLmRhdGVwYXR0ZXJuLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVEYXRlc0FycmF5LmluZGV4T2YoZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBkYXRlVGltZVZhbCwgdGhpcy5kYXRlcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlTm90SW5SYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJ2V4Y2x1ZGVkYXRlcyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZWRheXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGNsdWRlRGF5c0FycmF5ID0gXy5zcGxpdCh0aGlzLmV4Y2x1ZGVkYXlzLCAnLCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRheSA9IF8uZ2V0KGRhdGVUaW1lVmFsLCAnZ2V0RGF5JykgPyBkYXRlVGltZVZhbC5nZXREYXkoKSA6IGRhdGVUaW1lVmFsO1xuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlRGF5c0FycmF5LmluZGV4T2YoZGF5LnRvU3RyaW5nKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlTm90SW5SYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJ2V4Y2x1ZGVkYXlzJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmF0aXZlUGlja2VyKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVOb3RJblJhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaGlnaGxpZ2h0IHRoZSBjdXJyZW50IGRhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGlnaHRsaWdodFRvZGF5KCkge1xuICAgICAgICBjb25zdCB0b0RheSA9IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgICAgIF8uZmlsdGVyKCQoYHNwYW46Y29udGFpbnMoJHt0b0RheX0pYCkubm90KCcuaXMtb3RoZXItbW9udGgnKSwgKG9iaikgPT4ge1xuICAgICAgICAgICAgaWYgKCQob2JqKS50ZXh0KCkgPT09IHRvRGF5KSB7XG4gICAgICAgICAgICAgICAgJChvYmopLmFkZENsYXNzKCdjdXJyZW50LWRhdGUgdGV4dC1pbmZvJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZmluZCB0aGUgbmV3IGRhdGUgaXMgZnJvbSBhbm90aGVyIHllYXIgb3Igbm90XG4gICAgICogQHBhcmFtIG5ld0RhdGUgLSBuZXdseSBzZWxlY3RlZCBkYXRlIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc090aGVyeWVhcihuZXdEYXRlKSB7XG4gICAgICAgIHJldHVybiAobmV3RGF0ZS5nZXRNb250aCgpID09PSAwICYmIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpID09PSAxMSkgfHwgKG5ld0RhdGUuZ2V0TW9udGgoKSA9PT0gMTEgJiYgdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCkgPT09IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGZvY3VzIGZvciBhY3RpdmUgZGF5XG4gICAgICogQHBhcmFtIG5ld0RhdGUgLSBuZXdseSBzZWxlY3RlZCBkYXRlIHZhbHVlXG4gICAgICogQHBhcmFtIGlzTW91c2VFdmVudCAtIGJvb2xlYW4gdmFsdWUgcmVwcmVzZW50cyB0aGUgZXZlbnQgaXMgbW91c2UgZXZlbnQvIGtleWJvYXJkIGV2ZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRBY3RpdmVEYXRlRm9jdXMobmV3RGF0ZSwgaXNNb3VzZUV2ZW50PzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldE5leHREYXRhKG5ld0RhdGUpO1xuICAgICAgICBjb25zdCBhY3RpdmVNb250aCA9IHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICAvLyBjaGVjayBmb3Iga2V5Ym9hcmQgZXZlbnRcbiAgICAgICAgaWYgKCFpc01vdXNlRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChuZXdEYXRlLmdldE1vbnRoKCkgPCBhY3RpdmVNb250aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPdGhlcnllYXIobmV3RGF0ZSkgPyB0aGlzLmdvVG9PdGhlck1vbnRoT3J5ZWFyKCduZXh0JywgJ2RheXMnKSA6IHRoaXMuZ29Ub090aGVyTW9udGhPcnllYXIoJ3ByZXZpb3VzJywgJ2RheXMnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3RGF0ZS5nZXRNb250aCgpID4gYWN0aXZlTW9udGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3RoZXJ5ZWFyKG5ld0RhdGUpID8gdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcigncHJldmlvdXMnLCAnZGF5cycpIDogdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcignbmV4dCcsICdkYXlzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXkgPSBuZXdEYXRlLmdldERhdGUoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgXy5maWx0ZXIoJChgc3Bhbjpjb250YWlucygke25ld0RheX0pYCkubm90KCcuaXMtb3RoZXItbW9udGgnKSwgKG9iaikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgkKG9iaikudGV4dCgpID09PSBuZXdEYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCQob2JqKS5oYXNDbGFzcygnc2VsZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAkKG9iaikucGFyZW50KCkuYXR0cignYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJChvYmopLmF0dHIoJ2FyaWEtbGFiZWwnLCBtb21lbnQobmV3RGF0ZSkuZm9ybWF0KCdkZGRkLCBNTU1NIERvIFlZWVknKSk7XG4gICAgICAgICAgICAgICAgICAgICQoJ1tic2RhdGVwaWNrZXJkYXlkZWNvcmF0b3JdJykubm90KCcuaXMtb3RoZXItbW9udGgnKS5hdHRyKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgICAgICAgICAgICAgICAkKG9iaikuYXR0cigndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICAgICAgICAgICAgICAkKG9iaikuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3RGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChuZXdEYXRlLmdldE1vbnRoKCkgPT09IG5ldyBEYXRlKCkuZ2V0TW9udGgoKSAmJiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgPT09IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlnaHRsaWdodFRvZGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBsb2FkIG90aGVyIG1vbnRoIGRheXMgb3Igb3RoZXIgbW9udGggb3Igb3RoZXIgeWVhclxuICAgICAqIEBwYXJhbSBidG5DbGFzcyAtIGNsYXNzKHByZXZpb3VzL25leHQpIG9mIHRoZSBidXR0b24gd2hpY2ggd2UgaGF2ZSB0byBjbGlja1xuICAgICAqIEBwYXJhbSB0aW1lUGVyaW9kIC0gU3RyaW5nIHZhbHVlIGRlY2lkZXMgdG8gbG9hZCBvdGhlciBtb250aCBkYXlzIG9yIG90aGVyIG1vbnRoIG9yIG90aGVyIHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGdvVG9PdGhlck1vbnRoT3J5ZWFyKGJ0bkNsYXNzLCB0aW1lUGVyaW9kKSB7XG4gICAgICAgIGNvbnN0ICRub2RlID0gJChgLmJzLWRhdGVwaWNrZXItaGVhZCAuJHtidG5DbGFzc31gKTtcbiAgICAgICAgaWYgKCRub2RlLmF0dHIoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAkbm9kZS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICBpZiAodGltZVBlcmlvZCA9PT0gJ2RheXMnKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWREYXlzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGltZVBlcmlvZCA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9udGhzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGltZVBlcmlvZCA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRZZWFycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNb250aChkYXRlLCBpbmMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbmV3IERhdGUoZGF0ZSk7XG5cbiAgICAgICAgbGV0IG1vbnRoID0gY3VycmVudE1vbnRoLmdldE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBjdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICBtb250aCArPSBpbmM7XG5cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoKTtcblxuICAgICAgICBjb25zdCBmdWxsTW9udGggPSBuZXdEYXRlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbW9udGg6ICdsb25nJyB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgICAgIGZ1bGxNb250aDogZnVsbE1vbnRoXG4gICAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIG1vdXNlIGV2ZW50cyB0byBEYXRlcGlja2VyIHBvcHVwLiBUaGVzZSBldmVudHMgYXJlIHJlcXVpcmVkIHdoZW4gd2UgbmF2aWdhdGUgZGF0ZSBwaWNrZXIgdGhyb3VnaCBtb3VzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZERhdGVwaWNrZXJNb3VzZUV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZGF0ZVBpY2tlckhlYWQgPSAkKGAuYnMtZGF0ZXBpY2tlci1oZWFkYCk7XG4gICAgICAgIGRhdGVQaWNrZXJIZWFkLmZpbmQoYC5wcmV2aW91c2ApLmNsaWNrKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0ID0gdGhpcy5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUsIDApO1xuICAgICAgICAgICAgdGhpcy5wcmV2ID0gdGhpcy5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUsIC0yKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igb3JpZ2luYWwgbW91c2UgY2xpY2tcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1c0ZvckRhdGUoLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgJChgLmJzLWRhdGVwaWNrZXItaGVhZCAucHJldmlvdXNgKS5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGVQaWNrZXJIZWFkLmZpbmQoYC5uZXh0YCkuY2xpY2soKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSwgMik7XG4gICAgICAgICAgICB0aGlzLnByZXYgPSB0aGlzLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSwgMCk7XG4gICAgICAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG9yaWdpbmFsIG1vdXNlIGNsaWNrXG4gICAgICAgICAgICBpZiAoZXZlbnQub3JpZ2luYWxFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXNGb3JEYXRlKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgJChgLmJzLWRhdGVwaWNrZXItaGVhZCAubmV4dGApLmZvY3VzKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcbiAgICAgICAgZGF0ZVBpY2tlckhlYWQuZmluZChgLmN1cnJlbnRgKS5jbGljaygoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBvcmlnaW5hbCBtb3VzZSBjbGlja1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzRm9yQ3VycmVudE1vbnRoT3J5ZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAkKCcuYnMtZGF0ZXBpY2tlci1ib2R5LCAuYnMtZGF0ZXBpY2tlci1hY3Rpb24tYnV0dG9ucycpLmNsaWNrKChldmVudCkgPT4ge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igb3JpZ2luYWwgbW91c2UgY2xpY2tcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1c0Zvck1vbnRoT3JEYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGVQaWNrZXJIZWFkLmZpbmQoJy5uZXh0JykuYXR0cignYXJpYS1sYWJlbCcsIGBOZXh0IE1vbnRoLCAke3RoaXMubmV4dC5mdWxsTW9udGh9ICR7dGhpcy5uZXh0LmRhdGUuZ2V0RnVsbFllYXIoKX1gKTtcbiAgICAgICAgZGF0ZVBpY2tlckhlYWQuZmluZCgnLnByZXZpb3VzJykuYXR0cignYXJpYS1sYWJlbCcsIGBQcmV2aW91cyBNb250aCwgJHt0aGlzLnByZXYuZnVsbE1vbnRofSAke3RoaXMucHJldi5kYXRlLmdldEZ1bGxZZWFyKCl9YCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGVzID0gZGF0ZVBpY2tlckhlYWQuZmluZCgnLmN1cnJlbnQgc3BhbicpO1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ0NoYW5nZWQgdG8gbW9udGggJztcbiAgICAgICAgICAgIC8vIGN1cnJlbnROb2Rlcy5lYWNoKChpKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgbXNnID1gJHttc2d9ICR7JChjdXJyZW50Tm9kZXNbaV0pLnRleHQoKX1gO1xuICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICBkYXRlUGlja2VySGVhZC5maW5kKCcuY3VycmVudCcpLmF0dHIoXCJhcmlhLWxpdmVcIiwgXCJhc3NlcnRpdmVcIikuYXR0cihcImFyaWEtYXRvbWljXCIsIFwiZmFsc2VcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGlja2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQoY3VycmVudE5vZGVzWzBdKS50ZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZVBpY2tlckhlYWQuZmluZCgnLm5nLXN0YXItaW5zZXJ0ZWQnKS5wcmVwZW5kKGA8ZGl2IGNsYXNzPVwic3Itb25seVwiPiR7bXNnfTwvZGl2PmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoJChjdXJyZW50Tm9kZXNbMV0pLnRleHQoKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlUGlja2VySGVhZC5maW5kKCcuY3VycmVudCcpLmxhc3QoKS5wcmVwZW5kKGA8ZGl2IGNsYXNzPVwic3Itb25seVwiPiBhbmQgeWVhciA8L2Rpdj5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgZm9jdXMgZm9yIG1vbnRocy9kYXlzIGRlcGVuZGluZyBvbiB0aGUgbG9hZGVkIGRhdGVwaWNrZXIgdGFibGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEZvY3VzRm9yTW9udGhPckRheSgpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlTW9udGhPclllYXIgPSAkKGAuYnMtZGF0ZXBpY2tlci1oZWFkIC5jdXJyZW50YCkuZmlyc3QoKS50ZXh0KCk7XG4gICAgICAgIGNvbnN0IGRhdGVQaWNrZXJCb2R5ID0gJCgnLmJzLWRhdGVwaWNrZXItYm9keScpO1xuICAgICAgICBpZiAoZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUubW9udGhzJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKF8ucGFyc2VJbnQoYWN0aXZlTW9udGhPclllYXIpICE9PSB0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKF8ucGFyc2VJbnQoYWN0aXZlTW9udGhPclllYXIpLCB0aGlzLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSwgdGhpcy5hY3RpdmVEYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoRm9jdXMobmV3RGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUuZGF5cycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld01vbnRoID0gbW9udGhzLmluZGV4T2YoYWN0aXZlTW9udGhPclllYXIpO1xuICAgICAgICAgICAgaWYgKG5ld01vbnRoICE9PSB0aGlzLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZERheXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSwgbmV3TW9udGgsIDEpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXRlRm9jdXMobmV3RGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIGZvY3VzIGZvciBtb250aHMveWVhcnMgZGVwZW5kaW5nIG9uIHRoZSBsb2FkZWQgZGF0ZXBpY2tlciB0YWJsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0Rm9jdXNGb3JDdXJyZW50TW9udGhPcnllYXIoKSB7XG4gICAgICAgIGNvbnN0IGRhdGVQaWNrZXJCb2R5ID0gJCgnLmJzLWRhdGVwaWNrZXItYm9keScpO1xuICAgICAgICBpZiAoZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUubW9udGhzJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9udGhzKCk7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoRm9jdXModGhpcy5hY3RpdmVEYXRlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRlUGlja2VyQm9keS5maW5kKCd0YWJsZS55ZWFycycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFllYXJzKCk7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVllYXJGb2N1cyh0aGlzLmFjdGl2ZURhdGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyBmb2N1cyBmb3IgbW9udGhzL3llYXJzL2RheXMgZGVwZW5kaW5nIG9uIHRoZSBsb2FkZWQgZGF0ZXBpY2tlciB0YWJsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0Rm9jdXNGb3JEYXRlKGNvdW50KSB7XG4gICAgICAgIGNvbnN0IGRhdGVQaWNrZXJCb2R5ID0gJCgnLmJzLWRhdGVwaWNrZXItYm9keScpO1xuICAgICAgICBpZiAoZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUubW9udGhzJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9udGhzKCk7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkgKyBjb3VudCwgMCwgdGhpcy5hY3RpdmVEYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoRm9jdXMobmV3RGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUueWVhcnMnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRZZWFycygpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRZZWFyID0gZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUueWVhcnMgc3BhbicpLmZpcnN0KCkudGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKF8ucGFyc2VJbnQoc3RhcnRZZWFyKSwgdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVZZWFyRm9jdXMobmV3RGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUuZGF5cycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZERheXMoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCkgKyBjb3VudCwgMSk7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZURhdGVGb2N1cyhuZXdEYXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gYWRkIGtleWJvYXJkIGV2ZW50cyB3aGlsZSBvcGVuaW5nIHRoZSBkYXRlIHBpY2tlclxuICAgICAqIEBwYXJhbSBzY29wZSAtIHNjb3BlIG9mIHRoZSBkYXRlL2RhdGV0aW1lIHdpZGdldFxuICAgICAqIEBwYXJhbSBpc0RhdGVUaW1lIC0gYm9vbGVhbiB2YWx1ZSByZXByZXNlbnRzIHRoZSBsb2FkZWQgd2lkZ2V0IGlzIGRhdGUgb3IgZGF0ZXRpbWVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkRGF0ZXBpY2tlcktleWJvYXJkRXZlbnRzKHNjb3BlLCBpc0RhdGVUaW1lKSB7XG4gICAgICAgIHRoaXMua2V5RXZlbnRQbHVnaW5JbnN0YW5jZSA9IHNjb3BlLmtleUV2ZW50UGx1Z2luLmNvbnN0cnVjdG9yO1xuICAgICAgICB0aGlzLmVsZW1lbnRTY29wZSA9IHNjb3BlO1xuICAgICAgICBjb25zdCBkYXRlQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7c2NvcGUuZGF0ZUNvbnRhaW5lckNsc31gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgc2V0QXR0cihkYXRlQ29udGFpbmVyLCAndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICBkYXRlQ29udGFpbmVyLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5rZXlFdmVudFBsdWdpbkluc3RhbmNlLmdldEV2ZW50RnVsbEtleShldmVudCk7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgU2hpZnQrVGFiIGtleSBvciBUYWIga2V5IG9yIGVzY2FwZVxuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRTY29wZS5oaWRlRGF0ZXBpY2tlckRyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheUlucHV0RWxlbSA9IHRoaXMuZWxlbWVudFNjb3BlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRpc3BsYXktaW5wdXQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGRpc3BsYXlJbnB1dEVsZW0uZm9jdXMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubG9hZERheXMoKTtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXRlRm9jdXModGhpcy5hY3RpdmVEYXRlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzZXROZXh0RGF0YShuZXh0RGF0ZSkge1xuICAgICAgICB0aGlzLm5leHQgPSB0aGlzLmdldE1vbnRoKG5leHREYXRlLCAxKTtcbiAgICAgICAgdGhpcy5wcmV2ID0gdGhpcy5nZXRNb250aChuZXh0RGF0ZSwgLTEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGFkZCB0YWJpbmRleCwga2V5Ym9yZCBhbmQgbW91c2UgZXZlbnRzIGZvciBkYXlzXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkRGF5cygpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAkKCdbYnNkYXRlcGlja2VyZGF5ZGVjb3JhdG9yXScpLm5vdCgnLmlzLW90aGVyLW1vbnRoJykuYXR0cigndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY2xpY2tlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLm5leHQgPSB0aGlzLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSwgMSk7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5wcmV2ID0gdGhpcy5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUsIC0xKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHRoaXMuYWRkS2V5Qm9hcmRFdmVudHNGb3JEYXlzKCk7XG4gICAgICAgICAgICB0aGlzLmFkZERhdGVwaWNrZXJNb3VzZUV2ZW50cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIGtleWJvYXJkIGV2ZW50cyBmb3IgZGF5c1xuICAgICAqL1xuICAgIHByaXZhdGUgYWRkS2V5Qm9hcmRFdmVudHNGb3JEYXlzKCkge1xuICAgICAgICBjb25zdCBkYXRlUGlja2VyQm9keSA9ICQoJy5icy1kYXRlcGlja2VyLWJvZHknKTtcbiAgICAgICAgZGF0ZVBpY2tlckJvZHkua2V5ZG93bigoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMua2V5RXZlbnRQbHVnaW5JbnN0YW5jZS5nZXRFdmVudEZ1bGxLZXkoZXZlbnQpO1xuICAgICAgICAgICAgbGV0IG5ld2RhdGU7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnYXJyb3dkb3duJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgbmV3ZGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmFkZCgrNywgJ2RheXMnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZURhdGVGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3d1cCcpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoLTcsICdkYXlzJykudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXRlRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Fycm93bGVmdCcpIHtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKC0xLCAnZGF5cycpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRGF0ZUZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdhcnJvd3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoKzEsICdkYXlzJykudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXRlRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3BhZ2V1cCcpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoLTEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRGF0ZUZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdwYWdlZG93bicpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoKzEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRGF0ZUZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdjb250cm9sLmFycm93dXAnKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xpY2tpbmcgb24gdGFibGUgaGVhZGVyIG1vbnRoIG5hbWUgdG8gbG9hZCBsaXN0IG9mIG1vbnRoc1xuICAgICAgICAgICAgICAgICQoJy5icy1kYXRlcGlja2VyLWhlYWQgLmN1cnJlbnQnKS5maXJzdCgpLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkTW9udGhzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVNb250aEZvY3VzKHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgICAgIGlmICgkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFNjb3BlLmhpZGVEYXRlcGlja2VyRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5SW5wdXRFbGVtID0gdGhpcy5lbGVtZW50U2NvcGUubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZGlzcGxheS1pbnB1dCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZGlzcGxheUlucHV0RWxlbS5mb2N1cygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZm9jdXNCbHVyRGF0ZVBpY2tlckhlYWRCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0JsdXJEYXRlUGlja2VySGVhZEJ1dHRvbnMoKSB7XG4gICAgICAgIGNvbnN0IGRhdGVQaWNrZXJIZWFkQnV0dG9uID0gJCgnLmJzLWRhdGVwaWNrZXItaGVhZCBidXR0b24nKTtcbiAgICAgICAgZGF0ZVBpY2tlckhlYWRCdXR0b24ub24oJ2ZvY3VzJywgZnVuY3Rpb24oKSB7ICQodGhpcykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyM5QUEwQTMnKTsgfSk7XG4gICAgICAgIGRhdGVQaWNrZXJIZWFkQnV0dG9uLm9uKCdibHVyJywgZnVuY3Rpb24oKSB7ICQodGhpcykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJycpOyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGFkZCB0YWJpbmRleCwga2V5Ym9yZCBhbmQgbW91c2UgZXZlbnRzIGZvciBtb250aHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNb250aHMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRLZXlCb2FyZEV2ZW50c0Zvck1vbnRocygpO1xuICAgICAgICAgICAgdGhpcy5hZGREYXRlcGlja2VyTW91c2VFdmVudHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyBrZXlib2FyZCBldmVudHMgZm9yIG1vbnRoc1xuICAgICAqL1xuICAgIHByaXZhdGUgYWRkS2V5Qm9hcmRFdmVudHNGb3JNb250aHMoKSB7XG4gICAgICAgICQoJy5icy1kYXRlcGlja2VyLWJvZHknKS5rZXlkb3duKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5rZXlFdmVudFBsdWdpbkluc3RhbmNlLmdldEV2ZW50RnVsbEtleShldmVudCk7XG4gICAgICAgICAgICBsZXQgbmV3ZGF0ZTtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdhcnJvd2Rvd24nKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKCszLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Fycm93dXAnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKC0zLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Fycm93bGVmdCcpIHtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKC0xLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Fycm93cmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgbmV3ZGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmFkZCgrMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVNb250aEZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdjb250cm9sLmFycm93dXAnKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xpY2tpbmcgb24gdGFibGUgaGVhZGVyIHllYXIgdG8gbG9hZCBsaXN0IG9mIHllYXJzXG4gICAgICAgICAgICAgICAgJCgnLmJzLWRhdGVwaWNrZXItaGVhZCAuY3VycmVudCcpLmZpcnN0KCkuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRZZWFycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlWWVhckZvY3VzKHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NvbnRyb2wuYXJyb3dkb3duJyB8fCBhY3Rpb24gPT09ICdlbnRlcicpIHtcbiAgICAgICAgICAgICAgICBpZiAoJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5wYXJlbnQoKS5oYXNDbGFzcygnZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXlzKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLmFjdGl2ZURhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXRlRm9jdXMobmV3RGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZvY3VzQmx1ckRhdGVQaWNrZXJIZWFkQnV0dG9ucygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gYWRkIHRhYmluZGV4LCBrZXlib3JkIGFuZCBtb3VzZSBldmVudHMgZm9yIHllYXJzXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkWWVhcnMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRLZXlCb2FyZEV2ZW50c0ZvclllYXJzKCk7XG4gICAgICAgICAgICB0aGlzLmFkZERhdGVwaWNrZXJNb3VzZUV2ZW50cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCBmb2N1cyBmb3IgYWN0aXZlIG1vbnRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRBY3RpdmVNb250aEZvY3VzKG5ld0RhdGUsIGlzTW9vdXNlRXZlbnQ/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0TmV4dERhdGEobmV3RGF0ZSk7XG4gICAgICAgIGNvbnN0IG5ld01vbnRoID0gbW9udGhzW25ld0RhdGUuZ2V0TW9udGgoKV07XG4gICAgICAgIC8vIGNoZWNrIGZvciBrZXlib2FyZCBldmVudFxuICAgICAgICBpZiAoIWlzTW9vdXNlRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChuZXdEYXRlLmdldEZ1bGxZZWFyKCkgPCB0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ29Ub090aGVyTW9udGhPcnllYXIoJ3ByZXZpb3VzJywgJ21vbnRoJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSA+IHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcignbmV4dCcsICdtb250aCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgJChgLmJzLWRhdGVwaWNrZXItYm9keSB0YWJsZS5tb250aHMgc3BhbmApLmF0dHIoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICAgICAgICAkKGAuYnMtZGF0ZXBpY2tlci1ib2R5IHRhYmxlLm1vbnRocyBzcGFuOmNvbnRhaW5zKCR7bmV3TW9udGh9KWApLmF0dHIoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgICQoYC5icy1kYXRlcGlja2VyLWJvZHkgdGFibGUubW9udGhzIHNwYW46Y29udGFpbnMoJHtuZXdNb250aH0pYCkuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ld0RhdGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMga2V5Ym9hcmQgZXZlbnRzIGZvciB5ZWFyc1xuICAgICAqL1xuICAgIHByaXZhdGUgYWRkS2V5Qm9hcmRFdmVudHNGb3JZZWFycygpIHtcbiAgICAgICAgJCgnLmJzLWRhdGVwaWNrZXItYm9keScpLmtleWRvd24oKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmtleUV2ZW50UGx1Z2luSW5zdGFuY2UuZ2V0RXZlbnRGdWxsS2V5KGV2ZW50KTtcbiAgICAgICAgICAgIGxldCBuZXdkYXRlO1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2Fycm93ZG93bicpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoKzQsICd5ZWFyJykudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVZZWFyRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Fycm93dXAnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKC00LCAneWVhcicpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlWWVhckZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdhcnJvd2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgbmV3ZGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmFkZCgtMSwgJ3llYXInKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVllYXJGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3dyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKCsxLCAneWVhcicpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlWWVhckZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdjb250cm9sLmFycm93ZG93bicgfHwgYWN0aW9uID09PSAnZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkucGFyZW50KCkuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkTW9udGhzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVNb250aEZvY3VzKHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZvY3VzQmx1ckRhdGVQaWNrZXJIZWFkQnV0dG9ucygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGZvY3VzIGZvciBhY3RpdmUgeWVhclxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0QWN0aXZlWWVhckZvY3VzKG5ld0RhdGUsIGlzTW91c2VFdmVudD86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbmV3WWVhciA9IG5ld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgZGF0ZVBpY2tlclllYXJzID0gJCgnLmJzLWRhdGVwaWNrZXItYm9keSB0YWJsZS55ZWFycyBzcGFuJyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0WWVhciA9IGRhdGVQaWNrZXJZZWFycy5maXJzdCgpLnRleHQoKTtcbiAgICAgICAgY29uc3QgZW5kWWVhciA9IGRhdGVQaWNrZXJZZWFycy5sYXN0KCkudGV4dCgpO1xuICAgICAgICAvLyBjaGVjayBmb3Iga2V5Ym9hcmQgZXZlbnRcbiAgICAgICAgaWYgKCFpc01vdXNlRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChuZXdEYXRlLmdldEZ1bGxZZWFyKCkgPCBfLnBhcnNlSW50KHN0YXJ0WWVhcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdvVG9PdGhlck1vbnRoT3J5ZWFyKCdwcmV2aW91cycsICd5ZWFyJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSA+IF8ucGFyc2VJbnQoZW5kWWVhcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdvVG9PdGhlck1vbnRoT3J5ZWFyKCduZXh0JywgJ3llYXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICQoYC5icy1kYXRlcGlja2VyLWJvZHkgdGFibGUueWVhcnMgc3BhbmApLmF0dHIoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICAgICAgICAkKGAuYnMtZGF0ZXBpY2tlci1ib2R5IHRhYmxlLnllYXJzIHNwYW46Y29udGFpbnMoJHtuZXdZZWFyfSlgKS5hdHRyKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICAkKGAuYnMtZGF0ZXBpY2tlci1ib2R5IHRhYmxlLnllYXJzIHNwYW46Y29udGFpbnMoJHtuZXdZZWFyfSlgKS5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3RGF0ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyBmb2N1cyBmb3IgdGltZXBpY2tlciBmaXJzdCBpbnB1dCBmaWVsZChob3VycyBmaWVsZCkgd2hpbGUgb3BlbmluZyB0aW1lIHBpY2tlclxuICAgICAqIEBwYXJhbSBzY29wZSAtIHNjb3BlIG9mIHRoZSB0aW1lIHBpY2tlciB3aWRnZXRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZm9jdXNUaW1lUGlja2VyUG9wb3ZlcihzY29wZSkge1xuICAgICAgICB0aGlzLmtleUV2ZW50UGx1Z2luSW5zdGFuY2UgPSBzY29wZS5rZXlFdmVudFBsdWdpbi5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdGhpcy5lbGVtZW50U2NvcGUgPSBzY29wZTtcbiAgICAgICAgLy8gc2V0VGltZW91dCBpcyB1c2VkIHNvIHRoYXQgYnkgdGhlbiB0aW1lIGlucHV0IGhhcyB0aGUgdXBkYXRlZCB2YWx1ZS4gZm9jdXMgaXMgc2V0dGluZyBiYWNrIHRvIHRoZSBpbnB1dCBmaWVsZFxuICAgICAgICB0aGlzLmVsZW1lbnRTY29wZS5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgJCgndGltZXBpY2tlciAuZm9ybS1ncm91cCcpLmZpcnN0KCkuZmluZCgnPiBpbnB1dC5mb3JtLWNvbnRyb2wnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBrZXlib2FyZCBldmVudHMgdG8gVGltZXBpY2tlciBwb3B1cFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBiaW5kVGltZVBpY2tlcktleWJvYXJkRXZlbnRzKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICR0aW1lcGlja2VyUG9wdXAgPSAkKCdib2R5JykuZmluZCgnPiBicy1kcm9wZG93bi1jb250YWluZXIgdGltZXBpY2tlcicpO1xuICAgICAgICAgICAgJHRpbWVwaWNrZXJQb3B1cC5hdHRyKCd0YWJpbmRleCcsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudHNPblRpbWVQaWNrZXIoJHRpbWVwaWNrZXJQb3B1cCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmb2N1c09uSW5wdXRFbCgpIHtcbiAgICAgICAgaWYgKCQodGhpcy5uYXRpdmVFbGVtZW50KS5jbG9zZXN0KCcuY2FwdGlvbi1mbG9hdGluZycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuYXBwLXRleHRib3gnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGRhdGUgaXMgdmFsaWQgb3Igbm90XG4gICAgICogQHJldHVybnMgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBpZiBkYXRlIGlzIHZhbGlkIGVsc2UgcmV0dXJucyBmYWxzZVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNWYWxpZERhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHRpbWUgaXMgdmFsaWQgb3Igbm90XG4gICAgICovXG4gICAgcHJpdmF0ZSB0aW1lRm9ybWF0VmFsaWRhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZW50ZXJlZERhdGUgPSAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnaW5wdXQnKS52YWwoKTtcbiAgICAgICAgY29uc3QgbmV3VmFsID0gZ2V0TmF0aXZlRGF0ZU9iamVjdChlbnRlcmVkRGF0ZSwge21lcmlkaWFuczogdGhpcy5tZXJpZGlhbnMsIHBhdHRlcm46IHRoaXMuZGF0ZXBhdHRlcm59KTtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1hdFZhbGlkYXRpb24obmV3VmFsLCBlbnRlcmVkRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludmFsaWREYXRlVGltZUZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRpbWVWYWx1ZSh2YWx1ZSwgZmllbGROYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWUgPT09ICdtaW51dGVzJyA/IHRoaXMuYnNUaW1lUGlja2VyLnVwZGF0ZU1pbnV0ZXMoJzAwJykgOiB0aGlzLmJzVGltZVBpY2tlci51cGRhdGVTZWNvbmRzKCcwMCcpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkTmFtZSA9PT0gJ21pbnV0ZXMnID8gdGhpcy5ic1RpbWVQaWNrZXIudXBkYXRlTWludXRlcygnMDAnKSA6IHRoaXMuYnNUaW1lUGlja2VyLnVwZGF0ZVNlY29uZHMoJzAwJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV2ZW50cyB0byBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtICRlbCAtIGVsZW1lbnQgb24gd2hpY2ggdGhlIGV2ZW50IGlzIGFkZGVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBhZGRFdmVudHNPblRpbWVQaWNrZXIoJGVsOiBKUXVlcnkpIHtcbiAgICAgICAgY29uc3QgaW5wdXRGaWVsZHMgPSAkZWwuZmluZCgnLmJzLXRpbWVwaWNrZXItZmllbGQnKTtcbiAgICAgICAgLy8gV01TLTE5MzgyOiB1cGRhdGUgbWludXRlcyBhbmQgc2Vjb25kcyB0byAwIHdoZW4gd2UgZW50ZXIgaG91ciB2YWx1ZVxuICAgICAgICBpbnB1dEZpZWxkcy5maXJzdCgpLm9uKCdrZXl1cCcsIGV2dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBob3VyVmFsdWUgPSAoZXZ0LnRhcmdldCBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgXy5mb3JFYWNoKGlucHV0RmllbGRzLCAoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2dC50YXJnZXQgIT09IGZpZWxkICYmIGZpZWxkLnZhbHVlID09PSAnJyAmJiBob3VyVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGluZGV4ID09PSAxID8gJ21pbnV0ZXMnIDogJ3NlY29uZHMnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVWYWx1ZShob3VyVmFsdWUsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlbW92ZUtleXVwTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBpbnB1dEZpZWxkcy5maXJzdCgpLm9mZigna2V5dXAnKTtcbiAgICAgICAgfTtcbiAgICAgICAgJGVsLm9uKCdrZXlkb3duJywgZXZ0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2dC50YXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgJHBhcmVudCA9ICR0YXJnZXQucGFyZW50KCk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50U2NvcGUgPSB0aGlzLmVsZW1lbnRTY29wZTtcblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5rZXlFdmVudFBsdWdpbkluc3RhbmNlLmdldEV2ZW50RnVsbEtleShldnQpO1xuXG4gICAgICAgICAgICBsZXQgc3RvcFByb3BvZ2F0aW9uLCBwcmV2ZW50RGVmYXVsdDtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuaGlkZVRpbWVwaWNrZXJEcm9wZG93bigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJHRhcmdldC5oYXNDbGFzcygnYnMtdGltZXBpY2tlci1maWVsZCcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCRwYXJlbnQuaXMoJzpmaXJzdC1jaGlsZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdzaGlmdC50YWInIHx8IGFjdGlvbiA9PT0gJ2VudGVyJyB8fCBhY3Rpb24gPT09ICdlc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuc2V0SXNUaW1lT3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcG9nYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkcGFyZW50LmlzKCc6bGFzdC1jaGlsZCcpIHx8ICgkcGFyZW50Lm5leHQoKS5uZXh0KCkuZmluZCgnYnV0dG9uLmRpc2FibGVkJykubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAndGFiJyB8fCBhY3Rpb24gPT09ICdlc2NhcGUnIHx8IGFjdGlvbiA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNjb3BlLnNldElzVGltZU9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BvZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdlbnRlcicgfHwgYWN0aW9uID09PSAnZXNjYXBlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNjb3BlLnNldElzVGltZU9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BvZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RvcFByb3BvZ2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFNjb3BlLm1pbnRpbWUgJiYgZWxlbWVudFNjb3BlLm1heHRpbWUgJiYgIXRoaXMuaXNWYWxpZERhdGUoZWxlbWVudFNjb3BlLmJzVGltZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnYXJyb3dkb3duJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNjb3BlLmJzVGltZVZhbHVlID0gZWxlbWVudFNjb3BlLm1heFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3d1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSA9IGVsZW1lbnRTY29wZS5taW5UaW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICd0YWInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGVUaW1lRm9ybWF0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5kYXRlcGF0dGVybiB8fCB0aGlzLnRpbWVwYXR0ZXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Rm9ybWF0dGVkRGF0ZShlbGVtZW50U2NvcGUuZGF0ZVBpcGUsIGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSwgcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykgPT09IGVsZW1lbnRTY29wZS5kaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuZGlzcGxheS1pbnB1dCcpLnZhbChlbGVtZW50U2NvcGUuZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnYXJyb3dkb3duJyB8fCBhY3Rpb24gPT09ICdhcnJvd3VwJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVGb3JtYXRWYWxpZGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgkdGFyZ2V0Lmhhc0NsYXNzKCdidG4tZGVmYXVsdCcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3RhYicgfHwgYWN0aW9uID09PSAnZXNjYXBlJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuc2V0SXNUaW1lT3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAkZWwuZmluZCgnYScpLm9uKCdjbGljaycsIGV2dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50U2NvcGUgPSB0aGlzLmVsZW1lbnRTY29wZTtcbiAgICAgICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2dC50YXJnZXQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRTY29wZS5taW50aW1lICYmIGVsZW1lbnRTY29wZS5tYXh0aW1lICYmICF0aGlzLmlzVmFsaWREYXRlKGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoJHRhcmdldC5maW5kKCdzcGFuJykuaGFzQ2xhc3MoJ2JzLWNoZXZyb24tZG93bicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSA9IGVsZW1lbnRTY29wZS5tYXhUaW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHRhcmdldC5maW5kKCdzcGFuJykuaGFzQ2xhc3MoJ2JzLWNoZXZyb24tdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuYnNUaW1lVmFsdWUgPSBlbGVtZW50U2NvcGUubWluVGltZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRpbWVGb3JtYXRWYWxpZGF0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVGb3JtYXQocGF0dGVybikge1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gJ2RhdGVwYXR0ZXJuJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuZGF0ZUlucHV0Rm9ybWF0ID0gdGhpcy5kYXRlcGF0dGVybjtcbiAgICAgICAgICAgIHRoaXMuc2hvd3NlY29uZHMgPSBfLmluY2x1ZGVzKHRoaXMuZGF0ZXBhdHRlcm4sICdzJyk7XG4gICAgICAgICAgICB0aGlzLmlzbWVyaWRpYW4gPSBfLmluY2x1ZGVzKHRoaXMuZGF0ZXBhdHRlcm4sICdoJyk7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gJ3RpbWVwYXR0ZXJuJykge1xuICAgICAgICAgICAgdGhpcy5zaG93c2Vjb25kcyA9IF8uaW5jbHVkZXModGhpcy50aW1lcGF0dGVybiwgJ3MnKTtcbiAgICAgICAgICAgIHRoaXMuaXNtZXJpZGlhbiA9IF8uaW5jbHVkZXModGhpcy50aW1lcGF0dGVybiwgJ2gnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1vYmlsZUlucHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2JpbGUtaW5wdXQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICB9XG5cbiAgICBvbkRhdGVUaW1lSW5wdXRCbHVyKCkge1xuICAgICAgICAvLyByZW1vdmluZyB0aGUgb3BhY2l0eSBvbiBibHVyIG9mIHRoZSBtb2JpbGUgd2lkZ2V0XG4gICAgICAgIGNvbnN0IGRpc3BsYXlJbnB1dEVsZW0gPSB0aGlzLmdldE1vYmlsZUlucHV0KCk7XG4gICAgICAgIGlmIChkaXNwbGF5SW5wdXRFbGVtICYmICFoYXNDb3Jkb3ZhKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2FkZC1vcGFjaXR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5SW5wdXRFbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3JlbW92ZS1vcGFjaXR5Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRhdGVUaW1lSW5wdXRGb2N1cyhza2lwRm9jdXM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3BsYXlJbnB1dEVsZW0gPSB0aGlzLmdldE1vYmlsZUlucHV0KCk7XG4gICAgICAgIC8vIHRvZ2dsaW5nIHRoZSBjbGFzc2VzIHRvIHNob3cgYW5kIGhpZGUgdGhlIG5hdGl2ZSB3aWRnZXQgdXNpbmcgb3BhY2l0eVxuICAgICAgICBpZiAoc2tpcEZvY3VzICYmICFoYXNDb3Jkb3ZhKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmNsYXNzTGlzdC5hZGQoJ2FkZC1vcGFjaXR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5SW5wdXRFbGVtLmNsYXNzTGlzdC5hZGQoJ3JlbW92ZS1vcGFjaXR5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzcGxheUlucHV0RWxlbSAmJiB0aGlzLl90cmlnZ2VyZWRCeVVzZXIpIHtcbiAgICAgICAgICAgIGRpc3BsYXlJbnB1dEVsZW0uZm9jdXMoKTtcbiAgICAgICAgICAgIGRpc3BsYXlJbnB1dEVsZW0uY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENvcmRvdmFQbHVnaW5EYXRlUGlja2VyQXBpKCkge1xuICAgICAgICBpZiAoaXNJb3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIF8uZ2V0KHdpbmRvdywgJ2NvcmRvdmEud2F2ZW1ha2VyLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dEYXRlUGlja2VyTW9kYWwoKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWVwaWNrZXJDb21wb25lbnQuc2hvdygpO1xuICAgICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIGJsdXJEYXRlSW5wdXQoaXNQaWNrZXJPcGVuKSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlJbnB1dEVsZW0gPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRpc3BsYXktaW5wdXQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGlzUGlja2VyT3Blbikge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkaXNwbGF5SW5wdXRFbGVtLmJsdXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92Pykge1xuXG4gICAgICAgIGlmIChrZXkgPT09ICd0YWJpbmRleCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2RhdGVwYXR0ZXJuJykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtYXQoa2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzaG93d2Vla3MnKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRlT3B0aW9ucy5zaG93V2Vla051bWJlcnMgPSBudjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdtaW5kYXRlJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMubWluRGF0ZSA9IChudiA9PT0gQ1VSUkVOVF9EQVRFKSA/IHRoaXMubWluZGF0ZSA9IG5ldyBEYXRlKCkgOiBnZXREYXRlT2JqKG52KTtcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZU1heERhdGVWYWxpZGF0aW9uT25JbnB1dCh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbWF4ZGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGVPcHRpb25zLm1heERhdGUgPSAobnYgPT09IENVUlJFTlRfREFURSkgPyB0aGlzLm1heGRhdGUgPSBuZXcgRGF0ZSgpIDogZ2V0RGF0ZU9iaihudik7XG4gICAgICAgICAgICB0aGlzLm1pbkRhdGVNYXhEYXRlVmFsaWRhdGlvbk9uSW5wdXQodGhpcy5kYXRhdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4Y2x1ZGVkYXRlcycgfHwga2V5ID09PSAnZXhjbHVkZWRheXMnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGNsdWRlZGF5cykge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZWREYXlzVG9EaXNhYmxlID0gXy5zcGxpdCh0aGlzLmV4Y2x1ZGVkYXlzLCAnLCcpLm1hcCgoZGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiArZGF5O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZERhdGVzVG9EaXNhYmxlID0gdGhpcy5leGNsdWRlZGF0ZXM7XG4gICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nKHRoaXMuZXhjbHVkZWRhdGVzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkRGF0ZXNUb0Rpc2FibGUgPSBfLnNwbGl0KHRoaXMuZXhjbHVkZWRhdGVzLCAnLCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkRGF0ZXNUb0Rpc2FibGUgPSB0aGlzLmV4Y2x1ZGVkRGF0ZXNUb0Rpc2FibGUubWFwKGQgPT4gZ2V0RGF0ZU9iaihkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1pbkRhdGVNYXhEYXRlVmFsaWRhdGlvbk9uSW5wdXQodGhpcy5kYXRhdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3NlbGVjdGZyb21vdGhlcm1vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuc2VsZWN0RnJvbU90aGVyTW9udGggPSBudjtcblxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RvZGF5YnV0dG9uJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuc2hvd1RvZGF5QnV0dG9uID0gbnY7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY2xlYXJidXR0b24nKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRlT3B0aW9ucy5zaG93Q2xlYXJCdXR0b24gPSBudjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICd0b2RheWJ1dHRvbmxhYmVsJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMudG9kYXlCdXR0b25MYWJlbCA9IHRoaXMuaTE4blNlcnZpY2UuZ2V0TG9jYWxpemVkTWVzc2FnZShudikgfHwgbnY7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY2xlYXJidXR0b25sYWJlbCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGVPcHRpb25zLmNsZWFyQnV0dG9uTGFiZWwgPSB0aGlzLmkxOG5TZXJ2aWNlLmdldExvY2FsaXplZE1lc3NhZ2UobnYpIHx8IG52O1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3Nob3djdXN0b21waWNrZXInKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQgPSBpc01vYmlsZSgpICYmICF0aGlzLnNob3djdXN0b21waWNrZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYWRhcHRpdmVwb3NpdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGVPcHRpb25zLmFkYXB0aXZlUG9zaXRpb24gPSBudjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclRhcmdldCA9IGdldENvbnRhaW5lclRhcmdldENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuaXNSZWFkT25seSA9IHRoaXMuZGF0YWVudHJ5bW9kZSAhPSAndW5kZWZpbmVkJyAmJiAhdGhpcy5pc0RhdGFFbnRyeU1vZGVFbmFibGVkT25JbnB1dCh0aGlzLmRhdGFlbnRyeW1vZGUpO1xuXG4gICAgICAgIC8vIHRoaXMgbW9iaWxlaW5wdXQgd2lkdGggdmFyaWVzIGluIGlvcyBoZW5jZSBzZXR0aW5nIHdpZHRoIGhlcmUuXG4gICAgICAgIGNvbnN0IG1vYmlsZUlucHV0ID0gdGhpcy5nZXRNb2JpbGVJbnB1dCgpO1xuICAgICAgICBpZiAobW9iaWxlSW5wdXQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1vYmlsZUlucHV0LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgICAgIG1vYmlsZUlucHV0LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGVPblNob3dTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZU9uU2hvd1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRldGFjaCgpIHtcbiAgICAgICAgdGhpcy5kYXRldGltZXBpY2tlckNvbXBvbmVudD8uaGlkZU1vZGFsKCk7XG4gICAgfVxuXG4gICAgc2V0VGltZXpvbmUobG9jYWxlKSB7XG4gICAgICAgIHRoaXMuaTE4blNlcnZpY2Uuc2V0VGltZXpvbmUobG9jYWxlLCB0aGlzKTtcbiAgICB9XG59XG4iXX0=
947
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRlLXRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2Vwb2NoL3NyYy9iYXNlLWRhdGUtdGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixRQUFRLEVBQWEsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd6RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakYsT0FBTyxFQUNILG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFFBQVEsRUFDUixRQUFRLEVBQ1IsT0FBTyxFQUNWLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQXlCLE1BQU0sMEJBQTBCLENBQUM7QUFDckYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFJbEYsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVB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SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzdCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM3QztRQUVELEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU0sVUFBVTs7UUFDYixNQUFBLElBQUksQ0FBQyx1QkFBdUIsMENBQUUsU0FBUyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNO1FBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7OztZQWo5QkosU0FBUzs7O1lBNUNjLFFBQVE7Ozs7eUJBcUczQixTQUFTLFNBQUMsbUJBQW1COzJCQUM3QixTQUFTLFNBQUMsbUJBQW1CO3NDQUM3QixTQUFTLFNBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvciwgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRMb2NhbGVEYXlQZXJpb2RzLCBGb3JtU3R5bGUsIFRyYW5zbGF0aW9uV2lkdGggfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnNEcm9wZG93bkRpcmVjdGl2ZSB9IGZyb20gJ25neC1ib290c3RyYXAvZHJvcGRvd24nO1xuaW1wb3J0IHsgVGltZXBpY2tlckNvbXBvbmVudCwgVGltZXBpY2tlckNvbmZpZyB9IGZyb20gJ25neC1ib290c3RyYXAvdGltZXBpY2tlcic7XG5cbmltcG9ydCB7XG4gICAgQWJzdHJhY3RJMThuU2VydmljZSxcbiAgICBnZXREYXRlT2JqLFxuICAgIGdldEZvcm1hdHRlZERhdGUsXG4gICAgZ2V0TmF0aXZlRGF0ZU9iamVjdCxcbiAgICBoYXNDb3Jkb3ZhLFxuICAgIGlzSW9zLFxuICAgIGlzTW9iaWxlLFxuICAgIGlzU3RyaW5nLFxuICAgIHNldEF0dHJcbn0gZnJvbSAnQHdtL2NvcmUnO1xuXG5pbXBvcnQgeyBnZXRDb250YWluZXJUYXJnZXRDbGFzcywgVG9EYXRlUGlwZSB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHsgQmFzZUZvcm1DdXN0b21Db21wb25lbnQgfSBmcm9tICdAd20vY29tcG9uZW50cy9pbnB1dCc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJDb25maWcsIEJzRGF0ZXBpY2tlckRpcmVjdGl2ZSB9IGZyb20gJ25neC1ib290c3RyYXAvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBEYXRlVGltZVBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZS10aW1lLy9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudCc7XG5cbmRlY2xhcmUgY29uc3QgbW9tZW50LCBfLCAkO1xuXG5jb25zdCBDVVJSRU5UX0RBVEUgPSAnQ1VSUkVOVF9EQVRFJztcbmNvbnN0IG1vbnRocyA9IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddO1xuY29uc3QgREFURVBJQ0tFUl9EUk9QRE9XTl9PUFRJT05TID0ge1xuICAgIEJVVFRPTjogJ2J1dHRvbicsXG4gICAgREVGQVVMVDogJ2RlZmF1bHQnXG59O1xuY29uc3QgREFUQUVOVFJZTU9ERV9EUk9QRE9XTl9PUFRJT05TID0ge1xuICAgIFBJQ0tFUjogJ3BpY2tlcicsXG4gICAgREVGQVVMVDogJ2RlZmF1bHQnXG59O1xuXG4vLyBQcm92aWRpbmcgbWVyaWRpYW5zIHRvIHRoZSB0aW1lcGlja2VyIGJhZXNkIG9uIHNlbGVjdGVkIGxvY2FsZVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVwaWNrZXJDb25maWcoaTE4blNlcnZpY2UpOiBUaW1lcGlja2VyQ29uZmlnIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgVGltZXBpY2tlckNvbmZpZygpLCB7XG4gICAgICAgIG1lcmlkaWFuczogZ2V0TG9jYWxlRGF5UGVyaW9kcyhpMThuU2VydmljZS5nZXRTZWxlY3RlZExvY2FsZSgpLCBGb3JtU3R5bGUuRm9ybWF0LCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKVxuICAgIH0pO1xufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRGF0ZVRpbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlRm9ybUN1c3RvbUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgVmFsaWRhdG9yIHtcbiAgICBwdWJsaWMgcmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuICAgIHB1YmxpYyB0YWJpbmRleDogYW55O1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dG9mb2N1czogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW47XG4gICAgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgcHVibGljIHNob3J0Y3V0a2V5OiBzdHJpbmc7XG4gICAgcHVibGljIF90cmlnZ2VyZWRCeVVzZXI6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgZXhjbHVkZWRheXM6IHN0cmluZztcbiAgICBwdWJsaWMgZXhjbHVkZWREYXlzVG9EaXNhYmxlOiBBcnJheTxudW1iZXI+O1xuICAgIHB1YmxpYyBleGNsdWRlZERhdGVzVG9EaXNhYmxlOiBBcnJheTxEYXRlPjtcbiAgICBwdWJsaWMgZXhjbHVkZWRhdGVzO1xuICAgIHB1YmxpYyBvdXRwdXRmb3JtYXQ7XG4gICAgcHVibGljIG1pbmRhdGU7XG4gICAgcHVibGljIG1heGRhdGU7XG4gICAgcHVibGljIGRhdGFlbnRyeW1vZGU7XG4gICAgcHJvdGVjdGVkIGFjdGl2ZURhdGU7XG4gICAgcHJpdmF0ZSBrZXlFdmVudFBsdWdpbkluc3RhbmNlO1xuICAgIHByaXZhdGUgZWxlbWVudFNjb3BlO1xuICAgIHB1YmxpYyBkYXRlcGF0dGVybjtcbiAgICBwdWJsaWMgdGltZXBhdHRlcm47XG4gICAgcHJvdGVjdGVkIHNob3dzZWNvbmRzOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBpc21lcmlkaWFuOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBtZXJpZGlhbnM6IGFueTtcbiAgICBwcm90ZWN0ZWQgZGF0ZVBpcGU7XG4gICAgcHJvdGVjdGVkIGkxOG5TZXJ2aWNlO1xuICAgIHB1YmxpYyBpc1JlYWRPbmx5ID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHNlbGVjdGVkTG9jYWxlOiBzdHJpbmc7XG4gICAgcHVibGljIHNlbGVjdGZyb21vdGhlcm1vbnRoOiBib29sZWFuO1xuICAgIHB1YmxpYyB0b2RheWJ1dHRvbjogYm9vbGVhbjtcbiAgICBwdWJsaWMgY2xlYXJidXR0b246IGJvb2xlYW47XG4gICAgcHVibGljIHJlbW92ZUtleXVwTGlzdGVuZXI7XG4gICAgcHVibGljIGxvYWROYXRpdmVEYXRlSW5wdXQ7XG4gICAgcHVibGljIHNob3djdXN0b21waWNrZXI7XG4gICAgcHVibGljIG5leHQ7XG4gICAgcHVibGljIHByZXY7XG4gICAgcHVibGljIGNsaWNrZWQgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBkYXRlTm90SW5SYW5nZTogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgdGltZU5vdEluUmFuZ2U6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIGludmFsaWREYXRlVGltZUZvcm1hdDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgZGF0ZU9uU2hvd1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHB1YmxpYyBnZXQgdGltZVpvbmUoKSB7IHJldHVybiB0aGlzLmluai5nZXQoQWJzdHJhY3RJMThuU2VydmljZSkuZ2V0VGltZXpvbmUodGhpcykgfTtcblxuICAgIGZvcm1hdHNCeUxvY2FsZSA9IHsndGltZXpvbmUnOiAnJ307XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIHByb3BlcnR5IHVzZWQgdG8gbWFwIHRoZSBjb250YWluZXJDbGFzcywgc2hvd1dlZWtOdW1iZXJzIGV0Yy4sIHRvIHRoZSBic0RhdGVwaWNrZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgX2RhdGVPcHRpb25zOiBCc0RhdGVwaWNrZXJDb25maWcgPSBuZXcgQnNEYXRlcGlja2VyQ29uZmlnKCk7XG4gICAgcHJvdGVjdGVkIGJzRGF0ZVBpY2tlckRpcmVjdGl2ZTogQnNEYXRlcGlja2VyRGlyZWN0aXZlO1xuXG4gICAgQFZpZXdDaGlsZChCc0Ryb3Bkb3duRGlyZWN0aXZlKSBwcm90ZWN0ZWQgYnNEcm9wZG93bjtcbiAgICBAVmlld0NoaWxkKFRpbWVwaWNrZXJDb21wb25lbnQpIHByb3RlY3RlZCBic1RpbWVQaWNrZXI7XG4gICAgQFZpZXdDaGlsZChEYXRlVGltZVBpY2tlckNvbXBvbmVudCkgZGF0ZXRpbWVwaWNrZXJDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVR5cGU6IHN0cmluZztcbiAgICBjb250YWluZXJUYXJnZXQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIFdJREdFVF9DT05GSUcpIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHKTtcbiAgICAgICAgdGhpcy5pMThuU2VydmljZSA9IHRoaXMuaW5qLmdldChBYnN0cmFjdEkxOG5TZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVsb2FkJyk7XG5cbiAgICAgICAgdGhpcy5kYXRlUGlwZSA9IHRoaXMuaW5qLmdldChUb0RhdGVQaXBlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExvY2FsZSA9IHRoaXMuaTE4blNlcnZpY2UuZ2V0U2VsZWN0ZWRMb2NhbGUoKTtcbiAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMudG9kYXlQb3NpdGlvbiA9ICdsZWZ0JztcbiAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuY2xlYXJQb3NpdGlvbiA9ICdyaWdodCc7XG4gICAgICAgIHRoaXMubWVyaWRpYW5zID0gZ2V0TG9jYWxlRGF5UGVyaW9kcyh0aGlzLnNlbGVjdGVkTG9jYWxlLCBGb3JtU3R5bGUuRm9ybWF0LCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTtcbiAgICAgICAgdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0ID0gaXNNb2JpbGUoKSAmJiAhdGhpcy5zaG93Y3VzdG9tcGlja2VyO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCB2YWx1ZSBpcyBkZWZhdWx0IChpLmUgb3BlbiBkYXRlIHBpY2tlciBvbiBpbnB1dCBjbGljaylcbiAgICAgKiBAcGFyYW0xIGRyb3Bkb3dudmFsdWUsIHVzZXIgc2VsZWN0ZWQgdmFsdWUgKGJ5IGRlZmF1bHQgZGF0ZXBpY2tlciBvcGVucyBvbiBpbnB1dCBjbGljaylcbiAgICAgKiAqKi9cbiAgICBwcm90ZWN0ZWQgaXNEcm9wRG93bkRpc3BsYXlFbmFibGVkT25JbnB1dChkcm9wZG93bnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkcm9wZG93bnZhbHVlID09PSBEQVRFUElDS0VSX0RST1BET1dOX09QVElPTlMuREVGQVVMVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IHZhbHVlIGlzIGRlZmF1bHQgKGkuZSBEYXRhIGVudHJ5IGNhbiBiZSBkb25lIGVpdGhlciBieSBzZWxlY3RpbmcgZnJvbSB0aGUgRGF0ZS9EYXRlVGltZS9UaW1lIFBpY2tlciBvciBieSBlbnRlcmluZyAgbWFudWFsbHkgdXNpbmcgdGhlIGtleWJvYXJkLiApXG4gICAgICogQHBhcmFtMSBkcm9wZG93bnZhbHVlLCB1c2VyIHNlbGVjdGVkIHZhbHVlXG4gICAgICogKiovXG4gICAgcHJvdGVjdGVkIGlzRGF0YUVudHJ5TW9kZUVuYWJsZWRPbklucHV0KGRyb3Bkb3dudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRyb3Bkb3dudmFsdWUgPT09IERBVEFFTlRSWU1PREVfRFJPUERPV05fT1BUSU9OUy5ERUZBVUxUO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNob3cgdmFsaWRhdGlvbiBtZXNzYWdlIGRlcGVuZGluZyBvbiB0aGUgaXNOYXRpdmVQaWNrZXIgZmxhZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNob3dWYWxpZGF0aW9uKCRldmVudCwgZGlzcGxheVZhbHVlLCBpc05hdGl2ZVBpY2tlciwgbXNnKSB7XG4gICAgICAgIGlmIChpc05hdGl2ZVBpY2tlcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdtaW4gbWF4IGRhdGUgdmFsaWRhdGlvbiBmYWlsZWQgJywgbXNnKTtcbiAgICAgICAgICAgIHJldHVybiAkKCRldmVudC50YXJnZXQpLnZhbChkaXNwbGF5VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXREaXNwbGF5SW5wdXQoKSB7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuZGlzcGxheS1pbnB1dCcpLnZhbCgnJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKGM6IEFic3RyYWN0Q29udHJvbCkge1xuICAgICAgICBpZiAodGhpcy5pbnZhbGlkRGF0ZVRpbWVGb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW52YWxpZERhdGVUaW1lRm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuZGF0ZU5vdEluUmFuZ2UpICYmIHRoaXMuZGF0ZU5vdEluUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0ZU5vdEluUmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMudGltZU5vdEluUmFuZ2UpICYmIHRoaXMudGltZU5vdEluUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGltZU5vdEluUmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyogV01TLTE4MjY5IHwgRXh0ZW5kaW5nIHRoZSBleGlzdGluZyB2YWxpZGF0aW9uIGZvciAncmVxdWlyZWQnICovXG4gICAgICAgIGlmICh0aGlzW1wic2hvd1wiXSAmJiB0aGlzW1wicmVxdWlyZWRcIl0pIHtcbiAgICAgICAgICAgIHJldHVybiAhIWMudmFsdWUgPyBudWxsIDogeyByZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJyc7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdmFsaWRhdGUgZGF0ZSBwYXR0ZXJuIGFuZCB0aW1lIHBhdHRlcm5cbiAgICAgKiBJZiB1c2VyIHNlbGVjdHMgb25lIHBhdHRlcm4gaW4gZGVzaWduIHRpbWUgYW5kIGlmIGhlIHRyaWVzIHRvIGVudGVyIHRoZSBkYXRlIGluIGFub3RoZXIgcGF0dGVybiB0aGVuIHRoZSBkZXZpY2UgaXMgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0VmFsaWRhdGlvbihuZXdWYWwsIGlucHV0VmFsLCBpc05hdGl2ZVBpY2tlcj86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZGF0ZXBhdHRlcm4gfHwgdGhpcy50aW1lcGF0dGVybjtcbiAgICAgICAgY29uc3QgdGltZVpvbmUgPSB0aGlzLnRpbWVab25lO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBuZXdWYWwsIHBhdHRlcm4sIHRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKTtcbiAgICAgICAgaW5wdXRWYWwgPSBpbnB1dFZhbC50cmltKCk7XG4gICAgICAgIGlmIChpbnB1dFZhbCkge1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfLmlzTmFOKGlucHV0VmFsKSAmJiBfLnBhcnNlSW50KGlucHV0VmFsKSAhPT0gZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWREYXRlVGltZUZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJ2luY29ycmVjdGZvcm1hdCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYXRpdmVQaWNrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0IHRoZSBkYXRlIHZhbHVlIG9ubHkgd2hlbiBpbnB1dFZhbCBpcyBvYnRhaW5lZCBmcm9tICRldmVudC50YXJnZXQudmFsdWUsIGFzIHRoZSBmb3JtYXQgZG9lc250IG1hdGNoLlxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbCA9IGdldEZvcm1hdHRlZERhdGUodGhpcy5kYXRlUGlwZSwgaW5wdXRWYWwsIHBhdHRlcm4sIHRpbWVab25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0VmFsICE9PSBmb3JtYXR0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGVUaW1lRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUgPSAnaW5jb3JyZWN0Zm9ybWF0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHZhbGlkYXRlIG1pbiBkYXRlLCBtYXggZGF0ZSwgZXhjbHVkZSBkYXRlcyBhbmQgZXhjbHVkZSBkYXlzXG4gICAgICogSW4gbW9iaWxlIGlmIGludmFsaWQgZGF0ZXMgYXJlIGVudGVyZWQsIGRldmljZSBpcyBzaG93aW5nIGFuIGFsZXJ0LlxuICAgICAqIEluIHdlYiBpZiBpbnZhbGlkIGRhdGVzIGFyZSBlbnRlcmVkLCBkZXZpY2UgaXMgc2hvd2luZyB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1pbkRhdGVNYXhEYXRlVmFsaWRhdGlvbk9uSW5wdXQobmV3VmFsLCAkZXZlbnQ/OiBFdmVudCwgZGlzcGxheVZhbHVlPzogc3RyaW5nLCBpc05hdGl2ZVBpY2tlcj86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKG5ld1ZhbCkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVWYWwgPSBuZXdWYWw7XG4gICAgICAgICAgICBuZXdWYWwgPSBtb21lbnQobmV3VmFsKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkRhdGUgPSBtb21lbnQoZ2V0RGF0ZU9iaih0aGlzLm1pbmRhdGUpKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSBtb21lbnQoZ2V0RGF0ZU9iaih0aGlzLm1heGRhdGUpKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pbmRhdGUgJiYgbmV3VmFsIDwgbWluRGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX01JTkRBVEVfVkFMSURBVElPTl9NRVNTQUdFfSAke3RoaXMubWluZGF0ZX0uYDtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYXRpdmVQaWNrZXIgJiYgZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBtaW5EYXRlLCB0aGlzLmRhdGVwYXR0ZXJuLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSA9PT0gZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkKCRldmVudC50YXJnZXQpLnZhbChkaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVOb3RJblJhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlVHlwZSA9ICdtaW5kYXRlJztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaG93VmFsaWRhdGlvbigkZXZlbnQsIGRpc3BsYXlWYWx1ZSwgaXNOYXRpdmVQaWNrZXIsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tYXhkYXRlICYmIG5ld1ZhbCA+IG1heERhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHt0aGlzLmFwcExvY2FsZS5MQUJFTF9NQVhEQVRFX1ZBTElEQVRJT05fTUVTU0FHRX0gJHt0aGlzLm1heGRhdGV9LmA7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmF0aXZlUGlja2VyICYmIGdldEZvcm1hdHRlZERhdGUodGhpcy5kYXRlUGlwZSwgbWF4RGF0ZSwgdGhpcy5kYXRlcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykgPT09IGRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCgkZXZlbnQudGFyZ2V0KS52YWwoZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlTm90SW5SYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVR5cGUgPSAnbWF4ZGF0ZSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1ZhbGlkYXRpb24oJGV2ZW50LCBkaXNwbGF5VmFsdWUsIGlzTmF0aXZlUGlja2VyLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4Y2x1ZGVEYXRlc0FycmF5O1xuICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZyh0aGlzLmV4Y2x1ZGVkYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZURhdGVzQXJyYXkgPSBfLnNwbGl0KHRoaXMuZXhjbHVkZWRhdGVzLCAnLCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVEYXRlc0FycmF5ID0gdGhpcy5leGNsdWRlZGF0ZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVEYXRlc0FycmF5ID0gZXhjbHVkZURhdGVzQXJyYXkubWFwKGQgPT4gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBkLCB0aGlzLmRhdGVwYXR0ZXJuLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVEYXRlc0FycmF5LmluZGV4T2YoZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCBkYXRlVGltZVZhbCwgdGhpcy5kYXRlcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlTm90SW5SYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJ2V4Y2x1ZGVkYXRlcyc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZWRheXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGNsdWRlRGF5c0FycmF5ID0gXy5zcGxpdCh0aGlzLmV4Y2x1ZGVkYXlzLCAnLCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRheSA9IF8uZ2V0KGRhdGVUaW1lVmFsLCAnZ2V0RGF5JykgPyBkYXRlVGltZVZhbC5nZXREYXkoKSA6IGRhdGVUaW1lVmFsO1xuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlRGF5c0FycmF5LmluZGV4T2YoZGF5LnRvU3RyaW5nKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlTm90SW5SYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVUeXBlID0gJ2V4Y2x1ZGVkYXlzJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmF0aXZlUGlja2VyKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVOb3RJblJhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaGlnaGxpZ2h0IHRoZSBjdXJyZW50IGRhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGlnaHRsaWdodFRvZGF5KCkge1xuICAgICAgICBjb25zdCB0b0RheSA9IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgICAgIF8uZmlsdGVyKCQoYHNwYW46Y29udGFpbnMoJHt0b0RheX0pYCkubm90KCcuaXMtb3RoZXItbW9udGgnKSwgKG9iaikgPT4ge1xuICAgICAgICAgICAgaWYgKCQob2JqKS50ZXh0KCkgPT09IHRvRGF5KSB7XG4gICAgICAgICAgICAgICAgJChvYmopLmFkZENsYXNzKCdjdXJyZW50LWRhdGUgdGV4dC1pbmZvJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZmluZCB0aGUgbmV3IGRhdGUgaXMgZnJvbSBhbm90aGVyIHllYXIgb3Igbm90XG4gICAgICogQHBhcmFtIG5ld0RhdGUgLSBuZXdseSBzZWxlY3RlZCBkYXRlIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc090aGVyeWVhcihuZXdEYXRlKSB7XG4gICAgICAgIHJldHVybiAobmV3RGF0ZS5nZXRNb250aCgpID09PSAwICYmIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpID09PSAxMSkgfHwgKG5ld0RhdGUuZ2V0TW9udGgoKSA9PT0gMTEgJiYgdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCkgPT09IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGZvY3VzIGZvciBhY3RpdmUgZGF5XG4gICAgICogQHBhcmFtIG5ld0RhdGUgLSBuZXdseSBzZWxlY3RlZCBkYXRlIHZhbHVlXG4gICAgICogQHBhcmFtIGlzTW91c2VFdmVudCAtIGJvb2xlYW4gdmFsdWUgcmVwcmVzZW50cyB0aGUgZXZlbnQgaXMgbW91c2UgZXZlbnQvIGtleWJvYXJkIGV2ZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRBY3RpdmVEYXRlRm9jdXMobmV3RGF0ZSwgaXNNb3VzZUV2ZW50PzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldE5leHREYXRhKG5ld0RhdGUpO1xuICAgICAgICBjb25zdCBhY3RpdmVNb250aCA9IHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICAvLyBjaGVjayBmb3Iga2V5Ym9hcmQgZXZlbnRcbiAgICAgICAgaWYgKCFpc01vdXNlRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChuZXdEYXRlLmdldE1vbnRoKCkgPCBhY3RpdmVNb250aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPdGhlcnllYXIobmV3RGF0ZSkgPyB0aGlzLmdvVG9PdGhlck1vbnRoT3J5ZWFyKCduZXh0JywgJ2RheXMnKSA6IHRoaXMuZ29Ub090aGVyTW9udGhPcnllYXIoJ3ByZXZpb3VzJywgJ2RheXMnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3RGF0ZS5nZXRNb250aCgpID4gYWN0aXZlTW9udGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3RoZXJ5ZWFyKG5ld0RhdGUpID8gdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcigncHJldmlvdXMnLCAnZGF5cycpIDogdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcignbmV4dCcsICdkYXlzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXkgPSBuZXdEYXRlLmdldERhdGUoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgXy5maWx0ZXIoJChgc3Bhbjpjb250YWlucygke25ld0RheX0pYCkubm90KCcuaXMtb3RoZXItbW9udGgnKSwgKG9iaikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgkKG9iaikudGV4dCgpID09PSBuZXdEYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgJChvYmopLmF0dHIoJ2FyaWEtbGFiZWwnLCBtb21lbnQobmV3RGF0ZSkuZm9ybWF0KCdkZGRkLCBNTU1NIERvIFlZWVknKSk7XG4gICAgICAgICAgICAgICAgICAgICQob2JqKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXdEYXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG5ld0RhdGUuZ2V0TW9udGgoKSA9PT0gbmV3IERhdGUoKS5nZXRNb250aCgpICYmIG5ld0RhdGUuZ2V0RnVsbFllYXIoKSA9PT0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdodGxpZ2h0VG9kYXkoKTtcbiAgICAgICAgICAgICAgICAkKGBzcGFuOmNvbnRhaW5zKCR7bmV3IERhdGUoKS5nZXREYXRlKCkudG9TdHJpbmcoKX0pYCkubm90KCcuaXMtb3RoZXItbW9udGgnKS5wYXJlbnQoKS5hdHRyKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGxvYWQgb3RoZXIgbW9udGggZGF5cyBvciBvdGhlciBtb250aCBvciBvdGhlciB5ZWFyXG4gICAgICogQHBhcmFtIGJ0bkNsYXNzIC0gY2xhc3MocHJldmlvdXMvbmV4dCkgb2YgdGhlIGJ1dHRvbiB3aGljaCB3ZSBoYXZlIHRvIGNsaWNrXG4gICAgICogQHBhcmFtIHRpbWVQZXJpb2QgLSBTdHJpbmcgdmFsdWUgZGVjaWRlcyB0byBsb2FkIG90aGVyIG1vbnRoIGRheXMgb3Igb3RoZXIgbW9udGggb3Igb3RoZXIgeWVhclxuICAgICAqL1xuICAgIHByaXZhdGUgZ29Ub090aGVyTW9udGhPcnllYXIoYnRuQ2xhc3MsIHRpbWVQZXJpb2QpIHtcbiAgICAgICAgY29uc3QgJG5vZGUgPSAkKGAuYnMtZGF0ZXBpY2tlci1oZWFkIC4ke2J0bkNsYXNzfWApO1xuICAgICAgICBpZiAoJG5vZGUuYXR0cignZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICRub2RlLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIGlmICh0aW1lUGVyaW9kID09PSAnZGF5cycpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZERheXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aW1lUGVyaW9kID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRNb250aHMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aW1lUGVyaW9kID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFllYXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1vbnRoKGRhdGUsIGluYykge1xuICAgICAgICBjb25zdCBjdXJyZW50TW9udGggPSBuZXcgRGF0ZShkYXRlKTtcblxuICAgICAgICBsZXQgbW9udGggPSBjdXJyZW50TW9udGguZ2V0TW9udGgoKTtcbiAgICAgICAgbGV0IHllYXIgPSBjdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICBtb250aCArPSBpbmM7XG5cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoKTtcblxuICAgICAgICBjb25zdCBmdWxsTW9udGggPSBuZXdEYXRlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbW9udGg6ICdsb25nJyB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgICAgIGZ1bGxNb250aDogZnVsbE1vbnRoXG4gICAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIG1vdXNlIGV2ZW50cyB0byBEYXRlcGlja2VyIHBvcHVwLiBUaGVzZSBldmVudHMgYXJlIHJlcXVpcmVkIHdoZW4gd2UgbmF2aWdhdGUgZGF0ZSBwaWNrZXIgdGhyb3VnaCBtb3VzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZERhdGVwaWNrZXJNb3VzZUV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZGF0ZVBpY2tlckhlYWQgPSAkKGAuYnMtZGF0ZXBpY2tlci1oZWFkYCk7XG4gICAgICAgIGRhdGVQaWNrZXJIZWFkLmZpbmQoYC5wcmV2aW91c2ApLmNsaWNrKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0ID0gdGhpcy5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUsIDApO1xuICAgICAgICAgICAgdGhpcy5wcmV2ID0gdGhpcy5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUsIC0yKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igb3JpZ2luYWwgbW91c2UgY2xpY2tcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1c0ZvckRhdGUoLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGF0ZVBpY2tlckhlYWQuZmluZChgLm5leHRgKS5jbGljaygoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmV4dCA9IHRoaXMuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlLCAyKTtcbiAgICAgICAgICAgIHRoaXMucHJldiA9IHRoaXMuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igb3JpZ2luYWwgbW91c2UgY2xpY2tcbiAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb2N1c0ZvckRhdGUoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkYXRlUGlja2VySGVhZC5maW5kKGAuY3VycmVudGApLmNsaWNrKChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG9yaWdpbmFsIG1vdXNlIGNsaWNrXG4gICAgICAgICAgICBpZiAoZXZlbnQub3JpZ2luYWxFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXNGb3JDdXJyZW50TW9udGhPcnllYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICQoJy5icy1kYXRlcGlja2VyLWJvZHksIC5icy1kYXRlcGlja2VyLWFjdGlvbi1idXR0b25zJykuY2xpY2soKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBvcmlnaW5hbCBtb3VzZSBjbGlja1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzRm9yTW9udGhPckRheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGF0ZVBpY2tlckhlYWQuZmluZCgnLm5leHQnKS5hdHRyKCdhcmlhLWxhYmVsJywgYE5leHQgTW9udGgsICR7dGhpcy5uZXh0LmZ1bGxNb250aH0gJHt0aGlzLm5leHQuZGF0ZS5nZXRGdWxsWWVhcigpfWApO1xuICAgICAgICBkYXRlUGlja2VySGVhZC5maW5kKCcucHJldmlvdXMnKS5hdHRyKCdhcmlhLWxhYmVsJywgYFByZXZpb3VzIE1vbnRoLCAke3RoaXMucHJldi5mdWxsTW9udGh9ICR7dGhpcy5wcmV2LmRhdGUuZ2V0RnVsbFllYXIoKX1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIGZvY3VzIGZvciBtb250aHMvZGF5cyBkZXBlbmRpbmcgb24gdGhlIGxvYWRlZCBkYXRlcGlja2VyIHRhYmxlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRGb2N1c0Zvck1vbnRoT3JEYXkoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZU1vbnRoT3JZZWFyID0gJChgLmJzLWRhdGVwaWNrZXItaGVhZCAuY3VycmVudGApLmZpcnN0KCkudGV4dCgpO1xuICAgICAgICBjb25zdCBkYXRlUGlja2VyQm9keSA9ICQoJy5icy1kYXRlcGlja2VyLWJvZHknKTtcbiAgICAgICAgaWYgKGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLm1vbnRocycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChfLnBhcnNlSW50KGFjdGl2ZU1vbnRoT3JZZWFyKSAhPT0gdGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRNb250aHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShfLnBhcnNlSW50KGFjdGl2ZU1vbnRoT3JZZWFyKSwgdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVNb250aEZvY3VzKG5ld0RhdGUsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLmRheXMnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdNb250aCA9IG1vbnRocy5pbmRleE9mKGFjdGl2ZU1vbnRoT3JZZWFyKTtcbiAgICAgICAgICAgIGlmIChuZXdNb250aCAhPT0gdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXlzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksIG5ld01vbnRoLCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRGF0ZUZvY3VzKG5ld0RhdGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyBmb2N1cyBmb3IgbW9udGhzL3llYXJzIGRlcGVuZGluZyBvbiB0aGUgbG9hZGVkIGRhdGVwaWNrZXIgdGFibGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEZvY3VzRm9yQ3VycmVudE1vbnRoT3J5ZWFyKCkge1xuICAgICAgICBjb25zdCBkYXRlUGlja2VyQm9keSA9ICQoJy5icy1kYXRlcGlja2VyLWJvZHknKTtcbiAgICAgICAgaWYgKGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLm1vbnRocycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVNb250aEZvY3VzKHRoaXMuYWN0aXZlRGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUueWVhcnMnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRZZWFycygpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVZZWFyRm9jdXModGhpcy5hY3RpdmVEYXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgZm9jdXMgZm9yIG1vbnRocy95ZWFycy9kYXlzIGRlcGVuZGluZyBvbiB0aGUgbG9hZGVkIGRhdGVwaWNrZXIgdGFibGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEZvY3VzRm9yRGF0ZShjb3VudCkge1xuICAgICAgICBjb25zdCBkYXRlUGlja2VyQm9keSA9ICQoJy5icy1kYXRlcGlja2VyLWJvZHknKTtcbiAgICAgICAgaWYgKGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLm1vbnRocycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpICsgY291bnQsIDAsIHRoaXMuYWN0aXZlRGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVNb250aEZvY3VzKG5ld0RhdGUsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLnllYXJzJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkWWVhcnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0WWVhciA9IGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLnllYXJzIHNwYW4nKS5maXJzdCgpLnRleHQoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShfLnBhcnNlSW50KHN0YXJ0WWVhciksIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpLCB0aGlzLmFjdGl2ZURhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlWWVhckZvY3VzKG5ld0RhdGUsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLmRheXMnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWREYXlzKCk7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpICsgY291bnQsIDEpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXRlRm9jdXMobmV3RGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGFkZCBrZXlib2FyZCBldmVudHMgd2hpbGUgb3BlbmluZyB0aGUgZGF0ZSBwaWNrZXJcbiAgICAgKiBAcGFyYW0gc2NvcGUgLSBzY29wZSBvZiB0aGUgZGF0ZS9kYXRldGltZSB3aWRnZXRcbiAgICAgKiBAcGFyYW0gaXNEYXRlVGltZSAtIGJvb2xlYW4gdmFsdWUgcmVwcmVzZW50cyB0aGUgbG9hZGVkIHdpZGdldCBpcyBkYXRlIG9yIGRhdGV0aW1lXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFkZERhdGVwaWNrZXJLZXlib2FyZEV2ZW50cyhzY29wZSwgaXNEYXRlVGltZSkge1xuICAgICAgICB0aGlzLmtleUV2ZW50UGx1Z2luSW5zdGFuY2UgPSBzY29wZS5rZXlFdmVudFBsdWdpbi5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdGhpcy5lbGVtZW50U2NvcGUgPSBzY29wZTtcbiAgICAgICAgY29uc3QgZGF0ZUNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke3Njb3BlLmRhdGVDb250YWluZXJDbHN9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHNldEF0dHIoZGF0ZUNvbnRhaW5lciwgJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgZGF0ZUNvbnRhaW5lci5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMua2V5RXZlbnRQbHVnaW5JbnN0YW5jZS5nZXRFdmVudEZ1bGxLZXkoZXZlbnQpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFNoaWZ0K1RhYiBrZXkgb3IgVGFiIGtleSBvciBlc2NhcGVcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdlc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50U2NvcGUuaGlkZURhdGVwaWNrZXJEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlJbnB1dEVsZW0gPSB0aGlzLmVsZW1lbnRTY29wZS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kaXNwbGF5LWlucHV0JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkaXNwbGF5SW5wdXRFbGVtLmZvY3VzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxvYWREYXlzKCk7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlRGF0ZUZvY3VzKHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgfVxuICAgIHByaXZhdGUgc2V0TmV4dERhdGEobmV4dERhdGUpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gdGhpcy5nZXRNb250aChuZXh0RGF0ZSwgMSk7XG4gICAgICAgIHRoaXMucHJldiA9IHRoaXMuZ2V0TW9udGgobmV4dERhdGUsIC0xKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhZGQgdGFiaW5kZXgsIGtleWJvcmQgYW5kIG1vdXNlIGV2ZW50cyBmb3IgZGF5c1xuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZERheXMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgJCgnW2JzZGF0ZXBpY2tlcmRheWRlY29yYXRvcl0nKS5ub3QoJy5pcy1vdGhlci1tb250aCcpLmF0dHIoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNsaWNrZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5uZXh0ID0gdGhpcy5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUsIDEpO1xuICAgICAgICAgICAgLy8gICAgIHRoaXMucHJldiA9IHRoaXMuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlLCAtMSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmFkZEtleUJvYXJkRXZlbnRzRm9yRGF5cygpO1xuICAgICAgICAgICAgdGhpcy5hZGREYXRlcGlja2VyTW91c2VFdmVudHMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyBrZXlib2FyZCBldmVudHMgZm9yIGRheXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZEtleUJvYXJkRXZlbnRzRm9yRGF5cygpIHtcbiAgICAgICAgY29uc3QgZGF0ZVBpY2tlckJvZHkgPSAkKCcuYnMtZGF0ZXBpY2tlci1ib2R5Jyk7XG4gICAgICAgIGRhdGVQaWNrZXJCb2R5LmtleWRvd24oKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmtleUV2ZW50UGx1Z2luSW5zdGFuY2UuZ2V0RXZlbnRGdWxsS2V5KGV2ZW50KTtcbiAgICAgICAgICAgIGxldCBuZXdkYXRlO1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2Fycm93ZG93bicpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoKzcsICdkYXlzJykudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXRlRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Fycm93dXAnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKC03LCAnZGF5cycpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRGF0ZUZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdhcnJvd2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgbmV3ZGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmFkZCgtMSwgJ2RheXMnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZURhdGVGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3dyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKCsxLCAnZGF5cycpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRGF0ZUZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdwYWdldXAnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKC0xLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZURhdGVGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncGFnZWRvd24nKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKCsxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZURhdGVGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY29udHJvbC5hcnJvd3VwJykge1xuICAgICAgICAgICAgICAgIC8vIGNsaWNraW5nIG9uIHRhYmxlIGhlYWRlciBtb250aCBuYW1lIHRvIGxvYWQgbGlzdCBvZiBtb250aHNcbiAgICAgICAgICAgICAgICAkKCcuYnMtZGF0ZXBpY2tlci1oZWFkIC5jdXJyZW50JykuZmlyc3QoKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGhGb2N1cyh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdlbnRlcicpIHtcbiAgICAgICAgICAgICAgICBpZiAoJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5oYXNDbGFzcygnZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRTY29wZS5oaWRlRGF0ZXBpY2tlckRyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheUlucHV0RWxlbSA9IHRoaXMuZWxlbWVudFNjb3BlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRpc3BsYXktaW5wdXQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGRpc3BsYXlJbnB1dEVsZW0uZm9jdXMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZvY3VzQmx1ckRhdGVQaWNrZXJIZWFkQnV0dG9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNCbHVyRGF0ZVBpY2tlckhlYWRCdXR0b25zKCkge1xuICAgICAgICBjb25zdCBkYXRlUGlja2VySGVhZEJ1dHRvbiA9ICQoJy5icy1kYXRlcGlja2VyLWhlYWQgYnV0dG9uJyk7XG4gICAgICAgIGRhdGVQaWNrZXJIZWFkQnV0dG9uLm9uKCdmb2N1cycsIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjOUFBMEEzJyk7IH0pO1xuICAgICAgICBkYXRlUGlja2VySGVhZEJ1dHRvbi5vbignYmx1cicsIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcnKTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhZGQgdGFiaW5kZXgsIGtleWJvcmQgYW5kIG1vdXNlIGV2ZW50cyBmb3IgbW9udGhzXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkTW9udGhzKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVQaWNrZXJCb2R5ID0gJCgnLmJzLWRhdGVwaWNrZXItYm9keScpO1xuICAgICAgICAgICAgZGF0ZVBpY2tlckJvZHkuZmluZCgndGFibGUubW9udGhzIHNwYW4nKS5hdHRyKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICB0aGlzLmFkZEtleUJvYXJkRXZlbnRzRm9yTW9udGhzKCk7XG4gICAgICAgICAgICB0aGlzLmFkZERhdGVwaWNrZXJNb3VzZUV2ZW50cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIGtleWJvYXJkIGV2ZW50cyBmb3IgbW9udGhzXG4gICAgICovXG4gICAgcHJpdmF0ZSBhZGRLZXlCb2FyZEV2ZW50c0Zvck1vbnRocygpIHtcbiAgICAgICAgJCgnLmJzLWRhdGVwaWNrZXItYm9keScpLmtleWRvd24oKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmtleUV2ZW50UGx1Z2luSW5zdGFuY2UuZ2V0RXZlbnRGdWxsS2V5KGV2ZW50KTtcbiAgICAgICAgICAgIGxldCBuZXdkYXRlO1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2Fycm93ZG93bicpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoKzMsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGhGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3d1cCcpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoLTMsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGhGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3dsZWZ0Jykge1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoLTEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGhGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3dyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKCsxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NvbnRyb2wuYXJyb3d1cCcpIHtcbiAgICAgICAgICAgICAgICAvLyBjbGlja2luZyBvbiB0YWJsZSBoZWFkZXIgeWVhciB0byBsb2FkIGxpc3Qgb2YgeWVhcnNcbiAgICAgICAgICAgICAgICAkKCcuYnMtZGF0ZXBpY2tlci1oZWFkIC5jdXJyZW50JykuZmlyc3QoKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFllYXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVZZWFyRm9jdXModGhpcy5hY3RpdmVEYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY29udHJvbC5hcnJvd2Rvd24nIHx8IGFjdGlvbiA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgICAgIGlmICgkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnBhcmVudCgpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZERheXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZURhdGVGb2N1cyhuZXdEYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZm9jdXNCbHVyRGF0ZVBpY2tlckhlYWRCdXR0b25zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhZGQgdGFiaW5kZXgsIGtleWJvcmQgYW5kIG1vdXNlIGV2ZW50cyBmb3IgeWVhcnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRZZWFycygpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlUGlja2VyQm9keSA9ICQoJy5icy1kYXRlcGlja2VyLWJvZHknKTtcbiAgICAgICAgICAgIGRhdGVQaWNrZXJCb2R5LmZpbmQoJ3RhYmxlLnllYXJzIHNwYW4nKS5hdHRyKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICB0aGlzLmFkZEtleUJvYXJkRXZlbnRzRm9yWWVhcnMoKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRGF0ZXBpY2tlck1vdXNlRXZlbnRzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGZvY3VzIGZvciBhY3RpdmUgbW9udGhcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEFjdGl2ZU1vbnRoRm9jdXMobmV3RGF0ZSwgaXNNb291c2VFdmVudD86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXROZXh0RGF0YShuZXdEYXRlKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGggPSBtb250aHNbbmV3RGF0ZS5nZXRNb250aCgpXTtcbiAgICAgICAgLy8gY2hlY2sgZm9yIGtleWJvYXJkIGV2ZW50XG4gICAgICAgIGlmICghaXNNb291c2VFdmVudCkge1xuICAgICAgICAgICAgaWYgKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSA8IHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcigncHJldmlvdXMnLCAnbW9udGgnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3RGF0ZS5nZXRGdWxsWWVhcigpID4gdGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdvVG9PdGhlck1vbnRoT3J5ZWFyKCduZXh0JywgJ21vbnRoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAkKGAuYnMtZGF0ZXBpY2tlci1ib2R5IHRhYmxlLm1vbnRocyBzcGFuOmNvbnRhaW5zKCR7bmV3TW9udGh9KWApLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXdEYXRlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIGtleWJvYXJkIGV2ZW50cyBmb3IgeWVhcnNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZEtleUJvYXJkRXZlbnRzRm9yWWVhcnMoKSB7XG4gICAgICAgICQoJy5icy1kYXRlcGlja2VyLWJvZHknKS5rZXlkb3duKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5rZXlFdmVudFBsdWdpbkluc3RhbmNlLmdldEV2ZW50RnVsbEtleShldmVudCk7XG4gICAgICAgICAgICBsZXQgbmV3ZGF0ZTtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdhcnJvd2Rvd24nKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBuZXdkYXRlID0gbW9tZW50KHRoaXMuYWN0aXZlRGF0ZSkuYWRkKCs0LCAneWVhcicpLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlWWVhckZvY3VzKG5ld2RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdhcnJvd3VwJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgbmV3ZGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmFkZCgtNCwgJ3llYXInKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVllYXJGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3dsZWZ0Jykge1xuICAgICAgICAgICAgICAgIG5ld2RhdGUgPSBtb21lbnQodGhpcy5hY3RpdmVEYXRlKS5hZGQoLTEsICd5ZWFyJykudG9EYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVZZWFyRm9jdXMobmV3ZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Fycm93cmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgbmV3ZGF0ZSA9IG1vbWVudCh0aGlzLmFjdGl2ZURhdGUpLmFkZCgrMSwgJ3llYXInKS50b0RhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVllYXJGb2N1cyhuZXdkYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY29udHJvbC5hcnJvd2Rvd24nIHx8IGFjdGlvbiA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgICAgIGlmICgkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnBhcmVudCgpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGhGb2N1cyh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mb2N1c0JsdXJEYXRlUGlja2VySGVhZEJ1dHRvbnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCBmb2N1cyBmb3IgYWN0aXZlIHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEFjdGl2ZVllYXJGb2N1cyhuZXdEYXRlLCBpc01vdXNlRXZlbnQ/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG5ld1llYXIgPSBuZXdEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNvbnN0IGRhdGVQaWNrZXJZZWFycyA9ICQoJy5icy1kYXRlcGlja2VyLWJvZHkgdGFibGUueWVhcnMgc3BhbicpO1xuICAgICAgICBjb25zdCBzdGFydFllYXIgPSBkYXRlUGlja2VyWWVhcnMuZmlyc3QoKS50ZXh0KCk7XG4gICAgICAgIGNvbnN0IGVuZFllYXIgPSBkYXRlUGlja2VyWWVhcnMubGFzdCgpLnRleHQoKTtcbiAgICAgICAgLy8gY2hlY2sgZm9yIGtleWJvYXJkIGV2ZW50XG4gICAgICAgIGlmICghaXNNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICBpZiAobmV3RGF0ZS5nZXRGdWxsWWVhcigpIDwgXy5wYXJzZUludChzdGFydFllYXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcigncHJldmlvdXMnLCAneWVhcicpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdEYXRlLmdldEZ1bGxZZWFyKCkgPiBfLnBhcnNlSW50KGVuZFllYXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nb1RvT3RoZXJNb250aE9yeWVhcignbmV4dCcsICd5ZWFyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAkKGAuYnMtZGF0ZXBpY2tlci1ib2R5IHRhYmxlLnllYXJzIHNwYW46Y29udGFpbnMoJHtuZXdZZWFyfSlgKS5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3RGF0ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyBmb2N1cyBmb3IgdGltZXBpY2tlciBmaXJzdCBpbnB1dCBmaWVsZChob3VycyBmaWVsZCkgd2hpbGUgb3BlbmluZyB0aW1lIHBpY2tlclxuICAgICAqIEBwYXJhbSBzY29wZSAtIHNjb3BlIG9mIHRoZSB0aW1lIHBpY2tlciB3aWRnZXRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZm9jdXNUaW1lUGlja2VyUG9wb3ZlcihzY29wZSkge1xuICAgICAgICB0aGlzLmtleUV2ZW50UGx1Z2luSW5zdGFuY2UgPSBzY29wZS5rZXlFdmVudFBsdWdpbi5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdGhpcy5lbGVtZW50U2NvcGUgPSBzY29wZTtcbiAgICAgICAgLy8gc2V0VGltZW91dCBpcyB1c2VkIHNvIHRoYXQgYnkgdGhlbiB0aW1lIGlucHV0IGhhcyB0aGUgdXBkYXRlZCB2YWx1ZS4gZm9jdXMgaXMgc2V0dGluZyBiYWNrIHRvIHRoZSBpbnB1dCBmaWVsZFxuICAgICAgICB0aGlzLmVsZW1lbnRTY29wZS5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgJCgndGltZXBpY2tlciAuZm9ybS1ncm91cCcpLmZpcnN0KCkuZmluZCgnPiBpbnB1dC5mb3JtLWNvbnRyb2wnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBrZXlib2FyZCBldmVudHMgdG8gVGltZXBpY2tlciBwb3B1cFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBiaW5kVGltZVBpY2tlcktleWJvYXJkRXZlbnRzKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICR0aW1lcGlja2VyUG9wdXAgPSAkKCdib2R5JykuZmluZCgnPiBicy1kcm9wZG93bi1jb250YWluZXIgdGltZXBpY2tlcicpO1xuICAgICAgICAgICAgJHRpbWVwaWNrZXJQb3B1cC5hdHRyKCd0YWJpbmRleCcsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudHNPblRpbWVQaWNrZXIoJHRpbWVwaWNrZXJQb3B1cCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmb2N1c09uSW5wdXRFbCgpIHtcbiAgICAgICAgaWYgKCQodGhpcy5uYXRpdmVFbGVtZW50KS5jbG9zZXN0KCcuY2FwdGlvbi1mbG9hdGluZycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuYXBwLXRleHRib3gnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGRhdGUgaXMgdmFsaWQgb3Igbm90XG4gICAgICogQHJldHVybnMgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBpZiBkYXRlIGlzIHZhbGlkIGVsc2UgcmV0dXJucyBmYWxzZVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNWYWxpZERhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHRpbWUgaXMgdmFsaWQgb3Igbm90XG4gICAgICovXG4gICAgcHJpdmF0ZSB0aW1lRm9ybWF0VmFsaWRhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZW50ZXJlZERhdGUgPSAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnaW5wdXQnKS52YWwoKTtcbiAgICAgICAgY29uc3QgbmV3VmFsID0gZ2V0TmF0aXZlRGF0ZU9iamVjdChlbnRlcmVkRGF0ZSwge21lcmlkaWFuczogdGhpcy5tZXJpZGlhbnMsIHBhdHRlcm46IHRoaXMuZGF0ZXBhdHRlcm59KTtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1hdFZhbGlkYXRpb24obmV3VmFsLCBlbnRlcmVkRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludmFsaWREYXRlVGltZUZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRpbWVWYWx1ZSh2YWx1ZSwgZmllbGROYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWUgPT09ICdtaW51dGVzJyA/IHRoaXMuYnNUaW1lUGlja2VyLnVwZGF0ZU1pbnV0ZXMoJzAwJykgOiB0aGlzLmJzVGltZVBpY2tlci51cGRhdGVTZWNvbmRzKCcwMCcpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkTmFtZSA9PT0gJ21pbnV0ZXMnID8gdGhpcy5ic1RpbWVQaWNrZXIudXBkYXRlTWludXRlcygnMDAnKSA6IHRoaXMuYnNUaW1lUGlja2VyLnVwZGF0ZVNlY29uZHMoJzAwJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV2ZW50cyB0byBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtICRlbCAtIGVsZW1lbnQgb24gd2hpY2ggdGhlIGV2ZW50IGlzIGFkZGVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBhZGRFdmVudHNPblRpbWVQaWNrZXIoJGVsOiBKUXVlcnkpIHtcbiAgICAgICAgY29uc3QgaW5wdXRGaWVsZHMgPSAkZWwuZmluZCgnLmJzLXRpbWVwaWNrZXItZmllbGQnKTtcbiAgICAgICAgLy8gV01TLTE5MzgyOiB1cGRhdGUgbWludXRlcyBhbmQgc2Vjb25kcyB0byAwIHdoZW4gd2UgZW50ZXIgaG91ciB2YWx1ZVxuICAgICAgICBpbnB1dEZpZWxkcy5maXJzdCgpLm9uKCdrZXl1cCcsIGV2dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBob3VyVmFsdWUgPSAoZXZ0LnRhcmdldCBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgXy5mb3JFYWNoKGlucHV0RmllbGRzLCAoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2dC50YXJnZXQgIT09IGZpZWxkICYmIGZpZWxkLnZhbHVlID09PSAnJyAmJiBob3VyVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGluZGV4ID09PSAxID8gJ21pbnV0ZXMnIDogJ3NlY29uZHMnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVWYWx1ZShob3VyVmFsdWUsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlbW92ZUtleXVwTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBpbnB1dEZpZWxkcy5maXJzdCgpLm9mZigna2V5dXAnKTtcbiAgICAgICAgfTtcbiAgICAgICAgJGVsLm9uKCdrZXlkb3duJywgZXZ0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2dC50YXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgJHBhcmVudCA9ICR0YXJnZXQucGFyZW50KCk7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50U2NvcGUgPSB0aGlzLmVsZW1lbnRTY29wZTtcblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5rZXlFdmVudFBsdWdpbkluc3RhbmNlLmdldEV2ZW50RnVsbEtleShldnQpO1xuXG4gICAgICAgICAgICBsZXQgc3RvcFByb3BvZ2F0aW9uLCBwcmV2ZW50RGVmYXVsdDtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuaGlkZVRpbWVwaWNrZXJEcm9wZG93bigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoJHRhcmdldC5oYXNDbGFzcygnYnMtdGltZXBpY2tlci1maWVsZCcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCRwYXJlbnQuaXMoJzpmaXJzdC1jaGlsZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdzaGlmdC50YWInIHx8IGFjdGlvbiA9PT0gJ2VudGVyJyB8fCBhY3Rpb24gPT09ICdlc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuc2V0SXNUaW1lT3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcG9nYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkcGFyZW50LmlzKCc6bGFzdC1jaGlsZCcpIHx8ICgkcGFyZW50Lm5leHQoKS5uZXh0KCkuZmluZCgnYnV0dG9uLmRpc2FibGVkJykubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAndGFiJyB8fCBhY3Rpb24gPT09ICdlc2NhcGUnIHx8IGFjdGlvbiA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNjb3BlLnNldElzVGltZU9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BvZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdlbnRlcicgfHwgYWN0aW9uID09PSAnZXNjYXBlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNjb3BlLnNldElzVGltZU9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BvZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RvcFByb3BvZ2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFNjb3BlLm1pbnRpbWUgJiYgZWxlbWVudFNjb3BlLm1heHRpbWUgJiYgIXRoaXMuaXNWYWxpZERhdGUoZWxlbWVudFNjb3BlLmJzVGltZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnYXJyb3dkb3duJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNjb3BlLmJzVGltZVZhbHVlID0gZWxlbWVudFNjb3BlLm1heFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYXJyb3d1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSA9IGVsZW1lbnRTY29wZS5taW5UaW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICd0YWInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZERhdGVUaW1lRm9ybWF0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5kYXRlcGF0dGVybiB8fCB0aGlzLnRpbWVwYXR0ZXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Rm9ybWF0dGVkRGF0ZShlbGVtZW50U2NvcGUuZGF0ZVBpcGUsIGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSwgcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykgPT09IGVsZW1lbnRTY29wZS5kaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuZGlzcGxheS1pbnB1dCcpLnZhbChlbGVtZW50U2NvcGUuZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnYXJyb3dkb3duJyB8fCBhY3Rpb24gPT09ICdhcnJvd3VwJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVGb3JtYXRWYWxpZGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgkdGFyZ2V0Lmhhc0NsYXNzKCdidG4tZGVmYXVsdCcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3RhYicgfHwgYWN0aW9uID09PSAnZXNjYXBlJykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuc2V0SXNUaW1lT3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAkZWwuZmluZCgnYScpLm9uKCdjbGljaycsIGV2dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50U2NvcGUgPSB0aGlzLmVsZW1lbnRTY29wZTtcbiAgICAgICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2dC50YXJnZXQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRTY29wZS5taW50aW1lICYmIGVsZW1lbnRTY29wZS5tYXh0aW1lICYmICF0aGlzLmlzVmFsaWREYXRlKGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoJHRhcmdldC5maW5kKCdzcGFuJykuaGFzQ2xhc3MoJ2JzLWNoZXZyb24tZG93bicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTY29wZS5ic1RpbWVWYWx1ZSA9IGVsZW1lbnRTY29wZS5tYXhUaW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHRhcmdldC5maW5kKCdzcGFuJykuaGFzQ2xhc3MoJ2JzLWNoZXZyb24tdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2NvcGUuYnNUaW1lVmFsdWUgPSBlbGVtZW50U2NvcGUubWluVGltZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRpbWVGb3JtYXRWYWxpZGF0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVGb3JtYXQocGF0dGVybikge1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gJ2RhdGVwYXR0ZXJuJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuZGF0ZUlucHV0Rm9ybWF0ID0gdGhpcy5kYXRlcGF0dGVybjtcbiAgICAgICAgICAgIHRoaXMuc2hvd3NlY29uZHMgPSBfLmluY2x1ZGVzKHRoaXMuZGF0ZXBhdHRlcm4sICdzJyk7XG4gICAgICAgICAgICB0aGlzLmlzbWVyaWRpYW4gPSBfLmluY2x1ZGVzKHRoaXMuZGF0ZXBhdHRlcm4sICdoJyk7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gJ3RpbWVwYXR0ZXJuJykge1xuICAgICAgICAgICAgdGhpcy5zaG93c2Vjb25kcyA9IF8uaW5jbHVkZXModGhpcy50aW1lcGF0dGVybiwgJ3MnKTtcbiAgICAgICAgICAgIHRoaXMuaXNtZXJpZGlhbiA9IF8uaW5jbHVkZXModGhpcy50aW1lcGF0dGVybiwgJ2gnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1vYmlsZUlucHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2JpbGUtaW5wdXQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICB9XG5cbiAgICBvbkRhdGVUaW1lSW5wdXRCbHVyKCkge1xuICAgICAgICAvLyByZW1vdmluZyB0aGUgb3BhY2l0eSBvbiBibHVyIG9mIHRoZSBtb2JpbGUgd2lkZ2V0XG4gICAgICAgIGxldCBkaXNwbGF5SW5wdXRFbGVtID0gdGhpcy5nZXRNb2JpbGVJbnB1dCgpO1xuICAgICAgICBpZiAoZGlzcGxheUlucHV0RWxlbSAmJiAhaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2FkZC1vcGFjaXR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5SW5wdXRFbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3JlbW92ZS1vcGFjaXR5Jyk7XG4gICAgICAgICAgICBsZXQgYWxsRGF0ZVRpbWVFbGVtZW50cyA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgYWxsRGF0ZVRpbWVFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFsbERhdGVUaW1lRWxlbWVudHNbaV0uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIHRoaXMudGFiaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGxheUlucHV0RWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRhdGVUaW1lSW5wdXRGb2N1cyhza2lwRm9jdXM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkaXNwbGF5SW5wdXRFbGVtID0gdGhpcy5nZXRNb2JpbGVJbnB1dCgpO1xuICAgICAgICAvLyB0b2dnbGluZyB0aGUgY2xhc3NlcyB0byBzaG93IGFuZCBoaWRlIHRoZSBuYXRpdmUgd2lkZ2V0IHVzaW5nIG9wYWNpdHlcbiAgICAgICAgaWYgKHNraXBGb2N1cyAmJiAhaGFzQ29yZG92YSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmNsYXNzTGlzdC5hZGQoJ2FkZC1vcGFjaXR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5SW5wdXRFbGVtLmNsYXNzTGlzdC5hZGQoJ3JlbW92ZS1vcGFjaXR5Jyk7XG4gICAgICAgICAgICBsZXQgYWxsRGF0ZVRpbWVFbGVtZW50cyA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgYWxsRGF0ZVRpbWVFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFsbERhdGVUaW1lRWxlbWVudHNbaV0uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGxheUlucHV0RWxlbS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGhpcy50YWJpbmRleCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzcGxheUlucHV0RWxlbSAmJiB0aGlzLl90cmlnZ2VyZWRCeVVzZXIpIHtcbiAgICAgICAgICAgIGRpc3BsYXlJbnB1dEVsZW0uZm9jdXMoKTtcbiAgICAgICAgICAgIGRpc3BsYXlJbnB1dEVsZW0uY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENvcmRvdmFQbHVnaW5EYXRlUGlja2VyQXBpKCkge1xuICAgICAgICBpZiAoaXNJb3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIF8uZ2V0KHdpbmRvdywgJ2NvcmRvdmEud2F2ZW1ha2VyLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dEYXRlUGlja2VyTW9kYWwoKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWVwaWNrZXJDb21wb25lbnQuc2hvdygpO1xuICAgICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIGJsdXJEYXRlSW5wdXQoaXNQaWNrZXJPcGVuKSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlJbnB1dEVsZW0gPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRpc3BsYXktaW5wdXQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGlzUGlja2VyT3Blbikge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkaXNwbGF5SW5wdXRFbGVtLmJsdXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92Pykge1xuXG4gICAgICAgIGlmIChrZXkgPT09ICd0YWJpbmRleCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2RhdGVwYXR0ZXJuJykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtYXQoa2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzaG93d2Vla3MnKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRlT3B0aW9ucy5zaG93V2Vla051bWJlcnMgPSBudjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdtaW5kYXRlJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMubWluRGF0ZSA9IChudiA9PT0gQ1VSUkVOVF9EQVRFKSA/IHRoaXMubWluZGF0ZSA9IG5ldyBEYXRlKCkgOiBnZXREYXRlT2JqKG52KTtcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZU1heERhdGVWYWxpZGF0aW9uT25JbnB1dCh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbWF4ZGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGVPcHRpb25zLm1heERhdGUgPSAobnYgPT09IENVUlJFTlRfREFURSkgPyB0aGlzLm1heGRhdGUgPSBuZXcgRGF0ZSgpIDogZ2V0RGF0ZU9iaihudik7XG4gICAgICAgICAgICB0aGlzLm1pbkRhdGVNYXhEYXRlVmFsaWRhdGlvbk9uSW5wdXQodGhpcy5kYXRhdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4Y2x1ZGVkYXRlcycgfHwga2V5ID09PSAnZXhjbHVkZWRheXMnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGNsdWRlZGF5cykge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZWREYXlzVG9EaXNhYmxlID0gXy5zcGxpdCh0aGlzLmV4Y2x1ZGVkYXlzLCAnLCcpLm1hcCgoZGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiArZGF5O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZERhdGVzVG9EaXNhYmxlID0gdGhpcy5leGNsdWRlZGF0ZXM7XG4gICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nKHRoaXMuZXhjbHVkZWRhdGVzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkRGF0ZXNUb0Rpc2FibGUgPSBfLnNwbGl0KHRoaXMuZXhjbHVkZWRhdGVzLCAnLCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkRGF0ZXNUb0Rpc2FibGUgPSB0aGlzLmV4Y2x1ZGVkRGF0ZXNUb0Rpc2FibGUubWFwKGQgPT4gZ2V0RGF0ZU9iaihkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1pbkRhdGVNYXhEYXRlVmFsaWRhdGlvbk9uSW5wdXQodGhpcy5kYXRhdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3NlbGVjdGZyb21vdGhlcm1vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuc2VsZWN0RnJvbU90aGVyTW9udGggPSBudjtcblxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RvZGF5YnV0dG9uJyl7XG4gICAgICAgICAgICB0aGlzLl9kYXRlT3B0aW9ucy5zaG93VG9kYXlCdXR0b24gPSBudjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdjbGVhcmJ1dHRvbicpe1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuc2hvd0NsZWFyQnV0dG9uID0gbnY7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAndG9kYXlidXR0b25sYWJlbCcpe1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMudG9kYXlCdXR0b25MYWJlbCA9IHRoaXMuaTE4blNlcnZpY2UuZ2V0TG9jYWxpemVkTWVzc2FnZShudikgfHwgbnY7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY2xlYXJidXR0b25sYWJlbCcpe1xuICAgICAgICAgICAgdGhpcy5fZGF0ZU9wdGlvbnMuY2xlYXJCdXR0b25MYWJlbCA9IHRoaXMuaTE4blNlcnZpY2UuZ2V0TG9jYWxpemVkTWVzc2FnZShudikgfHwgbnY7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnc2hvd2N1c3RvbXBpY2tlcicpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA9IGlzTW9iaWxlKCkgJiYgIXRoaXMuc2hvd2N1c3RvbXBpY2tlcjtcbiAgICAgICAgfSBlbHNlIGlmKGtleSA9PT0gJ2FkYXB0aXZlcG9zaXRpb24nKXtcbiAgICAgICAgICAgIHRoaXMuX2RhdGVPcHRpb25zLmFkYXB0aXZlUG9zaXRpb24gPSBudjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclRhcmdldCA9IGdldENvbnRhaW5lclRhcmdldENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuaXNSZWFkT25seSA9IHRoaXMuZGF0YWVudHJ5bW9kZSAhPSAndW5kZWZpbmVkJyAmJiAhdGhpcy5pc0RhdGFFbnRyeU1vZGVFbmFibGVkT25JbnB1dCh0aGlzLmRhdGFlbnRyeW1vZGUpO1xuXG4gICAgICAgIC8vIHRoaXMgbW9iaWxlaW5wdXQgd2lkdGggdmFyaWVzIGluIGlvcyBoZW5jZSBzZXR0aW5nIHdpZHRoIGhlcmUuXG4gICAgICAgIGxldCBtb2JpbGVJbnB1dCA9IHRoaXMuZ2V0TW9iaWxlSW5wdXQoKTtcbiAgICAgICAgaWYgKG1vYmlsZUlucHV0KSB7XG4gICAgICAgICAgICBtb2JpbGVJbnB1dC5zdHlsZS53aWR0aCA9IG1vYmlsZUlucHV0LnBhcmVudEVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGVPblNob3dTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZU9uU2hvd1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRldGFjaCgpIHtcbiAgICAgICAgdGhpcy5kYXRldGltZXBpY2tlckNvbXBvbmVudD8uaGlkZU1vZGFsKCk7XG4gICAgfVxuXG4gICAgc2V0VGltZXpvbmUobG9jYWxlKSB7XG4gICAgICAgIHRoaXMuaTE4blNlcnZpY2Uuc2V0VGltZXpvbmUobG9jYWxlLCB0aGlzKTtcbiAgICB9XG59XG4iXX0=