ngx-dropdown-list 1.1.0 → 1.2.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 +2 -2
- package/esm2020/ngx-dropdown-list.mjs +5 -0
- package/esm2020/public_api.mjs +2 -0
- package/esm2020/src/ngx-dropdown-list/anchor/anchor.component.mjs +149 -0
- package/esm2020/src/ngx-dropdown-list/dropdown/dropdown.component.mjs +252 -0
- package/esm2020/src/ngx-dropdown-list/dropdown-list.component.mjs +233 -0
- package/esm2020/src/ngx-dropdown-list/dropdown-list.module.mjs +38 -0
- package/esm2020/src/ngx-dropdown-list/filter/input-filter.component.mjs +44 -0
- package/esm2020/src/ngx-dropdown-list/group-item/group-item.component.mjs +25 -0
- package/esm2020/src/ngx-dropdown-list/index.mjs +3 -0
- package/esm2020/src/ngx-dropdown-list/item/item.component.mjs +77 -0
- package/esm2020/src/ngx-dropdown-list/types/index.mjs +3 -0
- package/esm2020/src/ngx-dropdown-list/types/selection-group-items.types.mjs +2 -0
- package/esm2020/src/ngx-dropdown-list/types/selection-item.types.mjs +2 -0
- package/esm2020/src/ngx-dropdown-list/utils/util.mjs +59 -0
- package/fesm2015/ngx-dropdown-list.mjs +854 -0
- package/fesm2015/ngx-dropdown-list.mjs.map +1 -0
- package/fesm2020/ngx-dropdown-list.mjs +854 -0
- package/fesm2020/ngx-dropdown-list.mjs.map +1 -0
- package/ngx-dropdown-list.d.ts +1 -5
- package/package.json +26 -48
- package/src/ngx-dropdown-list/anchor/anchor.component.d.ts +6 -3
- package/src/ngx-dropdown-list/dropdown/dropdown.component.d.ts +5 -2
- package/src/ngx-dropdown-list/dropdown-list.component.d.ts +7 -4
- package/src/ngx-dropdown-list/dropdown-list.module.d.ts +12 -0
- package/src/ngx-dropdown-list/filter/input-filter.component.d.ts +3 -0
- package/src/ngx-dropdown-list/group-item/group-item.component.d.ts +3 -0
- package/src/ngx-dropdown-list/item/item.component.d.ts +3 -0
- package/bundles/ngx-dropdown-list.umd.js +0 -1180
- package/bundles/ngx-dropdown-list.umd.js.map +0 -1
- package/bundles/ngx-dropdown-list.umd.min.js +0 -2
- package/bundles/ngx-dropdown-list.umd.min.js.map +0 -1
- package/esm2015/ngx-dropdown-list.js +0 -14
- package/esm2015/public_api.js +0 -6
- package/esm2015/src/ngx-dropdown-list/anchor/anchor.component.js +0 -226
- package/esm2015/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -339
- package/esm2015/src/ngx-dropdown-list/dropdown-list.component.js +0 -290
- package/esm2015/src/ngx-dropdown-list/dropdown-list.module.js +0 -32
- package/esm2015/src/ngx-dropdown-list/filter/input-filter.component.js +0 -64
- package/esm2015/src/ngx-dropdown-list/group-item/group-item.component.js +0 -37
- package/esm2015/src/ngx-dropdown-list/index.js +0 -7
- package/esm2015/src/ngx-dropdown-list/item/item.component.js +0 -104
- package/esm2015/src/ngx-dropdown-list/types/index.js +0 -7
- package/esm2015/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
- package/esm2015/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
- package/esm2015/src/ngx-dropdown-list/utils/util.js +0 -73
- package/esm5/ngx-dropdown-list.js +0 -14
- package/esm5/public_api.js +0 -6
- package/esm5/src/ngx-dropdown-list/anchor/anchor.component.js +0 -272
- package/esm5/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -408
- package/esm5/src/ngx-dropdown-list/dropdown-list.component.js +0 -361
- package/esm5/src/ngx-dropdown-list/dropdown-list.module.js +0 -36
- package/esm5/src/ngx-dropdown-list/filter/input-filter.component.js +0 -79
- package/esm5/src/ngx-dropdown-list/group-item/group-item.component.js +0 -47
- package/esm5/src/ngx-dropdown-list/index.js +0 -7
- package/esm5/src/ngx-dropdown-list/item/item.component.js +0 -120
- package/esm5/src/ngx-dropdown-list/types/index.js +0 -7
- package/esm5/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
- package/esm5/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
- package/esm5/src/ngx-dropdown-list/utils/util.js +0 -96
- package/fesm2015/ngx-dropdown-list.js +0 -890
- package/fesm2015/ngx-dropdown-list.js.map +0 -1
- package/fesm5/ngx-dropdown-list.js +0 -1137
- package/fesm5/ngx-dropdown-list.js.map +0 -1
- package/ngx-dropdown-list.metadata.json +0 -1
|
@@ -1,1137 +0,0 @@
|
|
|
1
|
-
import { __values } from 'tslib';
|
|
2
|
-
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, NgModule } from '@angular/core';
|
|
3
|
-
import { DecimalPipe, CommonModule } from '@angular/common';
|
|
4
|
-
import { FormsModule } from '@angular/forms';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @fileoverview added by tsickle
|
|
8
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* check whether the provided items contains group
|
|
12
|
-
* @param {?} items
|
|
13
|
-
* @return {?}
|
|
14
|
-
*/
|
|
15
|
-
function hasGroup(items) {
|
|
16
|
-
return items ? (items.find(function (item) { return item.group; }) != null) : false;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* clear all selections from the provide items.
|
|
20
|
-
* @param {?} items the dropdown items, can be group or item
|
|
21
|
-
* @return {?}
|
|
22
|
-
*/
|
|
23
|
-
function clearAllSelection(items) {
|
|
24
|
-
var e_1, _a;
|
|
25
|
-
if (hasGroup(items)) {
|
|
26
|
-
try {
|
|
27
|
-
for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
|
|
28
|
-
var groupItem = items_1_1.value;
|
|
29
|
-
if (groupItem.items) {
|
|
30
|
-
groupItem.items.filter(function (item) { return item.selected; }).forEach(function (item) { return item.selected = false; });
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
35
|
-
finally {
|
|
36
|
-
try {
|
|
37
|
-
if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
|
|
38
|
-
}
|
|
39
|
-
finally { if (e_1) throw e_1.error; }
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
// clear the selection of previous selected item
|
|
44
|
-
items.filter(function (item) { return item.selected; }).forEach(function (item) { return item.selected = false; });
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* stop all propagation and default actions
|
|
49
|
-
* @param {?} event
|
|
50
|
-
* @return {?}
|
|
51
|
-
*/
|
|
52
|
-
function stopPropagationAndDefault(event) {
|
|
53
|
-
event.stopImmediatePropagation();
|
|
54
|
-
event.stopPropagation();
|
|
55
|
-
event.preventDefault();
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* check whether the provided value is number of not
|
|
59
|
-
* @param {?} value
|
|
60
|
-
* @return {?}
|
|
61
|
-
*/
|
|
62
|
-
function isNumber(value) {
|
|
63
|
-
return !(value == null || isNaN(value) || value.length === 0);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* get the selected item from the items list (including item and group)
|
|
67
|
-
* @param {?} items
|
|
68
|
-
* @return {?}
|
|
69
|
-
*/
|
|
70
|
-
function getFirstSelectedItem(items) {
|
|
71
|
-
var e_2, _a;
|
|
72
|
-
if (!items) {
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
/** @type {?} */
|
|
76
|
-
var selectedItem;
|
|
77
|
-
if (hasGroup(items)) {
|
|
78
|
-
try {
|
|
79
|
-
for (var items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
|
|
80
|
-
var item = items_2_1.value;
|
|
81
|
-
selectedItem = item.items ? item.items.find(function (subItem) { return subItem.selected; }) : undefined;
|
|
82
|
-
if (selectedItem) {
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
88
|
-
finally {
|
|
89
|
-
try {
|
|
90
|
-
if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
|
|
91
|
-
}
|
|
92
|
-
finally { if (e_2) throw e_2.error; }
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
selectedItem = items ? items.find(function (item) { return item.selected; }) : undefined;
|
|
97
|
-
}
|
|
98
|
-
return selectedItem;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* @fileoverview added by tsickle
|
|
103
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
104
|
-
*/
|
|
105
|
-
var DropdownListComponent = /** @class */ (function () {
|
|
106
|
-
function DropdownListComponent() {
|
|
107
|
-
/**
|
|
108
|
-
* bind to [multiSelection], the flag for multi-select (checkbox) mode.
|
|
109
|
-
*/
|
|
110
|
-
this.multiSelection = false;
|
|
111
|
-
/**
|
|
112
|
-
* bind to [filterBox] for displaying the filter input text box
|
|
113
|
-
*/
|
|
114
|
-
this.filterBox = false;
|
|
115
|
-
/**
|
|
116
|
-
* bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
|
|
117
|
-
*/
|
|
118
|
-
this.allowClear = true;
|
|
119
|
-
/**
|
|
120
|
-
* bind to [formatNumber] for show formatted number text
|
|
121
|
-
*/
|
|
122
|
-
this.formatNumber = false;
|
|
123
|
-
/**
|
|
124
|
-
* for 2-way binding of [selectedValue], using async event to
|
|
125
|
-
* prevent "ExpressionChangedAfterItHasBeenCheckedError".
|
|
126
|
-
*/
|
|
127
|
-
this.selectedValueChange = new EventEmitter(true);
|
|
128
|
-
/**
|
|
129
|
-
* [selectionChange] event that will be triggered when changing of the selection.
|
|
130
|
-
* Using async event to prevent "ExpressionChangedAfterItHasBeenCheckedError".
|
|
131
|
-
*/
|
|
132
|
-
this.selectionChange = new EventEmitter(true);
|
|
133
|
-
/**
|
|
134
|
-
* visibility flag of drop down
|
|
135
|
-
*/
|
|
136
|
-
this.dropdownVisibility = false;
|
|
137
|
-
}
|
|
138
|
-
Object.defineProperty(DropdownListComponent.prototype, "selectedText", {
|
|
139
|
-
/**
|
|
140
|
-
* current selected text
|
|
141
|
-
*/
|
|
142
|
-
get: /**
|
|
143
|
-
* current selected text
|
|
144
|
-
* @return {?}
|
|
145
|
-
*/
|
|
146
|
-
function () {
|
|
147
|
-
if (!this.multiSelection) {
|
|
148
|
-
/** @type {?} */
|
|
149
|
-
var selectedItem = getFirstSelectedItem(this.items);
|
|
150
|
-
return selectedItem ? selectedItem.text : undefined;
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
enumerable: true,
|
|
154
|
-
configurable: true
|
|
155
|
-
});
|
|
156
|
-
/**
|
|
157
|
-
* triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
|
|
158
|
-
*/
|
|
159
|
-
/**
|
|
160
|
-
* triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
|
|
161
|
-
* @param {?} event
|
|
162
|
-
* @return {?}
|
|
163
|
-
*/
|
|
164
|
-
DropdownListComponent.prototype.onSelectionChange = /**
|
|
165
|
-
* triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
|
|
166
|
-
* @param {?} event
|
|
167
|
-
* @return {?}
|
|
168
|
-
*/
|
|
169
|
-
function (event) {
|
|
170
|
-
this.selectedValueChange.emit(event);
|
|
171
|
-
this.selectionChange.emit(event);
|
|
172
|
-
};
|
|
173
|
-
/**
|
|
174
|
-
* triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
|
|
175
|
-
*/
|
|
176
|
-
/**
|
|
177
|
-
* triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
|
|
178
|
-
* @param {?} event
|
|
179
|
-
* @return {?}
|
|
180
|
-
*/
|
|
181
|
-
DropdownListComponent.prototype.onAnchorClick = /**
|
|
182
|
-
* triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
|
|
183
|
-
* @param {?} event
|
|
184
|
-
* @return {?}
|
|
185
|
-
*/
|
|
186
|
-
function (event) {
|
|
187
|
-
if (this.disabled) {
|
|
188
|
-
stopPropagationAndDefault(event);
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
if (this._isSelectionOpen()) {
|
|
192
|
-
this._hideItemList();
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
this._showItemsList();
|
|
196
|
-
}
|
|
197
|
-
stopPropagationAndDefault(event);
|
|
198
|
-
};
|
|
199
|
-
/**
|
|
200
|
-
* triggered with (itemClick) event, closes the dropdown in non-checkbox mode
|
|
201
|
-
*/
|
|
202
|
-
/**
|
|
203
|
-
* triggered with (itemClick) event, closes the dropdown in non-checkbox mode
|
|
204
|
-
* @return {?}
|
|
205
|
-
*/
|
|
206
|
-
DropdownListComponent.prototype.onItemClick = /**
|
|
207
|
-
* triggered with (itemClick) event, closes the dropdown in non-checkbox mode
|
|
208
|
-
* @return {?}
|
|
209
|
-
*/
|
|
210
|
-
function () {
|
|
211
|
-
if (!this.multiSelection) {
|
|
212
|
-
this._hideItemList();
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
/**
|
|
216
|
-
* triggered with (clearanceClick) event, clearing all selections
|
|
217
|
-
* and emits (selectedValueChange) and (selectionChange) event for empty value
|
|
218
|
-
*/
|
|
219
|
-
/**
|
|
220
|
-
* triggered with (clearanceClick) event, clearing all selections
|
|
221
|
-
* and emits (selectedValueChange) and (selectionChange) event for empty value
|
|
222
|
-
* @param {?} event
|
|
223
|
-
* @return {?}
|
|
224
|
-
*/
|
|
225
|
-
DropdownListComponent.prototype.onClearanceClick = /**
|
|
226
|
-
* triggered with (clearanceClick) event, clearing all selections
|
|
227
|
-
* and emits (selectedValueChange) and (selectionChange) event for empty value
|
|
228
|
-
* @param {?} event
|
|
229
|
-
* @return {?}
|
|
230
|
-
*/
|
|
231
|
-
function (event) {
|
|
232
|
-
if (!this.multiSelection) {
|
|
233
|
-
this.selectedValue = void 0;
|
|
234
|
-
this.selectedValueChange.emit(undefined);
|
|
235
|
-
this.selectionChange.emit(undefined);
|
|
236
|
-
clearAllSelection(this.items);
|
|
237
|
-
}
|
|
238
|
-
stopPropagationAndDefault(event);
|
|
239
|
-
};
|
|
240
|
-
/**
|
|
241
|
-
* triggered with (dropdownBlur) event, closes the dropdown
|
|
242
|
-
*/
|
|
243
|
-
/**
|
|
244
|
-
* triggered with (dropdownBlur) event, closes the dropdown
|
|
245
|
-
* @return {?}
|
|
246
|
-
*/
|
|
247
|
-
DropdownListComponent.prototype.onItemsBlur = /**
|
|
248
|
-
* triggered with (dropdownBlur) event, closes the dropdown
|
|
249
|
-
* @return {?}
|
|
250
|
-
*/
|
|
251
|
-
function () {
|
|
252
|
-
if (this._isSelectionOpen()) {
|
|
253
|
-
this._hideItemList();
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
/**
|
|
257
|
-
* close the dropdown
|
|
258
|
-
*/
|
|
259
|
-
/**
|
|
260
|
-
* close the dropdown
|
|
261
|
-
* @private
|
|
262
|
-
* @return {?}
|
|
263
|
-
*/
|
|
264
|
-
DropdownListComponent.prototype._hideItemList = /**
|
|
265
|
-
* close the dropdown
|
|
266
|
-
* @private
|
|
267
|
-
* @return {?}
|
|
268
|
-
*/
|
|
269
|
-
function () {
|
|
270
|
-
// hide the dropdown element (has some problem for using CSS directly, using this as a workaround)
|
|
271
|
-
this._dropdownElement.classList.remove('visible');
|
|
272
|
-
this._dropdownElement.style.display = 'none';
|
|
273
|
-
this.dropdownVisibility = false;
|
|
274
|
-
};
|
|
275
|
-
/**
|
|
276
|
-
* open the dropdown
|
|
277
|
-
*/
|
|
278
|
-
/**
|
|
279
|
-
* open the dropdown
|
|
280
|
-
* @private
|
|
281
|
-
* @return {?}
|
|
282
|
-
*/
|
|
283
|
-
DropdownListComponent.prototype._showItemsList = /**
|
|
284
|
-
* open the dropdown
|
|
285
|
-
* @private
|
|
286
|
-
* @return {?}
|
|
287
|
-
*/
|
|
288
|
-
function () {
|
|
289
|
-
// display the dropdown element (has some problem for using CSS directly, using this as a workaround)
|
|
290
|
-
this._dropdownElement.classList.add('visible');
|
|
291
|
-
this._dropdownElement.style.display = 'block';
|
|
292
|
-
this.dropdownVisibility = true;
|
|
293
|
-
// scrolling to the selected item
|
|
294
|
-
if (this._selectedElement) {
|
|
295
|
-
this._selectedElement.scrollIntoView({ behavior: 'instant', block: 'center' });
|
|
296
|
-
}
|
|
297
|
-
// setting the focus
|
|
298
|
-
if (this.filterBox && !this.multiSelection) {
|
|
299
|
-
this._filterInputElement.focus();
|
|
300
|
-
}
|
|
301
|
-
else {
|
|
302
|
-
this._dropdownElement.focus();
|
|
303
|
-
}
|
|
304
|
-
};
|
|
305
|
-
/**
|
|
306
|
-
* visibility status of dropdown
|
|
307
|
-
*/
|
|
308
|
-
/**
|
|
309
|
-
* visibility status of dropdown
|
|
310
|
-
* @private
|
|
311
|
-
* @return {?}
|
|
312
|
-
*/
|
|
313
|
-
DropdownListComponent.prototype._isSelectionOpen = /**
|
|
314
|
-
* visibility status of dropdown
|
|
315
|
-
* @private
|
|
316
|
-
* @return {?}
|
|
317
|
-
*/
|
|
318
|
-
function () {
|
|
319
|
-
return this.dropdownVisibility;
|
|
320
|
-
};
|
|
321
|
-
Object.defineProperty(DropdownListComponent.prototype, "_dropdownElement", {
|
|
322
|
-
/**
|
|
323
|
-
* get the real dropdown element (for focusing and visibility controlling), the <span> not the <dropdown>
|
|
324
|
-
*/
|
|
325
|
-
get: /**
|
|
326
|
-
* get the real dropdown element (for focusing and visibility controlling), the <span> not the <dropdown>
|
|
327
|
-
* @private
|
|
328
|
-
* @return {?}
|
|
329
|
-
*/
|
|
330
|
-
function () {
|
|
331
|
-
return this.dropdownRef ? this.dropdownRef.nativeElement ? this.dropdownRef.nativeElement.firstElementChild : null : null;
|
|
332
|
-
},
|
|
333
|
-
enumerable: true,
|
|
334
|
-
configurable: true
|
|
335
|
-
});
|
|
336
|
-
Object.defineProperty(DropdownListComponent.prototype, "_filterInputElement", {
|
|
337
|
-
/**
|
|
338
|
-
* get the real filter element (for focusing), the <input> not the <input-filter>
|
|
339
|
-
*/
|
|
340
|
-
get: /**
|
|
341
|
-
* get the real filter element (for focusing), the <input> not the <input-filter>
|
|
342
|
-
* @private
|
|
343
|
-
* @return {?}
|
|
344
|
-
*/
|
|
345
|
-
function () {
|
|
346
|
-
return this._dropdownElement ?
|
|
347
|
-
this._dropdownElement.firstElementChild ? this._dropdownElement.firstElementChild.firstElementChild : null : null;
|
|
348
|
-
},
|
|
349
|
-
enumerable: true,
|
|
350
|
-
configurable: true
|
|
351
|
-
});
|
|
352
|
-
Object.defineProperty(DropdownListComponent.prototype, "_selectedElement", {
|
|
353
|
-
/**
|
|
354
|
-
* get the HTMLElement of selected item, for doing (scrollIntoView) scrolling to the selected item
|
|
355
|
-
*/
|
|
356
|
-
get: /**
|
|
357
|
-
* get the HTMLElement of selected item, for doing (scrollIntoView) scrolling to the selected item
|
|
358
|
-
* @private
|
|
359
|
-
* @return {?}
|
|
360
|
-
*/
|
|
361
|
-
function () {
|
|
362
|
-
/** @type {?} */
|
|
363
|
-
var selectedItem = getFirstSelectedItem(this.items);
|
|
364
|
-
return selectedItem ? (/** @type {?} */ (document.getElementById(selectedItem.id))) : undefined;
|
|
365
|
-
},
|
|
366
|
-
enumerable: true,
|
|
367
|
-
configurable: true
|
|
368
|
-
});
|
|
369
|
-
DropdownListComponent.decorators = [
|
|
370
|
-
{ type: Component, args: [{
|
|
371
|
-
selector: 'ngx-dropdown-list',
|
|
372
|
-
template: "\n <span class=\"ngx-select\">\n <anchor (anchorClick)=\"onAnchorClick($event)\" (clearanceClick)=\"onClearanceClick($event)\"\n [checkbox]=\"multiSelection\"\n [formatNumber]=\"formatNumber\"\n [suffixText]=\"suffixText\"\n [placeHolder]=\"placeHolder\"\n [allowClear]=\"allowClear\"\n [openStatus]=\"dropdownVisibility\"\n [selectedText]=\"selectedText\"\n [disabled]=\"disabled\">\n </anchor>\n <dropdown #dropdown (dropdownBlur) = \"onItemsBlur()\" (selectionChange)=\"onSelectionChange($event)\"\n [items]=\"items\"\n [checkbox]=\"multiSelection\"\n [filterBox]=\"filterBox\"\n [formatNumber]=\"formatNumber\"\n [suffixText]=\"suffixText\"\n [(selectedValue)]=\"selectedValue\"\n (itemClick) = \"onItemClick()\"\n [disabled]=\"disabled\">\n </dropdown>\n </span>\n ",
|
|
373
|
-
styles: [":host *,:host :after,:host :before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}:host .ngx-select{border-radius:4px;font-size:14px;position:relative;display:inline-block;width:100%;height:34px;background:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}"]
|
|
374
|
-
}] }
|
|
375
|
-
];
|
|
376
|
-
DropdownListComponent.propDecorators = {
|
|
377
|
-
dropdownRef: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
|
|
378
|
-
placeHolder: [{ type: Input }],
|
|
379
|
-
items: [{ type: Input }],
|
|
380
|
-
multiSelection: [{ type: Input }],
|
|
381
|
-
selectedValue: [{ type: Input }],
|
|
382
|
-
filterBox: [{ type: Input }],
|
|
383
|
-
suffixText: [{ type: Input }],
|
|
384
|
-
disabled: [{ type: Input }],
|
|
385
|
-
allowClear: [{ type: Input }],
|
|
386
|
-
formatNumber: [{ type: Input }],
|
|
387
|
-
selectedValueChange: [{ type: Output }],
|
|
388
|
-
selectionChange: [{ type: Output }]
|
|
389
|
-
};
|
|
390
|
-
return DropdownListComponent;
|
|
391
|
-
}());
|
|
392
|
-
|
|
393
|
-
/**
|
|
394
|
-
* @fileoverview added by tsickle
|
|
395
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
396
|
-
*/
|
|
397
|
-
var ItemComponent = /** @class */ (function () {
|
|
398
|
-
function ItemComponent() {
|
|
399
|
-
/**
|
|
400
|
-
* bind to [formatNumber], the flag for formatting the number
|
|
401
|
-
*/
|
|
402
|
-
this.formatNumber = false;
|
|
403
|
-
/**
|
|
404
|
-
* bind to [itemClick] event, triggers when clicking the item of dropdown
|
|
405
|
-
*/
|
|
406
|
-
this.itemClick = new EventEmitter();
|
|
407
|
-
/**
|
|
408
|
-
* bind to [checkStatusChange] event, triggers when check status is changed in checkbox mode.
|
|
409
|
-
*/
|
|
410
|
-
this.checkStatusChange = new EventEmitter();
|
|
411
|
-
}
|
|
412
|
-
/**
|
|
413
|
-
* check whether needs to format number for the provided text
|
|
414
|
-
*/
|
|
415
|
-
/**
|
|
416
|
-
* check whether needs to format number for the provided text
|
|
417
|
-
* @param {?} value
|
|
418
|
-
* @return {?}
|
|
419
|
-
*/
|
|
420
|
-
ItemComponent.prototype.needFormatNumber = /**
|
|
421
|
-
* check whether needs to format number for the provided text
|
|
422
|
-
* @param {?} value
|
|
423
|
-
* @return {?}
|
|
424
|
-
*/
|
|
425
|
-
function (value) {
|
|
426
|
-
return isNumber(value) && this.formatNumber;
|
|
427
|
-
};
|
|
428
|
-
/**
|
|
429
|
-
* triggered when clicking the item, emits the [itemClick] event
|
|
430
|
-
*/
|
|
431
|
-
/**
|
|
432
|
-
* triggered when clicking the item, emits the [itemClick] event
|
|
433
|
-
* @param {?} item
|
|
434
|
-
* @return {?}
|
|
435
|
-
*/
|
|
436
|
-
ItemComponent.prototype.onItemClick = /**
|
|
437
|
-
* triggered when clicking the item, emits the [itemClick] event
|
|
438
|
-
* @param {?} item
|
|
439
|
-
* @return {?}
|
|
440
|
-
*/
|
|
441
|
-
function (item) {
|
|
442
|
-
this.itemClick.emit(item);
|
|
443
|
-
};
|
|
444
|
-
/**
|
|
445
|
-
* triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
|
|
446
|
-
*/
|
|
447
|
-
/**
|
|
448
|
-
* triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
|
|
449
|
-
* @param {?} item
|
|
450
|
-
* @return {?}
|
|
451
|
-
*/
|
|
452
|
-
ItemComponent.prototype.onCheckStatusChange = /**
|
|
453
|
-
* triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
|
|
454
|
-
* @param {?} item
|
|
455
|
-
* @return {?}
|
|
456
|
-
*/
|
|
457
|
-
function (item) {
|
|
458
|
-
this.checkStatusChange.emit(item);
|
|
459
|
-
};
|
|
460
|
-
ItemComponent.decorators = [
|
|
461
|
-
{ type: Component, args: [{
|
|
462
|
-
selector: 'item',
|
|
463
|
-
template: "\n <label [class.container-checkbox]=\"checkbox\"\n [class.container-selection]=\"!checkbox && !item.selected\"\n [class.container-selection-selected]=\"!checkbox && item.selected\"\n [id]=\"item.id\" (mousedown)=\"onItemClick(item)\">\n {{needFormatNumber(item.text)? (item.text | number:'1.0-2') : item.text}}{{suffixText? suffixText : ''}}\n <ng-container *ngIf=\"checkbox\">\n <input type='checkbox' [id]=\"'checkbox-'+item.text\" (change)=\"onCheckStatusChange(item)\" [checked]=\"item.selected\">\n <span class=\"checkmark\" [id]=\"'checkmark-'+item.text\"></span>\n </ng-container>\n </label>",
|
|
464
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.container-checkbox,.container-selection,.container-selection-selected,.dropdown-item{background:0 0;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196f3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection-selected:hover,.container-selection:hover{color:#495057;background:#e0ffff}.container-selection-selected{color:#fff;background:#6495ed}"]
|
|
465
|
-
}] }
|
|
466
|
-
];
|
|
467
|
-
ItemComponent.propDecorators = {
|
|
468
|
-
checkbox: [{ type: Input }],
|
|
469
|
-
item: [{ type: Input }],
|
|
470
|
-
formatNumber: [{ type: Input }],
|
|
471
|
-
suffixText: [{ type: Input }],
|
|
472
|
-
itemClick: [{ type: Output }],
|
|
473
|
-
checkStatusChange: [{ type: Output }]
|
|
474
|
-
};
|
|
475
|
-
return ItemComponent;
|
|
476
|
-
}());
|
|
477
|
-
|
|
478
|
-
/**
|
|
479
|
-
* @fileoverview added by tsickle
|
|
480
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
481
|
-
*/
|
|
482
|
-
var GroupItemComponent = /** @class */ (function () {
|
|
483
|
-
function GroupItemComponent() {
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* prevent all clicking event from happening
|
|
487
|
-
*/
|
|
488
|
-
/**
|
|
489
|
-
* prevent all clicking event from happening
|
|
490
|
-
* @param {?} event
|
|
491
|
-
* @return {?}
|
|
492
|
-
*/
|
|
493
|
-
GroupItemComponent.prototype.onItemGroupClick = /**
|
|
494
|
-
* prevent all clicking event from happening
|
|
495
|
-
* @param {?} event
|
|
496
|
-
* @return {?}
|
|
497
|
-
*/
|
|
498
|
-
function (event) {
|
|
499
|
-
event.stopImmediatePropagation();
|
|
500
|
-
event.stopPropagation();
|
|
501
|
-
event.preventDefault();
|
|
502
|
-
};
|
|
503
|
-
GroupItemComponent.decorators = [
|
|
504
|
-
{ type: Component, args: [{
|
|
505
|
-
selector: 'group-item',
|
|
506
|
-
template: "\n <label class=\"dropdown-item dropdown-item-group\" (mousedown)=\"onItemGroupClick($event)\">{{item.group}}</label>\n ",
|
|
507
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.container-checkbox,.container-selection,.container-selection-selected,.dropdown-item{background:0 0;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196f3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection-selected:hover,.container-selection:hover{color:#495057;background:#e0ffff}.container-selection-selected{color:#fff;background:#6495ed}.dropdown-item-group{font-weight:700}.dropdown-item-group:hover{cursor:default}"]
|
|
508
|
-
}] }
|
|
509
|
-
];
|
|
510
|
-
GroupItemComponent.propDecorators = {
|
|
511
|
-
item: [{ type: Input }]
|
|
512
|
-
};
|
|
513
|
-
return GroupItemComponent;
|
|
514
|
-
}());
|
|
515
|
-
|
|
516
|
-
/**
|
|
517
|
-
* @fileoverview added by tsickle
|
|
518
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
519
|
-
*/
|
|
520
|
-
var InputFilterComponent = /** @class */ (function () {
|
|
521
|
-
function InputFilterComponent() {
|
|
522
|
-
/**
|
|
523
|
-
* bind to [inputFilterBlur], emits with (blur) of filter input box
|
|
524
|
-
*/
|
|
525
|
-
this.inputFilterBlur = new EventEmitter();
|
|
526
|
-
/**
|
|
527
|
-
* bind to [filterValueChange], for 2-way binding of filterValue
|
|
528
|
-
*/
|
|
529
|
-
this.filterValueChange = new EventEmitter();
|
|
530
|
-
}
|
|
531
|
-
/**
|
|
532
|
-
* triggers with (blur) event, emits the (inputFilterBlur) event
|
|
533
|
-
*/
|
|
534
|
-
/**
|
|
535
|
-
* triggers with (blur) event, emits the (inputFilterBlur) event
|
|
536
|
-
* @param {?} event
|
|
537
|
-
* @return {?}
|
|
538
|
-
*/
|
|
539
|
-
InputFilterComponent.prototype.onFilterTextBlur = /**
|
|
540
|
-
* triggers with (blur) event, emits the (inputFilterBlur) event
|
|
541
|
-
* @param {?} event
|
|
542
|
-
* @return {?}
|
|
543
|
-
*/
|
|
544
|
-
function (event) {
|
|
545
|
-
this.inputFilterBlur.emit(event);
|
|
546
|
-
};
|
|
547
|
-
/**
|
|
548
|
-
* triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
|
|
549
|
-
*/
|
|
550
|
-
/**
|
|
551
|
-
* triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
|
|
552
|
-
* @return {?}
|
|
553
|
-
*/
|
|
554
|
-
InputFilterComponent.prototype.onChange = /**
|
|
555
|
-
* triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
|
|
556
|
-
* @return {?}
|
|
557
|
-
*/
|
|
558
|
-
function () {
|
|
559
|
-
this.filterValueChange.emit(this.filterValue);
|
|
560
|
-
};
|
|
561
|
-
InputFilterComponent.decorators = [
|
|
562
|
-
{ type: Component, args: [{
|
|
563
|
-
selector: 'input-filter',
|
|
564
|
-
template: "\n <input type=\"text\" class=\"filter-box\" [(ngModel)]=\"filterValue\" (input)=\"onChange()\" (blur)=\"onFilterTextBlur($event)\">\n ",
|
|
565
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.filter-box{width:calc(100% - 10px);height:28px;border-radius:4px;border:1px solid #ccc;margin:1px 5px 5px;padding-left:5px;font-size:12px;box-sizing:border-box;color:#495057}.filter-box:focus{outline:0;border-color:#ccc}"]
|
|
566
|
-
}] }
|
|
567
|
-
];
|
|
568
|
-
InputFilterComponent.propDecorators = {
|
|
569
|
-
filterValue: [{ type: Input }],
|
|
570
|
-
inputFilterBlur: [{ type: Output }],
|
|
571
|
-
filterValueChange: [{ type: Output }]
|
|
572
|
-
};
|
|
573
|
-
return InputFilterComponent;
|
|
574
|
-
}());
|
|
575
|
-
|
|
576
|
-
/**
|
|
577
|
-
* @fileoverview added by tsickle
|
|
578
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
579
|
-
*/
|
|
580
|
-
var AnchorComponent = /** @class */ (function () {
|
|
581
|
-
function AnchorComponent(_decimalPipe) {
|
|
582
|
-
this._decimalPipe = _decimalPipe;
|
|
583
|
-
/**
|
|
584
|
-
* bind to [checkbox] for checking whether the clearance flag should be shown or not.
|
|
585
|
-
*/
|
|
586
|
-
this.checkbox = false;
|
|
587
|
-
/**
|
|
588
|
-
* bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
|
|
589
|
-
*/
|
|
590
|
-
this.allowClear = true;
|
|
591
|
-
/**
|
|
592
|
-
* bind to [openStatus], it's the visibility status of dropdown, for showing the arrow on anchor
|
|
593
|
-
*/
|
|
594
|
-
this.openStatus = false;
|
|
595
|
-
/**
|
|
596
|
-
* bind to [disabled] for disabling the anchor
|
|
597
|
-
*/
|
|
598
|
-
this.disabled = false;
|
|
599
|
-
/**
|
|
600
|
-
* will be triggered when clicking the anchor
|
|
601
|
-
*/
|
|
602
|
-
this.anchorClick = new EventEmitter();
|
|
603
|
-
/**
|
|
604
|
-
* will be triggered when clicking the clearance
|
|
605
|
-
*/
|
|
606
|
-
this.clearanceClick = new EventEmitter();
|
|
607
|
-
}
|
|
608
|
-
Object.defineProperty(AnchorComponent.prototype, "showClearanceFlag", {
|
|
609
|
-
/**
|
|
610
|
-
* flag for showing the clearance flag
|
|
611
|
-
*/
|
|
612
|
-
get: /**
|
|
613
|
-
* flag for showing the clearance flag
|
|
614
|
-
* @return {?}
|
|
615
|
-
*/
|
|
616
|
-
function () {
|
|
617
|
-
return !this.checkbox && this.selectedText && this.allowClear;
|
|
618
|
-
},
|
|
619
|
-
enumerable: true,
|
|
620
|
-
configurable: true
|
|
621
|
-
});
|
|
622
|
-
Object.defineProperty(AnchorComponent.prototype, "anchorDisplayText", {
|
|
623
|
-
/**
|
|
624
|
-
* the text displays on anchor
|
|
625
|
-
*/
|
|
626
|
-
get: /**
|
|
627
|
-
* the text displays on anchor
|
|
628
|
-
* @return {?}
|
|
629
|
-
*/
|
|
630
|
-
function () {
|
|
631
|
-
/** @type {?} */
|
|
632
|
-
var anchorDisplayText = this.selectedText ? (this.formatNumber ? (isNumber(this.selectedText) ?
|
|
633
|
-
this._decimalPipe.transform(this.selectedText, '1.0-2') : this.selectedText) :
|
|
634
|
-
this.selectedText) + (this.suffixText ? this.suffixText : '') : this.placeHolder;
|
|
635
|
-
/** @type {?} */
|
|
636
|
-
var charLength = 1;
|
|
637
|
-
if (this.showClearanceFlag && this.anchorLength > 0) {
|
|
638
|
-
charLength = Math.floor((this.anchorLength - 50) / 7);
|
|
639
|
-
}
|
|
640
|
-
else {
|
|
641
|
-
charLength = Math.floor((this.anchorLength - 50) / 7);
|
|
642
|
-
}
|
|
643
|
-
if (anchorDisplayText.length > charLength) {
|
|
644
|
-
anchorDisplayText = anchorDisplayText.slice(0, charLength - 2) + '...';
|
|
645
|
-
}
|
|
646
|
-
return anchorDisplayText;
|
|
647
|
-
},
|
|
648
|
-
enumerable: true,
|
|
649
|
-
configurable: true
|
|
650
|
-
});
|
|
651
|
-
Object.defineProperty(AnchorComponent.prototype, "anchorClass", {
|
|
652
|
-
/**
|
|
653
|
-
* anchor CSS class
|
|
654
|
-
*/
|
|
655
|
-
get: /**
|
|
656
|
-
* anchor CSS class
|
|
657
|
-
* @return {?}
|
|
658
|
-
*/
|
|
659
|
-
function () {
|
|
660
|
-
/** @type {?} */
|
|
661
|
-
var anchorClassStatusPart;
|
|
662
|
-
/** @type {?} */
|
|
663
|
-
var anchorClassFontColor;
|
|
664
|
-
if (this.disabled) {
|
|
665
|
-
anchorClassStatusPart = 'selection-anchor-disabled';
|
|
666
|
-
anchorClassFontColor = 'place-holder';
|
|
667
|
-
}
|
|
668
|
-
else {
|
|
669
|
-
if (this.openStatus) {
|
|
670
|
-
anchorClassStatusPart = 'selection-anchor-open';
|
|
671
|
-
}
|
|
672
|
-
else {
|
|
673
|
-
anchorClassStatusPart = 'selection-anchor-close';
|
|
674
|
-
}
|
|
675
|
-
if (this.selectedText != null) {
|
|
676
|
-
anchorClassFontColor = 'selected-item';
|
|
677
|
-
}
|
|
678
|
-
else {
|
|
679
|
-
anchorClassFontColor = 'place-holder';
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
return anchorClassStatusPart + " " + anchorClassFontColor;
|
|
683
|
-
},
|
|
684
|
-
enumerable: true,
|
|
685
|
-
configurable: true
|
|
686
|
-
});
|
|
687
|
-
/**
|
|
688
|
-
* triggered when clicking the anchor
|
|
689
|
-
*/
|
|
690
|
-
/**
|
|
691
|
-
* triggered when clicking the anchor
|
|
692
|
-
* @param {?} event
|
|
693
|
-
* @return {?}
|
|
694
|
-
*/
|
|
695
|
-
AnchorComponent.prototype.onAnchorClick = /**
|
|
696
|
-
* triggered when clicking the anchor
|
|
697
|
-
* @param {?} event
|
|
698
|
-
* @return {?}
|
|
699
|
-
*/
|
|
700
|
-
function (event) {
|
|
701
|
-
this.anchorClick.emit(event);
|
|
702
|
-
};
|
|
703
|
-
/**
|
|
704
|
-
* triggered with (blur) of anchor
|
|
705
|
-
*/
|
|
706
|
-
/**
|
|
707
|
-
* triggered with (blur) of anchor
|
|
708
|
-
* @param {?} event
|
|
709
|
-
* @return {?}
|
|
710
|
-
*/
|
|
711
|
-
AnchorComponent.prototype.onAnchorBlur = /**
|
|
712
|
-
* triggered with (blur) of anchor
|
|
713
|
-
* @param {?} event
|
|
714
|
-
* @return {?}
|
|
715
|
-
*/
|
|
716
|
-
function (event) {
|
|
717
|
-
stopPropagationAndDefault(event);
|
|
718
|
-
};
|
|
719
|
-
/**
|
|
720
|
-
* triggered when clicking the clearance
|
|
721
|
-
*/
|
|
722
|
-
/**
|
|
723
|
-
* triggered when clicking the clearance
|
|
724
|
-
* @param {?} event
|
|
725
|
-
* @return {?}
|
|
726
|
-
*/
|
|
727
|
-
AnchorComponent.prototype.onClearanceClick = /**
|
|
728
|
-
* triggered when clicking the clearance
|
|
729
|
-
* @param {?} event
|
|
730
|
-
* @return {?}
|
|
731
|
-
*/
|
|
732
|
-
function (event) {
|
|
733
|
-
this.clearanceClick.emit(event);
|
|
734
|
-
};
|
|
735
|
-
/**
|
|
736
|
-
* triggered when resizing, get the clientWidth of anchor
|
|
737
|
-
*/
|
|
738
|
-
/**
|
|
739
|
-
* triggered when resizing, get the clientWidth of anchor
|
|
740
|
-
* @return {?}
|
|
741
|
-
*/
|
|
742
|
-
AnchorComponent.prototype.onResize = /**
|
|
743
|
-
* triggered when resizing, get the clientWidth of anchor
|
|
744
|
-
* @return {?}
|
|
745
|
-
*/
|
|
746
|
-
function () {
|
|
747
|
-
this.anchorLength = this.anchorRef ? this.anchorRef.nativeElement ? this.anchorRef.nativeElement.clientWidth : 0 : 0;
|
|
748
|
-
};
|
|
749
|
-
AnchorComponent.decorators = [
|
|
750
|
-
{ type: Component, args: [{
|
|
751
|
-
selector: 'anchor',
|
|
752
|
-
template: "\n <span #anchor tabindex=\"2\" [ngClass]=\"anchorClass\" (window:resize)=\"onResize()\"\n (mousedown)=\"onAnchorClick($event)\" (blur)=\"onAnchorBlur($event)\"> {{anchorDisplayText}}\n <span #selectionClearance class=\"selection-clearance\" (mousedown)=\"onClearanceClick($event)\" *ngIf=\"showClearanceFlag\">×</span>\n </span>\n ",
|
|
753
|
-
providers: [DecimalPipe],
|
|
754
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.selection-anchor-close:after,.selection-anchor-disabled:after,.selection-anchor-open:after,.vertical-center{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.hover-box,.selection-anchor-close:hover{outline:0;box-shadow:0 0 6px #23adff;border-radius:4px}.anchor-box,.selection-anchor,.selection-anchor-close,.selection-anchor-disabled,.selection-anchor-open{height:100%;border-radius:4px;width:100%;position:relative;display:inline-block;padding:8px 12px 5px;border:1px solid;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-sizing:border-box;white-space:nowrap}.selection-anchor,.selection-anchor-close,.selection-anchor-open{cursor:pointer}.selection-anchor .selection-clearance,.selection-anchor-close .selection-clearance,.selection-anchor-open .selection-clearance{position:absolute;right:35px;font-weight:700}.selection-anchor .selection-clearance:hover,.selection-anchor-close .selection-clearance:hover,.selection-anchor-open .selection-clearance:hover{color:#000}.selection-anchor-close:focus,.selection-anchor-open:focus,.selection-anchor:focus{box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;border-color:#66afe9}.selection-anchor-disabled{border-color:#ccc;cursor:default;pointer-events:none;background:#f8f8f8;-webkit-filter:opacity(50%);filter:opacity(50%)}.selection-anchor-disabled:after{font-size:12px;content:'\\0023F7';right:10px;padding-bottom:3px}.selection-anchor-open{border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0;border-color:#66afe9}.selection-anchor-open:after{font-size:12px;content:\"\\0023F6\";right:10px;padding-bottom:3px}.selection-anchor-close{border-color:#ccc}.selection-anchor-close:after{font-size:12px;content:'\\0023F7';right:10px;padding-bottom:3px}.place-holder{color:#999}.selected-item{color:#495057}"]
|
|
755
|
-
}] }
|
|
756
|
-
];
|
|
757
|
-
/** @nocollapse */
|
|
758
|
-
AnchorComponent.ctorParameters = function () { return [
|
|
759
|
-
{ type: DecimalPipe }
|
|
760
|
-
]; };
|
|
761
|
-
AnchorComponent.propDecorators = {
|
|
762
|
-
anchorRef: [{ type: ViewChild, args: ['anchor', { read: ElementRef },] }],
|
|
763
|
-
placeHolder: [{ type: Input }],
|
|
764
|
-
checkbox: [{ type: Input }],
|
|
765
|
-
suffixText: [{ type: Input }],
|
|
766
|
-
allowClear: [{ type: Input }],
|
|
767
|
-
formatNumber: [{ type: Input }],
|
|
768
|
-
selectedText: [{ type: Input }],
|
|
769
|
-
openStatus: [{ type: Input }],
|
|
770
|
-
disabled: [{ type: Input }],
|
|
771
|
-
anchorClick: [{ type: Output }],
|
|
772
|
-
clearanceClick: [{ type: Output }]
|
|
773
|
-
};
|
|
774
|
-
return AnchorComponent;
|
|
775
|
-
}());
|
|
776
|
-
|
|
777
|
-
/**
|
|
778
|
-
* @fileoverview added by tsickle
|
|
779
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
780
|
-
*/
|
|
781
|
-
var DropdownComponent = /** @class */ (function () {
|
|
782
|
-
function DropdownComponent() {
|
|
783
|
-
/**
|
|
784
|
-
* bind to [checkbox], the flag for multi-select (checkbox) mode.
|
|
785
|
-
*/
|
|
786
|
-
this.checkbox = false;
|
|
787
|
-
/**
|
|
788
|
-
* bind to [filterBox] for displaying the filter input text box
|
|
789
|
-
*/
|
|
790
|
-
this.filterBox = false;
|
|
791
|
-
/**
|
|
792
|
-
* bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
|
|
793
|
-
*/
|
|
794
|
-
this.allowClear = true;
|
|
795
|
-
/**
|
|
796
|
-
* bind to [formatNumber] for show formatted number text
|
|
797
|
-
*/
|
|
798
|
-
this.formatNumber = false;
|
|
799
|
-
/**
|
|
800
|
-
* for 2-way binding of [selectedValue]
|
|
801
|
-
*/
|
|
802
|
-
this.selectedValueChange = new EventEmitter(true);
|
|
803
|
-
/**
|
|
804
|
-
* [selectionChange] event that will be triggered when changing of the selection
|
|
805
|
-
*/
|
|
806
|
-
this.selectionChange = new EventEmitter(true);
|
|
807
|
-
/**
|
|
808
|
-
* [dropdownBlur] event that will be triggered with (blur) of dropdown
|
|
809
|
-
*/
|
|
810
|
-
this.dropdownBlur = new EventEmitter();
|
|
811
|
-
/**
|
|
812
|
-
* [itemClick] event that will be triggered when clicking the option of dropdown
|
|
813
|
-
*/
|
|
814
|
-
this.itemClick = new EventEmitter();
|
|
815
|
-
/**
|
|
816
|
-
* flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
|
|
817
|
-
*/
|
|
818
|
-
this._clickedItems = false;
|
|
819
|
-
}
|
|
820
|
-
/**
|
|
821
|
-
* @param {?} changes
|
|
822
|
-
* @return {?}
|
|
823
|
-
*/
|
|
824
|
-
DropdownComponent.prototype.ngOnChanges = /**
|
|
825
|
-
* @param {?} changes
|
|
826
|
-
* @return {?}
|
|
827
|
-
*/
|
|
828
|
-
function (changes) {
|
|
829
|
-
if (changes.items) {
|
|
830
|
-
this._checkSelectionChange(changes.items.previousValue, changes.items.currentValue);
|
|
831
|
-
}
|
|
832
|
-
};
|
|
833
|
-
/**
|
|
834
|
-
* triggered when clicking the dropdown
|
|
835
|
-
*/
|
|
836
|
-
/**
|
|
837
|
-
* triggered when clicking the dropdown
|
|
838
|
-
* @param {?} event
|
|
839
|
-
* @return {?}
|
|
840
|
-
*/
|
|
841
|
-
DropdownComponent.prototype.onItemsClick = /**
|
|
842
|
-
* triggered when clicking the dropdown
|
|
843
|
-
* @param {?} event
|
|
844
|
-
* @return {?}
|
|
845
|
-
*/
|
|
846
|
-
function (event) {
|
|
847
|
-
if (event.offsetX > (event.target.clientWidth + event.target.clientLeft)) {
|
|
848
|
-
stopPropagationAndDefault(event);
|
|
849
|
-
return;
|
|
850
|
-
}
|
|
851
|
-
// should ignore clicking on filter
|
|
852
|
-
if (this.checkbox && event.target.type !== 'text') {
|
|
853
|
-
this._clickedItems = true;
|
|
854
|
-
}
|
|
855
|
-
};
|
|
856
|
-
/**
|
|
857
|
-
* triggered when clicking the item
|
|
858
|
-
*/
|
|
859
|
-
/**
|
|
860
|
-
* triggered when clicking the item
|
|
861
|
-
* @param {?} currentItem
|
|
862
|
-
* @return {?}
|
|
863
|
-
*/
|
|
864
|
-
DropdownComponent.prototype.onItemClick = /**
|
|
865
|
-
* triggered when clicking the item
|
|
866
|
-
* @param {?} currentItem
|
|
867
|
-
* @return {?}
|
|
868
|
-
*/
|
|
869
|
-
function (currentItem) {
|
|
870
|
-
if (!this.checkbox) {
|
|
871
|
-
this.selectedValue = this._getItemValue(currentItem); // currentItem.value != null ? currentItem.value : currentItem.text;
|
|
872
|
-
clearAllSelection(this.items);
|
|
873
|
-
// set the selection of current one
|
|
874
|
-
currentItem.selected = true;
|
|
875
|
-
this.itemClick.emit(currentItem);
|
|
876
|
-
this._onSelectionChange(this.selectedValue);
|
|
877
|
-
}
|
|
878
|
-
};
|
|
879
|
-
/**
|
|
880
|
-
* triggers with (blur) event of filter input box
|
|
881
|
-
*/
|
|
882
|
-
/**
|
|
883
|
-
* triggers with (blur) event of filter input box
|
|
884
|
-
* @param {?} event
|
|
885
|
-
* @return {?}
|
|
886
|
-
*/
|
|
887
|
-
DropdownComponent.prototype.onFilterTextBlur = /**
|
|
888
|
-
* triggers with (blur) event of filter input box
|
|
889
|
-
* @param {?} event
|
|
890
|
-
* @return {?}
|
|
891
|
-
*/
|
|
892
|
-
function (event) {
|
|
893
|
-
this.dropdownBlur.emit(event);
|
|
894
|
-
};
|
|
895
|
-
/**
|
|
896
|
-
* triggers with (blur) event of dropdown
|
|
897
|
-
*/
|
|
898
|
-
/**
|
|
899
|
-
* triggers with (blur) event of dropdown
|
|
900
|
-
* @param {?} event
|
|
901
|
-
* @return {?}
|
|
902
|
-
*/
|
|
903
|
-
DropdownComponent.prototype.onItemsBlur = /**
|
|
904
|
-
* triggers with (blur) event of dropdown
|
|
905
|
-
* @param {?} event
|
|
906
|
-
* @return {?}
|
|
907
|
-
*/
|
|
908
|
-
function (event) {
|
|
909
|
-
if (this.checkbox) {
|
|
910
|
-
if (this._clickedItems) {
|
|
911
|
-
// in checkbox mode, this blur event will be ignored when clicking the dropdown (check the checkbox)
|
|
912
|
-
event.target.focus();
|
|
913
|
-
this._clickedItems = false;
|
|
914
|
-
return;
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
this.dropdownBlur.emit(event);
|
|
918
|
-
};
|
|
919
|
-
/**
|
|
920
|
-
* toggle the selection when checking status changed (in checkbox mode)
|
|
921
|
-
*/
|
|
922
|
-
/**
|
|
923
|
-
* toggle the selection when checking status changed (in checkbox mode)
|
|
924
|
-
* @param {?} item
|
|
925
|
-
* @return {?}
|
|
926
|
-
*/
|
|
927
|
-
DropdownComponent.prototype.toggleSelection = /**
|
|
928
|
-
* toggle the selection when checking status changed (in checkbox mode)
|
|
929
|
-
* @param {?} item
|
|
930
|
-
* @return {?}
|
|
931
|
-
*/
|
|
932
|
-
function (item) {
|
|
933
|
-
item.selected = !item.selected;
|
|
934
|
-
this.selectionChange.emit(this._getItemValue(item)); // item.value != null ? item.value : item.text);
|
|
935
|
-
};
|
|
936
|
-
Object.defineProperty(DropdownComponent.prototype, "itemsValues", {
|
|
937
|
-
/**
|
|
938
|
-
* items values list after applying the filter
|
|
939
|
-
*/
|
|
940
|
-
get: /**
|
|
941
|
-
* items values list after applying the filter
|
|
942
|
-
* @return {?}
|
|
943
|
-
*/
|
|
944
|
-
function () {
|
|
945
|
-
/** @type {?} */
|
|
946
|
-
var filter;
|
|
947
|
-
if (this.filterValue) {
|
|
948
|
-
filter = this.filterValue.toUpperCase();
|
|
949
|
-
}
|
|
950
|
-
if (filter == null) {
|
|
951
|
-
return this.items;
|
|
952
|
-
}
|
|
953
|
-
if (!this.items || this.items.length === 0) {
|
|
954
|
-
return [];
|
|
955
|
-
}
|
|
956
|
-
if (hasGroup(this.items)) {
|
|
957
|
-
/** @type {?} */
|
|
958
|
-
var items_1 = [];
|
|
959
|
-
this.items.forEach(function (groupItem) {
|
|
960
|
-
if (groupItem.group != null && groupItem.group.toString().toUpperCase().includes(filter)) {
|
|
961
|
-
// if groupItem contains the filters, the groupItem needs to be displayed as well
|
|
962
|
-
items_1.push(groupItem);
|
|
963
|
-
}
|
|
964
|
-
else {
|
|
965
|
-
/** @type {?} */
|
|
966
|
-
var filteredItems = groupItem.items.filter(function (item) { return item.text != null && item.text.toString().toUpperCase().includes(filter); });
|
|
967
|
-
if (filteredItems && filteredItems.length > 0) {
|
|
968
|
-
items_1.push({ group: groupItem.group, items: filteredItems });
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
});
|
|
972
|
-
return items_1;
|
|
973
|
-
}
|
|
974
|
-
else {
|
|
975
|
-
return this.items.filter(function (item) { return (item.text != null && item.text.toString().toUpperCase().includes(filter)); });
|
|
976
|
-
}
|
|
977
|
-
},
|
|
978
|
-
enumerable: true,
|
|
979
|
-
configurable: true
|
|
980
|
-
});
|
|
981
|
-
Object.defineProperty(DropdownComponent.prototype, "optionsClass", {
|
|
982
|
-
/**
|
|
983
|
-
* options CSS class
|
|
984
|
-
*/
|
|
985
|
-
get: /**
|
|
986
|
-
* options CSS class
|
|
987
|
-
* @return {?}
|
|
988
|
-
*/
|
|
989
|
-
function () {
|
|
990
|
-
if (this.filterBox && !this.checkbox) {
|
|
991
|
-
return 'options with-filter';
|
|
992
|
-
}
|
|
993
|
-
else {
|
|
994
|
-
return 'options no-filter';
|
|
995
|
-
}
|
|
996
|
-
},
|
|
997
|
-
enumerable: true,
|
|
998
|
-
configurable: true
|
|
999
|
-
});
|
|
1000
|
-
/**
|
|
1001
|
-
* get item value. Return text if value is not available
|
|
1002
|
-
*/
|
|
1003
|
-
/**
|
|
1004
|
-
* get item value. Return text if value is not available
|
|
1005
|
-
* @private
|
|
1006
|
-
* @param {?} item
|
|
1007
|
-
* @return {?}
|
|
1008
|
-
*/
|
|
1009
|
-
DropdownComponent.prototype._getItemValue = /**
|
|
1010
|
-
* get item value. Return text if value is not available
|
|
1011
|
-
* @private
|
|
1012
|
-
* @param {?} item
|
|
1013
|
-
* @return {?}
|
|
1014
|
-
*/
|
|
1015
|
-
function (item) {
|
|
1016
|
-
return item ? item.value != null ? item.value : item.text : undefined;
|
|
1017
|
-
};
|
|
1018
|
-
/**
|
|
1019
|
-
* selection changed, emits events: (selectedValueChange) and (selectionChange);
|
|
1020
|
-
*/
|
|
1021
|
-
/**
|
|
1022
|
-
* selection changed, emits events: (selectedValueChange) and (selectionChange);
|
|
1023
|
-
* @private
|
|
1024
|
-
* @param {?} value
|
|
1025
|
-
* @return {?}
|
|
1026
|
-
*/
|
|
1027
|
-
DropdownComponent.prototype._onSelectionChange = /**
|
|
1028
|
-
* selection changed, emits events: (selectedValueChange) and (selectionChange);
|
|
1029
|
-
* @private
|
|
1030
|
-
* @param {?} value
|
|
1031
|
-
* @return {?}
|
|
1032
|
-
*/
|
|
1033
|
-
function (value) {
|
|
1034
|
-
this.selectedValueChange.emit(value);
|
|
1035
|
-
this.selectionChange.emit(value);
|
|
1036
|
-
};
|
|
1037
|
-
/**
|
|
1038
|
-
* check whether the selection is changed. Emits relative events when if changed.
|
|
1039
|
-
*/
|
|
1040
|
-
/**
|
|
1041
|
-
* check whether the selection is changed. Emits relative events when if changed.
|
|
1042
|
-
* @private
|
|
1043
|
-
* @param {?} previousValue
|
|
1044
|
-
* @param {?} currentValue
|
|
1045
|
-
* @return {?}
|
|
1046
|
-
*/
|
|
1047
|
-
DropdownComponent.prototype._checkSelectionChange = /**
|
|
1048
|
-
* check whether the selection is changed. Emits relative events when if changed.
|
|
1049
|
-
* @private
|
|
1050
|
-
* @param {?} previousValue
|
|
1051
|
-
* @param {?} currentValue
|
|
1052
|
-
* @return {?}
|
|
1053
|
-
*/
|
|
1054
|
-
function (previousValue, currentValue) {
|
|
1055
|
-
/** @type {?} */
|
|
1056
|
-
var curSelectedItem = getFirstSelectedItem(currentValue);
|
|
1057
|
-
/** @type {?} */
|
|
1058
|
-
var lastSelectedItem = getFirstSelectedItem(previousValue);
|
|
1059
|
-
/** @type {?} */
|
|
1060
|
-
var curSelectedItemId = curSelectedItem ? curSelectedItem.id : undefined;
|
|
1061
|
-
/** @type {?} */
|
|
1062
|
-
var lastSelectedItemId = lastSelectedItem ? lastSelectedItem.id : undefined;
|
|
1063
|
-
if (curSelectedItemId !== lastSelectedItemId && !this.checkbox) {
|
|
1064
|
-
this._onSelectionChange(this._getItemValue(curSelectedItem));
|
|
1065
|
-
}
|
|
1066
|
-
};
|
|
1067
|
-
DropdownComponent.decorators = [
|
|
1068
|
-
{ type: Component, args: [{
|
|
1069
|
-
selector: 'dropdown',
|
|
1070
|
-
template: "\n <span #dropdown class=\"dropdown\" tabindex=\"3\" (mousedown)=\"onItemsClick($event)\" (blur)=\"onItemsBlur($event)\" *ngIf=\"!disabled\" >\n <input-filter #filterInput tabindex=\"4\" *ngIf=\"filterBox && !checkbox\" [(filterValue)]=\"filterValue\" (inputFilterBlur)=\"onFilterTextBlur($event)\"></input-filter>\n <span #selectionOptions [ngClass]=\"optionsClass\">\n <ng-container *ngFor=\"let item of itemsValues\" >\n <ng-container *ngIf=\"item && item.group\">\n <group-item [item]=\"item\"></group-item>\n <item *ngFor=\"let subItem of item.items\" (itemClick)=\"onItemClick(subItem)\" (checkStatusChange)=\"toggleSelection(subItem)\"\n [item]=\"subItem\" [checkbox]=\"checkbox\" [formatNumber]=\"formatNumber\" [suffixText]=\"suffixText\">\n </item>\n </ng-container>\n <ng-container *ngIf=\"item && !item.group\">\n <item (itemClick)=\"onItemClick(item)\" (checkStatusChange)=\"toggleSelection(item)\"\n [item]=\"item\" [checkbox]=\"checkbox\" [formatNumber]=\"formatNumber\" [suffixText]=\"suffixText\">\n </item>\n </ng-container>\n </ng-container>\n </span>\n </span>\n ",
|
|
1071
|
-
styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown{width:100%;padding:0;display:none;margin:0;border:1px solid #66afe9;border-top:none;border-bottom:none;border-top-right-radius:0;border-top-left-radius:0;box-sizing:border-box;position:relative;z-index:999}.dropdown:focus{outline:0}.dropdown .options{width:calc(100% + 2px);left:0;box-sizing:border-box;background:#fff;position:absolute;max-height:228px;overflow-y:auto;overflow-x:hidden;border:1px solid #66afe9;border-top:none;border-bottom-right-radius:4px;border-bottom-left-radius:4px;margin-left:-1px;margin-right:-1px}.dropdown .with-filter{top:32px}.dropdown .no-filter{top:0}"]
|
|
1072
|
-
}] }
|
|
1073
|
-
];
|
|
1074
|
-
DropdownComponent.propDecorators = {
|
|
1075
|
-
dropdownRef: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
|
|
1076
|
-
filterInputRef: [{ type: ViewChild, args: ['filterInput', { read: ElementRef },] }],
|
|
1077
|
-
placeHolder: [{ type: Input }],
|
|
1078
|
-
items: [{ type: Input }],
|
|
1079
|
-
checkbox: [{ type: Input }],
|
|
1080
|
-
selectedValue: [{ type: Input }],
|
|
1081
|
-
filterBox: [{ type: Input }],
|
|
1082
|
-
suffixText: [{ type: Input }],
|
|
1083
|
-
disabled: [{ type: Input }],
|
|
1084
|
-
allowClear: [{ type: Input }],
|
|
1085
|
-
formatNumber: [{ type: Input }],
|
|
1086
|
-
selectedValueChange: [{ type: Output }],
|
|
1087
|
-
selectionChange: [{ type: Output }],
|
|
1088
|
-
dropdownBlur: [{ type: Output }],
|
|
1089
|
-
itemClick: [{ type: Output }]
|
|
1090
|
-
};
|
|
1091
|
-
return DropdownComponent;
|
|
1092
|
-
}());
|
|
1093
|
-
|
|
1094
|
-
/**
|
|
1095
|
-
* @fileoverview added by tsickle
|
|
1096
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1097
|
-
*/
|
|
1098
|
-
var DropdownListModule = /** @class */ (function () {
|
|
1099
|
-
function DropdownListModule() {
|
|
1100
|
-
}
|
|
1101
|
-
DropdownListModule.decorators = [
|
|
1102
|
-
{ type: NgModule, args: [{
|
|
1103
|
-
declarations: [
|
|
1104
|
-
DropdownListComponent,
|
|
1105
|
-
ItemComponent,
|
|
1106
|
-
GroupItemComponent,
|
|
1107
|
-
InputFilterComponent,
|
|
1108
|
-
AnchorComponent,
|
|
1109
|
-
DropdownComponent
|
|
1110
|
-
],
|
|
1111
|
-
exports: [DropdownListComponent],
|
|
1112
|
-
imports: [CommonModule, FormsModule],
|
|
1113
|
-
providers: [],
|
|
1114
|
-
bootstrap: [],
|
|
1115
|
-
},] }
|
|
1116
|
-
];
|
|
1117
|
-
return DropdownListModule;
|
|
1118
|
-
}());
|
|
1119
|
-
|
|
1120
|
-
/**
|
|
1121
|
-
* @fileoverview added by tsickle
|
|
1122
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1123
|
-
*/
|
|
1124
|
-
|
|
1125
|
-
/**
|
|
1126
|
-
* @fileoverview added by tsickle
|
|
1127
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1128
|
-
*/
|
|
1129
|
-
|
|
1130
|
-
/**
|
|
1131
|
-
* @fileoverview added by tsickle
|
|
1132
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
1133
|
-
*/
|
|
1134
|
-
|
|
1135
|
-
export { DropdownListComponent, DropdownListModule, AnchorComponent as ɵd, DropdownComponent as ɵe, InputFilterComponent as ɵc, GroupItemComponent as ɵb, ItemComponent as ɵa };
|
|
1136
|
-
|
|
1137
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRyb3Bkb3duLWxpc3QuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC91dGlscy91dGlsLnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbGlzdC9zcmMvbmd4LWRyb3Bkb3duLWxpc3QvZHJvcGRvd24tbGlzdC5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9pdGVtL2l0ZW0uY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbGlzdC9zcmMvbmd4LWRyb3Bkb3duLWxpc3QvZ3JvdXAtaXRlbS9ncm91cC1pdGVtLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWRyb3Bkb3duLWxpc3Qvc3JjL25neC1kcm9wZG93bi1saXN0L2ZpbHRlci9pbnB1dC1maWx0ZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbGlzdC9zcmMvbmd4LWRyb3Bkb3duLWxpc3QvYW5jaG9yL2FuY2hvci5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9kcm9wZG93bi1saXN0Lm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogY2hlY2sgd2hldGhlciB0aGUgcHJvdmlkZWQgaXRlbXMgY29udGFpbnMgZ3JvdXBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNHcm91cChpdGVtcyk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBpdGVtcyA/IChpdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5ncm91cCkgIT0gbnVsbCkgOiBmYWxzZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIGNsZWFyIGFsbCBzZWxlY3Rpb25zIGZyb20gdGhlIHByb3ZpZGUgaXRlbXMuXHJcbiAqIEBwYXJhbSBpdGVtcyB0aGUgZHJvcGRvd24gaXRlbXMsIGNhbiBiZSBncm91cCBvciBpdGVtXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJBbGxTZWxlY3Rpb24oaXRlbXM6IGFueSk6IHZvaWQge1xyXG4gIGlmIChoYXNHcm91cChpdGVtcykpIHtcclxuICAgIGZvciAoY29uc3QgZ3JvdXBJdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGlmIChncm91cEl0ZW0uaXRlbXMpIHtcclxuICAgICAgICBncm91cEl0ZW0uaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkuZm9yRWFjaChpdGVtID0+IGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgLy8gY2xlYXIgdGhlIHNlbGVjdGlvbiBvZiBwcmV2aW91cyBzZWxlY3RlZCBpdGVtXHJcbiAgICBpdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKS5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBzdG9wIGFsbCBwcm9wYWdhdGlvbiBhbmQgZGVmYXVsdCBhY3Rpb25zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG59XHJcblxyXG4vKipcclxuICogY2hlY2sgd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbnVtYmVyIG9mIG5vdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gISh2YWx1ZSA9PSBudWxsIHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApO1xyXG59XHJcblxyXG4vKipcclxuICogZ2V0IHRoZSBzZWxlY3RlZCBpdGVtIGZyb20gdGhlIGl0ZW1zIGxpc3QgKGluY2x1ZGluZyBpdGVtIGFuZCBncm91cClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdFNlbGVjdGVkSXRlbShpdGVtczogYW55KTogYW55IHtcclxuICBpZiAoIWl0ZW1zKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBsZXQgc2VsZWN0ZWRJdGVtO1xyXG4gIGlmIChoYXNHcm91cChpdGVtcykpIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBzZWxlY3RlZEl0ZW0gPSBpdGVtLml0ZW1zID8gaXRlbS5pdGVtcy5maW5kKHN1Ykl0ZW0gPT4gc3ViSXRlbS5zZWxlY3RlZCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBzZWxlY3RlZEl0ZW0gPSBpdGVtcyA/IGl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKSA6IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcmV0dXJuIHNlbGVjdGVkSXRlbTtcclxufVxyXG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjbGVhckFsbFNlbGVjdGlvbiwgZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0sIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHR9IGZyb20gJy4vdXRpbHMvdXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kcm9wZG93bi1saXN0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBjbGFzcz1cIm5neC1zZWxlY3RcIj5cbiAgICAgICAgPGFuY2hvciAoYW5jaG9yQ2xpY2spPVwib25BbmNob3JDbGljaygkZXZlbnQpXCIgKGNsZWFyYW5jZUNsaWNrKT1cIm9uQ2xlYXJhbmNlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrYm94XT1cIm11bHRpU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0TnVtYmVyXT1cImZvcm1hdE51bWJlclwiXG4gICAgICAgICAgICAgICAgW3N1ZmZpeFRleHRdPVwic3VmZml4VGV4dFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cInBsYWNlSG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbYWxsb3dDbGVhcl09XCJhbGxvd0NsZWFyXCJcbiAgICAgICAgICAgICAgICBbb3BlblN0YXR1c109XCJkcm9wZG93blZpc2liaWxpdHlcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZFRleHRdPVwic2VsZWN0ZWRUZXh0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgPC9hbmNob3I+XG4gICAgICAgIDxkcm9wZG93biAjZHJvcGRvd24gKGRyb3Bkb3duQmx1cikgPSBcIm9uSXRlbXNCbHVyKClcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtc1wiXG4gICAgICAgICAgICAgICAgW2NoZWNrYm94XT1cIm11bHRpU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICBbZmlsdGVyQm94XT1cImZpbHRlckJveFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIlxuICAgICAgICAgICAgICAgIFtzdWZmaXhUZXh0XT1cInN1ZmZpeFRleHRcIlxuICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRWYWx1ZSldPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGl0ZW1DbGljaykgPSBcIm9uSXRlbUNsaWNrKClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8L2Ryb3Bkb3duPlxuICAgIDwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24tbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTGlzdENvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duUmVmOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBiaW5kIHRvIFtwbGFjZUhvbGRlcl0gZm9yIGRpc3BsYXlpbmcgdGhlIHBsYWNlIGhvbGRlciBzdHJpbmcgb2YgdGhlIGFuY2hvci5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtpdGVtc10gZm9yIHRoZSBvcHRpb25zL2dyb3VwcyBpbiB0aGUgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBhbnlbXTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW211bHRpU2VsZWN0aW9uXSwgdGhlIGZsYWcgZm9yIG11bHRpLXNlbGVjdCAoY2hlY2tib3gpIG1vZGUuXG4gICAqL1xuICBASW5wdXQoKSBtdWx0aVNlbGVjdGlvbiA9IGZhbHNlO1xuICAvKipcbiAgICogYmluZCB0byBbc2VsZWN0ZWRWYWx1ZV0gZm9yIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZyb20gZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU6IGFueTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2ZpbHRlckJveF0gZm9yIGRpc3BsYXlpbmcgdGhlIGZpbHRlciBpbnB1dCB0ZXh0IGJveFxuICAgKi9cbiAgQElucHV0KCkgZmlsdGVyQm94ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzdWZmaXhUZXh0XSBmb3IgZGlzcGxheWluZyB0aGUgc3VmZml4IG9mIHRoZSBzZWxlY3RlZCB0ZXh0IG9mIGFuY2hvclxuICAgKi9cbiAgQElucHV0KCkgc3VmZml4VGV4dDogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbZGlzYWJsZWRdIGZvciBkaXNhYmxpbmcgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2FsbG93Q2xlYXJdIGZvciBlbmFibGluZyB0aGUgY2xlYXJhbmNlIChjbGVhcmFuY2UgaXMgbm90IGF2YWlhYmxlIHdoZW4gY2hlY2tib3ggaXMgZW5hYmxlZClcbiAgICovXG4gIEBJbnB1dCgpIGFsbG93Q2xlYXIgPSB0cnVlO1xuICAvKipcbiAgICogYmluZCB0byBbZm9ybWF0TnVtYmVyXSBmb3Igc2hvdyBmb3JtYXR0ZWQgbnVtYmVyIHRleHRcbiAgICovXG4gIEBJbnB1dCgpIGZvcm1hdE51bWJlciA9IGZhbHNlO1xuICAvKipcbiAgICogZm9yIDItd2F5IGJpbmRpbmcgb2YgW3NlbGVjdGVkVmFsdWVdLCB1c2luZyBhc3luYyBldmVudCB0b1xuICAgKiBwcmV2ZW50IFwiRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclwiLlxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGVkVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4odHJ1ZSk7XG4gIC8qKlxuICAgKiBbc2VsZWN0aW9uQ2hhbmdlXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2hhbmdpbmcgb2YgdGhlIHNlbGVjdGlvbi5cbiAgICogVXNpbmcgYXN5bmMgZXZlbnQgdG8gcHJldmVudCBcIkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcIi5cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4odHJ1ZSk7XG5cbiAgLyoqXG4gICAqIHZpc2liaWxpdHkgZmxhZyBvZiBkcm9wIGRvd25cbiAgICovXG4gIGRyb3Bkb3duVmlzaWJpbGl0eSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBjdXJyZW50IHNlbGVjdGVkIHRleHRcbiAgICovXG4gIGdldCBzZWxlY3RlZFRleHQoKTogYW55IHtcbiAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGdldEZpcnN0U2VsZWN0ZWRJdGVtKHRoaXMuaXRlbXMpO1xuICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA/IHNlbGVjdGVkSXRlbS50ZXh0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2l0aCAoc2VsZWN0aW9uQ2hhbmdlKSBldmVudCwgZW1pdHMgKHNlbGVjdGVkVmFsdWVDaGFuZ2UpIGFuZCAoc2VsZWN0aW9uQ2hhbmdlKVxuICAgKi9cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGFuY2hvckNsaWNrKSBldmVudCwgY29udHJvbGxpbmcgdGhlIFwib3BlblwiIGFuZCBcImNsb3NlXCIgb2YgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBvbkFuY2hvckNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzU2VsZWN0aW9uT3BlbigpKSB7XG4gICAgICB0aGlzLl9oaWRlSXRlbUxpc3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2hvd0l0ZW1zTGlzdCgpO1xuICAgIH1cbiAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2l0aCAoaXRlbUNsaWNrKSBldmVudCwgY2xvc2VzIHRoZSBkcm9wZG93biBpbiBub24tY2hlY2tib3ggbW9kZVxuICAgKi9cbiAgb25JdGVtQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLl9oaWRlSXRlbUxpc3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGNsZWFyYW5jZUNsaWNrKSBldmVudCwgY2xlYXJpbmcgYWxsIHNlbGVjdGlvbnNcbiAgICogYW5kIGVtaXRzIChzZWxlY3RlZFZhbHVlQ2hhbmdlKSBhbmQgKHNlbGVjdGlvbkNoYW5nZSkgZXZlbnQgZm9yIGVtcHR5IHZhbHVlXG4gICAqL1xuICBvbkNsZWFyYW5jZUNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdm9pZCAwO1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIGNsZWFyQWxsU2VsZWN0aW9uKHRoaXMuaXRlbXMpO1xuICAgIH1cbiAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2l0aCAoZHJvcGRvd25CbHVyKSBldmVudCwgY2xvc2VzIHRoZSBkcm9wZG93blxuICAgKi9cbiAgb25JdGVtc0JsdXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzU2VsZWN0aW9uT3BlbigpKSB7XG4gICAgICB0aGlzLl9oaWRlSXRlbUxpc3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2xvc2UgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBwcml2YXRlIF9oaWRlSXRlbUxpc3QoKTogdm9pZCB7XG4gICAgLy8gaGlkZSB0aGUgZHJvcGRvd24gZWxlbWVudCAoaGFzIHNvbWUgcHJvYmxlbSBmb3IgdXNpbmcgQ1NTIGRpcmVjdGx5LCB1c2luZyB0aGlzIGFzIGEgd29ya2Fyb3VuZClcbiAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuZHJvcGRvd25WaXNpYmlsaXR5ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiB0aGUgZHJvcGRvd25cbiAgICovXG4gIHByaXZhdGUgX3Nob3dJdGVtc0xpc3QoKTogdm9pZCB7XG4gICAgLy8gZGlzcGxheSB0aGUgZHJvcGRvd24gZWxlbWVudCAoaGFzIHNvbWUgcHJvYmxlbSBmb3IgdXNpbmcgQ1NTIGRpcmVjdGx5LCB1c2luZyB0aGlzIGFzIGEgd29ya2Fyb3VuZClcbiAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHRoaXMuZHJvcGRvd25WaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICAgIC8vIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgaXRlbVxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnaW5zdGFudCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBmb2N1c1xuICAgIGlmICh0aGlzLmZpbHRlckJveCAmJiAhdGhpcy5tdWx0aVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5fZmlsdGVySW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB2aXNpYmlsaXR5IHN0YXR1cyBvZiBkcm9wZG93blxuICAgKi9cbiAgcHJpdmF0ZSBfaXNTZWxlY3Rpb25PcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duVmlzaWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIHJlYWwgZHJvcGRvd24gZWxlbWVudCAoZm9yIGZvY3VzaW5nIGFuZCB2aXNpYmlsaXR5IGNvbnRyb2xsaW5nKSwgdGhlIDxzcGFuPiBub3QgdGhlIDxkcm9wZG93bj5cbiAgICovXG4gIHByaXZhdGUgZ2V0IF9kcm9wZG93bkVsZW1lbnQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93blJlZiA/IHRoaXMuZHJvcGRvd25SZWYubmF0aXZlRWxlbWVudCA/IHRoaXMuZHJvcGRvd25SZWYubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCA6IG51bGwgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgcmVhbCBmaWx0ZXIgZWxlbWVudCAoZm9yIGZvY3VzaW5nKSwgdGhlIDxpbnB1dD4gbm90IHRoZSA8aW5wdXQtZmlsdGVyPlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgX2ZpbHRlcklucHV0RWxlbWVudCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9kcm9wZG93bkVsZW1lbnQgP1xuICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkID8gdGhpcy5fZHJvcGRvd25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkIDogbnVsbCA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBIVE1MRWxlbWVudCBvZiBzZWxlY3RlZCBpdGVtLCBmb3IgZG9pbmcgKHNjcm9sbEludG9WaWV3KSBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGl0ZW1cbiAgICovXG4gIHByaXZhdGUgZ2V0IF9zZWxlY3RlZEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGdldEZpcnN0U2VsZWN0ZWRJdGVtKHRoaXMuaXRlbXMpO1xuICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxlY3RlZEl0ZW0uaWQpIGFzIEhUTUxFbGVtZW50IDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2VsZWN0aW9uSXRlbX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtpc051bWJlcn0gZnJvbSAnLi4vdXRpbHMvdXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0ZW0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxsYWJlbCBbY2xhc3MuY29udGFpbmVyLWNoZWNrYm94XT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgW2NsYXNzLmNvbnRhaW5lci1zZWxlY3Rpb25dPVwiIWNoZWNrYm94ICYmICFpdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgW2NsYXNzLmNvbnRhaW5lci1zZWxlY3Rpb24tc2VsZWN0ZWRdPVwiIWNoZWNrYm94ICYmIGl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICBbaWRdPVwiaXRlbS5pZFwiIChtb3VzZWRvd24pPVwib25JdGVtQ2xpY2soaXRlbSlcIj5cbiAgICAgIHt7bmVlZEZvcm1hdE51bWJlcihpdGVtLnRleHQpPyAoaXRlbS50ZXh0IHwgbnVtYmVyOicxLjAtMicpIDogaXRlbS50ZXh0fX17e3N1ZmZpeFRleHQ/IHN1ZmZpeFRleHQgOiAnJ319XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hlY2tib3hcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9J2NoZWNrYm94JyBbaWRdPVwiJ2NoZWNrYm94LScraXRlbS50ZXh0XCIgKGNoYW5nZSk9XCJvbkNoZWNrU3RhdHVzQ2hhbmdlKGl0ZW0pXCIgW2NoZWNrZWRdPVwiaXRlbS5zZWxlY3RlZFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiIFtpZF09XCInY2hlY2ttYXJrLScraXRlbS50ZXh0XCI+PC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9sYWJlbD5gLFxuICBzdHlsZVVybHM6IFsnLi9pdGVtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBJdGVtQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2NoZWNrYm94XSwgdGhlIGZsYWcgb2YgY2hlY2tib3ggbW9kZVxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tib3g6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtpdGVtXSwgdGhlIGRyb3Bkb3duIG9wdGlvbiBpdGVtXG4gICAqL1xuICBASW5wdXQoKSBpdGVtOiBTZWxlY3Rpb25JdGVtO1xuICAvKipcbiAgICogYmluZCB0byBbZm9ybWF0TnVtYmVyXSwgdGhlIGZsYWcgZm9yIGZvcm1hdHRpbmcgdGhlIG51bWJlclxuICAgKi9cbiAgQElucHV0KCkgZm9ybWF0TnVtYmVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzdWZmaXhUZXh0XSwgdGhlIHN1ZmZpeFRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIHN1ZmZpeFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2l0ZW1DbGlja10gZXZlbnQsIHRyaWdnZXJzIHdoZW4gY2xpY2tpbmcgdGhlIGl0ZW0gb2YgZHJvcGRvd25cbiAgICovXG4gIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2NoZWNrU3RhdHVzQ2hhbmdlXSBldmVudCwgdHJpZ2dlcnMgd2hlbiBjaGVjayBzdGF0dXMgaXMgY2hhbmdlZCBpbiBjaGVja2JveCBtb2RlLlxuICAgKi9cbiAgQE91dHB1dCgpIGNoZWNrU3RhdHVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIGNoZWNrIHdoZXRoZXIgbmVlZHMgdG8gZm9ybWF0IG51bWJlciBmb3IgdGhlIHByb3ZpZGVkIHRleHRcbiAgICovXG4gIG5lZWRGb3JtYXROdW1iZXIodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdGhpcy5mb3JtYXROdW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGl0ZW0sIGVtaXRzIHRoZSBbaXRlbUNsaWNrXSBldmVudFxuICAgKi9cbiAgb25JdGVtQ2xpY2soaXRlbSkge1xuICAgIHRoaXMuaXRlbUNsaWNrLmVtaXQoaXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2hlY2tpbmcgc3RhdHVzIGNoYW5nZWQgaW4gY2hlY2tib3ggbW9kZSwgZW1pdHMgdGhlIFtjaGVja1N0YXR1c0NoYW5nZV0gZXZlbnRcbiAgICovXG4gIG9uQ2hlY2tTdGF0dXNDaGFuZ2UoaXRlbSkge1xuICAgIHRoaXMuY2hlY2tTdGF0dXNDaGFuZ2UuZW1pdChpdGVtKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2VsZWN0aW9uR3JvdXBJdGVtc30gZnJvbSAnLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdncm91cC1pdGVtJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWwgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGRyb3Bkb3duLWl0ZW0tZ3JvdXBcIiAobW91c2Vkb3duKT1cIm9uSXRlbUdyb3VwQ2xpY2soJGV2ZW50KVwiPnt7aXRlbS5ncm91cH19PC9sYWJlbD5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JvdXAtaXRlbS5jb21wb25lbnQuc2NzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgR3JvdXBJdGVtQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2l0ZW1dLCB0aGUgZ3JvdXAgaXRlbSBvZiBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgaXRlbTogU2VsZWN0aW9uR3JvdXBJdGVtcztcblxuICAvKipcbiAgICogcHJldmVudCBhbGwgY2xpY2tpbmcgZXZlbnQgZnJvbSBoYXBwZW5pbmdcbiAgICovXG4gIG9uSXRlbUdyb3VwQ2xpY2soZXZlbnQpIHtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW5wdXQtZmlsdGVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZpbHRlci1ib3hcIiBbKG5nTW9kZWwpXT1cImZpbHRlclZhbHVlXCIgKGlucHV0KT1cIm9uQ2hhbmdlKClcIiAoYmx1cik9XCJvbkZpbHRlclRleHRCbHVyKCRldmVudClcIj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBJbnB1dEZpbHRlckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmaWx0ZXJWYWx1ZV0sIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyXG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbaW5wdXRGaWx0ZXJCbHVyXSwgZW1pdHMgd2l0aCAoYmx1cikgb2YgZmlsdGVyIGlucHV0IGJveFxuICAgKi9cbiAgQE91dHB1dCgpIGlucHV0RmlsdGVyQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKipcbiAgICogYmluZCB0byBbZmlsdGVyVmFsdWVDaGFuZ2VdLCBmb3IgMi13YXkgYmluZGluZyBvZiBmaWx0ZXJWYWx1ZVxuICAgKi9cbiAgQE91dHB1dCgpIGZpbHRlclZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIHdpdGggKGJsdXIpIGV2ZW50LCBlbWl0cyB0aGUgKGlucHV0RmlsdGVyQmx1cikgZXZlbnRcbiAgICovXG4gIG9uRmlsdGVyVGV4dEJsdXIoZXZlbnQpIHtcbiAgICB0aGlzLmlucHV0RmlsdGVyQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChpbnB1dCkgZXZlbnQsIGVtaXRzIHRoZSAoZmlsdGVyVmFsdWVDaGFuZ2UpIGV2ZW50IGZvciAyLXdheSBiaW5kaW5nIG9mIGZpbHRlclZhbHVlXG4gICAqL1xuICBvbkNoYW5nZSgpIHtcbiAgICB0aGlzLmZpbHRlclZhbHVlQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJWYWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3N0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHQsIGlzTnVtYmVyfSBmcm9tICcuLi91dGlscy91dGlsJztcbmltcG9ydCB7RGVjaW1hbFBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FuY2hvcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gI2FuY2hvciB0YWJpbmRleD1cIjJcIiBbbmdDbGFzc109XCJhbmNob3JDbGFzc1wiICh3aW5kb3c6cmVzaXplKT1cIm9uUmVzaXplKClcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwib25BbmNob3JDbGljaygkZXZlbnQpXCIgKGJsdXIpPVwib25BbmNob3JCbHVyKCRldmVudClcIj4ge3thbmNob3JEaXNwbGF5VGV4dH19XG4gICAgICA8c3BhbiAjc2VsZWN0aW9uQ2xlYXJhbmNlIGNsYXNzPVwic2VsZWN0aW9uLWNsZWFyYW5jZVwiIChtb3VzZWRvd24pPVwib25DbGVhcmFuY2VDbGljaygkZXZlbnQpXCIgKm5nSWY9XCJzaG93Q2xlYXJhbmNlRmxhZ1wiPiZ0aW1lczs8L3NwYW4+XG4gICAgPC9zcGFuPlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9hbmNob3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbRGVjaW1hbFBpcGVdXG59KVxuXG5leHBvcnQgY2xhc3MgQW5jaG9yQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGFuY2hvclxuICAgKi9cbiAgQFZpZXdDaGlsZCgnYW5jaG9yJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGFuY2hvclJlZjogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogYmluZCB0byBbcGxhY2VIb2xkZXJdIGZvciBkaXNwbGF5aW5nIHRoZSBwbGFjZSBob2xkZXIgc3RyaW5nIG9mIHRoZSBhbmNob3IuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZUhvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbY2hlY2tib3hdIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBjbGVhcmFuY2UgZmxhZyBzaG91bGQgYmUgc2hvd24gb3Igbm90LlxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tib3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3N1ZmZpeFRleHRdIGZvciBkaXNwbGF5aW5nIHRoZSBzdWZmaXggb2YgdGhlIHNlbGVjdGVkIHRleHQgb2YgYW5jaG9yXG4gICAqL1xuICBASW5wdXQoKSBzdWZmaXhUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFthbGxvd0NsZWFyXSBmb3IgZW5hYmxpbmcgdGhlIGNsZWFyYW5jZSAoY2xlYXJhbmNlIGlzIG5vdCBhdmFpYWJsZSB3aGVuIGNoZWNrYm94IGlzIGVuYWJsZWQpXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gdHJ1ZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Zvcm1hdE51bWJlcl0gZm9yIHNob3cgZm9ybWF0dGVkIG51bWJlciB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSBmb3JtYXROdW1iZXI6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzZWxlY3RlZFRleHRdIGZvciBkaXNwbGF5aW5nIHRoZSBzZWxlY3RlZCB0ZXh0IG9uIGFuY2hvclxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRUZXh0OiBhbnk7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtvcGVuU3RhdHVzXSwgaXQncyB0aGUgdmlzaWJpbGl0eSBzdGF0dXMgb2YgZHJvcGRvd24sIGZvciBzaG93aW5nIHRoZSBhcnJvdyBvbiBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIG9wZW5TdGF0dXMgPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Rpc2FibGVkXSBmb3IgZGlzYWJsaW5nIHRoZSBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNsaWNraW5nIHRoZSBhbmNob3JcbiAgICovXG4gIEBPdXRwdXQoKSBhbmNob3JDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKipcbiAgICogd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgY2xlYXJhbmNlXG4gICAqL1xuICBAT3V0cHV0KCkgY2xlYXJhbmNlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogbGVuZ3RoIG9mIGFuY2hvciBlbGVtZW50LCB1c2VkIGZvciBjYWxjdWxhdGUgdGhlIHN0cmluZyBsZW5ndGggb2YgdGhlIGFuY2hvciBkaXNwbGF5ZWQgdGV4dC5cbiAgICovXG4gIGFuY2hvckxlbmd0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RlY2ltYWxQaXBlOiBEZWNpbWFsUGlwZSkge31cblxuICAvKipcbiAgICogZmxhZyBmb3Igc2hvd2luZyB0aGUgY2xlYXJhbmNlIGZsYWdcbiAgICovXG4gIGdldCBzaG93Q2xlYXJhbmNlRmxhZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuY2hlY2tib3ggJiYgdGhpcy5zZWxlY3RlZFRleHQgJiYgdGhpcy5hbGxvd0NsZWFyO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSB0ZXh0IGRpc3BsYXlzIG9uIGFuY2hvclxuICAgKi9cbiAgZ2V0IGFuY2hvckRpc3BsYXlUZXh0KCk6IHN0cmluZyB7XG4gICAgbGV0IGFuY2hvckRpc3BsYXlUZXh0ID0gIHRoaXMuc2VsZWN0ZWRUZXh0ID8gKHRoaXMuZm9ybWF0TnVtYmVyID8gKGlzTnVtYmVyKHRoaXMuc2VsZWN0ZWRUZXh0KSA/XG4gICAgICB0aGlzLl9kZWNpbWFsUGlwZS50cmFuc2Zvcm0odGhpcy5zZWxlY3RlZFRleHQsICcxLjAtMicpIDogdGhpcy5zZWxlY3RlZFRleHQpIDpcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0KSArICh0aGlzLnN1ZmZpeFRleHQgPyB0aGlzLnN1ZmZpeFRleHQgOiAnJykgOiB0aGlzLnBsYWNlSG9sZGVyO1xuXG4gICAgbGV0IGNoYXJMZW5ndGggPSAxO1xuICAgIGlmICh0aGlzLnNob3dDbGVhcmFuY2VGbGFnICYmIHRoaXMuYW5jaG9yTGVuZ3RoID4gMCkge1xuICAgICAgY2hhckxlbmd0aCA9IE1hdGguZmxvb3IoKHRoaXMuYW5jaG9yTGVuZ3RoIC0gNTApIC8gNyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYXJMZW5ndGggPSBNYXRoLmZsb29yKCh0aGlzLmFuY2hvckxlbmd0aCAtIDUwKSAvIDcpO1xuICAgIH1cblxuICAgIGlmIChhbmNob3JEaXNwbGF5VGV4dC5sZW5ndGggPiBjaGFyTGVuZ3RoKSB7XG4gICAgICBhbmNob3JEaXNwbGF5VGV4dCA9IGFuY2hvckRpc3BsYXlUZXh0LnNsaWNlKDAsIGNoYXJMZW5ndGggLSAyKSArICcuLi4nO1xuICAgIH1cbiAgICByZXR1cm4gYW5jaG9yRGlzcGxheVRleHQ7XG4gIH1cblxuICAvKipcbiAgICogYW5jaG9yIENTUyBjbGFzc1xuICAgKi9cbiAgZ2V0IGFuY2hvckNsYXNzKCk6IHN0cmluZyB7XG4gICAgbGV0IGFuY2hvckNsYXNzU3RhdHVzUGFydDtcbiAgICBsZXQgYW5jaG9yQ2xhc3NGb250Q29sb3I7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGFuY2hvckNsYXNzU3RhdHVzUGFydCA9ICdzZWxlY3Rpb24tYW5jaG9yLWRpc2FibGVkJztcbiAgICAgIGFuY2hvckNsYXNzRm9udENvbG9yID0gJ3BsYWNlLWhvbGRlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wZW5TdGF0dXMpIHtcbiAgICAgICAgYW5jaG9yQ2xhc3NTdGF0dXNQYXJ0ID0gJ3NlbGVjdGlvbi1hbmNob3Itb3Blbic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmNob3JDbGFzc1N0YXR1c1BhcnQgPSAnc2VsZWN0aW9uLWFuY2hvci1jbG9zZSc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRleHQgIT0gbnVsbCkge1xuICAgICAgICBhbmNob3JDbGFzc0ZvbnRDb2xvciA9ICdzZWxlY3RlZC1pdGVtJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuY2hvckNsYXNzRm9udENvbG9yID0gJ3BsYWNlLWhvbGRlcic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHthbmNob3JDbGFzc1N0YXR1c1BhcnR9ICR7YW5jaG9yQ2xhc3NGb250Q29sb3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgYW5jaG9yXG4gICAqL1xuICBvbkFuY2hvckNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYW5jaG9yQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGJsdXIpIG9mIGFuY2hvclxuICAgKi9cbiAgb25BbmNob3JCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJlZCB3aGVuIGNsaWNraW5nIHRoZSBjbGVhcmFuY2VcbiAgICovXG4gIG9uQ2xlYXJhbmNlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhcmFuY2VDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiByZXNpemluZywgZ2V0IHRoZSBjbGllbnRXaWR0aCBvZiBhbmNob3JcbiAgICovXG4gIG9uUmVzaXplKCkge1xuICAgIHRoaXMuYW5jaG9yTGVuZ3RoID0gdGhpcy5hbmNob3JSZWYgPyB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50ID8gdGhpcy5hbmNob3JSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA6IDAgOiAwO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2NsZWFyQWxsU2VsZWN0aW9uLCBnZXRGaXJzdFNlbGVjdGVkSXRlbSwgaGFzR3JvdXAsIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHR9IGZyb20gJy4uL3V0aWxzL3V0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkcm9wZG93bicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gI2Ryb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIiB0YWJpbmRleD1cIjNcIiAobW91c2Vkb3duKT1cIm9uSXRlbXNDbGljaygkZXZlbnQpXCIgKGJsdXIpPVwib25JdGVtc0JsdXIoJGV2ZW50KVwiICpuZ0lmPVwiIWRpc2FibGVkXCIgPlxuICAgICAgPGlucHV0LWZpbHRlciAjZmlsdGVySW5wdXQgdGFiaW5kZXg9XCI0XCIgKm5nSWY9XCJmaWx0ZXJCb3ggJiYgIWNoZWNrYm94XCIgWyhmaWx0ZXJWYWx1ZSldPVwiZmlsdGVyVmFsdWVcIiAoaW5wdXRGaWx0ZXJCbHVyKT1cIm9uRmlsdGVyVGV4dEJsdXIoJGV2ZW50KVwiPjwvaW5wdXQtZmlsdGVyPlxuICAgICAgPHNwYW4gI3NlbGVjdGlvbk9wdGlvbnMgW25nQ2xhc3NdPVwib3B0aW9uc0NsYXNzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNWYWx1ZXNcIiA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0gJiYgaXRlbS5ncm91cFwiPlxuICAgICAgICAgICAgPGdyb3VwLWl0ZW0gW2l0ZW1dPVwiaXRlbVwiPjwvZ3JvdXAtaXRlbT5cbiAgICAgICAgICAgIDxpdGVtICpuZ0Zvcj1cImxldCBzdWJJdGVtIG9mIGl0ZW0uaXRlbXNcIiAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKHN1Ykl0ZW0pXCIgKGNoZWNrU3RhdHVzQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbihzdWJJdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJzdWJJdGVtXCIgW2NoZWNrYm94XT1cImNoZWNrYm94XCIgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIiBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCI+XG4gICAgICAgICAgICA8L2l0ZW0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0gJiYgIWl0ZW0uZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpdGVtIChpdGVtQ2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIiAoY2hlY2tTdGF0dXNDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0aW9uKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIiBbY2hlY2tib3hdPVwiY2hlY2tib3hcIiBbZm9ybWF0TnVtYmVyXT1cImZvcm1hdE51bWJlclwiIFtzdWZmaXhUZXh0XT1cInN1ZmZpeFRleHRcIj5cbiAgICAgICAgICAgIDwvaXRlbT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9zcGFuPlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi5jb21wb25lbnQuc2NzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogQ2hpbGQgZWxlbWVudCByZWZlcmVuY2Ugb2YgZHJvcGRvd25cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duUmVmOiBFbGVtZW50UmVmO1xuICAvKipcbiAgICogQ2hpbGQgZWxlbWVudCByZWZlcmVuY2Ugb2YgZmlsdGVyIGlucHV0IHRleHRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlcklucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGZpbHRlcklucHV0UmVmOiBFbGVtZW50UmVmO1xuICAvKipcbiAgICogYmluZCB0byBbcGxhY2VIb2xkZXJdIGZvciBkaXNwbGF5aW5nIHRoZSBwbGFjZSBob2xkZXIgc3RyaW5nIG9mIHRoZSBhbmNob3IuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZUhvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbaXRlbXNdIGZvciB0aGUgb3B0aW9ucy9ncm91cHMgaW4gdGhlIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBpdGVtczogYW55W107XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtjaGVja2JveF0sIHRoZSBmbGFnIGZvciBtdWx0aS1zZWxlY3QgKGNoZWNrYm94KSBtb2RlLlxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tib3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3NlbGVjdGVkVmFsdWVdIGZvciB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiBmcm9tIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZFZhbHVlOiBhbnk7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmaWx0ZXJCb3hdIGZvciBkaXNwbGF5aW5nIHRoZSBmaWx0ZXIgaW5wdXQgdGV4dCBib3hcbiAgICovXG4gIEBJbnB1dCgpIGZpbHRlckJveCA9IGZhbHNlO1xuICAvKipcbiAgICogYmluZCB0byBbc3VmZml4VGV4dF0gZm9yIGRpc3BsYXlpbmcgdGhlIHN1ZmZpeCBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBvZiBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIHN1ZmZpeFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Rpc2FibGVkXSBmb3IgZGlzYWJsaW5nIHRoZSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBiaW5kIHRvIFthbGxvd0NsZWFyXSBmb3IgZW5hYmxpbmcgdGhlIGNsZWFyYW5jZSAoY2xlYXJhbmNlIGlzIG5vdCBhdmFpYWJsZSB3aGVuIGNoZWNrYm94IGlzIGVuYWJsZWQpXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gdHJ1ZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Zvcm1hdE51bWJlcl0gZm9yIHNob3cgZm9ybWF0dGVkIG51bWJlciB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSBmb3JtYXROdW1iZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIGZvciAyLXdheSBiaW5kaW5nIG9mIFtzZWxlY3RlZFZhbHVlXVxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGVkVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4odHJ1ZSk7XG4gIC8qKlxuICAgKiBbc2VsZWN0aW9uQ2hhbmdlXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2hhbmdpbmcgb2YgdGhlIHNlbGVjdGlvblxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55Pih0cnVlKTtcbiAgLyoqXG4gICAqIFtkcm9wZG93bkJsdXJdIGV2ZW50IHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCAoYmx1cikgb2YgZHJvcGRvd25cbiAgICovXG4gIEBPdXRwdXQoKSBkcm9wZG93bkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqXG4gICAqIFtpdGVtQ2xpY2tdIGV2ZW50IHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgb3B0aW9uIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBmaWx0ZXIgdmFsdWVcbiAgICovXG4gIGZpbHRlclZhbHVlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBmbGFnIG9mIGNsaWNraW5nIGRyb3Bkb3duLiBJdCdzIHRvIHByZXZlbnQgKGJsdXIpIG9mIGRyb3Bkb3duIGZyb20gaGFwcGVuaW5nIGluIGNoZWNrYm94IG1vZGUuXG4gICAqL1xuICBwcml2YXRlIF9jbGlja2VkSXRlbXMgPSBmYWxzZTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuaXRlbXMpIHtcbiAgICAgIHRoaXMuX2NoZWNrU2VsZWN0aW9uQ2hhbmdlKGNoYW5nZXMuaXRlbXMucHJldmlvdXNWYWx1ZSwgY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgZHJvcGRvd25cbiAgICovXG4gIG9uSXRlbXNDbGljayhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Lm9mZnNldFggPiAoZXZlbnQudGFyZ2V0LmNsaWVudFdpZHRoICsgZXZlbnQudGFyZ2V0LmNsaWVudExlZnQpKSB7XG4gICAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gc2hvdWxkIGlnbm9yZSBjbGlja2luZyBvbiBmaWx0ZXJcbiAgICBpZiAodGhpcy5jaGVja2JveCAmJiBldmVudC50YXJnZXQudHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICB0aGlzLl9jbGlja2VkSXRlbXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgaXRlbVxuICAgKi9cbiAgb25JdGVtQ2xpY2soY3VycmVudEl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuX2dldEl0ZW1WYWx1ZShjdXJyZW50SXRlbSk7IC8vIGN1cnJlbnRJdGVtLnZhbHVlICE9IG51bGwgPyBjdXJyZW50SXRlbS52YWx1ZSA6IGN1cnJlbnRJdGVtLnRleHQ7XG4gICAgICBjbGVhckFsbFNlbGVjdGlvbih0aGlzLml0ZW1zKTtcbiAgICAgIC8vIHNldCB0aGUgc2VsZWN0aW9uIG9mIGN1cnJlbnQgb25lXG4gICAgICBjdXJyZW50SXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLml0ZW1DbGljay5lbWl0KGN1cnJlbnRJdGVtKTtcbiAgICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIHdpdGggKGJsdXIpIGV2ZW50IG9mIGZpbHRlciBpbnB1dCBib3hcbiAgICovXG4gIG9uRmlsdGVyVGV4dEJsdXIoZXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChibHVyKSBldmVudCBvZiBkcm9wZG93blxuICAgKi9cbiAgb25JdGVtc0JsdXIoZXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja2JveCkge1xuICAgICAgaWYgKHRoaXMuX2NsaWNrZWRJdGVtcykge1xuICAgICAgICAvLyBpbiBjaGVja2JveCBtb2RlLCB0aGlzIGJsdXIgZXZlbnQgd2lsbCBiZSBpZ25vcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGRyb3Bkb3duIChjaGVjayB0aGUgY2hlY2tib3gpXG4gICAgICAgIGV2ZW50LnRhcmdldC5mb2N1cygpO1xuICAgICAgICB0aGlzLl9jbGlja2VkSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRyb3Bkb3duQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGUgdGhlIHNlbGVjdGlvbiB3aGVuIGNoZWNraW5nIHN0YXR1cyBjaGFuZ2VkIChpbiBjaGVja2JveCBtb2RlKVxuICAgKi9cbiAgdG9nZ2xlU2VsZWN0aW9uKGl0ZW06IHtpZDogc3RyaW5nLCB2YWx1ZT86IGFueSwgdGV4dDogYW55LCBzZWxlY3RlZD86IGJvb2xlYW59KTogdm9pZCB7XG4gICAgaXRlbS5zZWxlY3RlZCA9ICFpdGVtLnNlbGVjdGVkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5fZ2V0SXRlbVZhbHVlKGl0ZW0pKTsgLy8gaXRlbS52YWx1ZSAhPSBudWxsID8gaXRlbS52YWx1ZSA6IGl0ZW0udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogaXRlbXMgdmFsdWVzIGxpc3QgYWZ0ZXIgYXBwbHlpbmcgdGhlIGZpbHRlclxuICAgKi9cbiAgZ2V0IGl0ZW1zVmFsdWVzKCk6IGFueVtdIHtcbiAgICBsZXQgZmlsdGVyO1xuICAgIGlmICh0aGlzLmZpbHRlclZhbHVlKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmZpbHRlclZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pdGVtcztcbiAgICB9XG4gICAgaWYgKCF0aGlzLml0ZW1zIHx8IHRoaXMuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChoYXNHcm91cCh0aGlzLml0ZW1zKSkge1xuICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChncm91cEl0ZW0gPT4ge1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLmdyb3VwICE9IG51bGwgJiYgZ3JvdXBJdGVtLmdyb3VwLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpKSB7XG4gICAgICAgICAgLy8gaWYgZ3JvdXBJdGVtIGNvbnRhaW5zIHRoZSBmaWx0ZXJzLCB0aGUgZ3JvdXBJdGVtIG5lZWRzIHRvIGJlIGRpc3BsYXllZCBhcyB3ZWxsXG4gICAgICAgICAgaXRlbXMucHVzaChncm91cEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBncm91cEl0ZW0uaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50ZXh0ICE9IG51bGwgJiYgaXRlbS50ZXh0LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpKTtcbiAgICAgICAgICBpZiAoZmlsdGVyZWRJdGVtcyAmJiBmaWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe2dyb3VwOiBncm91cEl0ZW0uZ3JvdXAsIGl0ZW1zOiBmaWx0ZXJlZEl0ZW1zfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gKGl0ZW0udGV4dCAhPSBudWxsICYmIGl0ZW0udGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogb3B0aW9ucyBDU1MgY2xhc3NcbiAgICovXG4gIGdldCBvcHRpb25zQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJCb3ggJiYgIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHJldHVybiAnb3B0aW9ucyB3aXRoLWZpbHRlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnb3B0aW9ucyBuby1maWx0ZXInO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgaXRlbSB2YWx1ZS4gUmV0dXJuIHRleHQgaWYgdmFsdWUgaXMgbm90IGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0SXRlbVZhbHVlKGl0ZW0pOiBhbnkge1xuICAgIHJldHVybiBpdGVtID8gaXRlbS52YWx1ZSAhPSBudWxsID8gaXRlbS52YWx1ZSA6IGl0ZW0udGV4dCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZWxlY3Rpb24gY2hhbmdlZCwgZW1pdHMgZXZlbnRzOiAoc2VsZWN0ZWRWYWx1ZUNoYW5nZSkgYW5kIChzZWxlY3Rpb25DaGFuZ2UpO1xuICAgKi9cbiAgcHJpdmF0ZSBfb25TZWxlY3Rpb25DaGFuZ2UodmFsdWUpIHtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2sgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGNoYW5nZWQuIEVtaXRzIHJlbGF0aXZlIGV2ZW50cyB3aGVuIGlmIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIF9jaGVja1NlbGVjdGlvbkNoYW5nZShwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpIHtcbiAgICBjb25zdCBjdXJTZWxlY3RlZEl0ZW0gPSBnZXRGaXJzdFNlbGVjdGVkSXRlbShjdXJyZW50VmFsdWUpO1xuICAgIGNvbnN0IGxhc3RTZWxlY3RlZEl0ZW0gPSBnZXRGaXJzdFNlbGVjdGVkSXRlbShwcmV2aW91c1ZhbHVlKTtcbiAgICBjb25zdCBjdXJTZWxlY3RlZEl0ZW1JZCA9IGN1clNlbGVjdGVkSXRlbSA/IGN1clNlbGVjdGVkSXRlbS5pZCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsYXN0U2VsZWN0ZWRJdGVtSWQgPSBsYXN0U2VsZWN0ZWRJdGVtID8gbGFzdFNlbGVjdGVkSXRlbS5pZCA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY3VyU2VsZWN0ZWRJdGVtSWQgIT09IGxhc3RTZWxlY3RlZEl0ZW1JZCAmJiAhdGhpcy5jaGVja2JveCkge1xuICAgICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UodGhpcy5fZ2V0SXRlbVZhbHVlKGN1clNlbGVjdGVkSXRlbSkpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0vaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcm91cEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2dyb3VwLWl0ZW0vZ3JvdXAtaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJbnB1dEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyL2lucHV0LWZpbHRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBbmNob3JDb21wb25lbnQgfSBmcm9tICcuL2FuY2hvci9hbmNob3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duTGlzdENvbXBvbmVudCB9IGZyb20gJy4vZHJvcGRvd24tbGlzdC5jb21wb25lbnQnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIERyb3Bkb3duTGlzdENvbXBvbmVudCxcclxuICAgIEl0ZW1Db21wb25lbnQsXHJcbiAgICBHcm91cEl0ZW1Db21wb25lbnQsXHJcbiAgICBJbnB1dEZpbHRlckNvbXBvbmVudCxcclxuICAgIEFuY2hvckNvbXBvbmVudCxcclxuICAgIERyb3Bkb3duQ29tcG9uZW50XHJcbiAgXSxcclxuICBleHBvcnRzOiBbIERyb3Bkb3duTGlzdENvbXBvbmVudF0sXHJcbiAgaW1wb3J0czogWyBDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlIF0sXHJcbiAgcHJvdmlkZXJzOiBbXSxcclxuICBib290c3RyYXA6IFtdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25MaXN0TW9kdWxlIHt9XHJcbiJdLCJuYW1lcyI6WyJ0c2xpYl8xLl9fdmFsdWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLFNBQWdCLFFBQVEsQ0FBQyxLQUFLO0lBQzVCLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJ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
|