@skyux/datetime 5.7.1 → 6.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/esm2020/index.mjs +28 -0
  2. package/esm2020/lib/modules/date-pipe/date-format-utility.mjs +46 -0
  3. package/esm2020/lib/modules/date-pipe/date-pipe.module.mjs +21 -0
  4. package/esm2020/lib/modules/date-pipe/date.pipe.mjs +65 -0
  5. package/esm2020/lib/modules/date-pipe/fuzzy-date.pipe.mjs +47 -0
  6. package/esm2020/lib/modules/date-range-picker/date-range-picker.component.mjs +448 -0
  7. package/esm2020/lib/modules/date-range-picker/date-range-picker.module.mjs +47 -0
  8. package/esm2020/lib/modules/date-range-picker/date-range.service.mjs +97 -0
  9. package/esm2020/lib/modules/date-range-picker/types/date-range-calculation.mjs +2 -0
  10. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +2 -0
  11. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +2 -0
  12. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +118 -0
  13. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +23 -0
  14. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +2 -0
  15. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator.mjs +56 -0
  16. package/esm2020/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +2 -0
  17. package/esm2020/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +147 -0
  18. package/esm2020/lib/modules/date-range-picker/types/date-range-relative-value.mjs +249 -0
  19. package/esm2020/lib/modules/date-range-picker/types/date-range.mjs +2 -0
  20. package/esm2020/lib/modules/datepicker/date-formatter.mjs +38 -0
  21. package/esm2020/lib/modules/datepicker/datepicker-adapter.service.mjs +33 -0
  22. package/esm2020/lib/modules/datepicker/datepicker-calendar-change.mjs +2 -0
  23. package/esm2020/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +310 -0
  24. package/esm2020/lib/modules/datepicker/datepicker-calendar.component.mjs +104 -0
  25. package/esm2020/lib/modules/datepicker/datepicker-config.service.mjs +21 -0
  26. package/esm2020/lib/modules/datepicker/datepicker-custom-date.mjs +2 -0
  27. package/esm2020/lib/modules/datepicker/datepicker-date.mjs +2 -0
  28. package/esm2020/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +466 -0
  29. package/esm2020/lib/modules/datepicker/datepicker-input.directive.mjs +445 -0
  30. package/esm2020/lib/modules/datepicker/datepicker.component.mjs +328 -0
  31. package/esm2020/lib/modules/datepicker/datepicker.module.mjs +95 -0
  32. package/esm2020/lib/modules/datepicker/datepicker.service.mjs +21 -0
  33. package/esm2020/lib/modules/datepicker/daypicker-button.component.mjs +22 -0
  34. package/esm2020/lib/modules/datepicker/daypicker-cell.component.mjs +126 -0
  35. package/esm2020/lib/modules/datepicker/daypicker.component.mjs +211 -0
  36. package/esm2020/lib/modules/datepicker/fuzzy-date.mjs +2 -0
  37. package/esm2020/lib/modules/datepicker/fuzzy-date.service.mjs +403 -0
  38. package/esm2020/lib/modules/datepicker/monthpicker.component.mjs +80 -0
  39. package/esm2020/lib/modules/datepicker/yearpicker.component.mjs +86 -0
  40. package/esm2020/lib/modules/shared/sky-datetime-resources.module.mjs +131 -0
  41. package/esm2020/lib/modules/timepicker/timepicker.component.mjs +361 -0
  42. package/esm2020/lib/modules/timepicker/timepicker.directive.mjs +228 -0
  43. package/esm2020/lib/modules/timepicker/timepicker.interface.mjs +2 -0
  44. package/esm2020/lib/modules/timepicker/timepicker.module.mjs +46 -0
  45. package/esm2020/skyux-datetime.mjs +5 -0
  46. package/esm2020/testing/datepicker-fixture.mjs +54 -0
  47. package/esm2020/testing/public-api.mjs +3 -0
  48. package/esm2020/testing/skyux-datetime-testing.mjs +5 -0
  49. package/esm2020/testing/timepicker-fixture.mjs +50 -0
  50. package/fesm2015/{skyux-datetime-testing.js → skyux-datetime-testing.mjs} +1 -1
  51. package/fesm2015/skyux-datetime-testing.mjs.map +1 -0
  52. package/fesm2015/skyux-datetime.mjs +4726 -0
  53. package/fesm2015/skyux-datetime.mjs.map +1 -0
  54. package/{esm2015/testing/datepicker-fixture.js → fesm2020/skyux-datetime-testing.mjs} +57 -2
  55. package/fesm2020/skyux-datetime-testing.mjs.map +1 -0
  56. package/{fesm2015/skyux-datetime.js → fesm2020/skyux-datetime.mjs} +110 -158
  57. package/fesm2020/skyux-datetime.mjs.map +1 -0
  58. package/package.json +38 -17
  59. package/testing/package.json +5 -5
  60. package/bundles/skyux-datetime-testing.umd.js +0 -143
  61. package/bundles/skyux-datetime.umd.js +0 -5488
  62. package/esm2015/index.js +0 -28
  63. package/esm2015/index.js.map +0 -1
  64. package/esm2015/lib/modules/date-pipe/date-format-utility.js +0 -46
  65. package/esm2015/lib/modules/date-pipe/date-format-utility.js.map +0 -1
  66. package/esm2015/lib/modules/date-pipe/date-pipe.module.js +0 -21
  67. package/esm2015/lib/modules/date-pipe/date-pipe.module.js.map +0 -1
  68. package/esm2015/lib/modules/date-pipe/date.pipe.js +0 -65
  69. package/esm2015/lib/modules/date-pipe/date.pipe.js.map +0 -1
  70. package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js +0 -47
  71. package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js.map +0 -1
  72. package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js +0 -453
  73. package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js.map +0 -1
  74. package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js +0 -47
  75. package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js.map +0 -1
  76. package/esm2015/lib/modules/date-range-picker/date-range.service.js +0 -97
  77. package/esm2015/lib/modules/date-range-picker/date-range.service.js.map +0 -1
  78. package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js +0 -2
  79. package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js.map +0 -1
  80. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js +0 -2
  81. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js.map +0 -1
  82. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js +0 -2
  83. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js.map +0 -1
  84. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js +0 -118
  85. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js.map +0 -1
  86. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js +0 -23
  87. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js.map +0 -1
  88. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js +0 -2
  89. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js.map +0 -1
  90. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js +0 -56
  91. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js.map +0 -1
  92. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js +0 -2
  93. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js.map +0 -1
  94. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js +0 -147
  95. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js.map +0 -1
  96. package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js +0 -249
  97. package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js.map +0 -1
  98. package/esm2015/lib/modules/date-range-picker/types/date-range.js +0 -2
  99. package/esm2015/lib/modules/date-range-picker/types/date-range.js.map +0 -1
  100. package/esm2015/lib/modules/datepicker/date-formatter.js +0 -38
  101. package/esm2015/lib/modules/datepicker/date-formatter.js.map +0 -1
  102. package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js +0 -33
  103. package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js.map +0 -1
  104. package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js +0 -2
  105. package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js.map +0 -1
  106. package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js +0 -315
  107. package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js.map +0 -1
  108. package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js +0 -109
  109. package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js.map +0 -1
  110. package/esm2015/lib/modules/datepicker/datepicker-config.service.js +0 -21
  111. package/esm2015/lib/modules/datepicker/datepicker-config.service.js.map +0 -1
  112. package/esm2015/lib/modules/datepicker/datepicker-custom-date.js +0 -2
  113. package/esm2015/lib/modules/datepicker/datepicker-custom-date.js.map +0 -1
  114. package/esm2015/lib/modules/datepicker/datepicker-date.js +0 -2
  115. package/esm2015/lib/modules/datepicker/datepicker-date.js.map +0 -1
  116. package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js +0 -467
  117. package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js.map +0 -1
  118. package/esm2015/lib/modules/datepicker/datepicker-input.directive.js +0 -446
  119. package/esm2015/lib/modules/datepicker/datepicker-input.directive.js.map +0 -1
  120. package/esm2015/lib/modules/datepicker/datepicker.component.js +0 -333
  121. package/esm2015/lib/modules/datepicker/datepicker.component.js.map +0 -1
  122. package/esm2015/lib/modules/datepicker/datepicker.module.js +0 -95
  123. package/esm2015/lib/modules/datepicker/datepicker.module.js.map +0 -1
  124. package/esm2015/lib/modules/datepicker/datepicker.service.js +0 -21
  125. package/esm2015/lib/modules/datepicker/datepicker.service.js.map +0 -1
  126. package/esm2015/lib/modules/datepicker/daypicker-button.component.js +0 -26
  127. package/esm2015/lib/modules/datepicker/daypicker-button.component.js.map +0 -1
  128. package/esm2015/lib/modules/datepicker/daypicker-cell.component.js +0 -130
  129. package/esm2015/lib/modules/datepicker/daypicker-cell.component.js.map +0 -1
  130. package/esm2015/lib/modules/datepicker/daypicker.component.js +0 -215
  131. package/esm2015/lib/modules/datepicker/daypicker.component.js.map +0 -1
  132. package/esm2015/lib/modules/datepicker/fuzzy-date.js +0 -2
  133. package/esm2015/lib/modules/datepicker/fuzzy-date.js.map +0 -1
  134. package/esm2015/lib/modules/datepicker/fuzzy-date.service.js +0 -403
  135. package/esm2015/lib/modules/datepicker/fuzzy-date.service.js.map +0 -1
  136. package/esm2015/lib/modules/datepicker/monthpicker.component.js +0 -84
  137. package/esm2015/lib/modules/datepicker/monthpicker.component.js.map +0 -1
  138. package/esm2015/lib/modules/datepicker/yearpicker.component.js +0 -90
  139. package/esm2015/lib/modules/datepicker/yearpicker.component.js.map +0 -1
  140. package/esm2015/lib/modules/shared/sky-datetime-resources.module.js +0 -131
  141. package/esm2015/lib/modules/shared/sky-datetime-resources.module.js.map +0 -1
  142. package/esm2015/lib/modules/timepicker/timepicker.component.js +0 -367
  143. package/esm2015/lib/modules/timepicker/timepicker.component.js.map +0 -1
  144. package/esm2015/lib/modules/timepicker/timepicker.directive.js +0 -228
  145. package/esm2015/lib/modules/timepicker/timepicker.directive.js.map +0 -1
  146. package/esm2015/lib/modules/timepicker/timepicker.interface.js +0 -2
  147. package/esm2015/lib/modules/timepicker/timepicker.interface.js.map +0 -1
  148. package/esm2015/lib/modules/timepicker/timepicker.module.js +0 -46
  149. package/esm2015/lib/modules/timepicker/timepicker.module.js.map +0 -1
  150. package/esm2015/skyux-datetime.js +0 -5
  151. package/esm2015/skyux-datetime.js.map +0 -1
  152. package/esm2015/testing/datepicker-fixture.js.map +0 -1
  153. package/esm2015/testing/public-api.js +0 -3
  154. package/esm2015/testing/public-api.js.map +0 -1
  155. package/esm2015/testing/skyux-datetime-testing.js +0 -5
  156. package/esm2015/testing/skyux-datetime-testing.js.map +0 -1
  157. package/esm2015/testing/timepicker-fixture.js +0 -50
  158. package/esm2015/testing/timepicker-fixture.js.map +0 -1
  159. package/fesm2015/skyux-datetime-testing.js.map +0 -1
  160. package/fesm2015/skyux-datetime.js.map +0 -1
