barsa-calendar 2.0.34 → 2.0.36
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.
|
@@ -11,14 +11,15 @@ import * as i4 from "@angular/forms";
|
|
|
11
11
|
import * as i5 from "@fundamental-ngx/core/bar";
|
|
12
12
|
import * as i6 from "@fundamental-ngx/core/content-density";
|
|
13
13
|
import * as i7 from "@fundamental-ngx/core/button";
|
|
14
|
-
import * as i8 from "@fundamental-ngx/core/
|
|
15
|
-
import * as i9 from "@fundamental-ngx/core/
|
|
16
|
-
import * as i10 from "@fundamental-ngx/core/
|
|
17
|
-
import * as i11 from "@fundamental-ngx/core/
|
|
18
|
-
import * as i12 from "@fundamental-ngx/core/
|
|
19
|
-
import * as i13 from "@fundamental-ngx/core/
|
|
20
|
-
import * as i14 from "
|
|
21
|
-
import * as i15 from "../calendar-
|
|
14
|
+
import * as i8 from "@fundamental-ngx/core/form";
|
|
15
|
+
import * as i9 from "@fundamental-ngx/core/input-group";
|
|
16
|
+
import * as i10 from "@fundamental-ngx/core/dialog";
|
|
17
|
+
import * as i11 from "@fundamental-ngx/core/title";
|
|
18
|
+
import * as i12 from "@fundamental-ngx/core/popover";
|
|
19
|
+
import * as i13 from "@fundamental-ngx/core/time";
|
|
20
|
+
import * as i14 from "@fundamental-ngx/core/toolbar";
|
|
21
|
+
import * as i15 from "../calendar-month/calendar-month.component";
|
|
22
|
+
import * as i16 from "../calendar-selection-days/calendar-selection-days.component";
|
|
22
23
|
export class TimeConfigI18n {
|
|
23
24
|
constructor(_bbbTranslate) {
|
|
24
25
|
this._bbbTranslate = _bbbTranslate;
|
|
@@ -125,6 +126,20 @@ export class DateTimePickerComponent extends BaseComponent {
|
|
|
125
126
|
this.inputGroupComponent._cva.onChange = this.onCaptionChanged.bind(this);
|
|
126
127
|
}
|
|
127
128
|
}
|
|
129
|
+
onHourTextChange(e) {
|
|
130
|
+
const val = Number(e.target.value);
|
|
131
|
+
if (isNaN(val)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
this.timeValue = new FdDate(this.timeValue.year, this.timeValue.month, this.timeValue.day, val, this.timeValue.minute, this.timeValue.second);
|
|
135
|
+
}
|
|
136
|
+
onMinuteTextChange(e) {
|
|
137
|
+
const val = Number(e.target.value);
|
|
138
|
+
if (isNaN(val)) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.timeValue = new FdDate(this.timeValue.year, this.timeValue.month, this.timeValue.day, this.timeValue.hour, val, this.timeValue.second);
|
|
142
|
+
}
|
|
128
143
|
ngOnChanges(changes) {
|
|
129
144
|
const { value } = changes;
|
|
130
145
|
if (value && !value.firstChange) {
|
|
@@ -366,7 +381,7 @@ export class DateTimePickerComponent extends BaseComponent {
|
|
|
366
381
|
useFactory: getDateService
|
|
367
382
|
},
|
|
368
383
|
CalendarService
|
|
369
|
-
], viewQueries: [{ propertyName: "timeComponent", first: true, predicate: TimeComponent, descendants: true }, { propertyName: "inputGroupComponent", first: true, predicate: InputGroupComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <fd-time\n style=\"direction: ltr\"\n fdCompact\n [keepTwoDigits]=\"true\"\n [(ngModel)]=\"timeValue\"\n [displaySeconds]=\"false\"\n ></fd-time>\n }\n </div>\n } }\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabelledby", "id"] }, { kind: "directive", type: i6.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i8.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "addOnText", "buttonFocusable", "type", "glyph", "glyphFont", "button", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "component", type: i9.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i9.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i9.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i10.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i11.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "directive", type: i11.PopoverBodyFooterDirective, selector: "[fdPopoverBodyFooter], [fd-popover-body-footer]" }, { kind: "component", type: i11.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i12.TimeComponent, selector: "fd-time", inputs: ["meridian", "validate", "keepTwoDigits", "disabled", "displaySeconds", "displayMinutes", "displayHours", "tablet", "elementsAtOnce", "time", "spinnerButtons"] }, { kind: "component", type: i13.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i13.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "component", type: i14.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "canView", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "component", type: i15.CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: ["startSelectedDayIndex", "endSelectedDayIndex", "monthInfo", "inline"], outputs: ["rangeChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
384
|
+
], viewQueries: [{ propertyName: "timeComponent", first: true, predicate: TimeComponent, descendants: true }, { propertyName: "inputGroupComponent", first: true, predicate: InputGroupComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <div>\n <fd-time\n style=\"direction: ltr\"\n fdCompact\n [keepTwoDigits]=\"true\"\n [(ngModel)]=\"timeValue\"\n [displaySeconds]=\"false\"\n ></fd-time>\n <div style=\"display: flex; gap: 0.2rem; padding: 0.5rem\">\n <input\n fd-form-control\n class=\"remove-arrow\"\n style=\"width: 3rem\"\n [value]=\"timeValue?.minute\"\n type=\"number\"\n maxValue=\"23\"\n (input)=\"onMinuteTextChange($event)\"\n />\n <input\n fd-form-control\n style=\"width: 3rem\"\n class=\"remove-arrow\"\n [value]=\"timeValue?.hour\"\n type=\"number\"\n maxValue=\"59\"\n (input)=\"onHourTextChange($event)\"\n />\n </div>\n </div>\n }\n </div>\n } }\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NumbersOnlyInputDirective, selector: "input[type=number], input[numbersOnly]" }, { kind: "component", type: i5.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabelledby", "id"] }, { kind: "directive", type: i6.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i8.FormControlComponent, selector: "input[fd-form-control], textarea[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "component", type: i9.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "addOnText", "buttonFocusable", "type", "glyph", "glyphFont", "button", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "component", type: i10.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i10.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i10.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i11.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i12.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "directive", type: i12.PopoverBodyFooterDirective, selector: "[fdPopoverBodyFooter], [fd-popover-body-footer]" }, { kind: "component", type: i12.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i13.TimeComponent, selector: "fd-time", inputs: ["meridian", "validate", "keepTwoDigits", "disabled", "displaySeconds", "displayMinutes", "displayHours", "tablet", "elementsAtOnce", "time", "spinnerButtons"] }, { kind: "component", type: i14.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i14.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "component", type: i15.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "canView", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "component", type: i16.CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: ["startSelectedDayIndex", "endSelectedDayIndex", "monthInfo", "inline"], outputs: ["rangeChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
370
385
|
}
|
|
371
386
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: DateTimePickerComponent, decorators: [{
|
|
372
387
|
type: Component,
|
|
@@ -380,7 +395,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
|
|
|
380
395
|
useFactory: getDateService
|
|
381
396
|
},
|
|
382
397
|
CalendarService
|
|
383
|
-
], template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <fd-time\n
|
|
398
|
+
], template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <div>\n <fd-time\n style=\"direction: ltr\"\n fdCompact\n [keepTwoDigits]=\"true\"\n [(ngModel)]=\"timeValue\"\n [displaySeconds]=\"false\"\n ></fd-time>\n <div style=\"display: flex; gap: 0.2rem; padding: 0.5rem\">\n <input\n fd-form-control\n class=\"remove-arrow\"\n style=\"width: 3rem\"\n [value]=\"timeValue?.minute\"\n type=\"number\"\n maxValue=\"23\"\n (input)=\"onMinuteTextChange($event)\"\n />\n <input\n fd-form-control\n style=\"width: 3rem\"\n class=\"remove-arrow\"\n [value]=\"timeValue?.hour\"\n type=\"number\"\n maxValue=\"59\"\n (input)=\"onHourTextChange($event)\"\n />\n </div>\n </div>\n }\n </div>\n } }\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"] }]
|
|
384
399
|
}], ctorParameters: () => [{ type: i2.DatetimeAdapter }, { type: i1.DateTimeToCaptionPipe }, { type: i1.LogService }, { type: i2.DialogService }, { type: i1.PortalService }], propDecorators: { placeholder: [{
|
|
385
400
|
type: Input
|
|
386
401
|
}], primaryCalendarType: [{
|
|
@@ -428,4 +443,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
|
|
|
428
443
|
type: ViewChild,
|
|
429
444
|
args: [InputGroupComponent, { static: true }]
|
|
430
445
|
}] } });
|
|
431
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQ0gsYUFBYSxFQUViLFdBQVcsRUFDWCxjQUFjLEVBR2QsUUFBUSxFQUdYLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDSCxlQUFlLEVBRWYsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNoQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUcvQixNQUFNLE9BQU8sY0FBYztJQW9DdkIsWUFBb0IsYUFBK0I7UUFBL0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBbkNuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcsZ0JBQWdCLENBQUM7UUFFdEMsbUNBQW1DO1FBQ25DLGVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcsZ0JBQWdC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QkFDSSxPQUFPLEVBQUUsZUFBZTs0QkFDeEIsUUFBUSxFQUFFLGlCQUFpQjt5QkFDOUI7d0JBQ0Q7NEJBQ0ksT0FBTyxFQUFFLFdBQVc7NEJBQ3BCLFVBQVUsRUFBRSxjQUFjO3lCQUM3Qjt3QkFDRCxlQUFlO3FCQUNsQjt5TUFHUSxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ21CLGFBQWE7c0JBQXRDLFNBQVM7dUJBQUMsYUFBYTtnQkFDMEIsbUJBQW1CO3NCQUFwRSxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RhYmxlLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBCYXNlQ29tcG9uZW50LFxuICAgIEJiYlRyYW5zbGF0ZVBpcGUsXG4gICAgRGF0ZVNlcnZpY2UsXG4gICAgZ2V0RGF0ZVNlcnZpY2UsXG4gICAgTG9nU2VydmljZSxcbiAgICBQb3J0YWxTZXJ2aWNlLFxuICAgIEJhcnNhQXBpLFxuICAgIERhdGVUaW1lVG9DYXB0aW9uUGlwZSxcbiAgICBBYmJyZXZhdGlvbkRldmljZVNpemVcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb250aEluZm8sIERheSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jYWxlbmRhci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgRGF0ZXRpbWVBZGFwdGVyLFxuICAgIERpYWxvZ1NlcnZpY2UsXG4gICAgRmREYXRlLFxuICAgIEZkRGF0ZXRpbWVBZGFwdGVyLFxuICAgIElucHV0R3JvdXBDb21wb25lbnQsXG4gICAgVGltZUNvbXBvbmVudFxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGltZUNvbmZpZ0kxOG4ge1xuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIGhvdXJzJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZUhvdXJzTGFiZWwgPSAnSW5jcmVhc2UgaG91cnMnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ2hvdXJzJyBjb2x1bW4gKi9cbiAgICBob3Vyc0xhYmVsID0gdGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnSG91cnMnKTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIGhvdXJzJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZUhvdXJzTGFiZWwgPSAnRGVjcmVhc2UgaG91cnMnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2UgbWludXRlcycgYnV0dG9uICovXG4gICAgaW5jcmVhc2VNaW51dGVzTGFiZWwgPSAnSW5jcmVhc2UgbWludXRlcyc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAnbWludXRlcycgY29sdW1uICovXG4gICAgbWludXRlc0xhYmVsID0gdGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnTWludXRlcycpO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2UgbWludXRlcycgYnV0dG9uICovXG4gICAgZGVjcmVhc2VNaW51dGVzTGFiZWwgPSAnRGVjcmVhc2UgbWludXRlcyc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBzZWNvbmRzJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZVNlY29uZHNMYWJlbCA9ICdJbmNyZWFzZSBzZWNvbmRzJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdzZWNvbmRzJyBjb2x1bW4gKi9cbiAgICBzZWNvbmRzTGFiZWwgPSB0aGlzLl9iYmJUcmFuc2xhdGUudHJhbnNmb3JtKCdTZWMnKTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIHNlY29uZHMnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlU2Vjb25kc0xhYmVsID0gJ0RlY3JlYXNlIHNlY29uZHMnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2UgcGVyaW9kJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZVBlcmlvZExhYmVsID0gJ0luY3JlYXNlIHBlcmlvZCc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAncGVyaW9kJyBjb2x1bW4gKi9cbiAgICBwZXJpb2RMYWJlbCA9ICdQZXJpb2QnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2UgcGVyaW9kJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZVBlcmlvZExhYmVsID0gJ0RlY3JlYXNlIHBlcmlvZCc7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmJiVHJhbnNsYXRlOiBCYmJUcmFuc2xhdGVQaXBlKSB7fVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2JjLWRhdGUtdGltZS1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IERhdGV0aW1lQWRhcHRlcixcbiAgICAgICAgICAgIHVzZUNsYXNzOiBGZERhdGV0aW1lQWRhcHRlclxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBEYXRlU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldERhdGVTZXJ2aWNlXG4gICAgICAgIH0sXG4gICAgICAgIENhbGVuZGFyU2VydmljZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVRpbWVQaWNrZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHJpbWFyeUNhbGVuZGFyVHlwZTogJ0dyZWdvcmlhbicgfCAnUGVyc2lhbicgfCBzdHJpbmc7XG4gICAgQElucHV0KCkgZm9ybWF0UGF0dGVybjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIHRpbWVWYWx1ZTogRmREYXRlO1xuICAgIEBJbnB1dCgpIHN0YXJ0UmFuZ2VEYXRlOiBEYXRlO1xuICAgIEBJbnB1dCgpIGVuZFJhbmdlRGF0ZTogRGF0ZTtcbiAgICBASW5wdXQoKSBpc1JhbmdlUGlja2VyOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNob3dUaW1lOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNob3dEYXRlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJ0bCA9IHRydWU7XG4gICAgQElucHV0KCkgZGV2aWNlU2l6ZTogQWJicmV2YXRpb25EZXZpY2VTaXplO1xuICAgIEBJbnB1dCgpIGlzTW9iaWxlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGJ1dHRvbk1lbnVNb2RlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlubGluZU1vZGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGF0ZXJhbmdlTW9kZTogYm9vbGVhbjtcbiAgICBAT3V0cHV0KCkgcmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnREYXk6IERhdGU7IGVuZERheTogRGF0ZSB9PigpO1xuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcbiAgICBAVmlld0NoaWxkKFRpbWVDb21wb25lbnQpIHRpbWVDb21wb25lbnQ6IFRpbWVDb21wb25lbnQ8RmREYXRlPjtcbiAgICBAVmlld0NoaWxkKElucHV0R3JvdXBDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0R3JvdXBDb21wb25lbnQ6IElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgdmFsdWVDYXB0aW9uID0gJyc7XG4gICAgZW5kU2VsZWN0ZWREYXk6IERheSB8IG51bGw7XG4gICAgc3RhcnRTZWxlY3RlZERheTogRGF5IHwgbnVsbDtcbiAgICB2YWx1ZURheTogRGF5IHwgbnVsbDtcblxuICAgIHNlbGVjdGlvbk1vZGU6ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyA9ICdkYXknO1xuICAgIHRvZGF5SW5kZXggPSAtMTtcbiAgICB3aWR0aCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBzZWxlY3RlZE1vbnRoJDogT2JzZXJ2YWJsZTxDYWxlbmRhck1vbnRoSW5mbz47XG4gICAgcnRsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICB0b2RheTogRGF0ZTtcbiAgICB3ZWVrRGF5c01pbjogc3RyaW5nW107XG4gICAgd2Vla0RheXM6IHN0cmluZ1tdO1xuXG4gICAgaXNWYWxpZCA9IHRydWU7XG4gICAgY3VsdHVyZTogc3RyaW5nO1xuICAgIG1vbnRoczogc3RyaW5nW10gPSBbXTtcbiAgICB5ZWFyczogc3RyaW5nW107XG4gICAgdGVtcEZvcm1tYXRlZERhdGUgPSAnJztcbiAgICBwcml2YXRlIF9jYWxlbmRhclNlcnZpY2U6IENhbGVuZGFyU2VydmljZTtcbiAgICBwcml2YXRlIF9sYXN0VmFsdWU6IERhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZGF0ZXRpbWVBZGFwdGVyOiBEYXRldGltZUFkYXB0ZXI8RmREYXRlPixcbiAgICAgICAgcHJpdmF0ZSBfZGF0ZVRpbWVUb0NhcHRpb246IERhdGVUaW1lVG9DYXB0aW9uUGlwZSxcbiAgICAgICAgcHJpdmF0ZSBfbG9nU2VydmljZTogTG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICAgICAgX3BvcnRhbFNlcnZpY2U6IFBvcnRhbFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnJ0bCQgPSBfcG9ydGFsU2VydmljZS5ydGwkO1xuICAgICAgICB0aGlzLndpZHRoJCA9IF9wb3J0YWxTZXJ2aWNlLmRldmljZVNpemUkLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgbWFwKChkZXZpY2VTaXplKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyNjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGV2aWNlU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneGwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU2MDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzIwO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUyMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gNDIwO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICBsZXQgY3VsdHVyZSA9ICdlbi1VUyc7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wcmltYXJ5Q2FsZW5kYXJUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdIaWpyaVNoYW1zaSc6XG4gICAgICAgICAgICAgICAgY3VsdHVyZSA9ICdmYS1JUic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdWx0dXJlID0gY3VsdHVyZTtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlID0gbmV3IENhbGVuZGFyU2VydmljZSh0aGlzLl9sb2dTZXJ2aWNlLCBjdWx0dXJlKTtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNldE1vZGUoJ21vbnRoJyk7XG4gICAgICAgIHRoaXMud2Vla0RheXNNaW4gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla0RheXNNaW4oKTtcbiAgICAgICAgdGhpcy53ZWVrRGF5cyA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrRGF5cygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTW9udGgkID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNlbGVjdGVkJDtcbiAgICAgICAgdGhpcy50b2RheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheTtcblxuICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUgPSBGZERhdGUuZ2V0RmREYXRlQnlEYXRlKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTW9udGhCeURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IEZkRGF0ZS5nZXRGZERhdGVCeURhdGUobmV3IERhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuaXNSYW5nZVBpY2tlcikge1xuICAgICAgICAvLyAgIGlmICh0aGlzLnN0YXJ0UmFuZ2VEYXRlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE1vbnRoQnlEYXRlKHRoaXMuc3RhcnRSYW5nZURhdGUpO1xuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gICBpZiAodGhpcy5lbmRSYW5nZURhdGUpIHtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWRNb250aEJ5RGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLm1vbnRocyA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5Nb250aHM7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXIpO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cENvbXBvbmVudCkge1xuICAgICAgICAgICAgKHRoaXMuaW5wdXRHcm91cENvbXBvbmVudCBhcyBhbnkpLl9jdmEub25DaGFuZ2UgPSB0aGlzLm9uQ2FwdGlvbkNoYW5nZWQuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSB0aGlzLl9nZXRGb3JtYXR0ZWREYXRlKHZhbHVlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY2FwdGlvbiAhPT0gdGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50Py5pbnB1dFRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvblJhbmdlQ2hhbmdlKGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIHN0YXJ0RGF5OiBlLnN0YXJ0RGF5LFxuICAgICAgICAgICAgZW5kRGF5OiBlLmVuZERheVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50aW1lQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGltZUNvbXBvbmVudC5yZWZyZXNoQ29sdW1ucygpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXZpY2VTaXplID09PSAncycgfHwgdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKGRpYWxvZ1RlbXBsYXRlLCB7XG4gICAgICAgICAgICAgICAgbW9iaWxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwb3BvdmVyLm9wZW4oKTtcbiAgICB9XG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvTW9udGgobW9udGhOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1llYXIoK3llYXIpO1xuICAgIH1cblxuICAgIG9uQ2FwdGlvbkNoYW5nZWQoZSk6IHZvaWQge1xuICAgICAgICBpZiAoZS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgaWYgKGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZ2xpc2hEYXRlU3RyID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUZhVG9BckNoYXJjaHRlcihlKTtcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdqWVlZWS9qTS9qRCc7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICBmb3JtYXQgKz0gJyBISDptbSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9tZW50ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLl9kYXRlU2VydmljZS5zdHJpbmdUb01vbWVudChlbmdsaXNoRGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgICAgLy8gY29uc3QgaXNWYWxpZCA9IG1vbWVudC5pc1ZhbGlkKCk7Ly8g2KjYsdin24wg2LTZhdiz24wg2YfZhduM2LTZhyBmYWxzZSDZhti02YjZhiDZhduM2K/Zh1xuICAgICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZShlbmdsaXNoRGF0ZVN0cikpKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50LnRvRGF0ZSgpO1xuICAgICAgICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gdGhpcy5fZGF0ZXRpbWVBZGFwdGVyLnNldFRpbWUoXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSxcbiAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXknKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZpb3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZZZWFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKE51bWJlcih0aGlzLnllYXJzWzBdKSAtIDIwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTmV4dFRhcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWROZXh0WWVhcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1t0aGlzLnllYXJzLmxlbmd0aCAtIDFdKSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ub2RheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IHRoaXMuX2RhdGV0aW1lQWRhcHRlci5zZXRUaW1lKFxuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUsXG4gICAgICAgICAgICB0b2RheS5nZXRIb3VycygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0U2Vjb25kcygpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXlEYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheURheTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuXG4gICAgb25EYXlDbGljayhkYXk6IERheSwgcG9wb3ZlciwgZGlhbG9nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRFbmREYXkoZGF5LCBwb3BvdmVyLCBkaWFsb2cpO1xuICAgIH1cblxuICAgIG9uUG9wb3Zlck9wZW5DaGFuZ2UoaXNPcGVuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DbGVhcihwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgb25Payhwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlQ2hhbmdlKCk7XG4gICAgfVxuICAgIG9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbGFzdFZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fbGFzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rm9ybWF0dGVkRGF0ZVRvSW5wdXQoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuX2dldEZvcm1hdHRlZERhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBGb3JtbWF0ZWREYXRlID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldElucHV0R3JvdXBUZXh0KGZvcm1hdHRlZERhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGVtcEZvcm1tYXRlZERhdGUgPSAnJztcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRHcm91cFRleHQoJycpO1xuICAgIH1cbiAgICBwcml2YXRlIF9zZXRJbnB1dEdyb3VwVGV4dCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQuaW5wdXRUZXh0ID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldEZvcm1hdHRlZERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZVRvQ2FwdGlvbi50cmFuc2Zvcm0oZGF0ZSwgdGhpcy5mb3JtYXRQYXR0ZXJuLCB0aGlzLmN1bHR1cmUsIHRoaXMuc2hvd0RhdGUsIHRoaXMuc2hvd1RpbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZhbHVlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zaG93RGF0ZSA/IHRoaXMuc3RhcnRTZWxlY3RlZERheT8uZGF0ZSA/PyB0aGlzLnZhbHVlIDogbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0SG91cnModGhpcy50aW1lVmFsdWUuaG91cik7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldE1pbnV0ZXModGhpcy50aW1lVmFsdWUubWludXRlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0U2Vjb25kcyh0aGlzLnRpbWVWYWx1ZS5zZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLl9yYWlzVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlWWVhcihmcm9tOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeWVhcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykge1xuICAgICAgICAgICAgeWVhcnMucHVzaChgJHtmcm9tICsgaX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7XG4gICAgfVxuICAgIHByaXZhdGUgX3NldENhcHRpb24odmFsdWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybWF0UGF0dGVybiA9IHRoaXMuZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdZWVlZJywgJ2pZWVlZJyk7XG4gICAgICAgIGZvcm1hdFBhdHRlcm4gPSBmb3JtYXRQYXR0ZXJuLnJlcGxhY2UoJ01NJywgJ2pNTScpO1xuICAgICAgICBmb3JtYXRQYXR0ZXJuID0gZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdERCcsICdqREQnKTtcbiAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh2YWx1ZSkuZm9ybWF0KGZvcm1hdFBhdHRlcm4pO1xuICAgIH1cbiAgICBwcml2YXRlIF9yYWlzVmFsdWVDaGFuZ2VkKGRhdGUsIHNldENhcHRpb24gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIC8vIHRoaXMudmFsdWUgPSBkYXRlO1xuICAgICAgICBpZiAoc2V0Q2FwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbihkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rmlyc3RBbmRFbmREYXkoZGF5OiBEYXksIHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyKSB7XG4gICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gdGhpcy5lbmRTZWxlY3RlZERheS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheTtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBzdGFydERheTogdGhpcy5zdGFydFNlbGVjdGVkRGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgZW5kRGF5OiB0aGlzLmVuZFNlbGVjdGVkRGF5LmRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmIChpbmxpbmVNb2RlKSB7XG48bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgZGF0ZXJhbmdlTW9kZSA/IGRhdGVSYW5nZVRwbCA6IG1vbnRoO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHNlbGVjdGVkTW9udGgkIHwgYXN5bmMsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIHJ0bDogcnRsJCB8IGFzeW5jLFxuICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgd2Vla0RheXNNaW46IHdlZWtEYXlzTWluLFxuICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgIHBvcG92ZXI6IHBvcG92ZXJcbiAgICAgICAgfVxuICAgIFwiXG4+XG48L25nLWNvbnRhaW5lcj5cbn1cbjxuZy10ZW1wbGF0ZSAjZGF0ZVJhbmdlVHBsPlxuICAgIDxiYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5c1xuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgW21vbnRoSW5mb109XCIoc2VsZWN0ZWRNb250aCQgfCBhc3luYykhIVwiXG4gICAgICAgIChyYW5nZUNoYW5nZSk9XCJvblJhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgID48L2JjLWNhbGVuZGFyLXNlbGVjdGlvbi1kYXlzPlxuPC9uZy10ZW1wbGF0ZT5cbjxmZC1pbnB1dC1ncm91cFxuICAgIHBsYWNlbWVudD1cImFmdGVyXCJcbiAgICBnbHlwaD1cImNhbGVuZGFyXCJcbiAgICBnbHlwaEFyaWFMYWJlbD1cInNlbGVjdCBkYXlcIlxuICAgIGFyaWFMYWJlbGxlZEJ5PVwiZmQtaW5wdXQtZ3JvdXAtaWNvbi1sYWJlbC0yXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgW2J1dHRvbl09XCJ0cnVlXCJcbiAgICBbc3RhdGVdPVwiaXNWYWxpZCA/ICdzdWNjZXNzJyA6ICdlcnJvcidcIlxuICAgIFtzaG93Rm9jdXNdPVwidHJ1ZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFidXR0b25NZW51TW9kZSB8fCBpbmxpbmVNb2RlID8gJ2luaGVyaXQnIDogJ25vbmUnXCJcbiAgICAoYWRkT25CdXR0b25DbGlja2VkKT1cIm9uT3BlblBvcG92ZXIocG9wb3ZlciwgZGlhbG9nVGVtcGxhdGUpXCJcbj5cbjwvZmQtaW5wdXQtZ3JvdXA+XG5AaWYgKGJ1dHRvbk1lbnVNb2RlKSB7XG48YnV0dG9uXG4gICAgZmQtYnV0dG9uXG4gICAgW2xhYmVsXT1cInRlbXBGb3JtbWF0ZWREYXRlIHx8IHBsYWNlaG9sZGVyXCJcbiAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtmZFR5cGVdPVwidmFsdWUgPyAnc3RhbmRhcmQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgW2ZkTWVudV09XCJ0cnVlXCJcbiAgICAoY2xpY2spPVwib25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSlcIlxuICAgIFtjbGFzcy5wbGFjZWhvbGRlci1jdXN0b21dPVwiIXZhbHVlXCJcbiAgICBjbGFzcz1cIm1lbnUtYnV0dG9uLWRhdGVwaWNrZXJcIlxuPjwvYnV0dG9uPlxufVxuXG48ZmQtcG9wb3ZlciAjcG9wb3ZlciAoaXNPcGVuQ2hhbmdlKT1cIm9uUG9wb3Zlck9wZW5DaGFuZ2UoJGV2ZW50KVwiIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiIFtmb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICA8ZmQtcG9wb3Zlci1ib2R5IFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1vbnRoO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgZmQtcG9wb3Zlci1ib2R5LWZvb3Rlcj5cbiAgICAgICAgICAgIDxkaXYgZmQtYmFyIFtiYXJEZXNpZ25dPVwiJ2Zvb3RlcidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1yaWdodD5cbiAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckJ1dHRvbnNcIj48L2NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2ZkLXBvcG92ZXItYm9keT5cbjwvZmQtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSBsZXQtZGlhbG9nIGxldC1kaWFsb2dDb25maWc9XCJkaWFsb2dDb25maWdcIiAjZGlhbG9nVGVtcGxhdGU+XG4gICAgPGZkLWRpYWxvZyBbZGlhbG9nQ29uZmlnXT1cImRpYWxvZ0NvbmZpZ1wiIFtkaWFsb2dSZWZdPVwiZGlhbG9nXCI+XG4gICAgICAgIDxmZC1kaWFsb2ctYm9keT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBtb250aDtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzTWluOiB3ZWVrRGF5c01pbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyOiBwb3BvdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nOiBkaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1kaWFsb2ctYm9keT5cbiAgICAgICAgPGZkLWRpYWxvZy1mb290ZXI+XG4gICAgICAgICAgICA8Y29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyQnV0dG9uczsgY29udGV4dDogeyBkaWFsb2c6IGRpYWxvZyB9XCI+PC9jb250YWluZXI+XG4gICAgICAgIDwvZmQtZGlhbG9nLWZvb3Rlcj5cbiAgICA8L2ZkLWRpYWxvZz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2Zvb3RlckJ1dHRvbnMgbGV0LWRpYWxvZz1cImRpYWxvZ1wiPlxuICAgIDxmZC1idXR0b24tYmFyIFtsYWJlbF09XCInT2snIHwgYmJiVHJhbnNsYXRlXCIgZmRUeXBlPVwiZW1waGFzaXplZFwiIChjbGljayk9XCJvbk9rKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXJcbiAgICAgICAgW2xhYmVsXT1cIidDbGVhcicgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBmZFR5cGU9XCJzdGFuZGFyZFwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKHBvcG92ZXIsIGRpYWxvZylcIlxuICAgID48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXIgW2xhYmVsXT1cIidDYW5jZWwnIHwgYmJiVHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlXG4gICAgI21vbnRoXG4gICAgbGV0LXNlbGVjdGVkTW9udGhcbiAgICBsZXQtd2lkdGg9XCJ3aWR0aFwiXG4gICAgbGV0LWhlaWdodD1cImhlaWdodFwiXG4gICAgbGV0LXJ0bD1cInJ0bFwiXG4gICAgbGV0LXRvZGF5PVwidG9kYXlcIlxuICAgIGxldC1zaG93RXZlbnRzPVwic2hvd0V2ZW50c1wiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtcG9wb3Zlcj1cInBvcG92ZXJcIlxuICAgIGxldC1kaWFsb2c9XCJkaWFsb2dcIlxuPlxuICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtsYWJlbF09XCIoc2hvd0RhdGUgPyAnRGF0ZVJfVG9kYXknIDogJ05vdycpIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZGF5KClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJldlRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tbGVmdC1hcnJvdycgOiAnbmF2aWdhdGlvbi1yaWdodC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmV4dFRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXJzLXdyYXBwZXJcIiBmZC10aXRsZSBmZC10b29sYmFyLWl0ZW0+XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdkYXknIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbnRoTmFtZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnbW9udGgnXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ3llYXInXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2ZkLXRvb2xiYXI+XG4gICAgfVxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgIEBzd2l0Y2ggKHNlbGVjdGlvbk1vZGUpIHsgQGNhc2UgKCdtb250aCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoczsgdHJhY2sgbW9udGg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAzMyVcIlxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWUgPT09IG1vbnRoID8gJ2VtcGhhc2l6ZWQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vbnRoXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICdkYXknOyBvbk1vbnRoU2VsZWN0ZWQobW9udGgsIGkpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGNhc2UgKCd5ZWFyJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1zZWxlY3Rpb24td3JhcHBlclwiPlxuICAgICAgICAgICAgQGZvciAoeWVhciBvZiB5ZWFyczsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleC1ncm93OiAxOyB3aWR0aDogMjUlXCJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhciA9PT0gK3llYXIgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwieWVhclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnZGF5Jzsgb25ZZWFyU2VsZWN0ZWQoeWVhcilcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZGVmYXVsdCB7XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgICAgICBAaWYgKHNob3dEYXRlKSB7XG4gICAgICAgICAgICA8YmMtY2FsZW5kYXItbW9udGhcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyV2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgICAgICBbbW9udGhXZWVrc0NvdW50XT1cInNlbGVjdGVkTW9udGgud2Vla3NDb3VudFwiXG4gICAgICAgICAgICAgICAgW3dlZWtEYXlzXT1cIndlZWtEYXlzXCJcbiAgICAgICAgICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICAgICAgICAgIFt0b2RheV09XCJ0b2RheVwiXG4gICAgICAgICAgICAgICAgW2RhdGVQaWNrZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2RhdGVSYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWREYXRlXT1cInN0YXJ0U2VsZWN0ZWREYXkgPyBzdGFydFNlbGVjdGVkRGF5LmRhdGUgOiB2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2RheXNdPVwic2VsZWN0ZWRNb250aC5kYXlzXCJcbiAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljaygkZXZlbnQsIHBvcG92ZXIsIGRpYWxvZylcIlxuICAgICAgICAgICAgPjwvYmMtY2FsZW5kYXItbW9udGg+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwZXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICBAaWYgKHNob3dUaW1lKSB7XG4gICAgICAgICAgICA8ZmQtdGltZVxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlyZWN0aW9uOiBsdHJcIlxuICAgICAgICAgICAgICAgIGZkQ29tcGFjdFxuICAgICAgICAgICAgICAgIFtrZWVwVHdvRGlnaXRzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGltZVZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheVNlY29uZHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPjwvZmQtdGltZT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
446
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQ0gsYUFBYSxFQUViLFdBQVcsRUFDWCxjQUFjLEVBR2QsUUFBUSxFQUdYLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDSCxlQUFlLEVBRWYsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNoQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHL0IsTUFBTSxPQUFPLGNBQWM7SUFvQ3ZCLFlBQW9CLGFBQStCO1FBQS9CLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQW5DbkQsaURBQWlEO1FBQ2pELHVCQUFrQixHQUFHLGdCQUFnQixDQUFDO1FBRXRDLG1DQUFtQztRQUNuQyxlQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkQsaURBQWlEO1FBQ2pELHVCQUFrQixHQUFHLGdCQUFn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O3NCQUEzQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDbUIsYUFBYTtzQkFBdEMsU0FBUzt1QkFBQyxhQUFhO2dCQUMwQixtQkFBbUI7c0JBQXBFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdGFibGUsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIEJhc2VDb21wb25lbnQsXG4gICAgQmJiVHJhbnNsYXRlUGlwZSxcbiAgICBEYXRlU2VydmljZSxcbiAgICBnZXREYXRlU2VydmljZSxcbiAgICBMb2dTZXJ2aWNlLFxuICAgIFBvcnRhbFNlcnZpY2UsXG4gICAgQmFyc2FBcGksXG4gICAgRGF0ZVRpbWVUb0NhcHRpb25QaXBlLFxuICAgIEFiYnJldmF0aW9uRGV2aWNlU2l6ZVxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoSW5mbywgRGF5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBEYXRldGltZUFkYXB0ZXIsXG4gICAgRGlhbG9nU2VydmljZSxcbiAgICBGZERhdGUsXG4gICAgRmREYXRldGltZUFkYXB0ZXIsXG4gICAgSW5wdXRHcm91cENvbXBvbmVudCxcbiAgICBUaW1lQ29tcG9uZW50XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lQ29uZmlnSTE4biB7XG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2UgaG91cnMnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlSG91cnNMYWJlbCA9ICdJbmNyZWFzZSBob3Vycyc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAnaG91cnMnIGNvbHVtbiAqL1xuICAgIGhvdXJzTGFiZWwgPSB0aGlzLl9iYmJUcmFuc2xhdGUudHJhbnNmb3JtKCdIb3VycycpO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2UgaG91cnMnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlSG91cnNMYWJlbCA9ICdEZWNyZWFzZSBob3Vycyc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBtaW51dGVzJyBidXR0b24gKi9cbiAgICBpbmNyZWFzZU1pbnV0ZXNMYWJlbCA9ICdJbmNyZWFzZSBtaW51dGVzJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdtaW51dGVzJyBjb2x1bW4gKi9cbiAgICBtaW51dGVzTGFiZWwgPSB0aGlzLl9iYmJUcmFuc2xhdGUudHJhbnNmb3JtKCdNaW51dGVzJyk7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBtaW51dGVzJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZU1pbnV0ZXNMYWJlbCA9ICdEZWNyZWFzZSBtaW51dGVzJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIHNlY29uZHMnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlU2Vjb25kc0xhYmVsID0gJ0luY3JlYXNlIHNlY29uZHMnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ3NlY29uZHMnIGNvbHVtbiAqL1xuICAgIHNlY29uZHNMYWJlbCA9IHRoaXMuX2JiYlRyYW5zbGF0ZS50cmFuc2Zvcm0oJ1NlYycpO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnZGVjcmVhc2Ugc2Vjb25kcycgYnV0dG9uICovXG4gICAgZGVjcmVhc2VTZWNvbmRzTGFiZWwgPSAnRGVjcmVhc2Ugc2Vjb25kcyc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBwZXJpb2QnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlUGVyaW9kTGFiZWwgPSAnSW5jcmVhc2UgcGVyaW9kJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdwZXJpb2QnIGNvbHVtbiAqL1xuICAgIHBlcmlvZExhYmVsID0gJ1BlcmlvZCc7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBwZXJpb2QnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlUGVyaW9kTGFiZWwgPSAnRGVjcmVhc2UgcGVyaW9kJztcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYmJUcmFuc2xhdGU6IEJiYlRyYW5zbGF0ZVBpcGUpIHt9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYmMtZGF0ZS10aW1lLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRGF0ZXRpbWVBZGFwdGVyLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IEZkRGF0ZXRpbWVBZGFwdGVyXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IERhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgdXNlRmFjdG9yeTogZ2V0RGF0ZVNlcnZpY2VcbiAgICAgICAgfSxcbiAgICAgICAgQ2FsZW5kYXJTZXJ2aWNlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVBpY2tlckNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBASW5wdXQoKSBwcmltYXJ5Q2FsZW5kYXJUeXBlOiAnR3JlZ29yaWFuJyB8ICdQZXJzaWFuJyB8IHN0cmluZztcbiAgICBASW5wdXQoKSBmb3JtYXRQYXR0ZXJuOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdmFsdWU6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgdGltZVZhbHVlOiBGZERhdGU7XG4gICAgQElucHV0KCkgc3RhcnRSYW5nZURhdGU6IERhdGU7XG4gICAgQElucHV0KCkgZW5kUmFuZ2VEYXRlOiBEYXRlO1xuICAgIEBJbnB1dCgpIGlzUmFuZ2VQaWNrZXI6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd1RpbWU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd0RhdGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcnRsID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBkZXZpY2VTaXplOiBBYmJyZXZhdGlvbkRldmljZVNpemU7XG4gICAgQElucHV0KCkgaXNNb2JpbGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYnV0dG9uTWVudU1vZGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5saW5lTW9kZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkYXRlcmFuZ2VNb2RlOiBib29sZWFuO1xuICAgIEBPdXRwdXQoKSByYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGFydERheTogRGF0ZTsgZW5kRGF5OiBEYXRlIH0+KCk7XG4gICAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICAgIEBWaWV3Q2hpbGQoVGltZUNvbXBvbmVudCkgdGltZUNvbXBvbmVudDogVGltZUNvbXBvbmVudDxGZERhdGU+O1xuICAgIEBWaWV3Q2hpbGQoSW5wdXRHcm91cENvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgaW5wdXRHcm91cENvbXBvbmVudDogSW5wdXRHcm91cENvbXBvbmVudDtcbiAgICB2YWx1ZUNhcHRpb24gPSAnJztcbiAgICBlbmRTZWxlY3RlZERheTogRGF5IHwgbnVsbDtcbiAgICBzdGFydFNlbGVjdGVkRGF5OiBEYXkgfCBudWxsO1xuICAgIHZhbHVlRGF5OiBEYXkgfCBudWxsO1xuXG4gICAgc2VsZWN0aW9uTW9kZTogJ2RheScgfCAnbW9udGgnIHwgJ3llYXInID0gJ2RheSc7XG4gICAgdG9kYXlJbmRleCA9IC0xO1xuICAgIHdpZHRoJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHNlbGVjdGVkTW9udGgkOiBPYnNlcnZhYmxlPENhbGVuZGFyTW9udGhJbmZvPjtcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHRvZGF5OiBEYXRlO1xuICAgIHdlZWtEYXlzTWluOiBzdHJpbmdbXTtcbiAgICB3ZWVrRGF5czogc3RyaW5nW107XG5cbiAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICBjdWx0dXJlOiBzdHJpbmc7XG4gICAgbW9udGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHllYXJzOiBzdHJpbmdbXTtcbiAgICB0ZW1wRm9ybW1hdGVkRGF0ZSA9ICcnO1xuICAgIHByaXZhdGUgX2NhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlO1xuICAgIHByaXZhdGUgX2xhc3RWYWx1ZTogRGF0ZSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9kYXRldGltZUFkYXB0ZXI6IERhdGV0aW1lQWRhcHRlcjxGZERhdGU+LFxuICAgICAgICBwcml2YXRlIF9kYXRlVGltZVRvQ2FwdGlvbjogRGF0ZVRpbWVUb0NhcHRpb25QaXBlLFxuICAgICAgICBwcml2YXRlIF9sb2dTZXJ2aWNlOiBMb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9kaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgICAgICBfcG9ydGFsU2VydmljZTogUG9ydGFsU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMucnRsJCA9IF9wb3J0YWxTZXJ2aWNlLnJ0bCQ7XG4gICAgICAgIHRoaXMud2lkdGgkID0gX3BvcnRhbFNlcnZpY2UuZGV2aWNlU2l6ZSQucGlwZShcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICBtYXAoKGRldmljZVNpemUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI2MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkZXZpY2VTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2wnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd4bCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNTYwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjA7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNTIwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5oZWlnaHQgPSA0MjA7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIGxldCBjdWx0dXJlID0gJ2VuLVVTJztcbiAgICAgICAgc3dpdGNoICh0aGlzLnByaW1hcnlDYWxlbmRhclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0hpanJpU2hhbXNpJzpcbiAgICAgICAgICAgICAgICBjdWx0dXJlID0gJ2ZhLUlSJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1bHR1cmUgPSBjdWx0dXJlO1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UgPSBuZXcgQ2FsZW5kYXJTZXJ2aWNlKHRoaXMuX2xvZ1NlcnZpY2UsIGN1bHR1cmUpO1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2V0TW9kZSgnbW9udGgnKTtcbiAgICAgICAgdGhpcy53ZWVrRGF5c01pbiA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrRGF5c01pbigpO1xuICAgICAgICB0aGlzLndlZWtEYXlzID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLndlZWtEYXlzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb250aCQgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWQkO1xuICAgICAgICB0aGlzLnRvZGF5ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnRvZGF5O1xuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IEZkRGF0ZS5nZXRGZERhdGVCeURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9zZXRDYXB0aW9uKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWRNb250aEJ5RGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlID0gRmREYXRlLmdldEZkRGF0ZUJ5RGF0ZShuZXcgRGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiAodGhpcy5pc1JhbmdlUGlja2VyKSB7XG4gICAgICAgIC8vICAgaWYgKHRoaXMuc3RhcnRSYW5nZURhdGUpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTW9udGhCeURhdGUodGhpcy5zdGFydFJhbmdlRGF0ZSk7XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyAgIGlmICh0aGlzLmVuZFJhbmdlRGF0ZSkge1xuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE1vbnRoQnlEYXRlKHRoaXMudmFsdWUpO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMubW9udGhzID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLk1vbnRocztcbiAgICAgICAgdGhpcy5fcHJlcGFyZVllYXIodGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhcik7XG4gICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAodGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50IGFzIGFueSkuX2N2YS5vbkNoYW5nZSA9IHRoaXMub25DYXB0aW9uQ2hhbmdlZC5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSG91clRleHRDaGFuZ2UoZSk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICBpZiAoaXNOYU4odmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gbmV3IEZkRGF0ZShcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlLnllYXIsXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZS5tb250aCxcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlLmRheSxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlLm1pbnV0ZSxcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlLnNlY29uZFxuICAgICAgICApO1xuICAgIH1cbiAgICBvbk1pbnV0ZVRleHRDaGFuZ2UoZSk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWwgPSBOdW1iZXIoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICBpZiAoaXNOYU4odmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gbmV3IEZkRGF0ZShcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlLnllYXIsXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZS5tb250aCxcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlLmRheSxcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlLmhvdXIsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZS5zZWNvbmRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSB0aGlzLl9nZXRGb3JtYXR0ZWREYXRlKHZhbHVlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY2FwdGlvbiAhPT0gdGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50Py5pbnB1dFRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvblJhbmdlQ2hhbmdlKGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIHN0YXJ0RGF5OiBlLnN0YXJ0RGF5LFxuICAgICAgICAgICAgZW5kRGF5OiBlLmVuZERheVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50aW1lQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGltZUNvbXBvbmVudC5yZWZyZXNoQ29sdW1ucygpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXZpY2VTaXplID09PSAncycgfHwgdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKGRpYWxvZ1RlbXBsYXRlLCB7XG4gICAgICAgICAgICAgICAgbW9iaWxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwb3BvdmVyLm9wZW4oKTtcbiAgICB9XG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvTW9udGgobW9udGhOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1llYXIoK3llYXIpO1xuICAgIH1cblxuICAgIG9uQ2FwdGlvbkNoYW5nZWQoZSk6IHZvaWQge1xuICAgICAgICBpZiAoZS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgaWYgKGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZ2xpc2hEYXRlU3RyID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUZhVG9BckNoYXJjaHRlcihlKTtcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdqWVlZWS9qTS9qRCc7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICBmb3JtYXQgKz0gJyBISDptbSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9tZW50ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLl9kYXRlU2VydmljZS5zdHJpbmdUb01vbWVudChlbmdsaXNoRGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgICAgLy8gY29uc3QgaXNWYWxpZCA9IG1vbWVudC5pc1ZhbGlkKCk7Ly8g2KjYsdin24wg2LTZhdiz24wg2YfZhduM2LTZhyBmYWxzZSDZhti02YjZhiDZhduM2K/Zh1xuICAgICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZShlbmdsaXNoRGF0ZVN0cikpKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50LnRvRGF0ZSgpO1xuICAgICAgICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gdGhpcy5fZGF0ZXRpbWVBZGFwdGVyLnNldFRpbWUoXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSxcbiAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXknKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZpb3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZZZWFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKE51bWJlcih0aGlzLnllYXJzWzBdKSAtIDIwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTmV4dFRhcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWROZXh0WWVhcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1t0aGlzLnllYXJzLmxlbmd0aCAtIDFdKSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ub2RheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IHRoaXMuX2RhdGV0aW1lQWRhcHRlci5zZXRUaW1lKFxuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUsXG4gICAgICAgICAgICB0b2RheS5nZXRIb3VycygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0U2Vjb25kcygpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXlEYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheURheTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuXG4gICAgb25EYXlDbGljayhkYXk6IERheSwgcG9wb3ZlciwgZGlhbG9nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRFbmREYXkoZGF5LCBwb3BvdmVyLCBkaWFsb2cpO1xuICAgIH1cblxuICAgIG9uUG9wb3Zlck9wZW5DaGFuZ2UoaXNPcGVuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DbGVhcihwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgb25Payhwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlQ2hhbmdlKCk7XG4gICAgfVxuICAgIG9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbGFzdFZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fbGFzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rm9ybWF0dGVkRGF0ZVRvSW5wdXQoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuX2dldEZvcm1hdHRlZERhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBGb3JtbWF0ZWREYXRlID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldElucHV0R3JvdXBUZXh0KGZvcm1hdHRlZERhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGVtcEZvcm1tYXRlZERhdGUgPSAnJztcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRHcm91cFRleHQoJycpO1xuICAgIH1cbiAgICBwcml2YXRlIF9zZXRJbnB1dEdyb3VwVGV4dCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQuaW5wdXRUZXh0ID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldEZvcm1hdHRlZERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZVRvQ2FwdGlvbi50cmFuc2Zvcm0oZGF0ZSwgdGhpcy5mb3JtYXRQYXR0ZXJuLCB0aGlzLmN1bHR1cmUsIHRoaXMuc2hvd0RhdGUsIHRoaXMuc2hvd1RpbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZhbHVlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zaG93RGF0ZSA/IHRoaXMuc3RhcnRTZWxlY3RlZERheT8uZGF0ZSA/PyB0aGlzLnZhbHVlIDogbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0SG91cnModGhpcy50aW1lVmFsdWUuaG91cik7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldE1pbnV0ZXModGhpcy50aW1lVmFsdWUubWludXRlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0U2Vjb25kcyh0aGlzLnRpbWVWYWx1ZS5zZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLl9yYWlzVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlWWVhcihmcm9tOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeWVhcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykge1xuICAgICAgICAgICAgeWVhcnMucHVzaChgJHtmcm9tICsgaX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7XG4gICAgfVxuICAgIHByaXZhdGUgX3NldENhcHRpb24odmFsdWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybWF0UGF0dGVybiA9IHRoaXMuZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdZWVlZJywgJ2pZWVlZJyk7XG4gICAgICAgIGZvcm1hdFBhdHRlcm4gPSBmb3JtYXRQYXR0ZXJuLnJlcGxhY2UoJ01NJywgJ2pNTScpO1xuICAgICAgICBmb3JtYXRQYXR0ZXJuID0gZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdERCcsICdqREQnKTtcbiAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh2YWx1ZSkuZm9ybWF0KGZvcm1hdFBhdHRlcm4pO1xuICAgIH1cbiAgICBwcml2YXRlIF9yYWlzVmFsdWVDaGFuZ2VkKGRhdGUsIHNldENhcHRpb24gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIC8vIHRoaXMudmFsdWUgPSBkYXRlO1xuICAgICAgICBpZiAoc2V0Q2FwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbihkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rmlyc3RBbmRFbmREYXkoZGF5OiBEYXksIHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyKSB7XG4gICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gdGhpcy5lbmRTZWxlY3RlZERheS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheTtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBzdGFydERheTogdGhpcy5zdGFydFNlbGVjdGVkRGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgZW5kRGF5OiB0aGlzLmVuZFNlbGVjdGVkRGF5LmRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmIChpbmxpbmVNb2RlKSB7XG48bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgZGF0ZXJhbmdlTW9kZSA/IGRhdGVSYW5nZVRwbCA6IG1vbnRoO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHNlbGVjdGVkTW9udGgkIHwgYXN5bmMsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIHJ0bDogcnRsJCB8IGFzeW5jLFxuICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgd2Vla0RheXNNaW46IHdlZWtEYXlzTWluLFxuICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgIHBvcG92ZXI6IHBvcG92ZXJcbiAgICAgICAgfVxuICAgIFwiXG4+XG48L25nLWNvbnRhaW5lcj5cbn1cbjxuZy10ZW1wbGF0ZSAjZGF0ZVJhbmdlVHBsPlxuICAgIDxiYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5c1xuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgW21vbnRoSW5mb109XCIoc2VsZWN0ZWRNb250aCQgfCBhc3luYykhIVwiXG4gICAgICAgIChyYW5nZUNoYW5nZSk9XCJvblJhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgID48L2JjLWNhbGVuZGFyLXNlbGVjdGlvbi1kYXlzPlxuPC9uZy10ZW1wbGF0ZT5cbjxmZC1pbnB1dC1ncm91cFxuICAgIHBsYWNlbWVudD1cImFmdGVyXCJcbiAgICBnbHlwaD1cImNhbGVuZGFyXCJcbiAgICBnbHlwaEFyaWFMYWJlbD1cInNlbGVjdCBkYXlcIlxuICAgIGFyaWFMYWJlbGxlZEJ5PVwiZmQtaW5wdXQtZ3JvdXAtaWNvbi1sYWJlbC0yXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgW2J1dHRvbl09XCJ0cnVlXCJcbiAgICBbc3RhdGVdPVwiaXNWYWxpZCA/ICdzdWNjZXNzJyA6ICdlcnJvcidcIlxuICAgIFtzaG93Rm9jdXNdPVwidHJ1ZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFidXR0b25NZW51TW9kZSB8fCBpbmxpbmVNb2RlID8gJ2luaGVyaXQnIDogJ25vbmUnXCJcbiAgICAoYWRkT25CdXR0b25DbGlja2VkKT1cIm9uT3BlblBvcG92ZXIocG9wb3ZlciwgZGlhbG9nVGVtcGxhdGUpXCJcbj5cbjwvZmQtaW5wdXQtZ3JvdXA+XG5AaWYgKGJ1dHRvbk1lbnVNb2RlKSB7XG48YnV0dG9uXG4gICAgZmQtYnV0dG9uXG4gICAgW2xhYmVsXT1cInRlbXBGb3JtbWF0ZWREYXRlIHx8IHBsYWNlaG9sZGVyXCJcbiAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtmZFR5cGVdPVwidmFsdWUgPyAnc3RhbmRhcmQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgW2ZkTWVudV09XCJ0cnVlXCJcbiAgICAoY2xpY2spPVwib25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSlcIlxuICAgIFtjbGFzcy5wbGFjZWhvbGRlci1jdXN0b21dPVwiIXZhbHVlXCJcbiAgICBjbGFzcz1cIm1lbnUtYnV0dG9uLWRhdGVwaWNrZXJcIlxuPjwvYnV0dG9uPlxufVxuXG48ZmQtcG9wb3ZlciAjcG9wb3ZlciAoaXNPcGVuQ2hhbmdlKT1cIm9uUG9wb3Zlck9wZW5DaGFuZ2UoJGV2ZW50KVwiIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiIFtmb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICA8ZmQtcG9wb3Zlci1ib2R5IFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1vbnRoO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgZmQtcG9wb3Zlci1ib2R5LWZvb3Rlcj5cbiAgICAgICAgICAgIDxkaXYgZmQtYmFyIFtiYXJEZXNpZ25dPVwiJ2Zvb3RlcidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1yaWdodD5cbiAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckJ1dHRvbnNcIj48L2NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2ZkLXBvcG92ZXItYm9keT5cbjwvZmQtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSBsZXQtZGlhbG9nIGxldC1kaWFsb2dDb25maWc9XCJkaWFsb2dDb25maWdcIiAjZGlhbG9nVGVtcGxhdGU+XG4gICAgPGZkLWRpYWxvZyBbZGlhbG9nQ29uZmlnXT1cImRpYWxvZ0NvbmZpZ1wiIFtkaWFsb2dSZWZdPVwiZGlhbG9nXCI+XG4gICAgICAgIDxmZC1kaWFsb2ctYm9keT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBtb250aDtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzTWluOiB3ZWVrRGF5c01pbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyOiBwb3BvdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nOiBkaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1kaWFsb2ctYm9keT5cbiAgICAgICAgPGZkLWRpYWxvZy1mb290ZXI+XG4gICAgICAgICAgICA8Y29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyQnV0dG9uczsgY29udGV4dDogeyBkaWFsb2c6IGRpYWxvZyB9XCI+PC9jb250YWluZXI+XG4gICAgICAgIDwvZmQtZGlhbG9nLWZvb3Rlcj5cbiAgICA8L2ZkLWRpYWxvZz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2Zvb3RlckJ1dHRvbnMgbGV0LWRpYWxvZz1cImRpYWxvZ1wiPlxuICAgIDxmZC1idXR0b24tYmFyIFtsYWJlbF09XCInT2snIHwgYmJiVHJhbnNsYXRlXCIgZmRUeXBlPVwiZW1waGFzaXplZFwiIChjbGljayk9XCJvbk9rKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXJcbiAgICAgICAgW2xhYmVsXT1cIidDbGVhcicgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBmZFR5cGU9XCJzdGFuZGFyZFwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKHBvcG92ZXIsIGRpYWxvZylcIlxuICAgID48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXIgW2xhYmVsXT1cIidDYW5jZWwnIHwgYmJiVHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlXG4gICAgI21vbnRoXG4gICAgbGV0LXNlbGVjdGVkTW9udGhcbiAgICBsZXQtd2lkdGg9XCJ3aWR0aFwiXG4gICAgbGV0LWhlaWdodD1cImhlaWdodFwiXG4gICAgbGV0LXJ0bD1cInJ0bFwiXG4gICAgbGV0LXRvZGF5PVwidG9kYXlcIlxuICAgIGxldC1zaG93RXZlbnRzPVwic2hvd0V2ZW50c1wiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtcG9wb3Zlcj1cInBvcG92ZXJcIlxuICAgIGxldC1kaWFsb2c9XCJkaWFsb2dcIlxuPlxuICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtsYWJlbF09XCIoc2hvd0RhdGUgPyAnRGF0ZVJfVG9kYXknIDogJ05vdycpIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZGF5KClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJldlRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tbGVmdC1hcnJvdycgOiAnbmF2aWdhdGlvbi1yaWdodC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmV4dFRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXJzLXdyYXBwZXJcIiBmZC10aXRsZSBmZC10b29sYmFyLWl0ZW0+XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdkYXknIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbnRoTmFtZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnbW9udGgnXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ3llYXInXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2ZkLXRvb2xiYXI+XG4gICAgfVxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgIEBzd2l0Y2ggKHNlbGVjdGlvbk1vZGUpIHsgQGNhc2UgKCdtb250aCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoczsgdHJhY2sgbW9udGg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAzMyVcIlxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWUgPT09IG1vbnRoID8gJ2VtcGhhc2l6ZWQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vbnRoXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICdkYXknOyBvbk1vbnRoU2VsZWN0ZWQobW9udGgsIGkpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGNhc2UgKCd5ZWFyJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1zZWxlY3Rpb24td3JhcHBlclwiPlxuICAgICAgICAgICAgQGZvciAoeWVhciBvZiB5ZWFyczsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleC1ncm93OiAxOyB3aWR0aDogMjUlXCJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhciA9PT0gK3llYXIgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwieWVhclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnZGF5Jzsgb25ZZWFyU2VsZWN0ZWQoeWVhcilcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZGVmYXVsdCB7XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgICAgICBAaWYgKHNob3dEYXRlKSB7XG4gICAgICAgICAgICA8YmMtY2FsZW5kYXItbW9udGhcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyV2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgICAgICBbbW9udGhXZWVrc0NvdW50XT1cInNlbGVjdGVkTW9udGgud2Vla3NDb3VudFwiXG4gICAgICAgICAgICAgICAgW3dlZWtEYXlzXT1cIndlZWtEYXlzXCJcbiAgICAgICAgICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICAgICAgICAgIFt0b2RheV09XCJ0b2RheVwiXG4gICAgICAgICAgICAgICAgW2RhdGVQaWNrZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2RhdGVSYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWREYXRlXT1cInN0YXJ0U2VsZWN0ZWREYXkgPyBzdGFydFNlbGVjdGVkRGF5LmRhdGUgOiB2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2RheXNdPVwic2VsZWN0ZWRNb250aC5kYXlzXCJcbiAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljaygkZXZlbnQsIHBvcG92ZXIsIGRpYWxvZylcIlxuICAgICAgICAgICAgPjwvYmMtY2FsZW5kYXItbW9udGg+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwZXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICBAaWYgKHNob3dUaW1lKSB7XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxmZC10aW1lXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlyZWN0aW9uOiBsdHJcIlxuICAgICAgICAgICAgICAgICAgICBmZENvbXBhY3RcbiAgICAgICAgICAgICAgICAgICAgW2tlZXBUd29EaWdpdHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGltZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlTZWNvbmRzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICA+PC9mZC10aW1lPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDAuMnJlbTsgcGFkZGluZzogMC41cmVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgZmQtZm9ybS1jb250cm9sXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbW92ZS1hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAzcmVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lVmFsdWU/Lm1pbnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlPVwiMjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uTWludXRlVGV4dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBmZC1mb3JtLWNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDNyZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtYXJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRpbWVWYWx1ZT8uaG91clwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlPVwiNTlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSG91clRleHRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|