@seniorsistemas/angular-components 19.9.11 → 19.9.12-develop-18460917

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 (52) hide show
  1. package/dynamic-form/dynamic-form/form-field/addon-config.d.ts +12 -0
  2. package/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-field.d.ts +5 -0
  3. package/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.d.ts +0 -1
  4. package/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.d.ts +1 -0
  5. package/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.d.ts +1 -0
  6. package/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.d.ts +1 -0
  7. package/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.d.ts +4 -0
  8. package/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.d.ts +1 -0
  9. package/esm2022/content-generator/lib/content-generator/content-generator.component.mjs +2 -2
  10. package/esm2022/control-errors/lib/control-errors/control-errors.component.mjs +3 -3
  11. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +3 -3
  12. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
  13. package/esm2022/dynamic-form/dynamic-form/form-field/addon-config.mjs +29 -2
  14. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-field.mjs +1 -1
  15. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.mjs +1 -1
  16. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +8 -7
  17. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +6 -5
  18. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +8 -7
  19. package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +14 -5
  20. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +8 -7
  21. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text-area/text-area-field.component.mjs +3 -3
  22. package/esm2022/input-group/lib/input-group/input-group.component.mjs +37 -0
  23. package/esm2022/input-group/lib/input-group/input-group.module.mjs +16 -0
  24. package/esm2022/input-group/lib/input-group/types/input-group-addon.mjs +2 -0
  25. package/esm2022/input-group/public-api.mjs +3 -0
  26. package/esm2022/input-group/seniorsistemas-angular-components-input-group.mjs +5 -0
  27. package/esm2022/select/lib/select/select.component.mjs +3 -3
  28. package/esm2022/text-area/lib/text-area/text-area.component.mjs +21 -6
  29. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +1 -1
  30. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-control-errors.mjs +2 -2
  32. package/fesm2022/seniorsistemas-angular-components-control-errors.mjs.map +1 -1
  33. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +2 -2
  34. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
  35. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +62 -22
  36. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  37. package/fesm2022/seniorsistemas-angular-components-input-group.mjs +57 -0
  38. package/fesm2022/seniorsistemas-angular-components-input-group.mjs.map +1 -0
  39. package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
  40. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  41. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +20 -5
  42. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  43. package/input-group/README.md +106 -0
  44. package/input-group/index.d.ts +5 -0
  45. package/input-group/lib/input-group/input-group.component.d.ts +27 -0
  46. package/input-group/lib/input-group/input-group.module.d.ts +7 -0
  47. package/input-group/lib/input-group/types/input-group-addon.d.ts +10 -0
  48. package/input-group/package.json +3 -0
  49. package/input-group/public-api.d.ts +3 -0
  50. package/package.json +7 -1
  51. package/styles.css +1 -0
  52. package/text-area/lib/text-area/text-area.component.d.ts +12 -3
@@ -1803,7 +1803,7 @@ export class DatepickerComponent {
1803
1803
  useExisting: DatepickerComponent,
1804
1804
  multi: true,
1805
1805
  },
1806
- ], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
1806
+ ], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"datepicker-group relative flex w-full items-center after:pointer-events-none after:absolute after:inset-0 after:rounded-medium has-[input:focus]:after:outline has-[input:focus]:after:outline-2 has-[input:focus]:after:outline-offset-[-2px] has-[input:focus]:after:outline-[var(--s-focus-ring-color,#0090ff)]\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-medium border border-solid border-grayscale-30 pl-[10px] text-sm outline-none transition-colors duration-200 ease-out\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"trigger-icon absolute right-0 flex h-[35px] w-9 items-center justify-center rounded-r-medium border border-solid transition-colors duration-200 ease-out\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-5]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty .datepicker-group:not(:focus-within){input,button.trigger-icon{border-color:#c13018}}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}button.trigger-icon[type=button]:focus-visible{outline:2px solid var(--s-focus-ring-color, #0090ff);outline-offset:-2px;border-radius:0 4px 4px 0}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
1807
1807
  }
1808
1808
  __decorate([
1809
1809
  numericKeysOnly()
@@ -1837,6 +1837,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1837
1837
  useExisting: DatepickerComponent,
1838
1838
  multi: true,
1839
1839
  },
1840
- ], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"] }]
1840
+ ], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"datepicker-group relative flex w-full items-center after:pointer-events-none after:absolute after:inset-0 after:rounded-medium has-[input:focus]:after:outline has-[input:focus]:after:outline-2 has-[input:focus]:after:outline-offset-[-2px] has-[input:focus]:after:outline-[var(--s-focus-ring-color,#0090ff)]\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-medium border border-solid border-grayscale-30 pl-[10px] text-sm outline-none transition-colors duration-200 ease-out\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"trigger-icon absolute right-0 flex h-[35px] w-9 items-center justify-center rounded-r-medium border border-solid transition-colors duration-200 ease-out\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-5]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty .datepicker-group:not(:focus-within){input,button.trigger-icon{border-color:#c13018}}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}button.trigger-icon[type=button]:focus-visible{outline:2px solid var(--s-focus-ring-color, #0090ff);outline-offset:-2px;border-radius:0 4px 4px 0}\n"] }]
1841
1841
  }], ctorParameters: () => [], propDecorators: { handleHoursKeydown: [], handleMinutesKeydown: [], handleSecondsKeydown: [] } });
