@entake/particle 18.0.5 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +3871 -5573
  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 -209
  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,665 +0,0 @@
1
- import { animate, style, transition, trigger } from '@angular/animations';
2
- import { Component, ContentChild, EventEmitter, forwardRef, HostListener, Input, Output, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { BehaviorSubject, map } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- /**
8
- * Multi-select component
9
- */
10
- export class MultiSelectComponent {
11
- renderer;
12
- changeDetectorRef;
13
- /**
14
- * Set the value of the multi-select
15
- * @param value the value to set
16
- */
17
- set value(value) {
18
- let valueToSet = null;
19
- if (Array.isArray(value)) {
20
- valueToSet = [];
21
- for (const valueItem of value) {
22
- if (Array.isArray(valueItem)) {
23
- valueToSet.push(...valueItem);
24
- }
25
- else if ((typeof valueItem === 'string') || (typeof valueItem === 'number')) {
26
- valueToSet.push(valueItem);
27
- }
28
- }
29
- const nonNullValues = valueToSet.filter(item => item !== null);
30
- valueToSet = !nonNullValues.length ? null : nonNullValues;
31
- }
32
- this._value = valueToSet;
33
- this._internalValue.next(valueToSet);
34
- }
35
- get value() {
36
- return this._value;
37
- }
38
- /**
39
- * The multi-select options/option groups
40
- */
41
- set options(options) {
42
- this.optionCount = 0;
43
- if (options) {
44
- for (const option of options) {
45
- const suboptions = option.options;
46
- if (suboptions) {
47
- this.optionCount += suboptions.length;
48
- }
49
- else {
50
- this.optionCount++;
51
- }
52
- }
53
- }
54
- this._options.next(MultiSelectComponent.sanitizeOptionInput(options));
55
- }
56
- /**
57
- * The amount of offset (in pixels) to place between the multi-select
58
- * and its list overlay
59
- * @private
60
- */
61
- static LIST_OFFSET = 0;
62
- /**
63
- * List of arrow key keycodes
64
- * @private
65
- */
66
- static ARROW_KEYS = ['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'];
67
- /**
68
- * ViewChild of the multi-select
69
- */
70
- multiSelect = null;
71
- /**
72
- * ViewChild of the multi-select button
73
- */
74
- multiSelectButton = null;
75
- /**
76
- * ViewChild of the multi-select list
77
- */
78
- multiSelectList = null;
79
- /**
80
- * QueryList of multi-select option ViewChildren
81
- */
82
- multiSelectOptions = null;
83
- /**
84
- * ContentChild of the multi-select option template
85
- */
86
- template = null;
87
- /**
88
- * Whether the multi-select should be disabled
89
- */
90
- disabled = false;
91
- /**
92
- * Class list to assign to the multi-select
93
- */
94
- classList = null;
95
- buttonClassList = null;
96
- entryClassList = null;
97
- text = {
98
- placeholder: 'Make a Selection',
99
- of: 'of',
100
- optionsSelected: 'options selected'
101
- };
102
- /**
103
- * Style of the multi-select
104
- */
105
- type = 'input';
106
- maxExpandedEntries = 0;
107
- expandedAsGrid = false;
108
- collapsedButtonTemplate = null;
109
- /**
110
- * Event emitted on value change, emits the new value
111
- */
112
- // eslint-disable-next-line @angular-eslint/no-output-native
113
- change = new EventEmitter();
114
- /**
115
- * BehaviorSubject tracking the input multi-select options/option groups
116
- */
117
- _options = new BehaviorSubject(null);
118
- /**
119
- * BehaviorSubject tracking the current value of the multi-select
120
- */
121
- _internalValue = new BehaviorSubject(null);
122
- /**
123
- * Observable map of option value (stringified if a number) to data context
124
- */
125
- dataContextMap$ = this._options.pipe(map(options => {
126
- let dataContextMap = null;
127
- if (!!options?.length) {
128
- dataContextMap = {};
129
- for (const option of options) {
130
- if ('options' in option) {
131
- for (const groupOption of option.options) {
132
- dataContextMap[String(groupOption.value)] = JSON.parse(JSON.stringify(groupOption.dataContext));
133
- }
134
- }
135
- else if ('dataContext' in option) {
136
- dataContextMap[String(option.value)] = JSON.parse(JSON.stringify(option.dataContext));
137
- }
138
- }
139
- }
140
- return dataContextMap;
141
- }));
142
- /**
143
- * Observable map of stringified option value to boolean indicating the user's selections
144
- */
145
- selectionValueMap$ = this._internalValue.pipe(map(values => {
146
- const selectionValueMap = {};
147
- if (!!values?.length) {
148
- for (const value of values) {
149
- selectionValueMap[String(value)] = true;
150
- }
151
- }
152
- return selectionValueMap;
153
- }));
154
- /**
155
- * The count of selected options as an Observable
156
- */
157
- selectionCount$ = this._internalValue.pipe(map(values => values?.length ?? 0));
158
- /**
159
- * Unique ID to assign to the multiSelect
160
- */
161
- multiSelectId;
162
- /**
163
- * Whether to render the multi-select list
164
- */
165
- render = false;
166
- /**
167
- * Whether the multi-select is open
168
- */
169
- opened = false;
170
- /**
171
- * The index of the focused option in the multiSelect list
172
- */
173
- selectionIndex = null;
174
- optionCount = 0;
175
- /**
176
- * The current value of the multiSelect
177
- * @private
178
- */
179
- _value = null;
180
- /**
181
- * Removes options that do not have both a label and a value,
182
- * also removes empty groups (or groups that have no valid options)
183
- * @param options the options to sanitize
184
- * @private
185
- */
186
- static sanitizeOptionInput(options) {
187
- const sanitizedOptions = [];
188
- for (const option of options) {
189
- if (('groupLabel' in option) && ('options' in option)) {
190
- const validOptions = [];
191
- for (const groupOption of (option.options ?? [])) {
192
- if (!!groupOption.label && (!!groupOption.value || (+groupOption.value >= 0))) {
193
- const groupOptionCopy = JSON.parse(JSON.stringify(groupOption));
194
- groupOptionCopy.dataContext = this.addLabelToDataContext(groupOptionCopy.label, groupOptionCopy.dataContext);
195
- groupOptionCopy.type = 'group';
196
- validOptions.push(groupOptionCopy);
197
- }
198
- }
199
- if (!!validOptions.length) {
200
- sanitizedOptions.push({ groupLabel: option.groupLabel, options: validOptions, type: 'group' });
201
- }
202
- }
203
- else if (('label' in option) && ('value' in option)) {
204
- if (!!option.label && (!!option.value || (+option.value >= 0))) {
205
- const optionCopy = JSON.parse(JSON.stringify(option));
206
- optionCopy.dataContext = this.addLabelToDataContext(optionCopy.label, optionCopy.dataContext);
207
- optionCopy.type = 'option';
208
- sanitizedOptions.push(optionCopy);
209
- }
210
- }
211
- }
212
- return sanitizedOptions;
213
- }
214
- /**
215
- * Add option label to data context if not present. If $implicit
216
- * value is not present, it will be added with the label as its value.
217
- * If $implicit is already present, it will add a label key to the context
218
- * @param label the option label
219
- * @param dataContext the option data context
220
- * @private
221
- */
222
- static addLabelToDataContext(label, dataContext) {
223
- if (!dataContext) {
224
- dataContext = {};
225
- }
226
- if (!!label) {
227
- const implicitValue = dataContext['$implicit'];
228
- if (!!implicitValue || implicitValue >= 0) {
229
- const labelExists = !!dataContext['label'];
230
- if (!labelExists) {
231
- dataContext['label'] = label;
232
- }
233
- }
234
- else {
235
- dataContext['$implicit'] = label;
236
- }
237
- }
238
- return dataContext;
239
- }
240
- /**
241
- * Function to call on change
242
- */
243
- onChange = () => { };
244
- /**
245
- * Function to call on touch
246
- */
247
- onTouched = () => { };
248
- /**
249
- * Dependency injection site
250
- * @param renderer the Angular renderer
251
- * @param changeDetectorRef reference to the Angular change detector
252
- */
253
- constructor(renderer, changeDetectorRef) {
254
- this.renderer = renderer;
255
- this.changeDetectorRef = changeDetectorRef;
256
- const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
257
- let result = '';
258
- for (let i = 0; i < 10; i++) {
259
- result += characters.charAt(Math.floor(Math.random() * characters.length));
260
- }
261
- this.multiSelectId = `multiselect-${result}${new Date().getTime()}`;
262
- }
263
- /**
264
- * Write value
265
- * @param value the value to write
266
- */
267
- writeValue(value) {
268
- this.value = value;
269
- this.changeDetectorRef.markForCheck();
270
- }
271
- /**
272
- * Register function on change
273
- * @param fn the function to register
274
- */
275
- registerOnChange(fn) {
276
- this.onChange = fn;
277
- }
278
- /**
279
- * Register function on touch
280
- * @param fn the function to register
281
- */
282
- registerOnTouched(fn) {
283
- this.onTouched = fn;
284
- }
285
- /**
286
- * Set the disabled state
287
- * @param isDisabled disabled or not
288
- */
289
- setDisabledState(isDisabled) {
290
- this.disabled = isDisabled;
291
- this.changeDetectorRef.markForCheck();
292
- }
293
- /**
294
- * Reposition and resize the multiSelect on window resize
295
- */
296
- onWindowResize() {
297
- if (this.opened) {
298
- this.positionMultiSelectList();
299
- this.resizeMultiSelectList();
300
- }
301
- }
302
- /**
303
- * Prevent default behavior for arrow key keydown event
304
- * @param event the keydown KeyboardEvent
305
- */
306
- onKeyDown(event) {
307
- if (document.activeElement?.id?.includes(this.multiSelectId) && !this.disabled) {
308
- const { key } = event;
309
- if (MultiSelectComponent.ARROW_KEYS.includes(key)) {
310
- event.preventDefault();
311
- }
312
- }
313
- }
314
- /**
315
- * Close the multi-select list on tab and handle arrow key navigation
316
- * @param event the keyup KeyboardEvent
317
- */
318
- onKeyUp(event) {
319
- if (document.activeElement?.id?.includes(this.multiSelectId) && !this.disabled) {
320
- const { key } = event;
321
- if (MultiSelectComponent.ARROW_KEYS.includes(key)) {
322
- this.onArrowKeyUp(key);
323
- }
324
- else {
325
- if (this.opened) {
326
- if (key === 'Tab') {
327
- this.closeMultiSelect();
328
- }
329
- }
330
- }
331
- }
332
- }
333
- /**
334
- * Close the multi-select list (if opened) on click if outside the list
335
- * @param event the click MouseEvent
336
- */
337
- onClick(event) {
338
- if (this.opened) {
339
- const { pageX, pageY } = event;
340
- if (pageX > 0 && pageY > 0) {
341
- const { left, right, top, bottom } = this.multiSelectList.nativeElement.getBoundingClientRect();
342
- const xPositionValid = pageX >= left && pageX <= right;
343
- const yPositionValid = pageY >= top && pageY <= bottom;
344
- const shouldClose = !(xPositionValid && yPositionValid);
345
- if (shouldClose) {
346
- this.closeMultiSelect();
347
- this.multiSelectButton.nativeElement.focus();
348
- }
349
- }
350
- }
351
- }
352
- /**
353
- * Close multi-select on escape keyup and focus on multi-select button
354
- * @param event the keyup KeyboardEvent
355
- */
356
- onEscapeKeyUp(event) {
357
- if (this.opened) {
358
- event.stopImmediatePropagation();
359
- this.closeMultiSelect();
360
- this.multiSelect.nativeElement.focus();
361
- }
362
- }
363
- /**
364
- * Set focus to multi-select option on mouse enter and update selected index
365
- * @param option the multiSelect option to focus
366
- * @param index the index of the option to focus
367
- */
368
- onMultiSelectOptionMouseEnter(option, index) {
369
- this.selectionIndex = index;
370
- option.focus();
371
- }
372
- /**
373
- * Set focus to multi-select option on mouse move and update selected index
374
- * @param option the multiSelect option to focus
375
- * @param index the index of the option to focus
376
- */
377
- onMultiSelectOptionMouseMove(option, index) {
378
- if (this.selectionIndex !== index) {
379
- this.selectionIndex = index;
380
- option.focus();
381
- }
382
- }
383
- /**
384
- * Write value and close multi-select on option select
385
- * @param value the value to write
386
- * @param disabled whether or not the selected option is disabled
387
- */
388
- onMultiSelectOptionSelect(value, disabled) {
389
- if (!disabled) {
390
- this.handleMultiSelectOptionSelect(value);
391
- }
392
- }
393
- /**
394
- * Open the multi-select list and align it
395
- * @param event the click MouseEvent
396
- */
397
- openMultiSelect(event) {
398
- event.stopImmediatePropagation();
399
- if (!this.disabled) {
400
- this.render = true;
401
- this.opened = true;
402
- }
403
- }
404
- /**
405
- * Close the multiSelect list
406
- */
407
- closeMultiSelect() {
408
- this.opened = false;
409
- this.selectionIndex = null;
410
- }
411
- /**
412
- * Position and resize the multi-select list on animation start if toState is open
413
- * @param event the Angular AnimationEvent
414
- */
415
- onAnimationStart(event) {
416
- if (event.toState === 'open') {
417
- this.resizeMultiSelectList();
418
- this.selectionIndex = null;
419
- setTimeout(() => {
420
- const option = this.getNextOption();
421
- if (!!option) {
422
- option.focus();
423
- }
424
- });
425
- /*
426
- The height of the multi-select list is zero at the point where the above code executes,
427
- this is a workaround to align the list after its height is known to avoid a frame
428
- or two of the list at origin
429
- */
430
- this.renderer.setStyle(this.multiSelectList.nativeElement, 'top', '-999px');
431
- this.renderer.setStyle(this.multiSelectList.nativeElement, 'left', '-999px');
432
- setTimeout(() => this.positionMultiSelectList());
433
- }
434
- }
435
- /**
436
- * Stop rendering the multi-select list on animation done if toState is close
437
- * @param event the Angular AnimationEvent
438
- */
439
- onAnimationDone(event) {
440
- if (event.toState === 'close') {
441
- this.render = false;
442
- }
443
- }
444
- /**
445
- * If the input value is already in the value array, remove it. Otherwise add it
446
- * @param value the selected value
447
- * @private
448
- */
449
- handleMultiSelectOptionSelect(value) {
450
- if (!this.value) {
451
- this.value = [value];
452
- }
453
- else {
454
- const valueCopy = [...this.value];
455
- const foundIndex = valueCopy.findIndex(item => item === value);
456
- if (foundIndex > -1) {
457
- valueCopy.splice(foundIndex, 1);
458
- }
459
- else {
460
- valueCopy.push(value);
461
- }
462
- this.value = valueCopy;
463
- }
464
- this.onChange(this.value);
465
- this.change.emit(this.value);
466
- }
467
- /**
468
- * Align the multi-select list with the multiSelect
469
- * @private
470
- */
471
- positionMultiSelectList() {
472
- const { left, top, bottom } = this.multiSelect.nativeElement.getBoundingClientRect();
473
- const { offsetHeight } = this.multiSelectList.nativeElement;
474
- const datePickerBottomLeftAnchor = bottom;
475
- const availableBottomSpace = window.innerHeight - datePickerBottomLeftAnchor;
476
- const availableTopSpace = top;
477
- const offsetListHeight = offsetHeight + MultiSelectComponent.LIST_OFFSET;
478
- let transformOrigin, positionTop;
479
- if (availableBottomSpace > offsetListHeight) {
480
- transformOrigin = 'top left';
481
- positionTop = `${datePickerBottomLeftAnchor + MultiSelectComponent.LIST_OFFSET}px`;
482
- }
483
- else if (availableTopSpace > offsetListHeight) {
484
- transformOrigin = 'bottom left';
485
- positionTop = `${top - offsetListHeight}px`;
486
- }
487
- else {
488
- if (offsetHeight > window.innerHeight) {
489
- positionTop = '0px';
490
- }
491
- else {
492
- const availableSpace = window.innerHeight - offsetHeight;
493
- positionTop = `${String(availableSpace / 2)}px`;
494
- }
495
- transformOrigin = 'top left';
496
- }
497
- this.renderer.setStyle(this.multiSelectList.nativeElement, 'transform-origin', transformOrigin);
498
- this.renderer.setStyle(this.multiSelectList.nativeElement, 'left', `${left}px`);
499
- this.renderer.setStyle(this.multiSelectList.nativeElement, 'top', positionTop);
500
- }
501
- /**
502
- * Match the multi-select list width to the multi-select's width
503
- * @private
504
- */
505
- resizeMultiSelectList() {
506
- const { left, right } = this.multiSelect.nativeElement.getBoundingClientRect();
507
- const width = right - left;
508
- this.renderer.setStyle(this.multiSelectList.nativeElement, 'width', `${width}px`);
509
- }
510
- /**
511
- * Handle arrow keyup event
512
- * @param key the arrow key
513
- */
514
- onArrowKeyUp(key) {
515
- if (this.opened) {
516
- if (key === 'ArrowLeft' || key === 'ArrowUp') {
517
- const previousOption = this.getPreviousOption();
518
- if (previousOption !== null) {
519
- previousOption.focus();
520
- }
521
- }
522
- else if (key === 'ArrowRight' || key === 'ArrowDown') {
523
- const nextOption = this.getNextOption();
524
- if (nextOption !== null) {
525
- nextOption.focus();
526
- }
527
- }
528
- }
529
- }
530
- /**
531
- * Get the next enabled multi-select option (relative to the current selection index).
532
- * If the currently selected option is the final available option, it is
533
- * returned. If no selection has been made, the first available option is returned
534
- * @private
535
- */
536
- getNextOption() {
537
- const optionsArray = this.multiSelectOptions.toArray();
538
- const startIndex = this.selectionIndex === null ? 0 : this.selectionIndex + 1;
539
- for (let i = startIndex; i < optionsArray.length; i++) {
540
- const option = optionsArray[i].nativeElement;
541
- if (!option.disabled) {
542
- this.selectionIndex = i;
543
- break;
544
- }
545
- }
546
- return this.selectionIndex === null
547
- ? null
548
- : optionsArray[this.selectionIndex].nativeElement;
549
- }
550
- /**
551
- * Get the previous enabled multi-select option (relative to the current selection index).
552
- * If the currently selected option is the first available option, it is
553
- * returned
554
- * @private
555
- */
556
- getPreviousOption() {
557
- let previousOption = null;
558
- if (this.selectionIndex !== null) {
559
- const optionsArray = this.multiSelectOptions.toArray();
560
- for (let i = this.selectionIndex - 1; i >= 0; i--) {
561
- const option = optionsArray[i].nativeElement;
562
- if (!option.disabled) {
563
- this.selectionIndex = i;
564
- previousOption = option;
565
- break;
566
- }
567
- }
568
- }
569
- return previousOption;
570
- }
571
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
572
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: MultiSelectComponent, selector: "particle-multi-select", inputs: { value: "value", options: "options", disabled: "disabled", classList: "classList", buttonClassList: "buttonClassList", entryClassList: "entryClassList", text: "text", type: "type", maxExpandedEntries: "maxExpandedEntries", expandedAsGrid: "expandedAsGrid", collapsedButtonTemplate: "collapsedButtonTemplate" }, outputs: { change: "change" }, host: { listeners: { "window:resize": "onWindowResize()", "window:keydown": "onKeyDown($event)", "window:keyup": "onKeyUp($event)", "window:click": "onClick($event)" } }, providers: [
573
- {
574
- provide: NG_VALUE_ACCESSOR,
575
- useExisting: forwardRef(() => MultiSelectComponent),
576
- multi: true
577
- }
578
- ], queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "multiSelect", first: true, predicate: ["multiSelect"], descendants: true }, { propertyName: "multiSelectButton", first: true, predicate: ["multiSelectButton"], descendants: true }, { propertyName: "multiSelectList", first: true, predicate: ["multiSelectList"], descendants: true }, { propertyName: "multiSelectOptions", predicate: ["multiSelectOption"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"type === 'input' || (type === 'expanded' && maxExpandedEntries > 0 && optionCount > maxExpandedEntries) else expanded\">\r\n <div #multiSelect\r\n class=\"row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n style=\"cursor:default;overflow:hidden;\"\r\n [ngClass]=\"classList ? classList : ''\">\r\n <button #multiSelectButton\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n type=\"button\"\r\n (click)=\"openMultiSelect($event)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [attr.aria-expanded]=\"opened\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btnset clear center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <ng-container *ngIf=\"collapsedButtonTemplate\">\r\n <ng-container *ngTemplateOutlet=\"collapsedButtonTemplate\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!collapsedButtonTemplate\">\r\n <div class=\"col size_1 height100 width100 v_center ptl_input_text_size ptl_input_padding border_none width100 overflow_hide\">\r\n\r\n <ng-container *ngIf=\"selectionCount$ | async as selectionCount else placeholderTemplate\">\r\n <ng-container *ngIf=\"selectionCount > 1 else singleEntry\">\r\n <div class=\"ptl_input_text_size ent_r2l_txt\">\r\n <span class=\"text bold\">{{selectionCount}}</span> {{text.of}} {{optionCount}} {{text.optionsSelected}}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #singleEntry>\r\n <ng-container *ngIf=\"dataContextMap$ | async as dataContextMap\">\r\n <div class=\"col overflow_hide\">\r\n <ng-container *ngIf=\"!!template else noCustomTemplate\">\r\n <div class=\"mar_tb5 pad_tb2\"\r\n *ngFor=\"let value of _internalValue | async\">\r\n <div class=\"ptl_input_text_size ent_r2l_txt\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(dataContextMap['' + value])\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <div class=\"ptl_input_text_size mar_tb5 pad_tb2 ent_r2l_txt\"\r\n *ngFor=\"let value of _internalValue | async\">\r\n {{dataContextMap['' + value]['$implicit'] || dataContextMap['' + value]['label']}}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ptl_placeholder ent_r2l_txt\">{{text.placeholder + '...'}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"buttonClassList ? buttonClassList : 'ptl_brdr_color'\">\r\n <div class=\"center_center height100 width100\">\r\n <i class=\"fas fa-caret-down ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </button>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #expanded>\r\n <ng-container [ngTemplateOutlet]=\"multiSelectOptions\"></ng-container>\r\n</ng-template>\r\n\r\n<div [style.display]=\"render ? '' : 'none'\"\r\n [attr.aria-hidden]=\"!render\"\r\n class=\"particle_multiselect_overlay\">\r\n <div #multiSelectList\r\n [@openClose]=\"opened ? 'open' : 'close'\"\r\n (@openClose.start)=\"onAnimationStart($event)\"\r\n (@openClose.done)=\"onAnimationDone($event)\"\r\n class=\"position_absolute\">\r\n <div class=\"particle_multiselect_options content_color ent_r2l_dir\">\r\n <ng-container [ngTemplateOutlet]=\"multiSelectOptions\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #multiSelectOptions>\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <div class=\"particle_multiselect_list ent_r2l_dir\"\r\n role=\"listbox\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [ngClass]=\"type === 'expanded' && expandedAsGrid ? 'particle_multi_select_grid' : ''\"\r\n >\r\n <!-- CUSTOM TEMPLATE -->\r\n <ng-container *ngIf=\"!!template else defaultOptionTemplate\">\r\n <ng-container *ngIf=\"selectionValueMap$ | async as selectionValueMap\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_multiselect_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i + j)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + groupOption.value\"\r\n [ngClass]=\"(!selectionValueMap['' + groupOption.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(groupOption.value)\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled || disabled\"\r\n class=\"ptl_input_text_size\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + groupOption.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + groupOption.value]\"><i class=\"fas fa-check ent_r2l_ico\"></i></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(groupOption.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + option.value\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(option.value)\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled || disabled\"\r\n [ngClass]=\"(!selectionValueMap['' + option.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n class=\"ptl_input_text_size\"\r\n role=\"option\" type=\"button\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + option.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + option.value]\"><i class=\"fas fa-check\"></i></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(option.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- NO CUSTOM TEMPLATE -->\r\n <ng-template #defaultOptionTemplate>\r\n <ng-container *ngIf=\"selectionValueMap$ | async as selectionValueMap\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_multiselect_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i + j)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + groupOption.value\"\r\n [attr.aria-label]=\"groupOption.label\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(groupOption.value)\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled || disabled\"\r\n [ngClass]=\"(!selectionValueMap['' + groupOption.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n class=\"ptl_input_text_size\"\r\n type=\"button\" role=\"option\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + groupOption.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + groupOption.value]\"><i class=\"fas fa-check\"></i></div>\r\n </div>\r\n <div class=\"ent_r2l_txt mar_lr5\">{{groupOption.label}}</div>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + option.value\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(option.value)\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled || disabled\"\r\n [ngClass]=\"(!selectionValueMap['' + option.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n class=\"ptl_input_text_size\"\r\n type=\"button\" role=\"option\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + option.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + option.value]\"><i class=\"fas fa-check\"></i></div>\r\n </div>\r\n <div class=\"ent_r2l_txt mar_lr5\">{{option.label}}</div>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-content select=\"template\"></ng-content>\r\n", styles: [":host{width:100%}.particle_multiselect{width:100%;min-width:150px;position:relative}.particle_multiselect:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_multiselect_input{display:flex;align-items:center;position:absolute;inset:0;padding:inherit;padding-top:.25em;padding-bottom:.25em;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.particle_multiselect_input:not([disabled]){cursor:pointer}.particle_multiselect_input::-ms-expand{display:none}.particle_multiselect_caret{position:absolute;top:.5em;right:1em;z-index:var(--z-frame);background:transparent;pointer-events:none}.particle_multiselect_selection{font-size:.75em;margin-right:5px;border-radius:3px;padding:.3em .5em;background-color:#6464801a;display:inline-block}.particle_multiselect_placeholder{opacity:.5;display:inline}.particle_multiselect_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_multiselect_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);max-height:250px;width:100%;overflow-y:auto;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.particle_multiselect_heading{font-weight:600;opacity:.8;padding:10px 12px 4px}.particle_multiselect_list{padding:0;margin:0;outline:none}.particle_multiselect_option{padding:7px 12px;cursor:pointer;border:none;width:100%;text-align:left;display:flex;align-items:center;transition:.2s background-color ease;background-color:transparent;color:inherit}.particle_multiselect_option.unselected:focus{background-color:#8080801a}.particle_multiselect_option:not(.unselected):focus{background-color:#8080803d}.particle_multiselect_option[disabled]{cursor:default}.particle_multiselect_checkbox{width:20px;min-width:20px;height:20px;min-height:20px;margin-right:10px;display:flex;align-items:center;justify-content:center;font-size:12px;transition:background-color .2s ease}.particle_multiselect_checkbox.unselected{background-color:#8080801a}.particle_multiselect_checkbox.unselected:hover{background-color:#80808033}\n/*!* option hover/focus state *!*/\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], animations: [
579
- trigger('openClose', [
580
- transition('close => open', [
581
- style({ transform: 'scaleY(0.5)', opacity: 0 }),
582
- animate('200ms ease', style({ transform: 'scaleY(1)', opacity: 1 }))
583
- ]),
584
- transition('open => close', [
585
- style({ transform: 'scaleY(1)', opacity: 1 }),
586
- animate('200ms ease', style({ transform: 'scaleY(0.5)', opacity: 0 }))
587
- ]),
588
- ])
589
- ] });
590
- }
591
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: MultiSelectComponent, decorators: [{
592
- type: Component,
593
- args: [{ selector: 'particle-multi-select', animations: [
594
- trigger('openClose', [
595
- transition('close => open', [
596
- style({ transform: 'scaleY(0.5)', opacity: 0 }),
597
- animate('200ms ease', style({ transform: 'scaleY(1)', opacity: 1 }))
598
- ]),
599
- transition('open => close', [
600
- style({ transform: 'scaleY(1)', opacity: 1 }),
601
- animate('200ms ease', style({ transform: 'scaleY(0.5)', opacity: 0 }))
602
- ]),
603
- ])
604
- ], providers: [
605
- {
606
- provide: NG_VALUE_ACCESSOR,
607
- useExisting: forwardRef(() => MultiSelectComponent),
608
- multi: true
609
- }
610
- ], template: "<ng-container *ngIf=\"type === 'input' || (type === 'expanded' && maxExpandedEntries > 0 && optionCount > maxExpandedEntries) else expanded\">\r\n <div #multiSelect\r\n class=\"row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\"\r\n style=\"cursor:default;overflow:hidden;\"\r\n [ngClass]=\"classList ? classList : ''\">\r\n <button #multiSelectButton\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n type=\"button\"\r\n (click)=\"openMultiSelect($event)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [attr.aria-expanded]=\"opened\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n class=\"access btnset clear center_center height100 width100\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <ng-container *ngIf=\"collapsedButtonTemplate\">\r\n <ng-container *ngTemplateOutlet=\"collapsedButtonTemplate\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!collapsedButtonTemplate\">\r\n <div class=\"col size_1 height100 width100 v_center ptl_input_text_size ptl_input_padding border_none width100 overflow_hide\">\r\n\r\n <ng-container *ngIf=\"selectionCount$ | async as selectionCount else placeholderTemplate\">\r\n <ng-container *ngIf=\"selectionCount > 1 else singleEntry\">\r\n <div class=\"ptl_input_text_size ent_r2l_txt\">\r\n <span class=\"text bold\">{{selectionCount}}</span> {{text.of}} {{optionCount}} {{text.optionsSelected}}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #singleEntry>\r\n <ng-container *ngIf=\"dataContextMap$ | async as dataContextMap\">\r\n <div class=\"col overflow_hide\">\r\n <ng-container *ngIf=\"!!template else noCustomTemplate\">\r\n <div class=\"mar_tb5 pad_tb2\"\r\n *ngFor=\"let value of _internalValue | async\">\r\n <div class=\"ptl_input_text_size ent_r2l_txt\">\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(dataContextMap['' + value])\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noCustomTemplate>\r\n <div class=\"ptl_input_text_size mar_tb5 pad_tb2 ent_r2l_txt\"\r\n *ngFor=\"let value of _internalValue | async\">\r\n {{dataContextMap['' + value]['$implicit'] || dataContextMap['' + value]['label']}}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ptl_placeholder ent_r2l_txt\">{{text.placeholder + '...'}}</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"buttonClassList ? buttonClassList : 'ptl_brdr_color'\">\r\n <div class=\"center_center height100 width100\">\r\n <i class=\"fas fa-caret-down ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </button>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #expanded>\r\n <ng-container [ngTemplateOutlet]=\"multiSelectOptions\"></ng-container>\r\n</ng-template>\r\n\r\n<div [style.display]=\"render ? '' : 'none'\"\r\n [attr.aria-hidden]=\"!render\"\r\n class=\"particle_multiselect_overlay\">\r\n <div #multiSelectList\r\n [@openClose]=\"opened ? 'open' : 'close'\"\r\n (@openClose.start)=\"onAnimationStart($event)\"\r\n (@openClose.done)=\"onAnimationDone($event)\"\r\n class=\"position_absolute\">\r\n <div class=\"particle_multiselect_options content_color ent_r2l_dir\">\r\n <ng-container [ngTemplateOutlet]=\"multiSelectOptions\"></ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #multiSelectOptions>\r\n <ng-container *ngIf=\"_options | async as options\">\r\n <div class=\"particle_multiselect_list ent_r2l_dir\"\r\n role=\"listbox\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"text.placeholder\"\r\n [ngClass]=\"type === 'expanded' && expandedAsGrid ? 'particle_multi_select_grid' : ''\"\r\n >\r\n <!-- CUSTOM TEMPLATE -->\r\n <ng-container *ngIf=\"!!template else defaultOptionTemplate\">\r\n <ng-container *ngIf=\"selectionValueMap$ | async as selectionValueMap\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_multiselect_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i + j)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + groupOption.value\"\r\n [ngClass]=\"(!selectionValueMap['' + groupOption.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(groupOption.value)\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled || disabled\"\r\n class=\"ptl_input_text_size\"\r\n type=\"button\"\r\n role=\"option\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + groupOption.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + groupOption.value]\"><i class=\"fas fa-check ent_r2l_ico\"></i></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(groupOption.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + option.value\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(option.value)\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled || disabled\"\r\n [ngClass]=\"(!selectionValueMap['' + option.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n class=\"ptl_input_text_size\"\r\n role=\"option\" type=\"button\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + option.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + option.value]\"><i class=\"fas fa-check\"></i></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"template; context: $any(option.dataContext!)\"></ng-container>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- NO CUSTOM TEMPLATE -->\r\n <ng-template #defaultOptionTemplate>\r\n <ng-container *ngIf=\"selectionValueMap$ | async as selectionValueMap\">\r\n <ng-container *ngFor=\"let option of options; index as i\">\r\n <!-- OPTION GROUP -->\r\n <ng-container *ngIf=\"option.type === 'group' else nonGroupOption\">\r\n <div class=\"particle_multiselect_heading ptl_input_text_size ent_r2l_txt\" aria-hidden=\"true\">{{option.groupLabel}}</div>\r\n <ng-container *ngFor=\"let groupOption of option.options; index as j\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(groupOption.value, groupOption.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i + j)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i + j)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + groupOption.value\"\r\n [attr.aria-label]=\"groupOption.label\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(groupOption.value)\"\r\n [attr.data-value]=\"groupOption.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"groupOption.disabled || disabled\"\r\n [ngClass]=\"(!selectionValueMap['' + groupOption.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n class=\"ptl_input_text_size\"\r\n type=\"button\" role=\"option\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + groupOption.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + groupOption.value]\"><i class=\"fas fa-check\"></i></div>\r\n </div>\r\n <div class=\"ent_r2l_txt mar_lr5\">{{groupOption.label}}</div>\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <!-- SINGULAR OPTION -->\r\n <ng-template #nonGroupOption>\r\n <ng-container *ngIf=\"option.type === 'option'\">\r\n <button #multiSelectOption\r\n (click)=\"onMultiSelectOptionSelect(option.value, option.disabled!)\"\r\n (mouseenter)=\"onMultiSelectOptionMouseEnter(multiSelectOption, i)\"\r\n (mousemove)=\"onMultiSelectOptionMouseMove(multiSelectOption, i)\"\r\n (keyup.escape)=\"onEscapeKeyUp($event)\"\r\n [id]=\"multiSelectId + '-' + option.value\"\r\n [attr.aria-selected]=\"(_internalValue | async)?.includes(option.value)\"\r\n [attr.data-value]=\"option.value\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n [disabled]=\"option.disabled || disabled\"\r\n [ngClass]=\"(!selectionValueMap['' + option.value] ? 'unselected' : '') + (entryClassList ? ' ' + entryClassList : ' particle_multiselect_option')\"\r\n class=\"ptl_input_text_size\"\r\n type=\"button\" role=\"option\" tabindex=\"0\">\r\n <div class=\"particle_multiselect_checkbox ptl_brdr_radius bg_overlay brdr\"\r\n [ngClass]=\"selectionValueMap['' + option.value] ? 'ok_button_color' : 'unselected'\"\r\n aria-hidden=\"true\">\r\n <div *ngIf=\"selectionValueMap['' + option.value]\"><i class=\"fas fa-check\"></i></div>\r\n </div>\r\n <div class=\"ent_r2l_txt mar_lr5\">{{option.label}}</div>\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-content select=\"template\"></ng-content>\r\n", styles: [":host{width:100%}.particle_multiselect{width:100%;min-width:150px;position:relative}.particle_multiselect:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.particle_multiselect_input{display:flex;align-items:center;position:absolute;inset:0;padding:inherit;padding-top:.25em;padding-bottom:.25em;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.particle_multiselect_input:not([disabled]){cursor:pointer}.particle_multiselect_input::-ms-expand{display:none}.particle_multiselect_caret{position:absolute;top:.5em;right:1em;z-index:var(--z-frame);background:transparent;pointer-events:none}.particle_multiselect_selection{font-size:.75em;margin-right:5px;border-radius:3px;padding:.3em .5em;background-color:#6464801a;display:inline-block}.particle_multiselect_placeholder{opacity:.5;display:inline}.particle_multiselect_overlay{position:fixed;inset:0;z-index:var(--z-overlay)}.particle_multiselect_options{border-radius:3px;line-height:1.5;overflow:hidden;list-style-type:none;font-weight:400;z-index:var(--z-overlay);max-height:250px;width:100%;overflow-y:auto;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.particle_multiselect_heading{font-weight:600;opacity:.8;padding:10px 12px 4px}.particle_multiselect_list{padding:0;margin:0;outline:none}.particle_multiselect_option{padding:7px 12px;cursor:pointer;border:none;width:100%;text-align:left;display:flex;align-items:center;transition:.2s background-color ease;background-color:transparent;color:inherit}.particle_multiselect_option.unselected:focus{background-color:#8080801a}.particle_multiselect_option:not(.unselected):focus{background-color:#8080803d}.particle_multiselect_option[disabled]{cursor:default}.particle_multiselect_checkbox{width:20px;min-width:20px;height:20px;min-height:20px;margin-right:10px;display:flex;align-items:center;justify-content:center;font-size:12px;transition:background-color .2s ease}.particle_multiselect_checkbox.unselected{background-color:#8080801a}.particle_multiselect_checkbox.unselected:hover{background-color:#80808033}\n/*!* option hover/focus state *!*/\n"] }]
611
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { value: [{
612
- type: Input
613
- }], options: [{
614
- type: Input
615
- }], multiSelect: [{
616
- type: ViewChild,
617
- args: ['multiSelect']
618
- }], multiSelectButton: [{
619
- type: ViewChild,
620
- args: ['multiSelectButton']
621
- }], multiSelectList: [{
622
- type: ViewChild,
623
- args: ['multiSelectList']
624
- }], multiSelectOptions: [{
625
- type: ViewChildren,
626
- args: ['multiSelectOption']
627
- }], template: [{
628
- type: ContentChild,
629
- args: [TemplateRef]
630
- }], disabled: [{
631
- type: Input
632
- }], classList: [{
633
- type: Input
634
- }], buttonClassList: [{
635
- type: Input
636
- }], entryClassList: [{
637
- type: Input
638
- }], text: [{
639
- type: Input
640
- }], type: [{
641
- type: Input
642
- }], maxExpandedEntries: [{
643
- type: Input
644
- }], expandedAsGrid: [{
645
- type: Input
646
- }], collapsedButtonTemplate: [{
647
- type: Input
648
- }],
649
- // eslint-disable-next-line @angular-eslint/no-output-native
650
- change: [{
651
- type: Output
652
- }], onWindowResize: [{
653
- type: HostListener,
654
- args: ['window:resize']
655
- }], onKeyDown: [{
656
- type: HostListener,
657
- args: ['window:keydown', ['$event']]
658
- }], onKeyUp: [{
659
- type: HostListener,
660
- args: ['window:keyup', ['$event']]
661
- }], onClick: [{
662
- type: HostListener,
663
- args: ['window:click', ['$event']]
664
- }] } });
665
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQWtCLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUYsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUFFLFVBQVUsRUFDeEIsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04sV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxlQUFlLEVBQWMsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFVdEQ7O0dBRUc7QUEyQkgsTUFBTSxPQUFPLG9CQUFvQjtJQXdUWDtJQUE2QjtJQXRUakQ7OztPQUdHO0lBQ0gsSUFDSSxLQUFLLENBQUMsS0FBNkI7UUFDckMsSUFBSSxVQUFVLEdBQTJCLElBQVcsQ0FBQztRQUNyRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUM3QixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7cUJB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c0JBRFIsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixLQUFLO2dCQUlOLElBQUk7c0JBREgsS0FBSztnQkFXTixJQUFJO3NCQURILEtBQUs7Z0JBSU4sa0JBQWtCO3NCQURqQixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTix1QkFBdUI7c0JBRHRCLEtBQUs7O1FBT0osNERBQTREO1FBQzlELE1BQU07c0JBRkwsTUFBTTtnQkFnT1AsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWU7Z0JBYTdCLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFnQjFDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBc0J4QyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgQW5pbWF0aW9uRXZlbnQsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBtYXB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge011bHRpU2VsZWN0T3B0aW9ufSBmcm9tICcuL21vZGVscy9tdWx0aS1zZWxlY3Qtb3B0aW9uLm1vZGVsJztcclxuaW1wb3J0IHtNdWx0aVNlbGVjdE9wdGlvbkdyb3VwfSBmcm9tICcuL21vZGVscy9tdWx0aS1zZWxlY3Qtb3B0aW9uLWdyb3VwLm1vZGVsJztcclxuaW1wb3J0IHtNdWx0aVNlbGVjdFRleHR9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvcGFydGljbGUtY29tcG9uZW50LXRleHQubW9kZWwnO1xyXG5cclxuLyoqXHJcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHRoZSBtdWx0aS1zZWxlY3QgY29tcG9uZW50IG9wdGlvbiBpbnB1dFxyXG4gKi9cclxuZGVjbGFyZSB0eXBlIE11bHRpU2VsZWN0T3B0aW9uSW5wdXQgPSBBcnJheTxNdWx0aVNlbGVjdE9wdGlvbiB8IE11bHRpU2VsZWN0T3B0aW9uR3JvdXA+O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpLXNlbGVjdCBjb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGFydGljbGUtbXVsdGktc2VsZWN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50LmNzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ29wZW5DbG9zZScsIFtcclxuICAgICAgdHJhbnNpdGlvbignY2xvc2UgPT4gb3BlbicsIFtcclxuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3NjYWxlWSgwLjUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlJyxcclxuICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJywgb3BhY2l0eTogMSB9KSlcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ29wZW4gPT4gY2xvc2UnLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMSknLCBvcGFjaXR5OiAxIH0pLFxyXG4gICAgICAgIGFuaW1hdGUoJzIwMG1zIGVhc2UnLFxyXG4gICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZVkoMC41KScsIG9wYWNpdHk6IDAgfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgXSlcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlTZWxlY3RDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBtdWx0aS1zZWxlY3RcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZhbHVlKHZhbHVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSB7XHJcbiAgICBsZXQgdmFsdWVUb1NldDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9IG51bGwgYXMgYW55O1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHZhbHVlVG9TZXQgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCB2YWx1ZUl0ZW0gb2YgdmFsdWUpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZUl0ZW0pKSB7XHJcbiAgICAgICAgICB2YWx1ZVRvU2V0LnB1c2goLi4udmFsdWVJdGVtKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCh0eXBlb2YgdmFsdWVJdGVtID09PSAnc3RyaW5nJykgfHwgKHR5cGVvZiB2YWx1ZUl0ZW0gPT09ICdudW1iZXInKSkge1xyXG4gICAgICAgICAgdmFsdWVUb1NldC5wdXNoKHZhbHVlSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBub25OdWxsVmFsdWVzID0gdmFsdWVUb1NldC5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBudWxsKTtcclxuICAgICAgdmFsdWVUb1NldCA9ICFub25OdWxsVmFsdWVzLmxlbmd0aCA/IG51bGwgYXMgYW55IDogbm9uTnVsbFZhbHVlcztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlVG9TZXQ7XHJcbiAgICB0aGlzLl9pbnRlcm5hbFZhbHVlLm5leHQodmFsdWVUb1NldCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogQXJyYXk8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbXVsdGktc2VsZWN0IG9wdGlvbnMvb3B0aW9uIGdyb3Vwc1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG9wdGlvbnMob3B0aW9uczogTXVsdGlTZWxlY3RPcHRpb25JbnB1dCkge1xyXG4gICAgdGhpcy5vcHRpb25Db3VudCA9IDA7XHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qgc3Vib3B0aW9ucyA9IChvcHRpb24gYXMgTXVsdGlTZWxlY3RPcHRpb25Hcm91cCkub3B0aW9ucztcclxuICAgICAgICBpZiAoc3Vib3B0aW9ucykge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25Db3VudCArPSBzdWJvcHRpb25zLmxlbmd0aDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25Db3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX29wdGlvbnMubmV4dChNdWx0aVNlbGVjdENvbXBvbmVudC5zYW5pdGl6ZU9wdGlvbklucHV0KG9wdGlvbnMpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBhbW91bnQgb2Ygb2Zmc2V0IChpbiBwaXhlbHMpIHRvIHBsYWNlIGJldHdlZW4gdGhlIG11bHRpLXNlbGVjdFxyXG4gICAqIGFuZCBpdHMgbGlzdCBvdmVybGF5XHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMSVNUX09GRlNFVCA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3Qgb2YgYXJyb3cga2V5IGtleWNvZGVzXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBUlJPV19LRVlTID0gWydBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd1JpZ2h0JywgJ0Fycm93RG93biddO1xyXG5cclxuICAvKipcclxuICAgKiBWaWV3Q2hpbGQgb2YgdGhlIG11bHRpLXNlbGVjdFxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGQoJ211bHRpU2VsZWN0JylcclxuICBtdWx0aVNlbGVjdDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlld0NoaWxkIG9mIHRoZSBtdWx0aS1zZWxlY3QgYnV0dG9uXHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgnbXVsdGlTZWxlY3RCdXR0b24nKVxyXG4gIG11bHRpU2VsZWN0QnV0dG9uOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PiA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBWaWV3Q2hpbGQgb2YgdGhlIG11bHRpLXNlbGVjdCBsaXN0XHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgnbXVsdGlTZWxlY3RMaXN0JylcclxuICBtdWx0aVNlbGVjdExpc3Q6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5TGlzdCBvZiBtdWx0aS1zZWxlY3Qgb3B0aW9uIFZpZXdDaGlsZHJlblxyXG4gICAqL1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ211bHRpU2VsZWN0T3B0aW9uJylcclxuICBtdWx0aVNlbGVjdE9wdGlvbnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29udGVudENoaWxkIG9mIHRoZSBtdWx0aS1zZWxlY3Qgb3B0aW9uIHRlbXBsYXRlXHJcbiAgICovXHJcbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZilcclxuICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIG11bHRpLXNlbGVjdCBzaG91bGQgYmUgZGlzYWJsZWRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGxpc3QgdG8gYXNzaWduIHRvIHRoZSBtdWx0aS1zZWxlY3RcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGNsYXNzTGlzdDogc3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYnV0dG9uQ2xhc3NMaXN0OiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICBlbnRyeUNsYXNzTGlzdDogc3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdGV4dDogTXVsdGlTZWxlY3RUZXh0ID0ge1xyXG4gICAgcGxhY2Vob2xkZXI6ICdNYWtlIGEgU2VsZWN0aW9uJyxcclxuICAgIG9mOiAnb2YnLFxyXG4gICAgb3B0aW9uc1NlbGVjdGVkOiAnb3B0aW9ucyBzZWxlY3RlZCdcclxuICB9IGFzIE11bHRpU2VsZWN0VGV4dDtcclxuXHJcbiAgLyoqXHJcbiAgICogU3R5bGUgb2YgdGhlIG11bHRpLXNlbGVjdFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgdHlwZTogJ2lucHV0JyB8ICdleHBhbmRlZCcgPSAnaW5wdXQnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIG1heEV4cGFuZGVkRW50cmllczogbnVtYmVyID0gMDtcclxuXHJcbiAgQElucHV0KClcclxuICBleHBhbmRlZEFzR3JpZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbGxhcHNlZEJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgb24gdmFsdWUgY2hhbmdlLCBlbWl0cyB0aGUgbmV3IHZhbHVlXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcclxuICBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PHN0cmluZyB8IG51bWJlcj4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJlaGF2aW9yU3ViamVjdCB0cmFja2luZyB0aGUgaW5wdXQgbXVsdGktc2VsZWN0IG9wdGlvbnMvb3B0aW9uIGdyb3Vwc1xyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9vcHRpb25zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNdWx0aVNlbGVjdE9wdGlvbklucHV0PihudWxsIGFzIGFueSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJlaGF2aW9yU3ViamVjdCB0cmFja2luZyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbXVsdGktc2VsZWN0XHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX2ludGVybmFsVmFsdWUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PG51bWJlciB8IHN0cmluZz4+KG51bGwgYXMgYW55KTtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2YWJsZSBtYXAgb2Ygb3B0aW9uIHZhbHVlIChzdHJpbmdpZmllZCBpZiBhIG51bWJlcikgdG8gZGF0YSBjb250ZXh0XHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZGF0YUNvbnRleHRNYXAkOiBPYnNlcnZhYmxlPHsgW3ZhbHVlOiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSB9PiA9IHRoaXMuX29wdGlvbnMucGlwZShcclxuICAgIG1hcChvcHRpb25zID0+IHtcclxuICAgICAgbGV0IGRhdGFDb250ZXh0TWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gfSA9IG51bGwgYXMgYW55O1xyXG5cclxuICAgICAgaWYgKCEhb3B0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgZGF0YUNvbnRleHRNYXAgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xyXG4gICAgICAgICAgaWYgKCdvcHRpb25zJyBpbiBvcHRpb24pIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBncm91cE9wdGlvbiBvZiBvcHRpb24ub3B0aW9ucykge1xyXG4gICAgICAgICAgICAgIGRhdGFDb250ZXh0TWFwW1N0cmluZyhncm91cE9wdGlvbi52YWx1ZSldID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShncm91cE9wdGlvbi5kYXRhQ29udGV4dCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCdkYXRhQ29udGV4dCcgaW4gb3B0aW9uKSB7XHJcbiAgICAgICAgICAgIGRhdGFDb250ZXh0TWFwW1N0cmluZyhvcHRpb24udmFsdWUpXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9uLmRhdGFDb250ZXh0KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YUNvbnRleHRNYXA7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgbWFwIG9mIHN0cmluZ2lmaWVkIG9wdGlvbiB2YWx1ZSB0byBib29sZWFuIGluZGljYXRpbmcgdGhlIHVzZXIncyBzZWxlY3Rpb25zXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVNYXAkOiBPYnNlcnZhYmxlPHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9PiA9IHRoaXMuX2ludGVybmFsVmFsdWUucGlwZShcclxuICAgIG1hcCh2YWx1ZXMgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb25WYWx1ZU1hcCA9IHt9IGFzIGFueTtcclxuXHJcbiAgICAgIGlmICghIXZhbHVlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgIHNlbGVjdGlvblZhbHVlTWFwW1N0cmluZyh2YWx1ZSldID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZWxlY3Rpb25WYWx1ZU1hcDtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGNvdW50IG9mIHNlbGVjdGVkIG9wdGlvbnMgYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy5faW50ZXJuYWxWYWx1ZS5waXBlKFxyXG4gICAgbWFwKHZhbHVlcyA9PiB2YWx1ZXM/Lmxlbmd0aCA/PyAwKVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVuaXF1ZSBJRCB0byBhc3NpZ24gdG8gdGhlIG11bHRpU2VsZWN0XHJcbiAgICovXHJcbiAgcmVhZG9ubHkgbXVsdGlTZWxlY3RJZDtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byByZW5kZXIgdGhlIG11bHRpLXNlbGVjdCBsaXN0XHJcbiAgICovXHJcbiAgcmVuZGVyID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIG11bHRpLXNlbGVjdCBpcyBvcGVuXHJcbiAgICovXHJcbiAgb3BlbmVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgZm9jdXNlZCBvcHRpb24gaW4gdGhlIG11bHRpU2VsZWN0IGxpc3RcclxuICAgKi9cclxuICBzZWxlY3Rpb25JbmRleDogbnVtYmVyID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIG9wdGlvbkNvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbXVsdGlTZWxlY3RcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3ZhbHVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgb3B0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIGJvdGggYSBsYWJlbCBhbmQgYSB2YWx1ZSxcclxuICAgKiBhbHNvIHJlbW92ZXMgZW1wdHkgZ3JvdXBzIChvciBncm91cHMgdGhhdCBoYXZlIG5vIHZhbGlkIG9wdGlvbnMpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gc2FuaXRpemVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHNhbml0aXplT3B0aW9uSW5wdXQob3B0aW9uczogTXVsdGlTZWxlY3RPcHRpb25JbnB1dCk6IE11bHRpU2VsZWN0T3B0aW9uSW5wdXQge1xyXG4gICAgY29uc3Qgc2FuaXRpemVkT3B0aW9uczogTXVsdGlTZWxlY3RPcHRpb25JbnB1dCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgaWYgKCgnZ3JvdXBMYWJlbCcgaW4gb3B0aW9uKSAmJiAoJ29wdGlvbnMnIGluIG9wdGlvbikpIHtcclxuICAgICAgICBjb25zdCB2YWxpZE9wdGlvbnM6IEFycmF5PE11bHRpU2VsZWN0T3B0aW9uPiA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXBPcHRpb24gb2YgKG9wdGlvbi5vcHRpb25zID8/IFtdKSkge1xyXG4gICAgICAgICAgaWYgKCEhZ3JvdXBPcHRpb24ubGFiZWwgJiYgKCEhZ3JvdXBPcHRpb24udmFsdWUgfHwgKCtncm91cE9wdGlvbi52YWx1ZSA+PSAwKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBPcHRpb25Db3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShncm91cE9wdGlvbikpO1xyXG4gICAgICAgICAgICBncm91cE9wdGlvbkNvcHkuZGF0YUNvbnRleHQgPSB0aGlzLmFkZExhYmVsVG9EYXRhQ29udGV4dChncm91cE9wdGlvbkNvcHkubGFiZWwsIGdyb3VwT3B0aW9uQ29weS5kYXRhQ29udGV4dCk7XHJcbiAgICAgICAgICAgIGdyb3VwT3B0aW9uQ29weS50eXBlID0gJ2dyb3VwJztcclxuXHJcbiAgICAgICAgICAgIHZhbGlkT3B0aW9ucy5wdXNoKGdyb3VwT3B0aW9uQ29weSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISF2YWxpZE9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBzYW5pdGl6ZWRPcHRpb25zLnB1c2goeyBncm91cExhYmVsOiBvcHRpb24uZ3JvdXBMYWJlbCwgb3B0aW9uczogdmFsaWRPcHRpb25zLCB0eXBlOiAnZ3JvdXAnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgoJ2xhYmVsJyBpbiBvcHRpb24pICYmICgndmFsdWUnIGluIG9wdGlvbikpIHtcclxuICAgICAgICBpZiAoISFvcHRpb24ubGFiZWwgJiYgKCEhb3B0aW9uLnZhbHVlIHx8ICgrb3B0aW9uLnZhbHVlID49IDApKSkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9uKSk7XHJcbiAgICAgICAgICBvcHRpb25Db3B5LmRhdGFDb250ZXh0ID0gdGhpcy5hZGRMYWJlbFRvRGF0YUNvbnRleHQob3B0aW9uQ29weS5sYWJlbCwgb3B0aW9uQ29weS5kYXRhQ29udGV4dCk7XHJcbiAgICAgICAgICBvcHRpb25Db3B5LnR5cGUgPSAnb3B0aW9uJztcclxuXHJcbiAgICAgICAgICBzYW5pdGl6ZWRPcHRpb25zLnB1c2gob3B0aW9uQ29weSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNhbml0aXplZE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgb3B0aW9uIGxhYmVsIHRvIGRhdGEgY29udGV4dCBpZiBub3QgcHJlc2VudC4gSWYgJGltcGxpY2l0XHJcbiAgICogdmFsdWUgaXMgbm90IHByZXNlbnQsIGl0IHdpbGwgYmUgYWRkZWQgd2l0aCB0aGUgbGFiZWwgYXMgaXRzIHZhbHVlLlxyXG4gICAqIElmICRpbXBsaWNpdCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IHdpbGwgYWRkIGEgbGFiZWwga2V5IHRvIHRoZSBjb250ZXh0XHJcbiAgICogQHBhcmFtIGxhYmVsIHRoZSBvcHRpb24gbGFiZWxcclxuICAgKiBAcGFyYW0gZGF0YUNvbnRleHQgdGhlIG9wdGlvbiBkYXRhIGNvbnRleHRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGFkZExhYmVsVG9EYXRhQ29udGV4dChsYWJlbDogc3RyaW5nLCBkYXRhQ29udGV4dDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSB7XHJcbiAgICBpZiAoIWRhdGFDb250ZXh0KSB7XHJcbiAgICAgIGRhdGFDb250ZXh0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhbGFiZWwpIHtcclxuICAgICAgY29uc3QgaW1wbGljaXRWYWx1ZSA9IGRhdGFDb250ZXh0WyckaW1wbGljaXQnXTtcclxuXHJcbiAgICAgIGlmICghIWltcGxpY2l0VmFsdWUgfHwgaW1wbGljaXRWYWx1ZSBhcyBudW1iZXIgPj0gMCkge1xyXG4gICAgICAgIGNvbnN0IGxhYmVsRXhpc3RzID0gISFkYXRhQ29udGV4dFsnbGFiZWwnXTtcclxuXHJcbiAgICAgICAgaWYgKCFsYWJlbEV4aXN0cykge1xyXG4gICAgICAgICAgZGF0YUNvbnRleHRbJ2xhYmVsJ10gPSBsYWJlbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YUNvbnRleHRbJyRpbXBsaWNpdCddID0gbGFiZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YUNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIGNoYW5nZVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBGdW5jdGlvbiB0byBjYWxsIG9uIHRvdWNoXHJcbiAgICovXHJcbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVwZW5kZW5jeSBpbmplY3Rpb24gc2l0ZVxyXG4gICAqIEBwYXJhbSByZW5kZXJlciB0aGUgQW5ndWxhciByZW5kZXJlclxyXG4gICAqIEBwYXJhbSBjaGFuZ2VEZXRlY3RvclJlZiByZWZlcmVuY2UgdG8gdGhlIEFuZ3VsYXIgY2hhbmdlIGRldGVjdG9yXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgY29uc3QgY2hhcmFjdGVycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XHJcbiAgICBsZXQgcmVzdWx0ID0gJyc7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgIHJlc3VsdCArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzLmxlbmd0aCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubXVsdGlTZWxlY3RJZCA9IGBtdWx0aXNlbGVjdC0ke3Jlc3VsdH0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZSB2YWx1ZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd3JpdGVcclxuICAgKi9cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gY2hhbmdlXHJcbiAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byByZWdpc3RlclxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gdG91Y2hcclxuICAgKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZGlzYWJsZWQgc3RhdGVcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBkaXNhYmxlZCBvciBub3RcclxuICAgKi9cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXBvc2l0aW9uIGFuZCByZXNpemUgdGhlIG11bHRpU2VsZWN0IG9uIHdpbmRvdyByZXNpemVcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZCkge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uTXVsdGlTZWxlY3RMaXN0KCk7XHJcbiAgICAgIHRoaXMucmVzaXplTXVsdGlTZWxlY3RMaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGFycm93IGtleSBrZXlkb3duIGV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBrZXlkb3duIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uaWQ/LmluY2x1ZGVzKHRoaXMubXVsdGlTZWxlY3RJZCkgJiYgIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgY29uc3QgeyBrZXkgfSA9IGV2ZW50O1xyXG5cclxuICAgICAgaWYgKE11bHRpU2VsZWN0Q29tcG9uZW50LkFSUk9XX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIHRoZSBtdWx0aS1zZWxlY3QgbGlzdCBvbiB0YWIgYW5kIGhhbmRsZSBhcnJvdyBrZXkgbmF2aWdhdGlvblxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUga2V5dXAgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmlkPy5pbmNsdWRlcyh0aGlzLm11bHRpU2VsZWN0SWQpICYmICF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIGNvbnN0IHtrZXl9ID0gZXZlbnQ7XHJcblxyXG4gICAgICBpZiAoTXVsdGlTZWxlY3RDb21wb25lbnQuQVJST1dfS0VZUy5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgICAgdGhpcy5vbkFycm93S2V5VXAoa2V5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5vcGVuZWQpIHtcclxuICAgICAgICAgIGlmIChrZXkgPT09ICdUYWInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNdWx0aVNlbGVjdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgdGhlIG11bHRpLXNlbGVjdCBsaXN0IChpZiBvcGVuZWQpIG9uIGNsaWNrIGlmIG91dHNpZGUgdGhlIGxpc3RcclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGNsaWNrIE1vdXNlRXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZCkge1xyXG4gICAgICBjb25zdCB7cGFnZVgsIHBhZ2VZfSA9IGV2ZW50O1xyXG5cclxuICAgICAgaWYgKHBhZ2VYID4gMCAmJiBwYWdlWSA+IDApIHtcclxuICAgICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9ID0gdGhpcy5tdWx0aVNlbGVjdExpc3QubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCB4UG9zaXRpb25WYWxpZCA9IHBhZ2VYID49IGxlZnQgJiYgcGFnZVggPD0gcmlnaHQ7XHJcbiAgICAgICAgY29uc3QgeVBvc2l0aW9uVmFsaWQgPSBwYWdlWSA+PSB0b3AgJiYgcGFnZVkgPD0gYm90dG9tO1xyXG4gICAgICAgIGNvbnN0IHNob3VsZENsb3NlID0gISh4UG9zaXRpb25WYWxpZCAmJiB5UG9zaXRpb25WYWxpZCk7XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRDbG9zZSkge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZU11bHRpU2VsZWN0KCk7XHJcbiAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0QnV0dG9uLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIG11bHRpLXNlbGVjdCBvbiBlc2NhcGUga2V5dXAgYW5kIGZvY3VzIG9uIG11bHRpLXNlbGVjdCBidXR0b25cclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGtleXVwIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBvbkVzY2FwZUtleVVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3BlbmVkKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5jbG9zZU11bHRpU2VsZWN0KCk7XHJcbiAgICAgIHRoaXMubXVsdGlTZWxlY3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGZvY3VzIHRvIG11bHRpLXNlbGVjdCBvcHRpb24gb24gbW91c2UgZW50ZXIgYW5kIHVwZGF0ZSBzZWxlY3RlZCBpbmRleFxyXG4gICAqIEBwYXJhbSBvcHRpb24gdGhlIG11bHRpU2VsZWN0IG9wdGlvbiB0byBmb2N1c1xyXG4gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG9wdGlvbiB0byBmb2N1c1xyXG4gICAqL1xyXG4gIG9uTXVsdGlTZWxlY3RPcHRpb25Nb3VzZUVudGVyKG9wdGlvbjogSFRNTEJ1dHRvbkVsZW1lbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBpbmRleDtcclxuICAgIG9wdGlvbi5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGZvY3VzIHRvIG11bHRpLXNlbGVjdCBvcHRpb24gb24gbW91c2UgbW92ZSBhbmQgdXBkYXRlIHNlbGVjdGVkIGluZGV4XHJcbiAgICogQHBhcmFtIG9wdGlvbiB0aGUgbXVsdGlTZWxlY3Qgb3B0aW9uIHRvIGZvY3VzXHJcbiAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHRvIGZvY3VzXHJcbiAgICovXHJcbiAgb25NdWx0aVNlbGVjdE9wdGlvbk1vdXNlTW92ZShvcHRpb246IEhUTUxCdXR0b25FbGVtZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25JbmRleCAhPT0gaW5kZXgpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25JbmRleCA9IGluZGV4O1xyXG4gICAgICBvcHRpb24uZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlIHZhbHVlIGFuZCBjbG9zZSBtdWx0aS1zZWxlY3Qgb24gb3B0aW9uIHNlbGVjdFxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd3JpdGVcclxuICAgKiBAcGFyYW0gZGlzYWJsZWQgd2hldGhlciBvciBub3QgdGhlIHNlbGVjdGVkIG9wdGlvbiBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIG9uTXVsdGlTZWxlY3RPcHRpb25TZWxlY3QodmFsdWU6IHN0cmluZyB8IG51bWJlciwgZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5oYW5kbGVNdWx0aVNlbGVjdE9wdGlvblNlbGVjdCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVuIHRoZSBtdWx0aS1zZWxlY3QgbGlzdCBhbmQgYWxpZ24gaXRcclxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGNsaWNrIE1vdXNlRXZlbnRcclxuICAgKi9cclxuICBvcGVuTXVsdGlTZWxlY3QoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnJlbmRlciA9IHRydWU7XHJcbiAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIHRoZSBtdWx0aVNlbGVjdCBsaXN0XHJcbiAgICovXHJcbiAgY2xvc2VNdWx0aVNlbGVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkluZGV4ID0gbnVsbCBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQb3NpdGlvbiBhbmQgcmVzaXplIHRoZSBtdWx0aS1zZWxlY3QgbGlzdCBvbiBhbmltYXRpb24gc3RhcnQgaWYgdG9TdGF0ZSBpcyBvcGVuXHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBBbmd1bGFyIEFuaW1hdGlvbkV2ZW50XHJcbiAgICovXHJcbiAgb25BbmltYXRpb25TdGFydChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC50b1N0YXRlID09PSAnb3BlbicpIHtcclxuICAgICAgdGhpcy5yZXNpemVNdWx0aVNlbGVjdExpc3QoKTtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25JbmRleCA9IG51bGwgYXMgYW55O1xyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5nZXROZXh0T3B0aW9uKCk7XHJcbiAgICAgICAgaWYgKCEhb3B0aW9uKSB7XHJcbiAgICAgICAgICBvcHRpb24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLypcclxuICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBtdWx0aS1zZWxlY3QgbGlzdCBpcyB6ZXJvIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgYWJvdmUgY29kZSBleGVjdXRlcyxcclxuICAgICAgICB0aGlzIGlzIGEgd29ya2Fyb3VuZCB0byBhbGlnbiB0aGUgbGlzdCBhZnRlciBpdHMgaGVpZ2h0IGlzIGtub3duIHRvIGF2b2lkIGEgZnJhbWVcclxuICAgICAgICBvciB0d28gb2YgdGhlIGxpc3QgYXQgb3JpZ2luXHJcbiAgICAgICAqL1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubXVsdGlTZWxlY3RMaXN0Lm5hdGl2ZUVsZW1lbnQsICd0b3AnLCAnLTk5OXB4Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5tdWx0aVNlbGVjdExpc3QubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCAnLTk5OXB4Jyk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wb3NpdGlvbk11bHRpU2VsZWN0TGlzdCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3AgcmVuZGVyaW5nIHRoZSBtdWx0aS1zZWxlY3QgbGlzdCBvbiBhbmltYXRpb24gZG9uZSBpZiB0b1N0YXRlIGlzIGNsb3NlXHJcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBBbmd1bGFyIEFuaW1hdGlvbkV2ZW50XHJcbiAgICovXHJcbiAgb25BbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdjbG9zZScpIHtcclxuICAgICAgdGhpcy5yZW5kZXIgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRoZSBpbnB1dCB2YWx1ZSBpcyBhbHJlYWR5IGluIHRoZSB2YWx1ZSBhcnJheSwgcmVtb3ZlIGl0LiBPdGhlcndpc2UgYWRkIGl0XHJcbiAgICogQHBhcmFtIHZhbHVlIHRoZSBzZWxlY3RlZCB2YWx1ZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVNdWx0aVNlbGVjdE9wdGlvblNlbGVjdCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IFt2YWx1ZV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB2YWx1ZUNvcHkgPSBbLi4udGhpcy52YWx1ZV07XHJcbiAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSB2YWx1ZUNvcHkuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gdmFsdWUpO1xyXG5cclxuICAgICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xyXG4gICAgICAgIHZhbHVlQ29weS5zcGxpY2UoZm91bmRJbmRleCwgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWVDb3B5LnB1c2godmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWVDb3B5O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxpZ24gdGhlIG11bHRpLXNlbGVjdCBsaXN0IHdpdGggdGhlIG11bHRpU2VsZWN0XHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHBvc2l0aW9uTXVsdGlTZWxlY3RMaXN0KCk6IHZvaWQge1xyXG4gICAgY29uc3Qge2xlZnQsIHRvcCwgYm90dG9tfSA9IHRoaXMubXVsdGlTZWxlY3QubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHtvZmZzZXRIZWlnaHR9ID0gdGhpcy5tdWx0aVNlbGVjdExpc3QubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGRhdGVQaWNrZXJCb3R0b21MZWZ0QW5jaG9yID0gYm90dG9tO1xyXG4gICAgY29uc3QgYXZhaWxhYmxlQm90dG9tU3BhY2UgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBkYXRlUGlja2VyQm90dG9tTGVmdEFuY2hvcjtcclxuICAgIGNvbnN0IGF2YWlsYWJsZVRvcFNwYWNlID0gdG9wO1xyXG4gICAgY29uc3Qgb2Zmc2V0TGlzdEhlaWdodCA9IG9mZnNldEhlaWdodCArIE11bHRpU2VsZWN0Q29tcG9uZW50LkxJU1RfT0ZGU0VUO1xyXG4gICAgbGV0IHRyYW5zZm9ybU9yaWdpbjogc3RyaW5nLCBwb3NpdGlvblRvcDogc3RyaW5nO1xyXG5cclxuICAgIGlmIChhdmFpbGFibGVCb3R0b21TcGFjZSA+IG9mZnNldExpc3RIZWlnaHQpIHtcclxuICAgICAgdHJhbnNmb3JtT3JpZ2luID0gJ3RvcCBsZWZ0JztcclxuICAgICAgcG9zaXRpb25Ub3AgPSBgJHtkYXRlUGlja2VyQm90dG9tTGVmdEFuY2hvciArIE11bHRpU2VsZWN0Q29tcG9uZW50LkxJU1RfT0ZGU0VUfXB4YDtcclxuICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlVG9wU3BhY2UgPiBvZmZzZXRMaXN0SGVpZ2h0KSB7XHJcbiAgICAgIHRyYW5zZm9ybU9yaWdpbiA9ICdib3R0b20gbGVmdCc7XHJcbiAgICAgIHBvc2l0aW9uVG9wID0gYCR7dG9wIC0gb2Zmc2V0TGlzdEhlaWdodH1weGA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAob2Zmc2V0SGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7XHJcbiAgICAgICAgcG9zaXRpb25Ub3AgPSAnMHB4JztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBhdmFpbGFibGVTcGFjZSA9IHdpbmRvdy5pbm5lckhlaWdodCAtIG9mZnNldEhlaWdodDtcclxuICAgICAgICBwb3NpdGlvblRvcCA9IGAke1N0cmluZyhhdmFpbGFibGVTcGFjZSAvIDIpfXB4YDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdHJhbnNmb3JtT3JpZ2luID0gJ3RvcCBsZWZ0JztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubXVsdGlTZWxlY3RMaXN0Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0tb3JpZ2luJywgdHJhbnNmb3JtT3JpZ2luKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5tdWx0aVNlbGVjdExpc3QubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubXVsdGlTZWxlY3RMaXN0Lm5hdGl2ZUVsZW1lbnQsICd0b3AnLCBwb3NpdGlvblRvcCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXRjaCB0aGUgbXVsdGktc2VsZWN0IGxpc3Qgd2lkdGggdG8gdGhlIG11bHRpLXNlbGVjdCdzIHdpZHRoXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2l6ZU11bHRpU2VsZWN0TGlzdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IHRoaXMubXVsdGlTZWxlY3QubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5tdWx0aVNlbGVjdExpc3QubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBhcnJvdyBrZXl1cCBldmVudFxyXG4gICAqIEBwYXJhbSBrZXkgdGhlIGFycm93IGtleVxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25BcnJvd0tleVVwKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vcGVuZWQpIHtcclxuICAgICAgaWYgKGtleSA9PT0gJ0Fycm93TGVmdCcgfHwga2V5ID09PSAnQXJyb3dVcCcpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c09wdGlvbiA9IHRoaXMuZ2V0UHJldmlvdXNPcHRpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHByZXZpb3VzT3B0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBwcmV2aW91c09wdGlvbi5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBrZXkgPT09ICdBcnJvd0Rvd24nKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dE9wdGlvbiA9IHRoaXMuZ2V0TmV4dE9wdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAobmV4dE9wdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbmV4dE9wdGlvbi5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBuZXh0IGVuYWJsZWQgbXVsdGktc2VsZWN0IG9wdGlvbiAocmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluZGV4KS5cclxuICAgKiBJZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiBpcyB0aGUgZmluYWwgYXZhaWxhYmxlIG9wdGlvbiwgaXQgaXNcclxuICAgKiByZXR1cm5lZC4gSWYgbm8gc2VsZWN0aW9uIGhhcyBiZWVuIG1hZGUsIHRoZSBmaXJzdCBhdmFpbGFibGUgb3B0aW9uIGlzIHJldHVybmVkXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldE5leHRPcHRpb24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xyXG4gICAgY29uc3Qgb3B0aW9uc0FycmF5ID0gdGhpcy5tdWx0aVNlbGVjdE9wdGlvbnMudG9BcnJheSgpO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnNlbGVjdGlvbkluZGV4ID09PSBudWxsID8gMCA6IHRoaXMuc2VsZWN0aW9uSW5kZXggKyAxO1xyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBvcHRpb25zQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc0FycmF5W2ldLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uSW5kZXggPT09IG51bGxcclxuICAgICAgPyBudWxsIGFzIGFueVxyXG4gICAgICA6IG9wdGlvbnNBcnJheVt0aGlzLnNlbGVjdGlvbkluZGV4XS5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBwcmV2aW91cyBlbmFibGVkIG11bHRpLXNlbGVjdCBvcHRpb24gKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbmRleCkuXHJcbiAgICogSWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdGhlIGZpcnN0IGF2YWlsYWJsZSBvcHRpb24sIGl0IGlzXHJcbiAgICogcmV0dXJuZWRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNPcHRpb24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xyXG4gICAgbGV0IHByZXZpb3VzT3B0aW9uOiBIVE1MQnV0dG9uRWxlbWVudCA9IG51bGwgYXMgYW55O1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnNBcnJheSA9IHRoaXMubXVsdGlTZWxlY3RPcHRpb25zLnRvQXJyYXkoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNlbGVjdGlvbkluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zQXJyYXlbaV0ubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5kZXggPSBpO1xyXG4gICAgICAgICAgcHJldmlvdXNPcHRpb24gPSBvcHRpb247XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJldmlvdXNPcHRpb247XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAnaW5wdXQnIHx8ICh0eXBlID09PSAnZXhwYW5kZWQnICYmIG1heEV4cGFuZGVkRW50cmllcyA+IDAgJiYgb3B0aW9uQ291bnQgPiBtYXhFeHBhbmRlZEVudHJpZXMpIGVsc2UgZXhwYW5kZWRcIj5cclxuICA8ZGl2ICNtdWx0aVNlbGVjdFxyXG4gICAgICAgY2xhc3M9XCJyb3cgcHRsX2lucHV0IHB0bF9pbnB1dF9oZWlnaHQgcHRsX2lucHV0X2JnX2NvbG9yIHB0bF9icmRyX2NvbG9yIHB0bF9icmRyX3NpemUgcHRsX2JyZHJfcmFkaXVzIGVudF9yMmxfZGlyXCJcclxuICAgICAgIFtzdHlsZS5maWx0ZXJdPVwiZGlzYWJsZWQgPyAnYnJpZ2h0bmVzcyguOTUpJyA6ICcnXCJcclxuICAgICAgIHN0eWxlPVwiY3Vyc29yOmRlZmF1bHQ7b3ZlcmZsb3c6aGlkZGVuO1wiXHJcbiAgICAgICBbbmdDbGFzc109XCJjbGFzc0xpc3QgPyBjbGFzc0xpc3QgOiAnJ1wiPlxyXG4gICAgPGJ1dHRvbiAjbXVsdGlTZWxlY3RCdXR0b25cclxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcclxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5NdWx0aVNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJvbkVzY2FwZUtleVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICBbaWRdPVwibXVsdGlTZWxlY3RJZFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbmVkXCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0bnNldCBjbGVhciBjZW50ZXJfY2VudGVyIGhlaWdodDEwMCB3aWR0aDEwMFwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwib3V0bGluZS1vZmZzZXQ6IC0ycHg7XCJcclxuICAgID5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbGxhcHNlZEJ1dHRvblRlbXBsYXRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbGxhcHNlZEJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2xsYXBzZWRCdXR0b25UZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc2l6ZV8xIGhlaWdodDEwMCB3aWR0aDEwMCB2X2NlbnRlciBwdGxfaW5wdXRfdGV4dF9zaXplIHB0bF9pbnB1dF9wYWRkaW5nIGJvcmRlcl9ub25lIHdpZHRoMTAwIG92ZXJmbG93X2hpZGVcIj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uQ291bnQkIHwgYXN5bmMgYXMgc2VsZWN0aW9uQ291bnQgZWxzZSBwbGFjZWhvbGRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25Db3VudCA+IDEgZWxzZSBzaW5nbGVFbnRyeVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdGxfaW5wdXRfdGV4dF9zaXplIGVudF9yMmxfdHh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQgYm9sZFwiPnt7c2VsZWN0aW9uQ291bnR9fTwvc3Bhbj4ge3t0ZXh0Lm9mfX0ge3tvcHRpb25Db3VudH19IHt7dGV4dC5vcHRpb25zU2VsZWN0ZWR9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlRW50cnk+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFDb250ZXh0TWFwJCB8IGFzeW5jIGFzIGRhdGFDb250ZXh0TWFwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIG92ZXJmbG93X2hpZGVcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhdGVtcGxhdGUgZWxzZSBub0N1c3RvbVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl90YjUgcGFkX3RiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgX2ludGVybmFsVmFsdWUgfCBhc3luY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0bF9pbnB1dF90ZXh0X3NpemUgZW50X3IybF90eHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAkYW55KGRhdGFDb250ZXh0TWFwWycnICsgdmFsdWVdKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vQ3VzdG9tVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0bF9pbnB1dF90ZXh0X3NpemUgbWFyX3RiNSBwYWRfdGIyIGVudF9yMmxfdHh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2RhdGFDb250ZXh0TWFwWycnICsgdmFsdWVdWyckaW1wbGljaXQnXSB8fCBkYXRhQ29udGV4dE1hcFsnJyArIHZhbHVlXVsnbGFiZWwnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlclRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHRsX3BsYWNlaG9sZGVyIGVudF9yMmxfdHh0XCI+e3t0ZXh0LnBsYWNlaG9sZGVyICsgJy4uLid9fTwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIG1pbl93NTAgaGVpZ2h0MTAwIGNlbnRlcl9jZW50ZXIgYm9yZGVyX2xlZnRcIlxyXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwiYnV0dG9uQ2xhc3NMaXN0ID8gYnV0dG9uQ2xhc3NMaXN0IDogJ3B0bF9icmRyX2NvbG9yJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlcl9jZW50ZXIgaGVpZ2h0MTAwIHdpZHRoMTAwXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhcmV0LWRvd24gcHRsX2lucHV0X3RleHRfc2l6ZVwiPjwvaT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZXhwYW5kZWQ+XHJcbiAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtdWx0aVNlbGVjdE9wdGlvbnNcIj48L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxkaXYgW3N0eWxlLmRpc3BsYXldPVwicmVuZGVyID8gJycgOiAnbm9uZSdcIlxyXG4gICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFyZW5kZXJcIlxyXG4gICAgIGNsYXNzPVwicGFydGljbGVfbXVsdGlzZWxlY3Rfb3ZlcmxheVwiPlxyXG4gIDxkaXYgI211bHRpU2VsZWN0TGlzdFxyXG4gICAgICAgW0BvcGVuQ2xvc2VdPVwib3BlbmVkID8gJ29wZW4nIDogJ2Nsb3NlJ1wiXHJcbiAgICAgICAoQG9wZW5DbG9zZS5zdGFydCk9XCJvbkFuaW1hdGlvblN0YXJ0KCRldmVudClcIlxyXG4gICAgICAgKEBvcGVuQ2xvc2UuZG9uZSk9XCJvbkFuaW1hdGlvbkRvbmUoJGV2ZW50KVwiXHJcbiAgICAgICBjbGFzcz1cInBvc2l0aW9uX2Fic29sdXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfbXVsdGlzZWxlY3Rfb3B0aW9ucyBjb250ZW50X2NvbG9yIGVudF9yMmxfZGlyXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibXVsdGlTZWxlY3RPcHRpb25zXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI211bHRpU2VsZWN0T3B0aW9ucz5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiX29wdGlvbnMgfCBhc3luYyBhcyBvcHRpb25zXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfbXVsdGlzZWxlY3RfbGlzdCBlbnRfcjJsX2RpclwiXHJcbiAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcclxuICAgICAgICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInR5cGUgPT09ICdleHBhbmRlZCcgJiYgZXhwYW5kZWRBc0dyaWQgPyAncGFydGljbGVfbXVsdGlfc2VsZWN0X2dyaWQnIDogJydcIlxyXG4gICAgPlxyXG4gICAgICA8IS0tIENVU1RPTSBURU1QTEFURSAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhdGVtcGxhdGUgZWxzZSBkZWZhdWx0T3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uVmFsdWVNYXAkIHwgYXN5bmMgYXMgc2VsZWN0aW9uVmFsdWVNYXBcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zOyBpbmRleCBhcyBpXCI+XHJcbiAgICAgICAgICAgIDwhLS0gT1BUSU9OIEdST1VQIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09ICdncm91cCcgZWxzZSBub25Hcm91cE9wdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9tdWx0aXNlbGVjdF9oZWFkaW5nIHB0bF9pbnB1dF90ZXh0X3NpemUgZW50X3IybF90eHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57e29wdGlvbi5ncm91cExhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cE9wdGlvbiBvZiBvcHRpb24ub3B0aW9uczsgaW5kZXggYXMgalwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAjbXVsdGlTZWxlY3RPcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTXVsdGlTZWxlY3RPcHRpb25TZWxlY3QoZ3JvdXBPcHRpb24udmFsdWUsIGdyb3VwT3B0aW9uLmRpc2FibGVkISlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbk11bHRpU2VsZWN0T3B0aW9uTW91c2VFbnRlcihtdWx0aVNlbGVjdE9wdGlvbiwgaSArIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbk11bHRpU2VsZWN0T3B0aW9uTW91c2VNb3ZlKG11bHRpU2VsZWN0T3B0aW9uLCBpICsgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJtdWx0aVNlbGVjdElkICsgJy0nICsgZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoIXNlbGVjdGlvblZhbHVlTWFwWycnICsgZ3JvdXBPcHRpb24udmFsdWVdID8gJ3Vuc2VsZWN0ZWQnIDogJycpICsgKGVudHJ5Q2xhc3NMaXN0ID8gJyAnICsgZW50cnlDbGFzc0xpc3QgOiAnIHBhcnRpY2xlX211bHRpc2VsZWN0X29wdGlvbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYyk/LmluY2x1ZGVzKGdyb3VwT3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdmFsdWVdPVwiZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRpYWxvZy1jbG9zZS1vdmVycmlkZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwT3B0aW9uLmRpc2FibGVkIHx8IGRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwdGxfaW5wdXRfdGV4dF9zaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX211bHRpc2VsZWN0X2NoZWNrYm94IHB0bF9icmRyX3JhZGl1cyBiZ19vdmVybGF5IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGlvblZhbHVlTWFwWycnICsgZ3JvdXBPcHRpb24udmFsdWVdID8gJ29rX2J1dHRvbl9jb2xvcicgOiAndW5zZWxlY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3Rpb25WYWx1ZU1hcFsnJyArIGdyb3VwT3B0aW9uLnZhbHVlXVwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZWNrIGVudF9yMmxfaWNvXCI+PC9pPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlOyBjb250ZXh0OiAkYW55KGdyb3VwT3B0aW9uLmRhdGFDb250ZXh0ISlcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSBTSU5HVUxBUiBPUFRJT04gLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9uR3JvdXBPcHRpb24+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbi50eXBlID09PSAnb3B0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAjbXVsdGlTZWxlY3RPcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTXVsdGlTZWxlY3RPcHRpb25TZWxlY3Qob3B0aW9uLnZhbHVlLCBvcHRpb24uZGlzYWJsZWQhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uTXVsdGlTZWxlY3RPcHRpb25Nb3VzZUVudGVyKG11bHRpU2VsZWN0T3B0aW9uLCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25NdWx0aVNlbGVjdE9wdGlvbk1vdXNlTW92ZShtdWx0aVNlbGVjdE9wdGlvbiwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJtdWx0aVNlbGVjdElkICsgJy0nICsgb3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYyk/LmluY2x1ZGVzKG9wdGlvbi52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGlhbG9nLWNsb3NlLW92ZXJyaWRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkIHx8IGRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKCFzZWxlY3Rpb25WYWx1ZU1hcFsnJyArIG9wdGlvbi52YWx1ZV0gPyAndW5zZWxlY3RlZCcgOiAnJykgKyAoZW50cnlDbGFzc0xpc3QgPyAnICcgKyBlbnRyeUNsYXNzTGlzdCA6ICcgcGFydGljbGVfbXVsdGlzZWxlY3Rfb3B0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB0bF9pbnB1dF90ZXh0X3NpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCIgdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljbGVfbXVsdGlzZWxlY3RfY2hlY2tib3ggcHRsX2JyZHJfcmFkaXVzIGJnX292ZXJsYXkgYnJkclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0aW9uVmFsdWVNYXBbJycgKyBvcHRpb24udmFsdWVdID8gJ29rX2J1dHRvbl9jb2xvcicgOiAndW5zZWxlY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3Rpb25WYWx1ZU1hcFsnJyArIG9wdGlvbi52YWx1ZV1cIj48aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogJGFueShvcHRpb24uZGF0YUNvbnRleHQhKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gTk8gQ1VTVE9NIFRFTVBMQVRFIC0tPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRpb25UZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uVmFsdWVNYXAkIHwgYXN5bmMgYXMgc2VsZWN0aW9uVmFsdWVNYXBcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zOyBpbmRleCBhcyBpXCI+XHJcbiAgICAgICAgICAgIDwhLS0gT1BUSU9OIEdST1VQIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09ICdncm91cCcgZWxzZSBub25Hcm91cE9wdGlvblwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9tdWx0aXNlbGVjdF9oZWFkaW5nIHB0bF9pbnB1dF90ZXh0X3NpemUgZW50X3IybF90eHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57e29wdGlvbi5ncm91cExhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cE9wdGlvbiBvZiBvcHRpb24ub3B0aW9uczsgaW5kZXggYXMgalwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAjbXVsdGlTZWxlY3RPcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTXVsdGlTZWxlY3RPcHRpb25TZWxlY3QoZ3JvdXBPcHRpb24udmFsdWUsIGdyb3VwT3B0aW9uLmRpc2FibGVkISlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbk11bHRpU2VsZWN0T3B0aW9uTW91c2VFbnRlcihtdWx0aVNlbGVjdE9wdGlvbiwgaSArIGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbk11bHRpU2VsZWN0T3B0aW9uTW91c2VNb3ZlKG11bHRpU2VsZWN0T3B0aW9uLCBpICsgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIm9uRXNjYXBlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJtdWx0aVNlbGVjdElkICsgJy0nICsgZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdyb3VwT3B0aW9uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYyk/LmluY2x1ZGVzKGdyb3VwT3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdmFsdWVdPVwiZ3JvdXBPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRpYWxvZy1jbG9zZS1vdmVycmlkZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwT3B0aW9uLmRpc2FibGVkIHx8IGRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKCFzZWxlY3Rpb25WYWx1ZU1hcFsnJyArIGdyb3VwT3B0aW9uLnZhbHVlXSA/ICd1bnNlbGVjdGVkJyA6ICcnKSArIChlbnRyeUNsYXNzTGlzdCA/ICcgJyArIGVudHJ5Q2xhc3NMaXN0IDogJyBwYXJ0aWNsZV9tdWx0aXNlbGVjdF9vcHRpb24nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHRsX2lucHV0X3RleHRfc2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiByb2xlPVwib3B0aW9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNsZV9tdWx0aXNlbGVjdF9jaGVja2JveCBwdGxfYnJkcl9yYWRpdXMgYmdfb3ZlcmxheSBicmRyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3Rpb25WYWx1ZU1hcFsnJyArIGdyb3VwT3B0aW9uLnZhbHVlXSA/ICdva19idXR0b25fY29sb3InIDogJ3Vuc2VsZWN0ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0aW9uVmFsdWVNYXBbJycgKyBncm91cE9wdGlvbi52YWx1ZV1cIj48aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbnRfcjJsX3R4dCBtYXJfbHI1XCI+e3tncm91cE9wdGlvbi5sYWJlbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwhLS0gU0lOR1VMQVIgT1BUSU9OIC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkdyb3VwT3B0aW9uPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gJ29wdGlvbidcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gI211bHRpU2VsZWN0T3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk11bHRpU2VsZWN0T3B0aW9uU2VsZWN0KG9wdGlvbi52YWx1ZSwgb3B0aW9uLmRpc2FibGVkISlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbk11bHRpU2VsZWN0T3B0aW9uTW91c2VFbnRlcihtdWx0aVNlbGVjdE9wdGlvbiwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uTXVsdGlTZWxlY3RPcHRpb25Nb3VzZU1vdmUobXVsdGlTZWxlY3RPcHRpb24sIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJvbkVzY2FwZUtleVVwKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwibXVsdGlTZWxlY3RJZCArICctJyArIG9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpPy5pbmNsdWRlcyhvcHRpb24udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS12YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRpYWxvZy1jbG9zZS1vdmVycmlkZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZCB8fCBkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIighc2VsZWN0aW9uVmFsdWVNYXBbJycgKyBvcHRpb24udmFsdWVdID8gJ3Vuc2VsZWN0ZWQnIDogJycpICsgKGVudHJ5Q2xhc3NMaXN0ID8gJyAnICsgZW50cnlDbGFzc0xpc3QgOiAnIHBhcnRpY2xlX211bHRpc2VsZWN0X29wdGlvbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwdGxfaW5wdXRfdGV4dF9zaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJvcHRpb25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhcnRpY2xlX211bHRpc2VsZWN0X2NoZWNrYm94IHB0bF9icmRyX3JhZGl1cyBiZ19vdmVybGF5IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGlvblZhbHVlTWFwWycnICsgb3B0aW9uLnZhbHVlXSA/ICdva19idXR0b25fY29sb3InIDogJ3Vuc2VsZWN0ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0aW9uVmFsdWVNYXBbJycgKyBvcHRpb24udmFsdWVdXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIj48L2k+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW50X3IybF90eHQgbWFyX2xyNVwiPnt7b3B0aW9uLmxhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy1jb250ZW50IHNlbGVjdD1cInRlbXBsYXRlXCI+PC9uZy1jb250ZW50PlxyXG4iXX0=