@@ -0,0 +1,466 @@
1
+ import { ChangeDetectorRef, Directive, ElementRef, HostListener, Input, Optional, Renderer2, forwardRef, } from '@angular/core';
2
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
3
+ import { SkyAppLocaleProvider, SkyLibResourcesService } from '@skyux/i18n';
4
+ import { Subject } from 'rxjs';
5
+ import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
6
+ import { SkyDateFormatter } from './date-formatter';
7
+ import { SkyDatepickerConfigService } from './datepicker-config.service';
8
+ import { SkyDatepickerComponent } from './datepicker.component';
9
+ import { SkyFuzzyDateService } from './fuzzy-date.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./datepicker-config.service";
12
+ import * as i2 from "./fuzzy-date.service";
13
+ import * as i3 from "@skyux/i18n";
14
+ import * as i4 from "./datepicker.component";
15
+ // tslint:disable:no-forward-ref no-use-before-declare
16
+ const SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR = {
17
+ provide: NG_VALUE_ACCESSOR,
18
+ useExisting: forwardRef(() => SkyFuzzyDatepickerInputDirective),
19
+ multi: true,
20
+ };
21
+ const SKY_FUZZY_DATEPICKER_VALIDATOR = {
22
+ provide: NG_VALIDATORS,
23
+ useExisting: forwardRef(() => SkyFuzzyDatepickerInputDirective),
24
+ multi: true,
25
+ };
26
+ // tslint:enable
27
+ export class SkyFuzzyDatepickerInputDirective {
28
+ constructor(changeDetector, configService, elementRef, fuzzyDateService, localeProvider, renderer, resourcesService, datepickerComponent) {
29
+ this.changeDetector = changeDetector;
30
+ this.configService = configService;
31
+ this.elementRef = elementRef;
32
+ this.fuzzyDateService = fuzzyDateService;
33
+ this.localeProvider = localeProvider;
34
+ this.renderer = renderer;
35
+ this.resourcesService = resourcesService;
36
+ this.datepickerComponent = datepickerComponent;
37
+ /**
38
+ * Indicates whether to disable date validation on the fuzzy datepicker input.
39
+ * @default false
40
+ */
41
+ this.skyDatepickerNoValidate = false;
42
+ this.dateFormatter = new SkyDateFormatter();
43
+ this.ngUnsubscribe = new Subject();
44
+ this._futureDisabled = false;
45
+ this._disabled = false;
46
+ this._yearRequired = false;
47
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
48
+ this.onChange = (_) => { };
49
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
50
+ this.onTouched = () => { };
51
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
52
+ this.onValidatorChange = () => { };
53
+ this.localeProvider
54
+ .getLocaleInfo()
55
+ .pipe(takeUntil(this.ngUnsubscribe))
56
+ .subscribe((localeInfo) => {
57
+ this.locale = localeInfo.locale;
58
+ SkyDateFormatter.setLocale(this.locale);
59
+ this.preferredShortDateFormat =
60
+ SkyDateFormatter.getPreferredShortDateFormat();
61
+ });
62
+ }
63
+ /**
64
+ * Specifies the date format for the input. Place this attribute on the `input` element
65
+ * to override the default in `SkyDatepickerConfigService`.
66
+ * @default "MM/DD/YYYY"
67
+ */
68
+ set dateFormat(value) {
69
+ this._dateFormat = value;
70
+ if (this.value) {
71
+ const formattedDate = this.fuzzyDateService.format(this.value, this.dateFormat, this.locale);
72
+ this.setInputElementValue(formattedDate);
73
+ this.changeDetector.markForCheck();
74
+ }
75
+ }
76
+ get dateFormat() {
77
+ return (this._dateFormat ||
78
+ this.configService.dateFormat ||
79
+ this.preferredShortDateFormat);
80
+ }
81
+ /**
82
+ * Indicates whether to disable the datepicker.
83
+ * @default false
84
+ */
85
+ set disabled(value) {
86
+ this._disabled = value;
87
+ this.datepickerComponent.disabled = value;
88
+ this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', value);
89
+ }
90
+ get disabled() {
91
+ return this._disabled;
92
+ }
93
+ /**
94
+ * Indicates whether to prevent users from specifying dates that are in the future.
95
+ * Place this attribute on the `input` element.
96
+ * @default false
97
+ */
98
+ set futureDisabled(value) {
99
+ this._futureDisabled = value;
100
+ this.onValidatorChange();
101
+ }
102
+ get futureDisabled() {
103
+ return this._futureDisabled;
104
+ }
105
+ /**
106
+ * Specifies the latest fuzzy date allowed. Place this attribute on the `input` element
107
+ * to prevent fuzzy dates after a specified date. This property accepts
108
+ * a `SkyFuzzyDate` value that includes numeric month, day, and year values.
109
+ * For example: `{ month: 1, day: 1, year: 2027 }`.
110
+ */
111
+ set maxDate(value) {
112
+ this._maxDate = value;
113
+ this.datepickerComponent.maxDate = this.getMaxDate();
114
+ this.onValidatorChange();
115
+ }
116
+ get maxDate() {
117
+ return this._maxDate;
118
+ }
119
+ /**
120
+ * Specifies the earliest fuzzy date allowed. Place this attribute on the `input` element
121
+ * to prevent fuzzy dates before a specified date. This property accepts a `SkyFuzzyDate` value
122
+ * that includes numeric month, day, and year values.
123
+ * For example: `{ month: 1, day: 1, year: 2007 }`.
124
+ */
125
+ set minDate(value) {
126
+ this._minDate = value;
127
+ this.datepickerComponent.minDate = this.getMinDate();
128
+ this.onValidatorChange();
129
+ }
130
+ get minDate() {
131
+ return this._minDate;
132
+ }
133
+ /**
134
+ * Creates the fuzzy datepicker input and calendar to let users specify dates that are
135
+ * not complete. For example, if users know the year but not the month or day, they can
136
+ * enter just the year. Place this directive on an `input` element, and wrap the `input`
137
+ * in a `sky-datepicker` component. The value that users select is driven
138
+ * through the `ngModel` attribute specified on the `input` element.
139
+ * @required
140
+ */
141
+ set skyFuzzyDatepickerInput(value) {
142
+ // TODO: Remove this property in a future version of SKY UX.
143
+ }
144
+ /**
145
+ * Specifies the starting day of the week in the calendar, where `0` sets the starting day
146
+ * to Sunday. Place this attribute on the `input` element to override the default
147
+ * in `SkyDatepickerConfigService`.
148
+ * @default 0
149
+ */
150
+ set startingDay(value) {
151
+ this._startingDay = value;
152
+ this.datepickerComponent.startingDay = this.startingDay;
153
+ this.onValidatorChange();
154
+ }
155
+ get startingDay() {
156
+ return this._startingDay || this.configService.startingDay;
157
+ }
158
+ /**
159
+ * Indicates whether to require the year in fuzzy dates.
160
+ * @default false
161
+ */
162
+ set yearRequired(value) {
163
+ this._yearRequired = value;
164
+ this.onValidatorChange();
165
+ }
166
+ get yearRequired() {
167
+ return this._yearRequired;
168
+ }
169
+ get value() {
170
+ return this._value;
171
+ }
172
+ set value(value) {
173
+ this.updateValue(value);
174
+ }
175
+ ngOnInit() {
176
+ if (this.yearRequired) {
177
+ if (this.dateFormat.toLowerCase().indexOf('y') === -1) {
178
+ throw new Error('You have configured conflicting settings. Year is required and dateFormat does not include year.');
179
+ }
180
+ }
181
+ if (!this.datepickerComponent) {
182
+ throw new Error('You must wrap the `skyFuzzyDatepickerInput` directive within a ' +
183
+ '`<sky-datepicker>` component!');
184
+ }
185
+ const element = this.elementRef.nativeElement;
186
+ this.renderer.addClass(element, 'sky-form-control');
187
+ const hasAriaLabel = element.getAttribute('aria-label');
188
+ /* istanbul ignore else */
189
+ if (!hasAriaLabel) {
190
+ this.resourcesService
191
+ .getString('skyux_date_field_default_label')
192
+ .pipe(takeUntil(this.ngUnsubscribe))
193
+ .subscribe((value) => {
194
+ this.renderer.setAttribute(element, 'aria-label', value);
195
+ });
196
+ }
197
+ }
198
+ ngAfterContentInit() {
199
+ this.datepickerComponent.dateChange
200
+ .pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
201
+ .subscribe((value) => {
202
+ this.value = value;
203
+ this.onTouched();
204
+ });
205
+ }
206
+ ngAfterViewInit() {
207
+ // This is needed to address a bug in Angular 4.
208
+ // When a control value is set intially, its value is not represented on the view.
209
+ // See: https://github.com/angular/angular/issues/13792
210
+ // Of note is the parent check which allows us to determine if the form is reactive.
211
+ // Without this check there is a changed before checked error
212
+ /* istanbul ignore else */
213
+ if (this.control && this.control.parent) {
214
+ setTimeout(() => {
215
+ this.control.setValue(this.value, {
216
+ emitEvent: false,
217
+ });
218
+ this.changeDetector.markForCheck();
219
+ });
220
+ }
221
+ }
222
+ ngOnDestroy() {
223
+ this.ngUnsubscribe.next();
224
+ this.ngUnsubscribe.complete();
225
+ }
226
+ onInputChange(event) {
227
+ this.onValueChange(event.target.value);
228
+ }
229
+ onInputBlur() {
230
+ this.onTouched();
231
+ const formattedDate = this.fuzzyDateService.format(this.value, this.dateFormat, this.locale);
232
+ if (this.control.valid) {
233
+ this.setInputElementValue(formattedDate);
234
+ }
235
+ }
236
+ onInputKeyup() {
237
+ this.control.markAsDirty();
238
+ }
239
+ writeValue(value) {
240
+ this.updateValue(value, false);
241
+ }
242
+ validate(control) {
243
+ if (!this.control) {
244
+ this.control = control;
245
+ }
246
+ if (this.skyDatepickerNoValidate) {
247
+ return;
248
+ }
249
+ if (!this.control.value) {
250
+ return;
251
+ }
252
+ const value = control.value;
253
+ let fuzzyDate;
254
+ let validationError;
255
+ if (typeof value === 'string') {
256
+ fuzzyDate = this.fuzzyDateService.getFuzzyDateFromString(value, this.dateFormat);
257
+ }
258
+ else {
259
+ fuzzyDate = value;
260
+ }
261
+ if (!fuzzyDate) {
262
+ validationError = {
263
+ skyFuzzyDate: {
264
+ invalid: value,
265
+ },
266
+ };
267
+ }
268
+ if (!validationError && !fuzzyDate.year && this.yearRequired) {
269
+ validationError = {
270
+ skyFuzzyDate: {
271
+ yearRequired: value,
272
+ },
273
+ };
274
+ }
275
+ if (!validationError && fuzzyDate.year) {
276
+ let fuzzyDateRange;
277
+ if (this.maxDate) {
278
+ fuzzyDateRange = this.fuzzyDateService.getFuzzyDateRange(fuzzyDate, this.maxDate);
279
+ if (!fuzzyDateRange.valid) {
280
+ validationError = {
281
+ skyFuzzyDate: {
282
+ maxDate: value,
283
+ },
284
+ };
285
+ }
286
+ }
287
+ if (!validationError && this.minDate) {
288
+ fuzzyDateRange = this.fuzzyDateService.getFuzzyDateRange(this.minDate, fuzzyDate);
289
+ if (!fuzzyDateRange.valid) {
290
+ validationError = {
291
+ skyFuzzyDate: {
292
+ minDate: value,
293
+ },
294
+ };
295
+ }
296
+ }
297
+ if (!validationError && this.futureDisabled) {
298
+ fuzzyDateRange = this.fuzzyDateService.getFuzzyDateRange(fuzzyDate, this.fuzzyDateService.getCurrentFuzzyDate());
299
+ if (!fuzzyDateRange.valid) {
300
+ validationError = {
301
+ skyFuzzyDate: {
302
+ futureDisabled: value,
303
+ },
304
+ };
305
+ }
306
+ }
307
+ }
308
+ if (validationError) {
309
+ // Mark the invalid control as touched so that the input's invalid CSS styles appear.
310
+ // (This is only required when the invalid value is set by the FormControl constructor.)
311
+ this.control.markAsTouched();
312
+ }
313
+ return validationError;
314
+ }
315
+ registerOnChange(fn) {
316
+ this.onChange = fn;
317
+ }
318
+ registerOnTouched(fn) {
319
+ this.onTouched = fn;
320
+ }
321
+ registerOnValidatorChange(fn) {
322
+ this.onValidatorChange = fn;
323
+ }
324
+ setDisabledState(disabled) {
325
+ this.disabled = disabled;
326
+ this.datepickerComponent.disabled = disabled;
327
+ }
328
+ /**
329
+ * Detects changes to the underlying input element's value and updates the ngModel accordingly.
330
+ * This is useful if you need to update the ngModel value before the input element loses focus.
331
+ */
332
+ detectInputValueChange() {
333
+ this.onValueChange(this.elementRef.nativeElement.value);
334
+ }
335
+ onValueChange(newValue) {
336
+ this.value = newValue;
337
+ }
338
+ setInputElementValue(value) {
339
+ this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
340
+ }
341
+ getMaxDate() {
342
+ if (this.maxDate) {
343
+ const maxDate = this.fuzzyDateService.getMomentFromFuzzyDate(this.maxDate);
344
+ if (maxDate.isValid()) {
345
+ return maxDate.toDate();
346
+ }
347
+ }
348
+ else if (this.futureDisabled) {
349
+ return new Date();
350
+ }
351
+ return this.configService.maxDate;
352
+ }
353
+ getMinDate() {
354
+ if (this.minDate) {
355
+ const minDate = this.fuzzyDateService.getMomentFromFuzzyDate(this.minDate);
356
+ if (minDate.isValid()) {
357
+ return minDate.toDate();
358
+ }
359
+ }
360
+ return this.configService.minDate;
361
+ }
362
+ /* istanbul ignore next */
363
+ fuzzyDatesEqual(dateA, dateB) {
364
+ return (dateA &&
365
+ dateB &&
366
+ ((!dateA.day && !dateB.day) || dateA.day === dateB.day) &&
367
+ ((!dateA.month && !dateB.month) || dateA.month === dateB.month) &&
368
+ ((!dateA.year && !dateB.year) || dateA.year === dateB.year));
369
+ }
370
+ /**
371
+ * Update the value of the form control and input element
372
+ * @param emitEvent Denotes if we emit an event to the consumer's form control. We do not want to do this if the value is being updated via a `setValue` call or a `patchValue` call as this is already handled by Angular.
373
+ * In these cases we do not want to fire `onChange` as it will cause extra `valueChange` and `statusChange` events and the status of the form should not be affected by these changes.
374
+ */
375
+ updateValue(value, emitEvent = true) {
376
+ if (this._value === value) {
377
+ return;
378
+ }
379
+ let fuzzyDate;
380
+ let fuzzyMoment;
381
+ let dateValue;
382
+ let formattedDate;
383
+ if (value instanceof Date) {
384
+ dateValue = value;
385
+ formattedDate = this.dateFormatter.format(value, this.dateFormat);
386
+ fuzzyDate = this.fuzzyDateService.getFuzzyDateFromSelectedDate(value, this.dateFormat);
387
+ }
388
+ else if (typeof value === 'string') {
389
+ fuzzyDate = this.fuzzyDateService.getFuzzyDateFromString(value, this.dateFormat);
390
+ formattedDate = this.fuzzyDateService.format(fuzzyDate, this.dateFormat, this.locale);
391
+ if (!formattedDate) {
392
+ formattedDate = value;
393
+ }
394
+ fuzzyMoment = this.fuzzyDateService.getMomentFromFuzzyDate(fuzzyDate);
395
+ if (fuzzyMoment) {
396
+ dateValue = fuzzyMoment.toDate();
397
+ }
398
+ }
399
+ else {
400
+ fuzzyDate = value;
401
+ formattedDate = this.fuzzyDateService.format(fuzzyDate, this.dateFormat, this.locale);
402
+ fuzzyMoment = this.fuzzyDateService.getMomentFromFuzzyDate(fuzzyDate);
403
+ if (fuzzyMoment) {
404
+ dateValue = fuzzyMoment.toDate();
405
+ }
406
+ }
407
+ const areFuzzyDatesEqual = this.fuzzyDatesEqual(this._value, fuzzyDate);
408
+ const isNewValue = fuzzyDate !== this._value || !areFuzzyDatesEqual;
409
+ this._value = fuzzyDate || value;
410
+ if (isNewValue) {
411
+ if (emitEvent) {
412
+ this.onChange(this._value);
413
+ }
414
+ else {
415
+ this.control?.setValue(this._value, { emitEvent: false });
416
+ }
417
+ this.datepickerComponent.selectedDate = dateValue;
418
+ }
419
+ this.setInputElementValue(formattedDate || '');
420
+ }
421
+ }
422
+ SkyFuzzyDatepickerInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyFuzzyDatepickerInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyDatepickerConfigService }, { token: i0.ElementRef }, { token: i2.SkyFuzzyDateService }, { token: i3.SkyAppLocaleProvider }, { token: i0.Renderer2 }, { token: i3.SkyLibResourcesService }, { token: i4.SkyDatepickerComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
423
+ SkyFuzzyDatepickerInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: SkyFuzzyDatepickerInputDirective, selector: "[skyFuzzyDatepickerInput]", inputs: { dateFormat: "dateFormat", disabled: "disabled", futureDisabled: "futureDisabled", maxDate: "maxDate", minDate: "minDate", skyDatepickerNoValidate: "skyDatepickerNoValidate", skyFuzzyDatepickerInput: "skyFuzzyDatepickerInput", startingDay: "startingDay", yearRequired: "yearRequired" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "keyup": "onInputKeyup()" } }, providers: [
424
+ SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR,
425
+ SKY_FUZZY_DATEPICKER_VALIDATOR,
426
+ ], ngImport: i0 });
427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyFuzzyDatepickerInputDirective, decorators: [{
428
+ type: Directive,
429
+ args: [{
430
+ selector: '[skyFuzzyDatepickerInput]',
431
+ providers: [
432
+ SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR,
433
+ SKY_FUZZY_DATEPICKER_VALIDATOR,
434
+ ],
435
+ }]
436
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyDatepickerConfigService }, { type: i0.ElementRef }, { type: i2.SkyFuzzyDateService }, { type: i3.SkyAppLocaleProvider }, { type: i0.Renderer2 }, { type: i3.SkyLibResourcesService }, { type: i4.SkyDatepickerComponent, decorators: [{
437
+ type: Optional
438
+ }] }]; }, propDecorators: { dateFormat: [{
439
+ type: Input
440
+ }], disabled: [{
441
+ type: Input
442
+ }], futureDisabled: [{
443
+ type: Input
444
+ }], maxDate: [{
445
+ type: Input
446
+ }], minDate: [{
447
+ type: Input
448
+ }], skyDatepickerNoValidate: [{
449
+ type: Input
450
+ }], skyFuzzyDatepickerInput: [{
451
+ type: Input
452
+ }], startingDay: [{
453
+ type: Input
454
+ }], yearRequired: [{
455
+ type: Input
456
+ }], onInputChange: [{
457
+ type: HostListener,
458
+ args: ['change', ['$event']]
459
+ }], onInputBlur: [{
460
+ type: HostListener,
461
+ args: ['blur']
462
+ }], onInputKeyup: [{
463
+ type: HostListener,
464
+ args: ['keyup']
465
+ }] } });
466
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC1mdXp6eS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC1mdXp6eS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsR0FHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUUzRCxzREFBc0Q7QUFDdEQsTUFBTSxtQ0FBbUMsR0FBRztJQUMxQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7SUFDL0QsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSw4QkFBOEIsR0FBRztJQUNyQyxP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YUFDM0Q7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUNuRDtRQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQzs7NkhBMWlCVSxnQ0FBZ0M7aUhBQWhDLGdDQUFnQyw0Y0FMaEM7UUFDVCxtQ0FBbUM7UUFDbkMsOEJBQThCO0tBQy9COzJGQUVVLGdDQUFnQztrQkFQNUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxTQUFTLEVBQUU7d0JBQ1QsbUNBQW1DO3dCQUNuQyw4QkFBOEI7cUJBQy9CO2lCQUNGOzswQkF1TUksUUFBUTs0Q0F2TEEsVUFBVTtzQkFEcEIsS0FBSztnQkE0QkssUUFBUTtzQkFEbEIsS0FBSztnQkFrQkssY0FBYztzQkFEeEIsS0FBSztnQkFpQkssT0FBTztzQkFEakIsS0FBSztnQkFrQkssT0FBTztzQkFEakIsS0FBSztnQkFnQkMsdUJBQXVCO3NCQUQ3QixLQUFLO2dCQVlLLHVCQUF1QjtzQkFEakMsS0FBSztnQkFjSyxXQUFXO3NCQURyQixLQUFLO2dCQWlCSyxZQUFZO3NCQUR0QixLQUFLO2dCQW9JQyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNM0IsV0FBVztzQkFEakIsWUFBWTt1QkFBQyxNQUFNO2dCQWdCYixZQUFZO3NCQURsQixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lBcHBMb2NhbGVQcm92aWRlciwgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5RGF0ZUZvcm1hdHRlciB9IGZyb20gJy4vZGF0ZS1mb3JtYXR0ZXInO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2RhdGVwaWNrZXItY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5RnV6enlEYXRlIH0gZnJvbSAnLi9mdXp6eS1kYXRlJztcbmltcG9ydCB7IFNreUZ1enp5RGF0ZVNlcnZpY2UgfSBmcm9tICcuL2Z1enp5LWRhdGUuc2VydmljZSc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWZvcndhcmQtcmVmIG5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuY29uc3QgU0tZX0ZVWlpZX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lGdXp6eURhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuY29uc3QgU0tZX0ZVWlpZX0RBVEVQSUNLRVJfVkFMSURBVE9SID0ge1xuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lGdXp6eURhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcbi8vIHRzbGludDplbmFibGVcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NreUZ1enp5RGF0ZXBpY2tlcklucHV0XScsXG4gIHByb3ZpZGVyczogW1xuICAgIFNLWV9GVVpaWV9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFNLWV9GVVpaWV9EQVRFUElDS0VSX1ZBTElEQVRPUixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5RnV6enlEYXRlcGlja2VySW5wdXREaXJlY3RpdmVcbiAgaW1wbGVtZW50c1xuICAgIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIFZhbGlkYXRvclxue1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkYXRlIGZvcm1hdCBmb3IgdGhlIGlucHV0LiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50XG4gICAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGluIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqIEBkZWZhdWx0IFwiTU0vREQvWVlZWVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGVGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGVGb3JtYXQgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmZvcm1hdChcbiAgICAgICAgdGhpcy52YWx1ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0LFxuICAgICAgICB0aGlzLmxvY2FsZVxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0SW5wdXRFbGVtZW50VmFsdWUoZm9ybWF0dGVkRGF0ZSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0ZUZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0IHx8XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuZGF0ZUZvcm1hdCB8fFxuICAgICAgdGhpcy5wcmVmZXJyZWRTaG9ydERhdGVGb3JtYXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGVwaWNrZXJDb21wb25lbnQuZGlzYWJsZWQgPSB2YWx1ZTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHByZXZlbnQgdXNlcnMgZnJvbSBzcGVjaWZ5aW5nIGRhdGVzIHRoYXQgYXJlIGluIHRoZSBmdXR1cmUuXG4gICAqIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZ1dHVyZURpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZnV0dXJlRGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZ1dHVyZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mdXR1cmVEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGxhdGVzdCBmdXp6eSBkYXRlIGFsbG93ZWQuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnRcbiAgICogdG8gcHJldmVudCBmdXp6eSBkYXRlcyBhZnRlciBhIHNwZWNpZmllZCBkYXRlLiBUaGlzIHByb3BlcnR5IGFjY2VwdHNcbiAgICogYSBgU2t5RnV6enlEYXRlYCB2YWx1ZSB0aGF0IGluY2x1ZGVzIG51bWVyaWMgbW9udGgsIGRheSwgYW5kIHllYXIgdmFsdWVzLlxuICAgKiBGb3IgZXhhbXBsZTogYHsgbW9udGg6IDEsIGRheTogMSwgeWVhcjogMjAyNyB9YC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4RGF0ZSh2YWx1ZTogU2t5RnV6enlEYXRlKSB7XG4gICAgdGhpcy5fbWF4RGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5tYXhEYXRlID0gdGhpcy5nZXRNYXhEYXRlKCk7XG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXhEYXRlKCk6IFNreUZ1enp5RGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBlYXJsaWVzdCBmdXp6eSBkYXRlIGFsbG93ZWQuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnRcbiAgICogdG8gcHJldmVudCBmdXp6eSBkYXRlcyBiZWZvcmUgYSBzcGVjaWZpZWQgZGF0ZS4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGEgYFNreUZ1enp5RGF0ZWAgdmFsdWVcbiAgICogdGhhdCBpbmNsdWRlcyBudW1lcmljIG1vbnRoLCBkYXksIGFuZCB5ZWFyIHZhbHVlcy5cbiAgICogRm9yIGV4YW1wbGU6IGB7IG1vbnRoOiAxLCBkYXk6IDEsIHllYXI6IDIwMDcgfWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1pbkRhdGUodmFsdWU6IFNreUZ1enp5RGF0ZSkge1xuICAgIHRoaXMuX21pbkRhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGVwaWNrZXJDb21wb25lbnQubWluRGF0ZSA9IHRoaXMuZ2V0TWluRGF0ZSgpO1xuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluRGF0ZSgpOiBTa3lGdXp6eURhdGUge1xuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgZGF0ZSB2YWxpZGF0aW9uIG9uIHRoZSBmdXp6eSBkYXRlcGlja2VyIGlucHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNreURhdGVwaWNrZXJOb1ZhbGlkYXRlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGZ1enp5IGRhdGVwaWNrZXIgaW5wdXQgYW5kIGNhbGVuZGFyIHRvIGxldCB1c2VycyBzcGVjaWZ5IGRhdGVzIHRoYXQgYXJlXG4gICAqIG5vdCBjb21wbGV0ZS4gRm9yIGV4YW1wbGUsIGlmIHVzZXJzIGtub3cgdGhlIHllYXIgYnV0IG5vdCB0aGUgbW9udGggb3IgZGF5LCB0aGV5IGNhblxuICAgKiBlbnRlciBqdXN0IHRoZSB5ZWFyLiBQbGFjZSB0aGlzIGRpcmVjdGl2ZSBvbiBhbiBgaW5wdXRgIGVsZW1lbnQsIGFuZCB3cmFwIHRoZSBgaW5wdXRgXG4gICAqIGluIGEgYHNreS1kYXRlcGlja2VyYCBjb21wb25lbnQuIFRoZSB2YWx1ZSB0aGF0IHVzZXJzIHNlbGVjdCBpcyBkcml2ZW5cbiAgICogdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZSBzcGVjaWZpZWQgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNreUZ1enp5RGF0ZXBpY2tlcklucHV0KFxuICAgIHZhbHVlOiBTa3lEYXRlcGlja2VyQ29tcG9uZW50IHwgdW5kZWZpbmVkIHwgJydcbiAgKSB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgcHJvcGVydHkgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTS1kgVVguXG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzdGFydGluZyBkYXkgb2YgdGhlIHdlZWsgaW4gdGhlIGNhbGVuZGFyLCB3aGVyZSBgMGAgc2V0cyB0aGUgc3RhcnRpbmcgZGF5XG4gICAqIHRvIFN1bmRheS4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBpbiBgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2VgLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN0YXJ0aW5nRGF5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGFydGluZ0RheSA9IHZhbHVlO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5zdGFydGluZ0RheSA9IHRoaXMuc3RhcnRpbmdEYXk7XG5cbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXJ0aW5nRGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0aW5nRGF5IHx8IHRoaXMuY29uZmlnU2VydmljZS5zdGFydGluZ0RheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byByZXF1aXJlIHRoZSB5ZWFyIGluIGZ1enp5IGRhdGVzLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB5ZWFyUmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl95ZWFyUmVxdWlyZWQgPSB2YWx1ZTtcbiAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHllYXJSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5feWVhclJlcXVpcmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICBwcml2YXRlIGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2t5RGF0ZUZvcm1hdHRlcigpO1xuXG4gIHByaXZhdGUgbG9jYWxlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQ6IHN0cmluZztcblxuICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX2Z1dHVyZURpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfZGF0ZUZvcm1hdDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbWF4RGF0ZTogU2t5RnV6enlEYXRlO1xuXG4gIHByaXZhdGUgX21pbkRhdGU6IFNreUZ1enp5RGF0ZTtcblxuICBwcml2YXRlIF9zdGFydGluZ0RheTogbnVtYmVyO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgcHJpdmF0ZSBfeWVhclJlcXVpcmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBmdXp6eURhdGVTZXJ2aWNlOiBTa3lGdXp6eURhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlUHJvdmlkZXI6IFNreUFwcExvY2FsZVByb3ZpZGVyLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXRlcGlja2VyQ29tcG9uZW50OiBTa3lEYXRlcGlja2VyQ29tcG9uZW50XG4gICkge1xuICAgIHRoaXMubG9jYWxlUHJvdmlkZXJcbiAgICAgIC5nZXRMb2NhbGVJbmZvKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgobG9jYWxlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZUluZm8ubG9jYWxlO1xuICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLnNldExvY2FsZSh0aGlzLmxvY2FsZSk7XG4gICAgICAgIHRoaXMucHJlZmVycmVkU2hvcnREYXRlRm9ybWF0ID1cbiAgICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLmdldFByZWZlcnJlZFNob3J0RGF0ZUZvcm1hdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMueWVhclJlcXVpcmVkKSB7XG4gICAgICBpZiAodGhpcy5kYXRlRm9ybWF0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigneScpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1lvdSBoYXZlIGNvbmZpZ3VyZWQgY29uZmxpY3Rpbmcgc2V0dGluZ3MuIFllYXIgaXMgcmVxdWlyZWQgYW5kIGRhdGVGb3JtYXQgZG9lcyBub3QgaW5jbHVkZSB5ZWFyLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnWW91IG11c3Qgd3JhcCB0aGUgYHNreUZ1enp5RGF0ZXBpY2tlcklucHV0YCBkaXJlY3RpdmUgd2l0aGluIGEgJyArXG4gICAgICAgICAgJ2A8c2t5LWRhdGVwaWNrZXI+YCBjb21wb25lbnQhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdza3ktZm9ybS1jb250cm9sJyk7XG5cbiAgICBjb25zdCBoYXNBcmlhTGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIWhhc0FyaWFMYWJlbCkge1xuICAgICAgdGhpcy5yZXNvdXJjZXNTZXJ2aWNlXG4gICAgICAgIC5nZXRTdHJpbmcoJ3NreXV4X2RhdGVfZmllbGRfZGVmYXVsdF9sYWJlbCcpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2FyaWEtbGFiZWwnLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlcGlja2VyQ29tcG9uZW50LmRhdGVDaGFuZ2VcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWU6IERhdGUpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGFkZHJlc3MgYSBidWcgaW4gQW5ndWxhciA0LlxuICAgIC8vIFdoZW4gYSBjb250cm9sIHZhbHVlIGlzIHNldCBpbnRpYWxseSwgaXRzIHZhbHVlIGlzIG5vdCByZXByZXNlbnRlZCBvbiB0aGUgdmlldy5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNzkyXG4gICAgLy8gT2Ygbm90ZSBpcyB0aGUgcGFyZW50IGNoZWNrIHdoaWNoIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgaWYgdGhlIGZvcm0gaXMgcmVhY3RpdmUuXG4gICAgLy8gV2l0aG91dCB0aGlzIGNoZWNrIHRoZXJlIGlzIGEgY2hhbmdlZCBiZWZvcmUgY2hlY2tlZCBlcnJvclxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5wYXJlbnQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy52YWx1ZSwge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwdWJsaWMgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcblxuICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZm9ybWF0KFxuICAgICAgdGhpcy52YWx1ZSxcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgIHRoaXMubG9jYWxlXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmNvbnRyb2wudmFsaWQpIHtcbiAgICAgIHRoaXMuc2V0SW5wdXRFbGVtZW50VmFsdWUoZm9ybWF0dGVkRGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5dXAnKVxuICBwdWJsaWMgb25JbnB1dEtleXVwKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5za3lEYXRlcGlja2VyTm9WYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250cm9sLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWU6IGFueSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBsZXQgZnV6enlEYXRlOiBTa3lGdXp6eURhdGU7XG4gICAgbGV0IHZhbGlkYXRpb25FcnJvcjogVmFsaWRhdGlvbkVycm9ycztcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmdXp6eURhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0RnV6enlEYXRlRnJvbVN0cmluZyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnV6enlEYXRlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKCFmdXp6eURhdGUpIHtcbiAgICAgIHZhbGlkYXRpb25FcnJvciA9IHtcbiAgICAgICAgc2t5RnV6enlEYXRlOiB7XG4gICAgICAgICAgaW52YWxpZDogdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmICFmdXp6eURhdGUueWVhciAmJiB0aGlzLnllYXJSZXF1aXJlZCkge1xuICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICBza3lGdXp6eURhdGU6IHtcbiAgICAgICAgICB5ZWFyUmVxdWlyZWQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkYXRpb25FcnJvciAmJiBmdXp6eURhdGUueWVhcikge1xuICAgICAgbGV0IGZ1enp5RGF0ZVJhbmdlO1xuXG4gICAgICBpZiAodGhpcy5tYXhEYXRlKSB7XG4gICAgICAgIGZ1enp5RGF0ZVJhbmdlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldEZ1enp5RGF0ZVJhbmdlKFxuICAgICAgICAgIGZ1enp5RGF0ZSxcbiAgICAgICAgICB0aGlzLm1heERhdGVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWZ1enp5RGF0ZVJhbmdlLnZhbGlkKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgICAgc2t5RnV6enlEYXRlOiB7XG4gICAgICAgICAgICAgIG1heERhdGU6IHZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmIHRoaXMubWluRGF0ZSkge1xuICAgICAgICBmdXp6eURhdGVSYW5nZSA9IHRoaXMuZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVSYW5nZShcbiAgICAgICAgICB0aGlzLm1pbkRhdGUsXG4gICAgICAgICAgZnV6enlEYXRlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZnV6enlEYXRlUmFuZ2UudmFsaWQpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB7XG4gICAgICAgICAgICBza3lGdXp6eURhdGU6IHtcbiAgICAgICAgICAgICAgbWluRGF0ZTogdmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF2YWxpZGF0aW9uRXJyb3IgJiYgdGhpcy5mdXR1cmVEaXNhYmxlZCkge1xuICAgICAgICBmdXp6eURhdGVSYW5nZSA9IHRoaXMuZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVSYW5nZShcbiAgICAgICAgICBmdXp6eURhdGUsXG4gICAgICAgICAgdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldEN1cnJlbnRGdXp6eURhdGUoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWZ1enp5RGF0ZVJhbmdlLnZhbGlkKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgICAgc2t5RnV6enlEYXRlOiB7XG4gICAgICAgICAgICAgIGZ1dHVyZURpc2FibGVkOiB2YWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIC8vIE1hcmsgdGhlIGludmFsaWQgY29udHJvbCBhcyB0b3VjaGVkIHNvIHRoYXQgdGhlIGlucHV0J3MgaW52YWxpZCBDU1Mgc3R5bGVzIGFwcGVhci5cbiAgICAgIC8vIChUaGlzIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiB0aGUgaW52YWxpZCB2YWx1ZSBpcyBzZXQgYnkgdGhlIEZvcm1Db250cm9sIGNvbnN0cnVjdG9yLilcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50J3MgdmFsdWUgYW5kIHVwZGF0ZXMgdGhlIG5nTW9kZWwgYWNjb3JkaW5nbHkuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgbmdNb2RlbCB2YWx1ZSBiZWZvcmUgdGhlIGlucHV0IGVsZW1lbnQgbG9zZXMgZm9jdXMuXG4gICAqL1xuICBwdWJsaWMgZGV0ZWN0SW5wdXRWYWx1ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2UodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHNldElucHV0RWxlbWVudFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1heERhdGUoKTogRGF0ZSB7XG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMuZnV6enlEYXRlU2VydmljZS5nZXRNb21lbnRGcm9tRnV6enlEYXRlKFxuICAgICAgICB0aGlzLm1heERhdGVcbiAgICAgICk7XG4gICAgICBpZiAobWF4RGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIG1heERhdGUudG9EYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZ1dHVyZURpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnU2VydmljZS5tYXhEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNaW5EYXRlKCk6IERhdGUge1xuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0TW9tZW50RnJvbUZ1enp5RGF0ZShcbiAgICAgICAgdGhpcy5taW5EYXRlXG4gICAgICApO1xuICAgICAgaWYgKG1pbkRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBtaW5EYXRlLnRvRGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWdTZXJ2aWNlLm1pbkRhdGU7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBwcml2YXRlIGZ1enp5RGF0ZXNFcXVhbChkYXRlQTogU2t5RnV6enlEYXRlLCBkYXRlQjogU2t5RnV6enlEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGVBICYmXG4gICAgICBkYXRlQiAmJlxuICAgICAgKCghZGF0ZUEuZGF5ICYmICFkYXRlQi5kYXkpIHx8IGRhdGVBLmRheSA9PT0gZGF0ZUIuZGF5KSAmJlxuICAgICAgKCghZGF0ZUEubW9udGggJiYgIWRhdGVCLm1vbnRoKSB8fCBkYXRlQS5tb250aCA9PT0gZGF0ZUIubW9udGgpICYmXG4gICAgICAoKCFkYXRlQS55ZWFyICYmICFkYXRlQi55ZWFyKSB8fCBkYXRlQS55ZWFyID09PSBkYXRlQi55ZWFyKVxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sIGFuZCBpbnB1dCBlbGVtZW50XG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgRGVub3RlcyBpZiB3ZSBlbWl0IGFuIGV2ZW50IHRvIHRoZSBjb25zdW1lcidzIGZvcm0gY29udHJvbC4gV2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcyBpZiB0aGUgdmFsdWUgaXMgYmVpbmcgdXBkYXRlZCB2aWEgYSBgc2V0VmFsdWVgIGNhbGwgb3IgYSBgcGF0Y2hWYWx1ZWAgY2FsbCBhcyB0aGlzIGlzIGFscmVhZHkgaGFuZGxlZCBieSBBbmd1bGFyLlxuICAgKiBJbiB0aGVzZSBjYXNlcyB3ZSBkbyBub3Qgd2FudCB0byBmaXJlIGBvbkNoYW5nZWAgYXMgaXQgd2lsbCBjYXVzZSBleHRyYSBgdmFsdWVDaGFuZ2VgIGFuZCBgc3RhdHVzQ2hhbmdlYCBldmVudHMgYW5kIHRoZSBzdGF0dXMgb2YgdGhlIGZvcm0gc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSB0aGVzZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZSh2YWx1ZTogYW55LCBlbWl0RXZlbnQgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmdXp6eURhdGU6IFNreUZ1enp5RGF0ZTtcbiAgICBsZXQgZnV6enlNb21lbnQ6IGFueTtcbiAgICBsZXQgZGF0ZVZhbHVlOiBEYXRlO1xuICAgIGxldCBmb3JtYXR0ZWREYXRlOiBzdHJpbmc7XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBkYXRlVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGZvcm1hdHRlZERhdGUgPSB0aGlzLmRhdGVGb3JtYXR0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLmRhdGVGb3JtYXQpO1xuICAgICAgZnV6enlEYXRlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldEZ1enp5RGF0ZUZyb21TZWxlY3RlZERhdGUoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmdXp6eURhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0RnV6enlEYXRlRnJvbVN0cmluZyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdFxuICAgICAgKTtcbiAgICAgIGZvcm1hdHRlZERhdGUgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZm9ybWF0KFxuICAgICAgICBmdXp6eURhdGUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgdGhpcy5sb2NhbGVcbiAgICAgICk7XG5cbiAgICAgIGlmICghZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICBmb3JtYXR0ZWREYXRlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGZ1enp5TW9tZW50ID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmdldE1vbWVudEZyb21GdXp6eURhdGUoZnV6enlEYXRlKTtcblxuICAgICAgaWYgKGZ1enp5TW9tZW50KSB7XG4gICAgICAgIGRhdGVWYWx1ZSA9IGZ1enp5TW9tZW50LnRvRGF0ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmdXp6eURhdGUgPSB2YWx1ZSBhcyBTa3lGdXp6eURhdGU7XG4gICAgICBmb3JtYXR0ZWREYXRlID0gdGhpcy5mdXp6eURhdGVTZXJ2aWNlLmZvcm1hdChcbiAgICAgICAgZnV6enlEYXRlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICAgIHRoaXMubG9jYWxlXG4gICAgICApO1xuICAgICAgZnV6enlNb21lbnQgPSB0aGlzLmZ1enp5RGF0ZVNlcnZpY2UuZ2V0TW9tZW50RnJvbUZ1enp5RGF0ZShmdXp6eURhdGUpO1xuXG4gICAgICBpZiAoZnV6enlNb21lbnQpIHtcbiAgICAgICAgZGF0ZVZhbHVlID0gZnV6enlNb21lbnQudG9EYXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXJlRnV6enlEYXRlc0VxdWFsID0gdGhpcy5mdXp6eURhdGVzRXF1YWwodGhpcy5fdmFsdWUsIGZ1enp5RGF0ZSk7XG4gICAgY29uc3QgaXNOZXdWYWx1ZSA9IGZ1enp5RGF0ZSAhPT0gdGhpcy5fdmFsdWUgfHwgIWFyZUZ1enp5RGF0ZXNFcXVhbDtcblxuICAgIHRoaXMuX3ZhbHVlID0gZnV6enlEYXRlIHx8IHZhbHVlO1xuXG4gICAgaWYgKGlzTmV3VmFsdWUpIHtcbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnRyb2w/LnNldFZhbHVlKHRoaXMuX3ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbXBvbmVudC5zZWxlY3RlZERhdGUgPSBkYXRlVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRJbnB1dEVsZW1lbnRWYWx1ZShmb3JtYXR0ZWREYXRlIHx8ICcnKTtcbiAgfVxufVxuIl19