nxt-pick-datetime 17.0.1 → 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 (51) hide show
  1. package/README.md +53 -53
  2. package/assets/picker.scss +673 -673
  3. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs +23 -26
  4. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  5. package/fesm2022/nxt-pick-datetime-native-adapter.mjs +22 -24
  6. package/fesm2022/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  7. package/fesm2022/nxt-pick-datetime.mjs +77 -75
  8. package/fesm2022/nxt-pick-datetime.mjs.map +1 -1
  9. package/lib/class/date-time.class.d.ts +1 -1
  10. package/moment-adapter/moment-adapter.module.d.ts +2 -0
  11. package/moment-adapter/public-api.d.ts +1 -1
  12. package/native-adapter/native-adapter.module.d.ts +2 -0
  13. package/native-adapter/public-api.d.ts +1 -1
  14. package/package.json +10 -15
  15. package/esm2022/lib/class/date-time-adapter.class.mjs +0 -97
  16. package/esm2022/lib/class/date-time-format.class.mjs +0 -4
  17. package/esm2022/lib/class/date-time.class.mjs +0 -95
  18. package/esm2022/lib/class/dialog-config.class.mjs +0 -47
  19. package/esm2022/lib/class/dialog-ref.class.mjs +0 -119
  20. package/esm2022/lib/date-time/calendar/calendar.component.mjs +0 -346
  21. package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
  22. package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
  23. package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
  24. package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
  25. package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
  26. package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
  27. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +0 -19
  28. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
  29. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -618
  30. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +0 -61
  31. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  32. package/esm2022/lib/date-time/date-time.module.mjs +0 -96
  33. package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +0 -22
  34. package/esm2022/lib/date-time/timer/timer.component.mjs +0 -299
  35. package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +0 -95
  36. package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
  37. package/esm2022/lib/dialog/dialog.module.mjs +0 -42
  38. package/esm2022/lib/dialog/dialog.service.mjs +0 -251
  39. package/esm2022/lib/utils/object.mjs +0 -24
  40. package/esm2022/moment-adapter/date-time-adapter.class.mjs +0 -220
  41. package/esm2022/moment-adapter/date-time-format.class.mjs +0 -13
  42. package/esm2022/moment-adapter/moment-adapter.module.mjs +0 -37
  43. package/esm2022/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +0 -5
  44. package/esm2022/moment-adapter/public-api.mjs +0 -3
  45. package/esm2022/native-adapter/date-time-adapter.class.mjs +0 -366
  46. package/esm2022/native-adapter/date-time-format.class.mjs +0 -13
  47. package/esm2022/native-adapter/native-adapter.module.mjs +0 -37
  48. package/esm2022/native-adapter/nxt-pick-datetime-native-adapter.mjs +0 -5
  49. package/esm2022/native-adapter/public-api.mjs +0 -2
  50. package/esm2022/nxt-pick-datetime.mjs +0 -5
  51. package/esm2022/public-api.mjs +0 -14
