cps-ui-kit 0.128.0 → 0.130.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/assets/icons.svg +8 -0
- package/esm2020/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +3 -3
- package/esm2020/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +3 -3
- package/esm2020/lib/components/cps-checkbox/cps-checkbox.component.mjs +1 -1
- package/esm2020/lib/components/cps-datepicker/cps-datepicker.component.mjs +3 -3
- package/esm2020/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +3 -3
- package/esm2020/lib/components/cps-icon/cps-icon.component.mjs +3 -1
- package/esm2020/lib/components/cps-info-circle/cps-info-circle.component.mjs +1 -1
- package/esm2020/lib/components/cps-input/cps-input.component.mjs +1 -1
- package/esm2020/lib/components/cps-menu/cps-menu.component.mjs +3 -3
- package/esm2020/lib/components/cps-paginator/cps-paginator.component.mjs +3 -3
- package/esm2020/lib/components/cps-radio-group/cps-radio-group.component.mjs +1 -1
- package/esm2020/lib/components/cps-select/cps-select.component.mjs +3 -3
- package/esm2020/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +3 -3
- package/esm2020/lib/components/cps-table/cps-table.component.mjs +3 -3
- package/esm2020/lib/components/cps-textarea/cps-textarea.component.mjs +1 -1
- package/esm2020/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +8 -5
- package/esm2020/lib/components/cps-tree-select/cps-tree-select.component.mjs +8 -5
- package/esm2020/lib/components/cps-tree-table/cps-tree-table.component.mjs +76 -47
- package/esm2020/lib/components/cps-tree-table/tree-table-sort-icon/tree-table-sort-icon.component.mjs +3 -5
- package/esm2020/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +499 -0
- package/esm2020/lib/directives/cps-tooltip.directive.mjs +1 -1
- package/esm2020/lib/services/cps-dialog/cps-dialog.service.mjs +87 -0
- package/esm2020/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.mjs +25 -0
- package/esm2020/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +466 -0
- package/esm2020/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.mjs +18 -0
- package/esm2020/lib/services/cps-dialog/utils/cps-dialog-config.mjs +3 -0
- package/esm2020/lib/services/cps-dialog/utils/cps-dialog-ref.mjs +128 -0
- package/esm2020/public-api.mjs +4 -1
- package/fesm2015/cps-ui-kit.mjs +829 -84
- package/fesm2015/cps-ui-kit.mjs.map +1 -1
- package/fesm2020/cps-ui-kit.mjs +813 -85
- package/fesm2020/cps-ui-kit.mjs.map +1 -1
- package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +2 -2
- package/lib/components/cps-button-toggle/cps-button-toggle.component.d.ts +3 -3
- package/lib/components/cps-checkbox/cps-checkbox.component.d.ts +2 -2
- package/lib/components/cps-datepicker/cps-datepicker.component.d.ts +2 -2
- package/lib/components/cps-info-circle/cps-info-circle.component.d.ts +2 -2
- package/lib/components/cps-input/cps-input.component.d.ts +2 -2
- package/lib/components/cps-radio-group/cps-radio-group.component.d.ts +2 -2
- package/lib/components/cps-select/cps-select.component.d.ts +2 -2
- package/lib/components/cps-textarea/cps-textarea.component.d.ts +2 -2
- package/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.d.ts +4 -3
- package/lib/components/cps-tree-select/cps-tree-select.component.d.ts +4 -3
- package/lib/components/cps-tree-table/cps-tree-table.component.d.ts +6 -1
- package/lib/{base_components/base-tree-dropdown.component.d.ts → components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.d.ts} +7 -8
- package/lib/directives/cps-tooltip.directive.d.ts +4 -4
- package/lib/services/cps-dialog/cps-dialog.service.d.ts +22 -0
- package/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.d.ts +12 -0
- package/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.d.ts +93 -0
- package/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.d.ts +8 -0
- package/lib/services/cps-dialog/utils/cps-dialog-config.d.ts +151 -0
- package/lib/services/cps-dialog/utils/cps-dialog-ref.d.ts +101 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
- package/styles/_colors.scss +4 -0
- package/esm2020/lib/base_components/base-tree-dropdown.component.mjs +0 -502
|
@@ -1,502 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Optional, Output, Self, ViewChild } from '@angular/core';
|
|
2
|
-
import { Subscription } from 'rxjs';
|
|
3
|
-
import { convertSize } from '../utils/internal/size-utils';
|
|
4
|
-
import { isEqual } from 'lodash-es';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/forms";
|
|
7
|
-
export class BaseTreeDropdownComponent {
|
|
8
|
-
set options(options) {
|
|
9
|
-
if (options?.some((o) => o.inner)) {
|
|
10
|
-
this._options = options;
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
this._options = this._toInnerOptions(options);
|
|
14
|
-
}
|
|
15
|
-
get options() {
|
|
16
|
-
return this._options;
|
|
17
|
-
}
|
|
18
|
-
set value(value) {
|
|
19
|
-
this._value = value;
|
|
20
|
-
this.onChange(value);
|
|
21
|
-
}
|
|
22
|
-
get value() {
|
|
23
|
-
return this._value;
|
|
24
|
-
}
|
|
25
|
-
constructor(control, cdRef) {
|
|
26
|
-
this.control = control;
|
|
27
|
-
this.cdRef = cdRef;
|
|
28
|
-
this.label = '';
|
|
29
|
-
this.placeholder = 'Please enter';
|
|
30
|
-
this.hint = '';
|
|
31
|
-
this.multiple = false;
|
|
32
|
-
this.disabled = false;
|
|
33
|
-
this.width = '100%';
|
|
34
|
-
this.chips = true;
|
|
35
|
-
this.closableChips = true;
|
|
36
|
-
this.clearable = false;
|
|
37
|
-
this.openOnClear = true;
|
|
38
|
-
this.optionLabel = 'label';
|
|
39
|
-
this.optionInfo = 'info';
|
|
40
|
-
this.hideDetails = false;
|
|
41
|
-
this.persistentClear = false;
|
|
42
|
-
this.prefixIcon = '';
|
|
43
|
-
this.prefixIconSize = '18px';
|
|
44
|
-
this.loading = false;
|
|
45
|
-
this.virtualScroll = false;
|
|
46
|
-
this.numToleratedItems = 10;
|
|
47
|
-
this.infoTooltip = '';
|
|
48
|
-
this.infoTooltipClass = 'cps-tooltip-content';
|
|
49
|
-
this.infoTooltipMaxWidth = '100%';
|
|
50
|
-
this.infoTooltipPersistent = false;
|
|
51
|
-
this.infoTooltipPosition = 'top';
|
|
52
|
-
this.initialExpandDirectories = false;
|
|
53
|
-
this.initialExpandAll = false;
|
|
54
|
-
this._value = undefined;
|
|
55
|
-
this.valueChanged = new EventEmitter();
|
|
56
|
-
this._statusChangesSubscription = new Subscription();
|
|
57
|
-
this._options = [];
|
|
58
|
-
this.optionsMap = new Map();
|
|
59
|
-
this.originalOptionsMap = new Map();
|
|
60
|
-
this.virtualListHeight = 240;
|
|
61
|
-
this.virtualScrollItemSize = 40;
|
|
62
|
-
this.error = '';
|
|
63
|
-
this.cvtWidth = '';
|
|
64
|
-
this.isOpened = false;
|
|
65
|
-
this.optionFocused = false;
|
|
66
|
-
this.isAutocomplete = false;
|
|
67
|
-
this.boxWidth = 0;
|
|
68
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
69
|
-
this.onChange = (event) => { };
|
|
70
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
71
|
-
this.onTouched = () => { };
|
|
72
|
-
if (this.control) {
|
|
73
|
-
this.control.valueAccessor = this;
|
|
74
|
-
}
|
|
75
|
-
this.resizeObserver = new ResizeObserver((entries) => {
|
|
76
|
-
entries.forEach((entry) => {
|
|
77
|
-
if (entry?.target)
|
|
78
|
-
this.boxWidth = entry.target.offsetWidth;
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
ngOnInit() {
|
|
83
|
-
this.cvtWidth = convertSize(this.width);
|
|
84
|
-
if (!this._value) {
|
|
85
|
-
if (this.multiple) {
|
|
86
|
-
this._value = [];
|
|
87
|
-
this.treeSelection = [];
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
this.treeSelection = this._valueToTreeSelection(this.value);
|
|
92
|
-
}
|
|
93
|
-
this._statusChangesSubscription = this.control?.statusChanges?.subscribe(() => {
|
|
94
|
-
this._checkErrors();
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
ngAfterViewInit() {
|
|
98
|
-
this._initContainerClickListener();
|
|
99
|
-
this.recalcVirtualListHeight();
|
|
100
|
-
this.resizeObserver.observe(this.boxEl.nativeElement);
|
|
101
|
-
this.cdRef.detectChanges();
|
|
102
|
-
}
|
|
103
|
-
ngOnDestroy() {
|
|
104
|
-
this._statusChangesSubscription?.unsubscribe();
|
|
105
|
-
this.treeContainerElement?.removeEventListener('click', this._handleOnContainerClick.bind(this));
|
|
106
|
-
this.resizeObserver?.disconnect();
|
|
107
|
-
}
|
|
108
|
-
_initContainerClickListener() {
|
|
109
|
-
this.treeContainerElement =
|
|
110
|
-
this.treeList?.el?.nativeElement?.querySelector('.p-tree-container');
|
|
111
|
-
if (this.treeContainerElement) {
|
|
112
|
-
this.treeContainerElement.addEventListener('click', this._handleOnContainerClick.bind(this));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
_handleOnContainerClick(event) {
|
|
116
|
-
function getParentWithClass(element, className) {
|
|
117
|
-
let currentElement = element;
|
|
118
|
-
while (currentElement) {
|
|
119
|
-
if (currentElement.classList.contains(className)) {
|
|
120
|
-
return currentElement;
|
|
121
|
-
}
|
|
122
|
-
currentElement = currentElement.parentElement;
|
|
123
|
-
}
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
this.optionFocused = true;
|
|
127
|
-
const elem = event.target.classList.contains('p-treenode-content')
|
|
128
|
-
? event.target
|
|
129
|
-
: getParentWithClass(event.target, 'p-treenode-content');
|
|
130
|
-
if (elem?.parentElement?.classList?.contains('cps-tree-node-fully-expandable')) {
|
|
131
|
-
this.onClickFullyExpandable(elem);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
registerOnChange(fn) {
|
|
135
|
-
this.onChange = fn;
|
|
136
|
-
}
|
|
137
|
-
registerOnTouched(fn) {
|
|
138
|
-
this.onTouched = fn;
|
|
139
|
-
}
|
|
140
|
-
writeValue(value, internal = false) {
|
|
141
|
-
this.value = value;
|
|
142
|
-
if (!internal && value !== null) {
|
|
143
|
-
this.treeSelection = this._valueToTreeSelection(this.value);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
updateValue(value) {
|
|
147
|
-
this.writeValue(value, true);
|
|
148
|
-
this.onChange(value);
|
|
149
|
-
this.valueChanged.emit(value);
|
|
150
|
-
}
|
|
151
|
-
onSelectNode() {
|
|
152
|
-
if (!this.multiple) {
|
|
153
|
-
this.toggleOptions(false);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
onClickFullyExpandable(elem) {
|
|
157
|
-
const parent = elem.parentElement;
|
|
158
|
-
const key = this._getHTMLElementKey(parent);
|
|
159
|
-
if (!key)
|
|
160
|
-
return;
|
|
161
|
-
const treeNode = this.options.find((o) => o.key === key);
|
|
162
|
-
if (!treeNode)
|
|
163
|
-
return;
|
|
164
|
-
treeNode.expanded = !treeNode.expanded;
|
|
165
|
-
this.updateOptions();
|
|
166
|
-
setTimeout(() => {
|
|
167
|
-
this._nodeToggled(elem);
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
_getHTMLElementKey(elem) {
|
|
171
|
-
if (!elem?.classList)
|
|
172
|
-
return '';
|
|
173
|
-
const classList = [...elem.classList];
|
|
174
|
-
const key = classList.find((className) => {
|
|
175
|
-
return className.startsWith('key-');
|
|
176
|
-
});
|
|
177
|
-
if (!key)
|
|
178
|
-
return '';
|
|
179
|
-
return key.replace('key-', '');
|
|
180
|
-
}
|
|
181
|
-
treeSelectionChanged(selection) {
|
|
182
|
-
this.updateValue(this.treeSelectionToValue(selection));
|
|
183
|
-
}
|
|
184
|
-
recalcVirtualListHeight() {
|
|
185
|
-
if (!this.virtualScroll)
|
|
186
|
-
return;
|
|
187
|
-
const currentLen = this.treeList?.serializedValue?.length || 0;
|
|
188
|
-
this.virtualListHeight = Math.min(this.virtualScrollItemSize * currentLen, 240);
|
|
189
|
-
}
|
|
190
|
-
toggleOptions(show) {
|
|
191
|
-
if (this.disabled || this.isOpened === show)
|
|
192
|
-
return;
|
|
193
|
-
if (typeof show === 'boolean') {
|
|
194
|
-
if (show) {
|
|
195
|
-
this.optionsMenu.show({
|
|
196
|
-
target: this.boxEl.nativeElement
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
this.optionsMenu.hide();
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
this.optionsMenu.toggle({
|
|
205
|
-
target: this.boxEl.nativeElement
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
this.isOpened = this.optionsMenu.isVisible();
|
|
209
|
-
this.optionFocused = false;
|
|
210
|
-
if (this.isOpened && this.treeSelection) {
|
|
211
|
-
this._expandToNodes(this.multiple ? this.treeSelection : [this.treeSelection]);
|
|
212
|
-
this.updateOptions();
|
|
213
|
-
setTimeout(() => {
|
|
214
|
-
this.recalcVirtualListHeight();
|
|
215
|
-
const selected = this.treeContainerElement.querySelector('.p-highlight');
|
|
216
|
-
if (selected) {
|
|
217
|
-
selected.scrollIntoView({
|
|
218
|
-
behavior: 'instant',
|
|
219
|
-
block: 'nearest',
|
|
220
|
-
inline: 'center'
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
else if (this.virtualScroll && this.treeSelection) {
|
|
224
|
-
let key = '';
|
|
225
|
-
if (this.multiple) {
|
|
226
|
-
if (this.treeSelection.length > 0)
|
|
227
|
-
key = this.treeSelection[0].key;
|
|
228
|
-
}
|
|
229
|
-
else
|
|
230
|
-
key = this.treeSelection.key;
|
|
231
|
-
if (key) {
|
|
232
|
-
const idx = this.treeList?.serializedValue?.findIndex((v) => v.node.key === key) || -1;
|
|
233
|
-
if (idx >= 0)
|
|
234
|
-
this.treeList.scrollToVirtualIndex(idx);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
remove(option) {
|
|
241
|
-
if (!this.multiple)
|
|
242
|
-
return;
|
|
243
|
-
this.treeSelection = this.treeSelection.filter((v) => !isEqual(v, option));
|
|
244
|
-
this.updateValue(this.treeSelectionToValue(this.treeSelection));
|
|
245
|
-
}
|
|
246
|
-
initArrowsNavigaton() {
|
|
247
|
-
if (!this.isOpened)
|
|
248
|
-
return;
|
|
249
|
-
if (!this.optionFocused) {
|
|
250
|
-
const firstElem = this.treeContainerElement?.querySelector('.p-treenode-content');
|
|
251
|
-
if (firstElem)
|
|
252
|
-
firstElem.focus();
|
|
253
|
-
this.optionFocused = true;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
_nodeToggled(elem) {
|
|
257
|
-
this.recalcVirtualListHeight();
|
|
258
|
-
setTimeout(() => {
|
|
259
|
-
this.optionsMenu.align();
|
|
260
|
-
});
|
|
261
|
-
elem?.focus();
|
|
262
|
-
}
|
|
263
|
-
_nodeToggledWithChevron(elem) {
|
|
264
|
-
this._nodeToggled(elem);
|
|
265
|
-
// fix primeng tree event stop propagation
|
|
266
|
-
this.optionsMenu.selfClick = false;
|
|
267
|
-
}
|
|
268
|
-
onNodeExpand(event) {
|
|
269
|
-
this._nodeToggledWithChevron(event?.originalEvent?.currentTarget?.parentElement);
|
|
270
|
-
}
|
|
271
|
-
onNodeCollapse(event) {
|
|
272
|
-
this._nodeToggledWithChevron(event?.originalEvent?.currentTarget?.parentElement);
|
|
273
|
-
}
|
|
274
|
-
clear(event) {
|
|
275
|
-
event.stopPropagation();
|
|
276
|
-
if ((!this.multiple && this.treeSelection) ||
|
|
277
|
-
(this.multiple && this.treeSelection?.length > 0)) {
|
|
278
|
-
if (this.openOnClear) {
|
|
279
|
-
this.toggleOptions(true);
|
|
280
|
-
}
|
|
281
|
-
const val = this.multiple ? [] : undefined;
|
|
282
|
-
this.treeSelection = val;
|
|
283
|
-
this.updateValue(val);
|
|
284
|
-
}
|
|
285
|
-
this.optionFocused = false;
|
|
286
|
-
}
|
|
287
|
-
_checkErrors() {
|
|
288
|
-
const errors = this.control?.errors;
|
|
289
|
-
if (!this.control?.control?.touched || !errors) {
|
|
290
|
-
this.error = '';
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
if ('required' in errors) {
|
|
294
|
-
this.error = 'Field is required';
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
const errArr = Object.values(errors);
|
|
298
|
-
if (errArr.length < 1) {
|
|
299
|
-
this.error = '';
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
const message = errArr.find((msg) => typeof msg === 'string');
|
|
303
|
-
this.error = message || 'Unknown error';
|
|
304
|
-
}
|
|
305
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
306
|
-
setDisabledState(disabled) { }
|
|
307
|
-
onBlur() {
|
|
308
|
-
this.control?.control?.markAsTouched();
|
|
309
|
-
this._checkErrors();
|
|
310
|
-
}
|
|
311
|
-
focus() {
|
|
312
|
-
this.componentContainer?.nativeElement?.focus();
|
|
313
|
-
this.toggleOptions(true);
|
|
314
|
-
}
|
|
315
|
-
_expandToNodes(nodes) {
|
|
316
|
-
function getParentKey(key) {
|
|
317
|
-
const lastSeparatorIndex = key.lastIndexOf('-');
|
|
318
|
-
if (lastSeparatorIndex !== -1) {
|
|
319
|
-
return key.substring(0, lastSeparatorIndex);
|
|
320
|
-
}
|
|
321
|
-
return '';
|
|
322
|
-
}
|
|
323
|
-
nodes.forEach((node) => {
|
|
324
|
-
const parentNodeKey = getParentKey(node.key);
|
|
325
|
-
const parentNode = this.optionsMap.get(parentNodeKey) || null;
|
|
326
|
-
if (parentNode) {
|
|
327
|
-
parentNode.expanded = true;
|
|
328
|
-
this._expandToNodes([parentNode]);
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
_toInnerOptions(_options) {
|
|
333
|
-
const mapOption = (o, optionLabel, optionInfo, key, originalOptionsMap) => {
|
|
334
|
-
const inner = {
|
|
335
|
-
inner: true,
|
|
336
|
-
label: o[optionLabel],
|
|
337
|
-
info: o[optionInfo],
|
|
338
|
-
key,
|
|
339
|
-
styleClass: 'key-' + key
|
|
340
|
-
};
|
|
341
|
-
if (this.initialExpandAll) {
|
|
342
|
-
inner.expanded = true;
|
|
343
|
-
}
|
|
344
|
-
if (o.isDirectory) {
|
|
345
|
-
inner.type = 'directory';
|
|
346
|
-
inner.selectable = false;
|
|
347
|
-
inner.styleClass += ' cps-tree-node-fully-expandable';
|
|
348
|
-
if (this.initialExpandDirectories) {
|
|
349
|
-
inner.expanded = true;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
if (o.children) {
|
|
353
|
-
inner.children = o.children.map((c, index) => {
|
|
354
|
-
return mapOption(c, optionLabel, optionInfo, key + '-' + index, originalOptionsMap);
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
originalOptionsMap.set(key, o);
|
|
358
|
-
return inner;
|
|
359
|
-
};
|
|
360
|
-
const res = _options.map((option, index) => {
|
|
361
|
-
return mapOption(option, this.optionLabel, this.optionInfo, '' + index, this.originalOptionsMap);
|
|
362
|
-
});
|
|
363
|
-
this.optionsMap = this._buildOptionsMap(res);
|
|
364
|
-
return res;
|
|
365
|
-
}
|
|
366
|
-
_buildOptionsMap(options) {
|
|
367
|
-
const nodeMap = new Map();
|
|
368
|
-
for (const option of options) {
|
|
369
|
-
nodeMap.set(option.key, option);
|
|
370
|
-
if (option.children) {
|
|
371
|
-
const childNodeMap = this._buildOptionsMap(option.children);
|
|
372
|
-
childNodeMap.forEach((value, key) => nodeMap.set(key, value));
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
return nodeMap;
|
|
376
|
-
}
|
|
377
|
-
treeSelectionToValue(selection) {
|
|
378
|
-
if (!selection)
|
|
379
|
-
return this.multiple ? [] : undefined;
|
|
380
|
-
if (this.multiple) {
|
|
381
|
-
return selection.map((s) => this.originalOptionsMap.get(s.key));
|
|
382
|
-
}
|
|
383
|
-
else {
|
|
384
|
-
return this.originalOptionsMap.get(selection.key);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
_valueToTreeSelection(value) {
|
|
388
|
-
function getKey(v, map) {
|
|
389
|
-
for (const [key, val] of map.entries()) {
|
|
390
|
-
if (isEqual(v, val)) {
|
|
391
|
-
return key;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
return '';
|
|
395
|
-
}
|
|
396
|
-
if (!value)
|
|
397
|
-
return this.multiple ? [] : undefined;
|
|
398
|
-
if (this.multiple) {
|
|
399
|
-
const res = [];
|
|
400
|
-
value.forEach((v) => {
|
|
401
|
-
const key = getKey(v, this.originalOptionsMap);
|
|
402
|
-
if (key)
|
|
403
|
-
res.push(this.optionsMap.get(key));
|
|
404
|
-
});
|
|
405
|
-
return res;
|
|
406
|
-
}
|
|
407
|
-
else {
|
|
408
|
-
const key = getKey(value, this.originalOptionsMap);
|
|
409
|
-
return key ? this.optionsMap.get(key) : undefined;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
// this is a fix of primeng change detection bug when virtual scroller is enabled
|
|
413
|
-
updateOptions() {
|
|
414
|
-
if (!this.virtualScroll)
|
|
415
|
-
return;
|
|
416
|
-
this.options = [...this.options];
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
BaseTreeDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTreeDropdownComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
420
|
-
BaseTreeDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: BaseTreeDropdownComponent, selector: "ng-component", inputs: { label: "label", placeholder: "placeholder", hint: "hint", multiple: "multiple", disabled: "disabled", width: "width", chips: "chips", closableChips: "closableChips", clearable: "clearable", openOnClear: "openOnClear", optionLabel: "optionLabel", optionInfo: "optionInfo", hideDetails: "hideDetails", persistentClear: "persistentClear", prefixIcon: "prefixIcon", prefixIconSize: "prefixIconSize", loading: "loading", virtualScroll: "virtualScroll", numToleratedItems: "numToleratedItems", infoTooltip: "infoTooltip", infoTooltipClass: "infoTooltipClass", infoTooltipMaxWidth: "infoTooltipMaxWidth", infoTooltipPersistent: "infoTooltipPersistent", infoTooltipPosition: "infoTooltipPosition", initialExpandDirectories: "initialExpandDirectories", initialExpandAll: "initialExpandAll", options: "options", _value: ["value", "_value"] }, outputs: { valueChanged: "valueChanged" }, viewQueries: [{ propertyName: "componentContainer", first: true, predicate: ["componentContainer"], descendants: true }, { propertyName: "optionsMenu", first: true, predicate: ["optionsMenu"], descendants: true }, { propertyName: "treeList", first: true, predicate: ["treeList"], descendants: true }, { propertyName: "boxEl", first: true, predicate: ["boxEl"], descendants: true }], ngImport: i0, template: '', isInline: true });
|
|
421
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTreeDropdownComponent, decorators: [{
|
|
422
|
-
type: Component,
|
|
423
|
-
args: [{
|
|
424
|
-
template: ''
|
|
425
|
-
}]
|
|
426
|
-
}], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
|
|
427
|
-
type: Self
|
|
428
|
-
}, {
|
|
429
|
-
type: Optional
|
|
430
|
-
}] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { label: [{
|
|
431
|
-
type: Input
|
|
432
|
-
}], placeholder: [{
|
|
433
|
-
type: Input
|
|
434
|
-
}], hint: [{
|
|
435
|
-
type: Input
|
|
436
|
-
}], multiple: [{
|
|
437
|
-
type: Input
|
|
438
|
-
}], disabled: [{
|
|
439
|
-
type: Input
|
|
440
|
-
}], width: [{
|
|
441
|
-
type: Input
|
|
442
|
-
}], chips: [{
|
|
443
|
-
type: Input
|
|
444
|
-
}], closableChips: [{
|
|
445
|
-
type: Input
|
|
446
|
-
}], clearable: [{
|
|
447
|
-
type: Input
|
|
448
|
-
}], openOnClear: [{
|
|
449
|
-
type: Input
|
|
450
|
-
}], optionLabel: [{
|
|
451
|
-
type: Input
|
|
452
|
-
}], optionInfo: [{
|
|
453
|
-
type: Input
|
|
454
|
-
}], hideDetails: [{
|
|
455
|
-
type: Input
|
|
456
|
-
}], persistentClear: [{
|
|
457
|
-
type: Input
|
|
458
|
-
}], prefixIcon: [{
|
|
459
|
-
type: Input
|
|
460
|
-
}], prefixIconSize: [{
|
|
461
|
-
type: Input
|
|
462
|
-
}], loading: [{
|
|
463
|
-
type: Input
|
|
464
|
-
}], virtualScroll: [{
|
|
465
|
-
type: Input
|
|
466
|
-
}], numToleratedItems: [{
|
|
467
|
-
type: Input
|
|
468
|
-
}], infoTooltip: [{
|
|
469
|
-
type: Input
|
|
470
|
-
}], infoTooltipClass: [{
|
|
471
|
-
type: Input
|
|
472
|
-
}], infoTooltipMaxWidth: [{
|
|
473
|
-
type: Input
|
|
474
|
-
}], infoTooltipPersistent: [{
|
|
475
|
-
type: Input
|
|
476
|
-
}], infoTooltipPosition: [{
|
|
477
|
-
type: Input
|
|
478
|
-
}], initialExpandDirectories: [{
|
|
479
|
-
type: Input
|
|
480
|
-
}], initialExpandAll: [{
|
|
481
|
-
type: Input
|
|
482
|
-
}], options: [{
|
|
483
|
-
type: Input
|
|
484
|
-
}], _value: [{
|
|
485
|
-
type: Input,
|
|
486
|
-
args: ['value']
|
|
487
|
-
}], valueChanged: [{
|
|
488
|
-
type: Output
|
|
489
|
-
}], componentContainer: [{
|
|
490
|
-
type: ViewChild,
|
|
491
|
-
args: ['componentContainer']
|
|
492
|
-
}], optionsMenu: [{
|
|
493
|
-
type: ViewChild,
|
|
494
|
-
args: ['optionsMenu']
|
|
495
|
-
}], treeList: [{
|
|
496
|
-
type: ViewChild,
|
|
497
|
-
args: ['treeList']
|
|
498
|
-
}], boxEl: [{
|
|
499
|
-
type: ViewChild,
|
|
500
|
-
args: ['boxEl']
|
|
501
|
-
}] } });
|
|
502
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10cmVlLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nwcy11aS1raXQvc3JjL2xpYi9iYXNlX2NvbXBvbmVudHMvYmFzZS10cmVlLWRyb3Bkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0osU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBT3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7OztBQU9wQyxNQUFNLE9BQU8seUJBQXlCO0lBOEJwQyxJQUFhLE9BQU8sQ0FBQyxPQUFjO1FBQ2pDLElBQUksT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFJRCxJQUFJLEtBQUssQ0FBQyxLQUFVO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixD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LEtBQUs7c0JBREosU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNlbGYsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7XG4gIEljb25UeXBlLFxuICBpY29uU2l6ZVR5cGVcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9jcHMtaWNvbi9jcHMtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb252ZXJ0U2l6ZSB9IGZyb20gJy4uL3V0aWxzL2ludGVybmFsL3NpemUtdXRpbHMnO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gJ3ByaW1lbmcvdHJlZSc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY3BzLXRvb2x0aXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IENwc01lbnVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2Nwcy1tZW51L2Nwcy1tZW51LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgY2xhc3MgQmFzZVRyZWVEcm9wZG93bkNvbXBvbmVudFxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdQbGVhc2UgZW50ZXInO1xuICBASW5wdXQoKSBoaW50ID0gJyc7XG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXIgfCBzdHJpbmcgPSAnMTAwJSc7XG4gIEBJbnB1dCgpIGNoaXBzID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xvc2FibGVDaGlwcyA9IHRydWU7XG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBvcGVuT25DbGVhciA9IHRydWU7XG4gIEBJbnB1dCgpIG9wdGlvbkxhYmVsID0gJ2xhYmVsJztcbiAgQElucHV0KCkgb3B0aW9uSW5mbyA9ICdpbmZvJztcbiAgQElucHV0KCkgaGlkZURldGFpbHMgPSBmYWxzZTtcbiAgQElucHV0KCkgcGVyc2lzdGVudENsZWFyID0gZmFsc2U7XG4gIEBJbnB1dCgpIHByZWZpeEljb246IEljb25UeXBlID0gJyc7XG4gIEBJbnB1dCgpIHByZWZpeEljb25TaXplOiBpY29uU2l6ZVR5cGUgPSAnMThweCc7XG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgdmlydHVhbFNjcm9sbCA9IGZhbHNlO1xuICBASW5wdXQoKSBudW1Ub2xlcmF0ZWRJdGVtcyA9IDEwO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcCA9ICcnO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcENsYXNzID0gJ2Nwcy10b29sdGlwLWNvbnRlbnQnO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcE1heFdpZHRoOiBudW1iZXIgfCBzdHJpbmcgPSAnMTAwJSc7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwUGVyc2lzdGVudCA9IGZhbHNlO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb24gPSAndG9wJztcbiAgQElucHV0KCkgaW5pdGlhbEV4cGFuZERpcmVjdG9yaWVzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGluaXRpYWxFeHBhbmRBbGwgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzZXQgb3B0aW9ucyhvcHRpb25zOiBhbnlbXSkge1xuICAgIGlmIChvcHRpb25zPy5zb21lKChvKSA9PiBvLmlubmVyKSkge1xuICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3B0aW9ucyA9IHRoaXMuX3RvSW5uZXJPcHRpb25zKG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKTogVHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBASW5wdXQoJ3ZhbHVlJykgX3ZhbHVlOiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudENvbnRhaW5lcicpXG4gIGNvbXBvbmVudENvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnb3B0aW9uc01lbnUnKVxuICBvcHRpb25zTWVudSE6IENwc01lbnVDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgndHJlZUxpc3QnKSB0cmVlTGlzdCE6IFRyZWU7XG5cbiAgQFZpZXdDaGlsZCgnYm94RWwnKVxuICBib3hFbCE6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBfc3RhdHVzQ2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIF9vcHRpb25zOiBUcmVlTm9kZVtdID0gW107XG4gIG9wdGlvbnNNYXAgPSBuZXcgTWFwPHN0cmluZywgVHJlZU5vZGU+KCk7XG4gIG9yaWdpbmFsT3B0aW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cbiAgdmlydHVhbExpc3RIZWlnaHQgPSAyNDA7XG4gIHZpcnR1YWxTY3JvbGxJdGVtU2l6ZSA9IDQwO1xuXG4gIGVycm9yID0gJyc7XG4gIGN2dFdpZHRoID0gJyc7XG4gIGlzT3BlbmVkID0gZmFsc2U7XG4gIG9wdGlvbkZvY3VzZWQgPSBmYWxzZTtcbiAgaXNBdXRvY29tcGxldGUgPSBmYWxzZTtcblxuICB0cmVlQ29udGFpbmVyRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuICB0cmVlU2VsZWN0aW9uOiBhbnk7XG5cbiAgYm94V2lkdGggPSAwO1xuICByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgY29udHJvbDogTmdDb250cm9sLFxuICAgIHB1YmxpYyBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgIGlmIChlbnRyeT8udGFyZ2V0KSB0aGlzLmJveFdpZHRoID0gKGVudHJ5LnRhcmdldCBhcyBhbnkpLm9mZnNldFdpZHRoO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmN2dFdpZHRoID0gY29udmVydFNpemUodGhpcy53aWR0aCk7XG4gICAgaWYgKCF0aGlzLl92YWx1ZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBbXTtcbiAgICAgICAgdGhpcy50cmVlU2VsZWN0aW9uID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJlZVNlbGVjdGlvbiA9IHRoaXMuX3ZhbHVlVG9UcmVlU2VsZWN0aW9uKHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLmNvbnRyb2w/LnN0YXR1c0NoYW5nZXM/LnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5fY2hlY2tFcnJvcnMoKTtcbiAgICAgIH1cbiAgICApIGFzIFN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9pbml0Q29udGFpbmVyQ2xpY2tMaXN0ZW5lcigpO1xuICAgIHRoaXMucmVjYWxjVmlydHVhbExpc3RIZWlnaHQoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5ib3hFbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnRyZWVDb250YWluZXJFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgJ2NsaWNrJyxcbiAgICAgIHRoaXMuX2hhbmRsZU9uQ29udGFpbmVyQ2xpY2suYmluZCh0aGlzKVxuICAgICk7XG5cbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0Q29udGFpbmVyQ2xpY2tMaXN0ZW5lcigpIHtcbiAgICB0aGlzLnRyZWVDb250YWluZXJFbGVtZW50ID1cbiAgICAgIHRoaXMudHJlZUxpc3Q/LmVsPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCcucC10cmVlLWNvbnRhaW5lcicpO1xuICAgIGlmICh0aGlzLnRyZWVDb250YWluZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLnRyZWVDb250YWluZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdjbGljaycsXG4gICAgICAgIHRoaXMuX2hhbmRsZU9uQ29udGFpbmVyQ2xpY2suYmluZCh0aGlzKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPbkNvbnRhaW5lckNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBnZXRQYXJlbnRXaXRoQ2xhc3MoXG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICAgICBjbGFzc05hbWU6IHN0cmluZ1xuICAgICkge1xuICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25Gb2N1c2VkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGVsZW0gPSBldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwLXRyZWVub2RlLWNvbnRlbnQnKVxuICAgICAgPyBldmVudC50YXJnZXRcbiAgICAgIDogZ2V0UGFyZW50V2l0aENsYXNzKGV2ZW50LnRhcmdldCwgJ3AtdHJlZW5vZGUtY29udGVudCcpO1xuXG4gICAgaWYgKFxuICAgICAgZWxlbT8ucGFyZW50RWxlbWVudD8uY2xhc3NMaXN0Py5jb250YWlucygnY3BzLXRyZWUtbm9kZS1mdWxseS1leHBhbmRhYmxlJylcbiAgICApIHtcbiAgICAgIHRoaXMub25DbGlja0Z1bGx5RXhwYW5kYWJsZShlbGVtKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uQ2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHt9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnksIGludGVybmFsID0gZmFsc2UpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCFpbnRlcm5hbCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy50cmVlU2VsZWN0aW9uID0gdGhpcy5fdmFsdWVUb1RyZWVTZWxlY3Rpb24odGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSwgdHJ1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZWQuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblNlbGVjdE5vZGUoKSB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRvZ2dsZU9wdGlvbnMoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tGdWxseUV4cGFuZGFibGUoZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0SFRNTEVsZW1lbnRLZXkocGFyZW50KTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJlZU5vZGUgPSB0aGlzLm9wdGlvbnMuZmluZCgobykgPT4gby5rZXkgPT09IGtleSk7XG4gICAgaWYgKCF0cmVlTm9kZSkgcmV0dXJuO1xuXG4gICAgdHJlZU5vZGUuZXhwYW5kZWQgPSAhdHJlZU5vZGUuZXhwYW5kZWQ7XG4gICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9ub2RlVG9nZ2xlZChlbGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhUTUxFbGVtZW50S2V5KGVsZW06IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFlbGVtPy5jbGFzc0xpc3QpIHJldHVybiAnJztcbiAgICBjb25zdCBjbGFzc0xpc3QgPSBbLi4uZWxlbS5jbGFzc0xpc3RdO1xuICAgIGNvbnN0IGtleSA9IGNsYXNzTGlzdC5maW5kKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zdGFydHNXaXRoKCdrZXktJyk7XG4gICAgfSk7XG4gICAgaWYgKCFrZXkpIHJldHVybiAnJztcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UoJ2tleS0nLCAnJyk7XG4gIH1cblxuICB0cmVlU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb246IGFueSkge1xuICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy50cmVlU2VsZWN0aW9uVG9WYWx1ZShzZWxlY3Rpb24pKTtcbiAgfVxuXG4gIHJlY2FsY1ZpcnR1YWxMaXN0SGVpZ2h0KCkge1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudExlbiA9IHRoaXMudHJlZUxpc3Q/LnNlcmlhbGl6ZWRWYWx1ZT8ubGVuZ3RoIHx8IDA7XG4gICAgdGhpcy52aXJ0dWFsTGlzdEhlaWdodCA9IE1hdGgubWluKFxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsSXRlbVNpemUgKiBjdXJyZW50TGVuLFxuICAgICAgMjQwXG4gICAgKTtcbiAgfVxuXG4gIHRvZ2dsZU9wdGlvbnMoc2hvdz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzT3BlbmVkID09PSBzaG93KSByZXR1cm47XG5cbiAgICBpZiAodHlwZW9mIHNob3cgPT09ICdib29sZWFuJykge1xuICAgICAgaWYgKHNob3cpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zTWVudS5zaG93KHtcbiAgICAgICAgICB0YXJnZXQ6IHRoaXMuYm94RWwubmF0aXZlRWxlbWVudFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3B0aW9uc01lbnUuaGlkZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnNNZW51LnRvZ2dsZSh7XG4gICAgICAgIHRhcmdldDogdGhpcy5ib3hFbC5uYXRpdmVFbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmlzT3BlbmVkID0gdGhpcy5vcHRpb25zTWVudS5pc1Zpc2libGUoKTtcblxuICAgIHRoaXMub3B0aW9uRm9jdXNlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzT3BlbmVkICYmIHRoaXMudHJlZVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5fZXhwYW5kVG9Ob2RlcyhcbiAgICAgICAgdGhpcy5tdWx0aXBsZSA/IHRoaXMudHJlZVNlbGVjdGlvbiA6IFt0aGlzLnRyZWVTZWxlY3Rpb25dXG4gICAgICApO1xuICAgICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWNhbGNWaXJ0dWFsTGlzdEhlaWdodCgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudHJlZUNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAnLnAtaGlnaGxpZ2h0J1xuICAgICAgICApIGFzIGFueTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgc2VsZWN0ZWQuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgICAgICAgIGJsb2NrOiAnbmVhcmVzdCcsXG4gICAgICAgICAgICBpbmxpbmU6ICdjZW50ZXInXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmIHRoaXMudHJlZVNlbGVjdGlvbikge1xuICAgICAgICAgIGxldCBrZXkgPSAnJztcbiAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJlZVNlbGVjdGlvbi5sZW5ndGggPiAwKSBrZXkgPSB0aGlzLnRyZWVTZWxlY3Rpb25bMF0ua2V5O1xuICAgICAgICAgIH0gZWxzZSBrZXkgPSB0aGlzLnRyZWVTZWxlY3Rpb24ua2V5O1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9XG4gICAgICAgICAgICAgIHRoaXMudHJlZUxpc3Q/LnNlcmlhbGl6ZWRWYWx1ZT8uZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICh2KSA9PiB2Lm5vZGUua2V5ID09PSBrZXlcbiAgICAgICAgICAgICAgKSB8fCAtMTtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMCkgdGhpcy50cmVlTGlzdC5zY3JvbGxUb1ZpcnR1YWxJbmRleChpZHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlKG9wdGlvbjogVHJlZU5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHJldHVybjtcblxuICAgIHRoaXMudHJlZVNlbGVjdGlvbiA9IHRoaXMudHJlZVNlbGVjdGlvbi5maWx0ZXIoXG4gICAgICAodjogVHJlZU5vZGUpID0+ICFpc0VxdWFsKHYsIG9wdGlvbilcbiAgICApO1xuICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy50cmVlU2VsZWN0aW9uVG9WYWx1ZSh0aGlzLnRyZWVTZWxlY3Rpb24pKTtcbiAgfVxuXG4gIGluaXRBcnJvd3NOYXZpZ2F0b24oKSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbmVkKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMub3B0aW9uRm9jdXNlZCkge1xuICAgICAgY29uc3QgZmlyc3RFbGVtID0gdGhpcy50cmVlQ29udGFpbmVyRWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJy5wLXRyZWVub2RlLWNvbnRlbnQnXG4gICAgICApO1xuICAgICAgaWYgKGZpcnN0RWxlbSkgKGZpcnN0RWxlbSBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgIHRoaXMub3B0aW9uRm9jdXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbm9kZVRvZ2dsZWQoZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLnJlY2FsY1ZpcnR1YWxMaXN0SGVpZ2h0KCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm9wdGlvbnNNZW51LmFsaWduKCk7XG4gICAgfSk7XG4gICAgZWxlbT8uZm9jdXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX25vZGVUb2dnbGVkV2l0aENoZXZyb24oZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9ub2RlVG9nZ2xlZChlbGVtKTtcbiAgICAvLyBmaXggcHJpbWVuZyB0cmVlIGV2ZW50IHN0b3AgcHJvcGFnYXRpb25cbiAgICB0aGlzLm9wdGlvbnNNZW51LnNlbGZDbGljayA9IGZhbHNlO1xuICB9XG5cbiAgb25Ob2RlRXhwYW5kKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLl9ub2RlVG9nZ2xlZFdpdGhDaGV2cm9uKFxuICAgICAgZXZlbnQ/Lm9yaWdpbmFsRXZlbnQ/LmN1cnJlbnRUYXJnZXQ/LnBhcmVudEVsZW1lbnRcbiAgICApO1xuICB9XG5cbiAgb25Ob2RlQ29sbGFwc2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuX25vZGVUb2dnbGVkV2l0aENoZXZyb24oXG4gICAgICBldmVudD8ub3JpZ2luYWxFdmVudD8uY3VycmVudFRhcmdldD8ucGFyZW50RWxlbWVudFxuICAgICk7XG4gIH1cblxuICBjbGVhcihldmVudDogYW55KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoXG4gICAgICAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy50cmVlU2VsZWN0aW9uKSB8fFxuICAgICAgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy50cmVlU2VsZWN0aW9uPy5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMub3Blbk9uQ2xlYXIpIHtcbiAgICAgICAgdGhpcy50b2dnbGVPcHRpb25zKHRydWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsID0gdGhpcy5tdWx0aXBsZSA/IFtdIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy50cmVlU2VsZWN0aW9uID0gdmFsO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWwpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbkZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrRXJyb3JzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuY29udHJvbD8uZXJyb3JzO1xuXG4gICAgaWYgKCF0aGlzLmNvbnRyb2w/LmNvbnRyb2w/LnRvdWNoZWQgfHwgIWVycm9ycykge1xuICAgICAgdGhpcy5lcnJvciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgncmVxdWlyZWQnIGluIGVycm9ycykge1xuICAgICAgdGhpcy5lcnJvciA9ICdGaWVsZCBpcyByZXF1aXJlZCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyQXJyID0gT2JqZWN0LnZhbHVlcyhlcnJvcnMpO1xuICAgIGlmIChlcnJBcnIubGVuZ3RoIDwgMSkge1xuICAgICAgdGhpcy5lcnJvciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyQXJyLmZpbmQoKG1zZykgPT4gdHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpO1xuXG4gICAgdGhpcy5lcnJvciA9IG1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKSB7fVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLmNvbnRyb2w/LmNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLl9jaGVja0Vycm9ycygpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgdGhpcy5jb21wb25lbnRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgdGhpcy50b2dnbGVPcHRpb25zKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhwYW5kVG9Ob2Rlcyhub2RlczogYW55W10pIHtcbiAgICBmdW5jdGlvbiBnZXRQYXJlbnRLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgY29uc3QgbGFzdFNlcGFyYXRvckluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCctJyk7XG4gICAgICBpZiAobGFzdFNlcGFyYXRvckluZGV4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4ga2V5LnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9ySW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IHBhcmVudE5vZGVLZXkgPSBnZXRQYXJlbnRLZXkobm9kZS5rZXkpO1xuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMub3B0aW9uc01hcC5nZXQocGFyZW50Tm9kZUtleSkgfHwgbnVsbDtcblxuICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgcGFyZW50Tm9kZS5leHBhbmRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2V4cGFuZFRvTm9kZXMoW3BhcmVudE5vZGVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3RvSW5uZXJPcHRpb25zKF9vcHRpb25zOiBhbnlbXSk6IFRyZWVOb2RlW10ge1xuICAgIGNvbnN0IG1hcE9wdGlvbiA9IChcbiAgICAgIG86IGFueSxcbiAgICAgIG9wdGlvbkxhYmVsOiBzdHJpbmcsXG4gICAgICBvcHRpb25JbmZvOiBzdHJpbmcsXG4gICAgICBrZXk6IHN0cmluZyxcbiAgICAgIG9yaWdpbmFsT3B0aW9uc01hcDogYW55XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBpbm5lciA9IHtcbiAgICAgICAgaW5uZXI6IHRydWUsXG4gICAgICAgIGxhYmVsOiBvW29wdGlvbkxhYmVsXSxcbiAgICAgICAgaW5mbzogb1tvcHRpb25JbmZvXSxcbiAgICAgICAga2V5LFxuICAgICAgICBzdHlsZUNsYXNzOiAna2V5LScgKyBrZXlcbiAgICAgIH0gYXMgVHJlZU5vZGU7XG5cbiAgICAgIGlmICh0aGlzLmluaXRpYWxFeHBhbmRBbGwpIHtcbiAgICAgICAgaW5uZXIuZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoby5pc0RpcmVjdG9yeSkge1xuICAgICAgICBpbm5lci50eXBlID0gJ2RpcmVjdG9yeSc7XG4gICAgICAgIGlubmVyLnNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICAgICAgaW5uZXIuc3R5bGVDbGFzcyArPSAnIGNwcy10cmVlLW5vZGUtZnVsbHktZXhwYW5kYWJsZSc7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxFeHBhbmREaXJlY3Rvcmllcykge1xuICAgICAgICAgIGlubmVyLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG8uY2hpbGRyZW4pIHtcbiAgICAgICAgaW5uZXIuY2hpbGRyZW4gPSBvLmNoaWxkcmVuLm1hcCgoYzogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG1hcE9wdGlvbihcbiAgICAgICAgICAgIGMsXG4gICAgICAgICAgICBvcHRpb25MYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbkluZm8sXG4gICAgICAgICAgICBrZXkgKyAnLScgKyBpbmRleCxcbiAgICAgICAgICAgIG9yaWdpbmFsT3B0aW9uc01hcFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxPcHRpb25zTWFwLnNldChrZXksIG8pO1xuICAgICAgcmV0dXJuIGlubmVyO1xuICAgIH07XG5cbiAgICBjb25zdCByZXMgPSBfb3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBtYXBPcHRpb24oXG4gICAgICAgIG9wdGlvbixcbiAgICAgICAgdGhpcy5vcHRpb25MYWJlbCxcbiAgICAgICAgdGhpcy5vcHRpb25JbmZvLFxuICAgICAgICAnJyArIGluZGV4LFxuICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9uc01hcFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMub3B0aW9uc01hcCA9IHRoaXMuX2J1aWxkT3B0aW9uc01hcChyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkT3B0aW9uc01hcChvcHRpb25zOiBhbnlbXSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgIG5vZGVNYXAuc2V0KG9wdGlvbi5rZXksIG9wdGlvbik7XG4gICAgICBpZiAob3B0aW9uLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZU1hcCA9IHRoaXMuX2J1aWxkT3B0aW9uc01hcChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICBjaGlsZE5vZGVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gbm9kZU1hcC5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZU1hcDtcbiAgfVxuXG4gIHRyZWVTZWxlY3Rpb25Ub1ZhbHVlKHNlbGVjdGlvbjogYW55KSB7XG4gICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiB0aGlzLm11bHRpcGxlID8gW10gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBzZWxlY3Rpb24ubWFwKChzOiBhbnkpID0+IHRoaXMub3JpZ2luYWxPcHRpb25zTWFwLmdldChzLmtleSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbE9wdGlvbnNNYXAuZ2V0KHNlbGVjdGlvbi5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3ZhbHVlVG9UcmVlU2VsZWN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICBmdW5jdGlvbiBnZXRLZXkodjogYW55LCBtYXA6IE1hcDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIG1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGlzRXF1YWwodiwgdmFsKSkge1xuICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IFtdIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IHJlcyA9IFtdIGFzIFRyZWVOb2RlW107XG4gICAgICB2YWx1ZS5mb3JFYWNoKCh2OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0S2V5KHYsIHRoaXMub3JpZ2luYWxPcHRpb25zTWFwKTtcbiAgICAgICAgaWYgKGtleSkgcmVzLnB1c2godGhpcy5vcHRpb25zTWFwLmdldChrZXkpIGFzIFRyZWVOb2RlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0S2V5KHZhbHVlLCB0aGlzLm9yaWdpbmFsT3B0aW9uc01hcCk7XG4gICAgICByZXR1cm4ga2V5ID8gdGhpcy5vcHRpb25zTWFwLmdldChrZXkpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMgaXMgYSBmaXggb2YgcHJpbWVuZyBjaGFuZ2UgZGV0ZWN0aW9uIGJ1ZyB3aGVuIHZpcnR1YWwgc2Nyb2xsZXIgaXMgZW5hYmxlZFxuICB1cGRhdGVPcHRpb25zKCkge1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSByZXR1cm47XG4gICAgdGhpcy5vcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XG4gIH1cbn1cbiJdfQ==
|