@spicainternational/ngx-sds-components 5.2.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/esm2020/public-api.mjs +3 -1
  2. package/esm2020/src/lib/app-switcher/app-switcher.component.mjs +1 -1
  3. package/esm2020/src/lib/avatar/avatar-group.component.mjs +1 -1
  4. package/esm2020/src/lib/avatar/avatar.component.mjs +15 -13
  5. package/esm2020/src/lib/color-picker/color-picker.component.mjs +1 -1
  6. package/esm2020/src/lib/date-picker/date-picker.component.mjs +33 -17
  7. package/esm2020/src/lib/date-picker/sds-date-picker.service.mjs +4 -4
  8. package/esm2020/src/lib/layout/default-layout/default-layout.component.mjs +15 -0
  9. package/esm2020/src/lib/layout/extra-large-layout/extra-large-layout.component.mjs +15 -0
  10. package/esm2020/src/lib/layout/fluid-layout/fluid-layout.component.mjs +15 -0
  11. package/esm2020/src/lib/layout/layout.module.mjs +49 -0
  12. package/esm2020/src/lib/layout/medium-layout/medium-layout.component.mjs +15 -0
  13. package/esm2020/src/lib/layout/public-api.mjs +7 -0
  14. package/esm2020/src/lib/layout/small-layout/small-layout.component.mjs +15 -0
  15. package/esm2020/src/lib/layout/spicainternational-ngx-sds-components-src-lib-layout.mjs +5 -0
  16. package/esm2020/src/lib/modal/dialog/dialog.component.mjs +1 -1
  17. package/esm2020/src/lib/modal/modal.component.mjs +6 -3
  18. package/esm2020/src/lib/page-header/page-header.component.mjs +22 -0
  19. package/esm2020/src/lib/page-header/page-header.module.mjs +19 -0
  20. package/esm2020/src/lib/page-header/public-api.mjs +3 -0
  21. package/esm2020/src/lib/page-header/spicainternational-ngx-sds-components-src-lib-page-header.mjs +5 -0
  22. package/esm2020/src/lib/quick-info/quick-info.component.mjs +49 -8
  23. package/esm2020/src/lib/segmented-control/segmented-control.component.mjs +1 -1
  24. package/fesm2015/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +1 -1
  25. package/fesm2015/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +1 -1
  26. package/fesm2015/spicainternational-ngx-sds-components-src-lib-avatar.mjs +15 -13
  27. package/fesm2015/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +1 -1
  28. package/fesm2015/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +1 -1
  29. package/fesm2015/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +1 -1
  30. package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +35 -19
  31. package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +1 -1
  32. package/fesm2015/spicainternational-ngx-sds-components-src-lib-layout.mjs +112 -0
  33. package/fesm2015/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +1 -0
  34. package/fesm2015/spicainternational-ngx-sds-components-src-lib-modal.mjs +6 -3
  35. package/fesm2015/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +1 -1
  36. package/fesm2015/spicainternational-ngx-sds-components-src-lib-page-header.mjs +45 -0
  37. package/fesm2015/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +1 -0
  38. package/fesm2015/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +50 -7
  39. package/fesm2015/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +1 -1
  40. package/fesm2015/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +1 -1
  41. package/fesm2015/spicainternational-ngx-sds-components.mjs +2 -0
  42. package/fesm2015/spicainternational-ngx-sds-components.mjs.map +1 -1
  43. package/fesm2020/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +1 -1
  44. package/fesm2020/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +1 -1
  45. package/fesm2020/spicainternational-ngx-sds-components-src-lib-avatar.mjs +15 -13
  46. package/fesm2020/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +1 -1
  47. package/fesm2020/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +1 -1
  48. package/fesm2020/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +1 -1
  49. package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +35 -19
  50. package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +1 -1
  51. package/fesm2020/spicainternational-ngx-sds-components-src-lib-layout.mjs +112 -0
  52. package/fesm2020/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +1 -0
  53. package/fesm2020/spicainternational-ngx-sds-components-src-lib-modal.mjs +6 -3
  54. package/fesm2020/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +1 -1
  55. package/fesm2020/spicainternational-ngx-sds-components-src-lib-page-header.mjs +45 -0
  56. package/fesm2020/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +1 -0
  57. package/fesm2020/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +48 -7
  58. package/fesm2020/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +1 -1
  59. package/fesm2020/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +1 -1
  60. package/fesm2020/spicainternational-ngx-sds-components.mjs +2 -0
  61. package/fesm2020/spicainternational-ngx-sds-components.mjs.map +1 -1
  62. package/package.json +17 -1
  63. package/public-api.d.ts +2 -0
  64. package/src/lib/date-picker/date-picker.component.d.ts +4 -1
  65. package/src/lib/date-picker/sds-date-picker.service.d.ts +1 -1
  66. package/src/lib/layout/default-layout/default-layout.component.d.ts +8 -0
  67. package/src/lib/layout/extra-large-layout/extra-large-layout.component.d.ts +8 -0
  68. package/src/lib/layout/fluid-layout/fluid-layout.component.d.ts +8 -0
  69. package/src/lib/layout/layout.module.d.ts +13 -0
  70. package/src/lib/layout/medium-layout/medium-layout.component.d.ts +8 -0
  71. package/src/lib/layout/package.json +10 -0
  72. package/src/lib/layout/public-api.d.ts +6 -0
  73. package/src/lib/layout/small-layout/small-layout.component.d.ts +8 -0
  74. package/src/lib/layout/spicainternational-ngx-sds-components-src-lib-layout.d.ts +5 -0
  75. package/src/lib/modal/modal.component.d.ts +2 -1
  76. package/src/lib/page-header/package.json +10 -0
  77. package/src/lib/page-header/page-header.component.d.ts +10 -0
  78. package/src/lib/page-header/page-header.module.d.ts +8 -0
  79. package/src/lib/page-header/public-api.d.ts +2 -0
  80. package/src/lib/page-header/spicainternational-ngx-sds-components-src-lib-page-header.d.ts +5 -0
  81. package/src/lib/quick-info/quick-info.component.d.ts +21 -4
  82. package/src/lib/segmented-control/segmented-control.component.d.ts +1 -1
@@ -8,8 +8,8 @@ import * as i1 from "./sds-date-picker.service";
8
8
  import * as i2 from "devextreme-angular";
9
9
  import * as i3 from "@fortawesome/angular-fontawesome";
10
10
  import * as i4 from "devextreme-angular/ui/nested";
