@energycap/components 0.43.6 → 0.43.7-ECAP-29231-date-picker.20250609-1130

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.
@@ -427,11 +427,11 @@ export class DateInputComponent extends FormControlBase {
427
427
  return null;
428
428
  }
429
429
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateInputComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i3.UserPreferenceService }, { token: i0.ElementRef }, { token: i4.Overlay }, { token: i5.DateInput.SelectionStrategies }], target: i0.ɵɵFactoryTarget.Component }); }
430
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateInputComponent, selector: "ec-date-input", inputs: { id: "id", formModel: "formModel", minDate: "minDate", maxDate: "maxDate", selectionMode: "selectionMode", selectionModeOptions: "selectionModeOptions", quickSelectDate: "quickSelectDate", enableSteppers: "enableSteppers" }, host: { properties: { "attr.id": "this.id" } }, providers: [DateInput.SelectionStrategies], viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "controls", first: true, predicate: ["controls"], descendants: true }, { propertyName: "overlay", first: true, predicate: ["overlay"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: i8.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i9.FormControlComponent, selector: "ec-form-control", inputs: ["id", "icon", "actionIcon", "showClear", "formModel", "autofocus", "pending", "required", "readonly"], outputs: ["actionClicked"] }, { kind: "component", type: i10.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "component", type: i11.LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "component", type: i12.CalendarComponent, selector: "ec-calendar", inputs: ["id", "selection", "selectionMode", "minDate", "maxDate", "view"], outputs: ["dateSelected", "viewChange"] }, { kind: "directive", type: i13.KeyboardNavContainerDirective, selector: "[ecKeyboardNavContainer]", inputs: ["ecKeyboardNavContainer"], outputs: ["focusOutStart", "focusOutEnd"], exportAs: ["ecKeyboardNavContainer"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }] }); }
430
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateInputComponent, selector: "ec-date-input", inputs: { id: "id", formModel: "formModel", minDate: "minDate", maxDate: "maxDate", selectionMode: "selectionMode", selectionModeOptions: "selectionModeOptions", quickSelectDate: "quickSelectDate", enableSteppers: "enableSteppers" }, host: { properties: { "attr.id": "this.id" } }, providers: [DateInput.SelectionStrategies], viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "controls", first: true, predicate: ["controls"], descendants: true }, { propertyName: "overlay", first: true, predicate: ["overlay"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n tabindex=\"{{tabindex}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: i8.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i9.FormControlComponent, selector: "ec-form-control", inputs: ["id", "icon", "actionIcon", "showClear", "formModel", "autofocus", "pending", "required", "readonly"], outputs: ["actionClicked"] }, { kind: "component", type: i10.HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "component", type: i11.LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "component", type: i12.CalendarComponent, selector: "ec-calendar", inputs: ["id", "selection", "selectionMode", "minDate", "maxDate", "view"], outputs: ["dateSelected", "viewChange"] }, { kind: "directive", type: i13.KeyboardNavContainerDirective, selector: "[ecKeyboardNavContainer]", inputs: ["ecKeyboardNavContainer"], outputs: ["focusOutStart", "focusOutEnd"], exportAs: ["ecKeyboardNavContainer"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }] }); }
431
431
  }
432
432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateInputComponent, decorators: [{
433
433
  type: Component,
434
- args: [{ selector: 'ec-date-input', providers: [DateInput.SelectionStrategies], template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"] }]
434
+ args: [{ selector: 'ec-date-input', providers: [DateInput.SelectionStrategies], template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n tabindex=\"{{tabindex}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"] }]
435
435
  }], ctorParameters: () => [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i3.UserPreferenceService }, { type: i0.ElementRef }, { type: i4.Overlay }, { type: i5.DateInput.SelectionStrategies }], propDecorators: { id: [{
436
436
  type: HostBinding,
437
437
  args: ['attr.id']
@@ -461,4 +461,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
461
461
  type: ViewChild,
462
462
  args: ['overlay']
463
463
  }] } });