1842
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULG1CQUFtQixFQUduQixVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFvQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMs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QkFDSjt3REE0cURTLGtCQUFrQixNQVdsQixvQkFBb0IsTUFXcEIsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVHJhcEZvY3VzLCBMaXZlQW5ub3VuY2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSwgQ2RrT3ZlcmxheU9yaWdpbiwgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIGlucHV0LFxuICAgIG1vZGVsLFxuICAgIE9uSW5pdCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIE5nQ29udHJvbCxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxuICAgIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVNlZ21lbnRFbmdpbmUsIFNlZ21lbnRFbmdpbmVDb25maWcsIFNlZ21lbnRLaW5kIH0gZnJvbSAnLi9kYXRlLXNlZ21lbnQtaW5wdXQnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWVGb3JJbnB1dCwgaXNTYW1lRGF5LCBwYXJzZUlucHV0LCBzdHJpcFRpbWUgfSBmcm9tICcuL2RhdGUudXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckRheSwgRGF0ZVBpY2tlck1vZGUsIERhdGVSYW5nZSB9IGZyb20gJy4vbW9kZWxzJztcblxudHlwZSBEYXRlcGlja2VyVmFsdWUgPSBEYXRlIHwgRGF0ZVJhbmdlIHwgRGF0ZVtdIHwgbnVsbDtcbnR5cGUgUGlja2VyVmlldyA9ICdjYWxlbmRhcicgfCAnbW9udGhzJyB8ICd5ZWFycyc7XG5cbmZ1bmN0aW9uIG51bWVyaWNLZXlzT25seSgpOiBNZXRob2REZWNvcmF0b3Ige1xuICAgIHJldHVybiAoX3RhcmdldCwgX2tleSwgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKHRoaXM6IHVua25vd24sIGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkS2V5ID1cbiAgICAgICAgICAgICAgICBbJ0Fycm93VXAnLCAnQXJyb3dEb3duJywgJ0JhY2tzcGFjZScsICdEZWxldGUnLCAnVGFiJ10uaW5jbHVkZXMoZXZlbnQua2V5KSB8fCAvXlxcZCQvLnRlc3QoZXZlbnQua2V5KTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3MtZGF0ZXBpY2tlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQ2RrVHJhcEZvY3VzLFxuICAgICAgICBDZGtPdmVybGF5T3JpZ2luLFxuICAgICAgICBDZGtDb25uZWN0ZWRPdmVybGF5LFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3Qge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgaW5wdXQge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgaW5wdXQ6Zm9jdXMge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLWNvbG9yOiAjYzEzMDE4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOmhvc3QubmctaW52YWxpZC5uZy1kaXJ0eSBidXR0b25bdHlwZT0nYnV0dG9uJ10ge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gYnV0dG9uW3R5cGU9J2J1dHRvbiddIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOmhvc3Qubm8taWNvbiBpbnB1dCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1dHRvblt0eXBlPSdidXR0b24nXTpmb2N1cy12aXNpYmxlIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAycHggc29saWQgIzQyOGJjYTtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3Mubm8taWNvbl0nOiAnIXNob3dJY29uKCknLFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaWRDb3VudGVyID0gMDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEQVlTX0lOX1dFRUsgPSA3O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1PTlRIU19JTl9ZRUFSID0gMTI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9OVEhTX1BFUl9ST1cgPSAzO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFlFQVJTX1BFUl9HUklEID0gMTI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUVBUlNfUEVSX1JPVyA9IDM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NSU5VVEVfU1RFUCA9IDU7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0hPVVJTID0gMjQ7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX01JTlVURVMgPSA2MDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIT1VSU19QRVJfTUVSSURJRU0gPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBET1VCTEVfQ0xJQ0tfVEhSRVNIT0xEX01TID0gNDAwO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkKCk6IHN0cmluZyB7XG4gICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuaWRDb3VudGVyKys7XG4gICAgICAgIHJldHVybiBgcy1kYXRlcGlja2VyLSR7RGF0ZXBpY2tlckNvbXBvbmVudC5pZENvdW50ZXJ9YDtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgSW5wdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEhUTUwgYGlkYCBhcGxpY2FkbyBhbyBlbGVtZW50byBgPGlucHV0PmAuIEF1dG8tZ2VyYWRvIHF1YW5kbyBvbWl0aWRvLiAqL1xuICAgIHJlYWRvbmx5IGlucHV0SWQgPSBpbnB1dDxzdHJpbmc+KERhdGVwaWNrZXJDb21wb25lbnQubmV4dElkKCkpO1xuXG4gICAgLyoqIEF0cmlidXRvIGBuYW1lYCBkbyBgPGlucHV0PmAgbmF0aXZvLiAqL1xuICAgIHJlYWRvbmx5IG5hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKiogVGV4dG8gZXhpYmlkbyBxdWFuZG8gbmVuaHVtIHZhbG9yIGVzdMOhIHNlbGVjaW9uYWRvLiAqL1xuICAgIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogTW9kbyBkZSBzZWxlw6fDo28gZG8gY29tcG9uZW50ZS5cbiAgICAgKiAtIGAnZGF0ZSdgIOKAlCBzZWxlw6fDo28gZGUgZGF0YSDDum5pY2EgKHBhZHLDo28pXG4gICAgICogLSBgJ21vbnRoJ2Ag4oCUIHNlbGXDp8OjbyBkZSBtw6pzL2Fub1xuICAgICAqIC0gYCdkYXRldGltZSdgIOKAlCBkYXRhIGNvbSBob3JhIChyZXF1ZXIgY29uZmlybWHDp8OjbylcbiAgICAgKiAtIGAndGltZSdgIOKAlCBhcGVuYXMgc2VsZcOnw6NvIGRlIGhvcmFcbiAgICAgKiAtIGAncmFuZ2UnYCDigJQgaW50ZXJ2YWxvIGVudHJlIGR1YXMgZGF0YXNcbiAgICAgKi9cbiAgICByZWFkb25seSBtb2RlID0gaW5wdXQ8RGF0ZVBpY2tlck1vZGU+KCdkYXRlJyk7XG5cbiAgICAvKipcbiAgICAgKiBNb2RvIGRlIHNlbGXDp8OjbyBxdWFuZG8gYG1vZGVgIMOpIGAnZGF0ZSdgLlxuICAgICAqIC0gYCdzaW5nbGUnYCDigJQgc2VsZcOnw6NvIGRlIHVtYSDDum5pY2EgZGF0YSAocGFkcsOjbylcbiAgICAgKiAtIGAnbXVsdGlwbGUnYCDigJQgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgZGF0YXMgYXZ1bHNhc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUgPSBpbnB1dDwnc2luZ2xlJyB8ICdtdWx0aXBsZSc+KCdzaW5nbGUnKTtcblxuICAgIC8qKiBTZXBhcmFkb3IgZXhpYmlkbyBlbnRyZSBhcyBkYXRhcyBubyBtb2RvIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcmVhZG9ubHkgbXVsdGlwbGVTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmc+KCcsICcpO1xuXG4gICAgLyoqIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gYm90w6NvIGRlIMOtY29uZSBhbyBsYWRvIGRvIGNhbXBvLiAqL1xuICAgIHJlYWRvbmx5IHNob3dJY29uID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBDbGFzc2UgZG8gw61jb25lIGV4aWJpZG8gbm8gYm90w6NvIGRvIGNhbXBvLlxuICAgICAqIFF1YW5kbyBgbW9kZWAgw6kgYCd0aW1lJ2AsIG8gcGFkcsOjbyBtdWRhIGF1dG9tYXRpY2FtZW50ZSBwYXJhIGAnZmFzIGZhLWNsb2NrJ2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWNvbiA9IGlucHV0PHN0cmluZz4oJ2ZhcyBmYS1jYWxlbmRhcicpO1xuXG4gICAgLyoqIERhdGEgbcOtbmltYSBzZWxlY2lvbsOhdmVsLiBEaWFzL21lc2VzIGFudGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtaW4gPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBtw6F4aW1hIHNlbGVjaW9uw6F2ZWwuIERpYXMvbWVzZXMgcG9zdGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtYXggPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBleGliaWRhIGFvIGFicmlyIG8gY2FsZW5kw6FyaW8gcXVhbmRvIG5lbmh1bWEgZGF0YSBlc3TDoSBzZWxlY2lvbmFkYS4gKi9cbiAgICByZWFkb25seSBkZWZhdWx0RGF0ZSA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdG8gZGUgZXhpYmnDp8OjbyBkYSBkYXRhIG5vIGNhbXBvLiBRdWFuZG8gb21pdGlkbywgw6kgcmVzb2x2aWRvIGEgcGFydGlyIGRvXG4gICAgICogbG9jYWxlIGF0aXZvIChjaGF2ZSBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVfZm9ybWF0YCksIGNvbSBmYWxsYmFjayBwYXJhIGBkZC9NTS95eXl5YC5cbiAgICAgKi9cbiAgICByZWFkb25seSBkYXRlRm9ybWF0ID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogRm9ybWF0byBkZSBleGliacOnw6NvIGRhcyBob3JhczogYCcxMidgIG91IGAnMjQnYC4gUXVhbmRvIG9taXRpZG8sIMOpIHJlc29sdmlkbyBhIHBhcnRpclxuICAgICAqIGRvIGxvY2FsZSBhdGl2byAoY2hhdmUgYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ob3VyX2Zvcm1hdGApLCBjb20gZmFsbGJhY2sgcGFyYSBgJzI0J2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaG91ckZvcm1hdCA9IGlucHV0PCcxMicgfCAnMjQnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZW0gbWludXRvcyBhbyB1c2FyIGFzIHNldGFzIGRvIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IG1pbnV0ZVN0ZXAgPSBpbnB1dDxudW1iZXI+KERhdGVwaWNrZXJDb21wb25lbnQuREVGQVVMVF9NSU5VVEVfU1RFUCk7XG5cbiAgICAvKiogUXVhbmRvIGB0cnVlYCwgZXhpYmUgbyBjYW1wbyBkZSBzZWd1bmRvcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzaG93U2Vjb25kcyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBTZXBhcmFkb3IgZXhpYmlkbyBlbnRyZSBhcyBkYXRhcyBubyBtb2RvIGAncmFuZ2UnYC4gKi9cbiAgICByZWFkb25seSByYW5nZVNlcGFyYXRvciA9IGlucHV0PHN0cmluZz4oJyDigJQgJyk7XG5cbiAgICAvKiogQWJyZSBvIHBhaW5lbCBhbyBmb2NhciBvIGlucHV0OyBmb2NvIHBlcm1hbmVjZSBubyBpbnB1dCwgbsOjbyBwdWxhIHBhcmEgbyBkcm9wZG93bi4gKi9cbiAgICByZWFkb25seSBzaG93T25Gb2N1cyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqIEltcGVkZSBkaWdpdGHDp8OjbyBtYW51YWw7IHZhbG9yIHPDsyBwb2RlIHNlciBzZWxlY2lvbmFkbyBwZWxvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHJlYWRvbmx5SW5wdXQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogUHJpbWVpcm8gZGlhIGRhIHNlbWFuYSAoMCA9IGRvbWluZ28sIDEgPSBzZWd1bmRhLWZlaXJhLCAuLi4sIDYgPSBzw6FiYWRvKS4gKi9cbiAgICByZWFkb25seSBmaXJzdERheU9mV2VlayA9IGlucHV0PG51bWJlcj4oMCk7XG5cbiAgICAvKiogRXhpYmUvb2N1bHRhIGEgYmFycmEgZGUgYm90w7VlcyBIb2plIGUgTGltcGFyIG5vIHJvZGFww6kuICovXG4gICAgcmVhZG9ubHkgc2hvd0J1dHRvbkJhciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqIEV4aWJlIMOtY29uZSBkZSBsaW1wYXIgaW5saW5lIG5vIGNhbXBvIGRlIGlucHV0LiAqL1xuICAgIHJlYWRvbmx5IHNob3dDbGVhciA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBFeGliZSBkaWFzIGRlIG1lc2VzIGFkamFjZW50ZXMgbmEgZ3JhZGUgZG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgc2hvd090aGVyTW9udGhzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogUGVybWl0ZSBzZWxlY2lvbmFyIGRpYXMgZGUgbWVzZXMgYWRqYWNlbnRlcyBuYSBncmFkZSBkbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBzZWxlY3RPdGhlck1vbnRocyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBGZWNoYSBvIHBhaW5lbCBhcMOzcyBzZWxlY2lvbmFyIHVtYSBkYXRhIG5vIG1vZG8gYGRhdGV0aW1lYC4gKi9cbiAgICByZWFkb25seSBoaWRlT25EYXRlVGltZVNlbGVjdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBJbmNyZW1lbnRvIGRlIGhvcmFzIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHN0ZXBIb3VyID0gaW5wdXQ8bnVtYmVyPigxKTtcblxuICAgIC8qKiBJbmNyZW1lbnRvIGRlIHNlZ3VuZG9zIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHN0ZXBTZWNvbmQgPSBpbnB1dDxudW1iZXI+KDEpO1xuXG4gICAgLyoqIMONbmRpY2UgZGUgdGFiIGRvIGNhbXBvIGRlIGlucHV0LiAqL1xuICAgIHJlYWRvbmx5IHRhYmluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuXG4gICAgLyoqIEZvY2EgYXV0b21hdGljYW1lbnRlIG8gY2FtcG8gYW8gY2FycmVnYXIgbyBjb21wb25lbnRlLiAqL1xuICAgIHJlYWRvbmx5IGF1dG9mb2N1cyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBEYXRhcyBlc3BlY8OtZmljYXMgZGVzYWJpbGl0YWRhcyBubyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZERhdGVzID0gaW5wdXQ8RGF0ZVtdPihbXSk7XG5cbiAgICAvKiogRGlhcyBkYSBzZW1hbmEgZGVzYWJpbGl0YWRvcyAoMCA9IGRvbWluZ28sIC4uLiwgNiA9IHPDoWJhZG8pLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF5cyA9IGlucHV0PG51bWJlcltdPihbXSk7XG5cbiAgICAvLyDilIDilIAgVHdvLXdheSBtb2RlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICAvKiogRXN0YWRvIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLy8g4pSA4pSAIE91dHB1dHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyBwZXJkZSBvIGZvY28uICovXG4gICAgcmVhZG9ubHkgYmx1cnJlZCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHJlY2ViZSBvIGZvY28uICovXG4gICAgcmVhZG9ubHkgZm9jdXNlZCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIHNlbGVjaW9uYXIgdW1hIGRhdGEsIG3DqnMsIGhvcsOhcmlvIG91IGludGVydmFsby4gKi9cbiAgICByZWFkb25seSBzZWxlY3RlZCA9IG91dHB1dDxEYXRlcGlja2VyVmFsdWU+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgZG8gY2FsZW5kw6FyaW8gZmVjaGEuIEVtaXRlIG8gZWxlbWVudG8gZG8gcGFpbmVsLiAqL1xuICAgIHJlYWRvbmx5IGNsb3NlZCA9IG91dHB1dDxIVE1MRWxlbWVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIGNsaWNhciBubyBib3TDo28gXCJIb2plXCIuICovXG4gICAgcmVhZG9ubHkgdG9kYXlDbGljayA9IG91dHB1dDxEYXRlPigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkxpbXBhclwiIG91IG5vIMOtY29uZSBkZSBsaW1wYXIgaW5saW5lLiAqL1xuICAgIHJlYWRvbmx5IGNsZWFyQ2xpY2sgPSBvdXRwdXQ8TW91c2VFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIG3DqnMgdmlzdWFsaXphZG8gbXVkYS4gKi9cbiAgICByZWFkb25seSBtb250aENoYW5nZSA9IG91dHB1dDx7IG1vbnRoOiBudW1iZXI7IHllYXI6IG51bWJlciB9PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gYW5vIHZpc3VhbGl6YWRvIG11ZGEuICovXG4gICAgcmVhZG9ubHkgeWVhckNoYW5nZSA9IG91dHB1dDx7IG1vbnRoOiBudW1iZXI7IHllYXI6IG51bWJlciB9PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gcGFpbmVsIGRvIGNhbGVuZMOhcmlvIGFicmUuICovXG4gICAgcmVhZG9ubHkgc2hvdyA9IG91dHB1dDx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gZGlnaXRhIG1hbnVhbG1lbnRlIG5vIGNhbXBvLiAqL1xuICAgIHJlYWRvbmx5IHZhbHVlSW5wdXQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvLyDilIDilIAgSW50ZXJuYWwgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4SG91cnMgPSBEYXRlcGlja2VyQ29tcG9uZW50Lk1BWF9IT1VSUztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4TWludXRlcyA9IERhdGVwaWNrZXJDb21wb25lbnQuTUFYX01JTlVURVM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVJbnB1dE1heExlbmd0aCA9IDI7XG5cbiAgICBwcm90ZWN0ZWQgaW5wdXREYXRlID0gJyc7XG5cbiAgICBwcm90ZWN0ZWQgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWx1ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRm9jdXNlZCA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZpZXdEYXRlID0gc2lnbmFsKG5ldyBEYXRlKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwaWNrZXJWaWV3ID0gc2lnbmFsPFBpY2tlclZpZXc+KCdjYWxlbmRhcicpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBob3VycyA9IHNpZ25hbCgwKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWludXRlcyA9IHNpZ25hbCgwKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2Vjb25kcyA9IHNpZ25hbCgwKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmFuZ2VWYWx1ZSA9IHNpZ25hbDxEYXRlUmFuZ2UgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbXVsdGlwbGVWYWx1ZXMgPSBzaWduYWw8RGF0ZVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBlbmRpbmdSYW5nZVN0YXJ0ID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG92ZXJEYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9oYXNGb3JtYXRFcnJvciA9IGZhbHNlO1xuICAgIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9wdXBQYW5lbCA9IHZpZXdDaGlsZCgncG9wdXBQYW5lbCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluY3JlYXNlSG91ckJ1dHRvbiA9IHZpZXdDaGlsZCgnaW5jcmVhc2VIb3VyQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbkJ1dHRvbiA9IHZpZXdDaGlsZCgnaWNvbkJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyaWdnZXJJbnB1dCA9IHZpZXdDaGlsZC5yZXF1aXJlZCgndHJpZ2dlcklucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdEVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpdmVBbm5vdW5jZXIgPSBpbmplY3QoTGl2ZUFubm91bmNlcik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5nID0gc2lnbmFsKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG5cbiAgICAvKiogUmVmbGV0ZSBgKHBvaW50ZXI6IGNvYXJzZSlgIOKAlCBkaXNwb3NpdGl2b3MgdG91Y2ggcHJlZmVyZW0gbyBwb3B1cCBkbyBjYWxlbmTDoXJpbyBhbyB0ZWNsYWRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1RvdWNoRGV2aWNlID0gc2lnbmFsKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJykubWF0Y2hlc1xuICAgICAgICAgICAgOiBmYWxzZSxcbiAgICApO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWdtZW50RW5naW5lID0gbmV3IERhdGVTZWdtZW50RW5naW5lKCk7XG4gICAgLyoqIEVsZW1lbnRvIHF1ZSB0aW5oYSBmb2NvIGFudGVzIGRvIHBhaW5lbCBhYnJpciDigJQgdmVyIGBjYXB0dXJlRm9jdXNPcmlnaW5gL2BjbG9zZVBhbmVsYC4gKi9cbiAgICBwcml2YXRlIGVsZW1lbnRUb1Jlc3RvcmVGb2N1c1RvOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIC8qKiBgdHJ1ZWAgc8OzIGR1cmFudGUgbyBgLmZvY3VzKClgIHByb2dyYW3DoXRpY28gZGUgcmVzdGF1cmHDp8OjbyBlbSBgY2xvc2VQYW5lbCgpYCDigJQgZXZpdGEgcXVlXG4gICAgICogIGBoYW5kbGVJbnB1dEZvY3VzYCBpbnRlcnByZXRlIGVzc2UgZm9jbyBjb21vIHVtIGZvY28gZ2VudcOtbm8gZG8gdXN1w6FyaW8gZSByZWFicmEgbyBwYWluZWxcbiAgICAgKiAgbmEgaG9yYSB2aWEgYHNob3dPbkZvY3VzYCAoZXguOiBzZWxlY2lvbmFyIHVtYSBkYXRhIGRldm9sdmUgbyBmb2NvIHBybyBpbnB1dCwgcXVlIHNlbsOjb1xuICAgICAqICByZWFicmlyaWEgbyBwYWluZWwgaW1lZGlhdGFtZW50ZSBkZXBvaXMgZGUgZmVjaMOhLWxvKS4gKi9cbiAgICBwcml2YXRlIGlzUmVzdG9yaW5nRm9jdXNPbkNsb3NlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U2VnbWVudENvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbWVhc3VyZUNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIC8qKiBJbmNyZW1lbnRhZG8gYSBjYWRhIG11dGHDp8OjbyBkbyB1c3XDoXJpbyDigJQgaW52YWxpZGEgY2FsbGJhY2tzIGRlIGNsaXF1ZS9mb2NvIGFkaWFkb3MgcXVlIGZpY2FyYW0gb2Jzb2xldG9zLiAqL1xuICAgIHByaXZhdGUgaW50ZXJhY3Rpb25HZW5lcmF0aW9uID0gMDtcbiAgICAvKiogYHRpbWVTdGFtcGAgZG8gw7psdGltbyBtb3VzZWRvd24gbm8gaW5wdXQgc2VnbWVudGFkbyDigJQgdXNhZG8gcHJhIGRldGVjdGFyIGR1cGxvIGNsaXF1ZSBuYSBtw6NvLiAqL1xuICAgIHByaXZhdGUgbGFzdE1vdXNlRG93bkF0ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmcuc2V0KGV2ZW50LmxhbmcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQb2ludGVyQ2hhbmdlID0gKGV2ZW50OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KTogdm9pZCA9PiB0aGlzLmlzVG91Y2hEZXZpY2Uuc2V0KGV2ZW50Lm1hdGNoZXMpO1xuICAgICAgICAgICAgbWVkaWFRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gbWVkaWFRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgQ29tcHV0ZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRJY29uID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMubW9kZSgpID09PSAndGltZScgPyAnZmFzIGZhLWNsb2NrJyA6IHRoaXMuaWNvbigpKSk7XG5cbiAgICAvKiogYGRhdGVGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYGRkL01NL3l5eXlgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWREYXRlRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQoKSA/P1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVfZm9ybWF0JywgJ2RkL01NL3l5eXknKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLyoqIGBob3VyRm9ybWF0YCBleHBsw61jaXRvIG91IHJlc29sdmlkbyBhIHBhcnRpciBkbyBsb2NhbGUgYXRpdm8gKGZhbGxiYWNrIGAnMjQnYCkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkSG91ckZvcm1hdCA9IGNvbXB1dGVkPCcxMicgfCAnMjQnPigoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLmhvdXJGb3JtYXQoKTtcbiAgICAgICAgaWYgKGV4cGxpY2l0KSByZXR1cm4gZXhwbGljaXQ7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXQnLCAnMjQnKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQgPT09ICcxMicgPyAnMTInIDogJzI0JztcbiAgICB9KTtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNFR01FTlRfTEFCRUxfS0VZUzogUmVjb3JkPFNlZ21lbnRLaW5kLCBzdHJpbmc+ID0ge1xuICAgICAgICBkYXk6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X2RheScsXG4gICAgICAgIG1vbnRoOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VnbWVudF9tb250aCcsXG4gICAgICAgIHllYXI6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X3llYXInLFxuICAgICAgICBob3VyOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaG91cicsXG4gICAgICAgIG1pbnV0ZTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScsXG4gICAgICAgIHNlY29uZDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlY29uZCcsXG4gICAgICAgIGFtcG06ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X2FtcG0nLFxuICAgIH07XG5cbiAgICAvKiogTW9kb3MgY3VqbyBmb3JtYXRvIGRlIGV4aWJpw6fDo28gw6kgcmVzb2x2aWRvIHBlbGEgZW5naW5lIGRlIHNlZ21lbnRvcyAoaW5kZXBlbmRlbnRlIGRlIHRvdWNoL3JlYWRvbmx5KS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5tb2RlKCk7XG4gICAgICAgIHJldHVybiBtb2RlID09PSAnZGF0ZScgfHwgbW9kZSA9PT0gJ21vbnRoJyB8fCBtb2RlID09PSAndGltZScgfHwgbW9kZSA9PT0gJ2RhdGV0aW1lJztcbiAgICB9KTtcblxuICAgIC8qKiBJbnRlcmF0aXZpZGFkZSBkZSBkaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8g4oCUIGRlc2xpZ2FkYSBlbSB0b3VjaCBvdSBxdWFuZG8gYHJlYWRvbmx5SW5wdXRgIMOpIHVzYWRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRlZE1vZGUgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT4gdGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkgJiYgIXRoaXMuaXNUb3VjaERldmljZSgpICYmICF0aGlzLnJlYWRvbmx5SW5wdXQoKSxcbiAgICApO1xuXG4gICAgLyoqIEluZGljYSBzZSBvIHRpbWUgcGlja2VyIGRldmUgdXNhciBvIGZvcm1hdG8gZGUgMTIgaG9yYXMgY29tIHNlbGV0b3IgQU0vUE0uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzMTJIb3VyRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSA9PT0gJzEyJyk7XG5cbiAgICAvKiogSG9yYSBleGliaWRhIG5vIHRpbWUgcGlja2VyOiAx4oCTMTIgbm8gZm9ybWF0byAxMmgsIDDigJMyMyBubyBmb3JtYXRvIDI0aC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcGxheUhvdXJzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kaXNwbGF5SG91ckZvcih0aGlzLmhvdXJzKCkpKTtcblxuICAgIC8qKiBNZXJpZGlhbm8gYXR1YWwgZGVyaXZhZG8gZGEgaG9yYSBpbnRlcm5hICgw4oCTMjMpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhbVBtID0gY29tcHV0ZWQ8J0FNJyB8ICdQTSc+KCgpID0+IHRoaXMubWVyaWRpZW1Gb3IodGhpcy5ob3VycygpKSk7XG5cbiAgICBwcml2YXRlIGRpc3BsYXlIb3VyRm9yKGhvdXJzMjQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5pczEySG91ckZvcm1hdCgpKSByZXR1cm4gaG91cnMyNDtcbiAgICAgICAgY29uc3QgaDEyID0gaG91cnMyNCAlIERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICByZXR1cm4gaDEyID09PSAwID8gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gOiBoMTI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZXJpZGllbUZvcihob3VyczI0OiBudW1iZXIpOiAnQU0nIHwgJ1BNJyB7XG4gICAgICAgIHJldHVybiBob3VyczI0IDwgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gPyAnQU0nIDogJ1BNJztcbiAgICB9XG5cbiAgICAvKiogVGV4dG8gKGNvbSBBTS9QTSBxdWFuZG8gYXBsaWPDoXZlbCkgZGEgaG9yYSBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcImF1bWVudGFyXCIvXCJkaW1pbnVpciBob3JhXCJcbiAgICAgKiAg4oCUIG1lc21hIG1vdGl2YcOnw6NvIGRlIGBwcmV2TW9udGhUYXJnZXRgL2BuZXh0TW9udGhUYXJnZXRgL2BwcmV2WWVhclRhcmdldGAvYG5leHRZZWFyVGFyZ2V0YDpcbiAgICAgKiAgc2VtIGlzc28sIG8gYm90w6NvIHPDsyBkaXogXCJhdW1lbnRhciBob3JhXCIsIHNlbSBkaXplciBxdWFsIGhvcmEgdmFpIHJlc3VsdGFyLiAqL1xuICAgIHByaXZhdGUgZm9ybWF0SG91clRhcmdldChob3VyczI0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYWRkZWQgPSB0aGlzLnBhZFRpbWUodGhpcy5kaXNwbGF5SG91ckZvcihob3VyczI0KSk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzMTJIb3VyRm9ybWF0KCkgPyBgJHtwYWRkZWR9ICR7dGhpcy5tZXJpZGllbUZvcihob3VyczI0KX1gIDogcGFkZGVkO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2SG91clRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMuZm9ybWF0SG91clRhcmdldCgodGhpcy5ob3VycygpIC0gdGhpcy5zdGVwSG91cigpICsgdGhpcy5tYXhIb3VycykgJSB0aGlzLm1heEhvdXJzKSxcbiAgICApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0SG91clRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMuZm9ybWF0SG91clRhcmdldCgodGhpcy5ob3VycygpICsgdGhpcy5zdGVwSG91cigpKSAlIHRoaXMubWF4SG91cnMpLFxuICAgICk7XG5cbiAgICAvKiogTWVzbWEgbW90aXZhw6fDo28sIHBhcmEgb3MgYm90w7VlcyBkZSBtaW51dG8vc2VndW5kby9BTS1QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldk1pbnV0ZVRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMucGFkVGltZSgodGhpcy5taW51dGVzKCkgLSB0aGlzLm1pbnV0ZVN0ZXAoKSArIHRoaXMubWF4TWludXRlcykgJSB0aGlzLm1heE1pbnV0ZXMpLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRNaW51dGVUYXJnZXQgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLnBhZFRpbWUoKHRoaXMubWludXRlcygpICsgdGhpcy5taW51dGVTdGVwKCkpICUgdGhpcy5tYXhNaW51dGVzKSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZTZWNvbmRUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZFRpbWUoKHRoaXMuc2Vjb25kcygpIC0gdGhpcy5zdGVwU2Vjb25kKCkgKyA2MCkgJSA2MCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0U2Vjb25kVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYWRUaW1lKCh0aGlzLnNlY29uZHMoKSArIHRoaXMuc3RlcFNlY29uZCgpKSAlIDYwKSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dE1lcmlkaWVtVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuYW1QbSgpID09PSAnQU0nID8gJ1BNJyA6ICdBTScpKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IDQgfSxcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnYm90dG9tJywgb2Zmc2V0WTogLTQgfSxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvcHVwSWQgPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLmlucHV0SWQoKX0tcG9wdXBgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50TW9udGhJbmRleCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRNb250aCgpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudFllYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpZXdEYXRlKCkuZ2V0RnVsbFllYXIoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEtleSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubW9udGhLZXlzW3RoaXMuY3VycmVudE1vbnRoSW5kZXgoKV0pO1xuXG4gICAgLyoqIEFubyBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcImFubyBhbnRlcmlvclwiL1wicHLDs3hpbW8gYW5vXCIgKHZpZXcgZGUgbWVzZXMpIOKAlCBwcm8gYXJpYS1sYWJlbFxuICAgICAqICBhbnVuY2lhciBwcmEgb25kZSBvIGJvdMOjbyB2YWksIGrDoSBxdWUgXCJBbm8gYW50ZXJpb3JcIiBzb3ppbmhvIG7Do28gZGl6IHF1YWwgYW5vIMOpIGVzc2UuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZZZWFyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50WWVhcigpIC0gMSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRZZWFyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50WWVhcigpICsgMSk7XG5cbiAgICAvKiogTcOqcy9hbm8gZGUgZGVzdGlubyBkbyBib3TDo28gXCJtw6pzIGFudGVyaW9yXCIvXCJwcsOzeGltbyBtw6pzXCIgKHZpZXcgZGUgY2FsZW5kw6FyaW8pIOKAlCBtZXNtYVxuICAgICAqICBtb3RpdmHDp8OjbyBkZSBgcHJldlllYXJUYXJnZXRgL2BuZXh0WWVhclRhcmdldGA6IFwiTcOqcyBhbnRlcmlvclwiIHNvemluaG8gbsOjbyBkaXogcXVhbCBtw6pzIMOpXG4gICAgICogIGVzc2UsIGUgY3J1emFyIGEgZnJvbnRlaXJhIGRvIGFubyAoZXguOiBqYW5laXJvIOKGkiBkZXplbWJybyBkbyBhbm8gYW50ZXJpb3IpIHRvcm5hcmlhIGVzc2FcbiAgICAgKiAgZmFsdGEgZGUgY29udGV4dG8gYWluZGEgbWFpcyBjb25mdXNhIHNlbSBvIGFubyBqdW50by4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldk1vbnRoVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmN1cnJlbnRMYW5nKCksIHsgbW9udGg6ICdsb25nJywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgIH0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0TW9udGhUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0NhbGVuZGFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgIT09ICd0aW1lJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dUaW1lUGlja2VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgPT09ICdkYXRldGltZScgfHwgdGhpcy5tb2RlKCkgPT09ICd0aW1lJyk7XG5cbiAgICAvKiogU2VsZcOnw6NvIG3Dumx0aXBsYSBhdGl2YTogYXBlbmFzIG5vIG1vZG8gYGRhdGVgIGNvbSBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc011bHRpcGxlTW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnICYmIHRoaXMubW9kZSgpID09PSAnZGF0ZScpO1xuXG4gICAgLyoqIEluc3RydcOnw6NvIGxpZGEganVudG8gZG8gcsOzdHVsbyBkYSBncmFkZSBkZSBkaWFzIOKAlCBjYWRhIG1vZG8gY29tIHNlbcOibnRpY2EgZGUgc2VsZcOnw6NvIG7Do29cbiAgICAgKiAgw7NidmlhIChtw7psdGlwbGEsIGludGVydmFsbykgZ2FuaGEgdW1hIGZyYXNlIHByw7NwcmlhOyBgcmFuZ2VgIGFpbmRhIHNlIGRpdmlkZSBlbSBkdWFzIGZhc2VzXG4gICAgICogIChlc2NvbGhlbmRvIGluw61jaW8gdnMuIGrDoSBjb20gYHBlbmRpbmdSYW5nZVN0YXJ0YCwgZXNjb2xoZW5kbyBmaW0pLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxlbmRhckdyaWRBcmlhTGFiZWxLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWxfbXVsdGlwbGUnO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KClcbiAgICAgICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jYWxlbmRhcl9sYWJlbF9yYW5nZV9wZW5kaW5nJ1xuICAgICAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NhbGVuZGFyX2xhYmVsX3JhbmdlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NhbGVuZGFyX2xhYmVsJztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcmRlcmVkV2Vla0RheUtleXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maXJzdERheU9mV2VlaygpO1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMud2Vla0RheUtleXMuc2xpY2Uoc3RhcnQpLCAuLi50aGlzLndlZWtEYXlLZXlzLnNsaWNlKDAsIHN0YXJ0KV07XG4gICAgfSk7XG5cbiAgICAvKiogQ2llbnRlIGRhIGZhc2UgZGUgc2VsZcOnw6NvIGVtIGByYW5nZWA6IGVucXVhbnRvIG7Do28gaMOhIGBwZW5kaW5nUmFuZ2VTdGFydGAsIMOpIGEgbWVzbWEgY2hhdmVcbiAgICAgKiAgZGUgc2VtcHJlIChcInNlbGVjaW9uYXIgaW50ZXJ2YWxvXCIpOyBkZXBvaXMgZG8gcHJpbWVpcm8gY2xpcXVlLCBtdWRhIHByYSB1bWEgY2hhdmUgcXVlIGNpdGFcbiAgICAgKiAgYSBkYXRhIGluaWNpYWwgasOhIGVzY29saGlkYSwgasOhIHF1ZSByZWFicmlyL3JlZW50cmFyIG5vIGRpw6Fsb2dvIG5lc3NlIG1laW8tdGVtcG8gbsOjbyBkYXZhXG4gICAgICogIG5lbmh1bWEgcGlzdGEgZGUgcXVlIGEgc2VndW5kYSBtZXRhZGUgZG8gZmx1eG8gZXJhIGEgcXVlIGZhbHRhdmEuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpYWxvZ0FyaWFMYWJlbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpICE9PSAncmFuZ2UnKSByZXR1cm4gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9kYXRlJztcbiAgICAgICAgcmV0dXJuIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKVxuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlX2VuZCdcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9yYW5nZSc7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nQXJpYUxhYmVsUGFyYW1zID0gY29tcHV0ZWQ8eyBkYXRlPzogc3RyaW5nIH0+KCgpID0+IHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcgPyB7IGRhdGU6IHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKHBlbmRpbmcpIH0gOiB7fTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVN0YXR1c0VsZW1lbnRJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1yYW5nZS1zdGF0dXNgKTtcblxuICAgIC8qKiBUZXh0byBkbyBgPHNwYW4+YCBgc3Itb25seWAgcmVmZXJlbmNpYWRvIHBvciBgYXJpYS1kZXNjcmliZWRieWAgbm8gYDxpbnB1dD5gIOKAlCBkw6EgYW8gY2FtcG9cbiAgICAgKiAgdW0gY29udGXDumRvIHBlcnNpc3RlbnRlIGUgYWNlc3PDrXZlbCBlbnF1YW50byBzw7MgYSBkYXRhIGluaWNpYWwgZG8gaW50ZXJ2YWxvIGZvaSBlc2NvbGhpZGEsXG4gICAgICogIGrDoSBxdWUgYGlucHV0RGF0ZWAgc8OzIHJlZmxldGUgbyB2YWxvciBjb21wbGV0byBkZXBvaXMgZGEgc2VndW5kYSBlc2NvbGhhIChhIGF0dWFsaXphw6fDo29cbiAgICAgKiAgcGFyY2lhbCBlbSBgc2VsZWN0RGF0ZSgpYCBjb2JyZSBvIHRleHRvIHZpc8OtdmVsOyBpc3RvIGNvYnJlIG8gcXVlIHVtIGxlaXRvciBkZSB0ZWxhIGzDqiBhb1xuICAgICAqICBmb2Nhci9yZWxlciBvIGNhbXBvKS4gVXNhIGBhcmlhLWRlc2NyaWJlZGJ5YCwgbsOjbyBgYXJpYS1sYWJlbGAsIHByYSBzw7MgQUNSRVNDRU5UQVJcbiAgICAgKiAgaW5mb3JtYcOnw6NvIHNlbSBzb2JyZXNjcmV2ZXIgbyBub21lIGFjZXNzw612ZWwgcXVlIGludGVncmHDp8O1ZXMgKGR5bmFtaWMtZm9ybSwgc2hvd2Nhc2UpXG4gICAgICogIGrDoSBjb250cm9sYW0gcG9yIGZvcmEgZG8gY29tcG9uZW50ZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmFuZ2VQZW5kaW5nU3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpICE9PSAncmFuZ2UnKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgIHJldHVybiBwZW5kaW5nID8gdGhpcy5idWlsZFJhbmdlU3RhcnRTZWxlY3RlZFRleHQocGVuZGluZykgOiAnJztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwbGFjZWhvbGRlcktleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMubW9kZSgpO1xuICAgICAgICByZXR1cm4gYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3BsYWNlaG9sZGVyXyR7bW9kZX1gO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGVmZmVjdGl2ZVJhbmdlID0gY29tcHV0ZWQoKCk6IHsgc3RhcnQ6IERhdGUgfCBudWxsOyBlbmQ6IERhdGUgfCBudWxsIH0gPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICBjb25zdCBob3ZlciA9IHRoaXMuaG92ZXJEYXRlKCk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICBpZiAoaG92ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBwZW5kaW5nLmdldFRpbWUoKSA8PSBob3Zlci5nZXRUaW1lKCkgPyBbcGVuZGluZywgaG92ZXJdIDogW2hvdmVyLCBwZW5kaW5nXTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogcGVuZGluZywgZW5kOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VWYWx1ZSgpID8/IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbGVuZGFyV2Vla3MgPSBjb21wdXRlZCgoKTogQ2FsZW5kYXJEYXlbXVtdID0+IHtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRNb250aEluZGV4KCk7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5lZmZlY3RpdmVSYW5nZSgpO1xuICAgICAgICBjb25zdCByYW5nZVN0YXJ0VGltZSA9IHJhbmdlLnN0YXJ0ID8gc3RyaXBUaW1lKHJhbmdlLnN0YXJ0KSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJhbmdlRW5kVGltZSA9IHJhbmdlLmVuZCA/IHN0cmlwVGltZShyYW5nZS5lbmQpIDogbnVsbDtcblxuICAgICAgICBjb25zdCBmaXJzdERheU9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0V2Vla0RheSA9IGZpcnN0RGF5T2ZNb250aC5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRTdGFydERheSA9IChzdGFydFdlZWtEYXkgLSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCkgKyA3KSAlIDc7XG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XG4gICAgICAgIGNvbnN0IGRheXNJblByZXZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG5cbiAgICAgICAgY29uc3QgYWxsRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBhZGp1c3RlZFN0YXJ0RGF5IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheXNJblByZXZNb250aCAtIGkpO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCBmYWxzZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgZCA9IDE7IGQgPD0gZGF5c0luTW9udGg7IGQrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkKTtcbiAgICAgICAgICAgIGFsbERheXMucHVzaCh0aGlzLmJ1aWxkQ2FsZW5kYXJEYXkoZGF0ZSwgdHJ1ZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxDZWxscyA9XG4gICAgICAgICAgICBNYXRoLmNlaWwoYWxsRGF5cy5sZW5ndGggLyBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSykgKiBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgbGV0IG5leHREYXkgPSAxO1xuICAgICAgICB3aGlsZSAoYWxsRGF5cy5sZW5ndGggPCB0b3RhbENlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCBuZXh0RGF5KTtcbiAgICAgICAgICAgIG5leHREYXkrKztcbiAgICAgICAgICAgIGFsbERheXMucHVzaCh0aGlzLmJ1aWxkQ2FsZW5kYXJEYXkoZGF0ZSwgZmFsc2UsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdlZWtzOiBDYWxlbmRhckRheVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxEYXlzLmxlbmd0aDsgaSArPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSykge1xuICAgICAgICAgICAgd2Vla3MucHVzaChhbGxEYXlzLnNsaWNlKGksIGkgKyBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrcztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtb250aHNHcmlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyBpbmRleDogbnVtYmVyIH1bXVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRGF0ZXBpY2tlckNvbXBvbmVudC5NT05USFNfSU5fWUVBUjsgaSArPSBEYXRlcGlja2VyQ29tcG9uZW50Lk1PTlRIU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW1xuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpXSwgaW5kZXg6IGkgfSxcbiAgICAgICAgICAgICAgICB7IGtleTogdGhpcy5tb250aEtleXNbaSArIDFdLCBpbmRleDogaSArIDEgfSxcbiAgICAgICAgICAgICAgICB7IGtleTogdGhpcy5tb250aEtleXNbaSArIDJdLCBpbmRleDogaSArIDIgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnREZWNhZGVTdGFydCA9IGNvbXB1dGVkKCgpID0+IE1hdGguZmxvb3IodGhpcy5jdXJyZW50WWVhcigpIC8gMTApICogMTApO1xuXG4gICAgLyoqIEludGVydmFsbyBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcImTDqWNhZGEgYW50ZXJpb3JcIi9cInByw7N4aW1hIGTDqWNhZGFcIiAodmlldyBkZSBhbm9zKSDigJQgbWVzbWFcbiAgICAgKiAgbW90aXZhw6fDo28gZGUgYHByZXZZZWFyVGFyZ2V0YC9gbmV4dFllYXJUYXJnZXRgLiBgbmF2aWdhdGVQcmV2YC9gbmF2aWdhdGVOZXh0YCBkZXNsb2NhbVxuICAgICAqICBgdmlld0RhdGVgIGVtIMKxMTAgYW5vcyAobsOjbyDCsTEyKSBuZXNzYSB2aWV3OyBvIGdyaWQgZXhpYmlkbyDDqSBxdWUgbW9zdHJhIDEyIGFub3MgcG9yXG4gICAgICogIHDDoWdpbmEgKHZlciBgeWVhcnNHcmlkYCkg4oCUIGRhw60gbyBpbnRlcnZhbG8gaXIgZGUgYGN1cnJlbnREZWNhZGVTdGFydCgpIMKxIDEwYCBhdMOpXG4gICAgICogIGArIDExYCBwcmEgYmF0ZXIgZXhhdGFtZW50ZSBjb20gYSBww6FnaW5hIHF1ZSBvIGNsaXF1ZSByZWFsbWVudGUgYWJyZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldkRlY2FkZVJhbmdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgLSAxMDtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnRZZWFyOiBzdGFydCwgZW5kWWVhcjogc3RhcnQgKyAxMSB9O1xuICAgIH0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0RGVjYWRlUmFuZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIDEwO1xuICAgICAgICByZXR1cm4geyBzdGFydFllYXI6IHN0YXJ0LCBlbmRZZWFyOiBzdGFydCArIDExIH07XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgeWVhcnNHcmlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IHJvd3M6IG51bWJlcltdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX1JPVykge1xuICAgICAgICAgICAgcm93cy5wdXNoKFtzdGFydCArIGksIHN0YXJ0ICsgaSArIDEsIHN0YXJ0ICsgaSArIDJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmICghbWluKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgPD0gbWluLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXcuZ2V0RnVsbFllYXIoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdmlldy5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkgfHxcbiAgICAgICAgICAgICh2aWV3LmdldEZ1bGxZZWFyKCkgPT09IG1pbi5nZXRGdWxsWWVhcigpICYmIHZpZXcuZ2V0TW9udGgoKSA8PSBtaW4uZ2V0TW9udGgoKSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmICghbWF4KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgKyBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEIC0gMSA+PSBtYXguZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPiBtYXguZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpID49IG1heC5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSAIFRyYW5zbGF0aW9uIGtleXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2Vla0RheUtleXMgPSBbXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc3VuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9tb24nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3R1ZScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfd2VkJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV90aHUnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X2ZyaScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc2F0JyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoS2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2phbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9mZWInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfbWFyJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2FwcicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXknLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2p1bCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9hdWcnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfc2VwJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX29jdCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9ub3YnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfZGVjJyxcbiAgICBdO1xuXG4gICAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwsIHsgc2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kZWZhdWx0RGF0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChkICYmICF0aGlzLnZhbHVlKCkgJiYgIXRoaXMucmFuZ2VWYWx1ZSgpICYmIHRoaXMubXVsdGlwbGVWYWx1ZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLy8g4pSA4pSAIENvbnRyb2xWYWx1ZUFjY2Vzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IERhdGVwaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udmFsdWVdLnNvcnQoKGEsIGIpID0+IGEuZ2V0VGltZSgpIC0gYi5nZXRUaW1lKCkpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZVZhbHVlcy5zZXQoc29ydGVkKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHNvcnRlZCk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IHNvcnRlZFswXTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGZpcnN0LmdldEZ1bGxZZWFyKCksIGZpcnN0LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmFsdWUuc3RhcnQuZ2V0RnVsbFllYXIoKSwgdmFsdWUuc3RhcnQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KHZhbHVlIGFzIERhdGUpO1xuICAgICAgICBjb25zdCBkID0gdmFsdWUgYXMgRGF0ZTtcbiAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB0aGlzLmhvdXJzLnNldChkLmdldEhvdXJzKCkpO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldChkLmdldFNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFZhbGlkYXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGxldCB2YWx1ZTogRGF0ZXBpY2tlclZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJhbmdlVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFB1YmxpYyBhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYXB0dXJlRm9jdXNPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVPcGVuVmlldygpO1xuICAgICAgICB0aGlzLnNob3cuZW1pdCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGFuZWxBZnRlck9wZW4oKTtcbiAgICB9XG5cbiAgICAvKiogQWJyZSBvIHBhaW5lbCBzZW0gdHJhbnNmZXJpciBvIGZvY28gcG9yIHBhZHLDo28gKHVzYWRvIHBlbG8gc2hvd09uRm9jdXMpLiBFbSBtb2RvcyBzZW1cbiAgICAgKiAgZGlnaXRhw6fDo28gcG9yIHNlZ21lbnRvIChtdWx0aXBsZS9yYW5nZS95ZWFyL3RvdWNoKSBvIGZvY28gc2VndWUgcHJvIGNhbGVuZMOhcmlvIGlndWFsIGVtXG4gICAgICogIG9wZW4oKTsgZW0gbW9kbyBzZWdtZW50YWRvIG8gZm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQgcHJhIGNvbnRpbnVhciBkaWdpdGFuZG8uICovXG4gICAgcHJpdmF0ZSBvcGVuT25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLmlzT3BlbigpKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FwdHVyZUZvY3VzT3JpZ2luKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlT3BlblZpZXcoKTtcbiAgICAgICAgdGhpcy5zaG93LmVtaXQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzUGFuZWxBZnRlck9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNQYW5lbEFmdGVyT3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLmluY3JlYXNlSG91ckJ1dHRvbigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCksIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogR3VhcmRhIG8gZWxlbWVudG8gZm9jYWRvIG5vIG1vbWVudG8gZW0gcXVlIG8gcGFpbmVsIGFicmUsIHByYSBkZXZvbHZlciBvIGZvY28gcHJhIGzDoSBhb1xuICAgICAqICBmZWNoYXIgZW0gdmV6IGRlIHNlbXByZSBmb3LDp2FyIHBybyBib3TDo28gZG8gw61jb25lIOKAlCB2ZXIgYGNsb3NlUGFuZWwoKWAuICovXG4gICAgcHJpdmF0ZSBjYXB0dXJlRm9jdXNPcmlnaW4oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudFRvUmVzdG9yZUZvY3VzVG8gPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgYSB2aWV3IGluaWNpYWwgZG8gcGFpbmVsIGUgcG9zaWNpb25hIG8gY2FsZW5kw6FyaW8gbm8gYGRlZmF1bHREYXRlYFxuICAgICAqIHF1YW5kbyBuZW5odW0gdmFsb3IgZXN0w6Egc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlT3BlblZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZVZhbHVlKCk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiByYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgICAgIC8vIFJlYWJyaXIgdW0gaW50ZXJ2YWxvIGrDoSBkZWZpbmlkbyBwcmVjaXNhIGNhaXIgc2VtcHJlIG5vIG3DqnMgZG8gaW7DrWNpbyDigJQgc2Vuw6NvXG4gICAgICAgICAgICAvLyBgdmlld0RhdGVgIGZpY2Egb25kZSB1bWEgbmF2ZWdhw6fDo28gYW50ZXJpb3IgcGFyb3UgcG9yIGFjYXNvIChleC46IGNydXphciBtw6pzIGFvXG4gICAgICAgICAgICAvLyBlc2NvbGhlciBvIGZpbSksIGUgYGZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KClgIChwcmltZWlybyBgW2RhdGEtZm9jdXM9XCJzZWxlY3RlZFwiXWBcbiAgICAgICAgICAgIC8vIGVtIG9yZGVtIGRlIERPTSkgYWNhYmEgZm9jYW5kbyBvIGZpbSBvdSBuZW5odW1hIGPDqWx1bGEsIGRlcGVuZGVuZG8gZGUgcXVhbCBtw6pzXG4gICAgICAgICAgICAvLyBjYWxoYSBkZSBlc3RhciBlbSBleGliacOnw6NvLlxuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUocmFuZ2Uuc3RhcnQuZ2V0RnVsbFllYXIoKSwgcmFuZ2Uuc3RhcnQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdERhdGUgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdERhdGUgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkZWZhdWx0RGF0ZS5nZXRGdWxsWWVhcigpLCBkZWZhdWx0RGF0ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdtb250aHMnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCd5ZWFycycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnY2FsZW5kYXInKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTogdm9pZCB7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICghcGFuZWwpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZIZWFkZXJUYXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ2NhbGVuZGFyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1uYXYtaGVhZGVyXSBidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgbmF2SGVhZGVyVGFyZ2V0ID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwidG9kYXlcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIFplcmEgbyBlc3RhZG8gZGUgaW50ZXJ2YWxvIGVtIGFuZGFtZW50byDigJQgdXNhZG8gdGFudG8gcGVsbyBmZWNoYW1lbnRvIHRvdGFsIGRvIHBhaW5lbFxuICAgICAqICAoYGNsb3NlUGFuZWxgLCBvbmRlIG7Do28gZmF6IHNlbnRpZG8gYW51bmNpYXIgbmFkYSBwb3JxdWUgbyBkacOhbG9nbyBpbnRlaXJvIGVzdMOhIHN1bWluZG8pXG4gICAgICogIHF1YW50byBwZWxvIGNhbmNlbGFtZW50byBsZXZlIHZpYSBFc2NhcGUgZGVudHJvIGRhIGdyYWRlIChgY2FuY2VsUGVuZGluZ1JhbmdlU3RhcnRgKSwgcXVlXG4gICAgICogIG1hbnTDqW0gbyBwYWluZWwgYWJlcnRvIGUgcG9yIGlzc28gYW51bmNpYSBhIG11ZGFuw6dhIHNlcGFyYWRhbWVudGUuICovXG4gICAgcHJpdmF0ZSByZXNldFBlbmRpbmdSYW5nZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICB9XG5cbiAgICAvKiogQ2FuY2VsYW1lbnRvIGxldmUgZGUgdW1hIHNlbGXDp8OjbyBkZSBpbnRlcnZhbG8gZW0gYW5kYW1lbnRvICh2ZXIgYGhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd25gLFxuICAgICAqICB0ZWNsYSBFc2NhcGUpIOKAlCBhbyBjb250csOhcmlvIGRlIGBjbG9zZVBhbmVsYCwgbyBwYWluZWwgY29udGludWEgYWJlcnRvLCBlbnTDo28gYXF1aSBmYXpcbiAgICAgKiAgc2VudGlkbyBhbnVuY2lhciBhIG11ZGFuw6dhIGRlIGVzdGFkby4gKi9cbiAgICBwcml2YXRlIGNhbmNlbFBlbmRpbmdSYW5nZVN0YXJ0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2V0UGVuZGluZ1JhbmdlU2VsZWN0aW9uKCk7XG4gICAgICAgIC8vIEEgZXNjb2xoYSBkbyBpbsOtY2lvIChyYW1vIGAhcGVuZGluZ2AgZGUgc2VsZWN0RGF0ZSgpKSBncmF2YSBvIGluw61jaW8gcGVuZGVudGUgZW1cbiAgICAgICAgLy8gYGlucHV0RGF0ZWAgcHJhIG7Do28gZGVpeGFyIG8gY2FtcG8gb2Jzb2xldG8gZHVyYW50ZSBhIHNlbGXDp8OjbyBwYXJjaWFsICh2ZXIgc2VsZWN0RGF0ZSgpKVxuICAgICAgICAvLyDigJQgY2FuY2VsYXIgZXNzYSBlc2NvbGhhIHByZWNpc2EgZGVzZmF6ZXIgaXNzbyB0YW1iw6ltLCB2b2x0YW5kbyBwcm8gaW50ZXJ2YWxvIGrDoVxuICAgICAgICAvLyBjb25maXJtYWRvIChvdSB2YXppbywgc2UgbmVuaHVtKSDigJQgdGVzdGFkbyBtYW51YWxtZW50ZSB2aWEgZGV2dG9vbHM6IHNlbSBlc3RhIGxpbmhhLCBvXG4gICAgICAgIC8vIGNhbXBvIGZpY2F2YSBwcmVzbyBtb3N0cmFuZG8gYSBkYXRhIHBlbmRlbnRlIGRlc2NhcnRhZGEgbWVzbW8gY29tIG8gaW50ZXJ2YWxvIGFudGlnb1xuICAgICAgICAvLyBhaW5kYSBkZXN0YWNhZG8gbm8gY2FsZW5kw6FyaW8uXG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHRoaXMucmFuZ2VWYWx1ZSgpKTtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UoXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc2VsZWN0aW9uX2NhbmNlbGxlZCcpLFxuICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNsb3NlUGFuZWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsRWxlbWVudCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnJlc2V0UGVuZGluZ1JhbmdlU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHBhbmVsRWxlbWVudCA/PyAodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KSk7XG5cbiAgICAgICAgLy8gU8OzIGZvcsOnYSBvIGZvY28gcHJhIG91dHJvIGx1Z2FyIHNlIGVsZSBlc3RpdmVyIGRlbnRybyBkbyBwYWluZWwgcXVlIGVzdMOhIHNlbmRvIGZlY2hhZG9cbiAgICAgICAgLy8gKHNlbsOjbyBvIHVzdcOhcmlvIGZpY2FyaWEgY29tIGZvY28gXCJwcmVzb1wiIG51bSBlbGVtZW50byBxdWUgZXN0w6EgcHJlc3RlcyBhIHN1bWlyIGRvIERPTSkuXG4gICAgICAgIC8vIFNlIG8gZm9jbyBqw6EgZXN0w6EgZW0gb3V0cm8gbHVnYXIg4oCUIGV4LjogbyBwcsOzcHJpbyBpbnB1dCBzZWdtZW50YWRvLCBxdWUgYWJyaXUgbyBwYWluZWxcbiAgICAgICAgLy8gdmlhIGBvcGVuT25Gb2N1c2AgZSBudW5jYSBjaGVnb3UgYSBwZXJkZXIgbyBmb2NvIOKAlCBkZWl4YW1vcyBjb21vIGVzdMOhLCBlbSB2ZXogZGUgcHV4YXJcbiAgICAgICAgLy8gbyBmb2NvIHBybyBib3TDo28gZG8gw61jb25lIHNlbSBuZW5odW0gbW90aXZvIChidWcgcmVsYXRhZG8gdmlhIEdOT01FIE9yY2E6IGZlY2hhciBvXG4gICAgICAgIC8vIHBhaW5lbCBjbGljYW5kbyBmb3JhLCBjb20gbyBmb2NvIGFpbmRhIG5vIGlucHV0LCBmYXppYSBvIGZvY28gcHVsYXIgcHJvIMOtY29uZSkuXG4gICAgICAgIGNvbnN0IGZvY3VzSXNJbnNpZGVQYW5lbCA9XG4gICAgICAgICAgICBwYW5lbEVsZW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgTm9kZSAmJiBwYW5lbEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmICghZm9jdXNJc0luc2lkZVBhbmVsKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmVzdG9yZVRhcmdldCA9IHRoaXMuZWxlbWVudFRvUmVzdG9yZUZvY3VzVG87XG4gICAgICAgIHRoaXMuZWxlbWVudFRvUmVzdG9yZUZvY3VzVG8gPSBudWxsO1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Jlc3RvcmluZ0ZvY3VzT25DbG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3RvcmVUYXJnZXQgJiYgZG9jdW1lbnQuY29udGFpbnMocmVzdG9yZVRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVRhcmdldC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWNvbkJ1dHRvbigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBjb2JyZSBhIHRlbGEgaW50ZWlyYSwgaW5jbHVpbmRvIG8gcHLDs3ByaW8gdHJpZ2dlciDigJQgY2xpY2FyIG5vXG4gICAgICogaW5wdXQgb3Ugbm9zIGJvdMO1ZXMgZG8gdHJpZ2dlciBlbnF1YW50byBvIHBhaW5lbCBqw6EgZXN0w6EgYWJlcnRvIHRhbWLDqW0gZGlzcGFyYVxuICAgICAqIGBiYWNrZHJvcENsaWNrYCAobyBwcsOzcHJpbyBgPGlucHV0PmAgbnVuY2EgcmVjZWJlIG8gYGNsaWNrYCBuZXNzZSBjYXNvLCBlbnTDo29cbiAgICAgKiBgaGFuZGxlSW5wdXRDbGlja2AgbnVuY2EgZGlzcGFyYSkuIFNlbSBlc3RlIGZpbHRybywgY2xpY2FyIG5vIGlucHV0IHBhcmEgdHJvY2FyIGRlXG4gICAgICogc2VnbWVudG8gZmVjaGFyaWEgbyBwYWluZWwgZSByb3ViYXJpYSBvIGZvY28gcGFyYSBvIGJvdMOjbyBkbyDDrWNvbmUgKHZpYSBgY2xvc2VQYW5lbGApLlxuICAgICAqIFF1YW5kbyBvIGNsaXF1ZSBjYWl1IGVzcGVjaWZpY2FtZW50ZSBzb2JyZSBvIGA8aW5wdXQ+YCwgcmVhcGxpY2Ftb3MgYSBtZXNtYSBsw7NnaWNhIGRlXG4gICAgICogcmVwb3NpY2lvbmFtZW50byBkZSBzZWdtZW50byBxdWUgYGhhbmRsZUlucHV0Q2xpY2tgIGZhcmlhLCBlbSB2ZXogZGUgc8OzIGlnbm9yYXIgbyBjbGlxdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gYGV2ZW50LnRhcmdldGAgZGUgdW0gYmFja2Ryb3BDbGljayBkbyBDREsgT3ZlcmxheSDDqSBzZW1wcmUgbyBwcsOzcHJpbyA8ZGl2PiBkb1xuICAgICAgICAvLyBiYWNrZHJvcCwgbnVuY2EgbyBlbGVtZW50byByZWFsbWVudGUgY2xpY2FkbyDigJQgZW50w6NvIGNoZWNhciBgLmNvbnRhaW5zKGV2ZW50LnRhcmdldClgXG4gICAgICAgIC8vIG51bmNhIGZ1bmNpb25hLiBFbSB2ZXogZGlzc28sIGNvbXBhcmFtb3MgYSBjb29yZGVuYWRhIHJlYWwgZG8gY2xpcXVlIChxdWUgb1xuICAgICAgICAvLyBNb3VzZUV2ZW50IHNlbXByZSBjYXJyZWdhIGNvcnJldGFtZW50ZSkgY29udHJhIG9zIHJldMOibmd1bG9zIGRvcyBlbGVtZW50b3MgZG8gdHJpZ2dlci5cbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IHRoaXMudHJpZ2dlcklucHV0KCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGlucHV0RWwgJiYgdGhpcy5pc1NlZ21lbnRlZE1vZGUoKSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRSZWN0ID0gaW5wdXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsaWNrZWRPbklucHV0ID1cbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYID49IGlucHV0UmVjdC5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA8PSBpbnB1dFJlY3QucmlnaHQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRZID49IGlucHV0UmVjdC50b3AgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRZIDw9IGlucHV0UmVjdC5ib3R0b207XG4gICAgICAgICAgICBpZiAoY2xpY2tlZE9uSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dEVsLCBldmVudC5jbGllbnRYLCBldmVudC50aW1lU3RhbXApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBjbGlja2VkT25UcmlnZ2VyID1cbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gcmVjdC5sZWZ0ICYmXG4gICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IHJlY3QucmlnaHQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gcmVjdC50b3AgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gcmVjdC5ib3R0b207XG4gICAgICAgIGlmIChjbGlja2VkT25UcmlnZ2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlT3ZlcmxheUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VnbWVudGVkTW9kZSgpIHx8ICEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBCb3VuZCB0byBgbW91c2Vkb3duYCwgbsOjbyBgY2xpY2tgICh2ZWphIG8gY29tZW50w6FyaW8gZW0gYGFwcGx5U2VnbWVudENsaWNrYCkuIE9cbiAgICAgICAgLy8gY29tcG9ydGFtZW50byBuYXRpdm8gcGFkcsOjbyBkbyBicm93c2VyIHByYSBtb3VzZWRvd24gbnVtIGA8aW5wdXQ+YCBkZSB0ZXh0byDDqVxuICAgICAgICAvLyBwb3NpY2lvbmFyIG8gY2FyZXQvaW5pY2lhciBzZWxlw6fDo28gZGUgdGV4dG8gbmEgY29vcmRlbmFkYSBkbyBjbGlxdWUg4oCUIGlzc28gcm9kYVxuICAgICAgICAvLyAqZGVwb2lzKiBkb3Mgbm9zc29zIGxpc3RlbmVycyBlIHNvYnJlc2NyZXZlcmlhIG8gYHNldFNlbGVjdGlvblJhbmdlYCBkbyBzZWdtZW50b1xuICAgICAgICAvLyBhcGxpY2FkbyBsb2dvIGFiYWl4by4gYHByZXZlbnREZWZhdWx0KClgIGV2aXRhIGVzc2EgY29ycmlkYS5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWdtZW50UG9pbnRlckRvd24oZXZlbnQudGFyZ2V0LCBldmVudC5jbGllbnRYLCBldmVudC50aW1lU3RhbXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvbnRvIGRlIGVudHJhZGEgw7puaWNvIHBybyBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkbyDigJQgY2hhbWFkbyB0YW50byBwb3JcbiAgICAgKiBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biBkaXJldG8gbm8gYDxpbnB1dD5gLCBvIHByaW1laXJvIGNsaXF1ZSwgYW50ZXMgZG8gYmFja2Ryb3BcbiAgICAgKiBleGlzdGlyKSBxdWFudG8gcG9yIGBoYW5kbGVCYWNrZHJvcENsaWNrYCAoY2xpcXVlcyBzZWd1aW50ZXMsIGrDoSBjb20gbyBwYWluZWwgYWJlcnRvIGUgb1xuICAgICAqIGJhY2tkcm9wIGNvYnJpbmRvIG8gaW5wdXQpLiBQcmVjaXNhIHNlciDDum5pY28gcG9ycXVlIG9zIGRvaXMgY2xpcXVlcyBkZSB1bSBkdXBsbyBjbGlxdWVcbiAgICAgKiByZWFsIGNvc3R1bWFtIGNoZWdhciBwb3IgY2FtaW5ob3MgRElGRVJFTlRFUyDigJQgbyBwcmltZWlybyB2aWEgbW91c2Vkb3duIG5vIGlucHV0LCBvXG4gICAgICogc2VndW5kbyB2aWEgYmFja2Ryb3BDbGljayDigJQgZW50w6NvIHJhc3RyZWFyIG8gdGltZXN0YW1wIGRvIFwiw7psdGltbyBjbGlxdWVcIiBzZXBhcmFkYW1lbnRlXG4gICAgICogZW0gY2FkYSBoYW5kbGVyIG51bmNhIGRldGVjdGFyaWEgdW0gZHVwbG8gY2xpcXVlIGRlIHZlcmRhZGUuIE5lbSBgZGJsY2xpY2tgIG5lbVxuICAgICAqIGBldmVudC5kZXRhaWxgIHPDo28gY29uZmnDoXZlaXMgYXF1aSAoZGVwZW5kZW0gZGEgY29udGFnZW0vdGFyZ2V0aW5nIGludGVybmEgZGUgY2xpcXVlcyBkb1xuICAgICAqIGJyb3dzZXIsIHF1ZSBub3NzYXMgbWFuaXB1bGHDp8O1ZXMgZGUgZm9jby9zZWxlw6fDo28gcGFyZWNlbSBhdHJhcGFsaGFyIOKAlCBvYnNlcnZhZG9cbiAgICAgKiBlbXBpcmljYW1lbnRlOiBgZXZlbnQuZGV0YWlsYCBmaWNhIHNlbXByZSAxKSwgZGHDrSBhIGRldGVjw6fDo28gbWFudWFsIHBvciB0aW1lc3RhbXAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50UG9pbnRlckRvd24oaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlciwgdGltZVN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNEb3VibGVDbGljayA9IHRpbWVTdGFtcCAtIHRoaXMubGFzdE1vdXNlRG93bkF0IDwgRGF0ZXBpY2tlckNvbXBvbmVudC5ET1VCTEVfQ0xJQ0tfVEhSRVNIT0xEX01TO1xuICAgICAgICB0aGlzLmxhc3RNb3VzZURvd25BdCA9IHRpbWVTdGFtcDtcbiAgICAgICAgaWYgKGlzRG91YmxlQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gMDsgLy8gZXZpdGEgcXVlIHVtIHRlcmNlaXJvIGNsaXF1ZSBlbmNhZGVpZSBlbSBvdXRybyBcImR1cGxvXCJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0V2hvbGVGaWVsZChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBseVNlZ21lbnRDbGljayhpbnB1dCwgY2xpZW50WCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIG8gc2VnbWVudG8gc29iIGEgY29vcmRlbmFkYSBgY2xpZW50WGAgZGUgdW0gY2xpcXVlIG5vIGlucHV0IHNlZ21lbnRhZG8uXG4gICAgICogQ29tcGFydGlsaGFkbyBwb3IgYGhhbmRsZUlucHV0Q2xpY2tgIChtb3VzZWRvd24gcmVhbCBubyBgPGlucHV0PmAg4oCUIHVzYW1vcyBgbW91c2Vkb3duYFxuICAgICAqIGVtIHZleiBkZSBgY2xpY2tgIHBvcnF1ZSBvIGBmb2N1c2AvYG9wZW5PbkZvY3VzYCBkaXNwYXJhZG8gbm8gbWVpbyBkbyBnZXN0byBwb2RlIG1vbnRhclxuICAgICAqIG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkgZW1iYWl4byBkbyBjdXJzb3IgYW50ZXMgZG8gYG1vdXNldXBgLCBmYXplbmRvIG8gYnJvd3NlciByZXNvbHZlclxuICAgICAqIG8gYGNsaWNrYCBwcm8gYW5jZXN0cmFsIGNvbXVtIGVudHJlIG8gYWx2byBkbyBtb3VzZWRvd24gZSBvIGRvIG1vdXNldXAg4oCUIG5hIHByw6F0aWNhLFxuICAgICAqIGA8Ym9keT5gIOKAlCBlbSB2ZXogZG8gYDxpbnB1dD5gIG91IGRvIGJhY2tkcm9wKSBlIGBoYW5kbGVCYWNrZHJvcENsaWNrYCAoY2xpcXVlIG5vIHRyaWdnZXJcbiAgICAgKiBjb20gbyBwYWluZWwgasOhIGFiZXJ0byBlbSByZWdpbWUgZXN0w6F2ZWwsIGludGVyY2VwdGFkbyBwZWxvIGJhY2tkcm9wIGRvIENESyBPdmVybGF5KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5U2VnbWVudENsaWNrKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAvLyBDYWxjdWxhIG8gc2VnbWVudG8gYSBwYXJ0aXIgZGEgY29vcmRlbmFkYSBkbyBjbGlxdWUgKGNsaWVudFgpLCBuw6NvIGRlXG4gICAgICAgIC8vIGBpbnB1dC5zZWxlY3Rpb25TdGFydGAg4oCUIG8gYnJvd3NlciBhanVzdGEgYSBwb3Npw6fDo28gZG8gY2FyZXQgZGUgZm9ybWEgYXNzw61uY3JvbmFcbiAgICAgICAgLy8gYXDDs3MgbyBjbGlxdWUgKG9ic2VydmFkbyBlbXBpcmljYW1lbnRlLCBlc3BlY2lhbG1lbnRlIG5hIHRyYW5zacOnw6NvIGRlIGZvY28pLCBlbnTDo29cbiAgICAgICAgLy8gbGVyIGBzZWxlY3Rpb25TdGFydGAgbmVzc2UgbW9tZW50byDDqSB1bWEgZm9udGUgbsOjbyBjb25macOhdmVsLiBgY2xpZW50WGAgw6kgc8OtbmNyb25vXG4gICAgICAgIC8vIGUgaW1lZGlhdG8sIHNlbSBlc3NhIGNvcnJpZGEuXG4gICAgICAgIGNvbnN0IGNoYXJJbmRleCA9IHRoaXMuY2xpY2tDbGllbnRYVG9DaGFySW5kZXgoaW5wdXQsIGNsaWVudFgpO1xuICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgLy8gRm9jYSBlIHNlbGVjaW9uYSBvIHNlZ21lbnRvIGp1bnRvcywgZSByZWFwbGljYSBvcyBkb2lzIGFsZ3VtYXMgdmV6ZXMgbG9nbyBlbSBzZWd1aWRhIOKAlFxuICAgICAgICAvLyBvIGJyb3dzZXIvQ0RLIE92ZXJsYXkgcG9kZSBtZXhlciBubyBmb2NvIGRlIGZvcm1hIGFzc8OtbmNyb25hIGRlcG9pcyBkbyBjbGlxdWUgKGJsdXJcbiAgICAgICAgLy8gbmF0aXZvIGRvIGJhY2tkcm9wLCBjZGtUcmFwRm9jdXMgZG8gcGFpbmVsLCBldGMuKTsgZW0gdmV6IGRlIHRlbnRhciBwcmV2ZXIvZXZpdGFyIGNhZGFcbiAgICAgICAgLy8gY2F1c2EsIHNpbXBsZXNtZW50ZSB2ZW5jZW1vcyByZWFmaXJtYW5kbyBmb2NvK3NlbGXDp8OjbyBwb3IgY2ltYS5cbiAgICAgICAgY29uc3QgZm9jdXNBbmRTZWxlY3QgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdFNlZ21lbnRBdChjaGFySW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdFNlZ21lbnQoaW5kZXgpO1xuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvY3VzQW5kU2VsZWN0KCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3QsIDApO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0LCA1MCk7XG4gICAgfVxuXG4gICAgLyoqIER1cGxvIGNsaXF1ZSBzZWxlY2lvbmEgbyBpbnB1dCBpbnRlaXJvICh0b2RvcyBvcyBzZWdtZW50b3MpLCBjb21vIG51bSBgPGlucHV0PmAgZGUgdGV4dG8gY29tdW0uICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0RGJsQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VnbWVudGVkTW9kZSgpIHx8ICEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIHRvZG9zIG9zIHNlZ21lbnRvcyBkbyBpbnB1dCAodXNhZG8gdGFudG8gcGVsbyBkdXBsbyBjbGlxdWUgZGV0ZWN0YWRvIG5hIG3Do28gZW1cbiAgICAgKiBgaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duYCBxdWFudG8gcG9yIGBoYW5kbGVJbnB1dERibENsaWNrYCwgbWFudGlkbyBjb21vIGNhbWluaG8gZGlyZXRvXG4gICAgICogcHJhIHF1ZW0gZGlzcGFyYSB1bSBgZGJsY2xpY2tgIGRlIHZlcmRhZGUsIGV4LjogYWNlc3NpYmlsaWRhZGUvdGVzdGVzKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNlbGVjdFdob2xlRmllbGQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAvLyBHYXJhbnRlIHVtIHNlZ21lbnRvIGF0aXZvICphbnRlcyogZGUgZm9jYXI6IHNlIG8gQ0RLIE92ZXJsYXkgdGl2ZXIgcm91YmFkbyBvIGZvY28gZGVcbiAgICAgICAgLy8gZm9ybWEgYXNzw61uY3JvbmEgKGJsdXIpIGVudHJlIG9zIGNsaXF1ZXMgcXVlIGNvbXDDtWVtIG8gZHVwbG8gY2xpcXVlLCBvIGBpbnB1dC5mb2N1cygpYFxuICAgICAgICAvLyBhYmFpeG8gZGlzcGFyYSB1bSBldmVudG8gYGZvY3VzYCBnZW51w61ubywgZSBoYW5kbGVJbnB1dEZvY3VzIHPDsyBldml0YSBhZ2VuZGFyIHN1YSBwcsOzcHJpYVxuICAgICAgICAvLyByZWFwbGljYcOnw6NvIGNvbmNvcnJlbnRlIChxdWUgc29icmVzY3JldmVyaWEgbm9zc2Egc2VsZcOnw6NvIGRvIGNhbXBvIGludGVpcm8gbWFpcyB0YXJkZSlcbiAgICAgICAgLy8gcXVhbmRvIGVuY29udHJhIGBnZXRBY3RpdmVJbmRleCgpICE9PSBudWxsYCDigJQgbyBtZXNtbyBtb3Rpdm8gcGVsbyBxdWFsIGhhbmRsZUlucHV0Q2xpY2tcbiAgICAgICAgLy8gc2VtcHJlIGNoYW1hIGBzZWdtZW50RW5naW5lLnNlbGVjdFNlZ21lbnQoaW5kZXgpYCBhbnRlcyBkZSBgaW5wdXQuZm9jdXMoKWAuXG4gICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdEZpcnN0U2VnbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBNZXNtbyBwYWRyw6NvIGRlZmVuc2l2byBkZSBoYW5kbGVJbnB1dENsaWNrOiBvIGNsaXF1ZSBxdWUgZmVjaGEgbyBkdXBsbyBjbGlxdWUgasOhIHJvZG91XG4gICAgICAgIC8vIGhhbmRsZUlucHV0Q2xpY2sgKHNlbGVjaW9uYW5kbyBzw7MgdW0gc2VnbWVudG8pIGUgcG9kZSB0ZXIgYWdlbmRhZG8gc3VhcyBwcsOzcHJpYXNcbiAgICAgICAgLy8gcmVhcGxpY2HDp8O1ZXMgYWRpYWRhcyDigJQgYSBnZXJhw6fDo28gcmVjw6ltLWluY3JlbWVudGFkYSBhcyBpbnZhbGlkYSwgZW50w6NvIHPDsyBhIHNlbGXDp8OjbyBkb1xuICAgICAgICAvLyBjYW1wbyBpbnRlaXJvIHNvYnJldml2ZS5cbiAgICAgICAgY29uc3QgZm9jdXNBbmRTZWxlY3RBbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICAgICAgICB9O1xuICAgICAgICBmb2N1c0FuZFNlbGVjdEFsbCgpO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0QWxsLCAwKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdEFsbCwgNTApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dEZvY3VzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBpZiAoaW5wdXQudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9jbyBcImdlbnXDrW5vXCIgKFRhYiBhIHBhcnRpciBkZSBvdXRybyBjYW1wbywgb3UgcHJpbWVpcm8gZm9jbyBubyBjYW1wbykg4oCUXG4gICAgICAgICAgICAgICAgLy8gbmVuaHVtIHNlZ21lbnRvIGF0aXZvIGFpbmRhLCBlbnTDo28gc2VsZWNpb25hIG8gcHJpbWVpcm8uXG4gICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb247XG4gICAgICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdEZpcnN0U2VnbWVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlR2VudWluZUZvY3VzKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBKw6EgZXhpc3RlIHVtIHNlZ21lbnRvIGF0aXZvIOKAlCBwb3IgZXhlbXBsbywgaGFuZGxlSW5wdXRDbGljayBhY2Fib3UgZGVcbiAgICAgICAgICAgICAgICAvLyBkZWZpbmktbG8gZSBlc3TDoSByZWZvY2FuZG8gbyBpbnB1dCBwcm9ncmFtYXRpY2FtZW50ZSBhcMOzcyB1bSBibHVyIGVzcMO6cmlvLlxuICAgICAgICAgICAgICAgIC8vIE7Do28gcmVpbmljaWEgcGFyYSBvIHByaW1laXJvIHNlZ21lbnRvOyBzw7MgZ2FyYW50ZSBxdWUgYSBzZWxlw6fDo28gdmlzdWFsIGJhdGFcbiAgICAgICAgICAgICAgICAvLyBjb20gbyBlc3RhZG8gYXR1YWwsIGUgYW51bmNpYSBzw7MgbyBzZWdtZW50byAobyByZXN1bW8gZG8gdmFsb3IgaW50ZWlybyDDqVxuICAgICAgICAgICAgICAgIC8vIHJlc2VydmFkbyBhbyBwcmltZWlybyBmb2NvIGdlbnXDrW5vKS5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG93T25Gb2N1cygpICYmICF0aGlzLmlzUmVzdG9yaW5nRm9jdXNPbkNsb3NlKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5PbkZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogTWFwZWlhIGEgY29vcmRlbmFkYSBYICh2aWV3cG9ydCkgZGUgdW0gY2xpcXVlIHBhcmEgbyDDrW5kaWNlIGRlIGNhcmFjdGVyZSBtYWlzIHByw7N4aW1vIG5vIHZhbG9yIGV4aWJpZG8uICovXG4gICAgcHJpdmF0ZSBjbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGlucHV0KTtcbiAgICAgICAgY29uc3QgY2FudmFzID0gKHRoaXMubWVhc3VyZUNhbnZhcyA/Pz0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKCFjdHgpIHJldHVybiAwO1xuICAgICAgICBjdHguZm9udCA9IGAke3N0eWxlLmZvbnRTdHlsZX0gJHtzdHlsZS5mb250V2VpZ2h0fSAke3N0eWxlLmZvbnRTaXplfSAke3N0eWxlLmZvbnRGYW1pbHl9YDtcbiAgICAgICAgY29uc3QgcmVjdCA9IGlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0xlZnQpIHx8IDA7XG4gICAgICAgIGNvbnN0IGxvY2FsWCA9IGNsaWVudFggLSByZWN0LmxlZnQgLSBwYWRkaW5nTGVmdCArIGlucHV0LnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IHRleHQgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgbGV0IGJlc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhjdHgubWVhc3VyZVRleHQodGV4dC5zbGljZSgwLCBpKSkud2lkdGggLSBsb2NhbFgpO1xuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdEluZGV4O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVOYXRpdmVJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZUlucHV0LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dEJsdXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3Qgd2FzU2VnbWVudGVkID0gdGhpcy5pc1NlZ21lbnRlZE1vZGUoKTtcbiAgICAgICAgaWYgKHdhc1NlZ21lbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIHRoaXMubGl2ZUFubm91bmNlci5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLmlzRW1wdHkoKSA/ICcnIDogdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbnB1dC52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSAoZXZlbnQgYXMgRm9jdXNFdmVudCkucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gRW0gbW9kbyBzZWdtZW50YWRvLCB1bSBibHVyIHNlbSBgcmVsYXRlZFRhcmdldGAgbm9ybWFsbWVudGUgbsOjbyDDqSB1bWEgc2HDrWRhIHJlYWxcbiAgICAgICAgICAgIC8vIGRlIGZvY28g4oCUIMOpIG8gYmFja2Ryb3AgdHJhbnNwYXJlbnRlIGRvIHByw7NwcmlvIHBvcHVwIChuw6NvIGZvY8OhdmVsKSBpbnRlcmNlcHRhbmRvXG4gICAgICAgICAgICAvLyB1bSBjbGlxdWUgbm8gdHJpZ2dlciBwYXJhIHRyb2NhciBkZSBzZWdtZW50by4gTsOjbyByZWRpcmVjaW9uYSBvIGZvY28gcHJvIHBhaW5lbFxuICAgICAgICAgICAgLy8gbmVzc2UgY2FzbzsgZGVpeGEgaGFuZGxlSW5wdXRDbGljay9oYW5kbGVJbnB1dEZvY3VzIHJlc29sdmVyZW0gKGVsZXMgcmVmb2NhbSBvXG4gICAgICAgICAgICAvLyBpbnB1dCBlIHJlYXBsaWNhbSBvIHNlZ21lbnRvIGNvcnJldG8gbG9nbyBlbSBzZWd1aWRhKS5cbiAgICAgICAgICAgIGNvbnN0IGxvb2tzTGlrZU93blRyaWdnZXJDbGljayA9IHdhc1NlZ21lbnRlZCAmJiAhcmVsYXRlZFRhcmdldDtcbiAgICAgICAgICAgIGlmICghbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrICYmICghcmVsYXRlZFRhcmdldCB8fCAhcGFuZWw/LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dENoYW5nZShyYXc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFyYXc/LnRyaW0oKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW5wdXQodGhpcy5tb2RlKCksIHJhdywgdGhpcy5yYW5nZVNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChwYXJzZWQpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJzZWQgYXMgRGF0ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGQpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudGVkS2V5ZG93bihldmVudCwgZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGVjbGFzIHF1ZSBkZXZlbSBwYXNzYXIgZGlyZXRvIHBhcmEgbyBicm93c2VyIHNlbSBpbnNlcmlyL2FsdGVyYXIgbmFkYSBubyBjYW1wby4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUyA9IFsnSG9tZScsICdFbmQnLCAnU2hpZnQnLCAnQ2Fwc0xvY2snLCAnRXNjYXBlJywgJ0VudGVyJywgJyAnXTtcblxuICAgIC8qKiBEaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIG5vIGlucHV0IGRvIHRyaWdnZXIuICovXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIGNvbnN0IHsga2V5LCBjdHJsS2V5LCBtZXRhS2V5LCBhbHRLZXksIHNoaWZ0S2V5IH0gPSBldmVudDtcbiAgICAgICAgaWYgKGN0cmxLZXkgfHwgbWV0YUtleSB8fCBhbHRLZXkgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoRGF0ZXBpY2tlckNvbXBvbmVudC5TRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUy5pbmNsdWRlcyhrZXkpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKys7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoc2hpZnRLZXkgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBrZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIC8vIEFvIGNvbnRyw6FyaW8gZG8gVGFiLCBzZXRhIG5vIHByaW1laXJvL8O6bHRpbW8gc2VnbWVudG8gbsOjbyBkZXZlIHNhaXIgZG8gY2FtcG8gbmVtXG4gICAgICAgICAgICAvLyBkZXNhdGl2YXIgYSBzZWxlw6fDo28g4oCUIGBtb3ZlVG9BZGphY2VudFNlZ21lbnRgIHplcmEgYGFjdGl2ZUluZGV4YCBhbyBiYXRlciBubyBsaW1pdGVcbiAgICAgICAgICAgIC8vIChjb21wb3J0YW1lbnRvIGNlcnRvIHBybyBUYWIgZXNjYXBhciBkbyBjYW1wbyksIGVudMOjbyBuYSBib3JkYSBhIGdlbnRlIHJlc2VsZWNpb25hXG4gICAgICAgICAgICAvLyBvIHNlZ21lbnRvIHF1ZSBqw6EgZXN0YXZhIGF0aXZvLCBpbWl0YW5kbyBvIGA8aW5wdXQgdHlwZT1cImRhdGVcIj5gIG5hdGl2byAoYSBzZXRhIHNvbWVcbiAgICAgICAgICAgIC8vIG5vIGxpbWl0ZSwgbsOjbyBuYXZlZ2EgcHJhIGZvcmEpLlxuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUubW92ZVRvQWRqYWNlbnRTZWdtZW50KGtleSA9PT0gJ0Fycm93TGVmdCcgPyAtMSA6IDEpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2JvdW5kYXJ5JyAmJiBiZWZvcmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuaW5jcmVtZW50QWN0aXZlU2VnbWVudChrZXkgPT09ICdBcnJvd1VwJyA/IDEgOiAtMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQmFja3NwYWNlJyB8fCBrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNXaG9sZUZpZWxkU2VsZWN0ZWQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PT0gMCAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT09IGlucHV0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpc1dob2xlRmllbGRTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFsbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY2xlYXJBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0JhY2tzcGFjZScgPyAnYmFja3NwYWNlJyA6ICdkZWxldGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXlswLTldJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnR5cGVEaWdpdChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5hY3RpdmVLaW5kKCkgPT09ICdhbXBtJyAmJiAvXlthcEFQXSQvLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZXRBbVBtKGtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgPyAwIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWFscXVlciBvdXRyYSB0ZWNsYSBpbXByaW3DrXZlbCAobGV0cmFzLCBzw61tYm9sb3MpIG7Do28gw6kgaW5zZXJpZGEgbm8gY2FtcG8uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIFNpbmNyb25pemEgbyBET00gY29tIG8gZXN0YWRvIGF0dWFsIGRhIGVuZ2luZSAodmFsb3IgKyBzZWxlw6fDo28gZG8gc2VnbWVudG8gYXRpdm8pIGFww7NzIHVtYSBtdXRhw6fDo28uICovXG4gICAgcHJpdmF0ZSBzeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuaW5wdXREYXRlO1xuICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIHRoaXMuY29tbWl0U2VnbWVudGVkVmFsdWVJZkNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRTZWdtZW50UmFuZ2UoaW5kZXgpO1xuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKiogXCJ7csOzdHVsbyBkbyBzZWdtZW50b30sIHt2YWxvcn1cIiAoZXguOiBcIkRpYSwgMDNcIikg4oCUIHRleHRvIGRvIGFuw7puY2lvIGRlIG7DrXZlbCBkZSBzZWdtZW50by4gKi9cbiAgICBwcml2YXRlIGJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qga2luZCA9IHRoaXMuc2VnbWVudEVuZ2luZS5hY3RpdmVLaW5kKCk7XG4gICAgICAgIGlmIChraW5kID09PSBudWxsKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoRGF0ZXBpY2tlckNvbXBvbmVudC5TRUdNRU5UX0xBQkVMX0tFWVNba2luZF0pO1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZVNlZ21lbnRUZXh0KCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGV4dCB8fCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VnbWVudF9lbXB0eScpO1xuICAgICAgICByZXR1cm4gYCR7bGFiZWx9LCAke3ZhbHVlfWA7XG4gICAgfVxuXG4gICAgLyoqIEFudW5jaWEgdmlhIExpdmVBbm5vdW5jZXIgbyBzZWdtZW50byBhdGl2byDigJQgY2hhbWFkbyBlbSB0b2RvIHBvbnRvIHF1ZSBtdWRhIG8gc2VnbWVudG8gYXRpdm8vc2V1XG4gICAgICogIHZhbG9yIERFUE9JUyBkbyBwcmltZWlybyBmb2NvIGdlbnXDrW5vIChxdWUgasOhIHJlY2ViZSBlc3NlIG1lc21vIHRleHRvIGVtYnV0aWRvIGVtIGBhbm5vdW5jZUdlbnVpbmVGb2N1c2ApLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VBY3RpdmVTZWdtZW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5idWlsZFNlZ21lbnRBbm5vdW5jZW1lbnRUZXh0KCk7XG4gICAgICAgIGlmICh0ZXh0KSB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZSh0ZXh0LCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFJlc3VtbyBodW1hbml6YWRvIGRvIHZhbG9yIGludGVpcm8gKGV4LjogXCIxMCBkZSBvdXR1YnJvIGRlIDIwMjBcIiwgb3UgYSBmcmFzZSBnZW7DqXJpY2EgZGUgY2FtcG9cbiAgICAgKiAgdmF6aW8pIOKAlCBjb21wbGVtZW50YSBvIGA8aW5wdXQ+YCBzZWdtZW50YWRvLCBxdWUgbyBsZWl0b3IgZGUgdGVsYSBsw6ogZGUgZm9ybWEgbGl0ZXJhbC9wb3Vjb1xuICAgICAqICBuYXR1cmFsIChlc3F1ZWxldG8gZGUgc3VibGluaGFkb3MgcXVhbmRvIHZhemlvLCBkw61naXRvcyBzZXBhcmFkb3MgcG9yIGJhcnJhIHF1YW5kbyBjb21wbGV0bykuXG4gICAgICogIEZvcm1hdGHDp8OjbyBwdXJhIHZpYSBgSW50bGAsIHNlbSBjaGF2ZXMgZGUgdHJhZHXDp8OjbyBub3ZhcyAoZXhjZXRvIGEgZnJhc2UgZGUgY2FtcG8gdmF6aW8pLlxuICAgICAqICBFc3BlbGhhIGBmb3JtYXREYXlBcmlhTGFiZWxgIHBybyBtb2RvIGBkYXRlYC4gKi9cbiAgICBwcml2YXRlIGRlc2NyaWJlV2hvbGVWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ub192YWx1ZV9zZWxlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuICcnOyAvLyB2YWxvciBwYXJjaWFsbWVudGUgZGlnaXRhZG8gKGluY29tcGxldG8pIOKAlCBuYWRhIGh1bWFuaXrDoXZlbCBhaW5kYS5cbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUoKSkge1xuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGUpO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhsYW5nLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICAgICAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZyhsYW5nLCB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZDogdGhpcy5zaG93U2Vjb25kcygpID8gJzItZGlnaXQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBob3VyMTI6IHRoaXMucmVzb2x2ZWRIb3VyRm9ybWF0KCkgPT09ICcxMicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcobGFuZywge1xuICAgICAgICAgICAgICAgICAgICBkYXRlU3R5bGU6ICdsb25nJyxcbiAgICAgICAgICAgICAgICAgICAgdGltZVN0eWxlOiB0aGlzLnNob3dTZWNvbmRzKCkgPyAnbWVkaXVtJyA6ICdzaG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGhvdXIxMjogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSA9PT0gJzEyJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnOyAvLyBpc1NlZ21lbnRlZE1vZGUoKSBqw6EgcmVzdHJpbmdlIGEgZGF0ZS9tb250aC90aW1lL2RhdGV0aW1lXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQW7Dum5jaW8gY29tYmluYWRvIG5vIHByaW1laXJvIGZvY28gZ2VudcOtbm8gZG8gY2FtcG86IHJlc3VtbyBkbyB2YWxvciBpbnRlaXJvICsgc2VnbWVudG8gYXRpdm8sXG4gICAgICogIG51bWEgw5pOSUNBIGNoYW1hZGEgYSBgYW5ub3VuY2VgIChldml0YSBkdWFzIHJlZ2nDtWVzIGNvbmNvcnJlbnRlcy91bWEgY29ydGFuZG8gYSBvdXRyYSkuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZUdlbnVpbmVGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuZGVzY3JpYmVXaG9sZVZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRUZXh0ID0gdGhpcy5idWlsZFNlZ21lbnRBbm5vdW5jZW1lbnRUZXh0KCk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gc3VtbWFyeSA/IGAke3N1bW1hcnl9LiAke3NlZ21lbnRUZXh0fWAgOiBzZWdtZW50VGV4dDtcbiAgICAgICAgaWYgKGNvbWJpbmVkKSB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShjb21iaW5lZCwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKiBQcm9wYWdhIG8gdmFsb3IgZGEgZW5naW5lIHBhcmEgbyBtb2RlbG8gKENWQSkgYXNzaW0gcXVlIHRvZG9zIG9zIHNlZ21lbnRvcyBlc3RpdmVyZW0gY29tcGxldG9zLiAqL1xuICAgIHByaXZhdGUgY29tbWl0U2VnbWVudGVkVmFsdWVJZkNvbXBsZXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc2VnbWVudEVuZ2luZS5pc0NvbXBsZXRlKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYXNlID1cbiAgICAgICAgICAgIHRoaXMudmFsdWUoKSA/P1xuICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldERhdGUoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS50b0RhdGUoYmFzZSk7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChkYXRlKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0NhbGVuZGFyKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hvd1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoZGF0ZS5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoZGF0ZS5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgdGhpcy5zZWNvbmRzLnNldChkYXRlLmdldFNlY29uZHMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoZGF0ZSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIE5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgbmF2aWdhdGVQcmV2KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEwLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpIC0gMTAgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlRGVjYWRlQ2hhbmdlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMSwgdmlldy5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlWWVhckNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlTW9udGhDaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbmF2aWdhdGVOZXh0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSArIDEwLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpICsgMTAgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlRGVjYWRlQ2hhbmdlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMSwgdmlldy5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlWWVhckNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSArIDEsIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlTW9udGhDaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBzw7MgXCJ7bcOqc30gZGUge2Fub31cIiAoZXguOiBcIm91dHVicm8gZGUgMjAyNlwiKSBhbyBjcnV6YXIgZnJvbnRlaXJhIGRlIG3DqnMgbmEgZ3JhZGUgZGUgZGlhcy5cbiAgICAgKiAgTyBub3ZvIGZvY28gKGJ1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0pIGrDoSBjYXJyZWdhIGVzc2EgaW5mbyBkZW50cm8gZG8gYXJpYS1sYWJlbCBsb25nbyBkZVxuICAgICAqICBgZm9ybWF0RGF5QXJpYUxhYmVsYCwgbWFzIG8gbm9tZSBkbyBtw6pzIGZpY2EgXCJlbnRlcnJhZG9cIiBubyBtZWlvIGRhIGZyYXNlIGUgcGFzc2EgZGVzcGVyY2ViaWRvXG4gICAgICogIChjb25maXJtYWRvIGNvbSB0ZXN0ZSBtYW51YWwgdmlhIE9yY2EpLiBTZW0gcHJlZml4byB0aXBvIFwiYWdvcmEgZXhpYmluZG9cIiwgbWVzbWEgY29udmVuw6fDo29cbiAgICAgKiAgYWRvdGFkYSBwb3Igb3V0cm9zIGNhbGVuZMOhcmlvcyBhY2Vzc8OtdmVpcyAoZXguOiByZWFjdC1hcmlhKS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlTW9udGhDaGFuZ2UobmV3RGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIG5ld0RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBvIGFubyBhdHVhbG1lbnRlIGV4aWJpZG8gYW8gcGFnaW5hciBhIHZpZXcgJ21vbnRocycgKGV4LjogXCIyMDI1XCIpLiBPIGA8c3Bhbj5gIGNlbnRyYWxcbiAgICAgKiAgcXVlIG1vc3RyYSBlc3NlIGFubyBubyBjYWJlw6dhbGhvIG7Do28gw6kgZm9jw6F2ZWwsIGUgbyBhcmlhLWxhYmVsIGRvcyBib3TDtWVzIGRlIG5hdmVnYcOnw6NvIHPDs1xuICAgICAqICBmYWxhIG8gYW5vIGRlIERFU1RJTk8gKFwiQW5vIGFudGVyaW9yLCAyMDI1XCIpIOKAlCBzZW0gaXNzbywgbyBsZWl0b3IgZGUgdGVsYSBudW5jYSBjb25maXJtYSBvXG4gICAgICogIGFubyBxdWUgcGFzc291IGEgZXN0YXIgZW0gZXhpYmnDp8Ojbywgc8OzIG9zIGFsdm9zIFwiYW50ZXJpb3JcIi9cInByw7N4aW1vXCIuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVllYXJDaGFuZ2UobmV3RGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIG5ld0RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyB5ZWFyOiAnbnVtZXJpYycgfSksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogTWVzbWEgbW90aXZhw6fDo28gZGUgYGFubm91bmNlWWVhckNoYW5nZWAsIHBhcmEgYSB2aWV3ICd5ZWFycycgKHBhZ2luYcOnw6NvIGRlIGTDqWNhZGEpIOKAlCBhbnVuY2lhXG4gICAgICogIG8gaW50ZXJ2YWxvIGF0dWFsbWVudGUgZXhpYmlkbyAoZXguOiBcIjIwMjAg4oCTIDIwMzFcIiksIGVzcGVsaGFuZG8gbyB0ZXh0byBkbyBgPHNwYW4+YCBjZW50cmFsLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKGAke3RoaXMuY3VycmVudERlY2FkZVN0YXJ0KCl9IOKAkyAke3RoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgKyAxMX1gLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5tb2RlKCkgPT09ICdyYW5nZScgJiYgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgLy8gQ2FuY2VsYW1lbnRvIGxldmU6IGRlc2lzdGUgc8OzIGRhIGRhdGEgaW5pY2lhbCBwZW5kZW50ZSwgbWFudGVuZG8gbyBwYWluZWwgYWJlcnRvLFxuICAgICAgICAgICAgLy8gZW0gdmV6IGRlIGZlY2hhciBvIGRpw6Fsb2dvIGludGVpcm8gKG8gw7puaWNvIGNhbWluaG8gYW50ZXMgZGlzc28pLiBgc3RvcFByb3BhZ2F0aW9uYFxuICAgICAgICAgICAgLy8gaW1wZWRlIGVzc2UgbWVzbW8gRXNjYXBlIGRlIGJvcmJ1bGhhciBhdMOpIGBkb2N1bWVudC5ib2R5YCwgb25kZSBvXG4gICAgICAgICAgICAvLyBgT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcmAgZG8gQ0RLIGVzY3V0YSBga2V5ZG93bmAgKGZhc2UgZGUgYnViYmxlLCBzZW0gY2FwdHVyZSkgZVxuICAgICAgICAgICAgLy8gZGlzcGFyYXJpYSBgaGFuZGxlT3ZlcmxheUtleWRvd25gL2BjbG9zZVBhbmVsKClgIOKAlCBzZW0gaXNzbywgbyBjYW5jZWxhbWVudG8gbGV2ZSBlIG9cbiAgICAgICAgICAgIC8vIGZlY2hhbWVudG8gdG90YWwgYWNvbnRlY2VyaWFtIG5lc3NlIG1lc21vIEVzY2FwZS4gU2VtIGBwZW5kaW5nUmFuZ2VTdGFydGAsIGVzc2UgYGlmYFxuICAgICAgICAgICAgLy8gw6kgZmFsc28gZSBvIEVzY2FwZSBzZWd1ZSBpbnRvY2FkbyBhdMOpIGBkb2N1bWVudC5ib2R5YCwgZmVjaGFuZG8gbyBwYWluZWwgY29tbyBzZW1wcmUuXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsUGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IEFSUk9XUyA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXTtcbiAgICAgICAgaWYgKCFBUlJPV1MuaW5jbHVkZXMoZXZlbnQua2V5KSkgcmV0dXJuO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBBcnJheS5mcm9tKGdyaWQucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ2J1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0nKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJZHggPSBidXR0b25zLmluZGV4T2YoZXZlbnQudGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50KTtcbiAgICAgICAgaWYgKGN1cnJlbnRJZHggPT09IC0xKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGRlbHRhID0gMDtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSBkZWx0YSA9IDE7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIGRlbHRhID0gLTE7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIGRlbHRhID0gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUs7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSBkZWx0YSA9IC1EYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcblxuICAgICAgICBjb25zdCBuZXh0SWR4ID0gY3VycmVudElkeCArIGRlbHRhO1xuXG4gICAgICAgIGlmIChuZXh0SWR4IDwgMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldkRpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1heCgwLCBidG5zLmxlbmd0aCArIG5leHRJZHgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIC0xKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJZHggPj0gYnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHREaXNhYmxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgpO1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRucyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ2J1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0nKSA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gTWF0aC5taW4obmV4dElkeCAtIGJ1dHRvbnMubGVuZ3RoLCBidG5zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIDEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFidXR0b25zW25leHRJZHhdPy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgYnV0dG9uc1tuZXh0SWR4XS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEVuYWJsZWQoXG4gICAgICAgIGJ1dHRvbnM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgICAgIHN0YXJ0SWR4OiBudW1iZXIsXG4gICAgICAgIGRpcmVjdGlvbjogMSB8IC0xLFxuICAgICk6IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA+PSAwICYmIGkgPCBidXR0b25zLmxlbmd0aDsgaSArPSBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1tpXS5kaXNhYmxlZCkgcmV0dXJuIGJ1dHRvbnNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN3aXRjaFRvTW9udGhzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdtb250aHMnKTtcbiAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBiYWNrVG9DYWxlbmRhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnY2FsZW5kYXInKTtcbiAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBTZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5KTogdm9pZCB7XG4gICAgICAgIGlmIChkYXkuaXNEaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU11bHRpcGxlRGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgICAgIC8vIFNlbSBpc3NvIG8gPGlucHV0PiBmaWNhdmEgY29tIG8gdmFsb3IgYW50ZXJpb3IgKG91IHZhemlvKSBlbnF1YW50byBzw7MgYSBkYXRhXG4gICAgICAgICAgICAgICAgLy8gaW5pY2lhbCBlc3RhdmEgZXNjb2xoaWRhIOKAlCB0YW50byBvIHRleHRvIHZpc8OtdmVsIHF1YW50byBvIHF1ZSB1bSBsZWl0b3IgZGUgdGVsYVxuICAgICAgICAgICAgICAgIC8vIGzDqiBhbyBmb2NhciBvIGNhbXBvIGZpY2F2YW0gb2Jzb2xldG9zIGF0w6kgYSBzZWd1bmRhIGVzY29saGEuXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoeyBzdGFydDogZGF5LmRhdGUsIGVuZDogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlUmFuZ2VTdGFydFNlbGVjdGVkKGRheS5kYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID1cbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5nZXRUaW1lKCkgPD0gZGF5LmRhdGUuZ2V0VGltZSgpID8gW3BlbmRpbmcsIGRheS5kYXRlXSA6IFtkYXkuZGF0ZSwgcGVuZGluZ107XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2U6IERhdGVSYW5nZSA9IHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlUmFuZ2VDb21wbGV0ZWQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRheS5kYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5oaWRlT25EYXRlVGltZVNlbGVjdCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQWRpY2lvbmEvcmVtb3ZlIHVtYSBkYXRhIGRhIHNlbGXDp8OjbyBtw7psdGlwbGEuIE8gcGFpbmVsIHBlcm1hbmVjZSBhYmVydG8uICovXG4gICAgcHJpdmF0ZSB0b2dnbGVNdWx0aXBsZURhdGUoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm11bHRpcGxlVmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZXhpc3RpbmcuZmluZEluZGV4KChkKSA9PiBpc1NhbWVEYXkoZCwgbm9ybWFsaXplZCkpO1xuICAgICAgICBjb25zdCBuZXh0ID1cbiAgICAgICAgICAgIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICA/IGV4aXN0aW5nLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpXG4gICAgICAgICAgICAgICAgOiBbLi4uZXhpc3RpbmcsIG5vcm1hbGl6ZWRdLnNvcnQoKGEsIGIpID0+IGEuZ2V0VGltZSgpIC0gYi5nZXRUaW1lKCkpO1xuICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChuZXh0KTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV4dCk7XG4gICAgICAgIGNvbnN0IGVtaXRWYWx1ZSA9IG5leHQubGVuZ3RoID8gbmV4dCA6IG51bGw7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoZW1pdFZhbHVlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGVtaXRWYWx1ZSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VNdWx0aXBsZURhdGVUb2dnbGUobm9ybWFsaXplZCwgaW5kZXggPCAwKTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSB2aWEgTGl2ZUFubm91bmNlciBhIGRhdGEgY29tcGxldGEgKGRpYSBkYSBzZW1hbmEsIGRpYSwgbcOqcywgYW5vKSBlIHNlIGVsYSBhY2Fib3VcbiAgICAgKiAgZGUgc2VyIHNlbGVjaW9uYWRhIG91IGRlc21hcmNhZGEg4oCUIHBybyB1c3XDoXJpbyBkZSBsZWl0b3IgZGUgdGVsYSBzYWJlciBleGF0YW1lbnRlIG8gcXVlXG4gICAgICogIG11ZG91IGFudGVzIGRlIHNlZ3VpciBlc2NvbGhlbmRvIGEgcHLDs3hpbWEgZGF0YS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlTXVsdGlwbGVEYXRlVG9nZ2xlKGRhdGU6IERhdGUsIGlzTm93U2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0ZVRleHQgPSB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChkYXRlKTtcbiAgICAgICAgY29uc3Qga2V5ID0gaXNOb3dTZWxlY3RlZFxuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF0ZV9zZWxlY3RlZCdcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RhdGVfZGVzZWxlY3RlZCc7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSwgeyBkYXRlOiBkYXRlVGV4dCB9KSwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKiBUZXh0byBjb21wYXJ0aWxoYWRvIGVudHJlIG8gYW7Dum5jaW8gdHJhbnNpdMOzcmlvIGRlIGluw61jaW8gZGUgaW50ZXJ2YWxvIGVzY29saGlkb1xuICAgICAqICAoYGFubm91bmNlUmFuZ2VTdGFydFNlbGVjdGVkYCkgZSBvIHN0YXR1cyBwZXJzaXN0ZW50ZSBleHBvc3RvIHZpYSBgYXJpYS1kZXNjcmliZWRieWAgbm9cbiAgICAgKiAgYDxpbnB1dD5gIChgcmFuZ2VQZW5kaW5nU3RhdHVzVGV4dGApIOKAlCBtZXNtYSByZWRhw6fDo28gbm9zIGRvaXMgbHVnYXJlcyBkZSBwcm9ww7NzaXRvLCBwcmEgbsOjb1xuICAgICAqICBzb2FyZW0gY29tbyBkb2lzIGVzdGFkb3MgZGlmZXJlbnRlcyBwcm8gbWVzbW8gbW9tZW50by4gKi9cbiAgICBwcml2YXRlIGJ1aWxkUmFuZ2VTdGFydFNlbGVjdGVkVGV4dChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9yYW5nZV9zdGFydF9zZWxlY3RlZCcsIHtcbiAgICAgICAgICAgIGRhdGU6IHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGUpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBxdWUgYSBkYXRhIElOSUNJQUwgZG8gaW50ZXJ2YWxvIGZvaSBlc2NvbGhpZGEg4oCUIG8gcHJpbWVpcm8gY2xpcXVlIGVtIGByYW5nZWAgZXJhXG4gICAgICogIG11ZG8gKGFvIGNvbnRyw6FyaW8gZG8gdG9nZ2xlIGVtIG1vZG8gYG11bHRpcGxlYCwgc2VtcHJlIGFudW5jaWFkbykuIFJlY2ViZSB1bSBgRGF0ZWAgcHVybyxcbiAgICAgKiAgbsOjbyB1bSBjbGlxdWU6IGBzZWxlY3RUb2RheSgpYCBjaGFtYSBgc2VsZWN0RGF0ZSgpYCBpbnRlcm5hbWVudGUgZSBoZXJkYSBlc3RlIGFuw7puY2lvIGRlXG4gICAgICogIGdyYcOnYSwgc2VtIHByZWNpc2FyIGRlIHVtYSBzZWd1bmRhIGNoYW1hZGEuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVJhbmdlU3RhcnRTZWxlY3RlZChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRoaXMuYnVpbGRSYW5nZVN0YXJ0U2VsZWN0ZWRUZXh0KGRhdGUpLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIEFudW5jaWEgbyBpbnRlcnZhbG8gY29uY2x1w61kbywgY2hhbWFkbyBhbnRlcyBkZSBgY2xvc2VQYW5lbCgpYCDigJQgbyBgTGl2ZUFubm91bmNlcmAgZXNjcmV2ZVxuICAgICAqICBudW1hIHJlZ2nDo28gYGFyaWEtbGl2ZWAgcHLDs3ByaWEgZSBkZXNhY29wbGFkYSBkbyBmb2NvLCBlbnTDo28gbsOjbyDDqSBjb3J0YWRvIHBlbGEgcmVzdGF1cmHDp8Ojb1xuICAgICAqICBkZSBmb2NvIHF1ZSBgY2xvc2VQYW5lbCgpYCBhZ2VuZGEgdW0gdGljayBkZXBvaXMgdmlhIGBhZnRlck5leHRSZW5kZXJgLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VSYW5nZUNvbXBsZXRlZChyYW5nZTogRGF0ZVJhbmdlKTogdm9pZCB7XG4gICAgICAgIGlmICghcmFuZ2Uuc3RhcnQgfHwgIXJhbmdlLmVuZCkgcmV0dXJuO1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9yYW5nZV9zZWxlY3RlZCcsIHtcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwocmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwocmFuZ2UuZW5kKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdFllYXIoeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzWWVhckRpc2FibGVkKHllYXIpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0TW9udGgobW9udGhJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTW9udGhEaXNhYmxlZChtb250aEluZGV4KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgICAgICBjb25zdCBuZXdWaWV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoSW5kZXgsIDEpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGlmICghdGhpcy5pc0RhdGVEaXNhYmxlZCh0b2RheSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbERheTogQ2FsZW5kYXJEYXkgPSB7XG4gICAgICAgICAgICAgICAgZGF0ZTogdG9kYXksXG4gICAgICAgICAgICAgICAgZGF5T2ZNb250aDogdG9kYXkuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzVG9kYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSYW5nZVN0YXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlRW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0luUmFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjYWxEYXkpO1xuICAgICAgICAgICAgdGhpcy50b2RheUNsaWNrLmVtaXQodG9kYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnICYmIHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBFbSByYW5nZSwgc2VsZWN0RGF0ZSgpIHPDsyBmZWNoYSBvIHBhaW5lbCBuYSBzZWd1bmRhIGVzY29saGEgKHZlciBzZXUgcmFtb1xuICAgICAgICAgICAgICAgIC8vICdyYW5nZScpOyBuYSBwcmltZWlyYSwgbyBmb2NvIGZpY2EgcGFyYWRvIG5vIGJvdMOjbyBcIkhvamVcIiBkbyByb2RhcMOpLCBmb3JhIGRhXG4gICAgICAgICAgICAgICAgLy8gZ3JhZGUg4oCUIHNlbSBpc3NvIG8gdXN1w6FyaW8gbsOjbyB0aW5oYSBuZW5odW1hIHBpc3RhIGRlIHF1ZSBwcmVjaXNhdmEgdm9sdGFyIHByYVxuICAgICAgICAgICAgICAgIC8vIGdyYWRlIHByYSBlc2NvbGhlciBhIGRhdGEgZmluYWwuIEEgY8OpbHVsYSBkZSBob2plIGrDoSBjYXJyZWdhXG4gICAgICAgICAgICAgICAgLy8gYGRhdGEtZm9jdXM9XCJzZWxlY3RlZFwiYCAoaXNSYW5nZVN0YXJ0IGFjYWJvdSBkZSBzZXIgc2V0YWRvIHBvciBzZWxlY3REYXRlKSwgcXVlXG4gICAgICAgICAgICAgICAgLy8gZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKSBqw6EgcHJpb3JpemEuIE8gYW7Dum5jaW8gZGUgXCJpbsOtY2lvIHNlbGVjaW9uYWRvXCIgasOhXG4gICAgICAgICAgICAgICAgLy8gZGlzcGFyb3UgZGVudHJvIGRlIHNlbGVjdERhdGUoKSBhbnRlcyBkZXN0ZSBibG9jbyByb2Rhci5cbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xlYXJWYWx1ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBoYWRSYW5nZUluUHJvZ3Jlc3MgPVxuICAgICAgICAgICAgdGhpcy5tb2RlKCkgPT09ICdyYW5nZScgJiYgKHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKSAhPT0gbnVsbCB8fCB0aGlzLnJhbmdlVmFsdWUoKSAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgwKTtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgwKTtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgwKTtcbiAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5tdWx0aXBsZVZhbHVlcy5zZXQoW10pO1xuICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG51bGwpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5jbGVhckNsaWNrLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAoaGFkUmFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAvLyBTw7MgYW51bmNpYSBxdWFuZG8gaGF2aWEgZGUgZmF0byBhbGdvIGEgbGltcGFyIOKAlCBldml0YSBcImludGVydmFsbyBsaW1wb1wiIHRvZGEgdmV6XG4gICAgICAgICAgICAvLyBxdWUgYWxndcOpbSBhcGVydGEgXCJMaW1wYXJcIiBwb3IgZ2FyYW50aWEsIHNlbSBuYWRhIHNlbGVjaW9uYWRvIGFpbmRhLlxuICAgICAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UoXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX2NsZWFyZWQnKSxcbiAgICAgICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gbmV3IERhdGUoXG4gICAgICAgICAgICBjdXJyZW50LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldE1vbnRoKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBUaW1lIHBpY2tlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSArIHRoaXMuc3RlcEhvdXIoKSkgJSB0aGlzLm1heEhvdXJzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50SG91cnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRNaW51dGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KCh0aGlzLm1pbnV0ZXMoKSArIHRoaXMubWludXRlU3RlcCgpKSAlIHRoaXMubWF4TWludXRlcyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpIC0gdGhpcy5taW51dGVTdGVwKCkgKyB0aGlzLm1heE1pbnV0ZXMpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5jcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgKyB0aGlzLnN0ZXBTZWNvbmQoKSkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpIC0gdGhpcy5zdGVwU2Vjb25kKCkgKyA2MCkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudEhvdXJzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SG91cnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2Vjb25kc0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U2Vjb25kcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgICAgICBjb25zdCBoMTIgPSBNYXRoLm1pbihoYWxmLCBNYXRoLm1heCgxLCBwYXJzZWQpKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBoMTIgJSBoYWxmO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQodGhpcy5hbVBtKCkgPT09ICdQTScgPyBiYXNlICsgaGFsZiA6IGJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoTWF0aC5taW4odGhpcy5tYXhIb3VycyAtIDEsIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKiBBbHRlcm5hIGVudHJlIEFNIGUgUE0gc29tYW5kby9zdWJ0cmFpbmRvIDEyIGhvcmFzIGRhIGhvcmEgaW50ZXJuYS4gKi9cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlQW1QbSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFsZiA9IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmhvdXJzKCkgPCBoYWxmID8gdGhpcy5ob3VycygpICsgaGFsZiA6IHRoaXMuaG91cnMoKSAtIGhhbGYpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoTWF0aC5taW4odGhpcy5tYXhNaW51dGVzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoTWF0aC5taW4oNTksIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EYXlIb3ZlcihkYXRlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZGF0ZSkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGRhdGUpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERheXMgPSB0aGlzLmRpc2FibGVkRGF5cygpO1xuICAgICAgICBpZiAoZGlzYWJsZWREYXlzLmxlbmd0aCAmJiBkaXNhYmxlZERheXMuaW5jbHVkZXMoZGF0ZS5nZXREYXkoKSkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERhdGVzID0gdGhpcy5kaXNhYmxlZERhdGVzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERhdGVzLmxlbmd0aCAmJiBkaXNhYmxlZERhdGVzLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiB5ZWFyID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQ3VycmVudFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB5ZWFyID09PSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhTZWxlY3RlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgKHllYXIgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA8IG1pbi5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggJiYgKHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA+IG1heC5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFkVGltZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9XG5cbiAgICAvKiogYGRheWAgw6kgb3BjaW9uYWwgZSBzw7MgdXNhZG8gZW0gYG1vZGU9XCJyYW5nZVwiYCDigJQgb3MgZGVtYWlzIGNhbGwgc2l0ZXMgKHJlc3VtbyBkbyB2YWxvclxuICAgICAqICBzZWdtZW50YWRvLCBhbsO6bmNpbyBkZSB0b2dnbGUgZW0gbW9kbyBgbXVsdGlwbGVgKSBudW5jYSB0w6ptIHVtIGBDYWxlbmRhckRheWAgw6AgbcOjbyBlIG51bmNhXG4gICAgICogIHJvZGFtIGVtIGByYW5nZWAsIGVudMOjbyBjb250aW51YW0gcmVjZWJlbmRvIGV4YXRhbWVudGUgbyB0ZXh0byBkZSBzZW1wcmUuICovXG4gICAgcHJvdGVjdGVkIGZvcm1hdERheUFyaWFMYWJlbChkYXRlOiBEYXRlLCBkYXk/OiBDYWxlbmRhckRheSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmN1cnJlbnRMYW5nKCksIHtcbiAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZGF5IHx8IHRoaXMubW9kZSgpICE9PSAncmFuZ2UnKSByZXR1cm4gYmFzZTtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gdGhpcy5yYW5nZURheVN0YXR1c1N1ZmZpeChkYXkpO1xuICAgICAgICByZXR1cm4gc3VmZml4ID8gYCR7YmFzZX0sICR7c3VmZml4fWAgOiBiYXNlO1xuICAgIH1cblxuICAgIC8qKiBTdWZpeG8gcXVlIGRpeiBvIHBhcGVsIGRvIGRpYSBkZW50cm8gZG8gaW50ZXJ2YWxvIHNlbGVjaW9uYWRvIOKAlCBzZW0gaXNzbywgdG9kYSBjw6lsdWxhIGRhXG4gICAgICogIGdyYWRlIHNvYSBpZMOqbnRpY2EgcHJvIGxlaXRvciBkZSB0ZWxhLCBlIG8gw7puaWNvIGplaXRvIGRlIHNhYmVyIG9uZGUgZXN0w6EgbyBpbsOtY2lvL2ZpbSDDqVxuICAgICAqICBlbnhlcmdhbmRvIG8gZGVzdGFxdWUgdmlzdWFsLiAqL1xuICAgIHByaXZhdGUgcmFuZ2VEYXlTdGF0dXNTdWZmaXgoZGF5OiBDYWxlbmRhckRheSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChkYXkuaXNSYW5nZVN0YXJ0ICYmIGRheS5pc1JhbmdlRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3N0YXJ0X2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkuaXNSYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3N0YXJ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc1JhbmdlRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkuaXNJblJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX2luX3JhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKiBGb3JtYXRhIG8gdmFsb3IgcGFyYSBleGliacOnw6NvIG5vIGlucHV0LCBhcGxpY2FuZG8gcmFuZ2VTZXBhcmF0b3IsIGRhdGVGb3JtYXQgZSBtdWx0aXBsZVNlcGFyYXRvci4gKi9cbiAgICBwcml2YXRlIGZvcm1hdEZvckRpc3BsYXkodmFsdWU6IERhdGUgfCBEYXRlUmFuZ2UgfCBEYXRlW10gfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlRm9ySW5wdXQoXG4gICAgICAgICAgICB0aGlzLm1vZGUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlcGFyYXRvcigpLFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZERhdGVGb3JtYXQoKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZXBhcmF0b3IoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHVhbGl6YSBgaW5wdXREYXRlYCBhIHBhcnRpciBkZSB1bSB2YWxvciDDum5pY28sIHJvdGVhbmRvIHBlbGEgZW5naW5lIGRlIHNlZ21lbnRvc1xuICAgICAqIChkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWUpIG91IHBlbG8gZm9ybWF0YWRvciBsZWdhZG8gKHJhbmdlL3llYXIvbXVsdGlwbGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0RGlzcGxheUZvcih2YWx1ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdmFsdWUgPyB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIChSZSljb25maWd1cmEgYSBlbmdpbmUgZGUgc2VnbWVudG9zIHF1YW5kbyBgbW9kZWAvYGRhdGVGb3JtYXRgL2Bob3VyRm9ybWF0YC9gc2hvd1NlY29uZHNgXG4gICAgICogbXVkYXJhbSBkZXNkZSBhIMO6bHRpbWEgY2hhbWFkYSwgcmVjYXJyZWdhbmRvIG8gdmFsb3IgYXR1YWwuIENoYW1hZG8gZGUgZm9ybWEgc8OtbmNyb25hIGFcbiAgICAgKiBwYXJ0aXIgZGUgdG9kbyBwb250byBkZSBlbnRyYWRhIHF1ZSB1c2EgYSBlbmdpbmUg4oCUIG7Do28gZGVwZW5kZSBkZSB1bSBgZWZmZWN0KClgIChxdWUgc8OzXG4gICAgICogcm9kYSBlbSB1bSBjaWNsbyBkZSBjaGFuZ2UgZGV0ZWN0aW9uLCB0YXJkZSBkZW1haXMgcGFyYSBsZWl0dXJhcy9lc2NyaXRhcyBpbWVkaWF0YXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgaWYgKG1vZGUgIT09ICdkYXRlJyAmJiBtb2RlICE9PSAnbW9udGgnICYmIG1vZGUgIT09ICd0aW1lJyAmJiBtb2RlICE9PSAnZGF0ZXRpbWUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0OiB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgaG91ckZvcm1hdDogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSxcbiAgICAgICAgICAgIHNob3dTZWNvbmRzOiB0aGlzLnNob3dTZWNvbmRzKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RTZWdtZW50Q29uZmlnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsYXN0ICYmXG4gICAgICAgICAgICBsYXN0Lm1vZGUgPT09IGNvbmZpZy5tb2RlICYmXG4gICAgICAgICAgICBsYXN0LmRhdGVGb3JtYXQgPT09IGNvbmZpZy5kYXRlRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LmhvdXJGb3JtYXQgPT09IGNvbmZpZy5ob3VyRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LnNob3dTZWNvbmRzID09PSBjb25maWcuc2hvd1NlY29uZHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VnbWVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNvbmZpZ3VyZShjb25maWcpO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHRoaXMudmFsdWUoKSk7XG4gICAgfVxuXG4gICAgLyoqIFJldG9ybmEgYSB0cmFkdcOnw6NvIGRlIGBrZXlgLCBvdSBgZmFsbGJhY2tgIHF1YW5kbyBhIGNoYXZlIG7Do28gZXN0w6EgdHJhZHV6aWRhIChuZ3gtdHJhbnNsYXRlIHJldG9ybmEgYSBwcsOzcHJpYSBjaGF2ZSkuICovXG4gICAgcHJpdmF0ZSByZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zbGF0ZWQgIT09ICdzdHJpbmcnIHx8ICF0cmFuc2xhdGVkIHx8IHRyYW5zbGF0ZWQgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3luY1RpbWVUb1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy52YWx1ZSgpID8/IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDYWxlbmRhckRheShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4sXG4gICAgICAgIHRvZGF5OiBEYXRlLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZSB8IG51bGwsXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9LFxuICAgICAgICByYW5nZVN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbCxcbiAgICAgICAgcmFuZ2VFbmRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICk6IENhbGVuZGFyRGF5IHtcbiAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2Uuc3RhcnQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSByYW5nZS5lbmQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2UuZW5kKSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRlVGltZSA9IHN0cmlwVGltZShkYXRlKTtcbiAgICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgICAgIHJhbmdlU3RhcnRUaW1lICE9PSBudWxsICYmIHJhbmdlRW5kVGltZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZGF0ZVRpbWUgPiByYW5nZVN0YXJ0VGltZSAmJiBkYXRlVGltZSA8IHJhbmdlRW5kVGltZVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzTXVsdGlwbGVNb2RlKClcbiAgICAgICAgICAgID8gdGhpcy5tdWx0aXBsZVZhbHVlcygpLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRcbiAgICAgICAgICAgICAgPyBpc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlPZk1vbnRoOiBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IGlzU2FtZURheShkYXRlLCB0b2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSB8fCAoIWlzQ3VycmVudE1vbnRoICYmICF0aGlzLnNlbGVjdE90aGVyTW9udGhzKCkpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgaXNSYW5nZUVuZCxcbiAgICAgICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0Zvcm1hdEVycm9yKSByZXR1cm4geyBpbnZhbGlkRm9ybWF0OiB0cnVlIH07XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZCkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydCAmJiBtaW4gJiYgc3RyaXBUaW1lKHZhbHVlLnN0YXJ0KSA8IHN0cmlwVGltZShtaW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiB2YWx1ZS5zdGFydCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuZW5kICYmIG1heCAmJiBzdHJpcFRpbWUodmFsdWUuZW5kKSA+IHN0cmlwVGltZShtYXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiB2YWx1ZS5lbmQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkID0gdmFsdWUgYXMgRGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGlmIChtaW4gJiYgZC5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICBpZiAobWF4ICYmIGQuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEYXRlUmFuZ2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlUmFuZ2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnc3RhcnQnIGluIHZhbHVlICYmICdlbmQnIGluIHZhbHVlO1xuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIGFyaWEtaGFzcG9wdXA9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInBvcHVwSWQoKVwiXG4+XG4gICAgPGlucHV0XG4gICAgICAgICN0cmlnZ2VySW5wdXRcbiAgICAgICAgY2xhc3M9XCJoLVszNXB4XSB3LWZ1bGwgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMyB0ZXh0LXNtIG91dGxpbmUtbm9uZSB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgW2NsYXNzLnByLTEwXT1cInNob3dJY29uKCkgJiYgIXNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLnByLTE2XT1cInNob3dJY29uKCkgJiYgc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MucHItNl09XCIhc2hvd0ljb24oKSAmJiBzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTVdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2lkXT1cImlucHV0SWQoKVwiXG4gICAgICAgIFtuYW1lXT1cIm5hbWUoKSA/PyBpbnB1dElkKClcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpID8/IChwbGFjZWhvbGRlcktleSgpIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIlxuICAgICAgICAgICAgcmVhZG9ubHlJbnB1dCgpIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICdyYW5nZScgfHxcbiAgICAgICAgICAgIG1vZGUoKSA9PT0gJ3llYXInIHx8XG4gICAgICAgICAgICBpc011bHRpcGxlTW9kZSgpIHx8XG4gICAgICAgICAgICAoaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpICYmIGlzVG91Y2hEZXZpY2UoKSlcbiAgICAgICAgXCJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4KCkgPz8gbnVsbFwiXG4gICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0RGF0ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwiaGFuZGxlSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGJsdXIpPVwiaGFuZGxlSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAobW91c2Vkb3duKT1cImhhbmRsZUlucHV0Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cImhhbmRsZVRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAoaW5wdXQpPVwiaGFuZGxlTmF0aXZlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJuZ0NvbnRyb2w/LmNvbnRyb2w/LmludmFsaWQgfHwgbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibW9kZSgpID09PSAncmFuZ2UnID8gcmFuZ2VTdGF0dXNFbGVtZW50SWQoKSA6IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRpYWxvZ0FyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlOiBkaWFsb2dBcmlhTGFiZWxQYXJhbXMoKVwiXG4gICAgLz5cblxuICAgIEBpZiAobW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICAgICAgW2lkXT1cInJhbmdlU3RhdHVzRWxlbWVudElkKClcIlxuICAgICAgICAgICAgPnt7IHJhbmdlUGVuZGluZ1N0YXR1c1RleHQoKSB9fTwvc3BhblxuICAgICAgICA+XG4gICAgfVxuXG4gICAgQGlmIChzaG93Q2xlYXIoKSAmJiBpbnB1dERhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGZsZXggaC1bMzVweF0gdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWdyYXlzY2FsZS02MCB0cmFuc2l0aW9uLWNvbG9ycyBob3Zlcjp0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtOV09XCJzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yaWdodC0wXT1cIiFzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgQGlmIChzaG93SWNvbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNpY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCBmbGV4IGgtWzM1cHhdIHctOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWwgYm9yZGVyLXNvbGlkIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cIiFkaXNhYmxlZCgpICYmICFpc0ZvY3VzZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXByaW1hcnldPVwiaXNGb2N1c2VkKCkgJiYgIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ob3ZlcjpiZy1ncmF5c2NhbGUtMTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfb3BlbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJyZXNvbHZlZEljb24oKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlbigpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cInBvc2l0aW9uc1wiXG4gICAgKGJhY2tkcm9wQ2xpY2spPVwiaGFuZGxlQmFja2Ryb3BDbGljaygkZXZlbnQpXCJcbiAgICAob3ZlcmxheUtleWRvd24pPVwiaGFuZGxlT3ZlcmxheUtleWRvd24oJGV2ZW50KVwiXG4gICAgKGRldGFjaCk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICAjcG9wdXBQYW5lbFxuICAgICAgICBjbGFzcz1cInotNTAgdy03MiByb3VuZGVkLW1lZGl1bSBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAgc2hhZG93LW1kXCJcbiAgICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICAgIGNka1RyYXBGb2N1c1xuICAgICAgICBbaWRdPVwicG9wdXBJZCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkaWFsb2dBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZTogZGlhbG9nQXJpYUxhYmVsUGFyYW1zKClcIlxuICAgID5cbiAgICAgICAgQGlmIChzaG93Q2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdjYWxlbmRhcicpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gbWVuc2FsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9tb250aCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbW9udGg6IHByZXZNb250aFRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9tb250aF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3dpdGNoVG9Nb250aHMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRNb250aEtleSgpIHwgdHJhbnNsYXRlIH19Jm5ic3A7e3sgY3VycmVudFllYXIoKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC1bMTBweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfbW9udGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1vbnRoOiBuZXh0TW9udGhUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxob3MgZG9zIGRpYXMgZGEgc2VtYW5hIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IHB4LTMgcHQtMlwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF5S2V5IG9mIG9yZGVyZWRXZWVrRGF5S2V5cygpOyB0cmFjayBkYXlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRheUtleSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5S2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkbyBjYWxlbmTDoXJpbyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBweC0zIHBiLTJcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckdyaWRBcmlhTGFiZWxLZXkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1vbnRoOiAoY3VycmVudE1vbnRoS2V5KCkgfCB0cmFuc2xhdGUpLCB5ZWFyOiBjdXJyZW50WWVhcigpIH1cbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibW9kZSgpID09PSAncmFuZ2UnID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhckdyaWRLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAod2VlayBvZiBjYWxlbmRhcldlZWtzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrOyB0cmFjayBkYXkuZGF0ZS50b0lTT1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MCVdIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERheUFyaWFMYWJlbChkYXkuZGF0ZSwgZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQgfHwgZGF5LmlzSW5SYW5nZSB8fCBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheS5pc1RvZGF5ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aCA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3NlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRheS5pc1RvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndG9kYXknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtMTAgaG92ZXI6YmctZ3JheXNjYWxlLTIwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzSW5SYW5nZSAmJiAhZGF5LmlzUmFuZ2VTdGFydCAmJiAhZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNTZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VTdGFydCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VFbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0Rpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtNjAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmluZy0yIHJpbmctaW5zZXQgcmluZy1wcmltYXJ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzVG9kYXkgJiYgIWRheS5pc1NlbGVjdGVkICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogZGF5LmlzRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5SG92ZXIoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uRGF5SG92ZXIobnVsbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRGF5SG92ZXIoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkuZGF5T2ZNb250aCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkZSBuYXZlZ2HDp8OjbyBwb3IgZMOpY2FkYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbmF2LWhlYWRlclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X2RlY2FkZScgfCB0cmFuc2xhdGU6IHByZXZEZWNhZGVSYW5nZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgY3VycmVudERlY2FkZVN0YXJ0KCkgfX0g4oCTIHt7IGN1cnJlbnREZWNhZGVTdGFydCgpICsgMTEgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF9kZWNhZGUnIHwgdHJhbnNsYXRlOiBuZXh0RGVjYWRlUmFuZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRlIGFub3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgcHgtMyBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIHllYXJzR3JpZCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yICh5ZWFyIG9mIHJvdzsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1llYXJTZWxlY3RlZCh5ZWFyKSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcikgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJpc0N1cnJlbnRZZWFyKHllYXIpID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzWWVhclNlbGVjdGVkKHllYXIpID8gJ3NlbGVjdGVkJyA6IGlzQ3VycmVudFllYXIoeWVhcikgPyAndG9kYXknIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1llYXJEaXNhYmxlZCh5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLXByaW1hcnkgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXlzY2FsZS0wJzogaXNZZWFyU2VsZWN0ZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWluc2V0IHJpbmctcHJpbWFyeSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VycmVudFllYXIoeWVhcikgJiYgIWlzWWVhclNlbGVjdGVkKHllYXIpICYmICFpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzWWVhclNlbGVjdGVkKHllYXIpICYmICFpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gYW51YWwgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBkYXRhLW5hdi1oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl95ZWFyJyB8IHRyYW5zbGF0ZTogeyB5ZWFyOiBwcmV2WWVhclRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgY3VycmVudFllYXIoKSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfeWVhcicgfCB0cmFuc2xhdGU6IHsgeWVhcjogbmV4dFllYXJUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZGUgbWVzZXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgcHgtMyBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBtb250aHNHcmlkKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIHJvdzsgdHJhY2sgbW9udGguaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpID8gJ3NlbGVjdGVkJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpICYmICFpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9udGgobW9udGguaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGgua2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSAhPT0gJ21vbnRoJykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWFycm93LWxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2JhY2tfdG9fY2FsZW5kYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBUaW1lIHBpY2tlciAtLT5cbiAgICAgICAgQGlmIChzaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMyBweC00IHB5LTNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItdF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zb2xpZF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF90aW1lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBIb3JhcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgI2luY3JlYXNlSG91ckJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X2hvdXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IG5leHRIb3VyVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoZGlzcGxheUhvdXJzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUhvdXJzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlSG91cnNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X2hvdXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IHByZXZIb3VyVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID46PC9zcGFuXG4gICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBNaW51dG9zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9pbmNyZW1lbnRfbWludXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBuZXh0TWludXRlVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShtaW51dGVzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlTWludXRlc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZU1pbnV0ZXNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X21pbnV0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogcHJldk1pbnV0ZVRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50TWludXRlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93U2Vjb25kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+Ojwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWd1bmRvcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X3NlY29uZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IG5leHRTZWNvbmRUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoc2Vjb25kcygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWNvbmRzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVNlY29uZHNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X3NlY29uZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IHByZXZTZWNvbmRUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKGlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxldG9yIEFNL1BNIC0tPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgdy0xMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2dnbGVfbWVyaWRpZW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1lcmlkaWVtOiBuZXh0TWVyaWRpZW1UYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBbVBtKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhbVBtKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFJvZGFww6kgZGUgYcOnw7VlcyAtLT5cbiAgICAgICAgQGlmIChzaG93QnV0dG9uQmFyKCkgfHwgbW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci10IGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGUnIHx8IG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRvZGF5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3RvZGF5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jbGVhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBiZy1wcmltYXJ5IHB4LTMgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6b3BhY2l0eS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgYmctcHJpbWFyeSBweC0zIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS0wIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOm9wYWNpdHktOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19
1842
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULG1CQUFtQixFQUduQixVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFvQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQU1yRixTQUFTLGVBQWU7SUFDcEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBOEIsRUFBRSxFQUFFO1FBQ3JELE1BQU0sUUFBUSxHQUFtQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ2xFLFVBQVUsQ0FBQyxLQUFLLEdBQUcsVUFBeUIsS0FBb0I7WUFDNUQsTUFBTSxVQUFVLEdBQ1osQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQThERCxNQUFNLE9BQU8sbUJBQW1CO0lBQ3BCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sQ0FBVSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sQ0FBVSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sQ0FBVSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBVSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sQ0FBVSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBVSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUFVLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDL0IsTUFBTSxDQUFVLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakMsTUFBTSxDQUFVLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUN4QyxNQUFNLENBQVUseUJBQXlCLEdBQUcsR0FBRyxDQUFDO0lBRWhELE1BQU0sQ0FBQyxNQUFNO1FBQ2pCLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sZ0JBQWdCLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNELENBQUM7SUFFRCx5RUFBeUU7SUFFekUsNEVBQTRFO0lBQ25FLE9BQU8sR0FBRyxLQUFLLENBQVMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUUvRCwyQ0FBMkM7SUFDbEMsSUFBSSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBRWhDLDBEQUEwRDtJQUNqRCxXQUFXLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFFdkM7Ozs7Ozs7T0FPRztJQUNNLElBQUksR0FBRyxLQUFLLENBQWlCLE1BQU0sQ0FBQyxDQUFDO0lBRTlDOzs7O09BSUc7SUFDTSxhQUFhLEdBQUcsS0FBSyxDQUF3QixRQUFRLENBQUMsQ0FBQztJQUVoRSw2RUFBNkU7SUFDcEUsaUJBQWlCLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxDQUFDO0lBRWpELDhEQUE4RDtJQUNyRCxRQUFRLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO0lBRXpDOzs7T0FHRztJQUNNLElBQUksR0FBRyxLQUFLLENBQVMsaUJBQWlCLENBQUMsQ0FBQztJQUVqRCwyRUFBMkU7SUFDbEUsR0FBRyxHQUFHLEtBQUssQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUV4Qyw0RUFBNEU7SUFDbkUsR0FBRyxHQUFHLEtBQUssQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUV4QywrRUFBK0U7SUFDdEUsV0FBVyxHQUFHLEtBQUssQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUVoRDs7O09BR0c7SUFDTSxVQUFVLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUUzRDs7O09BR0c7SUFDTSxVQUFVLEdBQUcsS0FBSyxDQUEwQixTQUFTLENBQUMsQ0FBQztJQUVoRSw2REFBNkQ7SUFDcEQsVUFBVSxHQUFHLEtBQUssQ0FBUyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRTdFLCtEQUErRDtJQUN0RCxXQUFXLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTdDLDBEQUEwRDtJQUNqRCxjQUFjLEdBQUcsS0FBSyxDQUFTLEtBQUssQ0FBQyxDQUFDO0lBRS9DLHlGQUF5RjtJQUNoRixXQUFXLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO0lBRTVDLDhFQUE4RTtJQUNyRSxhQUFhLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRS9DLGdGQUFnRjtJQUN2RSxjQUFjLEdBQUcsS0FBSyxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBRTNDLDhEQUE4RDtJQUNyRCxhQUFhLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO0lBRTlDLHNEQUFzRDtJQUM3QyxTQUFTLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTNDLDZEQUE2RDtJQUNwRCxlQUFlLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO0lBRWhELDBFQUEwRTtJQUNqRSxpQkFBaUIsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFbkQsa0VBQWtFO0lBQ3pELG9CQUFvQixHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV0RCwwQ0FBMEM7SUFDakMsUUFBUSxHQUFHLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUVyQyw2Q0FBNkM7SUFDcEMsVUFBVSxHQUFHLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUV2Qyx1Q0FBdUM7SUFDOUIsUUFBUSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBRXBDLDZEQUE2RDtJQUNwRCxTQUFTLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTNDLHFEQUFxRDtJQUM1QyxhQUFhLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBRTNDLG1FQUFtRTtJQUMxRCxZQUFZLEdBQUcsS0FBSyxDQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRTVDLHlFQUF5RTtJQUV6RSx5Q0FBeUM7SUFDaEMsUUFBUSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUUxQyx5RUFBeUU7SUFFekUsMkNBQTJDO0lBQ2xDLE9BQU8sR0FBRyxNQUFNLEVBQVMsQ0FBQztJQUVuQyw0Q0FBNEM7SUFDbkMsT0FBTyxHQUFHLE1BQU0sRUFBUyxDQUFDO0lBRW5DLGlFQUFpRTtJQUN4RCxRQUFRLEdBQUcsTUFBTSxFQUFtQixDQUFDO0lBRTlDLCtFQUErRTtJQUN0RSxNQUFNLEdBQUcsTUFBTSxFQUFlLENBQUM7SUFFeEMseUNBQXlDO0lBQ2hDLFVBQVUsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUVyQyx3RUFBd0U7SUFDL0QsVUFBVSxHQUFHLE1BQU0sRUFBYyxDQUFDO0lBRTNDLDZDQUE2QztJQUNwQyxXQUFXLEdBQUcsTUFBTSxFQUFtQyxDQUFDO0lBRWpFLDZDQUE2QztJQUNwQyxVQUFVLEdBQUcsTUFBTSxFQUFtQyxDQUFDO0lBRWhFLGtEQUFrRDtJQUN6QyxJQUFJLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFFL0IsNERBQTREO0lBQ25ELFVBQVUsR0FBRyxNQUFNLEVBQVMsQ0FBQztJQUV0Qyx5RUFBeUU7SUFFdEQsUUFBUSxHQUFHLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztJQUN6QyxVQUFVLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFDO0lBQzdDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUVoQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRWYsU0FBUyxHQUFxQixJQUFJLENBQUM7SUFFMUIsS0FBSyxHQUFHLE1BQU0sQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUIsVUFBVSxHQUFHLE1BQU0sQ0FBYSxVQUFVLENBQUMsQ0FBQztJQUM1QyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixVQUFVLEdBQUcsTUFBTSxDQUFtQixJQUFJLENBQUMsQ0FBQztJQUM1QyxjQUFjLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLGlCQUFpQixHQUFHLE1BQU0sQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUM5QyxTQUFTLEdBQUcsTUFBTSxDQUFjLElBQUksQ0FBQyxDQUFDO0lBQ2pELGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDeEIsaUJBQWlCLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ3pDLFNBQVMsR0FBcUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ3ZELFVBQVUsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFekIsVUFBVSxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMzRCxrQkFBa0IsR0FBRyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMzRSxVQUFVLEdBQUcsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzNELFlBQVksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1QyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFdEMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFekUsa0dBQWtHO0lBQy9FLGFBQWEsR0FBRyxNQUFNLENBQ3JDLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVTtRQUNwRSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU87UUFDaEQsQ0FBQyxDQUFDLEtBQUssQ0FDZCxDQUFDO0lBRWUsYUFBYSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztJQUN6RCw2RkFBNkY7SUFDckYsdUJBQXVCLEdBQXVCLElBQUksQ0FBQztJQUMzRDs7O2dFQUc0RDtJQUNwRCx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDaEMsaUJBQWlCLEdBQStCLElBQUksQ0FBQztJQUNyRCxhQUFhLENBQXFCO0lBQzFDLGdIQUFnSDtJQUN4RyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7SUFDbEMsb0dBQW9HO0lBQzVGLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFFNUI7UUFDSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM3RixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDM0UsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxLQUEwQixFQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ25HLENBQUM7SUFDTCxDQUFDO0lBRUQseUVBQXlFO0lBRXRELFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFMUcsNEZBQTRGO0lBQ3pFLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sQ0FDSCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyx5Q0FBeUMsRUFBRSxZQUFZLENBQUMsQ0FDM0YsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0lBRUgsc0ZBQXNGO0lBQ25FLGtCQUFrQixHQUFHLFFBQVEsQ0FBYyxHQUFHLEVBQUU7UUFDL0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQyxJQUFJLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMseUNBQXlDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEcsT0FBTyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQztJQUVLLE1BQU0sQ0FBVSxrQkFBa0IsR0FBZ0M7UUFDdEUsR0FBRyxFQUFFLG9EQUFvRDtRQUN6RCxLQUFLLEVBQUUsc0RBQXNEO1FBQzdELElBQUksRUFBRSxxREFBcUQ7UUFDM0QsSUFBSSxFQUFFLDZDQUE2QztRQUNuRCxNQUFNLEVBQUUsK0NBQStDO1FBQ3ZELE1BQU0sRUFBRSwrQ0FBK0M7UUFDdkQsSUFBSSxFQUFFLHFEQUFxRDtLQUM5RCxDQUFDO0lBRUYsNEdBQTRHO0lBQ3pGLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDdEQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUN6RixDQUFDLENBQUMsQ0FBQztJQUVILHVHQUF1RztJQUNwRixlQUFlLEdBQUcsUUFBUSxDQUN6QyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FDeEYsQ0FBQztJQUVGLGlGQUFpRjtJQUM5RCxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBRXZGLDZFQUE2RTtJQUMxRCxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVwRix1REFBdUQ7SUFDcEMsSUFBSSxHQUFHLFFBQVEsQ0FBYyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFOUUsY0FBYyxDQUFDLE9BQWU7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUMzQyxNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsbUJBQW1CLENBQUMsa0JBQWtCLENBQUM7UUFDN0QsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxXQUFXLENBQUMsT0FBZTtRQUMvQixPQUFPLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUUsQ0FBQztJQUVEOztzRkFFa0Y7SUFDMUUsZ0JBQWdCLENBQUMsT0FBZTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMxRCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckYsQ0FBQztJQUVrQixjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQzFGLENBQUM7SUFDaUIsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDMUUsQ0FBQztJQUVGLCtEQUErRDtJQUM1QyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3pGLENBQUM7SUFDaUIsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdkUsQ0FBQztJQUVpQixnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNGLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxRSxTQUFTLEdBQXdCO1FBQ2hELEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQ3ZGLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7S0FDM0YsQ0FBQztJQUVpQixPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVwRCxpQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDL0QsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM1RCxlQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTlGO2dHQUM0RjtJQUN6RSxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RCxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUUzRTs7O2dFQUc0RDtJQUN6QyxlQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM3RixDQUFDLENBQUMsQ0FBQztJQUNnQixlQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM3RixDQUFDLENBQUMsQ0FBQztJQUVnQixZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUN0RCxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBRXpHLHNGQUFzRjtJQUNuRSxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBRWxIOzs4RUFFMEU7SUFDdkQsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUN4RCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFBRSxPQUFPLGdFQUFnRSxDQUFDO1FBQ25HLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMzQixDQUFDLENBQUMscUVBQXFFO2dCQUN2RSxDQUFDLENBQUMsNkRBQTZELENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sdURBQXVELENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFFZ0Isa0JBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDLENBQUMsQ0FBQztJQUVIOzs7NEVBR3dFO0lBQ3JELGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssT0FBTztZQUFFLE9BQU8sb0RBQW9ELENBQUM7UUFDekYsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsQ0FBQyxDQUFDLHlEQUF5RDtZQUMzRCxDQUFDLENBQUMscURBQXFELENBQUM7SUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFFZ0IscUJBQXFCLEdBQUcsUUFBUSxDQUFvQixHQUFHLEVBQUU7UUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDckUsQ0FBQyxDQUFDLENBQUM7SUFFZ0Isb0JBQW9CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUUzRjs7Ozs7OytDQU0yQztJQUN4QixzQkFBc0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3RELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFFZ0IsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLE9BQU8sc0RBQXNELElBQUksRUFBRSxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBRWdCLGNBQWMsR0FBRyxRQUFRLENBQUMsR0FBNkMsRUFBRTtRQUN4RixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVnQixhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQW9CLEVBQUU7UUFDOUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTdELE1BQU0sZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RSxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzRCxNQUFNLGVBQWUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTNELE1BQU0sT0FBTyxHQUFrQixFQUFFLENBQUM7UUFFbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzFHLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FDWixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDO1FBQ3BHLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBb0IsRUFBRSxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4RSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztJQUVnQixVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMxQyxNQUFNLElBQUksR0FBdUMsRUFBRSxDQUFDO1FBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlGLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ04sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO2dCQUNwQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDNUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7YUFDL0MsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRWdCLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVqRzs7OztnRkFJNEU7SUFDekQsZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDZ0IsZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFZ0IsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQWUsRUFBRSxDQUFDO1FBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdGLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFFZ0IsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sQ0FDSCxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUN0QyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUNsRixDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFFZ0IsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsbUJBQW1CLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsT0FBTyxDQUNILElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQ3RDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQ2xGLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUV0RCxXQUFXLEdBQUc7UUFDN0IsZ0RBQWdEO1FBQ2hELGdEQUFnRDtRQUNoRCxnREFBZ0Q7UUFDaEQsZ0RBQWdEO1FBQ2hELGdEQUFnRDtRQUNoRCxnREFBZ0Q7UUFDaEQsZ0RBQWdEO0tBQ25ELENBQUM7SUFFaUIsU0FBUyxHQUFHO1FBQzNCLGtEQUFrRDtRQUNsRCxrREFBa0Q7UUFDbEQsa0RBQWtEO1FBQ2xELGtEQUFrRDtRQUNsRCxrREFBa0Q7UUFDbEQsa0RBQWtEO1FBQ2xELGtEQUFrRDtRQUNsRCxrREFBa0Q7UUFDbEQsa0RBQWtEO1FBQ2xELGtEQUFrRDtRQUNsRCxrREFBa0Q7UUFDbEQsa0RBQWtEO0tBQ3JELENBQUM7SUFFRix5RUFBeUU7SUFFbEUsUUFBUTtRQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEYsZUFBZSxDQUNYLEdBQUcsRUFBRTtZQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNqRixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDTCxDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUM5QixDQUFDO0lBQ04sQ0FBQztJQUNELHlFQUF5RTtJQUVsRSxVQUFVLENBQUMsS0FBc0I7UUFDcEMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RixDQUFDO1lBQ0QsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFhLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsR0FBRyxLQUFhLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEVBQW9DO1FBQ3hELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxFQUFjO1FBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQseUVBQXlFO0lBRWxFLFFBQVEsQ0FBQyxPQUF3QjtRQUNwQyxJQUFJLEtBQXNCLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUN4QixLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ0osS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxFQUFjO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHlFQUF5RTtJQUUvRCxJQUFJO1FBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTztRQUM1QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O3dGQUVvRjtJQUM1RSxXQUFXO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU87UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUVEO2tGQUM4RTtJQUN0RSxrQkFBa0I7UUFDdEIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxhQUFhLFlBQVksV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakgsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWU7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE9BQU8sSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDMUMsZ0ZBQWdGO1lBQ2hGLGtGQUFrRjtZQUNsRixxRkFBcUY7WUFDckYsaUZBQWlGO1lBQ2pGLDhCQUE4QjtZQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxJQUFJLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEYsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHVCQUF1QjtRQUMzQixlQUFlLENBQ1gsR0FBRyxFQUFFO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGFBQXdDLENBQUM7WUFDMUUsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTztZQUNuQixNQUFNLGVBQWUsR0FDakIsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLFVBQVU7Z0JBQzVCLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFjLDBDQUEwQyxDQUFDLENBQUM7WUFDdkYsTUFBTSxNQUFNLEdBQ1IsZUFBZTtnQkFDZixLQUFLLENBQUMsYUFBYSxDQUFjLHlCQUF5QixDQUFDO2dCQUMzRCxLQUFLLENBQUMsYUFBYSxDQUFjLHNCQUFzQixDQUFDO2dCQUN4RCxLQUFLLENBQUMsYUFBYSxDQUFjLHdCQUF3QixDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs2RUFHeUU7SUFDakUsMEJBQTBCO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztnREFFNEM7SUFDcEMsdUJBQXVCO1FBQzNCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLG1GQUFtRjtRQUNuRiwyRkFBMkY7UUFDM0Ysa0ZBQWtGO1FBQ2xGLHlGQUF5RjtRQUN6Rix1RkFBdUY7UUFDdkYsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzFELEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsa0VBQWtFLENBQUMsRUFDakcsUUFBUSxDQUNYLENBQUM7SUFDTixDQUFDO0lBRVMsVUFBVTtRQUNoQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsYUFBd0MsQ0FBQztRQUNqRixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBNkIsQ0FBQyxDQUFDO1FBRWxGLHlGQUF5RjtRQUN6RiwyRkFBMkY7UUFDM0YseUZBQXlGO1FBQ3pGLHlGQUF5RjtRQUN6RixxRkFBcUY7UUFDckYsa0ZBQWtGO1FBQ2xGLE1BQU0sa0JBQWtCLEdBQ3BCLFlBQVksSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLGFBQWEsWUFBWSxJQUFJLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEgsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE9BQU87UUFFaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQ25ELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsZUFBZSxDQUNYLEdBQUcsRUFBRTtZQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7WUFDcEMsSUFBSSxhQUFhLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0MsQ0FBQztZQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDekMsQ0FBQyxFQUNELEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FDOUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLG1CQUFtQixDQUFDLEtBQWlCO1FBQzNDLGdGQUFnRjtRQUNoRix3RkFBd0Y7UUFDeEYsOEVBQThFO1FBQzlFLHlGQUF5RjtRQUN6RixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsYUFBNkMsQ0FBQztRQUNuRixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNsRCxNQUFNLGNBQWMsR0FDaEIsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSTtnQkFDL0IsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsS0FBSztnQkFDaEMsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsR0FBRztnQkFDOUIsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ3RDLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZFLE9BQU87WUFDWCxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FDbEIsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSTtZQUMxQixLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQzNCLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEdBQUc7WUFDekIsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRVMsTUFBTTtRQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0lBRVMsb0JBQW9CLENBQUMsS0FBb0I7UUFDL0MsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0wsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEtBQWlCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLFlBQVksZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE9BQU87UUFDWCxDQUFDO1FBQ0Qsa0ZBQWtGO1FBQ2xGLGdGQUFnRjtRQUNoRixrRkFBa0Y7UUFDbEYsbUZBQW1GO1FBQ25GLCtEQUErRDtRQUMvRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssd0JBQXdCLENBQUMsS0FBdUIsRUFBRSxPQUFlLEVBQUUsU0FBaUI7UUFDeEYsTUFBTSxhQUFhLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUcsbUJBQW1CLENBQUMseUJBQXlCLENBQUM7UUFDdkcsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLHlEQUF5RDtZQUNuRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGlCQUFpQixDQUFDLEtBQXVCLEVBQUUsT0FBZTtRQUM5RCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUNyQyx3RUFBd0U7UUFDeEUsbUZBQW1GO1FBQ25GLHFGQUFxRjtRQUNyRixxRkFBcUY7UUFDckYsZ0NBQWdDO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0QsTUFBTSxVQUFVLEdBQUcsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDaEQseUZBQXlGO1FBQ3pGLHNGQUFzRjtRQUN0Rix5RkFBeUY7UUFDekYsa0VBQWtFO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLEdBQVMsRUFBRTtZQUM5QixJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMscUJBQXFCO2dCQUFFLE9BQU87WUFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNGLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUIsVUFBVSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsc0dBQXNHO0lBQzVGLG1CQUFtQixDQUFDLEtBQWlCO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLFlBQVksZ0JBQWdCLENBQUM7WUFBRSxPQUFPO1FBQ25GLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxLQUF1QjtRQUM1QyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUNyQyx1RkFBdUY7UUFDdkYseUZBQXlGO1FBQ3pGLDRGQUE0RjtRQUM1Rix5RkFBeUY7UUFDekYsMEZBQTBGO1FBQzFGLDhFQUE4RTtRQUM5RSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUNoRCx5RkFBeUY7UUFDekYsbUZBQW1GO1FBQ25GLHlGQUF5RjtRQUN6RiwyQkFBMkI7UUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxHQUFTLEVBQUU7WUFDakMsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLHFCQUFxQjtnQkFBRSxPQUFPO1lBQ3RELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUM7UUFDRixpQkFBaUIsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEtBQVk7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sWUFBWSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNyQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMvQyw0RUFBNEU7Z0JBQzVFLDJEQUEyRDtnQkFDM0QsTUFBTSxVQUFVLEdBQUcsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMscUJBQXFCO3dCQUFFLE9BQU87b0JBQ3RELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QyxDQUFDO2dCQUNMLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLENBQUM7aUJBQU0sQ0FBQztnQkFDSix3RUFBd0U7Z0JBQ3hFLDZFQUE2RTtnQkFDN0UsOEVBQThFO2dCQUM5RSwyRUFBMkU7Z0JBQzNFLHVDQUF1QztnQkFDdkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNqQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRUQsOEdBQThHO0lBQ3RHLHVCQUF1QixDQUFDLEtBQXVCLEVBQUUsT0FBZTtRQUNwRSxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQixHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFGLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztZQUM1RSxJQUFJLFFBQVEsR0FBRyxZQUFZLEVBQUUsQ0FBQztnQkFDMUIsWUFBWSxHQUFHLFFBQVEsQ0FBQztnQkFDeEIsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxLQUFZO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFUyxlQUFlLENBQUMsS0FBWTtRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNGLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNoQixNQUFNLGFBQWEsR0FBSSxLQUFvQixDQUFDLGFBQW1DLENBQUM7WUFDaEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGFBQXdDLENBQUM7WUFDMUUsbUZBQW1GO1lBQ25GLG1GQUFtRjtZQUNuRixrRkFBa0Y7WUFDbEYsaUZBQWlGO1lBQ2pGLHlEQUF5RDtZQUN6RCxNQUFNLHdCQUF3QixHQUFHLFlBQVksSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNoRSxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyRCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxNQUFNLEdBQ1IsS0FBSyxFQUFFLGFBQWEsQ0FBYyx5QkFBeUIsQ0FBQzt3QkFDNUQsS0FBSyxFQUFFLGFBQWEsQ0FBYyxzQkFBc0IsQ0FBQzt3QkFDekQsS0FBSyxFQUFFLGFBQWEsQ0FBYyx3QkFBd0IsQ0FBQyxDQUFDO29CQUNoRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ3BCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxHQUFXO1FBQ25DLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQUUsT0FBTztRQUMxQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxDQUFDLEdBQUcsTUFBYyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDTCxDQUFDO0lBRVMsb0JBQW9CLENBQUMsS0FBb0I7UUFDL0MsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sWUFBWSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDN0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVELHVGQUF1RjtJQUMvRSxNQUFNLENBQVUsMEJBQTBCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVsSCx5RkFBeUY7SUFDakYsc0JBQXNCLENBQUMsS0FBb0IsRUFBRSxLQUF1QjtRQUN4RSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUMxRCxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUNoRSxJQUFJLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPO1FBQ3pFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTdCLElBQUksR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUNELE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxHQUFHLEtBQUssV0FBVyxJQUFJLEdBQUcsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUM5QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsbUZBQW1GO1lBQ25GLHNGQUFzRjtZQUN0RixxRkFBcUY7WUFDckYsdUZBQXVGO1lBQ3ZGLG1DQUFtQztZQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLElBQUksTUFBTSxLQUFLLFVBQVUsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzNDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLEdBQUcsS0FBSyxXQUFXLElBQUksR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxjQUFjLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDckcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEtBQUssTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNYLENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCwwR0FBMEc7SUFDbEcsa0JBQWtCLENBQUMsS0FBdUI7UUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkQsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVPLHdCQUF3QixDQUFDLEtBQXVCO1FBQ3BELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEQsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLE9BQU87UUFDM0IsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxnR0FBZ0c7SUFDeEYsNEJBQTRCO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0MsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUM1RyxPQUFPLEdBQUcsS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDtxSEFDaUg7SUFDekcscUJBQXFCO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ2pELElBQUksSUFBSTtZQUFFLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozt3REFJb0Q7SUFDNUMsa0JBQWtCO1FBQ3RCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLHFFQUFxRTtRQUMzRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU07Z0JBQ1AsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsS0FBSyxPQUFPO2dCQUNSLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDN0UsS0FBSyxNQUFNO2dCQUNQLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRTtvQkFDakMsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDbEQsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLElBQUk7aUJBQzdDLENBQUMsQ0FBQztZQUNQLEtBQUssVUFBVTtnQkFDWCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFO29CQUM3QixTQUFTLEVBQUUsTUFBTTtvQkFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUNsRCxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssSUFBSTtpQkFDN0MsQ0FBQyxDQUFDO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLENBQUMsQ0FBQyw0REFBNEQ7UUFDL0UsQ0FBQztJQUNMLENBQUM7SUFFRDtrR0FDOEY7SUFDdEYsb0JBQW9CO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3hELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUN0RSxJQUFJLFFBQVE7WUFBRSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsc0dBQXNHO0lBQzlGLDhCQUE4QjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLElBQUksR0FDTixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQ0osSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFDeEIsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFDckIsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMxQyxDQUFDO1FBQ04sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCx5RUFBeUU7SUFFL0QsWUFBWTtRQUNsQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0wsQ0FBQztJQUVTLFlBQVk7UUFDbEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozt1RUFJbUU7SUFDM0QsbUJBQW1CLENBQUMsT0FBYTtRQUNyQyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUM1QixPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFDbEYsUUFBUSxDQUNYLENBQUM7SUFDTixDQUFDO0lBRUQ7OztnRkFHNEU7SUFDcEUsa0JBQWtCLENBQUMsT0FBYTtRQUNwQyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUM1QixPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQ25FLFFBQVEsQ0FDWCxDQUFDO0lBQ04sQ0FBQztJQUVEO3VHQUNtRztJQUMzRixvQkFBb0I7UUFDeEIsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFFUyx5QkFBeUIsQ0FBQyxLQUFvQjtRQUNwRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekYsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLG9GQUFvRjtZQUNwRixzRkFBc0Y7WUFDdEYsb0VBQW9FO1lBQ3BFLHNGQUFzRjtZQUN0Rix1RkFBdUY7WUFDdkYsdUZBQXVGO1lBQ3ZGLHdGQUF3RjtZQUN4RixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0IsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXhDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsYUFBNEIsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBb0IseUJBQXlCLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQTJCLENBQUMsQ0FBQztRQUN0RSxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRTlCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxZQUFZO1lBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUNyQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVztZQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVztZQUFFLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUM7YUFDeEUsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVM7WUFBRSxLQUFLLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUM7UUFFNUUsTUFBTSxPQUFPLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFBRSxPQUFPO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixlQUFlLENBQ1gsR0FBRyxFQUFFO2dCQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUE0QixDQUFDO2dCQUM5RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUNuQixLQUFLLEVBQUUsZ0JBQWdCLENBQW9CLHlCQUF5QixDQUFDLElBQUksRUFBRSxDQUM5RSxDQUFDO2dCQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUM7Z0JBQ3JELE1BQU0sTUFBTSxHQUNSLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNwRCxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3BCLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUM7WUFDRixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQUUsT0FBTztZQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsZUFBZSxDQUNYLEdBQUcsRUFBRTtnQkFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsYUFBNEIsQ0FBQztnQkFDOUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDbkIsS0FBSyxFQUFFLGdCQUFnQixDQUFvQix5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsQ0FDOUUsQ0FBQztnQkFDRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sTUFBTSxHQUNSLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztvQkFDbkQsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekQsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3BCLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUM7WUFDRixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FDdEIsT0FBNEIsRUFDNUIsUUFBZ0IsRUFDaEIsU0FBaUI7UUFFakIsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO2dCQUFFLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRVMsY0FBYztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRVMsY0FBYztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQseUVBQXlFO0lBRS9ELFVBQVUsQ0FBQyxHQUFnQjtRQUNqQyxJQUFJLEdBQUcsQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLCtFQUErRTtnQkFDL0Usa0ZBQWtGO2dCQUNsRiwrREFBK0Q7Z0JBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQ2QsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RixNQUFNLEtBQUssR0FBYyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEIsQ0FBQztZQUNELE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCwrRUFBK0U7SUFDdkUsa0JBQWtCLENBQUMsSUFBVTtRQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxJQUFJLEdBQ04sS0FBSyxJQUFJLENBQUM7WUFDTixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzsyREFFdUQ7SUFDL0MsMEJBQTBCLENBQUMsSUFBVSxFQUFFLGFBQXNCO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxNQUFNLEdBQUcsR0FBRyxhQUFhO1lBQ3JCLENBQUMsQ0FBQyxzREFBc0Q7WUFDeEQsQ0FBQyxDQUFDLHdEQUF3RCxDQUFDO1FBQy9ELEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQ7OztpRUFHNkQ7SUFDckQsMkJBQTJCLENBQUMsSUFBVTtRQUMxQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsNkRBQTZELEVBQUU7WUFDaEcsSUFBSSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7U0FDdEMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7c0RBR2tEO0lBQzFDLDBCQUEwQixDQUFDLElBQVU7UUFDekMsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVEOztrRkFFOEU7SUFDdEUsc0JBQXNCLENBQUMsS0FBZ0I7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztZQUFFLE9BQU87UUFDdkMsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyx1REFBdUQsRUFBRTtZQUNuRixLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDM0MsR0FBRyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1NBQzFDLENBQUMsRUFDRixRQUFRLENBQ1gsQ0FBQztJQUNOLENBQUM7SUFFUyxVQUFVLENBQUMsSUFBWTtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFUyxXQUFXLENBQUMsVUFBa0I7UUFDcEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDTCxDQUFDO0lBRVMsV0FBVztRQUNqQixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQWdCO2dCQUN4QixJQUFJLEVBQUUsS0FBSztnQkFDWCxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDM0IsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLE9BQU8sRUFBRSxJQUFJO2dCQUNiLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixVQUFVLEVBQUUsS0FBSztnQkFDakIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixTQUFTLEVBQUUsS0FBSzthQUNuQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQzNDLDRFQUE0RTtnQkFDNUUsK0VBQStFO2dCQUMvRSxpRkFBaUY7Z0JBQ2pGLCtEQUErRDtnQkFDL0Qsa0ZBQWtGO2dCQUNsRiw4RUFBOEU7Z0JBQzlFLDJEQUEyRDtnQkFDM0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDbkMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRVMsVUFBVSxDQUFDLEtBQWlCO1FBQ2xDLE1BQU0sa0JBQWtCLEdBQ3BCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2pHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUNyQixtRkFBbUY7WUFDbkYsdUVBQXVFO1lBQ3ZFLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsc0RBQXNELENBQUMsRUFDckYsUUFBUSxDQUNYLENBQUM7UUFDTixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFUyxPQUFPO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQ3RCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFDckIsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUNsQixPQUFPLENBQUMsT0FBTyxFQUFFLEVBQ2pCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELHlFQUF5RTtJQUUvRCxjQUFjO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVTLGNBQWM7UUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFUyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVMsZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUdTLGtCQUFrQixDQUFDLEtBQW9CO1FBQzdDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbkMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0wsQ0FBQztJQUdTLG9CQUFvQixDQUFDLEtBQW9CO1FBQy9DLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUM7SUFHUyxvQkFBb0IsQ0FBQyxLQUFvQjtRQUMvQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbkMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDTCxDQUFDO0lBRVMsZ0JBQWdCLENBQUMsS0FBWTtRQUNuQyxNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPO1FBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsa0JBQWtCLENBQUM7WUFDcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQseUVBQXlFO0lBQy9ELFVBQVU7UUFDaEIsTUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsa0JBQWtCLENBQUM7UUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVMsa0JBQWtCLENBQUMsS0FBWTtRQUNyQyxNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDTCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsS0FBWTtRQUNyQyxNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0wsQ0FBQztJQUVTLFVBQVUsQ0FBQyxJQUFpQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVELHlFQUF5RTtJQUUvRCxjQUFjLENBQUMsSUFBVTtRQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekQsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsSUFBSSxZQUFZLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0UsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNDLElBQUksYUFBYSxDQUFDLE1BQU0sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkYsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVTLGNBQWMsQ0FBQyxJQUFZO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBRVMsY0FBYyxDQUFDLElBQVk7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2pELElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVTLGFBQWEsQ0FBQyxJQUFZO1FBQ2hDLE9BQU8sSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVTLGVBQWUsQ0FBQyxVQUFrQjtRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxVQUFVLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3RyxDQUFDO0lBRVMsZUFBZSxDQUFDLFVBQWtCO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksVUFBVSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRyxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25HLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRVMsT0FBTyxDQUFDLEtBQWE7UUFDM0IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O29GQUVnRjtJQUN0RSxrQkFBa0IsQ0FBQyxJQUFVLEVBQUUsR0FBaUI7UUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNyRCxPQUFPLEVBQUUsTUFBTTtZQUNmLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLE1BQU07WUFDYixHQUFHLEVBQUUsU0FBUztTQUNqQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2hELENBQUM7SUFFRDs7d0NBRW9DO0lBQzVCLG9CQUFvQixDQUFDLEdBQWdCO1FBQ3pDLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDbkcsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUM3RixDQUFDO1FBQ0QsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDbEcsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELHdHQUF3RztJQUNoRyxnQkFBZ0IsQ0FBQyxLQUF1QztRQUM1RCxPQUFPLG1CQUFtQixDQUN0QixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQ1gsS0FBSyxFQUNMLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDckIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQ3pCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUMzQixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNLLGFBQWEsQ0FBQyxLQUFrQjtRQUNwQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssNkJBQTZCO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxVQUFVO1lBQUUsT0FBTztRQUMxRixNQUFNLE1BQU0sR0FBd0I7WUFDaEMsSUFBSTtZQUNKLFVBQVUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDckMsVUFBVSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUNyQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtTQUNsQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQ0ksSUFBSTtZQUNKLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUk7WUFDekIsSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVTtZQUNyQyxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxVQUFVO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFDekMsQ0FBQztZQUNDLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsNEhBQTRIO0lBQ3BILDBCQUEwQixDQUFDLEdBQVcsRUFBRSxRQUFnQjtRQUM1RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN0RSxPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVPLGVBQWU7UUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFDZCxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ1osSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzFDLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FDcEIsSUFBVSxFQUNWLGNBQXVCLEVBQ3ZCLEtBQVcsRUFDWCxRQUFxQixFQUNyQixLQUErQyxFQUMvQyxjQUE2QixFQUM3QixZQUEyQjtRQUUzQixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDbEUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxHQUNYLGNBQWMsS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLElBQUk7WUFDNUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxjQUFjLElBQUksUUFBUSxHQUFHLFlBQVk7WUFDdEQsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNoQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxRQUFRO2dCQUNSLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNkLE9BQU87WUFDSCxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMxQixPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7WUFDL0IsVUFBVTtZQUNWLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2RixJQUFJO1lBQ0osY0FBYztZQUNkLFlBQVk7WUFDWixVQUFVO1lBQ1YsU0FBUztTQUNaLENBQUM7SUFDTixDQUFDO0lBRU8sdUJBQXVCLENBQUMsS0FBc0IsRUFBRSxPQUF3QjtRQUM1RSxJQUFJLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO29CQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzdFLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO29CQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakYsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxLQUFhLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUU7Z0JBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuRixJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRTtnQkFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25GLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdFLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3RSxPQUFPLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFjO1FBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDO0lBQzdGLENBQUM7d0dBcCtEUSxtQkFBbUI7NEZBQW5CLG1CQUFtQixtZ0pBYmpCO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLG1CQUFtQjtnQkFDaEMsS0FBSyxFQUFFLElBQUk7YUFDZDtZQUNEO2dCQUNJLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsbUJBQW1CO2dCQUNoQyxLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0osK0dBb002RCxVQUFVLG1JQUNNLFVBQVUsbUhBQzFCLFVBQVUsdUhBQ0csVUFBVSw2Q0N4VHpGLDh0a0NBcXBCQSwyaUJEMWxCUSxPQUFPLG1GQUNQLGVBQWUsNEZBQ2YsWUFBWSw0SUFDWixnQkFBZ0IsdUlBQ2hCLG1CQUFtQiwyK0JBQ25CLFdBQVcsOG1CQUNYLG1CQUFtQjs7QUE0dERiO0lBRFQsZUFBZSxFQUFFOzZEQVNqQjtBQUdTO0lBRFQsZUFBZSxFQUFFOytEQVNqQjtBQUdTO0lBRFQsZUFBZSxFQUFFOytEQVNqQjs0RkF4c0RRLG1CQUFtQjtrQkE1RC9CLFNBQVM7K0JBQ0ksY0FBYyxjQUNaLElBQUksV0FDUDt3QkFDTCxPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxtQkFBbUI7cUJBQ3RCLFFBaUNLO3dCQUNGLGlCQUFpQixFQUFFLGFBQWE7cUJBQ25DLGFBQ1U7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxxQkFBcUI7NEJBQ2hDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3dCQUNEOzRCQUNJLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLHFCQUFxQjs0QkFDaEMsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7d0RBNHFEUyxrQkFBa0IsTUFXbEIsb0JBQW9CLE1BV3BCLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1RyYXBGb2N1cywgTGl2ZUFubm91bmNlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENka0Nvbm5lY3RlZE92ZXJsYXksIENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZFBvc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIGFmdGVyTmV4dFJlbmRlcixcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBPbkluaXQsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBOZ0NvbnRyb2wsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IERhdGVTZWdtZW50RW5naW5lLCBTZWdtZW50RW5naW5lQ29uZmlnLCBTZWdtZW50S2luZCB9IGZyb20gJy4vZGF0ZS1zZWdtZW50LWlucHV0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IC5kYXRlcGlja2VyLWdyb3VwOm5vdCg6Zm9jdXMtd2l0aGluKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgYnV0dG9uLnRyaWdnZXItaWNvbiB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uby1pY29uIGJ1dHRvblt0eXBlPSdidXR0b24nXSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gaW5wdXQge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidXR0b25bdHlwZT0nYnV0dG9uJ106Zm9jdXMtdmlzaWJsZSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICM0MjhiY2E7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnV0dG9uLnRyaWdnZXItaWNvblt0eXBlPSdidXR0b24nXTpmb2N1cy12aXNpYmxlIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCAjMDA5MGZmKTtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5uby1pY29uXSc6ICchc2hvd0ljb24oKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERBWVNfSU5fV0VFSyA9IDc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9OVEhTX0lOX1lFQVIgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfUEVSX1JPVyA9IDM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUVBUlNfUEVSX0dSSUQgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01JTlVURV9TVEVQID0gNTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfSE9VUlMgPSAyNDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTUlOVVRFUyA9IDYwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhPVVJTX1BFUl9NRVJJRElFTSA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERPVUJMRV9DTElDS19USFJFU0hPTERfTVMgPSA0MDA7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5pZENvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIGBzLWRhdGVwaWNrZXItJHtEYXRlcGlja2VyQ29tcG9uZW50LmlkQ291bnRlcn1gO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBJbnB1dHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICAvKiogSFRNTCBgaWRgIGFwbGljYWRvIGFvIGVsZW1lbnRvIGA8aW5wdXQ+YC4gQXV0by1nZXJhZG8gcXVhbmRvIG9taXRpZG8uICovXG4gICAgcmVhZG9ubHkgaW5wdXRJZCA9IGlucHV0PHN0cmluZz4oRGF0ZXBpY2tlckNvbXBvbmVudC5uZXh0SWQoKSk7XG5cbiAgICAvKiogQXRyaWJ1dG8gYG5hbWVgIGRvIGA8aW5wdXQ+YCBuYXRpdm8uICovXG4gICAgcmVhZG9ubHkgbmFtZSA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKiBUZXh0byBleGliaWRvIHF1YW5kbyBuZW5odW0gdmFsb3IgZXN0w6Egc2VsZWNpb25hZG8uICovXG4gICAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBNb2RvIGRlIHNlbGXDp8OjbyBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gYCdkYXRlJ2Ag4oCUIHNlbGXDp8OjbyBkZSBkYXRhIMO6bmljYSAocGFkcsOjbylcbiAgICAgKiAtIGAnbW9udGgnYCDigJQgc2VsZcOnw6NvIGRlIG3DqnMvYW5vXG4gICAgICogLSBgJ2RhdGV0aW1lJ2Ag4oCUIGRhdGEgY29tIGhvcmEgKHJlcXVlciBjb25maXJtYcOnw6NvKVxuICAgICAqIC0gYCd0aW1lJ2Ag4oCUIGFwZW5hcyBzZWxlw6fDo28gZGUgaG9yYVxuICAgICAqIC0gYCdyYW5nZSdgIOKAlCBpbnRlcnZhbG8gZW50cmUgZHVhcyBkYXRhc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IG1vZGUgPSBpbnB1dDxEYXRlUGlja2VyTW9kZT4oJ2RhdGUnKTtcblxuICAgIC8qKlxuICAgICAqIE1vZG8gZGUgc2VsZcOnw6NvIHF1YW5kbyBgbW9kZWAgw6kgYCdkYXRlJ2AuXG4gICAgICogLSBgJ3NpbmdsZSdgIOKAlCBzZWxlw6fDo28gZGUgdW1hIMO6bmljYSBkYXRhIChwYWRyw6NvKVxuICAgICAqIC0gYCdtdWx0aXBsZSdgIOKAlCBzZWxlw6fDo28gZGUgbcO6bHRpcGxhcyBkYXRhcyBhdnVsc2FzXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VsZWN0aW9uTW9kZSA9IGlucHV0PCdzaW5nbGUnIHwgJ211bHRpcGxlJz4oJ3NpbmdsZScpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYHNlbGVjdGlvbk1vZGUgPSAnbXVsdGlwbGUnYC4gKi9cbiAgICByZWFkb25seSBtdWx0aXBsZVNlcGFyYXRvciA9IGlucHV0PHN0cmluZz4oJywgJyk7XG5cbiAgICAvKiogUXVhbmRvIGB0cnVlYCwgZXhpYmUgbyBib3TDo28gZGUgw61jb25lIGFvIGxhZG8gZG8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgc2hvd0ljb24gPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIENsYXNzZSBkbyDDrWNvbmUgZXhpYmlkbyBubyBib3TDo28gZG8gY2FtcG8uXG4gICAgICogUXVhbmRvIGBtb2RlYCDDqSBgJ3RpbWUnYCwgbyBwYWRyw6NvIG11ZGEgYXV0b21hdGljYW1lbnRlIHBhcmEgYCdmYXMgZmEtY2xvY2snYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29uID0gaW5wdXQ8c3RyaW5nPignZmFzIGZhLWNhbGVuZGFyJyk7XG5cbiAgICAvKiogRGF0YSBtw61uaW1hIHNlbGVjaW9uw6F2ZWwuIERpYXMvbWVzZXMgYW50ZXJpb3JlcyBmaWNhbSBkZXNhYmlsaXRhZG9zLiAqL1xuICAgIHJlYWRvbmx5IG1pbiA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBEYXRhIG3DoXhpbWEgc2VsZWNpb27DoXZlbC4gRGlhcy9tZXNlcyBwb3N0ZXJpb3JlcyBmaWNhbSBkZXNhYmlsaXRhZG9zLiAqL1xuICAgIHJlYWRvbmx5IG1heCA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBEYXRhIGV4aWJpZGEgYW8gYWJyaXIgbyBjYWxlbmTDoXJpbyBxdWFuZG8gbmVuaHVtYSBkYXRhIGVzdMOhIHNlbGVjaW9uYWRhLiAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHREYXRlID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqXG4gICAgICogRm9ybWF0byBkZSBleGliacOnw6NvIGRhIGRhdGEgbm8gY2FtcG8uIFF1YW5kbyBvbWl0aWRvLCDDqSByZXNvbHZpZG8gYSBwYXJ0aXIgZG9cbiAgICAgKiBsb2NhbGUgYXRpdm8gKGNoYXZlIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZV9mb3JtYXRgKSwgY29tIGZhbGxiYWNrIHBhcmEgYGRkL01NL3l5eXlgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRhdGVGb3JtYXQgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGFzIGhvcmFzOiBgJzEyJ2Agb3UgYCcyNCdgLiBRdWFuZG8gb21pdGlkbywgw6kgcmVzb2x2aWRvIGEgcGFydGlyXG4gICAgICogZG8gbG9jYWxlIGF0aXZvIChjaGF2ZSBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmhvdXJfZm9ybWF0YCksIGNvbSBmYWxsYmFjayBwYXJhIGAnMjQnYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBob3VyRm9ybWF0ID0gaW5wdXQ8JzEyJyB8ICcyNCcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKiogSW5jcmVtZW50byBlbSBtaW51dG9zIGFvIHVzYXIgYXMgc2V0YXMgZG8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgbWludXRlU3RlcCA9IGlucHV0PG51bWJlcj4oRGF0ZXBpY2tlckNvbXBvbmVudC5ERUZBVUxUX01JTlVURV9TVEVQKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGNhbXBvIGRlIHNlZ3VuZG9zIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHNob3dTZWNvbmRzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYCdyYW5nZSdgLiAqL1xuICAgIHJlYWRvbmx5IHJhbmdlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignIOKAlCAnKTtcblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIGFvIGZvY2FyIG8gaW5wdXQ7IGZvY28gcGVybWFuZWNlIG5vIGlucHV0LCBuw6NvIHB1bGEgcGFyYSBvIGRyb3Bkb3duLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPbkZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogSW1wZWRlIGRpZ2l0YcOnw6NvIG1hbnVhbDsgdmFsb3Igc8OzIHBvZGUgc2VyIHNlbGVjaW9uYWRvIHBlbG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgcmVhZG9ubHlJbnB1dCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBQcmltZWlybyBkaWEgZGEgc2VtYW5hICgwID0gZG9taW5nbywgMSA9IHNlZ3VuZGEtZmVpcmEsIC4uLiwgNiA9IHPDoWJhZG8pLiAqL1xuICAgIHJlYWRvbmx5IGZpcnN0RGF5T2ZXZWVrID0gaW5wdXQ8bnVtYmVyPigwKTtcblxuICAgIC8qKiBFeGliZS9vY3VsdGEgYSBiYXJyYSBkZSBib3TDtWVzIEhvamUgZSBMaW1wYXIgbm8gcm9kYXDDqS4gKi9cbiAgICByZWFkb25seSBzaG93QnV0dG9uQmFyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogRXhpYmUgw61jb25lIGRlIGxpbXBhciBpbmxpbmUgbm8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgc2hvd0NsZWFyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEV4aWJlIGRpYXMgZGUgbWVzZXMgYWRqYWNlbnRlcyBuYSBncmFkZSBkbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBzaG93T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBQZXJtaXRlIHNlbGVjaW9uYXIgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdE90aGVyTW9udGhzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEZlY2hhIG8gcGFpbmVsIGFww7NzIHNlbGVjaW9uYXIgdW1hIGRhdGEgbm8gbW9kbyBgZGF0ZXRpbWVgLiAqL1xuICAgIHJlYWRvbmx5IGhpZGVPbkRhdGVUaW1lU2VsZWN0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgaG9yYXMgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcEhvdXIgPSBpbnB1dDxudW1iZXI+KDEpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcFNlY29uZCA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogw41uZGljZSBkZSB0YWIgZG8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgdGFiaW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG5cbiAgICAvKiogRm9jYSBhdXRvbWF0aWNhbWVudGUgbyBjYW1wbyBhbyBjYXJyZWdhciBvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgYXV0b2ZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIERhdGFzIGVzcGVjw61maWNhcyBkZXNhYmlsaXRhZGFzIG5vIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF0ZXMgPSBpbnB1dDxEYXRlW10+KFtdKTtcblxuICAgIC8qKiBEaWFzIGRhIHNlbWFuYSBkZXNhYmlsaXRhZG9zICgwID0gZG9taW5nbywgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXlzID0gaW5wdXQ8bnVtYmVyW10+KFtdKTtcblxuICAgIC8vIOKUgOKUgCBUd28td2F5IG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWQgPSBtb2RlbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgT3V0cHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHBlcmRlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcmVjZWJlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBmb2N1c2VkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gc2VsZWNpb25hciB1bWEgZGF0YSwgbcOqcywgaG9yw6FyaW8gb3UgaW50ZXJ2YWxvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGVkID0gb3V0cHV0PERhdGVwaWNrZXJWYWx1ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBmZWNoYS4gRW1pdGUgbyBlbGVtZW50byBkbyBwYWluZWwuICovXG4gICAgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PEhUTUxFbGVtZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkhvamVcIi4gKi9cbiAgICByZWFkb25seSB0b2RheUNsaWNrID0gb3V0cHV0PERhdGU+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiTGltcGFyXCIgb3Ugbm8gw61jb25lIGRlIGxpbXBhciBpbmxpbmUuICovXG4gICAgcmVhZG9ubHkgY2xlYXJDbGljayA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gbcOqcyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IG1vbnRoQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBhbm8gdmlzdWFsaXphZG8gbXVkYS4gKi9cbiAgICByZWFkb25seSB5ZWFyQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgZG8gY2FsZW5kw6FyaW8gYWJyZS4gKi9cbiAgICByZWFkb25seSBzaG93ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyB1c3XDoXJpbyBkaWdpdGEgbWFudWFsbWVudGUgbm8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgdmFsdWVJbnB1dCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8vIOKUgOKUgCBJbnRlcm5hbCBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhIb3VycyA9IERhdGVwaWNrZXJDb21wb25lbnQuTUFYX0hPVVJTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhNaW51dGVzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfTUlOVVRFUztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUlucHV0TWF4TGVuZ3RoID0gMjtcblxuICAgIHByb3RlY3RlZCBpbnB1dERhdGUgPSAnJztcblxuICAgIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbHVlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGb2N1c2VkID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0RhdGUgPSBzaWduYWwobmV3IERhdGUoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBpY2tlclZpZXcgPSBzaWduYWw8UGlja2VyVmlldz4oJ2NhbGVuZGFyJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdXJzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtaW51dGVzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzZWNvbmRzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVZhbHVlID0gc2lnbmFsPERhdGVSYW5nZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtdWx0aXBsZVZhbHVlcyA9IHNpZ25hbDxEYXRlW10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGVuZGluZ1JhbmdlU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBob3ZlckRhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBvblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IERhdGVwaWNrZXJWYWx1ZSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3B1cFBhbmVsID0gdmlld0NoaWxkKCdwb3B1cFBhbmVsJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5jcmVhc2VIb3VyQnV0dG9uID0gdmlld0NoaWxkKCdpbmNyZWFzZUhvdXJCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uQnV0dG9uID0gdmlld0NoaWxkKCdpY29uQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJpZ2dlcklucHV0ID0gdmlld0NoaWxkLnJlcXVpcmVkKCd0cmlnZ2VySW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0RWxlbWVudCA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGl2ZUFubm91bmNlciA9IGluamVjdChMaXZlQW5ub3VuY2VyKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudExhbmcgPSBzaWduYWwodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nKTtcblxuICAgIC8qKiBSZWZsZXRlIGAocG9pbnRlcjogY29hcnNlKWAg4oCUIGRpc3Bvc2l0aXZvcyB0b3VjaCBwcmVmZXJlbSBvIHBvcHVwIGRvIGNhbGVuZMOhcmlvIGFvIHRlY2xhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzVG91Y2hEZXZpY2UgPSBzaWduYWwoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubWF0Y2hNZWRpYSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKS5tYXRjaGVzXG4gICAgICAgICAgICA6IGZhbHNlLFxuICAgICk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlZ21lbnRFbmdpbmUgPSBuZXcgRGF0ZVNlZ21lbnRFbmdpbmUoKTtcbiAgICAvKiogRWxlbWVudG8gcXVlIHRpbmhhIGZvY28gYW50ZXMgZG8gcGFpbmVsIGFicmlyIOKAlCB2ZXIgYGNhcHR1cmVGb2N1c09yaWdpbmAvYGNsb3NlUGFuZWxgLiAqL1xuICAgIHByaXZhdGUgZWxlbWVudFRvUmVzdG9yZUZvY3VzVG86IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqIGB0cnVlYCBzw7MgZHVyYW50ZSBvIGAuZm9jdXMoKWAgcHJvZ3JhbcOhdGljbyBkZSByZXN0YXVyYcOnw6NvIGVtIGBjbG9zZVBhbmVsKClgIOKAlCBldml0YSBxdWVcbiAgICAgKiAgYGhhbmRsZUlucHV0Rm9jdXNgIGludGVycHJldGUgZXNzZSBmb2NvIGNvbW8gdW0gZm9jbyBnZW51w61ubyBkbyB1c3XDoXJpbyBlIHJlYWJyYSBvIHBhaW5lbFxuICAgICAqICBuYSBob3JhIHZpYSBgc2hvd09uRm9jdXNgIChleC46IHNlbGVjaW9uYXIgdW1hIGRhdGEgZGV2b2x2ZSBvIGZvY28gcHJvIGlucHV0LCBxdWUgc2Vuw6NvXG4gICAgICogIHJlYWJyaXJpYSBvIHBhaW5lbCBpbWVkaWF0YW1lbnRlIGRlcG9pcyBkZSBmZWNow6EtbG8pLiAqL1xuICAgIHByaXZhdGUgaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RTZWdtZW50Q29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBtZWFzdXJlQ2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgLyoqIEluY3JlbWVudGFkbyBhIGNhZGEgbXV0YcOnw6NvIGRvIHVzdcOhcmlvIOKAlCBpbnZhbGlkYSBjYWxsYmFja3MgZGUgY2xpcXVlL2ZvY28gYWRpYWRvcyBxdWUgZmljYXJhbSBvYnNvbGV0b3MuICovXG4gICAgcHJpdmF0ZSBpbnRlcmFjdGlvbkdlbmVyYXRpb24gPSAwO1xuICAgIC8qKiBgdGltZVN0YW1wYCBkbyDDumx0aW1vIG1vdXNlZG93biBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCB1c2FkbyBwcmEgZGV0ZWN0YXIgZHVwbG8gY2xpcXVlIG5hIG3Do28uICovXG4gICAgcHJpdmF0ZSBsYXN0TW91c2VEb3duQXQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5vbkxhbmdDaGFuZ2UucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZy5zZXQoZXZlbnQubGFuZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJDaGFuZ2UgPSAoZXZlbnQ6IE1lZGlhUXVlcnlMaXN0RXZlbnQpOiB2b2lkID0+IHRoaXMuaXNUb3VjaERldmljZS5zZXQoZXZlbnQubWF0Y2hlcyk7XG4gICAgICAgICAgICBtZWRpYVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZVBvaW50ZXJDaGFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBtZWRpYVF1ZXJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZVBvaW50ZXJDaGFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBDb21wdXRlZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZEljb24gPSBjb21wdXRlZCgoKSA9PiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJyA/ICdmYXMgZmEtY2xvY2snIDogdGhpcy5pY29uKCkpKTtcblxuICAgIC8qKiBgZGF0ZUZvcm1hdGAgZXhwbMOtY2l0byBvdSByZXNvbHZpZG8gYSBwYXJ0aXIgZG8gbG9jYWxlIGF0aXZvIChmYWxsYmFjayBgZGQvTU0veXl5eWApLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZERhdGVGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCgpID8/XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZV9mb3JtYXQnLCAnZGQvTU0veXl5eScpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKiogYGhvdXJGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYCcyNCdgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRIb3VyRm9ybWF0ID0gY29tcHV0ZWQ8JzEyJyB8ICcyNCc+KCgpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZygpO1xuICAgICAgICBjb25zdCBleHBsaWNpdCA9IHRoaXMuaG91ckZvcm1hdCgpO1xuICAgICAgICBpZiAoZXhwbGljaXQpIHJldHVybiBleHBsaWNpdDtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMucmVzb2x2ZVRyYW5zbGF0ZWRPckRlZmF1bHQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ob3VyX2Zvcm1hdCcsICcyNCcpO1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlZCA9PT0gJzEyJyA/ICcxMicgOiAnMjQnO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0VHTUVOVF9MQUJFTF9LRVlTOiBSZWNvcmQ8U2VnbWVudEtpbmQsIHN0cmluZz4gPSB7XG4gICAgICAgIGRheTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfZGF5JyxcbiAgICAgICAgbW9udGg6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X21vbnRoJyxcbiAgICAgICAgeWVhcjogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfeWVhcicsXG4gICAgICAgIGhvdXI6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ob3VyJyxcbiAgICAgICAgbWludXRlOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbWludXRlJyxcbiAgICAgICAgc2Vjb25kOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2Vjb25kJyxcbiAgICAgICAgYW1wbTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlZ21lbnRfYW1wbScsXG4gICAgfTtcblxuICAgIC8qKiBNb2RvcyBjdWpvIGZvcm1hdG8gZGUgZXhpYmnDp8OjbyDDqSByZXNvbHZpZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zIChpbmRlcGVuZGVudGUgZGUgdG91Y2gvcmVhZG9ubHkpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRNb2RlQ2FuZGlkYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdkYXRlJyB8fCBtb2RlID09PSAnbW9udGgnIHx8IG1vZGUgPT09ICd0aW1lJyB8fCBtb2RlID09PSAnZGF0ZXRpbWUnO1xuICAgIH0pO1xuXG4gICAgLyoqIEludGVyYXRpdmlkYWRlIGRlIGRpZ2l0YcOnw6NvIHBvciBzZWdtZW50byDigJQgZGVzbGlnYWRhIGVtIHRvdWNoIG91IHF1YW5kbyBgcmVhZG9ubHlJbnB1dGAgw6kgdXNhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU2VnbWVudGVkTW9kZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiAhdGhpcy5pc1RvdWNoRGV2aWNlKCkgJiYgIXRoaXMucmVhZG9ubHlJbnB1dCgpLFxuICAgICk7XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gdGltZSBwaWNrZXIgZGV2ZSB1c2FyIG8gZm9ybWF0byBkZSAxMiBob3JhcyBjb20gc2VsZXRvciBBTS9QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXMxMkhvdXJGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInKTtcblxuICAgIC8qKiBIb3JhIGV4aWJpZGEgbm8gdGltZSBwaWNrZXI6IDHigJMxMiBubyBmb3JtYXRvIDEyaCwgMOKAkzIzIG5vIGZvcm1hdG8gMjRoLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwbGF5SG91cnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRpc3BsYXlIb3VyRm9yKHRoaXMuaG91cnMoKSkpO1xuXG4gICAgLyoqIE1lcmlkaWFubyBhdHVhbCBkZXJpdmFkbyBkYSBob3JhIGludGVybmEgKDDigJMyMykuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFtUG0gPSBjb21wdXRlZDwnQU0nIHwgJ1BNJz4oKCkgPT4gdGhpcy5tZXJpZGllbUZvcih0aGlzLmhvdXJzKCkpKTtcblxuICAgIHByaXZhdGUgZGlzcGxheUhvdXJGb3IoaG91cnMyNDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHJldHVybiBob3VyczI0O1xuICAgICAgICBjb25zdCBoMTIgPSBob3VyczI0ICUgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgIHJldHVybiBoMTIgPT09IDAgPyBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA6IGgxMjtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1lcmlkaWVtRm9yKGhvdXJzMjQ6IG51bWJlcik6ICdBTScgfCAnUE0nIHtcbiAgICAgICAgcmV0dXJuIGhvdXJzMjQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA/ICdBTScgOiAnUE0nO1xuICAgIH1cblxuICAgIC8qKiBUZXh0byAoY29tIEFNL1BNIHF1YW5kbyBhcGxpY8OhdmVsKSBkYSBob3JhIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiYXVtZW50YXJcIi9cImRpbWludWlyIGhvcmFcIlxuICAgICAqICDigJQgbWVzbWEgbW90aXZhw6fDo28gZGUgYHByZXZNb250aFRhcmdldGAvYG5leHRNb250aFRhcmdldGAvYHByZXZZZWFyVGFyZ2V0YC9gbmV4dFllYXJUYXJnZXRgOlxuICAgICAqICBzZW0gaXNzbywgbyBib3TDo28gc8OzIGRpeiBcImF1bWVudGFyIGhvcmFcIiwgc2VtIGRpemVyIHF1YWwgaG9yYSB2YWkgcmVzdWx0YXIuICovXG4gICAgcHJpdmF0ZSBmb3JtYXRIb3VyVGFyZ2V0KGhvdXJzMjQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhZGRlZCA9IHRoaXMucGFkVGltZSh0aGlzLmRpc3BsYXlIb3VyRm9yKGhvdXJzMjQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXMxMkhvdXJGb3JtYXQoKSA/IGAke3BhZGRlZH0gJHt0aGlzLm1lcmlkaWVtRm9yKGhvdXJzMjQpfWAgOiBwYWRkZWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZIb3VyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5mb3JtYXRIb3VyVGFyZ2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRIb3VyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5mb3JtYXRIb3VyVGFyZ2V0KCh0aGlzLmhvdXJzKCkgKyB0aGlzLnN0ZXBIb3VyKCkpICUgdGhpcy5tYXhIb3VycyksXG4gICAgKTtcblxuICAgIC8qKiBNZXNtYSBtb3RpdmHDp8OjbywgcGFyYSBvcyBib3TDtWVzIGRlIG1pbnV0by9zZWd1bmRvL0FNLVBNLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2TWludXRlVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5wYWRUaW1lKCh0aGlzLm1pbnV0ZXMoKSAtIHRoaXMubWludXRlU3RlcCgpICsgdGhpcy5tYXhNaW51dGVzKSAlIHRoaXMubWF4TWludXRlcyksXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dE1pbnV0ZVRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMucGFkVGltZSgodGhpcy5taW51dGVzKCkgKyB0aGlzLm1pbnV0ZVN0ZXAoKSkgJSB0aGlzLm1heE1pbnV0ZXMpLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlNlY29uZFRhcmdldCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFkVGltZSgodGhpcy5zZWNvbmRzKCkgLSB0aGlzLnN0ZXBTZWNvbmQoKSArIDYwKSAlIDYwKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRTZWNvbmRUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZFRpbWUoKHRoaXMuc2Vjb25kcygpICsgdGhpcy5zdGVwU2Vjb25kKCkpICUgNjApKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0TWVyaWRpZW1UYXJnZXQgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5hbVBtKCkgPT09ICdBTScgPyAnUE0nIDogJ0FNJykpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogNCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtNCB9LFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9wdXBJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1wb3B1cGApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEluZGV4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50WWVhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoS2V5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb250aEtleXNbdGhpcy5jdXJyZW50TW9udGhJbmRleCgpXSk7XG5cbiAgICAvKiogQW5vIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiYW5vIGFudGVyaW9yXCIvXCJwcsOzeGltbyBhbm9cIiAodmlldyBkZSBtZXNlcykg4oCUIHBybyBhcmlhLWxhYmVsXG4gICAgICogIGFudW5jaWFyIHByYSBvbmRlIG8gYm90w6NvIHZhaSwgasOhIHF1ZSBcIkFubyBhbnRlcmlvclwiIHNvemluaG8gbsOjbyBkaXogcXVhbCBhbm8gw6kgZXNzZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldlllYXJUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRZZWFyKCkgLSAxKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dFllYXJUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnRZZWFyKCkgKyAxKTtcblxuICAgIC8qKiBNw6pzL2FubyBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcIm3DqnMgYW50ZXJpb3JcIi9cInByw7N4aW1vIG3DqnNcIiAodmlldyBkZSBjYWxlbmTDoXJpbykg4oCUIG1lc21hXG4gICAgICogIG1vdGl2YcOnw6NvIGRlIGBwcmV2WWVhclRhcmdldGAvYG5leHRZZWFyVGFyZ2V0YDogXCJNw6pzIGFudGVyaW9yXCIgc296aW5obyBuw6NvIGRpeiBxdWFsIG3DqnMgw6lcbiAgICAgKiAgZXNzZSwgZSBjcnV6YXIgYSBmcm9udGVpcmEgZG8gYW5vIChleC46IGphbmVpcm8g4oaSIGRlemVtYnJvIGRvIGFubyBhbnRlcmlvcikgdG9ybmFyaWEgZXNzYVxuICAgICAqICBmYWx0YSBkZSBjb250ZXh0byBhaW5kYSBtYWlzIGNvbmZ1c2Egc2VtIG8gYW5vIGp1bnRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2TW9udGhUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gICAgfSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRNb250aFRhcmdldCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzaG93Q2FsZW5kYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSAhPT0gJ3RpbWUnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1RpbWVQaWNrZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCB0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKTtcblxuICAgIC8qKiBTZWxlw6fDo28gbcO6bHRpcGxhIGF0aXZhOiBhcGVuYXMgbm8gbW9kbyBgZGF0ZWAgY29tIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTXVsdGlwbGVNb2RlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3Rpb25Nb2RlKCkgPT09ICdtdWx0aXBsZScgJiYgdGhpcy5tb2RlKCkgPT09ICdkYXRlJyk7XG5cbiAgICAvKiogSW5zdHJ1w6fDo28gbGlkYSBqdW50byBkbyByw7N0dWxvIGRhIGdyYWRlIGRlIGRpYXMg4oCUIGNhZGEgbW9kbyBjb20gc2Vtw6JudGljYSBkZSBzZWxlw6fDo28gbsOjb1xuICAgICAqICDDs2J2aWEgKG3Dumx0aXBsYSwgaW50ZXJ2YWxvKSBnYW5oYSB1bWEgZnJhc2UgcHLDs3ByaWE7IGByYW5nZWAgYWluZGEgc2UgZGl2aWRlIGVtIGR1YXMgZmFzZXNcbiAgICAgKiAgKGVzY29saGVuZG8gaW7DrWNpbyB2cy4gasOhIGNvbSBgcGVuZGluZ1JhbmdlU3RhcnRgLCBlc2NvbGhlbmRvIGZpbSkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbGVuZGFyR3JpZEFyaWFMYWJlbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkgcmV0dXJuICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jYWxlbmRhcl9sYWJlbF9tdWx0aXBsZSc7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKVxuICAgICAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NhbGVuZGFyX2xhYmVsX3JhbmdlX3BlbmRpbmcnXG4gICAgICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWxfcmFuZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWwnO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yZGVyZWRXZWVrRGF5S2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZShzdGFydCksIC4uLnRoaXMud2Vla0RheUtleXMuc2xpY2UoMCwgc3RhcnQpXTtcbiAgICB9KTtcblxuICAgIC8qKiBDaWVudGUgZGEgZmFzZSBkZSBzZWxlw6fDo28gZW0gYHJhbmdlYDogZW5xdWFudG8gbsOjbyBow6EgYHBlbmRpbmdSYW5nZVN0YXJ0YCwgw6kgYSBtZXNtYSBjaGF2ZVxuICAgICAqICBkZSBzZW1wcmUgKFwic2VsZWNpb25hciBpbnRlcnZhbG9cIik7IGRlcG9pcyBkbyBwcmltZWlybyBjbGlxdWUsIG11ZGEgcHJhIHVtYSBjaGF2ZSBxdWUgY2l0YVxuICAgICAqICBhIGRhdGEgaW5pY2lhbCBqw6EgZXNjb2xoaWRhLCBqw6EgcXVlIHJlYWJyaXIvcmVlbnRyYXIgbm8gZGnDoWxvZ28gbmVzc2UgbWVpby10ZW1wbyBuw6NvIGRhdmFcbiAgICAgKiAgbmVuaHVtYSBwaXN0YSBkZSBxdWUgYSBzZWd1bmRhIG1ldGFkZSBkbyBmbHV4byBlcmEgYSBxdWUgZmFsdGF2YS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nQXJpYUxhYmVsS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X2RhdGUnO1xuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfcmFuZ2VfZW5kJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlJztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dBcmlhTGFiZWxQYXJhbXMgPSBjb21wdXRlZDx7IGRhdGU/OiBzdHJpbmcgfT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICByZXR1cm4gcGVuZGluZyA/IHsgZGF0ZTogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwocGVuZGluZykgfSA6IHt9O1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbmdlU3RhdHVzRWxlbWVudElkID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pbnB1dElkKCl9LXJhbmdlLXN0YXR1c2ApO1xuXG4gICAgLyoqIFRleHRvIGRvIGA8c3Bhbj5gIGBzci1vbmx5YCByZWZlcmVuY2lhZG8gcG9yIGBhcmlhLWRlc2NyaWJlZGJ5YCBubyBgPGlucHV0PmAg4oCUIGTDoSBhbyBjYW1wb1xuICAgICAqICB1bSBjb250ZcO6ZG8gcGVyc2lzdGVudGUgZSBhY2Vzc8OtdmVsIGVucXVhbnRvIHPDsyBhIGRhdGEgaW5pY2lhbCBkbyBpbnRlcnZhbG8gZm9pIGVzY29saGlkYSxcbiAgICAgKiAgasOhIHF1ZSBgaW5wdXREYXRlYCBzw7MgcmVmbGV0ZSBvIHZhbG9yIGNvbXBsZXRvIGRlcG9pcyBkYSBzZWd1bmRhIGVzY29saGEgKGEgYXR1YWxpemHDp8Ojb1xuICAgICAqICBwYXJjaWFsIGVtIGBzZWxlY3REYXRlKClgIGNvYnJlIG8gdGV4dG8gdmlzw612ZWw7IGlzdG8gY29icmUgbyBxdWUgdW0gbGVpdG9yIGRlIHRlbGEgbMOqIGFvXG4gICAgICogIGZvY2FyL3JlbGVyIG8gY2FtcG8pLiBVc2EgYGFyaWEtZGVzY3JpYmVkYnlgLCBuw6NvIGBhcmlhLWxhYmVsYCwgcHJhIHPDsyBBQ1JFU0NFTlRBUlxuICAgICAqICBpbmZvcm1hw6fDo28gc2VtIHNvYnJlc2NyZXZlciBvIG5vbWUgYWNlc3PDrXZlbCBxdWUgaW50ZWdyYcOnw7VlcyAoZHluYW1pYy1mb3JtLCBzaG93Y2FzZSlcbiAgICAgKiAgasOhIGNvbnRyb2xhbSBwb3IgZm9yYSBkbyBjb21wb25lbnRlLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVBlbmRpbmdTdGF0dXNUZXh0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcgPyB0aGlzLmJ1aWxkUmFuZ2VTdGFydFNlbGVjdGVkVGV4dChwZW5kaW5nKSA6ICcnO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYWNlaG9sZGVyS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5tb2RlKCk7XG4gICAgICAgIHJldHVybiBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcGxhY2Vob2xkZXJfJHttb2RlfWA7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWZmZWN0aXZlUmFuZ2UgPSBjb21wdXRlZCgoKTogeyBzdGFydDogRGF0ZSB8IG51bGw7IGVuZDogRGF0ZSB8IG51bGwgfSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGhvdmVyID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChob3Zlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlbmRpbmcuZ2V0VGltZSgpIDw9IGhvdmVyLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBob3Zlcl0gOiBbaG92ZXIsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBwZW5kaW5nLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZVZhbHVlKCkgPz8geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsZW5kYXJXZWVrcyA9IGNvbXB1dGVkKCgpOiBDYWxlbmRhckRheVtdW10gPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudE1vbnRoSW5kZXgoKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmVmZmVjdGl2ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlU3RhcnRUaW1lID0gcmFuZ2Uuc3RhcnQgPyBzdHJpcFRpbWUocmFuZ2Uuc3RhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmFuZ2VFbmRUaW1lID0gcmFuZ2UuZW5kID8gc3RyaXBUaW1lKHJhbmdlLmVuZCkgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRXZWVrRGF5ID0gZmlyc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgICAgICBjb25zdCBhZGp1c3RlZFN0YXJ0RGF5ID0gKHN0YXJ0V2Vla0RheSAtIHRoaXMuZmlyc3REYXlPZldlZWsoKSArIDcpICUgNztcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAgICAgY29uc3QgZGF5c0luUHJldk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApLmdldERhdGUoKTtcblxuICAgICAgICBjb25zdCBhbGxEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFkanVzdGVkU3RhcnREYXkgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5c0luUHJldk1vbnRoIC0gaSk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBkYXlzSW5Nb250aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGQpO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCB0cnVlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbENlbGxzID1cbiAgICAgICAgICAgIE1hdGguY2VpbChhbGxEYXlzLmxlbmd0aCAvIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSAqIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuICAgICAgICBsZXQgbmV4dERheSA9IDE7XG4gICAgICAgIHdoaWxlIChhbGxEYXlzLmxlbmd0aCA8IHRvdGFsQ2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIG5leHREYXkpO1xuICAgICAgICAgICAgbmV4dERheSsrO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCBmYWxzZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2Vla3M6IENhbGVuZGFyRGF5W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbERheXMubGVuZ3RoOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSB7XG4gICAgICAgICAgICB3ZWVrcy5wdXNoKGFsbERheXMuc2xpY2UoaSwgaSArIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50Lk1PTlRIU19JTl9ZRUFSOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX1BFUl9ST1cpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaChbXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2ldLCBpbmRleDogaSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMV0sIGluZGV4OiBpICsgMSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMl0sIGluZGV4OiBpICsgMiB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudERlY2FkZVN0YXJ0ID0gY29tcHV0ZWQoKCkgPT4gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRZZWFyKCkgLyAxMCkgKiAxMCk7XG5cbiAgICAvKiogSW50ZXJ2YWxvIGRlIGRlc3Rpbm8gZG8gYm90w6NvIFwiZMOpY2FkYSBhbnRlcmlvclwiL1wicHLDs3hpbWEgZMOpY2FkYVwiICh2aWV3IGRlIGFub3MpIOKAlCBtZXNtYVxuICAgICAqICBtb3RpdmHDp8OjbyBkZSBgcHJldlllYXJUYXJnZXRgL2BuZXh0WWVhclRhcmdldGAuIGBuYXZpZ2F0ZVByZXZgL2BuYXZpZ2F0ZU5leHRgIGRlc2xvY2FtXG4gICAgICogIGB2aWV3RGF0ZWAgZW0gwrExMCBhbm9zIChuw6NvIMKxMTIpIG5lc3NhIHZpZXc7IG8gZ3JpZCBleGliaWRvIMOpIHF1ZSBtb3N0cmEgMTIgYW5vcyBwb3JcbiAgICAgKiAgcMOhZ2luYSAodmVyIGB5ZWFyc0dyaWRgKSDigJQgZGHDrSBvIGludGVydmFsbyBpciBkZSBgY3VycmVudERlY2FkZVN0YXJ0KCkgwrEgMTBgIGF0w6lcbiAgICAgKiAgYCsgMTFgIHByYSBiYXRlciBleGF0YW1lbnRlIGNvbSBhIHDDoWdpbmEgcXVlIG8gY2xpcXVlIHJlYWxtZW50ZSBhYnJlLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2RGVjYWRlUmFuZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSAtIDEwO1xuICAgICAgICByZXR1cm4geyBzdGFydFllYXI6IHN0YXJ0LCBlbmRZZWFyOiBzdGFydCArIDExIH07XG4gICAgfSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREZWNhZGVSYW5nZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmN1cnJlbnREZWNhZGVTdGFydCgpICsgMTA7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0WWVhcjogc3RhcnQsIGVuZFllYXI6IHN0YXJ0ICsgMTEgfTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB5ZWFyc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKTtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQ7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5ZRUFSU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW3N0YXJ0ICsgaSwgc3RhcnQgKyBpICsgMSwgc3RhcnQgKyBpICsgMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgaWYgKCFtaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpIDw9IG1pbi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpIDw9IG1pbi5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQgLSAxID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmdldEZ1bGxZZWFyKCkgPj0gbWF4LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHZpZXcuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICAgICAgICAodmlldy5nZXRGdWxsWWVhcigpID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiB2aWV3LmdldE1vbnRoKCkgPj0gbWF4LmdldE1vbnRoKCkpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyDilIDilIAgVHJhbnNsYXRpb24ga2V5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB3ZWVrRGF5S2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X21vbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfdHVlJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV93ZWQnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3RodScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfZnJpJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zYXQnLFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhLZXlzID0gW1xuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfamFuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2ZlYicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfYXByJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX21heScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9qdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVsJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2F1ZycsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9zZXAnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfb2N0JyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX25vdicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9kZWMnLFxuICAgIF07XG5cbiAgICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgQ29udHJvbFZhbHVlQWNjZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi52YWx1ZV0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChzb3J0ZWQpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoc29ydGVkKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc29ydGVkWzBdO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZmlyc3QuZ2V0RnVsbFllYXIoKSwgZmlyc3QuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5zdGFydC5nZXRGdWxsWWVhcigpLCB2YWx1ZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoZCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGQuZ2V0U2Vjb25kcygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgbGV0IHZhbHVlOiBEYXRlcGlja2VyVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5tdWx0aXBsZVZhbHVlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmFuZ2VWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWUsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUHVibGljIGFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhcHR1cmVGb2N1c09yaWdpbigpO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQYW5lbEFmdGVyT3BlbigpO1xuICAgIH1cblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIHNlbSB0cmFuc2ZlcmlyIG8gZm9jbyBwb3IgcGFkcsOjbyAodXNhZG8gcGVsbyBzaG93T25Gb2N1cykuIEVtIG1vZG9zIHNlbVxuICAgICAqICBkaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKG11bHRpcGxlL3JhbmdlL3llYXIvdG91Y2gpIG8gZm9jbyBzZWd1ZSBwcm8gY2FsZW5kw6FyaW8gaWd1YWwgZW1cbiAgICAgKiAgb3BlbigpOyBlbSBtb2RvIHNlZ21lbnRhZG8gbyBmb2NvIHBlcm1hbmVjZSBubyBpbnB1dCBwcmEgY29udGludWFyIGRpZ2l0YW5kby4gKi9cbiAgICBwcml2YXRlIG9wZW5PbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMuaXNPcGVuKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYXB0dXJlRm9jdXNPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVPcGVuVmlldygpO1xuICAgICAgICB0aGlzLnNob3cuZW1pdCgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQYW5lbEFmdGVyT3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c1BhbmVsQWZ0ZXJPcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBHdWFyZGEgbyBlbGVtZW50byBmb2NhZG8gbm8gbW9tZW50byBlbSBxdWUgbyBwYWluZWwgYWJyZSwgcHJhIGRldm9sdmVyIG8gZm9jbyBwcmEgbMOhIGFvXG4gICAgICogIGZlY2hhciBlbSB2ZXogZGUgc2VtcHJlIGZvcsOnYXIgcHJvIGJvdMOjbyBkbyDDrWNvbmUg4oCUIHZlciBgY2xvc2VQYW5lbCgpYC4gKi9cbiAgICBwcml2YXRlIGNhcHR1cmVGb2N1c09yaWdpbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBhIHZpZXcgaW5pY2lhbCBkbyBwYWluZWwgZSBwb3NpY2lvbmEgbyBjYWxlbmTDoXJpbyBubyBgZGVmYXVsdERhdGVgXG4gICAgICogcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVPcGVuVmlldygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlVmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnICYmIHJhbmdlPy5zdGFydCkge1xuICAgICAgICAgICAgLy8gUmVhYnJpciB1bSBpbnRlcnZhbG8gasOhIGRlZmluaWRvIHByZWNpc2EgY2FpciBzZW1wcmUgbm8gbcOqcyBkbyBpbsOtY2lvIOKAlCBzZW7Do29cbiAgICAgICAgICAgIC8vIGB2aWV3RGF0ZWAgZmljYSBvbmRlIHVtYSBuYXZlZ2HDp8OjbyBhbnRlcmlvciBwYXJvdSBwb3IgYWNhc28gKGV4LjogY3J1emFyIG3DqnMgYW9cbiAgICAgICAgICAgIC8vIGVzY29saGVyIG8gZmltKSwgZSBgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKWAgKHByaW1laXJvIGBbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdYFxuICAgICAgICAgICAgLy8gZW0gb3JkZW0gZGUgRE9NKSBhY2FiYSBmb2NhbmRvIG8gZmltIG91IG5lbmh1bWEgY8OpbHVsYSwgZGVwZW5kZW5kbyBkZSBxdWFsIG3DqnNcbiAgICAgICAgICAgIC8vIGNhbGhhIGRlIGVzdGFyIGVtIGV4aWJpw6fDo28uXG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShyYW5nZS5zdGFydC5nZXRGdWxsWWVhcigpLCByYW5nZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0ZSA9IHRoaXMuZGVmYXVsdERhdGUoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0RGF0ZSAmJiAhdGhpcy52YWx1ZSgpICYmICF0aGlzLnJhbmdlVmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGRlZmF1bHREYXRlLmdldEZ1bGxZZWFyKCksIGRlZmF1bHREYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ3llYXJzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpOiB2b2lkIHtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdkhlYWRlclRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyVmlldygpID09PSAnY2FsZW5kYXInXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLW5hdi1oZWFkZXJdIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICBuYXZIZWFkZXJUYXJnZXQgPz9cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogWmVyYSBvIGVzdGFkbyBkZSBpbnRlcnZhbG8gZW0gYW5kYW1lbnRvIOKAlCB1c2FkbyB0YW50byBwZWxvIGZlY2hhbWVudG8gdG90YWwgZG8gcGFpbmVsXG4gICAgICogIChgY2xvc2VQYW5lbGAsIG9uZGUgbsOjbyBmYXogc2VudGlkbyBhbnVuY2lhciBuYWRhIHBvcnF1ZSBvIGRpw6Fsb2dvIGludGVpcm8gZXN0w6Egc3VtaW5kbylcbiAgICAgKiAgcXVhbnRvIHBlbG8gY2FuY2VsYW1lbnRvIGxldmUgdmlhIEVzY2FwZSBkZW50cm8gZGEgZ3JhZGUgKGBjYW5jZWxQZW5kaW5nUmFuZ2VTdGFydGApLCBxdWVcbiAgICAgKiAgbWFudMOpbSBvIHBhaW5lbCBhYmVydG8gZSBwb3IgaXNzbyBhbnVuY2lhIGEgbXVkYW7Dp2Egc2VwYXJhZGFtZW50ZS4gKi9cbiAgICBwcml2YXRlIHJlc2V0UGVuZGluZ1JhbmdlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIC8qKiBDYW5jZWxhbWVudG8gbGV2ZSBkZSB1bWEgc2VsZcOnw6NvIGRlIGludGVydmFsbyBlbSBhbmRhbWVudG8gKHZlciBgaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bmAsXG4gICAgICogIHRlY2xhIEVzY2FwZSkg4oCUIGFvIGNvbnRyw6FyaW8gZGUgYGNsb3NlUGFuZWxgLCBvIHBhaW5lbCBjb250aW51YSBhYmVydG8sIGVudMOjbyBhcXVpIGZhelxuICAgICAqICBzZW50aWRvIGFudW5jaWFyIGEgbXVkYW7Dp2EgZGUgZXN0YWRvLiAqL1xuICAgIHByaXZhdGUgY2FuY2VsUGVuZGluZ1JhbmdlU3RhcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXRQZW5kaW5nUmFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgICAgLy8gQSBlc2NvbGhhIGRvIGluw61jaW8gKHJhbW8gYCFwZW5kaW5nYCBkZSBzZWxlY3REYXRlKCkpIGdyYXZhIG8gaW7DrWNpbyBwZW5kZW50ZSBlbVxuICAgICAgICAvLyBgaW5wdXREYXRlYCBwcmEgbsOjbyBkZWl4YXIgbyBjYW1wbyBvYnNvbGV0byBkdXJhbnRlIGEgc2VsZcOnw6NvIHBhcmNpYWwgKHZlciBzZWxlY3REYXRlKCkpXG4gICAgICAgIC8vIOKAlCBjYW5jZWxhciBlc3NhIGVzY29saGEgcHJlY2lzYSBkZXNmYXplciBpc3NvIHRhbWLDqW0sIHZvbHRhbmRvIHBybyBpbnRlcnZhbG8gasOhXG4gICAgICAgIC8vIGNvbmZpcm1hZG8gKG91IHZhemlvLCBzZSBuZW5odW0pIOKAlCB0ZXN0YWRvIG1hbnVhbG1lbnRlIHZpYSBkZXZ0b29sczogc2VtIGVzdGEgbGluaGEsIG9cbiAgICAgICAgLy8gY2FtcG8gZmljYXZhIHByZXNvIG1vc3RyYW5kbyBhIGRhdGEgcGVuZGVudGUgZGVzY2FydGFkYSBtZXNtbyBjb20gbyBpbnRlcnZhbG8gYW50aWdvXG4gICAgICAgIC8vIGFpbmRhIGRlc3RhY2FkbyBubyBjYWxlbmTDoXJpby5cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodGhpcy5yYW5nZVZhbHVlKCkpO1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9yYW5nZV9zZWxlY3Rpb25fY2FuY2VsbGVkJyksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMucmVzZXRQZW5kaW5nUmFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQocGFuZWxFbGVtZW50ID8/ICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpKTtcblxuICAgICAgICAvLyBTw7MgZm9yw6dhIG8gZm9jbyBwcmEgb3V0cm8gbHVnYXIgc2UgZWxlIGVzdGl2ZXIgZGVudHJvIGRvIHBhaW5lbCBxdWUgZXN0w6Egc2VuZG8gZmVjaGFkb1xuICAgICAgICAvLyAoc2Vuw6NvIG8gdXN1w6FyaW8gZmljYXJpYSBjb20gZm9jbyBcInByZXNvXCIgbnVtIGVsZW1lbnRvIHF1ZSBlc3TDoSBwcmVzdGVzIGEgc3VtaXIgZG8gRE9NKS5cbiAgICAgICAgLy8gU2UgbyBmb2NvIGrDoSBlc3TDoSBlbSBvdXRybyBsdWdhciDigJQgZXguOiBvIHByw7NwcmlvIGlucHV0IHNlZ21lbnRhZG8sIHF1ZSBhYnJpdSBvIHBhaW5lbFxuICAgICAgICAvLyB2aWEgYG9wZW5PbkZvY3VzYCBlIG51bmNhIGNoZWdvdSBhIHBlcmRlciBvIGZvY28g4oCUIGRlaXhhbW9zIGNvbW8gZXN0w6EsIGVtIHZleiBkZSBwdXhhclxuICAgICAgICAvLyBvIGZvY28gcHJvIGJvdMOjbyBkbyDDrWNvbmUgc2VtIG5lbmh1bSBtb3Rpdm8gKGJ1ZyByZWxhdGFkbyB2aWEgR05PTUUgT3JjYTogZmVjaGFyIG9cbiAgICAgICAgLy8gcGFpbmVsIGNsaWNhbmRvIGZvcmEsIGNvbSBvIGZvY28gYWluZGEgbm8gaW5wdXQsIGZhemlhIG8gZm9jbyBwdWxhciBwcm8gw61jb25lKS5cbiAgICAgICAgY29uc3QgZm9jdXNJc0luc2lkZVBhbmVsID1cbiAgICAgICAgICAgIHBhbmVsRWxlbWVudCAhPSBudWxsICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlICYmIHBhbmVsRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKCFmb2N1c0lzSW5zaWRlUGFuZWwpIHJldHVybjtcblxuICAgICAgICBjb25zdCByZXN0b3JlVGFyZ2V0ID0gdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbztcbiAgICAgICAgdGhpcy5lbGVtZW50VG9SZXN0b3JlRm9jdXNUbyA9IG51bGw7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nRm9jdXNPbkNsb3NlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdG9yZVRhcmdldCAmJiBkb2N1bWVudC5jb250YWlucyhyZXN0b3JlVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXN0b3JlVGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pY29uQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Jlc3RvcmluZ0ZvY3VzT25DbG9zZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPIGJhY2tkcm9wIGRvIENESyBPdmVybGF5IGNvYnJlIGEgdGVsYSBpbnRlaXJhLCBpbmNsdWluZG8gbyBwcsOzcHJpbyB0cmlnZ2VyIOKAlCBjbGljYXIgbm9cbiAgICAgKiBpbnB1dCBvdSBub3MgYm90w7VlcyBkbyB0cmlnZ2VyIGVucXVhbnRvIG8gcGFpbmVsIGrDoSBlc3TDoSBhYmVydG8gdGFtYsOpbSBkaXNwYXJhXG4gICAgICogYGJhY2tkcm9wQ2xpY2tgIChvIHByw7NwcmlvIGA8aW5wdXQ+YCBudW5jYSByZWNlYmUgbyBgY2xpY2tgIG5lc3NlIGNhc28sIGVudMOjb1xuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCBudW5jYSBkaXNwYXJhKS4gU2VtIGVzdGUgZmlsdHJvLCBjbGljYXIgbm8gaW5wdXQgcGFyYSB0cm9jYXIgZGVcbiAgICAgKiBzZWdtZW50byBmZWNoYXJpYSBvIHBhaW5lbCBlIHJvdWJhcmlhIG8gZm9jbyBwYXJhIG8gYm90w6NvIGRvIMOtY29uZSAodmlhIGBjbG9zZVBhbmVsYCkuXG4gICAgICogUXVhbmRvIG8gY2xpcXVlIGNhaXUgZXNwZWNpZmljYW1lbnRlIHNvYnJlIG8gYDxpbnB1dD5gLCByZWFwbGljYW1vcyBhIG1lc21hIGzDs2dpY2EgZGVcbiAgICAgKiByZXBvc2ljaW9uYW1lbnRvIGRlIHNlZ21lbnRvIHF1ZSBgaGFuZGxlSW5wdXRDbGlja2AgZmFyaWEsIGVtIHZleiBkZSBzw7MgaWdub3JhciBvIGNsaXF1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBgZXZlbnQudGFyZ2V0YCBkZSB1bSBiYWNrZHJvcENsaWNrIGRvIENESyBPdmVybGF5IMOpIHNlbXByZSBvIHByw7NwcmlvIDxkaXY+IGRvXG4gICAgICAgIC8vIGJhY2tkcm9wLCBudW5jYSBvIGVsZW1lbnRvIHJlYWxtZW50ZSBjbGljYWRvIOKAlCBlbnTDo28gY2hlY2FyIGAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWBcbiAgICAgICAgLy8gbnVuY2EgZnVuY2lvbmEuIEVtIHZleiBkaXNzbywgY29tcGFyYW1vcyBhIGNvb3JkZW5hZGEgcmVhbCBkbyBjbGlxdWUgKHF1ZSBvXG4gICAgICAgIC8vIE1vdXNlRXZlbnQgc2VtcHJlIGNhcnJlZ2EgY29ycmV0YW1lbnRlKSBjb250cmEgb3MgcmV0w6JuZ3Vsb3MgZG9zIGVsZW1lbnRvcyBkbyB0cmlnZ2VyLlxuICAgICAgICBjb25zdCBpbnB1dEVsID0gdGhpcy50cmlnZ2VySW5wdXQoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5wdXRFbCAmJiB0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFJlY3QgPSBpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY2xpY2tlZE9uSW5wdXQgPVxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gaW5wdXRSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IGlucHV0UmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gaW5wdXRSZWN0LnRvcCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gaW5wdXRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGlmIChjbGlja2VkT25JbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duKGlucHV0RWwsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRPblRyaWdnZXIgPVxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbTtcbiAgICAgICAgaWYgKGNsaWNrZWRPblRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVPdmVybGF5S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvdW5kIHRvIGBtb3VzZWRvd25gLCBuw6NvIGBjbGlja2AgKHZlamEgbyBjb21lbnTDoXJpbyBlbSBgYXBwbHlTZWdtZW50Q2xpY2tgKS4gT1xuICAgICAgICAvLyBjb21wb3J0YW1lbnRvIG5hdGl2byBwYWRyw6NvIGRvIGJyb3dzZXIgcHJhIG1vdXNlZG93biBudW0gYDxpbnB1dD5gIGRlIHRleHRvIMOpXG4gICAgICAgIC8vIHBvc2ljaW9uYXIgbyBjYXJldC9pbmljaWFyIHNlbGXDp8OjbyBkZSB0ZXh0byBuYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSDigJQgaXNzbyByb2RhXG4gICAgICAgIC8vICpkZXBvaXMqIGRvcyBub3Nzb3MgbGlzdGVuZXJzIGUgc29icmVzY3JldmVyaWEgbyBgc2V0U2VsZWN0aW9uUmFuZ2VgIGRvIHNlZ21lbnRvXG4gICAgICAgIC8vIGFwbGljYWRvIGxvZ28gYWJhaXhvLiBgcHJldmVudERlZmF1bHQoKWAgZXZpdGEgZXNzYSBjb3JyaWRhLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihldmVudC50YXJnZXQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9udG8gZGUgZW50cmFkYSDDum5pY28gcHJvIGNsaXF1ZSBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCBjaGFtYWRvIHRhbnRvIHBvclxuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCAobW91c2Vkb3duIGRpcmV0byBubyBgPGlucHV0PmAsIG8gcHJpbWVpcm8gY2xpcXVlLCBhbnRlcyBkbyBiYWNrZHJvcFxuICAgICAqIGV4aXN0aXIpIHF1YW50byBwb3IgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWVzIHNlZ3VpbnRlcywgasOhIGNvbSBvIHBhaW5lbCBhYmVydG8gZSBvXG4gICAgICogYmFja2Ryb3AgY29icmluZG8gbyBpbnB1dCkuIFByZWNpc2Egc2VyIMO6bmljbyBwb3JxdWUgb3MgZG9pcyBjbGlxdWVzIGRlIHVtIGR1cGxvIGNsaXF1ZVxuICAgICAqIHJlYWwgY29zdHVtYW0gY2hlZ2FyIHBvciBjYW1pbmhvcyBESUZFUkVOVEVTIOKAlCBvIHByaW1laXJvIHZpYSBtb3VzZWRvd24gbm8gaW5wdXQsIG9cbiAgICAgKiBzZWd1bmRvIHZpYSBiYWNrZHJvcENsaWNrIOKAlCBlbnTDo28gcmFzdHJlYXIgbyB0aW1lc3RhbXAgZG8gXCLDumx0aW1vIGNsaXF1ZVwiIHNlcGFyYWRhbWVudGVcbiAgICAgKiBlbSBjYWRhIGhhbmRsZXIgbnVuY2EgZGV0ZWN0YXJpYSB1bSBkdXBsbyBjbGlxdWUgZGUgdmVyZGFkZS4gTmVtIGBkYmxjbGlja2AgbmVtXG4gICAgICogYGV2ZW50LmRldGFpbGAgc8OjbyBjb25macOhdmVpcyBhcXVpIChkZXBlbmRlbSBkYSBjb250YWdlbS90YXJnZXRpbmcgaW50ZXJuYSBkZSBjbGlxdWVzIGRvXG4gICAgICogYnJvd3NlciwgcXVlIG5vc3NhcyBtYW5pcHVsYcOnw7VlcyBkZSBmb2NvL3NlbGXDp8OjbyBwYXJlY2VtIGF0cmFwYWxoYXIg4oCUIG9ic2VydmFkb1xuICAgICAqIGVtcGlyaWNhbWVudGU6IGBldmVudC5kZXRhaWxgIGZpY2Egc2VtcHJlIDEpLCBkYcOtIGEgZGV0ZWPDp8OjbyBtYW51YWwgcG9yIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyLCB0aW1lU3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0RvdWJsZUNsaWNrID0gdGltZVN0YW1wIC0gdGhpcy5sYXN0TW91c2VEb3duQXQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkRPVUJMRV9DTElDS19USFJFU0hPTERfTVM7XG4gICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gdGltZVN0YW1wO1xuICAgICAgICBpZiAoaXNEb3VibGVDbGljaykge1xuICAgICAgICAgICAgdGhpcy5sYXN0TW91c2VEb3duQXQgPSAwOyAvLyBldml0YSBxdWUgdW0gdGVyY2Vpcm8gY2xpcXVlIGVuY2FkZWllIGVtIG91dHJvIFwiZHVwbG9cIlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGx5U2VnbWVudENsaWNrKGlucHV0LCBjbGllbnRYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgbyBzZWdtZW50byBzb2IgYSBjb29yZGVuYWRhIGBjbGllbnRYYCBkZSB1bSBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkby5cbiAgICAgKiBDb21wYXJ0aWxoYWRvIHBvciBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biByZWFsIG5vIGA8aW5wdXQ+YCDigJQgdXNhbW9zIGBtb3VzZWRvd25gXG4gICAgICogZW0gdmV6IGRlIGBjbGlja2AgcG9ycXVlIG8gYGZvY3VzYC9gb3Blbk9uRm9jdXNgIGRpc3BhcmFkbyBubyBtZWlvIGRvIGdlc3RvIHBvZGUgbW9udGFyXG4gICAgICogbyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBlbWJhaXhvIGRvIGN1cnNvciBhbnRlcyBkbyBgbW91c2V1cGAsIGZhemVuZG8gbyBicm93c2VyIHJlc29sdmVyXG4gICAgICogbyBgY2xpY2tgIHBybyBhbmNlc3RyYWwgY29tdW0gZW50cmUgbyBhbHZvIGRvIG1vdXNlZG93biBlIG8gZG8gbW91c2V1cCDigJQgbmEgcHLDoXRpY2EsXG4gICAgICogYDxib2R5PmAg4oCUIGVtIHZleiBkbyBgPGlucHV0PmAgb3UgZG8gYmFja2Ryb3ApIGUgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWUgbm8gdHJpZ2dlclxuICAgICAqIGNvbSBvIHBhaW5lbCBqw6EgYWJlcnRvIGVtIHJlZ2ltZSBlc3TDoXZlbCwgaW50ZXJjZXB0YWRvIHBlbG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlTZWdtZW50Q2xpY2soaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIENhbGN1bGEgbyBzZWdtZW50byBhIHBhcnRpciBkYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSAoY2xpZW50WCksIG7Do28gZGVcbiAgICAgICAgLy8gYGlucHV0LnNlbGVjdGlvblN0YXJ0YCDigJQgbyBicm93c2VyIGFqdXN0YSBhIHBvc2nDp8OjbyBkbyBjYXJldCBkZSBmb3JtYSBhc3PDrW5jcm9uYVxuICAgICAgICAvLyBhcMOzcyBvIGNsaXF1ZSAob2JzZXJ2YWRvIGVtcGlyaWNhbWVudGUsIGVzcGVjaWFsbWVudGUgbmEgdHJhbnNpw6fDo28gZGUgZm9jbyksIGVudMOjb1xuICAgICAgICAvLyBsZXIgYHNlbGVjdGlvblN0YXJ0YCBuZXNzZSBtb21lbnRvIMOpIHVtYSBmb250ZSBuw6NvIGNvbmZpw6F2ZWwuIGBjbGllbnRYYCDDqSBzw61uY3Jvbm9cbiAgICAgICAgLy8gZSBpbWVkaWF0bywgc2VtIGVzc2EgY29ycmlkYS5cbiAgICAgICAgY29uc3QgY2hhckluZGV4ID0gdGhpcy5jbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dCwgY2xpZW50WCk7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBGb2NhIGUgc2VsZWNpb25hIG8gc2VnbWVudG8ganVudG9zLCBlIHJlYXBsaWNhIG9zIGRvaXMgYWxndW1hcyB2ZXplcyBsb2dvIGVtIHNlZ3VpZGEg4oCUXG4gICAgICAgIC8vIG8gYnJvd3Nlci9DREsgT3ZlcmxheSBwb2RlIG1leGVyIG5vIGZvY28gZGUgZm9ybWEgYXNzw61uY3JvbmEgZGVwb2lzIGRvIGNsaXF1ZSAoYmx1clxuICAgICAgICAvLyBuYXRpdm8gZG8gYmFja2Ryb3AsIGNka1RyYXBGb2N1cyBkbyBwYWluZWwsIGV0Yy4pOyBlbSB2ZXogZGUgdGVudGFyIHByZXZlci9ldml0YXIgY2FkYVxuICAgICAgICAvLyBjYXVzYSwgc2ltcGxlc21lbnRlIHZlbmNlbW9zIHJlYWZpcm1hbmRvIGZvY28rc2VsZcOnw6NvIHBvciBjaW1hLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudEF0KGNoYXJJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9jdXNBbmRTZWxlY3QoKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdCwgMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3QsIDUwKTtcbiAgICB9XG5cbiAgICAvKiogRHVwbG8gY2xpcXVlIHNlbGVjaW9uYSBvIGlucHV0IGludGVpcm8gKHRvZG9zIG9zIHNlZ21lbnRvcyksIGNvbW8gbnVtIGA8aW5wdXQ+YCBkZSB0ZXh0byBjb211bS4gKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXREYmxDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNlbGVjdFdob2xlRmllbGQoZXZlbnQudGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdG9kb3Mgb3Mgc2VnbWVudG9zIGRvIGlucHV0ICh1c2FkbyB0YW50byBwZWxvIGR1cGxvIGNsaXF1ZSBkZXRlY3RhZG8gbmEgbcOjbyBlbVxuICAgICAqIGBoYW5kbGVTZWdtZW50UG9pbnRlckRvd25gIHF1YW50byBwb3IgYGhhbmRsZUlucHV0RGJsQ2xpY2tgLCBtYW50aWRvIGNvbW8gY2FtaW5obyBkaXJldG9cbiAgICAgKiBwcmEgcXVlbSBkaXNwYXJhIHVtIGBkYmxjbGlja2AgZGUgdmVyZGFkZSwgZXguOiBhY2Vzc2liaWxpZGFkZS90ZXN0ZXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0V2hvbGVGaWVsZChpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIEdhcmFudGUgdW0gc2VnbWVudG8gYXRpdm8gKmFudGVzKiBkZSBmb2Nhcjogc2UgbyBDREsgT3ZlcmxheSB0aXZlciByb3ViYWRvIG8gZm9jbyBkZVxuICAgICAgICAvLyBmb3JtYSBhc3PDrW5jcm9uYSAoYmx1cikgZW50cmUgb3MgY2xpcXVlcyBxdWUgY29tcMO1ZW0gbyBkdXBsbyBjbGlxdWUsIG8gYGlucHV0LmZvY3VzKClgXG4gICAgICAgIC8vIGFiYWl4byBkaXNwYXJhIHVtIGV2ZW50byBgZm9jdXNgIGdlbnXDrW5vLCBlIGhhbmRsZUlucHV0Rm9jdXMgc8OzIGV2aXRhIGFnZW5kYXIgc3VhIHByw7NwcmlhXG4gICAgICAgIC8vIHJlYXBsaWNhw6fDo28gY29uY29ycmVudGUgKHF1ZSBzb2JyZXNjcmV2ZXJpYSBub3NzYSBzZWxlw6fDo28gZG8gY2FtcG8gaW50ZWlybyBtYWlzIHRhcmRlKVxuICAgICAgICAvLyBxdWFuZG8gZW5jb250cmEgYGdldEFjdGl2ZUluZGV4KCkgIT09IG51bGxgIOKAlCBvIG1lc21vIG1vdGl2byBwZWxvIHF1YWwgaGFuZGxlSW5wdXRDbGlja1xuICAgICAgICAvLyBzZW1wcmUgY2hhbWEgYHNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleClgIGFudGVzIGRlIGBpbnB1dC5mb2N1cygpYC5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0Rmlyc3RTZWdtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb247XG4gICAgICAgIC8vIE1lc21vIHBhZHLDo28gZGVmZW5zaXZvIGRlIGhhbmRsZUlucHV0Q2xpY2s6IG8gY2xpcXVlIHF1ZSBmZWNoYSBvIGR1cGxvIGNsaXF1ZSBqw6Egcm9kb3VcbiAgICAgICAgLy8gaGFuZGxlSW5wdXRDbGljayAoc2VsZWNpb25hbmRvIHPDsyB1bSBzZWdtZW50bykgZSBwb2RlIHRlciBhZ2VuZGFkbyBzdWFzIHByw7Nwcmlhc1xuICAgICAgICAvLyByZWFwbGljYcOnw7VlcyBhZGlhZGFzIOKAlCBhIGdlcmHDp8OjbyByZWPDqW0taW5jcmVtZW50YWRhIGFzIGludmFsaWRhLCBlbnTDo28gc8OzIGEgc2VsZcOnw6NvIGRvXG4gICAgICAgIC8vIGNhbXBvIGludGVpcm8gc29icmV2aXZlLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdEFsbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIGlucHV0LnZhbHVlLmxlbmd0aCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvY3VzQW5kU2VsZWN0QWxsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3RBbGwsIDApO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0QWxsLCA1MCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRlZE1vZGUoKSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBGb2NvIFwiZ2VudcOtbm9cIiAoVGFiIGEgcGFydGlyIGRlIG91dHJvIGNhbXBvLCBvdSBwcmltZWlybyBmb2NvIG5vIGNhbXBvKSDigJRcbiAgICAgICAgICAgICAgICAvLyBuZW5odW0gc2VnbWVudG8gYXRpdm8gYWluZGEsIGVudMOjbyBzZWxlY2lvbmEgbyBwcmltZWlyby5cbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0Rmlyc3RTZWdtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VHZW51aW5lRm9jdXMoKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIErDoSBleGlzdGUgdW0gc2VnbWVudG8gYXRpdm8g4oCUIHBvciBleGVtcGxvLCBoYW5kbGVJbnB1dENsaWNrIGFjYWJvdSBkZVxuICAgICAgICAgICAgICAgIC8vIGRlZmluaS1sbyBlIGVzdMOhIHJlZm9jYW5kbyBvIGlucHV0IHByb2dyYW1hdGljYW1lbnRlIGFww7NzIHVtIGJsdXIgZXNww7pyaW8uXG4gICAgICAgICAgICAgICAgLy8gTsOjbyByZWluaWNpYSBwYXJhIG8gcHJpbWVpcm8gc2VnbWVudG87IHPDsyBnYXJhbnRlIHF1ZSBhIHNlbGXDp8OjbyB2aXN1YWwgYmF0YVxuICAgICAgICAgICAgICAgIC8vIGNvbSBvIGVzdGFkbyBhdHVhbCwgZSBhbnVuY2lhIHPDsyBvIHNlZ21lbnRvIChvIHJlc3VtbyBkbyB2YWxvciBpbnRlaXJvIMOpXG4gICAgICAgICAgICAgICAgLy8gcmVzZXJ2YWRvIGFvIHByaW1laXJvIGZvY28gZ2VudcOtbm8pLlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlQWN0aXZlU2VnbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dPbkZvY3VzKCkgJiYgIXRoaXMuaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UpIHtcbiAgICAgICAgICAgIHRoaXMub3Blbk9uRm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNYXBlaWEgYSBjb29yZGVuYWRhIFggKHZpZXdwb3J0KSBkZSB1bSBjbGlxdWUgcGFyYSBvIMOtbmRpY2UgZGUgY2FyYWN0ZXJlIG1haXMgcHLDs3hpbW8gbm8gdmFsb3IgZXhpYmlkby4gKi9cbiAgICBwcml2YXRlIGNsaWNrQ2xpZW50WFRvQ2hhckluZGV4KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5wdXQpO1xuICAgICAgICBjb25zdCBjYW52YXMgPSAodGhpcy5tZWFzdXJlQ2FudmFzID8/PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkgcmV0dXJuIDA7XG4gICAgICAgIGN0eC5mb250ID0gYCR7c3R5bGUuZm9udFN0eWxlfSAke3N0eWxlLmZvbnRXZWlnaHR9ICR7c3R5bGUuZm9udFNpemV9ICR7c3R5bGUuZm9udEZhbWlseX1gO1xuICAgICAgICBjb25zdCByZWN0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgICAgICAgY29uc3QgbG9jYWxYID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIHBhZGRpbmdMZWZ0ICsgaW5wdXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgYmVzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGN0eC5tZWFzdXJlVGV4dCh0ZXh0LnNsaWNlKDAsIGkpKS53aWR0aCAtIGxvY2FsWCk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5hdGl2ZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlSW5wdXQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB3YXNTZWdtZW50ZWQgPSB0aGlzLmlzU2VnbWVudGVkTW9kZSgpO1xuICAgICAgICBpZiAod2FzU2VnbWVudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdFNlZ21lbnRlZFZhbHVlSWZDb21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuaXNFbXB0eSgpID8gJycgOiB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLmlucHV0RGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlucHV0LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IChldmVudCBhcyBGb2N1c0V2ZW50KS5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBFbSBtb2RvIHNlZ21lbnRhZG8sIHVtIGJsdXIgc2VtIGByZWxhdGVkVGFyZ2V0YCBub3JtYWxtZW50ZSBuw6NvIMOpIHVtYSBzYcOtZGEgcmVhbFxuICAgICAgICAgICAgLy8gZGUgZm9jbyDigJQgw6kgbyBiYWNrZHJvcCB0cmFuc3BhcmVudGUgZG8gcHLDs3ByaW8gcG9wdXAgKG7Do28gZm9jw6F2ZWwpIGludGVyY2VwdGFuZG9cbiAgICAgICAgICAgIC8vIHVtIGNsaXF1ZSBubyB0cmlnZ2VyIHBhcmEgdHJvY2FyIGRlIHNlZ21lbnRvLiBOw6NvIHJlZGlyZWNpb25hIG8gZm9jbyBwcm8gcGFpbmVsXG4gICAgICAgICAgICAvLyBuZXNzZSBjYXNvOyBkZWl4YSBoYW5kbGVJbnB1dENsaWNrL2hhbmRsZUlucHV0Rm9jdXMgcmVzb2x2ZXJlbSAoZWxlcyByZWZvY2FtIG9cbiAgICAgICAgICAgIC8vIGlucHV0IGUgcmVhcGxpY2FtIG8gc2VnbWVudG8gY29ycmV0byBsb2dvIGVtIHNlZ3VpZGEpLlxuICAgICAgICAgICAgY29uc3QgbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrID0gd2FzU2VnbWVudGVkICYmICFyZWxhdGVkVGFyZ2V0O1xuICAgICAgICAgICAgaWYgKCFsb29rc0xpa2VPd25UcmlnZ2VyQ2xpY2sgJiYgKCFyZWxhdGVkVGFyZ2V0IHx8ICFwYW5lbD8uY29udGFpbnMocmVsYXRlZFRhcmdldCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNyZWFzZUhvdXJCdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInRvZGF5XCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2hhbmdlKHJhdzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXJhdz8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnB1dCh0aGlzLm1vZGUoKSwgcmF3LCB0aGlzLnJhbmdlU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZShwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHBhcnNlZCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShwYXJzZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZCA9IHBhcnNlZCBhcyBEYXRlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoZC5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlVHJpZ2dlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50LCBldmVudC50YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUZWNsYXMgcXVlIGRldmVtIHBhc3NhciBkaXJldG8gcGFyYSBvIGJyb3dzZXIgc2VtIGluc2VyaXIvYWx0ZXJhciBuYWRhIG5vIGNhbXBvLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNFR01FTlRFRF9QQVNTVEhST1VHSF9LRVlTID0gWydIb21lJywgJ0VuZCcsICdTaGlmdCcsICdDYXBzTG9jaycsICdFc2NhcGUnLCAnRW50ZXInLCAnICddO1xuXG4gICAgLyoqIERpZ2l0YcOnw6NvIHBvciBzZWdtZW50byAoZGlhL23DqnMvYW5vL2hvcmEvbWludXRvL3NlZ3VuZG8vYW1wbSkgbm8gaW5wdXQgZG8gdHJpZ2dlci4gKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRlZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgY29uc3QgeyBrZXksIGN0cmxLZXksIG1ldGFLZXksIGFsdEtleSwgc2hpZnRLZXkgfSA9IGV2ZW50O1xuICAgICAgICBpZiAoY3RybEtleSB8fCBtZXRhS2V5IHx8IGFsdEtleSB8fCBrZXkuc3RhcnRzV2l0aCgnRicpKSByZXR1cm47XG4gICAgICAgIGlmIChEYXRlcGlja2VyQ29tcG9uZW50LlNFR01FTlRFRF9QQVNTVEhST1VHSF9LRVlTLmluY2x1ZGVzKGtleSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb24rKztcblxuICAgICAgICBpZiAoa2V5ID09PSAnVGFiJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWdtZW50RW5naW5lLm1vdmVUb0FkamFjZW50U2VnbWVudChzaGlmdEtleSA/IC0xIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnbW92ZWQnKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnIHx8IGtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgLy8gQW8gY29udHLDoXJpbyBkbyBUYWIsIHNldGEgbm8gcHJpbWVpcm8vw7psdGltbyBzZWdtZW50byBuw6NvIGRldmUgc2FpciBkbyBjYW1wbyBuZW1cbiAgICAgICAgICAgIC8vIGRlc2F0aXZhciBhIHNlbGXDp8OjbyDigJQgYG1vdmVUb0FkamFjZW50U2VnbWVudGAgemVyYSBgYWN0aXZlSW5kZXhgIGFvIGJhdGVyIG5vIGxpbWl0ZVxuICAgICAgICAgICAgLy8gKGNvbXBvcnRhbWVudG8gY2VydG8gcHJvIFRhYiBlc2NhcGFyIGRvIGNhbXBvKSwgZW50w6NvIG5hIGJvcmRhIGEgZ2VudGUgcmVzZWxlY2lvbmFcbiAgICAgICAgICAgIC8vIG8gc2VnbWVudG8gcXVlIGrDoSBlc3RhdmEgYXRpdm8sIGltaXRhbmRvIG8gYDxpbnB1dCB0eXBlPVwiZGF0ZVwiPmAgbmF0aXZvIChhIHNldGEgc29tZVxuICAgICAgICAgICAgLy8gbm8gbGltaXRlLCBuw6NvIG5hdmVnYSBwcmEgZm9yYSkuXG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoa2V5ID09PSAnQXJyb3dMZWZ0JyA/IC0xIDogMSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnYm91bmRhcnknICYmIGJlZm9yZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RTZWdtZW50KGJlZm9yZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dVcCcgfHwga2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5pbmNyZW1lbnRBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0Fycm93VXAnID8gMSA6IC0xKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdCYWNrc3BhY2UnIHx8IGtleSA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBpc1dob2xlRmllbGRTZWxlY3RlZCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID09PSAwICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PT0gaW5wdXQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGlzV2hvbGVGaWVsZFNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFjdGl2ZVNlZ21lbnQoa2V5ID09PSAnQmFja3NwYWNlJyA/ICdiYWNrc3BhY2UnIDogJ2RlbGV0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9eWzAtOV0kLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUudHlwZURpZ2l0KGtleSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmFjdGl2ZUtpbmQoKSA9PT0gJ2FtcG0nICYmIC9eW2FwQVBdJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNldEFtUG0oa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdhJyA/IDAgOiAxKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1YWxxdWVyIG91dHJhIHRlY2xhIGltcHJpbcOtdmVsIChsZXRyYXMsIHPDrW1ib2xvcykgbsOjbyDDqSBpbnNlcmlkYSBubyBjYW1wby5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICAvKiogU2luY3Jvbml6YSBvIERPTSBjb20gbyBlc3RhZG8gYXR1YWwgZGEgZW5naW5lICh2YWxvciArIHNlbGXDp8OjbyBkbyBzZWdtZW50byBhdGl2bykgYXDDs3MgdW1hIG11dGHDp8Ojby4gKi9cbiAgICBwcml2YXRlIHN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCk7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy5zZWdtZW50RW5naW5lLmdldFNlZ21lbnRSYW5nZShpbmRleCk7XG4gICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKiBcIntyw7N0dWxvIGRvIHNlZ21lbnRvfSwge3ZhbG9yfVwiIChleC46IFwiRGlhLCAwM1wiKSDigJQgdGV4dG8gZG8gYW7Dum5jaW8gZGUgbsOtdmVsIGRlIHNlZ21lbnRvLiAqL1xuICAgIHByaXZhdGUgYnVpbGRTZWdtZW50QW5ub3VuY2VtZW50VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBraW5kID0gdGhpcy5zZWdtZW50RW5naW5lLmFjdGl2ZUtpbmQoKTtcbiAgICAgICAgaWYgKGtpbmQgPT09IG51bGwpIHJldHVybiAnJztcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChEYXRlcGlja2VyQ29tcG9uZW50LlNFR01FTlRfTEFCRUxfS0VZU1traW5kXSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlU2VnbWVudFRleHQoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0IHx8IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X2VtcHR5Jyk7XG4gICAgICAgIHJldHVybiBgJHtsYWJlbH0sICR7dmFsdWV9YDtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSB2aWEgTGl2ZUFubm91bmNlciBvIHNlZ21lbnRvIGF0aXZvIOKAlCBjaGFtYWRvIGVtIHRvZG8gcG9udG8gcXVlIG11ZGEgbyBzZWdtZW50byBhdGl2by9zZXVcbiAgICAgKiAgdmFsb3IgREVQT0lTIGRvIHByaW1laXJvIGZvY28gZ2VudcOtbm8gKHF1ZSBqw6EgcmVjZWJlIGVzc2UgbWVzbW8gdGV4dG8gZW1idXRpZG8gZW0gYGFubm91bmNlR2VudWluZUZvY3VzYCkuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTtcbiAgICAgICAgaWYgKHRleHQpIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRleHQsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKiogUmVzdW1vIGh1bWFuaXphZG8gZG8gdmFsb3IgaW50ZWlybyAoZXguOiBcIjEwIGRlIG91dHVicm8gZGUgMjAyMFwiLCBvdSBhIGZyYXNlIGdlbsOpcmljYSBkZSBjYW1wb1xuICAgICAqICB2YXppbykg4oCUIGNvbXBsZW1lbnRhIG8gYDxpbnB1dD5gIHNlZ21lbnRhZG8sIHF1ZSBvIGxlaXRvciBkZSB0ZWxhIGzDqiBkZSBmb3JtYSBsaXRlcmFsL3BvdWNvXG4gICAgICogIG5hdHVyYWwgKGVzcXVlbGV0byBkZSBzdWJsaW5oYWRvcyBxdWFuZG8gdmF6aW8sIGTDrWdpdG9zIHNlcGFyYWRvcyBwb3IgYmFycmEgcXVhbmRvIGNvbXBsZXRvKS5cbiAgICAgKiAgRm9ybWF0YcOnw6NvIHB1cmEgdmlhIGBJbnRsYCwgc2VtIGNoYXZlcyBkZSB0cmFkdcOnw6NvIG5vdmFzIChleGNldG8gYSBmcmFzZSBkZSBjYW1wbyB2YXppbykuXG4gICAgICogIEVzcGVsaGEgYGZvcm1hdERheUFyaWFMYWJlbGAgcHJvIG1vZG8gYGRhdGVgLiAqL1xuICAgIHByaXZhdGUgZGVzY3JpYmVXaG9sZVZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25vX3ZhbHVlX3NlbGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7IC8vIHZhbG9yIHBhcmNpYWxtZW50ZSBkaWdpdGFkbyAoaW5jb21wbGV0bykg4oCUIG5hZGEgaHVtYW5pesOhdmVsIGFpbmRhLlxuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5jdXJyZW50TGFuZygpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMubW9kZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwoZGF0ZSk7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGxhbmcsIHsgbW9udGg6ICdsb25nJywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKGxhbmcsIHtcbiAgICAgICAgICAgICAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kOiB0aGlzLnNob3dTZWNvbmRzKCkgPyAnMi1kaWdpdCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhvdXIxMjogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSA9PT0gJzEyJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyhsYW5nLCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVTdHlsZTogJ2xvbmcnLFxuICAgICAgICAgICAgICAgICAgICB0aW1lU3R5bGU6IHRoaXMuc2hvd1NlY29uZHMoKSA/ICdtZWRpdW0nIDogJ3Nob3J0JyxcbiAgICAgICAgICAgICAgICAgICAgaG91cjEyOiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7IC8vIGlzU2VnbWVudGVkTW9kZSgpIGrDoSByZXN0cmluZ2UgYSBkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBbsO6bmNpbyBjb21iaW5hZG8gbm8gcHJpbWVpcm8gZm9jbyBnZW51w61ubyBkbyBjYW1wbzogcmVzdW1vIGRvIHZhbG9yIGludGVpcm8gKyBzZWdtZW50byBhdGl2byxcbiAgICAgKiAgbnVtYSDDmk5JQ0EgY2hhbWFkYSBhIGBhbm5vdW5jZWAgKGV2aXRhIGR1YXMgcmVnacO1ZXMgY29uY29ycmVudGVzL3VtYSBjb3J0YW5kbyBhIG91dHJhKS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlR2VudWluZUZvY3VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5kZXNjcmliZVdob2xlVmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VnbWVudFRleHQgPSB0aGlzLmJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBzdW1tYXJ5ID8gYCR7c3VtbWFyeX0uICR7c2VnbWVudFRleHR9YCA6IHNlZ21lbnRUZXh0O1xuICAgICAgICBpZiAoY29tYmluZWQpIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKGNvbWJpbmVkLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFByb3BhZ2EgbyB2YWxvciBkYSBlbmdpbmUgcGFyYSBvIG1vZGVsbyAoQ1ZBKSBhc3NpbSBxdWUgdG9kb3Mgb3Mgc2VnbWVudG9zIGVzdGl2ZXJlbSBjb21wbGV0b3MuICovXG4gICAgcHJpdmF0ZSBjb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zZWdtZW50RW5naW5lLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUoKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2UgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZSgpID8/XG4gICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRNb250aCgpLFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICAgICApO1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLnRvRGF0ZShiYXNlKTtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm47XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChkYXRlLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChkYXRlLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGRhdGUuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vbkNoYW5nZShkYXRlKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZVByZXYoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgLSAxMCB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgLSAxLCB2aWV3LmdldE1vbnRoKCksIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VZZWFyQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZU5leHQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgKyAxMCB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgKyAxLCB2aWV3LmdldE1vbnRoKCksIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VZZWFyQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHPDsyBcInttw6pzfSBkZSB7YW5vfVwiIChleC46IFwib3V0dWJybyBkZSAyMDI2XCIpIGFvIGNydXphciBmcm9udGVpcmEgZGUgbcOqcyBuYSBncmFkZSBkZSBkaWFzLlxuICAgICAqICBPIG5vdm8gZm9jbyAoYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXSkgasOhIGNhcnJlZ2EgZXNzYSBpbmZvIGRlbnRybyBkbyBhcmlhLWxhYmVsIGxvbmdvIGRlXG4gICAgICogIGBmb3JtYXREYXlBcmlhTGFiZWxgLCBtYXMgbyBub21lIGRvIG3DqnMgZmljYSBcImVudGVycmFkb1wiIG5vIG1laW8gZGEgZnJhc2UgZSBwYXNzYSBkZXNwZXJjZWJpZG9cbiAgICAgKiAgKGNvbmZpcm1hZG8gY29tIHRlc3RlIG1hbnVhbCB2aWEgT3JjYSkuIFNlbSBwcmVmaXhvIHRpcG8gXCJhZ29yYSBleGliaW5kb1wiLCBtZXNtYSBjb252ZW7Dp8Ojb1xuICAgICAqICBhZG90YWRhIHBvciBvdXRyb3MgY2FsZW5kw6FyaW9zIGFjZXNzw612ZWlzIChleC46IHJlYWN0LWFyaWEpLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VNb250aENoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgbmV3RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KSxcbiAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIG8gYW5vIGF0dWFsbWVudGUgZXhpYmlkbyBhbyBwYWdpbmFyIGEgdmlldyAnbW9udGhzJyAoZXguOiBcIjIwMjVcIikuIE8gYDxzcGFuPmAgY2VudHJhbFxuICAgICAqICBxdWUgbW9zdHJhIGVzc2UgYW5vIG5vIGNhYmXDp2FsaG8gbsOjbyDDqSBmb2PDoXZlbCwgZSBvIGFyaWEtbGFiZWwgZG9zIGJvdMO1ZXMgZGUgbmF2ZWdhw6fDo28gc8OzXG4gICAgICogIGZhbGEgbyBhbm8gZGUgREVTVElOTyAoXCJBbm8gYW50ZXJpb3IsIDIwMjVcIikg4oCUIHNlbSBpc3NvLCBvIGxlaXRvciBkZSB0ZWxhIG51bmNhIGNvbmZpcm1hIG9cbiAgICAgKiAgYW5vIHF1ZSBwYXNzb3UgYSBlc3RhciBlbSBleGliacOnw6NvLCBzw7Mgb3MgYWx2b3MgXCJhbnRlcmlvclwiL1wicHLDs3hpbW9cIi4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlWWVhckNoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgbmV3RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7IHllYXI6ICdudW1lcmljJyB9KSxcbiAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBNZXNtYSBtb3RpdmHDp8OjbyBkZSBgYW5ub3VuY2VZZWFyQ2hhbmdlYCwgcGFyYSBhIHZpZXcgJ3llYXJzJyAocGFnaW5hw6fDo28gZGUgZMOpY2FkYSkg4oCUIGFudW5jaWFcbiAgICAgKiAgbyBpbnRlcnZhbG8gYXR1YWxtZW50ZSBleGliaWRvIChleC46IFwiMjAyMCDigJMgMjAzMVwiKSwgZXNwZWxoYW5kbyBvIHRleHRvIGRvIGA8c3Bhbj5gIGNlbnRyYWwuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZURlY2FkZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UoYCR7dGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKX0g4oCTICR7dGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIDExfWAsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBDYW5jZWxhbWVudG8gbGV2ZTogZGVzaXN0ZSBzw7MgZGEgZGF0YSBpbmljaWFsIHBlbmRlbnRlLCBtYW50ZW5kbyBvIHBhaW5lbCBhYmVydG8sXG4gICAgICAgICAgICAvLyBlbSB2ZXogZGUgZmVjaGFyIG8gZGnDoWxvZ28gaW50ZWlybyAobyDDum5pY28gY2FtaW5obyBhbnRlcyBkaXNzbykuIGBzdG9wUHJvcGFnYXRpb25gXG4gICAgICAgICAgICAvLyBpbXBlZGUgZXNzZSBtZXNtbyBFc2NhcGUgZGUgYm9yYnVsaGFyIGF0w6kgYGRvY3VtZW50LmJvZHlgLCBvbmRlIG9cbiAgICAgICAgICAgIC8vIGBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyYCBkbyBDREsgZXNjdXRhIGBrZXlkb3duYCAoZmFzZSBkZSBidWJibGUsIHNlbSBjYXB0dXJlKSBlXG4gICAgICAgICAgICAvLyBkaXNwYXJhcmlhIGBoYW5kbGVPdmVybGF5S2V5ZG93bmAvYGNsb3NlUGFuZWwoKWAg4oCUIHNlbSBpc3NvLCBvIGNhbmNlbGFtZW50byBsZXZlIGUgb1xuICAgICAgICAgICAgLy8gZmVjaGFtZW50byB0b3RhbCBhY29udGVjZXJpYW0gbmVzc2UgbWVzbW8gRXNjYXBlLiBTZW0gYHBlbmRpbmdSYW5nZVN0YXJ0YCwgZXNzZSBgaWZgXG4gICAgICAgICAgICAvLyDDqSBmYWxzbyBlIG8gRXNjYXBlIHNlZ3VlIGludG9jYWRvIGF0w6kgYGRvY3VtZW50LmJvZHlgLCBmZWNoYW5kbyBvIHBhaW5lbCBjb21vIHNlbXByZS5cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxQZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQVJST1dTID0gWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddO1xuICAgICAgICBpZiAoIUFSUk9XUy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBncmlkID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IEFycmF5LmZyb20oZ3JpZC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudElkeCA9IGJ1dHRvbnMuaW5kZXhPZihldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICBpZiAoY3VycmVudElkeCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIGRlbHRhID0gMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykgZGVsdGEgPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIGRlbHRhID0gLURhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuXG4gICAgICAgIGNvbnN0IG5leHRJZHggPSBjdXJyZW50SWR4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJZHggPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2RGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXYoKTtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0bnMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIGJ0bnMubGVuZ3RoICsgbmV4dElkeCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dElkeCA+PSBidXR0b25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dERpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1pbihuZXh0SWR4IC0gYnV0dG9ucy5sZW5ndGgsIGJ0bnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJ1dHRvbnNbbmV4dElkeF0/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBidXR0b25zW25leHRJZHhdLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kRW5hYmxlZChcbiAgICAgICAgYnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICAgICAgc3RhcnRJZHg6IG51bWJlcixcbiAgICAgICAgZGlyZWN0aW9uOiAxIHwgLTEsXG4gICAgKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpID49IDAgJiYgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKCFidXR0b25zW2ldLmRpc2FibGVkKSByZXR1cm4gYnV0dG9uc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3dpdGNoVG9Nb250aHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJhY2tUb0NhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTXVsdGlwbGVEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChkYXkuZGF0ZSk7XG4gICAgICAgICAgICAgICAgLy8gU2VtIGlzc28gbyA8aW5wdXQ+IGZpY2F2YSBjb20gbyB2YWxvciBhbnRlcmlvciAob3UgdmF6aW8pIGVucXVhbnRvIHPDsyBhIGRhdGFcbiAgICAgICAgICAgICAgICAvLyBpbmljaWFsIGVzdGF2YSBlc2NvbGhpZGEg4oCUIHRhbnRvIG8gdGV4dG8gdmlzw612ZWwgcXVhbnRvIG8gcXVlIHVtIGxlaXRvciBkZSB0ZWxhXG4gICAgICAgICAgICAgICAgLy8gbMOqIGFvIGZvY2FyIG8gY2FtcG8gZmljYXZhbSBvYnNvbGV0b3MgYXTDqSBhIHNlZ3VuZGEgZXNjb2xoYS5cbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh7IHN0YXJ0OiBkYXkuZGF0ZSwgZW5kOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VSYW5nZVN0YXJ0U2VsZWN0ZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPVxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLmdldFRpbWUoKSA8PSBkYXkuZGF0ZS5nZXRUaW1lKCkgPyBbcGVuZGluZywgZGF5LmRhdGVdIDogW2RheS5kYXRlLCBwZW5kaW5nXTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0geyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VSYW5nZUNvbXBsZXRlZChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRheS5kYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVPbkRhdGVUaW1lU2VsZWN0KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZGljaW9uYS9yZW1vdmUgdW1hIGRhdGEgZGEgc2VsZcOnw6NvIG3Dumx0aXBsYS4gTyBwYWluZWwgcGVybWFuZWNlIGFiZXJ0by4gKi9cbiAgICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZy5maW5kSW5kZXgoKGQpID0+IGlzU2FtZURheShkLCBub3JtYWxpemVkKSk7XG4gICAgICAgIGNvbnN0IG5leHQgPVxuICAgICAgICAgICAgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gZXhpc3RpbmcuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICA6IFsuLi5leGlzdGluZywgbm9ybWFsaXplZF0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KG5leHQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXh0KTtcbiAgICAgICAgY29uc3QgZW1pdFZhbHVlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShlbWl0VmFsdWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZW1pdFZhbHVlKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZU11bHRpcGxlRGF0ZVRvZ2dsZShub3JtYWxpemVkLCBpbmRleCA8IDApO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHZpYSBMaXZlQW5ub3VuY2VyIGEgZGF0YSBjb21wbGV0YSAoZGlhIGRhIHNlbWFuYSwgZGlhLCBtw6pzLCBhbm8pIGUgc2UgZWxhIGFjYWJvdVxuICAgICAqICBkZSBzZXIgc2VsZWNpb25hZGEgb3UgZGVzbWFyY2FkYSDigJQgcHJvIHVzdcOhcmlvIGRlIGxlaXRvciBkZSB0ZWxhIHNhYmVyIGV4YXRhbWVudGUgbyBxdWVcbiAgICAgKiAgbXVkb3UgYW50ZXMgZGUgc2VndWlyIGVzY29saGVuZG8gYSBwcsOzeGltYSBkYXRhLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VNdWx0aXBsZURhdGVUb2dnbGUoZGF0ZTogRGF0ZSwgaXNOb3dTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlVGV4dCA9IHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGUpO1xuICAgICAgICBjb25zdCBrZXkgPSBpc05vd1NlbGVjdGVkXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXRlX3NlbGVjdGVkJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF0ZV9kZXNlbGVjdGVkJztcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoa2V5LCB7IGRhdGU6IGRhdGVUZXh0IH0pLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFRleHRvIGNvbXBhcnRpbGhhZG8gZW50cmUgbyBhbsO6bmNpbyB0cmFuc2l0w7NyaW8gZGUgaW7DrWNpbyBkZSBpbnRlcnZhbG8gZXNjb2xoaWRvXG4gICAgICogIChgYW5ub3VuY2VSYW5nZVN0YXJ0U2VsZWN0ZWRgKSBlIG8gc3RhdHVzIHBlcnNpc3RlbnRlIGV4cG9zdG8gdmlhIGBhcmlhLWRlc2NyaWJlZGJ5YCBub1xuICAgICAqICBgPGlucHV0PmAgKGByYW5nZVBlbmRpbmdTdGF0dXNUZXh0YCkg4oCUIG1lc21hIHJlZGHDp8OjbyBub3MgZG9pcyBsdWdhcmVzIGRlIHByb3DDs3NpdG8sIHByYSBuw6NvXG4gICAgICogIHNvYXJlbSBjb21vIGRvaXMgZXN0YWRvcyBkaWZlcmVudGVzIHBybyBtZXNtbyBtb21lbnRvLiAqL1xuICAgIHByaXZhdGUgYnVpbGRSYW5nZVN0YXJ0U2VsZWN0ZWRUZXh0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3N0YXJ0X3NlbGVjdGVkJywge1xuICAgICAgICAgICAgZGF0ZTogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwoZGF0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBBbnVuY2lhIHF1ZSBhIGRhdGEgSU5JQ0lBTCBkbyBpbnRlcnZhbG8gZm9pIGVzY29saGlkYSDigJQgbyBwcmltZWlybyBjbGlxdWUgZW0gYHJhbmdlYCBlcmFcbiAgICAgKiAgbXVkbyAoYW8gY29udHLDoXJpbyBkbyB0b2dnbGUgZW0gbW9kbyBgbXVsdGlwbGVgLCBzZW1wcmUgYW51bmNpYWRvKS4gUmVjZWJlIHVtIGBEYXRlYCBwdXJvLFxuICAgICAqICBuw6NvIHVtIGNsaXF1ZTogYHNlbGVjdFRvZGF5KClgIGNoYW1hIGBzZWxlY3REYXRlKClgIGludGVybmFtZW50ZSBlIGhlcmRhIGVzdGUgYW7Dum5jaW8gZGVcbiAgICAgKiAgZ3Jhw6dhLCBzZW0gcHJlY2lzYXIgZGUgdW1hIHNlZ3VuZGEgY2hhbWFkYS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlUmFuZ2VTdGFydFNlbGVjdGVkKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UodGhpcy5idWlsZFJhbmdlU3RhcnRTZWxlY3RlZFRleHQoZGF0ZSksICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBvIGludGVydmFsbyBjb25jbHXDrWRvLCBjaGFtYWRvIGFudGVzIGRlIGBjbG9zZVBhbmVsKClgIOKAlCBvIGBMaXZlQW5ub3VuY2VyYCBlc2NyZXZlXG4gICAgICogIG51bWEgcmVnacOjbyBgYXJpYS1saXZlYCBwcsOzcHJpYSBlIGRlc2Fjb3BsYWRhIGRvIGZvY28sIGVudMOjbyBuw6NvIMOpIGNvcnRhZG8gcGVsYSByZXN0YXVyYcOnw6NvXG4gICAgICogIGRlIGZvY28gcXVlIGBjbG9zZVBhbmVsKClgIGFnZW5kYSB1bSB0aWNrIGRlcG9pcyB2aWEgYGFmdGVyTmV4dFJlbmRlcmAuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVJhbmdlQ29tcGxldGVkKHJhbmdlOiBEYXRlUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFyYW5nZS5zdGFydCB8fCAhcmFuZ2UuZW5kKSByZXR1cm47XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3NlbGVjdGVkJywge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChyYW5nZS5zdGFydCksXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChyYW5nZS5lbmQpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoSW5kZXgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZpZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0ZURpc2FibGVkKHRvZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgY2FsRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgICAgICAgICBkYXRlOiB0b2RheSxcbiAgICAgICAgICAgICAgICBkYXlPZk1vbnRoOiB0b2RheS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNUb2RheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VFbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzSW5SYW5nZTogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGNhbERheSk7XG4gICAgICAgICAgICB0aGlzLnRvZGF5Q2xpY2suZW1pdCh0b2RheSk7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScgJiYgdGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgICAgIC8vIEVtIHJhbmdlLCBzZWxlY3REYXRlKCkgc8OzIGZlY2hhIG8gcGFpbmVsIG5hIHNlZ3VuZGEgZXNjb2xoYSAodmVyIHNldSByYW1vXG4gICAgICAgICAgICAgICAgLy8gJ3JhbmdlJyk7IG5hIHByaW1laXJhLCBvIGZvY28gZmljYSBwYXJhZG8gbm8gYm90w6NvIFwiSG9qZVwiIGRvIHJvZGFww6ksIGZvcmEgZGFcbiAgICAgICAgICAgICAgICAvLyBncmFkZSDigJQgc2VtIGlzc28gbyB1c3XDoXJpbyBuw6NvIHRpbmhhIG5lbmh1bWEgcGlzdGEgZGUgcXVlIHByZWNpc2F2YSB2b2x0YXIgcHJhXG4gICAgICAgICAgICAgICAgLy8gZ3JhZGUgcHJhIGVzY29saGVyIGEgZGF0YSBmaW5hbC4gQSBjw6lsdWxhIGRlIGhvamUgasOhIGNhcnJlZ2FcbiAgICAgICAgICAgICAgICAvLyBgZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJgIChpc1JhbmdlU3RhcnQgYWNhYm91IGRlIHNlciBzZXRhZG8gcG9yIHNlbGVjdERhdGUpLCBxdWVcbiAgICAgICAgICAgICAgICAvLyBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpIGrDoSBwcmlvcml6YS4gTyBhbsO6bmNpbyBkZSBcImluw61jaW8gc2VsZWNpb25hZG9cIiBqw6FcbiAgICAgICAgICAgICAgICAvLyBkaXNwYXJvdSBkZW50cm8gZGUgc2VsZWN0RGF0ZSgpIGFudGVzIGRlc3RlIGJsb2NvIHJvZGFyLlxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjbGVhclZhbHVlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhZFJhbmdlSW5Qcm9ncmVzcyA9XG4gICAgICAgICAgICB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiAodGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpICE9PSBudWxsIHx8IHRoaXMucmFuZ2VWYWx1ZSgpICE9PSBudWxsKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KDApO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KDApO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KDApO1xuICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobnVsbCk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLmNsZWFyQ2xpY2suZW1pdChldmVudCk7XG4gICAgICAgIGlmIChoYWRSYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIC8vIFPDsyBhbnVuY2lhIHF1YW5kbyBoYXZpYSBkZSBmYXRvIGFsZ28gYSBsaW1wYXIg4oCUIGV2aXRhIFwiaW50ZXJ2YWxvIGxpbXBvXCIgdG9kYSB2ZXpcbiAgICAgICAgICAgIC8vIHF1ZSBhbGd1w6ltIGFwZXJ0YSBcIkxpbXBhclwiIHBvciBnYXJhbnRpYSwgc2VtIG5hZGEgc2VsZWNpb25hZG8gYWluZGEuXG4gICAgICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfY2xlYXJlZCcpLFxuICAgICAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMudmFsdWUoKSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihjb25maXJtZWQpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFRpbWUgcGlja2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudEhvdXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgodGhpcy5ob3VycygpICsgdGhpcy5zdGVwSG91cigpKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSAtIHRoaXMuc3RlcEhvdXIoKSArIHRoaXMubWF4SG91cnMpICUgdGhpcy5tYXhIb3Vycyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpICsgdGhpcy5taW51dGVTdGVwKCkpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50TWludXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgodGhpcy5taW51dGVzKCkgLSB0aGlzLm1pbnV0ZVN0ZXAoKSArIHRoaXMubWF4TWludXRlcykgJSB0aGlzLm1heE1pbnV0ZXMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRTZWNvbmRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KCh0aGlzLnNlY29uZHMoKSArIHRoaXMuc3RlcFNlY29uZCgpKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgLSB0aGlzLnN0ZXBTZWNvbmQoKSArIDYwKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50SG91cnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudFNlY29uZHMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbGYgPSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgICAgIGNvbnN0IGgxMiA9IE1hdGgubWluKGhhbGYsIE1hdGgubWF4KDEsIHBhcnNlZCkpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGgxMiAlIGhhbGY7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmFtUG0oKSA9PT0gJ1BNJyA/IGJhc2UgKyBoYWxmIDogYmFzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChNYXRoLm1pbih0aGlzLm1heEhvdXJzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqIEFsdGVybmEgZW50cmUgQU0gZSBQTSBzb21hbmRvL3N1YnRyYWluZG8gMTIgaG9yYXMgZGEgaG9yYSBpbnRlcm5hLiAqL1xuICAgIHByb3RlY3RlZCB0b2dnbGVBbVBtKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KHRoaXMuaG91cnMoKSA8IGhhbGYgPyB0aGlzLmhvdXJzKCkgKyBoYWxmIDogdGhpcy5ob3VycygpIC0gaGFsZik7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChNYXRoLm1pbih0aGlzLm1heE1pbnV0ZXMgLSAxLCBNYXRoLm1heCgwLCBwYXJzZWQpKSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVNlY29uZHNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5zZWNvbmRzLnNldChNYXRoLm1pbig1OSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRheUhvdmVyKGRhdGU6IERhdGUgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgaXNEYXRlRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbigpO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCgpO1xuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkYXRlKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiBzdHJpcFRpbWUoZGF0ZSkgPiBzdHJpcFRpbWUobWF4KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF5cyA9IHRoaXMuZGlzYWJsZWREYXlzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERheXMubGVuZ3RoICYmIGRpc2FibGVkRGF5cy5pbmNsdWRlcyhkYXRlLmdldERheSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF0ZXMgPSB0aGlzLmRpc2FibGVkRGF0ZXMoKTtcbiAgICAgICAgaWYgKGRpc2FibGVkRGF0ZXMubGVuZ3RoICYmIGRpc2FibGVkRGF0ZXMuc29tZSgoZCkgPT4gaXNTYW1lRGF5KGQsIGRhdGUpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICByZXR1cm4gISFzZWxlY3RlZCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc1llYXJEaXNhYmxlZCh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiB5ZWFyIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobWF4ICYmIHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNDdXJyZW50WWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHllYXIgPT09IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNNb250aFNlbGVjdGVkKG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0TW9udGgoKSA9PT0gbW9udGhJbmRleCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhEaXNhYmxlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiAoeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtaW4uZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4IDwgbWluLmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heCAmJiAoeWVhciA+IG1heC5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4ID4gbWF4LmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYWRUaW1lKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIH1cblxuICAgIC8qKiBgZGF5YCDDqSBvcGNpb25hbCBlIHPDsyB1c2FkbyBlbSBgbW9kZT1cInJhbmdlXCJgIOKAlCBvcyBkZW1haXMgY2FsbCBzaXRlcyAocmVzdW1vIGRvIHZhbG9yXG4gICAgICogIHNlZ21lbnRhZG8sIGFuw7puY2lvIGRlIHRvZ2dsZSBlbSBtb2RvIGBtdWx0aXBsZWApIG51bmNhIHTDqm0gdW0gYENhbGVuZGFyRGF5YCDDoCBtw6NvIGUgbnVuY2FcbiAgICAgKiAgcm9kYW0gZW0gYHJhbmdlYCwgZW50w6NvIGNvbnRpbnVhbSByZWNlYmVuZG8gZXhhdGFtZW50ZSBvIHRleHRvIGRlIHNlbXByZS4gKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGU6IERhdGUsIGRheT86IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwge1xuICAgICAgICAgICAgd2Vla2RheTogJ2xvbmcnLFxuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFkYXkgfHwgdGhpcy5tb2RlKCkgIT09ICdyYW5nZScpIHJldHVybiBiYXNlO1xuICAgICAgICBjb25zdCBzdWZmaXggPSB0aGlzLnJhbmdlRGF5U3RhdHVzU3VmZml4KGRheSk7XG4gICAgICAgIHJldHVybiBzdWZmaXggPyBgJHtiYXNlfSwgJHtzdWZmaXh9YCA6IGJhc2U7XG4gICAgfVxuXG4gICAgLyoqIFN1Zml4byBxdWUgZGl6IG8gcGFwZWwgZG8gZGlhIGRlbnRybyBkbyBpbnRlcnZhbG8gc2VsZWNpb25hZG8g4oCUIHNlbSBpc3NvLCB0b2RhIGPDqWx1bGEgZGFcbiAgICAgKiAgZ3JhZGUgc29hIGlkw6pudGljYSBwcm8gbGVpdG9yIGRlIHRlbGEsIGUgbyDDum5pY28gamVpdG8gZGUgc2FiZXIgb25kZSBlc3TDoSBvIGluw61jaW8vZmltIMOpXG4gICAgICogIGVueGVyZ2FuZG8gbyBkZXN0YXF1ZSB2aXN1YWwuICovXG4gICAgcHJpdmF0ZSByYW5nZURheVN0YXR1c1N1ZmZpeChkYXk6IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRheS5pc1JhbmdlU3RhcnQgJiYgZGF5LmlzUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc3RhcnRfZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc1JhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc3RhcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5LmlzUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc0luUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2VfaW5fcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqIEZvcm1hdGEgbyB2YWxvciBwYXJhIGV4aWJpw6fDo28gbm8gaW5wdXQsIGFwbGljYW5kbyByYW5nZVNlcGFyYXRvciwgZGF0ZUZvcm1hdCBlIG11bHRpcGxlU2VwYXJhdG9yLiAqL1xuICAgIHByaXZhdGUgZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZTogRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWVGb3JJbnB1dChcbiAgICAgICAgICAgIHRoaXMubW9kZSgpLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VwYXJhdG9yKCksXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZVNlcGFyYXRvcigpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dWFsaXphIGBpbnB1dERhdGVgIGEgcGFydGlyIGRlIHVtIHZhbG9yIMO6bmljbywgcm90ZWFuZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zXG4gICAgICogKGRhdGUvbW9udGgvdGltZS9kYXRldGltZSkgb3UgcGVsbyBmb3JtYXRhZG9yIGxlZ2FkbyAocmFuZ2UveWVhci9tdWx0aXBsZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXREaXNwbGF5Rm9yKHZhbHVlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5sb2FkRnJvbURhdGUodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB2YWx1ZSA/IHRoaXMuc2VnbWVudEVuZ2luZS5nZXREaXNwbGF5U3RyaW5nKCkgOiAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKFJlKWNvbmZpZ3VyYSBhIGVuZ2luZSBkZSBzZWdtZW50b3MgcXVhbmRvIGBtb2RlYC9gZGF0ZUZvcm1hdGAvYGhvdXJGb3JtYXRgL2BzaG93U2Vjb25kc2BcbiAgICAgKiBtdWRhcmFtIGRlc2RlIGEgw7psdGltYSBjaGFtYWRhLCByZWNhcnJlZ2FuZG8gbyB2YWxvciBhdHVhbC4gQ2hhbWFkbyBkZSBmb3JtYSBzw61uY3JvbmEgYVxuICAgICAqIHBhcnRpciBkZSB0b2RvIHBvbnRvIGRlIGVudHJhZGEgcXVlIHVzYSBhIGVuZ2luZSDigJQgbsOjbyBkZXBlbmRlIGRlIHVtIGBlZmZlY3QoKWAgKHF1ZSBzw7NcbiAgICAgKiByb2RhIGVtIHVtIGNpY2xvIGRlIGNoYW5nZSBkZXRlY3Rpb24sIHRhcmRlIGRlbWFpcyBwYXJhIGxlaXR1cmFzL2VzY3JpdGFzIGltZWRpYXRhcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMubW9kZSgpO1xuICAgICAgICBpZiAobW9kZSAhPT0gJ2RhdGUnICYmIG1vZGUgIT09ICdtb250aCcgJiYgbW9kZSAhPT0gJ3RpbWUnICYmIG1vZGUgIT09ICdkYXRldGltZScpIHJldHVybjtcbiAgICAgICAgY29uc3QgY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnID0ge1xuICAgICAgICAgICAgbW9kZSxcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IHRoaXMucmVzb2x2ZWREYXRlRm9ybWF0KCksXG4gICAgICAgICAgICBob3VyRm9ybWF0OiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpLFxuICAgICAgICAgICAgc2hvd1NlY29uZHM6IHRoaXMuc2hvd1NlY29uZHMoKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMubGFzdFNlZ21lbnRDb25maWc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhc3QgJiZcbiAgICAgICAgICAgIGxhc3QubW9kZSA9PT0gY29uZmlnLm1vZGUgJiZcbiAgICAgICAgICAgIGxhc3QuZGF0ZUZvcm1hdCA9PT0gY29uZmlnLmRhdGVGb3JtYXQgJiZcbiAgICAgICAgICAgIGxhc3QuaG91ckZvcm1hdCA9PT0gY29uZmlnLmhvdXJGb3JtYXQgJiZcbiAgICAgICAgICAgIGxhc3Quc2hvd1NlY29uZHMgPT09IGNvbmZpZy5zaG93U2Vjb25kc1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RTZWdtZW50Q29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5sb2FkRnJvbURhdGUodGhpcy52YWx1ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogUmV0b3JuYSBhIHRyYWR1w6fDo28gZGUgYGtleWAsIG91IGBmYWxsYmFja2AgcXVhbmRvIGEgY2hhdmUgbsOjbyBlc3TDoSB0cmFkdXppZGEgKG5neC10cmFuc2xhdGUgcmV0b3JuYSBhIHByw7NwcmlhIGNoYXZlKS4gKi9cbiAgICBwcml2YXRlIHJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KGtleTogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRlZCAhPT0gJ3N0cmluZycgfHwgIXRyYW5zbGF0ZWQgfHwgdHJhbnNsYXRlZCA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jVGltZVRvVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihuZXdEYXRlKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZENhbGVuZGFyRGF5KFxuICAgICAgICBkYXRlOiBEYXRlLFxuICAgICAgICBpc0N1cnJlbnRNb250aDogYm9vbGVhbixcbiAgICAgICAgdG9kYXk6IERhdGUsXG4gICAgICAgIHNlbGVjdGVkOiBEYXRlIHwgbnVsbCxcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IERhdGUgfCBudWxsOyBlbmQ6IERhdGUgfCBudWxsIH0sXG4gICAgICAgIHJhbmdlU3RhcnRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICAgICByYW5nZUVuZFRpbWU6IG51bWJlciB8IG51bGwsXG4gICAgKTogQ2FsZW5kYXJEYXkge1xuICAgICAgICBjb25zdCBpc1JhbmdlU3RhcnQgPSByYW5nZS5zdGFydCA/IGlzU2FtZURheShkYXRlLCByYW5nZS5zdGFydCkgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNSYW5nZUVuZCA9IHJhbmdlLmVuZCA/IGlzU2FtZURheShkYXRlLCByYW5nZS5lbmQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGRhdGVUaW1lID0gc3RyaXBUaW1lKGRhdGUpO1xuICAgICAgICBjb25zdCBpc0luUmFuZ2UgPVxuICAgICAgICAgICAgcmFuZ2VTdGFydFRpbWUgIT09IG51bGwgJiYgcmFuZ2VFbmRUaW1lICE9PSBudWxsXG4gICAgICAgICAgICAgICAgPyBkYXRlVGltZSA+IHJhbmdlU3RhcnRUaW1lICYmIGRhdGVUaW1lIDwgcmFuZ2VFbmRUaW1lXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuaXNNdWx0aXBsZU1vZGUoKVxuICAgICAgICAgICAgPyB0aGlzLm11bHRpcGxlVmFsdWVzKCkuc29tZSgoZCkgPT4gaXNTYW1lRGF5KGQsIGRhdGUpKVxuICAgICAgICAgICAgOiBzZWxlY3RlZFxuICAgICAgICAgICAgICA/IGlzU2FtZURheShkYXRlLCBzZWxlY3RlZClcbiAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheU9mTW9udGg6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgaXNUb2RheTogaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSxcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQsXG4gICAgICAgICAgICBpc0Rpc2FibGVkOiB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpIHx8ICghaXNDdXJyZW50TW9udGggJiYgIXRoaXMuc2VsZWN0T3RoZXJNb250aHMoKSksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICBpc1JhbmdlU3RhcnQsXG4gICAgICAgICAgICBpc1JhbmdlRW5kLFxuICAgICAgICAgICAgaXNJblJhbmdlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWU6IERhdGVwaWNrZXJWYWx1ZSwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5faGFzRm9ybWF0RXJyb3IpIHJldHVybiB7IGludmFsaWRGb3JtYXQ6IHRydWUgfTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSkgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGQgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0ICYmIG1pbiAmJiBzdHJpcFRpbWUodmFsdWUuc3RhcnQpIDwgc3RyaXBUaW1lKG1pbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IHZhbHVlLnN0YXJ0IH0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS5lbmQgJiYgbWF4ICYmIHN0cmlwVGltZSh2YWx1ZS5lbmQpID4gc3RyaXBUaW1lKG1heCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IHZhbHVlLmVuZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgaWYgKG1pbiAmJiBkLmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgIGlmIChtYXggJiYgZC5nZXRGdWxsWWVhcigpID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW4gJiYgc3RyaXBUaW1lKGQpIDwgc3RyaXBUaW1lKG1pbikpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RhdGVSYW5nZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGVSYW5nZSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdzdGFydCcgaW4gdmFsdWUgJiYgJ2VuZCcgaW4gdmFsdWU7XG4gICAgfVxufVxuXG4iLCI8ZGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJkYXRlcGlja2VyLWdyb3VwIHJlbGF0aXZlIGZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBhZnRlcjpwb2ludGVyLWV2ZW50cy1ub25lIGFmdGVyOmFic29sdXRlIGFmdGVyOmluc2V0LTAgYWZ0ZXI6cm91bmRlZC1tZWRpdW0gaGFzLVtpbnB1dDpmb2N1c106YWZ0ZXI6b3V0bGluZSBoYXMtW2lucHV0OmZvY3VzXTphZnRlcjpvdXRsaW5lLTIgaGFzLVtpbnB1dDpmb2N1c106YWZ0ZXI6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGhhcy1baW5wdXQ6Zm9jdXNdOmFmdGVyOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgYXJpYS1oYXNwb3B1cD1cImdyaWRcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuKClcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicG9wdXBJZCgpXCJcbj5cbiAgICA8aW5wdXRcbiAgICAgICAgI3RyaWdnZXJJbnB1dFxuICAgICAgICBjbGFzcz1cImgtWzM1cHhdIHctZnVsbCByb3VuZGVkLW1lZGl1bSBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtWzEwcHhdIHRleHQtc20gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTIwMCBlYXNlLW91dFwiXG4gICAgICAgIFtjbGFzcy5wci0xMF09XCJzaG93SWNvbigpICYmICFzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5wci0xNl09XCJzaG93SWNvbigpICYmIHNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLnByLTZdPVwiIXNob3dJY29uKCkgJiYgc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3Itbm90LWFsbG93ZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtpZF09XCJpbnB1dElkKClcIlxuICAgICAgICBbbmFtZV09XCJuYW1lKCkgPz8gaW5wdXRJZCgpXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAocGxhY2Vob2xkZXJLZXkoKSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtyZWFkb25seV09XCJcbiAgICAgICAgICAgIHJlYWRvbmx5SW5wdXQoKSB8fFxuICAgICAgICAgICAgbW9kZSgpID09PSAncmFuZ2UnIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICd5ZWFyJyB8fFxuICAgICAgICAgICAgaXNNdWx0aXBsZU1vZGUoKSB8fFxuICAgICAgICAgICAgKGlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiBpc1RvdWNoRGV2aWNlKCkpXG4gICAgICAgIFwiXG4gICAgICAgIFt0YWJJbmRleF09XCJ0YWJpbmRleCgpID8/IG51bGxcIlxuICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1cygpXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dERhdGVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzKT1cImhhbmRsZUlucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cImhhbmRsZUlucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJoYW5kbGVJbnB1dENsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgKGlucHV0KT1cImhhbmRsZU5hdGl2ZUlucHV0KCRldmVudClcIlxuICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwibmdDb250cm9sPy5jb250cm9sPy5pbnZhbGlkIHx8IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm1vZGUoKSA9PT0gJ3JhbmdlJyA/IHJhbmdlU3RhdHVzRWxlbWVudElkKCkgOiBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkaWFsb2dBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZTogZGlhbG9nQXJpYUxhYmVsUGFyYW1zKClcIlxuICAgIC8+XG5cbiAgICBAaWYgKG1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJzci1vbmx5XCJcbiAgICAgICAgICAgIFtpZF09XCJyYW5nZVN0YXR1c0VsZW1lbnRJZCgpXCJcbiAgICAgICAgICAgID57eyByYW5nZVBlbmRpbmdTdGF0dXNUZXh0KCkgfX08L3NwYW5cbiAgICAgICAgPlxuICAgIH1cblxuICAgIEBpZiAoc2hvd0NsZWFyKCkgJiYgaW5wdXREYXRlKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBmbGV4IGgtWzM1cHhdIHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5c2NhbGUtNjAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6dGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgW2NsYXNzLnJpZ2h0LTldPVwic2hvd0ljb24oKVwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtMF09XCIhc2hvd0ljb24oKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jbGVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIEBpZiAoc2hvd0ljb24oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAjaWNvbkJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItaWNvbiBhYnNvbHV0ZSByaWdodC0wIGZsZXggaC1bMzVweF0gdy05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXItbWVkaXVtIGJvcmRlciBib3JkZXItc29saWQgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMjAwIGVhc2Utb3V0XCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTVdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmhvdmVyOmJnLWdyYXlzY2FsZS01XT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX29wZW4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwicmVzb2x2ZWRJY29uKClcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW4oKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJwb3NpdGlvbnNcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cImhhbmRsZUJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiXG4gICAgKG92ZXJsYXlLZXlkb3duKT1cImhhbmRsZU92ZXJsYXlLZXlkb3duKCRldmVudClcIlxuICAgIChkZXRhY2gpPVwiaXNPcGVuLnNldChmYWxzZSlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgI3BvcHVwUGFuZWxcbiAgICAgICAgY2xhc3M9XCJ6LTUwIHctNzIgcm91bmRlZC1tZWRpdW0gYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS0wIHNoYWRvdy1tZFwiXG4gICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICBjZGtUcmFwRm9jdXNcbiAgICAgICAgW2lkXT1cInBvcHVwSWQoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGlhbG9nQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGU6IGRpYWxvZ0FyaWFMYWJlbFBhcmFtcygpXCJcbiAgICA+XG4gICAgICAgIEBpZiAoc2hvd0NhbGVuZGFyKCkpIHtcbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAnY2FsZW5kYXInKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIG1lbnNhbCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfbW9udGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1vbnRoOiBwcmV2TW9udGhUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGhfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3aXRjaFRvTW9udGhzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSB9fSZuYnNwO3t7IGN1cnJlbnRZZWFyKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQtWzEwcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X21vbnRoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtb250aDogbmV4dE1vbnRoVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG9zIGRvcyBkaWFzIGRhIHNlbWFuYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBweC0zIHB0LTJcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheUtleSBvZiBvcmRlcmVkV2Vla0RheUtleXMoKTsgdHJhY2sgZGF5S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXlLZXkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheUtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZG8gY2FsZW5kw6FyaW8gLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgcHgtMyBwYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJHcmlkQXJpYUxhYmVsS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtb250aDogKGN1cnJlbnRNb250aEtleSgpIHwgdHJhbnNsYXRlKSwgeWVhcjogY3VycmVudFllYXIoKSB9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm1vZGUoKSA9PT0gJ3JhbmdlJyA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHdlZWsgb2YgY2FsZW5kYXJXZWVrcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXkgb2Ygd2VlazsgdHJhY2sgZGF5LmRhdGUudG9JU09TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC04IHctOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1bNTAlXSB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiIXNob3dPdGhlck1vbnRocygpICYmICFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJmb3JtYXREYXlBcmlhTGFiZWwoZGF5LmRhdGUsIGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kIHx8IGRheS5pc0luUmFuZ2UgfHwgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJkYXkuaXNUb2RheSA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkYXkuaXNEaXNhYmxlZCA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIXNob3dPdGhlck1vbnRocygpICYmICFkYXkuaXNDdXJyZW50TW9udGggPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzU2VsZWN0ZWQgfHwgZGF5LmlzUmFuZ2VTdGFydCB8fCBkYXkuaXNSYW5nZUVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzZWxlY3RlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXkuaXNUb2RheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXkuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLXByaW1hcnkgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXlzY2FsZS0wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzU2VsZWN0ZWQgfHwgZGF5LmlzUmFuZ2VTdGFydCB8fCBkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctZ3JheXNjYWxlLTEwIGhvdmVyOmJnLWdyYXlzY2FsZS0yMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc0luUmFuZ2UgJiYgIWRheS5pc1JhbmdlU3RhcnQgJiYgIWRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTYwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNTZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VTdGFydCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VFbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0Rpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNDdXJyZW50TW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWluc2V0IHJpbmctcHJpbWFyeSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1RvZGF5ICYmICFkYXkuaXNTZWxlY3RlZCAmJiAhZGF5LmlzUmFuZ2VTdGFydCAmJiAhZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cnNvci1ub3QtYWxsb3dlZCB0ZXh0LWdyYXlzY2FsZS0zMCc6IGRheS5pc0Rpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkRheUhvdmVyKG51bGwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkRheUhvdmVyKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5LmRheU9mTW9udGggfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gcG9yIGTDqWNhZGEgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBkYXRhLW5hdi1oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9kZWNhZGUnIHwgdHJhbnNsYXRlOiBwcmV2RGVjYWRlUmFuZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGN1cnJlbnREZWNhZGVTdGFydCgpIH19IOKAkyB7eyBjdXJyZW50RGVjYWRlU3RhcnQoKSArIDExIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfZGVjYWRlJyB8IHRyYW5zbGF0ZTogbmV4dERlY2FkZVJhbmdlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBhbm9zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHB4LTMgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiB5ZWFyc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoeWVhciBvZiByb3c7IHRyYWNrIHllYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcikgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiaXNDdXJyZW50WWVhcih5ZWFyKSA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1llYXJTZWxlY3RlZCh5ZWFyKSA/ICdzZWxlY3RlZCcgOiBpc0N1cnJlbnRZZWFyKHllYXIpID8gJ3RvZGF5JyA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzWWVhclNlbGVjdGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnRZZWFyKHllYXIpICYmICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cnNvci1ub3QtYWxsb3dlZCB0ZXh0LWdyYXlzY2FsZS0zMCc6IGlzWWVhckRpc2FibGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIGFudWFsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1uYXYtaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfeWVhcicgfCB0cmFuc2xhdGU6IHsgeWVhcjogcHJldlllYXJUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MFwiPnt7IGN1cnJlbnRZZWFyKCkgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X3llYXInIHwgdHJhbnNsYXRlOiB7IHllYXI6IG5leHRZZWFyVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRlIG1lc2VzIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHB4LTMgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X21vbnRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgbW9udGhzR3JpZCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChtb250aCBvZiByb3c7IHRyYWNrIG1vbnRoLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCkgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSA/ICdzZWxlY3RlZCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOiBpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSAmJiAhaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKG1vbnRoLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLmtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgIT09ICdtb250aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci10IGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrVG9DYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1hcnJvdy1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9iYWNrX3RvX2NhbGVuZGFyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gVGltZSBwaWNrZXIgLS0+XG4gICAgICAgIEBpZiAoc2hvd1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTMgcHgtNCBweS0zXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXRdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc29saWRdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfdGltZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gSG9yYXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICNpbmNyZWFzZUhvdXJCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9ob3VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBuZXh0SG91clRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKGRpc3BsYXlIb3VycygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ob3VyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVIb3Vyc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUhvdXJzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9ob3VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBwcmV2SG91clRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGQgdGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+Ojwvc3BhblxuICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgIDwhLS0gTWludXRvcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X21pbnV0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogbmV4dE1pbnV0ZVRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50TWludXRlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUobWludXRlcygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9taW51dGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZU1pbnV0ZXNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVNaW51dGVzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9taW51dGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IHByZXZNaW51dGVUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1NlY29uZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjo8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VndW5kb3MgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9zZWNvbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBuZXh0U2Vjb25kVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKHNlY29uZHMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlY29uZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlU2Vjb25kc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVTZWNvbmRzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9zZWNvbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBwcmV2U2Vjb25kVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChpczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZXRvciBBTS9QTSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IHctMTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfdG9nZ2xlX21lcmlkaWVtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtZXJpZGllbTogbmV4dE1lcmlkaWVtVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQW1QbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYW1QbSgpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBSb2RhcMOpIGRlIGHDp8O1ZXMgLS0+XG4gICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcigpIHx8IG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItdCBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRlJyB8fCBtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2RheScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2xlYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgYmctcHJpbWFyeSBweC0zIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS0wIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOm9wYWNpdHktOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIGJnLXByaW1hcnkgcHgtMyBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtMCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpvcGFjaXR5LTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY29uZmlybScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==