@entake/particle 18.0.5 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/app/{modules → shared/components}/accordion/accordion.component.d.ts +3 -3
- package/app/{modules/date-picker → shared}/components/calendar/calendar.component.d.ts +7 -12
- package/app/{modules → shared/components}/checkbox/checkbox.component.d.ts +5 -7
- package/app/{modules → shared/components}/color-picker/color-picker.component.d.ts +3 -9
- package/app/{modules → shared/components}/date-picker/date-picker.component.d.ts +20 -26
- package/app/{modules/date-picker → shared}/components/date-range-picker/date-range-picker.component.d.ts +10 -11
- package/app/{modules → shared/components}/dialog/dialog.component.d.ts +14 -24
- package/app/{modules → shared/components}/dropdown/dropdown.component.d.ts +12 -14
- package/app/{modules/icons/components → shared/components/icon-select}/icon-select.component.d.ts +14 -17
- package/app/{modules → shared/components}/idle-timeout/idle-timeout.component.d.ts +3 -4
- package/app/{modules → shared/components}/input-mask/input-mask.component.d.ts +6 -7
- package/app/shared/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
- package/app/shared/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
- package/app/{modules/loader/components → shared/components/loader}/loader.component.d.ts +2 -2
- package/app/{modules → shared/components}/multi-select/multi-select.component.d.ts +18 -24
- package/app/{modules → shared/components}/notification/notification.component.d.ts +5 -13
- package/app/{modules → shared/components}/paginator/paginator.component.d.ts +12 -11
- package/app/{modules → shared/components}/popover/popover.component.d.ts +10 -15
- package/app/{modules → shared/components}/profile-pic/profile-pic.component.d.ts +1 -1
- package/app/shared/components/progress-bar/progress-bar.component.d.ts +15 -0
- package/app/{modules → shared/components}/rich-text/rich-text.component.d.ts +11 -12
- package/app/shared/components/scroll-to-top/scroll-to-top.component.d.ts +18 -0
- package/app/shared/components/slideover/slideover.component.d.ts +35 -0
- package/app/{modules → shared/components}/slider/slider.component.d.ts +8 -22
- package/app/{modules → shared/components}/toggle-switch/toggle-switch.component.d.ts +4 -6
- package/app/{modules → shared/components}/week-picker/week-picker.component.d.ts +21 -22
- package/app/{modules/accordion → shared}/directives/accordion-content.directive.d.ts +1 -2
- package/app/{modules/accordion → shared}/directives/accordion-header.directive.d.ts +1 -2
- package/app/{modules/accordion → shared}/directives/accordion-item.directive.d.ts +1 -1
- package/app/{modules/background-carousel → shared/directives}/background-carousel.directive.d.ts +4 -4
- package/app/{modules/keyfilter → shared/directives}/keyfilter.directive.d.ts +1 -7
- package/app/{modules/tooltip → shared/directives}/tooltip.directive.d.ts +3 -9
- package/app/shared/models/carousel-options.model.d.ts +21 -0
- package/app/shared/models/pagination-event.model.d.ts +8 -0
- package/app/shared/models/particle-component-text.model.d.ts +0 -24
- package/app/shared/modules/icons/particle-icons.module.d.ts +7 -0
- package/app/{modules/ordinal-number-pipe → shared/pipes}/ordinal-number.pipe.d.ts +1 -1
- package/app/shared/services/base-data.service.d.ts +2 -2
- package/app/shared/services/dialog.service.d.ts +1 -1
- package/app/{modules/notification → shared}/services/notification.service.d.ts +0 -4
- package/app/{modules/theming → shared}/services/theming.service.d.ts +0 -19
- package/fesm2022/entake-particle.mjs +3871 -5573
- package/fesm2022/entake-particle.mjs.map +1 -1
- package/package.json +16 -25
- package/public_api.d.ts +47 -82
- package/app/modules/accordion/accordion.module.d.ts +0 -11
- package/app/modules/background-carousel/carousel-options.model.d.ts +0 -30
- package/app/modules/background-carousel/particle-background-carousel.module.d.ts +0 -8
- package/app/modules/checkbox/checkbox.module.d.ts +0 -9
- package/app/modules/color-picker/color-picker.module.d.ts +0 -9
- package/app/modules/date-picker/date-picker.module.d.ts +0 -15
- package/app/modules/dialog/dialog.module.d.ts +0 -9
- package/app/modules/dropdown/dropdown.module.d.ts +0 -9
- package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +0 -46
- package/app/modules/endpoint-state/endpoint-state.module.d.ts +0 -8
- package/app/modules/icons/particle-icons.module.d.ts +0 -13
- package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +0 -9
- package/app/modules/input-mask/input-mask.module.d.ts +0 -8
- package/app/modules/keyfilter/keyfilter.module.d.ts +0 -8
- package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +0 -27
- package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +0 -23
- package/app/modules/layout/layout.module.d.ts +0 -10
- package/app/modules/loader/loader.module.d.ts +0 -8
- package/app/modules/multi-select/multi-select.module.d.ts +0 -8
- package/app/modules/notification/notification.module.d.ts +0 -8
- package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +0 -8
- package/app/modules/paginator/pagination-event.model.d.ts +0 -24
- package/app/modules/paginator/particle-paginator.module.d.ts +0 -13
- package/app/modules/popover/popover.module.d.ts +0 -9
- package/app/modules/profile-pic/particle-profile-pic.module.d.ts +0 -9
- package/app/modules/progress-bar/progress-bar.component.d.ts +0 -16
- package/app/modules/progress-bar/progress-bar.module.d.ts +0 -8
- package/app/modules/push-container/particle-push-container.module.d.ts +0 -9
- package/app/modules/push-container/push-container-state.model.d.ts +0 -7
- package/app/modules/push-container/push-container.component.d.ts +0 -137
- package/app/modules/rich-text/particle-rich-text.module.d.ts +0 -15
- package/app/modules/rich-text/render-rich-text.component.d.ts +0 -6
- package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +0 -8
- package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +0 -19
- package/app/modules/slideover/particle-slideover.module.d.ts +0 -8
- package/app/modules/slideover/slideover.component.d.ts +0 -35
- package/app/modules/slider/slider.module.d.ts +0 -9
- package/app/modules/theming/components/theming.component.d.ts +0 -43
- package/app/modules/theming/theming.module.d.ts +0 -12
- package/app/modules/toggle-switch/toggle-switch.module.d.ts +0 -8
- package/app/modules/tooltip/tooltip.module.d.ts +0 -8
- package/app/modules/week-picker/week-picker.module.d.ts +0 -13
- package/app/shared/enums/endpoint-status.enum.d.ts +0 -9
- package/esm2022/app/modules/accordion/accordion.component.mjs +0 -101
- package/esm2022/app/modules/accordion/accordion.module.mjs +0 -37
- package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +0 -17
- package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +0 -17
- package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +0 -36
- package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +0 -91
- package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +0 -36
- package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +0 -24
- package/esm2022/app/modules/checkbox/checkbox.component.mjs +0 -108
- package/esm2022/app/modules/checkbox/checkbox.module.mjs +0 -28
- package/esm2022/app/modules/color-picker/color-picker.component.mjs +0 -306
- package/esm2022/app/modules/color-picker/color-picker.module.mjs +0 -19
- package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +0 -496
- package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +0 -250
- package/esm2022/app/modules/date-picker/date-picker.component.mjs +0 -538
- package/esm2022/app/modules/date-picker/date-picker.module.mjs +0 -56
- package/esm2022/app/modules/dialog/dialog.component.mjs +0 -177
- package/esm2022/app/modules/dialog/dialog.module.mjs +0 -28
- package/esm2022/app/modules/dropdown/dropdown.component.mjs +0 -682
- package/esm2022/app/modules/dropdown/dropdown.module.mjs +0 -28
- package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +0 -2
- package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +0 -2
- package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +0 -75
- package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +0 -22
- package/esm2022/app/modules/icons/components/icon-select.component.mjs +0 -376
- package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +0 -471
- package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +0 -166
- package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +0 -1016
- package/esm2022/app/modules/icons/models/particle-icons-brands.model.mjs +0 -24
- package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +0 -50
- package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +0 -89
- package/esm2022/app/modules/icons/particle-icons.module.mjs +0 -66
- package/esm2022/app/modules/icons/services/icons.service.mjs +0 -82
- package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +0 -85
- package/esm2022/app/modules/idle-timeout/idle-timer.mjs +0 -66
- package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +0 -28
- package/esm2022/app/modules/input-mask/input-mask.component.mjs +0 -594
- package/esm2022/app/modules/input-mask/input-mask.module.mjs +0 -18
- package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +0 -174
- package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +0 -18
- package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +0 -81
- package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +0 -67
- package/esm2022/app/modules/layout/layout.module.mjs +0 -33
- package/esm2022/app/modules/loader/components/loader.component.mjs +0 -30
- package/esm2022/app/modules/loader/loader.module.mjs +0 -24
- package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +0 -2
- package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +0 -2
- package/esm2022/app/modules/multi-select/multi-select.component.mjs +0 -665
- package/esm2022/app/modules/multi-select/multi-select.module.mjs +0 -18
- package/esm2022/app/modules/notification/models/notification.model.mjs +0 -2
- package/esm2022/app/modules/notification/notification.component.mjs +0 -122
- package/esm2022/app/modules/notification/notification.module.mjs +0 -18
- package/esm2022/app/modules/notification/services/notification.service.mjs +0 -84
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +0 -20
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +0 -49
- package/esm2022/app/modules/paginator/pagination-event.model.mjs +0 -29
- package/esm2022/app/modules/paginator/paginator.component.mjs +0 -207
- package/esm2022/app/modules/paginator/particle-paginator.module.mjs +0 -48
- package/esm2022/app/modules/popover/popover.component.mjs +0 -352
- package/esm2022/app/modules/popover/popover.module.mjs +0 -24
- package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +0 -28
- package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +0 -75
- package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +0 -43
- package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +0 -24
- package/esm2022/app/modules/push-container/particle-push-container.module.mjs +0 -26
- package/esm2022/app/modules/push-container/push-container-state.model.mjs +0 -2
- package/esm2022/app/modules/push-container/push-container.component.mjs +0 -363
- package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +0 -64
- package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +0 -18
- package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +0 -2
- package/esm2022/app/modules/rich-text/rich-text.component.mjs +0 -209
- package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +0 -24
- package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +0 -49
- package/esm2022/app/modules/slideover/particle-slideover.module.mjs +0 -24
- package/esm2022/app/modules/slideover/slideover.component.mjs +0 -115
- package/esm2022/app/modules/slider/slider.component.mjs +0 -243
- package/esm2022/app/modules/slider/slider.module.mjs +0 -26
- package/esm2022/app/modules/theming/components/theming.component.mjs +0 -86
- package/esm2022/app/modules/theming/models/theme.model.mjs +0 -9
- package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +0 -38
- package/esm2022/app/modules/theming/services/theming.service.mjs +0 -510
- package/esm2022/app/modules/theming/theming.module.mjs +0 -55
- package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +0 -2
- package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +0 -107
- package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +0 -24
- package/esm2022/app/modules/tooltip/tooltip.directive.mjs +0 -381
- package/esm2022/app/modules/tooltip/tooltip.module.mjs +0 -18
- package/esm2022/app/modules/week-picker/week-picker.component.mjs +0 -511
- package/esm2022/app/modules/week-picker/week-picker.module.mjs +0 -40
- package/esm2022/app/shared/enums/endpoint-status.enum.mjs +0 -11
- package/esm2022/app/shared/interceptors/json.interceptor.mjs +0 -23
- package/esm2022/app/shared/models/auditable.model.mjs +0 -2
- package/esm2022/app/shared/models/data-list.model.mjs +0 -2
- package/esm2022/app/shared/models/id.model.mjs +0 -2
- package/esm2022/app/shared/models/observable-container.mjs +0 -15
- package/esm2022/app/shared/models/particle-component-text.model.mjs +0 -2
- package/esm2022/app/shared/services/base-data.service.mjs +0 -190
- package/esm2022/app/shared/services/dialog.service.mjs +0 -50
- package/esm2022/app/shared/services/local-storage.service.mjs +0 -60
- package/esm2022/entake-particle.mjs +0 -5
- package/esm2022/public_api.mjs +0 -98
- /package/app/{modules/dropdown → shared}/models/dropdown-option-group.model.d.ts +0 -0
- /package/app/{modules/dropdown → shared}/models/dropdown-option.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-brands.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-regular.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-solid.model.d.ts +0 -0
- /package/app/{modules/multi-select → shared}/models/multi-select-option-group.model.d.ts +0 -0
- /package/app/{modules/multi-select → shared}/models/multi-select-option.model.d.ts +0 -0
- /package/app/{modules/notification → shared}/models/notification.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-brands.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-regular.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-solid.model.d.ts +0 -0
- /package/app/{modules/rich-text → shared/models}/rich-text-capabilities.model.d.ts +0 -0
- /package/app/{modules/theming → shared}/models/theme.model.d.ts +0 -0
- /package/app/{modules/toggle-switch → shared}/models/toggle-options.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/services/icons.service.d.ts +0 -0
- /package/app/{modules/idle-timeout → shared/services}/idle-timer.d.ts +0 -0
- /package/app/{modules/theming → shared}/services/theme-change-detection.service.d.ts +0 -0
|
@@ -1,538 +0,0 @@
|
|
|
1
|
-
import { animate, style, transition, trigger } from '@angular/animations';
|
|
2
|
-
import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from '@angular/core';
|
|
3
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
4
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
|
-
import { format, isEqual, isValid, isWithinInterval, parse } from 'date-fns';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
import * as i2 from "@angular/forms";
|
|
9
|
-
import * as i3 from "../popover/popover.component";
|
|
10
|
-
import * as i4 from "./components/calendar/calendar.component";
|
|
11
|
-
/**
|
|
12
|
-
* Component to allow a user to input/select a date
|
|
13
|
-
*/
|
|
14
|
-
export class DatePickerComponent {
|
|
15
|
-
renderer;
|
|
16
|
-
changeDetectorRef;
|
|
17
|
-
/**
|
|
18
|
-
* Allowed keys for date input
|
|
19
|
-
*/
|
|
20
|
-
static ALLOWED_KEYS = [
|
|
21
|
-
'0', '1', '2', '3', '4', '5', '6', '7',
|
|
22
|
-
'8', '9', 'Tab', 'Enter', '/', 'ArrowLeft',
|
|
23
|
-
'ArrowUp', 'ArrowRight', 'ArrowDown',
|
|
24
|
-
'ShiftLeft', 'ShiftRight', 'Backspace',
|
|
25
|
-
'Delete'
|
|
26
|
-
];
|
|
27
|
-
/**
|
|
28
|
-
* Matches YYYY-MM-DD
|
|
29
|
-
* @private
|
|
30
|
-
*/
|
|
31
|
-
static BROWSER_DATE_PICKER_FORMAT = new RegExp('^\\d\\d\\d\\d-\\d\\d-\\d\\d$');
|
|
32
|
-
/**
|
|
33
|
-
* Matches MM/DD/YYYY
|
|
34
|
-
* @private
|
|
35
|
-
*/
|
|
36
|
-
static FULL_DATE_FORMAT = new RegExp('^\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d$');
|
|
37
|
-
/**
|
|
38
|
-
* Matches M/D/YYYY
|
|
39
|
-
* @private
|
|
40
|
-
*/
|
|
41
|
-
static SHORT_DATE_FORMAT = new RegExp('^\\d\\/\\d\\/\\d\\d\\d\\d$');
|
|
42
|
-
/**
|
|
43
|
-
* Matches M/DD/YYYY
|
|
44
|
-
* @private
|
|
45
|
-
*/
|
|
46
|
-
static SHORT_MONTH_DATE_FORMAT = new RegExp('^\\d\\/\\d\\d\\/\\d\\d\\d\\d$');
|
|
47
|
-
/**
|
|
48
|
-
* Matches MM/D/YYYY
|
|
49
|
-
* @private
|
|
50
|
-
*/
|
|
51
|
-
static SHORT_DAY_DATE_FORMAT = new RegExp('^\\d\\d\\/\\d\\/\\d\\d\\d\\d$');
|
|
52
|
-
/**
|
|
53
|
-
* A reference date with all fields set to 0
|
|
54
|
-
* @private
|
|
55
|
-
*/
|
|
56
|
-
static referenceDate = new Date(0, 0, 0, 0, 0, 0, 0);
|
|
57
|
-
/**
|
|
58
|
-
* Value input setter
|
|
59
|
-
*/
|
|
60
|
-
set value(value) {
|
|
61
|
-
if (!value) {
|
|
62
|
-
this._value = null;
|
|
63
|
-
this.dateString = null;
|
|
64
|
-
this.mobileDateString = null;
|
|
65
|
-
}
|
|
66
|
-
else if (!isEqual(value, this._value)) {
|
|
67
|
-
this._value = value;
|
|
68
|
-
this.dateString = this.dateString = DatePickerComponent.parseDate(value);
|
|
69
|
-
this.setMobileValue();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
set disabled(disabled) {
|
|
73
|
-
this._disabled = coerceBooleanProperty(disabled);
|
|
74
|
-
}
|
|
75
|
-
set dateRange(dateRange) {
|
|
76
|
-
if (dateRange?.minDate > dateRange?.maxDate) {
|
|
77
|
-
throw new Error('Min date must be less than max date');
|
|
78
|
-
}
|
|
79
|
-
const year = this.currentDate.getFullYear();
|
|
80
|
-
this.validSelectionInterval = {
|
|
81
|
-
start: dateRange?.minDate ?? new Date(year - 100, 0, 1),
|
|
82
|
-
end: dateRange?.maxDate ?? new Date(year + 50, 11, 31)
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* The ID to set on the input
|
|
87
|
-
*/
|
|
88
|
-
inputId = null;
|
|
89
|
-
/**
|
|
90
|
-
* Value to use as the date picker input's aria label
|
|
91
|
-
*/
|
|
92
|
-
ariaLabel = 'Date';
|
|
93
|
-
/**
|
|
94
|
-
* Optional class-list to add to the date picker input
|
|
95
|
-
*/
|
|
96
|
-
inputClassList = null;
|
|
97
|
-
/**
|
|
98
|
-
* Optional class-list to add to the calendar button
|
|
99
|
-
*/
|
|
100
|
-
calendarButtonClassList = '';
|
|
101
|
-
/**
|
|
102
|
-
* Close the picker when a selection is made
|
|
103
|
-
*/
|
|
104
|
-
closeOnSelect = true;
|
|
105
|
-
/**
|
|
106
|
-
* Placeholder override
|
|
107
|
-
*/
|
|
108
|
-
placeholder = 'mm/dd/yyyy';
|
|
109
|
-
inputOnly = false;
|
|
110
|
-
_text = {
|
|
111
|
-
enterInFormat: 'enter in format',
|
|
112
|
-
openCalendar: 'Open the calendar'
|
|
113
|
-
};
|
|
114
|
-
set text(text) {
|
|
115
|
-
if (text) {
|
|
116
|
-
this._text = text;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
get text() {
|
|
120
|
-
return this._text;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Event emitted on date picker input
|
|
124
|
-
*/
|
|
125
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
126
|
-
input = new EventEmitter();
|
|
127
|
-
/**
|
|
128
|
-
* Event emitted on valid date selection/input
|
|
129
|
-
*/
|
|
130
|
-
dateSelected = new EventEmitter();
|
|
131
|
-
/**
|
|
132
|
-
* ViewChild of the date picker div
|
|
133
|
-
*/
|
|
134
|
-
datePickerDiv = null;
|
|
135
|
-
/**
|
|
136
|
-
* ViewChild of the calendar div
|
|
137
|
-
*/
|
|
138
|
-
calendarDiv = null;
|
|
139
|
-
calendarPopover = null;
|
|
140
|
-
/**
|
|
141
|
-
* The current date
|
|
142
|
-
*/
|
|
143
|
-
currentDate = new Date();
|
|
144
|
-
/**
|
|
145
|
-
* The fixed height of the calendar widget
|
|
146
|
-
*/
|
|
147
|
-
calendarHeight = 340;
|
|
148
|
-
/**
|
|
149
|
-
* The fixed width of the calendar widget
|
|
150
|
-
*/
|
|
151
|
-
calendarWidth = 300;
|
|
152
|
-
/**
|
|
153
|
-
* The amount of padding to apply between the date picker input and the calendar widget
|
|
154
|
-
*/
|
|
155
|
-
calendarPadding = 0;
|
|
156
|
-
/**
|
|
157
|
-
* String tracking date picker input
|
|
158
|
-
*/
|
|
159
|
-
dateString = '';
|
|
160
|
-
mobileDateString = '';
|
|
161
|
-
/**
|
|
162
|
-
* Whether to show the calendar
|
|
163
|
-
*/
|
|
164
|
-
showCalendar = null;
|
|
165
|
-
/**
|
|
166
|
-
* In mobile (screen width is less than 768), swap to a native input
|
|
167
|
-
*/
|
|
168
|
-
isMobile = window.innerWidth <= 768;
|
|
169
|
-
/**
|
|
170
|
-
* The valid selection interval
|
|
171
|
-
* @private
|
|
172
|
-
*/
|
|
173
|
-
validSelectionInterval = {
|
|
174
|
-
start: new Date(this.currentDate.getFullYear() - 100, 0, 1),
|
|
175
|
-
end: new Date(this.currentDate.getFullYear() + 50, 0, 1)
|
|
176
|
-
};
|
|
177
|
-
/**
|
|
178
|
-
* The internal control accessor value
|
|
179
|
-
* @private
|
|
180
|
-
*/
|
|
181
|
-
_value = null;
|
|
182
|
-
/**
|
|
183
|
-
* The internal disabled state
|
|
184
|
-
* @private
|
|
185
|
-
*/
|
|
186
|
-
_disabled = false;
|
|
187
|
-
/**
|
|
188
|
-
* Window resize unlisten function
|
|
189
|
-
*/
|
|
190
|
-
resizeListener;
|
|
191
|
-
/**
|
|
192
|
-
* Parse the input Date value into a string
|
|
193
|
-
* @param value the value to parse
|
|
194
|
-
* @private
|
|
195
|
-
*/
|
|
196
|
-
static parseDate(value) {
|
|
197
|
-
return !value ? null : format(value, 'MM/dd/yyyy');
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Parse the input date string into a Date
|
|
201
|
-
* @param dateString the string to parse
|
|
202
|
-
* @private
|
|
203
|
-
*/
|
|
204
|
-
static parseDateString(dateString) {
|
|
205
|
-
let parsedDate;
|
|
206
|
-
try {
|
|
207
|
-
parsedDate = parse(dateString, DatePickerComponent.getDateFormat(dateString), this.referenceDate);
|
|
208
|
-
}
|
|
209
|
-
catch (e) {
|
|
210
|
-
parsedDate = null;
|
|
211
|
-
}
|
|
212
|
-
return isValid(parsedDate) ? parsedDate : null;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Get the date format that matches the input date string, null if no match
|
|
216
|
-
* @param dateString the string to test
|
|
217
|
-
* @private
|
|
218
|
-
*/
|
|
219
|
-
static getDateFormat(dateString) {
|
|
220
|
-
this.FULL_DATE_FORMAT.lastIndex = 0;
|
|
221
|
-
this.SHORT_MONTH_DATE_FORMAT.lastIndex = 0;
|
|
222
|
-
this.SHORT_DAY_DATE_FORMAT.lastIndex = 0;
|
|
223
|
-
this.SHORT_DATE_FORMAT.lastIndex = 0;
|
|
224
|
-
this.BROWSER_DATE_PICKER_FORMAT.lastIndex = 0;
|
|
225
|
-
let dateFormat = null;
|
|
226
|
-
if (this.FULL_DATE_FORMAT.test(dateString)) {
|
|
227
|
-
dateFormat = 'MM/dd/yyyy';
|
|
228
|
-
}
|
|
229
|
-
else if (this.SHORT_MONTH_DATE_FORMAT.test(dateString)) {
|
|
230
|
-
dateFormat = 'M/dd/yyyy';
|
|
231
|
-
}
|
|
232
|
-
else if (this.SHORT_DAY_DATE_FORMAT.test(dateString)) {
|
|
233
|
-
dateFormat = 'MM/d/yyyy';
|
|
234
|
-
}
|
|
235
|
-
else if (this.SHORT_DATE_FORMAT.test(dateString)) {
|
|
236
|
-
dateFormat = 'M/d/yyyy';
|
|
237
|
-
}
|
|
238
|
-
else if (this.BROWSER_DATE_PICKER_FORMAT.test(dateString)) {
|
|
239
|
-
dateFormat = 'yyyy-MM-dd';
|
|
240
|
-
}
|
|
241
|
-
return dateFormat;
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Function to call on change
|
|
245
|
-
*/
|
|
246
|
-
onChange = () => { };
|
|
247
|
-
/**
|
|
248
|
-
* Function to call on touch
|
|
249
|
-
*/
|
|
250
|
-
onTouched = () => { };
|
|
251
|
-
/**
|
|
252
|
-
* Dependency injection site
|
|
253
|
-
* @param renderer the Angular renderer
|
|
254
|
-
* @param changeDetectorRef the Angular change detector
|
|
255
|
-
*/
|
|
256
|
-
constructor(renderer, changeDetectorRef) {
|
|
257
|
-
this.renderer = renderer;
|
|
258
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Value getter
|
|
262
|
-
*/
|
|
263
|
-
get value() {
|
|
264
|
-
return DatePickerComponent.parseDateString(this.dateString);
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Disabled getter
|
|
268
|
-
*/
|
|
269
|
-
get disabled() { return this._disabled; }
|
|
270
|
-
onWindowResize(event) {
|
|
271
|
-
this.isMobile = event.target.innerWidth <= 768;
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Init component, set up window resize listener
|
|
275
|
-
*/
|
|
276
|
-
ngOnInit() {
|
|
277
|
-
this.resizeListener = this.renderer.listen(window, 'resize', () => {
|
|
278
|
-
if (this.showCalendar) {
|
|
279
|
-
this.setCalendarPosition();
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Destroy component, invoke window resize unlisten function
|
|
285
|
-
*/
|
|
286
|
-
ngOnDestroy() {
|
|
287
|
-
if (this.resizeListener) {
|
|
288
|
-
this.resizeListener();
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Write value
|
|
293
|
-
* @param value the value to write
|
|
294
|
-
*/
|
|
295
|
-
writeValue(value) {
|
|
296
|
-
if (value !== null && isWithinInterval(value, this.validSelectionInterval)) {
|
|
297
|
-
this.value = value;
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
this.value = null;
|
|
301
|
-
}
|
|
302
|
-
this.changeDetectorRef.markForCheck();
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Register control value accessor change function
|
|
306
|
-
* @param fn the function to register
|
|
307
|
-
*/
|
|
308
|
-
registerOnChange(fn) {
|
|
309
|
-
this.onChange = fn;
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Register touch handler
|
|
313
|
-
* @param fn the touch handler to register
|
|
314
|
-
*/
|
|
315
|
-
registerOnTouched(fn) {
|
|
316
|
-
this.onTouched = fn;
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Set the disabled state
|
|
320
|
-
* @param isDisabled whether or not the component should be disabled
|
|
321
|
-
*/
|
|
322
|
-
setDisabledState(isDisabled) {
|
|
323
|
-
this.disabled = isDisabled;
|
|
324
|
-
this.changeDetectorRef.markForCheck();
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Only allow input from digits, forward slashes, and navigation keys
|
|
328
|
-
*/
|
|
329
|
-
filterInput(event) {
|
|
330
|
-
const { key } = event;
|
|
331
|
-
if (!DatePickerComponent.ALLOWED_KEYS.includes(key) && !event.ctrlKey) {
|
|
332
|
-
event.preventDefault();
|
|
333
|
-
}
|
|
334
|
-
if (key === 'Enter') {
|
|
335
|
-
setTimeout(() => this.openCalendar(), 0);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Clear value if no input, write parsed date if input requirements fulfilled
|
|
340
|
-
*/
|
|
341
|
-
handleBlur() {
|
|
342
|
-
try {
|
|
343
|
-
this.updateModel(DatePickerComponent.parseDateString(this.dateString));
|
|
344
|
-
}
|
|
345
|
-
catch (e) {
|
|
346
|
-
this.updateModel(null);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Write on input if valid date within interval
|
|
351
|
-
*/
|
|
352
|
-
handleInput() {
|
|
353
|
-
try {
|
|
354
|
-
const parsedDate = DatePickerComponent.parseDateString(this.dateString);
|
|
355
|
-
if (parsedDate !== null && isWithinInterval(parsedDate, this.validSelectionInterval)) {
|
|
356
|
-
this.updateModel(parsedDate);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
catch (e) { }
|
|
360
|
-
this.input.emit();
|
|
361
|
-
}
|
|
362
|
-
handleMobileInput() {
|
|
363
|
-
this.dateString = this.mobileDateString;
|
|
364
|
-
this.handleInput();
|
|
365
|
-
}
|
|
366
|
-
setMobileValue() {
|
|
367
|
-
if (this.value) {
|
|
368
|
-
const offset = this.value.getTimezoneOffset();
|
|
369
|
-
const dateForFormatting = new Date(this.value.getTime() - (offset * 60 * 1000));
|
|
370
|
-
this.mobileDateString = dateForFormatting.toISOString().split('T')[0];
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Update the model value
|
|
375
|
-
* @param value the value to update the model to
|
|
376
|
-
*/
|
|
377
|
-
updateModel(value) {
|
|
378
|
-
const valueBeforeUpdate = this._value;
|
|
379
|
-
if (!this.disabled) {
|
|
380
|
-
if (value !== null && isWithinInterval(value, this.validSelectionInterval)) {
|
|
381
|
-
this.value = value;
|
|
382
|
-
if (!isEqual(this.value, valueBeforeUpdate)) {
|
|
383
|
-
this.dateSelected.emit(value);
|
|
384
|
-
if (this.closeOnSelect) {
|
|
385
|
-
setTimeout(() => this.handleCalendarClose(), 200);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
this.value = null;
|
|
391
|
-
}
|
|
392
|
-
if (!isEqual(this.value, valueBeforeUpdate)) {
|
|
393
|
-
this.onChange(this.value);
|
|
394
|
-
this.setMobileValue();
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* Open the calendar widget
|
|
400
|
-
* @param event the click MouseEvent
|
|
401
|
-
*/
|
|
402
|
-
openCalendar(event) {
|
|
403
|
-
if (event) {
|
|
404
|
-
event.stopImmediatePropagation();
|
|
405
|
-
}
|
|
406
|
-
this.showCalendar = { currentValue: this.value };
|
|
407
|
-
this.calendarPopover.toggle(event);
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* Hide calendar overlay and remove calendar from the DOM
|
|
411
|
-
*/
|
|
412
|
-
handleCalendarClose() {
|
|
413
|
-
this.showCalendar = null;
|
|
414
|
-
if (this.calendarPopover) {
|
|
415
|
-
this.calendarPopover.close();
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Calculate and set the calendar's position based on the screen height.
|
|
420
|
-
* Positioning prefers to open at the bottom, if not enough room on bottom,
|
|
421
|
-
* positioning is attempted at the top, otherwise it attempts to vertically
|
|
422
|
-
* center
|
|
423
|
-
*/
|
|
424
|
-
setCalendarPosition() {
|
|
425
|
-
const { left, top, bottom } = this.datePickerDiv.nativeElement.getBoundingClientRect();
|
|
426
|
-
const datePickerBottomLeftAnchor = bottom;
|
|
427
|
-
const availableBottomSpace = window.innerHeight - datePickerBottomLeftAnchor;
|
|
428
|
-
const availableTopSpace = top;
|
|
429
|
-
const offsetCalendarHeight = this.calendarHeight + this.calendarPadding;
|
|
430
|
-
let leftPosition, topPosition, transformOrigin;
|
|
431
|
-
if (availableBottomSpace > offsetCalendarHeight) {
|
|
432
|
-
transformOrigin = 'top left';
|
|
433
|
-
topPosition = datePickerBottomLeftAnchor + this.calendarPadding;
|
|
434
|
-
}
|
|
435
|
-
else if (availableTopSpace > offsetCalendarHeight) {
|
|
436
|
-
transformOrigin = 'bottom left';
|
|
437
|
-
topPosition = top - offsetCalendarHeight;
|
|
438
|
-
}
|
|
439
|
-
else {
|
|
440
|
-
transformOrigin = 'top left';
|
|
441
|
-
if (this.calendarHeight > window.innerHeight) {
|
|
442
|
-
topPosition = 0;
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
const availableSpace = window.innerHeight - this.calendarHeight;
|
|
446
|
-
topPosition = availableSpace / 2;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
leftPosition = left;
|
|
450
|
-
if ((left + this.calendarWidth) > window.innerWidth) {
|
|
451
|
-
leftPosition = left - ((left + this.calendarWidth) - window.innerWidth) - 10;
|
|
452
|
-
}
|
|
453
|
-
this.renderer.setStyle(this.calendarDiv.nativeElement, 'transform-origin', transformOrigin);
|
|
454
|
-
this.renderer.setStyle(this.calendarDiv.nativeElement, 'left', `${leftPosition}px`);
|
|
455
|
-
this.renderer.setStyle(this.calendarDiv.nativeElement, 'top', `${topPosition}px`);
|
|
456
|
-
}
|
|
457
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DatePickerComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
458
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: DatePickerComponent, selector: "particle-date-picker", inputs: { value: "value", disabled: "disabled", dateRange: "dateRange", inputId: "inputId", ariaLabel: "ariaLabel", inputClassList: "inputClassList", calendarButtonClassList: "calendarButtonClassList", closeOnSelect: "closeOnSelect", placeholder: "placeholder", inputOnly: "inputOnly", text: "text" }, outputs: { input: "input", dateSelected: "dateSelected" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, providers: [
|
|
459
|
-
{
|
|
460
|
-
provide: NG_VALUE_ACCESSOR,
|
|
461
|
-
useExisting: forwardRef(() => DatePickerComponent),
|
|
462
|
-
multi: true
|
|
463
|
-
}
|
|
464
|
-
], viewQueries: [{ propertyName: "datePickerDiv", first: true, predicate: ["datePickerDiv"], descendants: true }, { propertyName: "calendarDiv", first: true, predicate: ["calendarDiv"], descendants: true }, { propertyName: "calendarPopover", first: true, predicate: ["calendarPopover"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"!isMobile else mobile\">\r\n <div #datePickerDiv\r\n style=\"overflow: hidden;\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n [ngClass]=\"inputClassList ? '' : 'row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir'\"\r\n >\r\n <div class=\"col size_1 height100 width100\">\r\n <input #dateInput\r\n [(ngModel)]=\"dateString\"\r\n [id]=\"inputId\"\r\n (keydown)=\"filterInput($event)\"\r\n (input)=\"handleInput()\"\r\n (blur)=\"onTouched(); handleBlur()\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n maxlength=\"10\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.enterInFormat + ' mm/dd/yyyy'\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'ptl_input_text_size ptl_input_padding border_none'\"\r\n style=\"outline-offset: -2px;\"\r\n class=\"access height100 width100\"/>\r\n </div>\r\n <div class=\"col center_center min_w50 height100 ptl_brdr_color border_left\" *ngIf=\"!inputOnly\">\r\n <button type=\"button\"\r\n (click)=\"openCalendar($event)\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"calendarButtonClassList ? calendarButtonClassList : 'clear'\"\r\n class=\"access btnset center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n [attr.aria-label]=\"text.openCalendar\" aria-haspopup=\"dialog\">\r\n <i class=\"fas fa-calendar-day\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- calendar widget -->\r\n <particle-popover [targetOverride]=\"dateInput\" #calendarPopover>\r\n <particle-calendar [value]=\"showCalendar ? showCalendar.currentValue : $any(null)\"\r\n [text]=\"$any(text.calendarText)\"\r\n [dateRange]=\"{ minDate: validSelectionInterval.start!, maxDate: validSelectionInterval.end! }\"\r\n (selected)=\"updateModel($event)\"\r\n (closed)=\"handleCalendarClose()\">\r\n </particle-calendar>\r\n </particle-popover>\r\n</ng-container>\r\n\r\n<ng-template #mobile>\r\n <div style=\"overflow: hidden;\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n [ngClass]=\"inputClassList ? '' : 'ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius'\"\r\n >\r\n <div class=\"col size_1 height100 width100\">\r\n <input [(ngModel)]=\"mobileDateString\"\r\n [id]=\"inputId\"\r\n (input)=\"handleMobileInput()\"\r\n (blur)=\"onTouched()\"\r\n type=\"date\"\r\n [placeholder]=\"placeholder\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'ptl_input_text_size ptl_input_padding border_none'\"\r\n style=\"outline-offset: -2px;\"\r\n class=\"access height100 width100\"/>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{width:100%}.particle_datepicker_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_datepicker{width:100%;min-width:150px;position:relative}.particle_datepicker:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_datepicker_input{position:absolute;inset:0;padding:inherit;width:calc(100% - 2.25em);-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;background-color:transparent;color:inherit}.particle_datepicker_input::-ms-expand{display:none}.particle_datepicker_button{position:absolute;height:calc(100% + 2px);width:2.25em;top:0;right:0;z-index:var(--z-frame);border-top-left-radius:0!important;border-bottom-left-radius:0!important;font-size:inherit;margin:-1px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.PopoverComponent, selector: "particle-popover", inputs: ["offset", "width", "height", "classList", "targetOverride", "openDirection", "alignment", "scaleForMobile"], outputs: ["opened", "closed"] }, { kind: "component", type: i4.CalendarComponent, selector: "particle-calendar", inputs: ["value", "dateRange", "text", "showControls"], outputs: ["selected", "closed"] }], animations: [
|
|
465
|
-
trigger('openClose', [
|
|
466
|
-
transition('void => open', [
|
|
467
|
-
style({ transform: 'scaleY(0.5)', opacity: 0 }),
|
|
468
|
-
animate('200ms ease', style({ transform: 'scaleY(1)', opacity: 1 }))
|
|
469
|
-
]),
|
|
470
|
-
transition('open => close', [
|
|
471
|
-
style({ transform: 'scaleY(1)', opacity: 1 }),
|
|
472
|
-
animate('200ms ease', style({ transform: 'scaleY(0.5)', opacity: 0 }))
|
|
473
|
-
]),
|
|
474
|
-
])
|
|
475
|
-
] });
|
|
476
|
-
}
|
|
477
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DatePickerComponent, decorators: [{
|
|
478
|
-
type: Component,
|
|
479
|
-
args: [{ selector: 'particle-date-picker', animations: [
|
|
480
|
-
trigger('openClose', [
|
|
481
|
-
transition('void => open', [
|
|
482
|
-
style({ transform: 'scaleY(0.5)', opacity: 0 }),
|
|
483
|
-
animate('200ms ease', style({ transform: 'scaleY(1)', opacity: 1 }))
|
|
484
|
-
]),
|
|
485
|
-
transition('open => close', [
|
|
486
|
-
style({ transform: 'scaleY(1)', opacity: 1 }),
|
|
487
|
-
animate('200ms ease', style({ transform: 'scaleY(0.5)', opacity: 0 }))
|
|
488
|
-
]),
|
|
489
|
-
])
|
|
490
|
-
], providers: [
|
|
491
|
-
{
|
|
492
|
-
provide: NG_VALUE_ACCESSOR,
|
|
493
|
-
useExisting: forwardRef(() => DatePickerComponent),
|
|
494
|
-
multi: true
|
|
495
|
-
}
|
|
496
|
-
], template: "<ng-container *ngIf=\"!isMobile else mobile\">\r\n <div #datePickerDiv\r\n style=\"overflow: hidden;\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n [ngClass]=\"inputClassList ? '' : 'row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir'\"\r\n >\r\n <div class=\"col size_1 height100 width100\">\r\n <input #dateInput\r\n [(ngModel)]=\"dateString\"\r\n [id]=\"inputId\"\r\n (keydown)=\"filterInput($event)\"\r\n (input)=\"handleInput()\"\r\n (blur)=\"onTouched(); handleBlur()\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder\"\r\n maxlength=\"10\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.enterInFormat + ' mm/dd/yyyy'\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'ptl_input_text_size ptl_input_padding border_none'\"\r\n style=\"outline-offset: -2px;\"\r\n class=\"access height100 width100\"/>\r\n </div>\r\n <div class=\"col center_center min_w50 height100 ptl_brdr_color border_left\" *ngIf=\"!inputOnly\">\r\n <button type=\"button\"\r\n (click)=\"openCalendar($event)\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"calendarButtonClassList ? calendarButtonClassList : 'clear'\"\r\n class=\"access btnset center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n [attr.aria-label]=\"text.openCalendar\" aria-haspopup=\"dialog\">\r\n <i class=\"fas fa-calendar-day\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- calendar widget -->\r\n <particle-popover [targetOverride]=\"dateInput\" #calendarPopover>\r\n <particle-calendar [value]=\"showCalendar ? showCalendar.currentValue : $any(null)\"\r\n [text]=\"$any(text.calendarText)\"\r\n [dateRange]=\"{ minDate: validSelectionInterval.start!, maxDate: validSelectionInterval.end! }\"\r\n (selected)=\"updateModel($event)\"\r\n (closed)=\"handleCalendarClose()\">\r\n </particle-calendar>\r\n </particle-popover>\r\n</ng-container>\r\n\r\n<ng-template #mobile>\r\n <div style=\"overflow: hidden;\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n [ngClass]=\"inputClassList ? '' : 'ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius'\"\r\n >\r\n <div class=\"col size_1 height100 width100\">\r\n <input [(ngModel)]=\"mobileDateString\"\r\n [id]=\"inputId\"\r\n (input)=\"handleMobileInput()\"\r\n (blur)=\"onTouched()\"\r\n type=\"date\"\r\n [placeholder]=\"placeholder\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [disabled]=\"disabled\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'ptl_input_text_size ptl_input_padding border_none'\"\r\n style=\"outline-offset: -2px;\"\r\n class=\"access height100 width100\"/>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{width:100%}.particle_datepicker_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_datepicker{width:100%;min-width:150px;position:relative}.particle_datepicker:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_datepicker_input{position:absolute;inset:0;padding:inherit;width:calc(100% - 2.25em);-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;background-color:transparent;color:inherit}.particle_datepicker_input::-ms-expand{display:none}.particle_datepicker_button{position:absolute;height:calc(100% + 2px);width:2.25em;top:0;right:0;z-index:var(--z-frame);border-top-left-radius:0!important;border-bottom-left-radius:0!important;font-size:inherit;margin:-1px}\n"] }]
|
|
497
|
-
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { value: [{
|
|
498
|
-
type: Input
|
|
499
|
-
}], disabled: [{
|
|
500
|
-
type: Input
|
|
501
|
-
}], dateRange: [{
|
|
502
|
-
type: Input
|
|
503
|
-
}], inputId: [{
|
|
504
|
-
type: Input
|
|
505
|
-
}], ariaLabel: [{
|
|
506
|
-
type: Input
|
|
507
|
-
}], inputClassList: [{
|
|
508
|
-
type: Input
|
|
509
|
-
}], calendarButtonClassList: [{
|
|
510
|
-
type: Input
|
|
511
|
-
}], closeOnSelect: [{
|
|
512
|
-
type: Input
|
|
513
|
-
}], placeholder: [{
|
|
514
|
-
type: Input
|
|
515
|
-
}], inputOnly: [{
|
|
516
|
-
type: Input
|
|
517
|
-
}], text: [{
|
|
518
|
-
type: Input
|
|
519
|
-
}],
|
|
520
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
521
|
-
input: [{
|
|
522
|
-
type: Output
|
|
523
|
-
}], dateSelected: [{
|
|
524
|
-
type: Output
|
|
525
|
-
}], datePickerDiv: [{
|
|
526
|
-
type: ViewChild,
|
|
527
|
-
args: ['datePickerDiv']
|
|
528
|
-
}], calendarDiv: [{
|
|
529
|
-
type: ViewChild,
|
|
530
|
-
args: ['calendarDiv']
|
|
531
|
-
}], calendarPopover: [{
|
|
532
|
-
type: ViewChild,
|
|
533
|
-
args: ['calendarPopover']
|
|
534
|
-
}], onWindowResize: [{
|
|
535
|
-
type: HostListener,
|
|
536
|
-
args: ['window:resize', ['$event']]
|
|
537
|
-
}] } });
|
|
538
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFrQixLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFGLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFBRSxZQUFZLEVBQ3hCLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7Ozs7QUFJN0U7O0dBRUc7QUEyQkgsTUFBTSxPQUFPLG1CQUFtQjtJQXlTVjtJQUE2QjtJQXZTakQ7O09BRUc7SUFDSyxNQUFNLENBQVUsWUFBWSxHQUFHO1FBQ3JDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQ3RDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVztRQUMxQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVc7UUFDcEMsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXO1FBQ3RDLFFBQVE7S0FDVCxD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QkFPUCxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZUFBZTtnQkFPMUIsV0FBVztzQkFEVixTQUFTO3VCQUFDLGFBQWE7Z0JBSXhCLGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBcUo1QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgQW5pbWF0aW9uRXZlbnQsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZm9ybWF0LCBpc0VxdWFsLCBpc1ZhbGlkLCBpc1dpdGhpbkludGVydmFsLCBwYXJzZSB9IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHtEYXRlUGlja2VyVGV4dH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9wYXJ0aWNsZS1jb21wb25lbnQtdGV4dC5tb2RlbCc7XHJcbmltcG9ydCB7UG9wb3ZlckNvbXBvbmVudH0gZnJvbSAnLi4vcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50IHRvIGFsbG93IGEgdXNlciB0byBpbnB1dC9zZWxlY3QgYSBkYXRlXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BhcnRpY2xlLWRhdGUtcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5jc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdvcGVuQ2xvc2UnLCBbXHJcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gb3BlbicsIFtcclxuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3NjYWxlWSgwLjUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlJyxcclxuICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJywgb3BhY2l0eTogMSB9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ29wZW4gPT4gY2xvc2UnLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLCBvcGFjaXR5OiAxIH0pLFxyXG4gICAgICAgIGFuaW1hdGUoJzIwMG1zIGVhc2UnLFxyXG4gICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMC41KScsIG9wYWNpdHk6IDAgfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgXSlcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFsbG93ZWQga2V5cyBmb3IgZGF0ZSBpbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFMTE9XRURfS0VZUyA9IFtcclxuICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLFxyXG4gICAgJzgnLCAnOScsICdUYWInLCAnRW50ZXInLCAnLycsICdBcnJvd0xlZnQnLFxyXG4gICAgJ0Fycm93VXAnLCAnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nLFxyXG4gICAgJ1NoaWZ0TGVmdCcsICdTaGlmdFJpZ2h0JywgJ0JhY2tzcGFjZScsXHJcbiAgICAnRGVsZXRlJ1xyXG4gIF07XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hdGNoZXMgWVlZWS1NTS1ERFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQlJPV1NFUl9EQVRFX1BJQ0tFUl9GT1JNQVQgPSBuZXcgUmVnRXhwKCdeXFxcXGRcXFxcZFxcXFxkXFxcXGQtXFxcXGRcXFxcZC1cXFxcZFxcXFxkJCcpO1xyXG5cclxuICAvKipcclxuICAgKiBNYXRjaGVzIE1NL0REL1lZWVlcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZVTExfREFURV9GT1JNQVQgPSBuZXcgUmVnRXhwKCdeXFxcXGRcXFxcZFxcXFwvXFxcXGRcXFxcZFxcXFwvXFxcXGRcXFxcZFxcXFxkXFxcXGQkJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hdGNoZXMgTS9EL1lZWVlcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNIT1JUX0RBVEVfRk9STUFUID0gbmV3IFJlZ0V4cCgnXlxcXFxkXFxcXC9cXFxcZFxcXFwvXFxcXGRcXFxcZFxcXFxkXFxcXGQkJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hdGNoZXMgTS9ERC9ZWVlZXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTSE9SVF9NT05USF9EQVRFX0ZPUk1BVCA9IG5ldyBSZWdFeHAoJ15cXFxcZFxcXFwvXFxcXGRcXFxcZFxcXFwvXFxcXGRcXFxcZFxcXFxkXFxcXGQkJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hdGNoZXMgTU0vRC9ZWVlZXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTSE9SVF9EQVlfREFURV9GT1JNQVQgPSBuZXcgUmVnRXhwKCdeXFxcXGRcXFxcZFxcXFwvXFxcXGRcXFxcL1xcXFxkXFxcXGRcXFxcZFxcXFxkJCcpO1xyXG5cclxuICAvKipcclxuICAgKiBBIHJlZmVyZW5jZSBkYXRlIHdpdGggYWxsIGZpZWxkcyBzZXQgdG8gMFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcmVmZXJlbmNlRGF0ZSA9IG5ldyBEYXRlKDAsIDAsIDAsIDAsIDAsIDAsIDApO1xyXG5cclxuICAvKipcclxuICAgKiBWYWx1ZSBpbnB1dCBzZXR0ZXJcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSkge1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IG51bGwgYXMgYW55O1xyXG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSBudWxsIGFzIGFueTtcclxuICAgICAgdGhpcy5tb2JpbGVEYXRlU3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcbiAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKHZhbHVlLCB0aGlzLl92YWx1ZSkpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy5kYXRlU3RyaW5nID0gRGF0ZVBpY2tlckNvbXBvbmVudC5wYXJzZURhdGUodmFsdWUpO1xyXG4gICAgICB0aGlzLnNldE1vYmlsZVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgZGF0ZVJhbmdlKGRhdGVSYW5nZTogeyBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlIH0pIHtcclxuICAgIGlmIChkYXRlUmFuZ2U/Lm1pbkRhdGUgPiBkYXRlUmFuZ2U/Lm1heERhdGUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaW4gZGF0ZSBtdXN0IGJlIGxlc3MgdGhhbiBtYXggZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICB0aGlzLnZhbGlkU2VsZWN0aW9uSW50ZXJ2YWwgPSB7XHJcbiAgICAgIHN0YXJ0OiBkYXRlUmFuZ2U/Lm1pbkRhdGUgPz8gbmV3IERhdGUoeWVhciAtIDEwMCwgMCwgMSksXHJcbiAgICAgIGVuZDogZGF0ZVJhbmdlPy5tYXhEYXRlID8/IG5ldyBEYXRlKHllYXIgKyA1MCwgMTEsIDMxKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBJRCB0byBzZXQgb24gdGhlIGlucHV0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBpbnB1dElkOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmFsdWUgdG8gdXNlIGFzIHRoZSBkYXRlIHBpY2tlciBpbnB1dCdzIGFyaWEgbGFiZWxcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGFyaWFMYWJlbCA9ICdEYXRlJztcclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgY2xhc3MtbGlzdCB0byBhZGQgdG8gdGhlIGRhdGUgcGlja2VyIGlucHV0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBpbnB1dENsYXNzTGlzdCA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBjbGFzcy1saXN0IHRvIGFkZCB0byB0aGUgY2FsZW5kYXIgYnV0dG9uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBjYWxlbmRhckJ1dHRvbkNsYXNzTGlzdCA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSB0aGUgcGlja2VyIHdoZW4gYSBzZWxlY3Rpb24gaXMgbWFkZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgY2xvc2VPblNlbGVjdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBsYWNlaG9sZGVyIG92ZXJyaWRlXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwbGFjZWhvbGRlciA9ICdtbS9kZC95eXl5JztcclxuXHJcbiAgQElucHV0KClcclxuICBpbnB1dE9ubHkgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfdGV4dDogRGF0ZVBpY2tlclRleHQgPSB7XHJcbiAgICBlbnRlckluRm9ybWF0OiAnZW50ZXIgaW4gZm9ybWF0JyxcclxuICAgIG9wZW5DYWxlbmRhcjogJ09wZW4gdGhlIGNhbGVuZGFyJ1xyXG4gIH0gYXMgRGF0ZVBpY2tlclRleHQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHRleHQodGV4dDogRGF0ZVBpY2tlclRleHQpIHtcclxuICAgIGlmICh0ZXh0KSB7XHJcbiAgICAgIHRoaXMuX3RleHQgPSB0ZXh0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHRleHQoKTogRGF0ZVBpY2tlclRleHQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIG9uIGRhdGUgcGlja2VyIGlucHV0XHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcclxuICBpbnB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCBvbiB2YWxpZCBkYXRlIHNlbGVjdGlvbi9pbnB1dFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIGRhdGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBkYXRlIHBpY2tlciBkaXZcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdkYXRlUGlja2VyRGl2JylcclxuICBkYXRlUGlja2VyRGl2OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBWaWV3Q2hpbGQgb2YgdGhlIGNhbGVuZGFyIGRpdlxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2NhbGVuZGFyRGl2JylcclxuICBjYWxlbmRhckRpdjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXJQb3BvdmVyJylcclxuICBjYWxlbmRhclBvcG92ZXI6IFBvcG92ZXJDb21wb25lbnQgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgZGF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZml4ZWQgaGVpZ2h0IG9mIHRoZSBjYWxlbmRhciB3aWRnZXRcclxuICAgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGNhbGVuZGFySGVpZ2h0ID0gMzQwO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZml4ZWQgd2lkdGggb2YgdGhlIGNhbGVuZGFyIHdpZGdldFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsZW5kYXJXaWR0aCA9IDMwMDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGFtb3VudCBvZiBwYWRkaW5nIHRvIGFwcGx5IGJldHdlZW4gdGhlIGRhdGUgcGlja2VyIGlucHV0IGFuZCB0aGUgY2FsZW5kYXIgd2lkZ2V0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhclBhZGRpbmcgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBTdHJpbmcgdHJhY2tpbmcgZGF0ZSBwaWNrZXIgaW5wdXRcclxuICAgKi9cclxuICBkYXRlU3RyaW5nID0gJyc7XHJcblxyXG4gIG1vYmlsZURhdGVTdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBjYWxlbmRhclxyXG4gICAqL1xyXG4gIHNob3dDYWxlbmRhcjogeyBjdXJyZW50VmFsdWU6IERhdGUgfSA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBJbiBtb2JpbGUgKHNjcmVlbiB3aWR0aCBpcyBsZXNzIHRoYW4gNzY4KSwgc3dhcCB0byBhIG5hdGl2ZSBpbnB1dFxyXG4gICAqL1xyXG4gIGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPD0gNzY4O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdmFsaWQgc2VsZWN0aW9uIGludGVydmFsXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICB2YWxpZFNlbGVjdGlvbkludGVydmFsID0ge1xyXG4gICAgc3RhcnQ6IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSAtIDEwMCwgMCwgMSksXHJcbiAgICBlbmQ6IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSArIDUwLCAwLCAxKVxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBpbnRlcm5hbCBjb250cm9sIGFjY2Vzc29yIHZhbHVlXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF92YWx1ZTogRGF0ZSA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgaW50ZXJuYWwgZGlzYWJsZWQgc3RhdGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdpbmRvdyByZXNpemUgdW5saXN0ZW4gZnVuY3Rpb25cclxuICAgKi9cclxuICBwcml2YXRlIHJlc2l6ZUxpc3RlbmVyOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcnNlIHRoZSBpbnB1dCBEYXRlIHZhbHVlIGludG8gYSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHBhcnNlXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGUodmFsdWU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICF2YWx1ZSA/IG51bGwgYXMgYW55IDogZm9ybWF0KHZhbHVlLCAnTU0vZGQveXl5eScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2UgdGhlIGlucHV0IGRhdGUgc3RyaW5nIGludG8gYSBEYXRlXHJcbiAgICogQHBhcmFtIGRhdGVTdHJpbmcgdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmc6IHN0cmluZyk6IERhdGUge1xyXG4gICAgbGV0IHBhcnNlZERhdGU6IERhdGU7XHJcbiAgICB0cnkge1xyXG4gICAgICBwYXJzZWREYXRlID0gcGFyc2UoZGF0ZVN0cmluZywgRGF0ZVBpY2tlckNvbXBvbmVudC5nZXREYXRlRm9ybWF0KGRhdGVTdHJpbmcpLCB0aGlzLnJlZmVyZW5jZURhdGUpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBwYXJzZWREYXRlID0gbnVsbCBhcyBhbnk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzVmFsaWQocGFyc2VkRGF0ZSkgPyBwYXJzZWREYXRlIDogbnVsbCBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGRhdGUgZm9ybWF0IHRoYXQgbWF0Y2hlcyB0aGUgaW5wdXQgZGF0ZSBzdHJpbmcsIG51bGwgaWYgbm8gbWF0Y2hcclxuICAgKiBAcGFyYW0gZGF0ZVN0cmluZyB0aGUgc3RyaW5nIHRvIHRlc3RcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdldERhdGVGb3JtYXQoZGF0ZVN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHRoaXMuRlVMTF9EQVRFX0ZPUk1BVC5sYXN0SW5kZXggPSAwO1xyXG4gICAgdGhpcy5TSE9SVF9NT05USF9EQVRFX0ZPUk1BVC5sYXN0SW5kZXggPSAwO1xyXG4gICAgdGhpcy5TSE9SVF9EQVlfREFURV9GT1JNQVQubGFzdEluZGV4ID0gMDtcclxuICAgIHRoaXMuU0hPUlRfREFURV9GT1JNQVQubGFzdEluZGV4ID0gMDtcclxuICAgIHRoaXMuQlJPV1NFUl9EQVRFX1BJQ0tFUl9GT1JNQVQubGFzdEluZGV4ID0gMDtcclxuXHJcbiAgICBsZXQgZGF0ZUZvcm1hdDogc3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcbiAgICBpZiAodGhpcy5GVUxMX0RBVEVfRk9STUFULnRlc3QoZGF0ZVN0cmluZykpIHtcclxuICAgICAgZGF0ZUZvcm1hdCA9ICdNTS9kZC95eXl5JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5TSE9SVF9NT05USF9EQVRFX0ZPUk1BVC50ZXN0KGRhdGVTdHJpbmcpKSB7XHJcbiAgICAgIGRhdGVGb3JtYXQgPSAnTS9kZC95eXl5JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5TSE9SVF9EQVlfREFURV9GT1JNQVQudGVzdChkYXRlU3RyaW5nKSkge1xyXG4gICAgICBkYXRlRm9ybWF0ID0gJ01NL2QveXl5eSc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuU0hPUlRfREFURV9GT1JNQVQudGVzdChkYXRlU3RyaW5nKSkge1xyXG4gICAgICBkYXRlRm9ybWF0ID0gJ00vZC95eXl5JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5CUk9XU0VSX0RBVEVfUElDS0VSX0ZPUk1BVC50ZXN0KGRhdGVTdHJpbmcpKSB7XHJcbiAgICAgIGRhdGVGb3JtYXQgPSd5eXl5LU1NLWRkJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0ZUZvcm1hdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gY2hhbmdlXHJcbiAgICovXHJcbiAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gdG91Y2hcclxuICAgKi9cclxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXBlbmRlbmN5IGluamVjdGlvbiBzaXRlXHJcbiAgICogQHBhcmFtIHJlbmRlcmVyIHRoZSBBbmd1bGFyIHJlbmRlcmVyXHJcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIHRoZSBBbmd1bGFyIGNoYW5nZSBkZXRlY3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWx1ZSBnZXR0ZXJcclxuICAgKi9cclxuICBnZXQgdmFsdWUoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gRGF0ZVBpY2tlckNvbXBvbmVudC5wYXJzZURhdGVTdHJpbmcodGhpcy5kYXRlU3RyaW5nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc2FibGVkIGdldHRlclxyXG4gICAqL1xyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIG9uV2luZG93UmVzaXplKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNNb2JpbGUgPSBldmVudC50YXJnZXQuaW5uZXJXaWR0aCA8PSA3Njg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0IGNvbXBvbmVudCwgc2V0IHVwIHdpbmRvdyByZXNpemUgbGlzdGVuZXJcclxuICAgKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzaXplTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih3aW5kb3csICdyZXNpemUnLCAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcikge1xyXG4gICAgICAgIHRoaXMuc2V0Q2FsZW5kYXJQb3NpdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlc3Ryb3kgY29tcG9uZW50LCBpbnZva2Ugd2luZG93IHJlc2l6ZSB1bmxpc3RlbiBmdW5jdGlvblxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVzaXplTGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5yZXNpemVMaXN0ZW5lcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV3JpdGUgdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXHJcbiAgICovXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIGlzV2l0aGluSW50ZXJ2YWwodmFsdWUsIHRoaXMudmFsaWRTZWxlY3Rpb25JbnRlcnZhbCkpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IG51bGwgYXMgYW55O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBjb250cm9sIHZhbHVlIGFjY2Vzc29yIGNoYW5nZSBmdW5jdGlvblxyXG4gICAqIEBwYXJhbSBmbiB0aGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXJcclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgdG91Y2ggaGFuZGxlclxyXG4gICAqIEBwYXJhbSBmbiB0aGUgdG91Y2ggaGFuZGxlciB0byByZWdpc3RlclxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGRpc2FibGVkIHN0YXRlXHJcbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgd2hldGhlciBvciBub3QgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgZGlzYWJsZWRcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbmx5IGFsbG93IGlucHV0IGZyb20gZGlnaXRzLCBmb3J3YXJkIHNsYXNoZXMsIGFuZCBuYXZpZ2F0aW9uIGtleXNcclxuICAgKi9cclxuICBmaWx0ZXJJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3Qge2tleX0gPSBldmVudDtcclxuICAgIGlmICghRGF0ZVBpY2tlckNvbXBvbmVudC5BTExPV0VEX0tFWVMuaW5jbHVkZXMoa2V5KSAmJiAhZXZlbnQuY3RybEtleSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChrZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9wZW5DYWxlbmRhcigpLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHZhbHVlIGlmIG5vIGlucHV0LCB3cml0ZSBwYXJzZWQgZGF0ZSBpZiBpbnB1dCByZXF1aXJlbWVudHMgZnVsZmlsbGVkXHJcbiAgICovXHJcbiAgaGFuZGxlQmx1cigpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMudXBkYXRlTW9kZWwoRGF0ZVBpY2tlckNvbXBvbmVudC5wYXJzZURhdGVTdHJpbmcodGhpcy5kYXRlU3RyaW5nKSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlTW9kZWwobnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV3JpdGUgb24gaW5wdXQgaWYgdmFsaWQgZGF0ZSB3aXRoaW4gaW50ZXJ2YWxcclxuICAgKi9cclxuICBoYW5kbGVJbnB1dCgpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSBEYXRlUGlja2VyQ29tcG9uZW50LnBhcnNlRGF0ZVN0cmluZyh0aGlzLmRhdGVTdHJpbmcpO1xyXG4gICAgICBpZiAocGFyc2VkRGF0ZSAhPT0gbnVsbCAmJiBpc1dpdGhpbkludGVydmFsKHBhcnNlZERhdGUsIHRoaXMudmFsaWRTZWxlY3Rpb25JbnRlcnZhbCkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU1vZGVsKHBhcnNlZERhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7IH1cclxuXHJcbiAgICB0aGlzLmlucHV0LmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZU1vYmlsZUlucHV0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy5tb2JpbGVEYXRlU3RyaW5nO1xyXG4gICAgdGhpcy5oYW5kbGVJbnB1dCgpO1xyXG4gIH1cclxuXHJcbiAgc2V0TW9iaWxlVmFsdWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnZhbHVlLmdldFRpbWV6b25lT2Zmc2V0KCk7XHJcbiAgICAgIGNvbnN0IGRhdGVGb3JGb3JtYXR0aW5nID0gbmV3IERhdGUodGhpcy52YWx1ZS5nZXRUaW1lKCkgLSAob2Zmc2V0ICogNjAgKiAxMDAwKSk7XHJcbiAgICAgIHRoaXMubW9iaWxlRGF0ZVN0cmluZyA9IGRhdGVGb3JGb3JtYXR0aW5nLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbW9kZWwgdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHVwZGF0ZSB0aGUgbW9kZWwgdG9cclxuICAgKi9cclxuICB1cGRhdGVNb2RlbCh2YWx1ZTogRGF0ZSk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWVCZWZvcmVVcGRhdGUgPSB0aGlzLl92YWx1ZTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIGlzV2l0aGluSW50ZXJ2YWwodmFsdWUsIHRoaXMudmFsaWRTZWxlY3Rpb25JbnRlcnZhbCkpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICghaXNFcXVhbCh0aGlzLnZhbHVlLCB2YWx1ZUJlZm9yZVVwZGF0ZSkpIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZVNlbGVjdGVkLmVtaXQodmFsdWUpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhhbmRsZUNhbGVuZGFyQ2xvc2UoKSwgMjAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGwgYXMgYW55O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlzRXF1YWwodGhpcy52YWx1ZSwgdmFsdWVCZWZvcmVVcGRhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgICAgICB0aGlzLnNldE1vYmlsZVZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW4gdGhlIGNhbGVuZGFyIHdpZGdldFxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2xpY2sgTW91c2VFdmVudFxyXG4gICAqL1xyXG4gIG9wZW5DYWxlbmRhcihldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IHsgY3VycmVudFZhbHVlOiB0aGlzLnZhbHVlIH07XHJcbiAgICB0aGlzLmNhbGVuZGFyUG9wb3Zlci50b2dnbGUoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGlkZSBjYWxlbmRhciBvdmVybGF5IGFuZCByZW1vdmUgY2FsZW5kYXIgZnJvbSB0aGUgRE9NXHJcbiAgICovXHJcbiAgaGFuZGxlQ2FsZW5kYXJDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gbnVsbCBhcyBhbnk7XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhclBvcG92ZXIpIHtcclxuICAgICAgdGhpcy5jYWxlbmRhclBvcG92ZXIuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZSBhbmQgc2V0IHRoZSBjYWxlbmRhcidzIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG4gICAqIFBvc2l0aW9uaW5nIHByZWZlcnMgdG8gb3BlbiBhdCB0aGUgYm90dG9tLCBpZiBub3QgZW5vdWdoIHJvb20gb24gYm90dG9tLFxyXG4gICAqIHBvc2l0aW9uaW5nIGlzIGF0dGVtcHRlZCBhdCB0aGUgdG9wLCBvdGhlcndpc2UgaXQgYXR0ZW1wdHMgdG8gdmVydGljYWxseVxyXG4gICAqIGNlbnRlclxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0Q2FsZW5kYXJQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHtsZWZ0LCB0b3AsIGJvdHRvbX0gPSB0aGlzLmRhdGVQaWNrZXJEaXYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGRhdGVQaWNrZXJCb3R0b21MZWZ0QW5jaG9yID0gYm90dG9tO1xyXG4gICAgY29uc3QgYXZhaWxhYmxlQm90dG9tU3BhY2UgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBkYXRlUGlja2VyQm90dG9tTGVmdEFuY2hvcjtcclxuICAgIGNvbnN0IGF2YWlsYWJsZVRvcFNwYWNlID0gdG9wO1xyXG4gICAgY29uc3Qgb2Zmc2V0Q2FsZW5kYXJIZWlnaHQgPSB0aGlzLmNhbGVuZGFySGVpZ2h0ICsgdGhpcy5jYWxlbmRhclBhZGRpbmc7XHJcbiAgICBsZXQgbGVmdFBvc2l0aW9uOiBudW1iZXIsIHRvcFBvc2l0aW9uOiBudW1iZXIsIHRyYW5zZm9ybU9yaWdpbjogc3RyaW5nO1xyXG5cclxuICAgIGlmIChhdmFpbGFibGVCb3R0b21TcGFjZSA+IG9mZnNldENhbGVuZGFySGVpZ2h0KSB7XHJcbiAgICAgIHRyYW5zZm9ybU9yaWdpbiA9ICd0b3AgbGVmdCc7XHJcbiAgICAgIHRvcFBvc2l0aW9uID0gZGF0ZVBpY2tlckJvdHRvbUxlZnRBbmNob3IgKyB0aGlzLmNhbGVuZGFyUGFkZGluZztcclxuICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlVG9wU3BhY2UgPiBvZmZzZXRDYWxlbmRhckhlaWdodCkge1xyXG4gICAgICB0cmFuc2Zvcm1PcmlnaW4gPSAnYm90dG9tIGxlZnQnO1xyXG4gICAgICB0b3BQb3NpdGlvbiA9IHRvcCAtIG9mZnNldENhbGVuZGFySGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJhbnNmb3JtT3JpZ2luID0gJ3RvcCBsZWZ0JztcclxuXHJcbiAgICAgIGlmICh0aGlzLmNhbGVuZGFySGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7XHJcbiAgICAgICAgdG9wUG9zaXRpb24gPSAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gd2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5jYWxlbmRhckhlaWdodDtcclxuICAgICAgICB0b3BQb3NpdGlvbiA9IGF2YWlsYWJsZVNwYWNlIC8gMjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxlZnRQb3NpdGlvbiA9IGxlZnQ7XHJcbiAgICBpZiAoKGxlZnQgKyB0aGlzLmNhbGVuZGFyV2lkdGgpID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgbGVmdFBvc2l0aW9uID0gbGVmdCAtICgobGVmdCArIHRoaXMuY2FsZW5kYXJXaWR0aCkgLSB3aW5kb3cuaW5uZXJXaWR0aCkgLSAxMDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY2FsZW5kYXJEaXYubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybS1vcmlnaW4nLCB0cmFuc2Zvcm1PcmlnaW4pO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNhbGVuZGFyRGl2Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7bGVmdFBvc2l0aW9ufXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY2FsZW5kYXJEaXYubmF0aXZlRWxlbWVudCwgJ3RvcCcsIGAke3RvcFBvc2l0aW9ufXB4YCk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGUgZWxzZSBtb2JpbGVcIj5cclxuICA8ZGl2ICNkYXRlUGlja2VyRGl2XHJcbiAgICAgICBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCJcclxuICAgICAgIFtzdHlsZS5maWx0ZXJdPVwiZGlzYWJsZWQgPyAnYnJpZ2h0bmVzcyguOTUpJyA6ICcnXCJcclxuICAgICAgIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3NMaXN0ID8gJycgOiAncm93IHB0bF9pbnB1dCBwdGxfaW5wdXRfaGVpZ2h0IHB0bF9pbnB1dF9iZ19jb2xvciBwdGxfYnJkcl9jb2xvciBwdGxfYnJkcl9zaXplIHB0bF9icmRyX3JhZGl1cyBlbnRfcjJsX2RpcidcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wgc2l6ZV8xIGhlaWdodDEwMCB3aWR0aDEwMFwiPlxyXG4gICAgICA8aW5wdXQgI2RhdGVJbnB1dFxyXG4gICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRlU3RyaW5nXCJcclxuICAgICAgICAgICAgIFtpZF09XCJpbnB1dElkXCJcclxuICAgICAgICAgICAgIChrZXlkb3duKT1cImZpbHRlcklucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgKGlucHV0KT1cImhhbmRsZUlucHV0KClcIlxyXG4gICAgICAgICAgICAgKGJsdXIpPVwib25Ub3VjaGVkKCk7IGhhbmRsZUJsdXIoKVwiXHJcbiAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxyXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgKyAnLCAnICsgdGV4dC5lbnRlckluRm9ybWF0ICsgJyBtbS9kZC95eXl5J1wiXHJcbiAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc0xpc3QgPyBpbnB1dENsYXNzTGlzdCA6ICdwdGxfaW5wdXRfdGV4dF9zaXplIHB0bF9pbnB1dF9wYWRkaW5nIGJvcmRlcl9ub25lJ1wiXHJcbiAgICAgICAgICAgICBzdHlsZT1cIm91dGxpbmUtb2Zmc2V0OiAtMnB4O1wiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBoZWlnaHQxMDAgd2lkdGgxMDBcIi8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wgY2VudGVyX2NlbnRlciBtaW5fdzUwIGhlaWdodDEwMCBwdGxfYnJkcl9jb2xvciBib3JkZXJfbGVmdFwiICpuZ0lmPVwiIWlucHV0T25seVwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ2FsZW5kYXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYWxlbmRhckJ1dHRvbkNsYXNzTGlzdCA/IGNhbGVuZGFyQnV0dG9uQ2xhc3NMaXN0IDogJ2NsZWFyJ1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuc2V0IGNlbnRlcl9jZW50ZXIgaGVpZ2h0MTAwIHdpZHRoMTAwXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIm91dGxpbmUtb2Zmc2V0OiAtMnB4O1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0Lm9wZW5DYWxlbmRhclwiIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jYWxlbmRhci1kYXlcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gY2FsZW5kYXIgd2lkZ2V0IC0tPlxyXG4gIDxwYXJ0aWNsZS1wb3BvdmVyIFt0YXJnZXRPdmVycmlkZV09XCJkYXRlSW5wdXRcIiAjY2FsZW5kYXJQb3BvdmVyPlxyXG4gICAgPHBhcnRpY2xlLWNhbGVuZGFyIFt2YWx1ZV09XCJzaG93Q2FsZW5kYXIgPyBzaG93Q2FsZW5kYXIuY3VycmVudFZhbHVlIDogJGFueShudWxsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJGFueSh0ZXh0LmNhbGVuZGFyVGV4dClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtkYXRlUmFuZ2VdPVwieyBtaW5EYXRlOiB2YWxpZFNlbGVjdGlvbkludGVydmFsLnN0YXJ0ISwgbWF4RGF0ZTogdmFsaWRTZWxlY3Rpb25JbnRlcnZhbC5lbmQhIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJ1cGRhdGVNb2RlbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VkKT1cImhhbmRsZUNhbGVuZGFyQ2xvc2UoKVwiPlxyXG4gICAgPC9wYXJ0aWNsZS1jYWxlbmRhcj5cclxuICA8L3BhcnRpY2xlLXBvcG92ZXI+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5nLXRlbXBsYXRlICNtb2JpbGU+XHJcbiAgPGRpdiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCJcclxuICAgICAgIFtzdHlsZS5maWx0ZXJdPVwiZGlzYWJsZWQgPyAnYnJpZ2h0bmVzcyguOTUpJyA6ICcnXCJcclxuICAgICAgIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3NMaXN0ID8gJycgOiAncHRsX2lucHV0IHB0bF9pbnB1dF9oZWlnaHQgcHRsX2lucHV0X2JnX2NvbG9yIHB0bF9icmRyX2NvbG9yIHB0bF9icmRyX3NpemUgcHRsX2JyZHJfcmFkaXVzJ1wiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzEgaGVpZ2h0MTAwIHdpZHRoMTAwXCI+XHJcbiAgPGlucHV0IFsobmdNb2RlbCldPVwibW9iaWxlRGF0ZVN0cmluZ1wiXHJcbiAgICAgICAgIFtpZF09XCJpbnB1dElkXCJcclxuICAgICAgICAgKGlucHV0KT1cImhhbmRsZU1vYmlsZUlucHV0KClcIlxyXG4gICAgICAgICAoYmx1cik9XCJvblRvdWNoZWQoKVwiXHJcbiAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxyXG4gICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICBbbmdDbGFzc109XCJpbnB1dENsYXNzTGlzdCA/IGlucHV0Q2xhc3NMaXN0IDogJ3B0bF9pbnB1dF90ZXh0X3NpemUgcHRsX2lucHV0X3BhZGRpbmcgYm9yZGVyX25vbmUnXCJcclxuICAgICAgICAgc3R5bGU9XCJvdXRsaW5lLW9mZnNldDogLTJweDtcIlxyXG4gICAgICAgICBjbGFzcz1cImFjY2VzcyBoZWlnaHQxMDAgd2lkdGgxMDBcIi8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
|