464
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvZGF0ZS1pbnB1dC9kYXRlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9kYXRlLWlucHV0L2RhdGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBYyxXQUFXLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLFdBQVcsRUFBcUIsU0FBUyxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRL0MsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGVBQWU7SUFxRXJELFlBQ1ksd0JBQWtELEVBQ2xELGVBQWdDLEVBQ2xDLHFCQUE0QyxFQUM1QyxFQUFjLEVBQ2QsY0FBdUIsRUFDdkIsbUJBQWtEO1FBRTFELEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxlQUFlLENBQUMsQ0FBQztRQVB2Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNsQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUN2Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQStCO1FBeEU1QyxPQUFFLEdBQVcsRUFBRSxDQUFDO1FBRWhDLHFEQUFxRDtRQUNyQyxjQUFTLEdBQXdCLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZELFlBQU8sR0FBUyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFDakQsWUFBTyxHQUFTLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUVqRSxtRkFBbUY7UUFDMUUsa0JBQWEsR0FBNEIsS0FBSyxDQUFDO1FBRXhELG9IQUFvSDtRQUMzRyx5QkFBb0IsR0FBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQVFuRSxtREFBbUQ7UUFDMUMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFekMsbUZBQW1GO1FBQzVFLGlCQUFZLEdBQTJCLElBQUksU0FBUyxDQUFDO1lBQzFELE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBZ0IsSUFBSSxDQUFDO1lBQzdDLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBZ0IsSUFBSSxDQUFDO1NBQy9DLENBQUMsQ0FBQztRQUVIOzs7V0FHRztRQUNJLHNCQUFpQixHQUErQixJQUFJLENBQUM7UUFFNUQsNERBQTREO1FBQ3JELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTlCLDBGQUEwRjtRQUNuRixnQkFBVyxHQUFXLFlBQVksQ0FBQztRQUUxQyx1RkFBdUY7UUFDaEYsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVyRSx3QkFBbUIsR0FBa0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7UUFDdkUsMEJBQXFCLEdBQWtCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBRXpFLDJCQUFzQixHQUFTLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRSw2QkFBd0IsR0FBUyxjQUFjLENBQUMsaUJBQWlCLENBQUM7UUFFbEUsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFJeEM7OztXQUdHO1FBQ0ssaUJBQVksR0FBYSxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQWlCeEUsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixRQUFRO1FBQ1IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTFDLGdCQUFnQjtRQUNoQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3Qiw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV4RSwrRUFBK0U7UUFDL0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELHVCQUF1QjtRQUM1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELHdGQUF3RjtJQUNqRixxQkFBcUI7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxxRkFBcUY7SUFDOUUscUJBQXFCLENBQUMsS0FBaUI7UUFDNUMsb0ZBQW9GO1FBQ3BGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDM0QsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHO1lBQ3BELEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDM0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSTtZQUN6QixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDN0IsaUdBQWlHO1FBQ2pHLG1HQUFtRztRQUNuRyx3R0FBd0c7UUFDeEcsTUFBTSxRQUFRLEdBQWlCLEtBQUssQ0FBQyxNQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sYUFBYSxHQUFHLFFBQVEsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLFNBQVMsSUFBSSxRQUFRLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxrQkFBa0IsQ0FBQztRQUVwRyxJQUFJLENBQUMsYUFBYSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCxzSUFBc0k7SUFDL0gscUJBQXFCO1FBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFTSxhQUFhO1FBQ2xCLHdIQUF3SDtRQUN4SCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUMzSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDckQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNqRCxNQUFNLE9BQU8sR0FBNkIsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUUzRSxzRUFBc0U7UUFDdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sY0FBYztRQUNuQix5SEFBeUg7UUFDekgsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pHLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN0RCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUE2QixFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFFL0YsdUVBQXVFO1FBQ3ZFLGdGQUFnRjtRQUNoRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2SCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxJQUE2QjtRQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbkMsOEdBQThHO1FBQzlHLGdHQUFnRztRQUNoRyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25ILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2SCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sc0JBQXNCLENBQUMsSUFBVTtRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9GLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUUsMkhBQTJIO1FBQzNILG9JQUFvSTtRQUNwSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbEMsc0hBQXNIO1FBQ3RILElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFTSwyQkFBMkIsQ0FBQyxJQUFtQjtRQUNwRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSw2QkFBNkIsQ0FBQyxJQUFtQjtRQUN0RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCwwRkFBMEY7SUFDbkYsU0FBUztRQUNkLG9IQUFvSDtRQUNwSCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUN6RixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDL0Qsc0VBQXNFO1FBQ3hFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pILElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFTSxhQUFhO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxLQUFpQztRQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqQyxrREFBa0Q7UUFDbEQscUZBQXFGO1FBQ3JGLGtGQUFrRjtRQUNsRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixxRUFBcUU7UUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUMvQixvQkFBb0IsRUFBRSxFQUN0QixTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ25DLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU5QyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsbUdBQW1HO2dCQUNuRyxpR0FBaUc7Z0JBQ2pHLDZGQUE2RjtnQkFDN0YsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLGlHQUFpRztRQUNqRyxtR0FBbUc7UUFDbkcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUM5QixTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ25DLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsbUhBQW1IO1lBQ25ILElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsdUZBQXVGO1FBQ3ZGLHlFQUF5RTtRQUN6RSx3REFBd0Q7UUFDeEQsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNsRCxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FDbkMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2YsTUFBTSxPQUFPLEdBQTZCLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXBILHFHQUFxRztZQUNyRyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO2dCQUN0QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNqRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ25ELFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUNuQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZixNQUFNLE9BQU8sR0FBNkIsRUFBRSx5QkFBeUIsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMxRyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUVwSCxxR0FBcUc7WUFDckcsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztnQkFDdEMsOEdBQThHO2dCQUM5RyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUNqRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO2dCQUNELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxNQUF5QjtRQUNoRSxxRUFBcUU7UUFDckUsNkNBQTZDO1FBQzdDLElBQUksTUFBTSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFBQSxDQUFDO0lBRU0sY0FBYztRQUNwQiw0Q0FBNEM7UUFDNUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFbkMsa0RBQWtEO1FBQ2xELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlDLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvQyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4RSxDQUFDO1FBRUQsMERBQTBEO1FBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpDLGtGQUFrRjtRQUNsRixrRkFBa0Y7UUFDbEYsc0RBQXNEO1FBQ3RELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxLQUFLLENBQUMsY0FBYztRQUMxQixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDeEYsTUFBTSxVQUFVLEdBQUcsVUFBVSxFQUFFLFVBQVUsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCw4QkFBOEI7SUFDdEIsVUFBVTtRQUNoQixJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUE2QjtRQUNwRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSyx5QkFBeUI7UUFDL0IsNkRBQTZEO1FBQzdELGdHQUFnRztRQUNoRyxvRkFBb0Y7UUFDcEYsMkNBQTJDO1FBQzNDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RILENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLFNBQXFDO1FBQzNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXRGLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxTQUFxQyxFQUFFLGlCQUEwQixLQUFLO1FBQ2xHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUUxSSxtR0FBbUc7UUFDbkcsaUdBQWlHO1FBQ2pHLDBFQUEwRTtRQUMxRSxJQUFJLGNBQWMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbEcsSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDMUcsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBcUMsRUFBRSxlQUF3QixLQUFLO1FBQ2xHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVoSixzR0FBc0c7UUFDdEcsZ0dBQWdHO1FBQ2hHLHdFQUF3RTtRQUN4RSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbEcsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMzRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUN0RyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsS0FBaUM7UUFDdEQsbUdBQW1HO1FBQ25HLElBQ0UsQ0FBQyxLQUFLO1lBQ04sQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUM7WUFDeEUsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbkUsQ0FBQztZQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ25ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUVyRCxzR0FBc0c7UUFDdEcsbUhBQW1IO1FBQ25ILElBQ0UsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUNkLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFDbEYsQ0FBQztZQUNELE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0Qsd0VBQXdFO1FBQ3hFLElBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQjtZQUMzQyxDQUFDLFFBQVEsQ0FBQyxLQUFLO1lBQ2YsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFDaEMsQ0FBQztZQUNELFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsSUFBWTtRQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLDRFQUE0RTtZQUM1RSxnRkFBZ0Y7WUFDaEYsMkRBQTJEO1lBQzNELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ25GLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDakQsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUN6RixPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOytHQXhmVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixrVUFGbEIsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsd1ZDcEI1QyxpeE1BK0lBOzs0RkR6SGEsa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLGVBQWUsYUFHZCxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQzswUEFLMUIsRUFBRTtzQkFEakIsV0FBVzt1QkFBQyxTQUFTOztzQkFDckIsS0FBSztnQkFHVSxTQUFTO3NCQUF4QixLQUFLO2dCQUVVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFNRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBdUNpQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0UsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUdDLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0Nvbm5lY3RlZE92ZXJsYXksIE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtQ29udHJvbFN0YXR1cywgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBLZXlib2FyZE5hdkNvbnRhaW5lckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL3B1YmxpYy1hcGknO1xyXG5pbXBvcnQgeyBEYXRlVGltZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvZGF0ZS10aW1lLWhlbHBlcic7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXBIZWxwZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZm9ybS1ncm91cC5oZWxwZXInO1xyXG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvdXNlci1wcmVmZXJlbmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLnR5cGVzJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xCYXNlIH0gZnJvbSAnLi4vZm9ybS1jb250cm9sLWJhc2UnO1xyXG5pbXBvcnQgeyBEYXRlSW5wdXRTZWxlY3Rpb25TdHJhdGVneUJhc2UgfSBmcm9tICcuL2RhdGUtaW5wdXQtc2VsZWN0aW9uLXN0cmF0ZWdpZXMvZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ3ktYmFzZSc7XHJcbmltcG9ydCB7IERhdGVJbnB1dCB9IGZyb20gJy4vZGF0ZS1pbnB1dC50eXBlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLWRhdGUtaW5wdXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbRGF0ZUlucHV0LlNlbGVjdGlvblN0cmF0ZWdpZXNdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgQElucHV0KCkgcHVibGljIGlkOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgZm9ybS4gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZm9ybU1vZGVsOiBEYXRlSW5wdXQuRm9ybU1vZGVsID0gbmV3IEZvcm1Db250cm9sKG51bGwpO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgbWluRGF0ZTogRGF0ZSA9IERhdGVUaW1lSGVscGVyLm1pbkRhdGVQaWNrZXJEYXRlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBtYXhEYXRlOiBEYXRlID0gRGF0ZVRpbWVIZWxwZXIubWF4RGF0ZVBpY2tlckRhdGU7XHJcblxyXG4gIC8qKiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24gbW9kZSBmb3IgdGhlIGNhbGVuZGFyLiBEZWZhdWx0cyB0byBkYXkgaWYgbm90IHByb3ZpZGVkICovXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogRGF0ZUlucHV0LlNlbGVjdGlvbk1vZGUgPSAnZGF5JztcclxuXHJcbiAgLyoqIFRoZSBhdmFpbGFibGUgc2VsZWN0aW9uIG1vZGVzIGZvciB0aGUgY2FsZW5kYXIuIERlZmF1bHRzIHRvIG9ubHkgdGhlIGluaXRpYWwgc2VsZWN0aW9uIG1vZGUgaWYgbm90IHByb3ZpZGVkLiAgKi9cclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlT3B0aW9uczogRGF0ZUlucHV0LlNlbGVjdGlvbk1vZGVbXSA9IFsnZGF5J107XHJcblxyXG4gIC8qKiBcclxuICAgKiBXaGVuIGEgZGF0ZSBpcyBwcm92aWRlZCwgZW5hYmxlcyB0aGUgJ3F1aWNrIHNlbGVjdCcgYnV0dG9uLlxyXG4gICAqIENsaWNraW5nIHRoZSBidXR0b24gd2lsbCBzaGlmdCB0aGUgc2VsZWN0ZWQgZGF0ZSByYW5nZSB0byB0aGUgcHJvdmlkZWQgZGF0ZS5cclxuICAgKi9cclxuICBASW5wdXQoKSBxdWlja1NlbGVjdERhdGU/OiBEYXRlO1xyXG5cclxuICAvKiogRW5hYmxlcyB0aGUgbmV4dC9wcmV2aW91cyBzZWxlY3Rpb24gYnV0dG9ucy4gKi9cclxuICBASW5wdXQoKSBlbmFibGVTdGVwcGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogVGhlIGZvcm0gZ3JvdXAgZm9yIHRoZSBpbnRlcm5hbCB0ZXh0Ym94ZXMuIFRleHRib3gyIGlzIG9ubHkgdXNlZCBmb3IgcmFuZ2VzLiAqL1xyXG4gIHB1YmxpYyB0ZXh0Ym94R3JvdXA6IERhdGVJbnB1dC5UZXh0Ym94R3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIHRleHRib3g6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKSxcclxuICAgIHRleHRib3gyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbClcclxuICB9KTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgY2FsZW5kYXIgc2VsZWN0aW9uLlxyXG4gICAqIFVwZGF0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBjYWxlbmRhciBpdGVtIG9yIHdoZW4gdGhlIGRhdGUgZW50ZXJlZCBpbnRvIHRoZSB0ZXh0Ym94IGlzIHBhcnNlZC5cclxuICAgKi9cclxuICBwdWJsaWMgY2FsZW5kYXJTZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNhbGVuZGFyIG92ZXJsYXkgaXMgb3BlbiBvciBub3QuICovXHJcbiAgcHVibGljIGlzQ2FsZW5kYXJPcGVuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBQbGFjZWhvbGRlciBmb3IgdGhlIHRleHRib3guIFVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgdXNlcidzIGRhdGUgZGlzcGxheSBwcmVmZXJlbmNlLiAqL1xyXG4gIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ01NL0REL1lZWVknO1xyXG5cclxuICAvKiogT3ZlcmxheSBzY3JvbGwgc3RyYXRlZ3kgZm9yIHRoZSBjYWxlbmRhciBvdmVybGF5LiBDbG9zZXMgdGhlIGNhbGVuZGFyIG9uIHNjcm9sbC4gKi9cclxuICBwdWJsaWMgb3ZlcmxheVNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5U2VydmljZS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKCk7XHJcblxyXG4gIHB1YmxpYyBwcmltYXJ5Q2FsZW5kYXJWaWV3OiBDYWxlbmRhci5WaWV3ID0geyBtb2RlOiAnZGF5JywgZGF0ZTogbmV3IERhdGUoKSB9O1xyXG4gIHB1YmxpYyBzZWNvbmRhcnlDYWxlbmRhclZpZXc6IENhbGVuZGFyLlZpZXcgPSB7IG1vZGU6ICdkYXknLCBkYXRlOiBuZXcgRGF0ZSgpIH07XHJcblxyXG4gIHB1YmxpYyBwcmltYXJ5Q2FsZW5kYXJNYXhEYXRlOiBEYXRlID0gRGF0ZVRpbWVIZWxwZXIubWF4RGF0ZVBpY2tlckRhdGU7XHJcbiAgcHVibGljIHNlY29uZGFyeUNhbGVuZGFyTWluRGF0ZTogRGF0ZSA9IERhdGVUaW1lSGVscGVyLm1pbkRhdGVQaWNrZXJEYXRlO1xyXG5cclxuICBwdWJsaWMgZGlzYWJsZVN0ZXBwZXJzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBzZWxlY3Rpb25TdHJhdGVneSE6IERhdGVJbnB1dFNlbGVjdGlvblN0cmF0ZWd5QmFzZTtcclxuXHJcbiAgLyoqIFxyXG4gICAqIERhdGUgcGFyc2luZyBmb3JtYXRzIGZvciB1c2VyLWVudGVyZWQgZGF0ZXMuIERlZmF1bHRzIHRvIG1vbnRoLWZpcnN0IGZvcm1hdHMsIGJ1dCBpcyB1cGRhdGVkIGluIG9uSW5pdFxyXG4gICAqIHRvIHVzZSB0aGUgdXNlcidzIHByZWZlcnJlZCBkYXRlIGZvcm1hdC5cclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlRm9ybWF0czogc3RyaW5nW10gPSBEYXRlVGltZUhlbHBlci5nZXRNb21lbnRQYXJzZUZvcm1hdHMoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXInKSBjYWxlbmRhcj86IEtleWJvYXJkTmF2Q29udGFpbmVyRGlyZWN0aXZlO1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRyb2xzJykgY29udHJvbHM/OiBLZXlib2FyZE5hdkNvbnRhaW5lckRpcmVjdGl2ZTtcclxuXHJcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgb3ZlcmxheSBkaXJlY3RpdmUgKHNlZSB0ZW1wbGF0ZSkuIFVzZWQgdG8gdXBkYXRlIHRoZSBvdmVybGF5IHBvc2l0aW9uIG9uIHZhbGlkYXRpb24gY2hhbmdlcy4gKi9cclxuICBAVmlld0NoaWxkKCdvdmVybGF5Jykgb3ZlcmxheT86IENka0Nvbm5lY3RlZE92ZXJsYXk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRpb25NZXNzYWdlU2VydmljZTogVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGZvcm1Hcm91cEhlbHBlcjogRm9ybUdyb3VwSGVscGVyLFxyXG4gICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZVNlcnZpY2U6IFVzZXJQcmVmZXJlbmNlU2VydmljZSxcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TdHJhdGVnaWVzOiBEYXRlSW5wdXQuU2VsZWN0aW9uU3RyYXRlZ2llc1xyXG4gICkge1xyXG4gICAgc3VwZXIodmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLCBmb3JtR3JvdXBIZWxwZXIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMuc2VsZWN0aW9uTW9kZSAmJiAhY2hhbmdlcy5zZWxlY3Rpb25Nb2RlLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLm9uU2VsZWN0aW9uTW9kZUNoYW5nZSh0aGlzLnNlbGVjdGlvbk1vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBTZXR1cFxyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIHRoaXMuc2V0RGF0ZUZvcm1hdHMoKTtcclxuICAgIHRoaXMuc2V0U2VsZWN0aW9uTW9kZSh0aGlzLnNlbGVjdGlvbk1vZGUpO1xyXG5cclxuICAgIC8vIFN1YnNjcmlwdGlvbnNcclxuICAgIHRoaXMub25Gb3JtTW9kZWxTdGF0dXNDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLm9uRm9ybU1vZGVsVmFsdWVDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLm9uVGV4dGJveFZhbHVlQ2hhbmdlcygpO1xyXG5cclxuICAgIC8vIFN5bmMgdGhlIGluaXRpYWwgZGlzYWJsZWQgc3RhdHVzIGFuZCB2YWx1ZSBvZiB0aGUgdGV4dGJveFxyXG4gICAgdGhpcy5zeW5jVGV4dGJveENvbnRyb2xEaXNhYmxlZFN0YXR1cyh0aGlzLmZvcm1Nb2RlbC5zdGF0dXMpO1xyXG4gICAgY29uc3QgaW5pdGlhbERpc3BsYXlWYWx1ZSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZm9ybWF0U2VsZWN0aW9uKHRoaXMuZm9ybU1vZGVsLnZhbHVlKTtcclxuICAgIHRoaXMudGV4dGJveEdyb3VwLnBhdGNoVmFsdWUoaW5pdGlhbERpc3BsYXlWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uIGFuZCB2aWV3IGJhc2VkIG9uIHRoZSBpbml0aWFsIGZvcm0gbW9kZWwgdmFsdWVcclxuICAgIHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24gPSB0aGlzLmZvcm1Nb2RlbC52YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy51cGRhdGVTdGVwcGVycyh0aGlzLmNhbGVuZGFyU2VsZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2N1c2VzIHRoZSBpbnB1dCB3aGVuZXZlciB0aGUgY2FsZW5kYXIgaXMgc2hpZnQtdGFiYmVkIG91dCBvZi4gKi9cclxuICBwdWJsaWMgb25DYWxlbmRhckZvY3VzT3V0U3RhcnQoKSB7XHJcbiAgICB0aGlzLmZvY3VzSW5wdXQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9zZXMgdGhlIGNhbGVuZGFyIGFuZCBmb2N1c2VzIHRoZSBpbnB1dCB3aGVuZXZlciB0aGUgY2FsZW5kYXIgaXMgdGFiYmVkIG91dCBvZi4gKi9cclxuICBwdWJsaWMgb25DYWxlbmRhckZvY3VzT3V0RW5kKCkge1xyXG4gICAgdGhpcy5pc0NhbGVuZGFyT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5mb2N1c0lucHV0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xvc2VzIHRoZSBjYWxlbmRhciBpZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgY2FsZW5kYXIgYW5kIGRhdGUgaW5wdXQuICovXHJcbiAgcHVibGljIG9uT3ZlcmxheU91dHNpZGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgLy8gRG8gbm90IGNsb3NlIHRoZSBjYWxlbmRhciBpZiB0aGUgY2xpY2sgd2FzIHdpdGhpbiB0aGUgZGF0ZSBpbnB1dCBvciBhY3Rpb24gYnV0dG9uXHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgY2xpY2tlZE91dHNpZGVDb250cm9sID0gZXZlbnQuY2xpZW50WSA8IHJlY3QudG9wIHx8XHJcbiAgICAgIGV2ZW50LmNsaWVudFkgPiByZWN0LmJvdHRvbSB8fFxyXG4gICAgICBldmVudC5jbGllbnRYIDwgcmVjdC5sZWZ0IHx8XHJcbiAgICAgIGV2ZW50LmNsaWVudFggPiByZWN0LnJpZ2h0O1xyXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSB1c2VyIGhpdCBlbnRlciBvbiB0aGUgYWN0aW9uIGJ1dHRvbiBpbnN0ZWFkIG9mIGNsaWNraW5nIHdpdGggdGhlIG1vdXNlLlxyXG4gICAgLy8gSW4gdGhpcyBjYXNlIHRoZSBcImNsaWNrXCIgZXZlbnQgd2lsbCBiZSBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQgYmVjYXVzZSB0aGUgY2xpZW50eCBhbmQgeSBhcmUgMCxcclxuICAgIC8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNsb3NlIGluIHRoaXMgY2FzZSBiZWNhdXNlIGJ1dHRvbiBjbGlja3MgdHJpZ2dlciBjYWxlbmRhciBvcGVuL2Nsb3NlIHNlcGFyYXRlbHkuXHJcbiAgICBjb25zdCB0YXJnZXRJZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5pZDtcclxuICAgIGNvbnN0IGlzQWN0aW9uQ2xpY2sgPSB0YXJnZXRJZCA9PT0gYCR7dGhpcy5pZH1fYWN0aW9uYCB8fCB0YXJnZXRJZCA9PT0gYCR7dGhpcy5pZH1fY29udHJvbDJfYWN0aW9uYDtcclxuXHJcbiAgICBpZiAoIWlzQWN0aW9uQ2xpY2sgJiYgY2xpY2tlZE91dHNpZGVDb250cm9sKSB7XHJcbiAgICAgIHRoaXMuaXNDYWxlbmRhck9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBJZiB0aGUgdXNlciB0YWJzIG91dCBvZiB0aGUgZm9ybSBjb250cm9sJ3MgYWN0aW9uIGJ1dHRvbiBhbmQgdGhlIGNhbGVuZGFyIGlzIG9wZW4sIGZvY3VzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBjYWxlbmRhciBvdmVybGF5ICovXHJcbiAgcHVibGljIG9uQ29udHJvbHNGb2N1c091dEVuZCgpIHtcclxuICAgIGlmICh0aGlzLmlzQ2FsZW5kYXJPcGVuKSB7XHJcbiAgICAgIHRoaXMuY2FsZW5kYXI/LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25UZXh0Ym94Qmx1cigpIHtcclxuICAgIC8vIFdlIHdhbnQgdG8gcHJldmVudCB0aGUgZml4ZWQgZGF0ZSByYW5nZSBtb2RlcyBmcm9tIHJlLWF1dG9jb21wbGV0aW5nIHRoZSBmaXJzdCB0ZXh0Ym94IHdoZW4gaXQgaXMgZXhwbGljaXRseSBjbGVhcmVkLlxyXG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IERhdGVJbnB1dC5pc1NlbGVjdGlvblJhbmdlKHRoaXMuZm9ybU1vZGVsLnZhbHVlKSA/IHRoaXMuZm9ybU1vZGVsLnZhbHVlLnN0YXJ0IDogdGhpcy5mb3JtTW9kZWwudmFsdWU7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnRleHRib3hHcm91cC52YWx1ZS50ZXh0Ym94O1xyXG4gICAgY29uc3QgY2xlYXJlZCA9ICEhcHJldmlvdXNWYWx1ZSAmJiAhY3VycmVudFZhbHVlO1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zID0geyBwcmV2ZW50QXV0b0NvbXBsZXRlOiBjbGVhcmVkIH07XHJcblxyXG4gICAgLy8gUGFyc2UgdGhlIHRleHRib3ggdmFsdWVzIGludG8gYSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSB0aGUgZm9ybSBtb2RlbFxyXG4gICAgY29uc3QgcGFyc2VkU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5wYXJzZVRleHRib3hWYWx1ZXModGhpcy50ZXh0Ym94R3JvdXAudmFsdWUsIHRoaXMucGFyc2VGb3JtYXRzLCBvcHRpb25zKTtcclxuICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsKHBhcnNlZFNlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25UZXh0Ym94MkJsdXIoKSB7XHJcbiAgICAvLyBXZSB3YW50IHRvIHByZXZlbnQgdGhlIGZpeGVkIGRhdGUgcmFuZ2UgbW9kZXMgZnJvbSByZS1hdXRvY29tcGxldGluZyB0aGUgc2Vjb25kIHRleHRib3ggd2hlbiBpdCBpcyBleHBsaWNpdGx5IGNsZWFyZWQuXHJcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2UodGhpcy5mb3JtTW9kZWwudmFsdWUpID8gdGhpcy5mb3JtTW9kZWwudmFsdWUuZW5kIDogbnVsbDtcclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudGV4dGJveEdyb3VwLnZhbHVlLnRleHRib3gyO1xyXG4gICAgY29uc3QgY2xlYXJlZCA9ICEhcHJldmlvdXNWYWx1ZSAmJiAhY3VycmVudFZhbHVlO1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zID0geyBwYXJzZUZyb21FbmQ6IHRydWUsIHByZXZlbnRBdXRvQ29tcGxldGU6IGNsZWFyZWQgfTtcclxuXHJcbiAgICAvLyBQYXJzZSB0aGUgdGV4dGJveCB2YWx1ZXMgaW50byBhIHNlbGVjdGlvbiBhbmQgdXBkYXRlIHRoZSBmb3JtIG1vZGVsLFxyXG4gICAgLy8gRm9yIHRoZSBzZWNvbmQgYm94IHdlJ3JlIGtleWluZyB0aGUgcGFyc2UgZnJvbSB0aGUgZW5kIGRhdGUgaW4gdGhlIHNlbGVjdGlvbi5cclxuICAgIGNvbnN0IHBhcnNlZFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kucGFyc2VUZXh0Ym94VmFsdWVzKHRoaXMudGV4dGJveEdyb3VwLnZhbHVlLCB0aGlzLnBhcnNlRm9ybWF0cywgb3B0aW9ucyk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbChwYXJzZWRTZWxlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU2VsZWN0aW9uTW9kZUNoYW5nZShtb2RlOiBEYXRlSW5wdXQuU2VsZWN0aW9uTW9kZSkge1xyXG4gICAgdGhpcy5zZXRTZWxlY3Rpb25Nb2RlKG1vZGUpO1xyXG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5nZXROZXdTZWxlY3Rpb25Gcm9tRXhpc3RpbmcodGhpcy5jYWxlbmRhclNlbGVjdGlvbik7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbChuZXdTZWxlY3Rpb24pO1xyXG5cclxuICAgIC8vIE9uIHNlbGVjdGlvbiBtb2RlIGNoYW5nZSwgd2Ugd2FudCB0byBmb3JjZSB0aGUgY2FsZW5kYXJzIHRvIHNob3cgdGhlIHJpZ2h0IHZpZXcgbW9kZSBmb3IgdGhlIG5ldyBzZWxlY3Rpb24uXHJcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gc2VlaW5nIGEgdmlldyBtb2RlIHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlIGZvciB0aGUgbmV3IHNlbGVjdGlvbixcclxuICAgIC8vIExpa2Ugd2hlbiBzd2ljaGluZyBmcm9tIHllYXIgbW9kZSB0byBsYXN0IDcgZGF5cyBtb2RlLlxyXG4gICAgdGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3ID0geyBtb2RlOiB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNlbGVjdGlvblZpZXdNb2RlLCBkYXRlOiB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcuZGF0ZSB9O1xyXG4gICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUsIGRhdGU6IHRoaXMuc2Vjb25kYXJ5Q2FsZW5kYXJWaWV3LmRhdGUgfTtcclxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJNaW5NYXhEYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2FsZW5kYXJEYXRlU2VsZWN0ZWQoZGF0ZTogRGF0ZSkge1xyXG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlLCB0aGlzLmNhbGVuZGFyU2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZm9ybWF0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7XHJcbiAgICAvLyBEb24ndCBlbWl0IGV2ZW50cyB3aGVuIHBhdGNoaW5nIHZhbHVlcyBoZXJlLiBXZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgdGhlIGNhbGVuZGFyIHVwZGF0ZXMgc2luY2UgdGhlIGNhbGVuZGFyIGlzIGFscmVhZHlcclxuICAgIC8vIHNob3dpbmcgdGhlIHNlbGVjdGVkIGRhdGUuIFdlIGFsc28gZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHRoZSB0ZXh0Ym94IHBhcnNpbmcgbG9naWMgc2luY2UgdGhlIGRhdGUgd2FzIHNlbGVjdGVkIGZyb20gdGhlIGNhbGVuZGFyLlxyXG4gICAgdGhpcy50ZXh0Ym94R3JvdXAucGF0Y2hWYWx1ZShkaXNwbGF5VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuZm9ybU1vZGVsLnBhdGNoVmFsdWUobmV3U2VsZWN0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmNhbGVuZGFyU2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uO1xyXG4gICAgdGhpcy51cGRhdGVTdGVwcGVycyhuZXdTZWxlY3Rpb24pO1xyXG5cclxuICAgIC8vIENsb3NlIHRoZSBjYWxlbmRhciBpZiB0aGUgc2VsZWN0aW9uIG1vZGUgaXMgbm90IGEgcmFuZ2UgbW9kZSB3aGVyZSBlaXRoZXIgdGhlIHN0YXJ0IG9yIHRoZSBlbmQgZGF0ZSBjYW4gYmUgY2hhbmdlZC5cclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5zaG93U2Vjb25kYXJ5VGV4dGJveCkge1xyXG4gICAgICB0aGlzLmlzQ2FsZW5kYXJPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUHJpbWFyeUNhbGVuZGFyVmlld0NoYW5nZSh2aWV3OiBDYWxlbmRhci5WaWV3KSB7XHJcbiAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB2aWV3O1xyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWNvbmRhcnlDYWxlbmRhclZpZXdDaGFuZ2UodmlldzogQ2FsZW5kYXIuVmlldykge1xyXG4gICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB2aWV3O1xyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogU2hpZnRzIHRoZSBjYWxlbmRhciB2aWV3cyB0byBkaXNwbGF5IHRvZGF5LiBEb2VzIG5vdCB1cGRhdGUgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4gKi9cclxuICBwdWJsaWMgZ29Ub1RvZGF5KCkge1xyXG4gICAgLy8gSWYgYm90aCBjYWxlbmRhcnMgYXJlIHZpc2libGUsIHNob3cgdG9kYXkgaW4gdGhlIHNlY29uZGFyeSBjYWxlbmRhciBhbmQgdGhlIG1vbnRoIGJlZm9yZSBpbiB0aGUgcHJpbWFyeSBjYWxlbmRhci5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlDYWxlbmRhcikge1xyXG4gICAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6ICdkYXknLCBkYXRlOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKSB9O1xyXG4gICAgICB0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldyA9IHsgbW9kZTogJ2RheScsIGRhdGU6IG5ldyBEYXRlKCkgfTtcclxuICAgICAgLy8gSWYgd2UncmUgaW4gYSBzaW5nbGUgZGF0ZSBtb2RlLCBzaG93IHRvZGF5IGluIHRoZSBwcmltYXJ5IGNhbGVuZGFyLlxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3ID0geyBtb2RlOiAnZGF5JywgZGF0ZTogbmV3IERhdGUoKSB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ29Ub1F1aWNrU2VsZWN0RGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLnF1aWNrU2VsZWN0RGF0ZSkge1xyXG4gICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFNlbGVjdGlvbkZvclF1aWNrU2VsZWN0RGF0ZSh0aGlzLnF1aWNrU2VsZWN0RGF0ZSwgdGhpcy5jYWxlbmRhclNlbGVjdGlvbik7XHJcbiAgICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsKG5ld1NlbGVjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmV4dFNlbGVjdGlvbigpIHtcclxuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZ2V0TmV4dFNlbGVjdGlvbih0aGlzLmNhbGVuZGFyU2VsZWN0aW9uKTtcclxuICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsKG5ld1NlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHJldmlvdXNTZWxlY3Rpb24oKSB7XHJcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFByZXZpb3VzU2VsZWN0aW9uKHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtTW9kZWwobmV3U2VsZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybU1vZGVsKHZhbHVlOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCkge1xyXG4gICAgdGhpcy5mb3JtTW9kZWwucGF0Y2hWYWx1ZSh2YWx1ZSk7XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgdGhlIHRleHRib3hlcyBhbmQgc3luYyB0aGUgZm9ybSBlcnJvcnNcclxuICAgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcGF0Y2hpbmcgdGhlIGZvcm0gbW9kZWwgYmVjYXVzZSB0aGUgZm9ybSBtb2RlbCBwYXRjaCB3aWxsIHRyaWdnZXJcclxuICAgIC8vIHRoZSBkYXRlIGZvcm1hdHRpbmcgbG9naWMgYW5kIG92ZXJ3cml0ZSBhbnkgZXJyb3JzIG9uIHRoZSBjb250cm9scyBmcm9tIGJlZm9yZS5cclxuICAgIHRoaXMudmFsaWRhdGVUZXh0Ym94ZXMoKTtcclxuICAgIHRoaXMuc3luY0Zvcm1FcnJvcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Gb3JtTW9kZWxTdGF0dXNDaGFuZ2VzKCkge1xyXG4gICAgLy8gS2VlcCB0aGUgdGV4dGJveENvbnRyb2wgZGlzYWJsZWQgc3RhdHVzIGluIHN5bmMgd2l0aCB0aGUgZm9ybU1vZGVsXHJcbiAgICB0aGlzLmZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUoXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XHJcbiAgICAgIHRoaXMuc3luY1RleHRib3hDb250cm9sRGlzYWJsZWRTdGF0dXMoc3RhdHVzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzQ2FsZW5kYXJPcGVuKSB7XHJcbiAgICAgICAgLy8gQXMgdmFsaWRhdGlvbiBtZXNzYWdlcyBhcHBlYXIvZGlzYXBwZWFyLCB0aGUgZGF0ZSBpbnB1dCBtYXkgaGF2ZSBzaGlmdGVkIHVwIG9yIGRvd24gb24gdGhlIHBhZ2UuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBvdmVybGF5IHBvc2l0aW9uIHRvIGVuc3VyZSBpdCdzIHN0aWxsIGFsaWduZWQgd2l0aCB0aGUgdGV4dGJveCBhbmQgbm90IGJsb2NraW5nIGl0LlxyXG4gICAgICAgIC8vIFNldHRpbWVvdXQgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGUgb3ZlcmxheSBpcyBiZWluZyB1cGRhdGVkIGFmdGVyIHRoZSBtZXNzYWdlIGlzIHJlbmRlcmVkLlxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vdmVybGF5Py5vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Gb3JtTW9kZWxWYWx1ZUNoYW5nZXMoKSB7XHJcbiAgICAvLyBVcGRhdGUgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbiB0ZXh0Ym94IHZhbHVlIHdpdGggYSBmb3JtYXR0ZWQgZGF0ZSB3aGVuIHRoZSBmb3JtIG1vZGVsIGNoYW5nZXMuXHJcbiAgICAvLyBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBzZWxlY3RpbmcgYSBkYXRlIGZyb20gdGhlIGNhbGVuZGFyIG9yIHdoZW4gdGhlIHRleHRib3ggaXMgYmx1cnJlZC5cclxuICAgIHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZm9ybWF0U2VsZWN0aW9uKHZhbHVlKTtcclxuICAgICAgLy8gRG9uJ3QgZW1pdCBhbiBldmVudCB3aGVuIHNldHRpbmcgdGhlIHRleHRib3ggdmFsdWUgdG8gYXZvaWQgY2lyY3VsYXIgdXBkYXRlcyBiZXR3ZWVuIHRoZSB0ZXh0Ym94IGFuZCBmb3JtIG1vZGVsLlxyXG4gICAgICB0aGlzLnRleHRib3hHcm91cC5wYXRjaFZhbHVlKGRpc3BsYXlWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycyh2YWx1ZSk7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RlcHBlcnModmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uVGV4dGJveFZhbHVlQ2hhbmdlcygpIHtcclxuICAgIC8vIFVwZGF0ZSB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uIHdoZW4gdGhlIHRleHRib3ggdmFsdWUgY2hhbmdlcyB0byB1cGRhdGUgdGhlIGNhbGVuZGFyLlxyXG4gICAgLy8gV2UgZG9uJ3QgcGF0Y2ggdGhlIGZvcm1Nb2RlbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHRoZVxyXG4gICAgLy8gZGF0ZSBmb3JtYXR0aW5nIGxvZ2ljIGFuZCBvdmVyd3JpdGUgdGhlIHVzZXIncyBpbnB1dC5cclxuICAgIC8vIFdlJ2xsIGRvIHRoYXQgd2hlbiB0aGUgdXNlciBibHVycyBvdXQgb2YgdGhlIHRleHRib3guIFNlZSBvblRleHRib3hCbHVyKClcclxuICAgIHRoaXMudGV4dGJveEdyb3VwLmNvbnRyb2xzLnRleHRib3gudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IERhdGVJbnB1dC5QYXJzaW5nT3B0aW9ucyA9IHsgc2hpZnRUb0N1cnJlbnRZZWFySWZCZWxvdzogdGhpcy5taW5EYXRlIH07XHJcbiAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kucGFyc2VUZXh0Ym94VmFsdWVzKHRoaXMudGV4dGJveEdyb3VwLnZhbHVlLCB0aGlzLnBhcnNlRm9ybWF0cywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAvLyBDYWxlbmRhciBzZWxlY3Rpb24gd2lsbCBiZSBudWxsIGlmIHRoZSBkYXRlcyBhcmUgaW52YWxpZC4gRG9uJ3QgdXBkYXRlIHRoZSBjYWxlbmRhcnMgaW4gdGhpcyBjYXNlLlxyXG4gICAgICBpZiAobmV3U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjtcclxuICAgICAgICB0aGlzLnVwZGF0ZVByaW1hcnlDYWxlbmRhcih0aGlzLmNhbGVuZGFyU2VsZWN0aW9uLCB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlDYWxlbmRhcik7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFRoZSBzZWNvbmQgdGV4dGJveCBpcyBvbmx5IHVzZWQgaW4gbGFzdDdEYXlzLCBsYXN0MjhEYXlzLCBhbmQgcmFuZ2UgbW9kZXMuXHJcbiAgICB0aGlzLnRleHRib3hHcm91cC5jb250cm9scy50ZXh0Ym94Mi52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgZGVib3VuY2VUaW1lKDMwMCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9uczogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zID0geyBzaGlmdFRvQ3VycmVudFllYXJJZkJlbG93OiB0aGlzLm1pbkRhdGUsIHBhcnNlRnJvbUVuZDogdHJ1ZSB9O1xyXG4gICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnBhcnNlVGV4dGJveFZhbHVlcyh0aGlzLnRleHRib3hHcm91cC52YWx1ZSwgdGhpcy5wYXJzZUZvcm1hdHMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgLy8gQ2FsZW5kYXIgc2VsZWN0aW9uIHdpbGwgYmUgbnVsbCBpZiB0aGUgZGF0ZXMgYXJlIGludmFsaWQuIERvbid0IHVwZGF0ZSB0aGUgY2FsZW5kYXJzIGluIHRoaXMgY2FzZS5cclxuICAgICAgaWYgKG5ld1NlbGVjdGlvbikge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247XHJcbiAgICAgICAgLy8gVGhlIHNlY29uZGFyeSBjYWxlbmRhciBpcyBvbmx5IHNob3duIGluIHJhbmdlIG1vZGUuIFVwZGF0ZSB0aGUgcHJpbWFyeSBjYWxlbmRhciBpZiB3ZSdyZSBub3QgaW4gcmFuZ2UgbW9kZS5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdHJhdGVneS5zaG93U2Vjb25kYXJ5Q2FsZW5kYXIpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2Vjb25kYXJ5Q2FsZW5kYXIodGhpcy5jYWxlbmRhclNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWFyeUNhbGVuZGFyKHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyTWluTWF4RGF0ZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNUZXh0Ym94Q29udHJvbERpc2FibGVkU3RhdHVzKHN0YXR1czogRm9ybUNvbnRyb2xTdGF0dXMpIHtcclxuICAgIC8vIFRoZSB0ZXh0Ym94IHNob3VsZCBvbmx5IGJlIGRpc2FibGVkIGlmIHRoZSBmb3JtIG1vZGVsIGlzIGRpc2FibGVkLlxyXG4gICAgLy8gQWxsIG90aGVyIHN0YXR1c2VzIGFyZSBjb25zaWRlcmVkIGVuYWJsZWQuXHJcbiAgICBpZiAoc3RhdHVzID09PSAnRElTQUJMRUQnICYmIHRoaXMudGV4dGJveEdyb3VwLmVuYWJsZWQpIHtcclxuICAgICAgdGhpcy50ZXh0Ym94R3JvdXAuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIGlmIChzdGF0dXMgIT09ICdESVNBQkxFRCcgJiYgdGhpcy50ZXh0Ym94R3JvdXAuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy50ZXh0Ym94R3JvdXAuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBzeW5jRm9ybUVycm9ycygpIHtcclxuICAgIC8vIFN0YXJ0IHdpdGggdGhlIGV4aXN0aW5nIGZvcm0gbW9kZWwgZXJyb3JzXHJcbiAgICBsZXQgZXJyb3JzID0gdGhpcy5mb3JtTW9kZWwuZXJyb3JzO1xyXG5cclxuICAgIC8vIEFkZCB0aGUgZXJyb3JzIGZyb20gdGhlIHRleHRib3hlcyBpZiB0aGV5IGV4aXN0XHJcbiAgICBpZiAodGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveC5lcnJvcnMpIHtcclxuICAgICAgZXJyb3JzID0geyAuLi5lcnJvcnMsIC4uLnRoaXMudGV4dGJveEdyb3VwLmNvbnRyb2xzLnRleHRib3guZXJyb3JzIH07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveDIuZXJyb3JzKSB7XHJcbiAgICAgIGVycm9ycyA9IHsgLi4uZXJyb3JzLCAuLi50aGlzLnRleHRib3hHcm91cC5jb250cm9scy50ZXh0Ym94Mi5lcnJvcnMgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyBlcnJvcnMgd2l0aCB0aGUgY29tYmluZWQgZXJyb3JzXHJcbiAgICB0aGlzLmZvcm1Nb2RlbC5zZXRFcnJvcnMoZXJyb3JzKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyB0b3VjaGVkIGFuZCBkaXJ0eSBzdGF0dXMgYmFzZWQgb24gdGhlIHRleHRib3gncyBzdGF0dXMuXHJcbiAgICAvLyBTaW5jZSB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCBhIGNvbnRyb2wgdGhhdCBpcyBpbnRlcm5hbCB0byB0aGlzIGNvbXBvbmVudCwgdGhlXHJcbiAgICAvLyBmb3JtIG1vZGVsJ3Mgc3RhdHVzIHdvbid0IGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseS5cclxuICAgIGlmICh0aGlzLnRleHRib3hHcm91cC50b3VjaGVkICYmICF0aGlzLmZvcm1Nb2RlbC50b3VjaGVkKSB7XHJcbiAgICAgIHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRleHRib3hHcm91cC5kaXJ0eSAmJiAhdGhpcy5mb3JtTW9kZWwuZGlydHkpIHtcclxuICAgICAgdGhpcy5mb3JtTW9kZWwubWFya0FzRGlydHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBVcGRhdGVzIHRoZSBkYXRlIHBhcnNpbmcgZm9ybWF0cyBhbmQgcGxhY2Vob2xkZXIgYmFzZWQgb24gdGhlIHVzZXIncyBkaXNwbGF5IHByZWZlcmVuY2UuXHJcbiAgICogTk9URTogVGhpcyBpcyBhc3luYyBiZWNhdXNlIHdlJ3JlIHJldHJpZXZpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlcy4gV2UncmUgbm90IGF3YWl0aW5nIHRoZSByZXN1bHRcclxuICAgKiBiZWNhdXNlIHRoZSBvbmx5IGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiB0aGlzIGlzIHRoZSB0ZXh0IGJveCBkYXRlIHBhcnNpbmcgbG9naWMgYW5kIHBsYWNlaG9sZGVyLlxyXG4gICAqIE91ciBmb3JtcyBzaG91bGQgYWx3YXlzIGJlIGJlaGluZCBhIHBlbmRpbmcgb3ZlcmxheSwgc28gdGhlIHVzZXIgd29uJ3QgYmUgYWJsZSB0byBpbnRlcmFjdCB3aXRoIHRoZVxyXG4gICAqIGZvcm0gdW50aWwgdGhlIHVzZXIgaXMgbG9hZGVkIGFueXdheS5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHNldERhdGVGb3JtYXRzKCkge1xyXG4gICAgY29uc3QgeyBwcmVmZXJlbmNlIH0gPSBhd2FpdCBsYXN0VmFsdWVGcm9tKHRoaXMudXNlclByZWZlcmVuY2VTZXJ2aWNlLmdldFByZWZlcmVuY2VzKCkpO1xyXG4gICAgY29uc3QgZGF0ZUZvcm1hdCA9IHByZWZlcmVuY2U/LmRhdGVGb3JtYXQ7XHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gZGF0ZUZvcm1hdCA/PyB0aGlzLnBsYWNlaG9sZGVyO1xyXG4gICAgdGhpcy5wYXJzZUZvcm1hdHMgPSBEYXRlVGltZUhlbHBlci5nZXRNb21lbnRQYXJzZUZvcm1hdHMoZGF0ZUZvcm1hdCk7XHJcbiAgfVxyXG5cclxuICAvKiogRm9jdXNlcyB0aGUgZGF0ZSBpbnB1dC4gKi9cclxuICBwcml2YXRlIGZvY3VzSW5wdXQoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xzPy5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25Nb2RlKG1vZGU6IERhdGVJbnB1dC5TZWxlY3Rpb25Nb2RlKSB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBtb2RlO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25TdHJhdGVneSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ2llc1ttb2RlXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIG1heCBkYXRlIGZvciB0aGUgcHJpbWFyeSBjYWxlbmRhciBhbmQgdGhlIG1pbiBkYXRlIGZvciB0aGUgc2Vjb25kYXJ5IGNhbGVuZGFyIGJhc2VkXHJcbiAgICogb24gdGhlIGN1cnJlbnQgdmlld3MgaW4gZWFjaC4gVGhpcyBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIG1vdmluZyB0aGUgY2FsZW5kYXJzIG91dCBvZiBvcmRlci5cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUNhbGVuZGFyTWluTWF4RGF0ZXMoKSB7XHJcbiAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgbWluL21heCBkYXRlcyB3aGVuIHRoZSB2aWV3IG1vZGUgaXMgJ2RheScuXHJcbiAgICAvLyBXaGVuIGEgY2FsZW5kYXIgaXMgaW4gYSBtb250aCBvciB5ZWFyIHZpZXcgbW9kZSwgdGhlIHZpZXcgZGF0ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgeWVhci5cclxuICAgIC8vIFRoaXMgd291bGQgY2F1c2UgdGhlIGRhdGVzIGluIHRoZSBvdGhlciBjYWxlbmRhciB0byBiZSB1bnNlbGVjdGFibGUgaWYgd2Ugd2VyZSB0b1xyXG4gICAgLy8gdXBkYXRlIHRoZSBtaW4vbWF4IGRhdGVzIGluIHRoZXNlIGNhc2VzLlxyXG4gICAgaWYgKHRoaXMucHJpbWFyeUNhbGVuZGFyVmlldz8ubW9kZSA9PT0gJ2RheScpIHtcclxuICAgICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhck1pbkRhdGUgPSBtb21lbnQodGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3Py5kYXRlKS5hZGQoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldz8ubW9kZSA9PT0gJ2RheScpIHtcclxuICAgICAgdGhpcy5wcmltYXJ5Q2FsZW5kYXJNYXhEYXRlID0gbW9tZW50KHRoaXMuc2Vjb25kYXJ5Q2FsZW5kYXJWaWV3Py5kYXRlKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS50b0RhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJzKHNlbGVjdGlvbjogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpIHtcclxuICAgIHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcbiAgICB0aGlzLnVwZGF0ZVByaW1hcnlDYWxlbmRhcihzZWxlY3Rpb24pO1xyXG4gICAgLy8gT25seSBzaGlmdCB0aGUgcHJpbWFyeSBjYWxlbmRhciBpZiB3ZSdyZSBzaG93aW5nIHRoZSBzZWNvbmRhcnkgY2FsZW5kYXJcclxuICAgIHRoaXMudXBkYXRlU2Vjb25kYXJ5Q2FsZW5kYXIoc2VsZWN0aW9uLCB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlDYWxlbmRhcik7XHJcblxyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVByaW1hcnlDYWxlbmRhcihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsLCBzaGlmdFNlY29uZGFyeTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFByaW1hcnlDYWxlbmRhclZpZXcoc2VsZWN0aW9uLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSwgdGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3KTtcclxuXHJcbiAgICAvLyBXaGVuIGVudGVyaW5nIGEgZGF0ZSBpbnRvIHRoZSBmaXJzdCB0ZXh0Ym94LCB3ZSByZWFsbHkgb25seSB3YW50IHRvIHVwZGF0ZSB0aGUgcHJpbWFyeSBjYWxlbmRhci5cclxuICAgIC8vIEhvd2V2ZXIsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgbmV3IGRhdGUgaXMgYWZ0ZXIgdGhlIHNlY29uZGFyeSBjYWxlbmRhcidzIGRhdGUuIEluIHRoaXMgY2FzZSxcclxuICAgIC8vIFdlIHdhbnQgdG8gc2hpZnQgdGhlIHNlY29uZGFyeSBjYWxlbmRhciBzbyB0aGUgY2FsZW5kYXJzIHN0YXkgaW4gb3JkZXIuXHJcbiAgICBpZiAoc2hpZnRTZWNvbmRhcnkgJiYgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcpIHtcclxuICAgICAgaWYgKG1vbWVudCh0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcuZGF0ZSkuaXNTYW1lT3JBZnRlcih0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldy5kYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgIGxldCBuZXdTZWNvbmRhcnlEYXRlID0gbW9tZW50KHRoaXMucHJpbWFyeUNhbGVuZGFyVmlldy5kYXRlKS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XHJcbiAgICAgICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUsIGRhdGU6IG5ld1NlY29uZGFyeURhdGUgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWNvbmRhcnlDYWxlbmRhcihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsLCBzaGlmdFByaW1hcnk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFNlY29uZGFyeUNhbGVuZGFyVmlldyhzZWxlY3Rpb24sIHRoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlLCB0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldyk7XHJcblxyXG4gICAgLy8gV2hlbiBlbnRlcmluZyBhIGRhdGUgaW50byB0aGUgc2Vjb25kIHRleHRib3gsIHdlIHJlYWxseSBvbmx5IHdhbnQgdG8gdXBkYXRlIHRoZSBzZWNvbmRhcnkgY2FsZW5kYXIuXHJcbiAgICAvLyBIb3dldmVyLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIG5ldyBkYXRlIGlzIGJlZm9yZSB0aGUgcHJpbWFyeSBjYWxlbmRhcidzIGRhdGUuIEluIHRoaXMgY2FzZSxcclxuICAgIC8vIFdlIHdhbnQgdG8gc2hpZnQgdGhlIHByaW1hcnkgY2FsZW5kYXIgc28gdGhlIGNhbGVuZGFycyBzdGF5IGluIG9yZGVyLlxyXG4gICAgaWYgKHNoaWZ0UHJpbWFyeSAmJiB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcpIHtcclxuICAgICAgaWYgKG1vbWVudCh0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcuZGF0ZSkuaXNTYW1lT3JBZnRlcih0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldy5kYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgIGxldCBuZXdQcmltYXJ5RGF0ZSA9IG1vbWVudCh0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldy5kYXRlKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKTtcclxuICAgICAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUsIGRhdGU6IG5ld1ByaW1hcnlEYXRlIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3RlcHBlcnModmFsdWU6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKSB7XHJcbiAgICAvLyBEaXNhYmxlIHRoZSBzdGVwcGVycyBpZiB3ZSBlaXRoZXIgZG9uJ3QgaGF2ZSBhIHNlbGVjdGlvbiBvciBvbmx5IGhhdmUgb25lIGRhdGUgaW4gdGhlIHNlbGVjdGlvbi5cclxuICAgIGlmIChcclxuICAgICAgIXZhbHVlIHx8XHJcbiAgICAgIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKHZhbHVlKSAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgIT09ICdkYXknKSB8fFxyXG4gICAgICAoRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2UodmFsdWUpICYmICghdmFsdWUuc3RhcnQgfHwgIXZhbHVlLmVuZCkpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5kaXNhYmxlU3RlcHBlcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlU3RlcHBlcnMgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVUZXh0Ym94ZXMoKSB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveDtcclxuICAgIGNvbnN0IGNvbnRyb2wyID0gdGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveDI7XHJcblxyXG4gICAgLy8gVGhlIGZpcnN0IHRleHRib3ggc2hvdWxkIG9ubHkgaGF2ZSB0aGUgcmVxdWlyZWQgZXJyb3IgaWYgaXQncyBlbXB0eSBhbmQgdGhlIGRhdGUgaW5wdXQgaXMgcmVxdWlyZWQsXHJcbiAgICAvLyBvciBpZiB0aGUgZGF0ZSBpbnB1dCBpcyBub3QgcmVxdWlyZWQgYW5kIHRoZSBzZWNvbmQgY29udHJvbCBpcyB2aXNpYmxlIGFuZCBoYXMgYSB2YWx1ZSAobWVhbmluZyBhIHBhcnRpYWwgcmFuZ2UpXHJcbiAgICBpZiAoXHJcbiAgICAgICFjb250cm9sLnZhbHVlICYmXHJcbiAgICAgICh0aGlzLnJlcXVpcmVkIHx8IChjb250cm9sMi52YWx1ZSAmJiB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlUZXh0Ym94KSlcclxuICAgICkge1xyXG4gICAgICBjb250cm9sLnNldEVycm9ycyh7IHJlcXVpcmVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gVGhlIHNhbWUgaWRlYSBhcHBsaWVzIHRvIHRoZSBzZWNvbmQgdGV4dGJveCwgYnV0IG9ubHkgaWYgaXQncyB2aXNpYmxlXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2hvd1NlY29uZGFyeVRleHRib3ggJiZcclxuICAgICAgIWNvbnRyb2wyLnZhbHVlICYmXHJcbiAgICAgICh0aGlzLnJlcXVpcmVkIHx8IGNvbnRyb2wudmFsdWUpXHJcbiAgICApIHtcclxuICAgICAgY29udHJvbDIuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZURhdGVTdHJpbmcoY29udHJvbC52YWx1ZSk7XHJcbiAgICAgIGlmIChlcnJvcnMpIHtcclxuICAgICAgICBjb250cm9sLnNldEVycm9ycyhlcnJvcnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRyb2wyLnZhbHVlICYmIHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2hvd1NlY29uZGFyeVRleHRib3gpIHtcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZURhdGVTdHJpbmcoY29udHJvbDIudmFsdWUpO1xyXG4gICAgICBpZiAoZXJyb3JzKSB7XHJcbiAgICAgICAgY29udHJvbDIuc2V0RXJyb3JzKGVycm9ycyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVEYXRlU3RyaW5nKGRhdGU6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5wYXJzZVN0cmluZyhkYXRlLCB0aGlzLnBhcnNlRm9ybWF0cyk7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgLy8gV2UncmUgdXNpbmcgdGhlIHZpZXcgbW9kZSBhcyB0aGUgZ3JhbnVsYXJpdHkuIFdlIGRvbid0IHdhbnQgdG8gaW52YWxpZGF0ZVxyXG4gICAgICAvLyB0aGUgZGF0ZSBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgaGF2ZSBhIG1vbnRoL3F1YXJ0ZXIveWVhciBzZWxlY3RlZCBhbmQgdGhlIG1pblxyXG4gICAgICAvLyBvciBtYXggZGF0ZSBpcyBzb21ld2hlcmUgd2l0aGluIHRoYXQgbW9udGgvcXVhcnRlci95ZWFyLlxyXG4gICAgICBpZiAobW9tZW50KHZhbHVlKS5pc0JlZm9yZSh0aGlzLm1pbkRhdGUsIHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgbWluRGF0ZTogeyBtaW5WYWx1ZTogdGhpcy5taW5EYXRlIH0gfTtcclxuICAgICAgfSBlbHNlIGlmIChtb21lbnQodmFsdWUpLmlzQWZ0ZXIodGhpcy5tYXhEYXRlLCB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNlbGVjdGlvblZpZXdNb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB7IG1heERhdGU6IHsgbWF4VmFsdWU6IHRoaXMubWF4RGF0ZSB9IH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGxhYmVsICpuZ0lmPVwibGFiZWxcIj5cclxuICA8c3Bhbj57e2xhYmVsIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDAgJiYgZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWRcIj4mbmJzcDt7e3ZhbGlkYXRpb25FcnJvcnN9fTwvc3Bhbj5cclxuICA8ZWMtaGVscC1wb3BvdmVyIGlkPVwie3tpZH19X2hlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWlubGluZS1ibG9jayBteS1uMyBteC1uMVwiXHJcbiAgICAgICAgICAgICAgICAgICB0ZXh0PVwie3toZWxwUG9wb3ZlciB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb3NpdGlvbj1cInt7aGVscFBvcG92ZXJQb3NpdGlvbn19XCI+XHJcbiAgPC9lYy1oZWxwLXBvcG92ZXI+XHJcbjwvbGFiZWw+XHJcblxyXG48ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgW2VjS2V5Ym9hcmROYXZDb250YWluZXJdPVwiaXNDYWxlbmRhck9wZW5cIlxyXG4gICAgICNjb250cm9scz1cImVjS2V5Ym9hcmROYXZDb250YWluZXJcIlxyXG4gICAgIChmb2N1c091dEVuZCk9XCJvbkNvbnRyb2xzRm9jdXNPdXRFbmQoKVwiPlxyXG4gIDxlYy1mb3JtLWNvbnRyb2wgaWQ9XCJ7e2lkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgIFtwZW5kaW5nXT1cInBlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgIChhY3Rpb25DbGlja2VkKT1cImlzQ2FsZW5kYXJPcGVuID0gIWlzQ2FsZW5kYXJPcGVuXCJcclxuICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgYWN0aW9uSWNvbj1cImljb24tZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICBjZGtPdmVybGF5T3JpZ2luXHJcbiAgICAgICAgICAgICAgICAgICAjb3ZlcmxheU9yaWdpbj1cImNka092ZXJsYXlPcmlnaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDJyZW07XCI+XHJcbiAgICA8aW5wdXQgaWQ9XCJ7e2lkfX1faW5wdXRcIlxyXG4gICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInRleHRib3hHcm91cC5nZXQoJ3RleHRib3gnKVwiXHJcbiAgICAgICAgICAgKGJsdXIpPVwib25UZXh0Ym94Qmx1cigpXCI+XHJcbiAgPC9lYy1mb3JtLWNvbnRyb2w+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25TdHJhdGVneS5zaG93U2Vjb25kYXJ5VGV4dGJveFwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJmbGV4LXNocmluayBteC0xXCI+Jm5kYXNoOzwvc3Bhbj5cclxuICAgIDxlYy1mb3JtLWNvbnRyb2wgaWQ9XCJ7e2lkfX1fY29udHJvbDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtwZW5kaW5nXT1cInBlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2tlZCk9XCJpc0NhbGVuZGFyT3BlbiA9ICFpc0NhbGVuZGFyT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICBhY3Rpb25JY29uPVwiaWNvbi1kYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogMnJlbTtcIj5cclxuICAgICAgPGlucHV0IGlkPVwie3tpZH19X2lucHV0MlwiXHJcbiAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGV4dGJveEdyb3VwLmdldCgndGV4dGJveDInKVwiXHJcbiAgICAgICAgICAgICAoYmx1cik9XCJvblRleHRib3gyQmx1cigpXCI+XHJcbiAgICA8L2VjLWZvcm0tY29udHJvbD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImVuYWJsZVN0ZXBwZXJzXCJcclxuICAgICAgIGNsYXNzPVwiY29udHJvbC1ncm91cCBtbC0yXCI+XHJcbiAgICA8ZWMtYnV0dG9uIGlkPVwie3tpZH19X3ByZXZpb3VzU2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgIGljb249XCJpY29uLWFuZ2xlLWRvd24gcm90YXRlLTkwXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwicHJldmlvdXNTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NhbGVuZGFyT3BlbiB8fCBkaXNhYmxlU3RlcHBlcnMgfHwgZm9ybU1vZGVsPy5kaXNhYmxlZFwiPlxyXG4gICAgPC9lYy1idXR0b24+XHJcbiAgICA8ZWMtYnV0dG9uIGlkPVwie3tpZH19X25leHRTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICB0eXBlPVwic2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgaWNvbj1cImljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwibmV4dFNlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQ2FsZW5kYXJPcGVuIHx8IGRpc2FibGVTdGVwcGVycyB8fCBmb3JtTW9kZWw/LmRpc2FibGVkXCI+XHJcbiAgICA8L2VjLWJ1dHRvbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGVjLWJ1dHRvbiAqbmdJZj1cInF1aWNrU2VsZWN0RGF0ZVwiXHJcbiAgICAgICAgICAgICBpZD1cInt7aWR9fV9xdWlja1NlbGVjdFwiXHJcbiAgICAgICAgICAgICBpY29uPVwiaWNvbi1kYXlcIlxyXG4gICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICB0aXRsZT1cInt7J0RhdGVJbnB1dF9MYXRlc3REYXRhQXZhaWxhYmxlVGl0bGUnIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgKGNsaWNrZWQpPVwiZ29Ub1F1aWNrU2VsZWN0RGF0ZSgpXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiPlxyXG4gIDwvZWMtYnV0dG9uPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSBjZGtDb25uZWN0ZWRPdmVybGF5XHJcbiAgICAgICAgICAgICAjb3ZlcmxheT1cImNka0Nvbm5lY3RlZE92ZXJsYXlcIlxyXG4gICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwib3ZlcmxheU9yaWdpblwiXHJcbiAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNDYWxlbmRhck9wZW5cIlxyXG4gICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneV09XCJvdmVybGF5U2Nyb2xsU3RyYXRlZ3lcIlxyXG4gICAgICAgICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVBhbmVsQ2xhc3M9XCJteS0xXCJcclxuICAgICAgICAgICAgIChvdmVybGF5T3V0c2lkZUNsaWNrKT1cIm9uT3ZlcmxheU91dHNpZGVDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChkZXRhY2gpPVwiaXNDYWxlbmRhck9wZW4gPSBmYWxzZVwiPlxyXG4gIDxhcnRpY2xlIGlkPVwie3tpZH19X2RhdGVQaWNrZXJcIlxyXG4gICAgICAgICAgIGNsYXNzPVwiY2FyZCBkLWZsZXhcIlxyXG4gICAgICAgICAgIFtlY0tleWJvYXJkTmF2Q29udGFpbmVyXT1cImlzQ2FsZW5kYXJPcGVuXCJcclxuICAgICAgICAgICAjY2FsZW5kYXI9XCJlY0tleWJvYXJkTmF2Q29udGFpbmVyXCJcclxuICAgICAgICAgICAoZm9jdXNPdXRTdGFydCk9XCJvbkNhbGVuZGFyRm9jdXNPdXRTdGFydCgpXCJcclxuICAgICAgICAgICAoZm9jdXNPdXRFbmQpPVwib25DYWxlbmRhckZvY3VzT3V0RW5kKClcIj5cclxuICAgIDx1bCAqbmdJZj1cInNlbGVjdGlvbk1vZGVPcHRpb25zLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgIGNsYXNzPVwic2VsZWN0aW9uLW1vZGUtbWVudSBib3JkZXItcmlnaHQgcC0xXCI+XHJcbiAgICAgIDxsaSAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGlvbk1vZGVPcHRpb25zXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBpZD1cInt7aWR9fV9zZWxlY3Rpb25Nb2RlX3t7b3B0aW9ufX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktMVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwib3B0aW9uID09PSBzZWxlY3Rpb25Nb2RlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdGlvbk1vZGVDaGFuZ2Uob3B0aW9uKVwiPlxyXG4gICAgICAgICAge3snRGF0ZUlucHV0U2VsZWN0aW9uTW9kZV8nICsgb3B0aW9uIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcblxyXG4gICAgPGRpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgIDxlYy1jYWxlbmRhciBpZD1cInt7aWR9fV9jYWxlbmRhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFt2aWV3XT1cInByaW1hcnlDYWxlbmRhclZpZXdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAodmlld0NoYW5nZSk9XCJvblByaW1hcnlDYWxlbmRhclZpZXdDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uXT1cImNhbGVuZGFyU2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGRhdGVTZWxlY3RlZCk9XCJvbkNhbGVuZGFyRGF0ZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwic2VsZWN0aW9uU3RyYXRlZ3kuc2hvd1NlY29uZGFyeUNhbGVuZGFyID8gcHJpbWFyeUNhbGVuZGFyTWF4RGF0ZSA6IG1heERhdGVcIj5cclxuICAgICAgICA8L2VjLWNhbGVuZGFyPlxyXG5cclxuICAgICAgICA8ZWMtY2FsZW5kYXIgKm5nSWY9XCJzZWxlY3Rpb25TdHJhdGVneS5zaG93U2Vjb25kYXJ5Q2FsZW5kYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBpZD1cInt7aWR9fV9zZWNvbmRhcnlDYWxlbmRhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFt2aWV3XT1cInNlY29uZGFyeUNhbGVuZGFyVmlld1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICh2aWV3Q2hhbmdlKT1cIm9uU2Vjb25kYXJ5Q2FsZW5kYXJWaWV3Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJjYWxlbmRhclNlbGVjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChkYXRlU2VsZWN0ZWQpPVwib25DYWxlbmRhckRhdGVTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwic2Vjb25kYXJ5Q2FsZW5kYXJNaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiPlxyXG4gICAgICAgIDwvZWMtY2FsZW5kYXI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGZvb3RlciAqbmdJZj1cInNlbGVjdGlvblN0cmF0ZWd5LnNlbGVjdGlvblZpZXdNb2RlID09PSAnZGF5J1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIG15LTIgZC1mbGV4XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBpZD1cInt7aWR9fV90b2RheV9idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgZWNMaW5rQnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLWF1dG8gZC1pbmxpbmUtYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9Ub2RheSgpXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxLjc1cmVtO1wiPlxyXG4gICAgICAgICAge3snVG9kYXknIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9mb290ZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2FydGljbGU+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
464
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvZGF0ZS1pbnB1dC9kYXRlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9kYXRlLWlucHV0L2RhdGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBYyxXQUFXLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLFdBQVcsRUFBcUIsU0FBUyxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRL0MsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGVBQWU7SUFxRXJELFlBQ1ksd0JBQWtELEVBQ2xELGVBQWdDLEVBQ2xDLHFCQUE0QyxFQUM1QyxFQUFjLEVBQ2QsY0FBdUIsRUFDdkIsbUJBQWtEO1FBRTFELEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxlQUFlLENBQUMsQ0FBQztRQVB2Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELG9CQUFlLEdBQWYsZUFBZSxD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cEI1Qyx5ek1BZ0pBOzs0RkQxSGEsa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLGVBQWUsYUFHZCxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQzswUEFLMUIsRUFBRTtzQkFEakIsV0FBVzt1QkFBQyxTQUFTOztzQkFDckIsS0FBSztnQkFHVSxTQUFTO3NCQUF4QixLQUFLO2dCQUVVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFNRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBdUNpQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0UsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUdDLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0Nvbm5lY3RlZE92ZXJsYXksIE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtQ29udHJvbFN0YXR1cywgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBLZXlib2FyZE5hdkNvbnRhaW5lckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL3B1YmxpYy1hcGknO1xyXG5pbXBvcnQgeyBEYXRlVGltZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvZGF0ZS10aW1lLWhlbHBlcic7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXBIZWxwZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZm9ybS1ncm91cC5oZWxwZXInO1xyXG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvdXNlci1wcmVmZXJlbmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLnR5cGVzJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xCYXNlIH0gZnJvbSAnLi4vZm9ybS1jb250cm9sLWJhc2UnO1xyXG5pbXBvcnQgeyBEYXRlSW5wdXRTZWxlY3Rpb25TdHJhdGVneUJhc2UgfSBmcm9tICcuL2RhdGUtaW5wdXQtc2VsZWN0aW9uLXN0cmF0ZWdpZXMvZGF0ZS1pbnB1dC1zZWxlY3Rpb24tc3RyYXRlZ3ktYmFzZSc7XHJcbmltcG9ydCB7IERhdGVJbnB1dCB9IGZyb20gJy4vZGF0ZS1pbnB1dC50eXBlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLWRhdGUtaW5wdXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbRGF0ZUlucHV0LlNlbGVjdGlvblN0cmF0ZWdpZXNdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXHJcbiAgQElucHV0KCkgcHVibGljIGlkOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgZm9ybS4gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZm9ybU1vZGVsOiBEYXRlSW5wdXQuRm9ybU1vZGVsID0gbmV3IEZvcm1Db250cm9sKG51bGwpO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgbWluRGF0ZTogRGF0ZSA9IERhdGVUaW1lSGVscGVyLm1pbkRhdGVQaWNrZXJEYXRlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBtYXhEYXRlOiBEYXRlID0gRGF0ZVRpbWVIZWxwZXIubWF4RGF0ZVBpY2tlckRhdGU7XHJcblxyXG4gIC8qKiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24gbW9kZSBmb3IgdGhlIGNhbGVuZGFyLiBEZWZhdWx0cyB0byBkYXkgaWYgbm90IHByb3ZpZGVkICovXHJcbiAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogRGF0ZUlucHV0LlNlbGVjdGlvbk1vZGUgPSAnZGF5JztcclxuXHJcbiAgLyoqIFRoZSBhdmFpbGFibGUgc2VsZWN0aW9uIG1vZGVzIGZvciB0aGUgY2FsZW5kYXIuIERlZmF1bHRzIHRvIG9ubHkgdGhlIGluaXRpYWwgc2VsZWN0aW9uIG1vZGUgaWYgbm90IHByb3ZpZGVkLiAgKi9cclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlT3B0aW9uczogRGF0ZUlucHV0LlNlbGVjdGlvbk1vZGVbXSA9IFsnZGF5J107XHJcblxyXG4gIC8qKiBcclxuICAgKiBXaGVuIGEgZGF0ZSBpcyBwcm92aWRlZCwgZW5hYmxlcyB0aGUgJ3F1aWNrIHNlbGVjdCcgYnV0dG9uLlxyXG4gICAqIENsaWNraW5nIHRoZSBidXR0b24gd2lsbCBzaGlmdCB0aGUgc2VsZWN0ZWQgZGF0ZSByYW5nZSB0byB0aGUgcHJvdmlkZWQgZGF0ZS5cclxuICAgKi9cclxuICBASW5wdXQoKSBxdWlja1NlbGVjdERhdGU/OiBEYXRlO1xyXG5cclxuICAvKiogRW5hYmxlcyB0aGUgbmV4dC9wcmV2aW91cyBzZWxlY3Rpb24gYnV0dG9ucy4gKi9cclxuICBASW5wdXQoKSBlbmFibGVTdGVwcGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogVGhlIGZvcm0gZ3JvdXAgZm9yIHRoZSBpbnRlcm5hbCB0ZXh0Ym94ZXMuIFRleHRib3gyIGlzIG9ubHkgdXNlZCBmb3IgcmFuZ2VzLiAqL1xyXG4gIHB1YmxpYyB0ZXh0Ym94R3JvdXA6IERhdGVJbnB1dC5UZXh0Ym94R3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIHRleHRib3g6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKSxcclxuICAgIHRleHRib3gyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbClcclxuICB9KTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgY2FsZW5kYXIgc2VsZWN0aW9uLlxyXG4gICAqIFVwZGF0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBjYWxlbmRhciBpdGVtIG9yIHdoZW4gdGhlIGRhdGUgZW50ZXJlZCBpbnRvIHRoZSB0ZXh0Ym94IGlzIHBhcnNlZC5cclxuICAgKi9cclxuICBwdWJsaWMgY2FsZW5kYXJTZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGNhbGVuZGFyIG92ZXJsYXkgaXMgb3BlbiBvciBub3QuICovXHJcbiAgcHVibGljIGlzQ2FsZW5kYXJPcGVuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBQbGFjZWhvbGRlciBmb3IgdGhlIHRleHRib3guIFVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgdXNlcidzIGRhdGUgZGlzcGxheSBwcmVmZXJlbmNlLiAqL1xyXG4gIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ01NL0REL1lZWVknO1xyXG5cclxuICAvKiogT3ZlcmxheSBzY3JvbGwgc3RyYXRlZ3kgZm9yIHRoZSBjYWxlbmRhciBvdmVybGF5LiBDbG9zZXMgdGhlIGNhbGVuZGFyIG9uIHNjcm9sbC4gKi9cclxuICBwdWJsaWMgb3ZlcmxheVNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5U2VydmljZS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKCk7XHJcblxyXG4gIHB1YmxpYyBwcmltYXJ5Q2FsZW5kYXJWaWV3OiBDYWxlbmRhci5WaWV3ID0geyBtb2RlOiAnZGF5JywgZGF0ZTogbmV3IERhdGUoKSB9O1xyXG4gIHB1YmxpYyBzZWNvbmRhcnlDYWxlbmRhclZpZXc6IENhbGVuZGFyLlZpZXcgPSB7IG1vZGU6ICdkYXknLCBkYXRlOiBuZXcgRGF0ZSgpIH07XHJcblxyXG4gIHB1YmxpYyBwcmltYXJ5Q2FsZW5kYXJNYXhEYXRlOiBEYXRlID0gRGF0ZVRpbWVIZWxwZXIubWF4RGF0ZVBpY2tlckRhdGU7XHJcbiAgcHVibGljIHNlY29uZGFyeUNhbGVuZGFyTWluRGF0ZTogRGF0ZSA9IERhdGVUaW1lSGVscGVyLm1pbkRhdGVQaWNrZXJEYXRlO1xyXG5cclxuICBwdWJsaWMgZGlzYWJsZVN0ZXBwZXJzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBzZWxlY3Rpb25TdHJhdGVneSE6IERhdGVJbnB1dFNlbGVjdGlvblN0cmF0ZWd5QmFzZTtcclxuXHJcbiAgLyoqIFxyXG4gICAqIERhdGUgcGFyc2luZyBmb3JtYXRzIGZvciB1c2VyLWVudGVyZWQgZGF0ZXMuIERlZmF1bHRzIHRvIG1vbnRoLWZpcnN0IGZvcm1hdHMsIGJ1dCBpcyB1cGRhdGVkIGluIG9uSW5pdFxyXG4gICAqIHRvIHVzZSB0aGUgdXNlcidzIHByZWZlcnJlZCBkYXRlIGZvcm1hdC5cclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlRm9ybWF0czogc3RyaW5nW10gPSBEYXRlVGltZUhlbHBlci5nZXRNb21lbnRQYXJzZUZvcm1hdHMoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXInKSBjYWxlbmRhcj86IEtleWJvYXJkTmF2Q29udGFpbmVyRGlyZWN0aXZlO1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRyb2xzJykgY29udHJvbHM/OiBLZXlib2FyZE5hdkNvbnRhaW5lckRpcmVjdGl2ZTtcclxuXHJcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgb3ZlcmxheSBkaXJlY3RpdmUgKHNlZSB0ZW1wbGF0ZSkuIFVzZWQgdG8gdXBkYXRlIHRoZSBvdmVybGF5IHBvc2l0aW9uIG9uIHZhbGlkYXRpb24gY2hhbmdlcy4gKi9cclxuICBAVmlld0NoaWxkKCdvdmVybGF5Jykgb3ZlcmxheT86IENka0Nvbm5lY3RlZE92ZXJsYXk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRpb25NZXNzYWdlU2VydmljZTogVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGZvcm1Hcm91cEhlbHBlcjogRm9ybUdyb3VwSGVscGVyLFxyXG4gICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZVNlcnZpY2U6IFVzZXJQcmVmZXJlbmNlU2VydmljZSxcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TdHJhdGVnaWVzOiBEYXRlSW5wdXQuU2VsZWN0aW9uU3RyYXRlZ2llc1xyXG4gICkge1xyXG4gICAgc3VwZXIodmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlLCBmb3JtR3JvdXBIZWxwZXIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMuc2VsZWN0aW9uTW9kZSAmJiAhY2hhbmdlcy5zZWxlY3Rpb25Nb2RlLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLm9uU2VsZWN0aW9uTW9kZUNoYW5nZSh0aGlzLnNlbGVjdGlvbk1vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBTZXR1cFxyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIHRoaXMuc2V0RGF0ZUZvcm1hdHMoKTtcclxuICAgIHRoaXMuc2V0U2VsZWN0aW9uTW9kZSh0aGlzLnNlbGVjdGlvbk1vZGUpO1xyXG5cclxuICAgIC8vIFN1YnNjcmlwdGlvbnNcclxuICAgIHRoaXMub25Gb3JtTW9kZWxTdGF0dXNDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLm9uRm9ybU1vZGVsVmFsdWVDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLm9uVGV4dGJveFZhbHVlQ2hhbmdlcygpO1xyXG5cclxuICAgIC8vIFN5bmMgdGhlIGluaXRpYWwgZGlzYWJsZWQgc3RhdHVzIGFuZCB2YWx1ZSBvZiB0aGUgdGV4dGJveFxyXG4gICAgdGhpcy5zeW5jVGV4dGJveENvbnRyb2xEaXNhYmxlZFN0YXR1cyh0aGlzLmZvcm1Nb2RlbC5zdGF0dXMpO1xyXG4gICAgY29uc3QgaW5pdGlhbERpc3BsYXlWYWx1ZSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZm9ybWF0U2VsZWN0aW9uKHRoaXMuZm9ybU1vZGVsLnZhbHVlKTtcclxuICAgIHRoaXMudGV4dGJveEdyb3VwLnBhdGNoVmFsdWUoaW5pdGlhbERpc3BsYXlWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uIGFuZCB2aWV3IGJhc2VkIG9uIHRoZSBpbml0aWFsIGZvcm0gbW9kZWwgdmFsdWVcclxuICAgIHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24gPSB0aGlzLmZvcm1Nb2RlbC52YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy51cGRhdGVTdGVwcGVycyh0aGlzLmNhbGVuZGFyU2VsZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2N1c2VzIHRoZSBpbnB1dCB3aGVuZXZlciB0aGUgY2FsZW5kYXIgaXMgc2hpZnQtdGFiYmVkIG91dCBvZi4gKi9cclxuICBwdWJsaWMgb25DYWxlbmRhckZvY3VzT3V0U3RhcnQoKSB7XHJcbiAgICB0aGlzLmZvY3VzSW5wdXQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9zZXMgdGhlIGNhbGVuZGFyIGFuZCBmb2N1c2VzIHRoZSBpbnB1dCB3aGVuZXZlciB0aGUgY2FsZW5kYXIgaXMgdGFiYmVkIG91dCBvZi4gKi9cclxuICBwdWJsaWMgb25DYWxlbmRhckZvY3VzT3V0RW5kKCkge1xyXG4gICAgdGhpcy5pc0NhbGVuZGFyT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5mb2N1c0lucHV0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xvc2VzIHRoZSBjYWxlbmRhciBpZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgY2FsZW5kYXIgYW5kIGRhdGUgaW5wdXQuICovXHJcbiAgcHVibGljIG9uT3ZlcmxheU91dHNpZGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgLy8gRG8gbm90IGNsb3NlIHRoZSBjYWxlbmRhciBpZiB0aGUgY2xpY2sgd2FzIHdpdGhpbiB0aGUgZGF0ZSBpbnB1dCBvciBhY3Rpb24gYnV0dG9uXHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgY2xpY2tlZE91dHNpZGVDb250cm9sID0gZXZlbnQuY2xpZW50WSA8IHJlY3QudG9wIHx8XHJcbiAgICAgIGV2ZW50LmNsaWVudFkgPiByZWN0LmJvdHRvbSB8fFxyXG4gICAgICBldmVudC5jbGllbnRYIDwgcmVjdC5sZWZ0IHx8XHJcbiAgICAgIGV2ZW50LmNsaWVudFggPiByZWN0LnJpZ2h0O1xyXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSB1c2VyIGhpdCBlbnRlciBvbiB0aGUgYWN0aW9uIGJ1dHRvbiBpbnN0ZWFkIG9mIGNsaWNraW5nIHdpdGggdGhlIG1vdXNlLlxyXG4gICAgLy8gSW4gdGhpcyBjYXNlIHRoZSBcImNsaWNrXCIgZXZlbnQgd2lsbCBiZSBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQgYmVjYXVzZSB0aGUgY2xpZW50eCBhbmQgeSBhcmUgMCxcclxuICAgIC8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNsb3NlIGluIHRoaXMgY2FzZSBiZWNhdXNlIGJ1dHRvbiBjbGlja3MgdHJpZ2dlciBjYWxlbmRhciBvcGVuL2Nsb3NlIHNlcGFyYXRlbHkuXHJcbiAgICBjb25zdCB0YXJnZXRJZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5pZDtcclxuICAgIGNvbnN0IGlzQWN0aW9uQ2xpY2sgPSB0YXJnZXRJZCA9PT0gYCR7dGhpcy5pZH1fYWN0aW9uYCB8fCB0YXJnZXRJZCA9PT0gYCR7dGhpcy5pZH1fY29udHJvbDJfYWN0aW9uYDtcclxuXHJcbiAgICBpZiAoIWlzQWN0aW9uQ2xpY2sgJiYgY2xpY2tlZE91dHNpZGVDb250cm9sKSB7XHJcbiAgICAgIHRoaXMuaXNDYWxlbmRhck9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBJZiB0aGUgdXNlciB0YWJzIG91dCBvZiB0aGUgZm9ybSBjb250cm9sJ3MgYWN0aW9uIGJ1dHRvbiBhbmQgdGhlIGNhbGVuZGFyIGlzIG9wZW4sIGZvY3VzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBjYWxlbmRhciBvdmVybGF5ICovXHJcbiAgcHVibGljIG9uQ29udHJvbHNGb2N1c091dEVuZCgpIHtcclxuICAgIGlmICh0aGlzLmlzQ2FsZW5kYXJPcGVuKSB7XHJcbiAgICAgIHRoaXMuY2FsZW5kYXI/LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25UZXh0Ym94Qmx1cigpIHtcclxuICAgIC8vIFdlIHdhbnQgdG8gcHJldmVudCB0aGUgZml4ZWQgZGF0ZSByYW5nZSBtb2RlcyBmcm9tIHJlLWF1dG9jb21wbGV0aW5nIHRoZSBmaXJzdCB0ZXh0Ym94IHdoZW4gaXQgaXMgZXhwbGljaXRseSBjbGVhcmVkLlxyXG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IERhdGVJbnB1dC5pc1NlbGVjdGlvblJhbmdlKHRoaXMuZm9ybU1vZGVsLnZhbHVlKSA/IHRoaXMuZm9ybU1vZGVsLnZhbHVlLnN0YXJ0IDogdGhpcy5mb3JtTW9kZWwudmFsdWU7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnRleHRib3hHcm91cC52YWx1ZS50ZXh0Ym94O1xyXG4gICAgY29uc3QgY2xlYXJlZCA9ICEhcHJldmlvdXNWYWx1ZSAmJiAhY3VycmVudFZhbHVlO1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zID0geyBwcmV2ZW50QXV0b0NvbXBsZXRlOiBjbGVhcmVkIH07XHJcblxyXG4gICAgLy8gUGFyc2UgdGhlIHRleHRib3ggdmFsdWVzIGludG8gYSBzZWxlY3Rpb24gYW5kIHVwZGF0ZSB0aGUgZm9ybSBtb2RlbFxyXG4gICAgY29uc3QgcGFyc2VkU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5wYXJzZVRleHRib3hWYWx1ZXModGhpcy50ZXh0Ym94R3JvdXAudmFsdWUsIHRoaXMucGFyc2VGb3JtYXRzLCBvcHRpb25zKTtcclxuICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsKHBhcnNlZFNlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25UZXh0Ym94MkJsdXIoKSB7XHJcbiAgICAvLyBXZSB3YW50IHRvIHByZXZlbnQgdGhlIGZpeGVkIGRhdGUgcmFuZ2UgbW9kZXMgZnJvbSByZS1hdXRvY29tcGxldGluZyB0aGUgc2Vjb25kIHRleHRib3ggd2hlbiBpdCBpcyBleHBsaWNpdGx5IGNsZWFyZWQuXHJcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2UodGhpcy5mb3JtTW9kZWwudmFsdWUpID8gdGhpcy5mb3JtTW9kZWwudmFsdWUuZW5kIDogbnVsbDtcclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudGV4dGJveEdyb3VwLnZhbHVlLnRleHRib3gyO1xyXG4gICAgY29uc3QgY2xlYXJlZCA9ICEhcHJldmlvdXNWYWx1ZSAmJiAhY3VycmVudFZhbHVlO1xyXG4gICAgY29uc3Qgb3B0aW9uczogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zID0geyBwYXJzZUZyb21FbmQ6IHRydWUsIHByZXZlbnRBdXRvQ29tcGxldGU6IGNsZWFyZWQgfTtcclxuXHJcbiAgICAvLyBQYXJzZSB0aGUgdGV4dGJveCB2YWx1ZXMgaW50byBhIHNlbGVjdGlvbiBhbmQgdXBkYXRlIHRoZSBmb3JtIG1vZGVsLFxyXG4gICAgLy8gRm9yIHRoZSBzZWNvbmQgYm94IHdlJ3JlIGtleWluZyB0aGUgcGFyc2UgZnJvbSB0aGUgZW5kIGRhdGUgaW4gdGhlIHNlbGVjdGlvbi5cclxuICAgIGNvbnN0IHBhcnNlZFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kucGFyc2VUZXh0Ym94VmFsdWVzKHRoaXMudGV4dGJveEdyb3VwLnZhbHVlLCB0aGlzLnBhcnNlRm9ybWF0cywgb3B0aW9ucyk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbChwYXJzZWRTZWxlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU2VsZWN0aW9uTW9kZUNoYW5nZShtb2RlOiBEYXRlSW5wdXQuU2VsZWN0aW9uTW9kZSkge1xyXG4gICAgdGhpcy5zZXRTZWxlY3Rpb25Nb2RlKG1vZGUpO1xyXG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5nZXROZXdTZWxlY3Rpb25Gcm9tRXhpc3RpbmcodGhpcy5jYWxlbmRhclNlbGVjdGlvbik7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1Nb2RlbChuZXdTZWxlY3Rpb24pO1xyXG5cclxuICAgIC8vIE9uIHNlbGVjdGlvbiBtb2RlIGNoYW5nZSwgd2Ugd2FudCB0byBmb3JjZSB0aGUgY2FsZW5kYXJzIHRvIHNob3cgdGhlIHJpZ2h0IHZpZXcgbW9kZSBmb3IgdGhlIG5ldyBzZWxlY3Rpb24uXHJcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB1c2VyIGZyb20gc2VlaW5nIGEgdmlldyBtb2RlIHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlIGZvciB0aGUgbmV3IHNlbGVjdGlvbixcclxuICAgIC8vIExpa2Ugd2hlbiBzd2ljaGluZyBmcm9tIHllYXIgbW9kZSB0byBsYXN0IDcgZGF5cyBtb2RlLlxyXG4gICAgdGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3ID0geyBtb2RlOiB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNlbGVjdGlvblZpZXdNb2RlLCBkYXRlOiB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcuZGF0ZSB9O1xyXG4gICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUsIGRhdGU6IHRoaXMuc2Vjb25kYXJ5Q2FsZW5kYXJWaWV3LmRhdGUgfTtcclxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJNaW5NYXhEYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2FsZW5kYXJEYXRlU2VsZWN0ZWQoZGF0ZTogRGF0ZSkge1xyXG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5nZXRTZWxlY3Rpb25Gcm9tRGF0ZShkYXRlLCB0aGlzLmNhbGVuZGFyU2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZm9ybWF0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7XHJcbiAgICAvLyBEb24ndCBlbWl0IGV2ZW50cyB3aGVuIHBhdGNoaW5nIHZhbHVlcyBoZXJlLiBXZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgdGhlIGNhbGVuZGFyIHVwZGF0ZXMgc2luY2UgdGhlIGNhbGVuZGFyIGlzIGFscmVhZHlcclxuICAgIC8vIHNob3dpbmcgdGhlIHNlbGVjdGVkIGRhdGUuIFdlIGFsc28gZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHRoZSB0ZXh0Ym94IHBhcnNpbmcgbG9naWMgc2luY2UgdGhlIGRhdGUgd2FzIHNlbGVjdGVkIGZyb20gdGhlIGNhbGVuZGFyLlxyXG4gICAgdGhpcy50ZXh0Ym94R3JvdXAucGF0Y2hWYWx1ZShkaXNwbGF5VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuZm9ybU1vZGVsLnBhdGNoVmFsdWUobmV3U2VsZWN0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmNhbGVuZGFyU2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uO1xyXG4gICAgdGhpcy51cGRhdGVTdGVwcGVycyhuZXdTZWxlY3Rpb24pO1xyXG5cclxuICAgIC8vIENsb3NlIHRoZSBjYWxlbmRhciBpZiB0aGUgc2VsZWN0aW9uIG1vZGUgaXMgbm90IGEgcmFuZ2UgbW9kZSB3aGVyZSBlaXRoZXIgdGhlIHN0YXJ0IG9yIHRoZSBlbmQgZGF0ZSBjYW4gYmUgY2hhbmdlZC5cclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5zaG93U2Vjb25kYXJ5VGV4dGJveCkge1xyXG4gICAgICB0aGlzLmlzQ2FsZW5kYXJPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUHJpbWFyeUNhbGVuZGFyVmlld0NoYW5nZSh2aWV3OiBDYWxlbmRhci5WaWV3KSB7XHJcbiAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB2aWV3O1xyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWNvbmRhcnlDYWxlbmRhclZpZXdDaGFuZ2UodmlldzogQ2FsZW5kYXIuVmlldykge1xyXG4gICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB2aWV3O1xyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogU2hpZnRzIHRoZSBjYWxlbmRhciB2aWV3cyB0byBkaXNwbGF5IHRvZGF5LiBEb2VzIG5vdCB1cGRhdGUgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4gKi9cclxuICBwdWJsaWMgZ29Ub1RvZGF5KCkge1xyXG4gICAgLy8gSWYgYm90aCBjYWxlbmRhcnMgYXJlIHZpc2libGUsIHNob3cgdG9kYXkgaW4gdGhlIHNlY29uZGFyeSBjYWxlbmRhciBhbmQgdGhlIG1vbnRoIGJlZm9yZSBpbiB0aGUgcHJpbWFyeSBjYWxlbmRhci5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlDYWxlbmRhcikge1xyXG4gICAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6ICdkYXknLCBkYXRlOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKSB9O1xyXG4gICAgICB0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldyA9IHsgbW9kZTogJ2RheScsIGRhdGU6IG5ldyBEYXRlKCkgfTtcclxuICAgICAgLy8gSWYgd2UncmUgaW4gYSBzaW5nbGUgZGF0ZSBtb2RlLCBzaG93IHRvZGF5IGluIHRoZSBwcmltYXJ5IGNhbGVuZGFyLlxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3ID0geyBtb2RlOiAnZGF5JywgZGF0ZTogbmV3IERhdGUoKSB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ29Ub1F1aWNrU2VsZWN0RGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLnF1aWNrU2VsZWN0RGF0ZSkge1xyXG4gICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFNlbGVjdGlvbkZvclF1aWNrU2VsZWN0RGF0ZSh0aGlzLnF1aWNrU2VsZWN0RGF0ZSwgdGhpcy5jYWxlbmRhclNlbGVjdGlvbik7XHJcbiAgICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsKG5ld1NlbGVjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmV4dFNlbGVjdGlvbigpIHtcclxuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZ2V0TmV4dFNlbGVjdGlvbih0aGlzLmNhbGVuZGFyU2VsZWN0aW9uKTtcclxuICAgIHRoaXMudXBkYXRlRm9ybU1vZGVsKG5ld1NlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHJldmlvdXNTZWxlY3Rpb24oKSB7XHJcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFByZXZpb3VzU2VsZWN0aW9uKHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24pO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtTW9kZWwobmV3U2VsZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybU1vZGVsKHZhbHVlOiBEYXRlSW5wdXQuU2VsZWN0aW9uIHwgbnVsbCkge1xyXG4gICAgdGhpcy5mb3JtTW9kZWwucGF0Y2hWYWx1ZSh2YWx1ZSk7XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgdGhlIHRleHRib3hlcyBhbmQgc3luYyB0aGUgZm9ybSBlcnJvcnNcclxuICAgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcGF0Y2hpbmcgdGhlIGZvcm0gbW9kZWwgYmVjYXVzZSB0aGUgZm9ybSBtb2RlbCBwYXRjaCB3aWxsIHRyaWdnZXJcclxuICAgIC8vIHRoZSBkYXRlIGZvcm1hdHRpbmcgbG9naWMgYW5kIG92ZXJ3cml0ZSBhbnkgZXJyb3JzIG9uIHRoZSBjb250cm9scyBmcm9tIGJlZm9yZS5cclxuICAgIHRoaXMudmFsaWRhdGVUZXh0Ym94ZXMoKTtcclxuICAgIHRoaXMuc3luY0Zvcm1FcnJvcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Gb3JtTW9kZWxTdGF0dXNDaGFuZ2VzKCkge1xyXG4gICAgLy8gS2VlcCB0aGUgdGV4dGJveENvbnRyb2wgZGlzYWJsZWQgc3RhdHVzIGluIHN5bmMgd2l0aCB0aGUgZm9ybU1vZGVsXHJcbiAgICB0aGlzLmZvcm1Nb2RlbC5zdGF0dXNDaGFuZ2VzLnBpcGUoXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XHJcbiAgICAgIHRoaXMuc3luY1RleHRib3hDb250cm9sRGlzYWJsZWRTdGF0dXMoc3RhdHVzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzQ2FsZW5kYXJPcGVuKSB7XHJcbiAgICAgICAgLy8gQXMgdmFsaWRhdGlvbiBtZXNzYWdlcyBhcHBlYXIvZGlzYXBwZWFyLCB0aGUgZGF0ZSBpbnB1dCBtYXkgaGF2ZSBzaGlmdGVkIHVwIG9yIGRvd24gb24gdGhlIHBhZ2UuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBvdmVybGF5IHBvc2l0aW9uIHRvIGVuc3VyZSBpdCdzIHN0aWxsIGFsaWduZWQgd2l0aCB0aGUgdGV4dGJveCBhbmQgbm90IGJsb2NraW5nIGl0LlxyXG4gICAgICAgIC8vIFNldHRpbWVvdXQgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGUgb3ZlcmxheSBpcyBiZWluZyB1cGRhdGVkIGFmdGVyIHRoZSBtZXNzYWdlIGlzIHJlbmRlcmVkLlxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vdmVybGF5Py5vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Gb3JtTW9kZWxWYWx1ZUNoYW5nZXMoKSB7XHJcbiAgICAvLyBVcGRhdGUgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbiB0ZXh0Ym94IHZhbHVlIHdpdGggYSBmb3JtYXR0ZWQgZGF0ZSB3aGVuIHRoZSBmb3JtIG1vZGVsIGNoYW5nZXMuXHJcbiAgICAvLyBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBzZWxlY3RpbmcgYSBkYXRlIGZyb20gdGhlIGNhbGVuZGFyIG9yIHdoZW4gdGhlIHRleHRib3ggaXMgYmx1cnJlZC5cclxuICAgIHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuZm9ybWF0U2VsZWN0aW9uKHZhbHVlKTtcclxuICAgICAgLy8gRG9uJ3QgZW1pdCBhbiBldmVudCB3aGVuIHNldHRpbmcgdGhlIHRleHRib3ggdmFsdWUgdG8gYXZvaWQgY2lyY3VsYXIgdXBkYXRlcyBiZXR3ZWVuIHRoZSB0ZXh0Ym94IGFuZCBmb3JtIG1vZGVsLlxyXG4gICAgICB0aGlzLnRleHRib3hHcm91cC5wYXRjaFZhbHVlKGRpc3BsYXlWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycyh2YWx1ZSk7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RlcHBlcnModmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uVGV4dGJveFZhbHVlQ2hhbmdlcygpIHtcclxuICAgIC8vIFVwZGF0ZSB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uIHdoZW4gdGhlIHRleHRib3ggdmFsdWUgY2hhbmdlcyB0byB1cGRhdGUgdGhlIGNhbGVuZGFyLlxyXG4gICAgLy8gV2UgZG9uJ3QgcGF0Y2ggdGhlIGZvcm1Nb2RlbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHRoZVxyXG4gICAgLy8gZGF0ZSBmb3JtYXR0aW5nIGxvZ2ljIGFuZCBvdmVyd3JpdGUgdGhlIHVzZXIncyBpbnB1dC5cclxuICAgIC8vIFdlJ2xsIGRvIHRoYXQgd2hlbiB0aGUgdXNlciBibHVycyBvdXQgb2YgdGhlIHRleHRib3guIFNlZSBvblRleHRib3hCbHVyKClcclxuICAgIHRoaXMudGV4dGJveEdyb3VwLmNvbnRyb2xzLnRleHRib3gudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnM6IERhdGVJbnB1dC5QYXJzaW5nT3B0aW9ucyA9IHsgc2hpZnRUb0N1cnJlbnRZZWFySWZCZWxvdzogdGhpcy5taW5EYXRlIH07XHJcbiAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kucGFyc2VUZXh0Ym94VmFsdWVzKHRoaXMudGV4dGJveEdyb3VwLnZhbHVlLCB0aGlzLnBhcnNlRm9ybWF0cywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAvLyBDYWxlbmRhciBzZWxlY3Rpb24gd2lsbCBiZSBudWxsIGlmIHRoZSBkYXRlcyBhcmUgaW52YWxpZC4gRG9uJ3QgdXBkYXRlIHRoZSBjYWxlbmRhcnMgaW4gdGhpcyBjYXNlLlxyXG4gICAgICBpZiAobmV3U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjtcclxuICAgICAgICB0aGlzLnVwZGF0ZVByaW1hcnlDYWxlbmRhcih0aGlzLmNhbGVuZGFyU2VsZWN0aW9uLCB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlDYWxlbmRhcik7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFRoZSBzZWNvbmQgdGV4dGJveCBpcyBvbmx5IHVzZWQgaW4gbGFzdDdEYXlzLCBsYXN0MjhEYXlzLCBhbmQgcmFuZ2UgbW9kZXMuXHJcbiAgICB0aGlzLnRleHRib3hHcm91cC5jb250cm9scy50ZXh0Ym94Mi52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgZGVib3VuY2VUaW1lKDMwMCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9uczogRGF0ZUlucHV0LlBhcnNpbmdPcHRpb25zID0geyBzaGlmdFRvQ3VycmVudFllYXJJZkJlbG93OiB0aGlzLm1pbkRhdGUsIHBhcnNlRnJvbUVuZDogdHJ1ZSB9O1xyXG4gICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnBhcnNlVGV4dGJveFZhbHVlcyh0aGlzLnRleHRib3hHcm91cC52YWx1ZSwgdGhpcy5wYXJzZUZvcm1hdHMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgLy8gQ2FsZW5kYXIgc2VsZWN0aW9uIHdpbGwgYmUgbnVsbCBpZiB0aGUgZGF0ZXMgYXJlIGludmFsaWQuIERvbid0IHVwZGF0ZSB0aGUgY2FsZW5kYXJzIGluIHRoaXMgY2FzZS5cclxuICAgICAgaWYgKG5ld1NlbGVjdGlvbikge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247XHJcbiAgICAgICAgLy8gVGhlIHNlY29uZGFyeSBjYWxlbmRhciBpcyBvbmx5IHNob3duIGluIHJhbmdlIG1vZGUuIFVwZGF0ZSB0aGUgcHJpbWFyeSBjYWxlbmRhciBpZiB3ZSdyZSBub3QgaW4gcmFuZ2UgbW9kZS5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdHJhdGVneS5zaG93U2Vjb25kYXJ5Q2FsZW5kYXIpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2Vjb25kYXJ5Q2FsZW5kYXIodGhpcy5jYWxlbmRhclNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWFyeUNhbGVuZGFyKHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyTWluTWF4RGF0ZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNUZXh0Ym94Q29udHJvbERpc2FibGVkU3RhdHVzKHN0YXR1czogRm9ybUNvbnRyb2xTdGF0dXMpIHtcclxuICAgIC8vIFRoZSB0ZXh0Ym94IHNob3VsZCBvbmx5IGJlIGRpc2FibGVkIGlmIHRoZSBmb3JtIG1vZGVsIGlzIGRpc2FibGVkLlxyXG4gICAgLy8gQWxsIG90aGVyIHN0YXR1c2VzIGFyZSBjb25zaWRlcmVkIGVuYWJsZWQuXHJcbiAgICBpZiAoc3RhdHVzID09PSAnRElTQUJMRUQnICYmIHRoaXMudGV4dGJveEdyb3VwLmVuYWJsZWQpIHtcclxuICAgICAgdGhpcy50ZXh0Ym94R3JvdXAuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIGlmIChzdGF0dXMgIT09ICdESVNBQkxFRCcgJiYgdGhpcy50ZXh0Ym94R3JvdXAuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy50ZXh0Ym94R3JvdXAuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBzeW5jRm9ybUVycm9ycygpIHtcclxuICAgIC8vIFN0YXJ0IHdpdGggdGhlIGV4aXN0aW5nIGZvcm0gbW9kZWwgZXJyb3JzXHJcbiAgICBsZXQgZXJyb3JzID0gdGhpcy5mb3JtTW9kZWwuZXJyb3JzO1xyXG5cclxuICAgIC8vIEFkZCB0aGUgZXJyb3JzIGZyb20gdGhlIHRleHRib3hlcyBpZiB0aGV5IGV4aXN0XHJcbiAgICBpZiAodGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveC5lcnJvcnMpIHtcclxuICAgICAgZXJyb3JzID0geyAuLi5lcnJvcnMsIC4uLnRoaXMudGV4dGJveEdyb3VwLmNvbnRyb2xzLnRleHRib3guZXJyb3JzIH07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveDIuZXJyb3JzKSB7XHJcbiAgICAgIGVycm9ycyA9IHsgLi4uZXJyb3JzLCAuLi50aGlzLnRleHRib3hHcm91cC5jb250cm9scy50ZXh0Ym94Mi5lcnJvcnMgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyBlcnJvcnMgd2l0aCB0aGUgY29tYmluZWQgZXJyb3JzXHJcbiAgICB0aGlzLmZvcm1Nb2RlbC5zZXRFcnJvcnMoZXJyb3JzKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGZvcm0gbW9kZWwncyB0b3VjaGVkIGFuZCBkaXJ0eSBzdGF0dXMgYmFzZWQgb24gdGhlIHRleHRib3gncyBzdGF0dXMuXHJcbiAgICAvLyBTaW5jZSB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCBhIGNvbnRyb2wgdGhhdCBpcyBpbnRlcm5hbCB0byB0aGlzIGNvbXBvbmVudCwgdGhlXHJcbiAgICAvLyBmb3JtIG1vZGVsJ3Mgc3RhdHVzIHdvbid0IGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseS5cclxuICAgIGlmICh0aGlzLnRleHRib3hHcm91cC50b3VjaGVkICYmICF0aGlzLmZvcm1Nb2RlbC50b3VjaGVkKSB7XHJcbiAgICAgIHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRleHRib3hHcm91cC5kaXJ0eSAmJiAhdGhpcy5mb3JtTW9kZWwuZGlydHkpIHtcclxuICAgICAgdGhpcy5mb3JtTW9kZWwubWFya0FzRGlydHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBVcGRhdGVzIHRoZSBkYXRlIHBhcnNpbmcgZm9ybWF0cyBhbmQgcGxhY2Vob2xkZXIgYmFzZWQgb24gdGhlIHVzZXIncyBkaXNwbGF5IHByZWZlcmVuY2UuXHJcbiAgICogTk9URTogVGhpcyBpcyBhc3luYyBiZWNhdXNlIHdlJ3JlIHJldHJpZXZpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlcy4gV2UncmUgbm90IGF3YWl0aW5nIHRoZSByZXN1bHRcclxuICAgKiBiZWNhdXNlIHRoZSBvbmx5IGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiB0aGlzIGlzIHRoZSB0ZXh0IGJveCBkYXRlIHBhcnNpbmcgbG9naWMgYW5kIHBsYWNlaG9sZGVyLlxyXG4gICAqIE91ciBmb3JtcyBzaG91bGQgYWx3YXlzIGJlIGJlaGluZCBhIHBlbmRpbmcgb3ZlcmxheSwgc28gdGhlIHVzZXIgd29uJ3QgYmUgYWJsZSB0byBpbnRlcmFjdCB3aXRoIHRoZVxyXG4gICAqIGZvcm0gdW50aWwgdGhlIHVzZXIgaXMgbG9hZGVkIGFueXdheS5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHNldERhdGVGb3JtYXRzKCkge1xyXG4gICAgY29uc3QgeyBwcmVmZXJlbmNlIH0gPSBhd2FpdCBsYXN0VmFsdWVGcm9tKHRoaXMudXNlclByZWZlcmVuY2VTZXJ2aWNlLmdldFByZWZlcmVuY2VzKCkpO1xyXG4gICAgY29uc3QgZGF0ZUZvcm1hdCA9IHByZWZlcmVuY2U/LmRhdGVGb3JtYXQ7XHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gZGF0ZUZvcm1hdCA/PyB0aGlzLnBsYWNlaG9sZGVyO1xyXG4gICAgdGhpcy5wYXJzZUZvcm1hdHMgPSBEYXRlVGltZUhlbHBlci5nZXRNb21lbnRQYXJzZUZvcm1hdHMoZGF0ZUZvcm1hdCk7XHJcbiAgfVxyXG5cclxuICAvKiogRm9jdXNlcyB0aGUgZGF0ZSBpbnB1dC4gKi9cclxuICBwcml2YXRlIGZvY3VzSW5wdXQoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xzPy5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25Nb2RlKG1vZGU6IERhdGVJbnB1dC5TZWxlY3Rpb25Nb2RlKSB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBtb2RlO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25TdHJhdGVneSA9IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ2llc1ttb2RlXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIG1heCBkYXRlIGZvciB0aGUgcHJpbWFyeSBjYWxlbmRhciBhbmQgdGhlIG1pbiBkYXRlIGZvciB0aGUgc2Vjb25kYXJ5IGNhbGVuZGFyIGJhc2VkXHJcbiAgICogb24gdGhlIGN1cnJlbnQgdmlld3MgaW4gZWFjaC4gVGhpcyBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIG1vdmluZyB0aGUgY2FsZW5kYXJzIG91dCBvZiBvcmRlci5cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUNhbGVuZGFyTWluTWF4RGF0ZXMoKSB7XHJcbiAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgbWluL21heCBkYXRlcyB3aGVuIHRoZSB2aWV3IG1vZGUgaXMgJ2RheScuXHJcbiAgICAvLyBXaGVuIGEgY2FsZW5kYXIgaXMgaW4gYSBtb250aCBvciB5ZWFyIHZpZXcgbW9kZSwgdGhlIHZpZXcgZGF0ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgeWVhci5cclxuICAgIC8vIFRoaXMgd291bGQgY2F1c2UgdGhlIGRhdGVzIGluIHRoZSBvdGhlciBjYWxlbmRhciB0byBiZSB1bnNlbGVjdGFibGUgaWYgd2Ugd2VyZSB0b1xyXG4gICAgLy8gdXBkYXRlIHRoZSBtaW4vbWF4IGRhdGVzIGluIHRoZXNlIGNhc2VzLlxyXG4gICAgaWYgKHRoaXMucHJpbWFyeUNhbGVuZGFyVmlldz8ubW9kZSA9PT0gJ2RheScpIHtcclxuICAgICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhck1pbkRhdGUgPSBtb21lbnQodGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3Py5kYXRlKS5hZGQoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldz8ubW9kZSA9PT0gJ2RheScpIHtcclxuICAgICAgdGhpcy5wcmltYXJ5Q2FsZW5kYXJNYXhEYXRlID0gbW9tZW50KHRoaXMuc2Vjb25kYXJ5Q2FsZW5kYXJWaWV3Py5kYXRlKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS50b0RhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJzKHNlbGVjdGlvbjogRGF0ZUlucHV0LlNlbGVjdGlvbiB8IG51bGwpIHtcclxuICAgIHRoaXMuY2FsZW5kYXJTZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcbiAgICB0aGlzLnVwZGF0ZVByaW1hcnlDYWxlbmRhcihzZWxlY3Rpb24pO1xyXG4gICAgLy8gT25seSBzaGlmdCB0aGUgcHJpbWFyeSBjYWxlbmRhciBpZiB3ZSdyZSBzaG93aW5nIHRoZSBzZWNvbmRhcnkgY2FsZW5kYXJcclxuICAgIHRoaXMudXBkYXRlU2Vjb25kYXJ5Q2FsZW5kYXIoc2VsZWN0aW9uLCB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlDYWxlbmRhcik7XHJcblxyXG4gICAgdGhpcy51cGRhdGVDYWxlbmRhck1pbk1heERhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVByaW1hcnlDYWxlbmRhcihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsLCBzaGlmdFNlY29uZGFyeTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFByaW1hcnlDYWxlbmRhclZpZXcoc2VsZWN0aW9uLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSwgdGhpcy5wcmltYXJ5Q2FsZW5kYXJWaWV3KTtcclxuXHJcbiAgICAvLyBXaGVuIGVudGVyaW5nIGEgZGF0ZSBpbnRvIHRoZSBmaXJzdCB0ZXh0Ym94LCB3ZSByZWFsbHkgb25seSB3YW50IHRvIHVwZGF0ZSB0aGUgcHJpbWFyeSBjYWxlbmRhci5cclxuICAgIC8vIEhvd2V2ZXIsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgbmV3IGRhdGUgaXMgYWZ0ZXIgdGhlIHNlY29uZGFyeSBjYWxlbmRhcidzIGRhdGUuIEluIHRoaXMgY2FzZSxcclxuICAgIC8vIFdlIHdhbnQgdG8gc2hpZnQgdGhlIHNlY29uZGFyeSBjYWxlbmRhciBzbyB0aGUgY2FsZW5kYXJzIHN0YXkgaW4gb3JkZXIuXHJcbiAgICBpZiAoc2hpZnRTZWNvbmRhcnkgJiYgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcpIHtcclxuICAgICAgaWYgKG1vbWVudCh0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcuZGF0ZSkuaXNTYW1lT3JBZnRlcih0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldy5kYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgIGxldCBuZXdTZWNvbmRhcnlEYXRlID0gbW9tZW50KHRoaXMucHJpbWFyeUNhbGVuZGFyVmlldy5kYXRlKS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XHJcbiAgICAgICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUsIGRhdGU6IG5ld1NlY29uZGFyeURhdGUgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWNvbmRhcnlDYWxlbmRhcihzZWxlY3Rpb246IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsLCBzaGlmdFByaW1hcnk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5zZWNvbmRhcnlDYWxlbmRhclZpZXcgPSB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LmdldFNlY29uZGFyeUNhbGVuZGFyVmlldyhzZWxlY3Rpb24sIHRoaXMubWluRGF0ZSwgdGhpcy5tYXhEYXRlLCB0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldyk7XHJcblxyXG4gICAgLy8gV2hlbiBlbnRlcmluZyBhIGRhdGUgaW50byB0aGUgc2Vjb25kIHRleHRib3gsIHdlIHJlYWxseSBvbmx5IHdhbnQgdG8gdXBkYXRlIHRoZSBzZWNvbmRhcnkgY2FsZW5kYXIuXHJcbiAgICAvLyBIb3dldmVyLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIG5ldyBkYXRlIGlzIGJlZm9yZSB0aGUgcHJpbWFyeSBjYWxlbmRhcidzIGRhdGUuIEluIHRoaXMgY2FzZSxcclxuICAgIC8vIFdlIHdhbnQgdG8gc2hpZnQgdGhlIHByaW1hcnkgY2FsZW5kYXIgc28gdGhlIGNhbGVuZGFycyBzdGF5IGluIG9yZGVyLlxyXG4gICAgaWYgKHNoaWZ0UHJpbWFyeSAmJiB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcpIHtcclxuICAgICAgaWYgKG1vbWVudCh0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcuZGF0ZSkuaXNTYW1lT3JBZnRlcih0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldy5kYXRlLCAnbW9udGgnKSkge1xyXG4gICAgICAgIGxldCBuZXdQcmltYXJ5RGF0ZSA9IG1vbWVudCh0aGlzLnNlY29uZGFyeUNhbGVuZGFyVmlldy5kYXRlKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKTtcclxuICAgICAgICB0aGlzLnByaW1hcnlDYWxlbmRhclZpZXcgPSB7IG1vZGU6IHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUsIGRhdGU6IG5ld1ByaW1hcnlEYXRlIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3RlcHBlcnModmFsdWU6IERhdGVJbnB1dC5TZWxlY3Rpb24gfCBudWxsKSB7XHJcbiAgICAvLyBEaXNhYmxlIHRoZSBzdGVwcGVycyBpZiB3ZSBlaXRoZXIgZG9uJ3QgaGF2ZSBhIHNlbGVjdGlvbiBvciBvbmx5IGhhdmUgb25lIGRhdGUgaW4gdGhlIHNlbGVjdGlvbi5cclxuICAgIGlmIChcclxuICAgICAgIXZhbHVlIHx8XHJcbiAgICAgIChEYXRlSW5wdXQuaXNTZWxlY3Rpb25TaW5nbGVEYXRlKHZhbHVlKSAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgIT09ICdkYXknKSB8fFxyXG4gICAgICAoRGF0ZUlucHV0LmlzU2VsZWN0aW9uUmFuZ2UodmFsdWUpICYmICghdmFsdWUuc3RhcnQgfHwgIXZhbHVlLmVuZCkpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5kaXNhYmxlU3RlcHBlcnMgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlU3RlcHBlcnMgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVUZXh0Ym94ZXMoKSB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveDtcclxuICAgIGNvbnN0IGNvbnRyb2wyID0gdGhpcy50ZXh0Ym94R3JvdXAuY29udHJvbHMudGV4dGJveDI7XHJcblxyXG4gICAgLy8gVGhlIGZpcnN0IHRleHRib3ggc2hvdWxkIG9ubHkgaGF2ZSB0aGUgcmVxdWlyZWQgZXJyb3IgaWYgaXQncyBlbXB0eSBhbmQgdGhlIGRhdGUgaW5wdXQgaXMgcmVxdWlyZWQsXHJcbiAgICAvLyBvciBpZiB0aGUgZGF0ZSBpbnB1dCBpcyBub3QgcmVxdWlyZWQgYW5kIHRoZSBzZWNvbmQgY29udHJvbCBpcyB2aXNpYmxlIGFuZCBoYXMgYSB2YWx1ZSAobWVhbmluZyBhIHBhcnRpYWwgcmFuZ2UpXHJcbiAgICBpZiAoXHJcbiAgICAgICFjb250cm9sLnZhbHVlICYmXHJcbiAgICAgICh0aGlzLnJlcXVpcmVkIHx8IChjb250cm9sMi52YWx1ZSAmJiB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlUZXh0Ym94KSlcclxuICAgICkge1xyXG4gICAgICBjb250cm9sLnNldEVycm9ycyh7IHJlcXVpcmVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gVGhlIHNhbWUgaWRlYSBhcHBsaWVzIHRvIHRoZSBzZWNvbmQgdGV4dGJveCwgYnV0IG9ubHkgaWYgaXQncyB2aXNpYmxlXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2hvd1NlY29uZGFyeVRleHRib3ggJiZcclxuICAgICAgIWNvbnRyb2wyLnZhbHVlICYmXHJcbiAgICAgICh0aGlzLnJlcXVpcmVkIHx8IGNvbnRyb2wudmFsdWUpXHJcbiAgICApIHtcclxuICAgICAgY29udHJvbDIuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZURhdGVTdHJpbmcoY29udHJvbC52YWx1ZSk7XHJcbiAgICAgIGlmIChlcnJvcnMpIHtcclxuICAgICAgICBjb250cm9sLnNldEVycm9ycyhlcnJvcnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRyb2wyLnZhbHVlICYmIHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2hvd1NlY29uZGFyeVRleHRib3gpIHtcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZURhdGVTdHJpbmcoY29udHJvbDIudmFsdWUpO1xyXG4gICAgICBpZiAoZXJyb3JzKSB7XHJcbiAgICAgICAgY29udHJvbDIuc2V0RXJyb3JzKGVycm9ycyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVEYXRlU3RyaW5nKGRhdGU6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3Rpb25TdHJhdGVneS5wYXJzZVN0cmluZyhkYXRlLCB0aGlzLnBhcnNlRm9ybWF0cyk7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgLy8gV2UncmUgdXNpbmcgdGhlIHZpZXcgbW9kZSBhcyB0aGUgZ3JhbnVsYXJpdHkuIFdlIGRvbid0IHdhbnQgdG8gaW52YWxpZGF0ZVxyXG4gICAgICAvLyB0aGUgZGF0ZSBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgaGF2ZSBhIG1vbnRoL3F1YXJ0ZXIveWVhciBzZWxlY3RlZCBhbmQgdGhlIG1pblxyXG4gICAgICAvLyBvciBtYXggZGF0ZSBpcyBzb21ld2hlcmUgd2l0aGluIHRoYXQgbW9udGgvcXVhcnRlci95ZWFyLlxyXG4gICAgICBpZiAobW9tZW50KHZhbHVlKS5pc0JlZm9yZSh0aGlzLm1pbkRhdGUsIHRoaXMuc2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uVmlld01vZGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgbWluRGF0ZTogeyBtaW5WYWx1ZTogdGhpcy5taW5EYXRlIH0gfTtcclxuICAgICAgfSBlbHNlIGlmIChtb21lbnQodmFsdWUpLmlzQWZ0ZXIodGhpcy5tYXhEYXRlLCB0aGlzLnNlbGVjdGlvblN0cmF0ZWd5LnNlbGVjdGlvblZpZXdNb2RlKSkge1xyXG4gICAgICAgIHJldHVybiB7IG1heERhdGU6IHsgbWF4VmFsdWU6IHRoaXMubWF4RGF0ZSB9IH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGxhYmVsICpuZ0lmPVwibGFiZWxcIj5cclxuICA8c3Bhbj57e2xhYmVsIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDAgJiYgZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWRcIj4mbmJzcDt7e3ZhbGlkYXRpb25FcnJvcnN9fTwvc3Bhbj5cclxuICA8ZWMtaGVscC1wb3BvdmVyIGlkPVwie3tpZH19X2hlbHBQb3BvdmVyXCJcclxuICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGVscFBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWlubGluZS1ibG9jayBteS1uMyBteC1uMVwiXHJcbiAgICAgICAgICAgICAgICAgICB0ZXh0PVwie3toZWxwUG9wb3ZlciB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb3NpdGlvbj1cInt7aGVscFBvcG92ZXJQb3NpdGlvbn19XCI+XHJcbiAgPC9lYy1oZWxwLXBvcG92ZXI+XHJcbjwvbGFiZWw+XHJcblxyXG48ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgW2VjS2V5Ym9hcmROYXZDb250YWluZXJdPVwiaXNDYWxlbmRhck9wZW5cIlxyXG4gICAgICNjb250cm9scz1cImVjS2V5Ym9hcmROYXZDb250YWluZXJcIlxyXG4gICAgIChmb2N1c091dEVuZCk9XCJvbkNvbnRyb2xzRm9jdXNPdXRFbmQoKVwiPlxyXG4gIDxlYy1mb3JtLWNvbnRyb2wgaWQ9XCJ7e2lkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgIFtwZW5kaW5nXT1cInBlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgIChhY3Rpb25DbGlja2VkKT1cImlzQ2FsZW5kYXJPcGVuID0gIWlzQ2FsZW5kYXJPcGVuXCJcclxuICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgYWN0aW9uSWNvbj1cImljb24tZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICBjZGtPdmVybGF5T3JpZ2luXHJcbiAgICAgICAgICAgICAgICAgICAjb3ZlcmxheU9yaWdpbj1cImNka092ZXJsYXlPcmlnaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDJyZW07XCI+XHJcbiAgICA8aW5wdXQgaWQ9XCJ7e2lkfX1faW5wdXRcIlxyXG4gICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgdGFiaW5kZXg9XCJ7e3RhYmluZGV4fX1cIlxyXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Ym94R3JvdXAuZ2V0KCd0ZXh0Ym94JylcIlxyXG4gICAgICAgICAgIChibHVyKT1cIm9uVGV4dGJveEJsdXIoKVwiPlxyXG4gIDwvZWMtZm9ybS1jb250cm9sPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uU3RyYXRlZ3kuc2hvd1NlY29uZGFyeVRleHRib3hcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zaHJpbmsgbXgtMVwiPiZuZGFzaDs8L3NwYW4+XHJcbiAgICA8ZWMtZm9ybS1jb250cm9sIGlkPVwie3tpZH19X2NvbnRyb2wyXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcGVuZGluZ109XCJwZW5kaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrZWQpPVwiaXNDYWxlbmRhck9wZW4gPSAhaXNDYWxlbmRhck9wZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSWNvbj1cImljb24tZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ncm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDJyZW07XCI+XHJcbiAgICAgIDxpbnB1dCBpZD1cInt7aWR9fV9pbnB1dDJcIlxyXG4gICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInRleHRib3hHcm91cC5nZXQoJ3RleHRib3gyJylcIlxyXG4gICAgICAgICAgICAgKGJsdXIpPVwib25UZXh0Ym94MkJsdXIoKVwiPlxyXG4gICAgPC9lYy1mb3JtLWNvbnRyb2w+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJlbmFibGVTdGVwcGVyc1wiXHJcbiAgICAgICBjbGFzcz1cImNvbnRyb2wtZ3JvdXAgbWwtMlwiPlxyXG4gICAgPGVjLWJ1dHRvbiBpZD1cInt7aWR9fV9wcmV2aW91c1NlbGVjdGlvblwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICBpY29uPVwiaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS05MFwiXHJcbiAgICAgICAgICAgICAgIChjbGlja2VkKT1cInByZXZpb3VzU2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNDYWxlbmRhck9wZW4gfHwgZGlzYWJsZVN0ZXBwZXJzIHx8IGZvcm1Nb2RlbD8uZGlzYWJsZWRcIj5cclxuICAgIDwvZWMtYnV0dG9uPlxyXG4gICAgPGVjLWJ1dHRvbiBpZD1cInt7aWR9fV9uZXh0U2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgIGljb249XCJpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAgICAgICAgIChjbGlja2VkKT1cIm5leHRTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NhbGVuZGFyT3BlbiB8fCBkaXNhYmxlU3RlcHBlcnMgfHwgZm9ybU1vZGVsPy5kaXNhYmxlZFwiPlxyXG4gICAgPC9lYy1idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxlYy1idXR0b24gKm5nSWY9XCJxdWlja1NlbGVjdERhdGVcIlxyXG4gICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fcXVpY2tTZWxlY3RcIlxyXG4gICAgICAgICAgICAgaWNvbj1cImljb24tZGF5XCJcclxuICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgdGl0bGU9XCJ7eydEYXRlSW5wdXRfTGF0ZXN0RGF0YUF2YWlsYWJsZVRpdGxlJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgIChjbGlja2VkKT1cImdvVG9RdWlja1NlbGVjdERhdGUoKVwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIj5cclxuICA8L2VjLWJ1dHRvbj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgY2RrQ29ubmVjdGVkT3ZlcmxheVxyXG4gICAgICAgICAgICAgI292ZXJsYXk9XCJjZGtDb25uZWN0ZWRPdmVybGF5XCJcclxuICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cIm92ZXJsYXlPcmlnaW5cIlxyXG4gICAgICAgICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzQ2FsZW5kYXJPcGVuXCJcclxuICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3ldPVwib3ZlcmxheVNjcm9sbFN0cmF0ZWd5XCJcclxuICAgICAgICAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzPVwibXktMVwiXHJcbiAgICAgICAgICAgICAob3ZlcmxheU91dHNpZGVDbGljayk9XCJvbk92ZXJsYXlPdXRzaWRlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoZGV0YWNoKT1cImlzQ2FsZW5kYXJPcGVuID0gZmFsc2VcIj5cclxuICA8YXJ0aWNsZSBpZD1cInt7aWR9fV9kYXRlUGlja2VyXCJcclxuICAgICAgICAgICBjbGFzcz1cImNhcmQgZC1mbGV4XCJcclxuICAgICAgICAgICBbZWNLZXlib2FyZE5hdkNvbnRhaW5lcl09XCJpc0NhbGVuZGFyT3BlblwiXHJcbiAgICAgICAgICAgI2NhbGVuZGFyPVwiZWNLZXlib2FyZE5hdkNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgKGZvY3VzT3V0U3RhcnQpPVwib25DYWxlbmRhckZvY3VzT3V0U3RhcnQoKVwiXHJcbiAgICAgICAgICAgKGZvY3VzT3V0RW5kKT1cIm9uQ2FsZW5kYXJGb2N1c091dEVuZCgpXCI+XHJcbiAgICA8dWwgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlT3B0aW9ucy5sZW5ndGggPiAxXCJcclxuICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1tb2RlLW1lbnUgYm9yZGVyLXJpZ2h0IHAtMVwiPlxyXG4gICAgICA8bGkgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzZWxlY3Rpb25Nb2RlT3B0aW9uc1wiPlxyXG4gICAgICAgIDxidXR0b24gaWQ9XCJ7e2lkfX1fc2VsZWN0aW9uTW9kZV97e29wdGlvbn19XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTFcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cIm9wdGlvbiA9PT0gc2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3Rpb25Nb2RlQ2hhbmdlKG9wdGlvbilcIj5cclxuICAgICAgICAgIHt7J0RhdGVJbnB1dFNlbGVjdGlvbk1vZGVfJyArIG9wdGlvbiB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICA8ZWMtY2FsZW5kYXIgaWQ9XCJ7e2lkfX1fY2FsZW5kYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdmlld109XCJwcmltYXJ5Q2FsZW5kYXJWaWV3XCJcclxuICAgICAgICAgICAgICAgICAgICAgKHZpZXdDaGFuZ2UpPVwib25QcmltYXJ5Q2FsZW5kYXJWaWV3Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJjYWxlbmRhclNlbGVjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChkYXRlU2VsZWN0ZWQpPVwib25DYWxlbmRhckRhdGVTZWxlY3RlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cInNlbGVjdGlvblN0cmF0ZWd5LnNob3dTZWNvbmRhcnlDYWxlbmRhciA/IHByaW1hcnlDYWxlbmRhck1heERhdGUgOiBtYXhEYXRlXCI+XHJcbiAgICAgICAgPC9lYy1jYWxlbmRhcj5cclxuXHJcbiAgICAgICAgPGVjLWNhbGVuZGFyICpuZ0lmPVwic2VsZWN0aW9uU3RyYXRlZ3kuc2hvd1NlY29uZGFyeUNhbGVuZGFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fc2Vjb25kYXJ5Q2FsZW5kYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdmlld109XCJzZWNvbmRhcnlDYWxlbmRhclZpZXdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAodmlld0NoYW5nZSk9XCJvblNlY29uZGFyeUNhbGVuZGFyVmlld0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25dPVwiY2FsZW5kYXJTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAoZGF0ZVNlbGVjdGVkKT1cIm9uQ2FsZW5kYXJEYXRlU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cInNlY29uZGFyeUNhbGVuZGFyTWluRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIj5cclxuICAgICAgICA8L2VjLWNhbGVuZGFyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxmb290ZXIgKm5nSWY9XCJzZWxlY3Rpb25TdHJhdGVneS5zZWxlY3Rpb25WaWV3TW9kZSA9PT0gJ2RheSdcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBteS0yIGQtZmxleFwiPlxyXG4gICAgICAgIDxidXR0b24gaWQ9XCJ7e2lkfX1fdG9kYXlfYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGVjTGlua0J1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtbC1hdXRvIGQtaW5saW5lLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvVG9kYXkoKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogMS43NXJlbTtcIj5cclxuICAgICAgICAgIHt7J1RvZGF5JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZm9vdGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9hcnRpY2xlPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
@@ -5364,11 +5364,11 @@ class DateInputComponent extends FormControlBase {
5364
5364
  return null;
5365
5365
  }