@@ -1,389 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, HostBinding, HostListener, ViewChild } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { CalendarComponent } from '../calendar/calendar.component';
4
- import { TimerComponent } from '../timer/timer.component';
5
- import { dateTimePickerAnimations } from './date-time-picker-container.animations';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../date-time-picker-intl.service";
8
- import * as i2 from "../../class/date-time-adapter.class";
9
- import * as i3 from "@angular/common";
10
- import * as i4 from "@angular/cdk/a11y";
11
- import * as i5 from "../timer/timer.component";
12
- import * as i6 from "../calendar/calendar.component";
13
- /** @internal */
14
- export class DateTimeContainerComponent {
15
- get pickerMoment() {
16
- return this._clamPickerMoment;
17
- }
18
- set pickerMoment(value) {
19
- if (value) {
20
- this._clamPickerMoment = this.dateTimeAdapter.clampDate(value, this.picker?.min, this.picker?.max);
21
- }
22
- this.cdRef.markForCheck();
23
- }
24
- get pickerType() {
25
- return this.picker?.pickerType;
26
- }
27
- get cancelLabel() {
28
- return this.pickerIntl.cancelBtnLabel;
29
- }
30
- get setLabel() {
31
- return this.pickerIntl.setBtnLabel;
32
- }
33
- /**
34
- * The range 'from' label
35
- */
36
- get fromLabel() {
37
- return this.pickerIntl.rangeFromLabel;
38
- }
39
- /**
40
- * The range 'to' label
41
- */
42
- get toLabel() {
43
- return this.pickerIntl.rangeToLabel;
44
- }
45
- /**
46
- * The range 'from' formatted value
47
- */
48
- get fromFormattedValue() {
49
- const value = this.picker?.selecteds[0];
50
- return value
51
- ? this.dateTimeAdapter.format(value, this.picker?.formatString)
52
- : '';
53
- }
54
- /**
55
- * The range 'to' formatted value
56
- */
57
- get toFormattedValue() {
58
- const value = this.picker?.selecteds[1];
59
- return value
60
- ? this.dateTimeAdapter.format(value, this.picker?.formatString)
61
- : '';
62
- }
63
- /**
64
- * Cases in which the control buttons show in the picker
65
- * 1) picker mode is 'dialog'
66
- * 2) picker type is NOT 'calendar' and the picker mode is NOT 'inline'
67
- */
68
- get showControlButtons() {
69
- return (this.picker?.pickerMode === 'dialog' ||
70
- (this.picker?.pickerType !== 'calendar' &&
71
- this.picker?.pickerMode !== 'inline'));
72
- }
73
- get containerElm() {
74
- return this.elmRef.nativeElement;
75
- }
76
- /** @internal */
77
- get containerClass() {
78
- return true;
79
- }
80
- /** @internal */
81
- get popupContainerClass() {
82
- return this.picker?.pickerMode === 'popup';
83
- }
84
- /** @internal */
85
- get dialogContainerClass() {
86
- return this.picker?.pickerMode === 'dialog';
87
- }
88
- /** @internal */
89
- get inlineContainerClass() {
90
- return this.picker?.pickerMode === 'inline';
91
- }
92
- /** @internal */
93
- get containerDisabledClass() {
94
- return !!this.picker?.disabled;
95
- }
96
- /** @internal */
97
- get containerId() {
98
- return this.picker?.id;
99
- }
100
- /** @internal */
101
- get containerAnimation() {
102
- return this.picker?.pickerMode === 'inline' ? '' : 'enter';
103
- }
104
- constructor(cdRef, elmRef, pickerIntl, dateTimeAdapter) {
105
- this.cdRef = cdRef;
106
- this.elmRef = elmRef;
107
- this.pickerIntl = pickerIntl;
108
- this.dateTimeAdapter = dateTimeAdapter;
109
- this.activeSelectedIndex = 0; // The current active SelectedIndex in range select mode (0: 'from', 1: 'to')
110
- /**
111
- * Stream emits when try to hide picker
112
- */
113
- this.hidePicker$ = new Subject();
114
- this.hidePickerStream = this.hidePicker$.asObservable();
115
- /**
116
- * Stream emits when try to confirm the selected value
117
- */
118
- this.confirmSelected$ = new Subject();
119
- this.confirmSelectedStream = this.confirmSelected$.asObservable();
120
- this.pickerOpened$ = new Subject();
121
- this.pickerOpenedStream = this.pickerOpened$.asObservable();
122
- }
123
- ngOnInit() { }
124
- ngAfterContentInit() {
125
- this.initPicker();
126
- }
127
- ngAfterViewInit() {
128
- this.focusPicker();
129
- }
130
- handleContainerAnimationDone(event) {
131
- const toState = event.toState;
132
- if (toState === 'enter') {
133
- this.pickerOpened$.next();
134
- }
135
- }
136
- dateSelected(date) {
137
- let result;
138
- if (this.picker?.isInSingleMode) {
139
- result = this.dateSelectedInSingleMode(date);
140
- if (result) {
141
- this.pickerMoment = result;
142
- this.picker.select(result);
143
- }
144
- else {
145
- // we close the picker when result is undefined and pickerType is calendar.
146
- if (this.pickerType === 'calendar') {
147
- this.hidePicker$.next();
148
- }
149
- }
150
- return;
151
- }
152
- if (this.picker?.isInRangeMode) {
153
- result = this.dateSelectedInRangeMode(date);
154
- if (result) {
155
- this.pickerMoment = result[this.activeSelectedIndex];
156
- this.picker.select(result);
157
- }
158
- }
159
- }
160
- timeSelected(time) {
161
- this.pickerMoment = this.dateTimeAdapter.clone(time);
162
- if (!this.picker?.dateTimeChecker(this.pickerMoment)) {
163
- return;
164
- }
165
- if (this.picker.isInSingleMode) {
166
- this.picker.select(this.pickerMoment);
167
- return;
168
- }
169
- if (this.picker.isInRangeMode) {
170
- const selecteds = [...this.picker?.selecteds || []];
171
- // check if the 'from' is after 'to' or 'to'is before 'from'
172
- // In this case, we set both the 'from' and 'to' the same value
173
- if ((this.activeSelectedIndex === 0 &&
174
- selecteds[1] &&
175
- this.dateTimeAdapter.compare(this.pickerMoment, selecteds[1]) === 1) ||
176
- (this.activeSelectedIndex === 1 &&
177
- selecteds[0] &&
178
- this.dateTimeAdapter.compare(this.pickerMoment, selecteds[0]) === -1)) {
179
- selecteds[0] = this.pickerMoment;
180
- selecteds[1] = this.pickerMoment;
181
- }
182
- else {
183
- selecteds[this.activeSelectedIndex] = this.pickerMoment;
184
- }
185
- this.picker.select(selecteds);
186
- }
187
- }
188
- /**
189
- * Handle click on cancel button
190
- */
191
- onCancelClicked(event) {
192
- this.hidePicker$.next();
193
- event.preventDefault();
194
- return;
195
- }
196
- /**
197
- * Handle click on set button
198
- */
199
- onSetClicked(event) {
200
- if (!this.picker?.dateTimeChecker?.(this.pickerMoment)) {
201
- this.hidePicker$.next();
202
- event.preventDefault();
203
- return;
204
- }
205
- this.confirmSelected$.next(event);
206
- event.preventDefault();
207
- return;
208
- }
209
- /**
210
- * Handle click on inform radio group
211
- */
212
- handleClickOnInfoGroup(event, index) {
213
- this.setActiveSelectedIndex(index);
214
- event.preventDefault();
215
- event.stopPropagation();
216
- }
217
- /**
218
- * Handle click on inform radio group
219
- */
220
- handleKeydownOnInfoGroup(event, next, index) {
221
- switch (event.keyCode) {
222
- case 'ArrowDown':
223
- case 'ArrowRight':
224
- case 'ArrowUp':
225
- case 'ArrowLeft':
226
- next.focus();
227
- this.setActiveSelectedIndex(index === 0 ? 1 : 0);
228
- event.preventDefault();
229
- event.stopPropagation();
230
- break;
231
- case 'Space':
232
- this.setActiveSelectedIndex(index);
233
- event.preventDefault();
234
- event.stopPropagation();
235
- break;
236
- default:
237
- return;
238
- }
239
- }
240
- /**
241
- * Set the value of activeSelectedIndex
242
- */
243
- setActiveSelectedIndex(index) {
244
- if (this.picker?.selectMode === 'range' &&
245
- this.activeSelectedIndex !== index) {
246
- this.activeSelectedIndex = index;
247
- const selected = this.picker?.selecteds[this.activeSelectedIndex];
248
- if (this.picker.selecteds && selected) {
249
- this.pickerMoment = this.dateTimeAdapter.clone(selected);
250
- }
251
- }
252
- return;
253
- }
254
- initPicker() {
255
- this.pickerMoment = this.picker?.startAt || this.dateTimeAdapter.now();
256
- this.activeSelectedIndex = this.picker?.selectMode === 'rangeTo' ? 1 : 0;
257
- }
258
- /**
259
- * Select calendar date in single mode,
260
- * it returns undefined when date is not selected.
261
- */
262
- dateSelectedInSingleMode(date) {
263
- if (this.dateTimeAdapter.isSameDay(date, this.picker?.selected)) {
264
- return undefined;
265
- }
266
- return this.updateAndCheckCalendarDate(date);
267
- }
268
- /**
269
- * Select dates in range Mode
270
- */
271
- dateSelectedInRangeMode(date) {
272
- let from = this.picker?.selecteds[0];
273
- let to = this.picker?.selecteds[1];
274
- const result = this.updateAndCheckCalendarDate(date);
275
- if (!result) {
276
- return;
277
- }
278
- // if the given calendar day is after or equal to 'from',
279
- // set ths given date as 'to'
280
- // otherwise, set it as 'from' and set 'to' to undefined
281
- if (this.picker?.selectMode === 'range') {
282
- if (this.picker.selecteds &&
283
- this.picker.selecteds.length &&
284
- !to &&
285
- from &&
286
- (this.dateTimeAdapter.differenceInCalendarDays(result, from) ?? 0) >= 0) {
287
- to = result;
288
- this.activeSelectedIndex = 1;
289
- }
290
- else {
291
- from = result;
292
- to = undefined;
293
- this.activeSelectedIndex = 0;
294
- }
295
- }
296
- else if (this.picker?.selectMode === 'rangeFrom') {
297
- from = result;
298
- // if the from value is after the to value, set the to value as undefined
299
- if (to && this.dateTimeAdapter.compare(from, to) > 0) {
300
- to = undefined;
301
- }
302
- }
303
- else if (this.picker?.selectMode === 'rangeTo') {
304
- to = result;
305
- // if the from value is after the to value, set the from value as undefined
306
- if (from && this.dateTimeAdapter.compare(from, to) > 0) {
307
- from = undefined;
308
- }
309
- }
310
- return [from, to];
311
- }
312
- /**
313
- * Update the given calendar date's time and check if it is valid
314
- * Because the calendar date has 00:00:00 as default time, if the picker type is 'both',
315
- * we need to update the given calendar date's time before selecting it.
316
- * if it is valid, return the updated dateTime
317
- * if it is not valid, return undefined
318
- */
319
- updateAndCheckCalendarDate(date) {
320
- let result;
321
- // if the picker is 'both', update the calendar date's time value
322
- if (this.picker?.pickerType === 'both') {
323
- result = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(date), this.dateTimeAdapter.getMonth(date), this.dateTimeAdapter.getDate(date), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
324
- result = this.dateTimeAdapter.clampDate(result, this.picker.min, this.picker.max);
325
- }
326
- else {
327
- result = this.dateTimeAdapter.clone(date);
328
- }
329
- // check the updated dateTime
330
- return this.picker?.dateTimeChecker(result) ? result : undefined;
331
- }
332
- /**
333
- * Focus to the picker
334
- */
335
- focusPicker() {
336
- if (this.picker?.pickerMode === 'inline') {
337
- return;
338
- }
339
- if (this.calendar) {
340
- this.calendar.focusActiveCell();
341
- }
342
- else if (this.timer) {
343
- this.timer.focus();
344
- }
345
- }
346
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DateTimeContainerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.DateTimeIntl }, { token: i2.DateTimeAdapter }], target: i0.ɵɵFactoryTarget.Component }); }
347
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.4", type: DateTimeContainerComponent, selector: "nxt-date-time-container", host: { listeners: { "@transformPicker.done": "handleContainerAnimationDone($event)" }, properties: { "class.nxt-dt-container": "this.containerClass", "class.nxt-dt-popup-container": "this.popupContainerClass", "class.nxt-dt-dialog-container": "this.dialogContainerClass", "class.nxt-dt-inline-container": "this.inlineContainerClass", "class.nxt-dt-container-disabled": "this.containerDisabledClass", "attr.id": "this.containerId", "@transformPicker": "this.containerAnimation" } }, viewQueries: [{ propertyName: "calendar", first: true, predicate: CalendarComponent, descendants: true }, { propertyName: "timer", first: true, predicate: TimerComponent, descendants: true }], ngImport: i0, template: "<div [cdkTrapFocus]=\"picker?.pickerMode !== 'inline'\"\n [@fadeInPicker]=\"picker?.pickerMode === 'inline'? '' : 'enter'\"\n class=\"nxt-dt-container-inner\">\n\n <nxt-date-time-calendar *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\n class=\"nxt-dt-container-row\"\n [firstDayOfWeek]=\"picker?.firstDayOfWeek ?? 0\"\n [(pickerMoment)]=\"pickerMoment\"\n [selected]=\"picker?.selected\"\n [selecteds]=\"picker?.selecteds ?? []\"\n [selectMode]=\"picker?.selectMode\"\n [min]=\"picker?.min\"\n [max]=\"picker?.max\"\n [dateTimeFilter]=\"picker?.dateTimeFilter\"\n [startView]=\"picker?.startView ?? 'month'\"\n [hideOtherMonths]=\"!!picker?.hideOtherMonths\"\n (yearSelected)=\"picker?.selectYear($event)\"\n (monthSelected)=\"picker?.selectMonth($event)\"\n (selectedChange)=\"dateSelected($event)\"></nxt-date-time-calendar>\n\n <nxt-date-time-timer *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\n class=\"nxt-dt-container-row\"\n [pickerMoment]=\"pickerMoment\"\n [min]=\"picker?.min\"\n [max]=\"picker?.max\"\n [showSecondsTimer]=\"!!picker?.showSecondsTimer\"\n [hour12Timer]=\"!!picker?.hour12Timer\"\n [stepHour]=\"picker?.stepHour ?? 1\"\n [stepMinute]=\"picker?.stepMinute ?? 1\"\n [stepSecond]=\"picker?.stepSecond ?? 1\"\n (selectedChange)=\"timeSelected($event)\"></nxt-date-time-timer>\n\n <div *ngIf=\"picker?.isInRangeMode\"\n role=\"radiogroup\"\n class=\"nxt-dt-container-info nxt-dt-container-row\">\n <div role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-from\"\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 0}\"\n (click)=\"handleClickOnInfoGroup($event, 0)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\n #from>\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"nxt-dt-container-info-label\">{{fromLabel}}:</span>\n <span class=\"nxt-dt-container-info-value\">{{fromFormattedValue}}</span>\n </span>\n </div>\n <div role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-to\"\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 1}\"\n (click)=\"handleClickOnInfoGroup($event, 1)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\n #to>\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"nxt-dt-container-info-label\">{{toLabel}}:</span>\n <span class=\"nxt-dt-container-info-value\">{{toFormattedValue}}</span>\n </span>\n </div>\n </div>\n\n <div *ngIf=\"showControlButtons\"\n class=\"nxt-dt-container-buttons nxt-dt-container-row\">\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onCancelClicked($event)\">\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\n tabindex=\"-1\">\n {{cancelLabel}}\n </span>\n </button>\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onSetClicked($event)\">\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\n tabindex=\"-1\">\n {{setLabel}}\n </span>\n </button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i5.TimerComponent, selector: "nxt-date-time-timer", inputs: ["pickerMoment", "min", "max", "showSecondsTimer", "hour12Timer", "stepHour", "stepMinute", "stepSecond"], outputs: ["selectedChange"] }, { kind: "component", type: i6.CalendarComponent, selector: "nxt-date-time-calendar", inputs: ["dateTimeFilter", "firstDayOfWeek", "min", "max", "pickerMoment", "selectMode", "selected", "selecteds", "startView", "hideOtherMonths"], outputs: ["pickerMomentChange", "selectedChange", "userSelection", "yearSelected", "monthSelected"] }], animations: [
348
- dateTimePickerAnimations.transformPicker,
349
- dateTimePickerAnimations.fadeInPicker
350
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
351
- }
352
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: DateTimeContainerComponent, decorators: [{
353
- type: Component,
354
- args: [{ selector: 'nxt-date-time-container', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, animations: [
355
- dateTimePickerAnimations.transformPicker,
356
- dateTimePickerAnimations.fadeInPicker
357
- ], template: "<div [cdkTrapFocus]=\"picker?.pickerMode !== 'inline'\"\n [@fadeInPicker]=\"picker?.pickerMode === 'inline'? '' : 'enter'\"\n class=\"nxt-dt-container-inner\">\n\n <nxt-date-time-calendar *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\n class=\"nxt-dt-container-row\"\n [firstDayOfWeek]=\"picker?.firstDayOfWeek ?? 0\"\n [(pickerMoment)]=\"pickerMoment\"\n [selected]=\"picker?.selected\"\n [selecteds]=\"picker?.selecteds ?? []\"\n [selectMode]=\"picker?.selectMode\"\n [min]=\"picker?.min\"\n [max]=\"picker?.max\"\n [dateTimeFilter]=\"picker?.dateTimeFilter\"\n [startView]=\"picker?.startView ?? 'month'\"\n [hideOtherMonths]=\"!!picker?.hideOtherMonths\"\n (yearSelected)=\"picker?.selectYear($event)\"\n (monthSelected)=\"picker?.selectMonth($event)\"\n (selectedChange)=\"dateSelected($event)\"></nxt-date-time-calendar>\n\n <nxt-date-time-timer *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\n class=\"nxt-dt-container-row\"\n [pickerMoment]=\"pickerMoment\"\n [min]=\"picker?.min\"\n [max]=\"picker?.max\"\n [showSecondsTimer]=\"!!picker?.showSecondsTimer\"\n [hour12Timer]=\"!!picker?.hour12Timer\"\n [stepHour]=\"picker?.stepHour ?? 1\"\n [stepMinute]=\"picker?.stepMinute ?? 1\"\n [stepSecond]=\"picker?.stepSecond ?? 1\"\n (selectedChange)=\"timeSelected($event)\"></nxt-date-time-timer>\n\n <div *ngIf=\"picker?.isInRangeMode\"\n role=\"radiogroup\"\n class=\"nxt-dt-container-info nxt-dt-container-row\">\n <div role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-from\"\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 0}\"\n (click)=\"handleClickOnInfoGroup($event, 0)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\n #from>\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"nxt-dt-container-info-label\">{{fromLabel}}:</span>\n <span class=\"nxt-dt-container-info-value\">{{fromFormattedValue}}</span>\n </span>\n </div>\n <div role=\"radio\"\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-to\"\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 1}\"\n (click)=\"handleClickOnInfoGroup($event, 1)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\n #to>\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"nxt-dt-container-info-label\">{{toLabel}}:</span>\n <span class=\"nxt-dt-container-info-value\">{{toFormattedValue}}</span>\n </span>\n </div>\n </div>\n\n <div *ngIf=\"showControlButtons\"\n class=\"nxt-dt-container-buttons nxt-dt-container-row\">\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onCancelClicked($event)\">\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\n tabindex=\"-1\">\n {{cancelLabel}}\n </span>\n </button>\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"onSetClicked($event)\">\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\n tabindex=\"-1\">\n {{setLabel}}\n </span>\n </button>\n </div>\n</div>\n" }]
358
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.DateTimeIntl }, { type: i2.DateTimeAdapter }], propDecorators: { calendar: [{
359
- type: ViewChild,
360
- args: [CalendarComponent]
361
- }], timer: [{
362
- type: ViewChild,
363
- args: [TimerComponent]
364
- }], containerClass: [{
365
- type: HostBinding,
366
- args: ['class.nxt-dt-container']
367
- }], popupContainerClass: [{
368
- type: HostBinding,
369
- args: ['class.nxt-dt-popup-container']
370
- }], dialogContainerClass: [{
371
- type: HostBinding,
372
- args: ['class.nxt-dt-dialog-container']
373
- }], inlineContainerClass: [{
374
- type: HostBinding,
375
- args: ['class.nxt-dt-inline-container']
376
- }], containerDisabledClass: [{
377
- type: HostBinding,
378
- args: ['class.nxt-dt-container-disabled']
379
- }], containerId: [{
380
- type: HostBinding,
381
- args: ['attr.id']
382
- }], containerAnimation: [{
383
- type: HostBinding,
384
- args: ['@transformPicker']
385
- }], handleContainerAnimationDone: [{
386
- type: HostListener,
387
- args: ['@transformPicker.done', ['$event']]
388
- }] } });
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGljay1kYXRldGltZS9zcmMvbGliL2RhdGUtdGltZS9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBbUMsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxXQUFXLEVBQUUsWUFBWSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNoTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBRWxFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTs7Ozs7Ozs7QUFFbEYsZ0JBQWdCO0FBWWhCLE1BQU0sT0FBTywwQkFBMEI7SUFtQ25DLElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFBO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFvQjtRQUNqQyxJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FDbkQsS0FBSyxFQUNMLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUNoQixJQUFJLENBQUMsTUFBTSxFQUFFLEdB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Qi9CLDRCQUE0QjtzQkFEM0IsWUFBWTt1QkFBQyx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucydcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJ1xuaW1wb3J0IHsgRGF0ZVRpbWVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUuY2xhc3MnXG5pbXBvcnQgeyBDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCdcbmltcG9ydCB7IERhdGVUaW1lSW50bCB9IGZyb20gJy4uL2RhdGUtdGltZS1waWNrZXItaW50bC5zZXJ2aWNlJ1xuaW1wb3J0IHsgVGltZXJDb21wb25lbnQgfSBmcm9tICcuLi90aW1lci90aW1lci5jb21wb25lbnQnXG5pbXBvcnQgeyBkYXRlVGltZVBpY2tlckFuaW1hdGlvbnMgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmFuaW1hdGlvbnMnXG5cbi8qKiBAaW50ZXJuYWwgKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbnh0LWRhdGUtdGltZS1jb250YWluZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIGRhdGVUaW1lUGlja2VyQW5pbWF0aW9ucy50cmFuc2Zvcm1QaWNrZXIsXG4gICAgICAgIGRhdGVUaW1lUGlja2VyQW5pbWF0aW9ucy5mYWRlSW5QaWNrZXJcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVUaW1lQ29udGFpbmVyQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0IHtcblxuICAgIEBWaWV3Q2hpbGQoQ2FsZW5kYXJDb21wb25lbnQpXG4gICAgY2FsZW5kYXI/OiBDYWxlbmRhckNvbXBvbmVudDxUPlxuXG4gICAgQFZpZXdDaGlsZChUaW1lckNvbXBvbmVudClcbiAgICB0aW1lcj86IFRpbWVyQ29tcG9uZW50PFQ+XG5cbiAgICBwaWNrZXI/OiBEYXRlVGltZURpcmVjdGl2ZTxUPlxuICAgIGFjdGl2ZVNlbGVjdGVkSW5kZXggPSAwIC8vIFRoZSBjdXJyZW50IGFjdGl2ZSBTZWxlY3RlZEluZGV4IGluIHJhbmdlIHNlbGVjdCBtb2RlICgwOiAnZnJvbScsIDE6ICd0bycpXG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW0gZW1pdHMgd2hlbiB0cnkgdG8gaGlkZSBwaWNrZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZGVQaWNrZXIkID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gICAgcmVhZG9ubHkgaGlkZVBpY2tlclN0cmVhbSA9IHRoaXMuaGlkZVBpY2tlciQuYXNPYnNlcnZhYmxlKClcblxuICAgIC8qKlxuICAgICAqIFN0cmVhbSBlbWl0cyB3aGVuIHRyeSB0byBjb25maXJtIHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlybVNlbGVjdGVkJCA9IG5ldyBTdWJqZWN0PEV2ZW50PigpXG5cbiAgICByZWFkb25seSBjb25maXJtU2VsZWN0ZWRTdHJlYW0gPSB0aGlzLmNvbmZpcm1TZWxlY3RlZCQuYXNPYnNlcnZhYmxlKClcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGlja2VyT3BlbmVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICAgIHJlYWRvbmx5IHBpY2tlck9wZW5lZFN0cmVhbSA9IHRoaXMucGlja2VyT3BlbmVkJC5hc09ic2VydmFibGUoKVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgcGlja2VyIG1vbWVudC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIHRpbWUgcGVyaW9kIGlzIHNob3duIGFuZCB3aGljaCBkYXRlIGlzXG4gICAgICogaGlnaGxpZ2h0ZWQgd2hlbiB1c2luZyBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2NsYW1QaWNrZXJNb21lbnQ/OiBUXG5cbiAgICBnZXQgcGlja2VyTW9tZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhbVBpY2tlck1vbWVudFxuICAgIH1cblxuICAgIHNldCBwaWNrZXJNb21lbnQodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGFtUGlja2VyTW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xhbXBEYXRlKFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyPy5taW4sXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXI/Lm1heFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKClcbiAgICB9XG5cbiAgICBnZXQgcGlja2VyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5waWNrZXJUeXBlXG4gICAgfVxuXG4gICAgZ2V0IGNhbmNlbExhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwuY2FuY2VsQnRuTGFiZWxcbiAgICB9XG5cbiAgICBnZXQgc2V0TGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VySW50bC5zZXRCdG5MYWJlbFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSByYW5nZSAnZnJvbScgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgZnJvbUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucmFuZ2VGcm9tTGFiZWxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2UgJ3RvJyBsYWJlbFxuICAgICAqL1xuICAgIGdldCB0b0xhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucmFuZ2VUb0xhYmVsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJhbmdlICdmcm9tJyBmb3JtYXR0ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgZnJvbUZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5waWNrZXI/LnNlbGVjdGVkc1swXVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLnBpY2tlcj8uZm9ybWF0U3RyaW5nKVxuICAgICAgICAgICAgOiAnJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSByYW5nZSAndG8nIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAqL1xuICAgIGdldCB0b0Zvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5waWNrZXI/LnNlbGVjdGVkc1sxXVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLnBpY2tlcj8uZm9ybWF0U3RyaW5nKVxuICAgICAgICAgICAgOiAnJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc2VzIGluIHdoaWNoIHRoZSBjb250cm9sIGJ1dHRvbnMgc2hvdyBpbiB0aGUgcGlja2VyXG4gICAgICogMSkgcGlja2VyIG1vZGUgaXMgJ2RpYWxvZydcbiAgICAgKiAyKSBwaWNrZXIgdHlwZSBpcyBOT1QgJ2NhbGVuZGFyJyBhbmQgdGhlIHBpY2tlciBtb2RlIGlzIE5PVCAnaW5saW5lJ1xuICAgICAqL1xuICAgIGdldCBzaG93Q29udHJvbEJ1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSA9PT0gJ2RpYWxvZycgfHxcbiAgICAgICAgICAgICh0aGlzLnBpY2tlcj8ucGlja2VyVHlwZSAhPT0gJ2NhbGVuZGFyJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyPy5waWNrZXJNb2RlICE9PSAnaW5saW5lJylcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGdldCBjb250YWluZXJFbG0oKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1jb250YWluZXInKVxuICAgIGdldCBjb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtcG9wdXAtY29udGFpbmVyJylcbiAgICBnZXQgcG9wdXBDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5waWNrZXJNb2RlID09PSAncG9wdXAnXG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubnh0LWR0LWRpYWxvZy1jb250YWluZXInKVxuICAgIGdldCBkaWFsb2dDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5waWNrZXJNb2RlID09PSAnZGlhbG9nJ1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1pbmxpbmUtY29udGFpbmVyJylcbiAgICBnZXQgaW5saW5lQ29udGFpbmVyQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSA9PT0gJ2lubGluZSdcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtY29udGFpbmVyLWRpc2FibGVkJylcbiAgICBnZXQgY29udGFpbmVyRGlzYWJsZWRDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5waWNrZXI/LmRpc2FibGVkXG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgZ2V0IGNvbnRhaW5lcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlcj8uaWRcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdAdHJhbnNmb3JtUGlja2VyJylcbiAgICBnZXQgY29udGFpbmVyQW5pbWF0aW9uKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSA9PT0gJ2lubGluZScgPyAnJyA6ICdlbnRlcidcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWxtUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwaWNrZXJJbnRsOiBEYXRlVGltZUludGwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVRpbWVBZGFwdGVyOiBEYXRlVGltZUFkYXB0ZXI8VD5cbiAgICApIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7IH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0UGlja2VyKClcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNQaWNrZXIoKVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ0B0cmFuc2Zvcm1QaWNrZXIuZG9uZScsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlQ29udGFpbmVyQW5pbWF0aW9uRG9uZShldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9TdGF0ZSA9IGV2ZW50LnRvU3RhdGVcbiAgICAgICAgaWYgKHRvU3RhdGUgPT09ICdlbnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyT3BlbmVkJC5uZXh0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRhdGVTZWxlY3RlZChkYXRlPzogVCk6IHZvaWQge1xuICAgICAgICBsZXQgcmVzdWx0XG5cbiAgICAgICAgaWYgKHRoaXMucGlja2VyPy5pc0luU2luZ2xlTW9kZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlU2VsZWN0ZWRJblNpbmdsZU1vZGUoZGF0ZSlcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCA9IHJlc3VsdFxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLnNlbGVjdChyZXN1bHQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHdlIGNsb3NlIHRoZSBwaWNrZXIgd2hlbiByZXN1bHQgaXMgdW5kZWZpbmVkIGFuZCBwaWNrZXJUeXBlIGlzIGNhbGVuZGFyLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlclR5cGUgPT09ICdjYWxlbmRhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlUGlja2VyJC5uZXh0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBpY2tlcj8uaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlU2VsZWN0ZWRJblJhbmdlTW9kZShkYXRlKVxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50ID0gcmVzdWx0W3RoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleF1cbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3QocmVzdWx0KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGltZVNlbGVjdGVkKHRpbWU/OiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xvbmUodGltZSlcblxuICAgICAgICBpZiAoIXRoaXMucGlja2VyPy5kYXRlVGltZUNoZWNrZXIodGhpcy5waWNrZXJNb21lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBpY2tlci5pc0luU2luZ2xlTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHRoaXMucGlja2VyTW9tZW50KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5waWNrZXIuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRzID0gWy4uLnRoaXMucGlja2VyPy5zZWxlY3RlZHMgfHwgW11dXG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSAnZnJvbScgaXMgYWZ0ZXIgJ3RvJyBvciAndG8naXMgYmVmb3JlICdmcm9tJ1xuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBzZXQgYm90aCB0aGUgJ2Zyb20nIGFuZCAndG8nIHRoZSBzYW1lIHZhbHVlXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMV0gJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzFdXG4gICAgICAgICAgICAgICAgICAgICkgPT09IDEpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzBdXG4gICAgICAgICAgICAgICAgICAgICkgPT09IC0xKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzBdID0gdGhpcy5waWNrZXJNb21lbnRcbiAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMV0gPSB0aGlzLnBpY2tlck1vbWVudFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZHNbdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4XSA9IHRoaXMucGlja2VyTW9tZW50XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGlja2VyLnNlbGVjdChzZWxlY3RlZHMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgY2xpY2sgb24gY2FuY2VsIGJ1dHRvblxuICAgICAqL1xuICAgIG9uQ2FuY2VsQ2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWRlUGlja2VyJC5uZXh0KClcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgY2xpY2sgb24gc2V0IGJ1dHRvblxuICAgICAqL1xuICAgIG9uU2V0Q2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBpY2tlcj8uZGF0ZVRpbWVDaGVja2VyPy4odGhpcy5waWNrZXJNb21lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQoKVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpcm1TZWxlY3RlZCQubmV4dChldmVudClcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgY2xpY2sgb24gaW5mb3JtIHJhZGlvIGdyb3VwXG4gICAgICovXG4gICAgaGFuZGxlQ2xpY2tPbkluZm9Hcm91cChldmVudDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRJbmRleChpbmRleClcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBjbGljayBvbiBpbmZvcm0gcmFkaW8gZ3JvdXBcbiAgICAgKi9cbiAgICBoYW5kbGVLZXlkb3duT25JbmZvR3JvdXAoXG4gICAgICAgIGV2ZW50OiBhbnksXG4gICAgICAgIG5leHQ6IGFueSxcbiAgICAgICAgaW5kZXg6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgICAgICBuZXh0LmZvY3VzKClcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXggPT09IDAgPyAxIDogMClcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdTcGFjZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4KVxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGFjdGl2ZVNlbGVjdGVkSW5kZXhcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnBpY2tlcj8uc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyAmJlxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ICE9PSBpbmRleFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IGluZGV4XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5waWNrZXI/LnNlbGVjdGVkc1t0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXhdXG4gICAgICAgICAgICBpZiAodGhpcy5waWNrZXIuc2VsZWN0ZWRzICYmIHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbG9uZShzZWxlY3RlZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRQaWNrZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50ID0gdGhpcy5waWNrZXI/LnN0YXJ0QXQgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIubm93KClcbiAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID0gdGhpcy5waWNrZXI/LnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJyA/IDEgOiAwXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IGNhbGVuZGFyIGRhdGUgaW4gc2luZ2xlIG1vZGUsXG4gICAgICogaXQgcmV0dXJucyB1bmRlZmluZWQgd2hlbiBkYXRlIGlzIG5vdCBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGRhdGVTZWxlY3RlZEluU2luZ2xlTW9kZShkYXRlPzogVCk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNTYW1lRGF5KGRhdGUsIHRoaXMucGlja2VyPy5zZWxlY3RlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUFuZENoZWNrQ2FsZW5kYXJEYXRlKGRhdGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IGRhdGVzIGluIHJhbmdlIE1vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGRhdGVTZWxlY3RlZEluUmFuZ2VNb2RlKGRhdGU/OiBUKTogQXJyYXk8VCB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMucGlja2VyPy5zZWxlY3RlZHNbMF1cbiAgICAgICAgbGV0IHRvID0gdGhpcy5waWNrZXI/LnNlbGVjdGVkc1sxXVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudXBkYXRlQW5kQ2hlY2tDYWxlbmRhckRhdGUoZGF0ZSlcblxuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgZ2l2ZW4gY2FsZW5kYXIgZGF5IGlzIGFmdGVyIG9yIGVxdWFsIHRvICdmcm9tJyxcbiAgICAgICAgLy8gc2V0IHRocyBnaXZlbiBkYXRlIGFzICd0bydcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBzZXQgaXQgYXMgJ2Zyb20nIGFuZCBzZXQgJ3RvJyB0byB1bmRlZmluZWRcbiAgICAgICAgaWYgKHRoaXMucGlja2VyPy5zZWxlY3RNb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0ZWRzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0ZWRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICF0byAmJlxuICAgICAgICAgICAgICAgIGZyb20gJiZcbiAgICAgICAgICAgICAgICAodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHJlc3VsdCwgZnJvbSkgPz8gMCkgPj0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdG8gPSByZXN1bHRcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSAxXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSByZXN1bHRcbiAgICAgICAgICAgICAgICB0byA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlcj8uc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScpIHtcbiAgICAgICAgICAgIGZyb20gPSByZXN1bHRcblxuICAgICAgICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIHRvIHZhbHVlIGFzIHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHRvICYmIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZnJvbSwgdG8pID4gMCkge1xuICAgICAgICAgICAgICAgIHRvID0gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXI/LnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJykge1xuICAgICAgICAgICAgdG8gPSByZXN1bHRcblxuICAgICAgICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIGZyb20gdmFsdWUgYXMgdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoZnJvbSAmJiB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGZyb20sIHRvKSA+IDApIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2Zyb20sIHRvXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgZ2l2ZW4gY2FsZW5kYXIgZGF0ZSdzIHRpbWUgYW5kIGNoZWNrIGlmIGl0IGlzIHZhbGlkXG4gICAgICogQmVjYXVzZSB0aGUgY2FsZW5kYXIgZGF0ZSBoYXMgMDA6MDA6MDAgYXMgZGVmYXVsdCB0aW1lLCBpZiB0aGUgcGlja2VyIHR5cGUgaXMgJ2JvdGgnLFxuICAgICAqIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBnaXZlbiBjYWxlbmRhciBkYXRlJ3MgdGltZSBiZWZvcmUgc2VsZWN0aW5nIGl0LlxuICAgICAqIGlmIGl0IGlzIHZhbGlkLCByZXR1cm4gdGhlIHVwZGF0ZWQgZGF0ZVRpbWVcbiAgICAgKiBpZiBpdCBpcyBub3QgdmFsaWQsIHJldHVybiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZUFuZENoZWNrQ2FsZW5kYXJEYXRlKGRhdGU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCByZXN1bHRcblxuICAgICAgICAvLyBpZiB0aGUgcGlja2VyIGlzICdib3RoJywgdXBkYXRlIHRoZSBjYWxlbmRhciBkYXRlJ3MgdGltZSB2YWx1ZVxuICAgICAgICBpZiAodGhpcy5waWNrZXI/LnBpY2tlclR5cGUgPT09ICdib3RoJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGUpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKGRhdGUpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUoZGF0ZSksXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0SG91cnModGhpcy5waWNrZXJNb21lbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1pbnV0ZXModGhpcy5waWNrZXJNb21lbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFNlY29uZHModGhpcy5waWNrZXJNb21lbnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLm1pbixcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5tYXhcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKGRhdGUpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayB0aGUgdXBkYXRlZCBkYXRlVGltZVxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXI/LmRhdGVUaW1lQ2hlY2tlcihyZXN1bHQpID8gcmVzdWx0IDogdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXMgdG8gdGhlIHBpY2tlclxuICAgICAqL1xuICAgIHByaXZhdGUgZm9jdXNQaWNrZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuZm9jdXNBY3RpdmVDZWxsKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVyLmZvY3VzKClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgW2Nka1RyYXBGb2N1c109XCJwaWNrZXI/LnBpY2tlck1vZGUgIT09ICdpbmxpbmUnXCJcbiAgICBbQGZhZGVJblBpY2tlcl09XCJwaWNrZXI/LnBpY2tlck1vZGUgPT09ICdpbmxpbmUnPyAnJyA6ICdlbnRlcidcIlxuICAgIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1pbm5lclwiPlxuXG4gICAgPG54dC1kYXRlLXRpbWUtY2FsZW5kYXIgKm5nSWY9XCJwaWNrZXJUeXBlID09PSAnYm90aCcgfHwgcGlja2VyVHlwZSA9PT0gJ2NhbGVuZGFyJ1wiXG4gICAgICAgIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1yb3dcIlxuICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwicGlja2VyPy5maXJzdERheU9mV2VlayA/PyAwXCJcbiAgICAgICAgWyhwaWNrZXJNb21lbnQpXT1cInBpY2tlck1vbWVudFwiXG4gICAgICAgIFtzZWxlY3RlZF09XCJwaWNrZXI/LnNlbGVjdGVkXCJcbiAgICAgICAgW3NlbGVjdGVkc109XCJwaWNrZXI/LnNlbGVjdGVkcyA/PyBbXVwiXG4gICAgICAgIFtzZWxlY3RNb2RlXT1cInBpY2tlcj8uc2VsZWN0TW9kZVwiXG4gICAgICAgIFttaW5dPVwicGlja2VyPy5taW5cIlxuICAgICAgICBbbWF4XT1cInBpY2tlcj8ubWF4XCJcbiAgICAgICAgW2RhdGVUaW1lRmlsdGVyXT1cInBpY2tlcj8uZGF0ZVRpbWVGaWx0ZXJcIlxuICAgICAgICBbc3RhcnRWaWV3XT1cInBpY2tlcj8uc3RhcnRWaWV3ID8/ICdtb250aCdcIlxuICAgICAgICBbaGlkZU90aGVyTW9udGhzXT1cIiEhcGlja2VyPy5oaWRlT3RoZXJNb250aHNcIlxuICAgICAgICAoeWVhclNlbGVjdGVkKT1cInBpY2tlcj8uc2VsZWN0WWVhcigkZXZlbnQpXCJcbiAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwicGlja2VyPy5zZWxlY3RNb250aCgkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cImRhdGVTZWxlY3RlZCgkZXZlbnQpXCI+PC9ueHQtZGF0ZS10aW1lLWNhbGVuZGFyPlxuXG4gICAgPG54dC1kYXRlLXRpbWUtdGltZXIgKm5nSWY9XCJwaWNrZXJUeXBlID09PSAnYm90aCcgfHwgcGlja2VyVHlwZSA9PT0gJ3RpbWVyJ1wiXG4gICAgICAgIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1yb3dcIlxuICAgICAgICBbcGlja2VyTW9tZW50XT1cInBpY2tlck1vbWVudFwiXG4gICAgICAgIFttaW5dPVwicGlja2VyPy5taW5cIlxuICAgICAgICBbbWF4XT1cInBpY2tlcj8ubWF4XCJcbiAgICAgICAgW3Nob3dTZWNvbmRzVGltZXJdPVwiISFwaWNrZXI/LnNob3dTZWNvbmRzVGltZXJcIlxuICAgICAgICBbaG91cjEyVGltZXJdPVwiISFwaWNrZXI/LmhvdXIxMlRpbWVyXCJcbiAgICAgICAgW3N0ZXBIb3VyXT1cInBpY2tlcj8uc3RlcEhvdXIgPz8gMVwiXG4gICAgICAgIFtzdGVwTWludXRlXT1cInBpY2tlcj8uc3RlcE1pbnV0ZSA/PyAxXCJcbiAgICAgICAgW3N0ZXBTZWNvbmRdPVwicGlja2VyPy5zdGVwU2Vjb25kID8/IDFcIlxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwidGltZVNlbGVjdGVkKCRldmVudClcIj48L254dC1kYXRlLXRpbWUtdGltZXI+XG5cbiAgICA8ZGl2ICpuZ0lmPVwicGlja2VyPy5pc0luUmFuZ2VNb2RlXCJcbiAgICAgICAgcm9sZT1cInJhZGlvZ3JvdXBcIlxuICAgICAgICBjbGFzcz1cIm54dC1kdC1jb250YWluZXItaW5mbyBueHQtZHQtY29udGFpbmVyLXJvd1wiPlxuICAgICAgICA8ZGl2IHJvbGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMCA/IDAgOiAtMVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMFwiXG4gICAgICAgICAgICBjbGFzcz1cIm54dC1kdC1jb250cm9sIG54dC1kdC1jb250YWluZXItcmFuZ2Ugbnh0LWR0LWNvbnRhaW5lci1mcm9tXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbnh0LWR0LWNvbnRhaW5lci1pbmZvLWFjdGl2ZSc6IGFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGlja09uSW5mb0dyb3VwKCRldmVudCwgMClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bk9uSW5mb0dyb3VwKCRldmVudCwgdG8sIDApXCJcbiAgICAgICAgICAgICNmcm9tPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udHJvbC1jb250ZW50IG54dC1kdC1jb250YWluZXItcmFuZ2UtY29udGVudFwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1pbmZvLWxhYmVsXCI+e3tmcm9tTGFiZWx9fTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8tdmFsdWVcIj57e2Zyb21Gb3JtYXR0ZWRWYWx1ZX19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEgPyAwIDogLTFcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDFcIlxuICAgICAgICAgICAgY2xhc3M9XCJueHQtZHQtY29udHJvbCBueHQtZHQtY29udGFpbmVyLXJhbmdlIG54dC1kdC1jb250YWluZXItdG9cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydueHQtZHQtY29udGFpbmVyLWluZm8tYWN0aXZlJzogYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrT25JbmZvR3JvdXAoJGV2ZW50LCAxKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duT25JbmZvR3JvdXAoJGV2ZW50LCBmcm9tLCAxKVwiXG4gICAgICAgICAgICAjdG8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm54dC1kdC1jb250cm9sLWNvbnRlbnQgbnh0LWR0LWNvbnRhaW5lci1yYW5nZS1jb250ZW50XCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8tbGFiZWxcIj57e3RvTGFiZWx9fTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8tdmFsdWVcIj57e3RvRm9ybWF0dGVkVmFsdWV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbnRyb2xCdXR0b25zXCJcbiAgICAgICAgY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWJ1dHRvbnMgbnh0LWR0LWNvbnRhaW5lci1yb3dcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm54dC1kdC1jb250cm9sIG54dC1kdC1jb250cm9sLWJ1dHRvbiBueHQtZHQtY29udGFpbmVyLWNvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNhbmNlbENsaWNrZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udHJvbC1jb250ZW50IG54dC1kdC1jb250cm9sLWJ1dHRvbi1jb250ZW50XCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAge3tjYW5jZWxMYWJlbH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wgbnh0LWR0LWNvbnRyb2wtYnV0dG9uIG54dC1kdC1jb250YWluZXItY29udHJvbC1idXR0b25cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2V0Q2xpY2tlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm54dC1kdC1jb250cm9sLWNvbnRlbnQgbnh0LWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgICAgICB7e3NldExhYmVsfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==