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