@up_si_vale/sivale-componentes-angular 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/atoms/button/button.component.mjs +55 -0
- package/esm2022/lib/atoms/checkbox/checkbox.component.mjs +174 -0
- package/esm2022/lib/atoms/date-picker/date-picker.component.mjs +835 -0
- package/esm2022/lib/atoms/input/input.component.mjs +218 -0
- package/esm2022/lib/atoms/loader/loader.component.mjs +81 -0
- package/esm2022/lib/atoms/radio/radio.component.mjs +142 -0
- package/esm2022/lib/atoms/textarea/textarea.component.mjs +126 -0
- package/esm2022/lib/directives/asset-source.directive.mjs +68 -0
- package/esm2022/lib/directives/icon-source.directive.mjs +65 -0
- package/esm2022/lib/directives/no-leading-space.directive.mjs +24 -0
- package/esm2022/lib/directives/only-letters.directive.mjs +25 -0
- package/esm2022/lib/directives/only-number.directive.mjs +21 -0
- package/esm2022/lib/directives/rfc.directive.mjs +67 -0
- package/esm2022/lib/directives/tooltip.directive.mjs +199 -0
- package/esm2022/lib/models/snackbar.models.mjs +2 -0
- package/esm2022/lib/molecules/alert/alert.component.mjs +79 -0
- package/esm2022/lib/molecules/copy-input/copy-input.component.mjs +46 -0
- package/esm2022/lib/molecules/multiselect/multiselect.component.mjs +466 -0
- package/esm2022/lib/molecules/option/option.component.mjs +55 -0
- package/esm2022/lib/molecules/phone-input/phone-input.component.mjs +64 -0
- package/esm2022/lib/molecules/select/select.component.mjs +498 -0
- package/esm2022/lib/molecules/snackbar/snackbar.component.mjs +581 -0
- package/esm2022/lib/organisms/sidebar/sidebar-icon.component.mjs +91 -0
- package/esm2022/lib/organisms/sidebar/sidebar.component.mjs +115 -0
- package/esm2022/lib/services/snackbar.service.mjs +96 -0
- package/esm2022/lib/tokens/asset-base-url.token.mjs +10 -0
- package/esm2022/public-api.mjs +37 -0
- package/esm2022/up_si_vale-sivale-componentes-angular.mjs +5 -0
- package/fesm2022/up_si_vale-sivale-componentes-angular.mjs +4116 -0
- package/fesm2022/up_si_vale-sivale-componentes-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/atoms/button/button.component.d.ts +20 -0
- package/lib/atoms/checkbox/checkbox.component.d.ts +31 -0
- package/lib/atoms/date-picker/date-picker.component.d.ts +134 -0
- package/lib/atoms/input/input.component.d.ts +35 -0
- package/lib/atoms/loader/loader.component.d.ts +10 -0
- package/lib/atoms/radio/radio.component.d.ts +25 -0
- package/lib/atoms/textarea/textarea.component.d.ts +27 -0
- package/lib/directives/asset-source.directive.d.ts +19 -0
- package/lib/directives/icon-source.directive.d.ts +18 -0
- package/lib/directives/no-leading-space.directive.d.ts +6 -0
- package/lib/directives/only-letters.directive.d.ts +7 -0
- package/lib/directives/only-number.directive.d.ts +6 -0
- package/lib/directives/rfc.directive.d.ts +12 -0
- package/lib/directives/tooltip.directive.d.ts +27 -0
- package/{src/lib/models/snackbar.models.ts → lib/models/snackbar.models.d.ts} +8 -10
- package/lib/molecules/alert/alert.component.d.ts +29 -0
- package/lib/molecules/copy-input/copy-input.component.d.ts +14 -0
- package/lib/molecules/multiselect/multiselect.component.d.ts +74 -0
- package/lib/molecules/option/option.component.d.ts +19 -0
- package/lib/molecules/phone-input/phone-input.component.d.ts +12 -0
- package/lib/molecules/select/select.component.d.ts +88 -0
- package/lib/molecules/snackbar/snackbar.component.d.ts +17 -0
- package/lib/organisms/sidebar/sidebar-icon.component.d.ts +8 -0
- package/lib/organisms/sidebar/sidebar.component.d.ts +47 -0
- package/lib/services/snackbar.service.d.ts +40 -0
- package/{src/lib/tokens/asset-base-url.token.ts → lib/tokens/asset-base-url.token.d.ts} +1 -5
- package/package.json +39 -28
- package/{src/public-api.ts → public-api.d.ts} +3 -15
- package/ng-package.json +0 -9
- package/src/lib/atoms/button/button.component.html +0 -21
- package/src/lib/atoms/button/button.component.scss +0 -242
- package/src/lib/atoms/button/button.component.ts +0 -43
- package/src/lib/atoms/checkbox/checkbox.component.scss +0 -131
- package/src/lib/atoms/checkbox/checkbox.component.ts +0 -130
- package/src/lib/atoms/date-picker/date-picker.component.html +0 -295
- package/src/lib/atoms/date-picker/date-picker.component.scss +0 -1002
- package/src/lib/atoms/date-picker/date-picker.component.ts +0 -942
- package/src/lib/atoms/input/input.component.ts +0 -239
- package/src/lib/atoms/loader/loader.component.scss +0 -144
- package/src/lib/atoms/loader/loader.component.ts +0 -44
- package/src/lib/atoms/radio/radio.component.scss +0 -115
- package/src/lib/atoms/radio/radio.component.ts +0 -103
- package/src/lib/atoms/textarea/textarea.component.ts +0 -155
- package/src/lib/directives/asset-source.directive.ts +0 -64
- package/src/lib/directives/icon-source.directive.ts +0 -74
- package/src/lib/directives/no-leading-space.directive.ts +0 -18
- package/src/lib/directives/only-letters.directive.ts +0 -21
- package/src/lib/directives/only-number.directive.ts +0 -15
- package/src/lib/directives/rfc.directive.ts +0 -60
- package/src/lib/directives/tooltip.directive.ts +0 -211
- package/src/lib/molecules/copy-input/copy-input.component.html +0 -29
- package/src/lib/molecules/copy-input/copy-input.component.scss +0 -101
- package/src/lib/molecules/copy-input/copy-input.component.ts +0 -41
- package/src/lib/molecules/multiselect/multiselect.component.scss +0 -298
- package/src/lib/molecules/multiselect/multiselect.component.ts +0 -487
- package/src/lib/molecules/option/option.component.ts +0 -45
- package/src/lib/molecules/phone-input/phone-input.component.scss +0 -78
- package/src/lib/molecules/phone-input/phone-input.component.ts +0 -43
- package/src/lib/molecules/select/select.component.ts +0 -482
- package/src/lib/molecules/snackbar/snackbar.component.scss +0 -201
- package/src/lib/molecules/snackbar/snackbar.component.ts +0 -321
- package/src/lib/services/snackbar.service.ts +0 -103
- package/tsconfig.json +0 -31
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { Component, Input, forwardRef, ViewChild, ElementRef, HostListener, ContentChildren, Inject, RendererStyleFlags2 } from '@angular/core';
|
|
2
|
+
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
3
|
+
import { NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
4
|
+
import { OptionComponent } from '../option/option.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
export class MultiselectComponent {
|
|
8
|
+
renderer;
|
|
9
|
+
document;
|
|
10
|
+
label = '';
|
|
11
|
+
id = '';
|
|
12
|
+
placeholder = '';
|
|
13
|
+
options = [];
|
|
14
|
+
hasError = false;
|
|
15
|
+
errorMessage = '';
|
|
16
|
+
disabled = false;
|
|
17
|
+
displayKey = 'label'; // Property to display as label
|
|
18
|
+
valueKey = 'value'; // Property to use as value
|
|
19
|
+
customClass = ''; // Custom CSS class for styling
|
|
20
|
+
trigger;
|
|
21
|
+
contentOptions;
|
|
22
|
+
value = [];
|
|
23
|
+
isOpen = false;
|
|
24
|
+
onChange = () => { };
|
|
25
|
+
onTouched = () => { };
|
|
26
|
+
_usingContentOptions = false;
|
|
27
|
+
dropdownElement = null;
|
|
28
|
+
backdropElement = null;
|
|
29
|
+
scrollHandler = null;
|
|
30
|
+
resizeHandler = null;
|
|
31
|
+
constructor(renderer, document) {
|
|
32
|
+
this.renderer = renderer;
|
|
33
|
+
this.document = document;
|
|
34
|
+
}
|
|
35
|
+
ngAfterContentInit() {
|
|
36
|
+
// Determine if using content projection or input options
|
|
37
|
+
this._usingContentOptions = this.contentOptions && this.contentOptions.length > 0;
|
|
38
|
+
// Subscribe to changes in content options
|
|
39
|
+
if (this.contentOptions) {
|
|
40
|
+
this.contentOptions.changes.subscribe(() => {
|
|
41
|
+
this._usingContentOptions = this.contentOptions.length > 0;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
ngOnDestroy() {
|
|
46
|
+
this.destroyDropdown();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get all options (from content or input)
|
|
50
|
+
*/
|
|
51
|
+
getAllOptions() {
|
|
52
|
+
if (this._usingContentOptions && this.contentOptions) {
|
|
53
|
+
return this.contentOptions.toArray();
|
|
54
|
+
}
|
|
55
|
+
return this.options || [];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get display label from option
|
|
59
|
+
*/
|
|
60
|
+
getOptionLabel(option) {
|
|
61
|
+
if (option instanceof OptionComponent) {
|
|
62
|
+
return option.viewValue;
|
|
63
|
+
}
|
|
64
|
+
return option?.[this.displayKey] || '';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get value from option
|
|
68
|
+
*/
|
|
69
|
+
getOptionValue(option) {
|
|
70
|
+
if (option instanceof OptionComponent) {
|
|
71
|
+
return option.value;
|
|
72
|
+
}
|
|
73
|
+
return option?.[this.valueKey];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if option is disabled
|
|
77
|
+
*/
|
|
78
|
+
isOptionDisabled(option) {
|
|
79
|
+
if (option instanceof OptionComponent) {
|
|
80
|
+
return option.disabled;
|
|
81
|
+
}
|
|
82
|
+
return option?.disabled || false;
|
|
83
|
+
}
|
|
84
|
+
onDocumentClick(event) {
|
|
85
|
+
// Close dropdown if click is outside
|
|
86
|
+
if (this.isOpen && this.dropdownElement && !this.dropdownElement.contains(event.target)) {
|
|
87
|
+
const triggerElement = this.trigger?.nativeElement;
|
|
88
|
+
if (triggerElement && !triggerElement.contains(event.target)) {
|
|
89
|
+
this.closeDropdown();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
toggleDropdown(event) {
|
|
94
|
+
event.stopPropagation();
|
|
95
|
+
if (this.disabled)
|
|
96
|
+
return;
|
|
97
|
+
if (this.isOpen) {
|
|
98
|
+
this.closeDropdown();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.openDropdown();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
openDropdown() {
|
|
105
|
+
if (!this.trigger)
|
|
106
|
+
return;
|
|
107
|
+
// Create backdrop
|
|
108
|
+
this.backdropElement = this.renderer.createElement('div');
|
|
109
|
+
this.renderer.addClass(this.backdropElement, 'multiselect-custom-backdrop');
|
|
110
|
+
this.renderer.listen(this.backdropElement, 'click', () => this.closeDropdown());
|
|
111
|
+
this.renderer.appendChild(this.document.body, this.backdropElement);
|
|
112
|
+
// Create dropdown
|
|
113
|
+
this.dropdownElement = this.renderer.createElement('div');
|
|
114
|
+
this.renderer.addClass(this.dropdownElement, 'multiselect-custom-dropdown');
|
|
115
|
+
this.renderer.addClass(this.dropdownElement, 'multiselect-overlay-pane');
|
|
116
|
+
// Calculate position
|
|
117
|
+
const position = this.calculatePosition();
|
|
118
|
+
// Apply positioning styles
|
|
119
|
+
this.renderer.setStyle(this.dropdownElement, 'position', 'fixed');
|
|
120
|
+
this.renderer.setStyle(this.dropdownElement, 'left', position.left);
|
|
121
|
+
this.renderer.setStyle(this.dropdownElement, 'width', position.width);
|
|
122
|
+
this.renderer.setStyle(this.dropdownElement, 'max-height', position.maxHeight);
|
|
123
|
+
this.renderer.setStyle(this.dropdownElement, 'z-index', '100000', RendererStyleFlags2.Important);
|
|
124
|
+
if (position.top) {
|
|
125
|
+
this.renderer.setStyle(this.dropdownElement, 'top', position.top);
|
|
126
|
+
}
|
|
127
|
+
else if (position.bottom) {
|
|
128
|
+
this.renderer.setStyle(this.dropdownElement, 'bottom', position.bottom);
|
|
129
|
+
}
|
|
130
|
+
// Create dropdown content wrapper
|
|
131
|
+
const dropdownContent = this.renderer.createElement('div');
|
|
132
|
+
this.renderer.addClass(dropdownContent, 'multiselect-dropdown');
|
|
133
|
+
// Add options
|
|
134
|
+
const allOptions = this.getAllOptions();
|
|
135
|
+
allOptions.forEach(option => {
|
|
136
|
+
const optionElement = this.createOptionElement(option);
|
|
137
|
+
this.renderer.appendChild(dropdownContent, optionElement);
|
|
138
|
+
});
|
|
139
|
+
this.renderer.appendChild(this.dropdownElement, dropdownContent);
|
|
140
|
+
this.renderer.appendChild(this.document.body, this.dropdownElement);
|
|
141
|
+
this.isOpen = true;
|
|
142
|
+
// Add scroll and resize listeners to reposition dropdown
|
|
143
|
+
this.addRepositionListeners();
|
|
144
|
+
// Trigger animation
|
|
145
|
+
setTimeout(() => {
|
|
146
|
+
if (this.dropdownElement) {
|
|
147
|
+
this.renderer.addClass(this.dropdownElement, 'multiselect-dropdown-open');
|
|
148
|
+
}
|
|
149
|
+
}, 10);
|
|
150
|
+
}
|
|
151
|
+
calculatePosition() {
|
|
152
|
+
const triggerElement = this.trigger.nativeElement;
|
|
153
|
+
const rect = triggerElement.getBoundingClientRect();
|
|
154
|
+
const spaceBelow = window.innerHeight - rect.bottom;
|
|
155
|
+
const spaceAbove = rect.top;
|
|
156
|
+
const dropdownMaxHeight = 300;
|
|
157
|
+
const offsetY = 4;
|
|
158
|
+
const shouldOpenAbove = spaceBelow < 200 && spaceAbove > spaceBelow;
|
|
159
|
+
const position = {
|
|
160
|
+
left: `${rect.left}px`,
|
|
161
|
+
width: `${rect.width}px`,
|
|
162
|
+
maxHeight: `${dropdownMaxHeight}px`
|
|
163
|
+
};
|
|
164
|
+
if (shouldOpenAbove) {
|
|
165
|
+
position.bottom = `${window.innerHeight - rect.top + offsetY}px`;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
position.top = `${rect.bottom + offsetY}px`;
|
|
169
|
+
}
|
|
170
|
+
return position;
|
|
171
|
+
}
|
|
172
|
+
addRepositionListeners() {
|
|
173
|
+
// Create handlers
|
|
174
|
+
const scrollHandler = () => this.updateDropdownPosition();
|
|
175
|
+
const resizeHandler = () => this.updateDropdownPosition();
|
|
176
|
+
// Add scroll listener to window with capture phase to catch all scroll events
|
|
177
|
+
window.addEventListener('scroll', scrollHandler, true);
|
|
178
|
+
this.scrollHandler = () => window.removeEventListener('scroll', scrollHandler, true);
|
|
179
|
+
// Add resize listener
|
|
180
|
+
window.addEventListener('resize', resizeHandler);
|
|
181
|
+
this.resizeHandler = () => window.removeEventListener('resize', resizeHandler);
|
|
182
|
+
}
|
|
183
|
+
updateDropdownPosition() {
|
|
184
|
+
if (!this.dropdownElement || !this.trigger)
|
|
185
|
+
return;
|
|
186
|
+
const position = this.calculatePosition();
|
|
187
|
+
// Update position styles
|
|
188
|
+
this.renderer.setStyle(this.dropdownElement, 'left', position.left);
|
|
189
|
+
this.renderer.setStyle(this.dropdownElement, 'width', position.width);
|
|
190
|
+
// Remove old top/bottom styles
|
|
191
|
+
this.renderer.removeStyle(this.dropdownElement, 'top');
|
|
192
|
+
this.renderer.removeStyle(this.dropdownElement, 'bottom');
|
|
193
|
+
// Apply new top/bottom position
|
|
194
|
+
if (position.top) {
|
|
195
|
+
this.renderer.setStyle(this.dropdownElement, 'top', position.top);
|
|
196
|
+
}
|
|
197
|
+
else if (position.bottom) {
|
|
198
|
+
this.renderer.setStyle(this.dropdownElement, 'bottom', position.bottom);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
createOptionElement(option) {
|
|
202
|
+
const labelElement = this.renderer.createElement('label');
|
|
203
|
+
this.renderer.addClass(labelElement, 'multiselect-option');
|
|
204
|
+
const optionValue = this.getOptionValue(option);
|
|
205
|
+
const optionLabel = this.getOptionLabel(option);
|
|
206
|
+
const optionDisabled = this.isOptionDisabled(option);
|
|
207
|
+
if (this.isSelected(optionValue)) {
|
|
208
|
+
this.renderer.addClass(labelElement, 'selected');
|
|
209
|
+
}
|
|
210
|
+
if (optionDisabled) {
|
|
211
|
+
this.renderer.addClass(labelElement, 'disabled');
|
|
212
|
+
}
|
|
213
|
+
// Stop propagation on label click
|
|
214
|
+
this.renderer.listen(labelElement, 'click', (event) => {
|
|
215
|
+
event.stopPropagation();
|
|
216
|
+
});
|
|
217
|
+
// Checkbox container
|
|
218
|
+
const checkboxDiv = this.renderer.createElement('div');
|
|
219
|
+
this.renderer.addClass(checkboxDiv, 'option-checkbox');
|
|
220
|
+
// Hidden native checkbox
|
|
221
|
+
const checkbox = this.renderer.createElement('input');
|
|
222
|
+
this.renderer.setAttribute(checkbox, 'type', 'checkbox');
|
|
223
|
+
this.renderer.setProperty(checkbox, 'checked', this.isSelected(optionValue));
|
|
224
|
+
if (optionDisabled) {
|
|
225
|
+
this.renderer.setProperty(checkbox, 'disabled', true);
|
|
226
|
+
}
|
|
227
|
+
// Custom checkbox span
|
|
228
|
+
const customCheckbox = this.renderer.createElement('span');
|
|
229
|
+
this.renderer.addClass(customCheckbox, 'checkbox-custom');
|
|
230
|
+
if (this.isSelected(optionValue)) {
|
|
231
|
+
this.renderer.addClass(customCheckbox, 'checked');
|
|
232
|
+
}
|
|
233
|
+
// Check icon
|
|
234
|
+
if (this.isSelected(optionValue)) {
|
|
235
|
+
const svg = this.createCheckIcon();
|
|
236
|
+
this.renderer.appendChild(customCheckbox, svg);
|
|
237
|
+
}
|
|
238
|
+
// Listen to change event
|
|
239
|
+
this.renderer.listen(checkbox, 'change', (event) => {
|
|
240
|
+
event.stopPropagation();
|
|
241
|
+
// Toggle the value
|
|
242
|
+
this.toggleOption(option);
|
|
243
|
+
// Update visual state
|
|
244
|
+
const isNowSelected = this.isSelected(optionValue);
|
|
245
|
+
this.renderer.setProperty(checkbox, 'checked', isNowSelected);
|
|
246
|
+
if (isNowSelected) {
|
|
247
|
+
this.renderer.addClass(labelElement, 'selected');
|
|
248
|
+
this.renderer.addClass(customCheckbox, 'checked');
|
|
249
|
+
// Add check icon if not present
|
|
250
|
+
if (!customCheckbox.querySelector('.check-icon')) {
|
|
251
|
+
const svg = this.createCheckIcon();
|
|
252
|
+
this.renderer.appendChild(customCheckbox, svg);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
this.renderer.removeClass(labelElement, 'selected');
|
|
257
|
+
this.renderer.removeClass(customCheckbox, 'checked');
|
|
258
|
+
// Remove check icon
|
|
259
|
+
const existingIcon = customCheckbox.querySelector('.check-icon');
|
|
260
|
+
if (existingIcon) {
|
|
261
|
+
this.renderer.removeChild(customCheckbox, existingIcon);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
this.renderer.appendChild(checkboxDiv, checkbox);
|
|
266
|
+
this.renderer.appendChild(checkboxDiv, customCheckbox);
|
|
267
|
+
this.renderer.appendChild(labelElement, checkboxDiv);
|
|
268
|
+
// Option text
|
|
269
|
+
const textSpan = this.renderer.createElement('span');
|
|
270
|
+
this.renderer.addClass(textSpan, 'option-text');
|
|
271
|
+
const text = this.renderer.createText(optionLabel);
|
|
272
|
+
this.renderer.appendChild(textSpan, text);
|
|
273
|
+
this.renderer.appendChild(labelElement, textSpan);
|
|
274
|
+
return labelElement;
|
|
275
|
+
}
|
|
276
|
+
createCheckIcon() {
|
|
277
|
+
const svg = this.renderer.createElement('svg', 'svg');
|
|
278
|
+
this.renderer.addClass(svg, 'check-icon');
|
|
279
|
+
this.renderer.setAttribute(svg, 'width', '14');
|
|
280
|
+
this.renderer.setAttribute(svg, 'height', '10');
|
|
281
|
+
this.renderer.setAttribute(svg, 'viewBox', '0 0 10 8');
|
|
282
|
+
this.renderer.setAttribute(svg, 'fill', 'none');
|
|
283
|
+
this.renderer.setAttribute(svg, 'xmlns', 'http://www.w3.org/2000/svg');
|
|
284
|
+
const path = this.renderer.createElement('path', 'svg');
|
|
285
|
+
this.renderer.setAttribute(path, 'd', 'M9 1L3.5 6.5L1 4');
|
|
286
|
+
this.renderer.setAttribute(path, 'stroke', '#F59100');
|
|
287
|
+
this.renderer.setAttribute(path, 'stroke-width', '1.6666');
|
|
288
|
+
this.renderer.setAttribute(path, 'stroke-linecap', 'round');
|
|
289
|
+
this.renderer.setAttribute(path, 'stroke-linejoin', 'round');
|
|
290
|
+
this.renderer.appendChild(svg, path);
|
|
291
|
+
return svg;
|
|
292
|
+
}
|
|
293
|
+
closeDropdown() {
|
|
294
|
+
this.destroyDropdown();
|
|
295
|
+
this.isOpen = false;
|
|
296
|
+
this.onTouched();
|
|
297
|
+
}
|
|
298
|
+
destroyDropdown() {
|
|
299
|
+
// Remove listeners
|
|
300
|
+
if (this.scrollHandler) {
|
|
301
|
+
this.scrollHandler();
|
|
302
|
+
this.scrollHandler = null;
|
|
303
|
+
}
|
|
304
|
+
if (this.resizeHandler) {
|
|
305
|
+
this.resizeHandler();
|
|
306
|
+
this.resizeHandler = null;
|
|
307
|
+
}
|
|
308
|
+
if (this.dropdownElement) {
|
|
309
|
+
this.renderer.removeChild(this.document.body, this.dropdownElement);
|
|
310
|
+
this.dropdownElement = null;
|
|
311
|
+
}
|
|
312
|
+
if (this.backdropElement) {
|
|
313
|
+
this.renderer.removeChild(this.document.body, this.backdropElement);
|
|
314
|
+
this.backdropElement = null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
toggleOption(option) {
|
|
318
|
+
if (this.isOptionDisabled(option))
|
|
319
|
+
return;
|
|
320
|
+
const optionValue = this.getOptionValue(option);
|
|
321
|
+
const index = this.value.indexOf(optionValue);
|
|
322
|
+
if (index > -1) {
|
|
323
|
+
this.value = this.value.filter(v => v !== optionValue);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
this.value = [...this.value, optionValue];
|
|
327
|
+
}
|
|
328
|
+
this.onChange(this.value);
|
|
329
|
+
}
|
|
330
|
+
isSelected(value) {
|
|
331
|
+
return this.value.includes(value);
|
|
332
|
+
}
|
|
333
|
+
getSelectedCount() {
|
|
334
|
+
return this.value.length;
|
|
335
|
+
}
|
|
336
|
+
getSelectedLabels() {
|
|
337
|
+
const allOptions = this.getAllOptions();
|
|
338
|
+
const selectedOptions = allOptions.filter(opt => this.isSelected(this.getOptionValue(opt)));
|
|
339
|
+
return selectedOptions.map(opt => this.getOptionLabel(opt)).join(', ');
|
|
340
|
+
}
|
|
341
|
+
writeValue(value) {
|
|
342
|
+
this.value = Array.isArray(value) ? value : [];
|
|
343
|
+
}
|
|
344
|
+
registerOnChange(fn) {
|
|
345
|
+
this.onChange = fn;
|
|
346
|
+
}
|
|
347
|
+
registerOnTouched(fn) {
|
|
348
|
+
this.onTouched = fn;
|
|
349
|
+
}
|
|
350
|
+
setDisabledState(isDisabled) {
|
|
351
|
+
this.disabled = isDisabled;
|
|
352
|
+
}
|
|
353
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectComponent, deps: [{ token: i0.Renderer2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
354
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiselectComponent, isStandalone: true, selector: "app-multiselect", inputs: { label: "label", id: "id", placeholder: "placeholder", options: "options", hasError: "hasError", errorMessage: "errorMessage", disabled: "disabled", displayKey: "displayKey", valueKey: "valueKey", customClass: "customClass" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
|
|
355
|
+
{
|
|
356
|
+
provide: NG_VALUE_ACCESSOR,
|
|
357
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
358
|
+
multi: true
|
|
359
|
+
}
|
|
360
|
+
], queries: [{ propertyName: "contentOptions", predicate: OptionComponent }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }], ngImport: i0, template: `
|
|
361
|
+
<div class="multiselect-wrapper" [ngClass]="customClass">
|
|
362
|
+
<label *ngIf="label" [for]="id">{{ label }}</label>
|
|
363
|
+
<div class="multiselect-container">
|
|
364
|
+
<div
|
|
365
|
+
#trigger
|
|
366
|
+
class="multiselect-header"
|
|
367
|
+
(click)="toggleDropdown($event)"
|
|
368
|
+
[class.disabled]="disabled"
|
|
369
|
+
[class.open]="isOpen"
|
|
370
|
+
[class.error]="hasError">
|
|
371
|
+
<span class="multiselect-placeholder" *ngIf="getSelectedCount() === 0">
|
|
372
|
+
{{ placeholder || 'Selecciona uno o más...' }}
|
|
373
|
+
</span>
|
|
374
|
+
<span class="multiselect-selected" *ngIf="getSelectedCount() > 0">
|
|
375
|
+
{{ getSelectedLabels() }}
|
|
376
|
+
</span>
|
|
377
|
+
<svg class="multiselect-arrow" [class.open]="isOpen" width="12" height="8" viewBox="0 0 12 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
378
|
+
<path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
379
|
+
</svg>
|
|
380
|
+
</div>
|
|
381
|
+
</div>
|
|
382
|
+
<div *ngIf="hasError && errorMessage" class="field-error">
|
|
383
|
+
{{ errorMessage }}
|
|
384
|
+
</div>
|
|
385
|
+
|
|
386
|
+
<!-- Hidden container for projected options -->
|
|
387
|
+
<div style="display: none;">
|
|
388
|
+
<ng-content></ng-content>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
`, isInline: true, styles: [".multiselect-wrapper{width:100%;margin-bottom:6px;padding:0 4px}.multiselect-wrapper label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.multiselect-container{position:relative;width:100%}.multiselect-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;background:#fff;cursor:pointer;transition:all .2s;min-height:44px;height:44px}.multiselect-header:hover:not(.disabled){border-color:#fbd399}.multiselect-header:focus-within{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.multiselect-header.disabled{background:#f5f5f5;cursor:not-allowed;opacity:.6}.multiselect-header.error{border-color:#dc3545!important}.multiselect-header.error.open{box-shadow:0 0 0 3px #dc35451a!important}.multiselect-header .multiselect-placeholder{font-family:Quicksand,sans-serif;font-size:14px;color:#969a9c}.multiselect-header .multiselect-selected{font-family:Quicksand,sans-serif;font-size:14px;color:#1a1d20;font-weight:500;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multiselect-header .multiselect-arrow{color:#969a9c;transition:transform .3s ease;margin-left:.5rem;flex-shrink:0;display:flex;align-items:center}.multiselect-header .multiselect-arrow.open{transform:rotate(180deg)}.multiselect-dropdown{margin-top:8px;background:#fff;border:1px solid #EAECF5;border-radius:8px;box-shadow:0 10px 16px -4px #edeffb;max-height:290px!important;width:100%;overflow-x:hidden;overflow-y:auto;animation:dropdownSlide .25s cubic-bezier(.4,0,.2,1)}.multiselect-dropdown::-webkit-scrollbar{width:8px}.multiselect-dropdown::-webkit-scrollbar-track{background:#f1f1f1;border-radius:0 12px 12px 0}.multiselect-dropdown::-webkit-scrollbar-thumb{background:#d5d7d8;border-radius:4px}.multiselect-dropdown::-webkit-scrollbar-thumb:hover{background:#969a9c}@keyframes dropdownSlide{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.multiselect-option{display:flex!important;align-items:center;padding:.6rem 1.25rem;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);border-bottom:1px solid #F1F2F4;gap:1rem;margin:0!important;position:relative}.multiselect-option:first-child{border-radius:12px 12px 0 0}.multiselect-option:last-child{border-bottom:none;border-radius:0 0 12px 12px}.multiselect-option:hover:not(.disabled){background:linear-gradient(90deg,#fff9f0,#fffef9)}.multiselect-option:hover:not(.disabled):before{opacity:.5}.multiselect-option.disabled{opacity:.5;cursor:not-allowed;background:#f8f9fc}.multiselect-option.disabled:hover{transform:none;background:#f8f9fc}.multiselect-option .option-checkbox{position:relative;display:flex;align-items:center;flex-shrink:0}.multiselect-option .option-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:22px;height:22px;margin:0}.multiselect-option .option-checkbox .checkbox-custom{width:22px;height:22px;border:2.5px solid #D5D7D8;border-radius:6px;display:flex;align-items:center;justify-content:center;transition:all .25s cubic-bezier(.4,0,.2,1);background:#fff;position:relative}.multiselect-option .option-checkbox .checkbox-custom:after{content:\"\";position:absolute;width:100%;height:100%;border-radius:4px;background:#f59100;opacity:0;transform:scale(.5);transition:all .25s cubic-bezier(.4,0,.2,1)}.multiselect-option .option-checkbox .checkbox-custom.checked{background:#fff;border-color:#f59100;border-width:2.5px;transform:scale(1.05)}.multiselect-option .option-checkbox .checkbox-custom.checked:after{opacity:0}.multiselect-option .option-checkbox .checkbox-custom .check-icon{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;animation:checkPop .3s cubic-bezier(.68,-.55,.265,1.55)}.multiselect-option .option-checkbox input[type=checkbox]:hover~.checkbox-custom:not(.checked){border-color:#f26d00;transform:scale(1.05)}.multiselect-option .option-text{flex:1;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#1a1d20;line-height:1.5;transition:color .2s ease,font-weight .2s ease}@keyframes checkPop{0%{transform:scale(0);opacity:0}50%{transform:scale(1.2)}to{transform:scale(1);opacity:1}}.field-error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}::ng-deep .multiselect-custom-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:99999;pointer-events:auto}::ng-deep .multiselect-custom-dropdown{position:fixed;background:#fff;border-radius:8px;overflow:hidden;z-index:1000;opacity:0;transform:translateY(-8px) scale(.98);transition:opacity .25s cubic-bezier(.4,0,.2,1),transform .25s cubic-bezier(.4,0,.2,1)}::ng-deep .multiselect-custom-dropdown.multiselect-dropdown-open{opacity:1;transform:translateY(0) scale(1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }] });
|
|
392
|
+
}
|
|
393
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectComponent, decorators: [{
|
|
394
|
+
type: Component,
|
|
395
|
+
args: [{ selector: 'app-multiselect', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule], template: `
|
|
396
|
+
<div class="multiselect-wrapper" [ngClass]="customClass">
|
|
397
|
+
<label *ngIf="label" [for]="id">{{ label }}</label>
|
|
398
|
+
<div class="multiselect-container">
|
|
399
|
+
<div
|
|
400
|
+
#trigger
|
|
401
|
+
class="multiselect-header"
|
|
402
|
+
(click)="toggleDropdown($event)"
|
|
403
|
+
[class.disabled]="disabled"
|
|
404
|
+
[class.open]="isOpen"
|
|
405
|
+
[class.error]="hasError">
|
|
406
|
+
<span class="multiselect-placeholder" *ngIf="getSelectedCount() === 0">
|
|
407
|
+
{{ placeholder || 'Selecciona uno o más...' }}
|
|
408
|
+
</span>
|
|
409
|
+
<span class="multiselect-selected" *ngIf="getSelectedCount() > 0">
|
|
410
|
+
{{ getSelectedLabels() }}
|
|
411
|
+
</span>
|
|
412
|
+
<svg class="multiselect-arrow" [class.open]="isOpen" width="12" height="8" viewBox="0 0 12 8" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
413
|
+
<path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
414
|
+
</svg>
|
|
415
|
+
</div>
|
|
416
|
+
</div>
|
|
417
|
+
<div *ngIf="hasError && errorMessage" class="field-error">
|
|
418
|
+
{{ errorMessage }}
|
|
419
|
+
</div>
|
|
420
|
+
|
|
421
|
+
<!-- Hidden container for projected options -->
|
|
422
|
+
<div style="display: none;">
|
|
423
|
+
<ng-content></ng-content>
|
|
424
|
+
</div>
|
|
425
|
+
</div>
|
|
426
|
+
`, providers: [
|
|
427
|
+
{
|
|
428
|
+
provide: NG_VALUE_ACCESSOR,
|
|
429
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
430
|
+
multi: true
|
|
431
|
+
}
|
|
432
|
+
], styles: [".multiselect-wrapper{width:100%;margin-bottom:6px;padding:0 4px}.multiselect-wrapper label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.multiselect-container{position:relative;width:100%}.multiselect-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;background:#fff;cursor:pointer;transition:all .2s;min-height:44px;height:44px}.multiselect-header:hover:not(.disabled){border-color:#fbd399}.multiselect-header:focus-within{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.multiselect-header.disabled{background:#f5f5f5;cursor:not-allowed;opacity:.6}.multiselect-header.error{border-color:#dc3545!important}.multiselect-header.error.open{box-shadow:0 0 0 3px #dc35451a!important}.multiselect-header .multiselect-placeholder{font-family:Quicksand,sans-serif;font-size:14px;color:#969a9c}.multiselect-header .multiselect-selected{font-family:Quicksand,sans-serif;font-size:14px;color:#1a1d20;font-weight:500;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multiselect-header .multiselect-arrow{color:#969a9c;transition:transform .3s ease;margin-left:.5rem;flex-shrink:0;display:flex;align-items:center}.multiselect-header .multiselect-arrow.open{transform:rotate(180deg)}.multiselect-dropdown{margin-top:8px;background:#fff;border:1px solid #EAECF5;border-radius:8px;box-shadow:0 10px 16px -4px #edeffb;max-height:290px!important;width:100%;overflow-x:hidden;overflow-y:auto;animation:dropdownSlide .25s cubic-bezier(.4,0,.2,1)}.multiselect-dropdown::-webkit-scrollbar{width:8px}.multiselect-dropdown::-webkit-scrollbar-track{background:#f1f1f1;border-radius:0 12px 12px 0}.multiselect-dropdown::-webkit-scrollbar-thumb{background:#d5d7d8;border-radius:4px}.multiselect-dropdown::-webkit-scrollbar-thumb:hover{background:#969a9c}@keyframes dropdownSlide{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.multiselect-option{display:flex!important;align-items:center;padding:.6rem 1.25rem;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);border-bottom:1px solid #F1F2F4;gap:1rem;margin:0!important;position:relative}.multiselect-option:first-child{border-radius:12px 12px 0 0}.multiselect-option:last-child{border-bottom:none;border-radius:0 0 12px 12px}.multiselect-option:hover:not(.disabled){background:linear-gradient(90deg,#fff9f0,#fffef9)}.multiselect-option:hover:not(.disabled):before{opacity:.5}.multiselect-option.disabled{opacity:.5;cursor:not-allowed;background:#f8f9fc}.multiselect-option.disabled:hover{transform:none;background:#f8f9fc}.multiselect-option .option-checkbox{position:relative;display:flex;align-items:center;flex-shrink:0}.multiselect-option .option-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:22px;height:22px;margin:0}.multiselect-option .option-checkbox .checkbox-custom{width:22px;height:22px;border:2.5px solid #D5D7D8;border-radius:6px;display:flex;align-items:center;justify-content:center;transition:all .25s cubic-bezier(.4,0,.2,1);background:#fff;position:relative}.multiselect-option .option-checkbox .checkbox-custom:after{content:\"\";position:absolute;width:100%;height:100%;border-radius:4px;background:#f59100;opacity:0;transform:scale(.5);transition:all .25s cubic-bezier(.4,0,.2,1)}.multiselect-option .option-checkbox .checkbox-custom.checked{background:#fff;border-color:#f59100;border-width:2.5px;transform:scale(1.05)}.multiselect-option .option-checkbox .checkbox-custom.checked:after{opacity:0}.multiselect-option .option-checkbox .checkbox-custom .check-icon{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;animation:checkPop .3s cubic-bezier(.68,-.55,.265,1.55)}.multiselect-option .option-checkbox input[type=checkbox]:hover~.checkbox-custom:not(.checked){border-color:#f26d00;transform:scale(1.05)}.multiselect-option .option-text{flex:1;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#1a1d20;line-height:1.5;transition:color .2s ease,font-weight .2s ease}@keyframes checkPop{0%{transform:scale(0);opacity:0}50%{transform:scale(1.2)}to{transform:scale(1);opacity:1}}.field-error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}::ng-deep .multiselect-custom-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:99999;pointer-events:auto}::ng-deep .multiselect-custom-dropdown{position:fixed;background:#fff;border-radius:8px;overflow:hidden;z-index:1000;opacity:0;transform:translateY(-8px) scale(.98);transition:opacity .25s cubic-bezier(.4,0,.2,1),transform .25s cubic-bezier(.4,0,.2,1)}::ng-deep .multiselect-custom-dropdown.multiselect-dropdown-open{opacity:1;transform:translateY(0) scale(1)}\n"] }]
|
|
433
|
+
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: Document, decorators: [{
|
|
434
|
+
type: Inject,
|
|
435
|
+
args: [DOCUMENT]
|
|
436
|
+
}] }], propDecorators: { label: [{
|
|
437
|
+
type: Input
|
|
438
|
+
}], id: [{
|
|
439
|
+
type: Input
|
|
440
|
+
}], placeholder: [{
|
|
441
|
+
type: Input
|
|
442
|
+
}], options: [{
|
|
443
|
+
type: Input
|
|
444
|
+
}], hasError: [{
|
|
445
|
+
type: Input
|
|
446
|
+
}], errorMessage: [{
|
|
447
|
+
type: Input
|
|
448
|
+
}], disabled: [{
|
|
449
|
+
type: Input
|
|
450
|
+
}], displayKey: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], valueKey: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], customClass: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], trigger: [{
|
|
457
|
+
type: ViewChild,
|
|
458
|
+
args: ['trigger', { read: ElementRef }]
|
|
459
|
+
}], contentOptions: [{
|
|
460
|
+
type: ContentChildren,
|
|
461
|
+
args: [OptionComponent]
|
|
462
|
+
}], onDocumentClick: [{
|
|
463
|
+
type: HostListener,
|
|
464
|
+
args: ['document:click', ['$event']]
|
|
465
|
+
}] } });
|
|
466
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2xlY3VsZXMvbXVsdGlzZWxlY3QvbXVsdGlzZWxlY3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixlQUFlLEVBS2YsTUFBTSxFQUNOLG1CQUFtQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUE4RDdELE1BQU0sT0FBTyxvQkFBb0I7SUEwQnJCO0lBQ2tCO0lBMUJuQixLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1gsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNSLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsT0FBTyxHQUFnQyxFQUFFLENBQUM7SUFDMUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsVUFBVSxHQUFXLE9BQU8sQ0FBQyxDQUFDLCtCQUErQjtJQUM3RCxRQUFRLEdBQVcsT0FBTyxDQUFDLENBQUMsMkJBQTJCO0lBQ3ZELFdBQVcsR0FBVyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7SUFDdEIsT0FBTyxDQUFjO0lBQy9CLGNBQWMsQ0FBOEI7SUFFOUUsS0FBSyxHQUFVLEVBQUUsQ0FBQztJQUNsQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsUUFBUSxHQUFRLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUN6QixTQUFTLEdBQVEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ2xCLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUU3QixlQUFlLEdBQXVCLElBQUksQ0FBQztJQUMzQyxlQUFlLEdBQXVCLElBQUksQ0FBQztJQUMzQyxhQUFhLEdBQXdCLElBQUksQ0FBQztJQUMxQyxhQUFhLEdBQXdCLElBQUksQ0FBQztJQUVsRCxZQUNVLFFBQW1CLEVBQ0QsUUFBa0I7UUFEcEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNELGFBQVEsR0FBUixRQUFRLENBQVU7SUFDM0MsQ0FBQztJQUVKLGtCQUFrQjtRQUNoQix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWxGLDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUN6QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxNQUFXO1FBQ3hCLElBQUksTUFBTSxZQUFZLGVBQWUsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxNQUFXO1FBQ3hCLElBQUksTUFBTSxZQUFZLGVBQWUsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsTUFBVztRQUMxQixJQUFJLE1BQU0sWUFBWSxlQUFlLEVBQUUsQ0FBQztZQUN0QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDekIsQ0FBQztRQUNELE9BQU8sTUFBTSxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUdELGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBYyxDQUFDLEVBQUUsQ0FBQztZQUNoRyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztZQUNuRCxJQUFJLGNBQWMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsS0FBWTtRQUN6QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRTFCLGtCQUFrQjtRQUNsQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFcEUsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUV6RSxxQkFBcUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFMUMsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBRWhFLGNBQWM7UUFDZCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFbkIseURBQXlEO1FBQ3pELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTlCLG9CQUFvQjtRQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztZQUM1RSxDQUFDO1FBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNsRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUVwRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM1QixNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFbEIsTUFBTSxlQUFlLEdBQUcsVUFBVSxHQUFHLEdBQUcsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBRXBFLE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJO1lBQ3RCLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUk7WUFDeEIsU0FBUyxFQUFFLEdBQUcsaUJBQWlCLElBQUk7U0FDcEMsQ0FBQztRQUVGLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sSUFBSSxDQUFDO1FBQzlDLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLGtCQUFrQjtRQUNsQixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMxRCxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUUxRCw4RUFBOEU7UUFDOUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRixzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUVuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUUxQyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0RSwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTFELGdDQUFnQztRQUNoQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQVc7UUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFFM0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQzNELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUVILHFCQUFxQjtRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUV2RCx5QkFBeUI7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELGFBQWE7UUFDYixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3hELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV4QixtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUxQixzQkFBc0I7WUFDdEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBRTlELElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNsRCxnQ0FBZ0M7Z0JBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7b0JBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRCxvQkFBb0I7Z0JBQ3BCLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXJELGNBQWM7UUFDZCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBRXZFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTyxlQUFlO1FBQ3JCLG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsTUFBVztRQUN0QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPO1FBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDekQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVGLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7d0dBdFpVLG9CQUFvQiwyQ0EyQnJCLFFBQVE7NEZBM0JQLG9CQUFvQixnWEFScEI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNuRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YseURBY2dCLGVBQWUsNEdBREYsVUFBVSw2QkFwRDlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JULHkySkFoQ1MsWUFBWSxnT0FBRSxtQkFBbUIsOEJBQUUsV0FBVzs7NEZBMEM3QyxvQkFBb0I7a0JBN0NoQyxTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLENBQUMsWUFDL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQlQsYUFFVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7OzBCQTZCRSxNQUFNOzJCQUFDLFFBQVE7eUNBMUJULEtBQUs7c0JBQWIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ3NDLE9BQU87c0JBQWxELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDUixjQUFjO3NCQUEvQyxlQUFlO3VCQUFDLGVBQWU7Z0JBMkVoQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBmb3J3YXJkUmVmLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgQ29udGVudENoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIE9uRGVzdHJveSxcbiAgUmVuZGVyZXIyLFxuICBJbmplY3QsXG4gIFJlbmRlcmVyU3R5bGVGbGFnczJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlzZWxlY3RPcHRpb24ge1xuICB2YWx1ZTogYW55O1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBEcm9wZG93blBvc2l0aW9uIHtcbiAgdG9wPzogc3RyaW5nO1xuICBib3R0b20/OiBzdHJpbmc7XG4gIGxlZnQ6IHN0cmluZztcbiAgd2lkdGg6IHN0cmluZztcbiAgbWF4SGVpZ2h0OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1tdWx0aXNlbGVjdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibXVsdGlzZWxlY3Qtd3JhcHBlclwiIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzXCI+XG4gICAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwibXVsdGlzZWxlY3QtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjdHJpZ2dlclxuICAgICAgICAgIGNsYXNzPVwibXVsdGlzZWxlY3QtaGVhZGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbY2xhc3Mub3Blbl09XCJpc09wZW5cIlxuICAgICAgICAgIFtjbGFzcy5lcnJvcl09XCJoYXNFcnJvclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGlzZWxlY3QtcGxhY2Vob2xkZXJcIiAqbmdJZj1cImdldFNlbGVjdGVkQ291bnQoKSA9PT0gMFwiPlxuICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgfHwgJ1NlbGVjY2lvbmEgdW5vIG8gbcOhcy4uLicgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdWx0aXNlbGVjdC1zZWxlY3RlZFwiICpuZ0lmPVwiZ2V0U2VsZWN0ZWRDb3VudCgpID4gMFwiPlxuICAgICAgICAgICAge3sgZ2V0U2VsZWN0ZWRMYWJlbHMoKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3ZnIGNsYXNzPVwibXVsdGlzZWxlY3QtYXJyb3dcIiBbY2xhc3Mub3Blbl09XCJpc09wZW5cIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiOFwiIHZpZXdCb3g9XCIwIDAgMTIgOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xIDEuNUw2IDYuNUwxMSAxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaGFzRXJyb3IgJiYgZXJyb3JNZXNzYWdlXCIgY2xhc3M9XCJmaWVsZC1lcnJvclwiPlxuICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEhpZGRlbiBjb250YWluZXIgZm9yIHByb2plY3RlZCBvcHRpb25zIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aXNlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpc2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpc2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIGlkID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IE11bHRpc2VsZWN0T3B0aW9uW10gfCBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBoYXNFcnJvciA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2UgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzcGxheUtleTogc3RyaW5nID0gJ2xhYmVsJzsgLy8gUHJvcGVydHkgdG8gZGlzcGxheSBhcyBsYWJlbFxuICBASW5wdXQoKSB2YWx1ZUtleTogc3RyaW5nID0gJ3ZhbHVlJzsgLy8gUHJvcGVydHkgdG8gdXNlIGFzIHZhbHVlXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzOiBzdHJpbmcgPSAnJzsgLy8gQ3VzdG9tIENTUyBjbGFzcyBmb3Igc3R5bGluZ1xuICBAVmlld0NoaWxkKCd0cmlnZ2VyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHRyaWdnZXIhOiBFbGVtZW50UmVmO1xuICBAQ29udGVudENoaWxkcmVuKE9wdGlvbkNvbXBvbmVudCkgY29udGVudE9wdGlvbnMhOiBRdWVyeUxpc3Q8T3B0aW9uQ29tcG9uZW50PjtcblxuICB2YWx1ZTogYW55W10gPSBbXTtcbiAgaXNPcGVuID0gZmFsc2U7XG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBfdXNpbmdDb250ZW50T3B0aW9ucyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZHJvcGRvd25FbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGJhY2tkcm9wRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY3JvbGxIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNpemVIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBEZXRlcm1pbmUgaWYgdXNpbmcgY29udGVudCBwcm9qZWN0aW9uIG9yIGlucHV0IG9wdGlvbnNcbiAgICB0aGlzLl91c2luZ0NvbnRlbnRPcHRpb25zID0gdGhpcy5jb250ZW50T3B0aW9ucyAmJiB0aGlzLmNvbnRlbnRPcHRpb25zLmxlbmd0aCA+IDA7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiBjb250ZW50IG9wdGlvbnNcbiAgICBpZiAodGhpcy5jb250ZW50T3B0aW9ucykge1xuICAgICAgdGhpcy5jb250ZW50T3B0aW9ucy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzaW5nQ29udGVudE9wdGlvbnMgPSB0aGlzLmNvbnRlbnRPcHRpb25zLmxlbmd0aCA+IDA7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lEcm9wZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgb3B0aW9ucyAoZnJvbSBjb250ZW50IG9yIGlucHV0KVxuICAgKi9cbiAgZ2V0QWxsT3B0aW9ucygpOiBhbnlbXSB7XG4gICAgaWYgKHRoaXMuX3VzaW5nQ29udGVudE9wdGlvbnMgJiYgdGhpcy5jb250ZW50T3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudE9wdGlvbnMudG9BcnJheSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkaXNwbGF5IGxhYmVsIGZyb20gb3B0aW9uXG4gICAqL1xuICBnZXRPcHRpb25MYWJlbChvcHRpb246IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKG9wdGlvbiBpbnN0YW5jZW9mIE9wdGlvbkNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIG9wdGlvbi52aWV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb24/Llt0aGlzLmRpc3BsYXlLZXldIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2YWx1ZSBmcm9tIG9wdGlvblxuICAgKi9cbiAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uOiBhbnkpOiBhbnkge1xuICAgIGlmIChvcHRpb24gaW5zdGFuY2VvZiBPcHRpb25Db21wb25lbnQpIHtcbiAgICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb24/Llt0aGlzLnZhbHVlS2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGlzT3B0aW9uRGlzYWJsZWQob3B0aW9uOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAob3B0aW9uIGluc3RhbmNlb2YgT3B0aW9uQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gb3B0aW9uLmRpc2FibGVkO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uPy5kaXNhYmxlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gaWYgY2xpY2sgaXMgb3V0c2lkZVxuICAgIGlmICh0aGlzLmlzT3BlbiAmJiB0aGlzLmRyb3Bkb3duRWxlbWVudCAmJiAhdGhpcy5kcm9wZG93bkVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh0cmlnZ2VyRWxlbWVudCAmJiAhdHJpZ2dlckVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5Ecm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlbkRyb3Bkb3duKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50cmlnZ2VyKSByZXR1cm47XG5cbiAgICAvLyBDcmVhdGUgYmFja2Ryb3BcbiAgICB0aGlzLmJhY2tkcm9wRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJhY2tkcm9wRWxlbWVudCwgJ211bHRpc2VsZWN0LWN1c3RvbS1iYWNrZHJvcCcpO1xuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuYmFja2Ryb3BFbGVtZW50LCAnY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlRHJvcGRvd24oKSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMuYmFja2Ryb3BFbGVtZW50KTtcblxuICAgIC8vIENyZWF0ZSBkcm9wZG93blxuICAgIHRoaXMuZHJvcGRvd25FbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnbXVsdGlzZWxlY3QtY3VzdG9tLWRyb3Bkb3duJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ211bHRpc2VsZWN0LW92ZXJsYXktcGFuZScpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKCk7XG5cbiAgICAvLyBBcHBseSBwb3NpdGlvbmluZyBzdHlsZXNcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAncG9zaXRpb24nLCAnZml4ZWQnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnbGVmdCcsIHBvc2l0aW9uLmxlZnQpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICd3aWR0aCcsIHBvc2l0aW9uLndpZHRoKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnbWF4LWhlaWdodCcsIHBvc2l0aW9uLm1heEhlaWdodCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ3otaW5kZXgnLCAnMTAwMDAwJywgUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnQpO1xuXG4gICAgaWYgKHBvc2l0aW9uLnRvcCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ3RvcCcsIHBvc2l0aW9uLnRvcCk7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbi5ib3R0b20pIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICdib3R0b20nLCBwb3NpdGlvbi5ib3R0b20pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBkcm9wZG93biBjb250ZW50IHdyYXBwZXJcbiAgICBjb25zdCBkcm9wZG93bkNvbnRlbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZHJvcGRvd25Db250ZW50LCAnbXVsdGlzZWxlY3QtZHJvcGRvd24nKTtcblxuICAgIC8vIEFkZCBvcHRpb25zXG4gICAgY29uc3QgYWxsT3B0aW9ucyA9IHRoaXMuZ2V0QWxsT3B0aW9ucygpO1xuICAgIGFsbE9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IHRoaXMuY3JlYXRlT3B0aW9uRWxlbWVudChvcHRpb24pO1xuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkcm9wZG93bkNvbnRlbnQsIG9wdGlvbkVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRyb3Bkb3duRWxlbWVudCwgZHJvcGRvd25Db250ZW50KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuYm9keSwgdGhpcy5kcm9wZG93bkVsZW1lbnQpO1xuXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuXG4gICAgLy8gQWRkIHNjcm9sbCBhbmQgcmVzaXplIGxpc3RlbmVycyB0byByZXBvc2l0aW9uIGRyb3Bkb3duXG4gICAgdGhpcy5hZGRSZXBvc2l0aW9uTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBUcmlnZ2VyIGFuaW1hdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJvcGRvd25FbGVtZW50KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kcm9wZG93bkVsZW1lbnQsICdtdWx0aXNlbGVjdC1kcm9wZG93bi1vcGVuJyk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVQb3NpdGlvbigpOiBEcm9wZG93blBvc2l0aW9uIHtcbiAgICBjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gcmVjdC50b3A7XG4gICAgY29uc3QgZHJvcGRvd25NYXhIZWlnaHQgPSAzMDA7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IDQ7XG5cbiAgICBjb25zdCBzaG91bGRPcGVuQWJvdmUgPSBzcGFjZUJlbG93IDwgMjAwICYmIHNwYWNlQWJvdmUgPiBzcGFjZUJlbG93O1xuXG4gICAgY29uc3QgcG9zaXRpb246IERyb3Bkb3duUG9zaXRpb24gPSB7XG4gICAgICBsZWZ0OiBgJHtyZWN0LmxlZnR9cHhgLFxuICAgICAgd2lkdGg6IGAke3JlY3Qud2lkdGh9cHhgLFxuICAgICAgbWF4SGVpZ2h0OiBgJHtkcm9wZG93bk1heEhlaWdodH1weGBcbiAgICB9O1xuXG4gICAgaWYgKHNob3VsZE9wZW5BYm92ZSkge1xuICAgICAgcG9zaXRpb24uYm90dG9tID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgKyBvZmZzZXRZfXB4YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zaXRpb24udG9wID0gYCR7cmVjdC5ib3R0b20gKyBvZmZzZXRZfXB4YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIGFkZFJlcG9zaXRpb25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGhhbmRsZXJzXG4gICAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB0aGlzLnVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTtcblxuICAgIC8vIEFkZCBzY3JvbGwgbGlzdGVuZXIgdG8gd2luZG93IHdpdGggY2FwdHVyZSBwaGFzZSB0byBjYXRjaCBhbGwgc2Nyb2xsIGV2ZW50c1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyLCB0cnVlKTtcbiAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlciwgdHJ1ZSk7XG5cbiAgICAvLyBBZGQgcmVzaXplIGxpc3RlbmVyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZUhhbmRsZXIpO1xuICAgIHRoaXMucmVzaXplSGFuZGxlciA9ICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25FbGVtZW50IHx8ICF0aGlzLnRyaWdnZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpO1xuXG4gICAgLy8gVXBkYXRlIHBvc2l0aW9uIHN0eWxlc1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICdsZWZ0JywgcG9zaXRpb24ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRyb3Bkb3duRWxlbWVudCwgJ3dpZHRoJywgcG9zaXRpb24ud2lkdGgpO1xuXG4gICAgLy8gUmVtb3ZlIG9sZCB0b3AvYm90dG9tIHN0eWxlc1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICd0b3AnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnYm90dG9tJyk7XG5cbiAgICAvLyBBcHBseSBuZXcgdG9wL2JvdHRvbSBwb3NpdGlvblxuICAgIGlmIChwb3NpdGlvbi50b3ApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQsICd0b3AnLCBwb3NpdGlvbi50b3ApO1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24uYm90dG9tKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50LCAnYm90dG9tJywgcG9zaXRpb24uYm90dG9tKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9wdGlvbkVsZW1lbnQob3B0aW9uOiBhbnkpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgbGFiZWxFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobGFiZWxFbGVtZW50LCAnbXVsdGlzZWxlY3Qtb3B0aW9uJyk7XG5cbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uKTtcbiAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMuZ2V0T3B0aW9uTGFiZWwob3B0aW9uKTtcbiAgICBjb25zdCBvcHRpb25EaXNhYmxlZCA9IHRoaXMuaXNPcHRpb25EaXNhYmxlZChvcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuaXNTZWxlY3RlZChvcHRpb25WYWx1ZSkpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobGFiZWxFbGVtZW50LCAnc2VsZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobGFiZWxFbGVtZW50LCAnZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTdG9wIHByb3BhZ2F0aW9uIG9uIGxhYmVsIGNsaWNrXG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4obGFiZWxFbGVtZW50LCAnY2xpY2snLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIC8vIENoZWNrYm94IGNvbnRhaW5lclxuICAgIGNvbnN0IGNoZWNrYm94RGl2ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNoZWNrYm94RGl2LCAnb3B0aW9uLWNoZWNrYm94Jyk7XG5cbiAgICAvLyBIaWRkZW4gbmF0aXZlIGNoZWNrYm94XG4gICAgY29uc3QgY2hlY2tib3ggPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoY2hlY2tib3gsICd0eXBlJywgJ2NoZWNrYm94Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShjaGVja2JveCwgJ2NoZWNrZWQnLCB0aGlzLmlzU2VsZWN0ZWQob3B0aW9uVmFsdWUpKTtcbiAgICBpZiAob3B0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoY2hlY2tib3gsICdkaXNhYmxlZCcsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbSBjaGVja2JveCBzcGFuXG4gICAgY29uc3QgY3VzdG9tQ2hlY2tib3ggPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGN1c3RvbUNoZWNrYm94LCAnY2hlY2tib3gtY3VzdG9tJyk7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3RlZChvcHRpb25WYWx1ZSkpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY3VzdG9tQ2hlY2tib3gsICdjaGVja2VkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWNvblxuICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQob3B0aW9uVmFsdWUpKSB7XG4gICAgICBjb25zdCBzdmcgPSB0aGlzLmNyZWF0ZUNoZWNrSWNvbigpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjdXN0b21DaGVja2JveCwgc3ZnKTtcbiAgICB9XG5cbiAgICAvLyBMaXN0ZW4gdG8gY2hhbmdlIGV2ZW50XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oY2hlY2tib3gsICdjaGFuZ2UnLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgLy8gVG9nZ2xlIHRoZSB2YWx1ZVxuICAgICAgdGhpcy50b2dnbGVPcHRpb24ob3B0aW9uKTtcblxuICAgICAgLy8gVXBkYXRlIHZpc3VhbCBzdGF0ZVxuICAgICAgY29uc3QgaXNOb3dTZWxlY3RlZCA9IHRoaXMuaXNTZWxlY3RlZChvcHRpb25WYWx1ZSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGNoZWNrYm94LCAnY2hlY2tlZCcsIGlzTm93U2VsZWN0ZWQpO1xuXG4gICAgICBpZiAoaXNOb3dTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGxhYmVsRWxlbWVudCwgJ3NlbGVjdGVkJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY3VzdG9tQ2hlY2tib3gsICdjaGVja2VkJyk7XG4gICAgICAgIC8vIEFkZCBjaGVjayBpY29uIGlmIG5vdCBwcmVzZW50XG4gICAgICAgIGlmICghY3VzdG9tQ2hlY2tib3gucXVlcnlTZWxlY3RvcignLmNoZWNrLWljb24nKSkge1xuICAgICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuY3JlYXRlQ2hlY2tJY29uKCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjdXN0b21DaGVja2JveCwgc3ZnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhsYWJlbEVsZW1lbnQsICdzZWxlY3RlZCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGN1c3RvbUNoZWNrYm94LCAnY2hlY2tlZCcpO1xuICAgICAgICAvLyBSZW1vdmUgY2hlY2sgaWNvblxuICAgICAgICBjb25zdCBleGlzdGluZ0ljb24gPSBjdXN0b21DaGVja2JveC5xdWVyeVNlbGVjdG9yKCcuY2hlY2staWNvbicpO1xuICAgICAgICBpZiAoZXhpc3RpbmdJY29uKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChjdXN0b21DaGVja2JveCwgZXhpc3RpbmdJY29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjaGVja2JveERpdiwgY2hlY2tib3gpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoY2hlY2tib3hEaXYsIGN1c3RvbUNoZWNrYm94KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGxhYmVsRWxlbWVudCwgY2hlY2tib3hEaXYpO1xuXG4gICAgLy8gT3B0aW9uIHRleHRcbiAgICBjb25zdCB0ZXh0U3BhbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGV4dFNwYW4sICdvcHRpb24tdGV4dCcpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQob3B0aW9uTGFiZWwpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGV4dFNwYW4sIHRleHQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobGFiZWxFbGVtZW50LCB0ZXh0U3Bhbik7XG5cbiAgICByZXR1cm4gbGFiZWxFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDaGVja0ljb24oKTogU1ZHRWxlbWVudCB7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdmcnLCAnc3ZnJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhzdmcsICdjaGVjay1pY29uJyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoc3ZnLCAnd2lkdGgnLCAnMTQnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShzdmcsICdoZWlnaHQnLCAnMTAnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShzdmcsICd2aWV3Qm94JywgJzAgMCAxMCA4Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoc3ZnLCAnZmlsbCcsICdub25lJyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoc3ZnLCAneG1sbnMnLCAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKTtcblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3BhdGgnLCAnc3ZnJyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUocGF0aCwgJ2QnLCAnTTkgMUwzLjUgNi41TDEgNCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHBhdGgsICdzdHJva2UnLCAnI0Y1OTEwMCcpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHBhdGgsICdzdHJva2Utd2lkdGgnLCAnMS42NjY2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUocGF0aCwgJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUocGF0aCwgJ3N0cm9rZS1saW5lam9pbicsICdyb3VuZCcpO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzdmcsIHBhdGgpO1xuICAgIHJldHVybiBzdmc7XG4gIH1cblxuICBjbG9zZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveURyb3Bkb3duKCk7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95RHJvcGRvd24oKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGxpc3RlbmVyc1xuICAgIGlmICh0aGlzLnNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlcigpO1xuICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemVIYW5kbGVyKSB7XG4gICAgICB0aGlzLnJlc2l6ZUhhbmRsZXIoKTtcbiAgICAgIHRoaXMucmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJvcGRvd25FbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9jdW1lbnQuYm9keSwgdGhpcy5kcm9wZG93bkVsZW1lbnQpO1xuICAgICAgdGhpcy5kcm9wZG93bkVsZW1lbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhY2tkcm9wRWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMuYmFja2Ryb3BFbGVtZW50KTtcbiAgICAgIHRoaXMuYmFja2Ryb3BFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVPcHRpb24ob3B0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wdGlvbkRpc2FibGVkKG9wdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb24pO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWx1ZS5pbmRleE9mKG9wdGlvblZhbHVlKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdiAhPT0gb3B0aW9uVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIG9wdGlvblZhbHVlXTtcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlLmluY2x1ZGVzKHZhbHVlKTtcbiAgfVxuXG4gIGdldFNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGg7XG4gIH1cblxuICBnZXRTZWxlY3RlZExhYmVscygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmdldEFsbE9wdGlvbnMoKTtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnMgPSBhbGxPcHRpb25zLmZpbHRlcihvcHQgPT4gdGhpcy5pc1NlbGVjdGVkKHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KSkpO1xuICAgIHJldHVybiBzZWxlY3RlZE9wdGlvbnMubWFwKG9wdCA9PiB0aGlzLmdldE9wdGlvbkxhYmVsKG9wdCkpLmpvaW4oJywgJyk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Component, Input, HostBinding, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class OptionComponent {
|
|
5
|
+
elementRef;
|
|
6
|
+
value;
|
|
7
|
+
disabled = false;
|
|
8
|
+
selected = false;
|
|
9
|
+
optionClass = true;
|
|
10
|
+
// Internal property to store text content
|
|
11
|
+
_viewValue = '';
|
|
12
|
+
get viewValue() {
|
|
13
|
+
return this._viewValue || this.getTextContent();
|
|
14
|
+
}
|
|
15
|
+
set viewValue(value) {
|
|
16
|
+
this._viewValue = value;
|
|
17
|
+
}
|
|
18
|
+
constructor(elementRef) {
|
|
19
|
+
this.elementRef = elementRef;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get the text content from the element
|
|
23
|
+
*/
|
|
24
|
+
getTextContent() {
|
|
25
|
+
return this.elementRef.nativeElement.textContent?.trim() || '';
|
|
26
|
+
}
|
|
27
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
28
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: OptionComponent, isStandalone: true, selector: "app-option", inputs: { value: "value", disabled: "disabled" }, host: { properties: { "class.disabled": "disabled", "class.selected": "this.selected", "class.app-option": "this.optionClass" }, classAttribute: "app-option" }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
29
|
+
}
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionComponent, decorators: [{
|
|
31
|
+
type: Component,
|
|
32
|
+
args: [{
|
|
33
|
+
selector: 'app-option',
|
|
34
|
+
standalone: true,
|
|
35
|
+
imports: [CommonModule],
|
|
36
|
+
template: `<ng-content></ng-content>`,
|
|
37
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
38
|
+
host: {
|
|
39
|
+
'class': 'app-option',
|
|
40
|
+
'[class.disabled]': 'disabled',
|
|
41
|
+
'[class.selected]': 'selected'
|
|
42
|
+
}
|
|
43
|
+
}]
|
|
44
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { value: [{
|
|
45
|
+
type: Input
|
|
46
|
+
}], disabled: [{
|
|
47
|
+
type: Input
|
|
48
|
+
}], selected: [{
|
|
49
|
+
type: HostBinding,
|
|
50
|
+
args: ['class.selected']
|
|
51
|
+
}], optionClass: [{
|
|
52
|
+
type: HostBinding,
|
|
53
|
+
args: ['class.app-option']
|
|
54
|
+
}] } });
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbW9sZWN1bGVzL29wdGlvbi9vcHRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBYy9DLE1BQU0sT0FBTyxlQUFlO0lBcUJOO0lBcEJYLEtBQUssQ0FBTTtJQUNYLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFHbkMsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUdqQixXQUFXLEdBQUcsSUFBSSxDQUFDO0lBRTVCLDBDQUEwQztJQUNsQyxVQUFVLEdBQVcsRUFBRSxDQUFDO0lBRWhDLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLEtBQWE7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBRyxDQUFDO0lBRTlDOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqRSxDQUFDO3dHQTVCVSxlQUFlOzRGQUFmLGVBQWUseVJBUmhCLDJCQUEyQiwyREFEM0IsWUFBWTs7NEZBU1gsZUFBZTtrQkFaM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsWUFBWTt3QkFDckIsa0JBQWtCLEVBQUUsVUFBVTt3QkFDOUIsa0JBQWtCLEVBQUUsVUFBVTtxQkFDL0I7aUJBQ0Y7K0VBRVUsS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR04sUUFBUTtzQkFEUCxXQUFXO3VCQUFDLGdCQUFnQjtnQkFJcEIsV0FBVztzQkFEbkIsV0FBVzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBIb3N0QmluZGluZywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vcHRpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAnYXBwLW9wdGlvbicsXG4gICAgJ1tjbGFzcy5kaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICdbY2xhc3Muc2VsZWN0ZWRdJzogJ3NlbGVjdGVkJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9wdGlvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHZhbHVlOiBhbnk7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZWxlY3RlZCcpXG4gIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hcHAtb3B0aW9uJylcbiAgcmVhZG9ubHkgb3B0aW9uQ2xhc3MgPSB0cnVlO1xuXG4gIC8vIEludGVybmFsIHByb3BlcnR5IHRvIHN0b3JlIHRleHQgY29udGVudFxuICBwcml2YXRlIF92aWV3VmFsdWU6IHN0cmluZyA9ICcnO1xuXG4gIGdldCB2aWV3VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld1ZhbHVlIHx8IHRoaXMuZ2V0VGV4dENvbnRlbnQoKTtcbiAgfVxuXG4gIHNldCB2aWV3VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3ZpZXdWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRleHQgY29udGVudCBmcm9tIHRoZSBlbGVtZW50XG4gICAqL1xuICBnZXRUZXh0Q29udGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcnO1xuICB9XG59XG4iXX0=
|