@skyux/datetime 11.30.1 → 12.0.0-alpha.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 (65) hide show
  1. package/documentation.json +925 -917
  2. package/fesm2022/skyux-datetime.mjs +105 -102
  3. package/fesm2022/skyux-datetime.mjs.map +1 -1
  4. package/package.json +15 -19
  5. package/esm2022/index.mjs +0 -23
  6. package/esm2022/lib/modules/date-pipe/date-pipe.module.mjs +0 -20
  7. package/esm2022/lib/modules/date-pipe/date.pipe.mjs +0 -68
  8. package/esm2022/lib/modules/date-pipe/date.service.mjs +0 -94
  9. package/esm2022/lib/modules/date-pipe/fuzzy-date.pipe.mjs +0 -47
  10. package/esm2022/lib/modules/date-range-picker/date-range-picker-end-date-resource-key.pipe.mjs +0 -21
  11. package/esm2022/lib/modules/date-range-picker/date-range-picker-start-date-resource-key.pipe.mjs +0 -21
  12. package/esm2022/lib/modules/date-range-picker/date-range-picker.component.mjs +0 -445
  13. package/esm2022/lib/modules/date-range-picker/date-range-picker.module.mjs +0 -17
  14. package/esm2022/lib/modules/date-range-picker/date-range.service.mjs +0 -95
  15. package/esm2022/lib/modules/date-range-picker/types/date-range-calculation.mjs +0 -2
  16. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +0 -2
  17. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +0 -2
  18. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +0 -118
  19. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +0 -23
  20. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +0 -2
  21. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator.mjs +0 -71
  22. package/esm2022/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +0 -2
  23. package/esm2022/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +0 -173
  24. package/esm2022/lib/modules/date-range-picker/types/date-range-relative-value.mjs +0 -249
  25. package/esm2022/lib/modules/date-range-picker/types/date-range.mjs +0 -2
  26. package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar-change.mjs +0 -2
  27. package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar-inner.component.mjs +0 -383
  28. package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar-label.pipe.mjs +0 -39
  29. package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar.component.mjs +0 -100
  30. package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar.service.mjs +0 -22
  31. package/esm2022/lib/modules/datepicker/calendar/daypicker-button.component.mjs +0 -23
  32. package/esm2022/lib/modules/datepicker/calendar/daypicker-cell.component.mjs +0 -129
  33. package/esm2022/lib/modules/datepicker/calendar/daypicker-context.mjs +0 -2
  34. package/esm2022/lib/modules/datepicker/calendar/daypicker.component.mjs +0 -221
  35. package/esm2022/lib/modules/datepicker/calendar/monthpicker.component.mjs +0 -80
  36. package/esm2022/lib/modules/datepicker/calendar/yearpicker.component.mjs +0 -87
  37. package/esm2022/lib/modules/datepicker/date-formatter.mjs +0 -38
  38. package/esm2022/lib/modules/datepicker/datepicker-config.service.mjs +0 -21
  39. package/esm2022/lib/modules/datepicker/datepicker-custom-date.mjs +0 -2
  40. package/esm2022/lib/modules/datepicker/datepicker-host.service.mjs +0 -61
  41. package/esm2022/lib/modules/datepicker/datepicker-input.directive.mjs +0 -526
  42. package/esm2022/lib/modules/datepicker/datepicker.component.mjs +0 -419
  43. package/esm2022/lib/modules/datepicker/datepicker.module.mjs +0 -62
  44. package/esm2022/lib/modules/datepicker/fuzzy/datepicker-input-fuzzy.directive.mjs +0 -516
  45. package/esm2022/lib/modules/datepicker/fuzzy/fuzzy-date.mjs +0 -2
  46. package/esm2022/lib/modules/datepicker/fuzzy/fuzzy-date.service.mjs +0 -411
  47. package/esm2022/lib/modules/shared/sky-datetime-resources.module.mjs +0 -130
  48. package/esm2022/lib/modules/timepicker/timepicker-time-format-type.mjs +0 -2
  49. package/esm2022/lib/modules/timepicker/timepicker-time-output.mjs +0 -2
  50. package/esm2022/lib/modules/timepicker/timepicker.component.mjs +0 -415
  51. package/esm2022/lib/modules/timepicker/timepicker.directive.mjs +0 -226
  52. package/esm2022/lib/modules/timepicker/timepicker.module.mjs +0 -37
  53. package/esm2022/skyux-datetime.mjs +0 -5
  54. package/esm2022/testing/legacy/datepicker-fixture.mjs +0 -56
  55. package/esm2022/testing/legacy/timepicker-fixture.mjs +0 -52
  56. package/esm2022/testing/modules/date-range-picker/date-range-picker-harness.filters.mjs +0 -2
  57. package/esm2022/testing/modules/date-range-picker/date-range-picker-harness.mjs +0 -193
  58. package/esm2022/testing/modules/datepicker/datepicker-calendar-harness.filters.mjs +0 -2
  59. package/esm2022/testing/modules/datepicker/datepicker-calendar-harness.mjs +0 -88
  60. package/esm2022/testing/modules/datepicker/datepicker-harness.filters.mjs +0 -2
  61. package/esm2022/testing/modules/datepicker/datepicker-harness.mjs +0 -60
  62. package/esm2022/testing/modules/datepicker/datepicker-input-harness.mjs +0 -29
  63. package/esm2022/testing/modules/datepicker/fuzzy-datepicker-input-harness.mjs +0 -29
  64. package/esm2022/testing/public-api.mjs +0 -6
  65. package/esm2022/testing/skyux-datetime-testing.mjs +0 -5
