@odx/angular 5.7.0 → 5.7.2

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 (36) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/components/datepicker/lib/datepicker.component.d.ts +1 -0
  3. package/components/timepicker/README.md +3 -0
  4. package/components/timepicker/index.d.ts +7 -0
  5. package/components/timepicker/lib/components/timepicker-option.component.d.ts +28 -0
  6. package/components/timepicker/lib/directives/timepicker-input-control.directive.d.ts +44 -0
  7. package/components/timepicker/lib/timepicker.component.d.ts +82 -0
  8. package/components/timepicker/lib/timepicker.module.d.ts +10 -0
  9. package/components/timepicker/lib/timepicker.service.d.ts +57 -0
  10. package/components/timepicker/lib/timepicker.token.d.ts +9 -0
  11. package/components/timepicker/lib/utils/generate-time-stamps.d.ts +18 -0
  12. package/components/timepicker/lib/utils/index.d.ts +2 -0
  13. package/components/timepicker/lib/utils/ngx-mask-helper.d.ts +22 -0
  14. package/esm2022/components/datepicker/lib/datepicker.component.mjs +4 -3
  15. package/esm2022/components/timepicker/index.mjs +8 -0
  16. package/esm2022/components/timepicker/lib/components/timepicker-option.component.mjs +59 -0
  17. package/esm2022/components/timepicker/lib/directives/timepicker-input-control.directive.mjs +94 -0
  18. package/esm2022/components/timepicker/lib/timepicker.component.mjs +213 -0
  19. package/esm2022/components/timepicker/lib/timepicker.module.mjs +20 -0
  20. package/esm2022/components/timepicker/lib/timepicker.service.mjs +92 -0
  21. package/esm2022/components/timepicker/lib/timepicker.token.mjs +9 -0
  22. package/esm2022/components/timepicker/lib/utils/generate-time-stamps.mjs +52 -0
  23. package/esm2022/components/timepicker/lib/utils/index.mjs +3 -0
  24. package/esm2022/components/timepicker/lib/utils/ngx-mask-helper.mjs +34 -0
  25. package/esm2022/components/timepicker/odx-angular-components-timepicker.mjs +5 -0
  26. package/esm2022/localization/lib/localization.config.mjs +5 -4
  27. package/esm2022/localization/lib/localization.service.mjs +18 -5
  28. package/fesm2022/odx-angular-components-datepicker.mjs +3 -2
  29. package/fesm2022/odx-angular-components-datepicker.mjs.map +1 -1
  30. package/fesm2022/odx-angular-components-timepicker.mjs +548 -0
  31. package/fesm2022/odx-angular-components-timepicker.mjs.map +1 -0
  32. package/fesm2022/odx-angular-localization.mjs +22 -8
  33. package/fesm2022/odx-angular-localization.mjs.map +1 -1
  34. package/localization/lib/localization.config.d.ts +2 -0
  35. package/localization/lib/localization.service.d.ts +5 -1
  36. package/package.json +7 -1
