nxt-pick-datetime 18.0.0 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs +23 -26
  2. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  3. package/fesm2022/nxt-pick-datetime-native-adapter.mjs +22 -24
  4. package/fesm2022/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  5. package/fesm2022/nxt-pick-datetime.mjs +76 -74
  6. package/fesm2022/nxt-pick-datetime.mjs.map +1 -1
  7. package/lib/class/date-time.class.d.ts +1 -1
  8. package/moment-adapter/moment-adapter.module.d.ts +2 -0
  9. package/moment-adapter/public-api.d.ts +1 -1
  10. package/native-adapter/native-adapter.module.d.ts +2 -0
  11. package/native-adapter/public-api.d.ts +1 -1
  12. package/package.json +9 -14
  13. package/esm2022/lib/class/date-time-adapter.class.mjs +0 -97
  14. package/esm2022/lib/class/date-time-format.class.mjs +0 -4
  15. package/esm2022/lib/class/date-time.class.mjs +0 -95
  16. package/esm2022/lib/class/dialog-config.class.mjs +0 -47
  17. package/esm2022/lib/class/dialog-ref.class.mjs +0 -119
  18. package/esm2022/lib/date-time/calendar/calendar.component.mjs +0 -346
  19. package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
  20. package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
  21. package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
  22. package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
  23. package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
  24. package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
  25. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +0 -19
  26. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
  27. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -618
  28. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +0 -61
  29. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  30. package/esm2022/lib/date-time/date-time.module.mjs +0 -96
  31. package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +0 -22
  32. package/esm2022/lib/date-time/timer/timer.component.mjs +0 -299
  33. package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +0 -95
  34. package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
  35. package/esm2022/lib/dialog/dialog.module.mjs +0 -42
  36. package/esm2022/lib/dialog/dialog.service.mjs +0 -251
  37. package/esm2022/lib/utils/object.mjs +0 -24
  38. package/esm2022/moment-adapter/date-time-adapter.class.mjs +0 -220
  39. package/esm2022/moment-adapter/date-time-format.class.mjs +0 -13
  40. package/esm2022/moment-adapter/moment-adapter.module.mjs +0 -37
  41. package/esm2022/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +0 -5
  42. package/esm2022/moment-adapter/public-api.mjs +0 -3
  43. package/esm2022/native-adapter/date-time-adapter.class.mjs +0 -366
  44. package/esm2022/native-adapter/date-time-format.class.mjs +0 -13
  45. package/esm2022/native-adapter/native-adapter.module.mjs +0 -37
  46. package/esm2022/native-adapter/nxt-pick-datetime-native-adapter.mjs +0 -5
  47. package/esm2022/native-adapter/public-api.mjs +0 -2
  48. package/esm2022/nxt-pick-datetime.mjs +0 -5
  49. package/esm2022/public-api.mjs +0 -14