5366
5366
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateInputComponent, deps: [{ token: ValidationMessageService }, { token: FormGroupHelper }, { token: UserPreferenceService }, { token: i0.ElementRef }, { token: i1$1.Overlay }, { token: DateInput.SelectionStrategies }], target: i0.ɵɵFactoryTarget.Component }); }
5367
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateInputComponent, selector: "ec-date-input", inputs: { id: "id", formModel: "formModel", minDate: "minDate", maxDate: "maxDate", selectionMode: "selectionMode", selectionModeOptions: "selectionModeOptions", quickSelectDate: "quickSelectDate", enableSteppers: "enableSteppers" }, host: { properties: { "attr.id": "this.id" } }, providers: [DateInput.SelectionStrategies], viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "controls", first: true, predicate: ["controls"], descendants: true }, { propertyName: "overlay", first: true, predicate: ["overlay"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: FormControlComponent, selector: "ec-form-control", inputs: ["id", "icon", "actionIcon", "showClear", "formModel", "autofocus", "pending", "required", "readonly"], outputs: ["actionClicked"] }, { kind: "component", type: HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "component", type: LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "component", type: CalendarComponent, selector: "ec-calendar", inputs: ["id", "selection", "selectionMode", "minDate", "maxDate", "view"], outputs: ["dateSelected", "viewChange"] }, { kind: "directive", type: KeyboardNavContainerDirective, selector: "[ecKeyboardNavContainer]", inputs: ["ecKeyboardNavContainer"], outputs: ["focusOutStart", "focusOutEnd"], exportAs: ["ecKeyboardNavContainer"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
5367
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateInputComponent, selector: "ec-date-input", inputs: { id: "id", formModel: "formModel", minDate: "minDate", maxDate: "maxDate", selectionMode: "selectionMode", selectionModeOptions: "selectionModeOptions", quickSelectDate: "quickSelectDate", enableSteppers: "enableSteppers" }, host: { properties: { "attr.id": "this.id" } }, providers: [DateInput.SelectionStrategies], viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "controls", first: true, predicate: ["controls"], descendants: true }, { propertyName: "overlay", first: true, predicate: ["overlay"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n tabindex=\"{{tabindex}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: FormControlComponent, selector: "ec-form-control", inputs: ["id", "icon", "actionIcon", "showClear", "formModel", "autofocus", "pending", "required", "readonly"], outputs: ["actionClicked"] }, { kind: "component", type: HelpPopoverComponent, selector: "ec-help-popover", inputs: ["id", "text", "contentPosition", "maxWidth"] }, { kind: "component", type: LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "component", type: CalendarComponent, selector: "ec-calendar", inputs: ["id", "selection", "selectionMode", "minDate", "maxDate", "view"], outputs: ["dateSelected", "viewChange"] }, { kind: "directive", type: KeyboardNavContainerDirective, selector: "[ecKeyboardNavContainer]", inputs: ["ecKeyboardNavContainer"], outputs: ["focusOutStart", "focusOutEnd"], exportAs: ["ecKeyboardNavContainer"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
5368
5368
  }
5369
5369
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateInputComponent, decorators: [{
5370
5370
  type: Component,
5371
- args: [{ selector: 'ec-date-input', providers: [DateInput.SelectionStrategies], template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"] }]
5371
+ args: [{ selector: 'ec-date-input', providers: [DateInput.SelectionStrategies], template: "<label *ngIf=\"label\">\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">&nbsp;{{validationErrors}}</span>\r\n <ec-help-popover id=\"{{id}}_helpPopover\"\r\n *ngIf=\"helpPopover\"\r\n class=\"d-inline-block my-n3 mx-n1\"\r\n text=\"{{helpPopover | translate}}\"\r\n contentPosition=\"{{helpPopoverPosition}}\">\r\n </ec-help-popover>\r\n</label>\r\n\r\n<div class=\"d-flex align-items-center\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #controls=\"ecKeyboardNavContainer\"\r\n (focusOutEnd)=\"onControlsFocusOutEnd()\">\r\n <ec-form-control id=\"{{id}}\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n cdkOverlayOrigin\r\n #overlayOrigin=\"cdkOverlayOrigin\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n tabindex=\"{{tabindex}}\"\r\n [formControl]=\"textboxGroup.get('textbox')\"\r\n (blur)=\"onTextboxBlur()\">\r\n </ec-form-control>\r\n\r\n <ng-container *ngIf=\"selectionStrategy.showSecondaryTextbox\">\r\n <span class=\"flex-shrink mx-1\">&ndash;</span>\r\n <ec-form-control id=\"{{id}}_control2\"\r\n [required]=\"required\"\r\n [autofocus]=\"autofocus\"\r\n [pending]=\"pending\"\r\n [readonly]=\"readonly\"\r\n (actionClicked)=\"isCalendarOpen = !isCalendarOpen\"\r\n [showClear]=\"false\"\r\n actionIcon=\"icon-date\"\r\n class=\"flex-grow\"\r\n style=\"height: 2rem;\">\r\n <input id=\"{{id}}_input2\"\r\n type=\"text\"\r\n placeholder=\"{{placeholder}}\"\r\n [formControl]=\"textboxGroup.get('textbox2')\"\r\n (blur)=\"onTextbox2Blur()\">\r\n </ec-form-control>\r\n </ng-container>\r\n\r\n <div *ngIf=\"enableSteppers\"\r\n class=\"control-group ml-2\">\r\n <ec-button id=\"{{id}}_previousSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-90\"\r\n (clicked)=\"previousSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n <ec-button id=\"{{id}}_nextSelection\"\r\n type=\"secondary\"\r\n icon=\"icon-angle-down rotate-270\"\r\n (clicked)=\"nextSelection()\"\r\n [disabled]=\"isCalendarOpen || disableSteppers || formModel?.disabled\">\r\n </ec-button>\r\n </div>\r\n\r\n <ec-button *ngIf=\"quickSelectDate\"\r\n id=\"{{id}}_quickSelect\"\r\n icon=\"icon-day\"\r\n type=\"secondary\"\r\n title=\"{{'DateInput_LatestDataAvailableTitle' | translate}}\"\r\n (clicked)=\"goToQuickSelectDate()\"\r\n class=\"ml-2\">\r\n </ec-button>\r\n</div>\r\n\r\n<ng-template cdkConnectedOverlay\r\n #overlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isCalendarOpen\"\r\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\r\n cdkConnectedOverlayPanelClass=\"my-1\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\r\n (detach)=\"isCalendarOpen = false\">\r\n <article id=\"{{id}}_datePicker\"\r\n class=\"card d-flex\"\r\n [ecKeyboardNavContainer]=\"isCalendarOpen\"\r\n #calendar=\"ecKeyboardNavContainer\"\r\n (focusOutStart)=\"onCalendarFocusOutStart()\"\r\n (focusOutEnd)=\"onCalendarFocusOutEnd()\">\r\n <ul *ngIf=\"selectionModeOptions.length > 1\"\r\n class=\"selection-mode-menu border-right p-1\">\r\n <li *ngFor=\"let option of selectionModeOptions\">\r\n <button id=\"{{id}}_selectionMode_{{option}}\"\r\n class=\"text-body-1\"\r\n [class.is-selected]=\"option === selectionMode\"\r\n (click)=\"onSelectionModeChange(option)\">\r\n {{'DateInputSelectionMode_' + option | translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div>\r\n <div class=\"d-flex\">\r\n <ec-calendar id=\"{{id}}_calendar\"\r\n [view]=\"primaryCalendarView\"\r\n (viewChange)=\"onPrimaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"selectionStrategy.showSecondaryCalendar ? primaryCalendarMaxDate : maxDate\">\r\n </ec-calendar>\r\n\r\n <ec-calendar *ngIf=\"selectionStrategy.showSecondaryCalendar\"\r\n id=\"{{id}}_secondaryCalendar\"\r\n [view]=\"secondaryCalendarView\"\r\n (viewChange)=\"onSecondaryCalendarViewChange($event)\"\r\n [selectionMode]=\"selectionMode\"\r\n [selection]=\"calendarSelection\"\r\n (dateSelected)=\"onCalendarDateSelected($event)\"\r\n [minDate]=\"secondaryCalendarMinDate\"\r\n [maxDate]=\"maxDate\">\r\n </ec-calendar>\r\n </div>\r\n\r\n <footer *ngIf=\"selectionStrategy.selectionViewMode === 'day'\"\r\n class=\"px-2 my-2 d-flex\">\r\n <button id=\"{{id}}_today_button\"\r\n ecLinkButton\r\n class=\"ml-auto d-inline-block\"\r\n (click)=\"goToToday()\"\r\n style=\"height: 1.75rem;\">\r\n {{'Today' | translate}}\r\n </button>\r\n </footer>\r\n </div>\r\n </article>\r\n</ng-template>\r\n", styles: [":host{display:block}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.date-picker{display:grid;grid-template-areas:\"menu calendar calendar\" \"menu footer footer\"}.date-picker footer{grid-area:footer}ul.selection-mode-menu{grid-area:menu;list-style:none;padding:0;margin:0;min-width:7rem}ul.selection-mode-menu li{margin-bottom:.25rem}ul.selection-mode-menu li button{font-size:var(--ec-font-size-action);height:2rem;line-height:1.25rem;padding:.3125rem .5rem;border:0;border-radius:var(--ec-border-radius);display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:transparent;width:100%;height:1.75rem}ul.selection-mode-menu li button .label{display:flex;align-items:center;justify-content:center;white-space:nowrap;flex:auto}ul.selection-mode-menu li button .ec-icon{flex:none}ul.selection-mode-menu li button .ec-icon+.label{flex:none;margin-left:.25rem}ul.selection-mode-menu li button.has-badge{padding-right:.0625rem}ul.selection-mode-menu li button:focus{outline:none;position:relative;z-index:1}ul.selection-mode-menu li button:disabled{background-color:var(--ec-background-color-disabled);border:1px solid var(--ec-form-control-border-color-disabled);color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled);cursor:default}ul.selection-mode-menu li button:disabled{background-color:transparent;border-color:transparent;color:var(--ec-color-hint-dark);--ec-color-icon: var(--ec-color-hint-dark)}ul.selection-mode-menu li button:hover:not(:disabled){background-color:var(--ec-background-color-hover)}ul.selection-mode-menu li button:active:not(:disabled){background-color:var(--ec-background-color-selected);font-weight:700}ul.selection-mode-menu li button:focus:not(:disabled){box-shadow:var(--ec-button-box-shadow-active, 0 0 0 2px var(--ec-border-color-focus))}ul.selection-mode-menu li button.is-selected{background-color:var(--ec-background-color-selected);font-weight:700}ec-button{--ec-button-border-color-secondary: var(--ec-border-color-control)}.control-group ec-button:has(+ec-button) ::ng-deep button{border-right:0}.control-group ec-button+ec-button ::ng-deep button{border-left:0}\n"] }]
5372
5372
  }], ctorParameters: () => [{ type: ValidationMessageService }, { type: FormGroupHelper }, { type: UserPreferenceService }, { type: i0.ElementRef }, { type: i1$1.Overlay }, { type: DateInput.SelectionStrategies }], propDecorators: { id: [{
5373
5373
  type: HostBinding,
5374
5374
  args: ['attr.id']