@@ -0,0 +1,213 @@
1
+ var TimepickerComponent_1;
2
+ import { __decorate, __metadata } from "tslib";
3
+ import { A11yModule, ActiveDescendantKeyManager } from '@angular/cdk/a11y';
4
+ import { ChangeDetectionStrategy, Component, HostListener, Input, QueryList, ViewChild, ViewChildren, ViewEncapsulation, booleanAttribute, forwardRef, inject, numberAttribute, } from '@angular/core';
5
+ import { DisabledController, ReadonlyController } from '@odx/angular';
6
+ import { CustomFormControl } from '@odx/angular/cdk/custom-form-control';
7
+ import { ActionGroupComponent } from '@odx/angular/components/action-group';
8
+ import { ButtonComponent } from '@odx/angular/components/button';
9
+ import { DropdownDirective, DropdownModule } from '@odx/angular/components/dropdown';
10
+ import { IconComponent } from '@odx/angular/components/icon';
11
+ import { CSSComponent } from '@odx/angular/internal';
12
+ import { injectElement, isFunction, trackByIndex, untilDestroyed } from '@odx/angular/utils';
13
+ import { TimepickerOptionComponent } from './components/timepicker-option.component';
14
+ import { TimepickerInputControlDirective } from './directives/timepicker-input-control.directive';
15
+ import { TimepickerService } from './timepicker.service';
16
+ import { TIMEPICKER_CONTROL } from './timepicker.token';
17
+ import { generateTimeStamps } from './utils/generate-time-stamps';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "@angular/common";
20
+ import * as i2 from "@odx/angular";
21
+ import * as i3 from "@odx/angular/components/dropdown";
22
+ /**
23
+ * Represents a time picker component allowing users to select a time from a dropdown list.
24
+ * This component integrates with Angular forms and supports customization for locale, time range, and step intervals.
25
+ *
26
+ * @extends {CustomFormControl<string | null>}
27
+ */
28
+ export let TimepickerComponent = class TimepickerComponent extends CustomFormControl {
29
+ static { TimepickerComponent_1 = this; }
30
+ /**
31
+ * Controls whether the timepicker should use locale-specific time formats AM/PM.
32
+ * @default false
33
+ */
34
+ set useLocale(val) {
35
+ if (this.value && this.dateField) {
36
+ const time = this.timepickerService.getLocalizedTimeFormat(this.value, val);
37
+ this.updateValue(time);
38
+ this.dateField.nativeElementValue = time;
39
+ }
40
+ this._useLocale = val;
41
+ }
42
+ get useLocale() {
43
+ return this._useLocale;
44
+ }
45
+ constructor() {
46
+ super(null);
47
+ this.timepickerService = inject(TimepickerService);
48
+ this._useLocale = false;
49
+ this.takeUntilDestroyed = untilDestroyed();
50
+ this.trackByIndex = trackByIndex;
51
+ this.element = injectElement();
52
+ /**
53
+ * Controls the step interval between time options in minutes.
54
+ * @default 30
55
+ */
56
+ this.step = 30;
57
+ /**
58
+ * Specifies the minimum time value that can be selected ('05:00' or '05:00 AM').
59
+ * @default '00:00'
60
+ */
61
+ this.min = '00:00';
62
+ /**
63
+ * Specifies the maximum time value that can be selected ('22:00' or '10:00 PM').
64
+ * @default '23:59'
65
+ */
66
+ this.max = '23:59';
67
+ }
68
+ ngAfterViewInit() {
69
+ this.handleDateFieldChanges();
70
+ this.updateInputValue();
71
+ }
72
+ onOpen() {
73
+ this.keyManager = new ActiveDescendantKeyManager(this.options).withHomeAndEnd();
74
+ this.setActiveOptionBasedOnCurrentValue();
75
+ }
76
+ isTimeOptionSelected(option) {
77
+ return this.value === option.value;
78
+ }
79
+ /**
80
+ * Handles the selection of a time option from the dropdown, updating the input field and closing the dropdown.
81
+ *
82
+ * @param {TimepickerOptionComponent} option - The selected time option component.
83
+ */
84
+ timeSelected(option) {
85
+ if (!option || option.disabled)
86
+ return;
87
+ const time = this.timepickerService.getLocalizedTimeFormat(option.getLabel(), this.useLocale);
88
+ this.dateField && (this.dateField.nativeElementValue = time);
89
+ this.updateValue(time);
90
+ this.dropdown?.close();
91
+ }
92
+ /**
93
+ * Determines whether the specified time is within the allowed time range.
94
+ *
95
+ * @param {string} time - The time to check, in 'HH:mm' or 'HH:mm AM/PM' format.
96
+ * @returns {boolean} True if the time is within the range; otherwise, false.
97
+ */
98
+ inTimeRange(time) {
99
+ return this.timepickerService.maxValidation(time, this.max) && this.timepickerService.minValidation(time, this.min);
100
+ }
101
+ /**
102
+ * Generates the list of time options based on the configured step interval and locale settings AM/PM.
103
+ *
104
+ * @returns {string[]} An array of time strings in 'HH:mm' format.
105
+ */
106
+ get timeStampsList() {
107
+ return generateTimeStamps(this.step, this.useLocale);
108
+ }
109
+ handleControllerEvent(event) {
110
+ if (this.readonlyController?.readonly)
111
+ return;
112
+ this.keyManager?.onKeydown(event);
113
+ const activeOption = this.keyManager?.activeItem;
114
+ activeOption && this.scrollToActiveOption(activeOption, { behavior: 'smooth' });
115
+ if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {
116
+ event.preventDefault();
117
+ event.stopImmediatePropagation();
118
+ this.timeSelected(activeOption);
119
+ }
120
+ }
121
+ handleDateFieldChanges() {
122
+ this.dateField?.valueChange$.pipe(this.takeUntilDestroyed()).subscribe((time) => this.updateValue(time ?? null));
123
+ }
124
+ setActiveOptionBasedOnCurrentValue() {
125
+ const isSelected = this.options.find((option) => option.isSelected);
126
+ if (isSelected) {
127
+ this.activateOption(isSelected);
128
+ return;
129
+ }
130
+ this.activateNearestTimeOption();
131
+ }
132
+ activateOption(option) {
133
+ this.keyManager && this.keyManager.setActiveItem(option);
134
+ this.scrollToActiveOption(option);
135
+ }
136
+ activateNearestTimeOption() {
137
+ if (!this.value) {
138
+ const currentDate = new Date();
139
+ const isNearest = this.findNearestTimeOption(currentDate);
140
+ if (isNearest) {
141
+ this.activateOption(isNearest);
142
+ }
143
+ }
144
+ }
145
+ findNearestTimeOption(currentDate) {
146
+ const availableTimeSlots = this.options.filter((option) => !option.disabled);
147
+ const nearestTimeValue = this.timepickerService.findClosestDate(availableTimeSlots.map((option) => option.value), `${currentDate.getHours()}:${currentDate.getMinutes()}`);
148
+ return availableTimeSlots.find((option) => option.value === nearestTimeValue);
149
+ }
150
+ updateInputValue() {
151
+ if (this.value && this.dateField) {
152
+ const time = this.timepickerService.getLocalizedTimeFormat(this.value, this.useLocale);
153
+ this.dateField.nativeElementValue = time;
154
+ }
155
+ }
156
+ scrollToActiveOption(option, _opts = {}) {
157
+ if (isFunction(option.element.nativeElement.scrollIntoView)) {
158
+ option.element.nativeElement.scrollIntoView({ block: 'center', ..._opts });
159
+ }
160
+ }
161
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
162
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: TimepickerComponent, isStandalone: true, selector: "odx-timepicker", inputs: { useLocale: ["useLocale", "useLocale", booleanAttribute], step: ["step", "step", numberAttribute], min: "min", max: "max" }, host: { listeners: { "click": "handleControllerEvent($event)", "keydown": "handleControllerEvent($event)" }, properties: { "attr.readonly": "readonlyController?.readonly || null" } }, providers: [
163
+ DisabledController.connect(),
164
+ ReadonlyController.connect(),
165
+ {
166
+ provide: TIMEPICKER_CONTROL,
167
+ useExisting: forwardRef(() => TimepickerComponent_1),
168
+ },
169
+ ], viewQueries: [{ propertyName: "dropdown", first: true, predicate: DropdownDirective, descendants: true }, { propertyName: "dateField", first: true, predicate: TimepickerInputControlDirective, descendants: true }, { propertyName: "options", predicate: TimepickerOptionComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"odx-timepicker__wrapper\">\n <input [value]=\"value\" odxTimepickerControl type=\"text\" />\n</div>\n\n<odx-action-group class=\"odx-no-margin\">\n <button\n #dropdownTrigger\n class=\"odx-timepicker__trigger\"\n odxButton\n size=\"small\"\n variant=\"ghost\"\n aria-label=\"Select time\"\n [odxDropdown]=\"timeList\"\n [odxDropdownOptions]=\"{ matchReferenceWidth: true, position: 'bottom-start', enableFallback: false }\"\n [odxDropdownTriggerElement]=\"dropdownTrigger.element.nativeElement\"\n [odxDropdownReferenceElement]=\"element.nativeElement\"\n (odxDropdownBeforeClose)=\"onTouched()\"\n (odxDropdownAfterOpen)=\"onOpen()\"\n >\n <odx-icon name=\"chevron-down\"></odx-icon>\n </button>\n</odx-action-group>\n\n<ng-template #timeList>\n <div class=\"odx-timepicker__option-list\" role=\"listbox\">\n <odx-timepicker-option\n [value]=\"time\"\n [disabled]=\"!inTimeRange(time)\"\n *ngFor=\"let time of timeStampsList; trackBy: trackByIndex\"\n (selected)=\"timeSelected($event)\"\n >{{ time }}</odx-timepicker-option\n >\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "component", type: ActionGroupComponent, selector: "odx-action-group", inputs: ["reverse"] }, { kind: "component", type: ButtonComponent, selector: "button[odxButton], a[odxButton]", inputs: ["variant", "size"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.DisabledController, selector: "[disabled]", inputs: ["disabled"] }, { kind: "directive", type: i3.DropdownDirective, selector: "[odxDropdown]", inputs: ["odxDropdown", "odxDropdownDisabled", "odxDropdownShowLoader", "odxDropdownClickOutsideActive", "odxDropdownOptions", "odxDropdownReferenceElement", "odxDropdownTriggerElement", "odxDropdownHost", "odxDropdownOpenTrigger", "odxDropdownCloseTrigger"], outputs: ["odxDropdownBeforeOpen", "odxDropdownAfterOpen", "odxDropdownBeforeClose", "odxDropdownAfterClose"], exportAs: ["odxDropdown"] }, { kind: "component", type: TimepickerOptionComponent, selector: "odx-timepicker-option", outputs: ["selected"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "directive", type: TimepickerInputControlDirective, selector: "input[odxTimepickerControl]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
170
+ };
171
+ TimepickerComponent = TimepickerComponent_1 = __decorate([
172
+ CSSComponent('timepicker'),
173
+ __metadata("design:paramtypes", [])
174
+ ], TimepickerComponent);
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerComponent, decorators: [{
176
+ type: Component,
177
+ args: [{ standalone: true, selector: 'odx-timepicker', providers: [
178
+ DisabledController.connect(),
179
+ ReadonlyController.connect(),
180
+ {
181
+ provide: TIMEPICKER_CONTROL,
182
+ useExisting: forwardRef(() => TimepickerComponent),
183
+ },
184
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [A11yModule, ActionGroupComponent, ButtonComponent, DropdownModule, TimepickerOptionComponent, IconComponent, TimepickerInputControlDirective], host: {
185
+ '[attr.readonly]': 'readonlyController?.readonly || null',
186
+ }, template: "<div class=\"odx-timepicker__wrapper\">\n <input [value]=\"value\" odxTimepickerControl type=\"text\" />\n</div>\n\n<odx-action-group class=\"odx-no-margin\">\n <button\n #dropdownTrigger\n class=\"odx-timepicker__trigger\"\n odxButton\n size=\"small\"\n variant=\"ghost\"\n aria-label=\"Select time\"\n [odxDropdown]=\"timeList\"\n [odxDropdownOptions]=\"{ matchReferenceWidth: true, position: 'bottom-start', enableFallback: false }\"\n [odxDropdownTriggerElement]=\"dropdownTrigger.element.nativeElement\"\n [odxDropdownReferenceElement]=\"element.nativeElement\"\n (odxDropdownBeforeClose)=\"onTouched()\"\n (odxDropdownAfterOpen)=\"onOpen()\"\n >\n <odx-icon name=\"chevron-down\"></odx-icon>\n </button>\n</odx-action-group>\n\n<ng-template #timeList>\n <div class=\"odx-timepicker__option-list\" role=\"listbox\">\n <odx-timepicker-option\n [value]=\"time\"\n [disabled]=\"!inTimeRange(time)\"\n *ngFor=\"let time of timeStampsList; trackBy: trackByIndex\"\n (selected)=\"timeSelected($event)\"\n >{{ time }}</odx-timepicker-option\n >\n </div>\n</ng-template>\n" }]
187
+ }], ctorParameters: function () { return []; }, propDecorators: { dropdown: [{
188
+ type: ViewChild,
189
+ args: [DropdownDirective]
190
+ }], options: [{
191
+ type: ViewChildren,
192
+ args: [TimepickerOptionComponent, { emitDistinctChangesOnly: true }]
193
+ }], useLocale: [{
194
+ type: Input,
195
+ args: [{ transform: booleanAttribute }]
196
+ }], step: [{
197
+ type: Input,
198
+ args: [{ transform: numberAttribute }]
199
+ }], min: [{
200
+ type: Input
201
+ }], max: [{
202
+ type: Input
203
+ }], dateField: [{
204
+ type: ViewChild,
205
+ args: [TimepickerInputControlDirective]
206
+ }], handleControllerEvent: [{
207
+ type: HostListener,
208
+ args: ['click', ['$event']]
209
+ }, {
210
+ type: HostListener,
211
+ args: ['keydown', ['$event']]
212
+ }] } });
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdGltZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixlQUFlLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FB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Q0FBQzs7R0FvQmQsbUJBQW1CLENBK0svQjs0RkEvS1ksbUJBQW1CO2tCQW5CL0IsU0FBUztpQ0FDSSxJQUFJLFlBQ04sZ0JBQWdCLGFBRWY7d0JBQ1Qsa0JBQWtCLENBQUMsT0FBTyxFQUFFO3dCQUM1QixrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7d0JBQzVCOzRCQUNFLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDO3lCQUNuRDtxQkFDRixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLCtCQUErQixDQUFDLFFBQ2pKO3dCQUNKLGlCQUFpQixFQUFFLHNDQUFzQztxQkFDMUQ7MEVBV2tCLFFBQVE7c0JBRDFCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUlsQixPQUFPO3NCQURoQixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFO2dCQVUvRCxTQUFTO3NCQURuQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQW1CL0IsSUFBSTtzQkFEVixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFROUIsR0FBRztzQkFEVCxLQUFLO2dCQVFDLEdBQUc7c0JBRFQsS0FBSztnQkFJQyxTQUFTO3NCQURmLFNBQVM7dUJBQUMsK0JBQStCO2dCQXVEaEMscUJBQXFCO3NCQUY5QixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ2hDLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQTExeU1vZHVsZSwgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlzYWJsZWRDb250cm9sbGVyLCBSZWFkb25seUNvbnRyb2xsZXIgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQ3VzdG9tRm9ybUNvbnRyb2wgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2N1c3RvbS1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgT3B0aW9uQ29udHJvbCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvb3B0aW9uLWNvbnRyb2wnO1xuaW1wb3J0IHsgQWN0aW9uR3JvdXBDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9hY3Rpb24tZ3JvdXAnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7IERyb3Bkb3duRGlyZWN0aXZlLCBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2Ryb3Bkb3duJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbCc7XG5pbXBvcnQgeyBpbmplY3RFbGVtZW50LCBpc0Z1bmN0aW9uLCB0cmFja0J5SW5kZXgsIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGltZXBpY2tlci1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvdGltZXBpY2tlci1pbnB1dC1jb250cm9sLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUaW1lcGlja2VyU2VydmljZSB9IGZyb20gJy4vdGltZXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCB7IFRJTUVQSUNLRVJfQ09OVFJPTCB9IGZyb20gJy4vdGltZXBpY2tlci50b2tlbic7XG5pbXBvcnQgeyBnZW5lcmF0ZVRpbWVTdGFtcHMgfSBmcm9tICcuL3V0aWxzL2dlbmVyYXRlLXRpbWUtc3RhbXBzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGltZSBwaWNrZXIgY29tcG9uZW50IGFsbG93aW5nIHVzZXJzIHRvIHNlbGVjdCBhIHRpbWUgZnJvbSBhIGRyb3Bkb3duIGxpc3QuXG4gKiBUaGlzIGNvbXBvbmVudCBpbnRlZ3JhdGVzIHdpdGggQW5ndWxhciBmb3JtcyBhbmQgc3VwcG9ydHMgY3VzdG9taXphdGlvbiBmb3IgbG9jYWxlLCB0aW1lIHJhbmdlLCBhbmQgc3RlcCBpbnRlcnZhbHMuXG4gKlxuICogQGV4dGVuZHMge0N1c3RvbUZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+fVxuICovXG5AQ1NTQ29tcG9uZW50KCd0aW1lcGlja2VyJylcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ29keC10aW1lcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICd0aW1lcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgRGlzYWJsZWRDb250cm9sbGVyLmNvbm5lY3QoKSxcbiAgICBSZWFkb25seUNvbnRyb2xsZXIuY29ubmVjdCgpLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRJTUVQSUNLRVJfQ09OVFJPTCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVwaWNrZXJDb21wb25lbnQpLFxuICAgIH0sXG4gIF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQTExeU1vZHVsZSwgQWN0aW9uR3JvdXBDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCwgRHJvcGRvd25Nb2R1bGUsIFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQsIEljb25Db21wb25lbnQsIFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmVdLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLnJlYWRvbmx5XSc6ICdyZWFkb25seUNvbnRyb2xsZXI/LnJlYWRvbmx5IHx8IG51bGwnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lcGlja2VyQ29tcG9uZW50IGV4dGVuZHMgQ3VzdG9tRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lcGlja2VyU2VydmljZSA9IGluamVjdChUaW1lcGlja2VyU2VydmljZSk7XG4gIHByaXZhdGUgX3VzZUxvY2FsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5TWFuYWdlcj86IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPE9wdGlvbkNvbnRyb2w8c3RyaW5nPj47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5SW5kZXggPSB0cmFja0J5SW5kZXg7XG5cbiAgQFZpZXdDaGlsZChEcm9wZG93bkRpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRyb3Bkb3duPzogRHJvcGRvd25EaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZHJlbihUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50LCB7IGVtaXREaXN0aW5jdENoYW5nZXNPbmx5OiB0cnVlIH0pXG4gIHByb3RlY3RlZCBvcHRpb25zITogUXVlcnlMaXN0PFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQ+O1xuXG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50ID0gaW5qZWN0RWxlbWVudCgpO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSB0aW1lcGlja2VyIHNob3VsZCB1c2UgbG9jYWxlLXNwZWNpZmljIHRpbWUgZm9ybWF0cyBBTS9QTS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgc2V0IHVzZUxvY2FsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLmRhdGVGaWVsZCkge1xuICAgICAgY29uc3QgdGltZSA9IHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0TG9jYWxpemVkVGltZUZvcm1hdCh0aGlzLnZhbHVlLCB2YWwpO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aW1lKTtcbiAgICAgIHRoaXMuZGF0ZUZpZWxkLm5hdGl2ZUVsZW1lbnRWYWx1ZSA9IHRpbWU7XG4gICAgfVxuICAgIHRoaXMuX3VzZUxvY2FsZSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXNlTG9jYWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VMb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgdGhlIHN0ZXAgaW50ZXJ2YWwgYmV0d2VlbiB0aW1lIG9wdGlvbnMgaW4gbWludXRlcy5cbiAgICogQGRlZmF1bHQgMzBcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBzdGVwID0gMzA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWluaW11bSB0aW1lIHZhbHVlIHRoYXQgY2FuIGJlIHNlbGVjdGVkICgnMDU6MDAnIG9yICcwNTowMCBBTScpLlxuICAgKiBAZGVmYXVsdCAnMDA6MDAnXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWluID0gJzAwOjAwJztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHRpbWUgdmFsdWUgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgKCcyMjowMCcgb3IgJzEwOjAwIFBNJykuXG4gICAqIEBkZWZhdWx0ICcyMzo1OSdcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXggPSAnMjM6NTknO1xuXG4gIEBWaWV3Q2hpbGQoVGltZXBpY2tlcklucHV0Q29udHJvbERpcmVjdGl2ZSlcbiAgcHVibGljIGRhdGVGaWVsZD86IFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlRGF0ZUZpZWxkQ2hhbmdlcygpO1xuICAgIHRoaXMudXBkYXRlSW5wdXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIG9uT3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLmtleU1hbmFnZXIgPSBuZXcgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8T3B0aW9uQ29udHJvbDxzdHJpbmc+Pih0aGlzLm9wdGlvbnMpLndpdGhIb21lQW5kRW5kKCk7XG4gICAgdGhpcy5zZXRBY3RpdmVPcHRpb25CYXNlZE9uQ3VycmVudFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNUaW1lT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IG9wdGlvbi52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgYSB0aW1lIG9wdGlvbiBmcm9tIHRoZSBkcm9wZG93biwgdXBkYXRpbmcgdGhlIGlucHV0IGZpZWxkIGFuZCBjbG9zaW5nIHRoZSBkcm9wZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHtUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50fSBvcHRpb24gLSBUaGUgc2VsZWN0ZWQgdGltZSBvcHRpb24gY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIHRpbWVTZWxlY3RlZChvcHRpb24/OiBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50KTogdm9pZCB7XG4gICAgaWYgKCFvcHRpb24gfHwgb3B0aW9uLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3QgdGltZSA9IHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0TG9jYWxpemVkVGltZUZvcm1hdChvcHRpb24uZ2V0TGFiZWwoKSwgdGhpcy51c2VMb2NhbGUpO1xuICAgIHRoaXMuZGF0ZUZpZWxkICYmICh0aGlzLmRhdGVGaWVsZC5uYXRpdmVFbGVtZW50VmFsdWUgPSB0aW1lKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlKHRpbWUpO1xuICAgIHRoaXMuZHJvcGRvd24/LmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGltZSBpcyB3aXRoaW4gdGhlIGFsbG93ZWQgdGltZSByYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSB0byBjaGVjaywgaW4gJ0hIOm1tJyBvciAnSEg6bW0gQU0vUE0nIGZvcm1hdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRpbWUgaXMgd2l0aGluIHRoZSByYW5nZTsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBpblRpbWVSYW5nZSh0aW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lcGlja2VyU2VydmljZS5tYXhWYWxpZGF0aW9uKHRpbWUsIHRoaXMubWF4KSAmJiB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLm1pblZhbGlkYXRpb24odGltZSwgdGhpcy5taW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgbGlzdCBvZiB0aW1lIG9wdGlvbnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgc3RlcCBpbnRlcnZhbCBhbmQgbG9jYWxlIHNldHRpbmdzIEFNL1BNLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFuIGFycmF5IG9mIHRpbWUgc3RyaW5ncyBpbiAnSEg6bW0nIGZvcm1hdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGltZVN0YW1wc0xpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBnZW5lcmF0ZVRpbWVTdGFtcHModGhpcy5zdGVwLCB0aGlzLnVzZUxvY2FsZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgaGFuZGxlQ29udHJvbGxlckV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMucmVhZG9ubHlDb250cm9sbGVyPy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgdGhpcy5rZXlNYW5hZ2VyPy5vbktleWRvd24oZXZlbnQpO1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMua2V5TWFuYWdlcj8uYWN0aXZlSXRlbSBhcyBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50O1xuICAgIGFjdGl2ZU9wdGlvbiAmJiB0aGlzLnNjcm9sbFRvQWN0aXZlT3B0aW9uKGFjdGl2ZU9wdGlvbiwgeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnIHx8IGV2ZW50LmtleSA9PT0gJ1NwYWNlYmFyJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy50aW1lU2VsZWN0ZWQoYWN0aXZlT3B0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlRGF0ZUZpZWxkQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVGaWVsZD8udmFsdWVDaGFuZ2UkLnBpcGUodGhpcy50YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKCh0aW1lKSA9PiB0aGlzLnVwZGF0ZVZhbHVlKHRpbWUgPz8gbnVsbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVPcHRpb25CYXNlZE9uQ3VycmVudFZhbHVlKCk6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uaXNTZWxlY3RlZCk7XG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGVPcHRpb24oaXNTZWxlY3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmF0ZU5lYXJlc3RUaW1lT3B0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2YXRlT3B0aW9uKG9wdGlvbjogVGltZXBpY2tlck9wdGlvbkNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5TWFuYWdlciAmJiB0aGlzLmtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShvcHRpb24pO1xuICAgIHRoaXMuc2Nyb2xsVG9BY3RpdmVPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZhdGVOZWFyZXN0VGltZU9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGlzTmVhcmVzdCA9IHRoaXMuZmluZE5lYXJlc3RUaW1lT3B0aW9uKGN1cnJlbnREYXRlKTtcbiAgICAgIGlmIChpc05lYXJlc3QpIHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZU9wdGlvbihpc05lYXJlc3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZE5lYXJlc3RUaW1lT3B0aW9uKGN1cnJlbnREYXRlOiBEYXRlKTogVGltZXBpY2tlck9wdGlvbkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXZhaWxhYmxlVGltZVNsb3RzID0gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmRpc2FibGVkKTtcbiAgICBjb25zdCBuZWFyZXN0VGltZVZhbHVlID0gdGhpcy50aW1lcGlja2VyU2VydmljZS5maW5kQ2xvc2VzdERhdGUoXG4gICAgICBhdmFpbGFibGVUaW1lU2xvdHMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkgYXMgc3RyaW5nW10sXG4gICAgICBgJHtjdXJyZW50RGF0ZS5nZXRIb3VycygpfToke2N1cnJlbnREYXRlLmdldE1pbnV0ZXMoKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gYXZhaWxhYmxlVGltZVNsb3RzLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBuZWFyZXN0VGltZVZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5wdXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLmRhdGVGaWVsZCkge1xuICAgICAgY29uc3QgdGltZSA9IHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0TG9jYWxpemVkVGltZUZvcm1hdCh0aGlzLnZhbHVlLCB0aGlzLnVzZUxvY2FsZSk7XG4gICAgICB0aGlzLmRhdGVGaWVsZC5uYXRpdmVFbGVtZW50VmFsdWUgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9BY3RpdmVPcHRpb24ob3B0aW9uOiBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50LCBfb3B0czogU2Nyb2xsSW50b1ZpZXdPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb24uZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KSkge1xuICAgICAgb3B0aW9uLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnY2VudGVyJywgLi4uX29wdHMgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib2R4LXRpbWVwaWNrZXJfX3dyYXBwZXJcIj5cbiAgPGlucHV0IFt2YWx1ZV09XCJ2YWx1ZVwiIG9keFRpbWVwaWNrZXJDb250cm9sIHR5cGU9XCJ0ZXh0XCIgLz5cbjwvZGl2PlxuXG48b2R4LWFjdGlvbi1ncm91cCBjbGFzcz1cIm9keC1uby1tYXJnaW5cIj5cbiAgPGJ1dHRvblxuICAgICNkcm9wZG93blRyaWdnZXJcbiAgICBjbGFzcz1cIm9keC10aW1lcGlja2VyX190cmlnZ2VyXCJcbiAgICBvZHhCdXR0b25cbiAgICBzaXplPVwic21hbGxcIlxuICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgYXJpYS1sYWJlbD1cIlNlbGVjdCB0aW1lXCJcbiAgICBbb2R4RHJvcGRvd25dPVwidGltZUxpc3RcIlxuICAgIFtvZHhEcm9wZG93bk9wdGlvbnNdPVwieyBtYXRjaFJlZmVyZW5jZVdpZHRoOiB0cnVlLCBwb3NpdGlvbjogJ2JvdHRvbS1zdGFydCcsIGVuYWJsZUZhbGxiYWNrOiBmYWxzZSB9XCJcbiAgICBbb2R4RHJvcGRvd25UcmlnZ2VyRWxlbWVudF09XCJkcm9wZG93blRyaWdnZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50XCJcbiAgICBbb2R4RHJvcGRvd25SZWZlcmVuY2VFbGVtZW50XT1cImVsZW1lbnQubmF0aXZlRWxlbWVudFwiXG4gICAgKG9keERyb3Bkb3duQmVmb3JlQ2xvc2UpPVwib25Ub3VjaGVkKClcIlxuICAgIChvZHhEcm9wZG93bkFmdGVyT3Blbik9XCJvbk9wZW4oKVwiXG4gID5cbiAgICA8b2R4LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiPjwvb2R4LWljb24+XG4gIDwvYnV0dG9uPlxuPC9vZHgtYWN0aW9uLWdyb3VwPlxuXG48bmctdGVtcGxhdGUgI3RpbWVMaXN0PlxuICA8ZGl2IGNsYXNzPVwib2R4LXRpbWVwaWNrZXJfX29wdGlvbi1saXN0XCIgcm9sZT1cImxpc3Rib3hcIj5cbiAgICA8b2R4LXRpbWVwaWNrZXItb3B0aW9uXG4gICAgICBbdmFsdWVdPVwidGltZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWluVGltZVJhbmdlKHRpbWUpXCJcbiAgICAgICpuZ0Zvcj1cImxldCB0aW1lIG9mIHRpbWVTdGFtcHNMaXN0OyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxuICAgICAgKHNlbGVjdGVkKT1cInRpbWVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgID57eyB0aW1lIH19PC9vZHgtdGltZXBpY2tlci1vcHRpb25cbiAgICA+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CoreModule } from '@odx/angular';
3
+ import { TimepickerOptionComponent } from './components/timepicker-option.component';
4
+ import { TimepickerInputControlDirective } from './directives/timepicker-input-control.directive';
5
+ import { TimepickerComponent } from './timepicker.component';
6
+ import * as i0 from "@angular/core";
7
+ const modules = [TimepickerComponent, TimepickerInputControlDirective, TimepickerOptionComponent];
8
+ export class TimepickerModule {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, imports: [TimepickerComponent, TimepickerInputControlDirective, TimepickerOptionComponent], exports: [CoreModule, TimepickerComponent, TimepickerInputControlDirective, TimepickerOptionComponent] }); }
11
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, imports: [TimepickerComponent, CoreModule] }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: modules,
17
+ exports: [CoreModule, ...modules],
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdGltZXBpY2tlci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUU3RCxNQUFNLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixFQUFFLCtCQUErQixFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFLbEcsTUFBTSxPQUFPLGdCQUFnQjsrR0FBaEIsZ0JBQWdCO2dIQUFoQixnQkFBZ0IsWUFMWixtQkFBbUIsRUFBRSwrQkFBK0IsRUFBRSx5QkFBeUIsYUFHcEYsVUFBVSxFQUhMLG1CQUFtQixFQUFFLCtCQUErQixFQUFFLHlCQUF5QjtnSEFLbkYsZ0JBQWdCLFlBTFosbUJBQW1CLEVBR3hCLFVBQVU7OzRGQUVULGdCQUFnQjtrQkFKNUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsT0FBTztvQkFDaEIsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO2lCQUNsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGltZXBpY2tlci1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvdGltZXBpY2tlci1pbnB1dC1jb250cm9sLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUaW1lcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi90aW1lcGlja2VyLmNvbXBvbmVudCc7XG5cbmNvbnN0IG1vZHVsZXMgPSBbVGltZXBpY2tlckNvbXBvbmVudCwgVGltZXBpY2tlcklucHV0Q29udHJvbERpcmVjdGl2ZSwgVGltZXBpY2tlck9wdGlvbkNvbXBvbmVudF07XG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBtb2R1bGVzLFxuICBleHBvcnRzOiBbQ29yZU1vZHVsZSwgLi4ubW9kdWxlc10sXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVwaWNrZXJNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,92 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { WindowRef } from '@odx/angular';
3
+ import { isAfter, isBefore, isEqual } from 'date-fns';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Service to provide utility functions for timepicker components, including validation, placeholder generation, and finding the closest time.
7
+ * It also handles locale-based time formatting.
8
+ */
9
+ export class TimepickerService {
10
+ constructor() {
11
+ this.windowRef = inject(WindowRef);
12
+ }
13
+ /**
14
+ * Generates a placeholder string for time input fields.
15
+ *
16
+ * @param {boolean} apm - Specifies if the placeholder should include AM/PM notation.
17
+ * @returns {string} The placeholder string.
18
+ */
19
+ getPlaceholder(apm = false) {
20
+ return apm ? '--:-- --' : '--:--';
21
+ }
22
+ /**
23
+ * Validates if the given time is less than or equal to a maximum time constraint.
24
+ *
25
+ * @param {string} time - The time to validate.
26
+ * @param {string} max - The maximum allowable time.
27
+ * @returns {boolean} True if the time is valid, false otherwise.
28
+ */
29
+ maxValidation(time, max) {
30
+ const [targetValue, maxValue] = this.convertToDates([time, max]);
31
+ return isBefore(targetValue, maxValue) || isEqual(targetValue, maxValue);
32
+ }
33
+ /**
34
+ * Validates if the given time is greater than or equal to a minimum time constraint.
35
+ *
36
+ * @param {string} time - The time to validate.
37
+ * @param {string} min - The minimum allowable time.
38
+ * @returns {boolean} True if the time is valid, false otherwise.
39
+ */
40
+ minValidation(time, min) {
41
+ const [targetValue, minValue] = this.convertToDates([time, min]);
42
+ return isAfter(targetValue, minValue) || isEqual(targetValue, minValue);
43
+ }
44
+ /**
45
+ * Finds the closest time to a target time from a list of times.
46
+ *
47
+ * @param {string[]} timeStamps - The list of times to search through.
48
+ * @param {string} targetTime - The target time to find the closest match for.
49
+ * @returns {string} The closest time to the target.
50
+ */
51
+ findClosestDate(timeStamps, targetTime) {
52
+ const [target] = this.convertToDates([targetTime]);
53
+ const datesArray = this.convertToDates(timeStamps);
54
+ const closestDate = datesArray.reduce((prev, curr) => {
55
+ return Math.abs(curr.getTime() - target.getTime()) < Math.abs(prev.getTime() - target.getTime()) ? curr : prev;
56
+ });
57
+ return this.getLocalizedTimeFormat(`${closestDate.getHours()}:${closestDate.getMinutes()}`);
58
+ }
59
+ /**
60
+ * Formats a time string to a localized time format.
61
+ *
62
+ * @param {string} time - The time string to format.
63
+ * @param {boolean} hour12 - Specifies if the output should use 12-hour format with AM/PM notation.
64
+ * @returns {string} The formatted time string.
65
+ */
66
+ getLocalizedTimeFormat(time, hour12 = false) {
67
+ const locale = hour12 ? 'en-US' : 'en-GB';
68
+ const [date] = this.convertToDates([time]);
69
+ return new this.windowRef.nativeWindow.Intl.DateTimeFormat(locale, {
70
+ hour: '2-digit',
71
+ minute: '2-digit',
72
+ hour12,
73
+ }).format(date);
74
+ }
75
+ /**
76
+ * Converts an array of time strings to an array of Date objects.
77
+ *
78
+ * @param {string[]} times - The time strings to convert.
79
+ * @returns {Date[]} An array of Date objects corresponding to the input times.
80
+ * @private
81
+ */
82
+ convertToDates(times) {
83
+ return times.map((time) => new Date(`${time} 2022-12-19`));
84
+ }
85
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
86
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerService, providedIn: 'root' }); }
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerService, decorators: [{
89
+ type: Injectable,
90
+ args: [{ providedIn: 'root' }]
91
+ }] });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGltZXBpY2tlci9zcmMvbGliL3RpbWVwaWNrZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFFdEQ7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUQ5QjtRQUVtQixjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBaUZoRDtJQS9FQzs7Ozs7T0FLRztJQUNJLGNBQWMsQ0FBQyxHQUFHLEdBQUcsS0FBSztRQUMvQixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWEsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUM1QyxNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYSxDQUFDLElBQVksRUFBRSxHQUFXO1FBQzVDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlLENBQUMsVUFBb0IsRUFBRSxVQUFrQjtRQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ25ELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksc0JBQXNCLENBQUMsSUFBWSxFQUFFLE1BQU0sR0FBRyxLQUFLO1FBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUNqRSxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU07U0FDUCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxjQUFjLENBQUMsS0FBZTtRQUNwQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7K0dBakZVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBREosTUFBTTs7NEZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1JlZiB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBpc0FmdGVyLCBpc0JlZm9yZSwgaXNFcXVhbCB9IGZyb20gJ2RhdGUtZm5zJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIHByb3ZpZGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRpbWVwaWNrZXIgY29tcG9uZW50cywgaW5jbHVkaW5nIHZhbGlkYXRpb24sIHBsYWNlaG9sZGVyIGdlbmVyYXRpb24sIGFuZCBmaW5kaW5nIHRoZSBjbG9zZXN0IHRpbWUuXG4gKiBJdCBhbHNvIGhhbmRsZXMgbG9jYWxlLWJhc2VkIHRpbWUgZm9ybWF0dGluZy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaW1lcGlja2VyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVmID0gaW5qZWN0KFdpbmRvd1JlZik7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHBsYWNlaG9sZGVyIHN0cmluZyBmb3IgdGltZSBpbnB1dCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXBtIC0gU3BlY2lmaWVzIGlmIHRoZSBwbGFjZWhvbGRlciBzaG91bGQgaW5jbHVkZSBBTS9QTSBub3RhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHBsYWNlaG9sZGVyIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXRQbGFjZWhvbGRlcihhcG0gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFwbSA/ICctLTotLSAtLScgOiAnLS06LS0nO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgZ2l2ZW4gdGltZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBtYXhpbXVtIHRpbWUgY29uc3RyYWludC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heCAtIFRoZSBtYXhpbXVtIGFsbG93YWJsZSB0aW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGltZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIG1heFZhbGlkYXRpb24odGltZTogc3RyaW5nLCBtYXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFt0YXJnZXRWYWx1ZSwgbWF4VmFsdWVdID0gdGhpcy5jb252ZXJ0VG9EYXRlcyhbdGltZSwgbWF4XSk7XG4gICAgcmV0dXJuIGlzQmVmb3JlKHRhcmdldFZhbHVlLCBtYXhWYWx1ZSkgfHwgaXNFcXVhbCh0YXJnZXRWYWx1ZSwgbWF4VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgZ2l2ZW4gdGltZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBtaW5pbXVtIHRpbWUgY29uc3RyYWludC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1pbiAtIFRoZSBtaW5pbXVtIGFsbG93YWJsZSB0aW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGltZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIG1pblZhbGlkYXRpb24odGltZTogc3RyaW5nLCBtaW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFt0YXJnZXRWYWx1ZSwgbWluVmFsdWVdID0gdGhpcy5jb252ZXJ0VG9EYXRlcyhbdGltZSwgbWluXSk7XG4gICAgcmV0dXJuIGlzQWZ0ZXIodGFyZ2V0VmFsdWUsIG1pblZhbHVlKSB8fCBpc0VxdWFsKHRhcmdldFZhbHVlLCBtaW5WYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgdGltZSB0byBhIHRhcmdldCB0aW1lIGZyb20gYSBsaXN0IG9mIHRpbWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0aW1lU3RhbXBzIC0gVGhlIGxpc3Qgb2YgdGltZXMgdG8gc2VhcmNoIHRocm91Z2guXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRUaW1lIC0gVGhlIHRhcmdldCB0aW1lIHRvIGZpbmQgdGhlIGNsb3Nlc3QgbWF0Y2ggZm9yLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY2xvc2VzdCB0aW1lIHRvIHRoZSB0YXJnZXQuXG4gICAqL1xuICBwdWJsaWMgZmluZENsb3Nlc3REYXRlKHRpbWVTdGFtcHM6IHN0cmluZ1tdLCB0YXJnZXRUaW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFt0YXJnZXRdID0gdGhpcy5jb252ZXJ0VG9EYXRlcyhbdGFyZ2V0VGltZV0pO1xuICAgIGNvbnN0IGRhdGVzQXJyYXkgPSB0aGlzLmNvbnZlcnRUb0RhdGVzKHRpbWVTdGFtcHMpO1xuXG4gICAgY29uc3QgY2xvc2VzdERhdGUgPSBkYXRlc0FycmF5LnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKGN1cnIuZ2V0VGltZSgpIC0gdGFyZ2V0LmdldFRpbWUoKSkgPCBNYXRoLmFicyhwcmV2LmdldFRpbWUoKSAtIHRhcmdldC5nZXRUaW1lKCkpID8gY3VyciA6IHByZXY7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6ZWRUaW1lRm9ybWF0KGAke2Nsb3Nlc3REYXRlLmdldEhvdXJzKCl9OiR7Y2xvc2VzdERhdGUuZ2V0TWludXRlcygpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSB0aW1lIHN0cmluZyB0byBhIGxvY2FsaXplZCB0aW1lIGZvcm1hdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSBzdHJpbmcgdG8gZm9ybWF0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhvdXIxMiAtIFNwZWNpZmllcyBpZiB0aGUgb3V0cHV0IHNob3VsZCB1c2UgMTItaG91ciBmb3JtYXQgd2l0aCBBTS9QTSBub3RhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB0aW1lIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbGl6ZWRUaW1lRm9ybWF0KHRpbWU6IHN0cmluZywgaG91cjEyID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IGhvdXIxMiA/ICdlbi1VUycgOiAnZW4tR0InO1xuICAgIGNvbnN0IFtkYXRlXSA9IHRoaXMuY29udmVydFRvRGF0ZXMoW3RpbWVdKTtcbiAgICByZXR1cm4gbmV3IHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5JbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwge1xuICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICBob3VyMTIsXG4gICAgfSkuZm9ybWF0KGRhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHRpbWUgc3RyaW5ncyB0byBhbiBhcnJheSBvZiBEYXRlIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRpbWVzIC0gVGhlIHRpbWUgc3RyaW5ncyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7RGF0ZVtdfSBBbiBhcnJheSBvZiBEYXRlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgdGltZXMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRUb0RhdGVzKHRpbWVzOiBzdHJpbmdbXSk6IERhdGVbXSB7XG4gICAgcmV0dXJuIHRpbWVzLm1hcCgodGltZSkgPT4gbmV3IERhdGUoYCR7dGltZX0gMjAyMi0xMi0xOWApKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,9 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * An InjectionToken used for injecting an instance of TimepickerComponent.
4
+ * This token facilitates the decoupling of the TimepickerComponent's implementation from its consumption,
5
+ * allowing for more flexible and maintainable code, especially in scenarios requiring custom time picker
6
+ * behavior or appearance.
7
+ */
8
+ export const TIMEPICKER_CONTROL = new InjectionToken('@odx/angular/components/timepicker::TimepickerComponent');
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RpbWVwaWNrZXIvc3JjL2xpYi90aW1lcGlja2VyLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0M7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBc0IseURBQXlELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaW1lcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi90aW1lcGlja2VyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQW4gSW5qZWN0aW9uVG9rZW4gdXNlZCBmb3IgaW5qZWN0aW5nIGFuIGluc3RhbmNlIG9mIFRpbWVwaWNrZXJDb21wb25lbnQuXG4gKiBUaGlzIHRva2VuIGZhY2lsaXRhdGVzIHRoZSBkZWNvdXBsaW5nIG9mIHRoZSBUaW1lcGlja2VyQ29tcG9uZW50J3MgaW1wbGVtZW50YXRpb24gZnJvbSBpdHMgY29uc3VtcHRpb24sXG4gKiBhbGxvd2luZyBmb3IgbW9yZSBmbGV4aWJsZSBhbmQgbWFpbnRhaW5hYmxlIGNvZGUsIGVzcGVjaWFsbHkgaW4gc2NlbmFyaW9zIHJlcXVpcmluZyBjdXN0b20gdGltZSBwaWNrZXJcbiAqIGJlaGF2aW9yIG9yIGFwcGVhcmFuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBUSU1FUElDS0VSX0NPTlRST0wgPSBuZXcgSW5qZWN0aW9uVG9rZW48VGltZXBpY2tlckNvbXBvbmVudD4oJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL3RpbWVwaWNrZXI6OlRpbWVwaWNrZXJDb21wb25lbnQnKTtcbiJdfQ==
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Generates an array of time stamps within a 24-hour period based on the specified step interval.
3
+ * The time stamps can be formatted in 24-hour format or 12-hour format with AM/PM based on locale preference.
4
+ *
5
+ * @param {number} step - The interval, in minutes, between each time stamp.
6
+ * @param {boolean} useLocale - Determines if the time stamps should use the 12-hour format with AM/PM (`true`) or the 24-hour format (`false`).
7
+ * @returns {string[]} An array of formatted time stamps as strings.
8
+ * @example
9
+ * // Generate time stamps every 30 minutes using 24-hour format
10
+ * generateTimeStamps(30, false);
11
+ * // Returns ["00:00", "00:30", "01:00", ..., "23:30"]
12
+ *
13
+ * @example
14
+ * // Generate time stamps every 60 minutes using 12-hour format with AM/PM
15
+ * generateTimeStamps(60, true);
16
+ * // Returns ["12:00 AM", "01:00 AM", ..., "11:00 PM"]
17
+ */
18
+ export function generateTimeStamps(step, useLocale) {
19
+ const roundedStep = Math.round(step);
20
+ return Array.from({ length: Math.ceil(24 * (60 / roundedStep)) }, (_, i) => {
21
+ const hours = Math.floor((i * roundedStep) / 60);
22
+ const minutes = (i * roundedStep) % 60;
23
+ return formatTime(hours, minutes, useLocale);
24
+ });
25
+ }
26
+ /**
27
+ * Formats a given time as a string based on the specified hour, minute, and locale preference.
28
+ * Can format time in either 24-hour format or 12-hour format with AM/PM.
29
+ *
30
+ * @param {number} hours - The hour component of the time.
31
+ * @param {number} minutes - The minute component of the time.
32
+ * @param {boolean} useLocale - Determines if the time should be formatted using the 12-hour format with AM/PM (`true`) or the 24-hour format (`false`).
33
+ * @returns {string} The formatted time as a string.
34
+ * @example
35
+ * // Format time using 24-hour format
36
+ * formatTime(14, 30, false); // "14:30"
37
+ *
38
+ * @example
39
+ * // Format time using 12-hour format with AM/PM
40
+ * formatTime(14, 30, true); // "2:30 PM"
41
+ */
42
+ function formatTime(hours, minutes, useLocale) {
43
+ if (useLocale) {
44
+ const period = hours >= 12 ? 'PM' : 'AM';
45
+ const displayHours = hours % 12 === 0 ? 12 : hours % 12;
46
+ return `${displayHours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')} ${period}`;
47
+ }
48
+ else {
49
+ return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
50
+ }
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtdGltZS1zdGFtcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdXRpbHMvZ2VuZXJhdGUtdGltZS1zdGFtcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBWSxFQUFFLFNBQWtCO0lBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQUUsU0FBa0I7SUFDcEUsSUFBSSxTQUFTLEVBQUU7UUFDYixNQUFNLE1BQU0sR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxLQUFLLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3hELE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztLQUN2RztTQUFNO1FBQ0wsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7S0FDdEY7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZXMgYW4gYXJyYXkgb2YgdGltZSBzdGFtcHMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBzdGVwIGludGVydmFsLlxuICogVGhlIHRpbWUgc3RhbXBzIGNhbiBiZSBmb3JtYXR0ZWQgaW4gMjQtaG91ciBmb3JtYXQgb3IgMTItaG91ciBmb3JtYXQgd2l0aCBBTS9QTSBiYXNlZCBvbiBsb2NhbGUgcHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCAtIFRoZSBpbnRlcnZhbCwgaW4gbWludXRlcywgYmV0d2VlbiBlYWNoIHRpbWUgc3RhbXAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHVzZUxvY2FsZSAtIERldGVybWluZXMgaWYgdGhlIHRpbWUgc3RhbXBzIHNob3VsZCB1c2UgdGhlIDEyLWhvdXIgZm9ybWF0IHdpdGggQU0vUE0gKGB0cnVlYCkgb3IgdGhlIDI0LWhvdXIgZm9ybWF0IChgZmFsc2VgKS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgZm9ybWF0dGVkIHRpbWUgc3RhbXBzIGFzIHN0cmluZ3MuXG4gKiBAZXhhbXBsZVxuICogLy8gR2VuZXJhdGUgdGltZSBzdGFtcHMgZXZlcnkgMzAgbWludXRlcyB1c2luZyAyNC1ob3VyIGZvcm1hdFxuICogZ2VuZXJhdGVUaW1lU3RhbXBzKDMwLCBmYWxzZSk7XG4gKiAvLyBSZXR1cm5zIFtcIjAwOjAwXCIsIFwiMDA6MzBcIiwgXCIwMTowMFwiLCAuLi4sIFwiMjM6MzBcIl1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2VuZXJhdGUgdGltZSBzdGFtcHMgZXZlcnkgNjAgbWludXRlcyB1c2luZyAxMi1ob3VyIGZvcm1hdCB3aXRoIEFNL1BNXG4gKiBnZW5lcmF0ZVRpbWVTdGFtcHMoNjAsIHRydWUpO1xuICogLy8gUmV0dXJucyBbXCIxMjowMCBBTVwiLCBcIjAxOjAwIEFNXCIsIC4uLiwgXCIxMTowMCBQTVwiXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUaW1lU3RhbXBzKHN0ZXA6IG51bWJlciwgdXNlTG9jYWxlOiBib29sZWFuKTogc3RyaW5nW10ge1xuICBjb25zdCByb3VuZGVkU3RlcCA9IE1hdGgucm91bmQoc3RlcCk7XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGguY2VpbCgyNCAqICg2MCAvIHJvdW5kZWRTdGVwKSkgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKGkgKiByb3VuZGVkU3RlcCkgLyA2MCk7XG4gICAgY29uc3QgbWludXRlcyA9IChpICogcm91bmRlZFN0ZXApICUgNjA7XG4gICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHVzZUxvY2FsZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBnaXZlbiB0aW1lIGFzIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgaG91ciwgbWludXRlLCBhbmQgbG9jYWxlIHByZWZlcmVuY2UuXG4gKiBDYW4gZm9ybWF0IHRpbWUgaW4gZWl0aGVyIDI0LWhvdXIgZm9ybWF0IG9yIDEyLWhvdXIgZm9ybWF0IHdpdGggQU0vUE0uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGhvdXJzIC0gVGhlIGhvdXIgY29tcG9uZW50IG9mIHRoZSB0aW1lLlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbnV0ZXMgLSBUaGUgbWludXRlIGNvbXBvbmVudCBvZiB0aGUgdGltZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlTG9jYWxlIC0gRGV0ZXJtaW5lcyBpZiB0aGUgdGltZSBzaG91bGQgYmUgZm9ybWF0dGVkIHVzaW5nIHRoZSAxMi1ob3VyIGZvcm1hdCB3aXRoIEFNL1BNIChgdHJ1ZWApIG9yIHRoZSAyNC1ob3VyIGZvcm1hdCAoYGZhbHNlYCkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHRpbWUgYXMgYSBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICogLy8gRm9ybWF0IHRpbWUgdXNpbmcgMjQtaG91ciBmb3JtYXRcbiAqIGZvcm1hdFRpbWUoMTQsIDMwLCBmYWxzZSk7IC8vIFwiMTQ6MzBcIlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3JtYXQgdGltZSB1c2luZyAxMi1ob3VyIGZvcm1hdCB3aXRoIEFNL1BNXG4gKiBmb3JtYXRUaW1lKDE0LCAzMCwgdHJ1ZSk7IC8vIFwiMjozMCBQTVwiXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFRpbWUoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCB1c2VMb2NhbGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAodXNlTG9jYWxlKSB7XG4gICAgY29uc3QgcGVyaW9kID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICBjb25zdCBkaXNwbGF5SG91cnMgPSBob3VycyAlIDEyID09PSAwID8gMTIgOiBob3VycyAlIDEyO1xuICAgIHJldHVybiBgJHtkaXNwbGF5SG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke21pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfSAke3BlcmlvZH1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './generate-time-stamps';
2
+ export * from './ngx-mask-helper';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nZW5lcmF0ZS10aW1lLXN0YW1wcyc7XG5leHBvcnQgKiBmcm9tICcuL25neC1tYXNrLWhlbHBlcic7XG4iXX0=
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Processes and formats a time input value based on specific rules. It adjusts the input for valid time format,
3
+ * especially focusing on single-digit hour inputs, ensuring minute values start with 0 if the last digit is greater
4
+ * than 5, and appending 'M' to AM/PM indicators.
5
+ *
6
+ * @param {string} value - The current input value of the time field.
7
+ * @param {InputEvent} event - The input event triggered by the user's interaction with the field.
8
+ * @returns {string} The processed and potentially reformatted value.
9
+ *
10
+ * @example
11
+ * // Prepend 0 to single-digit hours greater than 1
12
+ * processInputValue("2", { inputType: "insertText" }); // Returns "02"
13
+ *
14
+ * @example
15
+ * // Ensure minute values are within valid ranges
16
+ * processInputValue("11:8", { inputType: "insertText" }); // Returns "11:08"
17
+ *
18
+ * @example
19
+ * // Append 'M' to AM/PM indicators
20
+ * processInputValue("2 p", { inputType: "insertText" }); // Returns "2 PM"
21
+ */
22
+ export function processInputValue(value, event) {
23
+ if (value.length === 1 && Number(value) > 1) {
24
+ value = `0${value}`;
25
+ }
26
+ else if (value.length === 4 && Number(value.at(-1)) > 5) {
27
+ value = `${value.slice(0, -1)}0${value.slice(-1)}`;
28
+ }
29
+ if (/[AaPp]/.test(value) && event.inputType === 'insertText') {
30
+ value = `${value.toUpperCase()}M`;
31
+ }
32
+ return value;
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2staGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGltZXBpY2tlci9zcmMvbGliL3V0aWxzL25neC1tYXNrLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBYSxFQUFFLEtBQWlCO0lBQ2hFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMzQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztLQUNyQjtTQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN6RCxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3BEO0lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssWUFBWSxFQUFFO1FBQzVELEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO0tBQ25DO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm9jZXNzZXMgYW5kIGZvcm1hdHMgYSB0aW1lIGlucHV0IHZhbHVlIGJhc2VkIG9uIHNwZWNpZmljIHJ1bGVzLiBJdCBhZGp1c3RzIHRoZSBpbnB1dCBmb3IgdmFsaWQgdGltZSBmb3JtYXQsXG4gKiBlc3BlY2lhbGx5IGZvY3VzaW5nIG9uIHNpbmdsZS1kaWdpdCBob3VyIGlucHV0cywgZW5zdXJpbmcgbWludXRlIHZhbHVlcyBzdGFydCB3aXRoIDAgaWYgdGhlIGxhc3QgZGlnaXQgaXMgZ3JlYXRlclxuICogdGhhbiA1LCBhbmQgYXBwZW5kaW5nICdNJyB0byBBTS9QTSBpbmRpY2F0b3JzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBjdXJyZW50IGlucHV0IHZhbHVlIG9mIHRoZSB0aW1lIGZpZWxkLlxuICogQHBhcmFtIHtJbnB1dEV2ZW50fSBldmVudCAtIFRoZSBpbnB1dCBldmVudCB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIncyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBmaWVsZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgYW5kIHBvdGVudGlhbGx5IHJlZm9ybWF0dGVkIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQcmVwZW5kIDAgdG8gc2luZ2xlLWRpZ2l0IGhvdXJzIGdyZWF0ZXIgdGhhbiAxXG4gKiBwcm9jZXNzSW5wdXRWYWx1ZShcIjJcIiwgeyBpbnB1dFR5cGU6IFwiaW5zZXJ0VGV4dFwiIH0pOyAvLyBSZXR1cm5zIFwiMDJcIlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFbnN1cmUgbWludXRlIHZhbHVlcyBhcmUgd2l0aGluIHZhbGlkIHJhbmdlc1xuICogcHJvY2Vzc0lucHV0VmFsdWUoXCIxMTo4XCIsIHsgaW5wdXRUeXBlOiBcImluc2VydFRleHRcIiB9KTsgLy8gUmV0dXJucyBcIjExOjA4XCJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXBwZW5kICdNJyB0byBBTS9QTSBpbmRpY2F0b3JzXG4gKiBwcm9jZXNzSW5wdXRWYWx1ZShcIjIgcFwiLCB7IGlucHV0VHlwZTogXCJpbnNlcnRUZXh0XCIgfSk7IC8vIFJldHVybnMgXCIyIFBNXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcsIGV2ZW50OiBJbnB1dEV2ZW50KTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSAmJiBOdW1iZXIodmFsdWUpID4gMSkge1xuICAgIHZhbHVlID0gYDAke3ZhbHVlfWA7XG4gIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID09PSA0ICYmIE51bWJlcih2YWx1ZS5hdCgtMSkpID4gNSkge1xuICAgIHZhbHVlID0gYCR7dmFsdWUuc2xpY2UoMCwgLTEpfTAke3ZhbHVlLnNsaWNlKC0xKX1gO1xuICB9XG5cbiAgaWYgKC9bQWFQcF0vLnRlc3QodmFsdWUpICYmIGV2ZW50LmlucHV0VHlwZSA9PT0gJ2luc2VydFRleHQnKSB7XG4gICAgdmFsdWUgPSBgJHt2YWx1ZS50b1VwcGVyQ2FzZSgpfU1gO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2R4LWFuZ3VsYXItY29tcG9uZW50cy10aW1lcGlja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGltZXBpY2tlci9zcmMvb2R4LWFuZ3VsYXItY29tcG9uZW50cy10aW1lcGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -1,10 +1,11 @@
1
1
  import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';
2
- import { createConfigTokens } from '@odx/angular/utils';
2
+ import { createConfigTokens, getLanguageCode } from '@odx/angular/utils';
3
3
  import { LocalizationService } from './localization.service';
4
- export const DEFAULT_AVAILABLE_LANGUAGES = ['en', 'de', 'es', 'fr', 'ja'];
4
+ export const DEFAULT_AVAILABLE_LOCALES = ['en-US', 'en-GB', 'de-DE', 'es-ES', 'fr-FR', 'fr-CA'];
5
+ export const DEFAULT_AVAILABLE_LANGUAGES = Array.from(new Set(DEFAULT_AVAILABLE_LOCALES.map(getLanguageCode)));
5
6
  export const { LocalizationConfig, LocalizationDefaultConfig, injectLocalizationConfig, provideLocalizationConfig } = createConfigTokens('Localization', '@odx/angular/internal/translate', {
6
7
  availableLanguages: DEFAULT_AVAILABLE_LANGUAGES,
7
- availableLocales: DEFAULT_AVAILABLE_LANGUAGES,
8
+ availableLocales: DEFAULT_AVAILABLE_LOCALES,
8
9
  });
9
10
  export function provideLocalization(config, ...features) {
10
11
  return makeEnvironmentProviders([
@@ -18,4 +19,4 @@ export function provideLocalization(config, ...features) {
18
19
  features,
19
20
  ]);
20
21
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9sb2NhbGl6YXRpb24vc3JjL2xpYi9sb2NhbGl6YXRpb24uY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBTzFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxrQkFBa0IsQ0FDdEksY0FBYyxFQUNkLGlDQUFpQyxFQUNqQztJQUNFLGtCQUFrQixFQUFFLDJCQUEyQjtJQUMvQyxnQkFBZ0IsRUFBRSwyQkFBMkI7Q0FDeEIsQ0FDeEIsQ0FBQztBQUVGLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFtQyxFQUFFLEdBQUcsUUFBK0I7SUFDekcsT0FBTyx3QkFBd0IsQ0FBQztRQUM5Qix5QkFBeUIsQ0FBQyxNQUFNLENBQUM7UUFDakM7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsQ0FBQyxtQkFBd0MsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUU7WUFDeEcsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDM0IsS0FBSyxFQUFFLElBQUk7U0FDWjtRQUNELFFBQVE7S0FDVCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBQX0lOSVRJQUxJWkVSLCBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVDb25maWdUb2tlbnMgfSBmcm9tICdAb2R4L2FuZ3VsYXIvdXRpbHMnO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4vbG9jYWxpemF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VMb2FkZXJGbiwgTG9jYWxpemF0aW9uRmVhdHVyZSB9IGZyb20gJy4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVZBSUxBQkxFX0xBTkdVQUdFUyA9IFsnZW4nLCAnZGUnLCAnZXMnLCAnZnInLCAnamEnXTtcblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGl6YXRpb25Db25maWcge1xuICBhY3RpdmVMYW5ndWFnZUxvYWRlcj86IExhbmd1YWdlTG9hZGVyRm47XG4gIGF2YWlsYWJsZUxhbmd1YWdlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCB7IExvY2FsaXphdGlvbkNvbmZpZywgTG9jYWxpemF0aW9uRGVmYXVsdENvbmZpZywgaW5qZWN0TG9jYWxpemF0aW9uQ29uZmlnLCBwcm92aWRlTG9jYWxpemF0aW9uQ29uZmlnIH0gPSBjcmVhdGVDb25maWdUb2tlbnMoXG4gICdMb2NhbGl6YXRpb24nLFxuICAnQG9keC9hbmd1bGFyL2ludGVybmFsL3RyYW5zbGF0ZScsXG4gIHtcbiAgICBhdmFpbGFibGVMYW5ndWFnZXM6IERFRkFVTFRfQVZBSUxBQkxFX0xBTkdVQUdFUyxcbiAgICBhdmFpbGFibGVMb2NhbGVzOiBERUZBVUxUX0FWQUlMQUJMRV9MQU5HVUFHRVMsXG4gIH0gYXMgTG9jYWxpemF0aW9uQ29uZmlnLFxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVMb2NhbGl6YXRpb24oY29uZmlnOiBQYXJ0aWFsPExvY2FsaXphdGlvbkNvbmZpZz4sIC4uLmZlYXR1cmVzOiBMb2NhbGl6YXRpb25GZWF0dXJlW10pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHByb3ZpZGVMb2NhbGl6YXRpb25Db25maWcoY29uZmlnKSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICB1c2VGYWN0b3J5OiAobG9jYWxpemF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSkgPT4gKCkgPT4gbG9jYWxpemF0aW9uU2VydmljZS5sb2FkQWN0aXZlTGFuZ3VhZ2UoKSxcbiAgICAgIGRlcHM6IFtMb2NhbGl6YXRpb25TZXJ2aWNlXSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAgZmVhdHVyZXMsXG4gIF0pO1xufVxuIl19
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9sb2NhbGl6YXRpb24vc3JjL2xpYi9sb2NhbGl6YXRpb24uY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc3RCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEcsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBUS9HLE1BQU0sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxrQkFBa0IsQ0FDdEksY0FBYyxFQUNkLGlDQUFpQyxFQUNqQztJQUNFLGtCQUFrQixFQUFFLDJCQUEyQjtJQUMvQyxnQkFBZ0IsRUFBRSx5QkFBeUI7Q0FDdEIsQ0FDeEIsQ0FBQztBQUVGLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFtQyxFQUFFLEdBQUcsUUFBK0I7SUFDekcsT0FBTyx3QkFBd0IsQ0FBQztRQUM5Qix5QkFBeUIsQ0FBQyxNQUFNLENBQUM7UUFDakM7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsQ0FBQyxtQkFBd0MsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUU7WUFDeEcsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDM0IsS0FBSyxFQUFFLElBQUk7U0FDWjtRQUNELFFBQVE7S0FDVCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBQX0lOSVRJQUxJWkVSLCBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVDb25maWdUb2tlbnMsIGdldExhbmd1YWdlQ29kZSB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBMYW5ndWFnZUxvYWRlckZuLCBMb2NhbGl6YXRpb25GZWF0dXJlIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BVkFJTEFCTEVfTE9DQUxFUyA9IFsnZW4tVVMnLCAnZW4tR0InLCAnZGUtREUnLCAnZXMtRVMnLCAnZnItRlInLCAnZnItQ0EnXTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0FWQUlMQUJMRV9MQU5HVUFHRVMgPSBBcnJheS5mcm9tKG5ldyBTZXQoREVGQVVMVF9BVkFJTEFCTEVfTE9DQUxFUy5tYXAoZ2V0TGFuZ3VhZ2VDb2RlKSkpO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsaXphdGlvbkNvbmZpZyB7XG4gIGFjdGl2ZUxhbmd1YWdlTG9hZGVyPzogTGFuZ3VhZ2VMb2FkZXJGbjtcbiAgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBzdHJpbmdbXTtcbiAgYXZhaWxhYmxlTG9jYWxlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCB7IExvY2FsaXphdGlvbkNvbmZpZywgTG9jYWxpemF0aW9uRGVmYXVsdENvbmZpZywgaW5qZWN0TG9jYWxpemF0aW9uQ29uZmlnLCBwcm92aWRlTG9jYWxpemF0aW9uQ29uZmlnIH0gPSBjcmVhdGVDb25maWdUb2tlbnMoXG4gICdMb2NhbGl6YXRpb24nLFxuICAnQG9keC9hbmd1bGFyL2ludGVybmFsL3RyYW5zbGF0ZScsXG4gIHtcbiAgICBhdmFpbGFibGVMYW5ndWFnZXM6IERFRkFVTFRfQVZBSUxBQkxFX0xBTkdVQUdFUyxcbiAgICBhdmFpbGFibGVMb2NhbGVzOiBERUZBVUxUX0FWQUlMQUJMRV9MT0NBTEVTLFxuICB9IGFzIExvY2FsaXphdGlvbkNvbmZpZyxcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlTG9jYWxpemF0aW9uKGNvbmZpZzogUGFydGlhbDxMb2NhbGl6YXRpb25Db25maWc+LCAuLi5mZWF0dXJlczogTG9jYWxpemF0aW9uRmVhdHVyZVtdKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICBwcm92aWRlTG9jYWxpemF0aW9uQ29uZmlnKGNvbmZpZyksXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKGxvY2FsaXphdGlvblNlcnZpY2U6IExvY2FsaXphdGlvblNlcnZpY2UpID0+ICgpID0+IGxvY2FsaXphdGlvblNlcnZpY2UubG9hZEFjdGl2ZUxhbmd1YWdlKCksXG4gICAgICBkZXBzOiBbTG9jYWxpemF0aW9uU2VydmljZV0sXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIGZlYXR1cmVzLFxuICBdKTtcbn1cbiJdfQ==