@oneluiz/dual-datepicker 4.0.0 → 4.0.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/README.md +26 -2
  2. package/fesm2022/oneluiz-dual-datepicker.mjs +75 -71
  3. package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
  4. package/package.json +8 -9
  5. package/types/oneluiz-dual-datepicker.d.ts +1618 -0
  6. package/dual-datepicker.component.d.ts +0 -243
  7. package/esm2022/core/built-in-presets.mjs +0 -289
  8. package/esm2022/core/calendar-grid/cache.config.mjs +0 -35
  9. package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +0 -98
  10. package/esm2022/core/calendar-grid/calendar-grid.factory.mjs +0 -97
  11. package/esm2022/core/calendar-grid/calendar-grid.types.mjs +0 -8
  12. package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +0 -200
  13. package/esm2022/core/calendar-grid/range-highlighter.mjs +0 -185
  14. package/esm2022/core/calendar-grid/range-highlighter.types.mjs +0 -11
  15. package/esm2022/core/calendar-grid/virtual-weeks.logic.mjs +0 -149
  16. package/esm2022/core/calendar-grid/virtual-weeks.types.mjs +0 -11
  17. package/esm2022/core/date-adapter.mjs +0 -77
  18. package/esm2022/core/date-clock.mjs +0 -65
  19. package/esm2022/core/dual-date-range.store.mjs +0 -329
  20. package/esm2022/core/internal.mjs +0 -92
  21. package/esm2022/core/native-date-adapter.mjs +0 -286
  22. package/esm2022/core/preset-providers.mjs +0 -243
  23. package/esm2022/core/preset-registry.mjs +0 -277
  24. package/esm2022/core/preset.engine.mjs +0 -179
  25. package/esm2022/core/public.mjs +0 -94
  26. package/esm2022/core/range-preset.plugin.mjs +0 -70
  27. package/esm2022/core/range.validator.mjs +0 -105
  28. package/esm2022/core/system-clock.mjs +0 -34
  29. package/esm2022/core/testing/date.helpers.mjs +0 -49
  30. package/esm2022/core/testing/fixed-clock.mjs +0 -30
  31. package/esm2022/core/testing/index.mjs +0 -8
  32. package/esm2022/dual-datepicker.component.mjs +0 -1314
  33. package/esm2022/oneluiz-dual-datepicker.mjs +0 -5
  34. package/esm2022/public-api.mjs +0 -43
  35. package/index.d.ts +0 -5
  36. package/public-api.d.ts +0 -44