@@ -1,415 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, EnvironmentInjector, EventEmitter, Inject, Optional, Output, TemplateRef, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
2
- import { SKY_STACKING_CONTEXT, SkyAffixAutoFitContext, } from '@skyux/core';
3
- import moment from 'moment';
4
- import { Subject, fromEvent } from 'rxjs';
5
- import { takeUntil } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@skyux/core";
8
- import * as i2 from "@skyux/forms";
9
- import * as i3 from "@skyux/theme";
10
- import * as i4 from "@angular/common";
11
- import * as i5 from "@skyux/icon";
12
- import * as i6 from "@skyux/i18n";
13
- let nextId = 0;
14
- /**
15
- * Creates a SKY UX-themed replacement for the HTML `input` element with `type="time"`.
16
- * The value that users select is driven through the `ngModel` attribute
17
- * specified on the `input` element. You must wrap this component around an `input`
18
- * with the `skyTimepickerInput` directive.
19
- */
20
- export class SkyTimepickerComponent {
21
- set disabled(value) {
22
- this.#_disabled = value;
23
- this.#changeDetector.markForCheck();
24
- }
25
- get disabled() {
26
- return this.#_disabled;
27
- }
28
- set selectedHour(setHour) {
29
- let hourOffset = 0;
30
- if (this.selectedMeridies === 'AM' && setHour === 12) {
31
- hourOffset = -12;
32
- }
33
- if (this.selectedMeridies === 'PM' && setHour !== 12) {
34
- hourOffset = 12;
35
- }
36
- if (this.is8601) {
37
- hourOffset = 0;
38
- }
39
- const hour = moment({ hour: setHour }).add(hourOffset, 'hours').hour();
40
- this.activeTime = moment({
41
- hour: hour,
42
- minute: moment(this.activeTime).get('minute') + 0,
43
- }).toDate();
44
- this.selectedTimeChanged.emit(this.selectedTime);
45
- }
46
- get selectedHour() {
47
- if (!this.is8601) {
48
- /* istanbul ignore next */
49
- return parseInt(moment(this.activeTime).format('h'), 0) || 1;
50
- }
51
- else {
52
- return moment(this.activeTime).hour() + 0;
53
- }
54
- }
55
- set selectedMeridies(meridies) {
56
- meridies = meridies.trim();
57
- /* istanbul ignore else */
58
- if (meridies !== this.selectedMeridies) {
59
- switch (meridies) {
60
- case 'AM':
61
- this.activeTime = moment(this.activeTime)
62
- .subtract(12, 'hours')
63
- .toDate();
64
- break;
65
- case 'PM':
66
- this.activeTime = moment(this.activeTime).add(12, 'hours').toDate();
67
- break;
68
- }
69
- this.selectedTimeChanged.emit(this.selectedTime);
70
- }
71
- }
72
- get selectedMeridies() {
73
- if (this.activeTime) {
74
- return moment(this.activeTime).format('A');
75
- }
76
- return '';
77
- }
78
- set selectedMinute(minute) {
79
- this.activeTime = moment({
80
- hour: moment(this.activeTime).get('hour') + 0,
81
- minute: minute,
82
- }).toDate();
83
- this.selectedTimeChanged.emit(this.selectedTime);
84
- }
85
- get selectedMinute() {
86
- return moment(this.activeTime).minute() + 0;
87
- }
88
- set selectedTime(newTime) {
89
- if (typeof newTime !== 'undefined') {
90
- /* sanity check */
91
- /* istanbul ignore else */
92
- if (newTime.local !== 'Invalid date') {
93
- this.activeTime = newTime.iso8601;
94
- this.#changeDetector.markForCheck();
95
- }
96
- }
97
- }
98
- get selectedTime() {
99
- const time = {
100
- hour: moment(this.activeTime).hour(),
101
- minute: moment(this.activeTime).minute(),
102
- meridie: moment(this.activeTime).format('A'),
103
- timezone: parseInt(moment(this.activeTime).format('Z'), 10),
104
- iso8601: this.activeTime,
105
- local: moment(this.activeTime).format(this.localeFormat),
106
- customFormat: typeof this.returnFormat !== 'undefined'
107
- ? this.returnFormat
108
- : this.localeFormat,
109
- };
110
- return time;
111
- }
112
- set timepickerRef(value) {
113
- if (value) {
114
- this.#_timepickerRef = value;
115
- this.#addKeyupListener();
116
- // Wait for the timepicker component to render before gauging dimensions.
117
- setTimeout(() => {
118
- this.#destroyAffixer();
119
- this.#createAffixer();
120
- setTimeout(() => {
121
- if (this.timepickerRef) {
122
- this.#coreAdapter.getFocusableChildrenAndApplyFocus(this.timepickerRef, '.sky-timepicker-content', false);
123
- }
124
- this.isVisible = true;
125
- this.#changeDetector.markForCheck();
126
- });
127
- });
128
- }
129
- }
130
- get timepickerRef() {
131
- return this.#_timepickerRef;
132
- }
133
- #affixer;
134
- #timepickerUnsubscribe;
135
- #ngUnsubscribe;
136
- #overlay;
137
- #overlayKeyupListener;
138
- #_disabled;
139
- #_timepickerRef;
140
- #affixService;
141
- #changeDetector;
142
- #coreAdapter;
143
- #environmentInjector;
144
- #overlayService;
145
- #zIndex;
146
- constructor(affixService, changeDetector, coreAdapter, overlayService, inputBoxHostService, themeSvc, stackingContext) {
147
- this.inputBoxHostService = inputBoxHostService;
148
- /**
149
- * Fires when the value in the timepicker input changes.
150
- */
151
- this.selectedTimeChanged = new EventEmitter();
152
- this.activeTime = new Date();
153
- this.hours = [];
154
- this.is8601 = false;
155
- this.isOpen = false;
156
- this.isVisible = false;
157
- this.localeFormat = 'h:mm A';
158
- this.minutes = [];
159
- this.timeFormat = 'hh';
160
- this.#timepickerUnsubscribe = new Subject();
161
- this.#ngUnsubscribe = new Subject();
162
- this.#_disabled = false;
163
- this.#environmentInjector = inject(EnvironmentInjector);
164
- this.#affixService = affixService;
165
- this.#changeDetector = changeDetector;
166
- this.#coreAdapter = coreAdapter;
167
- this.#overlayService = overlayService;
168
- this.#zIndex = stackingContext?.zIndex;
169
- const uniqueId = nextId++;
170
- this.timepickerId = `sky-timepicker-${uniqueId}`;
171
- this.triggerButtonId = `sky-timepicker-button-${uniqueId}`;
172
- // Update icons when theme changes.
173
- themeSvc?.settingsChange
174
- .pipe(takeUntil(this.#ngUnsubscribe))
175
- .subscribe(() => {
176
- this.#changeDetector.markForCheck();
177
- });
178
- }
179
- ngOnInit() {
180
- this.setFormat(this.timeFormat);
181
- this.#addKeyupListener();
182
- if (this.inputBoxHostService && this.inputTemplateRef) {
183
- this.inputBoxHostService.populate({
184
- inputTemplate: this.inputTemplateRef,
185
- buttonsTemplate: this.triggerButtonTemplateRef,
186
- });
187
- }
188
- }
189
- ngOnDestroy() {
190
- this.#ngUnsubscribe.next();
191
- this.#ngUnsubscribe.complete();
192
- this.#removePickerEventListeners();
193
- this.#destroyAffixer();
194
- this.#destroyOverlay();
195
- }
196
- setFormat(format) {
197
- let h = 12;
198
- let m = 12;
199
- let minuteMultiplier = 5;
200
- let localeFormat = 'h:mm A';
201
- if (format === 'hh') {
202
- h = 12;
203
- m = 12;
204
- minuteMultiplier = 5;
205
- localeFormat = 'h:mm A';
206
- this.is8601 = false;
207
- }
208
- if (format === 'HH') {
209
- h = 24;
210
- m = 4;
211
- minuteMultiplier = 15;
212
- localeFormat = 'HH:mm';
213
- this.is8601 = true;
214
- }
215
- const data = {
216
- // Create a sparse array with a length equal to the hour.
217
- hours: Array(...Array(h)).map((_, i) => {
218
- if (format === 'hh') {
219
- return ++i;
220
- }
221
- /* istanbul ignore else */
222
- if (format === 'HH') {
223
- return i;
224
- }
225
- /* istanbul ignore next */
226
- /* sanity check */
227
- return 0;
228
- }),
229
- // Create a sparse array with a length equal to the minute.
230
- minutes: Array(...Array(m)).map(function (_, i) {
231
- return i * minuteMultiplier;
232
- }),
233
- localeFormat: localeFormat,
234
- minuteMultiplier: minuteMultiplier,
235
- };
236
- this.hours = data.hours;
237
- this.minutes = data.minutes;
238
- this.localeFormat = data.localeFormat;
239
- this.minuteMultiplier = data.minuteMultiplier;
240
- }
241
- onCloseButtonClick() {
242
- this.#closePicker();
243
- }
244
- setTime(event) {
245
- /* istanbul ignore else */
246
- if (typeof event !== 'undefined') {
247
- /* istanbul ignore else */
248
- if (event.type === 'click') {
249
- event.stopPropagation();
250
- if (event.target.name === 'hour') {
251
- this.selectedHour = parseInt(event.target.innerHTML, 0);
252
- }
253
- if (event.target.name === 'minute') {
254
- this.selectedMinute = parseInt(event.target.innerHTML, 0);
255
- }
256
- if (event.target.name === 'meridie') {
257
- this.selectedMeridies = event.target.innerHTML;
258
- }
259
- }
260
- }
261
- }
262
- onTriggerButtonClick() {
263
- this.#openPicker();
264
- }
265
- highlightMinute(selectedMinute, minute) {
266
- return Math.floor(selectedMinute / 5) === minute / 5;
267
- }
268
- #closePicker() {
269
- this.#destroyAffixer();
270
- this.#destroyOverlay();
271
- this.#removePickerEventListeners();
272
- this.triggerButtonRef?.nativeElement.focus();
273
- this.isOpen = false;
274
- }
275
- #openPicker() {
276
- this.isVisible = false;
277
- this.#changeDetector.markForCheck();
278
- this.#removePickerEventListeners();
279
- this.#destroyOverlay();
280
- this.#createOverlay();
281
- this.isOpen = true;
282
- this.#changeDetector.markForCheck();
283
- }
284
- #createAffixer() {
285
- if (this.timepickerRef && this.triggerButtonRef) {
286
- const affixer = this.#affixService.createAffixer(this.timepickerRef);
287
- // Hide timepicker when trigger button is scrolled off screen.
288
- affixer.placementChange
289
- .pipe(takeUntil(this.#timepickerUnsubscribe))
290
- .subscribe((change) => {
291
- this.isVisible = change.placement !== null;
292
- this.#changeDetector.markForCheck();
293
- });
294
- affixer.affixTo(this.triggerButtonRef.nativeElement, {
295
- autoFitContext: SkyAffixAutoFitContext.Viewport,
296
- enableAutoFit: true,
297
- horizontalAlignment: 'right',
298
- isSticky: true,
299
- placement: 'below',
300
- });
301
- this.#affixer = affixer;
302
- }
303
- }
304
- #destroyAffixer() {
305
- /*istanbul ignore else*/
306
- if (this.#affixer) {
307
- this.#affixer.destroy();
308
- this.#affixer = undefined;
309
- }
310
- }
311
- #createOverlay() {
312
- if (this.timepickerTemplateRef) {
313
- const overlay = this.#overlayService.create({
314
- enableClose: false,
315
- enablePointerEvents: false,
316
- environmentInjector: this.#environmentInjector,
317
- });
318
- if (this.#zIndex) {
319
- this.#zIndex
320
- .pipe(takeUntil(this.#timepickerUnsubscribe))
321
- .subscribe((zIndex) => {
322
- overlay.componentRef.instance.zIndex = zIndex.toString(10);
323
- });
324
- }
325
- overlay.backdropClick
326
- .pipe(takeUntil(this.#timepickerUnsubscribe))
327
- .subscribe(() => {
328
- /* istanbul ignore else */
329
- if (this.isOpen) {
330
- this.#closePicker();
331
- }
332
- });
333
- overlay.attachTemplate(this.timepickerTemplateRef);
334
- this.#overlay = overlay;
335
- }
336
- }
337
- #destroyOverlay() {
338
- /*istanbul ignore else*/
339
- if (this.#overlay) {
340
- this.#overlayService.close(this.#overlay);
341
- this.#overlay = undefined;
342
- }
343
- }
344
- #addKeyupListener() {
345
- const timepickerMenuElement = this.timepickerRef?.nativeElement;
346
- if (timepickerMenuElement) {
347
- this.#overlayKeyupListener = fromEvent(timepickerMenuElement, 'keyup')
348
- .pipe(takeUntil(this.#ngUnsubscribe))
349
- .subscribe((event) => {
350
- const key = event.key?.toLowerCase();
351
- /* istanbul ignore else */
352
- if (key === 'escape' && this.isOpen) {
353
- this.#closePicker();
354
- event.stopPropagation();
355
- event.preventDefault();
356
- }
357
- });
358
- }
359
- }
360
- #removePickerEventListeners() {
361
- /* istanbul ignore else */
362
- if (this.#timepickerUnsubscribe) {
363
- this.#timepickerUnsubscribe.next();
364
- this.#timepickerUnsubscribe.complete();
365
- this.#timepickerUnsubscribe = new Subject();
366
- }
367
- /* istanbul ignore next */
368
- this.#overlayKeyupListener?.unsubscribe();
369
- }
370
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyTimepickerComponent, deps: [{ token: i1.SkyAffixService }, { token: i0.ChangeDetectorRef }, { token: i1.SkyCoreAdapterService }, { token: i1.SkyOverlayService }, { token: i2.SkyInputBoxHostService, optional: true }, { token: i3.SkyThemeService, optional: true }, { token: SKY_STACKING_CONTEXT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
371
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SkyTimepickerComponent, selector: "sky-timepicker", outputs: { selectedTimeChanged: "selectedTimeChanged" }, viewQueries: [{ propertyName: "timepickerRef", first: true, predicate: ["timepickerRef"], descendants: true, read: ElementRef }, { propertyName: "timepickerTemplateRef", first: true, predicate: ["timepickerTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "triggerButtonRef", first: true, predicate: ["triggerButtonRef"], descendants: true, read: ElementRef }, { propertyName: "inputTemplateRef", first: true, predicate: ["inputTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "triggerButtonTemplateRef", first: true, predicate: ["triggerButtonTemplateRef"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<div class=\"sky-timepicker\">\n @if (!inputBoxHostService) {\n <div class=\"sky-input-group\">\n <ng-container *ngTemplateOutlet=\"inputTemplateRef\" />\n <ng-container *ngTemplateOutlet=\"triggerButtonTemplateRef\" />\n </div>\n }\n</div>\n\n<ng-template #inputTemplateRef>\n <ng-content />\n</ng-template>\n\n<ng-template #triggerButtonTemplateRef>\n <div class=\"sky-input-group-btn\">\n <button\n #triggerButtonRef\n aria-haspopup=\"dialog\"\n class=\"sky-btn sky-btn-default sky-input-group-timepicker-btn\"\n type=\"button\"\n [attr.aria-controls]=\"isOpen ? timepickerId : null\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-label]=\"\n inputBoxHostService?.labelText\n ? ('skyux_timepicker_button_label_context'\n | skyLibResources: inputBoxHostService?.labelText)\n : ('skyux_timepicker_button_label' | skyLibResources)\n \"\n [attr.id]=\"triggerButtonId\"\n [attr.title]=\"\n inputBoxHostService?.labelText\n ? ('skyux_timepicker_button_label_context'\n | skyLibResources: inputBoxHostService?.labelText)\n : ('skyux_timepicker_button_label' | skyLibResources)\n \"\n [disabled]=\"disabled\"\n (click)=\"onTriggerButtonClick()\"\n >\n <sky-icon icon=\"clock\" size=\"lg\" />\n </button>\n </div>\n</ng-template>\n\n<ng-template #timepickerTemplateRef>\n <div\n #timepickerRef\n class=\"sky-timepicker-container sky-shadow sky-box sky-elevation-4\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"triggerButtonId\"\n [attr.id]=\"timepickerId\"\n [class.sky-timepicker-hidden]=\"!isVisible\"\n >\n <div class=\"sky-timepicker-content\">\n <section\n class=\"sky-timepicker-column\"\n [ngClass]=\"{ 'sky-timepicker-24hour': is8601 }\"\n >\n <ol>\n @for (hour of hours; track hour) {\n <li>\n <button\n name=\"hour\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedHour === hour }\"\n (click)=\"setTime($event)\"\n >\n {{ hour }}\n </button>\n </li>\n }\n </ol>\n </section>\n <section class=\"sky-timepicker-column\">\n <ol>\n @for (minute of minutes; track minute) {\n <li>\n <button\n name=\"minute\"\n type=\"button\"\n [ngClass]=\"{\n 'sky-btn-active': highlightMinute(selectedMinute, minute)\n }\"\n (click)=\"setTime($event)\"\n >\n {{ '00'.substring(0, 2 - minute.toString().length) + minute }}\n </button>\n </li>\n }\n </ol>\n </section>\n @if (!is8601) {\n <section class=\"sky-timepicker-column\">\n <ol>\n <li>\n <button\n name=\"meridie\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedMeridies === 'AM' }\"\n (click)=\"setTime($event)\"\n >\n AM\n </button>\n </li>\n <li>\n <button\n name=\"meridie\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedMeridies === 'PM' }\"\n (click)=\"setTime($event)\"\n >\n PM\n </button>\n </li>\n </ol>\n </section>\n }\n </div>\n <div class=\"sky-timepicker-footer\">\n <section class=\"sky-timepicker-column\">\n <button\n class=\"sky-btn sky-btn-primary\"\n type=\"button\"\n (click)=\"onCloseButtonClick()\"\n >\n {{ 'skyux_timepicker_close' | skyLibResources }}\n </button>\n </section>\n </div>\n </div>\n</ng-template>\n", styles: [".sky-timepicker-container:not(.sky-theme-modern *){--sky-override-timepicker-background-color: #eeeeef;--sky-override-timepicker-border-radius: 5px;--sky-override-timepicker-button-active-background-color: #e2e3e4;--sky-override-timepicker-button-background-color: #ffffff;--sky-override-timepicker-button-border-radius: 3px;--sky-override-timepicker-button-focus-outline-offset: -2px;--sky-override-timepicker-button-focus-outline: -webkit-focus-ring-color auto 5px;--sky-override-timepicker-button-hover-active-focus-border-radius: 0;--sky-override-timepicker-button-hover-active-focus-box-shadow: none;--sky-override-timepicker-button-hover-background-color: #eeeeef;--sky-override-timepicker-button-padding-horizontal: 15px;--sky-override-timepicker-button-padding-vertical: 5px;--sky-override-timepicker-button-selected-background-color: #c1e8fb;--sky-override-timepicker-button-selected-box-shadow: inset 0 0 0 2px #00b4f1;--sky-override-timepicker-column-border: 1px solid #e2e3e4;--sky-override-timepicker-column-gap: 10px;--sky-override-timepicker-column-meride-divider: 1px solid #e2e3e4;--sky-override-timepicker-content-space: 10px 10px 0 10px;--sky-override-timepicker-font-size: 15px;--sky-override-timepicker-footer-padding-horizontal: 10px;--sky-override-timepicker-footer-padding-vertical: 10px;--sky-override-timepicker-text-color: #000}.sky-theme-modern:not(.sky-theme-brand-blackbaud) .sky-timepicker-container{--sky-override-timepicker-border: solid 1px #cdcfd2;--sky-override-timepicker-button-background-color: var(--modern-color-white);--sky-override-timepicker-button-padding-vertical: var(--modern-size-5);--sky-override-timepicker-button-selected-hover-border-color: var( --modern-color-blue-50 );--sky-override-timepicker-column-border: 1px solid #e2e3e4;--sky-override-timepicker-content-space: var(--modern-space-s) var(--modern-space-s) 0 var(--modern-space-s);--sky-override-timepicker-font-size: 16px;--sky-override-timepicker-footer-padding-horizontal: var(--modern-size-10);--sky-override-timepicker-text-color: var(--modern-color-black)}.sky-timepicker-container{position:fixed;font-size:var(--sky-override-timepicker-font-size);background-color:var(--sky-override-timepicker-background-color, var(--sky-color-background-container-menu));border-radius:var(--sky-override-timepicker-border-radius, var(--sky-border-radius-s));border:var(--sky-override-timepicker-border, none)}.sky-timepicker-container :last-child ol{display:flex;flex-direction:column;height:100%}.sky-timepicker-container :last-child ol li{border-bottom:var(--sky-override-timepicker-column-meride-divider);flex:1}.sky-timepicker-column ol{border:var(--sky-override-timepicker-column-border, var(--sky-border-width-separator-light) solid var(--sky-color-border-separator-light));column-gap:1px;columns:2;list-style-type:none;margin:0;padding:0}.sky-timepicker-column ol li{text-align:center;cursor:pointer;margin:0}.sky-timepicker-column ol li button{background-color:var(--sky-override-timepicker-button-background-color, var(--sky-color-background-action-tertiary-base));border-width:0;border-color:var(--sky-color-border-action-tertiary-base);color:var(--sky-override-timepicker-text-color, var(--sky-color-text-default));cursor:pointer;padding:var(--sky-override-timepicker-button-padding-vertical, var(--sky-space-inset-pillarbox-2_3-top-m)) var(--sky-override-timepicker-button-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-right-m)) var(--sky-override-timepicker-button-padding-vertical, var(--sky-space-inset-pillarbox-2_3-bottom-m)) var(--sky-override-timepicker-button-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-left-m));width:100%;height:100%}.sky-timepicker-column ol li button:focus-visible:not(:active){outline:var(--sky-override-timepicker-button-focus-outline);outline-offset:var(--sky-override-timepicker-button-focus-outline-offset);border-radius:var(--sky-override-timepicker-button-hover-active-focus-border-radius, var(--sky-border-radius-s));box-shadow:var(--sky-override-timepicker-button-hover-active-focus-box-shadow, inset 0 0 0 var(--sky-border-width-action-focus) var(--sky-color-border-action-tertiary-focus), var(--sky-elevation-focus))}.sky-timepicker-column ol li button:hover:not(.sky-btn-active){border-radius:var(--sky-override-timepicker-button-hover-active-focus-border-radius, var(--sky-border-radius-s));background-color:var(--sky-override-timepicker-button-hover-background-color, var(--sky-color-background-action-tertiary-hover));box-shadow:var(--sky-override-timepicker-button-hover-active-focus-box-shadow, inset 0 0 0 var(--sky-border-width-action-hover) var(--sky-override-timepicker-button-selected-hover-border-color, var(--sky-color-border-action-tertiary-hover)))}.sky-timepicker-column ol li button:active{background-color:var(--sky-override-timepicker-button-active-background-color, var(--sky-color-background-action-tertiary-active));border-radius:var(--sky-override-timepicker-button-hover-active-focus-border-radius, var(--sky-border-radius-s));box-shadow:var(--sky-override-timepicker-button-hover-active-focus-box-shadow, inset 0 0 0 var(--sky-border-width-action-active) var(--sky-color-border-action-tertiary-active))}.sky-timepicker-column ol li button.sky-btn-active{background-color:var(--sky-override-timepicker-button-selected-background-color, var(--sky-color-background-selected-soft));box-shadow:var(--sky-override-timepicker-button-selected-box-shadow, inset 0 0 0 var(--sky-border-width-selected-s) var(--sky-override-timepicker-button-selected-hover-border-color, var(--sky-color-border-selected)));border-radius:var(--sky-override-timepicker-button-border-radius, var(--sky-border-radius-s))}.sky-timepicker-column.sky-timepicker-24hour ol{columns:4}.sky-timepicker-column.sky-timepicker-24hour ol li{border-bottom-width:0}.sky-timepicker-content{display:flex;padding:var(--sky-override-timepicker-content-space, var(--sky-space-inset-balanced-m));gap:var(--sky-override-timepicker-column-gap, var(--sky-space-gap-action_group-m))}.sky-timepicker-footer{margin:0;padding:var(--sky-override-timepicker-footer-padding-vertical, var(--sky-space-inset-pillarbox-2_3-top-m)) var(--sky-override-timepicker-footer-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-right-m)) var(--sky-override-timepicker-footer-padding-vertical, var(--sky-space-inset-pillarbox-2_3-bottom-m)) var(--sky-override-timepicker-footer-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-left-m))}.sky-timepicker-footer .sky-timepicker-column{width:100%}.sky-timepicker-hidden{visibility:hidden}.sky-timepicker-clock-icon-modern,.sky-theme-modern .sky-timepicker-clock-icon-default{display:none}.sky-theme-modern .sky-timepicker-clock-icon-modern{display:inline}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.λ1, selector: "sky-icon", inputs: ["icon", "iconName", "iconType", "size", "fixedWidth", "variant"] }, { kind: "pipe", type: i6.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
372
- }
373
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyTimepickerComponent, decorators: [{
374
- type: Component,
375
- args: [{ selector: 'sky-timepicker', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-timepicker\">\n @if (!inputBoxHostService) {\n <div class=\"sky-input-group\">\n <ng-container *ngTemplateOutlet=\"inputTemplateRef\" />\n <ng-container *ngTemplateOutlet=\"triggerButtonTemplateRef\" />\n </div>\n }\n</div>\n\n<ng-template #inputTemplateRef>\n <ng-content />\n</ng-template>\n\n<ng-template #triggerButtonTemplateRef>\n <div class=\"sky-input-group-btn\">\n <button\n #triggerButtonRef\n aria-haspopup=\"dialog\"\n class=\"sky-btn sky-btn-default sky-input-group-timepicker-btn\"\n type=\"button\"\n [attr.aria-controls]=\"isOpen ? timepickerId : null\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-label]=\"\n inputBoxHostService?.labelText\n ? ('skyux_timepicker_button_label_context'\n | skyLibResources: inputBoxHostService?.labelText)\n : ('skyux_timepicker_button_label' | skyLibResources)\n \"\n [attr.id]=\"triggerButtonId\"\n [attr.title]=\"\n inputBoxHostService?.labelText\n ? ('skyux_timepicker_button_label_context'\n | skyLibResources: inputBoxHostService?.labelText)\n : ('skyux_timepicker_button_label' | skyLibResources)\n \"\n [disabled]=\"disabled\"\n (click)=\"onTriggerButtonClick()\"\n >\n <sky-icon icon=\"clock\" size=\"lg\" />\n </button>\n </div>\n</ng-template>\n\n<ng-template #timepickerTemplateRef>\n <div\n #timepickerRef\n class=\"sky-timepicker-container sky-shadow sky-box sky-elevation-4\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"triggerButtonId\"\n [attr.id]=\"timepickerId\"\n [class.sky-timepicker-hidden]=\"!isVisible\"\n >\n <div class=\"sky-timepicker-content\">\n <section\n class=\"sky-timepicker-column\"\n [ngClass]=\"{ 'sky-timepicker-24hour': is8601 }\"\n >\n <ol>\n @for (hour of hours; track hour) {\n <li>\n <button\n name=\"hour\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedHour === hour }\"\n (click)=\"setTime($event)\"\n >\n {{ hour }}\n </button>\n </li>\n }\n </ol>\n </section>\n <section class=\"sky-timepicker-column\">\n <ol>\n @for (minute of minutes; track minute) {\n <li>\n <button\n name=\"minute\"\n type=\"button\"\n [ngClass]=\"{\n 'sky-btn-active': highlightMinute(selectedMinute, minute)\n }\"\n (click)=\"setTime($event)\"\n >\n {{ '00'.substring(0, 2 - minute.toString().length) + minute }}\n </button>\n </li>\n }\n </ol>\n </section>\n @if (!is8601) {\n <section class=\"sky-timepicker-column\">\n <ol>\n <li>\n <button\n name=\"meridie\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedMeridies === 'AM' }\"\n (click)=\"setTime($event)\"\n >\n AM\n </button>\n </li>\n <li>\n <button\n name=\"meridie\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedMeridies === 'PM' }\"\n (click)=\"setTime($event)\"\n >\n PM\n </button>\n </li>\n </ol>\n </section>\n }\n </div>\n <div class=\"sky-timepicker-footer\">\n <section class=\"sky-timepicker-column\">\n <button\n class=\"sky-btn sky-btn-primary\"\n type=\"button\"\n (click)=\"onCloseButtonClick()\"\n >\n {{ 'skyux_timepicker_close' | skyLibResources }}\n </button>\n </section>\n </div>\n </div>\n</ng-template>\n", styles: [".sky-timepicker-container:not(.sky-theme-modern *){--sky-override-timepicker-background-color: #eeeeef;--sky-override-timepicker-border-radius: 5px;--sky-override-timepicker-button-active-background-color: #e2e3e4;--sky-override-timepicker-button-background-color: #ffffff;--sky-override-timepicker-button-border-radius: 3px;--sky-override-timepicker-button-focus-outline-offset: -2px;--sky-override-timepicker-button-focus-outline: -webkit-focus-ring-color auto 5px;--sky-override-timepicker-button-hover-active-focus-border-radius: 0;--sky-override-timepicker-button-hover-active-focus-box-shadow: none;--sky-override-timepicker-button-hover-background-color: #eeeeef;--sky-override-timepicker-button-padding-horizontal: 15px;--sky-override-timepicker-button-padding-vertical: 5px;--sky-override-timepicker-button-selected-background-color: #c1e8fb;--sky-override-timepicker-button-selected-box-shadow: inset 0 0 0 2px #00b4f1;--sky-override-timepicker-column-border: 1px solid #e2e3e4;--sky-override-timepicker-column-gap: 10px;--sky-override-timepicker-column-meride-divider: 1px solid #e2e3e4;--sky-override-timepicker-content-space: 10px 10px 0 10px;--sky-override-timepicker-font-size: 15px;--sky-override-timepicker-footer-padding-horizontal: 10px;--sky-override-timepicker-footer-padding-vertical: 10px;--sky-override-timepicker-text-color: #000}.sky-theme-modern:not(.sky-theme-brand-blackbaud) .sky-timepicker-container{--sky-override-timepicker-border: solid 1px #cdcfd2;--sky-override-timepicker-button-background-color: var(--modern-color-white);--sky-override-timepicker-button-padding-vertical: var(--modern-size-5);--sky-override-timepicker-button-selected-hover-border-color: var( --modern-color-blue-50 );--sky-override-timepicker-column-border: 1px solid #e2e3e4;--sky-override-timepicker-content-space: var(--modern-space-s) var(--modern-space-s) 0 var(--modern-space-s);--sky-override-timepicker-font-size: 16px;--sky-override-timepicker-footer-padding-horizontal: var(--modern-size-10);--sky-override-timepicker-text-color: var(--modern-color-black)}.sky-timepicker-container{position:fixed;font-size:var(--sky-override-timepicker-font-size);background-color:var(--sky-override-timepicker-background-color, var(--sky-color-background-container-menu));border-radius:var(--sky-override-timepicker-border-radius, var(--sky-border-radius-s));border:var(--sky-override-timepicker-border, none)}.sky-timepicker-container :last-child ol{display:flex;flex-direction:column;height:100%}.sky-timepicker-container :last-child ol li{border-bottom:var(--sky-override-timepicker-column-meride-divider);flex:1}.sky-timepicker-column ol{border:var(--sky-override-timepicker-column-border, var(--sky-border-width-separator-light) solid var(--sky-color-border-separator-light));column-gap:1px;columns:2;list-style-type:none;margin:0;padding:0}.sky-timepicker-column ol li{text-align:center;cursor:pointer;margin:0}.sky-timepicker-column ol li button{background-color:var(--sky-override-timepicker-button-background-color, var(--sky-color-background-action-tertiary-base));border-width:0;border-color:var(--sky-color-border-action-tertiary-base);color:var(--sky-override-timepicker-text-color, var(--sky-color-text-default));cursor:pointer;padding:var(--sky-override-timepicker-button-padding-vertical, var(--sky-space-inset-pillarbox-2_3-top-m)) var(--sky-override-timepicker-button-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-right-m)) var(--sky-override-timepicker-button-padding-vertical, var(--sky-space-inset-pillarbox-2_3-bottom-m)) var(--sky-override-timepicker-button-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-left-m));width:100%;height:100%}.sky-timepicker-column ol li button:focus-visible:not(:active){outline:var(--sky-override-timepicker-button-focus-outline);outline-offset:var(--sky-override-timepicker-button-focus-outline-offset);border-radius:var(--sky-override-timepicker-button-hover-active-focus-border-radius, var(--sky-border-radius-s));box-shadow:var(--sky-override-timepicker-button-hover-active-focus-box-shadow, inset 0 0 0 var(--sky-border-width-action-focus) var(--sky-color-border-action-tertiary-focus), var(--sky-elevation-focus))}.sky-timepicker-column ol li button:hover:not(.sky-btn-active){border-radius:var(--sky-override-timepicker-button-hover-active-focus-border-radius, var(--sky-border-radius-s));background-color:var(--sky-override-timepicker-button-hover-background-color, var(--sky-color-background-action-tertiary-hover));box-shadow:var(--sky-override-timepicker-button-hover-active-focus-box-shadow, inset 0 0 0 var(--sky-border-width-action-hover) var(--sky-override-timepicker-button-selected-hover-border-color, var(--sky-color-border-action-tertiary-hover)))}.sky-timepicker-column ol li button:active{background-color:var(--sky-override-timepicker-button-active-background-color, var(--sky-color-background-action-tertiary-active));border-radius:var(--sky-override-timepicker-button-hover-active-focus-border-radius, var(--sky-border-radius-s));box-shadow:var(--sky-override-timepicker-button-hover-active-focus-box-shadow, inset 0 0 0 var(--sky-border-width-action-active) var(--sky-color-border-action-tertiary-active))}.sky-timepicker-column ol li button.sky-btn-active{background-color:var(--sky-override-timepicker-button-selected-background-color, var(--sky-color-background-selected-soft));box-shadow:var(--sky-override-timepicker-button-selected-box-shadow, inset 0 0 0 var(--sky-border-width-selected-s) var(--sky-override-timepicker-button-selected-hover-border-color, var(--sky-color-border-selected)));border-radius:var(--sky-override-timepicker-button-border-radius, var(--sky-border-radius-s))}.sky-timepicker-column.sky-timepicker-24hour ol{columns:4}.sky-timepicker-column.sky-timepicker-24hour ol li{border-bottom-width:0}.sky-timepicker-content{display:flex;padding:var(--sky-override-timepicker-content-space, var(--sky-space-inset-balanced-m));gap:var(--sky-override-timepicker-column-gap, var(--sky-space-gap-action_group-m))}.sky-timepicker-footer{margin:0;padding:var(--sky-override-timepicker-footer-padding-vertical, var(--sky-space-inset-pillarbox-2_3-top-m)) var(--sky-override-timepicker-footer-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-right-m)) var(--sky-override-timepicker-footer-padding-vertical, var(--sky-space-inset-pillarbox-2_3-bottom-m)) var(--sky-override-timepicker-footer-padding-horizontal, var(--sky-space-inset-pillarbox-2_3-left-m))}.sky-timepicker-footer .sky-timepicker-column{width:100%}.sky-timepicker-hidden{visibility:hidden}.sky-timepicker-clock-icon-modern,.sky-theme-modern .sky-timepicker-clock-icon-default{display:none}.sky-theme-modern .sky-timepicker-clock-icon-modern{display:inline}\n"] }]
376
- }], ctorParameters: () => [{ type: i1.SkyAffixService }, { type: i0.ChangeDetectorRef }, { type: i1.SkyCoreAdapterService }, { type: i1.SkyOverlayService }, { type: i2.SkyInputBoxHostService, decorators: [{
377
- type: Optional
378
- }] }, { type: i3.SkyThemeService, decorators: [{
379
- type: Optional
380
- }] }, { type: undefined, decorators: [{
381
- type: Optional
382
- }, {
383
- type: Inject,
384
- args: [SKY_STACKING_CONTEXT]
385
- }] }], propDecorators: { selectedTimeChanged: [{
386
- type: Output
387
- }], timepickerRef: [{
388
- type: ViewChild,
389
- args: ['timepickerRef', {
390
- read: ElementRef,
391
- }]
392
- }], timepickerTemplateRef: [{
393
- type: ViewChild,
394
- args: ['timepickerTemplateRef', {
395
- read: TemplateRef,
396
- }]
397
- }], triggerButtonRef: [{
398
- type: ViewChild,
399
- args: ['triggerButtonRef', {
400
- read: ElementRef,
401
- }]
402
- }], inputTemplateRef: [{
403
- type: ViewChild,
404
- args: ['inputTemplateRef', {
405
- read: TemplateRef,
406
- static: true,
407
- }]
408
- }], triggerButtonTemplateRef: [{
409
- type: ViewChild,
410
- args: ['triggerButtonTemplateRef', {
411
- read: TemplateRef,
412
- static: true,
413
- }]
414
- }] } });
415
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL3RpbWVwaWNrZXIvdGltZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL3RpbWVwaWNrZXIvdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixNQUFNLEVBR04sUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FPdkIsTUFBTSxhQUFhLENBQUM7QUFJckIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBYyxPQUFPLEVBQWdCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBSzNDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVmOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLHNCQUFzQjtJQVFqQyxJQUFXLFFBQVEsQ0FBQyxLQUFjO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcs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QVc7cUJBQ2xCO2dCQU1NLGdCQUFnQjtzQkFIdEIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRTt3QkFDN0IsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCO2dCQU9NLGdCQUFnQjtzQkFKdEIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRTt3QkFDN0IsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLE1BQU0sRUFBRSxJQUFJO3FCQUNiO2dCQU9NLHdCQUF3QjtzQkFKOUIsU0FBUzt1QkFBQywwQkFBMEIsRUFBRTt3QkFDckMsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLE1BQU0sRUFBRSxJQUFJO3FCQUNiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTS1lfU1RBQ0tJTkdfQ09OVEVYVCxcbiAgU2t5QWZmaXhBdXRvRml0Q29udGV4dCxcbiAgU2t5QWZmaXhTZXJ2aWNlLFxuICBTa3lBZmZpeGVyLFxuICBTa3lDb3JlQWRhcHRlclNlcnZpY2UsXG4gIFNreU92ZXJsYXlJbnN0YW5jZSxcbiAgU2t5T3ZlcmxheVNlcnZpY2UsXG4gIFNreVN0YWNraW5nQ29udGV4dCxcbn0gZnJvbSAnQHNreXV4L2NvcmUnO1xuaW1wb3J0IHsgU2t5SW5wdXRCb3hIb3N0U2VydmljZSB9IGZyb20gJ0Bza3l1eC9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lUaGVtZVNlcnZpY2UgfSBmcm9tICdAc2t5dXgvdGhlbWUnO1xuXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lUaW1lcGlja2VyVGltZUZvcm1hdFR5cGUgfSBmcm9tICcuL3RpbWVwaWNrZXItdGltZS1mb3JtYXQtdHlwZSc7XG5pbXBvcnQgeyBTa3lUaW1lcGlja2VyVGltZU91dHB1dCB9IGZyb20gJy4vdGltZXBpY2tlci10aW1lLW91dHB1dCc7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBTS1kgVVgtdGhlbWVkIHJlcGxhY2VtZW50IGZvciB0aGUgSFRNTCBgaW5wdXRgIGVsZW1lbnQgd2l0aCBgdHlwZT1cInRpbWVcImAuXG4gKiBUaGUgdmFsdWUgdGhhdCB1c2VycyBzZWxlY3QgaXMgZHJpdmVuIHRocm91Z2ggdGhlIGBuZ01vZGVsYCBhdHRyaWJ1dGVcbiAqIHNwZWNpZmllZCBvbiB0aGUgYGlucHV0YCBlbGVtZW50LiBZb3UgbXVzdCB3cmFwIHRoaXMgY29tcG9uZW50IGFyb3VuZCBhbiBgaW5wdXRgXG4gKiB3aXRoIHRoZSBgc2t5VGltZXBpY2tlcklucHV0YCBkaXJlY3RpdmUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS10aW1lcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90aW1lcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lUaW1lcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdmFsdWUgaW4gdGhlIHRpbWVwaWNrZXIgaW5wdXQgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2VsZWN0ZWRUaW1lQ2hhbmdlZDogRXZlbnRFbWl0dGVyPFNreVRpbWVwaWNrZXJUaW1lT3V0cHV0PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxTa3lUaW1lcGlja2VyVGltZU91dHB1dD4oKTtcblxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jX2Rpc2FibGVkID0gdmFsdWU7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNfZGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNlbGVjdGVkSG91cihzZXRIb3VyOiBudW1iZXIpIHtcbiAgICBsZXQgaG91ck9mZnNldCA9IDA7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRNZXJpZGllcyA9PT0gJ0FNJyAmJiBzZXRIb3VyID09PSAxMikge1xuICAgICAgaG91ck9mZnNldCA9IC0xMjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRNZXJpZGllcyA9PT0gJ1BNJyAmJiBzZXRIb3VyICE9PSAxMikge1xuICAgICAgaG91ck9mZnNldCA9IDEyO1xuICAgIH1cbiAgICBpZiAodGhpcy5pczg2MDEpIHtcbiAgICAgIGhvdXJPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBjb25zdCBob3VyID0gbW9tZW50KHsgaG91cjogc2V0SG91ciB9KS5hZGQoaG91ck9mZnNldCwgJ2hvdXJzJykuaG91cigpO1xuXG4gICAgdGhpcy5hY3RpdmVUaW1lID0gbW9tZW50KHtcbiAgICAgIGhvdXI6IGhvdXIsXG4gICAgICBtaW51dGU6IG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLmdldCgnbWludXRlJykgKyAwLFxuICAgIH0pLnRvRGF0ZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRUaW1lQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRUaW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRIb3VyKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmlzODYwMSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBwYXJzZUludChtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5mb3JtYXQoJ2gnKSwgMCkgfHwgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLmhvdXIoKSArIDA7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldCBzZWxlY3RlZE1lcmlkaWVzKG1lcmlkaWVzOiBzdHJpbmcpIHtcbiAgICBtZXJpZGllcyA9IG1lcmlkaWVzLnRyaW0oKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChtZXJpZGllcyAhPT0gdGhpcy5zZWxlY3RlZE1lcmlkaWVzKSB7XG4gICAgICBzd2l0Y2ggKG1lcmlkaWVzKSB7XG4gICAgICAgIGNhc2UgJ0FNJzpcbiAgICAgICAgICB0aGlzLmFjdGl2ZVRpbWUgPSBtb21lbnQodGhpcy5hY3RpdmVUaW1lKVxuICAgICAgICAgICAgLnN1YnRyYWN0KDEyLCAnaG91cnMnKVxuICAgICAgICAgICAgLnRvRGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ1BNJzpcbiAgICAgICAgICB0aGlzLmFjdGl2ZVRpbWUgPSBtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5hZGQoMTIsICdob3VycycpLnRvRGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZFRpbWVDaGFuZ2VkLmVtaXQodGhpcy5zZWxlY3RlZFRpbWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRNZXJpZGllcygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmFjdGl2ZVRpbWUpIHtcbiAgICAgIHJldHVybiBtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5mb3JtYXQoJ0EnKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIHNldCBzZWxlY3RlZE1pbnV0ZShtaW51dGU6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlVGltZSA9IG1vbWVudCh7XG4gICAgICBob3VyOiBtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5nZXQoJ2hvdXInKSArIDAsXG4gICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICB9KS50b0RhdGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkVGltZUNoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkVGltZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkTWludXRlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLm1pbnV0ZSgpICsgMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRUaW1lKG5ld1RpbWU6IFNreVRpbWVwaWNrZXJUaW1lT3V0cHV0IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdUaW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG5ld1RpbWUubG9jYWwgIT09ICdJbnZhbGlkIGRhdGUnKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGltZSA9IG5ld1RpbWUuaXNvODYwMTtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZFRpbWUoKTogU2t5VGltZXBpY2tlclRpbWVPdXRwdXQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRpbWU6IFNreVRpbWVwaWNrZXJUaW1lT3V0cHV0ID0ge1xuICAgICAgaG91cjogbW9tZW50KHRoaXMuYWN0aXZlVGltZSkuaG91cigpLFxuICAgICAgbWludXRlOiBtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5taW51dGUoKSxcbiAgICAgIG1lcmlkaWU6IG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLmZvcm1hdCgnQScpLFxuICAgICAgdGltZXpvbmU6IHBhcnNlSW50KG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLmZvcm1hdCgnWicpLCAxMCksXG4gICAgICBpc284NjAxOiB0aGlzLmFjdGl2ZVRpbWUsXG4gICAgICBsb2NhbDogbW9tZW50KHRoaXMuYWN0aXZlVGltZSkuZm9ybWF0KHRoaXMubG9jYWxlRm9ybWF0KSxcbiAgICAgIGN1c3RvbUZvcm1hdDpcbiAgICAgICAgdHlwZW9mIHRoaXMucmV0dXJuRm9ybWF0ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgID8gdGhpcy5yZXR1cm5Gb3JtYXRcbiAgICAgICAgICA6IHRoaXMubG9jYWxlRm9ybWF0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmVUaW1lOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICBwdWJsaWMgaG91cnM6IG51bWJlcltdID0gW107XG5cbiAgcHVibGljIGlzODYwMSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcblxuICBwdWJsaWMgaXNWaXNpYmxlID0gZmFsc2U7XG5cbiAgcHVibGljIGxvY2FsZUZvcm1hdCA9ICdoOm1tIEEnO1xuXG4gIHB1YmxpYyBtaW51dGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIHB1YmxpYyBtaW51dGVNdWx0aXBsaWVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHJldHVybkZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyB0aW1lRm9ybWF0OiBTa3lUaW1lcGlja2VyVGltZUZvcm1hdFR5cGUgPSAnaGgnO1xuXG4gIHB1YmxpYyB0aW1lcGlja2VySWQ6IHN0cmluZztcblxuICBwdWJsaWMgdHJpZ2dlckJ1dHRvbklkOiBzdHJpbmc7XG5cbiAgQFZpZXdDaGlsZCgndGltZXBpY2tlclJlZicsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmLFxuICB9KVxuICBwdWJsaWMgc2V0IHRpbWVwaWNrZXJSZWYodmFsdWU6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI190aW1lcGlja2VyUmVmID0gdmFsdWU7XG5cbiAgICAgIHRoaXMuI2FkZEtleXVwTGlzdGVuZXIoKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHRpbWVwaWNrZXIgY29tcG9uZW50IHRvIHJlbmRlciBiZWZvcmUgZ2F1Z2luZyBkaW1lbnNpb25zLlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI2Rlc3Ryb3lBZmZpeGVyKCk7XG4gICAgICAgIHRoaXMuI2NyZWF0ZUFmZml4ZXIoKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy50aW1lcGlja2VyUmVmKSB7XG4gICAgICAgICAgICB0aGlzLiNjb3JlQWRhcHRlci5nZXRGb2N1c2FibGVDaGlsZHJlbkFuZEFwcGx5Rm9jdXMoXG4gICAgICAgICAgICAgIHRoaXMudGltZXBpY2tlclJlZixcbiAgICAgICAgICAgICAgJy5za3ktdGltZXBpY2tlci1jb250ZW50JyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRpbWVwaWNrZXJSZWYoKTogRWxlbWVudFJlZiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI190aW1lcGlja2VyUmVmO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgndGltZXBpY2tlclRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICB9KVxuICBwdWJsaWMgdGltZXBpY2tlclRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyQnV0dG9uUmVmJywge1xuICAgIHJlYWQ6IEVsZW1lbnRSZWYsXG4gIH0pXG4gIHB1YmxpYyB0cmlnZ2VyQnV0dG9uUmVmOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0VGVtcGxhdGVSZWYnLCB7XG4gICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgc3RhdGljOiB0cnVlLFxuICB9KVxuICBwdWJsaWMgaW5wdXRUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgQFZpZXdDaGlsZCgndHJpZ2dlckJ1dHRvblRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHVibGljIHRyaWdnZXJCdXR0b25UZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgI2FmZml4ZXI6IFNreUFmZml4ZXIgfCB1bmRlZmluZWQ7XG5cbiAgI3RpbWVwaWNrZXJVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNvdmVybGF5OiBTa3lPdmVybGF5SW5zdGFuY2UgfCB1bmRlZmluZWQ7XG5cbiAgI292ZXJsYXlLZXl1cExpc3RlbmVyOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgI19kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICNfdGltZXBpY2tlclJlZjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZDtcblxuICAjYWZmaXhTZXJ2aWNlOiBTa3lBZmZpeFNlcnZpY2U7XG4gICNjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gICNjb3JlQWRhcHRlcjogU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlO1xuICByZWFkb25seSAjZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgI292ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZTtcbiAgI3pJbmRleDogT2JzZXJ2YWJsZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFmZml4U2VydmljZTogU2t5QWZmaXhTZXJ2aWNlLFxuICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBjb3JlQWRhcHRlcjogU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlLFxuICAgIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgaW5wdXRCb3hIb3N0U2VydmljZT86IFNreUlucHV0Qm94SG9zdFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgdGhlbWVTdmM/OiBTa3lUaGVtZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFNLWV9TVEFDS0lOR19DT05URVhUKVxuICAgIHN0YWNraW5nQ29udGV4dD86IFNreVN0YWNraW5nQ29udGV4dCxcbiAgKSB7XG4gICAgdGhpcy4jYWZmaXhTZXJ2aWNlID0gYWZmaXhTZXJ2aWNlO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jY29yZUFkYXB0ZXIgPSBjb3JlQWRhcHRlcjtcbiAgICB0aGlzLiNvdmVybGF5U2VydmljZSA9IG92ZXJsYXlTZXJ2aWNlO1xuICAgIHRoaXMuI3pJbmRleCA9IHN0YWNraW5nQ29udGV4dD8uekluZGV4O1xuXG4gICAgY29uc3QgdW5pcXVlSWQgPSBuZXh0SWQrKztcbiAgICB0aGlzLnRpbWVwaWNrZXJJZCA9IGBza3ktdGltZXBpY2tlci0ke3VuaXF1ZUlkfWA7XG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uSWQgPSBgc2t5LXRpbWVwaWNrZXItYnV0dG9uLSR7dW5pcXVlSWR9YDtcblxuICAgIC8vIFVwZGF0ZSBpY29ucyB3aGVuIHRoZW1lIGNoYW5nZXMuXG4gICAgdGhlbWVTdmM/LnNldHRpbmdzQ2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpO1xuICAgIHRoaXMuI2FkZEtleXVwTGlzdGVuZXIoKTtcblxuICAgIGlmICh0aGlzLmlucHV0Qm94SG9zdFNlcnZpY2UgJiYgdGhpcy5pbnB1dFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLmlucHV0Qm94SG9zdFNlcnZpY2UucG9wdWxhdGUoe1xuICAgICAgICBpbnB1dFRlbXBsYXRlOiB0aGlzLmlucHV0VGVtcGxhdGVSZWYsXG4gICAgICAgIGJ1dHRvbnNUZW1wbGF0ZTogdGhpcy50cmlnZ2VyQnV0dG9uVGVtcGxhdGVSZWYsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI3JlbW92ZVBpY2tlckV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy4jZGVzdHJveUFmZml4ZXIoKTtcbiAgICB0aGlzLiNkZXN0cm95T3ZlcmxheSgpO1xuICB9XG5cbiAgcHVibGljIHNldEZvcm1hdChmb3JtYXQ6IFNreVRpbWVwaWNrZXJUaW1lRm9ybWF0VHlwZSk6IHZvaWQge1xuICAgIGxldCBoID0gMTI7XG4gICAgbGV0IG0gPSAxMjtcbiAgICBsZXQgbWludXRlTXVsdGlwbGllciA9IDU7XG4gICAgbGV0IGxvY2FsZUZvcm1hdCA9ICdoOm1tIEEnO1xuICAgIGlmIChmb3JtYXQgPT09ICdoaCcpIHtcbiAgICAgIGggPSAxMjtcbiAgICAgIG0gPSAxMjtcbiAgICAgIG1pbnV0ZU11bHRpcGxpZXIgPSA1O1xuICAgICAgbG9jYWxlRm9ybWF0ID0gJ2g6bW0gQSc7XG4gICAgICB0aGlzLmlzODYwMSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSAnSEgnKSB7XG4gICAgICBoID0gMjQ7XG4gICAgICBtID0gNDtcbiAgICAgIG1pbnV0ZU11bHRpcGxpZXIgPSAxNTtcbiAgICAgIGxvY2FsZUZvcm1hdCA9ICdISDptbSc7XG4gICAgICB0aGlzLmlzODYwMSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YToge1xuICAgICAgaG91cnM6IG51bWJlcltdO1xuICAgICAgbWludXRlczogbnVtYmVyW107XG4gICAgICBsb2NhbGVGb3JtYXQ6IHN0cmluZztcbiAgICAgIG1pbnV0ZU11bHRpcGxpZXI6IG51bWJlcjtcbiAgICB9ID0ge1xuICAgICAgLy8gQ3JlYXRlIGEgc3BhcnNlIGFycmF5IHdpdGggYSBsZW5ndGggZXF1YWwgdG8gdGhlIGhvdXIuXG4gICAgICBob3VyczogQXJyYXkoLi4uQXJyYXkoaCkpLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaGgnKSB7XG4gICAgICAgICAgcmV0dXJuICsraTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnSEgnKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgLyogc2FuaXR5IGNoZWNrICovXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSksXG4gICAgICAvLyBDcmVhdGUgYSBzcGFyc2UgYXJyYXkgd2l0aCBhIGxlbmd0aCBlcXVhbCB0byB0aGUgbWludXRlLlxuICAgICAgbWludXRlczogQXJyYXkoLi4uQXJyYXkobSkpLm1hcChmdW5jdGlvbiAoXywgaSkge1xuICAgICAgICByZXR1cm4gaSAqIG1pbnV0ZU11bHRpcGxpZXI7XG4gICAgICB9KSxcbiAgICAgIGxvY2FsZUZvcm1hdDogbG9jYWxlRm9ybWF0LFxuICAgICAgbWludXRlTXVsdGlwbGllcjogbWludXRlTXVsdGlwbGllcixcbiAgICB9O1xuXG4gICAgdGhpcy5ob3VycyA9IGRhdGEuaG91cnM7XG4gICAgdGhpcy5taW51dGVzID0gZGF0YS5taW51dGVzO1xuICAgIHRoaXMubG9jYWxlRm9ybWF0ID0gZGF0YS5sb2NhbGVGb3JtYXQ7XG4gICAgdGhpcy5taW51dGVNdWx0aXBsaWVyID0gZGF0YS5taW51dGVNdWx0aXBsaWVyO1xuICB9XG5cbiAgcHVibGljIG9uQ2xvc2VCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLiNjbG9zZVBpY2tlcigpO1xuICB9XG5cbiAgcHVibGljIHNldFRpbWUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5uYW1lID09PSAnaG91cicpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC5pbm5lckhUTUwsIDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50YXJnZXQubmFtZSA9PT0gJ21pbnV0ZScpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTWludXRlID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlubmVySFRNTCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5uYW1lID09PSAnbWVyaWRpZScpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVyaWRpZXMgPSBldmVudC50YXJnZXQuaW5uZXJIVE1MO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uVHJpZ2dlckJ1dHRvbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuI29wZW5QaWNrZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoaWdobGlnaHRNaW51dGUoc2VsZWN0ZWRNaW51dGU6IG51bWJlciwgbWludXRlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihzZWxlY3RlZE1pbnV0ZSAvIDUpID09PSBtaW51dGUgLyA1O1xuICB9XG5cbiAgI2Nsb3NlUGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMuI2Rlc3Ryb3lBZmZpeGVyKCk7XG4gICAgdGhpcy4jZGVzdHJveU92ZXJsYXkoKTtcbiAgICB0aGlzLiNyZW1vdmVQaWNrZXJFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMudHJpZ2dlckJ1dHRvblJlZj8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gIH1cblxuICAjb3BlblBpY2tlcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy4jcmVtb3ZlUGlja2VyRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLiNkZXN0cm95T3ZlcmxheSgpO1xuICAgIHRoaXMuI2NyZWF0ZU92ZXJsYXkoKTtcblxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gICNjcmVhdGVBZmZpeGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVwaWNrZXJSZWYgJiYgdGhpcy50cmlnZ2VyQnV0dG9uUmVmKSB7XG4gICAgICBjb25zdCBhZmZpeGVyID0gdGhpcy4jYWZmaXhTZXJ2aWNlLmNyZWF0ZUFmZml4ZXIodGhpcy50aW1lcGlja2VyUmVmKTtcblxuICAgICAgLy8gSGlkZSB0aW1lcGlja2VyIHdoZW4gdHJpZ2dlciBidXR0b24gaXMgc2Nyb2xsZWQgb2ZmIHNjcmVlbi5cbiAgICAgIGFmZml4ZXIucGxhY2VtZW50Q2hhbmdlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiN0aW1lcGlja2VyVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IGNoYW5nZS5wbGFjZW1lbnQgIT09IG51bGw7XG4gICAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBhZmZpeGVyLmFmZml4VG8odGhpcy50cmlnZ2VyQnV0dG9uUmVmLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgICAgYXV0b0ZpdENvbnRleHQ6IFNreUFmZml4QXV0b0ZpdENvbnRleHQuVmlld3BvcnQsXG4gICAgICAgIGVuYWJsZUF1dG9GaXQ6IHRydWUsXG4gICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgICAgIGlzU3RpY2t5OiB0cnVlLFxuICAgICAgICBwbGFjZW1lbnQ6ICdiZWxvdycsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy4jYWZmaXhlciA9IGFmZml4ZXI7XG4gICAgfVxuICB9XG5cbiAgI2Rlc3Ryb3lBZmZpeGVyKCk6IHZvaWQge1xuICAgIC8qaXN0YW5idWwgaWdub3JlIGVsc2UqL1xuICAgIGlmICh0aGlzLiNhZmZpeGVyKSB7XG4gICAgICB0aGlzLiNhZmZpeGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuI2FmZml4ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgI2NyZWF0ZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXBpY2tlclRlbXBsYXRlUmVmKSB7XG4gICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy4jb3ZlcmxheVNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgZW5hYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICBlbmFibGVQb2ludGVyRXZlbnRzOiBmYWxzZSxcbiAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy4jZW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy4jekluZGV4KSB7XG4gICAgICAgIHRoaXMuI3pJbmRleFxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiN0aW1lcGlja2VyVW5zdWJzY3JpYmUpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHpJbmRleCkgPT4ge1xuICAgICAgICAgICAgb3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UuekluZGV4ID0gekluZGV4LnRvU3RyaW5nKDEwKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgb3ZlcmxheS5iYWNrZHJvcENsaWNrXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiN0aW1lcGlja2VyVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy4jY2xvc2VQaWNrZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBvdmVybGF5LmF0dGFjaFRlbXBsYXRlKHRoaXMudGltZXBpY2tlclRlbXBsYXRlUmVmKTtcblxuICAgICAgdGhpcy4jb3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgfVxuICB9XG5cbiAgI2Rlc3Ryb3lPdmVybGF5KCk6IHZvaWQge1xuICAgIC8qaXN0YW5idWwgaWdub3JlIGVsc2UqL1xuICAgIGlmICh0aGlzLiNvdmVybGF5KSB7XG4gICAgICB0aGlzLiNvdmVybGF5U2VydmljZS5jbG9zZSh0aGlzLiNvdmVybGF5KTtcbiAgICAgIHRoaXMuI292ZXJsYXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgI2FkZEtleXVwTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgY29uc3QgdGltZXBpY2tlck1lbnVFbGVtZW50ID0gdGhpcy50aW1lcGlja2VyUmVmPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKHRpbWVwaWNrZXJNZW51RWxlbWVudCkge1xuICAgICAgdGhpcy4jb3ZlcmxheUtleXVwTGlzdGVuZXIgPSBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oXG4gICAgICAgIHRpbWVwaWNrZXJNZW51RWxlbWVudCxcbiAgICAgICAgJ2tleXVwJyxcbiAgICAgIClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChrZXkgPT09ICdlc2NhcGUnICYmIHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLiNjbG9zZVBpY2tlcigpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZVBpY2tlckV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuI3RpbWVwaWNrZXJVbnN1YnNjcmliZSkge1xuICAgICAgdGhpcy4jdGltZXBpY2tlclVuc3Vic2NyaWJlLm5leHQoKTtcbiAgICAgIHRoaXMuI3RpbWVwaWNrZXJVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgICAgdGhpcy4jdGltZXBpY2tlclVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aGlzLiNvdmVybGF5S2V5dXBMaXN0ZW5lcj8udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNreS10aW1lcGlja2VyXCI+XG4gIEBpZiAoIWlucHV0Qm94SG9zdFNlcnZpY2UpIHtcbiAgICA8ZGl2IGNsYXNzPVwic2t5LWlucHV0LWdyb3VwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRUZW1wbGF0ZVJlZlwiIC8+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidHJpZ2dlckJ1dHRvblRlbXBsYXRlUmVmXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRUZW1wbGF0ZVJlZj5cbiAgPG5nLWNvbnRlbnQgLz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdHJpZ2dlckJ1dHRvblRlbXBsYXRlUmVmPlxuICA8ZGl2IGNsYXNzPVwic2t5LWlucHV0LWdyb3VwLWJ0blwiPlxuICAgIDxidXR0b25cbiAgICAgICN0cmlnZ2VyQnV0dG9uUmVmXG4gICAgICBhcmlhLWhhc3BvcHVwPVwiZGlhbG9nXCJcbiAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LWlucHV0LWdyb3VwLXRpbWVwaWNrZXItYnRuXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpc09wZW4gPyB0aW1lcGlja2VySWQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgIGlucHV0Qm94SG9zdFNlcnZpY2U/LmxhYmVsVGV4dFxuICAgICAgICAgID8gKCdza3l1eF90aW1lcGlja2VyX2J1dHRvbl9sYWJlbF9jb250ZXh0J1xuICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXM6IGlucHV0Qm94SG9zdFNlcnZpY2U/LmxhYmVsVGV4dClcbiAgICAgICAgICA6ICgnc2t5dXhfdGltZXBpY2tlcl9idXR0b25fbGFiZWwnIHwgc2t5TGliUmVzb3VyY2VzKVxuICAgICAgXCJcbiAgICAgIFthdHRyLmlkXT1cInRyaWdnZXJCdXR0b25JZFwiXG4gICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgaW5wdXRCb3hIb3N0U2VydmljZT8ubGFiZWxUZXh0XG4gICAgICAgICAgPyAoJ3NreXV4X3RpbWVwaWNrZXJfYnV0dG9uX2xhYmVsX2NvbnRleHQnXG4gICAgICAgICAgICB8IHNreUxpYlJlc291cmNlczogaW5wdXRCb3hIb3N0U2VydmljZT8ubGFiZWxUZXh0KVxuICAgICAgICAgIDogKCdza3l1eF90aW1lcGlja2VyX2J1dHRvbl9sYWJlbCcgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIChjbGljayk9XCJvblRyaWdnZXJCdXR0b25DbGljaygpXCJcbiAgICA+XG4gICAgICA8c2t5LWljb24gaWNvbj1cImNsb2NrXCIgc2l6ZT1cImxnXCIgLz5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RpbWVwaWNrZXJUZW1wbGF0ZVJlZj5cbiAgPGRpdlxuICAgICN0aW1lcGlja2VyUmVmXG4gICAgY2xhc3M9XCJza3ktdGltZXBpY2tlci1jb250YWluZXIgc2t5LXNoYWRvdyBza3ktYm94IHNreS1lbGV2YXRpb24tNFwiXG4gICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRyaWdnZXJCdXR0b25JZFwiXG4gICAgW2F0dHIuaWRdPVwidGltZXBpY2tlcklkXCJcbiAgICBbY2xhc3Muc2t5LXRpbWVwaWNrZXItaGlkZGVuXT1cIiFpc1Zpc2libGVcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInNreS10aW1lcGlja2VyLWNvbnRlbnRcIj5cbiAgICAgIDxzZWN0aW9uXG4gICAgICAgIGNsYXNzPVwic2t5LXRpbWVwaWNrZXItY29sdW1uXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnc2t5LXRpbWVwaWNrZXItMjRob3VyJzogaXM4NjAxIH1cIlxuICAgICAgPlxuICAgICAgICA8b2w+XG4gICAgICAgICAgQGZvciAoaG91ciBvZiBob3VyczsgdHJhY2sgaG91cikge1xuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbmFtZT1cImhvdXJcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NreS1idG4tYWN0aXZlJzogc2VsZWN0ZWRIb3VyID09PSBob3VyIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRUaW1lKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgaG91ciB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgfVxuICAgICAgICA8L29sPlxuICAgICAgPC9zZWN0aW9uPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJza3ktdGltZXBpY2tlci1jb2x1bW5cIj5cbiAgICAgICAgPG9sPlxuICAgICAgICAgIEBmb3IgKG1pbnV0ZSBvZiBtaW51dGVzOyB0cmFjayBtaW51dGUpIHtcbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG5hbWU9XCJtaW51dGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICdza3ktYnRuLWFjdGl2ZSc6IGhpZ2hsaWdodE1pbnV0ZShzZWxlY3RlZE1pbnV0ZSwgbWludXRlKVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRUaW1lKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJzAwJy5zdWJzdHJpbmcoMCwgMiAtIG1pbnV0ZS50b1N0cmluZygpLmxlbmd0aCkgKyBtaW51dGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9vbD5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICAgIEBpZiAoIWlzODYwMSkge1xuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cInNreS10aW1lcGlja2VyLWNvbHVtblwiPlxuICAgICAgICAgIDxvbD5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG5hbWU9XCJtZXJpZGllXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdza3ktYnRuLWFjdGl2ZSc6IHNlbGVjdGVkTWVyaWRpZXMgPT09ICdBTScgfVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFRpbWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBBTVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBuYW1lPVwibWVyaWRpZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2t5LWJ0bi1hY3RpdmUnOiBzZWxlY3RlZE1lcmlkaWVzID09PSAnUE0nIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRUaW1lKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgUE1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvb2w+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2t5LXRpbWVwaWNrZXItZm9vdGVyXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cInNreS10aW1lcGlja2VyLWNvbHVtblwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2VCdXR0b25DbGljaygpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7ICdza3l1eF90aW1lcGlja2VyX2Nsb3NlJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19