@@ -1,299 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
2
- import { take } from 'rxjs/operators';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../date-time-picker-intl.service";
5
- import * as i2 from "../../class/date-time-adapter.class";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "../timer-box/timer-box.component";
8
- export class TimerComponent {
9
- get pickerMoment() {
10
- return this._pickerMoment;
11
- }
12
- set pickerMoment(value) {
13
- value = this.dateTimeAdapter.deserialize(value);
14
- this._pickerMoment = this.getValidDate(value) || this.dateTimeAdapter.now();
15
- }
16
- get min() {
17
- return this._minDateTime;
18
- }
19
- set min(value) {
20
- value = this.dateTimeAdapter.deserialize(value);
21
- this._minDateTime = this.getValidDate(value);
22
- }
23
- get max() {
24
- return this._maxDateTime;
25
- }
26
- set max(value) {
27
- value = this.dateTimeAdapter.deserialize(value);
28
- this._maxDateTime = this.getValidDate(value);
29
- }
30
- get hourValue() {
31
- return this.dateTimeAdapter.getHours(this.pickerMoment);
32
- }
33
- /**
34
- * The value would be displayed in hourBox.
35
- * We need this because the value displayed in hourBox it not
36
- * the same as the hourValue when the timer is in hour12Timer mode.
37
- */
38
- get hourBoxValue() {
39
- let hours = this.hourValue;
40
- if (!this.hour12Timer) {
41
- return hours;
42
- }
43
- else {
44
- if (hours === 0) {
45
- hours = 12;
46
- this.isPM = false;
47
- }
48
- else if (hours > 0 && hours < 12) {
49
- this.isPM = false;
50
- }
51
- else if (hours === 12) {
52
- this.isPM = true;
53
- }
54
- else if (hours > 12 && hours < 24) {
55
- hours = hours - 12;
56
- this.isPM = true;
57
- }
58
- return hours;
59
- }
60
- }
61
- get minuteValue() {
62
- return this.dateTimeAdapter.getMinutes(this.pickerMoment);
63
- }
64
- get secondValue() {
65
- return this.dateTimeAdapter.getSeconds(this.pickerMoment);
66
- }
67
- get upHourButtonLabel() {
68
- return this.pickerIntl.upHourLabel;
69
- }
70
- get downHourButtonLabel() {
71
- return this.pickerIntl.downHourLabel;
72
- }
73
- get upMinuteButtonLabel() {
74
- return this.pickerIntl.upMinuteLabel;
75
- }
76
- get downMinuteButtonLabel() {
77
- return this.pickerIntl.downMinuteLabel;
78
- }
79
- get upSecondButtonLabel() {
80
- return this.pickerIntl.upSecondLabel;
81
- }
82
- get downSecondButtonLabel() {
83
- return this.pickerIntl.downSecondLabel;
84
- }
85
- get hour12ButtonLabel() {
86
- return this.isPM
87
- ? this.pickerIntl.hour12PMLabel
88
- : this.pickerIntl.hour12AMLabel;
89
- }
90
- /** @internal */
91
- get timerClass() {
92
- return true;
93
- }
94
- /** @internal */
95
- get timeTabIndex() {
96
- return -1;
97
- }
98
- constructor(ngZone, elmRef, pickerIntl, cdRef, dateTimeAdapter) {
99
- this.ngZone = ngZone;
100
- this.elmRef = elmRef;
101
- this.pickerIntl = pickerIntl;
102
- this.cdRef = cdRef;
103
- this.dateTimeAdapter = dateTimeAdapter;
104
- this.isPM = false; // a flag indicates the current timer moment is in PM or AM
105
- /**
106
- * Whether to show the second's timer
107
- */
108
- this.showSecondsTimer = false;
109
- /**
110
- * Whether the timer is in hour12 format
111
- */
112
- this.hour12Timer = false;
113
- /**
114
- * Hours to change per step
115
- */
116
- this.stepHour = 1;
117
- /**
118
- * Minutes to change per step
119
- */
120
- this.stepMinute = 1;
121
- /**
122
- * Seconds to change per step
123
- */
124
- this.stepSecond = 1;
125
- this.selectedChange = new EventEmitter();
126
- }
127
- ngOnInit() { }
128
- /**
129
- * Focus to the host element
130
- */
131
- focus() {
132
- this.ngZone.runOutsideAngular(() => {
133
- this.ngZone.onStable
134
- .asObservable()
135
- .pipe(take(1))
136
- .subscribe(() => {
137
- this.elmRef.nativeElement.focus();
138
- });
139
- });
140
- }
141
- /**
142
- * Set the hour value via typing into timer box input
143
- * We need this to handle the hour value when the timer is in hour12 mode
144
- */
145
- setHourValueViaInput(hours) {
146
- if (this.hour12Timer && this.isPM && hours >= 1 && hours <= 11) {
147
- hours = hours + 12;
148
- }
149
- else if (this.hour12Timer && !this.isPM && hours === 12) {
150
- hours = 0;
151
- }
152
- this.setHourValue(hours);
153
- }
154
- setHourValue(hours) {
155
- const m = this.dateTimeAdapter.setHours(this.pickerMoment, hours);
156
- this.selectedChange.emit(m);
157
- this.cdRef.markForCheck();
158
- }
159
- setMinuteValue(minutes) {
160
- const m = this.dateTimeAdapter.setMinutes(this.pickerMoment, minutes);
161
- this.selectedChange.emit(m);
162
- this.cdRef.markForCheck();
163
- }
164
- setSecondValue(seconds) {
165
- const m = this.dateTimeAdapter.setSeconds(this.pickerMoment, seconds);
166
- this.selectedChange.emit(m);
167
- this.cdRef.markForCheck();
168
- }
169
- setMeridiem(event) {
170
- this.isPM = !this.isPM;
171
- let hours = this.hourValue;
172
- if (this.isPM) {
173
- hours = hours + 12;
174
- }
175
- else {
176
- hours = hours - 12;
177
- }
178
- if (hours >= 0 && hours <= 23) {
179
- this.setHourValue(hours);
180
- }
181
- this.cdRef.markForCheck();
182
- event.preventDefault();
183
- }
184
- /**
185
- * Check if the up hour button is enabled
186
- */
187
- upHourEnabled() {
188
- return (!this.max ||
189
- this.compareHours(this.stepHour, this.max) < 1);
190
- }
191
- /**
192
- * Check if the down hour button is enabled
193
- */
194
- downHourEnabled() {
195
- return (!this.min ||
196
- this.compareHours(-this.stepHour, this.min) > -1);
197
- }
198
- /**
199
- * Check if the up minute button is enabled
200
- */
201
- upMinuteEnabled() {
202
- return (!this.max ||
203
- this.compareMinutes(this.stepMinute, this.max) < 1);
204
- }
205
- /**
206
- * Check if the down minute button is enabled
207
- */
208
- downMinuteEnabled() {
209
- return (!this.min ||
210
- this.compareMinutes(-this.stepMinute, this.min) > -1);
211
- }
212
- /**
213
- * Check if the up second button is enabled
214
- */
215
- upSecondEnabled() {
216
- return (!this.max ||
217
- this.compareSeconds(this.stepSecond, this.max) < 1);
218
- }
219
- /**
220
- * Check if the down second button is enabled
221
- */
222
- downSecondEnabled() {
223
- return (!this.min ||
224
- this.compareSeconds(-this.stepSecond, this.min) > -1);
225
- }
226
- /**
227
- * PickerMoment's hour value +/- certain amount and compare it to the give date
228
- * 1 is after the comparedDate
229
- * -1 is before the comparedDate
230
- * 0 is equal the comparedDate
231
- */
232
- compareHours(amount, comparedDate) {
233
- const hours = this.dateTimeAdapter.getHours(this.pickerMoment) + amount;
234
- const result = this.dateTimeAdapter.setHours(this.pickerMoment, hours);
235
- return this.dateTimeAdapter.compare(result, comparedDate);
236
- }
237
- /**
238
- * PickerMoment's minute value +/- certain amount and compare it to the give date
239
- * 1 is after the comparedDate
240
- * -1 is before the comparedDate
241
- * 0 is equal the comparedDate
242
- */
243
- compareMinutes(amount, comparedDate) {
244
- const minutes = this.dateTimeAdapter.getMinutes(this.pickerMoment) + amount;
245
- const result = this.dateTimeAdapter.setMinutes(this.pickerMoment, minutes);
246
- return this.dateTimeAdapter.compare(result, comparedDate);
247
- }
248
- /**
249
- * PickerMoment's second value +/- certain amount and compare it to the give date
250
- * 1 is after the comparedDate
251
- * -1 is before the comparedDate
252
- * 0 is equal the comparedDate
253
- */
254
- compareSeconds(amount, comparedDate) {
255
- const seconds = this.dateTimeAdapter.getSeconds(this.pickerMoment) + amount;
256
- const result = this.dateTimeAdapter.setSeconds(this.pickerMoment, seconds);
257
- return this.dateTimeAdapter.compare(result, comparedDate);
258
- }
259
- /**
260
- * Get a valid date object
261
- */
262
- getValidDate(obj) {
263
- return this.dateTimeAdapter.isDateInstance(obj) &&
264
- this.dateTimeAdapter.isValid(obj)
265
- ? obj
266
- : undefined;
267
- }
268
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: TimerComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i1.DateTimeIntl }, { token: i0.ChangeDetectorRef }, { token: i2.DateTimeAdapter }], target: i0.ɵɵFactoryTarget.Component }); }
269
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: TimerComponent, selector: "nxt-date-time-timer", inputs: { pickerMoment: "pickerMoment", min: "min", max: "max", showSecondsTimer: "showSecondsTimer", hour12Timer: "hour12Timer", stepHour: "stepHour", stepMinute: "stepMinute", stepSecond: "stepSecond" }, outputs: { selectedChange: "selectedChange" }, host: { properties: { "class.nxt-dt-timer": "this.timerClass", "attr.tabindex": "this.timeTabIndex" } }, ngImport: i0, template: "<nxt-date-time-timer-box [upBtnAriaLabel]=\"upHourButtonLabel\"\r\n [downBtnAriaLabel]=\"downHourButtonLabel\"\r\n [upBtnDisabled]=\"!upHourEnabled()\"\r\n [downBtnDisabled]=\"!downHourEnabled()\"\r\n [boxValue]=\"hourBoxValue\"\r\n [value]=\"hourValue\"\r\n [min]=\"0\"\r\n [max]=\"23\"\r\n [step]=\"stepHour\"\r\n inputLabel=\"Hour\"\r\n (inputChange)=\"setHourValueViaInput($event)\"\r\n (valueChange)=\"setHourValue($event)\"></nxt-date-time-timer-box>\r\n<nxt-date-time-timer-box [showDivider]=\"true\"\r\n [upBtnAriaLabel]=\"upMinuteButtonLabel\"\r\n [downBtnAriaLabel]=\"downMinuteButtonLabel\"\r\n [upBtnDisabled]=\"!upMinuteEnabled()\"\r\n [downBtnDisabled]=\"!downMinuteEnabled()\"\r\n [value]=\"minuteValue\"\r\n [min]=\"0\"\r\n [max]=\"59\"\r\n [step]=\"stepMinute\"\r\n inputLabel=\"Minute\"\r\n (inputChange)=\"setMinuteValue($event)\"\r\n (valueChange)=\"setMinuteValue($event)\"></nxt-date-time-timer-box>\r\n<nxt-date-time-timer-box *ngIf=\"showSecondsTimer\"\r\n [showDivider]=\"true\"\r\n [upBtnAriaLabel]=\"upSecondButtonLabel\"\r\n [downBtnAriaLabel]=\"downSecondButtonLabel\"\r\n [upBtnDisabled]=\"!upSecondEnabled()\"\r\n [downBtnDisabled]=\"!downSecondEnabled()\"\r\n [value]=\"secondValue\"\r\n [min]=\"0\"\r\n [max]=\"59\"\r\n [step]=\"stepSecond\"\r\n inputLabel=\"Second\"\r\n (inputChange)=\"setSecondValue($event)\"\r\n (valueChange)=\"setSecondValue($event)\"></nxt-date-time-timer-box>\r\n\r\n<div *ngIf=\"hour12Timer\"\r\n class=\"nxt-dt-timer-hour12\">\r\n <button class=\"nxt-dt-control-button nxt-dt-timer-hour12-box\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"setMeridiem($event)\">\r\n <span class=\"nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{hour12ButtonLabel}}\r\n </span>\r\n </button>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TimerBoxComponent, selector: "nxt-date-time-timer-box", inputs: ["showDivider", "upBtnAriaLabel", "upBtnDisabled", "downBtnAriaLabel", "downBtnDisabled", "boxValue", "value", "min", "max", "step", "inputLabel"], outputs: ["valueChange", "inputChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
270
- }
271
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: TimerComponent, decorators: [{
272
- type: Component,
273
- args: [{ selector: 'nxt-date-time-timer', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<nxt-date-time-timer-box [upBtnAriaLabel]=\"upHourButtonLabel\"\r\n [downBtnAriaLabel]=\"downHourButtonLabel\"\r\n [upBtnDisabled]=\"!upHourEnabled()\"\r\n [downBtnDisabled]=\"!downHourEnabled()\"\r\n [boxValue]=\"hourBoxValue\"\r\n [value]=\"hourValue\"\r\n [min]=\"0\"\r\n [max]=\"23\"\r\n [step]=\"stepHour\"\r\n inputLabel=\"Hour\"\r\n (inputChange)=\"setHourValueViaInput($event)\"\r\n (valueChange)=\"setHourValue($event)\"></nxt-date-time-timer-box>\r\n<nxt-date-time-timer-box [showDivider]=\"true\"\r\n [upBtnAriaLabel]=\"upMinuteButtonLabel\"\r\n [downBtnAriaLabel]=\"downMinuteButtonLabel\"\r\n [upBtnDisabled]=\"!upMinuteEnabled()\"\r\n [downBtnDisabled]=\"!downMinuteEnabled()\"\r\n [value]=\"minuteValue\"\r\n [min]=\"0\"\r\n [max]=\"59\"\r\n [step]=\"stepMinute\"\r\n inputLabel=\"Minute\"\r\n (inputChange)=\"setMinuteValue($event)\"\r\n (valueChange)=\"setMinuteValue($event)\"></nxt-date-time-timer-box>\r\n<nxt-date-time-timer-box *ngIf=\"showSecondsTimer\"\r\n [showDivider]=\"true\"\r\n [upBtnAriaLabel]=\"upSecondButtonLabel\"\r\n [downBtnAriaLabel]=\"downSecondButtonLabel\"\r\n [upBtnDisabled]=\"!upSecondEnabled()\"\r\n [downBtnDisabled]=\"!downSecondEnabled()\"\r\n [value]=\"secondValue\"\r\n [min]=\"0\"\r\n [max]=\"59\"\r\n [step]=\"stepSecond\"\r\n inputLabel=\"Second\"\r\n (inputChange)=\"setSecondValue($event)\"\r\n (valueChange)=\"setSecondValue($event)\"></nxt-date-time-timer-box>\r\n\r\n<div *ngIf=\"hour12Timer\"\r\n class=\"nxt-dt-timer-hour12\">\r\n <button class=\"nxt-dt-control-button nxt-dt-timer-hour12-box\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"setMeridiem($event)\">\r\n <span class=\"nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{hour12ButtonLabel}}\r\n </span>\r\n </button>\r\n</div>\r\n" }]
274
- }], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i1.DateTimeIntl }, { type: i0.ChangeDetectorRef }, { type: i2.DateTimeAdapter }], propDecorators: { pickerMoment: [{
275
- type: Input
276
- }], min: [{
277
- type: Input
278
- }], max: [{
279
- type: Input
280
- }], showSecondsTimer: [{
281
- type: Input
282
- }], hour12Timer: [{
283
- type: Input
284
- }], stepHour: [{
285
- type: Input
286
- }], stepMinute: [{
287
- type: Input
288
- }], stepSecond: [{
289
- type: Input
290
- }], selectedChange: [{
291
- type: Output
292
- }], timerClass: [{
293
- type: HostBinding,
294
- args: ['class.nxt-dt-timer']
295
- }], timeTabIndex: [{
296
- type: HostBinding,
297
- args: ['attr.tabindex']
298
- }] } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGljay1kYXRldGltZS9zcmMvbGliL2RhdGUtdGltZS90aW1lci90aW1lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL3RpbWVyL3RpbWVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFrQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDM0osT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFBOzs7Ozs7QUFXckMsTUFBTSxPQUFPLGNBQWM7SUFHdkIsSUFDSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBO0lBQzdCLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFvQjtRQUNqQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDL0UsQ0FBQztJQUlELElBQ0ksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUM1QixDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsS0FBb0I7UUFDeEIsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBSUQs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QUtILFVBQVU7c0JBRGIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBTzdCLFlBQVk7c0JBRGYsV0FBVzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBEYXRlVGltZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUtYWRhcHRlci5jbGFzcydcclxuaW1wb3J0IHsgRGF0ZVRpbWVJbnRsIH0gZnJvbSAnLi4vZGF0ZS10aW1lLXBpY2tlci1pbnRsLnNlcnZpY2UnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbnh0LWRhdGUtdGltZS10aW1lcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGltZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdGltZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpbWVyQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIC8qKiBUaGUgY3VycmVudCBwaWNrZXIgbW9tZW50ICovXHJcbiAgICBwcml2YXRlIF9waWNrZXJNb21lbnQ/OiBUXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHBpY2tlck1vbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcGlja2VyTW9tZW50XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBpY2tlck1vbWVudCh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpXHJcbiAgICAgICAgdGhpcy5fcGlja2VyTW9tZW50ID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBtaW5pbXVtIHNlbGVjdGFibGUgZGF0ZSB0aW1lICovXHJcbiAgICBwcml2YXRlIF9taW5EYXRlVGltZT86IFRcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbWluKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9taW5EYXRlVGltZVxyXG4gICAgfVxyXG5cclxuICAgIHNldCBtaW4odmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxyXG4gICAgICAgIHRoaXMuX21pbkRhdGVUaW1lID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZSB0aW1lICovXHJcbiAgICBwcml2YXRlIF9tYXhEYXRlVGltZT86IFRcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbWF4KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlVGltZVxyXG4gICAgfVxyXG5cclxuICAgIHNldCBtYXgodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxyXG4gICAgICAgIHRoaXMuX21heERhdGVUaW1lID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1BNOiBib29sZWFuID0gZmFsc2UgLy8gYSBmbGFnIGluZGljYXRlcyB0aGUgY3VycmVudCB0aW1lciBtb21lbnQgaXMgaW4gUE0gb3IgQU1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgc2Vjb25kJ3MgdGltZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHNob3dTZWNvbmRzVGltZXI6IGJvb2xlYW4gPSBmYWxzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgdGltZXIgaXMgaW4gaG91cjEyIGZvcm1hdFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgaG91cjEyVGltZXI6IGJvb2xlYW4gPSBmYWxzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSG91cnMgdG8gY2hhbmdlIHBlciBzdGVwXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzdGVwSG91ciA9IDFcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1pbnV0ZXMgdG8gY2hhbmdlIHBlciBzdGVwXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzdGVwTWludXRlID0gMVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Vjb25kcyB0byBjaGFuZ2UgcGVyIHN0ZXBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHN0ZXBTZWNvbmQgPSAxXHJcblxyXG4gICAgZ2V0IGhvdXJWYWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRIb3Vycyh0aGlzLnBpY2tlck1vbWVudClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2YWx1ZSB3b3VsZCBiZSBkaXNwbGF5ZWQgaW4gaG91ckJveC5cclxuICAgICAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZSBkaXNwbGF5ZWQgaW4gaG91ckJveCBpdCBub3RcclxuICAgICAqIHRoZSBzYW1lIGFzIHRoZSBob3VyVmFsdWUgd2hlbiB0aGUgdGltZXIgaXMgaW4gaG91cjEyVGltZXIgbW9kZS5cclxuICAgICAqL1xyXG4gICAgZ2V0IGhvdXJCb3hWYWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBob3VycyA9IHRoaXMuaG91clZhbHVlXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5ob3VyMTJUaW1lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gaG91cnNcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaG91cnMgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGhvdXJzID0gMTJcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNQTSA9IGZhbHNlXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPiAwICYmIGhvdXJzIDwgMTIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNQTSA9IGZhbHNlXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDEyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzUE0gPSB0cnVlXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPiAxMiAmJiBob3VycyA8IDI0KSB7XHJcbiAgICAgICAgICAgICAgICBob3VycyA9IGhvdXJzIC0gMTJcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNQTSA9IHRydWVcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGhvdXJzXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBtaW51dGVWYWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNaW51dGVzKHRoaXMucGlja2VyTW9tZW50KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWNvbmRWYWx1ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRTZWNvbmRzKHRoaXMucGlja2VyTW9tZW50KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCB1cEhvdXJCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwudXBIb3VyTGFiZWxcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZG93bkhvdXJCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwuZG93bkhvdXJMYWJlbFxyXG4gICAgfVxyXG5cclxuICAgIGdldCB1cE1pbnV0ZUJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VySW50bC51cE1pbnV0ZUxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRvd25NaW51dGVCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwuZG93bk1pbnV0ZUxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHVwU2Vjb25kQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnVwU2Vjb25kTGFiZWxcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZG93blNlY29uZEJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5kb3duU2Vjb25kTGFiZWxcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaG91cjEyQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc1BNXHJcbiAgICAgICAgICAgID8gdGhpcy5waWNrZXJJbnRsLmhvdXIxMlBNTGFiZWxcclxuICAgICAgICAgICAgOiB0aGlzLnBpY2tlckludGwuaG91cjEyQU1MYWJlbFxyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KClcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC10aW1lcicpXHJcbiAgICBnZXQgdGltZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXHJcbiAgICBnZXQgdGltZVRhYkluZGV4KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIC0xXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsbVJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwaWNrZXJJbnRsOiBEYXRlVGltZUludGwsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPlxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgdG8gdGhlIGhvc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBmb2N1cygpIHtcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXHJcbiAgICAgICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgaG91ciB2YWx1ZSB2aWEgdHlwaW5nIGludG8gdGltZXIgYm94IGlucHV0XHJcbiAgICAgKiBXZSBuZWVkIHRoaXMgdG8gaGFuZGxlIHRoZSBob3VyIHZhbHVlIHdoZW4gdGhlIHRpbWVyIGlzIGluIGhvdXIxMiBtb2RlXHJcbiAgICAgKi9cclxuICAgIHNldEhvdXJWYWx1ZVZpYUlucHV0KGhvdXJzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ob3VyMTJUaW1lciAmJiB0aGlzLmlzUE0gJiYgaG91cnMgPj0gMSAmJiBob3VycyA8PSAxMSkge1xyXG4gICAgICAgICAgICBob3VycyA9IGhvdXJzICsgMTJcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaG91cjEyVGltZXIgJiYgIXRoaXMuaXNQTSAmJiBob3VycyA9PT0gMTIpIHtcclxuICAgICAgICAgICAgaG91cnMgPSAwXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEhvdXJWYWx1ZShob3VycylcclxuICAgIH1cclxuXHJcbiAgICBzZXRIb3VyVmFsdWUoaG91cnM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG0gPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5zZXRIb3Vycyh0aGlzLnBpY2tlck1vbWVudCwgaG91cnMpXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KG0pXHJcbiAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxyXG4gICAgfVxyXG5cclxuICAgIHNldE1pbnV0ZVZhbHVlKG1pbnV0ZXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG0gPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5zZXRNaW51dGVzKHRoaXMucGlja2VyTW9tZW50LCBtaW51dGVzKVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChtKVxyXG4gICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKClcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWNvbmRWYWx1ZShzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuc2V0U2Vjb25kcyh0aGlzLnBpY2tlck1vbWVudCwgc2Vjb25kcylcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQobSlcclxuICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWVyaWRpZW0oZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNQTSA9ICF0aGlzLmlzUE1cclxuXHJcbiAgICAgICAgbGV0IGhvdXJzID0gdGhpcy5ob3VyVmFsdWVcclxuICAgICAgICBpZiAodGhpcy5pc1BNKSB7XHJcbiAgICAgICAgICAgIGhvdXJzID0gaG91cnMgKyAxMlxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGhvdXJzID0gaG91cnMgLSAxMlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhvdXJzID49IDAgJiYgaG91cnMgPD0gMjMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRIb3VyVmFsdWUoaG91cnMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIHVwIGhvdXIgYnV0dG9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgdXBIb3VyRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhdGhpcy5tYXggfHxcclxuICAgICAgICAgICAgdGhpcy5jb21wYXJlSG91cnModGhpcy5zdGVwSG91ciwgdGhpcy5tYXgpIDwgMVxyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIGlmIHRoZSBkb3duIGhvdXIgYnV0dG9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgZG93bkhvdXJFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICF0aGlzLm1pbiB8fFxyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVIb3VycygtdGhpcy5zdGVwSG91ciwgdGhpcy5taW4pID4gLTFcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgdXAgbWludXRlIGJ1dHRvbiBpcyBlbmFibGVkXHJcbiAgICAgKi9cclxuICAgIHVwTWludXRlRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhdGhpcy5tYXggfHxcclxuICAgICAgICAgICAgdGhpcy5jb21wYXJlTWludXRlcyh0aGlzLnN0ZXBNaW51dGUsIHRoaXMubWF4KSA8IDFcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgZG93biBtaW51dGUgYnV0dG9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgZG93bk1pbnV0ZUVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgIXRoaXMubWluIHx8XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZU1pbnV0ZXMoLXRoaXMuc3RlcE1pbnV0ZSwgdGhpcy5taW4pID4gLTFcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgdXAgc2Vjb25kIGJ1dHRvbiBpcyBlbmFibGVkXHJcbiAgICAgKi9cclxuICAgIHVwU2Vjb25kRW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAhdGhpcy5tYXggfHxcclxuICAgICAgICAgICAgdGhpcy5jb21wYXJlU2Vjb25kcyh0aGlzLnN0ZXBTZWNvbmQsIHRoaXMubWF4KSA8IDFcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgZG93biBzZWNvbmQgYnV0dG9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgZG93blNlY29uZEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgIXRoaXMubWluIHx8XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZVNlY29uZHMoLXRoaXMuc3RlcFNlY29uZCwgdGhpcy5taW4pID4gLTFcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaWNrZXJNb21lbnQncyBob3VyIHZhbHVlICsvLSBjZXJ0YWluIGFtb3VudCBhbmQgY29tcGFyZSBpdCB0byB0aGUgZ2l2ZSBkYXRlXHJcbiAgICAgKiAxIGlzIGFmdGVyIHRoZSBjb21wYXJlZERhdGVcclxuICAgICAqIC0xIGlzIGJlZm9yZSB0aGUgY29tcGFyZWREYXRlXHJcbiAgICAgKiAwIGlzIGVxdWFsIHRoZSBjb21wYXJlZERhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb21wYXJlSG91cnMoYW1vdW50OiBudW1iZXIsIGNvbXBhcmVkRGF0ZTogVCk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgaG91cnMgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRIb3Vycyh0aGlzLnBpY2tlck1vbWVudCkgKyBhbW91bnRcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5zZXRIb3Vycyh0aGlzLnBpY2tlck1vbWVudCwgaG91cnMpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUocmVzdWx0LCBjb21wYXJlZERhdGUpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaWNrZXJNb21lbnQncyBtaW51dGUgdmFsdWUgKy8tIGNlcnRhaW4gYW1vdW50IGFuZCBjb21wYXJlIGl0IHRvIHRoZSBnaXZlIGRhdGVcclxuICAgICAqIDEgaXMgYWZ0ZXIgdGhlIGNvbXBhcmVkRGF0ZVxyXG4gICAgICogLTEgaXMgYmVmb3JlIHRoZSBjb21wYXJlZERhdGVcclxuICAgICAqIDAgaXMgZXF1YWwgdGhlIGNvbXBhcmVkRGF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbXBhcmVNaW51dGVzKGFtb3VudDogbnVtYmVyLCBjb21wYXJlZERhdGU6IFQpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IG1pbnV0ZXMgPVxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNaW51dGVzKHRoaXMucGlja2VyTW9tZW50KSArIGFtb3VudFxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLnNldE1pbnV0ZXMoXHJcbiAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICBtaW51dGVzXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHJlc3VsdCwgY29tcGFyZWREYXRlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGlja2VyTW9tZW50J3Mgc2Vjb25kIHZhbHVlICsvLSBjZXJ0YWluIGFtb3VudCBhbmQgY29tcGFyZSBpdCB0byB0aGUgZ2l2ZSBkYXRlXHJcbiAgICAgKiAxIGlzIGFmdGVyIHRoZSBjb21wYXJlZERhdGVcclxuICAgICAqIC0xIGlzIGJlZm9yZSB0aGUgY29tcGFyZWREYXRlXHJcbiAgICAgKiAwIGlzIGVxdWFsIHRoZSBjb21wYXJlZERhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb21wYXJlU2Vjb25kcyhhbW91bnQ6IG51bWJlciwgY29tcGFyZWREYXRlOiBUKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBzZWNvbmRzID1cclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnBpY2tlck1vbWVudCkgKyBhbW91bnRcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5zZXRTZWNvbmRzKFxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcclxuICAgICAgICAgICAgc2Vjb25kc1xyXG4gICAgICAgIClcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShyZXN1bHQsIGNvbXBhcmVkRGF0ZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHZhbGlkIGRhdGUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0VmFsaWREYXRlKG9iajogYW55KTogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzRGF0ZUluc3RhbmNlKG9iaikgJiZcclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChvYmopXHJcbiAgICAgICAgICAgID8gb2JqXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICB9XHJcbn1cclxuIiwiPG54dC1kYXRlLXRpbWUtdGltZXItYm94IFt1cEJ0bkFyaWFMYWJlbF09XCJ1cEhvdXJCdXR0b25MYWJlbFwiXHJcbiAgICBbZG93bkJ0bkFyaWFMYWJlbF09XCJkb3duSG91ckJ1dHRvbkxhYmVsXCJcclxuICAgIFt1cEJ0bkRpc2FibGVkXT1cIiF1cEhvdXJFbmFibGVkKClcIlxyXG4gICAgW2Rvd25CdG5EaXNhYmxlZF09XCIhZG93bkhvdXJFbmFibGVkKClcIlxyXG4gICAgW2JveFZhbHVlXT1cImhvdXJCb3hWYWx1ZVwiXHJcbiAgICBbdmFsdWVdPVwiaG91clZhbHVlXCJcclxuICAgIFttaW5dPVwiMFwiXHJcbiAgICBbbWF4XT1cIjIzXCJcclxuICAgIFtzdGVwXT1cInN0ZXBIb3VyXCJcclxuICAgIGlucHV0TGFiZWw9XCJIb3VyXCJcclxuICAgIChpbnB1dENoYW5nZSk9XCJzZXRIb3VyVmFsdWVWaWFJbnB1dCgkZXZlbnQpXCJcclxuICAgICh2YWx1ZUNoYW5nZSk9XCJzZXRIb3VyVmFsdWUoJGV2ZW50KVwiPjwvbnh0LWRhdGUtdGltZS10aW1lci1ib3g+XHJcbjxueHQtZGF0ZS10aW1lLXRpbWVyLWJveCBbc2hvd0RpdmlkZXJdPVwidHJ1ZVwiXHJcbiAgICBbdXBCdG5BcmlhTGFiZWxdPVwidXBNaW51dGVCdXR0b25MYWJlbFwiXHJcbiAgICBbZG93bkJ0bkFyaWFMYWJlbF09XCJkb3duTWludXRlQnV0dG9uTGFiZWxcIlxyXG4gICAgW3VwQnRuRGlzYWJsZWRdPVwiIXVwTWludXRlRW5hYmxlZCgpXCJcclxuICAgIFtkb3duQnRuRGlzYWJsZWRdPVwiIWRvd25NaW51dGVFbmFibGVkKClcIlxyXG4gICAgW3ZhbHVlXT1cIm1pbnV0ZVZhbHVlXCJcclxuICAgIFttaW5dPVwiMFwiXHJcbiAgICBbbWF4XT1cIjU5XCJcclxuICAgIFtzdGVwXT1cInN0ZXBNaW51dGVcIlxyXG4gICAgaW5wdXRMYWJlbD1cIk1pbnV0ZVwiXHJcbiAgICAoaW5wdXRDaGFuZ2UpPVwic2V0TWludXRlVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAodmFsdWVDaGFuZ2UpPVwic2V0TWludXRlVmFsdWUoJGV2ZW50KVwiPjwvbnh0LWRhdGUtdGltZS10aW1lci1ib3g+XHJcbjxueHQtZGF0ZS10aW1lLXRpbWVyLWJveCAqbmdJZj1cInNob3dTZWNvbmRzVGltZXJcIlxyXG4gICAgW3Nob3dEaXZpZGVyXT1cInRydWVcIlxyXG4gICAgW3VwQnRuQXJpYUxhYmVsXT1cInVwU2Vjb25kQnV0dG9uTGFiZWxcIlxyXG4gICAgW2Rvd25CdG5BcmlhTGFiZWxdPVwiZG93blNlY29uZEJ1dHRvbkxhYmVsXCJcclxuICAgIFt1cEJ0bkRpc2FibGVkXT1cIiF1cFNlY29uZEVuYWJsZWQoKVwiXHJcbiAgICBbZG93bkJ0bkRpc2FibGVkXT1cIiFkb3duU2Vjb25kRW5hYmxlZCgpXCJcclxuICAgIFt2YWx1ZV09XCJzZWNvbmRWYWx1ZVwiXHJcbiAgICBbbWluXT1cIjBcIlxyXG4gICAgW21heF09XCI1OVwiXHJcbiAgICBbc3RlcF09XCJzdGVwU2Vjb25kXCJcclxuICAgIGlucHV0TGFiZWw9XCJTZWNvbmRcIlxyXG4gICAgKGlucHV0Q2hhbmdlKT1cInNldFNlY29uZFZhbHVlKCRldmVudClcIlxyXG4gICAgKHZhbHVlQ2hhbmdlKT1cInNldFNlY29uZFZhbHVlKCRldmVudClcIj48L254dC1kYXRlLXRpbWUtdGltZXItYm94PlxyXG5cclxuPGRpdiAqbmdJZj1cImhvdXIxMlRpbWVyXCJcclxuICAgIGNsYXNzPVwibnh0LWR0LXRpbWVyLWhvdXIxMlwiPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm54dC1kdC1jb250cm9sLWJ1dHRvbiBueHQtZHQtdGltZXItaG91cjEyLWJveFwiXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAoY2xpY2spPVwic2V0TWVyaWRpZW0oJGV2ZW50KVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgIHt7aG91cjEyQnV0dG9uTGFiZWx9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuIl19
@@ -1,95 +0,0 @@
1
- import { coerceNumberProperty } from '@angular/cdk/coercion';
2
- import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
3
- import { Subject } from 'rxjs';
4
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "../number-fixed-len.pipe";
8
- /** @internal */
9
- export class TimerBoxComponent {
10
- get displayValue() {
11
- return this.boxValue || this.value;
12
- }
13
- /** @internal */
14
- get timerBoxClass() {
15
- return true;
16
- }
17
- constructor() {
18
- this.showDivider = false;
19
- this.upBtnDisabled = false;
20
- this.downBtnDisabled = false;
21
- this.value = 0;
22
- this.min = 0;
23
- this.max = 0;
24
- this.step = 1;
25
- this.valueChange = new EventEmitter();
26
- this.inputChange = new EventEmitter();
27
- this.inputStream = new Subject();
28
- }
29
- ngOnInit() {
30
- this.inputStreamSub = this.inputStream.pipe(debounceTime(500), distinctUntilChanged()).subscribe((val) => {
31
- if (val) {
32
- const inputValue = coerceNumberProperty(val, 0);
33
- this.updateValueViaInput(inputValue);
34
- }
35
- });
36
- }
37
- ngOnDestroy() {
38
- this.inputStreamSub?.unsubscribe();
39
- this.inputStreamSub = undefined;
40
- }
41
- upBtnClicked() {
42
- this.updateValue(this.value + this.step);
43
- }
44
- downBtnClicked() {
45
- this.updateValue(this.value - this.step);
46
- }
47
- handleInputChange(val) {
48
- this.inputStream.next(val);
49
- }
50
- updateValue(value) {
51
- this.valueChange.emit(value);
52
- }
53
- updateValueViaInput(value) {
54
- if (value > this.max || value < this.min) {
55
- return;
56
- }
57
- this.inputChange.emit(value);
58
- }
59
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: TimerBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
60
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: TimerBoxComponent, selector: "nxt-date-time-timer-box", inputs: { showDivider: "showDivider", upBtnAriaLabel: "upBtnAriaLabel", upBtnDisabled: "upBtnDisabled", downBtnAriaLabel: "downBtnAriaLabel", downBtnDisabled: "downBtnDisabled", boxValue: "boxValue", value: "value", min: "min", max: "max", step: "step", inputLabel: "inputLabel" }, outputs: { valueChange: "valueChange", inputChange: "inputChange" }, host: { properties: { "class.nxt-dt-timer-box": "this.timerBoxClass" } }, ngImport: i0, template: "<div *ngIf=\"showDivider\"\r\n class=\"nxt-dt-timer-divider\"\r\n aria-hidden=\"true\"></div>\r\n<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n [disabled]=\"upBtnDisabled\"\r\n [attr.aria-label]=\"upBtnAriaLabel\"\r\n (click)=\"upBtnClicked()\">\r\n <span class=\"nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n <!-- <editor-fold desc=\"SVG Arrow Up\"> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n version=\"1.1\"\r\n x=\"0px\"\r\n y=\"0px\"\r\n viewBox=\"0 0 451.847 451.846\"\r\n style=\"enable-background:new 0 0 451.847 451.846;\"\r\n xml:space=\"preserve\"\r\n width=\"100%\"\r\n height=\"100%\">\r\n <path d=\"M248.292,106.406l194.281,194.29c12.365,12.359,12.365,32.391,0,44.744c-12.354,12.354-32.391,12.354-44.744,0\r\n L225.923,173.529L54.018,345.44c-12.36,12.354-32.395,12.354-44.748,0c-12.359-12.354-12.359-32.391,0-44.75L203.554,106.4\r\n c6.18-6.174,14.271-9.259,22.369-9.259C234.018,97.141,242.115,100.232,248.292,106.406z\" />\r\n </svg>\r\n <!-- </editor-fold> -->\r\n </span>\r\n</button>\r\n<label class=\"nxt-dt-timer-content\">\r\n <input class=\"nxt-dt-timer-input\"\r\n maxlength=\"2\"\r\n [value]=\"displayValue | numberFixedLen : 2\"\r\n (input)=\"handleInputChange(valueInput.value)\"\r\n #valueInput>\r\n <span class=\"nxt-hidden-accessible\">{{inputLabel}}</span>\r\n</label>\r\n<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n [disabled]=\"downBtnDisabled\"\r\n [attr.aria-label]=\"downBtnAriaLabel\"\r\n (click)=\"downBtnClicked()\">\r\n <span class=\"nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n <!-- <editor-fold desc=\"SVG Arrow Down\"> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n version=\"1.1\"\r\n x=\"0px\"\r\n y=\"0px\"\r\n viewBox=\"0 0 451.847 451.846\"\r\n style=\"enable-background:new 0 0 451.847 451.846;\"\r\n xml:space=\"preserve\"\r\n width=\"100%\"\r\n height=\"100%\">\r\n <path d=\"M225.923,354.706c-8.098,0-16.195-3.092-22.369-9.263L9.27,151.157c-12.359-12.359-12.359-32.397,0-44.751\r\n c12.354-12.354,32.388-12.354,44.748,0l171.905,171.915l171.906-171.909c12.359-12.354,32.391-12.354,44.744,0\r\n c12.365,12.354,12.365,32.392,0,44.751L248.292,345.449C242.115,351.621,234.018,354.706,225.923,354.706z\" />\r\n </svg>\r\n <!-- </editor-fold> -->\r\n </span>\r\n</button>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.NumberFixedLenPipe, name: "numberFixedLen" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
61
- }
62
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: TimerBoxComponent, decorators: [{
63
- type: Component,
64
- args: [{ selector: 'nxt-date-time-timer-box', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"showDivider\"\r\n class=\"nxt-dt-timer-divider\"\r\n aria-hidden=\"true\"></div>\r\n<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n [disabled]=\"upBtnDisabled\"\r\n [attr.aria-label]=\"upBtnAriaLabel\"\r\n (click)=\"upBtnClicked()\">\r\n <span class=\"nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n <!-- <editor-fold desc=\"SVG Arrow Up\"> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n version=\"1.1\"\r\n x=\"0px\"\r\n y=\"0px\"\r\n viewBox=\"0 0 451.847 451.846\"\r\n style=\"enable-background:new 0 0 451.847 451.846;\"\r\n xml:space=\"preserve\"\r\n width=\"100%\"\r\n height=\"100%\">\r\n <path d=\"M248.292,106.406l194.281,194.29c12.365,12.359,12.365,32.391,0,44.744c-12.354,12.354-32.391,12.354-44.744,0\r\n L225.923,173.529L54.018,345.44c-12.36,12.354-32.395,12.354-44.748,0c-12.359-12.354-12.359-32.391,0-44.75L203.554,106.4\r\n c6.18-6.174,14.271-9.259,22.369-9.259C234.018,97.141,242.115,100.232,248.292,106.406z\" />\r\n </svg>\r\n <!-- </editor-fold> -->\r\n </span>\r\n</button>\r\n<label class=\"nxt-dt-timer-content\">\r\n <input class=\"nxt-dt-timer-input\"\r\n maxlength=\"2\"\r\n [value]=\"displayValue | numberFixedLen : 2\"\r\n (input)=\"handleInputChange(valueInput.value)\"\r\n #valueInput>\r\n <span class=\"nxt-hidden-accessible\">{{inputLabel}}</span>\r\n</label>\r\n<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n [disabled]=\"downBtnDisabled\"\r\n [attr.aria-label]=\"downBtnAriaLabel\"\r\n (click)=\"downBtnClicked()\">\r\n <span class=\"nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n <!-- <editor-fold desc=\"SVG Arrow Down\"> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n version=\"1.1\"\r\n x=\"0px\"\r\n y=\"0px\"\r\n viewBox=\"0 0 451.847 451.846\"\r\n style=\"enable-background:new 0 0 451.847 451.846;\"\r\n xml:space=\"preserve\"\r\n width=\"100%\"\r\n height=\"100%\">\r\n <path d=\"M225.923,354.706c-8.098,0-16.195-3.092-22.369-9.263L9.27,151.157c-12.359-12.359-12.359-32.397,0-44.751\r\n c12.354-12.354,32.388-12.354,44.748,0l171.905,171.915l171.906-171.909c12.359-12.354,32.391-12.354,44.744,0\r\n c12.365,12.354,12.365,32.392,0,44.751L248.292,345.449C242.115,351.621,234.018,354.706,225.923,354.706z\" />\r\n </svg>\r\n <!-- </editor-fold> -->\r\n </span>\r\n</button>\r\n" }]
65
- }], ctorParameters: () => [], propDecorators: { showDivider: [{
66
- type: Input
67
- }], upBtnAriaLabel: [{
68
- type: Input
69
- }], upBtnDisabled: [{
70
- type: Input
71
- }], downBtnAriaLabel: [{
72
- type: Input
73
- }], downBtnDisabled: [{
74
- type: Input
75
- }], boxValue: [{
76
- type: Input
77
- }], value: [{
78
- type: Input
79
- }], min: [{
80
- type: Input
81
- }], max: [{
82
- type: Input
83
- }], step: [{
84
- type: Input
85
- }], inputLabel: [{
86
- type: Input
87
- }], valueChange: [{
88
- type: Output
89
- }], inputChange: [{
90
- type: Output
91
- }], timerBoxClass: [{
92
- type: HostBinding,
93
- args: ['class.nxt-dt-timer-box']
94
- }] } });
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXItYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3BpY2stZGF0ZXRpbWUvc3JjL2xpYi9kYXRlLXRpbWUvdGltZXItYm94L3RpbWVyLWJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL3RpbWVyLWJveC90aW1lci1ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQy9ILE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFBO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7OztBQUVuRSxnQkFBZ0I7QUFTaEIsTUFBTSxPQUFPLGlCQUFpQjtJQW9DMUIsSUFBSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUE7SUFDdEMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUNJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDtRQTVDUyxnQkFBVyxHQUFHLEtBQUssQ0FBQTtRQUluQixrQkFBYSxHQUFZLEtBQUssQ0FBQTtRQUk5QixvQkFBZSxHQUFZLEtBQUssQ0FBQTtRQVFoQyxVQUFLLEdBQVcsQ0FBQyxDQUFBO1FBRWpCLFFBQUcsR0FBVyxDQUFDLENBQUE7UUFFZixRQUFHLEdBQVcsQ0FBQyxDQUFBO1FBRWYsU0FBSSxHQUFHLENBQUMsQ0FBQTtRQUlQLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQTtRQUV4QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUE7UUFFMUMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFBO0lBZTNDLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDdkMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixvQkFBb0IsRUFBRSxDQUN6QixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQ3hCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ04sTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO2dCQUMvQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDeEMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFBO0lBQ25DLENBQUM7SUFFRCxZQUFZO1FBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQVc7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFhO1FBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxPQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLENBQUM7OEdBdkZRLGlCQUFpQjtrR0FBakIsaUJBQWlCLHdlQ2Q5QiwyNEZBK0RBOzsyRkRqRGEsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNJLHlCQUF5Qix1QkFHZCxLQUFLLG1CQUNULHVCQUF1QixDQUFDLE1BQU07d0RBS3RDLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQVlILGFBQWE7c0JBRGhCLFdBQVc7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nXHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbnh0LWRhdGUtdGltZS10aW1lci1ib3gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RpbWVyLWJveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi90aW1lci1ib3guY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lckJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBASW5wdXQoKSBzaG93RGl2aWRlciA9IGZhbHNlXHJcblxyXG4gICAgQElucHV0KCkgdXBCdG5BcmlhTGFiZWw/OiBzdHJpbmdcclxuXHJcbiAgICBASW5wdXQoKSB1cEJ0bkRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcclxuXHJcbiAgICBASW5wdXQoKSBkb3duQnRuQXJpYUxhYmVsPzogc3RyaW5nXHJcblxyXG4gICAgQElucHV0KCkgZG93bkJ0bkRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbHVlIHdvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgYm94XHJcbiAgICAgKiBJZiBpdCBpcyB1bmRlZmllbmQsIHRoZSBib3ggd291bGQgZGlzcGxheSBbdmFsdWVdXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGJveFZhbHVlPzogbnVtYmVyXHJcblxyXG4gICAgQElucHV0KCkgdmFsdWU6IG51bWJlciA9IDBcclxuXHJcbiAgICBASW5wdXQoKSBtaW46IG51bWJlciA9IDBcclxuXHJcbiAgICBASW5wdXQoKSBtYXg6IG51bWJlciA9IDBcclxuXHJcbiAgICBASW5wdXQoKSBzdGVwID0gMVxyXG5cclxuICAgIEBJbnB1dCgpIGlucHV0TGFiZWw/OiBzdHJpbmdcclxuXHJcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxyXG5cclxuICAgIEBPdXRwdXQoKSBpbnB1dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXHJcblxyXG4gICAgcHJpdmF0ZSBpbnB1dFN0cmVhbSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKVxyXG5cclxuICAgIHByaXZhdGUgaW5wdXRTdHJlYW1TdWI/OiBTdWJzY3JpcHRpb25cclxuXHJcbiAgICBnZXQgZGlzcGxheVZhbHVlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm94VmFsdWUgfHwgdGhpcy52YWx1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubnh0LWR0LXRpbWVyLWJveCcpXHJcbiAgICBnZXQgdGltZXJCb3hDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRTdHJlYW1TdWIgPSB0aGlzLmlucHV0U3RyZWFtLnBpcGUoXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxyXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKHZhbDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWwsIDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlVmlhSW5wdXQoaW5wdXRWYWx1ZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbnB1dFN0cmVhbVN1Yj8udW5zdWJzY3JpYmUoKVxyXG4gICAgICAgIHRoaXMuaW5wdXRTdHJlYW1TdWIgPSB1bmRlZmluZWRcclxuICAgIH1cclxuXHJcbiAgICB1cEJ0bkNsaWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLnZhbHVlICsgdGhpcy5zdGVwKVxyXG4gICAgfVxyXG5cclxuICAgIGRvd25CdG5DbGlja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy52YWx1ZSAtIHRoaXMuc3RlcClcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVJbnB1dENoYW5nZSh2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5wdXRTdHJlYW0ubmV4dCh2YWwpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlVmFsdWVWaWFJbnB1dCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHZhbHVlID4gdGhpcy5tYXggfHwgdmFsdWUgPCB0aGlzLm1pbikge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KHZhbHVlKVxyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJzaG93RGl2aWRlclwiXHJcbiAgICBjbGFzcz1cIm54dC1kdC10aW1lci1kaXZpZGVyXCJcclxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxyXG48YnV0dG9uIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtYnV0dG9uIG54dC1kdC1jb250cm9sLWFycm93LWJ1dHRvblwiXHJcbiAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgW2Rpc2FibGVkXT1cInVwQnRuRGlzYWJsZWRcIlxyXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1cEJ0bkFyaWFMYWJlbFwiXHJcbiAgICAoY2xpY2spPVwidXBCdG5DbGlja2VkKClcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxyXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICA8IS0tIDxlZGl0b3ItZm9sZCBkZXNjPVwiU1ZHIEFycm93IFVwXCI+IC0tPlxyXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXHJcbiAgICAgICAgICAgIHZlcnNpb249XCIxLjFcIlxyXG4gICAgICAgICAgICB4PVwiMHB4XCJcclxuICAgICAgICAgICAgeT1cIjBweFwiXHJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgNDUxLjg0NyA0NTEuODQ2XCJcclxuICAgICAgICAgICAgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ1MS44NDcgNDUxLjg0NjtcIlxyXG4gICAgICAgICAgICB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiXHJcbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXHJcbiAgICAgICAgICAgIGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0yNDguMjkyLDEwNi40MDZsMTk0LjI4MSwxOTQuMjljMTIuMzY1LDEyLjM1OSwxMi4zNjUsMzIuMzkxLDAsNDQuNzQ0Yy0xMi4zNTQsMTIuMzU0LTMyLjM5MSwxMi4zNTQtNDQuNzQ0LDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgTDIyNS45MjMsMTczLjUyOUw1NC4wMTgsMzQ1LjQ0Yy0xMi4zNiwxMi4zNTQtMzIuMzk1LDEyLjM1NC00NC43NDgsMGMtMTIuMzU5LTEyLjM1NC0xMi4zNTktMzIuMzkxLDAtNDQuNzVMMjAzLjU1NCwxMDYuNFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjNi4xOC02LjE3NCwxNC4yNzEtOS4yNTksMjIuMzY5LTkuMjU5QzIzNC4wMTgsOTcuMTQxLDI0Mi4xMTUsMTAwLjIzMiwyNDguMjkyLDEwNi40MDZ6XCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8IS0tIDwvZWRpdG9yLWZvbGQ+IC0tPlxyXG4gICAgPC9zcGFuPlxyXG48L2J1dHRvbj5cclxuPGxhYmVsIGNsYXNzPVwibnh0LWR0LXRpbWVyLWNvbnRlbnRcIj5cclxuICAgIDxpbnB1dCBjbGFzcz1cIm54dC1kdC10aW1lci1pbnB1dFwiXHJcbiAgICAgICAgbWF4bGVuZ3RoPVwiMlwiXHJcbiAgICAgICAgW3ZhbHVlXT1cImRpc3BsYXlWYWx1ZSB8IG51bWJlckZpeGVkTGVuIDogMlwiXHJcbiAgICAgICAgKGlucHV0KT1cImhhbmRsZUlucHV0Q2hhbmdlKHZhbHVlSW5wdXQudmFsdWUpXCJcclxuICAgICAgICAjdmFsdWVJbnB1dD5cclxuICAgIDxzcGFuIGNsYXNzPVwibnh0LWhpZGRlbi1hY2Nlc3NpYmxlXCI+e3tpbnB1dExhYmVsfX08L3NwYW4+XHJcbjwvbGFiZWw+XHJcbjxidXR0b24gY2xhc3M9XCJueHQtZHQtY29udHJvbC1idXR0b24gbnh0LWR0LWNvbnRyb2wtYXJyb3ctYnV0dG9uXCJcclxuICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZG93bkJ0bkRpc2FibGVkXCJcclxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZG93bkJ0bkFyaWFMYWJlbFwiXHJcbiAgICAoY2xpY2spPVwiZG93bkJ0bkNsaWNrZWQoKVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udHJvbC1idXR0b24tY29udGVudFwiXHJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgIDwhLS0gPGVkaXRvci1mb2xkIGRlc2M9XCJTVkcgQXJyb3cgRG93blwiPiAtLT5cclxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxyXG4gICAgICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcclxuICAgICAgICAgICAgeD1cIjBweFwiXHJcbiAgICAgICAgICAgIHk9XCIwcHhcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDQ1MS44NDcgNDUxLjg0NlwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NTEuODQ3IDQ1MS44NDY7XCJcclxuICAgICAgICAgICAgeG1sOnNwYWNlPVwicHJlc2VydmVcIlxyXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxyXG4gICAgICAgICAgICBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjI1LjkyMywzNTQuNzA2Yy04LjA5OCwwLTE2LjE5NS0zLjA5Mi0yMi4zNjktOS4yNjNMOS4yNywxNTEuMTU3Yy0xMi4zNTktMTIuMzU5LTEyLjM1OS0zMi4zOTcsMC00NC43NTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYzEyLjM1NC0xMi4zNTQsMzIuMzg4LTEyLjM1NCw0NC43NDgsMGwxNzEuOTA1LDE3MS45MTVsMTcxLjkwNi0xNzEuOTA5YzEyLjM1OS0xMi4zNTQsMzIuMzkxLTEyLjM1NCw0NC43NDQsMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjMTIuMzY1LDEyLjM1NCwxMi4zNjUsMzIuMzkyLDAsNDQuNzUxTDI0OC4yOTIsMzQ1LjQ0OUMyNDIuMTE1LDM1MS42MjEsMjM0LjAxOCwzNTQuNzA2LDIyNS45MjMsMzU0LjcwNnpcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwhLS0gPC9lZGl0b3ItZm9sZD4gLS0+XHJcbiAgICA8L3NwYW4+XHJcbjwvYnV0dG9uPlxyXG4iXX0=