@@ -1,329 +0,0 @@
1
- /**
2
- * Headless Date Range Store using Angular Signals
3
- *
4
- * Version: 3.5.1
5
- *
6
- * Architecture:
7
- * - State lives HERE, not in UI component
8
- * - Deterministic: no hidden side effects
9
- * - SSR-compatible: no window/document dependencies
10
- * - Timezone-safe: uses DateAdapter for all date operations
11
- * - Testable: pure signal-based state
12
- * - Reusable: inject anywhere (services, components, guards)
13
- *
14
- * Usage:
15
- * ```typescript
16
- * // In component
17
- * const rangeStore = inject(DualDateRangeStore);
18
- * rangeStore.applyPreset('THIS_MONTH');
19
- *
20
- * // In service (headless!)
21
- * const store = inject(DualDateRangeStore);
22
- * const range = store.range();
23
- * this.http.get(`/api/sales?start=${range.start}&end=${range.end}`);
24
- * ```
25
- */
26
- import { Injectable, signal, computed, inject } from '@angular/core';
27
- import { validateRangeOrder, validateRangeBounds, isDateDisabled, applyBounds } from './range.validator';
28
- import { PresetEngine } from './preset.engine';
29
- import { DATE_CLOCK } from './date-clock';
30
- import { SystemClock } from './system-clock';
31
- import { DATE_ADAPTER } from './date-adapter';
32
- import { NativeDateAdapter } from './native-date-adapter';
33
- import * as i0 from "@angular/core";
34
- export class DualDateRangeStore {
35
- // Dependency Injection - SSR-Safe & Timezone-Safe
36
- presetEngine = inject(PresetEngine);
37
- clock;
38
- adapter;
39
- constructor() {
40
- // Try to inject DATE_CLOCK, fallback to SystemClock if not provided
41
- try {
42
- this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();
43
- }
44
- catch {
45
- // In case inject() fails (e.g., called outside injection context)
46
- this.clock = new SystemClock();
47
- }
48
- // Try to inject DATE_ADAPTER, fallback to NativeDateAdapter if not provided
49
- try {
50
- this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();
51
- }
52
- catch {
53
- this.adapter = new NativeDateAdapter();
54
- }
55
- }
56
- // Configuration
57
- config = signal({
58
- enableTimePicker: false,
59
- defaultStartTime: '00:00',
60
- defaultEndTime: '23:59'
61
- });
62
- // Core state - using signals
63
- _startDate = signal(null);
64
- _endDate = signal(null);
65
- _leftMonth = signal(new Date());
66
- _rightMonth = signal(this.getNextMonth(new Date()));
67
- _selectingStart = signal(true);
68
- // Time state
69
- _startTime = signal('00:00');
70
- _endTime = signal('23:59');
71
- // Pending state for requireApply mode
72
- _pendingStart = signal(null);
73
- _pendingEnd = signal(null);
74
- _hasPendingChanges = signal(false);
75
- // Public read-only signals
76
- startDate = this._startDate.asReadonly();
77
- endDate = this._endDate.asReadonly();
78
- leftMonth = this._leftMonth.asReadonly();
79
- rightMonth = this._rightMonth.asReadonly();
80
- selectingStart = this._selectingStart.asReadonly();
81
- startTime = this._startTime.asReadonly();
82
- endTime = this._endTime.asReadonly();
83
- hasPendingChanges = this._hasPendingChanges.asReadonly();
84
- // Computed: ISO range for API consumption
85
- range = computed(() => {
86
- const start = this._startDate();
87
- const end = this._endDate();
88
- const cfg = this.config();
89
- const result = {
90
- start: this.adapter.toISODate(start),
91
- end: this.adapter.toISODate(end)
92
- };
93
- if (cfg.enableTimePicker) {
94
- result.startTime = this._startTime();
95
- result.endTime = this._endTime();
96
- }
97
- return result;
98
- });
99
- // Computed: validation state
100
- isValid = computed(() => {
101
- const start = this._startDate();
102
- const end = this._endDate();
103
- const cfg = this.config();
104
- const orderValidation = validateRangeOrder(start, end);
105
- if (!orderValidation.valid)
106
- return false;
107
- const boundsValidation = validateRangeBounds(start, end, cfg.minDate, cfg.maxDate);
108
- return boundsValidation.valid;
109
- });
110
- // Computed: range text for display
111
- rangeText = computed(() => {
112
- const start = this._startDate();
113
- const end = this._endDate();
114
- if (!start && !end)
115
- return '';
116
- if (!start)
117
- return `? - ${this.formatDateShort(end)}`;
118
- if (!end)
119
- return `${this.formatDateShort(start)}`;
120
- return `${this.formatDateShort(start)} - ${this.formatDateShort(end)}`;
121
- });
122
- /**
123
- * Configure the store
124
- */
125
- configure(config) {
126
- this.config.update(current => ({ ...current, ...config }));
127
- }
128
- /**
129
- * Set start date (with validation)
130
- */
131
- setStart(date) {
132
- const parsedDate = this.parseDate(date);
133
- if (parsedDate) {
134
- const cfg = this.config();
135
- // Apply bounds
136
- const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
137
- // Check if disabled
138
- if (isDateDisabled(boundedDate, cfg.disabledDates)) {
139
- console.warn('Cannot select disabled date');
140
- return;
141
- }
142
- this._startDate.set(boundedDate);
143
- this._selectingStart.set(false);
144
- // Auto-adjust end if it becomes invalid
145
- const end = this._endDate();
146
- if (end && end < boundedDate) {
147
- this._endDate.set(null);
148
- }
149
- }
150
- else {
151
- this._startDate.set(null);
152
- }
153
- }
154
- /**
155
- * Set end date (with validation)
156
- */
157
- setEnd(date) {
158
- const parsedDate = this.parseDate(date);
159
- if (parsedDate) {
160
- const cfg = this.config();
161
- // Apply bounds
162
- const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
163
- // Check if disabled
164
- if (isDateDisabled(boundedDate, cfg.disabledDates)) {
165
- console.warn('Cannot select disabled date');
166
- return;
167
- }
168
- // Validate order
169
- const start = this._startDate();
170
- if (start && boundedDate < start) {
171
- console.warn('End date cannot be before start date');
172
- return;
173
- }
174
- this._endDate.set(boundedDate);
175
- this._selectingStart.set(true); // Ready for next selection
176
- }
177
- else {
178
- this._endDate.set(null);
179
- }
180
- }
181
- /**
182
- * Set complete range at once
183
- */
184
- setRange(start, end) {
185
- this.setStart(start);
186
- this.setEnd(end);
187
- }
188
- /**
189
- * Set pending selection (for requireApply mode)
190
- */
191
- setPendingStart(date) {
192
- const parsedDate = this.parseDate(date);
193
- this._pendingStart.set(parsedDate);
194
- this._hasPendingChanges.set(true);
195
- }
196
- setPendingEnd(date) {
197
- const parsedDate = this.parseDate(date);
198
- this._pendingEnd.set(parsedDate);
199
- this._hasPendingChanges.set(true);
200
- }
201
- /**
202
- * Apply pending changes
203
- */
204
- applyPending() {
205
- const pendingStart = this._pendingStart();
206
- const pendingEnd = this._pendingEnd();
207
- if (pendingStart)
208
- this.setStart(pendingStart);
209
- if (pendingEnd)
210
- this.setEnd(pendingEnd);
211
- this.clearPending();
212
- }
213
- /**
214
- * Cancel pending changes
215
- */
216
- cancelPending() {
217
- this.clearPending();
218
- }
219
- clearPending() {
220
- this._pendingStart.set(null);
221
- this._pendingEnd.set(null);
222
- this._hasPendingChanges.set(false);
223
- }
224
- /**
225
- * Reset to empty state
226
- */
227
- reset() {
228
- this._startDate.set(null);
229
- this._endDate.set(null);
230
- this._selectingStart.set(true);
231
- this.clearPending();
232
- }
233
- /**
234
- * Apply a preset by key
235
- *
236
- * SSR-Safe: Uses injected DateClock for deterministic resolution
237
- *
238
- * @param presetKey - Preset identifier (e.g., 'TODAY', 'LAST_7_DAYS')
239
- * @param now - Optional date override (defaults to clock.now())
240
- */
241
- applyPreset(presetKey, now) {
242
- const currentDate = now ?? this.clock.now();
243
- const range = this.presetEngine.resolve(presetKey, currentDate);
244
- if (range) {
245
- this.setRange(range.start, range.end);
246
- }
247
- else {
248
- console.warn(`Preset "${presetKey}" not found`);
249
- }
250
- }
251
- /**
252
- * Navigate left calendar month
253
- */
254
- setLeftMonth(date) {
255
- this._leftMonth.set(date);
256
- // Ensure right month is always after left
257
- const right = this._rightMonth();
258
- if (right <= date) {
259
- this._rightMonth.set(this.getNextMonth(date));
260
- }
261
- }
262
- /**
263
- * Navigate right calendar month
264
- */
265
- setRightMonth(date) {
266
- this._rightMonth.set(date);
267
- // Ensure left month is always before right
268
- const left = this._leftMonth();
269
- if (left >= date) {
270
- this._leftMonth.set(this.getPreviousMonth(date));
271
- }
272
- }
273
- /**
274
- * Set time values
275
- */
276
- setStartTime(time) {
277
- this._startTime.set(time);
278
- }
279
- setEndTime(time) {
280
- this._endTime.set(time);
281
- }
282
- /**
283
- * Get current state as snapshot
284
- */
285
- getSnapshot() {
286
- return this.range();
287
- }
288
- /**
289
- * Load state from snapshot
290
- */
291
- loadSnapshot(snapshot) {
292
- this.setRange(snapshot.start, snapshot.end);
293
- if (snapshot.startTime) {
294
- this.setStartTime(snapshot.startTime);
295
- }
296
- if (snapshot.endTime) {
297
- this.setEndTime(snapshot.endTime);
298
- }
299
- }
300
- // Helper methods - using DateAdapter for timezone safety
301
- parseDate(date) {
302
- if (!date)
303
- return null;
304
- if (date instanceof Date)
305
- return this.adapter.normalize(date);
306
- return this.adapter.parseISODate(date);
307
- }
308
- getNextMonth(date) {
309
- return this.adapter.addMonths(date, 1);
310
- }
311
- getPreviousMonth(date) {
312
- return this.adapter.addMonths(date, -1);
313
- }
314
- formatDateShort(date) {
315
- const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
316
- const month = this.adapter.getMonth(date);
317
- const day = this.adapter.getDay(date);
318
- return `${day} ${months[month]}`;
319
- }
320
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
321
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, providedIn: 'root' });
322
- }
323
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, decorators: [{
324
- type: Injectable,
325
- args: [{
326
- providedIn: 'root'
327
- }]
328
- }], ctorParameters: () => [] });
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlLXJhbmdlLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvZHVhbC1kYXRlLXJhbmdlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxXQUFXLEVBR1osTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQXFCMUQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixrREFBa0Q7SUFDMUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwQyxLQUFLLENBQVk7SUFDakIsT0FBTyxDQUFjO0lBRTdCO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxJ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QUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBVTtRQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBVTtRQUNoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsT0FBTyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUNuQyxDQUFDO3dHQTVVVSxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQUZqQixNQUFNOzs0RkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZWFkbGVzcyBEYXRlIFJhbmdlIFN0b3JlIHVzaW5nIEFuZ3VsYXIgU2lnbmFsc1xuICogXG4gKiBWZXJzaW9uOiAzLjUuMVxuICogXG4gKiBBcmNoaXRlY3R1cmU6XG4gKiAtIFN0YXRlIGxpdmVzIEhFUkUsIG5vdCBpbiBVSSBjb21wb25lbnRcbiAqIC0gRGV0ZXJtaW5pc3RpYzogbm8gaGlkZGVuIHNpZGUgZWZmZWN0c1xuICogLSBTU1ItY29tcGF0aWJsZTogbm8gd2luZG93L2RvY3VtZW50IGRlcGVuZGVuY2llc1xuICogLSBUaW1lem9uZS1zYWZlOiB1c2VzIERhdGVBZGFwdGVyIGZvciBhbGwgZGF0ZSBvcGVyYXRpb25zXG4gKiAtIFRlc3RhYmxlOiBwdXJlIHNpZ25hbC1iYXNlZCBzdGF0ZVxuICogLSBSZXVzYWJsZTogaW5qZWN0IGFueXdoZXJlIChzZXJ2aWNlcywgY29tcG9uZW50cywgZ3VhcmRzKVxuICogXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGNvbXBvbmVudFxuICogY29uc3QgcmFuZ2VTdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogcmFuZ2VTdG9yZS5hcHBseVByZXNldCgnVEhJU19NT05USCcpO1xuICogXG4gKiAvLyBJbiBzZXJ2aWNlIChoZWFkbGVzcyEpXG4gKiBjb25zdCBzdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogY29uc3QgcmFuZ2UgPSBzdG9yZS5yYW5nZSgpO1xuICogdGhpcy5odHRwLmdldChgL2FwaS9zYWxlcz9zdGFydD0ke3JhbmdlLnN0YXJ0fSZlbmQ9JHtyYW5nZS5lbmR9YCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgXG4gIHZhbGlkYXRlUmFuZ2VPcmRlciwgXG4gIHZhbGlkYXRlUmFuZ2VCb3VuZHMsIFxuICBpc0RhdGVEaXNhYmxlZCxcbiAgYXBwbHlCb3VuZHMsXG4gIHBhcnNlSVNPRGF0ZSxcbiAgZm9ybWF0SVNPRGF0ZVxufSBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBQcmVzZXRFbmdpbmUsIFByZXNldFJhbmdlIH0gZnJvbSAnLi9wcmVzZXQuZW5naW5lJztcbmltcG9ydCB7IERhdGVDbG9jaywgREFURV9DTE9DSyB9IGZyb20gJy4vZGF0ZS1jbG9jayc7XG5pbXBvcnQgeyBTeXN0ZW1DbG9jayB9IGZyb20gJy4vc3lzdGVtLWNsb2NrJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBEQVRFX0FEQVBURVIgfSBmcm9tICcuL2RhdGUtYWRhcHRlcic7XG5pbXBvcnQgeyBOYXRpdmVEYXRlQWRhcHRlciB9IGZyb20gJy4vbmF0aXZlLWRhdGUtYWRhcHRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlU3RhdGUge1xuICBzdGFydDogc3RyaW5nOyAvLyBJU08gZGF0ZVxuICBlbmQ6IHN0cmluZzsgLy8gSVNPIGRhdGVcbiAgc3RhcnRUaW1lPzogc3RyaW5nOyAvLyBISDptbVxuICBlbmRUaW1lPzogc3RyaW5nOyAvLyBISDptbVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVSYW5nZUNvbmZpZyB7XG4gIG1pbkRhdGU/OiBEYXRlO1xuICBtYXhEYXRlPzogRGF0ZTtcbiAgZGlzYWJsZWREYXRlcz86IERhdGVbXSB8ICgoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbik7XG4gIGVuYWJsZVRpbWVQaWNrZXI/OiBib29sZWFuO1xuICBkZWZhdWx0U3RhcnRUaW1lPzogc3RyaW5nO1xuICBkZWZhdWx0RW5kVGltZT86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRHVhbERhdGVSYW5nZVN0b3JlIHtcbiAgLy8gRGVwZW5kZW5jeSBJbmplY3Rpb24gLSBTU1ItU2FmZSAmIFRpbWV6b25lLVNhZmVcbiAgcHJpdmF0ZSBwcmVzZXRFbmdpbmUgPSBpbmplY3QoUHJlc2V0RW5naW5lKTtcbiAgcHJpdmF0ZSBjbG9jazogRGF0ZUNsb2NrO1xuICBwcml2YXRlIGFkYXB0ZXI6IERhdGVBZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFRyeSB0byBpbmplY3QgREFURV9DTE9DSywgZmFsbGJhY2sgdG8gU3lzdGVtQ2xvY2sgaWYgbm90IHByb3ZpZGVkXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2xvY2sgPSBpbmplY3QoREFURV9DTE9DSywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBuZXcgU3lzdGVtQ2xvY2soKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEluIGNhc2UgaW5qZWN0KCkgZmFpbHMgKGUuZy4sIGNhbGxlZCBvdXRzaWRlIGluamVjdGlvbiBjb250ZXh0KVxuICAgICAgdGhpcy5jbG9jayA9IG5ldyBTeXN0ZW1DbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBpbmplY3QgREFURV9BREFQVEVSLCBmYWxsYmFjayB0byBOYXRpdmVEYXRlQWRhcHRlciBpZiBub3QgcHJvdmlkZWRcbiAgICB0cnkge1xuICAgICAgdGhpcy5hZGFwdGVyID0gaW5qZWN0KERBVEVfQURBUFRFUiwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBuZXcgTmF0aXZlRGF0ZUFkYXB0ZXIoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYWRhcHRlciA9IG5ldyBOYXRpdmVEYXRlQWRhcHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBjb25maWcgPSBzaWduYWw8RGF0ZVJhbmdlQ29uZmlnPih7XG4gICAgZW5hYmxlVGltZVBpY2tlcjogZmFsc2UsXG4gICAgZGVmYXVsdFN0YXJ0VGltZTogJzAwOjAwJyxcbiAgICBkZWZhdWx0RW5kVGltZTogJzIzOjU5J1xuICB9KTtcblxuICAvLyBDb3JlIHN0YXRlIC0gdXNpbmcgc2lnbmFsc1xuICBwcml2YXRlIF9zdGFydERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9lbmREYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfbGVmdE1vbnRoID0gc2lnbmFsPERhdGU+KG5ldyBEYXRlKCkpO1xuICBwcml2YXRlIF9yaWdodE1vbnRoID0gc2lnbmFsPERhdGU+KHRoaXMuZ2V0TmV4dE1vbnRoKG5ldyBEYXRlKCkpKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW5nU3RhcnQgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLy8gVGltZSBzdGF0ZVxuICBwcml2YXRlIF9zdGFydFRpbWUgPSBzaWduYWw8c3RyaW5nPignMDA6MDAnKTtcbiAgcHJpdmF0ZSBfZW5kVGltZSA9IHNpZ25hbDxzdHJpbmc+KCcyMzo1OScpO1xuXG4gIC8vIFBlbmRpbmcgc3RhdGUgZm9yIHJlcXVpcmVBcHBseSBtb2RlXG4gIHByaXZhdGUgX3BlbmRpbmdTdGFydCA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX3BlbmRpbmdFbmQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9oYXNQZW5kaW5nQ2hhbmdlcyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gUHVibGljIHJlYWQtb25seSBzaWduYWxzXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZSA9IHRoaXMuX3N0YXJ0RGF0ZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGVuZERhdGUgPSB0aGlzLl9lbmREYXRlLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgbGVmdE1vbnRoID0gdGhpcy5fbGVmdE1vbnRoLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgcmlnaHRNb250aCA9IHRoaXMuX3JpZ2h0TW9udGguYXNSZWFkb25seSgpO1xuICByZWFkb25seSBzZWxlY3RpbmdTdGFydCA9IHRoaXMuX3NlbGVjdGluZ1N0YXJ0LmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgZW5kVGltZSA9IHRoaXMuX2VuZFRpbWUuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBoYXNQZW5kaW5nQ2hhbmdlcyA9IHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLmFzUmVhZG9ubHkoKTtcblxuICAvLyBDb21wdXRlZDogSVNPIHJhbmdlIGZvciBBUEkgY29uc3VtcHRpb25cbiAgcmVhZG9ubHkgcmFuZ2UgPSBjb21wdXRlZDxEYXRlUmFuZ2VTdGF0ZT4oKCkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fZW5kRGF0ZSgpO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnKCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IERhdGVSYW5nZVN0YXRlID0ge1xuICAgICAgc3RhcnQ6IHRoaXMuYWRhcHRlci50b0lTT0RhdGUoc3RhcnQpLFxuICAgICAgZW5kOiB0aGlzLmFkYXB0ZXIudG9JU09EYXRlKGVuZClcbiAgICB9O1xuXG4gICAgaWYgKGNmZy5lbmFibGVUaW1lUGlja2VyKSB7XG4gICAgICByZXN1bHQuc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lKCk7XG4gICAgICByZXN1bHQuZW5kVGltZSA9IHRoaXMuX2VuZFRpbWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICAvLyBDb21wdXRlZDogdmFsaWRhdGlvbiBzdGF0ZVxuICByZWFkb25seSBpc1ZhbGlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fZW5kRGF0ZSgpO1xuICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnKCk7XG5cbiAgICBjb25zdCBvcmRlclZhbGlkYXRpb24gPSB2YWxpZGF0ZVJhbmdlT3JkZXIoc3RhcnQsIGVuZCk7XG4gICAgaWYgKCFvcmRlclZhbGlkYXRpb24udmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGJvdW5kc1ZhbGlkYXRpb24gPSB2YWxpZGF0ZVJhbmdlQm91bmRzKFxuICAgICAgc3RhcnQsXG4gICAgICBlbmQsXG4gICAgICBjZmcubWluRGF0ZSxcbiAgICAgIGNmZy5tYXhEYXRlXG4gICAgKTtcbiAgICByZXR1cm4gYm91bmRzVmFsaWRhdGlvbi52YWxpZDtcbiAgfSk7XG5cbiAgLy8gQ29tcHV0ZWQ6IHJhbmdlIHRleHQgZm9yIGRpc3BsYXlcbiAgcmVhZG9ubHkgcmFuZ2VUZXh0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fZW5kRGF0ZSgpO1xuXG4gICAgaWYgKCFzdGFydCAmJiAhZW5kKSByZXR1cm4gJyc7XG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIGA/IC0gJHt0aGlzLmZvcm1hdERhdGVTaG9ydChlbmQhKX1gO1xuICAgIGlmICghZW5kKSByZXR1cm4gYCR7dGhpcy5mb3JtYXREYXRlU2hvcnQoc3RhcnQpfWA7XG5cbiAgICByZXR1cm4gYCR7dGhpcy5mb3JtYXREYXRlU2hvcnQoc3RhcnQpfSAtICR7dGhpcy5mb3JtYXREYXRlU2hvcnQoZW5kKX1gO1xuICB9KTtcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBzdG9yZVxuICAgKi9cbiAgY29uZmlndXJlKGNvbmZpZzogUGFydGlhbDxEYXRlUmFuZ2VDb25maWc+KTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcudXBkYXRlKGN1cnJlbnQgPT4gKHsgLi4uY3VycmVudCwgLi4uY29uZmlnIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3RhcnQgZGF0ZSAod2l0aCB2YWxpZGF0aW9uKVxuICAgKi9cbiAgc2V0U3RhcnQoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgXG4gICAgaWYgKHBhcnNlZERhdGUpIHtcbiAgICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgICBcbiAgICAgIC8vIEFwcGx5IGJvdW5kc1xuICAgICAgY29uc3QgYm91bmRlZERhdGUgPSBhcHBseUJvdW5kcyhwYXJzZWREYXRlLCBjZmcubWluRGF0ZSwgY2ZnLm1heERhdGUpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBkaXNhYmxlZFxuICAgICAgaWYgKGlzRGF0ZURpc2FibGVkKGJvdW5kZWREYXRlLCBjZmcuZGlzYWJsZWREYXRlcykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5ub3Qgc2VsZWN0IGRpc2FibGVkIGRhdGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdGFydERhdGUuc2V0KGJvdW5kZWREYXRlKTtcbiAgICAgIHRoaXMuX3NlbGVjdGluZ1N0YXJ0LnNldChmYWxzZSk7XG5cbiAgICAgIC8vIEF1dG8tYWRqdXN0IGVuZCBpZiBpdCBiZWNvbWVzIGludmFsaWRcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcbiAgICAgIGlmIChlbmQgJiYgZW5kIDwgYm91bmRlZERhdGUpIHtcbiAgICAgICAgdGhpcy5fZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0YXJ0RGF0ZS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBlbmQgZGF0ZSAod2l0aCB2YWxpZGF0aW9uKVxuICAgKi9cbiAgc2V0RW5kKGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgIFxuICAgIGlmIChwYXJzZWREYXRlKSB7XG4gICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuICAgICAgXG4gICAgICAvLyBBcHBseSBib3VuZHNcbiAgICAgIGNvbnN0IGJvdW5kZWREYXRlID0gYXBwbHlCb3VuZHMocGFyc2VkRGF0ZSwgY2ZnLm1pbkRhdGUsIGNmZy5tYXhEYXRlKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZGlzYWJsZWRcbiAgICAgIGlmIChpc0RhdGVEaXNhYmxlZChib3VuZGVkRGF0ZSwgY2ZnLmRpc2FibGVkRGF0ZXMpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNlbGVjdCBkaXNhYmxlZCBkYXRlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgb3JkZXJcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3RhcnREYXRlKCk7XG4gICAgICBpZiAoc3RhcnQgJiYgYm91bmRlZERhdGUgPCBzdGFydCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0VuZCBkYXRlIGNhbm5vdCBiZSBiZWZvcmUgc3RhcnQgZGF0ZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VuZERhdGUuc2V0KGJvdW5kZWREYXRlKTtcbiAgICAgIHRoaXMuX3NlbGVjdGluZ1N0YXJ0LnNldCh0cnVlKTsgLy8gUmVhZHkgZm9yIG5leHQgc2VsZWN0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VuZERhdGUuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29tcGxldGUgcmFuZ2UgYXQgb25jZVxuICAgKi9cbiAgc2V0UmFuZ2Uoc3RhcnQ6IERhdGUgfCBzdHJpbmcgfCBudWxsLCBlbmQ6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGFydChzdGFydCk7XG4gICAgdGhpcy5zZXRFbmQoZW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGVuZGluZyBzZWxlY3Rpb24gKGZvciByZXF1aXJlQXBwbHkgbW9kZSlcbiAgICovXG4gIHNldFBlbmRpbmdTdGFydChkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlKTtcbiAgICB0aGlzLl9wZW5kaW5nU3RhcnQuc2V0KHBhcnNlZERhdGUpO1xuICAgIHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLnNldCh0cnVlKTtcbiAgfVxuXG4gIHNldFBlbmRpbmdFbmQoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgdGhpcy5fcGVuZGluZ0VuZC5zZXQocGFyc2VkRGF0ZSk7XG4gICAgdGhpcy5faGFzUGVuZGluZ0NoYW5nZXMuc2V0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHBlbmRpbmcgY2hhbmdlc1xuICAgKi9cbiAgYXBwbHlQZW5kaW5nKCk6IHZvaWQge1xuICAgIGNvbnN0IHBlbmRpbmdTdGFydCA9IHRoaXMuX3BlbmRpbmdTdGFydCgpO1xuICAgIGNvbnN0IHBlbmRpbmdFbmQgPSB0aGlzLl9wZW5kaW5nRW5kKCk7XG5cbiAgICBpZiAocGVuZGluZ1N0YXJ0KSB0aGlzLnNldFN0YXJ0KHBlbmRpbmdTdGFydCk7XG4gICAgaWYgKHBlbmRpbmdFbmQpIHRoaXMuc2V0RW5kKHBlbmRpbmdFbmQpO1xuXG4gICAgdGhpcy5jbGVhclBlbmRpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgcGVuZGluZyBjaGFuZ2VzXG4gICAqL1xuICBjYW5jZWxQZW5kaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQZW5kaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUGVuZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nU3RhcnQuc2V0KG51bGwpO1xuICAgIHRoaXMuX3BlbmRpbmdFbmQuc2V0KG51bGwpO1xuICAgIHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdG8gZW1wdHkgc3RhdGVcbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXJ0RGF0ZS5zZXQobnVsbCk7XG4gICAgdGhpcy5fZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgdGhpcy5fc2VsZWN0aW5nU3RhcnQuc2V0KHRydWUpO1xuICAgIHRoaXMuY2xlYXJQZW5kaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBwcmVzZXQgYnkga2V5XG4gICAqIFxuICAgKiBTU1ItU2FmZTogVXNlcyBpbmplY3RlZCBEYXRlQ2xvY2sgZm9yIGRldGVybWluaXN0aWMgcmVzb2x1dGlvblxuICAgKiBcbiAgICogQHBhcmFtIHByZXNldEtleSAtIFByZXNldCBpZGVudGlmaWVyIChlLmcuLCAnVE9EQVknLCAnTEFTVF83X0RBWVMnKVxuICAgKiBAcGFyYW0gbm93IC0gT3B0aW9uYWwgZGF0ZSBvdmVycmlkZSAoZGVmYXVsdHMgdG8gY2xvY2subm93KCkpXG4gICAqL1xuICBhcHBseVByZXNldChwcmVzZXRLZXk6IHN0cmluZywgbm93PzogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbm93ID8/IHRoaXMuY2xvY2subm93KCk7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLnByZXNldEVuZ2luZS5yZXNvbHZlKHByZXNldEtleSwgY3VycmVudERhdGUpO1xuICAgIFxuICAgIGlmIChyYW5nZSkge1xuICAgICAgdGhpcy5zZXRSYW5nZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXQgXCIke3ByZXNldEtleX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgbGVmdCBjYWxlbmRhciBtb250aFxuICAgKi9cbiAgc2V0TGVmdE1vbnRoKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9sZWZ0TW9udGguc2V0KGRhdGUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSByaWdodCBtb250aCBpcyBhbHdheXMgYWZ0ZXIgbGVmdFxuICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fcmlnaHRNb250aCgpO1xuICAgIGlmIChyaWdodCA8PSBkYXRlKSB7XG4gICAgICB0aGlzLl9yaWdodE1vbnRoLnNldCh0aGlzLmdldE5leHRNb250aChkYXRlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHJpZ2h0IGNhbGVuZGFyIG1vbnRoXG4gICAqL1xuICBzZXRSaWdodE1vbnRoKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9yaWdodE1vbnRoLnNldChkYXRlKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgbGVmdCBtb250aCBpcyBhbHdheXMgYmVmb3JlIHJpZ2h0XG4gICAgY29uc3QgbGVmdCA9IHRoaXMuX2xlZnRNb250aCgpO1xuICAgIGlmIChsZWZ0ID49IGRhdGUpIHtcbiAgICAgIHRoaXMuX2xlZnRNb250aC5zZXQodGhpcy5nZXRQcmV2aW91c01vbnRoKGRhdGUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRpbWUgdmFsdWVzXG4gICAqL1xuICBzZXRTdGFydFRpbWUodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhcnRUaW1lLnNldCh0aW1lKTtcbiAgfVxuXG4gIHNldEVuZFRpbWUodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZW5kVGltZS5zZXQodGltZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc3RhdGUgYXMgc25hcHNob3RcbiAgICovXG4gIGdldFNuYXBzaG90KCk6IERhdGVSYW5nZVN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgc3RhdGUgZnJvbSBzbmFwc2hvdFxuICAgKi9cbiAgbG9hZFNuYXBzaG90KHNuYXBzaG90OiBEYXRlUmFuZ2VTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0UmFuZ2Uoc25hcHNob3Quc3RhcnQsIHNuYXBzaG90LmVuZCk7XG4gICAgXG4gICAgaWYgKHNuYXBzaG90LnN0YXJ0VGltZSkge1xuICAgICAgdGhpcy5zZXRTdGFydFRpbWUoc25hcHNob3Quc3RhcnRUaW1lKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHNuYXBzaG90LmVuZFRpbWUpIHtcbiAgICAgIHRoaXMuc2V0RW5kVGltZShzbmFwc2hvdC5lbmRUaW1lKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kcyAtIHVzaW5nIERhdGVBZGFwdGVyIGZvciB0aW1lem9uZSBzYWZldHlcbiAgcHJpdmF0ZSBwYXJzZURhdGUoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB0aGlzLmFkYXB0ZXIubm9ybWFsaXplKGRhdGUpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucGFyc2VJU09EYXRlKGRhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZXh0TW9udGgoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuYWRkTW9udGhzKGRhdGUsIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmV2aW91c01vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmFkZE1vbnRocyhkYXRlLCAtMSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGVTaG9ydChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSk7XG4gICAgY29uc3QgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERheShkYXRlKTtcbiAgICByZXR1cm4gYCR7ZGF5fSAke21vbnRoc1ttb250aF19YDtcbiAgfVxufVxuIl19
@@ -1,92 +0,0 @@
1
- /**
2
- * INTERNAL API for @oneluiz/dual-datepicker
3
- *
4
- * This file exports implementation details required by the component itself.
5
- * These exports are NOT part of the public API and may change without notice.
6
- *
7
- * ⚠️ DO NOT import from this file in your application code.
8
- * ⚠️ Use the public API from '@oneluiz/dual-datepicker/core' instead.
9
- *
10
- * @internal
11
- * @packageDocumentation
12
- * @since v4.0.0
13
- */
14
- /**
15
- * CalendarGridFactory - Deterministic grid generation
16
- *
17
- * Creates normalized 42-cell grids (6 weeks × 7 days).
18
- * Pure function approach with no side effects.
19
- *
20
- * @internal
21
- */
22
- export { CalendarGridFactory } from './calendar-grid/calendar-grid.factory';
23
- /**
24
- * CalendarGridCache - LRU cache for grid structures
25
- *
26
- * Memoizes calendar grids by month/weekStart/locale.
27
- * Prevents redundant grid generation on re-renders.
28
- *
29
- * @internal
30
- */
31
- export { CalendarGridCache } from './calendar-grid/calendar-grid.cache';
32
- /**
33
- * RangeHighlighter - Pure decoration logic
34
- *
35
- * Applies range highlighting to calendar grids.
36
- * Handles start/end/hover/disabled states.
37
- *
38
- * @internal
39
- */
40
- export { RangeHighlighter } from './calendar-grid/range-highlighter';
41
- /**
42
- * RangeHighlighterCache - LRU cache for decorated grids
43
- *
44
- * Memoizes decorated grids by range parameters.
45
- * Eliminates redundant decoration computations.
46
- *
47
- * @internal
48
- */
49
- export { RangeHighlighterCache } from './calendar-grid/range-highlighter.cache';
50
- /**
51
- * Virtual Weeks Logic
52
- *
53
- * Functions for calculating visible week windows.
54
- * Enables progressive rendering and infinite scroll.
55
- *
56
- * @internal
57
- */
58
- export { getVisibleWeeks, navigateWeekWindow, isVirtualWeeksEnabled } from './calendar-grid/virtual-weeks.logic';
59
- // ============================================================================
60
- // CACHE CONFIGURATION (v3.9.2+)
61
- // ============================================================================
62
- /**
63
- * Cache Configuration
64
- *
65
- * Shared cache size limits for memory safety.
66
- * MAX_CACHE_ENTRIES = 48 (4 years of navigation)
67
- *
68
- * @internal
69
- */
70
- export { MAX_CACHE_ENTRIES } from './calendar-grid/cache.config';
71
- /**
72
- * SystemClock - Default implementation
73
- *
74
- * Uses native Date.now() and new Date().
75
- * Default time source for production.
76
- *
77
- * @internal
78
- */
79
- export { SystemClock } from './system-clock';
80
- // ============================================================================
81
- // TESTING UTILITIES
82
- // ============================================================================
83
- /**
84
- * Testing Helpers
85
- *
86
- * Utilities for writing deterministic tests.
87
- * FixedClock, makeDate, etc.
88
- *
89
- * @internal
90
- */
91
- export * from './testing';
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9pbnRlcm5hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFvQkg7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQXFCeEU7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQW1CaEY7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFDTCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUN0QixNQUFNLHFDQUFxQyxDQUFDO0FBRTdDLCtFQUErRTtBQUMvRSxnQ0FBZ0M7QUFDaEMsK0VBQStFO0FBRS9FOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQWdCakU7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QywrRUFBK0U7QUFDL0Usb0JBQW9CO0FBQ3BCLCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBQ0gsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElOVEVSTkFMIEFQSSBmb3IgQG9uZWx1aXovZHVhbC1kYXRlcGlja2VyXG4gKiBcbiAqIFRoaXMgZmlsZSBleHBvcnRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMgcmVxdWlyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYuXG4gKiBUaGVzZSBleHBvcnRzIGFyZSBOT1QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAqIFxuICog4pqg77iPIERPIE5PVCBpbXBvcnQgZnJvbSB0aGlzIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiBjb2RlLlxuICog4pqg77iPIFVzZSB0aGUgcHVibGljIEFQSSBmcm9tICdAb25lbHVpei9kdWFsLWRhdGVwaWNrZXIvY29yZScgaW5zdGVhZC5cbiAqIFxuICogQGludGVybmFsXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBzaW5jZSB2NC4wLjBcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDQUxFTkRBUiBHUklEIFNZU1RFTSAodjMuNy4wKylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYWxlbmRhciBHcmlkIFR5cGVzXG4gKiBcbiAqIENvcmUgdHlwZXMgZm9yIDQyLWNlbGwgY2FsZW5kYXIgZ3JpZCBzdHJ1Y3R1cmUuXG4gKiBVc2VkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBtb250aCB2aWV3cy5cbiAqIFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ2FsZW5kYXJHcmlkLFxuICBDYWxlbmRhckNlbGwsXG4gIENhbGVuZGFyR3JpZENhY2hlS2V5XG59IGZyb20gJy4vY2FsZW5kYXItZ3JpZC9jYWxlbmRhci1ncmlkLnR5cGVzJztcblxuLyoqXG4gKiBDYWxlbmRhckdyaWRGYWN0b3J5IC0gRGV0ZXJtaW5pc3RpYyBncmlkIGdlbmVyYXRpb25cbiAqIFxuICogQ3JlYXRlcyBub3JtYWxpemVkIDQyLWNlbGwgZ3JpZHMgKDYgd2Vla3Mgw5cgNyBkYXlzKS5cbiAqIFB1cmUgZnVuY3Rpb24gYXBwcm9hY2ggd2l0aCBubyBzaWRlIGVmZmVjdHMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBDYWxlbmRhckdyaWRGYWN0b3J5IH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL2NhbGVuZGFyLWdyaWQuZmFjdG9yeSc7XG5cbi8qKlxuICogQ2FsZW5kYXJHcmlkQ2FjaGUgLSBMUlUgY2FjaGUgZm9yIGdyaWQgc3RydWN0dXJlc1xuICogXG4gKiBNZW1vaXplcyBjYWxlbmRhciBncmlkcyBieSBtb250aC93ZWVrU3RhcnQvbG9jYWxlLlxuICogUHJldmVudHMgcmVkdW5kYW50IGdyaWQgZ2VuZXJhdGlvbiBvbiByZS1yZW5kZXJzLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ2FsZW5kYXJHcmlkQ2FjaGUgfSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvY2FsZW5kYXItZ3JpZC5jYWNoZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJBTkdFIEhJR0hMSUdIVElORyBTWVNURU0gKHYzLjguMCspXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmFuZ2UgSGlnaGxpZ2h0ZXIgVHlwZXNcbiAqIFxuICogVHlwZXMgZm9yIGRlY29yYXRlZCBncmlkcyB3aXRoIHJhbmdlIGhpZ2hsaWdodGluZy5cbiAqIFVzZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdmlzdWFsIGRlY29yYXRpb25zLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUge1xuICBEZWNvcmF0ZWRHcmlkLFxuICBEZWNvcmF0ZWRDZWxsLFxuICBSYW5nZURlY29yYXRpb25QYXJhbXMsXG4gIERlY29yYXRlZEdyaWRDYWNoZUtleVxufSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvcmFuZ2UtaGlnaGxpZ2h0ZXIudHlwZXMnO1xuXG4vKipcbiAqIFJhbmdlSGlnaGxpZ2h0ZXIgLSBQdXJlIGRlY29yYXRpb24gbG9naWNcbiAqIFxuICogQXBwbGllcyByYW5nZSBoaWdobGlnaHRpbmcgdG8gY2FsZW5kYXIgZ3JpZHMuXG4gKiBIYW5kbGVzIHN0YXJ0L2VuZC9ob3Zlci9kaXNhYmxlZCBzdGF0ZXMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBSYW5nZUhpZ2hsaWdodGVyIH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL3JhbmdlLWhpZ2hsaWdodGVyJztcblxuLyoqXG4gKiBSYW5nZUhpZ2hsaWdodGVyQ2FjaGUgLSBMUlUgY2FjaGUgZm9yIGRlY29yYXRlZCBncmlkc1xuICogXG4gKiBNZW1vaXplcyBkZWNvcmF0ZWQgZ3JpZHMgYnkgcmFuZ2UgcGFyYW1ldGVycy5cbiAqIEVsaW1pbmF0ZXMgcmVkdW5kYW50IGRlY29yYXRpb24gY29tcHV0YXRpb25zLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgUmFuZ2VIaWdobGlnaHRlckNhY2hlIH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL3JhbmdlLWhpZ2hsaWdodGVyLmNhY2hlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVklSVFVBTCBXRUVLUyBTWVNURU0gKHYzLjkuMCspXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVmlydHVhbCBXZWVrcyBUeXBlc1xuICogXG4gKiBUeXBlcyBmb3Igd2luZG93ZWQgcmVuZGVyaW5nIG9mIGNhbGVuZGFyIHdlZWtzLlxuICogUmVkdWNlcyBET00gY29tcGxleGl0eSBmb3IgbGFyZ2UgY2FsZW5kYXJzLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUge1xuICBWaXJ0dWFsV2Vla3NDb25maWcsXG4gIFZpcnR1YWxXZWVrV2luZG93XG59IGZyb20gJy4vY2FsZW5kYXItZ3JpZC92aXJ0dWFsLXdlZWtzLnR5cGVzJztcblxuLyoqXG4gKiBWaXJ0dWFsIFdlZWtzIExvZ2ljXG4gKiBcbiAqIEZ1bmN0aW9ucyBmb3IgY2FsY3VsYXRpbmcgdmlzaWJsZSB3ZWVrIHdpbmRvd3MuXG4gKiBFbmFibGVzIHByb2dyZXNzaXZlIHJlbmRlcmluZyBhbmQgaW5maW5pdGUgc2Nyb2xsLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHtcbiAgZ2V0VmlzaWJsZVdlZWtzLFxuICBuYXZpZ2F0ZVdlZWtXaW5kb3csXG4gIGlzVmlydHVhbFdlZWtzRW5hYmxlZFxufSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvdmlydHVhbC13ZWVrcy5sb2dpYyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBQ0hFIENPTkZJR1VSQVRJT04gKHYzLjkuMispXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2FjaGUgQ29uZmlndXJhdGlvblxuICogXG4gKiBTaGFyZWQgY2FjaGUgc2l6ZSBsaW1pdHMgZm9yIG1lbW9yeSBzYWZldHkuXG4gKiBNQVhfQ0FDSEVfRU5UUklFUyA9IDQ4ICg0IHllYXJzIG9mIG5hdmlnYXRpb24pXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBNQVhfQ0FDSEVfRU5UUklFUyB9IGZyb20gJy4vY2FsZW5kYXItZ3JpZC9jYWNoZS5jb25maWcnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEQVRFIENMT0NLIFNZU1RFTVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERhdGVDbG9jayAtIEFic3RyYWN0IHRpbWUgc291cmNlXG4gKiBcbiAqIEludGVyZmFjZSBmb3IgaW5qZWN0aW5nIGN1c3RvbSB0aW1lIHNvdXJjZXMuXG4gKiBFbmFibGVzIGRldGVybWluaXN0aWMgdGVzdGluZyBhbmQgU1NSLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgeyBEYXRlQ2xvY2sgfSBmcm9tICcuL2RhdGUtY2xvY2snO1xuXG4vKipcbiAqIFN5c3RlbUNsb2NrIC0gRGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICogXG4gKiBVc2VzIG5hdGl2ZSBEYXRlLm5vdygpIGFuZCBuZXcgRGF0ZSgpLlxuICogRGVmYXVsdCB0aW1lIHNvdXJjZSBmb3IgcHJvZHVjdGlvbi5cbiAqIFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBURVNUSU5HIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRlc3RpbmcgSGVscGVyc1xuICogXG4gKiBVdGlsaXRpZXMgZm9yIHdyaXRpbmcgZGV0ZXJtaW5pc3RpYyB0ZXN0cy5cbiAqIEZpeGVkQ2xvY2ssIG1ha2VEYXRlLCBldGMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgKiBmcm9tICcuL3Rlc3RpbmcnO1xuIl19