@dhutaryan/ngx-mat-timepicker 17.1.0 → 17.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,17 @@
1
1
  import { Component, ChangeDetectionStrategy, ViewEncapsulation, Optional, Input, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
2
3
  import { BehaviorSubject, Subscription, take } from 'rxjs';
3
4
  import { MatTimeFaceBase } from './time-face-base';
4
5
  import { withZeroPrefixMeridiem } from './time-input-base';
5
6
  import { enterLeaveAnimation } from './clock-dial-adnimation';
7
+ import { MatTimepickerContentLayout } from './timepicker-content-layout';
8
+ import { MatHoursClockDial } from './hours-clock-dial';
9
+ import { MatMinutesClockDial } from './minutes-clock-dial';
10
+ import { MatTimePeriod } from './time-period';
6
11
  import * as i0 from "@angular/core";
7
12
  import * as i1 from "./timepicker-intl";
8
13
  import * as i2 from "./adapter";
9
14
  import * as i3 from "@angular/common";
10
- import * as i4 from "./timepicker-content-layout";
11
- import * as i5 from "./hours-clock-dial";
12
- import * as i6 from "./minutes-clock-dial";
13
- import * as i7 from "./time-period";
14
15
  export class MatClockDials extends MatTimeFaceBase {
15
16
  constructor(_intl, _timeAdapter, _ngZone, _elementRef) {
16
17
  super(_timeAdapter);
@@ -38,14 +39,12 @@ export class MatClockDials extends MatTimeFaceBase {
38
39
  this._ngZone.runOutsideAngular(() => {
39
40
  this._ngZone.onStable.pipe(take(1)).subscribe(() => {
40
41
  setTimeout(() => {
41
- const activeCell = this._elementRef.nativeElement.querySelector('.mat-timepicker-content .mat-clock-dial-cell-active' // to avoid focus for inline mode
42
- );
42
+ const activeCell = this._elementRef.nativeElement.querySelector('.mat-timepicker-content .mat-clock-dial-cell-active');
43
43
  if (activeCell) {
44
44
  activeCell.focus();
45
45
  return;
46
46
  }
47
- const activePoint = this._elementRef.nativeElement.querySelector('.mat-timepicker-content .mat-clock-dial-hand-point' // to avoid focus for inline mode
48
- );
47
+ const activePoint = this._elementRef.nativeElement.querySelector('.mat-timepicker-content .mat-clock-dial-hand-point');
49
48
  if (activePoint) {
50
49
  // if no active cell we need to focus a small dot
51
50
  activePoint.focus();
@@ -61,24 +60,32 @@ export class MatClockDials extends MatTimeFaceBase {
61
60
  return withZeroPrefixMeridiem(value, this.isMeridiem);
62
61
  }
63
62
  /** Handles hour selection. */
64
- _onHourChanged({ hour, changeView = false, }) {
63
+ _onHourChanged({ hour, changeView = false }) {
65
64
  if (changeView) {
66
65
  this._view.next('minutes');
67
66
  }
68
67
  this._onHourSelected(hour);
69
68
  }
70
69
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatClockDials, deps: [{ token: i1.MatTimepickerIntl }, { token: i2.TimeAdapter, optional: true }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
71
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.5", type: MatClockDials, selector: "mat-clock-dials", inputs: { orientation: "orientation" }, host: { attributes: { "role": "dial" }, classAttribute: "mat-clock-dials" }, exportAs: ["matClockDials"], usesInheritance: true, ngImport: i0, template: "<mat-timepicker-content-layout\n [title]=\"_intl.dialsTitle\"\n [orientation]=\"orientation\"\n>\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n hours\n [class.mat-clock-dial-value-active]=\"isHoursView\"\n (click)=\"onViewChange($event,'hours')\"\n (keydown.space)=\"onViewChange($event, 'hours')\"\n >\n {{ _withZeroPrefix(selectedHour) }}\n </div>\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n minutes\n [class.mat-clock-dial-value-active]=\"!isHoursView\"\n (click)=\"onViewChange($event,'minutes')\"\n (keydown.space)=\"onViewChange($event,'minutes')\"\n >\n {{ _withZeroPrefix(selectedMinute) }}\n </div>\n\n <ng-template mat-time-period [ngIf]=\"isMeridiem\">\n <mat-time-period\n [period]=\"period\"\n [disabledPeriod]=\"disabledPeriod\"\n [vertical]=\"orientation === 'vertical'\"\n (periodChanged)=\"_onPeriodChanged($event)\"\n ></mat-time-period>\n </ng-template>\n\n <div\n class=\"mat-clock-dial-faces\"\n [class.mat-clock-dial-faces-horizontal]=\"orientation === 'horizontal'\"\n >\n <ng-template [ngIf]=\"isHoursView\">\n <mat-hours-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedHour]=\"selectedHour\"\n [isMeridiem]=\"isMeridiem\"\n [availableHours]=\"_getAvailableHours()\"\n (selectedChange)=\"_onHourChanged($event)\"\n (keydown)=\"_onKeydown($event, 'hour')\"\n ></mat-hours-clock-dial>\n </ng-template>\n <ng-template [ngIf]=\"!isHoursView\">\n <mat-minutes-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedMinute]=\"selectedMinute\"\n [interval]=\"minuteInterval\"\n [availableMinutes]=\"availableMinutes\"\n (selectedChange)=\"_onMinuteSelected($event)\"\n (keydown)=\"_onKeydown($event, 'minute')\"\n ></mat-minutes-clock-dial>\n </ng-template>\n </div>\n</mat-timepicker-content-layout>\n", styles: [".mat-clock-dial-values{display:flex;width:100%}.mat-clock-dial-value{display:flex;align-items:center;justify-content:center;height:4.5rem;border-radius:.25rem;cursor:pointer}.mat-clock-dial-faces{margin-top:2.25rem}.mat-clock-dial-faces.mat-clock-dial-faces-horizontal{margin-top:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatTimepickerContentLayout, selector: "mat-timepicker-content-layout", inputs: ["title", "orientation"], exportAs: ["matTimepickerContent"] }, { kind: "component", type: i5.MatHoursClockDial, selector: "mat-hours-clock-dial", inputs: ["selectedHour", "isMeridiem", "availableHours", "color"], outputs: ["selectedChange"], exportAs: ["matHoursClockDial"] }, { kind: "component", type: i6.MatMinutesClockDial, selector: "mat-minutes-clock-dial", inputs: ["selectedMinute", "interval", "availableMinutes", "color"], outputs: ["selectedChange"], exportAs: ["matMinutesClockDial"] }, { kind: "component", type: i7.MatTimePeriod, selector: "mat-time-period", inputs: ["vertical", "period", "disabledPeriod"], outputs: ["periodChanged"] }], animations: [enterLeaveAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
70
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.5", type: MatClockDials, isStandalone: true, selector: "mat-clock-dials", inputs: { orientation: "orientation", touchUi: "touchUi" }, host: { attributes: { "role": "dial" }, classAttribute: "mat-clock-dials" }, exportAs: ["matClockDials"], usesInheritance: true, ngImport: i0, template: "<mat-timepicker-content-layout [title]=\"_intl.dialsTitle\" [orientation]=\"orientation\">\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n hours\n [class.mat-clock-dial-value-active]=\"isHoursView\"\n (click)=\"onViewChange($event, 'hours')\"\n (keydown.space)=\"onViewChange($event, 'hours')\"\n >\n {{ _withZeroPrefix(selectedHour) }}\n </div>\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n minutes\n [class.mat-clock-dial-value-active]=\"!isHoursView\"\n (click)=\"onViewChange($event, 'minutes')\"\n (keydown.space)=\"onViewChange($event, 'minutes')\"\n >\n {{ _withZeroPrefix(selectedMinute) }}\n </div>\n\n <ng-template mat-time-period [ngIf]=\"isMeridiem\">\n <mat-time-period\n [period]=\"period\"\n [disabledPeriod]=\"disabledPeriod\"\n [vertical]=\"orientation === 'vertical'\"\n (periodChanged)=\"_onPeriodChanged($event)\"\n ></mat-time-period>\n </ng-template>\n\n <div\n class=\"mat-clock-dial-faces\"\n [class.mat-clock-dial-faces-horizontal]=\"orientation === 'horizontal'\"\n >\n @if (isHoursView) {\n <mat-hours-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedHour]=\"selectedHour\"\n [isMeridiem]=\"isMeridiem\"\n [availableHours]=\"_getAvailableHours()\"\n [touchUi]=\"touchUi\"\n (selectedChange)=\"_onHourChanged($event)\"\n (keydown)=\"_onKeydown($event, 'hour')\"\n ></mat-hours-clock-dial>\n }\n\n @if (!isHoursView) {\n <mat-minutes-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedMinute]=\"selectedMinute\"\n [interval]=\"minuteInterval\"\n [availableMinutes]=\"availableMinutes\"\n [touchUi]=\"touchUi\"\n (selectedChange)=\"_onMinuteSelected($event)\"\n (keydown)=\"_onKeydown($event, 'minute')\"\n ></mat-minutes-clock-dial>\n }\n </div>\n</mat-timepicker-content-layout>\n", styles: [".mat-clock-dial-values{display:flex;width:100%}.mat-clock-dial-value{display:flex;align-items:center;justify-content:center;height:4.5rem;border-radius:.25rem;cursor:pointer}.mat-clock-dial-faces{margin-top:2.25rem}.mat-clock-dial-faces.mat-clock-dial-faces-horizontal{margin-top:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatTimepickerContentLayout, selector: "mat-timepicker-content-layout", inputs: ["title", "orientation"], exportAs: ["matTimepickerContent"] }, { kind: "component", type: MatHoursClockDial, selector: "mat-hours-clock-dial", inputs: ["selectedHour", "isMeridiem", "availableHours", "color", "touchUi"], outputs: ["selectedChange"], exportAs: ["matHoursClockDial"] }, { kind: "component", type: MatMinutesClockDial, selector: "mat-minutes-clock-dial", inputs: ["selectedMinute", "interval", "availableMinutes", "color", "touchUi"], outputs: ["selectedChange"], exportAs: ["matMinutesClockDial"] }, { kind: "component", type: MatTimePeriod, selector: "mat-time-period", inputs: ["vertical", "period", "disabledPeriod"], outputs: ["periodChanged"] }], animations: [enterLeaveAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
72
71
  }
73
72
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatClockDials, decorators: [{
74
73
  type: Component,
75
- args: [{ selector: 'mat-clock-dials', exportAs: 'matClockDials', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
74
+ args: [{ selector: 'mat-clock-dials', standalone: true, imports: [
75
+ CommonModule,
76
+ MatTimepickerContentLayout,
77
+ MatHoursClockDial,
78
+ MatMinutesClockDial,
79
+ MatTimePeriod,
80
+ ], exportAs: 'matClockDials', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
76
81
  role: 'dial',
77
82
  class: 'mat-clock-dials',
78
- }, animations: [enterLeaveAnimation], template: "<mat-timepicker-content-layout\n [title]=\"_intl.dialsTitle\"\n [orientation]=\"orientation\"\n>\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n hours\n [class.mat-clock-dial-value-active]=\"isHoursView\"\n (click)=\"onViewChange($event,'hours')\"\n (keydown.space)=\"onViewChange($event, 'hours')\"\n >\n {{ _withZeroPrefix(selectedHour) }}\n </div>\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n minutes\n [class.mat-clock-dial-value-active]=\"!isHoursView\"\n (click)=\"onViewChange($event,'minutes')\"\n (keydown.space)=\"onViewChange($event,'minutes')\"\n >\n {{ _withZeroPrefix(selectedMinute) }}\n </div>\n\n <ng-template mat-time-period [ngIf]=\"isMeridiem\">\n <mat-time-period\n [period]=\"period\"\n [disabledPeriod]=\"disabledPeriod\"\n [vertical]=\"orientation === 'vertical'\"\n (periodChanged)=\"_onPeriodChanged($event)\"\n ></mat-time-period>\n </ng-template>\n\n <div\n class=\"mat-clock-dial-faces\"\n [class.mat-clock-dial-faces-horizontal]=\"orientation === 'horizontal'\"\n >\n <ng-template [ngIf]=\"isHoursView\">\n <mat-hours-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedHour]=\"selectedHour\"\n [isMeridiem]=\"isMeridiem\"\n [availableHours]=\"_getAvailableHours()\"\n (selectedChange)=\"_onHourChanged($event)\"\n (keydown)=\"_onKeydown($event, 'hour')\"\n ></mat-hours-clock-dial>\n </ng-template>\n <ng-template [ngIf]=\"!isHoursView\">\n <mat-minutes-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedMinute]=\"selectedMinute\"\n [interval]=\"minuteInterval\"\n [availableMinutes]=\"availableMinutes\"\n (selectedChange)=\"_onMinuteSelected($event)\"\n (keydown)=\"_onKeydown($event, 'minute')\"\n ></mat-minutes-clock-dial>\n </ng-template>\n </div>\n</mat-timepicker-content-layout>\n", styles: [".mat-clock-dial-values{display:flex;width:100%}.mat-clock-dial-value{display:flex;align-items:center;justify-content:center;height:4.5rem;border-radius:.25rem;cursor:pointer}.mat-clock-dial-faces{margin-top:2.25rem}.mat-clock-dial-faces.mat-clock-dial-faces-horizontal{margin-top:0}\n"] }]
83
+ }, animations: [enterLeaveAnimation], template: "<mat-timepicker-content-layout [title]=\"_intl.dialsTitle\" [orientation]=\"orientation\">\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n hours\n [class.mat-clock-dial-value-active]=\"isHoursView\"\n (click)=\"onViewChange($event, 'hours')\"\n (keydown.space)=\"onViewChange($event, 'hours')\"\n >\n {{ _withZeroPrefix(selectedHour) }}\n </div>\n <div\n tabindex=\"0\"\n class=\"mat-clock-dial-value\"\n minutes\n [class.mat-clock-dial-value-active]=\"!isHoursView\"\n (click)=\"onViewChange($event, 'minutes')\"\n (keydown.space)=\"onViewChange($event, 'minutes')\"\n >\n {{ _withZeroPrefix(selectedMinute) }}\n </div>\n\n <ng-template mat-time-period [ngIf]=\"isMeridiem\">\n <mat-time-period\n [period]=\"period\"\n [disabledPeriod]=\"disabledPeriod\"\n [vertical]=\"orientation === 'vertical'\"\n (periodChanged)=\"_onPeriodChanged($event)\"\n ></mat-time-period>\n </ng-template>\n\n <div\n class=\"mat-clock-dial-faces\"\n [class.mat-clock-dial-faces-horizontal]=\"orientation === 'horizontal'\"\n >\n @if (isHoursView) {\n <mat-hours-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedHour]=\"selectedHour\"\n [isMeridiem]=\"isMeridiem\"\n [availableHours]=\"_getAvailableHours()\"\n [touchUi]=\"touchUi\"\n (selectedChange)=\"_onHourChanged($event)\"\n (keydown)=\"_onKeydown($event, 'hour')\"\n ></mat-hours-clock-dial>\n }\n\n @if (!isHoursView) {\n <mat-minutes-clock-dial\n [@enterLeaveAnimation]\n [color]=\"color\"\n [selectedMinute]=\"selectedMinute\"\n [interval]=\"minuteInterval\"\n [availableMinutes]=\"availableMinutes\"\n [touchUi]=\"touchUi\"\n (selectedChange)=\"_onMinuteSelected($event)\"\n (keydown)=\"_onKeydown($event, 'minute')\"\n ></mat-minutes-clock-dial>\n }\n </div>\n</mat-timepicker-content-layout>\n", styles: [".mat-clock-dial-values{display:flex;width:100%}.mat-clock-dial-value{display:flex;align-items:center;justify-content:center;height:4.5rem;border-radius:.25rem;cursor:pointer}.mat-clock-dial-faces{margin-top:2.25rem}.mat-clock-dial-faces.mat-clock-dial-faces-horizontal{margin-top:0}\n"] }]
79
84
  }], ctorParameters: () => [{ type: i1.MatTimepickerIntl }, { type: i2.TimeAdapter, decorators: [{
80
85
  type: Optional
81
86
  }] }, { type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { orientation: [{
82
87
  type: Input
88
+ }], touchUi: [{
89
+ type: Input
83
90
  }] } });
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2stZGlhbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtdGltZXBpY2tlci9zcmMvbGliL2Nsb2NrLWRpYWxzLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi9jbG9jay1kaWFscy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUdqQixRQUFRLEVBR1IsS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUczRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7OztBQWlCOUQsTUFBTSxPQUFPLGFBQ1gsU0FBUSxlQUFrQjtJQVkxQixZQUNTLEtBQXdCLEVBQ25CLFlBQTRCLEVBQ2hDLE9BQWUsRUFDZixXQUF1QjtRQUUvQixLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFMYixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUV2QixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFWakMsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsd0NBQXdDO1FBQ3ZCLFVBQUssR0FBRyxJQUFJLGVBQWUsQ0FBYyxPQUFPLENBQUMsQ0FBQztRQUMzRCxzQkFBaUIsR0FBd0IsWUFBWSxDQUFDLEtBQUssQ0FBQztJQVNwRSxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDM0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQ2hELENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsWUFBWSxDQUFDLEtBQVksRUFBRSxJQUFpQjtRQUMxQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDakQsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQzFDLHFEQUFxRCxDQUFDLGlDQUFpQztxQkFDeEYsQ0FBQztvQkFFSixJQUFJLFVBQVUsRUFBRTt3QkFDZCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ25CLE9BQU87cUJBQ1I7b0JBRUQsTUFBTSxXQUFXLEdBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUMxQyxvREFBb0QsQ0FBQyxpQ0FBaUM7cUJBQ3ZGLENBQUM7b0JBRUosSUFBSSxXQUFXLEVBQUU7d0JBQ2YsaURBQWlEO3dCQUNqRCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7cUJBQ3JCO2dCQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNULENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sc0JBQXNCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLGNBQWMsQ0FBQyxFQUNiLElBQUksRUFDSixVQUFVLEdBQUcsS0FBSyxHQUluQjtRQUNDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7OEdBdkZVLGFBQWE7a0dBQWIsYUFBYSxnT0NuQzFCLDQ4REE4REEsdXFDRDdCYyxDQUFDLG1CQUFtQixDQUFDOzsyRkFFdEIsYUFBYTtrQkFiekIsU0FBUzsrQkFDRSxpQkFBaUIsWUFHakIsZUFBZSxtQkFDUix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLElBQUksRUFBRSxNQUFNO3dCQUNaLEtBQUssRUFBRSxpQkFBaUI7cUJBQ3pCLGNBQ1csQ0FBQyxtQkFBbUIsQ0FBQzs7MEJBaUI5QixRQUFRO3VGQVZGLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBOZ1pvbmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcbmltcG9ydCB7IE1hdFRpbWVGYWNlQmFzZSB9IGZyb20gJy4vdGltZS1mYWNlLWJhc2UnO1xuaW1wb3J0IHsgd2l0aFplcm9QcmVmaXhNZXJpZGllbSB9IGZyb20gJy4vdGltZS1pbnB1dC1iYXNlJztcbmltcG9ydCB7IE1hdFRpbWVwaWNrZXJJbnRsIH0gZnJvbSAnLi90aW1lcGlja2VyLWludGwnO1xuaW1wb3J0IHsgVGltZXBpY2tlck9yaWVudGF0aW9uIH0gZnJvbSAnLi9vcmllbnRhdGlvbic7XG5pbXBvcnQgeyBlbnRlckxlYXZlQW5pbWF0aW9uIH0gZnJvbSAnLi9jbG9jay1kaWFsLWFkbmltYXRpb24nO1xuXG5leHBvcnQgdHlwZSBNYXREaWFsVmlldyA9ICdob3VycycgfCAnbWludXRlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1jbG9jay1kaWFscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jbG9jay1kaWFscy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2xvY2stZGlhbHMuc2NzcyddLFxuICBleHBvcnRBczogJ21hdENsb2NrRGlhbHMnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgIHJvbGU6ICdkaWFsJyxcbiAgICBjbGFzczogJ21hdC1jbG9jay1kaWFscycsXG4gIH0sXG4gIGFuaW1hdGlvbnM6IFtlbnRlckxlYXZlQW5pbWF0aW9uXSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0Q2xvY2tEaWFsczxUPlxuICBleHRlbmRzIE1hdFRpbWVGYWNlQmFzZTxUPlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIC8qKiBMYXlvdXQgb3JpZW50YXRpb24uICovXG4gIEBJbnB1dCgpIG9yaWVudGF0aW9uOiBUaW1lcGlja2VyT3JpZW50YXRpb247XG5cbiAgaXNIb3Vyc1ZpZXcgPSB0cnVlO1xuXG4gIC8qKiBTcGVjaWZpZXMgdGhlIHZpZXcgb2YgY2xvY2sgZGlhbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdmlldyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0RGlhbFZpZXc+KCdob3VycycpO1xuICBwcml2YXRlIF92aWV3U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBfaW50bDogTWF0VGltZXBpY2tlckludGwsXG4gICAgQE9wdGlvbmFsKCkgX3RpbWVBZGFwdGVyOiBUaW1lQWRhcHRlcjxUPixcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKF90aW1lQWRhcHRlcik7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3U3Vic2NyaXB0aW9uID0gdGhpcy5fdmlldy5zdWJzY3JpYmUoXG4gICAgICAodmlldykgPT4gKHRoaXMuaXNIb3Vyc1ZpZXcgPSB2aWV3ID09PSAnaG91cnMnKVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3ZpZXdTdWJzY3JpcHRpb24gPSBudWxsO1xuICB9XG5cbiAgLyoqIENoYW5nZXMgY2xvY2sgZGlhbCB2aWV3LiAqL1xuICBvblZpZXdDaGFuZ2UoZXZlbnQ6IEV2ZW50LCB2aWV3OiBNYXREaWFsVmlldyk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fdmlldy5uZXh0KHZpZXcpO1xuICB9XG5cbiAgZm9jdXNBY3RpdmVDZWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBhY3RpdmVDZWxsOiBIVE1MRWxlbWVudCB8IG51bGwgPVxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICcubWF0LXRpbWVwaWNrZXItY29udGVudCAubWF0LWNsb2NrLWRpYWwtY2VsbC1hY3RpdmUnIC8vIHRvIGF2b2lkIGZvY3VzIGZvciBpbmxpbmUgbW9kZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChhY3RpdmVDZWxsKSB7XG4gICAgICAgICAgICBhY3RpdmVDZWxsLmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYWN0aXZlUG9pbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgJy5tYXQtdGltZXBpY2tlci1jb250ZW50IC5tYXQtY2xvY2stZGlhbC1oYW5kLXBvaW50JyAvLyB0byBhdm9pZCBmb2N1cyBmb3IgaW5saW5lIG1vZGVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoYWN0aXZlUG9pbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIG5vIGFjdGl2ZSBjZWxsIHdlIG5lZWQgdG8gZm9jdXMgYSBzbWFsbCBkb3RcbiAgICAgICAgICAgIGFjdGl2ZVBvaW50LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF93aXRoWmVyb1ByZWZpeCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybiAnMDAnO1xuICAgIH1cblxuICAgIHJldHVybiB3aXRoWmVyb1ByZWZpeE1lcmlkaWVtKHZhbHVlLCB0aGlzLmlzTWVyaWRpZW0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZXMgaG91ciBzZWxlY3Rpb24uICovXG4gIF9vbkhvdXJDaGFuZ2VkKHtcbiAgICBob3VyLFxuICAgIGNoYW5nZVZpZXcgPSBmYWxzZSxcbiAgfToge1xuICAgIGhvdXI6IG51bWJlcjtcbiAgICBjaGFuZ2VWaWV3PzogYm9vbGVhbjtcbiAgfSk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VWaWV3KSB7XG4gICAgICB0aGlzLl92aWV3Lm5leHQoJ21pbnV0ZXMnKTtcbiAgICB9XG4gICAgdGhpcy5fb25Ib3VyU2VsZWN0ZWQoaG91cik7XG4gIH1cbn1cbiIsIjxtYXQtdGltZXBpY2tlci1jb250ZW50LWxheW91dFxuICBbdGl0bGVdPVwiX2ludGwuZGlhbHNUaXRsZVwiXG4gIFtvcmllbnRhdGlvbl09XCJvcmllbnRhdGlvblwiXG4+XG4gIDxkaXZcbiAgICB0YWJpbmRleD1cIjBcIlxuICAgIGNsYXNzPVwibWF0LWNsb2NrLWRpYWwtdmFsdWVcIlxuICAgIGhvdXJzXG4gICAgW2NsYXNzLm1hdC1jbG9jay1kaWFsLXZhbHVlLWFjdGl2ZV09XCJpc0hvdXJzVmlld1wiXG4gICAgKGNsaWNrKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQsJ2hvdXJzJylcIlxuICAgIChrZXlkb3duLnNwYWNlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQsICdob3VycycpXCJcbiAgPlxuICAgIHt7IF93aXRoWmVyb1ByZWZpeChzZWxlY3RlZEhvdXIpIH19XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgdGFiaW5kZXg9XCIwXCJcbiAgICBjbGFzcz1cIm1hdC1jbG9jay1kaWFsLXZhbHVlXCJcbiAgICBtaW51dGVzXG4gICAgW2NsYXNzLm1hdC1jbG9jay1kaWFsLXZhbHVlLWFjdGl2ZV09XCIhaXNIb3Vyc1ZpZXdcIlxuICAgIChjbGljayk9XCJvblZpZXdDaGFuZ2UoJGV2ZW50LCdtaW51dGVzJylcIlxuICAgIChrZXlkb3duLnNwYWNlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQsJ21pbnV0ZXMnKVwiXG4gID5cbiAgICB7eyBfd2l0aFplcm9QcmVmaXgoc2VsZWN0ZWRNaW51dGUpIH19XG4gIDwvZGl2PlxuXG4gIDxuZy10ZW1wbGF0ZSBtYXQtdGltZS1wZXJpb2QgW25nSWZdPVwiaXNNZXJpZGllbVwiPlxuICAgIDxtYXQtdGltZS1wZXJpb2RcbiAgICAgIFtwZXJpb2RdPVwicGVyaW9kXCJcbiAgICAgIFtkaXNhYmxlZFBlcmlvZF09XCJkaXNhYmxlZFBlcmlvZFwiXG4gICAgICBbdmVydGljYWxdPVwib3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgKHBlcmlvZENoYW5nZWQpPVwiX29uUGVyaW9kQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICA+PC9tYXQtdGltZS1wZXJpb2Q+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibWF0LWNsb2NrLWRpYWwtZmFjZXNcIlxuICAgIFtjbGFzcy5tYXQtY2xvY2stZGlhbC1mYWNlcy1ob3Jpem9udGFsXT1cIm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzSG91cnNWaWV3XCI+XG4gICAgICA8bWF0LWhvdXJzLWNsb2NrLWRpYWxcbiAgICAgICAgW0BlbnRlckxlYXZlQW5pbWF0aW9uXVxuICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICBbc2VsZWN0ZWRIb3VyXT1cInNlbGVjdGVkSG91clwiXG4gICAgICAgIFtpc01lcmlkaWVtXT1cImlzTWVyaWRpZW1cIlxuICAgICAgICBbYXZhaWxhYmxlSG91cnNdPVwiX2dldEF2YWlsYWJsZUhvdXJzKClcIlxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiX29uSG91ckNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cIl9vbktleWRvd24oJGV2ZW50LCAnaG91cicpXCJcbiAgICAgID48L21hdC1ob3Vycy1jbG9jay1kaWFsPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFpc0hvdXJzVmlld1wiPlxuICAgICAgPG1hdC1taW51dGVzLWNsb2NrLWRpYWxcbiAgICAgICAgW0BlbnRlckxlYXZlQW5pbWF0aW9uXVxuICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICBbc2VsZWN0ZWRNaW51dGVdPVwic2VsZWN0ZWRNaW51dGVcIlxuICAgICAgICBbaW50ZXJ2YWxdPVwibWludXRlSW50ZXJ2YWxcIlxuICAgICAgICBbYXZhaWxhYmxlTWludXRlc109XCJhdmFpbGFibGVNaW51dGVzXCJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIl9vbk1pbnV0ZVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJfb25LZXlkb3duKCRldmVudCwgJ21pbnV0ZScpXCJcbiAgICAgID48L21hdC1taW51dGVzLWNsb2NrLWRpYWw+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L21hdC10aW1lcGlja2VyLWNvbnRlbnQtbGF5b3V0PlxuIl19
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2stZGlhbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtdGltZXBpY2tlci9zcmMvbGliL2Nsb2NrLWRpYWxzLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi9jbG9jay1kaWFscy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUdqQixRQUFRLEVBR1IsS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBeUI5QyxNQUFNLE9BQU8sYUFBaUIsU0FBUSxlQUFrQjtJQWF0RCxZQUNTLEtBQXdCLEVBQ25CLFlBQTRCLEVBQ2hDLE9BQWUsRUFDZixXQUF1QjtRQUUvQixLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFMYixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUV2QixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxX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O3FCQUN6QixjQUNXLENBQUMsbUJBQW1CLENBQUM7OzBCQWlCOUIsUUFBUTt1RkFiRixXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIE5nWm9uZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcbmltcG9ydCB7IE1hdFRpbWVGYWNlQmFzZSB9IGZyb20gJy4vdGltZS1mYWNlLWJhc2UnO1xuaW1wb3J0IHsgd2l0aFplcm9QcmVmaXhNZXJpZGllbSB9IGZyb20gJy4vdGltZS1pbnB1dC1iYXNlJztcbmltcG9ydCB7IE1hdFRpbWVwaWNrZXJJbnRsIH0gZnJvbSAnLi90aW1lcGlja2VyLWludGwnO1xuaW1wb3J0IHsgVGltZXBpY2tlck9yaWVudGF0aW9uIH0gZnJvbSAnLi9vcmllbnRhdGlvbic7XG5pbXBvcnQgeyBlbnRlckxlYXZlQW5pbWF0aW9uIH0gZnJvbSAnLi9jbG9jay1kaWFsLWFkbmltYXRpb24nO1xuaW1wb3J0IHsgTWF0VGltZXBpY2tlckNvbnRlbnRMYXlvdXQgfSBmcm9tICcuL3RpbWVwaWNrZXItY29udGVudC1sYXlvdXQnO1xuaW1wb3J0IHsgTWF0SG91cnNDbG9ja0RpYWwgfSBmcm9tICcuL2hvdXJzLWNsb2NrLWRpYWwnO1xuaW1wb3J0IHsgTWF0TWludXRlc0Nsb2NrRGlhbCB9IGZyb20gJy4vbWludXRlcy1jbG9jay1kaWFsJztcbmltcG9ydCB7IE1hdFRpbWVQZXJpb2QgfSBmcm9tICcuL3RpbWUtcGVyaW9kJztcblxuZXhwb3J0IHR5cGUgTWF0RGlhbFZpZXcgPSAnaG91cnMnIHwgJ21pbnV0ZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtY2xvY2stZGlhbHMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdFRpbWVwaWNrZXJDb250ZW50TGF5b3V0LFxuICAgIE1hdEhvdXJzQ2xvY2tEaWFsLFxuICAgIE1hdE1pbnV0ZXNDbG9ja0RpYWwsXG4gICAgTWF0VGltZVBlcmlvZCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nsb2NrLWRpYWxzLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jbG9jay1kaWFscy5zY3NzJ10sXG4gIGV4cG9ydEFzOiAnbWF0Q2xvY2tEaWFscycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgcm9sZTogJ2RpYWwnLFxuICAgIGNsYXNzOiAnbWF0LWNsb2NrLWRpYWxzJyxcbiAgfSxcbiAgYW5pbWF0aW9uczogW2VudGVyTGVhdmVBbmltYXRpb25dLFxufSlcbmV4cG9ydCBjbGFzcyBNYXRDbG9ja0RpYWxzPFQ+IGV4dGVuZHMgTWF0VGltZUZhY2VCYXNlPFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogTGF5b3V0IG9yaWVudGF0aW9uLiAqL1xuICBASW5wdXQoKSBvcmllbnRhdGlvbjogVGltZXBpY2tlck9yaWVudGF0aW9uO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSB0aW1lcGlja2VyIFVJIGlzIGluIHRvdWNoIG1vZGUuICovXG4gIEBJbnB1dCgpIHRvdWNoVWk6IGJvb2xlYW47XG5cbiAgaXNIb3Vyc1ZpZXcgPSB0cnVlO1xuXG4gIC8qKiBTcGVjaWZpZXMgdGhlIHZpZXcgb2YgY2xvY2sgZGlhbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdmlldyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0RGlhbFZpZXc+KCdob3VycycpO1xuICBwcml2YXRlIF92aWV3U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBfaW50bDogTWF0VGltZXBpY2tlckludGwsXG4gICAgQE9wdGlvbmFsKCkgX3RpbWVBZGFwdGVyOiBUaW1lQWRhcHRlcjxUPixcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICApIHtcbiAgICBzdXBlcihfdGltZUFkYXB0ZXIpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld1N1YnNjcmlwdGlvbiA9IHRoaXMuX3ZpZXcuc3Vic2NyaWJlKCh2aWV3KSA9PiAodGhpcy5pc0hvdXJzVmlldyA9IHZpZXcgPT09ICdob3VycycpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXdTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fdmlld1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gIH1cblxuICAvKiogQ2hhbmdlcyBjbG9jayBkaWFsIHZpZXcuICovXG4gIG9uVmlld0NoYW5nZShldmVudDogRXZlbnQsIHZpZXc6IE1hdERpYWxWaWV3KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl92aWV3Lm5leHQodmlldyk7XG4gIH1cblxuICBmb2N1c0FjdGl2ZUNlbGwoKTogdm9pZCB7XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUNlbGw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgJy5tYXQtdGltZXBpY2tlci1jb250ZW50IC5tYXQtY2xvY2stZGlhbC1jZWxsLWFjdGl2ZScsIC8vIHRvIGF2b2lkIGZvY3VzIGZvciBpbmxpbmUgbW9kZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoYWN0aXZlQ2VsbCkge1xuICAgICAgICAgICAgYWN0aXZlQ2VsbC5mb2N1cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFjdGl2ZVBvaW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICcubWF0LXRpbWVwaWNrZXItY29udGVudCAubWF0LWNsb2NrLWRpYWwtaGFuZC1wb2ludCcsIC8vIHRvIGF2b2lkIGZvY3VzIGZvciBpbmxpbmUgbW9kZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoYWN0aXZlUG9pbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIG5vIGFjdGl2ZSBjZWxsIHdlIG5lZWQgdG8gZm9jdXMgYSBzbWFsbCBkb3RcbiAgICAgICAgICAgIGFjdGl2ZVBvaW50LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF93aXRoWmVyb1ByZWZpeCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybiAnMDAnO1xuICAgIH1cblxuICAgIHJldHVybiB3aXRoWmVyb1ByZWZpeE1lcmlkaWVtKHZhbHVlLCB0aGlzLmlzTWVyaWRpZW0pO1xuICB9XG5cbiAgLyoqIEhhbmRsZXMgaG91ciBzZWxlY3Rpb24uICovXG4gIF9vbkhvdXJDaGFuZ2VkKHsgaG91ciwgY2hhbmdlVmlldyA9IGZhbHNlIH06IHsgaG91cjogbnVtYmVyOyBjaGFuZ2VWaWV3PzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZVZpZXcpIHtcbiAgICAgIHRoaXMuX3ZpZXcubmV4dCgnbWludXRlcycpO1xuICAgIH1cbiAgICB0aGlzLl9vbkhvdXJTZWxlY3RlZChob3VyKTtcbiAgfVxufVxuIiwiPG1hdC10aW1lcGlja2VyLWNvbnRlbnQtbGF5b3V0IFt0aXRsZV09XCJfaW50bC5kaWFsc1RpdGxlXCIgW29yaWVudGF0aW9uXT1cIm9yaWVudGF0aW9uXCI+XG4gIDxkaXZcbiAgICB0YWJpbmRleD1cIjBcIlxuICAgIGNsYXNzPVwibWF0LWNsb2NrLWRpYWwtdmFsdWVcIlxuICAgIGhvdXJzXG4gICAgW2NsYXNzLm1hdC1jbG9jay1kaWFsLXZhbHVlLWFjdGl2ZV09XCJpc0hvdXJzVmlld1wiXG4gICAgKGNsaWNrKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQsICdob3VycycpXCJcbiAgICAoa2V5ZG93bi5zcGFjZSk9XCJvblZpZXdDaGFuZ2UoJGV2ZW50LCAnaG91cnMnKVwiXG4gID5cbiAgICB7eyBfd2l0aFplcm9QcmVmaXgoc2VsZWN0ZWRIb3VyKSB9fVxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIHRhYmluZGV4PVwiMFwiXG4gICAgY2xhc3M9XCJtYXQtY2xvY2stZGlhbC12YWx1ZVwiXG4gICAgbWludXRlc1xuICAgIFtjbGFzcy5tYXQtY2xvY2stZGlhbC12YWx1ZS1hY3RpdmVdPVwiIWlzSG91cnNWaWV3XCJcbiAgICAoY2xpY2spPVwib25WaWV3Q2hhbmdlKCRldmVudCwgJ21pbnV0ZXMnKVwiXG4gICAgKGtleWRvd24uc3BhY2UpPVwib25WaWV3Q2hhbmdlKCRldmVudCwgJ21pbnV0ZXMnKVwiXG4gID5cbiAgICB7eyBfd2l0aFplcm9QcmVmaXgoc2VsZWN0ZWRNaW51dGUpIH19XG4gIDwvZGl2PlxuXG4gIDxuZy10ZW1wbGF0ZSBtYXQtdGltZS1wZXJpb2QgW25nSWZdPVwiaXNNZXJpZGllbVwiPlxuICAgIDxtYXQtdGltZS1wZXJpb2RcbiAgICAgIFtwZXJpb2RdPVwicGVyaW9kXCJcbiAgICAgIFtkaXNhYmxlZFBlcmlvZF09XCJkaXNhYmxlZFBlcmlvZFwiXG4gICAgICBbdmVydGljYWxdPVwib3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxuICAgICAgKHBlcmlvZENoYW5nZWQpPVwiX29uUGVyaW9kQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICA+PC9tYXQtdGltZS1wZXJpb2Q+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibWF0LWNsb2NrLWRpYWwtZmFjZXNcIlxuICAgIFtjbGFzcy5tYXQtY2xvY2stZGlhbC1mYWNlcy1ob3Jpem9udGFsXT1cIm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxuICA+XG4gICAgQGlmIChpc0hvdXJzVmlldykge1xuICAgICAgPG1hdC1ob3Vycy1jbG9jay1kaWFsXG4gICAgICAgIFtAZW50ZXJMZWF2ZUFuaW1hdGlvbl1cbiAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgW3NlbGVjdGVkSG91cl09XCJzZWxlY3RlZEhvdXJcIlxuICAgICAgICBbaXNNZXJpZGllbV09XCJpc01lcmlkaWVtXCJcbiAgICAgICAgW2F2YWlsYWJsZUhvdXJzXT1cIl9nZXRBdmFpbGFibGVIb3VycygpXCJcbiAgICAgICAgW3RvdWNoVWldPVwidG91Y2hVaVwiXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJfb25Ib3VyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwiX29uS2V5ZG93bigkZXZlbnQsICdob3VyJylcIlxuICAgICAgPjwvbWF0LWhvdXJzLWNsb2NrLWRpYWw+XG4gICAgfVxuXG4gICAgQGlmICghaXNIb3Vyc1ZpZXcpIHtcbiAgICAgIDxtYXQtbWludXRlcy1jbG9jay1kaWFsXG4gICAgICAgIFtAZW50ZXJMZWF2ZUFuaW1hdGlvbl1cbiAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgW3NlbGVjdGVkTWludXRlXT1cInNlbGVjdGVkTWludXRlXCJcbiAgICAgICAgW2ludGVydmFsXT1cIm1pbnV0ZUludGVydmFsXCJcbiAgICAgICAgW2F2YWlsYWJsZU1pbnV0ZXNdPVwiYXZhaWxhYmxlTWludXRlc1wiXG4gICAgICAgIFt0b3VjaFVpXT1cInRvdWNoVWlcIlxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiX29uTWludXRlU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cIl9vbktleWRvd24oJGV2ZW50LCAnbWludXRlJylcIlxuICAgICAgPjwvbWF0LW1pbnV0ZXMtY2xvY2stZGlhbD5cbiAgICB9XG4gIDwvZGl2PlxuPC9tYXQtdGltZXBpY2tlci1jb250ZW50LWxheW91dD5cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ const TOUCH_UI_MULTIPLIER = 1.25;
2
+ const TOUCH_UI_TICK_MULTIPLIER = 1.5;
3
+ const CLOCK_RADIUS = 128;
4
+ const CLOCK_TICK_RADIUS = 16;
5
+ const CLOCK_OUTER_RADIUS = 100;
6
+ export function getClockRadius(touchUi) {
7
+ return touchUi ? CLOCK_RADIUS * TOUCH_UI_MULTIPLIER : CLOCK_RADIUS;
8
+ }
9
+ export function getClockTickRadius(touchUi) {
10
+ return touchUi
11
+ ? CLOCK_TICK_RADIUS * TOUCH_UI_TICK_MULTIPLIER
12
+ : CLOCK_TICK_RADIUS;
13
+ }
14
+ export function getClockCorrectedRadius(touchUi) {
15
+ return getClockRadius(touchUi) - getClockTickRadius(touchUi);
16
+ }
17
+ export function getClockOuterRadius(touchUi) {
18
+ return touchUi
19
+ ? CLOCK_OUTER_RADIUS * TOUCH_UI_MULTIPLIER
20
+ : CLOCK_OUTER_RADIUS;
21
+ }
22
+ export function getClockInnerRadius(touchUi) {
23
+ return getClockOuterRadius(touchUi) - getClockTickRadius(touchUi) * 2;
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2stc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10aW1lcGlja2VyL3NyYy9saWIvY2xvY2stc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUNqQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUNyQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDekIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFFL0IsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFpQjtJQUM5QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUFpQjtJQUNsRCxPQUFPLE9BQU87UUFDWixDQUFDLENBQUMsaUJBQWlCLEdBQUcsd0JBQXdCO1FBQzlDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQWlCO0lBQ3ZELE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBaUI7SUFDbkQsT0FBTyxPQUFPO1FBQ1osQ0FBQyxDQUFDLGtCQUFrQixHQUFHLG1CQUFtQjtRQUMxQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFpQjtJQUNuRCxPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgVE9VQ0hfVUlfTVVMVElQTElFUiA9IDEuMjU7XG5jb25zdCBUT1VDSF9VSV9USUNLX01VTFRJUExJRVIgPSAxLjU7XG5jb25zdCBDTE9DS19SQURJVVMgPSAxMjg7XG5jb25zdCBDTE9DS19USUNLX1JBRElVUyA9IDE2O1xuY29uc3QgQ0xPQ0tfT1VURVJfUkFESVVTID0gMTAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xvY2tSYWRpdXModG91Y2hVaT86IGJvb2xlYW4pOiBudW1iZXIge1xuICByZXR1cm4gdG91Y2hVaSA/IENMT0NLX1JBRElVUyAqIFRPVUNIX1VJX01VTFRJUExJRVIgOiBDTE9DS19SQURJVVM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG9ja1RpY2tSYWRpdXModG91Y2hVaT86IGJvb2xlYW4pOiBudW1iZXIge1xuICByZXR1cm4gdG91Y2hVaVxuICAgID8gQ0xPQ0tfVElDS19SQURJVVMgKiBUT1VDSF9VSV9USUNLX01VTFRJUExJRVJcbiAgICA6IENMT0NLX1RJQ0tfUkFESVVTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xvY2tDb3JyZWN0ZWRSYWRpdXModG91Y2hVaT86IGJvb2xlYW4pOiBudW1iZXIge1xuICByZXR1cm4gZ2V0Q2xvY2tSYWRpdXModG91Y2hVaSkgLSBnZXRDbG9ja1RpY2tSYWRpdXModG91Y2hVaSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG9ja091dGVyUmFkaXVzKHRvdWNoVWk/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRvdWNoVWlcbiAgICA/IENMT0NLX09VVEVSX1JBRElVUyAqIFRPVUNIX1VJX01VTFRJUExJRVJcbiAgICA6IENMT0NLX09VVEVSX1JBRElVUztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb2NrSW5uZXJSYWRpdXModG91Y2hVaT86IGJvb2xlYW4pOiBudW1iZXIge1xuICByZXR1cm4gZ2V0Q2xvY2tPdXRlclJhZGl1cyh0b3VjaFVpKSAtIGdldENsb2NrVGlja1JhZGl1cyh0b3VjaFVpKSAqIDI7XG59XG4iXX0=
@@ -1,17 +1,14 @@
1
- import { DOCUMENT } from '@angular/common';
1
+ import { CommonModule, DOCUMENT } from '@angular/common';
2
2
  import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, ViewEncapsulation, } from '@angular/core';
3
+ import { MatButtonModule } from '@angular/material/button';
3
4
  import { debounceTime, fromEvent, merge, take } from 'rxjs';
5
+ import { getClockCorrectedRadius, getClockInnerRadius, getClockOuterRadius, getClockRadius, getClockTickRadius, } from './clock-size';
4
6
  import * as i0 from "@angular/core";
5
7
  import * as i1 from "@angular/common";
6
8
  import * as i2 from "@angular/material/button";
7
9
  export const ALL_HOURS = Array(24)
8
10
  .fill(null)
9
11
  .map((_, i) => i);
10
- const CLOCK_RADIUS = 128;
11
- const CLOCK_TICK_RADIUS = 16;
12
- const CLOCK_CORRECTED_RADIUS = CLOCK_RADIUS - CLOCK_TICK_RADIUS;
13
- const CLOCK_OUTER_RADIUS = 100;
14
- const CLOCK_INNER_RADIUS = CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS * 2;
15
12
  export class MatHoursClockDial {
16
13
  /** Selected hour. */
17
14
  get selectedHour() {
@@ -34,17 +31,24 @@ export class MatHoursClockDial {
34
31
  this._availableHours = value;
35
32
  this._initHours();
36
33
  }
34
+ /** Whether the timepicker UI is in touch mode. */
35
+ get touchUi() {
36
+ return this._touchUi;
37
+ }
38
+ set touchUi(value) {
39
+ this._touchUi = value;
40
+ this._initHours();
41
+ }
37
42
  get disabledHand() {
38
43
  return !this.availableHours.includes(this.selectedHour);
39
44
  }
40
45
  get isHour() {
41
46
  return !!this.hours.find((hour) => hour.value === this.selectedHour);
42
47
  }
43
- constructor(_element, _cdr, _document, _window) {
48
+ constructor(_element, _cdr, _document) {
44
49
  this._element = _element;
45
50
  this._cdr = _cdr;
46
51
  this._document = _document;
47
- this._window = _window;
48
52
  this._availableHours = [];
49
53
  /** Emits selected hour. */
50
54
  this.selectedChange = new EventEmitter();
@@ -58,7 +62,7 @@ export class MatHoursClockDial {
58
62
  const deg = Math.round(this.selectedHour * (360 / (24 / 2)));
59
63
  const radius = this._getRadius(this.selectedHour);
60
64
  const height = radius;
61
- const marginTop = CLOCK_RADIUS - radius;
65
+ const marginTop = getClockRadius(this.touchUi) - radius;
62
66
  return {
63
67
  transform: `rotate(${deg}deg)`,
64
68
  height: `${height}px`,
@@ -94,25 +98,23 @@ export class MatHoursClockDial {
94
98
  _isActiveCell(hour) {
95
99
  return this.selectedHour === hour;
96
100
  }
97
- _trackBy(index, cell) {
98
- return cell.value;
99
- }
100
101
  /** Changes selected hour based on coordinates. */
101
102
  _setHour(event) {
102
103
  const element = this._element.nativeElement;
104
+ const window = this._getWindow();
103
105
  const elementRect = element.getBoundingClientRect();
104
106
  const width = element.offsetWidth;
105
107
  const height = element.offsetHeight;
106
108
  const pageX = event instanceof MouseEvent ? event.pageX : event.touches[0].pageX;
107
109
  const pageY = event instanceof MouseEvent ? event.pageY : event.touches[0].pageY;
108
- const x = width / 2 - (pageX - elementRect.left - this._window.scrollX);
109
- const y = height / 2 - (pageY - elementRect.top - this._window.scrollY);
110
+ const x = width / 2 - (pageX - elementRect.left - window.scrollX);
111
+ const y = height / 2 - (pageY - elementRect.top - window.scrollY);
110
112
  const unit = Math.PI / 6;
111
113
  const atan2 = Math.atan2(-x, y);
112
114
  const radian = atan2 < 0 ? Math.PI * 2 + atan2 : atan2;
113
115
  const initialValue = Math.round(radian / unit);
114
116
  const z = Math.sqrt(x * x + y * y);
115
- const outer = z > CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS;
117
+ const outer = z > getClockOuterRadius(this.touchUi) - getClockTickRadius(this.touchUi);
116
118
  const value = this._getHourValue(initialValue, outer);
117
119
  if (this.availableHours.includes(value)) {
118
120
  this.selectedHour = value;
@@ -142,8 +144,8 @@ export class MatHoursClockDial {
142
144
  return {
143
145
  value: hour,
144
146
  displayValue: hour === 0 ? '00' : String(hour),
145
- left: CLOCK_CORRECTED_RADIUS + Math.sin(radian) * radius,
146
- top: CLOCK_CORRECTED_RADIUS - Math.cos(radian) * radius,
147
+ left: getClockCorrectedRadius(this.touchUi) + Math.sin(radian) * radius,
148
+ top: getClockCorrectedRadius(this.touchUi) - Math.cos(radian) * radius,
147
149
  disabled: !this.availableHours.includes(hour),
148
150
  };
149
151
  });
@@ -151,28 +153,29 @@ export class MatHoursClockDial {
151
153
  /** Returns radius based on hour */
152
154
  _getRadius(hour) {
153
155
  if (this.isMeridiem) {
154
- return CLOCK_OUTER_RADIUS;
156
+ return getClockOuterRadius(this.touchUi);
155
157
  }
156
158
  const outer = hour >= 0 && hour < 12;
157
- const radius = outer ? CLOCK_OUTER_RADIUS : CLOCK_INNER_RADIUS;
159
+ const radius = outer ? getClockOuterRadius(this.touchUi) : getClockInnerRadius(this.touchUi);
158
160
  return radius;
159
161
  }
160
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatHoursClockDial, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }, { token: Window }], target: i0.ɵɵFactoryTarget.Component }); }
161
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.5", type: MatHoursClockDial, selector: "mat-hours-clock-dial", inputs: { selectedHour: "selectedHour", isMeridiem: "isMeridiem", availableHours: "availableHours", color: "color" }, outputs: { selectedChange: "selectedChange" }, host: { listeners: { "mousedown": "_onUserAction($event)", "touchstart": "_onUserAction($event)" }, classAttribute: "mat-clock-dial mat-clock-dial-hours" }, exportAs: ["matHoursClockDial"], ngImport: i0, template: "<div\n class=\"mat-clock-dial-hand\"\n [class.mat-clock-dial-hand-pointless]=\"isHour\"\n [class.mat-clock-dial-hand-disabled]=\"disabledHand\"\n [ngStyle]=\"_handStyles()\"\n></div>\n<ng-template ngFor let-hour [ngForOf]=\"hours\" [ngForTrackBy]=\"_trackBy\">\n <button\n class=\"mat-clock-dial-cell\"\n mat-mini-fab\n disableRipple\n [tabIndex]=\"_isActiveCell(hour.value) ? 0 : -1\"\n [style.left.px]=\"hour.left\"\n [style.top.px]=\"hour.top\"\n [class.mat-clock-dial-cell-active]=\"_isActiveCell(hour.value)\"\n [class.mat-clock-dial-cell-disabled]=\"hour.disabled\"\n [color]=\"_isActiveCell(hour.value) ? color : undefined\"\n [attr.aria-disabled]=\"hour.disabled || null\"\n >\n {{ hour.displayValue }}\n </button>\n</ng-template>\n", styles: [".mat-clock-dial{position:relative;display:block;width:16rem;height:16rem;margin:0 auto;border-radius:50%}.mat-clock-dial:before{position:absolute;top:50%;left:50%;width:.4375rem;height:.4375rem;border-radius:50%;transform:translate(-50%,-50%);content:\"\"}[mat-mini-fab].mat-clock-dial-cell{position:absolute;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;box-shadow:none}[mat-mini-fab].mat-clock-dial-cell:disabled{pointer-events:none}[mat-mini-fab].mat-clock-dial-cell:focus,[mat-mini-fab].mat-clock-dial-cell:hover,[mat-mini-fab].mat-clock-dial-cell:active,[mat-mini-fab].mat-clock-dial-cell:focus:active{box-shadow:none}.mat-clock-dial-hand{position:absolute;inset:0;width:1px;margin:0 auto;transform-origin:bottom}.mat-clock-dial-hand:before{position:absolute;top:-.25rem;left:-.25rem;width:calc(.5rem + 1px);height:calc(.5rem + 1px);border-radius:50%;content:\"\"}.mat-clock-dial-hand.mat-clock-dial-hand-pointless:before{content:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
162
+ /** Use defaultView of injected document if available or fallback to global window reference */
163
+ _getWindow() {
164
+ return this._document.defaultView || window;
165
+ }
166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatHoursClockDial, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.5", type: MatHoursClockDial, isStandalone: true, selector: "mat-hours-clock-dial", inputs: { selectedHour: "selectedHour", isMeridiem: "isMeridiem", availableHours: "availableHours", color: "color", touchUi: "touchUi" }, outputs: { selectedChange: "selectedChange" }, host: { listeners: { "mousedown": "_onUserAction($event)", "touchstart": "_onUserAction($event)" }, classAttribute: "mat-clock-dial mat-clock-dial-hours" }, exportAs: ["matHoursClockDial"], ngImport: i0, template: "<div\n class=\"mat-clock-dial-hand\"\n [class.mat-clock-dial-hand-pointless]=\"isHour\"\n [class.mat-clock-dial-hand-disabled]=\"disabledHand\"\n [ngStyle]=\"_handStyles()\"\n></div>\n@for (hour of hours; track hour.value) {\n <button\n class=\"mat-clock-dial-cell\"\n mat-mini-fab\n disableRipple\n [tabIndex]=\"_isActiveCell(hour.value) ? 0 : -1\"\n [style.left.px]=\"hour.left\"\n [style.top.px]=\"hour.top\"\n [class.mat-clock-dial-cell-active]=\"_isActiveCell(hour.value)\"\n [class.mat-clock-dial-cell-disabled]=\"hour.disabled\"\n [color]=\"_isActiveCell(hour.value) ? color : undefined\"\n [attr.aria-disabled]=\"hour.disabled || null\"\n >\n {{ hour.displayValue }}\n </button>\n}\n", styles: [".mat-clock-dial{position:relative;display:block;width:16rem;height:16rem;margin:0 auto;border-radius:50%}.mat-clock-dial:before{position:absolute;top:50%;left:50%;width:.4375rem;height:.4375rem;border-radius:50%;transform:translate(-50%,-50%);content:\"\"}[mat-mini-fab].mat-clock-dial-cell{position:absolute;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;box-shadow:none}[mat-mini-fab].mat-clock-dial-cell:disabled{pointer-events:none}[mat-mini-fab].mat-clock-dial-cell:focus,[mat-mini-fab].mat-clock-dial-cell:hover,[mat-mini-fab].mat-clock-dial-cell:active,[mat-mini-fab].mat-clock-dial-cell:focus:active{box-shadow:none}.mat-timepicker-content-touch .mat-clock-dial{width:20rem;height:20rem}.mat-timepicker-content-touch [mat-mini-fab].mat-clock-dial-cell{width:3rem;height:3rem;font-size:1.125rem}.mat-clock-dial-hand{position:absolute;inset:0;width:1px;margin:0 auto;transform-origin:bottom}.mat-clock-dial-hand:before{position:absolute;top:-.25rem;left:-.25rem;width:calc(.5rem + 1px);height:calc(.5rem + 1px);border-radius:50%;content:\"\"}.mat-clock-dial-hand.mat-clock-dial-hand-pointless:before{content:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
162
168
  }
163
169
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatHoursClockDial, decorators: [{
164
170
  type: Component,
165
- args: [{ selector: 'mat-hours-clock-dial', exportAs: 'matHoursClockDial', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
171
+ args: [{ selector: 'mat-hours-clock-dial', standalone: true, imports: [CommonModule, MatButtonModule], exportAs: 'matHoursClockDial', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
166
172
  class: 'mat-clock-dial mat-clock-dial-hours',
167
173
  '(mousedown)': '_onUserAction($event)',
168
174
  '(touchstart)': '_onUserAction($event)',
169
- }, template: "<div\n class=\"mat-clock-dial-hand\"\n [class.mat-clock-dial-hand-pointless]=\"isHour\"\n [class.mat-clock-dial-hand-disabled]=\"disabledHand\"\n [ngStyle]=\"_handStyles()\"\n></div>\n<ng-template ngFor let-hour [ngForOf]=\"hours\" [ngForTrackBy]=\"_trackBy\">\n <button\n class=\"mat-clock-dial-cell\"\n mat-mini-fab\n disableRipple\n [tabIndex]=\"_isActiveCell(hour.value) ? 0 : -1\"\n [style.left.px]=\"hour.left\"\n [style.top.px]=\"hour.top\"\n [class.mat-clock-dial-cell-active]=\"_isActiveCell(hour.value)\"\n [class.mat-clock-dial-cell-disabled]=\"hour.disabled\"\n [color]=\"_isActiveCell(hour.value) ? color : undefined\"\n [attr.aria-disabled]=\"hour.disabled || null\"\n >\n {{ hour.displayValue }}\n </button>\n</ng-template>\n", styles: [".mat-clock-dial{position:relative;display:block;width:16rem;height:16rem;margin:0 auto;border-radius:50%}.mat-clock-dial:before{position:absolute;top:50%;left:50%;width:.4375rem;height:.4375rem;border-radius:50%;transform:translate(-50%,-50%);content:\"\"}[mat-mini-fab].mat-clock-dial-cell{position:absolute;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;box-shadow:none}[mat-mini-fab].mat-clock-dial-cell:disabled{pointer-events:none}[mat-mini-fab].mat-clock-dial-cell:focus,[mat-mini-fab].mat-clock-dial-cell:hover,[mat-mini-fab].mat-clock-dial-cell:active,[mat-mini-fab].mat-clock-dial-cell:focus:active{box-shadow:none}.mat-clock-dial-hand{position:absolute;inset:0;width:1px;margin:0 auto;transform-origin:bottom}.mat-clock-dial-hand:before{position:absolute;top:-.25rem;left:-.25rem;width:calc(.5rem + 1px);height:calc(.5rem + 1px);border-radius:50%;content:\"\"}.mat-clock-dial-hand.mat-clock-dial-hand-pointless:before{content:none}\n"] }]
175
+ }, template: "<div\n class=\"mat-clock-dial-hand\"\n [class.mat-clock-dial-hand-pointless]=\"isHour\"\n [class.mat-clock-dial-hand-disabled]=\"disabledHand\"\n [ngStyle]=\"_handStyles()\"\n></div>\n@for (hour of hours; track hour.value) {\n <button\n class=\"mat-clock-dial-cell\"\n mat-mini-fab\n disableRipple\n [tabIndex]=\"_isActiveCell(hour.value) ? 0 : -1\"\n [style.left.px]=\"hour.left\"\n [style.top.px]=\"hour.top\"\n [class.mat-clock-dial-cell-active]=\"_isActiveCell(hour.value)\"\n [class.mat-clock-dial-cell-disabled]=\"hour.disabled\"\n [color]=\"_isActiveCell(hour.value) ? color : undefined\"\n [attr.aria-disabled]=\"hour.disabled || null\"\n >\n {{ hour.displayValue }}\n </button>\n}\n", styles: [".mat-clock-dial{position:relative;display:block;width:16rem;height:16rem;margin:0 auto;border-radius:50%}.mat-clock-dial:before{position:absolute;top:50%;left:50%;width:.4375rem;height:.4375rem;border-radius:50%;transform:translate(-50%,-50%);content:\"\"}[mat-mini-fab].mat-clock-dial-cell{position:absolute;display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;box-shadow:none}[mat-mini-fab].mat-clock-dial-cell:disabled{pointer-events:none}[mat-mini-fab].mat-clock-dial-cell:focus,[mat-mini-fab].mat-clock-dial-cell:hover,[mat-mini-fab].mat-clock-dial-cell:active,[mat-mini-fab].mat-clock-dial-cell:focus:active{box-shadow:none}.mat-timepicker-content-touch .mat-clock-dial{width:20rem;height:20rem}.mat-timepicker-content-touch [mat-mini-fab].mat-clock-dial-cell{width:3rem;height:3rem;font-size:1.125rem}.mat-clock-dial-hand{position:absolute;inset:0;width:1px;margin:0 auto;transform-origin:bottom}.mat-clock-dial-hand:before{position:absolute;top:-.25rem;left:-.25rem;width:calc(.5rem + 1px);height:calc(.5rem + 1px);border-radius:50%;content:\"\"}.mat-clock-dial-hand.mat-clock-dial-hand-pointless:before{content:none}\n"] }]
170
176
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
171
177
  type: Inject,
172
178
  args: [DOCUMENT]
173
- }] }, { type: Window, decorators: [{
174
- type: Inject,
175
- args: [Window]
176
179
  }] }], propDecorators: { selectedHour: [{
177
180
  type: Input
178
181
  }], isMeridiem: [{
@@ -181,7 +184,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.5", ngImpor
181
184
  type: Input
182
185
  }], color: [{
183
186
  type: Input
187
+ }], touchUi: [{
188
+ type: Input
184
189
  }], selectedChange: [{
185
190
  type: Output
186
191
  }] } });
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91cnMtY2xvY2stZGlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10aW1lcGlja2VyL3NyYy9saWIvaG91cnMtY2xvY2stZGlhbC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10aW1lcGlja2VyL3NyYy9saWIvaG91cnMtY2xvY2stZGlhbC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFVNUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7S0FDL0IsSUFBSSxDQUFDLElBQUksQ0FBQztLQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUN6QixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLHNCQUFzQixHQUFHLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztBQUNoRSxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLGtCQUFrQixHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQWV0RSxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLHFCQUFxQjtJQUNyQixJQUNJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQUksWUFBWSxD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Z0JBV0csS0FBSztzQkFBYixLQUFLO2dCQUdJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZyb21FdmVudCwgbWVyZ2UsIHRha2UgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDbG9ja0RpYWxWaWV3Q2VsbCB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGRpc3BsYXlWYWx1ZTogc3RyaW5nO1xuICBsZWZ0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEFMTF9IT1VSUyA9IEFycmF5KDI0KVxuICAuZmlsbChudWxsKVxuICAubWFwKChfLCBpKSA9PiBpKTtcbmNvbnN0IENMT0NLX1JBRElVUyA9IDEyODtcbmNvbnN0IENMT0NLX1RJQ0tfUkFESVVTID0gMTY7XG5jb25zdCBDTE9DS19DT1JSRUNURURfUkFESVVTID0gQ0xPQ0tfUkFESVVTIC0gQ0xPQ0tfVElDS19SQURJVVM7XG5jb25zdCBDTE9DS19PVVRFUl9SQURJVVMgPSAxMDA7XG5jb25zdCBDTE9DS19JTk5FUl9SQURJVVMgPSBDTE9DS19PVVRFUl9SQURJVVMgLSBDTE9DS19USUNLX1JBRElVUyAqIDI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1ob3Vycy1jbG9jay1kaWFsJyxcbiAgdGVtcGxhdGVVcmw6ICdob3Vycy1jbG9jay1kaWFsLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnY2xvY2stZGlhbC5zY3NzJ10sXG4gIGV4cG9ydEFzOiAnbWF0SG91cnNDbG9ja0RpYWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnbWF0LWNsb2NrLWRpYWwgbWF0LWNsb2NrLWRpYWwtaG91cnMnLFxuICAgICcobW91c2Vkb3duKSc6ICdfb25Vc2VyQWN0aW9uKCRldmVudCknLFxuICAgICcodG91Y2hzdGFydCknOiAnX29uVXNlckFjdGlvbigkZXZlbnQpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0SG91cnNDbG9ja0RpYWwgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKiogU2VsZWN0ZWQgaG91ci4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGVkSG91cigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEhvdXI7XG4gIH1cbiAgc2V0IHNlbGVjdGVkSG91cih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRIb3VyID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRIb3VyOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNsb2NrIHVzZXMgMTIgaG91ciBmb3JtYXQuICovXG4gIEBJbnB1dCgpXG4gIGdldCBpc01lcmlkaWVtKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc01lcmlkaWVtO1xuICB9XG4gIHNldCBpc01lcmlkaWVtKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNNZXJpZGllbSA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2lzTWVyaWRpZW06IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgZ2V0IGF2YWlsYWJsZUhvdXJzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlSG91cnM7XG4gIH1cbiAgc2V0IGF2YWlsYWJsZUhvdXJzKHZhbHVlOiBudW1iZXJbXSkge1xuICAgIHRoaXMuX2F2YWlsYWJsZUhvdXJzID0gdmFsdWU7XG4gICAgdGhpcy5faW5pdEhvdXJzKCk7XG4gIH1cbiAgcHJpdmF0ZSBfYXZhaWxhYmxlSG91cnM6IG51bWJlcltdID0gW107XG5cbiAgLyoqIENvbG9yIHBhbGV0dGUuICovXG4gIEBJbnB1dCgpIGNvbG9yOiBUaGVtZVBhbGV0dGU7XG5cbiAgLyoqIEVtaXRzIHNlbGVjdGVkIGhvdXIuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGhvdXI6IG51bWJlcjtcbiAgICBjaGFuZ2VWaWV3PzogYm9vbGVhbjtcbiAgfT4oKTtcblxuICBob3VyczogQ2xvY2tEaWFsVmlld0NlbGxbXSA9IFtdO1xuXG4gIGdldCBkaXNhYmxlZEhhbmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmF2YWlsYWJsZUhvdXJzLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRIb3VyKTtcbiAgfVxuXG4gIGdldCBpc0hvdXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5ob3Vycy5maW5kKChob3VyKSA9PiBob3VyLnZhbHVlID09PSB0aGlzLnNlbGVjdGVkSG91cik7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBASW5qZWN0KFdpbmRvdykgcHJpdmF0ZSBfd2luZG93OiBXaW5kb3dcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRIb3VycygpO1xuICB9XG5cbiAgLyoqIEhhbmQgc3R5bGVzIGJhc2VkIG9uIHNlbGVjdGVkIGhvdXIuICovXG4gIF9oYW5kU3R5bGVzKCk6IGFueSB7XG4gICAgY29uc3QgZGVnID0gTWF0aC5yb3VuZCh0aGlzLnNlbGVjdGVkSG91ciAqICgzNjAgLyAoMjQgLyAyKSkpO1xuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuX2dldFJhZGl1cyh0aGlzLnNlbGVjdGVkSG91cik7XG4gICAgY29uc3QgaGVpZ2h0ID0gcmFkaXVzO1xuICAgIGNvbnN0IG1hcmdpblRvcCA9IENMT0NLX1JBRElVUyAtIHJhZGl1cztcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2Zvcm06IGByb3RhdGUoJHtkZWd9ZGVnKWAsXG4gICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAnbWFyZ2luLXRvcCc6IGAke21hcmdpblRvcH1weGAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIG1vdXNlIGFuZCB0b3VjaCBldmVudHMgb24gZGlhbCBhbmQgZG9jdW1lbnQuICovXG4gIF9vblVzZXJBY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0SG91cihldmVudCk7XG5cbiAgICBjb25zdCBldmVudHNTdWJzY3JpcHRpb24gPSBtZXJnZShcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ21vdXNlbW92ZScpLFxuICAgICAgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHRoaXMuX2RvY3VtZW50LCAndG91Y2htb3ZlJylcbiAgICApXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLl9zZXRIb3VyKGV2ZW50KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgbWVyZ2UoXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJyksXG4gICAgICBmcm9tRXZlbnQ8VG91Y2hFdmVudD4odGhpcy5fZG9jdW1lbnQsICd0b3VjaGVuZCcpXG4gICAgKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGhvdXI6IHRoaXMuc2VsZWN0ZWRIb3VyLFxuICAgICAgICAgICAgY2hhbmdlVmlldzogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgX2lzQWN0aXZlQ2VsbChob3VyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEhvdXIgPT09IGhvdXI7XG4gIH1cblxuICBfdHJhY2tCeShpbmRleDogbnVtYmVyLCBjZWxsOiBDbG9ja0RpYWxWaWV3Q2VsbCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGNlbGwudmFsdWU7XG4gIH1cblxuICAvKiogQ2hhbmdlcyBzZWxlY3RlZCBob3VyIGJhc2VkIG9uIGNvb3JkaW5hdGVzLiAqL1xuICBwcml2YXRlIF9zZXRIb3VyKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBwYWdlWCA9XG4gICAgICBldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQgPyBldmVudC5wYWdlWCA6IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVg7XG4gICAgY29uc3QgcGFnZVkgPVxuICAgICAgZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ID8gZXZlbnQucGFnZVkgOiBldmVudC50b3VjaGVzWzBdLnBhZ2VZO1xuICAgIGNvbnN0IHggPSB3aWR0aCAvIDIgLSAocGFnZVggLSBlbGVtZW50UmVjdC5sZWZ0IC0gdGhpcy5fd2luZG93LnNjcm9sbFgpO1xuICAgIGNvbnN0IHkgPSBoZWlnaHQgLyAyIC0gKHBhZ2VZIC0gZWxlbWVudFJlY3QudG9wIC0gdGhpcy5fd2luZG93LnNjcm9sbFkpO1xuICAgIGNvbnN0IHVuaXQgPSBNYXRoLlBJIC8gNjtcbiAgICBjb25zdCBhdGFuMiA9IE1hdGguYXRhbjIoLXgsIHkpO1xuICAgIGNvbnN0IHJhZGlhbiA9IGF0YW4yIDwgMCA/IE1hdGguUEkgKiAyICsgYXRhbjIgOiBhdGFuMjtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBNYXRoLnJvdW5kKHJhZGlhbiAvIHVuaXQpO1xuICAgIGNvbnN0IHogPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgY29uc3Qgb3V0ZXIgPSB6ID4gQ0xPQ0tfT1VURVJfUkFESVVTIC0gQ0xPQ0tfVElDS19SQURJVVM7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9nZXRIb3VyVmFsdWUoaW5pdGlhbFZhbHVlLCBvdXRlcik7XG5cbiAgICBpZiAodGhpcy5hdmFpbGFibGVIb3Vycy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gdmFsdWU7XG4gICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQoe1xuICAgICAgICBob3VyOiB0aGlzLnNlbGVjdGVkSG91cixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJuIHZhbHVlIG9mIGhvdXIuICovXG4gIHByaXZhdGUgX2dldEhvdXJWYWx1ZSh2YWx1ZTogbnVtYmVyLCBvdXRlcjogYm9vbGVhbik6IG51bWJlciB7XG4gICAgY29uc3QgZWRnZVZhbHVlID0gdmFsdWUgPT09IDAgfHwgdmFsdWUgPT09IDEyO1xuXG4gICAgaWYgKHRoaXMuaXNNZXJpZGllbSkge1xuICAgICAgcmV0dXJuIGVkZ2VWYWx1ZSA/IDEyIDogdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG91dGVyKSB7XG4gICAgICByZXR1cm4gZWRnZVZhbHVlID8gMCA6IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBlZGdlVmFsdWUgPyAxMiA6IHZhbHVlICsgMTI7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBsaXN0IG9mIGhvdXJzLiAqL1xuICBwcml2YXRlIF9pbml0SG91cnMoKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbEhvdXJzID0gdGhpcy5pc01lcmlkaWVtID8gQUxMX0hPVVJTLnNsaWNlKDEsIDEzKSA6IEFMTF9IT1VSUztcblxuICAgIHRoaXMuaG91cnMgPSBpbml0aWFsSG91cnMubWFwKChob3VyKSA9PiB7XG4gICAgICBjb25zdCByYWRpYW4gPSAoaG91ciAvIDYpICogTWF0aC5QSTtcbiAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuX2dldFJhZGl1cyhob3VyKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGhvdXIsXG4gICAgICAgIGRpc3BsYXlWYWx1ZTogaG91ciA9PT0gMCA/ICcwMCcgOiBTdHJpbmcoaG91ciksXG4gICAgICAgIGxlZnQ6IENMT0NLX0NPUlJFQ1RFRF9SQURJVVMgKyBNYXRoLnNpbihyYWRpYW4pICogcmFkaXVzLFxuICAgICAgICB0b3A6IENMT0NLX0NPUlJFQ1RFRF9SQURJVVMgLSBNYXRoLmNvcyhyYWRpYW4pICogcmFkaXVzLFxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuYXZhaWxhYmxlSG91cnMuaW5jbHVkZXMoaG91ciksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgcmFkaXVzIGJhc2VkIG9uIGhvdXIgKi9cbiAgcHJpdmF0ZSBfZ2V0UmFkaXVzKGhvdXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaXNNZXJpZGllbSkge1xuICAgICAgcmV0dXJuIENMT0NLX09VVEVSX1JBRElVUztcbiAgICB9XG5cbiAgICBjb25zdCBvdXRlciA9IGhvdXIgPj0gMCAmJiBob3VyIDwgMTI7XG4gICAgY29uc3QgcmFkaXVzID0gb3V0ZXIgPyBDTE9DS19PVVRFUl9SQURJVVMgOiBDTE9DS19JTk5FUl9SQURJVVM7XG5cbiAgICByZXR1cm4gcmFkaXVzO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwibWF0LWNsb2NrLWRpYWwtaGFuZFwiXG4gIFtjbGFzcy5tYXQtY2xvY2stZGlhbC1oYW5kLXBvaW50bGVzc109XCJpc0hvdXJcIlxuICBbY2xhc3MubWF0LWNsb2NrLWRpYWwtaGFuZC1kaXNhYmxlZF09XCJkaXNhYmxlZEhhbmRcIlxuICBbbmdTdHlsZV09XCJfaGFuZFN0eWxlcygpXCJcbj48L2Rpdj5cbjxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaG91ciBbbmdGb3JPZl09XCJob3Vyc1wiIFtuZ0ZvclRyYWNrQnldPVwiX3RyYWNrQnlcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwibWF0LWNsb2NrLWRpYWwtY2VsbFwiXG4gICAgbWF0LW1pbmktZmFiXG4gICAgZGlzYWJsZVJpcHBsZVxuICAgIFt0YWJJbmRleF09XCJfaXNBY3RpdmVDZWxsKGhvdXIudmFsdWUpID8gMCA6IC0xXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJob3VyLmxlZnRcIlxuICAgIFtzdHlsZS50b3AucHhdPVwiaG91ci50b3BcIlxuICAgIFtjbGFzcy5tYXQtY2xvY2stZGlhbC1jZWxsLWFjdGl2ZV09XCJfaXNBY3RpdmVDZWxsKGhvdXIudmFsdWUpXCJcbiAgICBbY2xhc3MubWF0LWNsb2NrLWRpYWwtY2VsbC1kaXNhYmxlZF09XCJob3VyLmRpc2FibGVkXCJcbiAgICBbY29sb3JdPVwiX2lzQWN0aXZlQ2VsbChob3VyLnZhbHVlKSA/IGNvbG9yIDogdW5kZWZpbmVkXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImhvdXIuZGlzYWJsZWQgfHwgbnVsbFwiXG4gID5cbiAgICB7eyBob3VyLmRpc3BsYXlWYWx1ZSB9fVxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91cnMtY2xvY2stZGlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10aW1lcGlja2VyL3NyYy9saWIvaG91cnMtY2xvY2stZGlhbC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10aW1lcGlja2VyL3NyYy9saWIvaG91cnMtY2xvY2stZGlhbC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGtCQUFrQixHQUNuQixNQUFNLGNBQWMsQ0FBQzs7OztBQVV0QixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztLQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFpQnBCLE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIscUJBQXFCO0lBQ3JCLElBQ0ksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixD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cEQ5Qiw2dEJBc0JBLDJzQ0RrQlksWUFBWSxtSEFBRSxlQUFlOzsyRkFZNUIsaUJBQWlCO2tCQWY3QixTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLFlBRzlCLG1CQUFtQixtQkFDWix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLEtBQUssRUFBRSxxQ0FBcUM7d0JBQzVDLGFBQWEsRUFBRSx1QkFBdUI7d0JBQ3RDLGNBQWMsRUFBRSx1QkFBdUI7cUJBQ3hDOzswQkFrRUUsTUFBTTsyQkFBQyxRQUFRO3lDQTdEZCxZQUFZO3NCQURmLEtBQUs7Z0JBV0YsVUFBVTtzQkFEYixLQUFLO2dCQVVGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBV0csS0FBSztzQkFBYixLQUFLO2dCQUlGLE9BQU87c0JBRFYsS0FBSztnQkFXSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmcm9tRXZlbnQsIG1lcmdlLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIGdldENsb2NrQ29ycmVjdGVkUmFkaXVzLFxuICBnZXRDbG9ja0lubmVyUmFkaXVzLFxuICBnZXRDbG9ja091dGVyUmFkaXVzLFxuICBnZXRDbG9ja1JhZGl1cyxcbiAgZ2V0Q2xvY2tUaWNrUmFkaXVzLFxufSBmcm9tICcuL2Nsb2NrLXNpemUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb2NrRGlhbFZpZXdDZWxsIHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgZGlzcGxheVZhbHVlOiBzdHJpbmc7XG4gIGxlZnQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG4gIGRpc2FibGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQUxMX0hPVVJTID0gQXJyYXkoMjQpXG4gIC5maWxsKG51bGwpXG4gIC5tYXAoKF8sIGkpID0+IGkpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtaG91cnMtY2xvY2stZGlhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnaG91cnMtY2xvY2stZGlhbC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2Nsb2NrLWRpYWwuc2NzcyddLFxuICBleHBvcnRBczogJ21hdEhvdXJzQ2xvY2tEaWFsJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ21hdC1jbG9jay1kaWFsIG1hdC1jbG9jay1kaWFsLWhvdXJzJyxcbiAgICAnKG1vdXNlZG93biknOiAnX29uVXNlckFjdGlvbigkZXZlbnQpJyxcbiAgICAnKHRvdWNoc3RhcnQpJzogJ19vblVzZXJBY3Rpb24oJGV2ZW50KScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdEhvdXJzQ2xvY2tEaWFsIGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqIFNlbGVjdGVkIGhvdXIuICovXG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RlZEhvdXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRIb3VyO1xuICB9XG4gIHNldCBzZWxlY3RlZEhvdXIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NlbGVjdGVkSG91ciA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkSG91cjogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjbG9jayB1c2VzIDEyIGhvdXIgZm9ybWF0LiAqL1xuICBASW5wdXQoKVxuICBnZXQgaXNNZXJpZGllbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNNZXJpZGllbTtcbiAgfVxuICBzZXQgaXNNZXJpZGllbSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzTWVyaWRpZW0gPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9pc01lcmlkaWVtOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBhdmFpbGFibGVIb3VycygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZUhvdXJzO1xuICB9XG4gIHNldCBhdmFpbGFibGVIb3Vycyh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLl9hdmFpbGFibGVIb3VycyA9IHZhbHVlO1xuICAgIHRoaXMuX2luaXRIb3VycygpO1xuICB9XG4gIHByaXZhdGUgX2F2YWlsYWJsZUhvdXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKiBDb2xvciBwYWxldHRlLiAqL1xuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSB0aW1lcGlja2VyIFVJIGlzIGluIHRvdWNoIG1vZGUuICovXG4gIEBJbnB1dCgpXG4gIGdldCB0b3VjaFVpKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90b3VjaFVpO1xuICB9XG4gIHNldCB0b3VjaFVpKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdG91Y2hVaSA9IHZhbHVlO1xuICAgIHRoaXMuX2luaXRIb3VycygpO1xuICB9XG4gIHByaXZhdGUgX3RvdWNoVWk6IGJvb2xlYW47XG5cbiAgLyoqIEVtaXRzIHNlbGVjdGVkIGhvdXIuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGhvdXI6IG51bWJlcjtcbiAgICBjaGFuZ2VWaWV3PzogYm9vbGVhbjtcbiAgfT4oKTtcblxuICBob3VyczogQ2xvY2tEaWFsVmlld0NlbGxbXSA9IFtdO1xuXG4gIGdldCBkaXNhYmxlZEhhbmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmF2YWlsYWJsZUhvdXJzLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRIb3VyKTtcbiAgfVxuXG4gIGdldCBpc0hvdXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5ob3Vycy5maW5kKChob3VyKSA9PiBob3VyLnZhbHVlID09PSB0aGlzLnNlbGVjdGVkSG91cik7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRIb3VycygpO1xuICB9XG5cbiAgLyoqIEhhbmQgc3R5bGVzIGJhc2VkIG9uIHNlbGVjdGVkIGhvdXIuICovXG4gIF9oYW5kU3R5bGVzKCk6IGFueSB7XG4gICAgY29uc3QgZGVnID0gTWF0aC5yb3VuZCh0aGlzLnNlbGVjdGVkSG91ciAqICgzNjAgLyAoMjQgLyAyKSkpO1xuICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuX2dldFJhZGl1cyh0aGlzLnNlbGVjdGVkSG91cik7XG4gICAgY29uc3QgaGVpZ2h0ID0gcmFkaXVzO1xuICAgIGNvbnN0IG1hcmdpblRvcCA9IGdldENsb2NrUmFkaXVzKHRoaXMudG91Y2hVaSkgLSByYWRpdXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNmb3JtOiBgcm90YXRlKCR7ZGVnfWRlZylgLFxuICAgICAgaGVpZ2h0OiBgJHtoZWlnaHR9cHhgLFxuICAgICAgJ21hcmdpbi10b3AnOiBgJHttYXJnaW5Ub3B9cHhgLFxuICAgIH07XG4gIH1cblxuICAvKiogSGFuZGxlcyBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzIG9uIGRpYWwgYW5kIGRvY3VtZW50LiAqL1xuICBfb25Vc2VyQWN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEhvdXIoZXZlbnQpO1xuXG4gICAgY29uc3QgZXZlbnRzU3Vic2NyaXB0aW9uID0gbWVyZ2UoXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZG9jdW1lbnQsICdtb3VzZW1vdmUnKSxcbiAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ3RvdWNobW92ZScpLFxuICAgIClcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgwKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuX3NldEhvdXIoZXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICBtZXJnZShcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ21vdXNldXAnKSxcbiAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ3RvdWNoZW5kJyksXG4gICAgKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGhvdXI6IHRoaXMuc2VsZWN0ZWRIb3VyLFxuICAgICAgICAgICAgY2hhbmdlVmlldzogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgX2lzQWN0aXZlQ2VsbChob3VyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEhvdXIgPT09IGhvdXI7XG4gIH1cblxuICAvKiogQ2hhbmdlcyBzZWxlY3RlZCBob3VyIGJhc2VkIG9uIGNvb3JkaW5hdGVzLiAqL1xuICBwcml2YXRlIF9zZXRIb3VyKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBwYWdlWCA9IGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCA/IGV2ZW50LnBhZ2VYIDogZXZlbnQudG91Y2hlc1swXS5wYWdlWDtcbiAgICBjb25zdCBwYWdlWSA9IGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCA/IGV2ZW50LnBhZ2VZIDogZXZlbnQudG91Y2hlc1swXS5wYWdlWTtcbiAgICBjb25zdCB4ID0gd2lkdGggLyAyIC0gKHBhZ2VYIC0gZWxlbWVudFJlY3QubGVmdCAtIHdpbmRvdy5zY3JvbGxYKTtcbiAgICBjb25zdCB5ID0gaGVpZ2h0IC8gMiAtIChwYWdlWSAtIGVsZW1lbnRSZWN0LnRvcCAtIHdpbmRvdy5zY3JvbGxZKTtcbiAgICBjb25zdCB1bml0ID0gTWF0aC5QSSAvIDY7XG4gICAgY29uc3QgYXRhbjIgPSBNYXRoLmF0YW4yKC14LCB5KTtcbiAgICBjb25zdCByYWRpYW4gPSBhdGFuMiA8IDAgPyBNYXRoLlBJICogMiArIGF0YW4yIDogYXRhbjI7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gTWF0aC5yb3VuZChyYWRpYW4gLyB1bml0KTtcbiAgICBjb25zdCB6ID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgIGNvbnN0IG91dGVyID0geiA+IGdldENsb2NrT3V0ZXJSYWRpdXModGhpcy50b3VjaFVpKSAtIGdldENsb2NrVGlja1JhZGl1cyh0aGlzLnRvdWNoVWkpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0SG91clZhbHVlKGluaXRpYWxWYWx1ZSwgb3V0ZXIpO1xuXG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlSG91cnMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHtcbiAgICAgICAgaG91cjogdGhpcy5zZWxlY3RlZEhvdXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIFJldHVybiB2YWx1ZSBvZiBob3VyLiAqL1xuICBwcml2YXRlIF9nZXRIb3VyVmFsdWUodmFsdWU6IG51bWJlciwgb3V0ZXI6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGNvbnN0IGVkZ2VWYWx1ZSA9IHZhbHVlID09PSAwIHx8IHZhbHVlID09PSAxMjtcblxuICAgIGlmICh0aGlzLmlzTWVyaWRpZW0pIHtcbiAgICAgIHJldHVybiBlZGdlVmFsdWUgPyAxMiA6IHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChvdXRlcikge1xuICAgICAgcmV0dXJuIGVkZ2VWYWx1ZSA/IDAgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWRnZVZhbHVlID8gMTIgOiB2YWx1ZSArIDEyO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgbGlzdCBvZiBob3Vycy4gKi9cbiAgcHJpdmF0ZSBfaW5pdEhvdXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWxIb3VycyA9IHRoaXMuaXNNZXJpZGllbSA/IEFMTF9IT1VSUy5zbGljZSgxLCAxMykgOiBBTExfSE9VUlM7XG5cbiAgICB0aGlzLmhvdXJzID0gaW5pdGlhbEhvdXJzLm1hcCgoaG91cikgPT4ge1xuICAgICAgY29uc3QgcmFkaWFuID0gKGhvdXIgLyA2KSAqIE1hdGguUEk7XG4gICAgICBjb25zdCByYWRpdXMgPSB0aGlzLl9nZXRSYWRpdXMoaG91cik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBob3VyLFxuICAgICAgICBkaXNwbGF5VmFsdWU6IGhvdXIgPT09IDAgPyAnMDAnIDogU3RyaW5nKGhvdXIpLFxuICAgICAgICBsZWZ0OiBnZXRDbG9ja0NvcnJlY3RlZFJhZGl1cyh0aGlzLnRvdWNoVWkpICsgTWF0aC5zaW4ocmFkaWFuKSAqIHJhZGl1cyxcbiAgICAgICAgdG9wOiBnZXRDbG9ja0NvcnJlY3RlZFJhZGl1cyh0aGlzLnRvdWNoVWkpIC0gTWF0aC5jb3MocmFkaWFuKSAqIHJhZGl1cyxcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmF2YWlsYWJsZUhvdXJzLmluY2x1ZGVzKGhvdXIpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHJhZGl1cyBiYXNlZCBvbiBob3VyICovXG4gIHByaXZhdGUgX2dldFJhZGl1cyhob3VyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmlzTWVyaWRpZW0pIHtcbiAgICAgIHJldHVybiBnZXRDbG9ja091dGVyUmFkaXVzKHRoaXMudG91Y2hVaSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0ZXIgPSBob3VyID49IDAgJiYgaG91ciA8IDEyO1xuICAgIGNvbnN0IHJhZGl1cyA9IG91dGVyID8gZ2V0Q2xvY2tPdXRlclJhZGl1cyh0aGlzLnRvdWNoVWkpIDogZ2V0Q2xvY2tJbm5lclJhZGl1cyh0aGlzLnRvdWNoVWkpO1xuXG4gICAgcmV0dXJuIHJhZGl1cztcbiAgfVxuXG4gIC8qKiBVc2UgZGVmYXVsdFZpZXcgb2YgaW5qZWN0ZWQgZG9jdW1lbnQgaWYgYXZhaWxhYmxlIG9yIGZhbGxiYWNrIHRvIGdsb2JhbCB3aW5kb3cgcmVmZXJlbmNlICovXG4gIHByaXZhdGUgX2dldFdpbmRvdygpOiBXaW5kb3cge1xuICAgIHJldHVybiB0aGlzLl9kb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJtYXQtY2xvY2stZGlhbC1oYW5kXCJcbiAgW2NsYXNzLm1hdC1jbG9jay1kaWFsLWhhbmQtcG9pbnRsZXNzXT1cImlzSG91clwiXG4gIFtjbGFzcy5tYXQtY2xvY2stZGlhbC1oYW5kLWRpc2FibGVkXT1cImRpc2FibGVkSGFuZFwiXG4gIFtuZ1N0eWxlXT1cIl9oYW5kU3R5bGVzKClcIlxuPjwvZGl2PlxuQGZvciAoaG91ciBvZiBob3VyczsgdHJhY2sgaG91ci52YWx1ZSkge1xuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJtYXQtY2xvY2stZGlhbC1jZWxsXCJcbiAgICBtYXQtbWluaS1mYWJcbiAgICBkaXNhYmxlUmlwcGxlXG4gICAgW3RhYkluZGV4XT1cIl9pc0FjdGl2ZUNlbGwoaG91ci52YWx1ZSkgPyAwIDogLTFcIlxuICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdXIubGVmdFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJob3VyLnRvcFwiXG4gICAgW2NsYXNzLm1hdC1jbG9jay1kaWFsLWNlbGwtYWN0aXZlXT1cIl9pc0FjdGl2ZUNlbGwoaG91ci52YWx1ZSlcIlxuICAgIFtjbGFzcy5tYXQtY2xvY2stZGlhbC1jZWxsLWRpc2FibGVkXT1cImhvdXIuZGlzYWJsZWRcIlxuICAgIFtjb2xvcl09XCJfaXNBY3RpdmVDZWxsKGhvdXIudmFsdWUpID8gY29sb3IgOiB1bmRlZmluZWRcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaG91ci5kaXNhYmxlZCB8fCBudWxsXCJcbiAgPlxuICAgIHt7IGhvdXIuZGlzcGxheVZhbHVlIH19XG4gIDwvYnV0dG9uPlxufVxuIl19