11
- import * as i5 from "devextreme-angular/core";
12
- import * as i6 from "@angular/common";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "devextreme-angular/core";
13
13
  export class SdsDatePickerComponent {
14
14
  // public methods
15
15
  constructor(changeRef, datePickerService) {
@@ -31,6 +31,8 @@ export class SdsDatePickerComponent {
31
31
  this.occupiedDays = [];
32
32
  this.applyText = 'close';
33
33
  this.cancelText = 'close';
34
+ this.firstDayOfWeek = 1;
35
+ this.dateRangeDefinitionsWidth = '10rem';
34
36
  // public properties
35
37
  this.previousPeriodIcon = faAngleLeft;
36
38
  this.nextPeriodIcon = faAngleRight;
@@ -61,6 +63,7 @@ export class SdsDatePickerComponent {
61
63
  return (data.view === 'month' &&
62
64
  this.occupiedDays.some((date) => isSameDay(date, data.date)));
63
65
  };
66
+ this.dateRangeDefinitions = [];
64
67
  this.minDateDefault = new Date(1900, 1, 1);
65
68
  this.maxDateDefault = add(startOfDay(new Date()), { years: 50 });
66
69
  this.showDatepicker = false;
@@ -102,7 +105,6 @@ export class SdsDatePickerComponent {
102
105
  this.dateEndOld = this.selectedDateEnd;
103
106
  }
104
107
  if (changes['selectedDate']) {
105
- console.log('selectedDate changed');
106
108
  const value = changes['selectedDate'].currentValue;
107
109
  this.selectedDateInternal = startOfDay(value);
108
110
  if (this.selectionKind == 'single') {
@@ -175,6 +177,9 @@ export class SdsDatePickerComponent {
175
177
  }
176
178
  }
177
179
  }
180
+ if (changes['firstDayOfWeek']) {
181
+ this.generateDateRanges(true);
182
+ }
178
183
  }
179
184
  get selectedDateStartFocus() {
180
185
  return this.selectedDateFocus;
@@ -263,6 +268,8 @@ export class SdsDatePickerComponent {
263
268
  });
264
269
  }
265
270
  else {
271
+ this.dateStartOld = this.selectedDateStart;
272
+ this.dateEndOld = this.selectedDateEnd;
266
273
  this.isSettingNotPreprocessedDate = true;
267
274
  setTimeout(() => {
268
275
  this.selectedDateStartBox?.instance.focus();
@@ -301,10 +308,10 @@ export class SdsDatePickerComponent {
301
308
  else {
302
309
  const dateStartNew = new Date(this.selectedDateStart);
303
310
  const dateEndNew = new Date(this.selectedDateEnd);
304
- const startDateChanged = this.dateStartOld instanceof Date &&
305
- !isSameDay(this.dateStartOld, dateStartNew);
306
- const endDateChanged = this.dateEndOld instanceof Date &&
307
- !isSameDay(this.dateEndOld, dateEndNew);
311
+ const startDateChanged = (this.dateStartOld instanceof Date && !isSameDay(this.dateStartOld, dateStartNew)) ||
312
+ (typeof this.dateStartOld === 'string' && this.dateStartOld === '');
313
+ const endDateChanged = (this.dateEndOld instanceof Date && !isSameDay(this.dateEndOld, dateEndNew)) ||
314
+ (typeof this.dateEndOld === 'string' && this.dateEndOld === '');
308
315
  if (startDateChanged) {
309
316
  this.dateStartOld = new Date(this.selectedDateStart);
310
317
  this.selectedDateStartChange.emit(this.selectedDateStart);
@@ -357,19 +364,21 @@ export class SdsDatePickerComponent {
357
364
  this.setSelectedDate(range[0], range[1]);
358
365
  }
359
366
  getCellCssClass(date) {
360
- const calendarDate = date;
367
+ const calendarDate = new Date(date);
361
368
  let css = '';
362
369
  if (this.selectionKind == 'period') {
363
- if (isAfter(calendarDate, startOfDay(this.selectedDateStart)) &&
364
- isBefore(calendarDate, startOfDay(this.selectedDateEnd)) &&
370
+ const selectedDateStartAsDate = new Date(this.selectedDateStart);
371
+ const selectedDateEndAsDate = new Date(this.selectedDateEnd);
372
+ if (isAfter(calendarDate, startOfDay(selectedDateStartAsDate)) &&
373
+ isBefore(calendarDate, startOfDay(selectedDateEndAsDate)) &&
365
374
  !this.occupiedDays.some((day) => isSameDay(calendarDate, day))) {
366
375
  css += ' bg-secondary text-dark rounded-0';
367
376
  }
368
377
  else {
369
- if (isSameDay(calendarDate, this.selectedDateStart)) {
378
+ if (isSameDay(calendarDate, selectedDateStartAsDate)) {
370
379
  css += ' bg-primary text-white rounded-left';
371
380
  }
372
- if (isSameDay(calendarDate, this.selectedDateEnd)) {
381
+ if (isSameDay(calendarDate, selectedDateEndAsDate)) {
373
382
  css += ' bg-primary text-white rounded-right';
374
383
  }
375
384
  }
@@ -383,6 +392,10 @@ export class SdsDatePickerComponent {
383
392
  element?.classList?.remove('dx-calendar-selected-date');
384
393
  }
385
394
  }
395
+ onContentReady(e) {
396
+ var contentElement = e.component.content();
397
+ contentElement.style.padding = '0';
398
+ }
386
399
  toggleDateRangeSelectorVisibility() {
387
400
  if (!this.showPredefinedOptionsSelector) {
388
401
  this.generateDateRanges();
@@ -394,7 +407,6 @@ export class SdsDatePickerComponent {
394
407
  this.showPredefinedOptionsSelector = false;
395
408
  this.selectedDateRange = range;
396
409
  if (range === this.customDateRange) {
397
- console.log('open popup');
398
410
  this.openDatepickerPopup();
399
411
  }
400
412
  else {
@@ -483,7 +495,7 @@ export class SdsDatePickerComponent {
483
495
  !isSameDay(this.predefinedDateRangesGeneratedDate, today)) {
484
496
  this.predefinedDateRangesGeneratedDate = today;
485
497
  this.predefinedDateRanges =
486
- this.datePickerService.getPredefinedDateRanges(this.dateRangeDefinitions, today);
498
+ this.datePickerService.getPredefinedDateRanges(this.dateRangeDefinitions, today, this.firstDayOfWeek);
487
499
  this.dateRanges = [...this.predefinedDateRanges];
488
500
  this.dateRanges.push(this.customDateRange);
489
501
  }
@@ -495,10 +507,10 @@ export class SdsDatePickerComponent {
495
507
  }
496
508
  }
497
509
  SdsDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDatePickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SdsDatePickerService }], target: i0.ɵɵFactoryTarget.Component });
498
- SdsDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDatePickerComponent, selector: "sds-date-picker", inputs: { selectionKind: "selectionKind", dateRangeDefinitions: "dateRangeDefinitions", selectedDate: "selectedDate", selectedDateStart: "selectedDateStart", selectedDateEnd: "selectedDateEnd", minDate: "minDate", maxDate: "maxDate", locales: "locales", disabled: "disabled", validationError: "validationError", isValid: "isValid", fixedWidth: "fixedWidth", occupiedDays: "occupiedDays", applyText: "applyText", cancelText: "cancelText", translations: "translations" }, outputs: { selectedDateChange: "selectedDateChange", selectedDateStartChange: "selectedDateStartChange", selectedDateEndChange: "selectedDateEndChange", periodChange: "periodChange" }, host: { listeners: { "document:keyup": "onKeyupHandler($event)" } }, viewQueries: [{ propertyName: "singleDatePickerBox", first: true, predicate: ["singleDatePickerBox"], descendants: true }, { propertyName: "selectedDateStartBox", first: true, predicate: ["selectedDateStartBox"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"datepickerbuttons\">\r\n <div\r\n class=\"d-flex\"\r\n role=\"group\"\r\n aria-label=\"Date picker\"\r\n >\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end-0 border-color-muted\r\n dropdown-toggle\r\n preselect-options-fixed-width\r\n text-truncate\"\r\n [disabled]=\"disabled\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n {{selectedDateRange.name}}\r\n </button>\r\n\r\n <dx-popover\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n >\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <div *ngFor=\"let range of dateRanges\">\r\n <button\r\n class=\"dropdown-item\"\r\n [class.font-weight-500]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n > {{range.name}}\r\n </button>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-0 border-end-0 border-color-muted pe-2\"\r\n type=\"button\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border rounded-0 border-start-0 border-end-0 border-color-muted text-truncate px-0\"\r\n [class.w-100]=\"!!!fixedWidth\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker ? closeDatepickerPopup() : openDatepickerPopup()\"\r\n [style.width.px]=\"fixedWidth\"\r\n >\r\n <div\r\n *ngIf=\"true || this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-center align-items-center\"\r\n >\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-end border-start-0 border-color-muted ps-2\"\r\n type=\"button\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"closeDatepickerPopup()\"\r\n class=\"m-0 p-0\"\r\n >\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateStart\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateEnd\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n (onValueChanged)=\"closeDatepickerPopup()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"disabledDates\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n >\r\n {{ cellData.text }}\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center mt-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary btn-sm\"\r\n [disabled]=\"disabled\"\r\n (click)=\"closeDatepickerPopup()\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm mx-1\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n </dx-popover>\r\n</div>", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickerbuttons .rounded-start{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}#datepickerbuttons .rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}#datepickerbuttons .border-color-muted{border-color:#ccc!important}#datepickerbuttons .preselect-options-fixed-width{width:150px}\n"], components: [{ type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i3.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i4.DxoAnimationComponent, selector: "dxo-animation", inputs: ["hide", "show", "duration", "easing", "enabled", "maxPointCountSupported", "complete", "delay", "direction", "from", "staggerDelay", "start", "to", "type"] }, { type: i4.DxoShowComponent, selector: "dxo-show", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { type: i4.DxoHideComponent, selector: "dxo-hide", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { type: i2.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i2.DxCalendarComponent, selector: "dx-calendar", inputs: ["accessKey", "activeStateEnabled", "cellTemplate", "dateSerializationFormat", "disabled", "disabledDates", "elementAttr", "firstDayOfWeek", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isValid", "max", "maxZoomLevel", "min", "minZoomLevel", "name", "readOnly", "rtlEnabled", "showTodayButton", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width", "zoomLevel"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "cellTemplateChange", "dateSerializationFormatChange", "disabledChange", "disabledDatesChange", "elementAttrChange", "firstDayOfWeekChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isValidChange", "maxChange", "maxZoomLevelChange", "minChange", "minZoomLevelChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "showTodayButtonChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "zoomLevelChange", "onBlur"] }], directives: [{ type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
510
+ SdsDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: SdsDatePickerComponent, selector: "sds-date-picker", inputs: { selectionKind: "selectionKind", dateRangeDefinitions: "dateRangeDefinitions", selectedDate: "selectedDate", selectedDateStart: "selectedDateStart", selectedDateEnd: "selectedDateEnd", minDate: "minDate", maxDate: "maxDate", locales: "locales", disabled: "disabled", validationError: "validationError", isValid: "isValid", fixedWidth: "fixedWidth", occupiedDays: "occupiedDays", applyText: "applyText", cancelText: "cancelText", translations: "translations", firstDayOfWeek: "firstDayOfWeek", dateRangeDefinitionsWidth: "dateRangeDefinitionsWidth" }, outputs: { selectedDateChange: "selectedDateChange", selectedDateStartChange: "selectedDateStartChange", selectedDateEndChange: "selectedDateEndChange", periodChange: "periodChange" }, host: { listeners: { "document:keyup": "onKeyupHandler($event)" } }, viewQueries: [{ propertyName: "singleDatePickerBox", first: true, predicate: ["singleDatePickerBox"], descendants: true }, { propertyName: "selectedDateStartBox", first: true, predicate: ["selectedDateStartBox"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"datepickerbuttons\">\r\n <div\r\n class=\"d-flex\"\r\n role=\"group\"\r\n aria-label=\"Date picker\"\r\n >\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end-0 border-color-muted\r\n dropdown-toggle\r\n text-truncate\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n {{selectedDateRange.name}}\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n (onContentReady)=\"onContentReady($event)\" \r\n >\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n > \r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-0 border-end-0 border-color-muted pe-2\"\r\n [class.rounded-start] = \"!dateRangeDefinitions || dateRangeDefinitions.length === 0\"\r\n type=\"button\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border rounded-0 border-start-0 border-end-0 border-color-muted text-truncate px-0\"\r\n [class.w-100]=\"!!!fixedWidth\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker ? closeDatepickerPopup() : openDatepickerPopup()\"\r\n [style.width.px]=\"fixedWidth\"\r\n >\r\n <div\r\n *ngIf=\"true || this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-center align-items-center\"\r\n >\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-end border-start-0 border-color-muted ps-2\"\r\n type=\"button\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"closeDatepickerPopup()\"\r\n class=\"m-0 p-0\"\r\n >\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateStart\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateEnd\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n (onValueChanged)=\"closeDatepickerPopup()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"disabledDates\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n >\r\n {{ cellData.text }}\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center mt-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary btn-sm\"\r\n [disabled]=\"disabled\"\r\n (click)=\"closeDatepickerPopup()\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm mx-1\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n </dx-popover>\r\n</div>", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickerbuttons .rounded-start{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}#datepickerbuttons .rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}#datepickerbuttons .border-color-muted{border-color:#ccc!important}#datepickerbuttons .preselect-options-fixed-width{width:150px}.predefined-date-range{cursor:pointer;font-size:1rem;min-width:10rem}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected{background-color:#e6e6e6}\n"], components: [{ type: i2.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { type: i3.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i4.DxoAnimationComponent, selector: "dxo-animation", inputs: ["hide", "show", "duration", "easing", "enabled", "maxPointCountSupported", "complete", "delay", "direction", "from", "staggerDelay", "start", "to", "type"] }, { type: i4.DxoShowComponent, selector: "dxo-show", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { type: i4.DxoHideComponent, selector: "dxo-hide", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { type: i2.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { type: i2.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "todayButtonText", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "todayButtonTextChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { type: i2.DxCalendarComponent, selector: "dx-calendar", inputs: ["accessKey", "activeStateEnabled", "cellTemplate", "dateSerializationFormat", "disabled", "disabledDates", "elementAttr", "firstDayOfWeek", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isValid", "max", "maxZoomLevel", "min", "minZoomLevel", "name", "readOnly", "rtlEnabled", "showTodayButton", "showWeekNumbers", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "weekNumberRule", "width", "zoomLevel"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "cellTemplateChange", "dateSerializationFormatChange", "disabledChange", "disabledDatesChange", "elementAttrChange", "firstDayOfWeekChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isValidChange", "maxChange", "maxZoomLevelChange", "minChange", "minZoomLevelChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "showTodayButtonChange", "showWeekNumbersChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "weekNumberRuleChange", "widthChange", "zoomLevelChange", "onBlur"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
499
511
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: SdsDatePickerComponent, decorators: [{
500
512
  type: Component,
501
- args: [{ selector: 'sds-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"datepickerbuttons\">\r\n <div\r\n class=\"d-flex\"\r\n role=\"group\"\r\n aria-label=\"Date picker\"\r\n >\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end-0 border-color-muted\r\n dropdown-toggle\r\n preselect-options-fixed-width\r\n text-truncate\"\r\n [disabled]=\"disabled\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n {{selectedDateRange.name}}\r\n </button>\r\n\r\n <dx-popover\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n >\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <div *ngFor=\"let range of dateRanges\">\r\n <button\r\n class=\"dropdown-item\"\r\n [class.font-weight-500]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n > {{range.name}}\r\n </button>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-0 border-end-0 border-color-muted pe-2\"\r\n type=\"button\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border rounded-0 border-start-0 border-end-0 border-color-muted text-truncate px-0\"\r\n [class.w-100]=\"!!!fixedWidth\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker ? closeDatepickerPopup() : openDatepickerPopup()\"\r\n [style.width.px]=\"fixedWidth\"\r\n >\r\n <div\r\n *ngIf=\"true || this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-center align-items-center\"\r\n >\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-end border-start-0 border-color-muted ps-2\"\r\n type=\"button\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"closeDatepickerPopup()\"\r\n class=\"m-0 p-0\"\r\n >\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateStart\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateEnd\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n (onValueChanged)=\"closeDatepickerPopup()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"disabledDates\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n >\r\n {{ cellData.text }}\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center mt-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary btn-sm\"\r\n [disabled]=\"disabled\"\r\n (click)=\"closeDatepickerPopup()\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm mx-1\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n </dx-popover>\r\n</div>", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickerbuttons .rounded-start{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}#datepickerbuttons .rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}#datepickerbuttons .border-color-muted{border-color:#ccc!important}#datepickerbuttons .preselect-options-fixed-width{width:150px}\n"] }]
513
+ args: [{ selector: 'sds-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"datepickerbuttons\">\r\n <div\r\n class=\"d-flex\"\r\n role=\"group\"\r\n aria-label=\"Date picker\"\r\n >\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end-0 border-color-muted\r\n dropdown-toggle\r\n text-truncate\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n {{selectedDateRange.name}}\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n (onContentReady)=\"onContentReady($event)\" \r\n >\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n > \r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-0 border-end-0 border-color-muted pe-2\"\r\n [class.rounded-start] = \"!dateRangeDefinitions || dateRangeDefinitions.length === 0\"\r\n type=\"button\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border rounded-0 border-start-0 border-end-0 border-color-muted text-truncate px-0\"\r\n [class.w-100]=\"!!!fixedWidth\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker ? closeDatepickerPopup() : openDatepickerPopup()\"\r\n [style.width.px]=\"fixedWidth\"\r\n >\r\n <div\r\n *ngIf=\"true || this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-center align-items-center\"\r\n >\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n class=\"btn btn-white border rounded-end border-start-0 border-color-muted ps-2\"\r\n type=\"button\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"closeDatepickerPopup()\"\r\n class=\"m-0 p-0\"\r\n >\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\">\r\n <dx-scroll-view>\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateStart\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateEnd\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2 mb-3\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded-pill datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n displayFormat=\"shortdate\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n (onValueChanged)=\"closeDatepickerPopup()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"disabledDates\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n >\r\n {{ cellData.text }}\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center mt-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary btn-sm\"\r\n [disabled]=\"disabled\"\r\n (click)=\"closeDatepickerPopup()\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm mx-1\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n </dx-popover>\r\n</div>", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickerbuttons .rounded-start{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}#datepickerbuttons .rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}#datepickerbuttons .border-color-muted{border-color:#ccc!important}#datepickerbuttons .preselect-options-fixed-width{width:150px}.predefined-date-range{cursor:pointer;font-size:1rem;min-width:10rem}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected{background-color:#e6e6e6}\n"] }]
502
514
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SdsDatePickerService }]; }, propDecorators: { selectionKind: [{
503
515
  type: Input
504
516
  }], dateRangeDefinitions: [{
@@ -539,6 +551,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImpor
539
551
  type: Input
540
552
  }], translations: [{
541
553
  type: Input
554
+ }], firstDayOfWeek: [{
555
+ type: Input
556
+ }], dateRangeDefinitionsWidth: [{
557
+ type: Input
542
558
  }], singleDatePickerBox: [{
543
559
  type: ViewChild,
544
560
  args: ['singleDatePickerBox', { static: false }]
@@ -552,4 +568,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImpor
552
568
  type: HostListener,
553
569
  args: ['document:keyup', ['$event']]
554
570
  }] } });
555
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsT0FBTyxFQUNQLFFBQVEsRUFDUixHQUFHLEdBQ04sTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUNILFdBQVcsRUFDWCxZQUFZLEVBQ1osVUFBVSxHQUNiLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWhFLE9BQU8sRUFDSCxxQkFBcUIsR0FHeEIsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7QUFTN0IsTUFBTSxPQUFPLHNCQUFzQjtJQTZFL0IsaUJBQWlCO0lBQ2pCLFlBQ1ksU0FBNEIsRUFDNUIsaUJBQXVDO1FBRHZDLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUEvRW5ELG1CQUFtQjtRQUNWLGtCQUFhLEdBQXdCLFFBQVEsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBMkMsRUFBRSxDQUFDO1FBRTNFLHVCQUF1QjtRQUNkLGlCQUFZLEdBQVMsSUFBSSxJ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QkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxZQUFZO3NCQUEzQixLQUFLO2dCQXlDRSxtQkFBbUI7c0JBRDFCLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUczQyxvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVGLFFBQVE7c0JBQXpELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkF1bkJJLGNBQWM7c0JBQXpELFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRHhDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9jYWxlbmRhcic7XHJcbmltcG9ydCB7IER4RGF0ZUJveENvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9kYXRlLWJveCc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgaXNTYW1lRGF5LFxyXG4gICAgaXNTYW1lWWVhcixcclxuICAgIGlzU2FtZU1vbnRoLFxyXG4gICAgc3RhcnRPZkRheSxcclxuICAgIHN0YXJ0T2ZNb250aCxcclxuICAgIGVuZE9mTW9udGgsXHJcbiAgICBpc0FmdGVyLFxyXG4gICAgaXNCZWZvcmUsXHJcbiAgICBhZGQsXHJcbn0gZnJvbSAnZGF0ZS1mbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGZhQW5nbGVMZWZ0LFxyXG4gICAgZmFBbmdsZVJpZ2h0LFxyXG4gICAgZmFDYWxlbmRhcixcclxufSBmcm9tICdAZm9ydGF3ZXNvbWUvcHJvLXJlZ3VsYXItc3ZnLWljb25zJztcclxuXHJcbmltcG9ydCB7IGZhQXJyb3dSaWdodCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tbGlnaHQtc3ZnLWljb25zJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UsXHJcbiAgICBQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uLFxyXG4gICAgUGVyaW9kUGlja2VyVHJhbnNsYXRpb25zLFxyXG59IGZyb20gJy4vZGF0ZS1waWNrZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBTZHNEYXRlUGlja2VyU2VydmljZSB9IGZyb20gJy4vc2RzLWRhdGUtcGlja2VyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3Nkcy1kYXRlLXBpY2tlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2RzRGF0ZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgIC8vIHB1YmxpYyBpbnRlcmZhY2VcclxuICAgIEBJbnB1dCgpIHNlbGVjdGlvbktpbmQ6ICdwZXJpb2QnIHwgJ3NpbmdsZScgPSAncGVyaW9kJztcclxuICAgIEBJbnB1dCgpIGRhdGVSYW5nZURlZmluaXRpb25zOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uPiA9IFtdO1xyXG5cclxuICAgIC8vIHNpbmdsZSBkYXRlIHNlbGVjdG9yXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgLy8gcGVyaW9kIHNlbGVjdG9yXHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGVTdGFydDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZERhdGVTdGFydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZUVuZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZERhdGVFbmRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcGVyaW9kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBJbnB1dCgpIG1pbkRhdGU/OiBEYXRlO1xyXG4gICAgQElucHV0KCkgbWF4RGF0ZT86IERhdGU7XHJcblxyXG4gICAgQElucHV0KCkgbG9jYWxlcz86IHN0cmluZyB8IEFycmF5PHN0cmluZz47XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGlvbkVycm9yOiBzdHJpbmcgPSAnJztcclxuICAgIEBJbnB1dCgpIGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgZml4ZWRXaWR0aDogbnVtYmVyID0gMjgwO1xyXG4gICAgQElucHV0KCkgb2NjdXBpZWREYXlzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBhcHBseVRleHQ/OiBzdHJpbmcgPSAnY2xvc2UnO1xyXG4gICAgQElucHV0KCkgcHVibGljIGNhbmNlbFRleHQ/OiBzdHJpbmcgPSAnY2xvc2UnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cmFuc2xhdGlvbnM6IFBlcmlvZFBpY2tlclRyYW5zbGF0aW9ucztcclxuXHJcbiAgICAvLyBwdWJsaWMgcHJvcGVydGllc1xyXG4gICAgcHJldmlvdXNQZXJpb2RJY29uID0gZmFBbmdsZUxlZnQ7XHJcbiAgICBuZXh0UGVyaW9kSWNvbiA9IGZhQW5nbGVSaWdodDtcclxuICAgIGNhbGVuZGFySWNvbiA9IGZhQ2FsZW5kYXI7XHJcbiAgICB0b0ljb24gPSBmYUFycm93UmlnaHQ7XHJcblxyXG4gICAgcHJlZGVmaW5lZERhdGVSYW5nZXM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZT4gPSBbXTtcclxuICAgIHByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIHNlbGVjdGVkRGF0ZVJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2U7XHJcbiAgICBkYXRlUmFuZ2VzOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2U+ID0gW107XHJcblxyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDE6IHN0cmluZyA9ICcnO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIG1pbkRhdGVEZWZhdWx0OiBEYXRlO1xyXG4gICAgbWF4RGF0ZURlZmF1bHQ6IERhdGU7XHJcblxyXG4gICAgc2VsZWN0ZWREYXRlQ2FsZW5kYXI6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgc2VsZWN0ZWREYXRlSW50ZXJuYWw6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGRhdGVTdGFydE9sZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9ICcnO1xyXG4gICAgZGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kT2xkOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcblxyXG4gICAgc2hvd0RhdGVwaWNrZXI6IGJvb2xlYW47XHJcbiAgICBzaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGhpZGluZ0NvbmZpcm1lZERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc2VsZWN0ZWREYXRlRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8vIHByaXZhdGUgZmllbGRzXHJcbiAgICBwcml2YXRlIGN1c3RvbURhdGVSYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlO1xyXG4gICAgcHJpdmF0ZSBpbml0Q2FsZW5kYXJWYWx1ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2luZ2xlRGF0ZVBpY2tlckJveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gICAgcHJpdmF0ZSBzaW5nbGVEYXRlUGlja2VyQm94OiBEeERhdGVCb3hDb21wb25lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVTdGFydEJveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gICAgcHJpdmF0ZSBzZWxlY3RlZERhdGVTdGFydEJveDogRHhEYXRlQm94Q29tcG9uZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgQFZpZXdDaGlsZCgnY2FsZW5kYXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBjYWxlbmRhcjpcclxuICAgICAgICB8IER4Q2FsZW5kYXJDb21wb25lbnRcclxuICAgICAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgZGF0ZVBpY2tlclNlcnZpY2U6IFNkc0RhdGVQaWNrZXJTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLm1pbkRhdGVEZWZhdWx0ID0gbmV3IERhdGUoMTkwMCwgMSwgMSk7XHJcbiAgICAgICAgdGhpcy5tYXhEYXRlRGVmYXVsdCA9IGFkZChzdGFydE9mRGF5KG5ldyBEYXRlKCkpLCB7IHllYXJzOiA1MCB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucyA9IHtcclxuICAgICAgICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgYXBwbHk6ICdBcHBseScsXHJcbiAgICAgICAgICAgIGN1c3RvbTogJ0N1c3RvbScsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRlUmFuZ2UgPSBuZXcgUGVyaW9kUGlja2VyRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucy5jdXN0b20sXHJcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdW5kZWZpbmVkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG5cclxuICAgICAgICBjb25zdCBzaW5nbGVEYXRlU2VsZWN0b3JEZWZhdWx0RGF0ZSA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoKSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNpbmdsZURhdGVTZWxlY3RvckRlZmF1bHREYXRlO1xyXG5cclxuICAgICAgICBjb25zdCBwZXJpb2RTZWxlY3RvckRlZmF1bHRTdGFydERhdGUgPSBzdGFydE9mTW9udGgobmV3IERhdGUoKSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IHBlcmlvZFNlbGVjdG9yRGVmYXVsdFN0YXJ0RGF0ZTtcclxuICAgICAgICBjb25zdCBwZXJpb2RTZWxlY3RvckRlZmF1bHRFbmREYXRlID0gc3RhcnRPZkRheShlbmRPZk1vbnRoKG5ldyBEYXRlKCkpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCA9IHBlcmlvZFNlbGVjdG9yRGVmYXVsdEVuZERhdGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICAgICAgc2luZ2xlRGF0ZVNlbGVjdG9yRGVmYXVsdERhdGUsXHJcbiAgICAgICAgICAgICAgICBzaW5nbGVEYXRlU2VsZWN0b3JEZWZhdWx0RGF0ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICAgICAgc2luZ2xlRGF0ZVNlbGVjdG9yRGVmYXVsdERhdGUsXHJcbiAgICAgICAgICAgICAgICBzaW5nbGVEYXRlU2VsZWN0b3JEZWZhdWx0RGF0ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dChcclxuICAgICAgICAgICAgICAgIHBlcmlvZFNlbGVjdG9yRGVmYXVsdFN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICAgIHBlcmlvZFNlbGVjdG9yRGVmYXVsdEVuZERhdGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShcclxuICAgICAgICAgICAgICAgIHBlcmlvZFNlbGVjdG9yRGVmYXVsdFN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICAgIHBlcmlvZFNlbGVjdG9yRGVmYXVsdEVuZERhdGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZGF0ZVJhbmdlVHJhbnNsYXRpb25zID0gbmV3IERhdGVSYW5nZVRyYW5zbGF0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge31cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2RhdGVSYW5nZURlZmluaXRpb25zJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZURhdGVSYW5nZXModHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1sndHJhbnNsYXRpb25zJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXN0b21EYXRlUmFuZ2UubmFtZSA9IHRoaXMudHJhbnNsYXRpb25zPy5jdXN0b21cclxuICAgICAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGlvbnMuY3VzdG9tXHJcbiAgICAgICAgICAgICAgICA6ICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10gfHwgY2hhbmdlc1snc2VsZWN0ZWREYXRlRW5kJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0O1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFbmRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZUVuZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWREYXRlIGNoYW5nZWQnKTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZERhdGUnXS5jdXJyZW50VmFsdWUgYXMgRGF0ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzdGFydE9mRGF5KHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWw7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGVTdGFydCddKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlU3RhcnQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgJiYgdGhpcy5zaG93RGF0ZXBpY2tlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVTdGFydEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1NhbWVEYXkoc2VsZWN0ZWRWYWx1ZSwgdGhpcy5kYXRlRW5kKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIoc2VsZWN0ZWRWYWx1ZSwgdGhpcy5kYXRlRW5kKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsZW5kYXI/Lmluc3RhbmNlPy5yZXBhaW50KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGVFbmQnXSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1NhbWVEYXkoc2VsZWN0ZWRWYWx1ZSwgdGhpcy5kYXRlU3RhcnQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcih0aGlzLmRhdGVTdGFydCwgc2VsZWN0ZWRWYWx1ZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHhEZWZhdWx0Q2FsZW5kYXJGb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJhbmRvbUlkUmVmZXJlbmNlOiBudW1iZXIgPSBNYXRoLmZsb29yKFxyXG4gICAgICAgIE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxyXG4gICAgKTtcclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZWREYXRlczogRnVuY3Rpb24gPSAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgZGF0YS52aWV3ID09PSAnbW9udGgnICYmXHJcbiAgICAgICAgICAgIHRoaXMub2NjdXBpZWREYXlzLnNvbWUoKGRhdGUpID0+IGlzU2FtZURheShkYXRlLCBkYXRhLmRhdGUpKVxyXG4gICAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWREYXRlU3RhcnRGb2N1cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVGb2N1cztcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWREYXRlRW5kRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNNaW5pbXVtTGltaXQoKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm1pbkRhdGUgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5taW5EYXRlKSB8fFxyXG4gICAgICAgICAgICAgICAgaXNCZWZvcmUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5taW5EYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc01heGltdW1MaW1pdCgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMubWF4RGF0ZSBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1heERhdGUpIHx8XHJcbiAgICAgICAgICAgICAgICBpc0FmdGVyKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWF4RGF0ZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZERhdGVGcm9tRXZlbnQgPSBuZXcgRGF0ZShldmVudC52YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IHNlbGVjdGVkRGF0ZUZyb21FdmVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5pdENhbGVuZGFyVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIoc2VsZWN0ZWREYXRlRnJvbUV2ZW50LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBhcyBEYXRlKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQmVmb3JlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGVGcm9tRXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgYXMgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVEYXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0ZUZyb21FdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgYXMgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVEYXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0ZUZyb21FdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBhcyBEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gc2VsZWN0ZWREYXRlRnJvbUV2ZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN0YXJ0RGF0ZUZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdENhbGVuZGFyVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVTdGFydCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDYWxlbmRhclZhbHVlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRW5kRGF0ZUZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseVBlcmlvZFBpY2tlcigpIHtcclxuICAgICAgICB0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVuRGF0ZXBpY2tlclBvcHVwKCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVEYXRlUGlja2VyQm94Py5pbnN0YW5jZS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRCb3g/Lmluc3RhbmNlLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU3RhcnREYXRlRm9jdXMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZURhdGVwaWNrZXJQb3B1cCgpIHtcclxuICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oaWRpbmdDb25maXJtZWREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZSh0aGlzLmRhdGVTdGFydE9sZCwgdGhpcy5kYXRlRW5kT2xkLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICBkYXRlU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUsXHJcbiAgICAgICAgZGF0ZUVuZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSxcclxuICAgICAgICBlbWl0Q2hhbmdlID0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IGRhdGVTdGFydDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCA9IGRhdGVFbmQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IGRhdGVTdGFydDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dCh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZW1pdENoYW5nZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0YXJ0TmV3ID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlRW5kTmV3ID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZUNoYW5nZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkIGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICFpc1NhbWVEYXkodGhpcy5kYXRlU3RhcnRPbGQsIGRhdGVTdGFydE5ldyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kT2xkIGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICFpc1NhbWVEYXkodGhpcy5kYXRlRW5kT2xkLCBkYXRlRW5kTmV3KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCB8fCBlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQ2hhbmdlLmVtaXQoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoYW5nZVJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdvVG9OZXh0RGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TmV4dFByZXZpb3VzRGF5KHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TmV4dFByZXZpb3VzUmFuZ2UodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnb1RvUHJldmlvdXNEYXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXROZXh0UHJldmlvdXNEYXkoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TmV4dFByZXZpb3VzUmFuZ2UoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0TmV4dFByZXZpb3VzRGF5KHNldE5leHQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIGxldCBuZXdEYXRlID0gc2V0TmV4dFxyXG4gICAgICAgICAgICA/IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogMSB9KVxyXG4gICAgICAgICAgICA6IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZShuZXdEYXRlKTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShuZXdEYXRlLCBuZXdEYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0TmV4dFByZXZpb3VzUmFuZ2Uoc2V0TmV4dDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgISh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSkgfHxcclxuICAgICAgICAgICAgISh0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRSYW5nZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIHNldE5leHQgPyAnbmV4dCcgOiAncHJldmlvdXMnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDZWxsQ3NzQ2xhc3MoZGF0ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXRlID0gZGF0ZSBhcyBEYXRlO1xyXG4gICAgICAgIGxldCBjc3MgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBpc0FmdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF5KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgYXMgRGF0ZSlcclxuICAgICAgICAgICAgICAgICkgJiZcclxuICAgICAgICAgICAgICAgIGlzQmVmb3JlKFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF5KHRoaXMuc2VsZWN0ZWREYXRlRW5kIGFzIERhdGUpXHJcbiAgICAgICAgICAgICAgICApICYmXHJcbiAgICAgICAgICAgICAgICAhdGhpcy5vY2N1cGllZERheXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBkYXkpKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNzcyArPSAnIGJnLXNlY29uZGFyeSB0ZXh0LWRhcmsgcm91bmRlZC0wJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGFzIERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3NzICs9ICcgYmctcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGVmdCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYW1lRGF5KGNhbGVuZGFyRGF0ZSwgdGhpcy5zZWxlY3RlZERhdGVFbmQgYXMgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjc3MgKz0gJyBiZy1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1yaWdodCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNzcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICcjZGF0ZXBpY2tlcmNvbXBvbmVudCAuZHgtY2FsZW5kYXItc2VsZWN0ZWQtZGF0ZSdcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbWVudCAmJlxyXG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdkeC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0Py5yZW1vdmUoJ2R4LWNhbGVuZGFyLXNlbGVjdGVkLWRhdGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9XHJcbiAgICAgICAgICAgICF0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nRGF0ZVJhbmdlKHJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UpIHtcclxuICAgICAgICB0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHJhbmdlO1xyXG5cclxuICAgICAgICBpZiAocmFuZ2UgPT09IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvcGVuIHBvcHVwJyk7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbkRhdGVwaWNrZXJQb3B1cCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgID8gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gcmFuZ2UuZGF0ZVRvID8gcmFuZ2UuZGF0ZVRvIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnQsIHRoaXMuZGF0ZUVuZCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1hdGNoRGF0ZVJhbmdlKGRhdGVGcm9tPzogRGF0ZSwgZGF0ZVRvPzogRGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZGF0ZUZyb20gfHwgIWRhdGVUbykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gdGhpcy5jdXN0b21EYXRlUmFuZ2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZSA9IHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh4LmRhdGVGcm9tIGFzIERhdGUsIGRhdGVGcm9tKSAmJlxyXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KHguZGF0ZVRvIGFzIERhdGUsIGRhdGVUbylcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChkYXRlUmFuZ2UubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSBkYXRlUmFuZ2VbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldERhdGVSYW5nZVRleHQoZGF0ZUZyb20/OiBEYXRlLCBkYXRlVG8/OiBEYXRlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcblxyXG4gICAgICAgIGlmICghKGRhdGVGcm9tIGluc3RhbmNlb2YgRGF0ZSkgfHwgIShkYXRlVG8gaW5zdGFuY2VvZiBEYXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmdWxsIG1vbnRoXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZUZyb20sIHN0YXJ0T2ZNb250aChkYXRlRnJvbSkpICYmXHJcbiAgICAgICAgICAgIGlzU2FtZURheShkYXRlVG8sIGVuZE9mTW9udGgoZGF0ZVRvKSkgJiZcclxuICAgICAgICAgICAgaXNTYW1lTW9udGgoZGF0ZUZyb20sIGRhdGVUbylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxyXG4gICAgICAgICAgICAgICAgJ21vbnRoJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyBvbmUgZGF5XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc1NhbWVEYXkoZGF0ZUZyb20sIGRhdGVUbykpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxyXG4gICAgICAgICAgICAgICAgJ2RheS1sb25nJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoXHJcbiAgICAgICAgICAgICAgICBkYXRlRnJvbSxcclxuICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZUZyb20sIHRvZGF5KSA/ICdkYXktc2hvcnQnIDogJ2RheSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MiA9IHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgICAgICAgICAgIGRhdGVUbyxcclxuICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZVRvLCB0b2RheSkgPyAnZGF5LXNob3J0JyA6ICdkYXknXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvcm1hdERhdGUoXHJcbiAgICAgICAgZGF0ZTogRGF0ZSxcclxuICAgICAgICB0eXBlPzogJ21vbnRoJyB8ICdkYXknIHwgJ2RheS1sb25nJyB8ICdkYXktc2hvcnQnIHwgdW5kZWZpbmVkXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FzZSAnZGF5LWxvbmcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYXNlICdkYXktc2hvcnQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVEYXRlUmFuZ2VzKGZvcmNlPzogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBmb3JjZSB8fFxyXG4gICAgICAgICAgICAhdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGUgfHxcclxuICAgICAgICAgICAgIWlzU2FtZURheSh0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSwgdG9kYXkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlID0gdG9kYXk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzID1cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0UHJlZGVmaW5lZERhdGVSYW5nZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VEZWZpbml0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICB0b2RheVxyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlcyA9IFsuLi50aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzXTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VzLnB1c2godGhpcy5jdXN0b21EYXRlUmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pIG9uS2V5dXBIYW5kbGVyKFxyXG4gICAgICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50XHJcbiAgICApIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZURhdGVwaWNrZXJQb3B1cCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIG1ldGhvZHNcclxufVxyXG4iLCI8ZGl2IGlkPVwiZGF0ZXBpY2tlcmJ1dHRvbnNcIj5cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImQtZmxleFwiXHJcbiAgICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiRGF0ZSBwaWNrZXJcIlxyXG4gICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4tZ3JvdXBcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgaWQ9XCJwaWNrZXJQcmVkZWZpbmVkUmFuZ2VEcm9wZG93bnt7IHJhbmRvbUlkUmVmZXJlbmNlIH19XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgYnRuIGJ0bi13aGl0ZVxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclxyXG4gICAgICAgICAgICAgICAgICAgIHJvdW5kZWQtc3RhcnRcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXItZW5kLTAgYm9yZGVyLWNvbG9yLW11dGVkXHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24tdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VsZWN0LW9wdGlvbnMtZml4ZWQtd2lkdGhcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0LXRydW5jYXRlXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7e3NlbGVjdGVkRGF0ZVJhbmdlLm5hbWV9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDxkeC1wb3BvdmVyXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCIjcGlja2VyUHJlZGVmaW5lZFJhbmdlRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICBbKHZpc2libGUpXT1cInNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJhbmdlIG9mIGRhdGVSYW5nZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mb250LXdlaWdodC01MDBdPVwicmFuZ2UgPT09IHNlbGVjdGVkRGF0ZVJhbmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ0RhdGVSYW5nZShyYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+IHt7cmFuZ2UubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZHgtcG9wb3Zlcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgYm9yZGVyIHJvdW5kZWQtMCBib3JkZXItZW5kLTAgYm9yZGVyLWNvbG9yLW11dGVkIHBlLTJcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWluaW11bUxpbWl0IHx8IGRpc2FibGVkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9QcmV2aW91c0RhdGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJwcmV2aW91c1BlcmlvZEljb25cIj48L2ZhLWljb24+XHJcblxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGlkPVwicGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXIgcm91bmRlZC0wIGJvcmRlci1zdGFydC0wIGJvcmRlci1lbmQtMCBib3JkZXItY29sb3ItbXV0ZWQgdGV4dC10cnVuY2F0ZSBweC0wXCJcclxuICAgICAgICAgICAgW2NsYXNzLnctMTAwXT1cIiEhIWZpeGVkV2lkdGhcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEYXRlcGlja2VyID8gY2xvc2VEYXRlcGlja2VyUG9wdXAoKSA6IG9wZW5EYXRlcGlja2VyUG9wdXAoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJmaXhlZFdpZHRoXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwidHJ1ZSB8fCB0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCdcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJteC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiY2FsZW5kYXJJY29uXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTEgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDF9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwidG9JY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJ9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgYm9yZGVyIHJvdW5kZWQtZW5kIGJvcmRlci1zdGFydC0wIGJvcmRlci1jb2xvci1tdXRlZCBwcy0yXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01heGltdW1MaW1pdCB8fCBkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV4dERhdGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJuZXh0UGVyaW9kSWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkeC1wb3BvdmVyXHJcbiAgICAgICAgdGFyZ2V0PVwiI3BpY2tlckRyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxyXG4gICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICBbKHZpc2libGUpXT1cInNob3dEYXRlcGlja2VyXCJcclxuICAgICAgICAob25IaWRpbmcpPVwiY2xvc2VEYXRlcGlja2VyUG9wdXAoKVwiXHJcbiAgICAgICAgY2xhc3M9XCJtLTAgcC0wXCJcclxuICAgID5cclxuICAgICAgICA8ZHhvLWFuaW1hdGlvbj5cclxuICAgICAgICAgICAgPGR4by1zaG93XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwicG9wXCJcclxuICAgICAgICAgICAgICAgIFtmcm9tXT1cInsgc2NhbGU6IDAuOSB9XCJcclxuICAgICAgICAgICAgICAgIFt0b109XCJ7IHNjYWxlOiAxIH1cIlxyXG4gICAgICAgICAgICA+PC9keG8tc2hvdz5cclxuICAgICAgICAgICAgPGR4by1oaWRlXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiZmFkZVwiXHJcbiAgICAgICAgICAgICAgICBbZnJvbV09XCIxXCJcclxuICAgICAgICAgICAgICAgIFt0b109XCIwXCJcclxuICAgICAgICAgICAgPjwvZHhvLWhpZGU+XHJcbiAgICAgICAgPC9keG8tYW5pbWF0aW9uPlxyXG4gICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cclxuICAgICAgICAgICAgPGR4LXNjcm9sbC12aWV3PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImRhdGVwaWNrZXJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkYXRlLWlucHV0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBwLTIgbWItM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWREYXRlU3RhcnRCb3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBwLTEgbS0wIHRleHQtY2VudGVyIHJvdW5kZWQtcGlsbCBkYXRlcGlja2VyLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwic2VsZWN0ZWREYXRlRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VNYXNrQmVoYXZpb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cInNob3J0ZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWxlY3RlZERhdGVTdGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNJbik9XCJvblN0YXJ0RGF0ZUZvY3VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHB4LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInRvSWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWREYXRlRW5kQm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcC0xIG0tMCB0ZXh0LWNlbnRlciByb3VuZGVkLXBpbGwgZGF0ZXBpY2tlci1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cIiFzZWxlY3RlZERhdGVGb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEcm9wRG93bkJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwic2hvcnRkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1ZhbGlkXT1cImlzVmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInNlbGVjdGVkRGF0ZUVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNJbik9XCJvbkVuZERhdGVGb2N1cygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkYXRlLWlucHV0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBwLTIgbWItM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2luZ2xlRGF0ZVBpY2tlckJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZC1waWxsIGRhdGVwaWNrZXItaW5wdXQgZGF0ZXBpY2tlci1pbnB1dC1sYXJnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VNYXNrQmVoYXZpb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cInNob3J0ZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWxlY3RlZERhdGVJbnRlcm5hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImNsb3NlRGF0ZXBpY2tlclBvcHVwKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY2FsZW5kYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZXNdPVwiZGlzYWJsZWREYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcgPyBzZWxlY3RlZERhdGVDYWxlbmRhciA6IHNlbGVjdGVkRGF0ZUludGVybmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkRhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHhUZW1wbGF0ZT1cImxldCBjZWxsRGF0YSBvZiAnY2VsbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInaC0xMDAgcHQtMScgKyBnZXRDZWxsQ3NzQ2xhc3MoY2VsbERhdGEuZGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNlbGxEYXRhLnRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlRGF0ZXBpY2tlclBvcHVwKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRyYW5zbGF0aW9ucy5jYW5jZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIG14LTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVBlcmlvZFBpY2tlcigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0cmFuc2xhdGlvbnMuYXBwbHl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9keC1wb3BvdmVyPlxyXG48L2Rpdj4iXX0=
571
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsT0FBTyxFQUNQLFFBQVEsRUFDUixHQUFHLEdBQ04sTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUNILFdBQVcsRUFDWCxZQUFZLEVBQ1osVUFBVSxHQUNiLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWhFLE9BQU8sRUFDSCxxQkFBcUIsR0FHeEIsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7QUFTN0IsTUFBTSxPQUFPLHNCQUFzQjtJQW9GL0IsaUJBQWlCO0lBQ2pCLFlBQ1ksU0FBNEIsRUFDNUIsaUJBQXVDO1FBRHZDLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUF0Rm5ELG1CQUFtQjtRQUNWLGtCQUFhLEdBQXdCLFFBQVEsQ0FBQztRQUU5Qyx5QkFBb0IsR0FBMkMsRUFBRSxDQUFDO1FBRTNFLHVCQUF1QjtRQUNkLGlCQUFZLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4Qix1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSS9DLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHN0MsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFNbkMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUM3QixZQUFPLEdBQVksSUFBSSxDQUFDO1FBQ3hCLGVBQVUsR0FBVyxHQUFHLENBQUM7UUFDekIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFFbEIsY0FBUyxHQUFZLE9BQU8sQ0FBQztRQUM3QixlQUFVLEdBQVksT0FBTyxDQUFDO1FBSTlCLG1CQUFjLEdBQThCLENBQUMsQ0FBQztRQUU5Qyw4QkFBeUIsR0FBVyxPQUFPLENBQUM7UUFHNUQsb0JBQW9CO1FBQ3BCLHVCQUFrQixHQUFHLFdBQVcsQ0FBQztRQUNqQyxtQkFBYyxHQUFHLFlBQVksQ0FBQztRQUM5QixpQkFBWSxHQUFHLFVBQVUsQ0FBQztRQUMxQixXQUFNLEdBQUcsWUFBWSxDQUFDO1FBRXRCLHlCQUFvQixHQUFpQyxFQUFFLENBQUM7UUFDeEQsc0NBQWlDLEdBQXFCLFNBQVMsQ0FBQztRQUVoRSxlQUFVLEdBQWlDLEVBQUUsQ0FBQztRQUU5QyxrQ0FBNkIsR0FBVyxFQUFFLENBQUM7UUFDM0Msa0NBQTZCLEdBQVcsRUFBRSxDQUFDO1FBSzNDLHlCQUFvQixHQUEyQixJQUFJLElBQUksRUFBRSxDQUFDO1FBQzFELHlCQUFvQixHQUEyQixJQUFJLElBQUksRUFBRSxDQUFDO1FBRTFELGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUMxQyxjQUFTLEdBQTJCLEVBQUUsQ0FBQztRQUN2QyxlQUFVLEdBQTJCLEVBQUUsQ0FBQztRQUN4QyxZQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUdyQyxrQ0FBNkIsR0FBWSxLQUFLLENBQUM7UUFFL0Msd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRXJDLGlDQUE0QixHQUFZLEtBQUssQ0FBQztRQUM5QywrQkFBMEIsR0FBWSxLQUFLLENBQUM7UUFDNUMsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBSTFCLHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUdsQyx3QkFBbUIsR0FBbUMsU0FBUyxDQUFDO1FBRWhFLHlCQUFvQixHQUFtQyxTQUFTLENBQUM7UUFDdkIsYUFBUSxHQUV4QyxTQUFTLENBQUM7UUE2THJCLHNCQUFpQixHQUFXLElBQUksQ0FBQyxLQUFLLENBQ3pDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQzFDLENBQUM7UUFFSyxrQkFBYSxHQUFhLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDM0MsT0FBTyxDQUNILElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQy9ELENBQUM7UUFDTixDQUFDLENBQUM7UUEvTEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDaEIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsUUFBUTtTQUNuQixDQUFDO1FBRUYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHFCQUFxQixDQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFDeEIsU0FBUyxFQUNULFNBQVMsQ0FDWixDQUFDO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFFOUMsTUFBTSw2QkFBNkIsR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyw2QkFBNkIsQ0FBQztRQUUxRCxNQUFNLDhCQUE4QixHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLDhCQUE4QixDQUFDO1FBQ3hELE1BQU0sNEJBQTRCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsZUFBZSxHQUFHLDRCQUE0QixDQUFDO1FBRXBELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUNqQiw2QkFBNkIsRUFDN0IsNkJBQTZCLENBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsY0FBYyxDQUNmLDZCQUE2QixFQUM3Qiw2QkFBNkIsQ0FDaEMsQ0FBQztTQUNMO2FBQU07WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQ2pCLDhCQUE4QixFQUM5Qiw0QkFBNEIsQ0FDL0IsQ0FBQztZQUNGLElBQUksQ0FBQyxjQUFjLENBQ2YsOEJBQThCLEVBQzlCLDRCQUE0QixDQUMvQixDQUFDO1NBQ0w7UUFFRCw0REFBNEQ7SUFDaEUsQ0FBQztJQUVELFFBQVEsS0FBSSxDQUFDO0lBRWIsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLElBQUksT0FBTyxDQUFDLHNCQUFzQixDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNO2dCQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO2dCQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ1o7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztTQUMxQztRQUVELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFvQixDQUFDO1lBRTNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2dCQUV6QyxJQUFJLENBQUMsZ0JBQWdCLENBQ2pCLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUM1QixDQUFDO2dCQUNGLElBQUksQ0FBQyxjQUFjLENBQ2YsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQzVCLENBQUM7YUFDTDtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDbEM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQzlCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUN4RCxNQUFNLGFBQWEsR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakUsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtnQkFDaEMsSUFBSSxJQUFJLENBQUMsNEJBQTRCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDMUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7b0JBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUM7b0JBQzFDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7aUJBQzdDO3FCQUFNLElBQ0gsQ0FBQyxJQUFJLENBQUMsMEJBQTBCO29CQUNoQyxJQUFJLENBQUMsY0FBYyxFQUNyQjtvQkFDRSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTt3QkFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7d0JBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUM7d0JBQzFDLElBQ0ksSUFBSSxDQUFDLE9BQU8sWUFBWSxJQUFJOzRCQUM1QixDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQ0FDbkMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDM0M7NEJBQ0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUM7eUJBQ2hDO3FCQUNKO2lCQUNKO3FCQUFNO29CQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO29CQUMvQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2lCQUNsQztnQkFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQ3BDLElBQ0ksSUFBSSxDQUFDLGlCQUFpQixZQUFZLElBQUk7b0JBQ3RDLElBQUksQ0FBQyxlQUFlLFlBQVksSUFBSSxFQUN0QztvQkFDRSxJQUFJLENBQUMsZ0JBQWdCLENBQ2pCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FDdkIsQ0FBQztvQkFDRixJQUFJLENBQUMsY0FBYyxDQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FDdkIsQ0FBQztpQkFDTDthQUNKO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUNsQztRQUVELElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDNUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ3RELE1BQU0sYUFBYSxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqRSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO29CQUNsQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTt3QkFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUM7d0JBQzdCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUM7d0JBRTFDLElBQ0ksSUFBSSxDQUFDLFNBQVMsWUFBWSxJQUFJOzRCQUM5QixDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQ0FDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFDN0M7NEJBQ0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7eUJBQ2xDO3FCQUNKO2lCQUNKO3FCQUFNO29CQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO29CQUM3QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO2lCQUM3QztnQkFFRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDcEMsSUFDSSxJQUFJLENBQUMsaUJBQWlCLFlBQVksSUFBSTtvQkFDdEMsSUFBSSxDQUFDLGVBQWUsWUFBWSxJQUFJLEVBQ3RDO29CQUNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FDakIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDO29CQUNGLElBQUksQ0FBQyxjQUFjLENBQ2YsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZUFBZSxDQUN2QixDQUFDO2lCQUNMO2FBQ0o7U0FDSjtRQUVELElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQWFELElBQVcsc0JBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFXLG9CQUFvQjtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDckIsSUFDSSxJQUFJLENBQUMsT0FBTyxZQUFZLElBQUk7WUFDNUIsSUFBSSxDQUFDLG9CQUFvQixZQUFZLElBQUksRUFDM0M7WUFDRSxPQUFPLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEQsQ0FBQztTQUNMO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixJQUNJLElBQUksQ0FBQyxPQUFPLFlBQVksSUFBSTtZQUM1QixJQUFJLENBQUMsb0JBQW9CLFlBQVksSUFBSSxFQUMzQztZQUNFLE9BQU8sQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNuRCxDQUFDO1NBQ0w7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQVU7UUFDMUIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtZQUNoQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDO2dCQUUvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO29CQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDO2lCQUNoRDthQUNKO2lCQUFNLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUNsQyxJQUNJLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsZUFBdUIsQ0FBQyxFQUM5RDtvQkFDRSxJQUFJLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDO2lCQUNoRDtxQkFBTSxJQUNILFFBQVEsQ0FDSixxQkFBcUIsRUFDckIsSUFBSSxDQUFDLGlCQUF5QixDQUNqQyxFQUNIO29CQUNFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7b0JBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztpQkFDbEM7cUJBQU0sSUFDSCxTQUFTLENBQ0wscUJBQXFCLEVBQ3JCLElBQUksQ0FBQyxlQUF1QixDQUMvQixFQUNIO29CQUNFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7b0JBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztpQkFDbEM7cUJBQU0sSUFDSCxTQUFTLENBQ0wscUJBQXFCLEVBQ3JCLElBQUksQ0FBQyxpQkFBeUIsQ0FDakMsRUFDSDtvQkFDRSxJQUFJLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDO2lCQUNoRDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDO2lCQUNoRDthQUNKO1lBRUQsSUFBSSxDQUFDLGVBQWUsQ0FDaEIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsZUFBZSxFQUNwQixLQUFLLENBQ1IsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVNLGdCQUFnQjtRQUNuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNoRTtRQUVELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGNBQWM7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzlEO0lBQ0wsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUNQLENBQUM7SUFDTixDQUFDO0lBRU0sbUJBQW1CO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7WUFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUN2QyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTSxvQkFBb0I7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsZUFBZSxDQUNoQixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsSUFBSSxDQUNQLENBQUM7U0FDTDthQUFNO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbEU7WUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1NBQ3BDO0lBQ0wsQ0FBQztJQUVNLGVBQWUsQ0FDbEIsU0FBaUMsRUFDakMsT0FBK0IsRUFDL0IsVUFBVSxHQUFHLElBQUk7UUFFakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7U0FDekM7UUFFRCxJQUNJLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxJQUFJO1lBQ3RDLElBQUksQ0FBQyxlQUFlLFlBQVksSUFBSSxFQUN0QztZQUNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFFeEMsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQzNEO2lCQUFNO2dCQUNILE1BQU0sWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRWxELE1BQU0sZ0JBQWdCLEdBQ2xCLENBQUMsSUFBSSxDQUFDLFlBQVksWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDbEYsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLE1BQU0sY0FBYyxHQUNoQixDQUFDLElBQUksQ0FBQyxVQUFVLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQzVFLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLGdCQUFnQixFQUFFO29CQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2lCQUM3RDtnQkFFRCxJQUFJLGNBQWMsRUFBRTtvQkFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUN6RDtnQkFFRCxJQUFJLGdCQUFnQixJQUFJLGNBQWMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7d0JBQ25CLElBQUksQ0FBQyxpQkFBaUI7d0JBQ3RCLElBQUksQ0FBQyxlQUFlO3FCQUN2QixDQUFDLENBQUM7aUJBQ047YUFDSjtTQUNKO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sWUFBWTtRQUNmLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO2FBQU07WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkM7SUFDTCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ25CLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO2FBQU07WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsT0FBWTtRQUNsQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLElBQUksT0FBTyxHQUFHLE9BQU87WUFDakIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQTRCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDckQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQTRCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sb0JBQW9CLENBQUMsT0FBZ0I7UUFDeEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUN2QyxJQUNJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFlBQVksSUFBSSxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxZQUFZLElBQUksQ0FBQyxFQUN6QztZQUNFLE9BQU87U0FDVjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQ3pDLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDaEMsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxlQUFlLENBQUMsSUFBUztRQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFYixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFO1lBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDakUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFN0QsSUFDSSxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUMxRCxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQ2hFO2dCQUNFLEdBQUcsSUFBSSxtQ0FBbUMsQ0FBQzthQUM5QztpQkFBTTtnQkFDSCxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUMsRUFBRTtvQkFDbEQsR0FBRyxJQUFJLHFDQUFxQyxDQUFDO2lCQUNoRDtnQkFDRCxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLENBQUMsRUFBRTtvQkFDaEQsR0FBRyxJQUFJLHNDQUFzQyxDQUFDO2lCQUNqRDthQUNKO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFTyw0QkFBNEI7UUFDaEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FDbEMsaURBQWlELENBQ3BELENBQUM7UUFDRixJQUNJLE9BQU87WUFDUCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxFQUMzRDtZQUNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLENBQU07UUFDakIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDckMsQ0FBQztJQUVILGlDQUFpQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLDZCQUE2QjtZQUM5QixDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztJQUM1QyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQTRCO1FBQ3ZDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUUvQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzlCO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRO2dCQUMzQixDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVE7Z0JBQ2hCLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM1RDtJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsUUFBZSxFQUFFLE1BQWE7UUFDekMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN0QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUM5QyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUM5QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0YsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLFFBQVEsQ0FBQztZQUN2QyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQWMsRUFBRSxNQUFNLENBQUMsQ0FDMUMsQ0FBQztRQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztTQUNqRDtJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxRQUFlLEVBQUUsTUFBYTtRQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxJQUFJLENBQUMsRUFBRTtZQUMxRCxPQUFPO1NBQ1Y7UUFFRCxhQUFhO1FBQ2IsSUFDSSxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxTQUFTLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxXQUFXLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUMvQjtZQUNFLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUNoRCxRQUFRLEVBQ1IsT0FBTyxDQUNWLENBQUM7WUFDRixVQUFVO1NBQ2I7YUFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQ2hELFFBQVEsRUFDUixVQUFVLENBQ2IsQ0FBQztTQUNMO2FBQU07WUFDSCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDaEQsUUFBUSxFQUNSLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNwRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQ2hELE1BQU0sRUFDTixVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDbEQsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FDTixJQUFVLEVBQ1YsSUFBNkQ7UUFFN0QsUUFBUSxJQUFJLEVBQUU7WUFDVixLQUFLLE9BQU87Z0JBQ1IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDekMsS0FBSyxFQUFFLE1BQU07b0JBQ2IsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsR0FBRyxFQUFFLFNBQVM7aUJBQ2pCLENBQUMsQ0FBQztZQUNQLEtBQUssVUFBVTtnQkFDWCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsU0FBUztvQkFDaEIsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsT0FBTyxFQUFFLE1BQU07aUJBQ2xCLENBQUMsQ0FBQztZQUNQLEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsT0FBTztpQkFDakIsQ0FBQyxDQUFDO1lBQ1AsS0FBSyxLQUFLO2dCQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3pDLEdBQUcsRUFBRSxTQUFTO29CQUNkLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxTQUFTO2lCQUNsQixDQUFDLENBQUM7WUFDUDtnQkFDSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsU0FBUztvQkFDaEIsSUFBSSxFQUFFLFNBQVM7aUJBQ2xCLENBQUMsQ0FBQztTQUNWO0lBQ0wsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQWU7UUFDOUIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVyQyxJQUNJLEtBQUs7WUFDTCxDQUFDLElBQUksQ0FBQyxpQ0FBaUM7WUFDdkMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxFQUMzRDtZQUNFLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxLQUFLLENBQUM7WUFFL0MsSUFBSSxDQUFDLG9CQUFvQjtnQkFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUMxQyxJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLEtBQUssRUFDTCxJQUFJLENBQUMsY0FBYyxDQUN0QixDQUFDO1lBRU4sSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUUyQyxjQUFjLENBQ3RELEtBQW9CO1FBRXBCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDOzttSEF0dEJRLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDRyQ0NqRG5DLDhoWEFzUE07MkZEck1PLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDSSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTTsySUFJdEMsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDVyxrQkFBa0I7c0JBQWxDLE1BQU07Z0JBR0UsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNJLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFFRSxlQUFlO3NCQUF2QixLQUFLO2dCQUNJLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVFLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxZQUFZO3NCQUEzQixLQUFLO2dCQUVVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBRVUseUJBQXlCO3NCQUF4QyxLQUFLO2dCQTBDRSxtQkFBbUI7c0JBRDFCLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUczQyxvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVGLFFBQVE7c0JBQXpELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFnb0JJLGNBQWM7c0JBQXpELFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRHhDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9jYWxlbmRhcic7XHJcbmltcG9ydCB7IER4RGF0ZUJveENvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9kYXRlLWJveCc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgaXNTYW1lRGF5LFxyXG4gICAgaXNTYW1lWWVhcixcclxuICAgIGlzU2FtZU1vbnRoLFxyXG4gICAgc3RhcnRPZkRheSxcclxuICAgIHN0YXJ0T2ZNb250aCxcclxuICAgIGVuZE9mTW9udGgsXHJcbiAgICBpc0FmdGVyLFxyXG4gICAgaXNCZWZvcmUsXHJcbiAgICBhZGQsXHJcbn0gZnJvbSAnZGF0ZS1mbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGZhQW5nbGVMZWZ0LFxyXG4gICAgZmFBbmdsZVJpZ2h0LFxyXG4gICAgZmFDYWxlbmRhcixcclxufSBmcm9tICdAZm9ydGF3ZXNvbWUvcHJvLXJlZ3VsYXItc3ZnLWljb25zJztcclxuXHJcbmltcG9ydCB7IGZhQXJyb3dSaWdodCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tbGlnaHQtc3ZnLWljb25zJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UsXHJcbiAgICBQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uLFxyXG4gICAgUGVyaW9kUGlja2VyVHJhbnNsYXRpb25zLFxyXG59IGZyb20gJy4vZGF0ZS1waWNrZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBTZHNEYXRlUGlja2VyU2VydmljZSB9IGZyb20gJy4vc2RzLWRhdGUtcGlja2VyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3Nkcy1kYXRlLXBpY2tlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2RzRGF0ZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgIC8vIHB1YmxpYyBpbnRlcmZhY2VcclxuICAgIEBJbnB1dCgpIHNlbGVjdGlvbktpbmQ6ICdwZXJpb2QnIHwgJ3NpbmdsZScgPSAncGVyaW9kJztcclxuXHJcbiAgICBASW5wdXQoKSBkYXRlUmFuZ2VEZWZpbml0aW9uczogQXJyYXk8UGVyaW9kUGlja2VyRGF0ZVJhbmdlRGVmaW5pdGlvbj4gPSBbXTtcclxuXHJcbiAgICAvLyBzaW5nbGUgZGF0ZSBzZWxlY3RvclxyXG4gICAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWREYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIC8vIHBlcmlvZCBzZWxlY3RvclxyXG4gICAgQElucHV0KCkgc2VsZWN0ZWREYXRlU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGU7XHJcbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWREYXRlU3RhcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgQElucHV0KCkgc2VsZWN0ZWREYXRlRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZUVuZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwZXJpb2RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XHJcbiAgICBASW5wdXQoKSBtYXhEYXRlPzogRGF0ZTtcclxuXHJcbiAgICBASW5wdXQoKSBsb2NhbGVzPzogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSB2YWxpZGF0aW9uRXJyb3I6IHN0cmluZyA9ICcnO1xyXG4gICAgQElucHV0KCkgaXNWYWxpZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBmaXhlZFdpZHRoOiBudW1iZXIgPSAyODA7XHJcbiAgICBASW5wdXQoKSBvY2N1cGllZERheXM6IGFueVtdID0gW107XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGFwcGx5VGV4dD86IHN0cmluZyA9ICdjbG9zZSc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FuY2VsVGV4dD86IHN0cmluZyA9ICdjbG9zZSc7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHRyYW5zbGF0aW9uczogUGVyaW9kUGlja2VyVHJhbnNsYXRpb25zO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBmaXJzdERheU9mV2VlazogMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiA9IDE7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGRhdGVSYW5nZURlZmluaXRpb25zV2lkdGg6IHN0cmluZyA9ICcxMHJlbSc7XHJcbiAgICBcclxuXHJcbiAgICAvLyBwdWJsaWMgcHJvcGVydGllc1xyXG4gICAgcHJldmlvdXNQZXJpb2RJY29uID0gZmFBbmdsZUxlZnQ7XHJcbiAgICBuZXh0UGVyaW9kSWNvbiA9IGZhQW5nbGVSaWdodDtcclxuICAgIGNhbGVuZGFySWNvbiA9IGZhQ2FsZW5kYXI7XHJcbiAgICB0b0ljb24gPSBmYUFycm93UmlnaHQ7XHJcblxyXG4gICAgcHJlZGVmaW5lZERhdGVSYW5nZXM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZT4gPSBbXTtcclxuICAgIHByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIHNlbGVjdGVkRGF0ZVJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2U7XHJcbiAgICBkYXRlUmFuZ2VzOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2U+ID0gW107XHJcblxyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDE6IHN0cmluZyA9ICcnO1xyXG4gICAgc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIG1pbkRhdGVEZWZhdWx0OiBEYXRlO1xyXG4gICAgbWF4RGF0ZURlZmF1bHQ6IERhdGU7XHJcblxyXG4gICAgc2VsZWN0ZWREYXRlQ2FsZW5kYXI6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgc2VsZWN0ZWREYXRlSW50ZXJuYWw6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGRhdGVTdGFydE9sZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9ICcnO1xyXG4gICAgZGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kT2xkOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcblxyXG4gICAgc2hvd0RhdGVwaWNrZXI6IGJvb2xlYW47XHJcbiAgICBzaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGhpZGluZ0NvbmZpcm1lZERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc2VsZWN0ZWREYXRlRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8vIHByaXZhdGUgZmllbGRzXHJcbiAgICBwcml2YXRlIGN1c3RvbURhdGVSYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlO1xyXG4gICAgcHJpdmF0ZSBpbml0Q2FsZW5kYXJWYWx1ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2luZ2xlRGF0ZVBpY2tlckJveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gICAgcHJpdmF0ZSBzaW5nbGVEYXRlUGlja2VyQm94OiBEeERhdGVCb3hDb21wb25lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RlZERhdGVTdGFydEJveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gICAgcHJpdmF0ZSBzZWxlY3RlZERhdGVTdGFydEJveDogRHhEYXRlQm94Q29tcG9uZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgQFZpZXdDaGlsZCgnY2FsZW5kYXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBjYWxlbmRhcjpcclxuICAgICAgICB8IER4Q2FsZW5kYXJDb21wb25lbnRcclxuICAgICAgICB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgZGF0ZVBpY2tlclNlcnZpY2U6IFNkc0RhdGVQaWNrZXJTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmRhdGVSYW5nZURlZmluaXRpb25zID0gW107XHJcblxyXG4gICAgICAgIHRoaXMubWluRGF0ZURlZmF1bHQgPSBuZXcgRGF0ZSgxOTAwLCAxLCAxKTtcclxuICAgICAgICB0aGlzLm1heERhdGVEZWZhdWx0ID0gYWRkKHN0YXJ0T2ZEYXkobmV3IERhdGUoKSksIHsgeWVhcnM6IDUwIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25zID0ge1xyXG4gICAgICAgICAgICBjYW5jZWw6ICdDYW5jZWwnLFxyXG4gICAgICAgICAgICBhcHBseTogJ0FwcGx5JyxcclxuICAgICAgICAgICAgY3VzdG9tOiAnQ3VzdG9tJyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmN1c3RvbURhdGVSYW5nZSA9IG5ldyBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UoXHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zLmN1c3RvbSxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gdGhpcy5jdXN0b21EYXRlUmFuZ2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNpbmdsZURhdGVTZWxlY3RvckRlZmF1bHREYXRlID0gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2luZ2xlRGF0ZVNlbGVjdG9yRGVmYXVsdERhdGU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBlcmlvZFNlbGVjdG9yRGVmYXVsdFN0YXJ0RGF0ZSA9IHN0YXJ0T2ZNb250aChuZXcgRGF0ZSgpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0ID0gcGVyaW9kU2VsZWN0b3JEZWZhdWx0U3RhcnREYXRlO1xyXG4gICAgICAgIGNvbnN0IHBlcmlvZFNlbGVjdG9yRGVmYXVsdEVuZERhdGUgPSBzdGFydE9mRGF5KGVuZE9mTW9udGgobmV3IERhdGUoKSkpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gcGVyaW9kU2VsZWN0b3JEZWZhdWx0RW5kRGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQoXHJcbiAgICAgICAgICAgICAgICBzaW5nbGVEYXRlU2VsZWN0b3JEZWZhdWx0RGF0ZSxcclxuICAgICAgICAgICAgICAgIHNpbmdsZURhdGVTZWxlY3RvckRlZmF1bHREYXRlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UoXHJcbiAgICAgICAgICAgICAgICBzaW5nbGVEYXRlU2VsZWN0b3JEZWZhdWx0RGF0ZSxcclxuICAgICAgICAgICAgICAgIHNpbmdsZURhdGVTZWxlY3RvckRlZmF1bHREYXRlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICAgICAgcGVyaW9kU2VsZWN0b3JEZWZhdWx0U3RhcnREYXRlLFxyXG4gICAgICAgICAgICAgICAgcGVyaW9kU2VsZWN0b3JEZWZhdWx0RW5kRGF0ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICAgICAgcGVyaW9kU2VsZWN0b3JEZWZhdWx0U3RhcnREYXRlLFxyXG4gICAgICAgICAgICAgICAgcGVyaW9kU2VsZWN0b3JEZWZhdWx0RW5kRGF0ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGhpcy5kYXRlUmFuZ2VUcmFuc2xhdGlvbnMgPSBuZXcgRGF0ZVJhbmdlVHJhbnNsYXRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7fVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlc1snZGF0ZVJhbmdlRGVmaW5pdGlvbnMnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWyd0cmFuc2xhdGlvbnMnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1c3RvbURhdGVSYW5nZS5uYW1lID0gdGhpcy50cmFuc2xhdGlvbnM/LmN1c3RvbVxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9ucy5jdXN0b21cclxuICAgICAgICAgICAgICAgIDogJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlU3RhcnQnXSB8fCBjaGFuZ2VzWydzZWxlY3RlZERhdGVFbmQnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVTdGFydE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQ7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlRW5kO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10uY3VycmVudFZhbHVlIGFzIERhdGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc3RhcnRPZkRheSh2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlU3RhcnQnXSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10uY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlICYmIHRoaXMuc2hvd0RhdGVwaWNrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NldHRpbmdOb3RQcmVwcm9jZXNzZWREYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTYW1lRGF5KHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZUVuZCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FmdGVyKHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZUVuZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGVuZGFyPy5pbnN0YW5jZT8ucmVwYWludCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEeERlZmF1bHRDYWxlbmRhckZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dChcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlRW5kJ10pIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZERhdGVFbmQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZUVuZEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTYW1lRGF5KHNlbGVjdGVkVmFsdWUsIHRoaXMuZGF0ZVN0YXJ0KSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIodGhpcy5kYXRlU3RhcnQsIHNlbGVjdGVkVmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snZmlyc3REYXlPZldlZWsnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJhbmRvbUlkUmVmZXJlbmNlOiBudW1iZXIgPSBNYXRoLmZsb29yKFxyXG4gICAgICAgIE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxyXG4gICAgKTtcclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZWREYXRlczogRnVuY3Rpb24gPSAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgZGF0YS52aWV3ID09PSAnbW9udGgnICYmXHJcbiAgICAgICAgICAgIHRoaXMub2NjdXBpZWREYXlzLnNvbWUoKGRhdGUpID0+IGlzU2FtZURheShkYXRlLCBkYXRhLmRhdGUpKVxyXG4gICAgICAgICk7XHJcbiAgICB9O1xyXG5cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWREYXRlU3RhcnRGb2N1cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVGb2N1cztcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWREYXRlRW5kRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNNaW5pbXVtTGltaXQoKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm1pbkRhdGUgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5taW5EYXRlKSB8fFxyXG4gICAgICAgICAgICAgICAgaXNCZWZvcmUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5taW5EYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc01heGltdW1MaW1pdCgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMubWF4RGF0ZSBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1heERhdGUpIHx8XHJcbiAgICAgICAgICAgICAgICBpc0FmdGVyKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWF4RGF0ZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZERhdGVGcm9tRXZlbnQgPSBuZXcgRGF0ZShldmVudC52YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IHNlbGVjdGVkRGF0ZUZyb21FdmVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5pdENhbGVuZGFyVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIoc2VsZWN0ZWREYXRlRnJvbUV2ZW50LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCBhcyBEYXRlKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGlzQmVmb3JlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGVGcm9tRXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgYXMgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVEYXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0ZUZyb21FdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgYXMgRGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVEYXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0ZUZyb21FdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBhcyBEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gc2VsZWN0ZWREYXRlRnJvbUV2ZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN0YXJ0RGF0ZUZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuaW5pdENhbGVuZGFyVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVTdGFydCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRDYWxlbmRhclZhbHVlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRW5kRGF0ZUZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRm9jdXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseVBlcmlvZFBpY2tlcigpIHtcclxuICAgICAgICB0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVuRGF0ZXBpY2tlclBvcHVwKCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaW5nbGVEYXRlUGlja2VyQm94Py5pbnN0YW5jZS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVTdGFydE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQ7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IHRoaXMuc2VsZWN0ZWREYXRlRW5kO1xyXG4gICAgICAgICAgICB0aGlzLmlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRCb3g/Lmluc3RhbmNlLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU3RhcnREYXRlRm9jdXMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZURhdGVwaWNrZXJQb3B1cCgpIHtcclxuICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oaWRpbmdDb25maXJtZWREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZSh0aGlzLmRhdGVTdGFydE9sZCwgdGhpcy5kYXRlRW5kT2xkLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmhpZGluZ0NvbmZpcm1lZERhdGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICBkYXRlU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUsXHJcbiAgICAgICAgZGF0ZUVuZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSxcclxuICAgICAgICBlbWl0Q2hhbmdlID0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCA9IGRhdGVTdGFydDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCA9IGRhdGVFbmQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IGRhdGVTdGFydDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVGV4dCh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LCB0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZW1pdENoYW5nZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVN0YXJ0TmV3ID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlRW5kTmV3ID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZUNoYW5nZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmRhdGVTdGFydE9sZCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzU2FtZURheSh0aGlzLmRhdGVTdGFydE9sZCwgZGF0ZVN0YXJ0TmV3KSkgfHxcclxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMuZGF0ZVN0YXJ0T2xkID09PSAnc3RyaW5nJyAmJiB0aGlzLmRhdGVTdGFydE9sZCA9PT0gJycpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZUNoYW5nZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmRhdGVFbmRPbGQgaW5zdGFuY2VvZiBEYXRlICYmICFpc1NhbWVEYXkodGhpcy5kYXRlRW5kT2xkLCBkYXRlRW5kTmV3KSkgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGVFbmRPbGQgPT09ICdzdHJpbmcnICYmIHRoaXMuZGF0ZUVuZE9sZCA9PT0gJycpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Q2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVuZERhdGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kT2xkID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGVDaGFuZ2VkIHx8IGVuZERhdGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJpb2RDaGFuZ2UuZW1pdChbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ29Ub05leHREYXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXROZXh0UHJldmlvdXNEYXkodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXROZXh0UHJldmlvdXNSYW5nZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdvVG9QcmV2aW91c0RhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLnNldE5leHRQcmV2aW91c0RheShmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXROZXh0UHJldmlvdXNSYW5nZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXROZXh0UHJldmlvdXNEYXkoc2V0TmV4dDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IG5ld0RhdGUgPSBzZXROZXh0XHJcbiAgICAgICAgICAgID8gYWRkKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgYXMgRGF0ZSwgeyBkYXlzOiAxIH0pXHJcbiAgICAgICAgICAgIDogYWRkKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgYXMgRGF0ZSwgeyBkYXlzOiAtMSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IG5ldyBEYXRlKG5ld0RhdGUpO1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXROZXh0UHJldmlvdXNSYW5nZShzZXROZXh0OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlKSB8fFxyXG4gICAgICAgICAgICAhKHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFJhbmdlKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgc2V0TmV4dCA/ICduZXh0JyA6ICdwcmV2aW91cydcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENlbGxDc3NDbGFzcyhkYXRlOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBjYWxlbmRhckRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgICAgICBsZXQgY3NzID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlU3RhcnRBc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlRW5kQXNEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgaXNBZnRlcihjYWxlbmRhckRhdGUsIHN0YXJ0T2ZEYXkoc2VsZWN0ZWREYXRlU3RhcnRBc0RhdGUpKSAmJlxyXG4gICAgICAgICAgICAgICAgaXNCZWZvcmUoY2FsZW5kYXJEYXRlLCBzdGFydE9mRGF5KHNlbGVjdGVkRGF0ZUVuZEFzRGF0ZSkpICYmXHJcbiAgICAgICAgICAgICAgICAhdGhpcy5vY2N1cGllZERheXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBkYXkpKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNzcyArPSAnIGJnLXNlY29uZGFyeSB0ZXh0LWRhcmsgcm91bmRlZC0wJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjc3MgKz0gJyBiZy1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1sZWZ0JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBzZWxlY3RlZERhdGVFbmRBc0RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3NzICs9ICcgYmctcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtcmlnaHQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVEeERlZmF1bHRDYWxlbmRhckZvY3VzKCkge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgICAnI2RhdGVwaWNrZXJjb21wb25lbnQgLmR4LWNhbGVuZGFyLXNlbGVjdGVkLWRhdGUnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGVsZW1lbnQgJiZcclxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0Py5jb250YWlucygnZHgtY2FsZW5kYXItc2VsZWN0ZWQtZGF0ZScpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdD8ucmVtb3ZlKCdkeC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ29udGVudFJlYWR5KGU6IGFueSkgeyAgXHJcbiAgICAgICAgdmFyIGNvbnRlbnRFbGVtZW50ID0gZS5jb21wb25lbnQuY29udGVudCgpOyAgXHJcbiAgICAgICAgY29udGVudEVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJzsgIFxyXG4gICAgICB9XHJcblxyXG4gICAgdG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9XHJcbiAgICAgICAgICAgICF0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nRGF0ZVJhbmdlKHJhbmdlOiBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UpIHtcclxuICAgICAgICB0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHJhbmdlO1xyXG5cclxuICAgICAgICBpZiAocmFuZ2UgPT09IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbkRhdGVwaWNrZXJQb3B1cCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgID8gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gcmFuZ2UuZGF0ZVRvID8gcmFuZ2UuZGF0ZVRvIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnQsIHRoaXMuZGF0ZUVuZCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1hdGNoRGF0ZVJhbmdlKGRhdGVGcm9tPzogRGF0ZSwgZGF0ZVRvPzogRGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZGF0ZUZyb20gfHwgIWRhdGVUbykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gdGhpcy5jdXN0b21EYXRlUmFuZ2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXRlUmFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZSA9IHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh4LmRhdGVGcm9tIGFzIERhdGUsIGRhdGVGcm9tKSAmJlxyXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KHguZGF0ZVRvIGFzIERhdGUsIGRhdGVUbylcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChkYXRlUmFuZ2UubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSBkYXRlUmFuZ2VbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldERhdGVSYW5nZVRleHQoZGF0ZUZyb20/OiBEYXRlLCBkYXRlVG8/OiBEYXRlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcblxyXG4gICAgICAgIGlmICghKGRhdGVGcm9tIGluc3RhbmNlb2YgRGF0ZSkgfHwgIShkYXRlVG8gaW5zdGFuY2VvZiBEYXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmdWxsIG1vbnRoXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZUZyb20sIHN0YXJ0T2ZNb250aChkYXRlRnJvbSkpICYmXHJcbiAgICAgICAgICAgIGlzU2FtZURheShkYXRlVG8sIGVuZE9mTW9udGgoZGF0ZVRvKSkgJiZcclxuICAgICAgICAgICAgaXNTYW1lTW9udGgoZGF0ZUZyb20sIGRhdGVUbylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxyXG4gICAgICAgICAgICAgICAgJ21vbnRoJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyBvbmUgZGF5XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc1NhbWVEYXkoZGF0ZUZyb20sIGRhdGVUbykpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxyXG4gICAgICAgICAgICAgICAgJ2RheS1sb25nJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoXHJcbiAgICAgICAgICAgICAgICBkYXRlRnJvbSxcclxuICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZUZyb20sIHRvZGF5KSA/ICdkYXktc2hvcnQnIDogJ2RheSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MiA9IHRoaXMuZm9ybWF0RGF0ZShcclxuICAgICAgICAgICAgICAgIGRhdGVUbyxcclxuICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZVRvLCB0b2RheSkgPyAnZGF5LXNob3J0JyA6ICdkYXknXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvcm1hdERhdGUoXHJcbiAgICAgICAgZGF0ZTogRGF0ZSxcclxuICAgICAgICB0eXBlPzogJ21vbnRoJyB8ICdkYXknIHwgJ2RheS1sb25nJyB8ICdkYXktc2hvcnQnIHwgdW5kZWZpbmVkXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FzZSAnZGF5LWxvbmcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYXNlICdkYXktc2hvcnQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVEYXRlUmFuZ2VzKGZvcmNlPzogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBmb3JjZSB8fFxyXG4gICAgICAgICAgICAhdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGUgfHxcclxuICAgICAgICAgICAgIWlzU2FtZURheSh0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSwgdG9kYXkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlID0gdG9kYXk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzID1cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0UHJlZGVmaW5lZERhdGVSYW5nZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VEZWZpbml0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICB0b2RheSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0RGF5T2ZXZWVrXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kYXRlUmFuZ2VzID0gWy4uLnRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXNdO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZXMucHVzaCh0aGlzLmN1c3RvbURhdGVSYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleXVwJywgWyckZXZlbnQnXSkgb25LZXl1cEhhbmRsZXIoXHJcbiAgICAgICAgZXZlbnQ6IEtleWJvYXJkRXZlbnRcclxuICAgICkge1xyXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlRGF0ZXBpY2tlclBvcHVwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgbWV0aG9kc1xyXG59XHJcbiIsIjxkaXYgaWQ9XCJkYXRlcGlja2VyYnV0dG9uc1wiPlxyXG4gICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcclxuICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJEYXRlIHBpY2tlclwiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1ncm91cFwiXHJcbiAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgaWQ9XCJwaWNrZXJQcmVkZWZpbmVkUmFuZ2VEcm9wZG93bnt7IHJhbmRvbUlkUmVmZXJlbmNlIH19XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgYnRuIGJ0bi13aGl0ZVxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclxyXG4gICAgICAgICAgICAgICAgICAgIHJvdW5kZWQtc3RhcnRcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXItZW5kLTAgYm9yZGVyLWNvbG9yLW11dGVkXHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24tdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dC10cnVuY2F0ZVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImRhdGVSYW5nZURlZmluaXRpb25zV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURhdGVSYW5nZVNlbGVjdG9yVmlzaWJpbGl0eSgpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3tzZWxlY3RlZERhdGVSYW5nZS5uYW1lfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8ZHgtcG9wb3ZlclxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlUmFuZ2VEZWZpbml0aW9ucyAmJiBkYXRlUmFuZ2VEZWZpbml0aW9ucy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgICAgIHRhcmdldD1cIiNwaWNrZXJQcmVkZWZpbmVkUmFuZ2VEcm9wZG93bnt7IHJhbmRvbUlkUmVmZXJlbmNlIH19XCJcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgIFsodmlzaWJsZSldPVwic2hvd1ByZWRlZmluZWRPcHRpb25zU2VsZWN0b3JcIlxyXG4gICAgICAgICAgICAgICAgKG9uQ29udGVudFJlYWR5KT1cIm9uQ29udGVudFJlYWR5KCRldmVudClcIiBcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJhbmdlIG9mIGRhdGVSYW5nZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcmVkZWZpbmVkLWRhdGUtcmFuZ2UgcHgtMyBweS0yIHctMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyYW5nZSA9PT0gc2VsZWN0ZWREYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nRGF0ZVJhbmdlKHJhbmdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7cmFuZ2UubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZHgtcG9wb3Zlcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgYm9yZGVyIHJvdW5kZWQtMCBib3JkZXItZW5kLTAgYm9yZGVyLWNvbG9yLW11dGVkIHBlLTJcIlxyXG4gICAgICAgICAgICBbY2xhc3Mucm91bmRlZC1zdGFydF0gPSBcIiFkYXRlUmFuZ2VEZWZpbml0aW9ucyB8fCBkYXRlUmFuZ2VEZWZpbml0aW9ucy5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTWluaW11bUxpbWl0IHx8IGRpc2FibGVkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9QcmV2aW91c0RhdGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJwcmV2aW91c1BlcmlvZEljb25cIj48L2ZhLWljb24+XHJcblxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGlkPVwicGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXIgcm91bmRlZC0wIGJvcmRlci1zdGFydC0wIGJvcmRlci1lbmQtMCBib3JkZXItY29sb3ItbXV0ZWQgdGV4dC10cnVuY2F0ZSBweC0wXCJcclxuICAgICAgICAgICAgW2NsYXNzLnctMTAwXT1cIiEhIWZpeGVkV2lkdGhcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEYXRlcGlja2VyID8gY2xvc2VEYXRlcGlja2VyUG9wdXAoKSA6IG9wZW5EYXRlcGlja2VyUG9wdXAoKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJmaXhlZFdpZHRoXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwidHJ1ZSB8fCB0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCdcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJteC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiY2FsZW5kYXJJY29uXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTEgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDF9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwidG9JY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJ9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgYm9yZGVyIHJvdW5kZWQtZW5kIGJvcmRlci1zdGFydC0wIGJvcmRlci1jb2xvci1tdXRlZCBwcy0yXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01heGltdW1MaW1pdCB8fCBkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV4dERhdGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJuZXh0UGVyaW9kSWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkeC1wb3BvdmVyXHJcbiAgICAgICAgdGFyZ2V0PVwiI3BpY2tlckRyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxyXG4gICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICBbKHZpc2libGUpXT1cInNob3dEYXRlcGlja2VyXCJcclxuICAgICAgICAob25IaWRpbmcpPVwiY2xvc2VEYXRlcGlja2VyUG9wdXAoKVwiXHJcbiAgICAgICAgY2xhc3M9XCJtLTAgcC0wXCJcclxuICAgID5cclxuICAgICAgICA8ZHhvLWFuaW1hdGlvbj5cclxuICAgICAgICAgICAgPGR4by1zaG93XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwicG9wXCJcclxuICAgICAgICAgICAgICAgIFtmcm9tXT1cInsgc2NhbGU6IDAuOSB9XCJcclxuICAgICAgICAgICAgICAgIFt0b109XCJ7IHNjYWxlOiAxIH1cIlxyXG4gICAgICAgICAgICA+PC9keG8tc2hvdz5cclxuICAgICAgICAgICAgPGR4by1oaWRlXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiZmFkZVwiXHJcbiAgICAgICAgICAgICAgICBbZnJvbV09XCIxXCJcclxuICAgICAgICAgICAgICAgIFt0b109XCIwXCJcclxuICAgICAgICAgICAgPjwvZHhvLWhpZGU+XHJcbiAgICAgICAgPC9keG8tYW5pbWF0aW9uPlxyXG4gICAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cclxuICAgICAgICAgICAgPGR4LXNjcm9sbC12aWV3PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImRhdGVwaWNrZXJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkYXRlLWlucHV0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBwLTIgbWItM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWREYXRlU3RhcnRCb3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBwLTEgbS0wIHRleHQtY2VudGVyIHJvdW5kZWQtcGlsbCBkYXRlcGlja2VyLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwic2VsZWN0ZWREYXRlRm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VNYXNrQmVoYXZpb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cInNob3J0ZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWxlY3RlZERhdGVTdGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNJbik9XCJvblN0YXJ0RGF0ZUZvY3VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHB4LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInRvSWNvblwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0ZWREYXRlRW5kQm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcC0xIG0tMCB0ZXh0LWNlbnRlciByb3VuZGVkLXBpbGwgZGF0ZXBpY2tlci1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cIiFzZWxlY3RlZERhdGVGb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEcm9wRG93bkJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwic2hvcnRkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1ZhbGlkXT1cImlzVmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cInNlbGVjdGVkRGF0ZUVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNJbik9XCJvbkVuZERhdGVGb2N1cygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkYXRlLWlucHV0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBwLTIgbWItM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2luZ2xlRGF0ZVBpY2tlckJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZC1waWxsIGRhdGVwaWNrZXItaW5wdXQgZGF0ZXBpY2tlci1pbnB1dC1sYXJnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RHJvcERvd25CdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VNYXNrQmVoYXZpb3JdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cInNob3J0ZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJzZWxlY3RlZERhdGVJbnRlcm5hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImNsb3NlRGF0ZXBpY2tlclBvcHVwKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY2FsZW5kYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZSB8fCBtaW5EYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZXNdPVwiZGlzYWJsZWREYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCcgPyBzZWxlY3RlZERhdGVDYWxlbmRhciA6IHNlbGVjdGVkRGF0ZUludGVybmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkRhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiZmlyc3REYXlPZldlZWtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmR4VGVtcGxhdGU9XCJsZXQgY2VsbERhdGEgb2YgJ2NlbGwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ2gtMTAwIHB0LTEnICsgZ2V0Q2VsbENzc0NsYXNzKGNlbGxEYXRhLmRhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjZWxsRGF0YS50ZXh0IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbG9zZURhdGVwaWNrZXJQb3B1cCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0cmFuc2xhdGlvbnMuY2FuY2VsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBteC0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQZXJpb2RQaWNrZXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25zLmFwcGx5fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZHgtcG9wb3Zlcj5cclxuPC9kaXY+Il19