@tsi-developpement/tsi-shared-ui 1.7.21 → 1.7.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/models/dropdown/dropdown-external-selection-output.mjs +2 -0
- package/esm2022/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.mjs +2 -41
- package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs +111 -78
- package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +66 -13
- package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +8 -4
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +298 -248
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
- package/lib/consts/app-providers.d.ts +1 -1
- package/lib/models/dropdown/dropdown-external-selection-output.d.ts +4 -0
- package/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.d.ts +19 -7
- package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +3 -0
- package/package.json +1 -1
package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { HttpParams } from '@angular/common/http';
|
|
|
2
2
|
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
|
|
3
3
|
import { firstValueFrom } from 'rxjs';
|
|
4
4
|
import { rtlModeKeys } from '../../../consts/locals.const';
|
|
5
|
-
import { Component_Modes, GridSelectionMode, ModalSizeEnum } from '../../../enums';
|
|
5
|
+
import { Component_Modes, GridSelectionMode, ModalSizeEnum, TooltipPosition } from '../../../enums';
|
|
6
6
|
import { TsiInputBase } from '../../../tsi-base/tsi-input-base/tsi-input-base.component';
|
|
7
7
|
import { Guid } from '../../../tsi-helpers/guid.helper';
|
|
8
8
|
import { TypeRegistryHelper } from '../../../tsi-helpers/type-registry.helper';
|
|
@@ -47,17 +47,18 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
47
47
|
return this._bind;
|
|
48
48
|
}
|
|
49
49
|
set bind(value) {
|
|
50
|
-
if (
|
|
50
|
+
if (this._bind === value || !this._bind && !value)
|
|
51
|
+
return;
|
|
52
|
+
if (!value) {
|
|
51
53
|
this._bind = null;
|
|
52
|
-
this._selected = null;
|
|
53
54
|
this.inputField = null;
|
|
54
|
-
return;
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
else {
|
|
57
|
+
this._bind = value;
|
|
58
|
+
this.inputField = value;
|
|
59
|
+
this._onBindSet();
|
|
60
|
+
}
|
|
61
|
+
this.bindChange.emit(this.bind);
|
|
61
62
|
}
|
|
62
63
|
//#endregion
|
|
63
64
|
//#region ctor
|
|
@@ -73,21 +74,23 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
73
74
|
this._datasource = [];
|
|
74
75
|
this._isInputDatasource = false;
|
|
75
76
|
this._gottenDatasource = [];
|
|
76
|
-
this._bindChangeEmitted = false;
|
|
77
77
|
this.dataLoaded = true;
|
|
78
78
|
this.isAr = false;
|
|
79
79
|
this.isFiltering = false;
|
|
80
80
|
/**
|
|
81
81
|
* Grouped datasource for the MultiSelect component.
|
|
82
|
-
*
|
|
82
|
+
* Two groups, where each group contains a label, a value, and an array of items.
|
|
83
83
|
*
|
|
84
|
-
*
|
|
84
|
+
* Structure:
|
|
85
85
|
* [
|
|
86
86
|
* { label: 'Selected items', value: 'selected-items', items: [...] },
|
|
87
87
|
* { label: 'Available items', value: 'available-items', items: [...] }
|
|
88
88
|
* ]
|
|
89
89
|
*/
|
|
90
90
|
this.grouppedDataSource = [];
|
|
91
|
+
this.tooltipPosition = TooltipPosition;
|
|
92
|
+
this.labelOfElementNotFoundTextKey = 'sharedUi-labelOfElementNotFound';
|
|
93
|
+
this.labelOfElementNotFoundText = '';
|
|
91
94
|
this.listSourceParams = [];
|
|
92
95
|
this.idField = "";
|
|
93
96
|
this.labelField = "";
|
|
@@ -125,6 +128,8 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
125
128
|
this.showAddButton = true;
|
|
126
129
|
this.showAdvancedSearchButton = false;
|
|
127
130
|
this.hasLoadError = false;
|
|
131
|
+
this.labelPropertyNameRootSegment = 'libelle';
|
|
132
|
+
this.labelOfElementNotFoundText = this._localize.transform(this.labelOfElementNotFoundTextKey) ?? 'UNKNOWN !';
|
|
128
133
|
}
|
|
129
134
|
//#endregion
|
|
130
135
|
//#region handle lifecycle hooks
|
|
@@ -210,7 +215,6 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
210
215
|
this.entityConfigurationService.getEntityInfo(this.businessClass).subscribe({
|
|
211
216
|
next: (entity) => {
|
|
212
217
|
const hasForm = !!entity?.formName;
|
|
213
|
-
//console.log("showAddButton", this.showAddButton)
|
|
214
218
|
if (!hasForm) {
|
|
215
219
|
this.showAddButton = false;
|
|
216
220
|
this.showUpdateButton = false;
|
|
@@ -253,9 +257,10 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
253
257
|
let conf = {
|
|
254
258
|
data: {
|
|
255
259
|
isAdvancedSearch: true,
|
|
256
|
-
selectionMode: GridSelectionMode.Single,
|
|
260
|
+
selectionMode: this.multiple ? GridSelectionMode.Multiple : GridSelectionMode.Single,
|
|
257
261
|
mode: Component_Modes.CONSULT,
|
|
258
|
-
customData: entity
|
|
262
|
+
customData: entity,
|
|
263
|
+
selectKeyOnly: this.multiple ? false : true,
|
|
259
264
|
},
|
|
260
265
|
styleClass: '',
|
|
261
266
|
width: ModalSizeEnum.Medium.width,
|
|
@@ -263,12 +268,7 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
263
268
|
maximizable: true,
|
|
264
269
|
};
|
|
265
270
|
this._dialogReference = this._tsiModalService?.open(TypeRegistryHelper.getType(entity.advancedSearchComponent), conf);
|
|
266
|
-
this._dialogReference?.onClose.subscribe((
|
|
267
|
-
if (selectedPerson) {
|
|
268
|
-
this.bind = selectedPerson;
|
|
269
|
-
this.bindChange.emit(this.bind);
|
|
270
|
-
}
|
|
271
|
-
});
|
|
271
|
+
this._dialogReference?.onClose.subscribe((selection) => this.handleExternalSelection(selection));
|
|
272
272
|
},
|
|
273
273
|
error: (err) => {
|
|
274
274
|
console.error(err);
|
|
@@ -285,7 +285,13 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
285
285
|
this.entityConfigurationService.getEntityInfo(this.businessClass).subscribe({
|
|
286
286
|
next: async (entity) => {
|
|
287
287
|
let conf = {
|
|
288
|
-
data: {
|
|
288
|
+
data: {
|
|
289
|
+
isAdvancedSearch: true,
|
|
290
|
+
selectionMode: this.multiple ? GridSelectionMode.Multiple : GridSelectionMode.Single,
|
|
291
|
+
mode: Component_Modes.CONSULT,
|
|
292
|
+
customData: entity,
|
|
293
|
+
selectKeyOnly: this.multiple ? false : true,
|
|
294
|
+
},
|
|
289
295
|
styleClass: '',
|
|
290
296
|
width: ModalSizeEnum.Medium.width,
|
|
291
297
|
height: ModalSizeEnum.Medium.height,
|
|
@@ -296,12 +302,7 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
296
302
|
return;
|
|
297
303
|
}
|
|
298
304
|
this._dialogReference = this._tsiModalService?.open(TypeRegistryHelper.getType(entity.listComponent), conf);
|
|
299
|
-
this._dialogReference?.onClose.subscribe((
|
|
300
|
-
if (selectedPerson) {
|
|
301
|
-
this.bind = selectedPerson;
|
|
302
|
-
this.bindChange.emit(this.bind);
|
|
303
|
-
}
|
|
304
|
-
});
|
|
305
|
+
this._dialogReference?.onClose.subscribe((selection) => this.handleExternalSelection(selection));
|
|
305
306
|
},
|
|
306
307
|
error: (err) => {
|
|
307
308
|
console.error(err);
|
|
@@ -331,12 +332,10 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
331
332
|
this._dialogReference?.onClose.subscribe((savedElement) => {
|
|
332
333
|
if (savedElement) {
|
|
333
334
|
if (typeof savedElement === 'object' && savedElement !== null && 'uid' in savedElement) {
|
|
334
|
-
this.
|
|
335
|
-
this.bindChange.emit(this.bind);
|
|
335
|
+
this.bindValueChanged(savedElement?.uid);
|
|
336
336
|
}
|
|
337
337
|
else if (typeof savedElement === 'string' && Guid.isValid(savedElement)) {
|
|
338
|
-
this.
|
|
339
|
-
this.bindChange.emit(this.bind);
|
|
338
|
+
this.bindValueChanged(savedElement);
|
|
340
339
|
}
|
|
341
340
|
}
|
|
342
341
|
});
|
|
@@ -380,12 +379,10 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
380
379
|
this._dialogReference?.onClose.subscribe((updatedElement) => {
|
|
381
380
|
if (updatedElement) {
|
|
382
381
|
if (typeof updatedElement === 'object' && updatedElement !== null && 'uid' in updatedElement) {
|
|
383
|
-
this.
|
|
384
|
-
this.bindChange.emit(this.bind);
|
|
382
|
+
this.bindValueChanged(updatedElement?.uid);
|
|
385
383
|
}
|
|
386
384
|
else if (typeof updatedElement === 'string' && Guid.isValid(updatedElement)) {
|
|
387
|
-
this.
|
|
388
|
-
this.bindChange.emit(this.bind);
|
|
385
|
+
this.bindValueChanged(updatedElement);
|
|
389
386
|
}
|
|
390
387
|
}
|
|
391
388
|
});
|
|
@@ -431,15 +428,8 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
431
428
|
});
|
|
432
429
|
}
|
|
433
430
|
//#region handle events
|
|
434
|
-
bindValueChanged(
|
|
435
|
-
this.bind =
|
|
436
|
-
if (this.bind !== null && this.bind !== undefined) {
|
|
437
|
-
this._selected = this.bind;
|
|
438
|
-
}
|
|
439
|
-
this.bindChange.emit(event.value);
|
|
440
|
-
if (!this._bindChangeEmitted) {
|
|
441
|
-
this._bindChangeEmitted = true;
|
|
442
|
-
}
|
|
431
|
+
bindValueChanged(newValue) {
|
|
432
|
+
this.bind = newValue;
|
|
443
433
|
this._handleSelectedElementsLabelChange();
|
|
444
434
|
}
|
|
445
435
|
searchValueChanged(searchValue) {
|
|
@@ -460,14 +450,6 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
460
450
|
this.isFiltering &&
|
|
461
451
|
!this.hasLoadError);
|
|
462
452
|
}
|
|
463
|
-
onHide() {
|
|
464
|
-
if (this.dataLoaded) {
|
|
465
|
-
this.bind = this._selected;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
clearSelectedValue() {
|
|
469
|
-
this._selected = undefined;
|
|
470
|
-
}
|
|
471
453
|
//#endregion
|
|
472
454
|
//#region private methods
|
|
473
455
|
_loadDataSource() {
|
|
@@ -547,8 +529,6 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
547
529
|
if (!this.datasource.some(x => x.id === option.id)) {
|
|
548
530
|
this._datasource = [...this.datasource, option];
|
|
549
531
|
}
|
|
550
|
-
this._selected = option.id;
|
|
551
|
-
this.bind = option.id;
|
|
552
532
|
this.selectedLabelChange.emit(option.label);
|
|
553
533
|
this.dataSourceLoaded.emit();
|
|
554
534
|
}
|
|
@@ -627,15 +607,10 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
627
607
|
}
|
|
628
608
|
}
|
|
629
609
|
async _onBindSet() {
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
!this._isInputDatasource) {
|
|
633
|
-
alert("_datasource.length === 0");
|
|
634
|
-
await this._loadBindElement();
|
|
635
|
-
}*/
|
|
636
|
-
if (!this._isInputDatasource) {
|
|
637
|
-
await this._ensureSelectedOptionExists();
|
|
610
|
+
if (this._isInputDatasource) {
|
|
611
|
+
return;
|
|
638
612
|
}
|
|
613
|
+
await this._ensureSelectedOptionExists();
|
|
639
614
|
}
|
|
640
615
|
loadAllData() {
|
|
641
616
|
if (this.isFiltered) {
|
|
@@ -711,10 +686,7 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
711
686
|
* @param {object} newValue - The new value emitted by the MultiSelect component.
|
|
712
687
|
*/
|
|
713
688
|
onMultiSelectModelChange(newValue) {
|
|
714
|
-
|
|
715
|
-
value: newValue
|
|
716
|
-
};
|
|
717
|
-
this.bindValueChanged(newValueEvent);
|
|
689
|
+
this.bindValueChanged(newValue);
|
|
718
690
|
this.calculateGrouppedDataSource();
|
|
719
691
|
}
|
|
720
692
|
/**
|
|
@@ -845,21 +817,84 @@ export class TsiSearchComboComponent extends TsiInputBase {
|
|
|
845
817
|
this.selectedLabelChange.emit(selectionLabel);
|
|
846
818
|
}
|
|
847
819
|
}
|
|
820
|
+
distinct(values) {
|
|
821
|
+
return [...new Set(values)];
|
|
822
|
+
}
|
|
823
|
+
handleExternalSelection(dropdownExternalSelectionOutput) {
|
|
824
|
+
if (!dropdownExternalSelectionOutput)
|
|
825
|
+
return;
|
|
826
|
+
let selection = dropdownExternalSelectionOutput.items;
|
|
827
|
+
let selectionKey = dropdownExternalSelectionOutput.itemKeyPropertyName;
|
|
828
|
+
// Handle multiple mode selection
|
|
829
|
+
if (this.multiple && Array.isArray(selection) && selection.length > 0) {
|
|
830
|
+
let newItems = selection
|
|
831
|
+
.filter(i => !this.datasource.some(s => s.id == i[selectionKey]));
|
|
832
|
+
if (newItems && newItems.length > 0) {
|
|
833
|
+
// format selected items
|
|
834
|
+
let labelPropName = this.getBestLabelPropertyName(selection[0]);
|
|
835
|
+
let tempArray = newItems.map((element) => {
|
|
836
|
+
return {
|
|
837
|
+
id: element[selectionKey],
|
|
838
|
+
label: (labelPropName in element) ? element[labelPropName] : this.labelOfElementNotFoundText
|
|
839
|
+
};
|
|
840
|
+
});
|
|
841
|
+
// apend selected items to Datasource
|
|
842
|
+
this._datasource = this._distinctById([...this.datasource, ...tempArray]);
|
|
843
|
+
if (this.sort) {
|
|
844
|
+
this._datasource.sort(this._compareFunction());
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
let newSelectedItemsIds = selection.map(i => i[selectionKey]);
|
|
848
|
+
let selectedItemsIds = this.distinct([...(this.bind ? this.bind : []), ...newSelectedItemsIds]);
|
|
849
|
+
this.onMultiSelectModelChange(selectedItemsIds);
|
|
850
|
+
}
|
|
851
|
+
else {
|
|
852
|
+
// Handle signle mode selection
|
|
853
|
+
this.bindValueChanged(selection);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
857
|
+
* Retrieves the value of the first property (alphabetically)
|
|
858
|
+
* whose name contains 'label' (case-insensitive) from a given object.
|
|
859
|
+
*
|
|
860
|
+
* @param obj - The source object (can be of type any)
|
|
861
|
+
* @returns The value of the first matching property, or undefined if none found
|
|
862
|
+
*/
|
|
863
|
+
getFirstLabelPropertyName(obj) {
|
|
864
|
+
if (!obj || typeof obj !== 'object') {
|
|
865
|
+
return undefined;
|
|
866
|
+
}
|
|
867
|
+
return Object.keys(obj)
|
|
868
|
+
.filter(key => key.toLowerCase().includes(this.labelPropertyNameRootSegment))
|
|
869
|
+
.sort((a, b) => a.localeCompare(b))
|
|
870
|
+
.map(key => obj[key])[0];
|
|
871
|
+
}
|
|
872
|
+
getBestLabelPropertyName(object) {
|
|
873
|
+
return this.labelField;
|
|
874
|
+
// TODO, @Hassen, à revoir plus tard.
|
|
875
|
+
let bestLabelPropertyName = '';
|
|
876
|
+
if (this.labelField in object)
|
|
877
|
+
bestLabelPropertyName = this.labelField;
|
|
878
|
+
else if (this.labelPropertyNameRootSegment in object)
|
|
879
|
+
bestLabelPropertyName = this.labelPropertyNameRootSegment;
|
|
880
|
+
else
|
|
881
|
+
bestLabelPropertyName = this.getFirstLabelPropertyName(object);
|
|
882
|
+
console.log(`[LabelField : ${this.labelField}] VS [BestLabelPropertyName : ${bestLabelPropertyName}]`);
|
|
883
|
+
return bestLabelPropertyName;
|
|
884
|
+
}
|
|
848
885
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiSearchComboComponent, deps: [{ token: i1.EntityConfigurationService }, { token: i2.TsiModalService }, { token: i3.TsiNotificationService }, { token: i4.HttpClient }, { token: i5.LocalizePipe }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
849
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: { elementSourceUrl: "elementSourceUrl", listSourceUrl: "listSourceUrl", listSourceParams: "listSourceParams", idField: ["id-field", "idField"], labelField: ["label-field", "labelField"], multiple: "multiple", sort: "sort", showClear: "showClear", reloadDataSource: "reloadDataSource", isFiltered: "isFiltered", selectedLabel: "selectedLabel", maxWidth: "maxWidth", businessClass: "businessClass", comboType: "comboType", statusMetadata: "statusMetadata", currentRowItem: "currentRowItem", datasource: "datasource", bind: "bind", maxSelectedLabels: "maxSelectedLabels", tooltipMaxDisplayedItems: "tooltipMaxDisplayedItems", showSearchButton: "showSearchButton", showAddButton: "showAddButton", showConsultButton: "showConsultButton", showUpdateButton: "showUpdateButton" }, outputs: { bindChange: "bindChange", dataSourceLoaded: "datasource-loaded", init: "init", isLoaded: "isLoaded", selectedLabelChange: "selectedLabelChange", onClick: "onClick", onSearchButtonClick: "onSearchButtonClick" }, host: { listeners: { "keydown.enter": "onEnterKey($event)" } }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!multiple; else multiSelect\" class=\"flex\">\r\n <p-dropdown \r\n [options]=\"datasource\"\r\n [(ngModel)]=\"bind\"\r\n optionLabel=\"label\"\r\n optionValue=\"id\"\r\n [lazy]=\"!dataLoaded\"\r\n [loading]=\"!dataLoaded\"\r\n filterBy=\"label\" \r\n [filter]=\"true\" \r\n [autoDisplayFirst]=\"false\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\" \r\n [disabled]=\"disabled\" \r\n (onChange)=\"bindValueChanged($event)\" \r\n (onHide)=\"onHide()\" (onShow)=\"onOpen()\" (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n [placeholder]=\"placeHolder\" \r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" \r\n appendTo=\"body\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n \r\n\r\n <ng-template pTemplate=\"empty\">\r\n <div class=\"flex align-items-center justify-content-center py-3 gap-2\">\r\n \r\n <ng-container *ngIf=\"!isApiError; else apiError\">\r\n\r\n <div\r\n *ngIf=\"isDatasourceEmpty && !isFiltering\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_element' | localize }}</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"isNoResultAfterFilter\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_result' | localize }}</span>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-template #apiError>\r\n <i class=\"pi pi-exclamation-triangle text-orange-500\"></i>\r\n <span>\r\n {{ 'search_combo_load_error' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\r\n <div pTooltip=\"{{selectedOption.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalSelected\">\r\n <ng-container *ngIf=\"selectedOption && getStatusOption(selectedOption.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\">\r\n {{ selectedOption.label }}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalSelected>\r\n <span>{{ selectedOption.label }}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n\r\n</div>\r\n\r\n<ng-template #multiSelect>\r\n <p-multiSelect\r\n #multiSelectElement\r\n [options]=\"grouppedDataSource\"\r\n [group]=\"true\" \r\n [ngModel]=\"bind\"\r\n [optionLabel]=\"'label'\"\r\n [optionValue]=\"'id'\"\r\n [loading]=\"!dataLoaded\"\r\n [filterBy]=\"'label'\"\r\n [filter]=\"true\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\"\r\n [disabled]=\"disabled\"\r\n [selectedItemsLabel]=\"'shared_component_multiselect_selected_items_count' | localize\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\"\r\n panelStyleClass=\"tsi-multiselect-panel\"\r\n appendTo=\"body\"\r\n (ngModelChange)=\"onMultiSelectModelChange($event)\"\r\n (onPanelShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\"\r\n (onClick)=\"onSearchComboClick($event)\"\r\n [pTooltip]=\"multiSelectElement?.selectedOptions?.length ? multiSelectTooltipContent : undefined\" tooltipPosition=\"bottom\">\r\n\r\n <ng-template pTemplate=\"item\" let-option>\r\n <div #labelRef class=\"tsi-multiselect-option-label\" tooltipPosition=\"bottom\" tooltipAppendTo=\"body\" [pTooltip]=\"isTextOverflowing(labelRef) ? option.label : null\">\r\n {{ option.label }}\r\n </div>\r\n </ng-template> \r\n </p-multiSelect>\r\n\r\n <ng-template #multiSelectTooltipContent>\r\n <div class=\"p-2\">\r\n <!-- If there are selected items -->\r\n <ng-container *ngIf=\"multiSelectElement?.selectedOptions?.length; else noItems\">\r\n\r\n <div class=\"font-semibold mb-1\">\r\n {{ 'shared_component_multiselect_selected_items_title' | localize }}\r\n ({{ multiSelectElement.selectedOptions.length }})\r\n </div>\r\n\r\n <ul class=\"m-0 pl-3\">\r\n <!-- Show only first 10 items -->\r\n <li *ngFor=\"let option of getTopSelectedOptions(multiSelectElement)\">\r\n {{ option.label }}\r\n </li>\r\n </ul>\r\n\r\n <!-- Show message if more than 10 -->\r\n <div *ngIf=\"multiSelectElement.selectedOptions.length > 10\" class=\"text-sm mt-1 text-gray-500\">\r\n {{ multiSelectElement.selectedOptions.length - 10 }}\r\n {{ 'shared_component_multiselect_selected_items_more_message' | localize }}\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <!-- If no items selected -->\r\n <ng-template #noItems>\r\n <span class=\"text-sm text-500\">\r\n {{ 'shared_component_multiselect_selected_items_empty' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n</ng-template>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}::ng-deep .tsi-component.p-multiselect .p-multiselect-label{padding:.25rem .75rem!important}.p-multiselect-panel .p-multiselect-items .p-multiselect-item{gap:.5rem}.tsi-multiselect-panel{max-width:25rem!important}.tsi-multiselect-panel .tsi-multiselect-option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i10.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i11.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i12.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i13.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "pipe", type: i14.LocalizePipe, name: "localize" }] }); }
|
|
886
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: { elementSourceUrl: "elementSourceUrl", listSourceUrl: "listSourceUrl", listSourceParams: "listSourceParams", idField: ["id-field", "idField"], labelField: ["label-field", "labelField"], multiple: "multiple", sort: "sort", showClear: "showClear", reloadDataSource: "reloadDataSource", isFiltered: "isFiltered", selectedLabel: "selectedLabel", maxWidth: "maxWidth", businessClass: "businessClass", comboType: "comboType", statusMetadata: "statusMetadata", currentRowItem: "currentRowItem", datasource: "datasource", bind: "bind", maxSelectedLabels: "maxSelectedLabels", tooltipMaxDisplayedItems: "tooltipMaxDisplayedItems", showSearchButton: "showSearchButton", showAddButton: "showAddButton", showConsultButton: "showConsultButton", showUpdateButton: "showUpdateButton" }, outputs: { bindChange: "bindChange", dataSourceLoaded: "datasource-loaded", init: "init", isLoaded: "isLoaded", selectedLabelChange: "selectedLabelChange", onClick: "onClick", onSearchButtonClick: "onSearchButtonClick" }, host: { listeners: { "keydown.enter": "onEnterKey($event)" } }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!multiple; else multiSelect\" class=\"flex\">\r\n <p-dropdown \r\n [options]=\"datasource\"\r\n [ngModel]=\"bind\"\r\n optionLabel=\"label\"\r\n optionValue=\"id\"\r\n [loading]=\"!dataLoaded\"\r\n filterBy=\"label\" \r\n [filter]=\"true\" \r\n [autoDisplayFirst]=\"false\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\" \r\n [disabled]=\"disabled\" \r\n (ngModelChange)=\"bindValueChanged($event)\" \r\n (onShow)=\"onOpen()\" (onFilter)=\"searchValueChanged($event)\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n [placeholder]=\"placeHolder\" \r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" \r\n appendTo=\"body\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" tooltipText=\"sharedUi-searchCombo-action-search\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\" tooltipText=\"sharedUi-searchCombo-action-advancedSearch\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" tooltipText=\"sharedUi-searchCombo-action-add\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" tooltipText=\"sharedUi-searchCombo-action-edit\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" tooltipText=\"sharedUi-searchCombo-action-consult\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n \r\n\r\n <ng-template pTemplate=\"empty\">\r\n <div class=\"flex align-items-center justify-content-center py-3 gap-2\">\r\n \r\n <ng-container *ngIf=\"!isApiError; else apiError\">\r\n\r\n <div\r\n *ngIf=\"isDatasourceEmpty && !isFiltering\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_element' | localize }}</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"isNoResultAfterFilter\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_result' | localize }}</span>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-template #apiError>\r\n <i class=\"pi pi-exclamation-triangle text-orange-500\"></i>\r\n <span>\r\n {{ 'search_combo_load_error' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\r\n <div pTooltip=\"{{selectedOption.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalSelected\">\r\n <ng-container *ngIf=\"selectedOption && getStatusOption(selectedOption.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\">\r\n {{ selectedOption.label }}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalSelected>\r\n <span>{{ selectedOption.label }}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n\r\n</div>\r\n\r\n<ng-template #multiSelect>\r\n <p-multiSelect\r\n #multiSelectElement\r\n [options]=\"grouppedDataSource\"\r\n [group]=\"true\" \r\n [ngModel]=\"bind\"\r\n [optionLabel]=\"'label'\"\r\n [optionValue]=\"'id'\"\r\n [loading]=\"!dataLoaded\"\r\n [filterBy]=\"'label'\"\r\n [filter]=\"true\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\"\r\n [disabled]=\"disabled\"\r\n [selectedItemsLabel]=\"'shared_component_multiselect_selected_items_count' | localize\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n [showToggleAll]=\"false\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\"\r\n panelStyleClass=\"tsi-multiselect-panel\"\r\n appendTo=\"body\"\r\n (ngModelChange)=\"onMultiSelectModelChange($event)\"\r\n (onPanelShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\"\r\n (onClick)=\"onSearchComboClick($event)\"\r\n [pTooltip]=\"multiSelectElement?.selectedOptions?.length ? multiSelectTooltipContent : undefined\" tooltipPosition=\"bottom\">\r\n\r\n <ng-template pTemplate=\"item\" let-option>\r\n <div #labelRef class=\"tsi-multiselect-option-label\" tooltipPosition=\"bottom\" tooltipAppendTo=\"body\" [pTooltip]=\"isTextOverflowing(labelRef) ? option.label : null\">\r\n {{ option.label }}\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 p-1\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" tooltipText=\"sharedUi-searchCombo-action-search\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\" tooltipText=\"sharedUi-searchCombo-action-advancedSearch\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n <ng-template #multiSelectTooltipContent>\r\n <div class=\"p-2\">\r\n <!-- If there are selected items -->\r\n <ng-container *ngIf=\"multiSelectElement?.selectedOptions?.length; else noItems\">\r\n\r\n <div class=\"font-semibold mb-1\">\r\n {{ 'shared_component_multiselect_selected_items_title' | localize }}\r\n ({{ multiSelectElement.selectedOptions.length }})\r\n </div>\r\n\r\n <ul class=\"m-0 pl-3\">\r\n <!-- Show only first 10 items -->\r\n <li *ngFor=\"let option of getTopSelectedOptions(multiSelectElement)\">\r\n {{ option.label }}\r\n </li>\r\n </ul>\r\n\r\n <!-- Show message if more than 10 -->\r\n <div *ngIf=\"multiSelectElement.selectedOptions.length > 10\" class=\"text-sm mt-1 text-gray-500\">\r\n {{ multiSelectElement.selectedOptions.length - 10 }}\r\n {{ 'shared_component_multiselect_selected_items_more_message' | localize }}\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <!-- If no items selected -->\r\n <ng-template #noItems>\r\n <span class=\"text-sm text-500\">\r\n {{ 'shared_component_multiselect_selected_items_empty' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n</ng-template>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}::ng-deep .tsi-component.p-multiselect .p-multiselect-label{padding:.25rem .75rem!important}.p-multiselect-panel .p-multiselect-items .p-multiselect-item{gap:.5rem}.tsi-multiselect-panel{max-width:25rem!important}.tsi-multiselect-panel .tsi-multiselect-option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i10.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i11.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i12.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i13.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "pipe", type: i14.LocalizePipe, name: "localize" }] }); }
|
|
850
887
|
}
|
|
851
888
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiSearchComboComponent, decorators: [{
|
|
852
889
|
type: Component,
|
|
853
|
-
args: [{ selector: 'Tsi-Search-Combo', template: "<div *ngIf=\"!multiple; else multiSelect\" class=\"flex\">\r\n <p-dropdown \r\n [options]=\"datasource\"\r\n [(ngModel)]=\"bind\"\r\n optionLabel=\"label\"\r\n optionValue=\"id\"\r\n [lazy]=\"!dataLoaded\"\r\n [loading]=\"!dataLoaded\"\r\n filterBy=\"label\" \r\n [filter]=\"true\" \r\n [autoDisplayFirst]=\"false\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\" \r\n [disabled]=\"disabled\" \r\n (onChange)=\"bindValueChanged($event)\" \r\n (onHide)=\"onHide()\" (onShow)=\"onOpen()\" (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n [placeholder]=\"placeHolder\" \r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" \r\n appendTo=\"body\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n \r\n\r\n <ng-template pTemplate=\"empty\">\r\n <div class=\"flex align-items-center justify-content-center py-3 gap-2\">\r\n \r\n <ng-container *ngIf=\"!isApiError; else apiError\">\r\n\r\n <div\r\n *ngIf=\"isDatasourceEmpty && !isFiltering\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_element' | localize }}</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"isNoResultAfterFilter\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_result' | localize }}</span>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-template #apiError>\r\n <i class=\"pi pi-exclamation-triangle text-orange-500\"></i>\r\n <span>\r\n {{ 'search_combo_load_error' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\r\n <div pTooltip=\"{{selectedOption.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalSelected\">\r\n <ng-container *ngIf=\"selectedOption && getStatusOption(selectedOption.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\">\r\n {{ selectedOption.label }}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalSelected>\r\n <span>{{ selectedOption.label }}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n\r\n</div>\r\n\r\n<ng-template #multiSelect>\r\n <p-multiSelect\r\n #multiSelectElement\r\n [options]=\"grouppedDataSource\"\r\n [group]=\"true\" \r\n [ngModel]=\"bind\"\r\n [optionLabel]=\"'label'\"\r\n [optionValue]=\"'id'\"\r\n [loading]=\"!dataLoaded\"\r\n [filterBy]=\"'label'\"\r\n [filter]=\"true\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\"\r\n [disabled]=\"disabled\"\r\n [selectedItemsLabel]=\"'shared_component_multiselect_selected_items_count' | localize\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\"\r\n panelStyleClass=\"tsi-multiselect-panel\"\r\n appendTo=\"body\"\r\n (ngModelChange)=\"onMultiSelectModelChange($event)\"\r\n (onPanelShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\"\r\n (onClick)=\"onSearchComboClick($event)\"\r\n [pTooltip]=\"multiSelectElement?.selectedOptions?.length ? multiSelectTooltipContent : undefined\" tooltipPosition=\"bottom\">\r\n\r\n <ng-template pTemplate=\"item\" let-option>\r\n <div #labelRef class=\"tsi-multiselect-option-label\" tooltipPosition=\"bottom\" tooltipAppendTo=\"body\" [pTooltip]=\"isTextOverflowing(labelRef) ? option.label : null\">\r\n {{ option.label }}\r\n </div>\r\n </ng-template> \r\n </p-multiSelect>\r\n\r\n <ng-template #multiSelectTooltipContent>\r\n <div class=\"p-2\">\r\n <!-- If there are selected items -->\r\n <ng-container *ngIf=\"multiSelectElement?.selectedOptions?.length; else noItems\">\r\n\r\n <div class=\"font-semibold mb-1\">\r\n {{ 'shared_component_multiselect_selected_items_title' | localize }}\r\n ({{ multiSelectElement.selectedOptions.length }})\r\n </div>\r\n\r\n <ul class=\"m-0 pl-3\">\r\n <!-- Show only first 10 items -->\r\n <li *ngFor=\"let option of getTopSelectedOptions(multiSelectElement)\">\r\n {{ option.label }}\r\n </li>\r\n </ul>\r\n\r\n <!-- Show message if more than 10 -->\r\n <div *ngIf=\"multiSelectElement.selectedOptions.length > 10\" class=\"text-sm mt-1 text-gray-500\">\r\n {{ multiSelectElement.selectedOptions.length - 10 }}\r\n {{ 'shared_component_multiselect_selected_items_more_message' | localize }}\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <!-- If no items selected -->\r\n <ng-template #noItems>\r\n <span class=\"text-sm text-500\">\r\n {{ 'shared_component_multiselect_selected_items_empty' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n</ng-template>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}::ng-deep .tsi-component.p-multiselect .p-multiselect-label{padding:.25rem .75rem!important}.p-multiselect-panel .p-multiselect-items .p-multiselect-item{gap:.5rem}.tsi-multiselect-panel{max-width:25rem!important}.tsi-multiselect-panel .tsi-multiselect-option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
|
|
890
|
+
args: [{ selector: 'Tsi-Search-Combo', template: "<div *ngIf=\"!multiple; else multiSelect\" class=\"flex\">\r\n <p-dropdown \r\n [options]=\"datasource\"\r\n [ngModel]=\"bind\"\r\n optionLabel=\"label\"\r\n optionValue=\"id\"\r\n [loading]=\"!dataLoaded\"\r\n filterBy=\"label\" \r\n [filter]=\"true\" \r\n [autoDisplayFirst]=\"false\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\" \r\n [disabled]=\"disabled\" \r\n (ngModelChange)=\"bindValueChanged($event)\" \r\n (onShow)=\"onOpen()\" (onFilter)=\"searchValueChanged($event)\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n [placeholder]=\"placeHolder\" \r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" \r\n appendTo=\"body\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" tooltipText=\"sharedUi-searchCombo-action-search\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\" tooltipText=\"sharedUi-searchCombo-action-advancedSearch\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" tooltipText=\"sharedUi-searchCombo-action-add\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" tooltipText=\"sharedUi-searchCombo-action-edit\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" tooltipText=\"sharedUi-searchCombo-action-consult\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n \r\n\r\n <ng-template pTemplate=\"empty\">\r\n <div class=\"flex align-items-center justify-content-center py-3 gap-2\">\r\n \r\n <ng-container *ngIf=\"!isApiError; else apiError\">\r\n\r\n <div\r\n *ngIf=\"isDatasourceEmpty && !isFiltering\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_element' | localize }}</span>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"isNoResultAfterFilter\"\r\n class=\"flex align-items-center gap-2 text-gray-500\">\r\n <i class=\"pi pi-info-circle\"></i>\r\n <span>{{ 'search_combo_no_result' | localize }}</span>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-template #apiError>\r\n <i class=\"pi pi-exclamation-triangle text-orange-500\"></i>\r\n <span>\r\n {{ 'search_combo_load_error' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"selectedItem\" let-selectedOption>\r\n <div pTooltip=\"{{selectedOption.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalSelected\">\r\n <ng-container *ngIf=\"selectedOption && getStatusOption(selectedOption.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\">\r\n {{ selectedOption.label }}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalSelected>\r\n <span>{{ selectedOption.label }}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n\r\n</div>\r\n\r\n<ng-template #multiSelect>\r\n <p-multiSelect\r\n #multiSelectElement\r\n [options]=\"grouppedDataSource\"\r\n [group]=\"true\" \r\n [ngModel]=\"bind\"\r\n [optionLabel]=\"'label'\"\r\n [optionValue]=\"'id'\"\r\n [loading]=\"!dataLoaded\"\r\n [filterBy]=\"'label'\"\r\n [filter]=\"true\"\r\n [required]=\"isRequired\"\r\n [showClear]=\"showClear\"\r\n [disabled]=\"disabled\"\r\n [selectedItemsLabel]=\"'shared_component_multiselect_selected_items_count' | localize\"\r\n [maxSelectedLabels]=\"maxSelectedLabels\"\r\n [showToggleAll]=\"false\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [placeholder]=\"placeHolder\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR'\"\r\n class=\"{{myStyleClass}}\" \r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\"\r\n panelStyleClass=\"tsi-multiselect-panel\"\r\n appendTo=\"body\"\r\n (ngModelChange)=\"onMultiSelectModelChange($event)\"\r\n (onPanelShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\"\r\n (onClick)=\"onSearchComboClick($event)\"\r\n [pTooltip]=\"multiSelectElement?.selectedOptions?.length ? multiSelectTooltipContent : undefined\" tooltipPosition=\"bottom\">\r\n\r\n <ng-template pTemplate=\"item\" let-option>\r\n <div #labelRef class=\"tsi-multiselect-option-label\" tooltipPosition=\"bottom\" tooltipAppendTo=\"body\" [pTooltip]=\"isTextOverflowing(labelRef) ? option.label : null\">\r\n {{ option.label }}\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 p-1\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" tooltipText=\"sharedUi-searchCombo-action-search\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\" tooltipText=\"sharedUi-searchCombo-action-advancedSearch\"\r\n [tooltipPosition]=\"tooltipPosition.Bottom\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n <ng-template #multiSelectTooltipContent>\r\n <div class=\"p-2\">\r\n <!-- If there are selected items -->\r\n <ng-container *ngIf=\"multiSelectElement?.selectedOptions?.length; else noItems\">\r\n\r\n <div class=\"font-semibold mb-1\">\r\n {{ 'shared_component_multiselect_selected_items_title' | localize }}\r\n ({{ multiSelectElement.selectedOptions.length }})\r\n </div>\r\n\r\n <ul class=\"m-0 pl-3\">\r\n <!-- Show only first 10 items -->\r\n <li *ngFor=\"let option of getTopSelectedOptions(multiSelectElement)\">\r\n {{ option.label }}\r\n </li>\r\n </ul>\r\n\r\n <!-- Show message if more than 10 -->\r\n <div *ngIf=\"multiSelectElement.selectedOptions.length > 10\" class=\"text-sm mt-1 text-gray-500\">\r\n {{ multiSelectElement.selectedOptions.length - 10 }}\r\n {{ 'shared_component_multiselect_selected_items_more_message' | localize }}\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <!-- If no items selected -->\r\n <ng-template #noItems>\r\n <span class=\"text-sm text-500\">\r\n {{ 'shared_component_multiselect_selected_items_empty' | localize }}\r\n </span>\r\n </ng-template>\r\n\r\n </div>\r\n </ng-template>\r\n</ng-template>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}::ng-deep .tsi-component.p-multiselect .p-multiselect-label{padding:.25rem .75rem!important}.p-multiselect-panel .p-multiselect-items .p-multiselect-item{gap:.5rem}.tsi-multiselect-panel{max-width:25rem!important}.tsi-multiselect-panel .tsi-multiselect-option-label{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
|
|
854
891
|
}], ctorParameters: () => [{ type: i1.EntityConfigurationService }, { type: i2.TsiModalService }, { type: i3.TsiNotificationService }, { type: i4.HttpClient }, { type: i5.LocalizePipe }, { type: i0.ChangeDetectorRef }], propDecorators: { onEnterKey: [{
|
|
855
892
|
type: HostListener,
|
|
856
893
|
args: ['keydown.enter', ['$event']]
|
|
857
894
|
}], elementSourceUrl: [{
|
|
858
|
-
type: Input
|
|
859
|
-
args: ["elementSourceUrl"]
|
|
895
|
+
type: Input
|
|
860
896
|
}], listSourceUrl: [{
|
|
861
|
-
type: Input
|
|
862
|
-
args: ["listSourceUrl"]
|
|
897
|
+
type: Input
|
|
863
898
|
}], listSourceParams: [{
|
|
864
899
|
type: Input
|
|
865
900
|
}], idField: [{
|
|
@@ -869,11 +904,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
869
904
|
type: Input,
|
|
870
905
|
args: ["label-field"]
|
|
871
906
|
}], multiple: [{
|
|
872
|
-
type: Input
|
|
873
|
-
args: ["multiple"]
|
|
907
|
+
type: Input
|
|
874
908
|
}], sort: [{
|
|
875
|
-
type: Input
|
|
876
|
-
args: ["sort"]
|
|
909
|
+
type: Input
|
|
877
910
|
}], showClear: [{
|
|
878
911
|
type: Input
|
|
879
912
|
}], reloadDataSource: [{
|
|
@@ -925,4 +958,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
925
958
|
}], showUpdateButton: [{
|
|
926
959
|
type: Input
|
|
927
960
|
}] } });
|
|
928
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktc2VhcmNoLWNvbWJvL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLXNlYXJjaC1jb21iby90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNILE9BQU8sRUFBRSxjQUFjLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTW5GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUN6RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXL0UsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFlBQWlCO0lBNkI1RCxVQUFVLENBQUMsS0FBVTtRQUNuQixrQ0FBa0M7UUFDbEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtB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QUFhO3NCQUFyQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFHRixjQUFjO3NCQURqQixLQUFLO2dCQVNPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBYWEsSUFBSTtzQkFBdEIsS0FBSzt1QkFBQyxNQUFNO2dCQTJCSixpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBUUcsd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUlJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ3NCLGdCQUFnQjtzQkFBNUMsTUFBTTt1QkFBQyxtQkFBbUI7Z0JBQ2pCLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFzRkUsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRfTW9kZXMsIEdyaWRTZWxlY3Rpb25Nb2RlLCBNb2RhbFNpemVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBDb21ib1N0YXR1c01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UsIFN0YXR1c09wdGlvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9zdGF0dXMvY29sb3Itc3RhdHVzJztcclxuaW1wb3J0IHsgRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb25maWd1cmF0aW9uL2VudGl0eS1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RhbC90c2ktbW9kYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vdHNpLW5vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpSW5wdXRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWJhc2UvdHNpLWlucHV0LWJhc2UvdHNpLWlucHV0LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgR3VpZCB9IGZyb20gJy4uLy4uLy4uL3RzaS1oZWxwZXJzL2d1aWQuaGVscGVyJztcclxuaW1wb3J0IHsgVHlwZVJlZ2lzdHJ5SGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvdHlwZS1yZWdpc3RyeS5oZWxwZXInO1xyXG5pbXBvcnQgeyBNdWx0aVNlbGVjdCB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5pbXBvcnQgeyBTZWxlY3RJdGVtR3JvdXAgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzJztcclxuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdUc2ktU2VhcmNoLUNvbWJvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpU2VhcmNoQ29tYm9Db21wb25lbnQgZXh0ZW5kcyBUc2lJbnB1dEJhc2U8YW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLy8jcmVnaW9uIGxvY2FsIHZhcnNcclxuICBwcml2YXRlIF9kYXRhc291cmNlOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2lzSW5wdXREYXRhc291cmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcmVsb2FkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZ290dGVuRGF0YXNvdXJjZTogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9iaW5kPzogYW55O1xyXG4gIHByaXZhdGUgX2JpbmRDaGFuZ2VFbWl0dGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFJvd0l0ZW0/OiBhbnk7XHJcbiAgcHVibGljIGRhdGFMb2FkZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX3NlbGVjdGVkPzogYW55O1xyXG4gIHByaXZhdGUgX2RpYWxvZ1JlZmVyZW5jZT86IER5bmFtaWNEaWFsb2dSZWYgfCB1bmRlZmluZWQ7XHJcbiAgaXNBcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0ZpbHRlcmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICogR3JvdXBlZCBkYXRhc291cmNlIGZvciB0aGUgTXVsdGlTZWxlY3QgY29tcG9uZW50LlxyXG4gKiBFYWNoIGdyb3VwIGNvbnRhaW5zIGEgbGFiZWwsIGEgdmFsdWUsIGFuZCBhbiBhcnJheSBvZiBpdGVtcy5cclxuICogXHJcbiAqIEV4YW1wbGUgc3RydWN0dXJlOlxyXG4gKiBbXHJcbiAqICAgeyBsYWJlbDogJ1NlbGVjdGVkIGl0ZW1zJywgdmFsdWU6ICdzZWxlY3RlZC1pdGVtcycsIGl0ZW1zOiBbLi4uXSB9LFxyXG4gKiAgIHsgbGFiZWw6ICdBdmFpbGFibGUgaXRlbXMnLCB2YWx1ZTogJ2F2YWlsYWJsZS1pdGVtcycsIGl0ZW1zOiBbLi4uXSB9XHJcbiAqIF1cclxuICovXHJcbiAgcHJvdGVjdGVkIGdyb3VwcGVkRGF0YVNvdXJjZTogU2VsZWN0SXRlbUdyb3VwW10gPSBbXTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgb25FbnRlcktleShldmVudDogYW55KSB7XHJcbiAgICAvLyBIYW5kbGUgdGhlIGVudGVyIGtleSBldmVudCBoZXJlXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KFwiZWxlbWVudFNvdXJjZVVybFwiKSBlbGVtZW50U291cmNlVXJsPzogc3RyaW5nO1xyXG4gIEBJbnB1dChcImxpc3RTb3VyY2VVcmxcIikgbGlzdFNvdXJjZVVybD86IHN0cmluZyB8ICgoaXRlbTogYW55KSA9PiBzdHJpbmcpO1xyXG4gIEBJbnB1dCgpIGxpc3RTb3VyY2VQYXJhbXM6IEtleVZhbHVlPHN0cmluZywgYW55PltdID0gW107XHJcbiAgQElucHV0KFwiaWQtZmllbGRcIikgaWRGaWVsZDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoXCJsYWJlbC1maWVsZFwiKSBsYWJlbEZpZWxkOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dChcIm11bHRpcGxlXCIpIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KFwic29ydFwiKSBzb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDbGVhcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcmVsb2FkRGF0YVNvdXJjZTogT2JzZXJ2YWJsZTxhbnk+IHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGlzRmlsdGVyZWQ/OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbD86IHN0cmluZztcclxuICBASW5wdXQoKSBtYXhXaWR0aDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgYnVzaW5lc3NDbGFzczogc3RyaW5nID0gJyc7XHJcblxyXG4gIEBJbnB1dCgpIGNvbWJvVHlwZT86IHN0cmluZztcclxuICBASW5wdXQoKSBzdGF0dXNNZXRhZGF0YT86IFN0YXR1c01ldGFkYXRhUmVzcG9uc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGN1cnJlbnRSb3dJdGVtKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFJvd0l0ZW07XHJcbiAgfVxyXG5cclxuICBzZXQgY3VycmVudFJvd0l0ZW0odmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fY3VycmVudFJvd0l0ZW0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGdldCBkYXRhc291cmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFzb3VyY2U7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YXNvdXJjZShkYXRhc291cmNlOiBhbnlbXSkge1xyXG4gICAgdGhpcy5fZ290dGVuRGF0YXNvdXJjZSA9IGRhdGFzb3VyY2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKClcclxuICAgICAgdGhpcy5faXNJbnB1dERhdGFzb3VyY2UgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KFwiYmluZFwiKSBnZXQgYmluZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9iaW5kO1xyXG4gIH1cclxuXHJcbiAgc2V0IGJpbmQodmFsdWU6IGFueSkge1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX2JpbmQgPSBudWxsO1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWVsZCA9IG51bGw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fYmluZCA9PT0gdmFsdWUpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLl9iaW5kID0gdmFsdWU7XHJcbiAgICB0aGlzLmlucHV0RmllbGQgPSB2YWx1ZTtcclxuICAgIFxyXG4gICAgdGhpcy5fb25CaW5kU2V0KCk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gKiBNYXhpbXVtIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtIGxhYmVscyB0byBkaXNwbGF5IGRpcmVjdGx5IGluIHRoZSBNdWx0aVNlbGVjdCBpbnB1dCBmaWVsZC5cclxuICogSWYgdGhlIHVzZXIgc2VsZWN0cyBtb3JlIHRoYW4gdGhpcyBudW1iZXIsIHRoZSBjb21wb25lbnQgY2FuIHNob3cgYSBcIitOXCIgbWVzc2FnZSBpbnN0ZWFkLlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAZGVmYXVsdCAxXHJcbiAqL1xyXG4gIEBJbnB1dCgpIG1heFNlbGVjdGVkTGFiZWxzOiBudW1iZXIgPSAxO1xyXG4gIFxyXG4gIC8qKlxyXG4gKiBNYXhpbXVtIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcyB0byBkaXNwbGF5IGluc2lkZSB0aGUgdG9vbHRpcC5cclxuICogSWYgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcyBleGNlZWRzIHRoaXMgbGltaXQsIHRoZSB0b29sdGlwIGNhbiBkaXNwbGF5IGEgXCIrTiBtb3JlXCIgbWVzc2FnZS5cclxuICogQHR5cGUge251bWJlcn1cclxuICogQGRlZmF1bHQgMTBcclxuICovXHJcbiAgQElucHV0KCkgdG9vbHRpcE1heERpc3BsYXllZEl0ZW1zOiBudW1iZXIgPSAxMDtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIE91dHB1dHNcclxuICBAT3V0cHV0KCkgYmluZENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KFwiZGF0YXNvdXJjZS1sb2FkZWRcIikgZGF0YVNvdXJjZUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tYm9TdGF0dXNNb2RlbD4oKTtcclxuICBAT3V0cHV0KCkgaXNMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvU3RhdHVzTW9kZWw+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkTGFiZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25TZWFyY2hCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbnRpdHlDb25maWd1cmF0aW9uU2VydmljZTogRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lNb2RhbFNlcnZpY2U6IFRzaU1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgX2xvY2FsaXplOiBMb2NhbGl6ZVBpcGUsXHJcbiAgICBwcm90ZWN0ZWQgX2NkUmVmPzogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgKSB7XHJcbiAgICBzdXBlcihfY2RSZWYpXHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gaGFuZGxlIGxpZmVjeWNsZSBob29rc1xyXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1N0YXR1c0NvbWJvKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tYm9UeXBlID09PSAnc3RhdHVzJztcclxuICB9XHJcblxyXG4gIGxpZ2h0ZW5Db2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgcGVyY2VudDogbnVtYmVyID0gNzApOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnJztcclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuXHJcbiAgICBsZXQgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGxldCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgbGV0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XHJcblxyXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyICsgKDI1NSAtIHIpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgZyA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihnICsgKDI1NSAtIGcpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgYiA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihiICsgKDI1NSAtIGIpICogcGVyY2VudCAvIDEwMCkpO1xyXG5cclxuICAgIGNvbnN0IG5ld0hleCA9XHJcbiAgICAgICcjJyArXHJcbiAgICAgIFtyLCBnLCBiXVxyXG4gICAgICAgIC5tYXAoeCA9PiB4LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKVxyXG4gICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICByZXR1cm4gbmV3SGV4O1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVhZGFibGVUZXh0Q29sb3IoaGV4OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnYmxhY2snO1xyXG5cclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gMjMwID8gJ2JsYWNrJyA6IGAjJHtoZXh9YDtcclxuICB9XHJcblxyXG4gIGdldFN0YXR1c09wdGlvbih2YWx1ZTogc3RyaW5nKTogU3RhdHVzT3B0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1c01ldGFkYXRhPy5vcHRpb25zLmZpbmQobyA9PiBvLnRyYW5zbGF0ZWRMYWJlbCA9PT0gdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIHRoaXMuY2hlY2tJZkFkdmFuY2VkU2VhcmNoQ29tcG9uZW50RXhpc3RzKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNoZWNrSWZGb3JtTmFtZUV4aXN0cygpO1xyXG4gICAgdGhpcy5faW5pdFBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoKTtcclxuICAgIHRoaXMuX2luaXRSZWxvYWREYXRhU291cmNlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBhd2FpdCB0aGlzLl9pbml0aWFsTG9hZERhdGEoKTtcclxuICAgIFxyXG4gICAgbGV0IGxhbmd1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHJ0bE1vZGVLZXlzLnJ0bE1vZGVFbmFibGVkKTtcclxuICAgIFxyXG4gICAgaWYgKGxhbmd1ZSAmJiBKU09OLnBhcnNlKGxhbmd1ZSkpIHtcclxuICAgICAgdGhpcy5pc0FyID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYXhXaWR0aCA9IHRoaXMubWF4V2lkdGggKyAncmVtJztcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dDb25zdWx0QnV0dG9uPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzaG93VXBkYXRlQnV0dG9uPzogYm9vbGVhbjtcclxuICBzaG93QWR2YW5jZWRTZWFyY2hCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gIGNoZWNrSWZBZHZhbmNlZFNlYXJjaENvbXBvbmVudEV4aXN0cygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcblxyXG4gICAgICBuZXh0OiAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9ICEhZW50aXR5Py5hZHZhbmNlZFNlYXJjaENvbXBvbmVudDtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmRm9ybU5hbWVFeGlzdHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgICBpZiAodGhpcy5zaG93QWRkQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5zaG93VXBkYXRlQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoYXNGb3JtID0gISFlbnRpdHk/LmZvcm1OYW1lO1xyXG5cclxuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzaG93QWRkQnV0dG9uXCIsIHRoaXMuc2hvd0FkZEJ1dHRvbilcclxuXHJcbiAgICAgICAgICBpZiAoIWhhc0Zvcm0pIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93QWRkQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dDb25zdWx0QnV0dG9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dDb25zdWx0QnV0dG9uID0gdGhpcy5zaG93QWRkQnV0dG9uO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnNob3dVcGRhdGVCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSB0aGlzLnNob3dBZGRCdXR0b247XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93QWRkQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPT09IHVuZGVmaW5lZCkgdGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIG9wZW5BZHZhbmNlZFNlYXJjaENvbXBvbmVudCgpIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9ICEhZW50aXR5Py5hZHZhbmNlZFNlYXJjaENvbXBvbmVudDtcclxuICAgICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuYWR2YW5jZWRTZWFyY2hDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9mb3JtX25hbWVfbmZcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgIGlzQWR2YW5jZWRTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgICAgICAgc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlLFxyXG4gICAgICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5DT05TVUxULFxyXG4gICAgICAgICAgICAgIGN1c3RvbURhdGE6IGVudGl0eVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZSA9IHRoaXMuX3RzaU1vZGFsU2VydmljZT8ub3BlbihUeXBlUmVnaXN0cnlIZWxwZXIuZ2V0VHlwZShlbnRpdHkuYWR2YW5jZWRTZWFyY2hDb21wb25lbnQpLCBjb25mKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzZWxlY3RlZFBlcnNvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFBlcnNvbikge1xyXG4gICAgICAgICAgICAgIHRoaXMuYmluZCA9IHNlbGVjdGVkUGVyc29uO1xyXG4gICAgICAgICAgICAgIHRoaXMuYmluZENoYW5nZS5lbWl0KHRoaXMuYmluZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5TZWFyY2hEaWFsb2coKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7IGlzQWR2YW5jZWRTZWFyY2g6IHRydWUsIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSwgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsIGN1c3RvbURhdGE6IGVudGl0eSB9LFxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkubGlzdENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5saXN0Q29tcG9uZW50KSwgY29uZik7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzZWxlY3RlZFBlcnNvbjogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQZXJzb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzZWxlY3RlZFBlcnNvbjtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkRWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHsgbW9kZTogQ29tcG9uZW50X01vZGVzLkNSRUFURSwgY3VzdG9tRGF0YTogZW50aXR5IH0sXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5mb3JtTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5mb3JtTmFtZSksIGNvbmYpO1xyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgoc2F2ZWRFbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHNhdmVkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2F2ZWRFbGVtZW50ID09PSAnb2JqZWN0JyAmJiBzYXZlZEVsZW1lbnQgIT09IG51bGwgJiYgJ3VpZCcgaW4gc2F2ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzYXZlZEVsZW1lbnQ/LnVpZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZENoYW5nZS5lbWl0KHRoaXMuYmluZClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNhdmVkRWxlbWVudCA9PT0gJ3N0cmluZycgJiYgR3VpZC5pc1ZhbGlkKHNhdmVkRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZCA9IHNhdmVkRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZENoYW5nZS5lbWl0KHRoaXMuYmluZClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRGF0YXNvdXJjZUVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YUxvYWRlZCAmJiAoIXRoaXMuZGF0YXNvdXJjZSB8fCB0aGlzLmRhdGFzb3VyY2UubGVuZ3RoID09PSAwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNMb2FkRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gIHVwZGF0ZUVsZW1lbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuYmluZCkge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJBdWN1biDDqWzDqW1lbnQgc8OpbGVjdGlvbm7DqSBwb3VyIGxhIG1pc2Ugw6Agam91ci5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmZvcm1OYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5FRElULFxyXG4gICAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHksXHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmJpbmRcclxuICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZSA9IHRoaXMuX3RzaU1vZGFsU2VydmljZT8ub3BlbihUeXBlUmVnaXN0cnlIZWxwZXIuZ2V0VHlwZShlbnRpdHkuZm9ybU5hbWUpLCBjb25mKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgodXBkYXRlZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHVwZGF0ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEVsZW1lbnQgPT09ICdvYmplY3QnICYmIHVwZGF0ZWRFbGVtZW50ICE9PSBudWxsICYmICd1aWQnIGluIHVwZGF0ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQudWlkO1xyXG4gICAgICAgICAgICAgIHRoaXMuYmluZENoYW5nZS5lbWl0KHRoaXMuYmluZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVwZGF0ZWRFbGVtZW50ID09PSAnc3RyaW5nJyAmJiBHdWlkLmlzVmFsaWQodXBkYXRlZEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdWx0RWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5iaW5kKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcIkF1Y3VuIMOpbMOpbWVudCBzw6lsZWN0aW9ubsOpIHBvdXIgbGEgY29uc3VsdGF0aW9uLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuZm9ybU5hbWUpIHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsXHJcbiAgICAgICAgICAgIGN1c3RvbURhdGE6IGVudGl0eSxcclxuICAgICAgICAgICAgaWQ6IHRoaXMuYmluZFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oXHJcbiAgICAgICAgICBUeXBlUmVnaXN0cnlIZWxwZXIuZ2V0VHlwZShlbnRpdHkuZm9ybU5hbWUpLFxyXG4gICAgICAgICAgY29uZlxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKF8pID0+IHtcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgcsOpY3Vww6lyYXRpb24gZGVzIGluZm9zIGQnZW50aXTDqSA6XCIsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBldmVudHNcclxuICBiaW5kVmFsdWVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuYmluZCA9IGV2ZW50LnZhbHVlO1xyXG4gICAgaWYgKHRoaXMuYmluZCAhPT0gbnVsbCAmJiB0aGlzLmJpbmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuYmluZFxyXG4gICAgfVxyXG4gICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgIGlmICghdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQpIHtcclxuICAgICAgdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLl9oYW5kbGVTZWxlY3RlZEVsZW1lbnRzTGFiZWxDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaFZhbHVlQ2hhbmdlZChzZWFyY2hWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkICYmICF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuaXNGaWx0ZXJpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKHNlYXJjaFZhbHVlLmZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk9wZW4oKSB7XHJcbiAgICB0aGlzLmlzRmlsdGVyaW5nID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCB8fCB0eXBlb2YgdGhpcy5saXN0U291cmNlVXJsID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICB0aGlzLl9sb2FkRGF0YVNvdXJjZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTm9SZXN1bHRBZnRlckZpbHRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCAmJlxyXG4gICAgICB0aGlzLmRhdGFzb3VyY2UubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIHRoaXMuaXNGaWx0ZXJpbmcgJiZcclxuICAgICAgIXRoaXMuaGFzTG9hZEVycm9yXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25IaWRlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YUxvYWRlZCkge1xyXG4gICAgICB0aGlzLmJpbmQgPSB0aGlzLl9zZWxlY3RlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJTZWxlY3RlZFZhbHVlKCkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB1bmRlZmluZWRcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuICBwcml2YXRlIF9sb2FkRGF0YVNvdXJjZSgpIHtcclxuICAgIGlmICghdGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHtcclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZE5vdFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbG9hZFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2Uoa2V5d29yZDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5faW5pdExpc3REYXRhU291cmNlRW5kcG9pbnQoKTtcclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWREYXRhKHVybCwgdGhpcy5fZ2VuZXJhdGVIdHRwUGFyYW1zKGtleXdvcmQpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCkge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5faW5pdExpc3REYXRhU291cmNlRW5kcG9pbnQoKTtcclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWREYXRhKHVybCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWREYXRhKHVybDogc3RyaW5nLCBwYXJhbXM/OiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5tdWx0aXBsZSlcclxuICAgIHtcclxuICAgICAgdGhpcy5fZGF0YXNvdXJjZSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5oYXNMb2FkRXJyb3IgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLl9odHRwQ2xpZW50LmdldCh1cmwsIHBhcmFtcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMuX21hcEdvdHRlbkRhdGFTb3VyY2VUb0xvY2FsRGF0YXNvdXJjZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgZGF0YXNvdXJjZScsIGVycm9yKTtcclxuICAgICAgICB0aGlzLmhhc0xvYWRFcnJvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBcGlFcnJvcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFMb2FkZWQgJiYgdGhpcy5oYXNMb2FkRXJyb3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9lbnN1cmVTZWxlY3RlZE9wdGlvbkV4aXN0cygpIHtcclxuICAgIC8vIG5vIF9lbnN1cmVTZWxlY3RlZE9wdGlvbkV4aXN0cyBmb3IgbXVsdGktc2VsZWN0XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLmJpbmQgPT0gbnVsbCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuZGF0YXNvdXJjZS5zb21lKHggPT4geC5pZCA9PSB0aGlzLmJpbmQpO1xyXG5cclxuICAgIGlmIChleGlzdHMpIHJldHVybjtcclxuXHJcbiAgICBhd2FpdCB0aGlzLl9sb2FkQmluZEVsZW1lbnQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2xvYWRCaW5kRWxlbWVudCgpIHtcclxuICAgIC8vIG5vIF9sb2FkQmluZEVsZW1lbnQgZm9yIG11bHRpLXNlbGVjdFxyXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHJldHVybjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0VsZW1lbnRTb3VyY2VVcmxWYWxpZCgpIHx8ICF0aGlzLmJpbmQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGE6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHBDbGllbnQuZ2V0KHRoaXMuX2luaXRFbGVtZW50RW5kcG9pbnQoKSkpO1xyXG5cclxuICAgICAgaWYgKCFkYXRhKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBvcHRpb24gPSB7XHJcbiAgICAgICAgaWQ6IGRhdGFbdGhpcy5pZEZpZWxkXSxcclxuICAgICAgICBsYWJlbDogZGF0YVt0aGlzLmxhYmVsRmllbGRdXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZGF0YXNvdXJjZS5zb21lKHggPT4geC5pZCA9PT0gb3B0aW9uLmlkKSkge1xyXG4gICAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSBbLi4udGhpcy5kYXRhc291cmNlLCBvcHRpb25dO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IG9wdGlvbi5pZDtcclxuICAgICAgdGhpcy5iaW5kID0gb3B0aW9uLmlkO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZExhYmVsQ2hhbmdlLmVtaXQob3B0aW9uLmxhYmVsKTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZWxlY3RlZCBlbGVtZW50JywgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbXBhcmVGdW5jdGlvbigpOiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGEsIGIpID0+IHtcclxuICAgICAgaWYgKGEubGFiZWwgPiBiLmxhYmVsKSB7IHJldHVybiAxOyB9XHJcbiAgICAgIGlmIChhLmxhYmVsIDwgYi5sYWJlbCkgeyByZXR1cm4gLTE7IH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0xpc3RTb3VyY2VVcmxWYWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5saXN0U291cmNlVXJsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignbGlzdFNvdXJjZVVybCB1cmwgbm90IHByb3ZpZGVkJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0VsZW1lbnRTb3VyY2VVcmxWYWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50U291cmNlVXJsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignZWxlbWVudFNvdXJjZVVybCBub3QgZGVmaW5lZCcpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0UGFyYW1ldGVyc1dpdGhEZWZhdWx0cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlkRmllbGQgPT0gdW5kZWZpbmVkIHx8IHRoaXMuaWRGaWVsZCA9PT0gXCJcIikge1xyXG4gICAgICB0aGlzLmlkRmllbGQgPSBcImlkXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubGFiZWxGaWVsZCA9PSB1bmRlZmluZWQgfHwgdGhpcy5sYWJlbEZpZWxkID09PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMubGFiZWxGaWVsZCA9IFwibGliZWxsZVwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdEVsZW1lbnRFbmRwb2ludCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuYmluZCkge1xyXG4gICAgICByZXR1cm4gZW5jb2RlVVJJKGAke3RoaXMuZWxlbWVudFNvdXJjZVVybH0vJHt0aGlzLmJpbmR9YCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHRocm93IG5ldyBFcnJvcignbm8gYmluZCBpbnB1dCB3YXMgcHJvdmlkZWQsIGNhbm5vdCBjcmVhdGUgYmluZEVsZW1lbnRVcmwnKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdExpc3REYXRhU291cmNlRW5kcG9pbnQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubGlzdFNvdXJjZVVybCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0xpc3Qgc291cmNlIFVSTCBub3QgcHJvdmlkZWQnKTtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmxpc3RTb3VyY2VVcmwgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICByZXR1cm4gZW5jb2RlVVJJKGAke3RoaXMubGlzdFNvdXJjZVVybH1gKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGhpcy5saXN0U291cmNlVXJsID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBsZXQgdGVtcFVybCA9IHRoaXMubGlzdFNvdXJjZVVybCh0aGlzLmN1cnJlbnRSb3dJdGVtKVxyXG4gICAgICByZXR1cm4gZW5jb2RlVVJJKGAke3RlbXBVcmx9YClcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2luaXRpYWxMb2FkRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICB0aGlzLl9tYXBHb3R0ZW5EYXRhU291cmNlVG9Mb2NhbERhdGFzb3VyY2UoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fbG9hZEJpbmRFbGVtZW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZE5vdFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfb25CaW5kU2V0KCkge1xyXG5cclxuICAvKmlmICh0aGlzLmlzRmlsdGVyZWQgJiYgXHJcbiAgICAgICF0aGlzLl9iaW5kQ2hhbmdlRW1pdHRlZCAmJlxyXG4gICAgICAhdGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHtcclxuICAgICAgYWxlcnQoXCJfZGF0YXNvdXJjZS5sZW5ndGggPT09IDBcIik7XHJcbiAgICBhd2FpdCB0aGlzLl9sb2FkQmluZEVsZW1lbnQoKTtcclxuICB9Ki9cclxuXHJcbiAgaWYgKCF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9lbnN1cmVTZWxlY3RlZE9wdGlvbkV4aXN0cygpO1xyXG4gIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEFsbERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fbG9hZE5vdFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRSZWxvYWREYXRhU291cmNlU3Vic2NyaXB0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMucmVsb2FkRGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLnJlbG9hZERhdGFTb3VyY2Uuc3Vic2NyaWJlKFxyXG4gICAgICAgIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgKGRhdGEpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhICE9IHVuZGVmaW5lZCAmJiBkYXRhICE9IG51bGwgJiYgZGF0YSAhPSAnJykge1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdFNvdXJjZVVybCA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkQWxsRGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZSA9IGRhdGFcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlICBfbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk6IHZvaWQge1xyXG4gICAgXHJcbiAgICBsZXQgdGVtcEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9nb3R0ZW5EYXRhc291cmNlKSkge1xyXG5cclxuICAgICAgdGhpcy5fZ290dGVuRGF0YXNvdXJjZS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgaWQ6IGVsZW1lbnRbdGhpcy5pZEZpZWxkXSxcclxuICAgICAgICAgIGxhYmVsOiBlbGVtZW50W3RoaXMubGFiZWxGaWVsZF1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0ZW1wQXJyYXkucHVzaChvYmopO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlID0gdGVtcEFycmF5O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSB0aGlzLl9kaXN0aW5jdEJ5SWQoWy4uLnRoaXMuZGF0YXNvdXJjZSwgLi4udGVtcEFycmF5XSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydCkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlLnNvcnQodGhpcy5fY29tcGFyZUZ1bmN0aW9uKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2VMb2FkZWQuZW1pdCgpO1xyXG5cclxuICAgIGlmICghdGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHsgXHJcbiAgICAgIHRoaXMuX2Vuc3VyZVNlbGVjdGVkT3B0aW9uRXhpc3RzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVHcm91cHBlZERhdGFTb3VyY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dlbmVyYXRlSHR0cFBhcmFtcyhrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCd2YWx1ZScsIGtleXdvcmQgPz8gJycpO1xyXG5cclxuICAgIGlmKCF0aGlzLmxpc3RTb3VyY2VQYXJhbXMgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5saXN0U291cmNlUGFyYW1zKSB8fCB0aGlzLmxpc3RTb3VyY2VQYXJhbXMubGVuZ3RoIDwgMSlcclxuICAgIHtcclxuICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxpc3RTb3VyY2VQYXJhbXMuZmlsdGVyKChwOiBLZXlWYWx1ZTxzdHJpbmcsIGFueT4pID0+IHAudmFsdWUgIT0gbnVsbCAmJiBwLnZhbHVlICE9IHVuZGVmaW5lZClcclxuICAgIC5mb3JFYWNoKChwOiBLZXlWYWx1ZTxzdHJpbmcsIGFueT4pID0+IHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChwLmtleSwgcC52YWx1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBwYXJhbXM6IHBhcmFtcyB9O1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2hDb21ib0NsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMub25DbGljay5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBFdmVudCBoYW5kbGVyIGNhbGxlZCB3aGVuIHRoZSBNdWx0aVNlbGVjdCBtb2RlbCBjaGFuZ2VzLlxyXG4gKiBVcGRhdGVzIHRoZSBib3VuZCB2YWx1ZSBhbmQgcmVjYWxjdWxhdGVzIHRoZSBncm91cGVkIGRhdGFzb3VyY2UgZm9yIHByb3BlciByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBuZXdWYWx1ZSAtIFRoZSBuZXcgdmFsdWUgZW1pdHRlZCBieSB0aGUgTXVsdGlTZWxlY3QgY29tcG9uZW50LlxyXG4gKi9cclxuICBvbk11bHRpU2VsZWN0TW9kZWxDaGFuZ2UobmV3VmFsdWU6IG9iamVjdCk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbHVlRXZlbnQ6IGFueSA9IHtcclxuICAgICAgdmFsdWU6IG5ld1ZhbHVlXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5iaW5kVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlRXZlbnQpO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsYXRlR3JvdXBwZWREYXRhU291cmNlKCk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gKiBSZXR1cm5zIGEgZGlzdGluY3QgYXJyYXkgb2YgaXRlbXMgYmFzZWQgb24gdGhlaXIgYGlkYCBwcm9wZXJ0eS5cclxuICogVXNlZnVsIHRvIHJlbW92ZSBkdXBsaWNhdGVzIGZyb20gdGhlIGRhdGFzb3VyY2Ugb3Igc2VsZWN0ZWQgaXRlbXMgbGlzdC5cclxuICpcclxuICogQHBhcmFtIHthbnlbXX0gYXJyYXkgLSBBcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYW4gYGlkYCBwcm9wZXJ0eS5cclxuICogQHJldHVybnMge2FueVtdfSBBcnJheSBvZiB1bmlxdWUgaXRlbXMgYnkgYGlkYC5cclxuICovXHJcbiAgcHJpdmF0ZSBfZGlzdGluY3RCeUlkKGFycmF5OiBhbnlbXSk6IGFueVtdXHJcbiAge1xyXG4gICAgaWYgKCFhcnJheSkgcmV0dXJuIFtdO1xyXG5cclxuICAgIGNvbnN0IGRpc3RpbmN0ID0gQXJyYXkuZnJvbShcclxuICAgICAgbmV3IE1hcChhcnJheS5tYXAoaXRlbSA9PiBbaXRlbS5pZCwgaXRlbV0pKS52YWx1ZXMoKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gZGlzdGluY3Q7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBBbmd1bGFyIG5nRm9yIGxvb3BzLlxyXG4gKiBIZWxwcyBBbmd1bGFyIGVmZmljaWVudGx5IHRyYWNrIGxpc3QgaXRlbXMgYnkgYSB1bmlxdWUgaWRlbnRpZmllciwgYXZvaWRpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVyaW5nLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBJbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7YW55fSBpdGVtIC0gSXRlbSBvYmplY3QgY29udGFpbmluZyBhbiBgaWRgLlxyXG4gKiBAcmV0dXJucyB7YW55fSBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW0gKGl0ZW0uaWQpLlxyXG4gKi9cclxuICB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogYW55IHtcclxuICAgIHJldHVybiBpdGVtLmlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFJldHVybnMgdGhlIHRvcCBOIHNlbGVjdGVkIG9wdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgdG9vbHRpcC5cclxuICogTGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgc2hvd24gdG8gYHRvb2x0aXBNYXhEaXNwbGF5ZWRJdGVtc2AgZm9yIHJlYWRhYmlsaXR5LlxyXG4gKlxyXG4gKiBAcGFyYW0ge011bHRpU2VsZWN0fSBtdWx0aVNlbGVjdCAtIFJlZmVyZW5jZSB0byB0aGUgUHJpbWVORyBNdWx0aVNlbGVjdCBjb21wb25lbnQuXHJcbiAqIEByZXR1cm5zIHthbnlbXX0gQXJyYXkgb2Ygc2VsZWN0ZWQgaXRlbXMsIGxpbWl0ZWQgdG8gYHRvb2x0aXBNYXhEaXNwbGF5ZWRJdGVtc2AuXHJcbiAqL1xyXG4gIGdldFRvcFNlbGVjdGVkT3B0aW9ucyhtdWx0aVNlbGVjdDogTXVsdGlTZWxlY3QpOiBhbnlbXSB7XHJcbiAgICBpZighbXVsdGlTZWxlY3QgfHwgIUFycmF5LmlzQXJyYXkobXVsdGlTZWxlY3Quc2VsZWN0ZWRPcHRpb25zKSB8fCBtdWx0aVNlbGVjdC5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoIDwgMSkgcmV0dXJuIFtdO1xyXG4gIFxyXG4gICAgcmV0dXJuIG11bHRpU2VsZWN0LnNlbGVjdGVkT3B0aW9ucy5zbGljZSgwLCB0aGlzLnRvb2x0aXBNYXhEaXNwbGF5ZWRJdGVtcyk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBncm91cGVkIGRhdGFzb3VyY2UgZm9yIHRoZSBNdWx0aVNlbGVjdCBkcm9wZG93bi5cclxuICogQ3JlYXRlcyB0d28gZ3JvdXBzOlxyXG4gKiAxLiBcIlNlbGVjdGVkIGl0ZW1zXCIg4oCUIGl0ZW1zIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgdXNlci5cclxuICogMi4gXCJBdmFpbGFibGUgaXRlbXNcIiDigJQgaXRlbXMgbm90IHNlbGVjdGVkIHlldC5cclxuICpcclxuICogVGhlIGdyb3VwZWQgZGF0YXNvdXJjZSBhbGxvd3M6XHJcbiAqIC0gU2VsZWN0ZWQgaXRlbXMgdG8gYmUgcGlubmVkIG9uIHRvcCBmb3IgZWFzeSBtYW5hZ2VtZW50LlxyXG4gKiAtIEF2YWlsYWJsZSBpdGVtcyB0byByZW1haW4gaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuXHJcbiAqIC0gTXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCB1c2luZyB0aGUgYF9sb2NhbGl6ZWAgc2VydmljZS5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVXBkYXRlcyBgdGhpcy5ncm91cHBlZERhdGFTb3VyY2VgIHdpdGggdGhlIGxhdGVzdCBncm91cGVkIHN0cnVjdHVyZS5cclxuICovXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVHcm91cHBlZERhdGFTb3VyY2UoKTogdm9pZCB7XHJcbiAgICBsZXQgZ3JvdXBzIDogU2VsZWN0SXRlbUdyb3VwW10gPSBbXTtcclxuXHJcbiAgICBsZXQgaXNCaW5kVmFsaWRBcnJheSA6IGJvb2xlYW4gPSB0aGlzLmJpbmQgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmJpbmQpICYmIHRoaXMuYmluZC5sZW5ndGggPiAwO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0KGlzQmluZFZhbGlkQXJyYXkgPyB0aGlzLmJpbmQgOiBbXSk7XHJcblxyXG4gICAgLy8gU2VsZWN0ZWQgaXRlbXNcclxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLmRhdGFzb3VyY2UuZmlsdGVyKGl0ZW0gPT4gc2VsZWN0ZWRJZHMuaGFzKGl0ZW0uaWQpKTtcclxuICAgIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZ3JvdXBzLnB1c2goe1xyXG4gICAgICAgIGxhYmVsOiB0aGlzLl9sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF9jb21wb25lbnRfbXVsdGlzZWxlY3Rfc2VsZWN0ZWRfZ3JvdXAnKSxcclxuICAgICAgICB2YWx1ZTogJ3NlbGVjdGVkLWl0ZW1zJyxcclxuICAgICAgICBpdGVtczogc2VsZWN0ZWRJdGVtc1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBdmFpbGFibGUgKG5vdCBzZWxlY3RlZCkgaXRlbXNcclxuICAgIGNvbnN0IGF2YWlsYWJsZUl0ZW1zID0gdGhpcy5kYXRhc291cmNlLmZpbHRlcihpdGVtID0+ICFzZWxlY3RlZElkcy5oYXMoaXRlbS5pZCkpO1xyXG4gICAgaWYgKGF2YWlsYWJsZUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZ3JvdXBzLnB1c2goXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGFiZWw6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX2NvbXBvbmVudF9tdWx0aXNlbGVjdF9hdmFpbGFibGVfZ3JvdXAnKSxcclxuICAgICAgICAgIHZhbHVlOiAnYXZhaWxhYmxlLWl0ZW1zJyxcclxuICAgICAgICAgIGl0ZW1zOiBhdmFpbGFibGVJdGVtc1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ3JvdXBwZWREYXRhU291cmNlID0gZ3JvdXBzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgb3ZlcmZsb3dzIGl0cyB2aXNpYmxlIHdpZHRoLlxyXG4gKiBVc2VkIHRvIGNvbmRpdGlvbmFsbHkgZW5hYmxlIHRvb2x0aXAgb25seSB3aGVuIGVsbGlwc2lzIGlzIGFwcGxpZWQuXHJcbiAqL1xyXG4gIGlzVGV4dE92ZXJmbG93aW5nKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiBlbGVtZW50LnNjcm9sbFdpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aDtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAqIENvbXB1dGVzIGFuZCBlbWl0cyB0aGUgbGFiZWwgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQocykuXHJcbiAqXHJcbiAqIFRoaXMgbWV0aG9kIGluc3BlY3RzIHRoZSBjdXJyZW50IGBiaW5kYCB2YWx1ZSBhbmQgdGhlIGBkYXRhc291cmNlYCB0byBkZXRlcm1pbmVcclxuICogdGhlIGxhYmVsKHMpIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50KHMpLiBUaGUgYmVoYXZpb3IgZGlmZmVycyBkZXBlbmRpbmcgb24gd2hldGhlclxyXG4gKiB0aGUgY29tcG9uZW50IGlzIGluIHNpbmdsZSBvciBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZTpcclxuICpcclxuICogLSAqKk11bHRpcGxlIHNlbGVjdGlvbiAoYG11bHRpcGxlID0gdHJ1ZWApKipcclxuICogICAtIElmIGV4YWN0bHkgb25lIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIGl0cyBsYWJlbCBpcyBlbWl0dGVkLlxyXG4gKiAgIC0gSWYgbXVsdGlwbGUgZWxlbWVudHMgYXJlIHNlbGVjdGVkLCB0aGVpciBsYWJlbHMgYXJlIGZvcm1hdHRlZCBhcyBhIHN0cmluZ1xyXG4gKiAgICAgYXJyYXkgcmVwcmVzZW50YXRpb246IGBbXCJMYWJlbDFcIiwgXCJMYWJlbDJcIiwgLi4uXWAuXHJcbiAqXHJcbiAqIC0gKipTaW5nbGUgc2VsZWN0aW9uIChgbXVsdGlwbGUgPSBmYWxzZWApKipcclxuICogICAtIFRoZSBsYWJlbCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpcyBlbWl0dGVkIGlmIGl0IGV4aXN0cyBpbiB0aGUgZGF0YXNvdXJjZS5cclxuICpcclxuICogSWYgYSB2YWxpZCBsYWJlbCBpcyByZXNvbHZlZCwgdGhlIG1ldGhvZCBlbWl0cyB0aGUgcmVzdWx0IHRocm91Z2hcclxuICogdGhlIGBzZWxlY3RlZExhYmVsQ2hhbmdlYCBldmVudCBlbWl0dGVyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiAtIGBiaW5kYCByZXByZXNlbnRzIHRoZSBzZWxlY3RlZCBpZCAoc2luZ2xlIG1vZGUpIG9yIGFuIGFycmF5IG9mIGlkcyAobXVsdGlwbGUgbW9kZSkuXHJcbiAqIC0gYGRhdGFzb3VyY2VgIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gZWxlbWVudHMgd2l0aCBhdCBsZWFzdCBgaWRgIGFuZCBgbGFiZWxgIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZVNlbGVjdGVkRWxlbWVudHNMYWJlbENoYW5nZSgpOiB2b2lkIHtcclxuICAgIGxldCBzZWxlY3Rpb25MYWJlbDogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmJpbmQpKSB7XHJcbiAgICAgIGxldCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5kYXRhc291cmNlLmZpbHRlcihlID0+IHRoaXMuYmluZC5pbmNsdWRlcyhlLmlkKSk7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT0gMSlcclxuICAgICAge1xyXG4gICAgICAgIHNlbGVjdGlvbkxhYmVsID0gc2VsZWN0ZWRFbGVtZW50c1swXS5sYWJlbDtcclxuICAgICAgfSAgICAgIFxyXG4gICAgICBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpXHJcbiAgICAgIHtcclxuICAgICAgICBzZWxlY3Rpb25MYWJlbCA9IGBbJHtzZWxlY3RlZEVsZW1lbnRzLm1hcChlID0+IGBcIiR7ZS5sYWJlbH1cImApLmpvaW4oJywgJyl9XWA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgc2VsZWN0ZWRFbGVtZW50OiBhbnkgPSB0aGlzLmRhdGFzb3VyY2UuZmluZChlID0+IGUuaWQgPT0gdGhpcy5iaW5kKTtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQpIHtcclxuICAgICAgICBzZWxlY3Rpb25MYWJlbCA9IHNlbGVjdGVkRWxlbWVudC5sYWJlbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3Rpb25MYWJlbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWxDaGFuZ2UuZW1pdChzZWxlY3Rpb25MYWJlbCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59IiwiPGRpdiAqbmdJZj1cIiFtdWx0aXBsZTsgZWxzZSBtdWx0aVNlbGVjdFwiIGNsYXNzPVwiZmxleFwiPlxyXG4gIDxwLWRyb3Bkb3duIFxyXG4gICAgW29wdGlvbnNdPVwiZGF0YXNvdXJjZVwiXHJcbiAgICBbKG5nTW9kZWwpXT1cImJpbmRcIlxyXG4gICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICBvcHRpb25WYWx1ZT1cImlkXCJcclxuICAgIFtsYXp5XT1cIiFkYXRhTG9hZGVkXCJcclxuICAgIFtsb2FkaW5nXT1cIiFkYXRhTG9hZGVkXCJcclxuICAgIGZpbHRlckJ5PVwibGFiZWxcIiBcclxuICAgIFtmaWx0ZXJdPVwidHJ1ZVwiIFxyXG4gICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIlxyXG4gICAgW3Nob3dDbGVhcl09XCJzaG93Q2xlYXJcIiBcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFxyXG4gICAgKG9uQ2hhbmdlKT1cImJpbmRWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIFxyXG4gICAgKG9uSGlkZSk9XCJvbkhpZGUoKVwiIChvblNob3cpPVwib25PcGVuKClcIiAob25GaWx0ZXIpPVwic2VhcmNoVmFsdWVDaGFuZ2VkKCRldmVudClcIiAob25DbGVhcik9XCJjbGVhclNlbGVjdGVkVmFsdWUoKVwiIChvbkNsaWNrKT1cIm9uU2VhcmNoQ29tYm9DbGljaygkZXZlbnQpXCJcclxuICAgIFtzdHlsZV09XCJ7J21heC13aWR0aCc6IG1heFdpZHRoLCAnd2lkdGgnOicxMDAlJywgJ2hlaWdodCc6ICcxLjdyZW0nfVwiXHJcbiAgICBbbmdDbGFzc109XCJpc0FyID8gJ3AtZHJvcGRvd24tY2xlYXItaWNvbkFSJzogJ3AtZHJvcGRvd24tY2xlYXItaWNvbkZSJ1wiXHJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXJcIiBcclxuICAgIGNsYXNzPVwie3tteVN0eWxlQ2xhc3N9fVwiIFxyXG4gICAgc3R5bGVDbGFzcz1cInt7bXlTdHlsZUNsYXNzfX0gYm9yZGVyLXJhZGl1cy03IHt7dmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzfX1cIiBcclxuICAgIGFwcGVuZFRvPVwiYm9keVwiPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBmbGV4IGdhcC0xIHB0LTIgcHgtMlwiPlxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd1NlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCIgdGl0bGU9XCJ0aXRsZS1zZWFyY2gtY29tYm8tT3V2cmlyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwib3BlblNlYXJjaERpYWxvZygpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBsdXNcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Bam91dGVyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwiYWRkRWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc29ydC1hbW91bnQtZG93blwiXHJcbiAgICAgICAgICB0aXRsZT1cIkxpc3RlciBsZXMgYXJ0aWNsZXMgcGl2b3TDqXNcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZHZhbmNlZFNlYXJjaENvbXBvbmVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1leWVcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Db25zdWx0ZXJcIlxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXByaW1hcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiIChjbGljayk9XCJjb25zdWx0RWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dVcGRhdGVCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBlbmNpbFwiIHRpdGxlPVwidGl0bGUtc2VhcmNoLWNvbWJvLXVwZGF0ZVwiXHJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24taWNvbi1vbmx5XCIgKGNsaWNrKT1cInVwZGF0ZUVsZW1lbnQoKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIFxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eVwiPlxyXG4gICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcHktMyBnYXAtMlwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0FwaUVycm9yOyBlbHNlIGFwaUVycm9yXCI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0RhdGFzb3VyY2VFbXB0eSAmJiAhaXNGaWx0ZXJpbmdcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1ncmF5LTUwMFwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgJ3NlYXJjaF9jb21ib19ub19lbGVtZW50JyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzTm9SZXN1bHRBZnRlckZpbHRlclwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LWdyYXktNTAwXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyAnc2VhcmNoX2NvbWJvX25vX3Jlc3VsdCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhcGlFcnJvcj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZSB0ZXh0LW9yYW5nZS01MDBcIj48L2k+XHJcbiAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgIHt7ICdzZWFyY2hfY29tYm9fbG9hZF9lcnJvcicgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbVwiIGxldC1zZWxlY3RlZE9wdGlvbj5cclxuICAgICAgPGRpdiBwVG9vbHRpcD1cInt7c2VsZWN0ZWRPcHRpb24ubGFiZWx9fVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHRvb2x0aXBTdHlsZUNsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdGF0dXNDb21ibyAmJiBzdGF0dXNNZXRhZGF0YTsgZWxzZSBub3JtYWxTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkT3B0aW9uICYmIGdldFN0YXR1c09wdGlvbihzZWxlY3RlZE9wdGlvbi5sYWJlbCkgYXMgb3B0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJsaWdodGVuQ29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFJlYWRhYmxlVGV4dENvbG9yKG9wdC5jb2xvckhleClcIj5cclxuICAgICAgICAgICAgICB7eyBzZWxlY3RlZE9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxTZWxlY3RlZD5cclxuICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkT3B0aW9uLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbGV0LXRhcmdldCBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgIDxkaXYgcFRvb2x0aXA9XCJ7e3RhcmdldC5sYWJlbH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgdG9vbHRpcFN0eWxlQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdGF0dXNDb21ibyAmJiBzdGF0dXNNZXRhZGF0YTsgZWxzZSBub3JtYWxPcHRpb25cIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRTdGF0dXNPcHRpb24odGFyZ2V0LmxhYmVsKSBhcyBvcHRcIj5cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJsaWdodGVuQ29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0UmVhZGFibGVUZXh0Q29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy10b3BdPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctYm90dG9tXT1cIicwLjFyZW0nXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7dGFyZ2V0LmxhYmVsfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsT3B0aW9uPlxyXG4gICAgICAgICAgPHNwYW4+e3t0YXJnZXQubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDwvcC1kcm9wZG93bj5cclxuXHJcbiAgPCEtLSBCdWJibGUgSW5mbyAtLT5cclxuICA8VHNpLUJ1YmJsZS1JbmZvIFtpbmZvVGV4dF09XCJpbmZvVGV4dFwiPjwvVHNpLUJ1YmJsZS1JbmZvPlxyXG5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI211bHRpU2VsZWN0PlxyXG4gIDxwLW11bHRpU2VsZWN0XHJcbiAgICAjbXVsdGlTZWxlY3RFbGVtZW50XHJcbiAgICBbb3B0aW9uc109XCJncm91cHBlZERhdGFTb3VyY2VcIlxyXG4gICAgW2dyb3VwXT1cInRydWVcIiBcclxuICAgIFtuZ01vZGVsXT1cImJpbmRcIlxyXG4gICAgW29wdGlvbkxhYmVsXT1cIidsYWJlbCdcIlxyXG4gICAgW29wdGlvblZhbHVlXT1cIidpZCdcIlxyXG4gICAgW2xvYWRpbmddPVwiIWRhdGFMb2FkZWRcIlxyXG4gICAgW2ZpbHRlckJ5XT1cIidsYWJlbCdcIlxyXG4gICAgW2ZpbHRlcl09XCJ0cnVlXCJcclxuICAgIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICBbc2VsZWN0ZWRJdGVtc0xhYmVsXT1cIidzaGFyZWRfY29tcG9uZW50X211bHRpc2VsZWN0X3NlbGVjdGVkX2l0ZW1zX2NvdW50JyB8IGxvY2FsaXplXCJcclxuICAgIFttYXhTZWxlY3RlZExhYmVsc109XCJtYXhTZWxlY3RlZExhYmVsc1wiXHJcbiAgICBbc3R5bGVdPVwieydtYXgtd2lkdGgnOiBtYXhXaWR0aCwgJ3dpZHRoJzonMTAwJScsICdoZWlnaHQnOiAnMS43cmVtJ31cIlxyXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyXCJcclxuICAgIFtuZ0NsYXNzXT1cImlzQXIgPyAncC1kcm9wZG93bi1jbGVhci1pY29uQVInOiAncC1kcm9wZG93bi1jbGVhci1pY29uRlInXCJcclxuICAgIGNsYXNzPVwie3tteVN0eWxlQ2xhc3N9fVwiIFxyXG4gICAgc3R5bGVDbGFzcz1cInt7bXlTdHlsZUNsYXNzfX0gYm9yZGVyLXJhZGl1cy03IHt7dmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzfX1cIlxyXG4gICAgcGFuZWxTdHlsZUNsYXNzPVwidHNpLW11bHRpc2VsZWN0LXBhbmVsXCJcclxuICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvbk11bHRpU2VsZWN0TW9kZWxDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAob25QYW5lbFNob3cpPVwib25PcGVuKClcIlxyXG4gICAgKG9uRmlsdGVyKT1cInNlYXJjaFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgIChvbkNsaWNrKT1cIm9uU2VhcmNoQ29tYm9DbGljaygkZXZlbnQpXCJcclxuICAgIFtwVG9vbHRpcF09XCJtdWx0aVNlbGVjdEVsZW1lbnQ/LnNlbGVjdGVkT3B0aW9ucz8ubGVuZ3RoID8gbXVsdGlTZWxlY3RUb29sdGlwQ29udGVudCA6IHVuZGVmaW5lZFwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW9wdGlvbj5cclxuICAgICAgPGRpdiAjbGFiZWxSZWYgY2xhc3M9XCJ0c2ktbXVsdGlzZWxlY3Qtb3B0aW9uLWxhYmVsXCIgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCIgdG9vbHRpcEFwcGVuZFRvPVwiYm9keVwiIFtwVG9vbHRpcF09XCJpc1RleHRPdmVyZmxvd2luZyhsYWJlbFJlZikgPyBvcHRpb24ubGFiZWwgOiBudWxsXCI+XHJcbiAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT4gIFxyXG4gIDwvcC1tdWx0aVNlbGVjdD5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNtdWx0aVNlbGVjdFRvb2x0aXBDb250ZW50PlxyXG4gICAgPGRpdiBjbGFzcz1cInAtMlwiPlxyXG4gICAgICA8IS0tIElmIHRoZXJlIGFyZSBzZWxlY3RlZCBpdGVtcyAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm11bHRpU2VsZWN0RWxlbWVudD8uc2VsZWN0ZWRPcHRpb25zPy5sZW5ndGg7IGVsc2Ugbm9JdGVtc1wiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtYi0xXCI+XHJcbiAgICAgICAgICB7eyAnc2hhcmVkX2NvbXBvbmVudF9tdWx0aXNlbGVjdF9zZWxlY3RlZF9pdGVtc190aXRsZScgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgKHt7IG11bHRpU2VsZWN0RWxlbWVudC5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoIH19KVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8dWwgY2xhc3M9XCJtLTAgcGwtM1wiPlxyXG4gICAgICAgICAgPCEtLSBTaG93IG9ubHkgZmlyc3QgMTAgaXRlbXMgLS0+XHJcbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBnZXRUb3BTZWxlY3RlZE9wdGlvbnMobXVsdGlTZWxlY3RFbGVtZW50KVwiPlxyXG4gICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgPCEtLSBTaG93IG1lc3NhZ2UgaWYgbW9yZSB0aGFuIDEwIC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJtdWx0aVNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA+IDEwXCIgY2xhc3M9XCJ0ZXh0LXNtIG10LTEgdGV4dC1ncmF5LTUwMFwiPlxyXG4gICAgICAgICAge3sgbXVsdGlTZWxlY3RFbGVtZW50LnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggLSAxMCB9fVxyXG4gICAgICAgICAge3sgJ3NoYXJlZF9jb21wb25lbnRfbXVsdGlzZWxlY3Rfc2VsZWN0ZWRfaXRlbXNfbW9yZV9tZXNzYWdlJyB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwhLS0gSWYgbm8gaXRlbXMgc2VsZWN0ZWQgLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JdGVtcz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gdGV4dC01MDBcIj5cclxuICAgICAgICAgIHt7ICdzaGFyZWRfY29tcG9uZW50X211bHRpc2VsZWN0X3NlbGVjdGVkX2l0ZW1zX2VtcHR5JyB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
|
961
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktc2VhcmNoLWNvbWJvL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLXNlYXJjaC1jb21iby90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNILE9BQU8sRUFBRSxjQUFjLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU1wRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDekYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBWS9FLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxZQUFpQjtJQThCNUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsa0NBQWtDO1FBQ2xDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FB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RTVCLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTdELE1BQU0sTUFBTSxHQUNWLEdBQUc7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDekMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWQsT0FBTyxNQUFNLENB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QUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBU08sVUFBVTtzQkFBdEIsS0FBSztnQkFhYSxJQUFJO3NCQUF0QixLQUFLO3VCQUFDLE1BQU07Z0JBMEJKLGlCQUFpQjtzQkFBekIsS0FBSztnQkFRRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBSUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDc0IsZ0JBQWdCO3NCQUE1QyxNQUFNO3VCQUFDLG1CQUFtQjtnQkFDakIsSUFBSTtzQkFBYixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQXVGRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHJ0bE1vZGVLZXlzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RzL2xvY2Fscy5jb25zdCc7XHJcbmltcG9ydCB7IENvbXBvbmVudF9Nb2RlcywgR3JpZFNlbGVjdGlvbk1vZGUsIE1vZGFsU2l6ZUVudW0sIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgQ29tYm9TdGF0dXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlLCBTdGF0dXNPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcbmltcG9ydCB7IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlndXJhdGlvbi9lbnRpdHktY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kYWwvdHNpLW1vZGFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaUlucHV0QmFzZSB9IGZyb20gJy4uLy4uLy4uL3RzaS1iYXNlL3RzaS1pbnB1dC1iYXNlL3RzaS1pbnB1dC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEd1aWQgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy9ndWlkLmhlbHBlcic7XHJcbmltcG9ydCB7IFR5cGVSZWdpc3RyeUhlbHBlciB9IGZyb20gJy4uLy4uLy4uL3RzaS1oZWxwZXJzL3R5cGUtcmVnaXN0cnkuaGVscGVyJztcclxuaW1wb3J0IHsgTXVsdGlTZWxlY3QgfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcclxuaW1wb3J0IHsgU2VsZWN0SXRlbUdyb3VwIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcyc7XHJcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kcm9wZG93bi9kcm9wZG93bi1leHRlcm5hbC1zZWxlY3Rpb24tb3V0cHV0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnVHNpLVNlYXJjaC1Db21ibycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRzaVNlYXJjaENvbWJvQ29tcG9uZW50IGV4dGVuZHMgVHNpSW5wdXRCYXNlPGFueT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgcHJpdmF0ZSBfZGF0YXNvdXJjZTogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9pc0lucHV0RGF0YXNvdXJjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3JlbG9hZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2dvdHRlbkRhdGFzb3VyY2U6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYmluZD86IGFueTtcclxuICBwcml2YXRlIF9jdXJyZW50Um93SXRlbT86IGFueTtcclxuICBwdWJsaWMgZGF0YUxvYWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfZGlhbG9nUmVmZXJlbmNlPzogRHluYW1pY0RpYWxvZ1JlZiB8IHVuZGVmaW5lZDtcclxuICBpc0FyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGlzRmlsdGVyaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gKiBHcm91cGVkIGRhdGFzb3VyY2UgZm9yIHRoZSBNdWx0aVNlbGVjdCBjb21wb25lbnQuXHJcbiAqIFR3byBncm91cHMsIHdoZXJlIGVhY2ggZ3JvdXAgY29udGFpbnMgYSBsYWJlbCwgYSB2YWx1ZSwgYW5kIGFuIGFycmF5IG9mIGl0ZW1zLlxyXG4gKiBcclxuICogU3RydWN0dXJlOlxyXG4gKiBbXHJcbiAqICAgeyBsYWJlbDogJ1NlbGVjdGVkIGl0ZW1zJywgdmFsdWU6ICdzZWxlY3RlZC1pdGVtcycsIGl0ZW1zOiBbLi4uXSB9LFxyXG4gKiAgIHsgbGFiZWw6ICdBdmFpbGFibGUgaXRlbXMnLCB2YWx1ZTogJ2F2YWlsYWJsZS1pdGVtcycsIGl0ZW1zOiBbLi4uXSB9XHJcbiAqIF1cclxuICovXHJcbiAgcHJvdGVjdGVkIGdyb3VwcGVkRGF0YVNvdXJjZTogU2VsZWN0SXRlbUdyb3VwW10gPSBbXTtcclxuICB0b29sdGlwUG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb247XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsYWJlbE9mRWxlbWVudE5vdEZvdW5kVGV4dEtleTogc3RyaW5nID0gJ3NoYXJlZFVpLWxhYmVsT2ZFbGVtZW50Tm90Rm91bmQnO1xyXG4gIHByaXZhdGUgbGFiZWxPZkVsZW1lbnROb3RGb3VuZFRleHQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcclxuICBvbkVudGVyS2V5KGV2ZW50OiBhbnkpIHtcclxuICAgIC8vIEhhbmRsZSB0aGUgZW50ZXIga2V5IGV2ZW50IGhlcmVcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbnB1dHNcclxuICBASW5wdXQoKSBlbGVtZW50U291cmNlVXJsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGxpc3RTb3VyY2VVcmw/OiBzdHJpbmcgfCAoKGl0ZW06IGFueSkgPT4gc3RyaW5nKTtcclxuICBASW5wdXQoKSBsaXN0U291cmNlUGFyYW1zOiBLZXlWYWx1ZTxzdHJpbmcsIGFueT5bXSA9IFtdO1xyXG4gIEBJbnB1dChcImlkLWZpZWxkXCIpIGlkRmllbGQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KFwibGFiZWwtZmllbGRcIikgbGFiZWxGaWVsZDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NsZWFyOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSByZWxvYWREYXRhU291cmNlOiBPYnNlcnZhYmxlPGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgaXNGaWx0ZXJlZD86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZWxlY3RlZExhYmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG1heFdpZHRoOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBidXNpbmVzc0NsYXNzOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQElucHV0KCkgY29tYm9UeXBlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHN0YXR1c01ldGFkYXRhPzogU3RhdHVzTWV0YWRhdGFSZXNwb25zZTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgY3VycmVudFJvd0l0ZW0oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93SXRlbTtcclxuICB9XHJcblxyXG4gIHNldCBjdXJyZW50Um93SXRlbSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9jdXJyZW50Um93SXRlbSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZ2V0IGRhdGFzb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YXNvdXJjZTtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhc291cmNlKGRhdGFzb3VyY2U6IGFueVtdKSB7XHJcbiAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YXNvdXJjZTtcclxuXHJcbiAgICBpZiAodGhpcy5fZ290dGVuRGF0YXNvdXJjZSkge1xyXG4gICAgICB0aGlzLl9tYXBHb3R0ZW5EYXRhU291cmNlVG9Mb2NhbERhdGFzb3VyY2UoKVxyXG4gICAgICB0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoXCJiaW5kXCIpIGdldCBiaW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JpbmQ7XHJcbiAgfVxyXG5cclxuICBzZXQgYmluZCh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fYmluZCA9PT0gdmFsdWUgfHwgIXRoaXMuX2JpbmQgJiYgIXZhbHVlKSByZXR1cm47XHJcblxyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICB0aGlzLl9iaW5kID0gbnVsbDtcclxuICAgICAgdGhpcy5pbnB1dEZpZWxkID0gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9iaW5kID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWVsZCA9IHZhbHVlO1xyXG4gICAgICB0aGlzLl9vbkJpbmRTZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICogTWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbSBsYWJlbHMgdG8gZGlzcGxheSBkaXJlY3RseSBpbiB0aGUgTXVsdGlTZWxlY3QgaW5wdXQgZmllbGQuXHJcbiAqIElmIHRoZSB1c2VyIHNlbGVjdHMgbW9yZSB0aGFuIHRoaXMgbnVtYmVyLCB0aGUgY29tcG9uZW50IGNhbiBzaG93IGEgXCIrTlwiIG1lc3NhZ2UgaW5zdGVhZC5cclxuICogQHR5cGUge251bWJlcn1cclxuICogQGRlZmF1bHQgMVxyXG4gKi9cclxuICBASW5wdXQoKSBtYXhTZWxlY3RlZExhYmVsczogbnVtYmVyID0gMTtcclxuICBcclxuICAvKipcclxuICogTWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMgdG8gZGlzcGxheSBpbnNpZGUgdGhlIHRvb2x0aXAuXHJcbiAqIElmIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMgZXhjZWVkcyB0aGlzIGxpbWl0LCB0aGUgdG9vbHRpcCBjYW4gZGlzcGxheSBhIFwiK04gbW9yZVwiIG1lc3NhZ2UuXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBkZWZhdWx0IDEwXHJcbiAqL1xyXG4gIEBJbnB1dCgpIHRvb2x0aXBNYXhEaXNwbGF5ZWRJdGVtczogbnVtYmVyID0gMTA7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIGJpbmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dChcImRhdGFzb3VyY2UtbG9hZGVkXCIpIGRhdGFTb3VyY2VMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvU3RhdHVzTW9kZWw+KCk7XHJcbiAgQE91dHB1dCgpIGlzTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib1N0YXR1c01vZGVsPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZExhYmVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uU2VhcmNoQnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBjdG9yXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2U6IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdHNpTW9kYWxTZXJ2aWNlOiBUc2lNb2RhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIF9sb2NhbGl6ZTogTG9jYWxpemVQaXBlLFxyXG4gICAgcHJvdGVjdGVkIF9jZFJlZj86IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkge1xyXG4gICAgc3VwZXIoX2NkUmVmKTtcclxuICAgIHRoaXMubGFiZWxPZkVsZW1lbnROb3RGb3VuZFRleHQgPSB0aGlzLl9sb2NhbGl6ZS50cmFuc2Zvcm0odGhpcy5sYWJlbE9mRWxlbWVudE5vdEZvdW5kVGV4dEtleSkgPz8gJ1VOS05PV04gISc7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gaGFuZGxlIGxpZmVjeWNsZSBob29rc1xyXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIHRoaXMuX3JlbG9hZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1N0YXR1c0NvbWJvKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tYm9UeXBlID09PSAnc3RhdHVzJztcclxuICB9XHJcblxyXG4gIGxpZ2h0ZW5Db2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgcGVyY2VudDogbnVtYmVyID0gNzApOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnJztcclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuXHJcbiAgICBsZXQgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGxldCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgbGV0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XHJcblxyXG4gICAgciA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyICsgKDI1NSAtIHIpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgZyA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihnICsgKDI1NSAtIGcpICogcGVyY2VudCAvIDEwMCkpO1xyXG4gICAgYiA9IE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihiICsgKDI1NSAtIGIpICogcGVyY2VudCAvIDEwMCkpO1xyXG5cclxuICAgIGNvbnN0IG5ld0hleCA9XHJcbiAgICAgICcjJyArXHJcbiAgICAgIFtyLCBnLCBiXVxyXG4gICAgICAgIC5tYXAoeCA9PiB4LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKVxyXG4gICAgICAgIC5qb2luKCcnKTtcclxuXHJcbiAgICByZXR1cm4gbmV3SGV4O1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVhZGFibGVUZXh0Q29sb3IoaGV4OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFoZXgpIHJldHVybiAnYmxhY2snO1xyXG5cclxuICAgIGhleCA9IGhleC5yZXBsYWNlKC9eIy8sICcnKTtcclxuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG5cclxuICAgIHJldHVybiBicmlnaHRuZXNzID4gMjMwID8gJ2JsYWNrJyA6IGAjJHtoZXh9YDtcclxuICB9XHJcblxyXG4gIGdldFN0YXR1c09wdGlvbih2YWx1ZTogc3RyaW5nKTogU3RhdHVzT3B0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1c01ldGFkYXRhPy5vcHRpb25zLmZpbmQobyA9PiBvLnRyYW5zbGF0ZWRMYWJlbCA9PT0gdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIHRoaXMuY2hlY2tJZkFkdmFuY2VkU2VhcmNoQ29tcG9uZW50RXhpc3RzKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNoZWNrSWZGb3JtTmFtZUV4aXN0cygpO1xyXG4gICAgdGhpcy5faW5pdFBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoKTtcclxuICAgIHRoaXMuX2luaXRSZWxvYWREYXRhU291cmNlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBhd2FpdCB0aGlzLl9pbml0aWFsTG9hZERhdGEoKTtcclxuICAgIFxyXG4gICAgbGV0IGxhbmd1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHJ0bE1vZGVLZXlzLnJ0bE1vZGVFbmFibGVkKTtcclxuICAgIFxyXG4gICAgaWYgKGxhbmd1ZSAmJiBKU09OLnBhcnNlKGxhbmd1ZSkpIHtcclxuICAgICAgdGhpcy5pc0FyID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tYXhXaWR0aCA9IHRoaXMubWF4V2lkdGggKyAncmVtJztcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dDb25zdWx0QnV0dG9uPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzaG93VXBkYXRlQnV0dG9uPzogYm9vbGVhbjtcclxuICBzaG93QWR2YW5jZWRTZWFyY2hCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gIGNoZWNrSWZBZHZhbmNlZFNlYXJjaENvbXBvbmVudEV4aXN0cygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcblxyXG4gICAgICBuZXh0OiAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9ICEhZW50aXR5Py5hZHZhbmNlZFNlYXJjaENvbXBvbmVudDtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmRm9ybU5hbWVFeGlzdHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgICBpZiAodGhpcy5zaG93QWRkQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5zaG93VXBkYXRlQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoYXNGb3JtID0gISFlbnRpdHk/LmZvcm1OYW1lO1xyXG5cclxuICAgICAgICAgIGlmICghaGFzRm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zaG93VXBkYXRlQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSB0aGlzLnNob3dBZGRCdXR0b247XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IHRoaXMuc2hvd0FkZEJ1dHRvbjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnNob3dBZGRCdXR0b24gPT09IHVuZGVmaW5lZCkgdGhpcy5zaG93QWRkQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dDb25zdWx0QnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93VXBkYXRlQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb3BlbkFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9uYW1lRW50aXR5XCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gISFlbnRpdHk/LmFkdmFuY2VkU2VhcmNoQ29tcG9uZW50O1xyXG4gICAgICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5hZHZhbmNlZFNlYXJjaENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgaXNBZHZhbmNlZFNlYXJjaDogdHJ1ZSxcclxuICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlOiB0aGlzLm11bHRpcGxlID8gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUgOiBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUsXHJcbiAgICAgICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsXHJcbiAgICAgICAgICAgICAgY3VzdG9tRGF0YTogZW50aXR5LFxyXG4gICAgICAgICAgICAgIHNlbGVjdEtleU9ubHk6IHRoaXMubXVsdGlwbGUgPyBmYWxzZSA6IHRydWUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5hZHZhbmNlZFNlYXJjaENvbXBvbmVudCksIGNvbmYpO1xyXG5cclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKHNlbGVjdGlvbjogYW55KSA9PiB0aGlzLmhhbmRsZUV4dGVybmFsU2VsZWN0aW9uKHNlbGVjdGlvbikpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5TZWFyY2hEaWFsb2coKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgaXNBZHZhbmNlZFNlYXJjaDogdHJ1ZSxcclxuICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlOiB0aGlzLm11bHRpcGxlID8gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUgOiBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUsXHJcbiAgICAgICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsXHJcbiAgICAgICAgICAgICAgY3VzdG9tRGF0YTogZW50aXR5LFxyXG4gICAgICAgICAgICAgIHNlbGVjdEtleU9ubHk6IHRoaXMubXVsdGlwbGUgPyBmYWxzZSA6IHRydWUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5saXN0Q29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5Lmxpc3RDb21wb25lbnQpLCBjb25mKTtcclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKHNlbGVjdGlvbjogYW55KSA9PiB0aGlzLmhhbmRsZUV4dGVybmFsU2VsZWN0aW9uKHNlbGVjdGlvbikpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkRWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHsgbW9kZTogQ29tcG9uZW50X01vZGVzLkNSRUFURSwgY3VzdG9tRGF0YTogZW50aXR5IH0sXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5mb3JtTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5mb3JtTmFtZSksIGNvbmYpO1xyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgoc2F2ZWRFbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHNhdmVkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2F2ZWRFbGVtZW50ID09PSAnb2JqZWN0JyAmJiBzYXZlZEVsZW1lbnQgIT09IG51bGwgJiYgJ3VpZCcgaW4gc2F2ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRWYWx1ZUNoYW5nZWQoc2F2ZWRFbGVtZW50Py51aWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2F2ZWRFbGVtZW50ID09PSAnc3RyaW5nJyAmJiBHdWlkLmlzVmFsaWQoc2F2ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVmFsdWVDaGFuZ2VkKHNhdmVkRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc0RhdGFzb3VyY2VFbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFMb2FkZWQgJiYgKCF0aGlzLmRhdGFzb3VyY2UgfHwgdGhpcy5kYXRhc291cmNlLmxlbmd0aCA9PT0gMCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFzTG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICB1cGRhdGVFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9uYW1lRW50aXR5XCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmJpbmQpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwiQXVjdW4gw6lsw6ltZW50IHPDqWxlY3Rpb25uw6kgcG91ciBsYSBtaXNlIMOgIGpvdXIuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5mb3JtTmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9mb3JtX25hbWVfbmZcIik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuRURJVCxcclxuICAgICAgICAgICAgY3VzdG9tRGF0YTogZW50aXR5LFxyXG4gICAgICAgICAgICBpZDogdGhpcy5iaW5kXHJcbiAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSwgY29uZik7XHJcblxyXG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKHVwZGF0ZWRFbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICh1cGRhdGVkRWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRFbGVtZW50ID09PSAnb2JqZWN0JyAmJiB1cGRhdGVkRWxlbWVudCAhPT0gbnVsbCAmJiAndWlkJyBpbiB1cGRhdGVkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVmFsdWVDaGFuZ2VkKHVwZGF0ZWRFbGVtZW50Py51aWQpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB1cGRhdGVkRWxlbWVudCA9PT0gJ3N0cmluZycgJiYgR3VpZC5pc1ZhbGlkKHVwZGF0ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVmFsdWVDaGFuZ2VkKHVwZGF0ZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdWx0RWxlbWVudCgpIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5iaW5kKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcIkF1Y3VuIMOpbMOpbWVudCBzw6lsZWN0aW9ubsOpIHBvdXIgbGEgY29uc3VsdGF0aW9uLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuZm9ybU5hbWUpIHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsXHJcbiAgICAgICAgICAgIGN1c3RvbURhdGE6IGVudGl0eSxcclxuICAgICAgICAgICAgaWQ6IHRoaXMuYmluZFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oXHJcbiAgICAgICAgICBUeXBlUmVnaXN0cnlIZWxwZXIuZ2V0VHlwZShlbnRpdHkuZm9ybU5hbWUpLFxyXG4gICAgICAgICAgY29uZlxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKF8pID0+IHtcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIGxvcnMgZGUgbGEgcsOpY3Vww6lyYXRpb24gZGVzIGluZm9zIGQnZW50aXTDqSA6XCIsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBldmVudHNcclxuICBiaW5kVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuYmluZCA9IG5ld1ZhbHVlOyAgICBcclxuICAgIHRoaXMuX2hhbmRsZVNlbGVjdGVkRWxlbWVudHNMYWJlbENoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoVmFsdWVDaGFuZ2VkKHNlYXJjaFZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgJiYgIXRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgICAgdGhpcy5pc0ZpbHRlcmluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fbG9hZFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2Uoc2VhcmNoVmFsdWUuZmlsdGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uT3BlbigpIHtcclxuICAgIHRoaXMuaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkIHx8IHR5cGVvZiB0aGlzLmxpc3RTb3VyY2VVcmwgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuX2xvYWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaXNOb1Jlc3VsdEFmdGVyRmlsdGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5kYXRhTG9hZGVkICYmXHJcbiAgICAgIHRoaXMuZGF0YXNvdXJjZS5sZW5ndGggPT09IDAgJiZcclxuICAgICAgdGhpcy5pc0ZpbHRlcmluZyAmJlxyXG4gICAgICAhdGhpcy5oYXNMb2FkRXJyb3JcclxuICAgICk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBfbG9hZERhdGFTb3VyY2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzRmlsdGVyZWQpIHtcclxuICAgICAgICB0aGlzLl9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKGtleXdvcmQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuX2luaXRMaXN0RGF0YVNvdXJjZUVuZHBvaW50KCk7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkRGF0YSh1cmwsIHRoaXMuX2dlbmVyYXRlSHR0cFBhcmFtcyhrZXl3b3JkKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkTm90U2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpIHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuX2luaXRMaXN0RGF0YVNvdXJjZUVuZHBvaW50KCk7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkRGF0YSh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkRGF0YSh1cmw6IHN0cmluZywgcGFyYW1zPzogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaGFzTG9hZEVycm9yID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5faHR0cENsaWVudC5nZXQodXJsLCBwYXJhbXMpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YTtcclxuICAgICAgICB0aGlzLl9tYXBHb3R0ZW5EYXRhU291cmNlVG9Mb2NhbERhdGFzb3VyY2UoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGRhdGFzb3VyY2UnLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5oYXNMb2FkRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQXBpRXJyb3IoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhTG9hZGVkICYmIHRoaXMuaGFzTG9hZEVycm9yO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZW5zdXJlU2VsZWN0ZWRPcHRpb25FeGlzdHMoKSB7XHJcbiAgICAvLyBubyBfZW5zdXJlU2VsZWN0ZWRPcHRpb25FeGlzdHMgZm9yIG11bHRpLXNlbGVjdFxyXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5iaW5kID09IG51bGwpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBleGlzdHMgPSB0aGlzLmRhdGFzb3VyY2Uuc29tZSh4ID0+IHguaWQgPT0gdGhpcy5iaW5kKTtcclxuXHJcbiAgICBpZiAoZXhpc3RzKSByZXR1cm47XHJcblxyXG4gICAgYXdhaXQgdGhpcy5fbG9hZEJpbmRFbGVtZW50KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9sb2FkQmluZEVsZW1lbnQoKSB7XHJcbiAgICAvLyBubyBfbG9hZEJpbmRFbGVtZW50IGZvciBtdWx0aS1zZWxlY3RcclxuICAgIGlmICh0aGlzLm11bHRpcGxlKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNFbGVtZW50U291cmNlVXJsVmFsaWQoKSB8fCAhdGhpcy5iaW5kKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0RWxlbWVudEVuZHBvaW50KCkpKTtcclxuXHJcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3Qgb3B0aW9uID0ge1xyXG4gICAgICAgIGlkOiBkYXRhW3RoaXMuaWRGaWVsZF0sXHJcbiAgICAgICAgbGFiZWw6IGRhdGFbdGhpcy5sYWJlbEZpZWxkXVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmRhdGFzb3VyY2Uuc29tZSh4ID0+IHguaWQgPT09IG9wdGlvbi5pZCkpIHtcclxuICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gWy4uLnRoaXMuZGF0YXNvdXJjZSwgb3B0aW9uXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZExhYmVsQ2hhbmdlLmVtaXQob3B0aW9uLmxhYmVsKTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZWxlY3RlZCBlbGVtZW50JywgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbXBhcmVGdW5jdGlvbigpOiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGEsIGIpID0+IHtcclxuICAgICAgaWYgKGEubGFiZWwgPiBiLmxhYmVsKSB7IHJldHVybiAxOyB9XHJcbiAgICAgIGlmIChhLmxhYmVsIDwgYi5sYWJlbCkgeyByZXR1cm4gLTE7IH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0xpc3RTb3VyY2VVcmxWYWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5saXN0U291cmNlVXJsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignbGlzdFNvdXJjZVVybCB1cmwgbm90IHByb3ZpZGVkJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0VsZW1lbnRTb3VyY2VVcmxWYWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50U291cmNlVXJsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignZWxlbWVudFNvdXJjZVVybCBub3QgZGVmaW5lZCcpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0UGFyYW1ldGVyc1dpdGhEZWZhdWx0cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlkRmllbGQgPT0gdW5kZWZpbmVkIHx8IHRoaXMuaWRGaWVsZCA9PT0gXCJcIikge1xyXG4gICAgICB0aGlzLmlkRmllbGQgPSBcImlkXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubGFiZWxGaWVsZCA9PSB1bmRlZmluZWQgfHwgdGhpcy5sYWJlbEZpZWxkID09PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMubGFiZWxGaWVsZCA9IFwibGliZWxsZVwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdEVsZW1lbnRFbmRwb2ludCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuYmluZCkge1xyXG4gICAgICByZXR1cm4gZW5jb2RlVVJJKGAke3RoaXMuZWxlbWVudFNvdXJjZVVybH0vJHt0aGlzLmJpbmR9YCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHRocm93IG5ldyBFcnJvcignbm8gYmluZCBpbnB1dCB3YXMgcHJvdmlkZWQsIGNhbm5vdCBjcmVhdGUgYmluZEVsZW1lbnRVcmwnKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdExpc3REYXRhU291cmNlRW5kcG9pbnQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubGlzdFNvdXJjZVVybCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0xpc3Qgc291cmNlIFVSTCBub3QgcHJvdmlkZWQnKTtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmxpc3RTb3VyY2VVcmwgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICByZXR1cm4gZW5jb2RlVVJJKGAke3RoaXMubGlzdFNvdXJjZVVybH1gKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGhpcy5saXN0U291cmNlVXJsID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBsZXQgdGVtcFVybCA9IHRoaXMubGlzdFNvdXJjZVVybCh0aGlzLmN1cnJlbnRSb3dJdGVtKVxyXG4gICAgICByZXR1cm4gZW5jb2RlVVJJKGAke3RlbXBVcmx9YClcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2luaXRpYWxMb2FkRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICB0aGlzLl9tYXBHb3R0ZW5EYXRhU291cmNlVG9Mb2NhbERhdGFzb3VyY2UoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fbG9hZEJpbmRFbGVtZW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZE5vdFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfb25CaW5kU2V0KCkge1xyXG4gICAgaWYgKHRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXdhaXQgdGhpcy5fZW5zdXJlU2VsZWN0ZWRPcHRpb25FeGlzdHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEFsbERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fbG9hZE5vdFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRSZWxvYWREYXRhU291cmNlU3Vic2NyaXB0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMucmVsb2FkRGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLnJlbG9hZERhdGFTb3VyY2Uuc3Vic2NyaWJlKFxyXG4gICAgICAgIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgKGRhdGEpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhICE9IHVuZGVmaW5lZCAmJiBkYXRhICE9IG51bGwgJiYgZGF0YSAhPSAnJykge1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdFNvdXJjZVVybCA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkQWxsRGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZSA9IGRhdGFcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlICBfbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk6IHZvaWQge1xyXG4gICAgXHJcbiAgICBsZXQgdGVtcEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9nb3R0ZW5EYXRhc291cmNlKSkge1xyXG5cclxuICAgICAgdGhpcy5fZ290dGVuRGF0YXNvdXJjZS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgaWQ6IGVsZW1lbnRbdGhpcy5pZEZpZWxkXSxcclxuICAgICAgICAgIGxhYmVsOiBlbGVtZW50W3RoaXMubGFiZWxGaWVsZF1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0ZW1wQXJyYXkucHVzaChvYmopO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlID0gdGVtcEFycmF5O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSB0aGlzLl9kaXN0aW5jdEJ5SWQoWy4uLnRoaXMuZGF0YXNvdXJjZSwgLi4udGVtcEFycmF5XSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydCkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlLnNvcnQodGhpcy5fY29tcGFyZUZ1bmN0aW9uKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2VMb2FkZWQuZW1pdCgpO1xyXG5cclxuICAgIGlmICghdGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHsgXHJcbiAgICAgIHRoaXMuX2Vuc3VyZVNlbGVjdGVkT3B0aW9uRXhpc3RzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVHcm91cHBlZERhdGFTb3VyY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dlbmVyYXRlSHR0cFBhcmFtcyhrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCd2YWx1ZScsIGtleXdvcmQgPz8gJycpO1xyXG5cclxuICAgIGlmKCF0aGlzLmxpc3RTb3VyY2VQYXJhbXMgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5saXN0U291cmNlUGFyYW1zKSB8fCB0aGlzLmxpc3RTb3VyY2VQYXJhbXMubGVuZ3RoIDwgMSlcclxuICAgIHtcclxuICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxpc3RTb3VyY2VQYXJhbXMuZmlsdGVyKChwOiBLZXlWYWx1ZTxzdHJpbmcsIGFueT4pID0+IHAudmFsdWUgIT0gbnVsbCAmJiBwLnZhbHVlICE9IHVuZGVmaW5lZClcclxuICAgIC5mb3JFYWNoKChwOiBLZXlWYWx1ZTxzdHJpbmcsIGFueT4pID0+IHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChwLmtleSwgcC52YWx1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBwYXJhbXM6IHBhcmFtcyB9O1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2hDb21ib0NsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMub25DbGljay5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBFdmVudCBoYW5kbGVyIGNhbGxlZCB3aGVuIHRoZSBNdWx0aVNlbGVjdCBtb2RlbCBjaGFuZ2VzLlxyXG4gKiBVcGRhdGVzIHRoZSBib3VuZCB2YWx1ZSBhbmQgcmVjYWxjdWxhdGVzIHRoZSBncm91cGVkIGRhdGFzb3VyY2UgZm9yIHByb3BlciByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBuZXdWYWx1ZSAtIFRoZSBuZXcgdmFsdWUgZW1pdHRlZCBieSB0aGUgTXVsdGlTZWxlY3QgY29tcG9uZW50LlxyXG4gKi9cclxuICBvbk11bHRpU2VsZWN0TW9kZWxDaGFuZ2UobmV3VmFsdWU6IG9iamVjdCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuYmluZFZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5jYWxjdWxhdGVHcm91cHBlZERhdGFTb3VyY2UoKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAqIFJldHVybnMgYSBkaXN0aW5jdCBhcnJheSBvZiBpdGVtcyBiYXNlZCBvbiB0aGVpciBgaWRgIHByb3BlcnR5LlxyXG4gKiBVc2VmdWwgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSB0aGUgZGF0YXNvdXJjZSBvciBzZWxlY3RlZCBpdGVtcyBsaXN0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge2FueVtdfSBhcnJheSAtIEFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyBhbiBgaWRgIHByb3BlcnR5LlxyXG4gKiBAcmV0dXJucyB7YW55W119IEFycmF5IG9mIHVuaXF1ZSBpdGVtcyBieSBgaWRgLlxyXG4gKi9cclxuICBwcml2YXRlIF9kaXN0aW5jdEJ5SWQoYXJyYXk6IGFueVtdKTogYW55W11cclxuICB7XHJcbiAgICBpZiAoIWFycmF5KSByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3QgZGlzdGluY3QgPSBBcnJheS5mcm9tKFxyXG4gICAgICBuZXcgTWFwKGFycmF5Lm1hcChpdGVtID0+IFtpdGVtLmlkLCBpdGVtXSkpLnZhbHVlcygpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBkaXN0aW5jdDtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAqIFRyYWNrQnkgZnVuY3Rpb24gZm9yIEFuZ3VsYXIgbmdGb3IgbG9vcHMuXHJcbiAqIEhlbHBzIEFuZ3VsYXIgZWZmaWNpZW50bHkgdHJhY2sgbGlzdCBpdGVtcyBieSBhIHVuaXF1ZSBpZGVudGlmaWVyLCBhdm9pZGluZyB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIEluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHthbnl9IGl0ZW0gLSBJdGVtIG9iamVjdCBjb250YWluaW5nIGFuIGBpZGAuXHJcbiAqIEByZXR1cm5zIHthbnl9IFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgaXRlbSAoaXRlbS5pZCkuXHJcbiAqL1xyXG4gIHRyYWNrQnlJZChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGl0ZW0uaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogUmV0dXJucyB0aGUgdG9wIE4gc2VsZWN0ZWQgb3B0aW9ucyB0byBkaXNwbGF5IGluIHRoZSB0b29sdGlwLlxyXG4gKiBMaW1pdHMgdGhlIG51bWJlciBvZiBpdGVtcyBzaG93biB0byBgdG9vbHRpcE1heERpc3BsYXllZEl0ZW1zYCBmb3IgcmVhZGFiaWxpdHkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7TXVsdGlTZWxlY3R9IG11bHRpU2VsZWN0IC0gUmVmZXJlbmNlIHRvIHRoZSBQcmltZU5HIE11bHRpU2VsZWN0IGNvbXBvbmVudC5cclxuICogQHJldHVybnMge2FueVtdfSBBcnJheSBvZiBzZWxlY3RlZCBpdGVtcywgbGltaXRlZCB0byBgdG9vbHRpcE1heERpc3BsYXllZEl0ZW1zYC5cclxuICovXHJcbiAgZ2V0VG9wU2VsZWN0ZWRPcHRpb25zKG11bHRpU2VsZWN0OiBNdWx0aVNlbGVjdCk6IGFueVtdIHtcclxuICAgIGlmKCFtdWx0aVNlbGVjdCB8fCAhQXJyYXkuaXNBcnJheShtdWx0aVNlbGVjdC5zZWxlY3RlZE9wdGlvbnMpIHx8IG11bHRpU2VsZWN0LnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggPCAxKSByZXR1cm4gW107XHJcbiAgXHJcbiAgICByZXR1cm4gbXVsdGlTZWxlY3Quc2VsZWN0ZWRPcHRpb25zLnNsaWNlKDAsIHRoaXMudG9vbHRpcE1heERpc3BsYXllZEl0ZW1zKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGdyb3VwZWQgZGF0YXNvdXJjZSBmb3IgdGhlIE11bHRpU2VsZWN0IGRyb3Bkb3duLlxyXG4gKiBDcmVhdGVzIHR3byBncm91cHM6XHJcbiAqIDEuIFwiU2VsZWN0ZWQgaXRlbXNcIiDigJQgaXRlbXMgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSB1c2VyLlxyXG4gKiAyLiBcIkF2YWlsYWJsZSBpdGVtc1wiIOKAlCBpdGVtcyBub3Qgc2VsZWN0ZWQgeWV0LlxyXG4gKlxyXG4gKiBUaGUgZ3JvdXBlZCBkYXRhc291cmNlIGFsbG93czpcclxuICogLSBTZWxlY3RlZCBpdGVtcyB0byBiZSBwaW5uZWQgb24gdG9wIGZvciBlYXN5IG1hbmFnZW1lbnQuXHJcbiAqIC0gQXZhaWxhYmxlIGl0ZW1zIHRvIHJlbWFpbiBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci5cclxuICogLSBNdWx0aS1sYW5ndWFnZSBzdXBwb3J0IHVzaW5nIHRoZSBgX2xvY2FsaXplYCBzZXJ2aWNlLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBVcGRhdGVzIGB0aGlzLmdyb3VwcGVkRGF0YVNvdXJjZWAgd2l0aCB0aGUgbGF0ZXN0IGdyb3VwZWQgc3RydWN0dXJlLlxyXG4gKi9cclxuICBwcml2YXRlIGNhbGN1bGF0ZUdyb3VwcGVkRGF0YVNvdXJjZSgpOiB2b2lkIHtcclxuICAgIGxldCBncm91cHMgOiBTZWxlY3RJdGVtR3JvdXBbXSA9IFtdO1xyXG5cclxuICAgIGxldCBpc0JpbmRWYWxpZEFycmF5IDogYm9vbGVhbiA9IHRoaXMuYmluZCAmJiBBcnJheS5pc0FycmF5KHRoaXMuYmluZCkgJiYgdGhpcy5iaW5kLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBzZWxlY3RlZElkcyA9IG5ldyBTZXQoaXNCaW5kVmFsaWRBcnJheSA/IHRoaXMuYmluZCA6IFtdKTtcclxuXHJcbiAgICAvLyBTZWxlY3RlZCBpdGVtc1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZGF0YXNvdXJjZS5maWx0ZXIoaXRlbSA9PiBzZWxlY3RlZElkcy5oYXMoaXRlbS5pZCkpO1xyXG4gICAgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBncm91cHMucHVzaCh7XHJcbiAgICAgICAgbGFiZWw6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX2NvbXBvbmVudF9tdWx0aXNlbGVjdF9zZWxlY3RlZF9ncm91cCcpLFxyXG4gICAgICAgIHZhbHVlOiAnc2VsZWN0ZWQtaXRlbXMnLFxyXG4gICAgICAgIGl0ZW1zOiBzZWxlY3RlZEl0ZW1zXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEF2YWlsYWJsZSAobm90IHNlbGVjdGVkKSBpdGVtc1xyXG4gICAgY29uc3QgYXZhaWxhYmxlSXRlbXMgPSB0aGlzLmRhdGFzb3VyY2UuZmlsdGVyKGl0ZW0gPT4gIXNlbGVjdGVkSWRzLmhhcyhpdGVtLmlkKSk7XHJcbiAgICBpZiAoYXZhaWxhYmxlSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBncm91cHMucHVzaChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5fbG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfY29tcG9uZW50X211bHRpc2VsZWN0X2F2YWlsYWJsZV9ncm91cCcpLFxyXG4gICAgICAgICAgdmFsdWU6ICdhdmFpbGFibGUtaXRlbXMnLFxyXG4gICAgICAgICAgaXRlbXM6IGF2YWlsYWJsZUl0ZW1zXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncm91cHBlZERhdGFTb3VyY2UgPSBncm91cHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50J3MgY29udGVudCBvdmVyZmxvd3MgaXRzIHZpc2libGUgd2lkdGguXHJcbiAqIFVzZWQgdG8gY29uZGl0aW9uYWxseSBlbmFibGUgdG9vbHRpcCBvbmx5IHdoZW4gZWxsaXBzaXMgaXMgYXBwbGllZC5cclxuICovXHJcbiAgaXNUZXh0T3ZlcmZsb3dpbmcoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIGVsZW1lbnQuc2Nyb2xsV2lkdGggPiBlbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICogQ29tcHV0ZXMgYW5kIGVtaXRzIHRoZSBsYWJlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudChzKS5cclxuICpcclxuICogVGhpcyBtZXRob2QgaW5zcGVjdHMgdGhlIGN1cnJlbnQgYGJpbmRgIHZhbHVlIGFuZCB0aGUgYGRhdGFzb3VyY2VgIHRvIGRldGVybWluZVxyXG4gKiB0aGUgbGFiZWwocykgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQocykuIFRoZSBiZWhhdmlvciBkaWZmZXJzIGRlcGVuZGluZyBvbiB3aGV0aGVyXHJcbiAqIHRoZSBjb21wb25lbnQgaXMgaW4gc2luZ2xlIG9yIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlOlxyXG4gKlxyXG4gKiAtICoqTXVsdGlwbGUgc2VsZWN0aW9uIChgbXVsdGlwbGUgPSB0cnVlYCkqKlxyXG4gKiAgIC0gSWYgZXhhY3RseSBvbmUgZWxlbWVudCBpcyBzZWxlY3RlZCwgaXRzIGxhYmVsIGlzIGVtaXR0ZWQuXHJcbiAqICAgLSBJZiBtdWx0aXBsZSBlbGVtZW50cyBhcmUgc2VsZWN0ZWQsIHRoZWlyIGxhYmVscyBhcmUgZm9ybWF0dGVkIGFzIGEgc3RyaW5nXHJcbiAqICAgICBhcnJheSByZXByZXNlbnRhdGlvbjogYFtcIkxhYmVsMVwiLCBcIkxhYmVsMlwiLCAuLi5dYC5cclxuICpcclxuICogLSAqKlNpbmdsZSBzZWxlY3Rpb24gKGBtdWx0aXBsZSA9IGZhbHNlYCkqKlxyXG4gKiAgIC0gVGhlIGxhYmVsIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGVtaXR0ZWQgaWYgaXQgZXhpc3RzIGluIHRoZSBkYXRhc291cmNlLlxyXG4gKlxyXG4gKiBJZiBhIHZhbGlkIGxhYmVsIGlzIHJlc29sdmVkLCB0aGUgbWV0aG9kIGVtaXRzIHRoZSByZXN1bHQgdGhyb3VnaFxyXG4gKiB0aGUgYHNlbGVjdGVkTGFiZWxDaGFuZ2VgIGV2ZW50IGVtaXR0ZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIC0gYGJpbmRgIHJlcHJlc2VudHMgdGhlIHNlbGVjdGVkIGlkIChzaW5nbGUgbW9kZSkgb3IgYW4gYXJyYXkgb2YgaWRzIChtdWx0aXBsZSBtb2RlKS5cclxuICogLSBgZGF0YXNvdXJjZWAgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBlbGVtZW50cyB3aXRoIGF0IGxlYXN0IGBpZGAgYW5kIGBsYWJlbGAgcHJvcGVydGllcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbiAgcHJpdmF0ZSBfaGFuZGxlU2VsZWN0ZWRFbGVtZW50c0xhYmVsQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgbGV0IHNlbGVjdGlvbkxhYmVsOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMuYmluZCkpIHtcclxuICAgICAgbGV0IHNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLmRhdGFzb3VyY2UuZmlsdGVyKGUgPT4gdGhpcy5iaW5kLmluY2x1ZGVzKGUuaWQpKTtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PSAxKVxyXG4gICAgICB7XHJcbiAgICAgICAgc2VsZWN0aW9uTGFiZWwgPSBzZWxlY3RlZEVsZW1lbnRzWzBdLmxhYmVsO1xyXG4gICAgICB9ICAgICAgXHJcbiAgICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSlcclxuICAgICAge1xyXG4gICAgICAgIHNlbGVjdGlvbkxhYmVsID0gYFske3NlbGVjdGVkRWxlbWVudHMubWFwKGUgPT4gYFwiJHtlLmxhYmVsfVwiYCkuam9pbignLCAnKX1dYDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IHRoaXMuZGF0YXNvdXJjZS5maW5kKGUgPT4gZS5pZCA9PSB0aGlzLmJpbmQpO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCkge1xyXG4gICAgICAgIHNlbGVjdGlvbkxhYmVsID0gc2VsZWN0ZWRFbGVtZW50LmxhYmVsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbGVjdGlvbkxhYmVsKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbENoYW5nZS5lbWl0KHNlbGVjdGlvbkxhYmVsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpc3RpbmN0KHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodmFsdWVzKV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUV4dGVybmFsU2VsZWN0aW9uKGRyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQ6IERyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQpOiB2b2lkIHtcclxuICAgIGlmICghZHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCkgcmV0dXJuO1xyXG5cclxuICAgIGxldCBzZWxlY3Rpb24gPSBkcm9wZG93bkV4dGVybmFsU2VsZWN0aW9uT3V0cHV0Lml0ZW1zO1xyXG4gICAgbGV0IHNlbGVjdGlvbktleSA9IGRyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQuaXRlbUtleVByb3BlcnR5TmFtZTtcclxuXHJcbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgbW9kZSBzZWxlY3Rpb25cclxuICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgbGV0IG5ld0l0ZW1zOiBhbnlbXSA9IHNlbGVjdGlvblxyXG4gICAgICAgIC5maWx0ZXIoaSA9PiAhdGhpcy5kYXRhc291cmNlLnNvbWUocyA9PiBzLmlkID09IGlbc2VsZWN0aW9uS2V5XSkpO1xyXG5cclxuICAgICAgaWYgKG5ld0l0ZW1zICYmIG5ld0l0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgaXRlbXNcclxuICAgICAgICBsZXQgbGFiZWxQcm9wTmFtZSA9IHRoaXMuZ2V0QmVzdExhYmVsUHJvcGVydHlOYW1lKHNlbGVjdGlvblswXSk7XHJcbiAgICAgICAgbGV0IHRlbXBBcnJheTogYW55W10gPSBuZXdJdGVtcy5tYXAoKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IGVsZW1lbnRbc2VsZWN0aW9uS2V5XSxcclxuICAgICAgICAgICAgbGFiZWw6IChsYWJlbFByb3BOYW1lIGluIGVsZW1lbnQpID8gZWxlbWVudFtsYWJlbFByb3BOYW1lXSA6IHRoaXMubGFiZWxPZkVsZW1lbnROb3RGb3VuZFRleHRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gYXBlbmQgc2VsZWN0ZWQgaXRlbXMgdG8gRGF0YXNvdXJjZVxyXG4gICAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSB0aGlzLl9kaXN0aW5jdEJ5SWQoWy4uLnRoaXMuZGF0YXNvdXJjZSwgLi4udGVtcEFycmF5XSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNvcnQpIHtcclxuICAgICAgICAgIHRoaXMuX2RhdGFzb3VyY2Uuc29ydCh0aGlzLl9jb21wYXJlRnVuY3Rpb24oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbmV3U2VsZWN0ZWRJdGVtc0lkczogYW55W10gPSBzZWxlY3Rpb24ubWFwKGkgPT4gaVtzZWxlY3Rpb25LZXldKTtcclxuICAgICAgbGV0IHNlbGVjdGVkSXRlbXNJZHM6IGFueVtdID0gdGhpcy5kaXN0aW5jdChbLi4uKHRoaXMuYmluZCA/IHRoaXMuYmluZCA6IFtdKSwgLi4ubmV3U2VsZWN0ZWRJdGVtc0lkc10pO1xyXG4gICAgICB0aGlzLm9uTXVsdGlTZWxlY3RNb2RlbENoYW5nZShzZWxlY3RlZEl0ZW1zSWRzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBIYW5kbGUgc2lnbmxlIG1vZGUgc2VsZWN0aW9uXHJcbiAgICAgIHRoaXMuYmluZFZhbHVlQ2hhbmdlZChzZWxlY3Rpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsYWJlbFByb3BlcnR5TmFtZVJvb3RTZWdtZW50OiBzdHJpbmcgPSAnbGliZWxsZSc7XHJcbiAgLyoqXHJcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHByb3BlcnR5IChhbHBoYWJldGljYWxseSkgXHJcbiAqIHdob3NlIG5hbWUgY29udGFpbnMgJ2xhYmVsJyAoY2FzZS1pbnNlbnNpdGl2ZSkgZnJvbSBhIGdpdmVuIG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIG9iaiAtIFRoZSBzb3VyY2Ugb2JqZWN0IChjYW4gYmUgb2YgdHlwZSBhbnkpXHJcbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgcHJvcGVydHksIG9yIHVuZGVmaW5lZCBpZiBub25lIGZvdW5kXHJcbiAqL1xyXG4gIHByaXZhdGUgZ2V0Rmlyc3RMYWJlbFByb3BlcnR5TmFtZShvYmo6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMubGFiZWxQcm9wZXJ0eU5hbWVSb290U2VnbWVudCkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXHJcbiAgICAgIC5tYXAoa2V5ID0+IG9ialtrZXldKVswXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QmVzdExhYmVsUHJvcGVydHlOYW1lKG9iamVjdDogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsRmllbGQ7XHJcblxyXG4gICAgLy8gVE9ETywgQEhhc3Nlbiwgw6AgcmV2b2lyIHBsdXMgdGFyZC5cclxuICAgIGxldCBiZXN0TGFiZWxQcm9wZXJ0eU5hbWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIGlmICh0aGlzLmxhYmVsRmllbGQgaW4gb2JqZWN0KSBiZXN0TGFiZWxQcm9wZXJ0eU5hbWUgPSB0aGlzLmxhYmVsRmllbGQ7XHJcbiAgICBlbHNlIGlmICh0aGlzLmxhYmVsUHJvcGVydHlOYW1lUm9vdFNlZ21lbnQgaW4gb2JqZWN0KSBiZXN0TGFiZWxQcm9wZXJ0eU5hbWUgPSB0aGlzLmxhYmVsUHJvcGVydHlOYW1lUm9vdFNlZ21lbnQ7XHJcbiAgICBlbHNlIGJlc3RMYWJlbFByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0Rmlyc3RMYWJlbFByb3BlcnR5TmFtZShvYmplY3QpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGBbTGFiZWxGaWVsZCA6ICR7dGhpcy5sYWJlbEZpZWxkfV0gVlMgW0Jlc3RMYWJlbFByb3BlcnR5TmFtZSA6ICR7YmVzdExhYmVsUHJvcGVydHlOYW1lfV1gKTtcclxuICAgIHJldHVybiBiZXN0TGFiZWxQcm9wZXJ0eU5hbWU7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59IiwiPGRpdiAqbmdJZj1cIiFtdWx0aXBsZTsgZWxzZSBtdWx0aVNlbGVjdFwiIGNsYXNzPVwiZmxleFwiPlxyXG4gIDxwLWRyb3Bkb3duIFxyXG4gICAgW29wdGlvbnNdPVwiZGF0YXNvdXJjZVwiXHJcbiAgICBbbmdNb2RlbF09XCJiaW5kXCJcclxuICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgb3B0aW9uVmFsdWU9XCJpZFwiXHJcbiAgICBbbG9hZGluZ109XCIhZGF0YUxvYWRlZFwiXHJcbiAgICBmaWx0ZXJCeT1cImxhYmVsXCIgXHJcbiAgICBbZmlsdGVyXT1cInRydWVcIiBcclxuICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCIgXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBcclxuICAgIChuZ01vZGVsQ2hhbmdlKT1cImJpbmRWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIFxyXG4gICAgKG9uU2hvdyk9XCJvbk9wZW4oKVwiIChvbkZpbHRlcik9XCJzZWFyY2hWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChvbkNsaWNrKT1cIm9uU2VhcmNoQ29tYm9DbGljaygkZXZlbnQpXCJcclxuICAgIFtzdHlsZV09XCJ7J21heC13aWR0aCc6IG1heFdpZHRoLCAnd2lkdGgnOicxMDAlJywgJ2hlaWdodCc6ICcxLjdyZW0nfVwiXHJcbiAgICBbbmdDbGFzc109XCJpc0FyID8gJ3AtZHJvcGRvd24tY2xlYXItaWNvbkFSJzogJ3AtZHJvcGRvd24tY2xlYXItaWNvbkZSJ1wiXHJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXJcIiBcclxuICAgIGNsYXNzPVwie3tteVN0eWxlQ2xhc3N9fVwiIFxyXG4gICAgc3R5bGVDbGFzcz1cInt7bXlTdHlsZUNsYXNzfX0gYm9yZGVyLXJhZGl1cy03IHt7dmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzfX1cIiBcclxuICAgIGFwcGVuZFRvPVwiYm9keVwiPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBmbGV4IGdhcC0xIHB0LTIgcHgtMlwiPlxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd1NlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCIgdG9vbHRpcFRleHQ9XCJzaGFyZWRVaS1zZWFyY2hDb21iby1hY3Rpb24tc2VhcmNoXCJcclxuICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLkJvdHRvbVwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwib3BlblNlYXJjaERpYWxvZygpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc29ydC1hbW91bnQtZG93blwiIHRvb2x0aXBUZXh0PVwic2hhcmVkVWktc2VhcmNoQ29tYm8tYWN0aW9uLWFkdmFuY2VkU2VhcmNoXCJcclxuICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLkJvdHRvbVwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KClcIj5cclxuICAgICAgICA8L1RzaS1CdXR0b24+XHJcblxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd0FkZEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktcGx1c1wiIHRvb2x0aXBUZXh0PVwic2hhcmVkVWktc2VhcmNoQ29tYm8tYWN0aW9uLWFkZFwiXHJcbiAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Cb3R0b21cIiBzdHlsZUNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24taWNvbi1vbmx5XCIgKGNsaWNrKT1cImFkZEVsZW1lbnQoKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgICAgPFRzaS1CdXR0b24gKm5nSWY9XCJzaG93VXBkYXRlQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1wZW5jaWxcIiB0b29sdGlwVGV4dD1cInNoYXJlZFVpLXNlYXJjaENvbWJvLWFjdGlvbi1lZGl0XCJcclxuICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLkJvdHRvbVwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwidXBkYXRlRWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1leWVcIiB0b29sdGlwVGV4dD1cInNoYXJlZFVpLXNlYXJjaENvbWJvLWFjdGlvbi1jb25zdWx0XCJcclxuICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLkJvdHRvbVwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwiY29uc3VsdEVsZW1lbnQoKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIFxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eVwiPlxyXG4gICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcHktMyBnYXAtMlwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0FwaUVycm9yOyBlbHNlIGFwaUVycm9yXCI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0RhdGFzb3VyY2VFbXB0eSAmJiAhaXNGaWx0ZXJpbmdcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1ncmF5LTUwMFwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgJ3NlYXJjaF9jb21ib19ub19lbGVtZW50JyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzTm9SZXN1bHRBZnRlckZpbHRlclwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LWdyYXktNTAwXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyAnc2VhcmNoX2NvbWJvX25vX3Jlc3VsdCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhcGlFcnJvcj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZSB0ZXh0LW9yYW5nZS01MDBcIj48L2k+XHJcbiAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgIHt7ICdzZWFyY2hfY29tYm9fbG9hZF9lcnJvcicgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbVwiIGxldC1zZWxlY3RlZE9wdGlvbj5cclxuICAgICAgPGRpdiBwVG9vbHRpcD1cInt7c2VsZWN0ZWRPcHRpb24ubGFiZWx9fVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHRvb2x0aXBTdHlsZUNsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdGF0dXNDb21ibyAmJiBzdGF0dXNNZXRhZGF0YTsgZWxzZSBub3JtYWxTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkT3B0aW9uICYmIGdldFN0YXR1c09wdGlvbihzZWxlY3RlZE9wdGlvbi5sYWJlbCkgYXMgb3B0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJsaWdodGVuQ29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFJlYWRhYmxlVGV4dENvbG9yKG9wdC5jb2xvckhleClcIj5cclxuICAgICAgICAgICAgICB7eyBzZWxlY3RlZE9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxTZWxlY3RlZD5cclxuICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkT3B0aW9uLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgbGV0LXRhcmdldCBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgIDxkaXYgcFRvb2x0aXA9XCJ7e3RhcmdldC5sYWJlbH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgdG9vbHRpcFN0eWxlQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdGF0dXNDb21ibyAmJiBzdGF0dXNNZXRhZGF0YTsgZWxzZSBub3JtYWxPcHRpb25cIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRTdGF0dXNPcHRpb24odGFyZ2V0LmxhYmVsKSBhcyBvcHRcIj5cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJsaWdodGVuQ29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0UmVhZGFibGVUZXh0Q29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy10b3BdPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctYm90dG9tXT1cIicwLjFyZW0nXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7dGFyZ2V0LmxhYmVsfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsT3B0aW9uPlxyXG4gICAgICAgICAgPHNwYW4+e3t0YXJnZXQubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDwvcC1kcm9wZG93bj5cclxuXHJcbiAgPCEtLSBCdWJibGUgSW5mbyAtLT5cclxuICA8VHNpLUJ1YmJsZS1JbmZvIFtpbmZvVGV4dF09XCJpbmZvVGV4dFwiPjwvVHNpLUJ1YmJsZS1JbmZvPlxyXG5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI211bHRpU2VsZWN0PlxyXG4gIDxwLW11bHRpU2VsZWN0XHJcbiAgICAjbXVsdGlTZWxlY3RFbGVtZW50XHJcbiAgICBbb3B0aW9uc109XCJncm91cHBlZERhdGFTb3VyY2VcIlxyXG4gICAgW2dyb3VwXT1cInRydWVcIiBcclxuICAgIFtuZ01vZGVsXT1cImJpbmRcIlxyXG4gICAgW29wdGlvbkxhYmVsXT1cIidsYWJlbCdcIlxyXG4gICAgW29wdGlvblZhbHVlXT1cIidpZCdcIlxyXG4gICAgW2xvYWRpbmddPVwiIWRhdGFMb2FkZWRcIlxyXG4gICAgW2ZpbHRlckJ5XT1cIidsYWJlbCdcIlxyXG4gICAgW2ZpbHRlcl09XCJ0cnVlXCJcclxuICAgIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICBbc2VsZWN0ZWRJdGVtc0xhYmVsXT1cIidzaGFyZWRfY29tcG9uZW50X211bHRpc2VsZWN0X3NlbGVjdGVkX2l0ZW1zX2NvdW50JyB8IGxvY2FsaXplXCJcclxuICAgIFttYXhTZWxlY3RlZExhYmVsc109XCJtYXhTZWxlY3RlZExhYmVsc1wiXHJcbiAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXHJcbiAgICBbc3R5bGVdPVwieydtYXgtd2lkdGgnOiBtYXhXaWR0aCwgJ3dpZHRoJzonMTAwJScsICdoZWlnaHQnOiAnMS43cmVtJ31cIlxyXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyXCJcclxuICAgIFtuZ0NsYXNzXT1cImlzQXIgPyAncC1kcm9wZG93bi1jbGVhci1pY29uQVInOiAncC1kcm9wZG93bi1jbGVhci1pY29uRlInXCJcclxuICAgIGNsYXNzPVwie3tteVN0eWxlQ2xhc3N9fVwiIFxyXG4gICAgc3R5bGVDbGFzcz1cInt7bXlTdHlsZUNsYXNzfX0gYm9yZGVyLXJhZGl1cy03IHt7dmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzfX1cIlxyXG4gICAgcGFuZWxTdHlsZUNsYXNzPVwidHNpLW11bHRpc2VsZWN0LXBhbmVsXCJcclxuICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvbk11bHRpU2VsZWN0TW9kZWxDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAob25QYW5lbFNob3cpPVwib25PcGVuKClcIlxyXG4gICAgKG9uRmlsdGVyKT1cInNlYXJjaFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgIChvbkNsaWNrKT1cIm9uU2VhcmNoQ29tYm9DbGljaygkZXZlbnQpXCJcclxuICAgIFtwVG9vbHRpcF09XCJtdWx0aVNlbGVjdEVsZW1lbnQ/LnNlbGVjdGVkT3B0aW9ucz8ubGVuZ3RoID8gbXVsdGlTZWxlY3RUb29sdGlwQ29udGVudCA6IHVuZGVmaW5lZFwiIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW9wdGlvbj5cclxuICAgICAgPGRpdiAjbGFiZWxSZWYgY2xhc3M9XCJ0c2ktbXVsdGlzZWxlY3Qtb3B0aW9uLWxhYmVsXCIgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCIgdG9vbHRpcEFwcGVuZFRvPVwiYm9keVwiIFtwVG9vbHRpcF09XCJpc1RleHRPdmVyZmxvd2luZyhsYWJlbFJlZikgPyBvcHRpb24ubGFiZWwgOiBudWxsXCI+XHJcbiAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBmbGV4IGdhcC0xIHAtMVwiPlxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd1NlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCIgdG9vbHRpcFRleHQ9XCJzaGFyZWRVaS1zZWFyY2hDb21iby1hY3Rpb24tc2VhcmNoXCJcclxuICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLkJvdHRvbVwiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5TZWFyY2hEaWFsb2coKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgICAgPFRzaS1CdXR0b24gKm5nSWY9XCJzaG93QWR2YW5jZWRTZWFyY2hCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXNvcnQtYW1vdW50LWRvd25cIiB0b29sdGlwVGV4dD1cInNoYXJlZFVpLXNlYXJjaENvbWJvLWFjdGlvbi1hZHZhbmNlZFNlYXJjaFwiXHJcbiAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uQm90dG9tXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAoY2xpY2spPVwib3BlbkFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KClcIj5cclxuICAgICAgICA8L1RzaS1CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L3AtbXVsdGlTZWxlY3Q+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjbXVsdGlTZWxlY3RUb29sdGlwQ29udGVudD5cclxuICAgIDxkaXYgY2xhc3M9XCJwLTJcIj5cclxuICAgICAgPCEtLSBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgaXRlbXMgLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aVNlbGVjdEVsZW1lbnQ/LnNlbGVjdGVkT3B0aW9ucz8ubGVuZ3RoOyBlbHNlIG5vSXRlbXNcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbWItMVwiPlxyXG4gICAgICAgICAge3sgJ3NoYXJlZF9jb21wb25lbnRfbXVsdGlzZWxlY3Rfc2VsZWN0ZWRfaXRlbXNfdGl0bGUnIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgICh7eyBtdWx0aVNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCB9fSlcclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHVsIGNsYXNzPVwibS0wIHBsLTNcIj5cclxuICAgICAgICAgIDwhLS0gU2hvdyBvbmx5IGZpcnN0IDEwIGl0ZW1zIC0tPlxyXG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0VG9wU2VsZWN0ZWRPcHRpb25zKG11bHRpU2VsZWN0RWxlbWVudClcIj5cclxuICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIDwhLS0gU2hvdyBtZXNzYWdlIGlmIG1vcmUgdGhhbiAxMCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwibXVsdGlTZWxlY3RFbGVtZW50LnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggPiAxMFwiIGNsYXNzPVwidGV4dC1zbSBtdC0xIHRleHQtZ3JheS01MDBcIj5cclxuICAgICAgICAgIHt7IG11bHRpU2VsZWN0RWxlbWVudC5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoIC0gMTAgfX1cclxuICAgICAgICAgIHt7ICdzaGFyZWRfY29tcG9uZW50X211bHRpc2VsZWN0X3NlbGVjdGVkX2l0ZW1zX21vcmVfbWVzc2FnZScgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8IS0tIElmIG5vIGl0ZW1zIHNlbGVjdGVkIC0tPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI25vSXRlbXM+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIHRleHQtNTAwXCI+XHJcbiAgICAgICAgICB7eyAnc2hhcmVkX2NvbXBvbmVudF9tdWx0aXNlbGVjdF9zZWxlY3RlZF9pdGVtc19lbXB0eScgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|