@entake/particle 18.0.4 → 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.
Files changed (207) hide show
  1. package/LICENSE +1 -1
  2. package/app/{modules → shared/components}/accordion/accordion.component.d.ts +3 -3
  3. package/app/{modules/date-picker → shared}/components/calendar/calendar.component.d.ts +7 -12
  4. package/app/{modules → shared/components}/checkbox/checkbox.component.d.ts +5 -7
  5. package/app/{modules → shared/components}/color-picker/color-picker.component.d.ts +3 -9
  6. package/app/{modules → shared/components}/date-picker/date-picker.component.d.ts +20 -26
  7. package/app/{modules/date-picker → shared}/components/date-range-picker/date-range-picker.component.d.ts +10 -11
  8. package/app/{modules → shared/components}/dialog/dialog.component.d.ts +14 -24
  9. package/app/{modules → shared/components}/dropdown/dropdown.component.d.ts +12 -14
  10. package/app/{modules/icons/components → shared/components/icon-select}/icon-select.component.d.ts +14 -17
  11. package/app/{modules → shared/components}/idle-timeout/idle-timeout.component.d.ts +3 -4
  12. package/app/{modules → shared/components}/input-mask/input-mask.component.d.ts +6 -7
  13. package/app/shared/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
  14. package/app/shared/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
  15. package/app/{modules/loader/components → shared/components/loader}/loader.component.d.ts +2 -2
  16. package/app/{modules → shared/components}/multi-select/multi-select.component.d.ts +18 -24
  17. package/app/{modules → shared/components}/notification/notification.component.d.ts +5 -13
  18. package/app/{modules → shared/components}/paginator/paginator.component.d.ts +12 -11
  19. package/app/{modules → shared/components}/popover/popover.component.d.ts +10 -15
  20. package/app/{modules → shared/components}/profile-pic/profile-pic.component.d.ts +1 -1
  21. package/app/shared/components/progress-bar/progress-bar.component.d.ts +15 -0
  22. package/app/{modules → shared/components}/rich-text/rich-text.component.d.ts +11 -12
  23. package/app/shared/components/scroll-to-top/scroll-to-top.component.d.ts +18 -0
  24. package/app/shared/components/slideover/slideover.component.d.ts +35 -0
  25. package/app/{modules → shared/components}/slider/slider.component.d.ts +8 -22
  26. package/app/{modules → shared/components}/toggle-switch/toggle-switch.component.d.ts +4 -6
  27. package/app/{modules → shared/components}/week-picker/week-picker.component.d.ts +21 -22
  28. package/app/{modules/accordion → shared}/directives/accordion-content.directive.d.ts +1 -2
  29. package/app/{modules/accordion → shared}/directives/accordion-header.directive.d.ts +1 -2
  30. package/app/{modules/accordion → shared}/directives/accordion-item.directive.d.ts +1 -1
  31. package/app/{modules/background-carousel → shared/directives}/background-carousel.directive.d.ts +4 -4
  32. package/app/{modules/keyfilter → shared/directives}/keyfilter.directive.d.ts +1 -7
  33. package/app/{modules/tooltip → shared/directives}/tooltip.directive.d.ts +3 -9
  34. package/app/shared/models/carousel-options.model.d.ts +21 -0
  35. package/app/shared/models/pagination-event.model.d.ts +8 -0
  36. package/app/shared/models/particle-component-text.model.d.ts +0 -24
  37. package/app/shared/modules/icons/particle-icons.module.d.ts +7 -0
  38. package/app/{modules/ordinal-number-pipe → shared/pipes}/ordinal-number.pipe.d.ts +1 -1
  39. package/app/shared/services/base-data.service.d.ts +2 -2
  40. package/app/shared/services/dialog.service.d.ts +1 -1
  41. package/app/{modules/notification → shared}/services/notification.service.d.ts +0 -4
  42. package/app/{modules/theming → shared}/services/theming.service.d.ts +0 -19
  43. package/fesm2022/entake-particle.mjs +3873 -5572
  44. package/fesm2022/entake-particle.mjs.map +1 -1
  45. package/package.json +16 -25
  46. package/public_api.d.ts +47 -82
  47. package/app/modules/accordion/accordion.module.d.ts +0 -11
  48. package/app/modules/background-carousel/carousel-options.model.d.ts +0 -30
  49. package/app/modules/background-carousel/particle-background-carousel.module.d.ts +0 -8
  50. package/app/modules/checkbox/checkbox.module.d.ts +0 -9
  51. package/app/modules/color-picker/color-picker.module.d.ts +0 -9
  52. package/app/modules/date-picker/date-picker.module.d.ts +0 -15
  53. package/app/modules/dialog/dialog.module.d.ts +0 -9
  54. package/app/modules/dropdown/dropdown.module.d.ts +0 -9
  55. package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +0 -46
  56. package/app/modules/endpoint-state/endpoint-state.module.d.ts +0 -8
  57. package/app/modules/icons/particle-icons.module.d.ts +0 -13
  58. package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +0 -9
  59. package/app/modules/input-mask/input-mask.module.d.ts +0 -8
  60. package/app/modules/keyfilter/keyfilter.module.d.ts +0 -8
  61. package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +0 -27
  62. package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +0 -23
  63. package/app/modules/layout/layout.module.d.ts +0 -10
  64. package/app/modules/loader/loader.module.d.ts +0 -8
  65. package/app/modules/multi-select/multi-select.module.d.ts +0 -8
  66. package/app/modules/notification/notification.module.d.ts +0 -8
  67. package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +0 -8
  68. package/app/modules/paginator/pagination-event.model.d.ts +0 -24
  69. package/app/modules/paginator/particle-paginator.module.d.ts +0 -13
  70. package/app/modules/popover/popover.module.d.ts +0 -9
  71. package/app/modules/profile-pic/particle-profile-pic.module.d.ts +0 -9
  72. package/app/modules/progress-bar/progress-bar.component.d.ts +0 -16
  73. package/app/modules/progress-bar/progress-bar.module.d.ts +0 -8
  74. package/app/modules/push-container/particle-push-container.module.d.ts +0 -9
  75. package/app/modules/push-container/push-container-state.model.d.ts +0 -7
  76. package/app/modules/push-container/push-container.component.d.ts +0 -137
  77. package/app/modules/rich-text/particle-rich-text.module.d.ts +0 -15
  78. package/app/modules/rich-text/render-rich-text.component.d.ts +0 -6
  79. package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +0 -8
  80. package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +0 -19
  81. package/app/modules/slideover/particle-slideover.module.d.ts +0 -8
  82. package/app/modules/slideover/slideover.component.d.ts +0 -35
  83. package/app/modules/slider/slider.module.d.ts +0 -9
  84. package/app/modules/theming/components/theming.component.d.ts +0 -43
  85. package/app/modules/theming/theming.module.d.ts +0 -12
  86. package/app/modules/toggle-switch/toggle-switch.module.d.ts +0 -8
  87. package/app/modules/tooltip/tooltip.module.d.ts +0 -8
  88. package/app/modules/week-picker/week-picker.module.d.ts +0 -13
  89. package/app/shared/enums/endpoint-status.enum.d.ts +0 -9
  90. package/esm2022/app/modules/accordion/accordion.component.mjs +0 -101
  91. package/esm2022/app/modules/accordion/accordion.module.mjs +0 -37
  92. package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +0 -17
  93. package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +0 -17
  94. package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +0 -36
  95. package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +0 -91
  96. package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +0 -36
  97. package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +0 -24
  98. package/esm2022/app/modules/checkbox/checkbox.component.mjs +0 -108
  99. package/esm2022/app/modules/checkbox/checkbox.module.mjs +0 -28
  100. package/esm2022/app/modules/color-picker/color-picker.component.mjs +0 -306
  101. package/esm2022/app/modules/color-picker/color-picker.module.mjs +0 -19
  102. package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +0 -496
  103. package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +0 -250
  104. package/esm2022/app/modules/date-picker/date-picker.component.mjs +0 -538
  105. package/esm2022/app/modules/date-picker/date-picker.module.mjs +0 -56
  106. package/esm2022/app/modules/dialog/dialog.component.mjs +0 -177
  107. package/esm2022/app/modules/dialog/dialog.module.mjs +0 -28
  108. package/esm2022/app/modules/dropdown/dropdown.component.mjs +0 -682
  109. package/esm2022/app/modules/dropdown/dropdown.module.mjs +0 -28
  110. package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +0 -2
  111. package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +0 -2
  112. package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +0 -75
  113. package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +0 -22
  114. package/esm2022/app/modules/icons/components/icon-select.component.mjs +0 -376
  115. package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +0 -471
  116. package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +0 -166
  117. package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +0 -1016
  118. package/esm2022/app/modules/icons/models/particle-icons-brands.model.mjs +0 -24
  119. package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +0 -50
  120. package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +0 -89
  121. package/esm2022/app/modules/icons/particle-icons.module.mjs +0 -66
  122. package/esm2022/app/modules/icons/services/icons.service.mjs +0 -82
  123. package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +0 -85
  124. package/esm2022/app/modules/idle-timeout/idle-timer.mjs +0 -66
  125. package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +0 -28
  126. package/esm2022/app/modules/input-mask/input-mask.component.mjs +0 -594
  127. package/esm2022/app/modules/input-mask/input-mask.module.mjs +0 -18
  128. package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +0 -174
  129. package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +0 -18
  130. package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +0 -81
  131. package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +0 -67
  132. package/esm2022/app/modules/layout/layout.module.mjs +0 -33
  133. package/esm2022/app/modules/loader/components/loader.component.mjs +0 -30
  134. package/esm2022/app/modules/loader/loader.module.mjs +0 -24
  135. package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +0 -2
  136. package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +0 -2
  137. package/esm2022/app/modules/multi-select/multi-select.component.mjs +0 -665
  138. package/esm2022/app/modules/multi-select/multi-select.module.mjs +0 -18
  139. package/esm2022/app/modules/notification/models/notification.model.mjs +0 -2
  140. package/esm2022/app/modules/notification/notification.component.mjs +0 -122
  141. package/esm2022/app/modules/notification/notification.module.mjs +0 -18
  142. package/esm2022/app/modules/notification/services/notification.service.mjs +0 -84
  143. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +0 -20
  144. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +0 -49
  145. package/esm2022/app/modules/paginator/pagination-event.model.mjs +0 -29
  146. package/esm2022/app/modules/paginator/paginator.component.mjs +0 -207
  147. package/esm2022/app/modules/paginator/particle-paginator.module.mjs +0 -48
  148. package/esm2022/app/modules/popover/popover.component.mjs +0 -352
  149. package/esm2022/app/modules/popover/popover.module.mjs +0 -24
  150. package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +0 -28
  151. package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +0 -75
  152. package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +0 -43
  153. package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +0 -24
  154. package/esm2022/app/modules/push-container/particle-push-container.module.mjs +0 -26
  155. package/esm2022/app/modules/push-container/push-container-state.model.mjs +0 -2
  156. package/esm2022/app/modules/push-container/push-container.component.mjs +0 -363
  157. package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +0 -64
  158. package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +0 -18
  159. package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +0 -2
  160. package/esm2022/app/modules/rich-text/rich-text.component.mjs +0 -206
  161. package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +0 -24
  162. package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +0 -49
  163. package/esm2022/app/modules/slideover/particle-slideover.module.mjs +0 -24
  164. package/esm2022/app/modules/slideover/slideover.component.mjs +0 -115
  165. package/esm2022/app/modules/slider/slider.component.mjs +0 -243
  166. package/esm2022/app/modules/slider/slider.module.mjs +0 -26
  167. package/esm2022/app/modules/theming/components/theming.component.mjs +0 -86
  168. package/esm2022/app/modules/theming/models/theme.model.mjs +0 -9
  169. package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +0 -38
  170. package/esm2022/app/modules/theming/services/theming.service.mjs +0 -510
  171. package/esm2022/app/modules/theming/theming.module.mjs +0 -55
  172. package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +0 -2
  173. package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +0 -107
  174. package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +0 -24
  175. package/esm2022/app/modules/tooltip/tooltip.directive.mjs +0 -381
  176. package/esm2022/app/modules/tooltip/tooltip.module.mjs +0 -18
  177. package/esm2022/app/modules/week-picker/week-picker.component.mjs +0 -511
  178. package/esm2022/app/modules/week-picker/week-picker.module.mjs +0 -40
  179. package/esm2022/app/shared/enums/endpoint-status.enum.mjs +0 -11
  180. package/esm2022/app/shared/interceptors/json.interceptor.mjs +0 -23
  181. package/esm2022/app/shared/models/auditable.model.mjs +0 -2
  182. package/esm2022/app/shared/models/data-list.model.mjs +0 -2
  183. package/esm2022/app/shared/models/id.model.mjs +0 -2
  184. package/esm2022/app/shared/models/observable-container.mjs +0 -15
  185. package/esm2022/app/shared/models/particle-component-text.model.mjs +0 -2
  186. package/esm2022/app/shared/services/base-data.service.mjs +0 -190
  187. package/esm2022/app/shared/services/dialog.service.mjs +0 -50
  188. package/esm2022/app/shared/services/local-storage.service.mjs +0 -60
  189. package/esm2022/entake-particle.mjs +0 -5
  190. package/esm2022/public_api.mjs +0 -98
  191. /package/app/{modules/dropdown → shared}/models/dropdown-option-group.model.d.ts +0 -0
  192. /package/app/{modules/dropdown → shared}/models/dropdown-option.model.d.ts +0 -0
  193. /package/app/{modules/icons → shared}/models/fontawesome-icons-brands.model.d.ts +0 -0
  194. /package/app/{modules/icons → shared}/models/fontawesome-icons-regular.model.d.ts +0 -0
  195. /package/app/{modules/icons → shared}/models/fontawesome-icons-solid.model.d.ts +0 -0
  196. /package/app/{modules/multi-select → shared}/models/multi-select-option-group.model.d.ts +0 -0
  197. /package/app/{modules/multi-select → shared}/models/multi-select-option.model.d.ts +0 -0
  198. /package/app/{modules/notification → shared}/models/notification.model.d.ts +0 -0
  199. /package/app/{modules/icons → shared}/models/particle-icons-brands.model.d.ts +0 -0
  200. /package/app/{modules/icons → shared}/models/particle-icons-regular.model.d.ts +0 -0
  201. /package/app/{modules/icons → shared}/models/particle-icons-solid.model.d.ts +0 -0
  202. /package/app/{modules/rich-text → shared/models}/rich-text-capabilities.model.d.ts +0 -0
  203. /package/app/{modules/theming → shared}/models/theme.model.d.ts +0 -0
  204. /package/app/{modules/toggle-switch → shared}/models/toggle-options.model.d.ts +0 -0
  205. /package/app/{modules/icons → shared}/services/icons.service.d.ts +0 -0
  206. /package/app/{modules/idle-timeout → shared/services}/idle-timer.d.ts +0 -0
  207. /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