@ieeesa-npm/groups 0.15.7 → 0.15.9
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/assets/constants.json +62 -0
- package/esm2022/lib/assets/roster-import-mocks.mjs +98 -0
- package/esm2022/lib/components/add-user-roster/add-user-roster.component.mjs +86 -35
- package/esm2022/lib/components/create-group/create-group.component.mjs +2 -2
- package/esm2022/lib/components/edit-user-roles/edit-user-roles.component.mjs +94 -51
- package/esm2022/lib/components/org-multi-select/org-multi-select.component.mjs +455 -0
- package/esm2022/lib/components/roster-import/roster-import.component.mjs +376 -0
- package/esm2022/lib/components/view-roster/view-roster.component.mjs +87 -7
- package/esm2022/lib/groups.component.mjs +58 -3
- package/esm2022/lib/models/group-function-type.model.mjs +2 -1
- package/esm2022/lib/models/roster-import.model.mjs +26 -0
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/ieeesa-npm-groups.mjs +1323 -94
- package/fesm2022/ieeesa-npm-groups.mjs.map +1 -1
- package/lib/assets/roster-import-mocks.d.ts +27 -0
- package/lib/components/add-user-roster/add-user-roster.component.d.ts +30 -0
- package/lib/components/edit-user-roles/edit-user-roles.component.d.ts +31 -0
- package/lib/components/org-multi-select/org-multi-select.component.d.ts +212 -0
- package/lib/components/roster-import/roster-import.component.d.ts +179 -0
- package/lib/components/view-roster/view-roster.component.d.ts +38 -3
- package/lib/groups.component.d.ts +8 -0
- package/lib/models/group-function-type.model.d.ts +2 -1
- package/lib/models/roster-import.model.d.ts +55 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import { COMMA, DOWN_ARROW, ENTER, ESCAPE, UP_ARROW, } from '@angular/cdk/keycodes';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
4
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
6
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
8
|
+
import { Subject, timer } from 'rxjs';
|
|
9
|
+
import * as screenTexts from '../../assets/constants.json';
|
|
10
|
+
import { GroupsValidationPatterns } from '../../assets/form-validations';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/common";
|
|
13
|
+
import * as i2 from "@angular/material/checkbox";
|
|
14
|
+
import * as i3 from "@angular/material/tooltip";
|
|
15
|
+
/**
|
|
16
|
+
* A self-contained multi-select organization field used inside the Add/Edit
|
|
17
|
+
* roster popups.
|
|
18
|
+
*
|
|
19
|
+
* It intentionally does NOT reuse the shared MultiSelectAutocompleteComponent
|
|
20
|
+
* (which is built on mat-autocomplete). Material's autocomplete closes its panel
|
|
21
|
+
* and overwrites the input on every option pick, which made multi-selection
|
|
22
|
+
* feel single-select and cleared the user's typed text. This component uses a
|
|
23
|
+
* fully-owned custom dropdown (<div> + checkboxes) so:
|
|
24
|
+
* - the panel stays open while the user ticks several results,
|
|
25
|
+
* - the typed search text is never overwritten by a pick,
|
|
26
|
+
* - pressing Enter adds the typed value as a free-text chip,
|
|
27
|
+
* - clicking outside clears any leftover typed text (old behavior),
|
|
28
|
+
* - selected values render as removable chips (old behavior).
|
|
29
|
+
*
|
|
30
|
+
* The parent supplies search results via {@link options} and reacts to
|
|
31
|
+
* {@link search} (debounced typed term) and {@link selectionChange}.
|
|
32
|
+
* @export
|
|
33
|
+
* @class OrgMultiSelectComponent
|
|
34
|
+
*/
|
|
35
|
+
export class OrgMultiSelectComponent {
|
|
36
|
+
constructor() {
|
|
37
|
+
/** Field label (e.g. "Representing Organization *"). */
|
|
38
|
+
this.label = '';
|
|
39
|
+
/** Placeholder for the input. */
|
|
40
|
+
this.placeholder = '';
|
|
41
|
+
/** Support/help text shown below the field. */
|
|
42
|
+
this.supportMessage = '';
|
|
43
|
+
/** aria-label for the input. */
|
|
44
|
+
this.ariaLabel = '';
|
|
45
|
+
this._options = [];
|
|
46
|
+
this._selectedOptions = [];
|
|
47
|
+
/** Marks the field required (drives the required message + error border). */
|
|
48
|
+
this.required = true;
|
|
49
|
+
/**
|
|
50
|
+
* Icon URLs (same sprite refs the shared multi-select field used). Defaulted
|
|
51
|
+
* so the popups don't need to pass them; overridable via input if needed.
|
|
52
|
+
*/
|
|
53
|
+
this.removeIconURL = 'assets/images/sprites/sprites.svg#icon-trailing';
|
|
54
|
+
this.clearAllIconURL = 'assets/images/sprites/sprites.svg#icon-clear-all';
|
|
55
|
+
/** Emits the trimmed typed term (debounced) so the parent can call the API. */
|
|
56
|
+
this.search = new EventEmitter();
|
|
57
|
+
/** Emits the current selection array whenever it changes. */
|
|
58
|
+
this.selectionChange = new EventEmitter();
|
|
59
|
+
/** Emitted when the field is blurred (parent can re-evaluate validation). */
|
|
60
|
+
this.fieldBlur = new EventEmitter();
|
|
61
|
+
/**
|
|
62
|
+
* Emits true when the input holds an uncommitted free-text token that fails
|
|
63
|
+
* validation (too short / too long / invalid pattern), and false when the
|
|
64
|
+
* input is empty or the token is valid. The parent uses this to keep the Save
|
|
65
|
+
* button disabled while an invalid token remains — otherwise a previously
|
|
66
|
+
* added valid chip would keep the parent control valid and let the form submit
|
|
67
|
+
* with an invalid token still in the input.
|
|
68
|
+
*/
|
|
69
|
+
this.invalidFreeText = new EventEmitter();
|
|
70
|
+
/** Tracks the last emitted invalid-token state to avoid duplicate emits. */
|
|
71
|
+
this.hasInvalidFreeText = false;
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
+
this.constants = screenTexts;
|
|
74
|
+
this.addUserRosterTexts = this.constants?.addUserRoster;
|
|
75
|
+
/** Whether the results dropdown is open. */
|
|
76
|
+
this.isDropdownOpen = false;
|
|
77
|
+
/** The current typed search text. */
|
|
78
|
+
this.searchText = '';
|
|
79
|
+
/** Inline validation message for the free-text (Enter) path. */
|
|
80
|
+
this.errorMessage = '';
|
|
81
|
+
/** Whether the field has been touched (to show required error after blur). */
|
|
82
|
+
this.isTouched = false;
|
|
83
|
+
/**
|
|
84
|
+
* Index of the keyboard-highlighted result row (-1 = none). Enables arrow-key
|
|
85
|
+
* navigation and Enter-to-toggle for keyboard users, mirroring the mat-option
|
|
86
|
+
* behavior this custom dropdown replaces.
|
|
87
|
+
*/
|
|
88
|
+
this.activeOptionIndex = -1;
|
|
89
|
+
/** Stable id prefix for option rows (used for aria-activedescendant). */
|
|
90
|
+
this.optionIdPrefix = 'ieeesa-org-option-';
|
|
91
|
+
this.destroy$ = new Subject();
|
|
92
|
+
this.debounceMs = 300;
|
|
93
|
+
this.minCharToSearch = 3;
|
|
94
|
+
this.separatorKeys = [ENTER, COMMA];
|
|
95
|
+
}
|
|
96
|
+
/** Search results supplied by the parent (repopulated on each search). */
|
|
97
|
+
set options(value) {
|
|
98
|
+
this._options = value ?? [];
|
|
99
|
+
// Reset keyboard highlight whenever the result set changes.
|
|
100
|
+
this.activeOptionIndex = -1;
|
|
101
|
+
// Open the dropdown as soon as fresh results arrive while the user is still
|
|
102
|
+
// typing/searching (has non-empty text). Closes when results are emptied.
|
|
103
|
+
this.isDropdownOpen =
|
|
104
|
+
this._options.length > 0 && this.searchText.trim().length > 0;
|
|
105
|
+
}
|
|
106
|
+
get options() {
|
|
107
|
+
return this._options;
|
|
108
|
+
}
|
|
109
|
+
/** Pre-selected options (edit prefill). Rendered as chips. */
|
|
110
|
+
set selectedOptions(value) {
|
|
111
|
+
this._selectedOptions = value ?? [];
|
|
112
|
+
}
|
|
113
|
+
get selectedOptions() {
|
|
114
|
+
return this._selectedOptions;
|
|
115
|
+
}
|
|
116
|
+
ngOnInit() {
|
|
117
|
+
// Fallback labels from the shared constants if inputs are not provided.
|
|
118
|
+
this.placeholder = this.placeholder ?? '';
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Handles typing in the search input: tracks the text, opens/closes the
|
|
122
|
+
* dropdown and debounces the search emit to the parent.
|
|
123
|
+
* @param {Event} event -input event.
|
|
124
|
+
* @memberof OrgMultiSelectComponent
|
|
125
|
+
*/
|
|
126
|
+
onInput(event) {
|
|
127
|
+
const value = event.target.value;
|
|
128
|
+
this.searchText = value;
|
|
129
|
+
this.errorMessage = '';
|
|
130
|
+
// Any non-empty, uncommitted text is a pending token — flag the field
|
|
131
|
+
// invalid so the parent disables Save until it is committed (Enter) or
|
|
132
|
+
// cleared. Cleared text resets the flag.
|
|
133
|
+
this.emitInvalidState(!!value.trim());
|
|
134
|
+
const trimmed = value.trim();
|
|
135
|
+
this.searchDebounce?.unsubscribe();
|
|
136
|
+
if (trimmed.length < this.minCharToSearch) {
|
|
137
|
+
this.options = [];
|
|
138
|
+
this.isDropdownOpen = false;
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.searchDebounce = timer(this.debounceMs).subscribe(() => {
|
|
142
|
+
this.search.emit(trimmed);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Emits the invalid-free-text state to the parent (deduped). True means an
|
|
147
|
+
* uncommitted token is present and Save should stay disabled.
|
|
148
|
+
* @param {boolean} isInvalid -whether an uncommitted token is present.
|
|
149
|
+
* @memberof OrgMultiSelectComponent
|
|
150
|
+
*/
|
|
151
|
+
emitInvalidState(isInvalid) {
|
|
152
|
+
if (this.hasInvalidFreeText !== isInvalid) {
|
|
153
|
+
this.hasInvalidFreeText = isInvalid;
|
|
154
|
+
this.invalidFreeText.emit(isInvalid);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Opens the dropdown on focus only when there are results AND the input still
|
|
159
|
+
* holds a valid search term (at or above minCharToSearch). This prevents
|
|
160
|
+
* re-opening stale results — e.g. a late API response that populated options
|
|
161
|
+
* after the input was cleared — when the user simply refocuses the field.
|
|
162
|
+
* @memberof OrgMultiSelectComponent
|
|
163
|
+
*/
|
|
164
|
+
onFocus() {
|
|
165
|
+
if (this.options?.length &&
|
|
166
|
+
this.searchText.trim().length >= this.minCharToSearch) {
|
|
167
|
+
this.isDropdownOpen = true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Called by the parent (via a setter re-assign) or internally after new
|
|
172
|
+
* options arrive so the dropdown opens to show them.
|
|
173
|
+
* @memberof OrgMultiSelectComponent
|
|
174
|
+
*/
|
|
175
|
+
showResults() {
|
|
176
|
+
this.isDropdownOpen = !!this.options?.length;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Handles keydown for the Enter/comma "add typed value" path.
|
|
180
|
+
* @param {KeyboardEvent} event -keyboard event.
|
|
181
|
+
* @memberof OrgMultiSelectComponent
|
|
182
|
+
*/
|
|
183
|
+
onKeydown(event) {
|
|
184
|
+
// Arrow keys move the highlight through the open results list (opening it
|
|
185
|
+
// first if there are results). This makes the custom dropdown operable by
|
|
186
|
+
// keyboard, matching the mat-option list it replaces.
|
|
187
|
+
if (event.keyCode === DOWN_ARROW || event.keyCode === UP_ARROW) {
|
|
188
|
+
if (!this.options?.length) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
event.preventDefault();
|
|
192
|
+
this.isDropdownOpen = true;
|
|
193
|
+
this.moveActiveOption(event.keyCode === DOWN_ARROW ? 1 : -1);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Escape closes the results without committing anything.
|
|
197
|
+
if (event.keyCode === ESCAPE) {
|
|
198
|
+
if (this.isDropdownOpen) {
|
|
199
|
+
event.preventDefault();
|
|
200
|
+
this.isDropdownOpen = false;
|
|
201
|
+
this.activeOptionIndex = -1;
|
|
202
|
+
}
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (!this.separatorKeys.includes(event.keyCode)) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
// Enter/comma: if a result row is highlighted, toggle that option (keyboard
|
|
210
|
+
// parity with clicking it). Otherwise fall back to adding the typed text as
|
|
211
|
+
// a free-text chip.
|
|
212
|
+
if (this.isDropdownOpen &&
|
|
213
|
+
this.activeOptionIndex >= 0 &&
|
|
214
|
+
this.activeOptionIndex < this.options.length) {
|
|
215
|
+
this.toggleOption(this.options[this.activeOptionIndex]);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
this.addTypedValue();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Moves the keyboard highlight up/down the results list, wrapping at the ends.
|
|
222
|
+
* @param {number} delta -+1 to move down, -1 to move up.
|
|
223
|
+
* @memberof OrgMultiSelectComponent
|
|
224
|
+
*/
|
|
225
|
+
moveActiveOption(delta) {
|
|
226
|
+
const count = this.options.length;
|
|
227
|
+
if (!count) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const next = this.activeOptionIndex + delta;
|
|
231
|
+
// Wrap around so the highlight cycles through the list.
|
|
232
|
+
this.activeOptionIndex = (next + count) % count;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Whether the given result index is the keyboard-highlighted row.
|
|
236
|
+
* @param {number} index -the option's index.
|
|
237
|
+
* @return {boolean}
|
|
238
|
+
* @memberof OrgMultiSelectComponent
|
|
239
|
+
*/
|
|
240
|
+
isActiveOption(index) {
|
|
241
|
+
return index === this.activeOptionIndex;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Adds the typed free-text value as a selection (chip) after validating its
|
|
245
|
+
* length and pattern (parity with the previous chip-input behavior).
|
|
246
|
+
* @memberof OrgMultiSelectComponent
|
|
247
|
+
*/
|
|
248
|
+
addTypedValue() {
|
|
249
|
+
const value = this.searchText.trim();
|
|
250
|
+
if (!value) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const validationError = this.validateFreeText(value);
|
|
254
|
+
if (validationError) {
|
|
255
|
+
this.errorMessage = validationError;
|
|
256
|
+
// Keep the field flagged invalid so the parent's Save button stays
|
|
257
|
+
// disabled even when a valid chip already exists — the uncommitted token
|
|
258
|
+
// is invalid and must be corrected or cleared before submitting.
|
|
259
|
+
this.emitInvalidState(true);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// Avoid duplicates (case-insensitive by name).
|
|
263
|
+
const exists = this._selectedOptions.some((option) => option.name?.toLowerCase() === value.toLowerCase());
|
|
264
|
+
if (!exists) {
|
|
265
|
+
this._selectedOptions = [
|
|
266
|
+
...this._selectedOptions,
|
|
267
|
+
{ id: '', name: value },
|
|
268
|
+
];
|
|
269
|
+
this.emitSelection();
|
|
270
|
+
}
|
|
271
|
+
// Token committed successfully — input is cleared, so the field is valid.
|
|
272
|
+
this.clearSearchText();
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Validates a free-text organization value against the shared min/max/pattern
|
|
276
|
+
* rules. Returns an error message when invalid, otherwise an empty string.
|
|
277
|
+
* @param {string} value -the typed value.
|
|
278
|
+
* @return {string}
|
|
279
|
+
* @memberof OrgMultiSelectComponent
|
|
280
|
+
*/
|
|
281
|
+
validateFreeText(value) {
|
|
282
|
+
const messages = this.addUserRosterTexts?.message?.error;
|
|
283
|
+
if (value.length < GroupsValidationPatterns.representingOrgNameMinLength) {
|
|
284
|
+
return messages?.limit?.representingOrganizationMinChars ?? '';
|
|
285
|
+
}
|
|
286
|
+
if (value.length > GroupsValidationPatterns.representingOrgNameMaxLength) {
|
|
287
|
+
return messages?.limit?.representingOrganizationMaxChars ?? '';
|
|
288
|
+
}
|
|
289
|
+
if (!GroupsValidationPatterns.representingOrganization.test(value)) {
|
|
290
|
+
return messages?.pattern?.representingOrganization ?? '';
|
|
291
|
+
}
|
|
292
|
+
return '';
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Toggles selection of a result option. Keeps the dropdown open and the typed
|
|
296
|
+
* text intact so the user can keep selecting.
|
|
297
|
+
* @param {SelectOption} option -the clicked result option.
|
|
298
|
+
* @memberof OrgMultiSelectComponent
|
|
299
|
+
*/
|
|
300
|
+
toggleOption(option) {
|
|
301
|
+
const index = this._selectedOptions.findIndex((item) => item.id === option.id && item.name === option.name);
|
|
302
|
+
if (index >= 0) {
|
|
303
|
+
this._selectedOptions = this._selectedOptions.filter((_, i) => i !== index);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
this._selectedOptions = [...this._selectedOptions, option];
|
|
307
|
+
}
|
|
308
|
+
this.emitSelection();
|
|
309
|
+
// Keep focus in the input so the user can continue typing/selecting.
|
|
310
|
+
this.searchInput?.nativeElement?.focus();
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Whether an option is currently selected (drives the checkbox checked state).
|
|
314
|
+
* @param {SelectOption} option -option to test.
|
|
315
|
+
* @return {boolean}
|
|
316
|
+
* @memberof OrgMultiSelectComponent
|
|
317
|
+
*/
|
|
318
|
+
isSelected(option) {
|
|
319
|
+
return this._selectedOptions.some((item) => item.id === option.id && item.name === option.name);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Removes a selected chip.
|
|
323
|
+
* @param {SelectOption} option -the option to remove.
|
|
324
|
+
* @memberof OrgMultiSelectComponent
|
|
325
|
+
*/
|
|
326
|
+
removeOption(option) {
|
|
327
|
+
this._selectedOptions = this._selectedOptions.filter((item) => !(item.id === option.id && item.name === option.name));
|
|
328
|
+
this.emitSelection();
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Clears all selected chips.
|
|
332
|
+
* @memberof OrgMultiSelectComponent
|
|
333
|
+
*/
|
|
334
|
+
clearAll() {
|
|
335
|
+
this._selectedOptions = [];
|
|
336
|
+
this.options = [];
|
|
337
|
+
this.isDropdownOpen = false;
|
|
338
|
+
this.emitSelection();
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Clears the leftover typed text on blur (old behavior) and closes the
|
|
342
|
+
* dropdown. Deferred so a click on a dropdown option (which also blurs the
|
|
343
|
+
* input) is handled first.
|
|
344
|
+
* @memberof OrgMultiSelectComponent
|
|
345
|
+
*/
|
|
346
|
+
onBlur() {
|
|
347
|
+
this.isTouched = true;
|
|
348
|
+
this.blurTimer?.unsubscribe();
|
|
349
|
+
this.blurTimer = timer(150).subscribe(() => {
|
|
350
|
+
// If focus moved into the dropdown (option click), the click handler
|
|
351
|
+
// re-focuses the input, so document.activeElement is the input again.
|
|
352
|
+
const active = document.activeElement;
|
|
353
|
+
if (active === this.searchInput?.nativeElement) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
this.clearSearchText();
|
|
357
|
+
this.isDropdownOpen = false;
|
|
358
|
+
this.fieldBlur.emit();
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Whether the required error should show (touched, no selection).
|
|
363
|
+
* @return {boolean}
|
|
364
|
+
* @memberof OrgMultiSelectComponent
|
|
365
|
+
*/
|
|
366
|
+
get showRequiredError() {
|
|
367
|
+
return (this.required && this.isTouched && this._selectedOptions.length === 0);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Clears the typed search text and hides the results.
|
|
371
|
+
* @memberof OrgMultiSelectComponent
|
|
372
|
+
*/
|
|
373
|
+
clearSearchText() {
|
|
374
|
+
// Cancel any pending debounced search so a blur/clear before the timer
|
|
375
|
+
// expires does not emit the now-cleared query to the parent.
|
|
376
|
+
this.searchDebounce?.unsubscribe();
|
|
377
|
+
this.searchDebounce = undefined;
|
|
378
|
+
this.searchText = '';
|
|
379
|
+
if (this.searchInput?.nativeElement) {
|
|
380
|
+
this.searchInput.nativeElement.value = '';
|
|
381
|
+
}
|
|
382
|
+
this.options = [];
|
|
383
|
+
this.errorMessage = '';
|
|
384
|
+
// No leftover text — the field is no longer holding an invalid token.
|
|
385
|
+
this.emitInvalidState(false);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Emits the current selection to the parent.
|
|
389
|
+
* @memberof OrgMultiSelectComponent
|
|
390
|
+
*/
|
|
391
|
+
emitSelection() {
|
|
392
|
+
this.selectionChange.emit(this._selectedOptions.map((option) => ({
|
|
393
|
+
id: option.id,
|
|
394
|
+
name: option.name,
|
|
395
|
+
})));
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* TrackBy for both result and chip lists.
|
|
399
|
+
* @param {number} index -list index.
|
|
400
|
+
* @param {SelectOption} option -the option.
|
|
401
|
+
* @return {(string | number)}
|
|
402
|
+
* @memberof OrgMultiSelectComponent
|
|
403
|
+
*/
|
|
404
|
+
trackByFn(index, option) {
|
|
405
|
+
return `${option.id}-${option.name}`;
|
|
406
|
+
}
|
|
407
|
+
ngOnDestroy() {
|
|
408
|
+
this.searchDebounce?.unsubscribe();
|
|
409
|
+
this.blurTimer?.unsubscribe();
|
|
410
|
+
this.destroy$.next(true);
|
|
411
|
+
this.destroy$.complete();
|
|
412
|
+
}
|
|
413
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrgMultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
414
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OrgMultiSelectComponent, isStandalone: true, selector: "ieeesa-org-multi-select", inputs: { label: "label", placeholder: "placeholder", supportMessage: "supportMessage", ariaLabel: "ariaLabel", options: "options", selectedOptions: "selectedOptions", required: "required", removeIconURL: "removeIconURL", clearAllIconURL: "clearAllIconURL" }, outputs: { search: "search", selectionChange: "selectionChange", fieldBlur: "fieldBlur", invalidFreeText: "invalidFreeText" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: "<div\r\n class=\"ieeesa-org-multi-select\"\r\n [class.ieeesa-org-multi-select--invalid]=\"showRequiredError || errorMessage\"\r\n>\r\n <label class=\"ieeesa-org-multi-select__label ieeesa-body-sm-14\">\r\n {{ label }}\r\n </label>\r\n\r\n <div class=\"ieeesa-org-multi-select__field\">\r\n <!--\r\n Chips and the search input flow together inline (like the Material\r\n chip-grid). This keeps a single-row field appearance that grows as chips\r\n wrap, with the clear-all button pinned to the right as a suffix.\r\n -->\r\n <div class=\"ieeesa-org-multi-select__control\">\r\n <span\r\n class=\"ieeesa-org-multi-select__chip\"\r\n *ngFor=\"let option of selectedOptions; trackBy: trackByFn\"\r\n [attr.aria-label]=\"option.name\"\r\n >\r\n <span class=\"ieeesa-org-multi-select__chip-label\">\r\n {{ option.name }}\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__chip-remove\"\r\n [attr.aria-label]=\"'Remove ' + option.name\"\r\n (click)=\"removeOption(option)\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__chip-remove-icon\"\r\n *ngIf=\"removeIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"removeIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!removeIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n </span>\r\n\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"ieeesa-org-multi-select__input ieeesa-title-sm-16\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-controls]=\"optionIdPrefix + 'listbox'\"\r\n [attr.aria-activedescendant]=\"\r\n isDropdownOpen && activeOptionIndex >= 0\r\n ? optionIdPrefix + activeOptionIndex\r\n : null\r\n \"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"searchText\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__clear-all\"\r\n [matTooltip]=\"'Clear all'\"\r\n aria-label=\"Clear all\"\r\n *ngIf=\"selectedOptions.length\"\r\n (click)=\"clearAll()\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__clear-all-icon\"\r\n *ngIf=\"clearAllIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"clearAllIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!clearAllIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n\r\n <!--\r\n Custom results dropdown. Fully owned (not mat-autocomplete) so a pick never\r\n closes the panel or overwrites the typed text. mousedown is prevented so\r\n clicking a row does not blur the input before the click registers.\r\n -->\r\n <div\r\n class=\"ieeesa-org-multi-select__dropdown\"\r\n role=\"listbox\"\r\n [id]=\"optionIdPrefix + 'listbox'\"\r\n aria-multiselectable=\"true\"\r\n *ngIf=\"isDropdownOpen && options.length\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n >\r\n <div\r\n class=\"ieeesa-org-multi-select__option\"\r\n role=\"option\"\r\n *ngFor=\"let option of options; let i = index; trackBy: trackByFn\"\r\n [id]=\"optionIdPrefix + i\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--active]=\"isActiveOption(i)\"\r\n (click)=\"toggleOption(option)\"\r\n (mouseenter)=\"activeOptionIndex = i\"\r\n >\r\n <mat-checkbox\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n (click)=\"$event.preventDefault()\"\r\n ></mat-checkbox>\r\n <span\r\n class=\"ieeesa-org-multi-select__option-label ieeesa-title-sm-16\"\r\n >\r\n {{ option.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Inline free-text validation error (Enter path) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"errorMessage\"\r\n >\r\n {{ errorMessage }}\r\n </p>\r\n\r\n <!-- Required error (touched, nothing selected) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"showRequiredError && !errorMessage\"\r\n >\r\n {{ addUserRosterTexts?.message?.error?.required }}\r\n </p>\r\n\r\n <!-- Support/help text -->\r\n <p\r\n class=\"ieeesa-org-multi-select__support ieeesa-body-sm-14\"\r\n *ngIf=\"supportMessage && !errorMessage && !showRequiredError\"\r\n >\r\n {{ supportMessage }}\r\n </p>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-org-multi-select{display:block;width:100%;position:relative;font-family:Calibri Regular}.ieeesa-org-multi-select__label,.ieeesa-org-multi-select__label.ieeesa-body-sm-14{display:block;margin-bottom:4px;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__field{display:flex;align-items:center;gap:8px;position:relative;background:#fff;border:1px solid #878b8f;border-radius:4px;padding:8px 12px;min-height:48px;transition:border-color .15s ease}.ieeesa-org-multi-select__field:focus-within{border:2px solid #00629b;padding:7px 11px}.ieeesa-org-multi-select__control{flex:1 1 auto;display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}.ieeesa-org-multi-select__chip{display:inline-flex;align-items:center;max-width:100%;padding:4px 8px;border:1px solid #79747e;border-radius:.25em;background-color:linear-gradient(0deg,rgba(0,98,155,.05) 0%,rgba(0,98,155,.05) 100%),#fffbfe}.ieeesa-org-multi-select__chip-label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#49454f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__chip-remove{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;margin-left:6px;color:#878b8f;font-size:16px;line-height:1}.ieeesa-org-multi-select__chip-remove-icon{height:18px;width:18px;fill:currentColor}.ieeesa-org-multi-select__input,.ieeesa-org-multi-select__input.ieeesa-title-sm-16{flex:1 1 120px;border:none;outline:none;background:transparent;min-width:120px;padding:4px 0;color:#1c1b1f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__input::placeholder,.ieeesa-org-multi-select__input.ieeesa-title-sm-16::placeholder{color:#63666a;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__clear-all{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;color:#878b8f}.ieeesa-org-multi-select__clear-all-icon{height:24px;width:24px;fill:currentColor}.ieeesa-org-multi-select__dropdown{position:absolute;left:0;right:0;top:calc(100% + 2px);z-index:1000;max-height:240px;overflow-y:auto;background:#fff;border:1px solid #878b8f;border-radius:4px;box-shadow:0 4px 12px #0000001f}.ieeesa-org-multi-select__option{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;font-family:Calibri Regular}.ieeesa-org-multi-select__option:hover,.ieeesa-org-multi-select__option--active{background:#fff}.ieeesa-org-multi-select__option--selected .ieeesa-org-multi-select__option-label{color:#00629b}.ieeesa-org-multi-select__option-label,.ieeesa-org-multi-select__option-label.ieeesa-title-sm-16{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#000;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__error,.ieeesa-org-multi-select__error.ieeesa-body-sm-14{margin:4px 0 0;color:#ba0c2f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__support,.ieeesa-org-multi-select__support.ieeesa-body-sm-14{margin:4px 0 0;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__label{color:#ba0c2f}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__field{border:2px solid #ba0c2f;padding:7px 11px}.ieeesa-org-multi-select .mdc-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background{background-color:#00629b;border-color:#00629b}@media (max-width: 767px){.ieeesa-org-multi-select__chip-label{max-width:120px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
415
|
+
}
|
|
416
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrgMultiSelectComponent, decorators: [{
|
|
417
|
+
type: Component,
|
|
418
|
+
args: [{ selector: 'ieeesa-org-multi-select', standalone: true, imports: [
|
|
419
|
+
CommonModule,
|
|
420
|
+
MatButtonModule,
|
|
421
|
+
MatCheckboxModule,
|
|
422
|
+
MatIconModule,
|
|
423
|
+
MatTooltipModule,
|
|
424
|
+
], encapsulation: ViewEncapsulation.None, template: "<div\r\n class=\"ieeesa-org-multi-select\"\r\n [class.ieeesa-org-multi-select--invalid]=\"showRequiredError || errorMessage\"\r\n>\r\n <label class=\"ieeesa-org-multi-select__label ieeesa-body-sm-14\">\r\n {{ label }}\r\n </label>\r\n\r\n <div class=\"ieeesa-org-multi-select__field\">\r\n <!--\r\n Chips and the search input flow together inline (like the Material\r\n chip-grid). This keeps a single-row field appearance that grows as chips\r\n wrap, with the clear-all button pinned to the right as a suffix.\r\n -->\r\n <div class=\"ieeesa-org-multi-select__control\">\r\n <span\r\n class=\"ieeesa-org-multi-select__chip\"\r\n *ngFor=\"let option of selectedOptions; trackBy: trackByFn\"\r\n [attr.aria-label]=\"option.name\"\r\n >\r\n <span class=\"ieeesa-org-multi-select__chip-label\">\r\n {{ option.name }}\r\n </span>\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__chip-remove\"\r\n [attr.aria-label]=\"'Remove ' + option.name\"\r\n (click)=\"removeOption(option)\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__chip-remove-icon\"\r\n *ngIf=\"removeIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"removeIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!removeIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n </span>\r\n\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"ieeesa-org-multi-select__input ieeesa-title-sm-16\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-controls]=\"optionIdPrefix + 'listbox'\"\r\n [attr.aria-activedescendant]=\"\r\n isDropdownOpen && activeOptionIndex >= 0\r\n ? optionIdPrefix + activeOptionIndex\r\n : null\r\n \"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"searchText\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ieeesa-org-multi-select__clear-all\"\r\n [matTooltip]=\"'Clear all'\"\r\n aria-label=\"Clear all\"\r\n *ngIf=\"selectedOptions.length\"\r\n (click)=\"clearAll()\"\r\n >\r\n <svg\r\n class=\"ieeesa-org-multi-select__clear-all-icon\"\r\n *ngIf=\"clearAllIconURL\"\r\n >\r\n <use [attr.xlink:href]=\"clearAllIconURL\"></use>\r\n </svg>\r\n <span *ngIf=\"!clearAllIconURL\" aria-hidden=\"true\">×</span>\r\n </button>\r\n\r\n <!--\r\n Custom results dropdown. Fully owned (not mat-autocomplete) so a pick never\r\n closes the panel or overwrites the typed text. mousedown is prevented so\r\n clicking a row does not blur the input before the click registers.\r\n -->\r\n <div\r\n class=\"ieeesa-org-multi-select__dropdown\"\r\n role=\"listbox\"\r\n [id]=\"optionIdPrefix + 'listbox'\"\r\n aria-multiselectable=\"true\"\r\n *ngIf=\"isDropdownOpen && options.length\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n >\r\n <div\r\n class=\"ieeesa-org-multi-select__option\"\r\n role=\"option\"\r\n *ngFor=\"let option of options; let i = index; trackBy: trackByFn\"\r\n [id]=\"optionIdPrefix + i\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--selected]=\"isSelected(option)\"\r\n [class.ieeesa-org-multi-select__option--active]=\"isActiveOption(i)\"\r\n (click)=\"toggleOption(option)\"\r\n (mouseenter)=\"activeOptionIndex = i\"\r\n >\r\n <mat-checkbox\r\n color=\"primary\"\r\n [checked]=\"isSelected(option)\"\r\n (click)=\"$event.preventDefault()\"\r\n ></mat-checkbox>\r\n <span\r\n class=\"ieeesa-org-multi-select__option-label ieeesa-title-sm-16\"\r\n >\r\n {{ option.name }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Inline free-text validation error (Enter path) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"errorMessage\"\r\n >\r\n {{ errorMessage }}\r\n </p>\r\n\r\n <!-- Required error (touched, nothing selected) -->\r\n <p\r\n class=\"ieeesa-org-multi-select__error ieeesa-body-sm-14\"\r\n *ngIf=\"showRequiredError && !errorMessage\"\r\n >\r\n {{ addUserRosterTexts?.message?.error?.required }}\r\n </p>\r\n\r\n <!-- Support/help text -->\r\n <p\r\n class=\"ieeesa-org-multi-select__support ieeesa-body-sm-14\"\r\n *ngIf=\"supportMessage && !errorMessage && !showRequiredError\"\r\n >\r\n {{ supportMessage }}\r\n </p>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-org-multi-select{display:block;width:100%;position:relative;font-family:Calibri Regular}.ieeesa-org-multi-select__label,.ieeesa-org-multi-select__label.ieeesa-body-sm-14{display:block;margin-bottom:4px;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__field{display:flex;align-items:center;gap:8px;position:relative;background:#fff;border:1px solid #878b8f;border-radius:4px;padding:8px 12px;min-height:48px;transition:border-color .15s ease}.ieeesa-org-multi-select__field:focus-within{border:2px solid #00629b;padding:7px 11px}.ieeesa-org-multi-select__control{flex:1 1 auto;display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}.ieeesa-org-multi-select__chip{display:inline-flex;align-items:center;max-width:100%;padding:4px 8px;border:1px solid #79747e;border-radius:.25em;background-color:linear-gradient(0deg,rgba(0,98,155,.05) 0%,rgba(0,98,155,.05) 100%),#fffbfe}.ieeesa-org-multi-select__chip-label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#49454f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__chip-remove{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;margin-left:6px;color:#878b8f;font-size:16px;line-height:1}.ieeesa-org-multi-select__chip-remove-icon{height:18px;width:18px;fill:currentColor}.ieeesa-org-multi-select__input,.ieeesa-org-multi-select__input.ieeesa-title-sm-16{flex:1 1 120px;border:none;outline:none;background:transparent;min-width:120px;padding:4px 0;color:#1c1b1f;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__input::placeholder,.ieeesa-org-multi-select__input.ieeesa-title-sm-16::placeholder{color:#63666a;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__clear-all{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0;color:#878b8f}.ieeesa-org-multi-select__clear-all-icon{height:24px;width:24px;fill:currentColor}.ieeesa-org-multi-select__dropdown{position:absolute;left:0;right:0;top:calc(100% + 2px);z-index:1000;max-height:240px;overflow-y:auto;background:#fff;border:1px solid #878b8f;border-radius:4px;box-shadow:0 4px 12px #0000001f}.ieeesa-org-multi-select__option{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;font-family:Calibri Regular}.ieeesa-org-multi-select__option:hover,.ieeesa-org-multi-select__option--active{background:#fff}.ieeesa-org-multi-select__option--selected .ieeesa-org-multi-select__option-label{color:#00629b}.ieeesa-org-multi-select__option-label,.ieeesa-org-multi-select__option-label.ieeesa-title-sm-16{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#000;font-family:Calibri Regular;font-size:1rem}.ieeesa-org-multi-select__error,.ieeesa-org-multi-select__error.ieeesa-body-sm-14{margin:4px 0 0;color:#ba0c2f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select__support,.ieeesa-org-multi-select__support.ieeesa-body-sm-14{margin:4px 0 0;color:#49454f;font-family:Calibri Regular;font-size:.75rem}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__label{color:#ba0c2f}.ieeesa-org-multi-select--invalid .ieeesa-org-multi-select__field{border:2px solid #ba0c2f;padding:7px 11px}.ieeesa-org-multi-select .mdc-checkbox .mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background{background-color:#00629b;border-color:#00629b}@media (max-width: 767px){.ieeesa-org-multi-select__chip-label{max-width:120px}}\n"] }]
|
|
425
|
+
}], propDecorators: { label: [{
|
|
426
|
+
type: Input
|
|
427
|
+
}], placeholder: [{
|
|
428
|
+
type: Input
|
|
429
|
+
}], supportMessage: [{
|
|
430
|
+
type: Input
|
|
431
|
+
}], ariaLabel: [{
|
|
432
|
+
type: Input
|
|
433
|
+
}], options: [{
|
|
434
|
+
type: Input
|
|
435
|
+
}], selectedOptions: [{
|
|
436
|
+
type: Input
|
|
437
|
+
}], required: [{
|
|
438
|
+
type: Input
|
|
439
|
+
}], removeIconURL: [{
|
|
440
|
+
type: Input
|
|
441
|
+
}], clearAllIconURL: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], search: [{
|
|
444
|
+
type: Output
|
|
445
|
+
}], selectionChange: [{
|
|
446
|
+
type: Output
|
|
447
|
+
}], fieldBlur: [{
|
|
448
|
+
type: Output
|
|
449
|
+
}], invalidFreeText: [{
|
|
450
|
+
type: Output
|
|
451
|
+
}], searchInput: [{
|
|
452
|
+
type: ViewChild,
|
|
453
|
+
args: ['searchInput']
|
|
454
|
+
}] } });
|
|
455
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLW11bHRpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL29yZy1tdWx0aS1zZWxlY3Qvb3JnLW11bHRpLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL29yZy1tdWx0aS1zZWxlY3Qvb3JnLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFnQixLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEQsT0FBTyxLQUFLLFdBQVcsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFlSCxNQUFNLE9BQU8sdUJBQXVCO0lBZHBD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ekZJLFlBQVksK1BBQ1osZUFBZSw4QkFDZixpQkFBaUIsZ0xBQ2pCLGFBQWEsOEJBQ2IsZ0JBQWdCOzs0RkFNUCx1QkFBdUI7a0JBZG5DLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixhQUFhO3dCQUNiLGdCQUFnQjtxQkFDakIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSTs4QkFJNUIsS0FBSztzQkFBYixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdPLE9BQU87c0JBQW5CLEtBQUs7Z0JBZU8sZUFBZTtzQkFBM0IsS0FBSztnQkFTRyxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFJSSxNQUFNO3NCQUFmLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNO2dCQVVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBS21CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ09NTUEsXHJcbiAgRE9XTl9BUlJPVyxcclxuICBFTlRFUixcclxuICBFU0NBUEUsXHJcbiAgVVBfQVJST1csXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2VsZWN0T3B0aW9uIH0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0ICogYXMgc2NyZWVuVGV4dHMgZnJvbSAnLi4vLi4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgR3JvdXBzVmFsaWRhdGlvblBhdHRlcm5zIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2Zvcm0tdmFsaWRhdGlvbnMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc2VsZi1jb250YWluZWQgbXVsdGktc2VsZWN0IG9yZ2FuaXphdGlvbiBmaWVsZCB1c2VkIGluc2lkZSB0aGUgQWRkL0VkaXRcclxuICogcm9zdGVyIHBvcHVwcy5cclxuICpcclxuICogSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCByZXVzZSB0aGUgc2hhcmVkIE11bHRpU2VsZWN0QXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAqICh3aGljaCBpcyBidWlsdCBvbiBtYXQtYXV0b2NvbXBsZXRlKS4gTWF0ZXJpYWwncyBhdXRvY29tcGxldGUgY2xvc2VzIGl0cyBwYW5lbFxyXG4gKiBhbmQgb3ZlcndyaXRlcyB0aGUgaW5wdXQgb24gZXZlcnkgb3B0aW9uIHBpY2ssIHdoaWNoIG1hZGUgbXVsdGktc2VsZWN0aW9uXHJcbiAqIGZlZWwgc2luZ2xlLXNlbGVjdCBhbmQgY2xlYXJlZCB0aGUgdXNlcidzIHR5cGVkIHRleHQuIFRoaXMgY29tcG9uZW50IHVzZXMgYVxyXG4gKiBmdWxseS1vd25lZCBjdXN0b20gZHJvcGRvd24gKDxkaXY+ICsgY2hlY2tib3hlcykgc286XHJcbiAqICAtIHRoZSBwYW5lbCBzdGF5cyBvcGVuIHdoaWxlIHRoZSB1c2VyIHRpY2tzIHNldmVyYWwgcmVzdWx0cyxcclxuICogIC0gdGhlIHR5cGVkIHNlYXJjaCB0ZXh0IGlzIG5ldmVyIG92ZXJ3cml0dGVuIGJ5IGEgcGljayxcclxuICogIC0gcHJlc3NpbmcgRW50ZXIgYWRkcyB0aGUgdHlwZWQgdmFsdWUgYXMgYSBmcmVlLXRleHQgY2hpcCxcclxuICogIC0gY2xpY2tpbmcgb3V0c2lkZSBjbGVhcnMgYW55IGxlZnRvdmVyIHR5cGVkIHRleHQgKG9sZCBiZWhhdmlvciksXHJcbiAqICAtIHNlbGVjdGVkIHZhbHVlcyByZW5kZXIgYXMgcmVtb3ZhYmxlIGNoaXBzIChvbGQgYmVoYXZpb3IpLlxyXG4gKlxyXG4gKiBUaGUgcGFyZW50IHN1cHBsaWVzIHNlYXJjaCByZXN1bHRzIHZpYSB7QGxpbmsgb3B0aW9uc30gYW5kIHJlYWN0cyB0b1xyXG4gKiB7QGxpbmsgc2VhcmNofSAoZGVib3VuY2VkIHR5cGVkIHRlcm0pIGFuZCB7QGxpbmsgc2VsZWN0aW9uQ2hhbmdlfS5cclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3QnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmctbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9vcmctbXVsdGktc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBGaWVsZCBsYWJlbCAoZS5nLiBcIlJlcHJlc2VudGluZyBPcmdhbml6YXRpb24gKlwiKS4gKi9cclxuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xyXG5cclxuICAvKiogUGxhY2Vob2xkZXIgZm9yIHRoZSBpbnB1dC4gKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG5cclxuICAvKiogU3VwcG9ydC9oZWxwIHRleHQgc2hvd24gYmVsb3cgdGhlIGZpZWxkLiAqL1xyXG4gIEBJbnB1dCgpIHN1cHBvcnRNZXNzYWdlID0gJyc7XHJcblxyXG4gIC8qKiBhcmlhLWxhYmVsIGZvciB0aGUgaW5wdXQuICovXHJcbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJyc7XHJcblxyXG4gIC8qKiBTZWFyY2ggcmVzdWx0cyBzdXBwbGllZCBieSB0aGUgcGFyZW50IChyZXBvcHVsYXRlZCBvbiBlYWNoIHNlYXJjaCkuICovXHJcbiAgQElucHV0KCkgc2V0IG9wdGlvbnModmFsdWU6IFNlbGVjdE9wdGlvbltdKSB7XHJcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWUgPz8gW107XHJcbiAgICAvLyBSZXNldCBrZXlib2FyZCBoaWdobGlnaHQgd2hlbmV2ZXIgdGhlIHJlc3VsdCBzZXQgY2hhbmdlcy5cclxuICAgIHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggPSAtMTtcclxuICAgIC8vIE9wZW4gdGhlIGRyb3Bkb3duIGFzIHNvb24gYXMgZnJlc2ggcmVzdWx0cyBhcnJpdmUgd2hpbGUgdGhlIHVzZXIgaXMgc3RpbGxcclxuICAgIC8vIHR5cGluZy9zZWFyY2hpbmcgKGhhcyBub24tZW1wdHkgdGV4dCkuIENsb3NlcyB3aGVuIHJlc3VsdHMgYXJlIGVtcHRpZWQuXHJcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID1cclxuICAgICAgdGhpcy5fb3B0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuc2VhcmNoVGV4dC50cmltKCkubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgZ2V0IG9wdGlvbnMoKTogU2VsZWN0T3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX29wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XHJcblxyXG4gIC8qKiBQcmUtc2VsZWN0ZWQgb3B0aW9ucyAoZWRpdCBwcmVmaWxsKS4gUmVuZGVyZWQgYXMgY2hpcHMuICovXHJcbiAgQElucHV0KCkgc2V0IHNlbGVjdGVkT3B0aW9ucyh2YWx1ZTogU2VsZWN0T3B0aW9uW10pIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucyA9IHZhbHVlID8/IFtdO1xyXG4gIH1cclxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCk6IFNlbGVjdE9wdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZE9wdGlvbnM7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NlbGVjdGVkT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqIE1hcmtzIHRoZSBmaWVsZCByZXF1aXJlZCAoZHJpdmVzIHRoZSByZXF1aXJlZCBtZXNzYWdlICsgZXJyb3IgYm9yZGVyKS4gKi9cclxuICBASW5wdXQoKSByZXF1aXJlZCA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEljb24gVVJMcyAoc2FtZSBzcHJpdGUgcmVmcyB0aGUgc2hhcmVkIG11bHRpLXNlbGVjdCBmaWVsZCB1c2VkKS4gRGVmYXVsdGVkXHJcbiAgICogc28gdGhlIHBvcHVwcyBkb24ndCBuZWVkIHRvIHBhc3MgdGhlbTsgb3ZlcnJpZGFibGUgdmlhIGlucHV0IGlmIG5lZWRlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSByZW1vdmVJY29uVVJMID0gJ2Fzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLXRyYWlsaW5nJztcclxuICBASW5wdXQoKSBjbGVhckFsbEljb25VUkwgPVxyXG4gICAgJ2Fzc2V0cy9pbWFnZXMvc3ByaXRlcy9zcHJpdGVzLnN2ZyNpY29uLWNsZWFyLWFsbCc7XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgdHJpbW1lZCB0eXBlZCB0ZXJtIChkZWJvdW5jZWQpIHNvIHRoZSBwYXJlbnQgY2FuIGNhbGwgdGhlIEFQSS4gKi9cclxuICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYXJyYXkgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RPcHRpb25bXT4oKTtcclxuXHJcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZmllbGQgaXMgYmx1cnJlZCAocGFyZW50IGNhbiByZS1ldmFsdWF0ZSB2YWxpZGF0aW9uKS4gKi9cclxuICBAT3V0cHV0KCkgZmllbGRCbHVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB0cnVlIHdoZW4gdGhlIGlucHV0IGhvbGRzIGFuIHVuY29tbWl0dGVkIGZyZWUtdGV4dCB0b2tlbiB0aGF0IGZhaWxzXHJcbiAgICogdmFsaWRhdGlvbiAodG9vIHNob3J0IC8gdG9vIGxvbmcgLyBpbnZhbGlkIHBhdHRlcm4pLCBhbmQgZmFsc2Ugd2hlbiB0aGVcclxuICAgKiBpbnB1dCBpcyBlbXB0eSBvciB0aGUgdG9rZW4gaXMgdmFsaWQuIFRoZSBwYXJlbnQgdXNlcyB0aGlzIHRvIGtlZXAgdGhlIFNhdmVcclxuICAgKiBidXR0b24gZGlzYWJsZWQgd2hpbGUgYW4gaW52YWxpZCB0b2tlbiByZW1haW5zIOKAlCBvdGhlcndpc2UgYSBwcmV2aW91c2x5XHJcbiAgICogYWRkZWQgdmFsaWQgY2hpcCB3b3VsZCBrZWVwIHRoZSBwYXJlbnQgY29udHJvbCB2YWxpZCBhbmQgbGV0IHRoZSBmb3JtIHN1Ym1pdFxyXG4gICAqIHdpdGggYW4gaW52YWxpZCB0b2tlbiBzdGlsbCBpbiB0aGUgaW5wdXQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGludmFsaWRGcmVlVGV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLyoqIFRyYWNrcyB0aGUgbGFzdCBlbWl0dGVkIGludmFsaWQtdG9rZW4gc3RhdGUgdG8gYXZvaWQgZHVwbGljYXRlIGVtaXRzLiAqL1xyXG4gIHByaXZhdGUgaGFzSW52YWxpZEZyZWVUZXh0ID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0Jykgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNvbnN0YW50czogYW55ID0gc2NyZWVuVGV4dHM7XHJcbiAgYWRkVXNlclJvc3RlclRleHRzID0gdGhpcy5jb25zdGFudHM/LmFkZFVzZXJSb3N0ZXI7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSByZXN1bHRzIGRyb3Bkb3duIGlzIG9wZW4uICovXHJcbiAgaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IHR5cGVkIHNlYXJjaCB0ZXh0LiAqL1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuXHJcbiAgLyoqIElubGluZSB2YWxpZGF0aW9uIG1lc3NhZ2UgZm9yIHRoZSBmcmVlLXRleHQgKEVudGVyKSBwYXRoLiAqL1xyXG4gIGVycm9yTWVzc2FnZSA9ICcnO1xyXG5cclxuICAvKiogV2hldGhlciB0aGUgZmllbGQgaGFzIGJlZW4gdG91Y2hlZCAodG8gc2hvdyByZXF1aXJlZCBlcnJvciBhZnRlciBibHVyKS4gKi9cclxuICBpc1RvdWNoZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kZXggb2YgdGhlIGtleWJvYXJkLWhpZ2hsaWdodGVkIHJlc3VsdCByb3cgKC0xID0gbm9uZSkuIEVuYWJsZXMgYXJyb3cta2V5XHJcbiAgICogbmF2aWdhdGlvbiBhbmQgRW50ZXItdG8tdG9nZ2xlIGZvciBrZXlib2FyZCB1c2VycywgbWlycm9yaW5nIHRoZSBtYXQtb3B0aW9uXHJcbiAgICogYmVoYXZpb3IgdGhpcyBjdXN0b20gZHJvcGRvd24gcmVwbGFjZXMuXHJcbiAgICovXHJcbiAgYWN0aXZlT3B0aW9uSW5kZXggPSAtMTtcclxuXHJcbiAgLyoqIFN0YWJsZSBpZCBwcmVmaXggZm9yIG9wdGlvbiByb3dzICh1c2VkIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpLiAqL1xyXG4gIHJlYWRvbmx5IG9wdGlvbklkUHJlZml4ID0gJ2llZWVzYS1vcmctb3B0aW9uLSc7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHByaXZhdGUgc2VhcmNoRGVib3VuY2U/OiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBibHVyVGltZXI/OiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJvdW5jZU1zID0gMzAwO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbWluQ2hhclRvU2VhcmNoID0gMztcclxuXHJcbiAgcHJpdmF0ZSBzZXBhcmF0b3JLZXlzID0gW0VOVEVSLCBDT01NQV07XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gRmFsbGJhY2sgbGFiZWxzIGZyb20gdGhlIHNoYXJlZCBjb25zdGFudHMgaWYgaW5wdXRzIGFyZSBub3QgcHJvdmlkZWQuXHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlciA/PyAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgdHlwaW5nIGluIHRoZSBzZWFyY2ggaW5wdXQ6IHRyYWNrcyB0aGUgdGV4dCwgb3BlbnMvY2xvc2VzIHRoZVxyXG4gICAqIGRyb3Bkb3duIGFuZCBkZWJvdW5jZXMgdGhlIHNlYXJjaCBlbWl0IHRvIHRoZSBwYXJlbnQuXHJcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLWlucHV0IGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB2YWx1ZTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICAvLyBBbnkgbm9uLWVtcHR5LCB1bmNvbW1pdHRlZCB0ZXh0IGlzIGEgcGVuZGluZyB0b2tlbiDigJQgZmxhZyB0aGUgZmllbGRcclxuICAgIC8vIGludmFsaWQgc28gdGhlIHBhcmVudCBkaXNhYmxlcyBTYXZlIHVudGlsIGl0IGlzIGNvbW1pdHRlZCAoRW50ZXIpIG9yXHJcbiAgICAvLyBjbGVhcmVkLiBDbGVhcmVkIHRleHQgcmVzZXRzIHRoZSBmbGFnLlxyXG4gICAgdGhpcy5lbWl0SW52YWxpZFN0YXRlKCEhdmFsdWUudHJpbSgpKTtcclxuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XHJcbiAgICB0aGlzLnNlYXJjaERlYm91bmNlPy51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRyaW1tZWQubGVuZ3RoIDwgdGhpcy5taW5DaGFyVG9TZWFyY2gpIHtcclxuICAgICAgdGhpcy5vcHRpb25zID0gW107XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWFyY2hEZWJvdW5jZSA9IHRpbWVyKHRoaXMuZGVib3VuY2VNcykuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5zZWFyY2guZW1pdCh0cmltbWVkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgdGhlIGludmFsaWQtZnJlZS10ZXh0IHN0YXRlIHRvIHRoZSBwYXJlbnQgKGRlZHVwZWQpLiBUcnVlIG1lYW5zIGFuXHJcbiAgICogdW5jb21taXR0ZWQgdG9rZW4gaXMgcHJlc2VudCBhbmQgU2F2ZSBzaG91bGQgc3RheSBkaXNhYmxlZC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzSW52YWxpZCAtd2hldGhlciBhbiB1bmNvbW1pdHRlZCB0b2tlbiBpcyBwcmVzZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW1pdEludmFsaWRTdGF0ZShpc0ludmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhhc0ludmFsaWRGcmVlVGV4dCAhPT0gaXNJbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuaGFzSW52YWxpZEZyZWVUZXh0ID0gaXNJbnZhbGlkO1xyXG4gICAgICB0aGlzLmludmFsaWRGcmVlVGV4dC5lbWl0KGlzSW52YWxpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgZHJvcGRvd24gb24gZm9jdXMgb25seSB3aGVuIHRoZXJlIGFyZSByZXN1bHRzIEFORCB0aGUgaW5wdXQgc3RpbGxcclxuICAgKiBob2xkcyBhIHZhbGlkIHNlYXJjaCB0ZXJtIChhdCBvciBhYm92ZSBtaW5DaGFyVG9TZWFyY2gpLiBUaGlzIHByZXZlbnRzXHJcbiAgICogcmUtb3BlbmluZyBzdGFsZSByZXN1bHRzIOKAlCBlLmcuIGEgbGF0ZSBBUEkgcmVzcG9uc2UgdGhhdCBwb3B1bGF0ZWQgb3B0aW9uc1xyXG4gICAqIGFmdGVyIHRoZSBpbnB1dCB3YXMgY2xlYXJlZCDigJQgd2hlbiB0aGUgdXNlciBzaW1wbHkgcmVmb2N1c2VzIHRoZSBmaWVsZC5cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnM/Lmxlbmd0aCAmJlxyXG4gICAgICB0aGlzLnNlYXJjaFRleHQudHJpbSgpLmxlbmd0aCA+PSB0aGlzLm1pbkNoYXJUb1NlYXJjaFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIGJ5IHRoZSBwYXJlbnQgKHZpYSBhIHNldHRlciByZS1hc3NpZ24pIG9yIGludGVybmFsbHkgYWZ0ZXIgbmV3XHJcbiAgICogb3B0aW9ucyBhcnJpdmUgc28gdGhlIGRyb3Bkb3duIG9wZW5zIHRvIHNob3cgdGhlbS5cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBzaG93UmVzdWx0cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhIXRoaXMub3B0aW9ucz8ubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBrZXlkb3duIGZvciB0aGUgRW50ZXIvY29tbWEgXCJhZGQgdHlwZWQgdmFsdWVcIiBwYXRoLlxyXG4gICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLWtleWJvYXJkIGV2ZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gQXJyb3cga2V5cyBtb3ZlIHRoZSBoaWdobGlnaHQgdGhyb3VnaCB0aGUgb3BlbiByZXN1bHRzIGxpc3QgKG9wZW5pbmcgaXRcclxuICAgIC8vIGZpcnN0IGlmIHRoZXJlIGFyZSByZXN1bHRzKS4gVGhpcyBtYWtlcyB0aGUgY3VzdG9tIGRyb3Bkb3duIG9wZXJhYmxlIGJ5XHJcbiAgICAvLyBrZXlib2FyZCwgbWF0Y2hpbmcgdGhlIG1hdC1vcHRpb24gbGlzdCBpdCByZXBsYWNlcy5cclxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBET1dOX0FSUk9XIHx8IGV2ZW50LmtleUNvZGUgPT09IFVQX0FSUk9XKSB7XHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IHRydWU7XHJcbiAgICAgIHRoaXMubW92ZUFjdGl2ZU9wdGlvbihldmVudC5rZXlDb2RlID09PSBET1dOX0FSUk9XID8gMSA6IC0xKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVzY2FwZSBjbG9zZXMgdGhlIHJlc3VsdHMgd2l0aG91dCBjb21taXR0aW5nIGFueXRoaW5nLlxyXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSkge1xyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duT3Blbikge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggPSAtMTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlcGFyYXRvcktleXMuaW5jbHVkZXMoZXZlbnQua2V5Q29kZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIC8vIEVudGVyL2NvbW1hOiBpZiBhIHJlc3VsdCByb3cgaXMgaGlnaGxpZ2h0ZWQsIHRvZ2dsZSB0aGF0IG9wdGlvbiAoa2V5Ym9hcmRcclxuICAgIC8vIHBhcml0eSB3aXRoIGNsaWNraW5nIGl0KS4gT3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhZGRpbmcgdGhlIHR5cGVkIHRleHQgYXNcclxuICAgIC8vIGEgZnJlZS10ZXh0IGNoaXAuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gJiZcclxuICAgICAgdGhpcy5hY3RpdmVPcHRpb25JbmRleCA+PSAwICYmXHJcbiAgICAgIHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggPCB0aGlzLm9wdGlvbnMubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgdGhpcy50b2dnbGVPcHRpb24odGhpcy5vcHRpb25zW3RoaXMuYWN0aXZlT3B0aW9uSW5kZXhdKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZGRUeXBlZFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb3ZlcyB0aGUga2V5Ym9hcmQgaGlnaGxpZ2h0IHVwL2Rvd24gdGhlIHJlc3VsdHMgbGlzdCwgd3JhcHBpbmcgYXQgdGhlIGVuZHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0rMSB0byBtb3ZlIGRvd24sIC0xIHRvIG1vdmUgdXAuXHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtb3ZlQWN0aXZlT3B0aW9uKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5vcHRpb25zLmxlbmd0aDtcclxuICAgIGlmICghY291bnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuYWN0aXZlT3B0aW9uSW5kZXggKyBkZWx0YTtcclxuICAgIC8vIFdyYXAgYXJvdW5kIHNvIHRoZSBoaWdobGlnaHQgY3ljbGVzIHRocm91Z2ggdGhlIGxpc3QuXHJcbiAgICB0aGlzLmFjdGl2ZU9wdGlvbkluZGV4ID0gKG5leHQgKyBjb3VudCkgJSBjb3VudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGdpdmVuIHJlc3VsdCBpbmRleCBpcyB0aGUga2V5Ym9hcmQtaGlnaGxpZ2h0ZWQgcm93LlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtdGhlIG9wdGlvbidzIGluZGV4LlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgaXNBY3RpdmVPcHRpb24oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGluZGV4ID09PSB0aGlzLmFjdGl2ZU9wdGlvbkluZGV4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyB0aGUgdHlwZWQgZnJlZS10ZXh0IHZhbHVlIGFzIGEgc2VsZWN0aW9uIChjaGlwKSBhZnRlciB2YWxpZGF0aW5nIGl0c1xyXG4gICAqIGxlbmd0aCBhbmQgcGF0dGVybiAocGFyaXR5IHdpdGggdGhlIHByZXZpb3VzIGNoaXAtaW5wdXQgYmVoYXZpb3IpLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGFkZFR5cGVkVmFsdWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VhcmNoVGV4dC50cmltKCk7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHRoaXMudmFsaWRhdGVGcmVlVGV4dCh2YWx1ZSk7XHJcbiAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdmFsaWRhdGlvbkVycm9yO1xyXG4gICAgICAvLyBLZWVwIHRoZSBmaWVsZCBmbGFnZ2VkIGludmFsaWQgc28gdGhlIHBhcmVudCdzIFNhdmUgYnV0dG9uIHN0YXlzXHJcbiAgICAgIC8vIGRpc2FibGVkIGV2ZW4gd2hlbiBhIHZhbGlkIGNoaXAgYWxyZWFkeSBleGlzdHMg4oCUIHRoZSB1bmNvbW1pdHRlZCB0b2tlblxyXG4gICAgICAvLyBpcyBpbnZhbGlkIGFuZCBtdXN0IGJlIGNvcnJlY3RlZCBvciBjbGVhcmVkIGJlZm9yZSBzdWJtaXR0aW5nLlxyXG4gICAgICB0aGlzLmVtaXRJbnZhbGlkU3RhdGUodHJ1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEF2b2lkIGR1cGxpY2F0ZXMgKGNhc2UtaW5zZW5zaXRpdmUgYnkgbmFtZSkuXHJcbiAgICBjb25zdCBleGlzdHMgPSB0aGlzLl9zZWxlY3RlZE9wdGlvbnMuc29tZShcclxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlLnRvTG93ZXJDYXNlKClcclxuICAgICk7XHJcbiAgICBpZiAoIWV4aXN0cykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZE9wdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5fc2VsZWN0ZWRPcHRpb25zLFxyXG4gICAgICAgIHsgaWQ6ICcnLCBuYW1lOiB2YWx1ZSB9LFxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuICAgIC8vIFRva2VuIGNvbW1pdHRlZCBzdWNjZXNzZnVsbHkg4oCUIGlucHV0IGlzIGNsZWFyZWQsIHNvIHRoZSBmaWVsZCBpcyB2YWxpZC5cclxuICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgYSBmcmVlLXRleHQgb3JnYW5pemF0aW9uIHZhbHVlIGFnYWluc3QgdGhlIHNoYXJlZCBtaW4vbWF4L3BhdHRlcm5cclxuICAgKiBydWxlcy4gUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gaW52YWxpZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLXRoZSB0eXBlZCB2YWx1ZS5cclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgdmFsaWRhdGVGcmVlVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5hZGRVc2VyUm9zdGVyVGV4dHM/Lm1lc3NhZ2U/LmVycm9yO1xyXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8IEdyb3Vwc1ZhbGlkYXRpb25QYXR0ZXJucy5yZXByZXNlbnRpbmdPcmdOYW1lTWluTGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBtZXNzYWdlcz8ubGltaXQ/LnJlcHJlc2VudGluZ09yZ2FuaXphdGlvbk1pbkNoYXJzID8/ICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IEdyb3Vwc1ZhbGlkYXRpb25QYXR0ZXJucy5yZXByZXNlbnRpbmdPcmdOYW1lTWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBtZXNzYWdlcz8ubGltaXQ/LnJlcHJlc2VudGluZ09yZ2FuaXphdGlvbk1heENoYXJzID8/ICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKCFHcm91cHNWYWxpZGF0aW9uUGF0dGVybnMucmVwcmVzZW50aW5nT3JnYW5pemF0aW9uLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBtZXNzYWdlcz8ucGF0dGVybj8ucmVwcmVzZW50aW5nT3JnYW5pemF0aW9uID8/ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlcyBzZWxlY3Rpb24gb2YgYSByZXN1bHQgb3B0aW9uLiBLZWVwcyB0aGUgZHJvcGRvd24gb3BlbiBhbmQgdGhlIHR5cGVkXHJcbiAgICogdGV4dCBpbnRhY3Qgc28gdGhlIHVzZXIgY2FuIGtlZXAgc2VsZWN0aW5nLlxyXG4gICAqIEBwYXJhbSB7U2VsZWN0T3B0aW9ufSBvcHRpb24gLXRoZSBjbGlja2VkIHJlc3VsdCBvcHRpb24uXHJcbiAgICogQG1lbWJlcm9mIE9yZ011bHRpU2VsZWN0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgdG9nZ2xlT3B0aW9uKG9wdGlvbjogU2VsZWN0T3B0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5maW5kSW5kZXgoXHJcbiAgICAgIChpdGVtKSA9PiBpdGVtLmlkID09PSBvcHRpb24uaWQgJiYgaXRlbS5uYW1lID09PSBvcHRpb24ubmFtZVxyXG4gICAgKTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucyA9IHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgKF8sIGkpID0+IGkgIT09IGluZGV4XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZE9wdGlvbnMgPSBbLi4udGhpcy5fc2VsZWN0ZWRPcHRpb25zLCBvcHRpb25dO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XHJcbiAgICAvLyBLZWVwIGZvY3VzIGluIHRoZSBpbnB1dCBzbyB0aGUgdXNlciBjYW4gY29udGludWUgdHlwaW5nL3NlbGVjdGluZy5cclxuICAgIHRoaXMuc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIGFuIG9wdGlvbiBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgKGRyaXZlcyB0aGUgY2hlY2tib3ggY2hlY2tlZCBzdGF0ZSkuXHJcbiAgICogQHBhcmFtIHtTZWxlY3RPcHRpb259IG9wdGlvbiAtb3B0aW9uIHRvIHRlc3QuXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBpc1NlbGVjdGVkKG9wdGlvbjogU2VsZWN0T3B0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRPcHRpb25zLnNvbWUoXHJcbiAgICAgIChpdGVtKSA9PiBpdGVtLmlkID09PSBvcHRpb24uaWQgJiYgaXRlbS5uYW1lID09PSBvcHRpb24ubmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYSBzZWxlY3RlZCBjaGlwLlxyXG4gICAqIEBwYXJhbSB7U2VsZWN0T3B0aW9ufSBvcHRpb24gLXRoZSBvcHRpb24gdG8gcmVtb3ZlLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHJlbW92ZU9wdGlvbihvcHRpb246IFNlbGVjdE9wdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5fc2VsZWN0ZWRPcHRpb25zLmZpbHRlcihcclxuICAgICAgKGl0ZW0pID0+ICEoaXRlbS5pZCA9PT0gb3B0aW9uLmlkICYmIGl0ZW0ubmFtZSA9PT0gb3B0aW9uLm5hbWUpXHJcbiAgICApO1xyXG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhcnMgYWxsIHNlbGVjdGVkIGNoaXBzLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGNsZWFyQWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRPcHRpb25zID0gW107XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXJzIHRoZSBsZWZ0b3ZlciB0eXBlZCB0ZXh0IG9uIGJsdXIgKG9sZCBiZWhhdmlvcikgYW5kIGNsb3NlcyB0aGVcclxuICAgKiBkcm9wZG93bi4gRGVmZXJyZWQgc28gYSBjbGljayBvbiBhIGRyb3Bkb3duIG9wdGlvbiAod2hpY2ggYWxzbyBibHVycyB0aGVcclxuICAgKiBpbnB1dCkgaXMgaGFuZGxlZCBmaXJzdC5cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICBvbkJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWU7XHJcbiAgICB0aGlzLmJsdXJUaW1lcj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYmx1clRpbWVyID0gdGltZXIoMTUwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyBJZiBmb2N1cyBtb3ZlZCBpbnRvIHRoZSBkcm9wZG93biAob3B0aW9uIGNsaWNrKSwgdGhlIGNsaWNrIGhhbmRsZXJcclxuICAgICAgLy8gcmUtZm9jdXNlcyB0aGUgaW5wdXQsIHNvIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaXMgdGhlIGlucHV0IGFnYWluLlxyXG4gICAgICBjb25zdCBhY3RpdmUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG4gICAgICBpZiAoYWN0aXZlID09PSB0aGlzLnNlYXJjaElucHV0Py5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5maWVsZEJsdXIuZW1pdCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSByZXF1aXJlZCBlcnJvciBzaG91bGQgc2hvdyAodG91Y2hlZCwgbm8gc2VsZWN0aW9uKS5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCBzaG93UmVxdWlyZWRFcnJvcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMucmVxdWlyZWQgJiYgdGhpcy5pc1RvdWNoZWQgJiYgdGhpcy5fc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFycyB0aGUgdHlwZWQgc2VhcmNoIHRleHQgYW5kIGhpZGVzIHRoZSByZXN1bHRzLlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xlYXJTZWFyY2hUZXh0KCk6IHZvaWQge1xyXG4gICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIGRlYm91bmNlZCBzZWFyY2ggc28gYSBibHVyL2NsZWFyIGJlZm9yZSB0aGUgdGltZXJcclxuICAgIC8vIGV4cGlyZXMgZG9lcyBub3QgZW1pdCB0aGUgbm93LWNsZWFyZWQgcXVlcnkgdG8gdGhlIHBhcmVudC5cclxuICAgIHRoaXMuc2VhcmNoRGVib3VuY2U/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnNlYXJjaERlYm91bmNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcclxuICAgIC8vIE5vIGxlZnRvdmVyIHRleHQg4oCUIHRoZSBmaWVsZCBpcyBubyBsb25nZXIgaG9sZGluZyBhbiBpbnZhbGlkIHRva2VuLlxyXG4gICAgdGhpcy5lbWl0SW52YWxpZFN0YXRlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB0byB0aGUgcGFyZW50LlxyXG4gICAqIEBtZW1iZXJvZiBPcmdNdWx0aVNlbGVjdENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKHtcclxuICAgICAgICBpZDogb3B0aW9uLmlkLFxyXG4gICAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxyXG4gICAgICB9KSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja0J5IGZvciBib3RoIHJlc3VsdCBhbmQgY2hpcCBsaXN0cy5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLWxpc3QgaW5kZXguXHJcbiAgICogQHBhcmFtIHtTZWxlY3RPcHRpb259IG9wdGlvbiAtdGhlIG9wdGlvbi5cclxuICAgKiBAcmV0dXJuIHsoc3RyaW5nIHwgbnVtYmVyKX1cclxuICAgKiBAbWVtYmVyb2YgT3JnTXVsdGlTZWxlY3RDb21wb25lbnRcclxuICAgKi9cclxuICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgb3B0aW9uOiBTZWxlY3RPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIge1xyXG4gICAgcmV0dXJuIGAke29wdGlvbi5pZH0tJHtvcHRpb24ubmFtZX1gO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlYXJjaERlYm91bmNlPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5ibHVyVGltZXI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0XCJcclxuICBbY2xhc3MuaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3QtLWludmFsaWRdPVwic2hvd1JlcXVpcmVkRXJyb3IgfHwgZXJyb3JNZXNzYWdlXCJcclxuPlxyXG4gIDxsYWJlbCBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19sYWJlbCBpZWVlc2EtYm9keS1zbS0xNFwiPlxyXG4gICAge3sgbGFiZWwgfX1cclxuICA8L2xhYmVsPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX2ZpZWxkXCI+XHJcbiAgICA8IS0tXHJcbiAgICAgIENoaXBzIGFuZCB0aGUgc2VhcmNoIGlucHV0IGZsb3cgdG9nZXRoZXIgaW5saW5lIChsaWtlIHRoZSBNYXRlcmlhbFxyXG4gICAgICBjaGlwLWdyaWQpLiBUaGlzIGtlZXBzIGEgc2luZ2xlLXJvdyBmaWVsZCBhcHBlYXJhbmNlIHRoYXQgZ3Jvd3MgYXMgY2hpcHNcclxuICAgICAgd3JhcCwgd2l0aCB0aGUgY2xlYXItYWxsIGJ1dHRvbiBwaW5uZWQgdG8gdGhlIHJpZ2h0IGFzIGEgc3VmZml4LlxyXG4gICAgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX2NvbnRyb2xcIj5cclxuICAgICAgPHNwYW5cclxuICAgICAgICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19jaGlwXCJcclxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkT3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeUZuXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm9wdGlvbi5uYW1lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX2NoaXAtbGFiZWxcIj5cclxuICAgICAgICAgIHt7IG9wdGlvbi5uYW1lIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2hpcC1yZW1vdmVcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlICcgKyBvcHRpb24ubmFtZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlT3B0aW9uKG9wdGlvbilcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2hpcC1yZW1vdmUtaWNvblwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwicmVtb3ZlSWNvblVSTFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDx1c2UgW2F0dHIueGxpbms6aHJlZl09XCJyZW1vdmVJY29uVVJMXCI+PC91c2U+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJlbW92ZUljb25VUkxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICAjc2VhcmNoSW5wdXRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9faW5wdXQgaWVlZXNhLXRpdGxlLXNtLTE2XCJcclxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxyXG4gICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcclxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRHJvcGRvd25PcGVuXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIm9wdGlvbklkUHJlZml4ICsgJ2xpc3Rib3gnXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiXHJcbiAgICAgICAgICBpc0Ryb3Bkb3duT3BlbiAmJiBhY3RpdmVPcHRpb25JbmRleCA+PSAwXHJcbiAgICAgICAgICAgID8gb3B0aW9uSWRQcmVmaXggKyBhY3RpdmVPcHRpb25JbmRleFxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICBcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXh0XCJcclxuICAgICAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2xlYXItYWxsXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ0NsZWFyIGFsbCdcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgYWxsXCJcclxuICAgICAgKm5nSWY9XCJzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCJcclxuICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKClcIlxyXG4gICAgPlxyXG4gICAgICA8c3ZnXHJcbiAgICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fY2xlYXItYWxsLWljb25cIlxyXG4gICAgICAgICpuZ0lmPVwiY2xlYXJBbGxJY29uVVJMXCJcclxuICAgICAgPlxyXG4gICAgICAgIDx1c2UgW2F0dHIueGxpbms6aHJlZl09XCJjbGVhckFsbEljb25VUkxcIj48L3VzZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIWNsZWFyQWxsSWNvblVSTFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8IS0tXHJcbiAgICAgIEN1c3RvbSByZXN1bHRzIGRyb3Bkb3duLiBGdWxseSBvd25lZCAobm90IG1hdC1hdXRvY29tcGxldGUpIHNvIGEgcGljayBuZXZlclxyXG4gICAgICBjbG9zZXMgdGhlIHBhbmVsIG9yIG92ZXJ3cml0ZXMgdGhlIHR5cGVkIHRleHQuIG1vdXNlZG93biBpcyBwcmV2ZW50ZWQgc29cclxuICAgICAgY2xpY2tpbmcgYSByb3cgZG9lcyBub3QgYmx1ciB0aGUgaW5wdXQgYmVmb3JlIHRoZSBjbGljayByZWdpc3RlcnMuXHJcbiAgICAtLT5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fZHJvcGRvd25cIlxyXG4gICAgICByb2xlPVwibGlzdGJveFwiXHJcbiAgICAgIFtpZF09XCJvcHRpb25JZFByZWZpeCArICdsaXN0Ym94J1wiXHJcbiAgICAgIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwidHJ1ZVwiXHJcbiAgICAgICpuZ0lmPVwiaXNEcm9wZG93bk9wZW4gJiYgb3B0aW9ucy5sZW5ndGhcIlxyXG4gICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX29wdGlvblwiXHJcbiAgICAgICAgcm9sZT1cIm9wdGlvblwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxyXG4gICAgICAgIFtpZF09XCJvcHRpb25JZFByZWZpeCArIGlcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcclxuICAgICAgICBbY2xhc3MuaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX29wdGlvbi0tc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcclxuICAgICAgICBbY2xhc3MuaWVlZXNhLW9yZy1tdWx0aS1zZWxlY3RfX29wdGlvbi0tYWN0aXZlXT1cImlzQWN0aXZlT3B0aW9uKGkpXCJcclxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3B0aW9uKG9wdGlvbilcIlxyXG4gICAgICAgIChtb3VzZWVudGVyKT1cImFjdGl2ZU9wdGlvbkluZGV4ID0gaVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcclxuICAgICAgICAgIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXHJcbiAgICAgICAgPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19vcHRpb24tbGFiZWwgaWVlZXNhLXRpdGxlLXNtLTE2XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBvcHRpb24ubmFtZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBJbmxpbmUgZnJlZS10ZXh0IHZhbGlkYXRpb24gZXJyb3IgKEVudGVyIHBhdGgpIC0tPlxyXG4gIDxwXHJcbiAgICBjbGFzcz1cImllZWVzYS1vcmctbXVsdGktc2VsZWN0X19lcnJvciBpZWVlc2EtYm9keS1zbS0xNFwiXHJcbiAgICAqbmdJZj1cImVycm9yTWVzc2FnZVwiXHJcbiAgPlxyXG4gICAge3sgZXJyb3JNZXNzYWdlIH19XHJcbiAgPC9wPlxyXG5cclxuICA8IS0tIFJlcXVpcmVkIGVycm9yICh0b3VjaGVkLCBub3RoaW5nIHNlbGVjdGVkKSAtLT5cclxuICA8cFxyXG4gICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fZXJyb3IgaWVlZXNhLWJvZHktc20tMTRcIlxyXG4gICAgKm5nSWY9XCJzaG93UmVxdWlyZWRFcnJvciAmJiAhZXJyb3JNZXNzYWdlXCJcclxuICA+XHJcbiAgICB7eyBhZGRVc2VyUm9zdGVyVGV4dHM/Lm1lc3NhZ2U/LmVycm9yPy5yZXF1aXJlZCB9fVxyXG4gIDwvcD5cclxuXHJcbiAgPCEtLSBTdXBwb3J0L2hlbHAgdGV4dCAtLT5cclxuICA8cFxyXG4gICAgY2xhc3M9XCJpZWVlc2Etb3JnLW11bHRpLXNlbGVjdF9fc3VwcG9ydCBpZWVlc2EtYm9keS1zbS0xNFwiXHJcbiAgICAqbmdJZj1cInN1cHBvcnRNZXNzYWdlICYmICFlcnJvck1lc3NhZ2UgJiYgIXNob3dSZXF1aXJlZEVycm9yXCJcclxuICA+XHJcbiAgICB7eyBzdXBwb3J0TWVzc2FnZSB9fVxyXG4gIDwvcD5cclxuPC9kaXY+XHJcbiJdfQ==
|