@provoly/dashboard 1.2.2 → 1.2.3
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/components/data-format/data-format.module.d.ts +7 -0
- package/components/data-format/data-format.pipe.d.ts +8 -0
- package/components/data-format/index.d.ts +5 -0
- package/components/data-format/public-api.d.ts +2 -0
- package/esm2022/components/data-format/data-format.module.mjs +16 -0
- package/esm2022/components/data-format/data-format.pipe.mjs +32 -0
- package/esm2022/components/data-format/provoly-dashboard-components-data-format.mjs +5 -0
- package/esm2022/components/data-format/public-api.mjs +3 -0
- package/esm2022/lib/core/store/aggregation/backend-aggregation.service.mjs +2 -2
- package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +4 -3
- package/esm2022/widgets/widget-analytic/widget-analytic.module.mjs +8 -4
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +21 -11
- package/esm2022/widgets/widget-map/style/css.component.mjs +2 -2
- package/esm2022/widgets/widget-table/expand-value/format-number.pipe.mjs +7 -12
- package/fesm2022/provoly-dashboard-components-data-format.mjs +52 -0
- package/fesm2022/provoly-dashboard-components-data-format.mjs.map +1 -0
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +10 -5
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +22 -12
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +13 -17
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +1 -1
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/package.json +43 -37
- package/styles/base/_utils.scss +4 -0
- package/styles-theme/main-theme.scss +0 -1
- package/widgets/widget-analytic/component/widget-analytic.component.d.ts +1 -1
- package/widgets/widget-analytic/widget-analytic.module.d.ts +2 -1
- package/widgets/widget-map/component/widget-map.component.d.ts +4 -2
- package/widgets/widget-map/style/_m-layer-legend.scss +41 -56
- package/widgets/widget-table/expand-value/format-number.pipe.d.ts +1 -3
- package/styles-theme/components-theme/_m-layer-legend.theme.scss +0 -24
|
@@ -61,7 +61,7 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
61
61
|
this.actions$ = widgetMapConfig.actions$;
|
|
62
62
|
this.legendTabOpen = false;
|
|
63
63
|
this.layersTabOpen = false;
|
|
64
|
-
this.
|
|
64
|
+
this.legendTabClosed = [];
|
|
65
65
|
this.imageNotProvided = [];
|
|
66
66
|
this.zoomAndCenter$ = new BehaviorSubject({});
|
|
67
67
|
this.interactionManager = new InteractionManager();
|
|
@@ -525,6 +525,9 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
525
525
|
: of([])), startWith([]));
|
|
526
526
|
this.legendLayers$ = this.options$.pipe(map((options) => (options.layers ?? []).filter((layer) => ['geoserver', 'wms'].includes(layer.type))), delay(10));
|
|
527
527
|
this.layersTop$ = combineLatest([this.legendTop$, this.legendLayers$]).pipe(map(([legendTop, layers]) => legendTop + ((layers.length ?? 0) > 0 ? 50 : 0)));
|
|
528
|
+
this.layersHeight$ = combineLatest([this.widgetSize$.pipe(debounceTime(100)), this.layersTop$]).pipe(map(([size, top]) => {
|
|
529
|
+
return (size.height ?? 100) - WIDGET_HEADER_HEIGHT.value - top - 50; // 50px acts as bottom margin
|
|
530
|
+
}));
|
|
528
531
|
this.subscriptions.add(combineLatest([this.layersTop$, this.legendLayers$, this.olZoomElement$, this.displayHeader$])
|
|
529
532
|
.pipe(withLatestFrom(this.layers$))
|
|
530
533
|
.subscribe(([[layersTop, legend, zoomElement, displayHeader], layers]) => {
|
|
@@ -865,7 +868,7 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
865
868
|
layer.oClass = $event;
|
|
866
869
|
}
|
|
867
870
|
toggleLegend(index) {
|
|
868
|
-
this.
|
|
871
|
+
this.legendTabClosed[index] = !this.legendTabClosed[index];
|
|
869
872
|
}
|
|
870
873
|
toggleLegendWindow() {
|
|
871
874
|
this.legendTabOpen = !this.legendTabOpen;
|
|
@@ -887,6 +890,8 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
887
890
|
get leftSlideLayers() {
|
|
888
891
|
return this.mapLayers.filter((layer) => layer.get('slide') === 'left');
|
|
889
892
|
}
|
|
893
|
+
hideAllLayersInGroup(group) {
|
|
894
|
+
}
|
|
890
895
|
changeVisibility(group, _layer) {
|
|
891
896
|
const olLayer = this.mapLayers.find((layer) => layer.getProperties()['title'] === _layer?.title);
|
|
892
897
|
if (group.singleLayer) {
|
|
@@ -896,10 +901,13 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
896
901
|
layer.setVisible(false);
|
|
897
902
|
}
|
|
898
903
|
});
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
904
|
+
if (_layer) {
|
|
905
|
+
olLayer?.setVisible(true);
|
|
906
|
+
this.store.dispatch(DashboardActions.updateLayerGroup({ name: group.name, visibleLayers: [_layer.title] }));
|
|
907
|
+
}
|
|
908
|
+
else {
|
|
909
|
+
this.store.dispatch(DashboardActions.updateLayerGroup({ name: group.name, visibleLayers: [] }));
|
|
910
|
+
}
|
|
903
911
|
}
|
|
904
912
|
else {
|
|
905
913
|
olLayer?.setVisible(!olLayer?.getVisible());
|
|
@@ -911,10 +919,12 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
911
919
|
this.map.updateSize();
|
|
912
920
|
}
|
|
913
921
|
isLayerVisible(layer, group) {
|
|
914
|
-
if (group
|
|
922
|
+
if (group?.visibleLayers) {
|
|
915
923
|
return group.visibleLayers.includes(layer.title ?? '');
|
|
916
924
|
}
|
|
917
|
-
|
|
925
|
+
else {
|
|
926
|
+
return this.layerGroups.some((group) => group.visibleLayers.includes(layer.title ?? ''));
|
|
927
|
+
}
|
|
918
928
|
}
|
|
919
929
|
changeAutoLayer($event) {
|
|
920
930
|
this.optionsCopy.automaticLayers = $event;
|
|
@@ -1149,11 +1159,11 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
1149
1159
|
});
|
|
1150
1160
|
}
|
|
1151
1161
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: WidgetMapComponent, deps: [{ token: i1.Store }, { token: i2.PryI18nService }, { token: i2.TooltipFactoryService }, { token: i2.SymbolService }, { token: i0.Injector }, { token: i3.WidgetMapLayerService }, { token: i2.PryAggregationService }, { token: i0.ElementRef }, { token: PRY_GEOAUTH_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1152
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: WidgetMapComponent, selector: "pry-widget-map", viewQueries: [{ propertyName: "mapRef", first: true, predicate: ["mapRef"], descendants: true }, { propertyName: "popup", first: true, predicate: ["popup"], descendants: true }, { propertyName: "popupContent", first: true, predicate: ["popupContent"], descendants: true, read: ViewContainerRef }, { propertyName: "exportTypeTemplate", first: true, predicate: ["exportTypeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "sliderElement", first: true, predicate: ["sliderElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }} :</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.style === STYLE_FROM_URL\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\n\n <div class=\"o-layer-settings\" cdkDropListGroup cdkDragBoundary>\n <h4 class=\"a-label\">{{ '@pry.widget.map.layerSettings.title' | i18n }}</h4>\n <div class=\"u-display-flex -justify-center\">\n <button class=\"a-btn a-btn--primary\" (click)=\"addLayerGroup()\" type=\"button\">\n {{ '@pry.widget.map.layerSettings.addLayerGroup' | i18n }}\n </button>\n </div>\n <ng-container *ngFor=\"let group of layerGroups$ | async; let groupIdx = index\">\n <div *ngIf=\"isGroupUsedByWidgetLayers(group)\" class=\"o-layer-settings__group\">\n <div class=\"m-form-label-field o-layer-settings__group-title\">\n <label class=\"a-label\" for=\"map_layerGroupTitle-{{ groupIdx }}\">\n {{ '@pry.widget.map.layerSettings.layerGroupName' | i18n }}<span class=\"-obligatory-red\">*</span\n >{{ '@pry.widget.map.layerSettings.optionalColon' | i18n }}\n </label>\n <div class=\"u-display-flex\">\n <pry-edit-input\n editButtonTooltip=\"@pry.widget.map.layerSettings.editGroupName\"\n (validated)=\"updateLayerGroup(group.name, $event, group.singleLayer, group.visibleLayers)\"\n [ngModel]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n ></pry-edit-input>\n <button\n *ngIf=\"group.name !== DEFAULT_LAYER_GROUP\"\n class=\"a-btn--icon-only a-tooltip o-layer-settings__delete-group\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteGroup' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayerGroup(group.name)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n </div>\n <div class=\"m-form-radio-group\">\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"multiselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event)\"\n [value]=\"false\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"multiselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.multipleLayer' | i18n\n }}</label>\n </div>\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"monoselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event, group.visibleLayers)\"\n [value]=\"true\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"monoselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.singleLayer' | i18n\n }}</label>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <div class=\"u-display-flex -align-center\">\n <button (click)=\"addLayer(group)\" class=\"a-btn -link-like\" type=\"button\">\n + {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n <button (click)=\"toggleExpandAll(group)\" class=\"a-btn -link-like\" type=\"button\">\n {{\n layerSettingsExpandedState[group.name]\n ? ('@pry.widget.map.layerSettings.foldAll' | i18n)\n : ('@pry.widget.map.layerSettings.unfoldAll' | i18n)\n }}\n </button>\n </div>\n <div\n cdkDropList\n class=\"o-layer-settings__layers\"\n (cdkDropListDropped)=\"drop($event, group)\"\n [attr.data-layer-group]=\"group.name\"\n >\n <ng-container *ngFor=\"let layer of optionsCopy?.layers; let i = index\">\n <div\n *ngIf=\"layer.group === group.name\"\n class=\"o-layer-settings__layer-wrapper\"\n cdkDrag\n [cdkDragData]=\"layer\"\n [cdkDragDisabled]=\"layerSettingsExpandedState[layer.title!]\"\n >\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"o-layer-settings__layer-header\">\n <div class=\"u-display-flex -align-center\">\n <pry-icon\n [class.-disabled]=\"layerSettingsExpandedState[layer.title!]\"\n class=\"drag-handle\"\n [height]=\"16\"\n [width]=\"16\"\n iconSvg=\"drag_indicator\"\n ></pry-icon>\n <button\n class=\"a-btn--icon-only unfold-layer\"\n (click)=\"toggleLayerExpand(layer, group)\"\n type=\"button\"\n >\n <pry-icon\n [height]=\"5\"\n [width]=\"9\"\n [iconSvg]=\"layerSettingsExpandedState[layer.title!] ? 'chevron_top' : 'chevron_bottom'\"\n ></pry-icon>\n </button>\n <h5 class=\"a-h5\">{{ layer.title ?? ('@pry.widget.map.layer' | i18n: { index: i + 1 }) }}</h5>\n </div>\n <button\n class=\"o-layer-settings__delete-layer a-btn--icon-only a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteLayer' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayer(i, layer, group)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n <div *ngIf=\"layerSettingsExpandedState[layer.title!]\" class=\"o-layer-settings__layer-content\">\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n\n <fieldset>\n <legend class=\"u-visually-hidden\">\n {{ '@pry.widget.map.layerOptions' | i18n: { index: i + 1 } }}\n </legend>\n <div class=\"m-form-label-field\">\n <pry-edit-input\n label=\"@pry.widget.map.layerTitle\"\n editButtonTooltip=\"@pry.widget.map.layerSettings.editLayerTitle\"\n (validated)=\"changeTitle($event, layer, group)\"\n [ngModel]=\"layer.title\"\n ></pry-edit-input>\n </div>\n <div class=\"m-form-label-field\" *ngIf=\"!['geoserver', 'auto'].includes(layer.type)\">\n <label class=\"a-label\" for=\"map_layerType\">{{\n '@pry.widget.map.layerType.title' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [items]=\"layerTypes\"\n [ngModel]=\"layer.type\"\n i18nPrefix=\"@pry.widget.map.layerType.\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"['geoserver', 'wms'].includes(layer.type)\">\n <ng-container *ngIf=\"getAsWmsType(layer) as wmslayer\">\n <label class=\"a-label\" for=\"map_layerStyle\">{{\n '@pry.widget.map.layerStyle' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerStyle($event, layer)\"\n [items]=\"layerStyleOptions(layer)\"\n [ngModel]=\"getStyle(layer)\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"map_layerStyle\"\n ></pry-select>\n </ng-container>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeFit($event, layer)\" [ngModel]=\"layer.fit\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n </div>\n\n <div\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n \"\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [items]=\"usedClasses$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n </fieldset>\n </div>\n\n <fieldset\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n <ng-container\n *ngIf=\"\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async as fields\n \"\n >\n <div\n *ngIf=\"\n [\n 'heatmap',\n 'bubble',\n 'marker',\n 'point',\n 'line',\n 'polygon',\n 'multi-line',\n 'multi-polygon'\n ].indexOf(layer.type) >= 0\n \"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n ></pry-select>\n </div>\n </div>\n\n <div *ngIf=\"['heatmap', 'bubble'].indexOf(layer.type) >= 0\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n </fieldset>\n\n <fieldset\n *ngIf=\"\n layer.type === 'wms' ||\n layer.type === 'geoserver' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n \"\n >\n <ng-container *ngIf=\"layer.type !== 'geoserver'\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n </ng-container>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{\n '@pry.widget.map.wms.paramLayer' | i18n\n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{\n '@pry.widget.map.wms.matrixSet' | i18n\n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'geoserver'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <pry-checkbox\n (ngModelChange)=\"changeParamTiled($event, layer)\"\n [ngModel]=\"layer?.paramTiled ?? false\"\n >\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n </fieldset>\n\n <fieldset *ngIf=\"layer.type === 'marker'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n <div *ngIf=\"layer.clustered\">\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n </fieldset>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.slide ?? false\">\n <label class=\"a-label\" for=\"slide_select\">{{ '@pry.widget.map.slide.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSlide($event, layer)\"\n [items]=\"slides\"\n [ngModel]=\"layer.slide ?? 'all'\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"slide_select\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.attributions\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </pry-settings>\n </pry-widget-header>\n\n <div\n class=\"m-btn-group -map-selection-choice -vertical\"\n [class.-with-header]=\"displayHeader$ | async\"\n [class.-closed]=\"!(actionMenuOpen$ | async)\"\n >\n <div class=\"-vertical\">\n <ng-container *ngFor=\"let action of basicActions$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip a-tooltip--{{ action }}\"\n (click)=\"changeSelection(action)\"\n [attr.data-tooltip]=\"'@pry.widget.map.' + action | i18n\"\n data-tooltip-position=\"right\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n </ng-container>\n </div>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip -map-toggle\"\n id=\"open_menu\"\n [attr.aria-expanded]=\"actionMenuOpen$ | async\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n (click)=\"toggleMenu()\"\n >\n <pry-icon\n [iconSvg]=\"(actionMenuOpen$ | async) ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"24\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.open' | i18n }}</span>\n </button>\n </div>\n\n <div class=\"m-btn-group -map-selection-choice -map-export\" [class.-with-header]=\"displayHeader$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [attr.data-tooltip]=\"'@pry.widget.map.export' | i18n\"\n data-tooltip-position=\"right\"\n (click)=\"export()\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n <div\n class=\"ol-control m-layer-switcher m-map-layer-action\"\n *ngIf=\"((layers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"layersTop$ | async\"\n >\n <button\n class=\"m-map-layer-action__toggle\"\n [class.a-tooltip]=\"!this.layersTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.layersTabOpen\"\n (click)=\"toggleLayersWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.selectLayers' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"18\" [height]=\"18\"></pry-icon>\n </button>\n <div class=\"m-map-layer-action__container m-map-layer-action__container--layers\" [class.-hidden]=\"!layersTabOpen\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.layerSettings.selectLayers' | i18n }}</h4>\n <div class=\"m-layer-switcher__content\">\n <ng-container *ngFor=\"let group of layerGroups$ | async\">\n <ng-container *ngIf=\"isGroupUsedByWidgetLayers(group)\">\n <div class=\"m-map-layer-action__title m-layer-switcher__group-title\">\n <h5 class=\"a-h5\">\n {{ group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name }}\n </h5>\n </div>\n <ng-container *ngIf=\"!group.singleLayer; else singleLayer\">\n <ng-container *ngFor=\"let layer of optionsCopy.layers; let index = index\">\n <ng-container *ngIf=\"layer.group === group.name\">\n <div class=\"m-map-layer-action__title m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n <pry-checkbox\n [ngModel]=\"isLayerVisible(layer, group)\"\n (change)=\"changeVisibility(group, layer)\"\n id=\"checkbox-layer-{{ index }}\"\n ></pry-checkbox>\n <label class=\"a-label\" for=\"checkbox-layer-{{ index }}\">\n {{ layer.title ?? ('@pry.widget.map.missingTitle' | i18n) }}\n </label>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #singleLayer>\n <div class=\"m-layer-switcher--radios\">\n <div class=\"m-map-layer-action__title m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n id=\"radio-no-layer\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"radio-no-layer\">{{\n '@pry.widget.map.layerSettings.noLayer' | i18n\n }}</label>\n </div>\n <ng-container *ngFor=\"let layer of optionsCopy.layers; let index = index\">\n <ng-container *ngIf=\"layer.group === group.name\">\n <div class=\"m-map-layer-action__title m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n [id]=\"'radio-layer-' + index\"\n [ngModel]=\"group.visibleLayers[0]\"\n [value]=\"layer.title\"\n (change)=\"changeVisibility(group, layer)\"\n />\n <label class=\"a-label\" for=\"radio-layer-{{ index }}\">{{\n layer.title ?? ('@pry.widget.map.missingTitle' | i18n)\n }}</label>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div\n class=\"ol-control m-map-layer-action m-layer-legend\"\n *ngIf=\"((legendLayers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"legendTop$ | async\"\n >\n <button\n class=\"m-map-layer-action__toggle\"\n [class.a-tooltip]=\"!this.legendTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.legendTabOpen\"\n (click)=\"toggleLegendWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.legends' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"legend\" [width]=\"18\" [height]=\"15\"></pry-icon>\n </button>\n <div class=\"m-map-layer-action__container\" [class.-hidden]=\"!legendTabOpen\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.legendsTitle' | i18n }}</h4>\n <ng-container *ngFor=\"let geoLayer of legendLayers$ | async; let index = index\">\n <div class=\"m-map-layer-action__title m-layer-legend__title\" (click)=\"toggleLegend(index)\">\n <pry-icon\n *ngIf=\"isLayerRendered(geoLayer) && !!geoLayer.title\"\n class=\"m-layer-legend__dropdown-icon\"\n [iconSvg]=\"legendTab === index ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"12\"\n ></pry-icon>\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n <pry-icon\n *ngIf=\"!isLayerRendered(geoLayer)\"\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerLoadError' | i18n\"\n [iconSvg]=\"'close'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n </div>\n <div\n class=\"m-map-layer-action__image\"\n [class.-hidden]=\"!legendTabOpen || legendTab !== index || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n <ng-container *ngIf=\"geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) } as url\">\n <img\n [src]=\"url | getSecuredImage | async\"\n [alt]=\"'@pry.widget.map.legend' | i18n: { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n </ng-container>\n <ng-container *ngIf=\"!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })\">\n <p class=\"m-map-layer-action__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div class=\"m-map-slide-legend -left\" *ngIf=\"leftSlideLayers.length > 0\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n <div *ngFor=\"let layer of leftSlideLayers\">\n {{ layer.get('title') }}\n </div>\n </div>\n\n <div class=\"m-map-slide-legend -right\" *ngIf=\"rightSlideLayers.length > 0\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n <div *ngFor=\"let layer of rightSlideLayers\">\n {{ layer.get('title') }}\n </div>\n </div>\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"0.01\"\n value=\"50\"\n #sliderElement\n class=\"o-map-slider\"\n [class.-hidden]=\"!(hasSlideLayer$ | async)\"\n (input)=\"triggerLayerRender()\"\n />\n </div>\n </div>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ tooltipManager.tooltipIndex + 1 }} / {{ tooltipManager.tooltipNumber }}</p>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(-1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(-1)\"\n >\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(1)\"\n >\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipManager.clearTooltip(true)\">\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i6.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "component", type: i2.PryEditInputComponent, selector: "pry-edit-input", inputs: ["label", "editButtonTooltip", "confirmButtonTooltip"], outputs: ["validated"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i8.PryWidgetMapCssComponent, selector: "pry-widget-map-css" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.GetSecuredImagePipe, name: "getSecuredImage" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.GeometryFieldsForPipe, name: "geometryFieldsFor" }, { kind: "pipe", type: i10.WidgetMapLegendUrlPipe, name: "legendUrl" }] }); }
|
|
1162
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: WidgetMapComponent, selector: "pry-widget-map", viewQueries: [{ propertyName: "mapRef", first: true, predicate: ["mapRef"], descendants: true }, { propertyName: "popup", first: true, predicate: ["popup"], descendants: true }, { propertyName: "popupContent", first: true, predicate: ["popupContent"], descendants: true, read: ViewContainerRef }, { propertyName: "exportTypeTemplate", first: true, predicate: ["exportTypeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "sliderElement", first: true, predicate: ["sliderElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }} :</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.style === STYLE_FROM_URL\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\n\n <div class=\"o-layer-settings\" cdkDropListGroup cdkDragBoundary>\n <h4 class=\"a-label\">{{ '@pry.widget.map.layerSettings.title' | i18n }}</h4>\n <div class=\"u-display-flex -justify-center\">\n <button class=\"a-btn a-btn--primary\" (click)=\"addLayerGroup()\" type=\"button\">\n {{ '@pry.widget.map.layerSettings.addLayerGroup' | i18n }}\n </button>\n </div>\n <ng-container *ngFor=\"let group of layerGroups$ | async; let groupIdx = index\">\n <div *ngIf=\"isGroupUsedByWidgetLayers(group)\" class=\"o-layer-settings__group\">\n <div class=\"m-form-label-field o-layer-settings__group-title\">\n <label class=\"a-label\" for=\"map_layerGroupTitle-{{ groupIdx }}\">\n {{ '@pry.widget.map.layerSettings.layerGroupName' | i18n }}<span class=\"-obligatory-red\">*</span\n >{{ '@pry.widget.map.layerSettings.optionalColon' | i18n }}\n </label>\n <div class=\"u-display-flex\">\n <pry-edit-input\n editButtonTooltip=\"@pry.widget.map.layerSettings.editGroupName\"\n (validated)=\"updateLayerGroup(group.name, $event, group.singleLayer, group.visibleLayers)\"\n [ngModel]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n ></pry-edit-input>\n <button\n *ngIf=\"group.name !== DEFAULT_LAYER_GROUP\"\n class=\"a-btn--icon-only a-tooltip o-layer-settings__delete-group\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteGroup' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayerGroup(group.name)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n </div>\n <div class=\"m-form-radio-group\">\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"multiselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event)\"\n [value]=\"false\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"multiselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.multipleLayer' | i18n\n }}</label>\n </div>\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"monoselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event, group.visibleLayers)\"\n [value]=\"true\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"monoselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.singleLayer' | i18n\n }}</label>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <div class=\"u-display-flex -align-center\">\n <button (click)=\"addLayer(group)\" class=\"a-btn -link-like\" type=\"button\">\n + {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n <button (click)=\"toggleExpandAll(group)\" class=\"a-btn -link-like\" type=\"button\">\n {{\n layerSettingsExpandedState[group.name]\n ? ('@pry.widget.map.layerSettings.foldAll' | i18n)\n : ('@pry.widget.map.layerSettings.unfoldAll' | i18n)\n }}\n </button>\n </div>\n <div\n cdkDropList\n class=\"o-layer-settings__layers\"\n (cdkDropListDropped)=\"drop($event, group)\"\n [attr.data-layer-group]=\"group.name\"\n >\n <ng-container *ngFor=\"let layer of optionsCopy?.layers; let i = index\">\n <div\n *ngIf=\"layer.group === group.name\"\n class=\"o-layer-settings__layer-wrapper\"\n cdkDrag\n [cdkDragData]=\"layer\"\n [cdkDragDisabled]=\"layerSettingsExpandedState[layer.title!]\"\n >\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"o-layer-settings__layer-header\">\n <div class=\"u-display-flex -align-center\">\n <pry-icon\n [class.-disabled]=\"layerSettingsExpandedState[layer.title!]\"\n class=\"drag-handle\"\n [height]=\"16\"\n [width]=\"16\"\n iconSvg=\"drag_indicator\"\n ></pry-icon>\n <button\n class=\"a-btn--icon-only unfold-layer\"\n (click)=\"toggleLayerExpand(layer, group)\"\n type=\"button\"\n >\n <pry-icon\n [height]=\"5\"\n [width]=\"9\"\n [iconSvg]=\"layerSettingsExpandedState[layer.title!] ? 'chevron_top' : 'chevron_bottom'\"\n ></pry-icon>\n </button>\n <h5 class=\"a-h5\">{{ layer.title ?? ('@pry.widget.map.layer' | i18n: { index: i + 1 }) }}</h5>\n </div>\n <button\n class=\"o-layer-settings__delete-layer a-btn--icon-only a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteLayer' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayer(i, layer, group)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n <div *ngIf=\"layerSettingsExpandedState[layer.title!]\" class=\"o-layer-settings__layer-content\">\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n\n <fieldset>\n <legend class=\"u-visually-hidden\">\n {{ '@pry.widget.map.layerOptions' | i18n: { index: i + 1 } }}\n </legend>\n <div class=\"m-form-label-field\">\n <pry-edit-input\n label=\"@pry.widget.map.layerTitle\"\n editButtonTooltip=\"@pry.widget.map.layerSettings.editLayerTitle\"\n (validated)=\"changeTitle($event, layer, group)\"\n [ngModel]=\"layer.title\"\n ></pry-edit-input>\n </div>\n <div class=\"m-form-label-field\" *ngIf=\"!['geoserver', 'auto'].includes(layer.type)\">\n <label class=\"a-label\" for=\"map_layerType\">{{\n '@pry.widget.map.layerType.title' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [items]=\"layerTypes\"\n [ngModel]=\"layer.type\"\n i18nPrefix=\"@pry.widget.map.layerType.\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"['geoserver', 'wms'].includes(layer.type)\">\n <ng-container *ngIf=\"getAsWmsType(layer) as wmslayer\">\n <label class=\"a-label\" for=\"map_layerStyle\">{{\n '@pry.widget.map.layerStyle' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerStyle($event, layer)\"\n [items]=\"layerStyleOptions(layer)\"\n [ngModel]=\"getStyle(layer)\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"map_layerStyle\"\n ></pry-select>\n </ng-container>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeFit($event, layer)\" [ngModel]=\"layer.fit\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n </div>\n\n <div\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n \"\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [items]=\"usedClasses$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n </fieldset>\n </div>\n\n <fieldset\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n <ng-container\n *ngIf=\"\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async as fields\n \"\n >\n <div\n *ngIf=\"\n [\n 'heatmap',\n 'bubble',\n 'marker',\n 'point',\n 'line',\n 'polygon',\n 'multi-line',\n 'multi-polygon'\n ].indexOf(layer.type) >= 0\n \"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n ></pry-select>\n </div>\n </div>\n\n <div *ngIf=\"['heatmap', 'bubble'].indexOf(layer.type) >= 0\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n </fieldset>\n\n <fieldset\n *ngIf=\"\n layer.type === 'wms' ||\n layer.type === 'geoserver' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n \"\n >\n <ng-container *ngIf=\"layer.type !== 'geoserver'\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n </ng-container>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{\n '@pry.widget.map.wms.paramLayer' | i18n\n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{\n '@pry.widget.map.wms.matrixSet' | i18n\n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'geoserver'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <pry-checkbox\n (ngModelChange)=\"changeParamTiled($event, layer)\"\n [ngModel]=\"layer?.paramTiled ?? false\"\n >\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n </fieldset>\n\n <fieldset *ngIf=\"layer.type === 'marker'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n <div *ngIf=\"layer.clustered\">\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n </fieldset>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.slide ?? false\">\n <label class=\"a-label\" for=\"slide_select\">{{ '@pry.widget.map.slide.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSlide($event, layer)\"\n [items]=\"slides\"\n [ngModel]=\"layer.slide ?? 'all'\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"slide_select\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.attributions\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </pry-settings>\n </pry-widget-header>\n\n <div\n class=\"m-btn-group -map-selection-choice -vertical\"\n [class.-with-header]=\"displayHeader$ | async\"\n [class.-closed]=\"!(actionMenuOpen$ | async)\"\n >\n <div class=\"-vertical\">\n <ng-container *ngFor=\"let action of basicActions$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip a-tooltip--{{ action }}\"\n (click)=\"changeSelection(action)\"\n [attr.data-tooltip]=\"'@pry.widget.map.' + action | i18n\"\n data-tooltip-position=\"right\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n </ng-container>\n </div>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip -map-toggle\"\n id=\"open_menu\"\n [attr.aria-expanded]=\"actionMenuOpen$ | async\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n (click)=\"toggleMenu()\"\n >\n <pry-icon\n [iconSvg]=\"(actionMenuOpen$ | async) ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"24\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.open' | i18n }}</span>\n </button>\n </div>\n\n <div class=\"m-btn-group -map-selection-choice -map-export\" [class.-with-header]=\"displayHeader$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [attr.data-tooltip]=\"'@pry.widget.map.export' | i18n\"\n data-tooltip-position=\"right\"\n (click)=\"export()\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n @if ((layers$ | async)?.length) {\n <div class=\"ol-control m-map-action\" [style.top.px]=\"layersTop$ | async\">\n <button\n class=\"m-map-action__button\"\n [class.a-tooltip]=\"!this.layersTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.layersTabOpen\"\n (click)=\"toggleLayersWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.selectLayers' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"18\" [height]=\"18\"></pry-icon>\n </button>\n </div>\n <div\n class=\"m-map-pop-in -max-width-220\"\n [class.-hidden]=\"!layersTabOpen\"\n [style.top.px]=\"layersTop$ | async\"\n >\n <h4 class=\"a-h4\">{{ '@pry.widget.map.layerSettings.selectLayers' | i18n }}</h4>\n <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (group of layerGroups$ | async; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div class=\"m-map-pop-in__title m-map-pop-in__group-title\">\n <h5 class=\"a-h5\">\n {{ group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name }}\n </h5>\n </div>\n @if (group.singleLayer) {\n <div class=\"m-map-pop-in__radios\">\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n id=\"radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"radio-layer-group-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.noLayer' | i18n\n }}</label>\n </div>\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n id=\"radio-{{ group.name }}-layer-{{ index }}\"\n [ngModel]=\"group.visibleLayers[0]\"\n [value]=\"layer.title\"\n (change)=\"changeVisibility(group, layer)\"\n />\n <label class=\"a-label\" for=\"radio-{{ group.name }}-layer-{{ index }}\">{{\n layer.title ?? ('@pry.widget.map.missingTitle' | i18n)\n }}</label>\n </div>\n }\n }\n </div>\n } @else {\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <pry-checkbox\n [ngModel]=\"isLayerVisible(layer, group)\"\n (change)=\"changeVisibility(group, layer)\"\n id=\"checkbox-layer-{{ index }}\"\n ></pry-checkbox>\n <label class=\"a-label\" for=\"checkbox-layer-{{ index }}\">\n {{ layer.title ?? ('@pry.widget.map.missingTitle' | i18n) }}\n </label>\n </div>\n }\n }\n }\n }\n }\n </div>\n </div>\n }\n @if ((legendLayers$ | async)?.length) {\n <div class=\"ol-control m-map-action\" [style.top.px]=\"legendTop$ | async\">\n <button\n [class.a-tooltip]=\"!this.legendTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.legendTabOpen\"\n class=\"m-map-action__button\"\n (click)=\"toggleLegendWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.legends' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"legend\" [width]=\"18\" [height]=\"15\"></pry-icon>\n </button>\n </div>\n <div class=\"m-map-pop-in\" [class.-hidden]=\"!legendTabOpen\" [style.top.px]=\"legendTop$ | async\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.legendsTitle' | i18n }}</h4>\n <ng-container *ngFor=\"let geoLayer of legendLayers$ | async; let index = index\">\n <div *ngIf=\"isLayerVisible(geoLayer)\" class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n <pry-icon\n *ngIf=\"isLayerRendered(geoLayer) && !!geoLayer.title\"\n class=\"m-map-pop-in__dropdown-icon\"\n [iconSvg]=\"legendTabClosed[index] ? 'chevron_bottom' : 'chevron_top'\"\n [width]=\"12\"\n [height]=\"12\"\n ></pry-icon>\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n <pry-icon\n *ngIf=\"!isLayerRendered(geoLayer)\"\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerLoadError' | i18n\"\n [iconSvg]=\"'close'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n </div>\n <div\n class=\"m-map-pop-in__image\"\n [class.-hidden]=\"!legendTabOpen || legendTabClosed[index] || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n <ng-container *ngIf=\"geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) } as url\">\n <img\n [src]=\"url | getSecuredImage | async\"\n [alt]=\"'@pry.widget.map.legend' | i18n: { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n </ng-container>\n <ng-container *ngIf=\"!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })\">\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n </ng-container>\n </div>\n </ng-container>\n </div>\n }\n\n @if (leftSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -left\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of leftSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n @if (rightSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -left\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of rightSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"0.01\"\n value=\"50\"\n #sliderElement\n class=\"o-map-slider\"\n [class.-hidden]=\"!(hasSlideLayer$ | async)\"\n (input)=\"triggerLayerRender()\"\n />\n </div>\n </div>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ tooltipManager.tooltipIndex + 1 }} / {{ tooltipManager.tooltipNumber }}</p>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(-1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(-1)\"\n >\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(1)\"\n >\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipManager.clearTooltip(true)\">\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SettingsComponent, selector: "pry-settings", inputs: ["widgetIndex", "isDisable", "headerPresent", "open$", "header"], outputs: ["triggerClick", "saveTriggered", "changeTitle"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.PrySelectComponent, selector: "pry-select", inputs: ["items", "clearable", "multiple", "closeOnSelect", "placeholder", "isForm", "required", "name", "readonly", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i6.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "component", type: i2.PryEditInputComponent, selector: "pry-edit-input", inputs: ["label", "editButtonTooltip", "confirmButtonTooltip"], outputs: ["validated"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i7.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i8.PryWidgetMapCssComponent, selector: "pry-widget-map-css" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.GetSecuredImagePipe, name: "getSecuredImage" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i9.GeometryFieldsForPipe, name: "geometryFieldsFor" }, { kind: "pipe", type: i10.WidgetMapLegendUrlPipe, name: "legendUrl" }] }); }
|
|
1153
1163
|
}
|
|
1154
1164
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: WidgetMapComponent, decorators: [{
|
|
1155
1165
|
type: Component,
|
|
1156
|
-
args: [{ selector: 'pry-widget-map', template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }} :</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.style === STYLE_FROM_URL\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\n\n <div class=\"o-layer-settings\" cdkDropListGroup cdkDragBoundary>\n <h4 class=\"a-label\">{{ '@pry.widget.map.layerSettings.title' | i18n }}</h4>\n <div class=\"u-display-flex -justify-center\">\n <button class=\"a-btn a-btn--primary\" (click)=\"addLayerGroup()\" type=\"button\">\n {{ '@pry.widget.map.layerSettings.addLayerGroup' | i18n }}\n </button>\n </div>\n <ng-container *ngFor=\"let group of layerGroups$ | async; let groupIdx = index\">\n <div *ngIf=\"isGroupUsedByWidgetLayers(group)\" class=\"o-layer-settings__group\">\n <div class=\"m-form-label-field o-layer-settings__group-title\">\n <label class=\"a-label\" for=\"map_layerGroupTitle-{{ groupIdx }}\">\n {{ '@pry.widget.map.layerSettings.layerGroupName' | i18n }}<span class=\"-obligatory-red\">*</span\n >{{ '@pry.widget.map.layerSettings.optionalColon' | i18n }}\n </label>\n <div class=\"u-display-flex\">\n <pry-edit-input\n editButtonTooltip=\"@pry.widget.map.layerSettings.editGroupName\"\n (validated)=\"updateLayerGroup(group.name, $event, group.singleLayer, group.visibleLayers)\"\n [ngModel]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n ></pry-edit-input>\n <button\n *ngIf=\"group.name !== DEFAULT_LAYER_GROUP\"\n class=\"a-btn--icon-only a-tooltip o-layer-settings__delete-group\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteGroup' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayerGroup(group.name)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n </div>\n <div class=\"m-form-radio-group\">\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"multiselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event)\"\n [value]=\"false\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"multiselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.multipleLayer' | i18n\n }}</label>\n </div>\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"monoselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event, group.visibleLayers)\"\n [value]=\"true\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"monoselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.singleLayer' | i18n\n }}</label>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <div class=\"u-display-flex -align-center\">\n <button (click)=\"addLayer(group)\" class=\"a-btn -link-like\" type=\"button\">\n + {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n <button (click)=\"toggleExpandAll(group)\" class=\"a-btn -link-like\" type=\"button\">\n {{\n layerSettingsExpandedState[group.name]\n ? ('@pry.widget.map.layerSettings.foldAll' | i18n)\n : ('@pry.widget.map.layerSettings.unfoldAll' | i18n)\n }}\n </button>\n </div>\n <div\n cdkDropList\n class=\"o-layer-settings__layers\"\n (cdkDropListDropped)=\"drop($event, group)\"\n [attr.data-layer-group]=\"group.name\"\n >\n <ng-container *ngFor=\"let layer of optionsCopy?.layers; let i = index\">\n <div\n *ngIf=\"layer.group === group.name\"\n class=\"o-layer-settings__layer-wrapper\"\n cdkDrag\n [cdkDragData]=\"layer\"\n [cdkDragDisabled]=\"layerSettingsExpandedState[layer.title!]\"\n >\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"o-layer-settings__layer-header\">\n <div class=\"u-display-flex -align-center\">\n <pry-icon\n [class.-disabled]=\"layerSettingsExpandedState[layer.title!]\"\n class=\"drag-handle\"\n [height]=\"16\"\n [width]=\"16\"\n iconSvg=\"drag_indicator\"\n ></pry-icon>\n <button\n class=\"a-btn--icon-only unfold-layer\"\n (click)=\"toggleLayerExpand(layer, group)\"\n type=\"button\"\n >\n <pry-icon\n [height]=\"5\"\n [width]=\"9\"\n [iconSvg]=\"layerSettingsExpandedState[layer.title!] ? 'chevron_top' : 'chevron_bottom'\"\n ></pry-icon>\n </button>\n <h5 class=\"a-h5\">{{ layer.title ?? ('@pry.widget.map.layer' | i18n: { index: i + 1 }) }}</h5>\n </div>\n <button\n class=\"o-layer-settings__delete-layer a-btn--icon-only a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteLayer' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayer(i, layer, group)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n <div *ngIf=\"layerSettingsExpandedState[layer.title!]\" class=\"o-layer-settings__layer-content\">\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n\n <fieldset>\n <legend class=\"u-visually-hidden\">\n {{ '@pry.widget.map.layerOptions' | i18n: { index: i + 1 } }}\n </legend>\n <div class=\"m-form-label-field\">\n <pry-edit-input\n label=\"@pry.widget.map.layerTitle\"\n editButtonTooltip=\"@pry.widget.map.layerSettings.editLayerTitle\"\n (validated)=\"changeTitle($event, layer, group)\"\n [ngModel]=\"layer.title\"\n ></pry-edit-input>\n </div>\n <div class=\"m-form-label-field\" *ngIf=\"!['geoserver', 'auto'].includes(layer.type)\">\n <label class=\"a-label\" for=\"map_layerType\">{{\n '@pry.widget.map.layerType.title' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [items]=\"layerTypes\"\n [ngModel]=\"layer.type\"\n i18nPrefix=\"@pry.widget.map.layerType.\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"['geoserver', 'wms'].includes(layer.type)\">\n <ng-container *ngIf=\"getAsWmsType(layer) as wmslayer\">\n <label class=\"a-label\" for=\"map_layerStyle\">{{\n '@pry.widget.map.layerStyle' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerStyle($event, layer)\"\n [items]=\"layerStyleOptions(layer)\"\n [ngModel]=\"getStyle(layer)\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"map_layerStyle\"\n ></pry-select>\n </ng-container>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeFit($event, layer)\" [ngModel]=\"layer.fit\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n </div>\n\n <div\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n \"\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [items]=\"usedClasses$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n </fieldset>\n </div>\n\n <fieldset\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n <ng-container\n *ngIf=\"\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async as fields\n \"\n >\n <div\n *ngIf=\"\n [\n 'heatmap',\n 'bubble',\n 'marker',\n 'point',\n 'line',\n 'polygon',\n 'multi-line',\n 'multi-polygon'\n ].indexOf(layer.type) >= 0\n \"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n ></pry-select>\n </div>\n </div>\n\n <div *ngIf=\"['heatmap', 'bubble'].indexOf(layer.type) >= 0\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n </fieldset>\n\n <fieldset\n *ngIf=\"\n layer.type === 'wms' ||\n layer.type === 'geoserver' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n \"\n >\n <ng-container *ngIf=\"layer.type !== 'geoserver'\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n </ng-container>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{\n '@pry.widget.map.wms.paramLayer' | i18n\n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{\n '@pry.widget.map.wms.matrixSet' | i18n\n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'geoserver'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <pry-checkbox\n (ngModelChange)=\"changeParamTiled($event, layer)\"\n [ngModel]=\"layer?.paramTiled ?? false\"\n >\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n </fieldset>\n\n <fieldset *ngIf=\"layer.type === 'marker'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n <div *ngIf=\"layer.clustered\">\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n </fieldset>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.slide ?? false\">\n <label class=\"a-label\" for=\"slide_select\">{{ '@pry.widget.map.slide.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSlide($event, layer)\"\n [items]=\"slides\"\n [ngModel]=\"layer.slide ?? 'all'\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"slide_select\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.attributions\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </pry-settings>\n </pry-widget-header>\n\n <div\n class=\"m-btn-group -map-selection-choice -vertical\"\n [class.-with-header]=\"displayHeader$ | async\"\n [class.-closed]=\"!(actionMenuOpen$ | async)\"\n >\n <div class=\"-vertical\">\n <ng-container *ngFor=\"let action of basicActions$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip a-tooltip--{{ action }}\"\n (click)=\"changeSelection(action)\"\n [attr.data-tooltip]=\"'@pry.widget.map.' + action | i18n\"\n data-tooltip-position=\"right\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n </ng-container>\n </div>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip -map-toggle\"\n id=\"open_menu\"\n [attr.aria-expanded]=\"actionMenuOpen$ | async\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n (click)=\"toggleMenu()\"\n >\n <pry-icon\n [iconSvg]=\"(actionMenuOpen$ | async) ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"24\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.open' | i18n }}</span>\n </button>\n </div>\n\n <div class=\"m-btn-group -map-selection-choice -map-export\" [class.-with-header]=\"displayHeader$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [attr.data-tooltip]=\"'@pry.widget.map.export' | i18n\"\n data-tooltip-position=\"right\"\n (click)=\"export()\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n <div\n class=\"ol-control m-layer-switcher m-map-layer-action\"\n *ngIf=\"((layers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"layersTop$ | async\"\n >\n <button\n class=\"m-map-layer-action__toggle\"\n [class.a-tooltip]=\"!this.layersTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.layersTabOpen\"\n (click)=\"toggleLayersWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.selectLayers' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"18\" [height]=\"18\"></pry-icon>\n </button>\n <div class=\"m-map-layer-action__container m-map-layer-action__container--layers\" [class.-hidden]=\"!layersTabOpen\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.layerSettings.selectLayers' | i18n }}</h4>\n <div class=\"m-layer-switcher__content\">\n <ng-container *ngFor=\"let group of layerGroups$ | async\">\n <ng-container *ngIf=\"isGroupUsedByWidgetLayers(group)\">\n <div class=\"m-map-layer-action__title m-layer-switcher__group-title\">\n <h5 class=\"a-h5\">\n {{ group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name }}\n </h5>\n </div>\n <ng-container *ngIf=\"!group.singleLayer; else singleLayer\">\n <ng-container *ngFor=\"let layer of optionsCopy.layers; let index = index\">\n <ng-container *ngIf=\"layer.group === group.name\">\n <div class=\"m-map-layer-action__title m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n <pry-checkbox\n [ngModel]=\"isLayerVisible(layer, group)\"\n (change)=\"changeVisibility(group, layer)\"\n id=\"checkbox-layer-{{ index }}\"\n ></pry-checkbox>\n <label class=\"a-label\" for=\"checkbox-layer-{{ index }}\">\n {{ layer.title ?? ('@pry.widget.map.missingTitle' | i18n) }}\n </label>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-template #singleLayer>\n <div class=\"m-layer-switcher--radios\">\n <div class=\"m-map-layer-action__title m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n id=\"radio-no-layer\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"radio-no-layer\">{{\n '@pry.widget.map.layerSettings.noLayer' | i18n\n }}</label>\n </div>\n <ng-container *ngFor=\"let layer of optionsCopy.layers; let index = index\">\n <ng-container *ngIf=\"layer.group === group.name\">\n <div class=\"m-map-layer-action__title m-layer-switcher__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n [id]=\"'radio-layer-' + index\"\n [ngModel]=\"group.visibleLayers[0]\"\n [value]=\"layer.title\"\n (change)=\"changeVisibility(group, layer)\"\n />\n <label class=\"a-label\" for=\"radio-layer-{{ index }}\">{{\n layer.title ?? ('@pry.widget.map.missingTitle' | i18n)\n }}</label>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div\n class=\"ol-control m-map-layer-action m-layer-legend\"\n *ngIf=\"((legendLayers$ | async)?.length ?? 0) > 0\"\n [style.top.px]=\"legendTop$ | async\"\n >\n <button\n class=\"m-map-layer-action__toggle\"\n [class.a-tooltip]=\"!this.legendTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.legendTabOpen\"\n (click)=\"toggleLegendWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.legends' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"legend\" [width]=\"18\" [height]=\"15\"></pry-icon>\n </button>\n <div class=\"m-map-layer-action__container\" [class.-hidden]=\"!legendTabOpen\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.legendsTitle' | i18n }}</h4>\n <ng-container *ngFor=\"let geoLayer of legendLayers$ | async; let index = index\">\n <div class=\"m-map-layer-action__title m-layer-legend__title\" (click)=\"toggleLegend(index)\">\n <pry-icon\n *ngIf=\"isLayerRendered(geoLayer) && !!geoLayer.title\"\n class=\"m-layer-legend__dropdown-icon\"\n [iconSvg]=\"legendTab === index ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"12\"\n ></pry-icon>\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n <pry-icon\n *ngIf=\"!isLayerRendered(geoLayer)\"\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerLoadError' | i18n\"\n [iconSvg]=\"'close'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n </div>\n <div\n class=\"m-map-layer-action__image\"\n [class.-hidden]=\"!legendTabOpen || legendTab !== index || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n <ng-container *ngIf=\"geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) } as url\">\n <img\n [src]=\"url | getSecuredImage | async\"\n [alt]=\"'@pry.widget.map.legend' | i18n: { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n </ng-container>\n <ng-container *ngIf=\"!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })\">\n <p class=\"m-map-layer-action__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div class=\"m-map-slide-legend -left\" *ngIf=\"leftSlideLayers.length > 0\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n <div *ngFor=\"let layer of leftSlideLayers\">\n {{ layer.get('title') }}\n </div>\n </div>\n\n <div class=\"m-map-slide-legend -right\" *ngIf=\"rightSlideLayers.length > 0\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n <div *ngFor=\"let layer of rightSlideLayers\">\n {{ layer.get('title') }}\n </div>\n </div>\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"0.01\"\n value=\"50\"\n #sliderElement\n class=\"o-map-slider\"\n [class.-hidden]=\"!(hasSlideLayer$ | async)\"\n (input)=\"triggerLayerRender()\"\n />\n </div>\n </div>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ tooltipManager.tooltipIndex + 1 }} / {{ tooltipManager.tooltipNumber }}</p>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(-1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(-1)\"\n >\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(1)\"\n >\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipManager.clearTooltip(true)\">\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n</div>\n" }]
|
|
1166
|
+
args: [{ selector: 'pry-widget-map', template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | async) ?? []\"\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"manifest\"\n (manifestModified)=\"manifestModified.emit($event)\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n #header\n >\n <pry-settings\n (saveTriggered)=\"emitManifest()\"\n (changeTitle)=\"changeWidgetTitle($event)\"\n [headerPresent]=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [header]=\"header\"\n [open$]=\"open$\"\n class=\"o-settings\"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_style\">{{ '@pry.widget.map.style' | i18n }} :</label>\n <pry-select\n (ngModelChange)=\"changeStyle($event)\"\n [items]=\"styles$ | async\"\n [ngModel]=\"optionsCopy.style\"\n bindLabel=\"label\"\n bindValue=\"identifier\"\n id=\"map_style\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.style === STYLE_FROM_URL\">\n <label class=\"a-label\" for=\"style_URL\">{{ '@pry.widget.map.styleUrl' | i18n }}</label>\n <input\n id=\"style_URL\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeStyleURL($event)\"\n [value]=\"optionsCopy.styleURL ?? ''\"\n />\n </div>\n\n <pry-checkbox (ngModelChange)=\"changeAutoLayer($event)\" [ngModel]=\"optionsCopy.automaticLayers ?? false\">\n {{ '@pry.widget.map.autoLayer' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\n\n <div class=\"o-layer-settings\" cdkDropListGroup cdkDragBoundary>\n <h4 class=\"a-label\">{{ '@pry.widget.map.layerSettings.title' | i18n }}</h4>\n <div class=\"u-display-flex -justify-center\">\n <button class=\"a-btn a-btn--primary\" (click)=\"addLayerGroup()\" type=\"button\">\n {{ '@pry.widget.map.layerSettings.addLayerGroup' | i18n }}\n </button>\n </div>\n <ng-container *ngFor=\"let group of layerGroups$ | async; let groupIdx = index\">\n <div *ngIf=\"isGroupUsedByWidgetLayers(group)\" class=\"o-layer-settings__group\">\n <div class=\"m-form-label-field o-layer-settings__group-title\">\n <label class=\"a-label\" for=\"map_layerGroupTitle-{{ groupIdx }}\">\n {{ '@pry.widget.map.layerSettings.layerGroupName' | i18n }}<span class=\"-obligatory-red\">*</span\n >{{ '@pry.widget.map.layerSettings.optionalColon' | i18n }}\n </label>\n <div class=\"u-display-flex\">\n <pry-edit-input\n editButtonTooltip=\"@pry.widget.map.layerSettings.editGroupName\"\n (validated)=\"updateLayerGroup(group.name, $event, group.singleLayer, group.visibleLayers)\"\n [ngModel]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n ></pry-edit-input>\n <button\n *ngIf=\"group.name !== DEFAULT_LAYER_GROUP\"\n class=\"a-btn--icon-only a-tooltip o-layer-settings__delete-group\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteGroup' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayerGroup(group.name)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n </div>\n <div class=\"m-form-radio-group\">\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"multiselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event)\"\n [value]=\"false\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"multiselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.multipleLayer' | i18n\n }}</label>\n </div>\n <div class=\"m-form-radio-group__item\">\n <input\n type=\"radio\"\n id=\"monoselection-{{ groupIdx }}\"\n [ngModel]=\"group.singleLayer\"\n (ngModelChange)=\"updateLayerGroup(group.name, undefined, $event, group.visibleLayers)\"\n [value]=\"true\"\n [name]=\"group.name\"\n />\n <label class=\"a-label\" for=\"monoselection-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.singleLayer' | i18n\n }}</label>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <div class=\"u-display-flex -align-center\">\n <button (click)=\"addLayer(group)\" class=\"a-btn -link-like\" type=\"button\">\n + {{ '@pry.widget.map.addLayer' | i18n }}\n </button>\n </div>\n <button (click)=\"toggleExpandAll(group)\" class=\"a-btn -link-like\" type=\"button\">\n {{\n layerSettingsExpandedState[group.name]\n ? ('@pry.widget.map.layerSettings.foldAll' | i18n)\n : ('@pry.widget.map.layerSettings.unfoldAll' | i18n)\n }}\n </button>\n </div>\n <div\n cdkDropList\n class=\"o-layer-settings__layers\"\n (cdkDropListDropped)=\"drop($event, group)\"\n [attr.data-layer-group]=\"group.name\"\n >\n <ng-container *ngFor=\"let layer of optionsCopy?.layers; let i = index\">\n <div\n *ngIf=\"layer.group === group.name\"\n class=\"o-layer-settings__layer-wrapper\"\n cdkDrag\n [cdkDragData]=\"layer\"\n [cdkDragDisabled]=\"layerSettingsExpandedState[layer.title!]\"\n >\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <div class=\"o-layer-settings__layer-header\">\n <div class=\"u-display-flex -align-center\">\n <pry-icon\n [class.-disabled]=\"layerSettingsExpandedState[layer.title!]\"\n class=\"drag-handle\"\n [height]=\"16\"\n [width]=\"16\"\n iconSvg=\"drag_indicator\"\n ></pry-icon>\n <button\n class=\"a-btn--icon-only unfold-layer\"\n (click)=\"toggleLayerExpand(layer, group)\"\n type=\"button\"\n >\n <pry-icon\n [height]=\"5\"\n [width]=\"9\"\n [iconSvg]=\"layerSettingsExpandedState[layer.title!] ? 'chevron_top' : 'chevron_bottom'\"\n ></pry-icon>\n </button>\n <h5 class=\"a-h5\">{{ layer.title ?? ('@pry.widget.map.layer' | i18n: { index: i + 1 }) }}</h5>\n </div>\n <button\n class=\"o-layer-settings__delete-layer a-btn--icon-only a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerSettings.deleteLayer' | i18n\"\n data-tooltip-position=\"left\"\n (click)=\"deleteLayer(i, layer, group)\"\n >\n <pry-icon [height]=\"16\" [width]=\"16\" iconSvg=\"bin_normal\"></pry-icon>\n </button>\n </div>\n <div *ngIf=\"layerSettingsExpandedState[layer.title!]\" class=\"o-layer-settings__layer-content\">\n <div class=\"o-settings__popup__content__fields__content\">\n <pry-range\n [ngModel]=\"(layer?.opacity ?? 100) + ''\"\n (ngModelChange)=\"changeOpacity(layer, $event)\"\n labelTranslate=\"@pry.widget.map.opacity\"\n min=\"0\"\n max=\"100\"\n ></pry-range>\n\n <fieldset>\n <legend class=\"u-visually-hidden\">\n {{ '@pry.widget.map.layerOptions' | i18n: { index: i + 1 } }}\n </legend>\n <div class=\"m-form-label-field\">\n <pry-edit-input\n label=\"@pry.widget.map.layerTitle\"\n editButtonTooltip=\"@pry.widget.map.layerSettings.editLayerTitle\"\n (validated)=\"changeTitle($event, layer, group)\"\n [ngModel]=\"layer.title\"\n ></pry-edit-input>\n </div>\n <div class=\"m-form-label-field\" *ngIf=\"!['geoserver', 'auto'].includes(layer.type)\">\n <label class=\"a-label\" for=\"map_layerType\">{{\n '@pry.widget.map.layerType.title' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerType($event, i)\"\n [items]=\"layerTypes\"\n [ngModel]=\"layer.type\"\n i18nPrefix=\"@pry.widget.map.layerType.\"\n id=\"map_layerType\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"['geoserver', 'wms'].includes(layer.type)\">\n <ng-container *ngIf=\"getAsWmsType(layer) as wmslayer\">\n <label class=\"a-label\" for=\"map_layerStyle\">{{\n '@pry.widget.map.layerStyle' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLayerStyle($event, layer)\"\n [items]=\"layerStyleOptions(layer)\"\n [ngModel]=\"getStyle(layer)\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"map_layerStyle\"\n ></pry-select>\n </ng-container>\n </div>\n\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeFit($event, layer)\" [ngModel]=\"layer.fit\">\n {{ '@pry.widget.map.fit' | i18n }}\n </pry-checkbox>\n </div>\n\n <div\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile' &&\n layer.type !== 'auto'\n \"\n class=\"m-form-label-field\"\n >\n <label class=\"a-label\" for=\"map_classes\">{{ '@pry.widget.map.classes' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeClasses($event, layer)\"\n [items]=\"usedClasses$ | async\"\n [multiple]=\"true\"\n [ngModel]=\"layer.classes\"\n bindLabel=\"name\"\n bindValue=\"id\"\n id=\"map_classes\"\n ></pry-select>\n </div>\n </fieldset>\n </div>\n\n <fieldset\n *ngIf=\"\n layer.type !== 'relation' &&\n layer.type !== 'wms' &&\n layer.type !== 'wmts' &&\n layer.type !== 'geoserver' &&\n layer.type !== 'featurelayer' &&\n layer.type !== 'vectortile' &&\n layer.type !== 'rastertile'\n \"\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n <ng-container\n *ngIf=\"\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async as fields\n \"\n >\n <div\n *ngIf=\"\n [\n 'heatmap',\n 'bubble',\n 'marker',\n 'point',\n 'line',\n 'polygon',\n 'multi-line',\n 'multi-polygon'\n ].indexOf(layer.type) >= 0\n \"\n >\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_locationAttribute_both\">{{\n '@pry.widget.map.locationAttribute.both' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeLocationAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layer.attribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_locationAttribute_both\"\n ></pry-select>\n </div>\n </div>\n\n <div *ngIf=\"['heatmap', 'bubble'].indexOf(layer.type) >= 0\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_intensityAttribute\">{{\n '@pry.widget.map.intensityAttribute' | i18n\n }}</label>\n <pry-select\n (ngModelChange)=\"changeIntensityAttributes($event, layer)\"\n [items]=\"fields\"\n [ngModel]=\"layerHasIntensity(layer).intensityAttribute\"\n bindLabel=\"name\"\n bindValue=\"name\"\n id=\"map_intensityAttribute\"\n ></pry-select>\n </div>\n </div>\n </ng-container>\n </fieldset>\n\n <fieldset\n *ngIf=\"\n layer.type === 'wms' ||\n layer.type === 'geoserver' ||\n layer.type === 'wmts' ||\n layer.type === 'featurelayer' ||\n layer.type === 'vectortile' ||\n layer.type === 'rastertile'\n \"\n >\n <ng-container *ngIf=\"layer.type !== 'geoserver'\">\n <div class=\"m-form-label-field\">\n <label class=\"a-label\" for=\"map_wms_url\">{{ '@pry.widget.map.wms.url' | i18n }}</label>\n <input\n id=\"map_wms_url\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeUrl($event, layer)\"\n [value]=\"layer.url\"\n />\n </div>\n </ng-container>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_paramLayer\">{{\n '@pry.widget.map.wms.paramLayer' | i18n\n }}</label>\n <input\n id=\"map_wms_paramLayer\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamLayer($event, layer)\"\n [value]=\"layer.paramLayer\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_matrixSet\">{{\n '@pry.widget.map.wms.matrixSet' | i18n\n }}</label>\n <input\n id=\"map_wms_matrixSet\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeMatrixSet($event, layer)\"\n [value]=\"layer.matrixSet\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wmts'\">\n <label class=\"a-label\" for=\"map_wms_style\">{{ '@pry.widget.map.wms.style' | i18n }}</label>\n <input\n id=\"map_wms_style\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeParamStyle($event, layer)\"\n [value]=\"layer.style\"\n />\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"layer.type === 'wms' || layer.type === 'geoserver'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.tile' | i18n }}</legend>\n <pry-checkbox\n (ngModelChange)=\"changeParamTiled($event, layer)\"\n [ngModel]=\"layer?.paramTiled ?? false\"\n >\n {{ '@pry.widget.map.wms.paramTiled' | i18n }}\n </pry-checkbox>\n </div>\n </fieldset>\n\n <fieldset *ngIf=\"layer.type === 'marker'\">\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.clustering' | i18n }}</legend>\n <div class=\"m-form-label-field\">\n <pry-checkbox (ngModelChange)=\"changeClustered(layer, $event)\" [ngModel]=\"layer.clustered\">\n {{ '@pry.widget.map.clustered' | i18n }}\n </pry-checkbox>\n </div>\n <div *ngIf=\"layer.clustered\">\n <pry-range\n [ngModel]=\"layer.clustered\"\n (ngModelChange)=\"changeClusterDistance(layer, $event)\"\n labelTranslate=\"@pry.widget.map.clusterDistance\"\n min=\"1\"\n max=\"500\"\n ></pry-range>\n </div>\n </fieldset>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.slide ?? false\">\n <label class=\"a-label\" for=\"slide_select\">{{ '@pry.widget.map.slide.title' | i18n }}</label>\n <pry-select\n (ngModelChange)=\"changeSlide($event, layer)\"\n [items]=\"slides\"\n [ngModel]=\"layer.slide ?? 'all'\"\n bindLabel=\"label\"\n bindValue=\"id\"\n id=\"slide_select\"\n ></pry-select>\n </div>\n\n <div class=\"m-form-label-field\" *ngIf=\"optionsCopy.attributions\">\n <label class=\"a-label\" for=\"attribution\">{{ '@pry.widget.map.attribution' | i18n }}</label>\n <input\n id=\"attribution\"\n class=\"a-form-field\"\n type=\"text\"\n (input)=\"changeAttribution($event, layer)\"\n [value]=\"layer.attribution ? layer.attribution : ''\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </pry-settings>\n </pry-widget-header>\n\n <div\n class=\"m-btn-group -map-selection-choice -vertical\"\n [class.-with-header]=\"displayHeader$ | async\"\n [class.-closed]=\"!(actionMenuOpen$ | async)\"\n >\n <div class=\"-vertical\">\n <ng-container *ngFor=\"let action of basicActions$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip a-tooltip--{{ action }}\"\n (click)=\"changeSelection(action)\"\n [attr.data-tooltip]=\"'@pry.widget.map.' + action | i18n\"\n data-tooltip-position=\"right\"\n >\n <pry-icon [iconSvg]=\"action\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.' + action | i18n }}</span>\n </button>\n </ng-container>\n </div>\n\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip -map-toggle\"\n id=\"open_menu\"\n [attr.aria-expanded]=\"actionMenuOpen$ | async\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n (click)=\"toggleMenu()\"\n >\n <pry-icon\n [iconSvg]=\"(actionMenuOpen$ | async) ? 'chevron_top' : 'chevron_bottom'\"\n [width]=\"12\"\n [height]=\"24\"\n ></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.open' | i18n }}</span>\n </button>\n </div>\n\n <div class=\"m-btn-group -map-selection-choice -map-export\" [class.-with-header]=\"displayHeader$ | async\">\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only a-tooltip\"\n id=\"export_card\"\n aria-expanded=\"false\"\n aria-controls=\"export_type\"\n aria-haspopup=\"menu\"\n [attr.data-tooltip]=\"'@pry.widget.map.export' | i18n\"\n data-tooltip-position=\"right\"\n (click)=\"export()\"\n >\n <pry-icon iconSvg=\"file_download\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.widget.map.export' | i18n }}</span>\n </button>\n </div>\n\n @if ((layers$ | async)?.length) {\n <div class=\"ol-control m-map-action\" [style.top.px]=\"layersTop$ | async\">\n <button\n class=\"m-map-action__button\"\n [class.a-tooltip]=\"!this.layersTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.layersTabOpen\"\n (click)=\"toggleLayersWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.selectLayers' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"layers\" [width]=\"18\" [height]=\"18\"></pry-icon>\n </button>\n </div>\n <div\n class=\"m-map-pop-in -max-width-220\"\n [class.-hidden]=\"!layersTabOpen\"\n [style.top.px]=\"layersTop$ | async\"\n >\n <h4 class=\"a-h4\">{{ '@pry.widget.map.layerSettings.selectLayers' | i18n }}</h4>\n <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (group of layerGroups$ | async; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div class=\"m-map-pop-in__title m-map-pop-in__group-title\">\n <h5 class=\"a-h5\">\n {{ group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name }}\n </h5>\n </div>\n @if (group.singleLayer) {\n <div class=\"m-map-pop-in__radios\">\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n id=\"radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"radio-layer-group-{{ groupIdx }}\">{{\n '@pry.widget.map.layerSettings.noLayer' | i18n\n }}</label>\n </div>\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <input\n type=\"radio\"\n [name]=\"group.name\"\n id=\"radio-{{ group.name }}-layer-{{ index }}\"\n [ngModel]=\"group.visibleLayers[0]\"\n [value]=\"layer.title\"\n (change)=\"changeVisibility(group, layer)\"\n />\n <label class=\"a-label\" for=\"radio-{{ group.name }}-layer-{{ index }}\">{{\n layer.title ?? ('@pry.widget.map.missingTitle' | i18n)\n }}</label>\n </div>\n }\n }\n </div>\n } @else {\n @for (layer of optionsCopy.layers; track layer; let index = $index) {\n @if (layer.group === group.name) {\n <div class=\"m-map-pop-in__title\" [class.-hidden]=\"!layersTabOpen\">\n <pry-checkbox\n [ngModel]=\"isLayerVisible(layer, group)\"\n (change)=\"changeVisibility(group, layer)\"\n id=\"checkbox-layer-{{ index }}\"\n ></pry-checkbox>\n <label class=\"a-label\" for=\"checkbox-layer-{{ index }}\">\n {{ layer.title ?? ('@pry.widget.map.missingTitle' | i18n) }}\n </label>\n </div>\n }\n }\n }\n }\n }\n </div>\n </div>\n }\n @if ((legendLayers$ | async)?.length) {\n <div class=\"ol-control m-map-action\" [style.top.px]=\"legendTop$ | async\">\n <button\n [class.a-tooltip]=\"!this.legendTabOpen\"\n [class.-tooltip-no-wrap]=\"!this.legendTabOpen\"\n class=\"m-map-action__button\"\n (click)=\"toggleLegendWindow()\"\n [attr.data-tooltip]=\"'@pry.widget.map.legends' | i18n\"\n data-tooltip-position=\"left\"\n >\n <pry-icon iconSvg=\"legend\" [width]=\"18\" [height]=\"15\"></pry-icon>\n </button>\n </div>\n <div class=\"m-map-pop-in\" [class.-hidden]=\"!legendTabOpen\" [style.top.px]=\"legendTop$ | async\">\n <h4 class=\"a-h4\">{{ '@pry.widget.map.legendsTitle' | i18n }}</h4>\n <ng-container *ngFor=\"let geoLayer of legendLayers$ | async; let index = index\">\n <div *ngIf=\"isLayerVisible(geoLayer)\" class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n <pry-icon\n *ngIf=\"isLayerRendered(geoLayer) && !!geoLayer.title\"\n class=\"m-map-pop-in__dropdown-icon\"\n [iconSvg]=\"legendTabClosed[index] ? 'chevron_bottom' : 'chevron_top'\"\n [width]=\"12\"\n [height]=\"12\"\n ></pry-icon>\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n <pry-icon\n *ngIf=\"!isLayerRendered(geoLayer)\"\n class=\"a-tooltip\"\n [attr.data-tooltip]=\"'@pry.widget.map.layerLoadError' | i18n\"\n [iconSvg]=\"'close'\"\n [width]=\"22\"\n [height]=\"22\"\n ></pry-icon>\n </div>\n <div\n class=\"m-map-pop-in__image\"\n [class.-hidden]=\"!legendTabOpen || legendTabClosed[index] || !isLayerRendered(geoLayer)\"\n [style.max-height.px]=\"legendHeight$ | async\"\n >\n <ng-container *ngIf=\"geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) } as url\">\n <img\n [src]=\"url | getSecuredImage | async\"\n [alt]=\"'@pry.widget.map.legend' | i18n: { layer: geoLayer.title }\"\n (error)=\"imageNotProvided[index] = true\"\n />\n </ng-container>\n <ng-container *ngIf=\"!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })\">\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n </ng-container>\n </div>\n </ng-container>\n </div>\n }\n\n @if (leftSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -left\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of leftSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n @if (rightSlideLayers.length > 0) {\n <div class=\"m-map-slide-legend -left\" [style.top.px]=\"legendTop$ | async\">\n <span class=\"m-map-slide-legend__title\">{{ '@pry.widget.map.slideTitle' | i18n }}:</span>\n @for (layer of rightSlideLayers; track layer) {\n <div>{{ layer.get('title') }}</div>\n }\n </div>\n }\n\n <div [style.height.px]=\"height$ | async\" class=\"o-map-wrapper\">\n <div class=\"o-map\">\n <div #mapRef id=\"map\"></div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"0.01\"\n value=\"50\"\n #sliderElement\n class=\"o-map-slider\"\n [class.-hidden]=\"!(hasSlideLayer$ | async)\"\n (input)=\"triggerLayerRender()\"\n />\n </div>\n </div>\n\n <div #popup class=\"m-tooltip m-tooltip--popup\" [hidden]=\"true\" role=\"tooltip\">\n <div class=\"m-tooltip--popup__header\">\n <p>{{ tooltipManager.tooltipIndex + 1 }} / {{ tooltipManager.tooltipNumber }}</p>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(-1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(-1)\"\n >\n <pry-icon iconSvg=\"arrow_back\"></pry-icon>\n </button>\n <button\n class=\"a-btn a-btn--primary a-btn--icon-only\"\n (click)=\"tooltipManager.tooltipMove(1)\"\n [disabled]=\"!tooltipManager.tooltipCanMove(1)\"\n >\n <pry-icon iconSvg=\"arrow_right\"></pry-icon>\n </button>\n <button class=\"a-btn a-btn--primary a-btn--icon-only\" (click)=\"tooltipManager.clearTooltip(true)\">\n <pry-icon iconSvg=\"close\"></pry-icon>\n </button>\n </div>\n <div class=\"m-tooltip--popup__container\">\n <ng-container #popupContent></ng-container>\n </div>\n </div>\n</div>\n" }]
|
|
1157
1167
|
}], ctorParameters: () => [{ type: i1.Store }, { type: i2.PryI18nService }, { type: i2.TooltipFactoryService }, { type: i2.SymbolService }, { type: i0.Injector }, { type: i3.WidgetMapLayerService }, { type: i2.PryAggregationService }, { type: i0.ElementRef }, { type: i2.PryGeoAuthService, decorators: [{
|
|
1158
1168
|
type: Optional
|
|
1159
1169
|
}, {
|
|
@@ -1175,4 +1185,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImpor
|
|
|
1175
1185
|
type: ViewChild,
|
|
1176
1186
|
args: ['sliderElement']
|
|
1177
1187
|
}] } });
|
|
1178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1tYXAvY29tcG9uZW50L3dpZGdldC1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtbWFwL2NvbXBvbmVudC93aWRnZXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsTUFBTSxFQUdOLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBTUwsY0FBYyxFQUNkLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsbUJBQW1CLEVBRW5CLGNBQWMsRUFFZCxXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLFNBQVMsRUFjVCxlQUFlLEVBQ2YsU0FBUyxFQUNULGlCQUFpQixFQUlqQixjQUFjLEVBR2QsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEQsT0FBTyxFQUFrQixJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFaEQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUs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InNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRpb25SZXN1bHQsXG4gIEF0dHJpYnV0ZSxcbiAgQmFzZVdpZGdldE1hcExheWVyT3B0aW9ucyxcbiAgQ2hhcnRBZ2dyZWdhdGVkV2lkZ2V0T3B0aW9ucyxcbiAgQ2xhc3MsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBDb25maWdTZWxlY3RvcnMsXG4gIERhc2hib2FyZEFjdGlvbnMsXG4gIERhc2hib2FyZFNlbGVjdG9ycyxcbiAgRGF0YXNldCxcbiAgRGF0YVNvdXJjZVNlbGVjdG9ycyxcbiAgRGF0YXNvdXJjZVV0aWxzLFxuICBEYXRhV2lkZ2V0Q29tcG9uZW50LFxuICBGaWVsZCxcbiAgRmllbGRTZWxlY3RvcnMsXG4gIEZpbHRlckNvbnRleHQsXG4gIEdlb01ldGFkYXRhLFxuICBHZW9tZXRyaWNGaWVsZFR5cGVzLFxuICBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZSxcbiAgSXRlbVV0aWxzLFxuICBMYXllckdyb3VwLFxuICBNYXBBdXRvTGF5ZXJPcHRpb25zLFxuICBNYXBGZWF0dXJlTGF5ZXJPcHRpb25zLFxuICBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMsXG4gIE1hcFJhc3RlclRpbGVMYXllck9wdGlvbnMsXG4gIE1hcFZlY3RvclRpbGVMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRNYXJrZXJMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldE9wdGlvbnMsXG4gIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zLFxuICBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnMsXG4gIE5hbWVkUXVlcnlUeXBlcyxcbiAgT3BlcmF0aW9uLFxuICBQUllfR0VPQVVUSF9UT0tFTixcbiAgUHJ5QWdncmVnYXRpb25TZXJ2aWNlLFxuICBQcnlHZW9BdXRoU2VydmljZSxcbiAgUHJ5STE4blNlcnZpY2UsXG4gIFJlc3VsdHNldFV0aWxzLFxuICBTeW1ib2xTZXJ2aWNlLFxuICBUb29sdGlwRmFjdG9yeVNlcnZpY2UsXG4gIFRvb2x0aXBNb2RlLFxuICBXSURHRVRfSEVBREVSX0hFSUdIVCxcbiAgd2lkZ2V0TWFwQ29uZmlnXG59IGZyb20gJ0Bwcm92b2x5L2Rhc2hib2FyZCc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsL2VzNic7XG5pbXBvcnQgeyBGZWF0dXJlLCBNYXAsIFZpZXcgfSBmcm9tICdvbCc7XG5pbXBvcnQgeyBDb29yZGluYXRlIH0gZnJvbSAnb2wvY29vcmRpbmF0ZSc7XG5pbXBvcnQgeyBib3VuZGluZ0V4dGVudCwgY3JlYXRlRW1wdHkgfSBmcm9tICdvbC9leHRlbnQnO1xuaW1wb3J0IHsgQ2lyY2xlLCBHZW9tZXRyeSwgUG9pbnQgfSBmcm9tICdvbC9nZW9tJztcbmltcG9ydCB7IEhlYXRtYXAsIExheWVyLCBUaWxlIH0gZnJvbSAnb2wvbGF5ZXInO1xuaW1wb3J0IEJhc2VMYXllciBmcm9tICdvbC9sYXllci9CYXNlJztcbmltcG9ydCBWZWN0b3JMYXllciBmcm9tICdvbC9sYXllci9WZWN0b3InO1xuaW1wb3J0IHsgZnJvbUxvbkxhdCB9IGZyb20gJ29sL3Byb2onO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICdvbC9wcm9qL3Byb2o0JztcbmltcG9ydCB7IERhdGFUaWxlLCBJbWFnZVdNUywgVGlsZVdNUyB9IGZyb20gJ29sL3NvdXJjZSc7XG5pbXBvcnQgVmVjdG9yU291cmNlIGZyb20gJ29sL3NvdXJjZS9WZWN0b3InO1xuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICdvbC9zdHlsZSc7XG5pbXBvcnQgcHJvajQgZnJvbSAncHJvajQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlbGF5LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmcm9tLFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHdpdGhMYXRlc3RGcm9tXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24tbWFuYWdlci5jbGFzcyc7XG5pbXBvcnQgeyBDcWxVdGlscyB9IGZyb20gJy4uL3V0aWxzL2NxbC11dGlscy5jbGFzcyc7XG5pbXBvcnQgeyBYTUxVdGlscyB9IGZyb20gJy4uL3V0aWxzL3htbC11dGlscy5jbGFzcyc7XG5pbXBvcnQgeyBXaWRnZXRNYXBMYXllclNlcnZpY2UgfSBmcm9tICcuL3dpZGdldC1tYXAtbGF5ZXIuc2VydmljZSc7XG5pbXBvcnQgTWFwYm94VmVjdG9yTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvTWFwYm94VmVjdG9yJztcbmltcG9ydCB7IFdpZGdldE1hcFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvd2lkZ2V0LW1hcC51dGlscyc7XG5pbXBvcnQgeyBMYXllclNsaWRlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2xheWVyLXNsaWRlci5jbGFzcyc7XG5pbXBvcnQgVGlsZUxheWVyIGZyb20gJ29sL2xheWVyL1RpbGUnO1xuaW1wb3J0IFdlYkdMVGlsZUxheWVyIGZyb20gJ29sL2xheWVyL1dlYkdMVGlsZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGlvbiwgZGVmYXVsdHMgfSBmcm9tICdvbC9jb250cm9sJztcbmltcG9ydCBWZWN0b3JUaWxlTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvVmVjdG9yVGlsZSc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgVG9vbHRpcE1hbmFnZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi90b29sdGlwLW1hbmFnZXIuY2xhc3MnO1xuXG5leHBvcnQgY29uc3QgVE9PTFRJUF9QQURESU5HID0gMTU7XG5leHBvcnQgY29uc3QgTk9OX01BTkRBVE9SWV9GSVRfTEFZRVJfVFlQRVMgPSBbJ3dtcycsICdnZW9zZXJ2ZXInXTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0xBWUVSX0dST1VQID0gJ0RFRkFVTFQnO1xuXG4vLyBEZWZpbmUgTGFtYmVydCBQcm9qZWN0aW9uXG5wcm9qNC5kZWZzKFxuICAnRVBTRzoyMTU0JyxcbiAgJytwcm9qPWxjYyArbGF0XzA9NDYuNSArbG9uXzA9MyArbGF0XzE9NDkgK2xhdF8yPTQ0ICt4XzA9NzAwMDAwICt5XzA9NjYwMDAwMCArZWxscHM9R1JTODAgK3Rvd2dzODQ9MCwwLDAsMCwwLDAsMCArdW5pdHM9bSArbm9fZGVmcyArdHlwZT1jcnMnXG4pO1xucmVnaXN0ZXIocHJvajQpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtbWFwLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRNYXBDb21wb25lbnQgZXh0ZW5kcyBEYXRhV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgc3RhdGljIGlkQ291bnRlciA9IDA7XG4gIGlkID0gYCR7V2lkZ2V0TWFwQ29tcG9uZW50LmlkQ291bnRlcisrfWA7XG4gIG1hcFVybCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgQFZpZXdDaGlsZCgnbWFwUmVmJykgbWFwUmVmITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncG9wdXAnKSBwb3B1cCE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3BvcHVwQ29udGVudCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBwb3B1cENvbnRlbnQhOiBWaWV3Q29udGFpbmVyUmVmO1xuICBAVmlld0NoaWxkKCdleHBvcnRUeXBlVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGV4cG9ydFR5cGVUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlckVsZW1lbnQnKSBzbGlkZXJFbGVtZW50ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8TWFwV2lkZ2V0T3B0aW9ucz47XG4gIGxheWVyVHlwZXMgPSB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS5pbXBsZW1lbnRhdGlvbkxpc3RcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiB0eXBlICE9PSAnYXV0bycpXG4gICAgLnNvcnQoKGEsIGIpID0+XG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcbiAgICAgICAgLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUuJyArIGEpXG4gICAgICAgIC5sb2NhbGVDb21wYXJlKHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLicgKyBiKSlcbiAgICApO1xuICBvcHRpb25zQ29weTogTWFwV2lkZ2V0T3B0aW9ucyA9IHt9IGFzIE1hcFdpZGdldE9wdGlvbnM7XG4gIGNsYXNzZXMkOiBPYnNlcnZhYmxlPENsYXNzW10+O1xuICBmaWVsZHMkOiBPYnNlcnZhYmxlPEZpZWxkW10+O1xuICBzZWxlY3RlZElkcyQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuICBib3R0b21MZWZ0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBsYXllcnMkITogT2JzZXJ2YWJsZTxCYXNlTGF5ZXJbXT47XG4gIG1hcCE6IE1hcDtcbiAgYWRkaXRpb25hbExheWVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZlY3RvckxheWVyPFZlY3RvclNvdXJjZTxHZW9tZXRyeT4+W10+KFtdKTtcbiAgc3R5bGVzJDogT2JzZXJ2YWJsZTxcbiAgICB7XG4gICAgICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgICBsYWJlbDogc3RyaW5nO1xuICAgIH1bXVxuICA+O1xuICBXSURHRVRfSEVBREVSX0hFSUdIVCA9IFdJREdFVF9IRUFERVJfSEVJR0hUO1xuICBpID0gMDtcbiAgaXRlbVN0eWxlcyQhOiBPYnNlcnZhYmxlPHtcbiAgICBbaWQ6IHN0cmluZ106IHtcbiAgICAgIGNsYXNzaWM6IFN0eWxlO1xuICAgICAgYm9yZGVyZWQ6IFN0eWxlO1xuICAgIH07XG4gIH0+O1xuICBoZWlnaHQkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGFjdGlvbnMkID0gd2lkZ2V0TWFwQ29uZmlnLmFjdGlvbnMkO1xuICBnZW9TZXJ2ZXJMYXllckRlc2NyaXB0aW9ucyQ6IE9ic2VydmFibGU8TWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zW10+O1xuICBsZWdlbmRUYWJPcGVuID0gZmFsc2U7XG4gIGxheWVyc1RhYk9wZW4gPSBmYWxzZTtcbiAgbGVnZW5kVGFiID0gMDtcbiAgbGVnZW5kTGF5ZXJzJCE6IE9ic2VydmFibGU8KE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucyB8IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zKVtdPjtcbiAgbGVnZW5kVG9wJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBsYXllcnNUb3AkITogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBsZWdlbmRIZWlnaHQkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGltYWdlTm90UHJvdmlkZWQ6IGJvb2xlYW5bXSA9IFtdO1xuICBiYXNpY0FjdGlvbnMkOiBPYnNlcnZhYmxlPCgnY2xpY2snIHwgJ2xhc3NvJyB8ICdyZWN0YW5nbGUnIHwgJ3pvb20nIHwgJ21vdmUnIHwgJ2V4cG9ydCcgfCAndXBsb2FkJylbXT47XG4gIHpvb21BbmRDZW50ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgem9vbT86IHtcbiAgICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgICBtaW46IG51bWJlcjtcbiAgICAgIG1heDogbnVtYmVyO1xuICAgIH07XG4gICAgY2VudGVyPzogbnVtYmVyW107XG4gIH0+KHt9KTtcbiAgbWFwU3R5bGVVcmwkITogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPjtcbiAgaW50ZXJhY3Rpb25NYW5hZ2VyOiBJbnRlcmFjdGlvbk1hbmFnZXIgPSBuZXcgSW50ZXJhY3Rpb25NYW5hZ2VyKCk7XG4gIHRvb2x0aXBNYW5hZ2VyOiBUb29sdGlwTWFuYWdlciA9IG5ldyBUb29sdGlwTWFuYWdlcigpO1xuICBtYXBTdHlsZUxheWVyJCE6IE9ic2VydmFibGU8KFZlY3RvclRpbGVMYXllciB8IFRpbGVMYXllcjxhbnk+KVtdPjtcbiAgU1RZTEVfRlJPTV9VUkwgPSAnX3VybCc7XG4gIE5PX1NUWUxFID0gJ25vbmUnO1xuICB3bXNDYXBhYmlsaXRpZXMkOiBPYnNlcnZhYmxlPFxuICAgIHwge1xuICAgICAgICBbcDogc3RyaW5nXTogR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2UgfCBudWxsO1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkXG4gID47XG4gIGF1dG9EYXRhc2V0TGF5ZXJzJDogT2JzZXJ2YWJsZTxNYXBBdXRvTGF5ZXJPcHRpb25zW10+O1xuICBmaXRFeHRlbnRzJCE6IE9ic2VydmFibGU8XG4gICAge1xuICAgICAgZGF0YXNvdXJjZTogc3RyaW5nO1xuICAgICAgZXh0ZW50OiBDb29yZGluYXRlW107XG4gICAgICBlcnJvcjogYm9vbGVhbjtcbiAgICB9W11cbiAgPjtcbiAgZGF0YXNvdXJjZUZpbHRlcnMkOiBPYnNlcnZhYmxlPGFueT47XG4gIHVzZWRDbGFzc2VzJDogT2JzZXJ2YWJsZTxhbnk+O1xuICBsYXllclNsaWRlciA9IG5ldyBMYXllclNsaWRlcigpO1xuICBoYXNTbGlkZUxheWVyJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgc2xpZGVzOiB7IGlkOiB1bmRlZmluZWQgfCBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdO1xuICBwb3NzaWJsZVN0eWxlczoge1xuICAgIFtwOiBzdHJpbmddOiB7XG4gICAgICBsYXllcnM6IHsgW3A6IHN0cmluZ106IHsgcGFyYW06IHN0cmluZzsgc3R5bGVzOiB7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdIH0gfSB8IG51bGw7XG4gICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGF0dHJpYnV0aW9ucyA9IG5ldyBBdHRyaWJ1dGlvbigpO1xuICBhY3Rpb25NZW51T3BlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgYXR0cmlidXRpb25zJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgb2xab29tRWxlbWVudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIHByZXZpb3VzTGF5ZXJzOiBCYXNlTGF5ZXJbXSA9IFtdO1xuICBsYXllckdyb3VwcyQ6IE9ic2VydmFibGU8TGF5ZXJHcm91cFtdPjtcbiAgbGF5ZXJHcm91cHM6IExheWVyR3JvdXBbXSA9IFtdO1xuICBsYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdG9yZTogU3RvcmU8YW55PixcbiAgICBwdWJsaWMgdHJhbnNsYXRlU2VydmljZTogUHJ5STE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b29sdGlwRmFjdG9yeVNlcnZpY2U6IFRvb2x0aXBGYWN0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHN5bWJvbFNlcnZpY2U6IFN5bWJvbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSB3aWRnZXRNYXBMYXllclNlcnZpY2U6IFdpZGdldE1hcExheWVyU2VydmljZSxcbiAgICBwcml2YXRlIHByeUFnZ3JlZ2F0aW9uU2VydmljZTogUHJ5QWdncmVnYXRpb25TZXJ2aWNlLFxuICAgIGVsOiBFbGVtZW50UmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUFJZX0dFT0FVVEhfVE9LRU4pIHByaXZhdGUgZ2VvQXV0aFNlcnZpY2U6IFByeUdlb0F1dGhTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHN0b3JlLCBlbCk7XG5cbiAgICB0aGlzLmdldE9sWm9vbUVsZW1lbnQoKTtcblxuICAgIHRoaXMuc2xpZGVzID0gW1xuICAgICAgeyBpZDogJ2FsbCcsIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnNsaWRlLmFsbCcpIH0sXG4gICAgICB7IGlkOiAnbGVmdCcsIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnNsaWRlLmxlZnQnKSB9LFxuICAgICAgeyBpZDogJ3JpZ2h0JywgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc2xpZGUucmlnaHQnKSB9XG4gICAgXTtcblxuICAgIHRoaXMud2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLndpdGhHZW9BdXRoKHRoaXMuZ2VvQXV0aFNlcnZpY2UpO1xuXG4gICAgdGhpcy5iYXNpY0FjdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmFjdGlvbnMkLFxuICAgICAgdGhpcy5hY3Rpb25NZW51T3BlbiQsXG4gICAgICB0aGlzLmludGVyYWN0aW9uTWFuYWdlci5zZWxlY3Rpb25JbnRlcmFjdGlvbi5zZWxlY3Rpb25UeXBlJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFthY3Rpb25zLCBtZW51T3Blbiwgc2VsZWN0aW9uVHlwZV0pID0+XG4gICAgICAgIG1lbnVPcGVuXG4gICAgICAgICAgPyBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24gIT09ICdleHBvcnQnICYmIGFjdGlvbiAhPT0gJ3VwbG9hZCcpXG4gICAgICAgICAgOiBhY3Rpb25zXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uICE9PSAnZXhwb3J0JyAmJiBhY3Rpb24gIT09ICd1cGxvYWQnKVxuICAgICAgICAgICAgICAuZmlsdGVyKChhY3Rpb24pID0+IHNlbGVjdGlvblR5cGUgPT09IGFjdGlvbilcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5jbGFzc2VzJCA9IHRoaXMuc3RvcmVcbiAgICAgIC5zZWxlY3QoQ2xhc3NTZWxlY3RvcnMuY2xhc3NlcylcbiAgICAgIC5waXBlKG1hcCgoY2xhc3NlcykgPT4gY2xhc3Nlcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKSkpO1xuICAgIHRoaXMudXNlZENsYXNzZXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5jbGFzc2VzJCwgdGhpcy51c2VkRGF0YXNvdXJjZXMkXSkucGlwZShcbiAgICAgIG1hcCgoW2NsYXNzZXMsIGRhdGFzb3VyY2VzXSkgPT4ge1xuICAgICAgICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoKGNsYXNzSXRlbSkgPT5cbiAgICAgICAgICBkYXRhc291cmNlcy5zb21lKChkYXRhU291cmNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAnbmFtZWRRdWVyeScgJiYgJ3R5cGUnIGluIGRhdGFTb3VyY2UucmVxdWVzdCkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZGF0YVNvdXJjZS5yZXF1ZXN0LnR5cGUgPT09IE5hbWVkUXVlcnlUeXBlcy5NVUxUSV9DTEFTUyB8fFxuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UucmVxdWVzdC50eXBlID09PSBOYW1lZFF1ZXJ5VHlwZXMuRlVMTF9URVhUXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAnZGF0YXNldCdcbiAgICAgICAgICAgICAgPyBkYXRhU291cmNlLm9DbGFzcyA9PT0gY2xhc3NJdGVtLmlkXG4gICAgICAgICAgICAgIDogZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAnbmFtZWRRdWVyeScgJiYgJ29DbGFzcycgaW4gZGF0YVNvdXJjZS5yZXF1ZXN0XG4gICAgICAgICAgICAgICAgPyBkYXRhU291cmNlLnJlcXVlc3Qub0NsYXNzID09PSBjbGFzc0l0ZW0uaWRcbiAgICAgICAgICAgICAgICA6IGRhdGFTb3VyY2Uuc291cmNlVHlwZSA9PT0gJ25hbWVkUXVlcnknICYmICd0eXBlJyBpbiBkYXRhU291cmNlLnJlcXVlc3RcbiAgICAgICAgICAgICAgICAgID8gZGF0YVNvdXJjZS5yZXF1ZXN0LnR5cGUgPT09IE5hbWVkUXVlcnlUeXBlcy5NT05PX0NMQVNTXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5maWVsZHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRmllbGRTZWxlY3RvcnMuZmllbGRzKTtcblxuICAgIHRoaXMuZGF0YXNvdXJjZUZpbHRlcnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuZGF0YXNvdXJjZUZpbHRlcnMpLFxuICAgICAgdGhpcy5kYXRhc291cmNlSWRzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbZmlsdGVycywgaWRzXSkgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyhmaWx0ZXJzKVxuICAgICAgICAgICAgLmZpbHRlcigoZmlsdGVyRHNLZXkpID0+IGlkcy5pbmNsdWRlcyhmaWx0ZXJEc0tleSkpXG4gICAgICAgICAgICAucmVkdWNlKChwLCBjKSA9PiAoeyAuLi5wLCBbY106IGZpbHRlcnNbY10gfSksIHt9KSBhcyB7XG4gICAgICAgICAgICBbcDogc3RyaW5nXTogRmlsdGVyQ29udGV4dFtdO1xuICAgICAgICAgIH1cbiAgICAgICksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpXG4gICAgKTtcblxuICAgIHRoaXMuc3R5bGVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KENvbmZpZ1NlbGVjdG9ycy5tYXBTdHlsZXMpLnBpcGUoXG4gICAgICBtYXAoKHN0eWxlcykgPT5cbiAgICAgICAgc3R5bGVzLmNvbmNhdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLk5PX1NUWUxFLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubm9TdHlsZScpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLlNUWUxFX0ZST01fVVJMLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc3R5bGVGcm9tVXJsJylcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0ZWRJZHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnNlbGVjdGVkSXRlbUlkcyk7XG5cbiAgICB0aGlzLmdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy51c2VkRGF0YXNvdXJjZXMkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICAgICksXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMuZ2VvU2VydmVyVXJsKS5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKVxuICAgIF0pLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgIG1hcCgoW2RhdGFTb3VyY2VzLCBnZW9TZXJ2ZXJVcmxdKSA9PiB7XG4gICAgICAgIGlmICghZ2VvU2VydmVyVXJsKSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBkYXRhU291cmNlc1xuICAgICAgICAgIC5maWx0ZXIoKGRzKSA9PiBEYXRhc291cmNlVXRpbHMuaXNHZW8oZHMpKVxuICAgICAgICAgIC5tYXAoKGRzKSA9PiB7XG4gICAgICAgICAgICBkcyA9IGRzIGFzIHVua25vd24gYXMgRGF0YXNldDtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhczoge1xuICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gICAgICAgICAgICB9ID0ge307XG4gICAgICAgICAgICBkcy5tZXRhZGF0YT8uZm9yRWFjaCgobSkgPT4gKG1ldGFkYXRhc1ttLm1ldGFkYXRhRGVmLm5hbWVdID0gbS52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdHlwZTogJ2dlb3NlcnZlcicsXG4gICAgICAgICAgICAgIHVybDogYCR7Z2VvU2VydmVyVXJsfS8ke1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdLmxlbmd0aCA+IDAgPyBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuTkFNRVNQQUNFXSArICcvJyA6ICcnXG4gICAgICAgICAgICAgIH13bXM/U0VSVklDRT1XTVMmVkVSU0lPTj0xLjMuMGAsXG4gICAgICAgICAgICAgIHBhcmFtVGlsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IHBhcnNlSW50KG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5PUEFDSVRZXSA/PyAxMDAsIDEwKSxcbiAgICAgICAgICAgICAgb0NsYXNzOiBkcy5vQ2xhc3MsXG4gICAgICAgICAgICAgIGtleTogbWV0YWRhdGFzW0dlb01ldGFkYXRhLk5BTUVTUEFDRV0gKyAnOicgKyBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuS0VZXSxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuTkFNRVNQQUNFXSxcbiAgICAgICAgICAgICAgcGFyYW1MYXllcjogbWV0YWRhdGFzW0dlb01ldGFkYXRhLktFWV0sXG4gICAgICAgICAgICAgIG5hbWU6IGRzLm5hbWUsXG4gICAgICAgICAgICAgIGRhdGFzb3VyY2VJZDogZHMuaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKChsYXllcikgPT4gbGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKSxcbiAgICAgIHN0YXJ0V2l0aChbXSlcbiAgICApO1xuXG4gICAgdGhpcy5hdXRvRGF0YXNldExheWVycyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY2xhc3NlcyQsXG4gICAgICB0aGlzLmZpZWxkcyQsXG4gICAgICB0aGlzLnVzZWREYXRhc291cmNlcyQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgbWFwKFxuICAgICAgICAgIChkYXRhc291cmNlcykgPT5cbiAgICAgICAgICAgIGRhdGFzb3VyY2VzLmZpbHRlcigoZHMpID0+IGRzLnNvdXJjZVR5cGUgPT09ICdkYXRhc2V0JyAmJiAhRGF0YXNvdXJjZVV0aWxzLmlzR2VvKGRzKSkgYXMgRGF0YXNldFtdXG4gICAgICAgIClcbiAgICAgIClcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoW2NsYXNzZXMsIGZpZWxkcywgZGF0YVNldHNdKSA9PlxuICAgICAgICAgIGRhdGFTZXRzXG4gICAgICAgICAgICAubWFwKChkcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IGNsYXNzZXMuZmluZCgoY2xhenopID0+IGNsYXp6LmlkID09PSBkcy5vQ2xhc3MpO1xuICAgICAgICAgICAgICBjb25zdCBnZW9BdHRyaWJ1dGVzID0gKFxuICAgICAgICAgICAgICAgIG1vZGVsPy5hdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gKHsgYXR0ciwgZmllbGQ6IGZpZWxkcy5maW5kKChmKSA9PiBhdHRyLmZpZWxkID09PSBmLmlkKSB9KSkgPz8gW11cbiAgICAgICAgICAgICAgKS5maWx0ZXIoKHsgYXR0ciwgZmllbGQgfSkgPT4gISFmaWVsZCAmJiBHZW9tZXRyaWNGaWVsZFR5cGVzLmluY2x1ZGVzKGZpZWxkLnR5cGUpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdlb0F0dHJpYnV0ZXMubWFwKFxuICAgICAgICAgICAgICAgIChnZW8pID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHtkcy5uYW1lfSR7Z2VvQXR0cmlidXRlcy5sZW5ndGggPiAxID8gJyAtICcgKyBnZW8uYXR0ci5uYW1lIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgb0NsYXNzOiBkcy5vQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIGtleTogZHMuaWQsXG4gICAgICAgICAgICAgICAgICAgIHN1YlR5cGU6IGdlby5maWVsZCEudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogW2RzLm9DbGFzc10sXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogZ2VvLmF0dHIudGVjaG5pY2FsTmFtZVxuICAgICAgICAgICAgICAgICAgfSkgYXMgTWFwQXV0b0xheWVyT3B0aW9uc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mbGF0KCkgYXMgTWFwQXV0b0xheWVyT3B0aW9uc1tdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm1hbmlmZXN0JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKG1hbmlmZXN0KSA9PlxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAoKChtYW5pZmVzdC5vcHRpb25zID8/IHsgbGF5ZXJzOiBbXSB9KSBhcyBNYXBXaWRnZXRPcHRpb25zKS5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+XG4gICAgICAgICAgICAgICAgWyd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKVxuICAgICAgICAgICAgICApIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zW11cbiAgICAgICAgICAgICkubWFwKChsYXllcikgPT4gbGF5ZXIudXJsKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh1cmxzKSA9PiB1cmxzLmZvckVhY2goKHVybCkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmdldENhcGFiaWxpdHkoeyB1cmwgfSkpKSlcbiAgICApO1xuXG4gICAgdGhpcy53bXNDYXBhYmlsaXRpZXMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmNhcGFiaWxpdGllcyk7XG5cbiAgICB0aGlzLm9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLm1hbmlmZXN0JCxcbiAgICAgIHRoaXMucmVzdWx0U2V0JCxcbiAgICAgIHRoaXMuY2xhc3NlcyQsXG4gICAgICB0aGlzLmZpZWxkcyQsXG4gICAgICB0aGlzLnN0eWxlcyQsXG4gICAgICB0aGlzLmdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zJCxcbiAgICAgIHRoaXMud21zQ2FwYWJpbGl0aWVzJCxcbiAgICAgIHRoaXMuYXV0b0RhdGFzZXRMYXllcnMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW21hbmlmZXN0LCByZXN1bHRTZXQsIGNsYXNzZXMsIGZpZWxkcywgbWFwU3R5bGVzLCBnZW9MYXllcnMsIGNhcGFiaWxpdGllcywgYXV0b0RhdGFzZXRMYXllcnNdKSA9PiB7XG4gICAgICAgIC8vIGF1dG8gZGV0ZXJtaW5lIGxheWVycyBwYXJhbWV0ZXJzIHRvIHByb3ZpZGUgYSB3b3JraW5nIHZpZXdcbiAgICAgICAgY29uc3QgYXV0b09wdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0Lm9wdGlvbnMgPz8ge30pKSBhcyBNYXBXaWRnZXRPcHRpb25zO1xuICAgICAgICBpZiAoIWF1dG9PcHRpb25zLnRvb2x0aXBNb2RlKSB7XG4gICAgICAgICAgYXV0b09wdGlvbnMudG9vbHRpcE1vZGUgPSBUb29sdGlwTW9kZS5DTElDSztcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycyA9IFtcbiAgICAgICAgICAuLi4oYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKS5maWx0ZXIoKGxheWVyKSA9PiBsYXllci50eXBlICE9PSAnYXV0bycpLFxuICAgICAgICAgIC4uLihhdXRvT3B0aW9ucy5hdXRvbWF0aWNMYXllcnNcbiAgICAgICAgICAgID8gYXV0b0RhdGFzZXRMYXllcnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgKGxheWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAhYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyIHx8XG4gICAgICAgICAgICAgICAgICAgICFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIuaW5jbHVkZXMobGF5ZXIua2V5ICsgJy0nICsgbGF5ZXIuc3ViVHlwZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLm1hcCgobGF5ZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5sYXllcixcbiAgICAgICAgICAgICAgICAgIC4uLigoYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIChwcmV2TGF5ZXIpID0+IHByZXZMYXllci5rZXkgPT09IGxheWVyLmtleSAmJiBwcmV2TGF5ZXIuYXR0cmlidXRlID09PSBsYXllci5hdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICkgPz8ge30pXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IFtdKVxuICAgICAgICBdO1xuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycz8uZm9yRWFjaCgobGF5ZXIsIGkpID0+IHtcbiAgICAgICAgICBXaWRnZXRNYXBVdGlscy5wb3B1bGF0ZUxvY2F0aW9uQXR0cmlidXRlKGxheWVyLCByZXN1bHRTZXQsIGNsYXNzZXMsIGZpZWxkcyk7XG4gICAgICAgICAgV2lkZ2V0TWFwVXRpbHMucG9wdWxhdGVJbnRlbnNpdHlBdHRyaWJ1dGUobGF5ZXIsIHJlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzKTtcbiAgICAgICAgICBpZiAoYXV0b09wdGlvbnMuYXR0cmlidXRpb25zKSB7XG4gICAgICAgICAgICBsYXllci5hdHRyaWJ1dGlvbiA9IGxheWVyLmF0dHJpYnV0aW9uID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYWN0dWFsTGF5ZXJLZXlzID0gKGF1dG9PcHRpb25zLmxheWVycyA/PyBbXSlcbiAgICAgICAgICAubWFwKChsYXllcikgPT4gKGxheWVyIGFzIE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucykua2V5ID8/IG51bGwpXG4gICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhIWtleSk7XG5cbiAgICAgICAgLy8gR2V0IGFsbCBwcmV2aW91cyBsYXllcnMsIHdpdGhvdXQgZ2Vvc2VydmVyIGxheWVycyB0aGF0IGFyZSBub3QgcmVxdWVzdGVkIGFueW1vcmUsIHRoZW4gYWRkIG5ldyBnZW9zZXJ2ZXIgbGF5ZXJzIChwb3RlbnRpYWxseSB3aXRoIGEgcHJlY29uZmlnIGZyb20gbWFuaWZlc3QpLlxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMgPSBbXG4gICAgICAgICAgLi4uKGF1dG9PcHRpb25zLmxheWVycyA/PyBbXSkubWFwKChsYXllcikgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2VvTGF5ZXIgPSBnZW9MYXllcnMuZmluZCgoZ2VvTGF5ZXIpID0+IGxheWVyLmtleSA9PT0gZ2VvTGF5ZXIua2V5KSA/PyBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInXG4gICAgICAgICAgICAgID8gZ2VvTGF5ZXJcbiAgICAgICAgICAgICAgICA/IHsgLi4uZ2VvTGF5ZXIsIC4uLmxheWVyLCB1cmw6IGdlb0xheWVyLnVybCB9XG4gICAgICAgICAgICAgICAgOiAobnVsbCBhcyB1bmtub3duIGFzIE1hcFdpZGdldExheWVyT3B0aW9ucylcbiAgICAgICAgICAgICAgOiB7IC4uLmxheWVyIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLi4uZ2VvTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+ICFhY3R1YWxMYXllcktleXMuaW5jbHVkZXMobGF5ZXIua2V5KSlcbiAgICAgICAgXS5maWx0ZXIoKGxheWVyKSA9PiAhIWxheWVyKTtcblxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMuZm9yRWFjaCgobGF5ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXREZWZhdWx0TGF5ZXJUaXRsZShsYXllciwgaW5kZXgsIGNhcGFiaWxpdGllcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhIW1hcFN0eWxlcyAmJlxuICAgICAgICAgIG1hcFN0eWxlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgKCFhdXRvT3B0aW9ucy5zdHlsZSB8fCAhbWFwU3R5bGVzLm1hcCgoc3R5bGUpID0+IHN0eWxlLmlkZW50aWZpZXIpLmluY2x1ZGVzKGF1dG9PcHRpb25zLnN0eWxlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbGlnaHRTdHlsZXMgPSBtYXBTdHlsZXMuZmlsdGVyKChzdHlsZSkgPT4gIShzdHlsZS5pZGVudGlmaWVyID8/ICctJykuaW5jbHVkZXMoJ2RhcmsnKSk7XG4gICAgICAgICAgYXV0b09wdGlvbnMuc3R5bGUgPSBsaWdodFN0eWxlcy5sZW5ndGggPiAwID8gbGlnaHRTdHlsZXNbMF0uaWRlbnRpZmllciA6IG1hcFN0eWxlc1swXS5pZGVudGlmaWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllcikge1xuICAgICAgICAgIGNvbnN0IGJhc2UgPSBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXI7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBpZ25vcmVBdXRvTGF5ZXJzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeVxuICAgICAgICAgIGNvbnN0IHBvc3NpYmxlSWdub3JlQXV0b0xheWVyS2V5cyA9IGF1dG9EYXRhc2V0TGF5ZXJzLm1hcCgobGF5ZXIpID0+IGxheWVyLmtleSArICctJyArIGxheWVyLnN1YlR5cGUpO1xuICAgICAgICAgIGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllciA9IChhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgPz8gW10pLmZpbHRlcigoa2V5KSA9PlxuICAgICAgICAgICAgcG9zc2libGVJZ25vcmVBdXRvTGF5ZXJLZXlzLmluY2x1ZGVzKGtleSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyIHx8IGJhc2UubGVuZ3RoICE9PSBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRNYW5pZmVzdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycyA9IFdpZGdldE1hcFV0aWxzLmFzc2lnbkxheWVyc09yZGVyKGF1dG9PcHRpb25zLmxheWVycyk7XG5cbiAgICAgICAgaWYgKGF1dG9PcHRpb25zLmZpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzLmZvckVhY2goXG4gICAgICAgICAgICAobGF5ZXIpID0+IChsYXllci5maXQgPSAhTk9OX01BTkRBVE9SWV9GSVRfTEFZRVJfVFlQRVMuaW5jbHVkZXMobGF5ZXIudHlwZSkgfHwgYXV0b09wdGlvbnMuZml0KVxuICAgICAgICAgICk7XG4gICAgICAgICAgZGVsZXRlIGF1dG9PcHRpb25zLmZpdDtcbiAgICAgICAgfVxuXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5uZXcgU2V0KFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMuZmlsdGVyKChsYXllcikgPT4gWyd3bXMnLCAnZ2Vvc2VydmVyJ10uaW5jbHVkZXMobGF5ZXIudHlwZSkpIGFzIChcbiAgICAgICAgICAgICAgICB8IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zXG4gICAgICAgICAgICAgICAgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICAgICAgKVtdXG4gICAgICAgICAgICApLm1hcCgobGF5ZXIpID0+IGxheWVyLnVybClcbiAgICAgICAgICApXG4gICAgICAgIF0uZm9yRWFjaCgodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKGNhcGFiaWxpdGllcyAmJiBjYXBhYmlsaXRpZXNbdXJsXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuZ2V0Q2FwYWJpbGl0eSh7IHVybDogdXJsIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhdXRvT3B0aW9ucztcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5vcHRpb25zJC5waXBlKGZpbHRlcigob3B0KSA9PiAhIW9wdCkpLnN1YnNjcmliZSgob3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5mb3JFYWNoKFxuICAgICAgICAgIChsYXllcikgPT4gKHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUgPz8gJ01JU1NJTkcgVElUTEUnXSA9IGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zQ29weS5sYXllcnMgJiYgdGhpcy5vcHRpb25zQ29weS5sYXllcnMuc29tZSgobGF5ZXIpID0+ICFsYXllci5ncm91cCkpXG4gICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnNcbiAgICAgICAgICAgID8uZmlsdGVyKFxuICAgICAgICAgICAgICAobCkgPT5cbiAgICAgICAgICAgICAgICAhbC5ncm91cCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmxheWVyR3JvdXBzXG4gICAgICAgICAgICAgICAgICAuZmluZCgoZ3JvdXApID0+IGdyb3VwLm5hbWUgPT09IERFRkFVTFRfTEFZRVJfR1JPVVApXG4gICAgICAgICAgICAgICAgICA/LnZpc2libGVMYXllcnMuaW5jbHVkZXMobC50aXRsZSA/PyAnTUlTU0lORyBUSVRMRScpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZUxheWVyR3JvdXAoe1xuICAgICAgICAgICAgICAgICAgbmFtZTogREVGQVVMVF9MQVlFUl9HUk9VUCxcbiAgICAgICAgICAgICAgICAgIHZpc2libGVMYXllcnM6IGxheWVyLnRpdGxlID8/ICdNSVNTSU5HIFRJVExFJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8ubWFwKChsYXllcikgPT4gKHtcbiAgICAgICAgICAuLi5sYXllcixcbiAgICAgICAgICBncm91cDogbGF5ZXIuZ3JvdXAgPz8gREVGQVVMVF9MQVlFUl9HUk9VUFxuICAgICAgICB9KSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLm1hcFVybCQgPSB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMubWFwVXJsKTtcblxuICAgIHRoaXMuYm90dG9tTGVmdCQgPSB0aGlzLndpZGdldFNpemUkLnBpcGUoXG4gICAgICBtYXAoKHNpemUpID0+IGB0cmFuc2xhdGUoMTBweCAsY2FsYygke3NpemUuaGVpZ2h0fXB4IC0gMTAwJSAtIDEwcHgpKWApLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcblxuICAgIHRoaXMuaXRlbVN0eWxlcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnJlc3VsdFNldCQsIHRoaXMubWFuaWZlc3QkLCB0aGlzLnN0YXRpY1Jlc3VsdFNldCRdKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKFtycywgbWFuaWZlc3QsIHNyc10pID0+IHtcbiAgICAgICAgaWYgKChtYW5pZmVzdC5kYXRhc291cmNlID09PSB1bmRlZmluZWQgfHwgbWFuaWZlc3QuZGF0YXNvdXJjZS5sZW5ndGggPT09IDApICYmICFzcnMpIHtcbiAgICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8e1xuICAgICAgICAgICAgICBbaWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICBjbGFzc2ljOiBTdHlsZTtcbiAgICAgICAgICAgICAgICBib3JkZXJlZDogU3R5bGU7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gT2JqZWN0LnZhbHVlcyhycy5pdGVtcykucmVkdWNlKChwLCBjKSA9PiBjLmxlbmd0aCArIHAsIDApO1xuICAgICAgICAgICAgICBpZiAodG90YWwgPT09IDApIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB7XG4gICAgICAgICAgICAgICAgW2lkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICAgICAgICBjbGFzc2ljOiBTdHlsZTtcbiAgICAgICAgICAgICAgICAgIGJvcmRlcmVkOiBTdHlsZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHJzLml0ZW1zKS5mb3JFYWNoKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAoaXRlbSk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltYm9sU2VydmljZS5nZXRTeW1ib2xBc0ljb25TdHlsZShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bWJvbFNlcnZpY2UuZ2V0U3ltYm9sQXNJY29uU3R5bGUoaXRlbSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgXSkudGhlbigoW3N0eWxlLCBiU3R5bGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2l0ZW0uaWRdID0geyBjbGFzc2ljOiBzdHlsZSwgYm9yZGVyZWQ6IGJTdHlsZSB9O1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+PSB0b3RhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5oZWlnaHQkID0gY29tYmluZUxhdGVzdChbdGhpcy53aWRnZXRTaXplJC5waXBlKGRlYm91bmNlVGltZSgxMDApKSwgdGhpcy5kaXNwbGF5SGVhZGVyJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzaXplLCBkaXNwbGF5XSkgPT4gKHNpemUuaGVpZ2h0ID8/IDEwMCkgLSAoZGlzcGxheSA/IFdJREdFVF9IRUFERVJfSEVJR0hULnZhbHVlIDogMCkpLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcblxuICAgIHRoaXMuYXR0cmlidXRpb25zJCA9IHRoaXMub3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+ICEhb3B0aW9ucy5hdHRyaWJ1dGlvbnMpKTtcblxuICAgIHRoaXMubGVnZW5kVG9wJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGlzcGxheUhlYWRlciQsIHRoaXMuYXR0cmlidXRpb25zJF0pLnBpcGUoXG4gICAgICBtYXAoKFtoZWFkZXIsIGF0dHJdKSA9PiA1ICsgKGhlYWRlciA/IFdJREdFVF9IRUFERVJfSEVJR0hULnZhbHVlIDogMCkgKyAoYXR0ciA/IDYxIDogMCkpXG4gICAgKTtcblxuICAgIHRoaXMubGVnZW5kSGVpZ2h0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2lkZ2V0U2l6ZSQucGlwZShkZWJvdW5jZVRpbWUoMTAwKSksIHRoaXMubGVnZW5kVG9wJF0pLnBpcGUoXG4gICAgICBtYXAoKFtzaXplLCB0b3BdKSA9PiB7XG4gICAgICAgIHJldHVybiAoc2l6ZS5oZWlnaHQgPz8gMTAwKSAtIFdJREdFVF9IRUFERVJfSEVJR0hULnZhbHVlIC0gdG9wIC0gNTY7IC8vIDU2cHggaXMgdGhlIHRvb2x0aXAgaGVpZ2h0ICsgbWFyZ2luXG4gICAgICB9KSxcbiAgICAgIGRlbGF5KDEwKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy53bXNDYXBhYmlsaXRpZXMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgod21zQ2FwYWJpbGl0aWVzKSA9PlxuICAgICAgICAgICAgd21zQ2FwYWJpbGl0aWVzXG4gICAgICAgICAgICAgID8gT2JqZWN0LmtleXMod21zQ2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgICAgICAgLm1hcCgodXJsKSA9PiAoeyB1cmwsIGxheWVyczogWE1MVXRpbHMuZ2V0UG9zc2libGVMYXllclN0eWxlcyh3bXNDYXBhYmlsaXRpZXNbdXJsXT8uZG9jKSB9KSlcbiAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+ICh7IC4uLnAsIFtjLnVybF06IGMgfSksIHt9KVxuICAgICAgICAgICAgICA6IHt9XG4gICAgICAgICAgKSxcbiAgICAgICAgICBzdGFydFdpdGgoe30pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocG9zc2libGVTdHlsZXMpID0+ICh0aGlzLnBvc3NpYmxlU3R5bGVzID0gcG9zc2libGVTdHlsZXMpKVxuICAgICk7XG5cbiAgICB0aGlzLmhhc1NsaWRlTGF5ZXIkID0gdGhpcy5vcHRpb25zJC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zKSA9PlxuICAgICAgICAob3B0aW9ucy5sYXllcnMgPz8gW10pLm1hcCgobGF5ZXIpID0+ICEhbGF5ZXIuc2xpZGUgJiYgbGF5ZXIuc2xpZGUgIT09ICdhbGwnKS5yZWR1Y2UoKGEsIGIpID0+IGEgfHwgYiwgZmFsc2UpXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMubGF5ZXJHcm91cHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmxheWVyR3JvdXBzKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5sYXllckdyb3VwcyQuc3Vic2NyaWJlKChsYXllckdyb3VwcykgPT4ge1xuICAgICAgICB0aGlzLmxheWVyR3JvdXBzID0gbGF5ZXJHcm91cHM7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMuaW5pdERlZmF1bHRMYXllckdyb3VwKHtcbiAgICAgICAgbGF5ZXJzOiB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1xuICAgICAgICAgID8uZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ3JvdXAgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgKGxheWVyKSA9PlxuICAgICAgICAgICAgICBsYXllci50aXRsZSA/PyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS4ke2xheWVyLnR5cGV9YCwgeyAuLi5sYXllciB9KVxuICAgICAgICAgIClcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGluaXRJbnRlcmFjdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLmluaXQodGhpcyk7XG4gIH1cblxuICBpbml0VG9vbHRpcE1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHRpcE1hbmFnZXIuaW5pdChcbiAgICAgIHRoaXMudG9vbHRpcEZhY3RvcnlTZXJ2aWNlLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgIHRoaXMuc3RvcmUsXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMsXG4gICAgICB0aGlzLndpZGdldFNpemUkLFxuICAgICAgdGhpcy5kaXNwbGF5SGVhZGVyJCxcbiAgICAgIHRoaXMubWFwLFxuICAgICAgdGhpcy5wb3B1cCxcbiAgICAgIHRoaXMucG9wdXBDb250ZW50LFxuICAgICAgdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIsXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoeyB0YXJnZXQ6IHRoaXMubWFwUmVmLm5hdGl2ZUVsZW1lbnQsIGNvbnRyb2xzOiBkZWZhdWx0cyh7IGF0dHJpYnV0aW9uOiBmYWxzZSB9KSB9KTtcbiAgICB0aGlzLmludGVyYWN0aW9uTWFuYWdlciA9IHRoaXMuaW5pdEludGVyYWN0aW9uTWFuYWdlcigpO1xuICAgIHRoaXMubGF5ZXJTbGlkZXIuaW5pdCh0aGlzLm1hcCwgdGhpcy5zbGlkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMudG9vbHRpcE1hbmFnZXIgPSB0aGlzLmluaXRUb29sdGlwTWFuYWdlcigpO1xuICAgIHRoaXMubWFwU3R5bGVVcmwkID0gY29tYmluZUxhdGVzdChbdGhpcy5vcHRpb25zJCwgdGhpcy5tYXBVcmwkXSkucGlwZShcbiAgICAgIG1hcCgoW29wdGlvbnMsIHVybF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0eWxlKSB7XG4gICAgICAgICAgY2FzZSB0aGlzLk5PX1NUWUxFOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY2FzZSB0aGlzLlNUWUxFX0ZST01fVVJMOlxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGVVUkwgPz8gJyc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBgJHt1cmx9L3N0eWxlcy8ke29wdGlvbnMuc3R5bGV9L3N0eWxlLmpzb25gO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuXG4gICAgdGhpcy5tYXBTdHlsZUxheWVyJCA9IHRoaXMubWFwU3R5bGVVcmwkLnBpcGUoXG4gICAgICBtYXAoKHN0eWxlVXJsKSA9PiB7XG4gICAgICAgIGlmICghc3R5bGVVcmwpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBuZXcgTWFwYm94VmVjdG9yTGF5ZXIoe1xuICAgICAgICAgICAgcHJvcGVydGllczogeyB0aXRsZTogJ2JhY2tncm91bmQnIH0sXG4gICAgICAgICAgICBzdHlsZVVybFxuICAgICAgICAgIH0pIC8qICxcbiAgICAgICAgICBuZXcgVGlsZUxheWVyKHtcbiAgICAgICAgICAgIHNvdXJjZTogbmV3IFRpbGVEZWJ1ZygpXG4gICAgICAgICAgfSkgKi9cbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgob3B0aW9ucykgPT4gKHtcbiAgICAgICAgICAgIGNlbnRlcjogZnJvbUxvbkxhdChvcHRpb25zLmNlbnRlciA/PyBXaWRnZXRNYXBVdGlscy5ERUZBVUxUX01BUF9DRU5URVIpLFxuICAgICAgICAgICAgbWF4Wm9vbTogb3B0aW9ucy56b29tPy5tYXggPz8gV2lkZ2V0TWFwVXRpbHMuREVGQVVMVF9aT09NX01BWCxcbiAgICAgICAgICAgIG1pblpvb206IG9wdGlvbnMuem9vbT8ubWluID8/IFdpZGdldE1hcFV0aWxzLkRFRkFVTFRfWk9PTV9NSU4sXG4gICAgICAgICAgICB6b29tOiBvcHRpb25zLnpvb20/LnN0YXJ0ID8/IFdpZGdldE1hcFV0aWxzLkRFRkFVTFRfWk9PTV9TVEFSVFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmlldykgPT4gdGhpcy5tYXAuc2V0VmlldyhuZXcgVmlldyh2aWV3KSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgob3B0aW9ucykgPT4gb3B0aW9ucy5hdHRyaWJ1dGlvbnMpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChhdHRyaWJ1dGlvbnMpID0+IHtcbiAgICAgICAgICBpZiAoIWF0dHJpYnV0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlQ29udHJvbCh0aGlzLmF0dHJpYnV0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFwLmFkZENvbnRyb2wodGhpcy5hdHRyaWJ1dGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5sYXllcnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnJlc3VsdFNldCQsXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuYWRkaXRpb25hbExheWVycyQsXG4gICAgICB0aGlzLml0ZW1TdHlsZXMkLFxuICAgICAgdGhpcy5kYXRhc291cmNlRmlsdGVycyQsXG4gICAgICB0aGlzLmZpZWxkcyRcbiAgICBdKS5waXBlKFxuICAgICAgZmlsdGVyKFxuICAgICAgICAoW3Jlc3VsdFNldCwgb3B0aW9ucywgY2xhc3NlcywgYWRkaXRpb25hbExheWVycywgaXRlbVN0eWxlcywgZmlsdGVycywgZmllbGRzXSkgPT5cbiAgICAgICAgICAhIXJlc3VsdFNldCAmJiAhIW9wdGlvbnMgJiYgISFjbGFzc2VzICYmICEhZmllbGRzXG4gICAgICApLFxuICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5sYXllckdyb3VwcyQpLFxuICAgICAgbWFwKChbW3Jlc3VsdFNldCwgb3B0aW9ucywgY2xhc3NlcywgYWRkaXRpb25hbExheWVycywgaXRlbVN0eWxlcywgZmlsdGVycywgZmllbGRzXSwgbGF5ZXJHcm91cHNdKSA9PiB7XG4gICAgICAgIGxldCBoYXNSZWxhdGlvbkxheWVyID0gbnVsbCBhcyB1bmtub3duIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZTxhbnk+PjtcblxuICAgICAgICBjb25zdCBsYXllcnMgPSAob3B0aW9ucz8ubGF5ZXJzIHx8IFtdKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAobGF5ZXIpID0+IHRoaXMud2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLmRvbnROZWVkTG9jYXRpb24uaW5jbHVkZXMobGF5ZXIudHlwZSkgfHwgISFsYXllci5hdHRyaWJ1dGVcbiAgICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIChsYXllcikgPT4gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuZG9udE5lZWRJbnRlbnNpdHkuaW5jbHVkZXMobGF5ZXIudHlwZSkgfHwgISFsYXllci5pbnRlbnNpdHlBdHRyaWJ1dGVcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgaWR4LCBhcnJheSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlc0ZvckNsYXNzID0gT2JqZWN0LmtleXMocmVzdWx0U2V0Lml0ZW1zKVxuICAgICAgICAgICAgICAubWFwKChjbGFzc0lkKSA9PiAoe1xuICAgICAgICAgICAgICAgIGNsYXNzSWQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRBdHRyaWJ1dGVzRm9yRHJhd2luZyhjbGFzc2VzLCBjbGFzc0lkLCBsYXllcilcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKHAsIGMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5wLFxuICAgICAgICAgICAgICAgICAgW2MuY2xhc3NJZF06IGNcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB7fSBhcyB7XG4gICAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICAgICAgICAgICAgICAgIGludGVuc2l0eUF0dHJpYnV0ZTogQXR0cmlidXRlO1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkF0dHJpYnV0ZTogQXR0cmlidXRlO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBsYXllckNsYXNzZXNJZCA9IGNsYXNzZXMubWFwKChjbGF6eikgPT4gY2xhenouaWQpO1xuICAgICAgICAgICAgaWYgKCdjbGFzc2VzJyBpbiBsYXllciAmJiAhIWxheWVyLmNsYXNzZXMgJiYgbGF5ZXIuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxheWVyQ2xhc3Nlc0lkID0gbGF5ZXIuY2xhc3NlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJhbmdlID0geyBtaW46IDAsIG1heDogMCB9O1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKCEhbGF5ZXIuaW50ZW5zaXR5QXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKHJlc3VsdFNldC5pdGVtcylcbiAgICAgICAgICAgICAgICAubWFwKChjbGFzc0lkKSA9PlxuICAgICAgICAgICAgICAgICAgcmVzdWx0U2V0Lml0ZW1zW2NsYXNzSWRdLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgICAgSXRlbVV0aWxzLmdldEF0dHJpYnV0ZUNhbGN1bGF0ZWRWYWx1ZShpdGVtLCBhdHRyaWJ1dGVzRm9yQ2xhc3NbaXRlbS5vQ2xhc3NdLmludGVuc2l0eUF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gWy4uLnAsIC4uLmNdLCBbXSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgICAgICByYW5nZSA9IHZhbHVlcy5yZWR1Y2UoKHAsIGMpID0+ICh7IG1pbjogTWF0aC5taW4ocC5taW4sIGMpLCBtYXg6IE1hdGgubWF4KHAubWF4LCBjKSB9KSwge1xuICAgICAgICAgICAgICAgIG1pbjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgICAgICBtYXg6IC1OdW1iZXIuTUFYX1ZBTFVFXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbXBsID0gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UubGF5ZXJzSW1wbGVtZW50YXRpb25bbGF5ZXIudHlwZV07XG4gICAgICAgICAgICBpZiAoISFpbXBsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdExheWVyID0gaW1wbChcbiAgICAgICAgICAgICAgICBsYXllciBhcyBhbnksXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc0ZvckNsYXNzLFxuICAgICAgICAgICAgICAgIGxheWVyQ2xhc3Nlc0lkLFxuICAgICAgICAgICAgICAgIHJlc3VsdFNldCxcbiAgICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgICBpdGVtU3R5bGVzLFxuICAgICAgICAgICAgICAgIHRoaXMubWFwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgnZml0JywgbGF5ZXIuZml0KTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCd0eXBlJywgbGF5ZXIudHlwZSk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgnc2xpZGUnLCBsYXllci5zbGlkZSk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgnb3JkZXInLCBsYXllci5vcmRlcik7XG4gICAgICAgICAgICAgIGNvbnN0IG1heExheWVyT3JkZXIgPSBNYXRoLm1heCguLi5hcnJheS5tYXAoKGwpID0+IGwub3JkZXIgPz8gMCkpO1xuICAgICAgICAgICAgICByZXN1bHRMYXllci5zZXRaSW5kZXgobWF4TGF5ZXJPcmRlciArIDEgLSAobGF5ZXIub3JkZXIgPz8gaWR4KSk7XG4gICAgICAgICAgICAgIGlmIChsYXllci50eXBlID09PSAncmVsYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgaGFzUmVsYXRpb25MYXllciA9IHJlc3VsdExheWVyIGFzIHVua25vd24gYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXN1bHRMYXllci5zZXQoJ3RpdGxlJywgbGF5ZXIudGl0bGUpO1xuXG4gICAgICAgICAgICAgIGlmIChsYXllci50eXBlID09PSAnZ2Vvc2VydmVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNxbF9maWx0ZXIgPSBDcWxVdGlscy5nZXRDUUxQYXJhbXNGb3IobGF5ZXIuZGF0YXNvdXJjZUlkLCBmaWx0ZXJzLCBjbGFzc2VzLCBmaWVsZHMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNxbF9maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEFkZGluZyBDUUwgcXVlcnkgdG8gZ2Vvc2VydmVyIGxheWVyc1xuICAgICAgICAgICAgICAgICAgKHJlc3VsdExheWVyIGFzIFRpbGU8VGlsZVdNUz4pLmdldFNvdXJjZSgpIS51cGRhdGVQYXJhbXMoeyBjcWxfZmlsdGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChsYXllci5zbGlkZSAmJiBsYXllci5zbGlkZSAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheWVyU2xpZGVyLmFwcGx5U2xpZGUoXG4gICAgICAgICAgICAgICAgICBsYXllci5zbGlkZSxcbiAgICAgICAgICAgICAgICAgIHJlc3VsdExheWVyIGFzIHVua25vd24gYXMgVGlsZUxheWVyPGFueT4gfCBWZWN0b3JMYXllcjxhbnk+IHwgSGVhdG1hcFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0TGF5ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBMYXllciB0eXBlICR7bGF5ZXIudHlwZX0gaXMgdW5rbm93bmApO1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbCBhcyB1bmtub3duIGFzIEJhc2VMYXllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiAhIWxheWVyKTtcblxuICAgICAgICBpZiAoISFoYXNSZWxhdGlvbkxheWVyKSB7XG4gICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBsYXllcnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiAhKGxheWVyIGluc3RhbmNlb2YgVGlsZSkpXG4gICAgICAgICAgICAubWFwKChsYXllcikgPT5cbiAgICAgICAgICAgICAgbGF5ZXJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLmdldFNvdXJjZSgpXG4gICAgICAgICAgICAgICAgLmdldEZlYXR1cmVzKClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChmZWF0dXJlczogRmVhdHVyZTxhbnk+KSA9PiAhIWZlYXR1cmVzLmdldCgnaWQnKSB8fCAhIWZlYXR1cmVzLmdldCgnZmVhdHVyZXMnKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+IFsuLi5wLCAuLi5jXSwgW10pO1xuXG4gICAgICAgICAgcmVzdWx0U2V0LnJlbGF0aW9ucy5mb3JFYWNoKChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZmVhdHVyZXMuZmluZCgoZjogRmVhdHVyZTxQb2ludCB8IENpcmNsZT4pID0+IGYuZ2V0KCdpZCcpID09PSByZWxhdGlvbi5zb3VyY2UpO1xuICAgICAgICAgICAgY29uc3QgZGVzdCA9IGZlYXR1cmVzLmZpbmQoKGY6IEZlYXR1cmU8UG9pbnQgfCBDaXJjbGU+KSA9PiBmLmdldCgnaWQnKSA9PT0gcmVsYXRpb24uZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgaWYgKCEhc291cmNlICYmICEhZGVzdCkge1xuICAgICAgICAgICAgICBoYXNSZWxhdGlvbkxheWVyLmdldFNvdXJjZSgpPy5hZGRGZWF0dXJlKFdpZGdldE1hcFV0aWxzLmdldExpbmtGZWF0dXJlKHJlbGF0aW9uLCBzb3VyY2UsIGRlc3QpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsYXllcnMucHVzaCguLi5hZGRpdGlvbmFsTGF5ZXJzKTtcblxuICAgICAgICBjb25zdCB2aXNpYmxlTGF5ZXJzID0gbGF5ZXJHcm91cHMubWFwKChncm91cCkgPT4gZ3JvdXAudmlzaWJsZUxheWVycykuZmxhdCgpO1xuICAgICAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIsIGlkeCkgPT4ge1xuICAgICAgICAgIGlmICghdmlzaWJsZUxheWVycy5pbmNsdWRlcyhsYXllci5nZXQoJ3RpdGxlJykpKSB7XG4gICAgICAgICAgICBsYXllci5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFJlc29sdmUgYnVnIGRyYXdpbmcgd2ViZ2xsYXllciB3aXRob3V0IG5vdGhpbmcgdW5kZXJuZWF0aDogYWRkIGVtcHR5IGxheWVyIGJlbG93ICovXG4gICAgICAgIGNvbnN0IF9sYXllcnMgPSB0aGlzLmFkZEVtcHR5V2ViR2xMYXllckJlbG93U2xpZGVIZWF0bWFwcyhsYXllcnMpO1xuICAgICAgICB0aGlzLnByZXZpb3VzTGF5ZXJzLnB1c2goLi4uX2xheWVycyk7XG4gICAgICAgIHJldHVybiBfbGF5ZXJzO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5maXRFeHRlbnRzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMuY2xhc3NlcyQsXG4gICAgICB0aGlzLmZpZWxkcyQsXG4gICAgICB0aGlzLmRhdGFzb3VyY2VGaWx0ZXJzJCxcbiAgICAgIHRoaXMud21zQ2FwYWJpbGl0aWVzJFxuICAgIF0pLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgIHN3aXRjaE1hcCgoW29wdGlvbnMsIGNsYXNzZXMsIGZpZWxkcywgZmlsdGVycywgd21zQ2FwYWJpbGl0aWVzXSkgPT5cbiAgICAgICAgKG9wdGlvbnMubGF5ZXJzID8/IFtdKS5maW5kKChsYXllcikgPT4gWydnZW9zZXJ2ZXInLCAnd21zJ10uaW5jbHVkZXMobGF5ZXIudHlwZSkgJiYgbGF5ZXIuZml0KVxuICAgICAgICAgID8gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICAgIC4uLigob3B0aW9ucy5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInKSA/PyBbXSkgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmZpdClcbiAgICAgICAgICAgICAgICAubWFwKChsYXllcjogTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKSA9PlxuICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmZpbmQoKGNsYXp6KSA9PiBjbGF6ei5pZCA9PT0gbGF5ZXIub0NsYXNzKSA/PyAoeyBhdHRyaWJ1dGVzOiBbXSB9IGFzIHVua25vd24gYXMgQ2xhc3MpXG4gICAgICAgICAgICAgICAgICApLmF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoYXR0cikgPT4gKHsgYXR0ciwgZmllbGQ6IGZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQuaWQgPT09IGF0dHIuZmllbGQpIH0pKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IGF0dHIsIGZpZWxkIH0pID0+IEdlb21ldHJpY0ZpZWxkVHlwZXMuaW5jbHVkZXMoZmllbGQ/LnR5cGUgPz8gJy0tLS0nKSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoeyBhdHRyLCBmaWVsZCB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJ5QWdncmVnYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWdncmVnYXRlKFtsYXllci5kYXRhc291cmNlSWRdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYXRlOiB7IG9wZXJhdGlvbjogT3BlcmF0aW9uLkVYVEVOVCwgYXR0cmlidXRlOiBhdHRyLmlkLCBsYWJlbDogYXR0ci5uYW1lLCBrZWVwMDogZmFsc2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBDaGFydEFnZ3JlZ2F0ZWRXaWRnZXRPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoZXh0ZW50UmVzcG9uc2U6IEFnZ3JlZ2F0aW9uUmVzdWx0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldE1hcFV0aWxzLnByb2plY3RFeHRlbnRBZ2dyZWdhdGlvblJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50UmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdtc0NhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgZGF0YXNvdXJjZTogbGF5ZXIuZGF0YXNvdXJjZUlkLCBleHRlbnQ6IFtdLCBlcnJvcjogdHJ1ZSB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5mbGF0KCksXG4gICAgICAgICAgICAgIC4uLigob3B0aW9ucy5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnR5cGUgPT09ICd3bXMnKSA/PyBbXSkgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNbXSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZml0KVxuICAgICAgICAgICAgICAgIC5tYXAoKGxheWVyOiBNYXBXTVNMYXllckxheWVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW50ID0gWE1MVXRpbHMuZ2V0TGF5ZXJFeHRlbnQobGF5ZXIucGFyYW1MYXllciwgdGhpcy5tYXAsIHdtc0NhcGFiaWxpdGllcyFbbGF5ZXIudXJsXT8uZG9jKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzb3VyY2U6IGB3bXMtJHtsYXllci5wYXJhbUxheWVyfWAsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVudDogZXh0ZW50ID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogIWV4dGVudFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgOiBvZihbXSlcbiAgICAgICksXG4gICAgICBzdGFydFdpdGgoXG4gICAgICAgIFtdIGFzIHtcbiAgICAgICAgICBkYXRhc291cmNlOiBzdHJpbmc7XG4gICAgICAgICAgZXh0ZW50OiBDb29yZGluYXRlW107XG4gICAgICAgICAgZXJyb3I6IGJvb2xlYW47XG4gICAgICAgIH1bXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmxlZ2VuZExheWVycyQgPSB0aGlzLm9wdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChvcHRpb25zKSA9PlxuICAgICAgICAgIChvcHRpb25zLmxheWVycyA/PyBbXSkuZmlsdGVyKChsYXllcikgPT4gWydnZW9zZXJ2ZXInLCAnd21zJ10uaW5jbHVkZXMobGF5ZXIudHlwZSkpIGFzIChcbiAgICAgICAgICAgIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zXG4gICAgICAgICAgICB8IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zXG4gICAgICAgICAgKVtdXG4gICAgICApLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcblxuICAgIHRoaXMubGF5ZXJzVG9wJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMubGVnZW5kVG9wJCwgdGhpcy5sZWdlbmRMYXllcnMkXSkucGlwZShcbiAgICAgIG1hcCgoW2xlZ2VuZFRvcCwgbGF5ZXJzXSkgPT4gbGVnZW5kVG9wICsgKChsYXllcnMubGVuZ3RoID8/IDApID4gMCA/IDUwIDogMCkpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5sYXllcnNUb3AkLCB0aGlzLmxlZ2VuZExheWVycyQsIHRoaXMub2xab29tRWxlbWVudCQsIHRoaXMuZGlzcGxheUhlYWRlciRdKVxuICAgICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLmxheWVycyQpKVxuICAgICAgICAuc3Vic2NyaWJlKChbW2xheWVyc1RvcCwgbGVnZW5kLCB6b29tRWxlbWVudCwgZGlzcGxheUhlYWRlcl0sIGxheWVyc10pID0+IHtcbiAgICAgICAgICBpZiAoem9vbUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHpvb21FbGVtZW50LnN0eWxlLnRvcCA9IGAke1xuICAgICAgICAgICAgICBsYXllcnNUb3AgK1xuICAgICAgICAgICAgICAoKGxlZ2VuZC5sZW5ndGggPz8gMCkgPiAwIHx8IGxheWVycy5sZW5ndGggPiAwID8gMjAgOiAwKSArXG4gICAgICAgICAgICAgICghZGlzcGxheUhlYWRlciA/IFdJREdFVF9IRUFERVJfSEVJR0hULnZhbHVlIDogMClcbiAgICAgICAgICAgIH1weGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMubWFwU3R5bGVMYXllciQsXG4gICAgICAgIHRoaXMubGF5ZXJzJCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZElkcyQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpKSxcbiAgICAgICAgdGhpcy5maXRFeHRlbnRzJCxcbiAgICAgICAgdGhpcy5kYXRhc291cmNlRmlsdGVycyRcbiAgICAgIF0pLnN1YnNjcmliZSgoW21hcFN0eWxlTGF5ZXIsIGxheWVycywgc2VsZWN0ZWRJZHMsIGV4dGVudHMsIGZpbHRlcnNdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5lZWRlZENhbGN1bGF0ZWRFeHRlbnRzID0gbGF5ZXJzLmZpbHRlcihcbiAgICAgICAgICAobGF5ZXIpID0+IFsnZ2Vvc2VydmVyJywgJ3dtcyddLmluY2x1ZGVzKGxheWVyLmdldCgndHlwZScpKSAmJiBsYXllci5nZXQoJ2ZpdCcpXG4gICAgICAgICkubGVuZ3RoO1xuICAgICAgICBjb25zdCBuYkNhbGN1bGF0ZWRFeHRlbnRzID0gZXh0ZW50cy5maWx0ZXIoKGV4dGVudCkgPT4gIWV4dGVudC5lcnJvcikubGVuZ3RoO1xuXG4gICAgICAgIGlmIChuYkNhbGN1bGF0ZWRFeHRlbnRzID49IG5lZWRlZENhbGN1bGF0ZWRFeHRlbnRzKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b0FwcGx5TGF5ZXJzID0gWy4uLmxheWVycywgLi4ubWFwU3R5bGVMYXllcl07XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXRMYXllcnModG9BcHBseUxheWVycyk7XG5cbiAgICAgICAgICAgIHRoaXMuZml0TWFwRm9yT2JqZWN0cyhzZWxlY3RlZElkcywgZXh0ZW50cyk7XG4gICAgICAgICAgICB0aGlzLm1hcC51cGRhdGVTaXplKCk7XG5cbiAgICAgICAgICAgIHRoaXMubWFwXG4gICAgICAgICAgICAgIC5nZXRBbGxMYXllcnMoKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gIShsYXllciBpbnN0YW5jZW9mIFRpbGUpKVxuICAgICAgICAgICAgICAuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBnZXRGZWF0dXJlcyA9IChsYXllci5nZXRTb3VyY2UoKSBhcyBWZWN0b3JTb3VyY2UpPy5nZXRGZWF0dXJlcztcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdldEZlYXR1cmVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAobGF5ZXIuZ2V0U291cmNlKCkgYXMgVmVjdG9yU291cmNlKT8uZ2V0RmVhdHVyZXMoKS5mb3JFYWNoKChmZWF0dXJlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGZlYXR1cmUuZ2V0KCd0eXBlJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBbJ2J1YmJsZScsICdtYXJrZXInLCAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJywgJ211bHRpLWxpbmUnLCAnbXVsdGktcG9seWdvbiddLmluY2x1ZGVzKHR5cGUpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLmdldChzZWxlY3RlZElkcy5pbmNsdWRlcyhmZWF0dXJlLmdldCgnaWQnKSkgPyAnc2VsZWN0ZWRTdHlsZScgOiAnY2xhc3NpY1N0eWxlJylcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tYXAuc2V0TGF5ZXJzKFsuLi5tYXBTdHlsZUxheWVyXSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRW1wdHlXZWJHbExheWVyQmVsb3dTbGlkZUhlYXRtYXBzKGxheWVyczogQmFzZUxheWVyW10pIHtcbiAgICBjb25zdCBfbGF5ZXJzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzW2ldO1xuICAgICAgX2xheWVycy5wdXNoKGxheWVyKTtcbiAgICAgIGlmIChsYXllci5nZXQoJ3R5cGUnKSA9PT0gJ2hlYXRtYXAnICYmIGxheWVyLmdldCgnc2xpZGUnKSkge1xuICAgICAgICBjb25zdCBlbXB0eURhdGEgPSBuZXcgVWludDhBcnJheSgyNTYgKiAyNTYgKiA0KTtcbiAgICAgICAgY29uc3QgZW1wdHlMYXllciA9IG5ldyBXZWJHTFRpbGVMYXllcih7XG4gICAgICAgICAgc291cmNlOiBuZXcgRGF0YVRpbGUoe1xuICAgICAgICAgICAgbG9hZGVyKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZW1wdHlEYXRhO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heFpvb206IDAsXG4gICAgICAgICAgICB3cmFwWDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBfbGF5ZXJzLnB1c2goZW1wdHlMYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfbGF5ZXJzO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5pdFJlc3VsdFNldCQoKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnJlc3VsdFNldHMpLFxuICAgICAgdGhpcy5kYXRhc291cmNlSWRzJCxcbiAgICAgIHRoaXMuc3RhdGljUmVzdWx0U2V0JCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZGF0YXNldHMpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3Jlc3VsdFNldHMsIHJlc3VsdFNldE5hbWVzQXJyYXksIHN0YXRpY1Jlc3VsdFNldCwgZGVmaW5pdGlvbnNdKSA9PiB7XG4gICAgICAgIGlmICghIXN0YXRpY1Jlc3VsdFNldCkge1xuICAgICAgICAgIHJldHVybiBzdGF0aWNSZXN1bHRTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0U2V0QXJyYXkgPSByZXN1bHRTZXROYW1lc0FycmF5XG4gICAgICAgICAgLmZpbHRlcigocnNOYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gZGVmaW5pdGlvbnMuZmluZCgoZHNkKSA9PiBkc2QuaWQgPT09IHJzTmFtZSkgYXMgRGF0YXNldCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiAhZGVmaW5pdGlvbiB8fCAhKGRlZmluaXRpb24ubWV0YWRhdGEgPz8gW10pLmZpbmQoKG1ldGEpID0+IG1ldGEubWV0YWRhdGFEZWYubmFtZSA9PT0gJ19nZW9LZXknKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKHJzTmFtZSkgPT4gcmVzdWx0U2V0c1tyc05hbWUgPz8gJyddKVxuICAgICAgICAgIC5maWx0ZXIoKHJzTmFtZSkgPT4gISFyc05hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0U2V0QXJyYXkucmVkdWNlKChyczEsIHJzMikgPT4gUmVzdWx0c2V0VXRpbHMubWVyZ2VSZXN1bHRTZXRzKHJzMSwgcnMyKSwge1xuICAgICAgICAgIGl0ZW1zOiB7fSxcbiAgICAgICAgICByZWxhdGlvbnM6IFtdLFxuICAgICAgICAgIG1lcmdlZDogcmVzdWx0U2V0QXJyYXkubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgdikgPT4gZXF1YWwocCwgdikpXG4gICAgKTtcbiAgfVxuXG4gIHNldERlZmF1bHRMYXllclRpdGxlKFxuICAgIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBjYXBhYmlsaXRpZXM6XG4gICAgICB8IHtcbiAgICAgICAgICBbcDogc3RyaW5nXTogR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2UgfCBudWxsO1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIWxheWVyLnRpdGxlKSB7XG4gICAgICBpZiAoWydnZW9zZXJ2ZXInLCAnd21zJ10uaW5jbHVkZXMobGF5ZXIudHlwZSkpIHtcbiAgICAgICAgY29uc3QgZ2VvTGF5ZXIgPSBsYXllciBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMgfCBNYXBXTVNMYXllckxheWVyT3B0aW9ucztcbiAgICAgICAgY29uc3QgbGF5ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXMgPyBjYXBhYmlsaXRpZXNbZ2VvTGF5ZXIudXJsXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobGF5ZXJDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ0xheWVyID0gWE1MVXRpbHMuZ2V0TWF0Y2hpbmdMYXllcihnZW9MYXllci5wYXJhbUxheWVyLCBsYXllckNhcGFiaWxpdGllcy5kb2MpO1xuICAgICAgICAgIGlmIChtYXRjaGluZ0xheWVyKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1RpdGxlID0gWE1MVXRpbHMuZmluZChtYXRjaGluZ0xheWVyLmNoaWxkTm9kZXMsICdUaXRsZScpO1xuICAgICAgICAgICAgaWYgKG1hdGNoaW5nVGl0bGUpIHtcbiAgICAgICAgICAgICAgbGF5ZXIudGl0bGUgPVxuICAgICAgICAgICAgICAgICEhbWF0Y2hpbmdUaXRsZS50ZXh0Q29udGVudCAmJiBtYXRjaGluZ1RpdGxlLnRleHRDb250ZW50Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gbWF0Y2hpbmdUaXRsZS50ZXh0Q29udGVudFxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxheWVyLnRpdGxlID0gZ2VvTGF5ZXIucGFyYW1MYXllcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGF5ZXIudGl0bGUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS4ke2xheWVyLnR5cGV9YCwgeyAuLi5sYXllciB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaXRNYXBGb3JPYmplY3RzKFxuICAgIHNlbGVjdGVkSWRzPzogc3RyaW5nW10sXG4gICAgZXh0ZW50czoge1xuICAgICAgZGF0YXNvdXJjZTogc3RyaW5nO1xuICAgICAgZXh0ZW50OiBDb29yZGluYXRlW107XG4gICAgfVtdID0gW11cbiAgKSB7XG4gICAgbGV0IGV4dGVudCA9IGNyZWF0ZUVtcHR5KCk7XG4gICAgY29uc3QgbGlzdE9mTWFya2VycyA9IFtdIGFzIGFueVtdO1xuXG4gICAgLyogTWFuZGF0b3J5IGZpdCAqL1xuICAgIHRoaXMubWFwXG4gICAgICAuZ2V0QWxsTGF5ZXJzKClcbiAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXRQcm9wZXJ0aWVzKClbJ2ZpdCddKVxuICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIuZ2V0U291cmNlICYmICEhbGF5ZXIuZ2V0U291cmNlKCkgJiYgISEobGF5ZXIuZ2V0U291cmNlKCkgYXMgVmVjdG9yU291cmNlKS5nZXRGZWF0dXJlcylcbiAgICAgIC5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAobGF5ZXIuZ2V0U291cmNlKCkgYXMgVmVjdG9yU291cmNlKS5nZXRGZWF0dXJlcygpLmZvckVhY2goKGZlYXR1cmU6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZmVhdHVyZS5nZXQoJ2lkJyk7XG4gICAgICAgICAgaWYgKCFzZWxlY3RlZElkcyB8fCBzZWxlY3RlZElkcy5sZW5ndGggPD0gMCB8fCAoc2VsZWN0ZWRJZHMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZElkcy5pbmNsdWRlcyhpZCkpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmUuZ2V0KCd0eXBlJykpIHtcbiAgICAgICAgICAgICAgY2FzZSAnaGVhdHBvaW50JzpcbiAgICAgICAgICAgICAgY2FzZSAncG9pbnQnOlxuICAgICAgICAgICAgICBjYXNlICdtYXJrZXInOlxuICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaChmZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2xpbmUnOlxuICAgICAgICAgICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgICAgICAgICBsaXN0T2ZNYXJrZXJzLnB1c2goLi4uZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldENvb3JkaW5hdGVzKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgICAgICAgY2FzZSAnbXVsdGktbGluZSc6XG4gICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKC4uLmZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpLmZsYXQoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ211bHRpLXBvbHlnb24nOlxuICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaCguLi5mZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKS5mbGF0KCkuZmxhdCgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBsaXN0T2ZNYXJrZXJzLnB1c2goZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldENlbnRlcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEV4dGVudCA9IGJvdW5kaW5nRXh0ZW50KFxuICAgICAgbGlzdE9mTWFya2Vycy5maWx0ZXIoKGNvb3JkKSA9PiAhIWNvb3JkKS5jb25jYXQoLi4uZXh0ZW50cy5tYXAoKGV4dGVudCkgPT4gZXh0ZW50LmV4dGVudCkpXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRXh0ZW50WzBdICE9PSBJbmZpbml0eSAmJlxuICAgICAgc2VsZWN0ZWRFeHRlbnRbMV0gIT09IEluZmluaXR5ICYmXG4gICAgICBzZWxlY3RlZEV4dGVudFsyXSAhPT0gLUluZmluaXR5ICYmXG4gICAgICBzZWxlY3RlZEV4dGVudFszXSAhPT0gLUluZmluaXR5XG4gICAgKSB7XG4gICAgICBleHRlbnQgPSBzZWxlY3RlZEV4dGVudDtcbiAgICB9XG5cbiAgICBpZiAoZXh0ZW50WzBdICE9PSBJbmZpbml0eSAmJiBleHRlbnRbMV0gIT09IEluZmluaXR5ICYmIGV4dGVudFsyXSAhPT0gLUluZmluaXR5ICYmIGV4dGVudFszXSAhPT0gLUluZmluaXR5KSB7XG4gICAgICB0aGlzLm1hcC5nZXRWaWV3KCkuZml0KGV4dGVudCwgeyBwYWRkaW5nOiBbMjAsIDIwLCA3MCwgNzBdLCBkdXJhdGlvbjogMjAwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXR0cmlidXRlc0ZvckRyYXdpbmcoY2xhc3NlczogQ2xhc3NbXSwgY2xhc3NJZDogc3RyaW5nLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgY2xhc3NPYmogPSBjbGFzc2VzLmZpbmQoKGNsKSA9PiBjbC5pZCA9PT0gY2xhc3NJZCkgPz8gKHsgYXR0cmlidXRlczogW10gYXMgQXR0cmlidXRlW10gfSBhcyBDbGFzcyk7XG4gICAgY29uc3QgbG9jYXRpb25BdHRyaWJ1dGUgPSB0aGlzLmdldExvY2F0aW9uQXR0cmlidXRlKGNsYXNzT2JqLCBsYXllcik7XG4gICAgY29uc3QgaW50ZW5zaXR5QXR0cmlidXRlID0gdGhpcy5nZXRJbnRlbnNpdHlBdHRyaWJ1dGUoXG4gICAgICBjbGFzc09iaixcbiAgICAgIGxheWVyIGFzIE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnNcbiAgICApO1xuICAgIHJldHVybiB7IGxvY2F0aW9uQXR0cmlidXRlLCBpbnRlbnNpdHlBdHRyaWJ1dGUgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW50ZW5zaXR5QXR0cmlidXRlKFxuICAgIGNsYXNzT2JqOiBDbGFzcyB8IHVuZGVmaW5lZCxcbiAgICBsYXllcjogTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9uc1xuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGNsYXNzT2JqIHx8IHsgYXR0cmlidXRlczogW10gfSkuYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLnRlY2huaWNhbE5hbWUgPT09IGxheWVyPy5pbnRlbnNpdHlBdHRyaWJ1dGUpID8/XG4gICAgICAodW5kZWZpbmVkIGFzIHVua25vd24gYXMgQXR0cmlidXRlKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldExvY2F0aW9uQXR0cmlidXRlKGNsYXNzT2JqOiBDbGFzcywgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucyk6IEF0dHJpYnV0ZSB7XG4gICAgdHlwZSBsYXllcnMgPSBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zO1xuICAgIGNvbnN0IHNwZWNpZmljTGF5ZXIgPSBsYXllciBhcyBsYXllcnM7XG4gICAgcmV0dXJuIChcbiAgICAgIGNsYXNzT2JqLmF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci50ZWNobmljYWxOYW1lID09PSBzcGVjaWZpY0xheWVyPy5hdHRyaWJ1dGUpID8/XG4gICAgICAodW5kZWZpbmVkIGFzIHVua25vd24gYXMgQXR0cmlidXRlKVxuICAgICk7XG4gIH1cblxuICBjaGFuZ2VTdHlsZSgkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuc3R5bGUgPSAkZXZlbnQ7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkuc3R5bGUgIT09IHRoaXMuU1RZTEVfRlJPTV9VUkwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5LnN0eWxlVVJMO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVN0eWxlVVJMKCRldmVudDogRXZlbnQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5vcHRpb25zQ29weS5zdHlsZVVSTCA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZUZpdCgkZXZlbnQ6IGJvb2xlYW4sIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5maXQgPSAkZXZlbnQ7XG4gIH1cblxuICBjaGFuZ2VTbGlkZSgkZXZlbnQ6IHVuZGVmaW5lZCB8ICdsZWZ0JyB8ICdyaWdodCcsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5zbGlkZSA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZUF0dHJpYnV0aW9ucygkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmF0dHJpYnV0aW9ucyA9ICRldmVudDtcbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5hdHRyaWJ1dGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLmF0dHJpYnV0aW9uID0gJycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiBkZWxldGUgbGF5ZXIuYXR0cmlidXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGFkZExheWVyKGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmxheWVycykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSBbXTtcbiAgICB9XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgQHByeS53aWRnZXQubWFwLmxheWVyYCwgeyBpbmRleDogdGhpcy5vcHRpb25zQ29weS5sYXllcnMubGVuZ3RoICsgMSB9KTtcblxuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLnB1c2goe1xuICAgICAgYXR0cmlidXRlOiAnJyxcbiAgICAgIGdyb3VwOiBncm91cC5uYW1lLFxuICAgICAgdGl0bGUsXG4gICAgICB0eXBlOiAnbWFya2VyJ1xuICAgIH0pO1xuICAgIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbdGl0bGVdID0gZmFsc2U7XG5cbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVMYXllckdyb3VwKHsgbmFtZTogZ3JvdXAubmFtZSwgdmlzaWJsZUxheWVyczogWy4uLmdyb3VwLnZpc2libGVMYXllcnMsIHRpdGxlXSB9KVxuICAgICk7XG4gICAgdGhpcy51cGRhdGVMYXllck9yZGVyKCk7XG4gIH1cblxuICBjaGFuZ2VMYXllclR5cGUoJGV2ZW50OiBhbnksIGk6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5sYXllcnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPz8gW107XG4gICAgfVxuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUgPSAkZXZlbnQ7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUgPT09ICd3bXMnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0gYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnM7XG4gICAgICBvcHRpb25zLnBhcmFtTGF5ZXIgPSBvcHRpb25zLnBhcmFtTGF5ZXIgPz8gJyc7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsID8/ICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSA9PT0gJ3dtdHMnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0gYXMgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucy5wYXJhbUxheWVyID0gb3B0aW9ucy5wYXJhbUxheWVyID8/ICcnO1xuICAgICAgb3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgPz8gJyc7XG4gICAgICBvcHRpb25zLm1hdHJpeFNldCA9IG9wdGlvbnMubWF0cml4U2V0ID8/ICcnO1xuICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCA/PyAnJztcbiAgICB9XG4gICAgaWYgKFsnZmVhdHVyZWxheWVyJywgJ3ZlY3RvcnRpbGUnLCAncmFzdGVydGlsZSddLmluY2x1ZGVzKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUpKSB7XG4gICAgICBsZXQgb3B0aW9uczogTWFwRmVhdHVyZUxheWVyT3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXSBhcyBNYXBGZWF0dXJlTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCA/PyAnJztcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VUaXRsZSgkZXZlbnQ6IGFueSwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICBjb25zdCB2aXNpYmxlTGF5ZXJzID0gZ3JvdXAudmlzaWJsZUxheWVycy5tYXAoKGxheWVyVGl0bGUpID0+IChsYXllclRpdGxlID09PSBsYXllci50aXRsZSA/ICRldmVudCA6IGxheWVyVGl0bGUpKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7IG5hbWU6IGdyb3VwLm5hbWUsIHZpc2libGVMYXllcnMgfSkpO1xuICAgIGRlbGV0ZSB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV07XG4gICAgbGF5ZXIudGl0bGUgPSAkZXZlbnQ7XG4gICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVskZXZlbnRdID0gdHJ1ZTtcbiAgfVxuXG4gIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLnJlbW92ZUVtcHR5TGF5ZXJHcm91cHMoKTtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy53aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIC4uLnRoaXMubWFuaWZlc3QsXG4gICAgICAgIG9wdGlvbnM6IHsgLi4udGhpcy5vcHRpb25zQ29weSwgbGF5ZXJzOiAodGhpcy5vcHRpb25zQ29weS5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIudHlwZSkgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2hhbmdlTG9jYXRpb25BdHRyaWJ1dGVzKCRldmVudDogYW55LCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLmF0dHJpYnV0ZSA9ICRldmVudDtcbiAgfVxuXG4gIGxheWVySGFzSW50ZW5zaXR5KGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpOiBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zIHtcbiAgICByZXR1cm4gPE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnM+bGF5ZXI7XG4gIH1cblxuICBjaGFuZ2VJbnRlbnNpdHlBdHRyaWJ1dGVzKCRldmVudDogYW55LCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgbGF5ZXJfID0gPE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnM+bGF5ZXI7XG4gICAgbGF5ZXJfLmludGVuc2l0eUF0dHJpYnV0ZSA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZUNsYXNzZXMoJGV2ZW50OiBzdHJpbmdbXSwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IHNwZWNpZmljTGF5ZXIgPSBsYXllciBhc1xuICAgICAgfCBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnM7XG4gICAgc3BlY2lmaWNMYXllci5jbGFzc2VzID0gJGV2ZW50O1xuICB9XG5cbiAgZGVsZXRlTGF5ZXIoaTogbnVtYmVyLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cDogTGF5ZXJHcm91cCkge1xuICAgIHRoaXMub3B0aW9uc0NvcHk/LmxheWVycz8uc3BsaWNlKGksIDEpO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJHcm91cChcbiAgICAgIGdyb3VwLm5hbWUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBncm91cC52aXNpYmxlTGF5ZXJzLmZpbHRlcigobCkgPT4gbCAhPT0gbGF5ZXIudGl0bGUpXG4gICAgKTtcbiAgICB0aGlzLnJlbW92ZUVtcHR5TGF5ZXJHcm91cHMoKTtcbiAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2F1dG8nKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllciA9IFsuLi4odGhpcy5vcHRpb25zQ29weS5pZ25vcmVBdXRvTGF5ZXIgPz8gW10pLCBsYXllci5rZXkgKyAnLScgKyBsYXllci5zdWJUeXBlXTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VVcmwoXG4gICAgJGV2ZW50OiBFdmVudCxcbiAgICBsYXllcjpcbiAgICAgIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwRmVhdHVyZUxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBWZWN0b3JUaWxlTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFJhc3RlclRpbGVMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1xuICApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIudXJsID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlQXR0cmlidXRpb24oJGV2ZW50OiBFdmVudCwgbGF5ZXI6IEJhc2VXaWRnZXRNYXBMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuYXR0cmlidXRpb24gPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VQYXJhbUxheWVyKCRldmVudDogRXZlbnQsIGxheWVyOiBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcFdNVFNMYXllckxheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5wYXJhbUxheWVyID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlUGFyYW1UaWxlZCgkZXZlbnQ6IGJvb2xlYW4sIGxheWVyOiBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucykge1xuICAgIGxheWVyLnBhcmFtVGlsZWQgPSAkZXZlbnQ7XG4gICAgdGhpcy50b29sdGlwTWFuYWdlci5jbGVhclRvb2x0aXAoKTtcbiAgfVxuXG4gIGNoYW5nZU1hdHJpeFNldCgkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLm1hdHJpeFNldCA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZVBhcmFtU3R5bGUoJGV2ZW50OiBFdmVudCwgbGF5ZXI6IE1hcFdNVFNMYXllckxheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5zdHlsZSA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGV4cG9ydCgpIHtcbiAgICBXaWRnZXRNYXBVdGlscy5leHBvcnRNYXBBc0ltYWdlKHRoaXMubWFwLCAnbWFwLnBuZycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9JbWFnZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBXaWRnZXRNYXBVdGlscy5nZXRNYXBBc1BuZyh0aGlzLm1hcCk7XG4gIH1cblxuICBjaGFuZ2VDbHVzdGVyZWQobGF5ZXI6IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucywgJGV2ZW50OiBib29sZWFuKSB7XG4gICAgbGF5ZXIuY2x1c3RlcmVkID0gJGV2ZW50O1xuICAgIGlmIChsYXllci5jbHVzdGVyZWQpIHtcbiAgICAgIGxheWVyLmNsdXN0ZXJEaXN0YW5jZSA9IDEwO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUNsdXN0ZXJEaXN0YW5jZShsYXllcjogTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zLCAkZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLmNsdXN0ZXJEaXN0YW5jZSA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZU9wYWNpdHkobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgJGV2ZW50OiBzdHJpbmcpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIub3BhY2l0eSA9IHBhcnNlSW50KCRldmVudCwgMTApO1xuICB9XG5cbiAgZ2V0V01TTGF5ZXJzKCk6IExheWVyPGFueT5bXSB7XG4gICAgcmV0dXJuICF0aGlzLm1hcFxuICAgICAgPyBbXVxuICAgICAgOiB0aGlzLm1hcFxuICAgICAgICAgIC5nZXRBbGxMYXllcnMoKVxuICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFRpbGVXTVMgfHwgbGF5ZXIuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJbWFnZVdNUylcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnJlbmRlcmVkID09PSB0cnVlKTtcbiAgfVxuXG4gIGlzTGF5ZXJSZW5kZXJlZChsYXllcjogYW55KSB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRXTVNMYXllcnMoKS5maW5kKCh3bXNMYXllcikgPT4gd21zTGF5ZXIuZ2V0KCd0aXRsZScpID09PSBsYXllci50aXRsZSk7XG4gIH1cblxuICBjaGFuZ2VXbXNDbGFzcygkZXZlbnQ6IGFueSwgbGF5ZXI6IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgbGF5ZXIub0NsYXNzID0gJGV2ZW50O1xuICB9XG5cbiAgdG9nZ2xlTGVnZW5kKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmxlZ2VuZFRhYiA9IHRoaXMubGVnZW5kVGFiID09PSBpbmRleCA/IC0xIDogaW5kZXg7XG4gIH1cblxuICB0b2dnbGVMZWdlbmRXaW5kb3coKSB7XG4gICAgdGhpcy5sZWdlbmRUYWJPcGVuID0gIXRoaXMubGVnZW5kVGFiT3BlbjtcbiAgICB0aGlzLmxheWVyc1RhYk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZUxheWVyc1dpbmRvdygpIHtcbiAgICB0aGlzLmxheWVyc1RhYk9wZW4gPSAhdGhpcy5sYXllcnNUYWJPcGVuO1xuICAgIHRoaXMubGVnZW5kVGFiT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG1hcExheWVycygpIHtcbiAgICByZXR1cm4gKHRoaXMubWFwID8/IHsgZ2V0TGF5ZXJzOiAoKSA9PiAoeyBnZXRBcnJheTogKCkgPT4gW10gfSkgfSlcbiAgICAgIC5nZXRMYXllcnMoKVxuICAgICAgLmdldEFycmF5KClcbiAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXQoJ3RpdGxlJykgIT09ICdiYWNrZ3JvdW5kJyk7XG4gIH1cblxuICBnZXQgcmlnaHRTbGlkZUxheWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXBMYXllcnMuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0KCdzbGlkZScpID09PSAncmlnaHQnKTtcbiAgfVxuXG4gIGdldCBsZWZ0U2xpZGVMYXllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldCgnc2xpZGUnKSA9PT0gJ2xlZnQnKTtcbiAgfVxuXG4gIGNoYW5nZVZpc2liaWxpdHkoZ3JvdXA6IExheWVyR3JvdXAsIF9sYXllcj86IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLm1hcExheWVycy5maW5kKChsYXllcikgPT4gbGF5ZXIuZ2V0UHJvcGVydGllcygpWyd0aXRsZSddID09PSBfbGF5ZXI/LnRpdGxlKTtcbiAgICBpZiAoZ3JvdXAuc2luZ2xlTGF5ZXIpIHtcbiAgICAgIGNvbnN0IGdyb3VwTGF5ZXJzID1cbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobCkgPT4gbC5ncm91cCA9PT0gZ3JvdXAubmFtZSkubWFwKChsYXllcikgPT4gbGF5ZXIudGl0bGUpID8/IFtdO1xuXG4gICAgICB0aGlzLm1hcExheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICBpZiAoZ3JvdXBMYXllcnMuaW5jbHVkZXMobGF5ZXIuZ2V0UHJvcGVydGllcygpWyd0aXRsZSddKSkge1xuICAgICAgICAgIGxheWVyLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG9sTGF5ZXI/LnNldFZpc2libGUodHJ1ZSk7XG5cbiAgICAgIF9sYXllclxuICAgICAgICA/IHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVMYXllckdyb3VwKHsgbmFtZTogZ3JvdXAubmFtZSwgdmlzaWJsZUxheWVyczogW19sYXllci50aXRsZSFdIH0pKVxuICAgICAgICA6IHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVMYXllckdyb3VwKHsgbmFtZTogZ3JvdXAubmFtZSwgdmlzaWJsZUxheWVyczogW10gfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbExheWVyPy5zZXRWaXNpYmxlKCFvbExheWVyPy5nZXRWaXNpYmxlKCkpO1xuXG4gICAgICBjb25zdCB2aXNpYmxlTGF5ZXJzID0gZ3JvdXAudmlzaWJsZUxheWVycy5pbmNsdWRlcyhfbGF5ZXI/LnRpdGxlISlcbiAgICAgICAgPyBncm91cC52aXNpYmxlTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyICE9PSBfbGF5ZXI/LnRpdGxlKVxuICAgICAgICA6IFsuLi5ncm91cC52aXNpYmxlTGF5ZXJzLCBfbGF5ZXI/LnRpdGxlIV07XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7IG5hbWU6IGdyb3VwLm5hbWUsIHZpc2libGVMYXllcnMgfSkpO1xuICAgIH1cbiAgICB0aGlzLm1hcC51cGRhdGVTaXplKCk7XG4gIH1cblxuICBpc0xheWVyVmlzaWJsZShsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cDogTGF5ZXJHcm91cCkge1xuICAgIGlmIChncm91cC52aXNpYmxlTGF5ZXJzKSB7XG4gICAgICByZXR1cm4gZ3JvdXAudmlzaWJsZUxheWVycy5pbmNsdWRlcyhsYXllci50aXRsZSA/PyAnJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5nZUF1dG9MYXllcigkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuYXV0b21hdGljTGF5ZXJzID0gJGV2ZW50O1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5hdXRvbWF0aWNMYXllcnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllcjtcbiAgICB9XG4gIH1cblxuICBnZXQgbGF5ZXJWaXNpYmxlSWR4KCkge1xuICAgIHJldHVybiB0aGlzLm1hcExheWVycy5tYXAoKGxheWVyLCBpZHgpID0+IChsYXllci5nZXRWaXNpYmxlKCkgPyBpZHggOiAwKSkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgfHwgLTE7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuXG4gICAgLy8gVHJ5aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuICAgIHRoaXMuY2xlYXJMYXllcnModGhpcy5tYXAuZ2V0TGF5ZXJzKCkuZ2V0QXJyYXkoKSk7XG4gICAgdGhpcy5jbGVhckxheWVycyh0aGlzLnByZXZpb3VzTGF5ZXJzKTtcbiAgICB0aGlzLm1hcC5nZXRSZW5kZXJlcigpIS5kaXNwb3NlKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGRlbGV0ZSB0aGlzLm1hcDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5tYXAgPSBudWxsO1xuICAgIHRoaXMudG9vbHRpcE1hbmFnZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgZ2V0U3R5bGUoX2xheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBsYXllciA9IF9sYXllciBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucztcbiAgICBpZiAobGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnM/LlNUWUxFUykge1xuICAgICAgcmV0dXJuIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzPy5TVFlMRVM7XG4gICAgfVxuICAgIC8qIE5vdCBtYW5pZmVzdC1kZWZpbmVkIHN0eWxlOiB1c2UgZmlyc3QgaW4gbGluZSBiZWNhdXNlIGl0J3MgdGhlIGRlZmF1bHQgb25lIHNlbnQgYnkgZ2Vvc2VydmVyICovXG4gICAgY29uc3QgcG9zc2libGVTdHlsZXNGb3JVcmwgPSB0aGlzLnBvc3NpYmxlU3R5bGVzW2xheWVyLnVybF0gPz8geyBsYXllcnM6IHt9IH07XG4gICAgbGV0IHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyID0gcG9zc2libGVTdHlsZXNGb3JVcmwubGF5ZXJzIVtsYXllci5wYXJhbUxheWVyXTtcbiAgICBpZiAoIXBvc3NpYmxlc1N0eWxlc0ZvckxheWVyKSB7XG4gICAgICBwb3NzaWJsZXNTdHlsZXNGb3JMYXllciA9IHBvc3NpYmxlU3R5bGVzRm9yVXJsLmxheWVycyFbKGxheWVyLnBhcmFtTGF5ZXIgPz8gJzonKS5zcGxpdCgnOicpWzFdXSA/PyB7IHN0eWxlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyLnN0eWxlc1swXT8uaWQ7XG4gIH1cblxuICBjaGFuZ2VMYXllclN0eWxlKCRldmVudDogYW55LCBfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyID0gX2xheWVyIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zO1xuICAgIGlmICghbGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnMpIHtcbiAgICAgIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzID0ge307XG4gICAgfVxuICAgIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzLlNUWUxFUyA9ICRldmVudDtcbiAgfVxuXG4gIGdldEFzV21zVHlwZShfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIHJldHVybiBfbGF5ZXIgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnM7XG4gIH1cblxuICBsYXllclN0eWxlT3B0aW9ucyhfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyID0gX2xheWVyIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zO1xuICAgIGNvbnN0IHBvc3NpYmxlU3R5bGVzRm9yVXJsID0gdGhpcy5wb3NzaWJsZVN0eWxlc1tsYXllci51cmxdID8/IHsgbGF5ZXJzOiB7fSB9O1xuICAgIGxldCBwb3NzaWJsZXNTdHlsZXNGb3JMYXllciA9IHBvc3NpYmxlU3R5bGVzRm9yVXJsLmxheWVycyFbbGF5ZXIucGFyYW1MYXllcl07XG4gICAgaWYgKCFwb3NzaWJsZXNTdHlsZXNGb3JMYXllcikge1xuICAgICAgcG9zc2libGVzU3R5bGVzRm9yTGF5ZXIgPSBwb3NzaWJsZVN0eWxlc0ZvclVybC5sYXllcnMhWyhsYXllci5wYXJhbUxheWVyID8/ICc6Jykuc3BsaXQoJzonKVsxXV0gPz8geyBzdHlsZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiBwb3NzaWJsZXNTdHlsZXNGb3JMYXllci5zdHlsZXM7XG4gIH1cblxuICB0cmlnZ2VyTGF5ZXJSZW5kZXIoKSB7XG4gICAgdGhpcy5tYXAucmVuZGVyKCk7XG4gIH1cblxuICBjaGFuZ2VTbGlkZU9wdGlvbigkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuc2xpZGUgPSAkZXZlbnQ7XG4gICAgaWYgKCRldmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLnNsaWRlID0gJ2FsbCcpKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVNZW51KCkge1xuICAgIHRoaXMuYWN0aW9uTWVudU9wZW4kLm5leHQoIXRoaXMuYWN0aW9uTWVudU9wZW4kLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPbFpvb21FbGVtZW50KCkge1xuICAgIHRoaXMub2xab29tRWxlbWVudCQubmV4dChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2wtem9vbScpKTtcbiAgICBpZiAoIXRoaXMub2xab29tRWxlbWVudCQuZ2V0VmFsdWUoKSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmdldE9sWm9vbUVsZW1lbnQoKSwgNTApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB6b29tSW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2wtem9vbS1pbicpO1xuICAgICAgaWYgKHpvb21Jbikge1xuICAgICAgICB6b29tSW4uc2V0QXR0cmlidXRlKCdkYXRhLXRvb2x0aXAnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnpvb21JbicpKTtcbiAgICAgICAgem9vbUluLnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLXBvc2l0aW9uJywgJ2xlZnQnKTtcbiAgICAgICAgem9vbUluLmNsYXNzTGlzdC5hZGQoJ2EtdG9vbHRpcCcsICctLW5vcG9zJyk7XG4gICAgICAgIHpvb21Jbi5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB6b29tT3V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm9sLXpvb20tb3V0Jyk7XG4gICAgICBpZiAoem9vbU91dCkge1xuICAgICAgICB6b29tT3V0LnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwJywgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC56b29tT3V0JykpO1xuICAgICAgICB6b29tT3V0LnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLXBvc2l0aW9uJywgJ2xlZnQnKTtcbiAgICAgICAgem9vbU91dC5jbGFzc0xpc3QuYWRkKCdhLXRvb2x0aXAnLCAnLS1ub3BvcycpO1xuICAgICAgICB6b29tT3V0LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTZWxlY3Rpb24oYWN0aW9uOiAnY2xpY2snIHwgJ2xhc3NvJyB8ICdyZWN0YW5nbGUnIHwgJ3pvb20nIHwgJ21vdmUnIHwgJ2V4cG9ydCcgfCAndXBsb2FkJykge1xuICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkludGVyYWN0aW9uLmNoYW5nZVNlbGVjdGlvbihhY3Rpb24pO1xuICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckxheWVycyhsYXllcnM6IEJhc2VMYXllcltdKSB7XG4gICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllciAmJiAobGF5ZXIgYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPikuZ2V0U291cmNlKCkpIHtcbiAgICAgICAgKGxheWVyIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZT4pLmdldFNvdXJjZSgpIS5jbGVhcigpO1xuICAgICAgICBsYXllci5zZXRTb3VyY2UodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIFRpbGVMYXllciAmJiAobGF5ZXIgYXMgVGlsZUxheWVyPGFueT4pLmdldFNvdXJjZSgpKSB7XG4gICAgICAgIChsYXllciBhcyBUaWxlTGF5ZXI8YW55PikuZ2V0U291cmNlKCkuY2xlYXIoKTtcbiAgICAgICAgbGF5ZXIuc2V0U291cmNlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICBsYXllci5kaXNwb3NlKCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRMYXllckdyb3VwKCkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLmFkZExheWVyR3JvdXAoe1xuICAgICAgICBuYW1lOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5ncm91cCcpICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgICh0aGlzLmxheWVyR3JvdXBzLmxlbmd0aCArIDEpLnRvU3RyaW5nKClcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5sYXllckdyb3Vwc1t0aGlzLmxheWVyR3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgIHRoaXMuYWRkTGF5ZXIoZ3JvdXApO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJHcm91cChuYW1lOiBzdHJpbmcsIG5ld05hbWU/OiBzdHJpbmcsIHNpbmdsZUxheWVyPzogYm9vbGVhbiwgdmlzaWJsZUxheWVycz86IHN0cmluZ1tdKSB7XG4gICAgaWYgKG5ld05hbWUgPT09IHVuZGVmaW5lZCAmJiBzaW5nbGVMYXllciAhPT0gdW5kZWZpbmVkICYmIHZpc2libGVMYXllcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVMYXllckdyb3VwKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgc2luZ2xlTGF5ZXIsXG4gICAgICAgICAgdmlzaWJsZUxheWVyczogc2luZ2xlTGF5ZXIgPyBbdmlzaWJsZUxheWVyc1swXV0gOiB2aXNpYmxlTGF5ZXJzXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobmFtZSAhPT0gbmV3TmFtZSkge1xuICAgICAgaWYgKG5hbWUgPT09IERFRkFVTFRfTEFZRVJfR1JPVVApIHtcbiAgICAgICAgY29uc3QgbGF5ZXJzVG9UcmFuc2ZlciA9XG4gICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBERUZBVUxUX0xBWUVSX0dST1VQKS5tYXAoKGwpID0+IGwudGl0bGUpID8/IFtdO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIERhc2hib2FyZEFjdGlvbnMuYWRkTGF5ZXJHcm91cCh7XG4gICAgICAgICAgICBuYW1lOiBuZXdOYW1lLFxuICAgICAgICAgICAgc2luZ2xlTGF5ZXIsXG4gICAgICAgICAgICB2aXNpYmxlTGF5ZXJzOiB2aXNpYmxlTGF5ZXJzIS5maWx0ZXIoKGwpID0+IGxheWVyc1RvVHJhbnNmZXIuaW5jbHVkZXMobCkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZUxheWVyR3JvdXAoe1xuICAgICAgICAgICAgbmFtZTogREVGQVVMVF9MQVlFUl9HUk9VUCxcbiAgICAgICAgICAgIG5ld05hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNpbmdsZUxheWVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB2aXNpYmxlTGF5ZXJzOiB2aXNpYmxlTGF5ZXJzIS5maWx0ZXIoKGwpID0+ICFsYXllcnNUb1RyYW5zZmVyLmluY2x1ZGVzKGwpKVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7IG5hbWUsIG5ld05hbWUsIHNpbmdsZUxheWVyLCB2aXNpYmxlTGF5ZXJzIH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIHVwZGF0ZSBncm91cHMgb24gbGF5ZXJzXG4gICAgICBpZiAobmV3TmFtZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnMubWFwKChsYXllcikgPT5cbiAgICAgICAgICBsYXllci5ncm91cCA9PT0gbmFtZVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4ubGF5ZXIsXG4gICAgICAgICAgICAgICAgZ3JvdXA6IG5ld05hbWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBsYXllclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUxheWVyR3JvdXBUaXRsZSgkZXZlbnQ6IEV2ZW50LCBuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVwZGF0ZUxheWVyR3JvdXAobmFtZSwgKCRldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZSk7XG4gIH1cblxuICBkZWxldGVMYXllckdyb3VwKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5jb25maXJtTGF5ZXJHcm91cERlbGV0aW9uKHsgbmFtZSB9KSk7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ3JvdXAgIT09IG5hbWUpO1xuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8TWFwV2lkZ2V0TGF5ZXJPcHRpb25zW10+LCBncm91cDogTGF5ZXJHcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVkTGF5ZXIgPSBldmVudC5pdGVtLmRhdGEgYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zO1xuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lci5pZCAhPT0gZXZlbnQuY29udGFpbmVyLmlkKSB7XG4gICAgICB0aGlzLm1vdmVMYXllckJldHdlZW5Hcm91cHMoXG4gICAgICAgIG1vdmVkTGF5ZXIsXG4gICAgICAgIGV2ZW50LmNvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxheWVyLWdyb3VwJykgPz8gREVGQVVMVF9MQVlFUl9HUk9VUFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5tb3ZlTGF5ZXJJbk9wdGlvbnMoZXZlbnQuY3VycmVudEluZGV4LCBldmVudC5pdGVtLmRhdGEgYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cCk7XG4gIH1cblxuICBtb3ZlTGF5ZXJCZXR3ZWVuR3JvdXBzKG1vdmVkTGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgbmV3R3JvdXA6IHN0cmluZykge1xuICAgIC8vIHJlbW92ZSBpdCBmcm9tIG9sZCBncm91cFxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZUxheWVyR3JvdXAoe1xuICAgICAgICBuYW1lOiBtb3ZlZExheWVyLmdyb3VwISxcbiAgICAgICAgdmlzaWJsZUxheWVyczogdGhpcy5sYXllckdyb3Vwc1xuICAgICAgICAgID8uZmluZCgoZ3JvdXApID0+IGdyb3VwLm5hbWUgPT09IG1vdmVkTGF5ZXIuZ3JvdXAhKVxuICAgICAgICAgID8udmlzaWJsZUxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllciAhPT0gbW92ZWRMYXllci50aXRsZSlcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIGFkZCBpdCB0byBuZXcgZ3JvdXBcbiAgICBtb3ZlZExheWVyLmdyb3VwID0gbmV3R3JvdXA7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7XG4gICAgICAgIG5hbWU6IG5ld0dyb3VwID8/IERFRkFVTFRfTEFZRVJfR1JPVVAsXG4gICAgICAgIHZpc2libGVMYXllcnM6IG1vdmVkTGF5ZXIudGl0bGUhXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5yZW1vdmVFbXB0eUxheWVyR3JvdXBzKCk7XG4gIH1cblxuICBtb3ZlTGF5ZXJJbk9wdGlvbnModGFyZ2V0SWR4SW5Hcm91cDogbnVtYmVyLCBtb3ZlZExheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICBjb25zdCBncm91cExheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgICAgIC8vIGluZGV4ZXMgaW4gb3B0aW9uc0NvcHlcbiAgICAgIGNvbnN0IGZyb21JbmRleCA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLmZpbmRJbmRleCgobGF5ZXIpID0+IGxheWVyLnRpdGxlID09PSBtb3ZlZExheWVyLnRpdGxlKTtcbiAgICAgIGNvbnN0IHRvSW5kZXggPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5maW5kSW5kZXgoKGxheWVyKSA9PiBsYXllci50aXRsZSA9PT0gZ3JvdXBMYXllcnNbdGFyZ2V0SWR4SW5Hcm91cF0udGl0bGUpO1xuXG4gICAgICBsZXQgbmV3T3JkZXIgPSB0b0luZGV4O1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMuc3BsaWNlKGZyb21JbmRleCwgMSk7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5zcGxpY2UodG9JbmRleCwgMCwgeyAuLi5tb3ZlZExheWVyLCBvcmRlcjogbmV3T3JkZXIgfSk7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyT3JkZXIoKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVFeHBhbmRBbGwoZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdID0gIXRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV07XG4gICAgY29uc3QgbGF5ZXJzVG9FeHBhbmQgPVxuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKS5tYXAoKGxheWVyKSA9PiBsYXllci50aXRsZSkgPz8gW107XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlKS5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgaWYgKGxheWVyc1RvRXhwYW5kLmluY2x1ZGVzKGxheWVyKSlcbiAgICAgICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllcl0gPSB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlTGF5ZXJFeHBhbmQobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0gPSAhdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdO1xuICAgIGlmICh0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0pIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV0gPSB0cnVlO1xuICAgIGlmIChncm91cC52aXNpYmxlTGF5ZXJzLmV2ZXJ5KChsYXllclRpdGxlKSA9PiAhdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllclRpdGxlXSkpIHtcbiAgICAgIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVMYXllck9yZGVyKCkge1xuICAgIGxldCBvcmRlciA9IDE7XG4gICAgdGhpcy5sYXllckdyb3Vwcz8uZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwTGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgICAgIGlmIChncm91cExheWVycykge1xuICAgICAgICBncm91cExheWVycy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLm9yZGVyID0gb3JkZXIrKykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaXNHcm91cFVzZWRCeVdpZGdldExheWVycyhncm91cDogTGF5ZXJHcm91cCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uc29tZSgobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgfVxuXG4gIHJlbW92ZUVtcHR5TGF5ZXJHcm91cHMoKSB7XG4gICAgdGhpcy5sYXllckdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5vcHRpb25zQ29weS5sYXllcnM/Lm1hcCgobGF5ZXIpID0+IGxheWVyLmdyb3VwKS5pbmNsdWRlcyhncm91cC5uYW1lKSAmJlxuICAgICAgICBncm91cC5uYW1lICE9PSBERUZBVUxUX0xBWUVSX0dST1VQXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBEYXNoYm9hcmRBY3Rpb25zLmRlbGV0ZUxheWVyR3JvdXAoe1xuICAgICAgICAgICAgbmFtZTogZ3JvdXAubmFtZVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgREVGQVVMVF9MQVlFUl9HUk9VUCA9IERFRkFVTFRfTEFZRVJfR1JPVVA7XG59XG4iLCI8cHJ5LXdpZGdldC1tYXAtY3NzPjwvcHJ5LXdpZGdldC1tYXAtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1tYXBcIj5cbiAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgW2RhdGFzb3VyY2VJZHNdPVwiKGRhdGFzb3VyY2VJZHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAqbmdJZj1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgW21hbmlmZXN0XT1cIm1hbmlmZXN0XCJcbiAgICAobWFuaWZlc3RNb2RpZmllZCk9XCJtYW5pZmVzdE1vZGlmaWVkLmVtaXQoJGV2ZW50KVwiXG4gICAgW2hlYWRlck9wdGlvbnNdPVwiKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpID8/IHt9XCJcbiAgICAjaGVhZGVyXG4gID5cbiAgICA8cHJ5LXNldHRpbmdzXG4gICAgICAoc2F2ZVRyaWdnZXJlZCk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICBbaGVhZGVyUHJlc2VudF09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICBbb3BlbiRdPVwib3BlbiRcIlxuICAgICAgY2xhc3M9XCJvLXNldHRpbmdzXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfc3R5bGVcIj57eyAnQHByeS53aWRnZXQubWFwLnN0eWxlJyB8IGkxOG4gfX0gOjwvbGFiZWw+XG4gICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU3R5bGUoJGV2ZW50KVwiXG4gICAgICAgICAgW2l0ZW1zXT1cInN0eWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc3R5bGVcIlxuICAgICAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICBiaW5kVmFsdWU9XCJpZGVudGlmaWVyXCJcbiAgICAgICAgICBpZD1cIm1hcF9zdHlsZVwiXG4gICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwib3B0aW9uc0NvcHkuc3R5bGUgPT09IFNUWUxFX0ZST01fVVJMXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJzdHlsZV9VUkxcIj57eyAnQHByeS53aWRnZXQubWFwLnN0eWxlVXJsJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBpZD1cInN0eWxlX1VSTFwiXG4gICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlU3R5bGVVUkwoJGV2ZW50KVwiXG4gICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbnNDb3B5LnN0eWxlVVJMID8/ICcnXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUF1dG9MYXllcigkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuYXV0b21hdGljTGF5ZXJzID8/IGZhbHNlXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuYXV0b0xheWVyJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUF0dHJpYnV0aW9ucygkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuYXR0cmlidXRpb25zID8/IGZhbHNlXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuYXR0cmlidXRpb25zJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVNsaWRlT3B0aW9uKCRldmVudClcIiBbbmdNb2RlbF09XCJoYXNTbGlkZUxheWVyJCB8IGFzeW5jXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGUuZ2xvYmFsJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiby1sYXllci1zZXR0aW5nc1wiIGNka0Ryb3BMaXN0R3JvdXAgY2RrRHJhZ0JvdW5kYXJ5PlxuICAgICAgICA8aDQgY2xhc3M9XCJhLWxhYmVsXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnRpdGxlJyB8IGkxOG4gfX08L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidS1kaXNwbGF5LWZsZXggLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZExheWVyR3JvdXAoKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5hZGRMYXllckdyb3VwJyB8IGkxOG4gfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGxheWVyR3JvdXBzJCB8IGFzeW5jOyBsZXQgZ3JvdXBJZHggPSBpbmRleFwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0dyb3VwVXNlZEJ5V2lkZ2V0TGF5ZXJzKGdyb3VwKVwiIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGQgby1sYXllci1zZXR0aW5nc19fZ3JvdXAtdGl0bGVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllckdyb3VwVGl0bGUte3sgZ3JvdXBJZHggfX1cIj5cbiAgICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MubGF5ZXJHcm91cE5hbWUnIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwiLW9ibGlnYXRvcnktcmVkXCI+Kjwvc3BhblxuICAgICAgICAgICAgICAgID57eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3Mub3B0aW9uYWxDb2xvbicgfCBpMThuIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleFwiPlxuICAgICAgICAgICAgICAgIDxwcnktZWRpdC1pbnB1dFxuICAgICAgICAgICAgICAgICAgZWRpdEJ1dHRvblRvb2x0aXA9XCJAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5lZGl0R3JvdXBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZWQpPVwidXBkYXRlTGF5ZXJHcm91cChncm91cC5uYW1lLCAkZXZlbnQsIGdyb3VwLnNpbmdsZUxheWVyLCBncm91cC52aXNpYmxlTGF5ZXJzKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC5uYW1lID09PSBERUZBVUxUX0xBWUVSX0dST1VQID8gKCdAcHJ5LndpZGdldC5tYXAubm9Hcm91cCcgfCBpMThuKSA6IGdyb3VwLm5hbWVcIlxuICAgICAgICAgICAgICAgID48L3ByeS1lZGl0LWlucHV0PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXAubmFtZSAhPT0gREVGQVVMVF9MQVlFUl9HUk9VUFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwIG8tbGF5ZXItc2V0dGluZ3NfX2RlbGV0ZS1ncm91cFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLmRlbGV0ZUdyb3VwJyB8IGkxOG5cIlxuICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlTGF5ZXJHcm91cChncm91cC5uYW1lKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTZcIiBbd2lkdGhdPVwiMTZcIiBpY29uU3ZnPVwiYmluX25vcm1hbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tcmFkaW8tZ3JvdXBfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICBpZD1cIm11bHRpc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyb3VwLnNpbmdsZUxheWVyXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxheWVyR3JvdXAoZ3JvdXAubmFtZSwgdW5kZWZpbmVkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbbmFtZV09XCJncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtdWx0aXNlbGVjdGlvbi17eyBncm91cElkeCB9fVwiPnt7XG4gICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MubXVsdGlwbGVMYXllcicgfCBpMThuXG4gICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1yYWRpby1ncm91cF9faXRlbVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwibW9ub3NlbGVjdGlvbi17eyBncm91cElkeCB9fVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC5zaW5nbGVMYXllclwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVMYXllckdyb3VwKGdyb3VwLm5hbWUsIHVuZGVmaW5lZCwgJGV2ZW50LCBncm91cC52aXNpYmxlTGF5ZXJzKVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbbmFtZV09XCJncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtb25vc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5zaW5nbGVMYXllcicgfCBpMThuXG4gICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleCAtYWxpZ24tY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkTGF5ZXIoZ3JvdXApXCIgY2xhc3M9XCJhLWJ0biAtbGluay1saWtlXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgKyB7eyAnQHByeS53aWRnZXQubWFwLmFkZExheWVyJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZUV4cGFuZEFsbChncm91cClcIiBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdXG4gICAgICAgICAgICAgICAgICAgID8gKCdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5mb2xkQWxsJyB8IGkxOG4pXG4gICAgICAgICAgICAgICAgICAgIDogKCdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy51bmZvbGRBbGwnIHwgaTE4bilcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICBjbGFzcz1cIm8tbGF5ZXItc2V0dGluZ3NfX2xheWVyc1wiXG4gICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIGdyb3VwKVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtbGF5ZXItZ3JvdXBdPVwiZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxheWVyIG9mIG9wdGlvbnNDb3B5Py5sYXllcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImxheWVyLmdyb3VwID09PSBncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwibGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCJsYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1wbGFjZWhvbGRlclwiICpjZGtEcmFnUGxhY2Vob2xkZXI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleCAtYWxpZ24tY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWRpc2FibGVkXT1cImxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uU3ZnPVwiZHJhZ19pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4tLWljb24tb25seSB1bmZvbGQtbGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxheWVyRXhwYW5kKGxheWVyLCBncm91cClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCI5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25TdmddPVwibGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXSA/ICdjaGV2cm9uX3RvcCcgOiAnY2hldnJvbl9ib3R0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImEtaDVcIj57eyBsYXllci50aXRsZSA/PyAoJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllcicgfCBpMThuOiB7IGluZGV4OiBpICsgMSB9KSB9fTwvaDU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19kZWxldGUtbGF5ZXIgYS1idG4tLWljb24tb25seSBhLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MuZGVsZXRlTGF5ZXInIHwgaTE4blwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUxheWVyKGksIGxheWVyLCBncm91cClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTZcIiBbd2lkdGhdPVwiMTZcIiBpY29uU3ZnPVwiYmluX25vcm1hbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXVwiIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkc19fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihsYXllcj8ub3BhY2l0eSA/PyAxMDApICsgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlT3BhY2l0eShsYXllciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRyYW5zbGF0ZT1cIkBwcnkud2lkZ2V0Lm1hcC5vcGFjaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktcmFuZ2U+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllck9wdGlvbnMnIHwgaTE4bjogeyBpbmRleDogaSArIDEgfSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktZWRpdC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiQHByeS53aWRnZXQubWFwLmxheWVyVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRCdXR0b25Ub29sdGlwPVwiQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MuZWRpdExheWVyVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZWQpPVwiY2hhbmdlVGl0bGUoJGV2ZW50LCBsYXllciwgZ3JvdXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1lZGl0LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCIhWydnZW9zZXJ2ZXInLCAnYXV0byddLmluY2x1ZGVzKGxheWVyLnR5cGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbGF5ZXJUeXBlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS50aXRsZScgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VMYXllclR5cGUoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImxheWVyVHlwZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfbGF5ZXJUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0QXNXbXNUeXBlKGxheWVyKSBhcyB3bXNsYXllclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbGF5ZXJTdHlsZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyU3R5bGUnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTGF5ZXJTdHlsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwibGF5ZXJTdHlsZU9wdGlvbnMobGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0eWxlKGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sYXllclN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlRml0KCRldmVudCwgbGF5ZXIpXCIgW25nTW9kZWxdPVwibGF5ZXIuZml0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5maXQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3JlbGF0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtdHMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2dlb3NlcnZlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnZmVhdHVyZWxheWVyJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd2ZWN0b3J0aWxlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyYXN0ZXJ0aWxlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdhdXRvJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfY2xhc3Nlc1wiPnt7ICdAcHJ5LndpZGdldC5tYXAuY2xhc3NlcycgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbGFzc2VzKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwidXNlZENsYXNzZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5jbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfY2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3JlbGF0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXRzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2dlb3NlcnZlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdmZWF0dXJlbGF5ZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAndmVjdG9ydGlsZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyYXN0ZXJ0aWxlJ1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmxvY2F0aW9uQXR0cicgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlb21ldHJ5RmllbGRzRm9yOiB7IHJlc3VsdFNldDogcmVzdWx0U2V0JCwgY2xhc3NlczogbGF5ZXIuY2xhc3NlcywgdHlwZTogbGF5ZXIudHlwZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luYyBhcyBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWF0bWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9pbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvbHlnb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpLWxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpLXBvbHlnb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGxheWVyLnR5cGUpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbG9jYXRpb25BdHRyaWJ1dGVfYm90aFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxvY2F0aW9uQXR0cmlidXRlLmJvdGgnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTG9jYXRpb25BdHRyaWJ1dGVzKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sb2NhdGlvbkF0dHJpYnV0ZV9ib3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiWydoZWF0bWFwJywgJ2J1YmJsZSddLmluZGV4T2YobGF5ZXIudHlwZSkgPj0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9pbnRlbnNpdHlBdHRyaWJ1dGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5pbnRlbnNpdHlBdHRyaWJ1dGUnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlSW50ZW5zaXR5QXR0cmlidXRlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZmllbGRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVySGFzSW50ZW5zaXR5KGxheWVyKS5pbnRlbnNpdHlBdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX2ludGVuc2l0eUF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3dtcycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAnd210cycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICdmZWF0dXJlbGF5ZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAndmVjdG9ydGlsZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICdyYXN0ZXJ0aWxlJ1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGF5ZXIudHlwZSAhPT0gJ2dlb3NlcnZlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF93bXNfdXJsXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMudXJsJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfdXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VVcmwoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci51cmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd21zJyB8fCBsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX3BhcmFtTGF5ZXJcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLndtcy5wYXJhbUxheWVyJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfcGFyYW1MYXllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1MYXllcigkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5wYXJhbUxheWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX21hdHJpeFNldFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAud21zLm1hdHJpeFNldCcgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX21hdHJpeFNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlTWF0cml4U2V0KCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLm1hdHJpeFNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ3dtdHMnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc19zdHlsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAud21zLnN0eWxlJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX3dtc19zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1TdHlsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ3dtcycgfHwgbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAudGlsZScgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVBhcmFtVGlsZWQoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllcj8ucGFyYW1UaWxlZCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAud21zLnBhcmFtVGlsZWQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0ICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ21hcmtlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmNsdXN0ZXJpbmcnIHwgaTE4biB9fTwvbGVnZW5kPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2x1c3RlcmVkKGxheWVyLCAkZXZlbnQpXCIgW25nTW9kZWxdPVwibGF5ZXIuY2x1c3RlcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuY2x1c3RlcmVkJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsYXllci5jbHVzdGVyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuY2x1c3RlcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2x1c3RlckRpc3RhbmNlKGxheWVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUcmFuc2xhdGU9XCJAcHJ5LndpZGdldC5tYXAuY2x1c3RlckRpc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heD1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktcmFuZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwib3B0aW9uc0NvcHkuc2xpZGUgPz8gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwic2xpZGVfc2VsZWN0XCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZS50aXRsZScgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU2xpZGUoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInNsaWRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5zbGlkZSA/PyAnYWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInNsaWRlX3NlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwib3B0aW9uc0NvcHkuYXR0cmlidXRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImF0dHJpYnV0aW9uXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5hdHRyaWJ1dGlvbicgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYXR0cmlidXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImNoYW5nZUF0dHJpYnV0aW9uKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5hdHRyaWJ1dGlvbiA/IGxheWVyLmF0dHJpYnV0aW9uIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9wcnktc2V0dGluZ3M+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibS1idG4tZ3JvdXAgLW1hcC1zZWxlY3Rpb24tY2hvaWNlIC12ZXJ0aWNhbFwiXG4gICAgW2NsYXNzLi13aXRoLWhlYWRlcl09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICBbY2xhc3MuLWNsb3NlZF09XCIhKGFjdGlvbk1lbnVPcGVuJCB8IGFzeW5jKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiLXZlcnRpY2FsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYmFzaWNBY3Rpb25zJCB8IGFzeW5jXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwIGEtdG9vbHRpcC0te3sgYWN0aW9uIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU2VsZWN0aW9uKGFjdGlvbilcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLicgKyBhY3Rpb24gfCBpMThuXCJcbiAgICAgICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LWljb24gW2ljb25TdmddPVwiYWN0aW9uXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC4nICsgYWN0aW9uIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5IGEtdG9vbHRpcCAtbWFwLXRvZ2dsZVwiXG4gICAgICBpZD1cIm9wZW5fbWVudVwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImFjdGlvbk1lbnVPcGVuJCB8IGFzeW5jXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJleHBvcnRfdHlwZVwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibWVudVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCJcbiAgICA+XG4gICAgICA8cHJ5LWljb25cbiAgICAgICAgW2ljb25TdmddPVwiKGFjdGlvbk1lbnVPcGVuJCB8IGFzeW5jKSA/ICdjaGV2cm9uX3RvcCcgOiAnY2hldnJvbl9ib3R0b20nXCJcbiAgICAgICAgW3dpZHRoXT1cIjEyXCJcbiAgICAgICAgW2hlaWdodF09XCIyNFwiXG4gICAgICA+PC9wcnktaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLm9wZW4nIHwgaTE4biB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwIC1tYXAtc2VsZWN0aW9uLWNob2ljZSAtbWFwLWV4cG9ydFwiIFtjbGFzcy4td2l0aC1oZWFkZXJdPVwiZGlzcGxheUhlYWRlciQgfCBhc3luY1wiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5IGEtdG9vbHRpcFwiXG4gICAgICBpZD1cImV4cG9ydF9jYXJkXCJcbiAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICBhcmlhLWNvbnRyb2xzPVwiZXhwb3J0X3R5cGVcIlxuICAgICAgYXJpYS1oYXNwb3B1cD1cIm1lbnVcIlxuICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAuZXhwb3J0JyB8IGkxOG5cIlxuICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgKGNsaWNrKT1cImV4cG9ydCgpXCJcbiAgICA+XG4gICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImZpbGVfZG93bmxvYWRcIj48L3ByeS1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAuZXhwb3J0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm9sLWNvbnRyb2wgbS1sYXllci1zd2l0Y2hlciBtLW1hcC1sYXllci1hY3Rpb25cIlxuICAgICpuZ0lmPVwiKChsYXllcnMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cImxheWVyc1RvcCQgfCBhc3luY1wiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm0tbWFwLWxheWVyLWFjdGlvbl9fdG9nZ2xlXCJcbiAgICAgIFtjbGFzcy5hLXRvb2x0aXBdPVwiIXRoaXMubGF5ZXJzVGFiT3BlblwiXG4gICAgICBbY2xhc3MuLXRvb2x0aXAtbm8td3JhcF09XCIhdGhpcy5sYXllcnNUYWJPcGVuXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVMYXllcnNXaW5kb3coKVwiXG4gICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5zZWxlY3RMYXllcnMnIHwgaTE4blwiXG4gICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJsZWZ0XCJcbiAgICA+XG4gICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImxheWVyc1wiIFt3aWR0aF09XCIxOFwiIFtoZWlnaHRdPVwiMThcIj48L3ByeS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1sYXllci1hY3Rpb25fX2NvbnRhaW5lciBtLW1hcC1sYXllci1hY3Rpb25fX2NvbnRhaW5lci0tbGF5ZXJzXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxheWVyc1RhYk9wZW5cIj5cbiAgICAgIDxoNCBjbGFzcz1cImEtaDRcIj57eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3Muc2VsZWN0TGF5ZXJzJyB8IGkxOG4gfX08L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cIm0tbGF5ZXItc3dpdGNoZXJfX2NvbnRlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgbGF5ZXJHcm91cHMkIHwgYXN5bmNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNHcm91cFVzZWRCeVdpZGdldExheWVycyhncm91cClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1sYXllci1hY3Rpb25fX3RpdGxlIG0tbGF5ZXItc3dpdGNoZXJfX2dyb3VwLXRpdGxlXCI+XG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cImEtaDVcIj5cbiAgICAgICAgICAgICAgICB7eyBncm91cC5uYW1lID09PSBERUZBVUxUX0xBWUVSX0dST1VQID8gKCdAcHJ5LndpZGdldC5tYXAubm9Hcm91cCcgfCBpMThuKSA6IGdyb3VwLm5hbWUgfX1cbiAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFncm91cC5zaW5nbGVMYXllcjsgZWxzZSBzaW5nbGVMYXllclwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYXllciBvZiBvcHRpb25zQ29weS5sYXllcnM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheWVyLmdyb3VwID09PSBncm91cC5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtbGF5ZXItYWN0aW9uX190aXRsZSBtLWxheWVyLXN3aXRjaGVyX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc0xheWVyVmlzaWJsZShsYXllciwgZ3JvdXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVZpc2liaWxpdHkoZ3JvdXAsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJjaGVja2JveC1sYXllci17eyBpbmRleCB9fVwiXG4gICAgICAgICAgICAgICAgICAgID48L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoZWNrYm94LWxheWVyLXt7IGluZGV4IH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbGF5ZXIudGl0bGUgPz8gKCdAcHJ5LndpZGdldC5tYXAubWlzc2luZ1RpdGxlJyB8IGkxOG4pIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlTGF5ZXI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWxheWVyLXN3aXRjaGVyLS1yYWRpb3NcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtbGF5ZXItYWN0aW9uX190aXRsZSBtLWxheWVyLXN3aXRjaGVyX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicmFkaW8tbm8tbGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC52aXNpYmxlTGF5ZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VWaXNpYmlsaXR5KGdyb3VwKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInJhZGlvLW5vLWxheWVyXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLm5vTGF5ZXInIHwgaTE4blxuICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxheWVyIG9mIG9wdGlvbnNDb3B5LmxheWVyczsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtbGF5ZXItYWN0aW9uX190aXRsZSBtLWxheWVyLXN3aXRjaGVyX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3JhZGlvLWxheWVyLScgKyBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC52aXNpYmxlTGF5ZXJzWzBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVZpc2liaWxpdHkoZ3JvdXAsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwicmFkaW8tbGF5ZXIte3sgaW5kZXggfX1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudGl0bGUgPz8gKCdAcHJ5LndpZGdldC5tYXAubWlzc2luZ1RpdGxlJyB8IGkxOG4pXG4gICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm9sLWNvbnRyb2wgbS1tYXAtbGF5ZXItYWN0aW9uIG0tbGF5ZXItbGVnZW5kXCJcbiAgICAqbmdJZj1cIigobGVnZW5kTGF5ZXJzJCB8IGFzeW5jKT8ubGVuZ3RoID8/IDApID4gMFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJsZWdlbmRUb3AkIHwgYXN5bmNcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJtLW1hcC1sYXllci1hY3Rpb25fX3RvZ2dsZVwiXG4gICAgICBbY2xhc3MuYS10b29sdGlwXT1cIiF0aGlzLmxlZ2VuZFRhYk9wZW5cIlxuICAgICAgW2NsYXNzLi10b29sdGlwLW5vLXdyYXBdPVwiIXRoaXMubGVnZW5kVGFiT3BlblwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTGVnZW5kV2luZG93KClcIlxuICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAubGVnZW5kcycgfCBpMThuXCJcbiAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cImxlZnRcIlxuICAgID5cbiAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibGVnZW5kXCIgW3dpZHRoXT1cIjE4XCIgW2hlaWdodF09XCIxNVwiPjwvcHJ5LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cIm0tbWFwLWxheWVyLWFjdGlvbl9fY29udGFpbmVyXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW5cIj5cbiAgICAgIDxoNCBjbGFzcz1cImEtaDRcIj57eyAnQHByeS53aWRnZXQubWFwLmxlZ2VuZHNUaXRsZScgfCBpMThuIH19PC9oND5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdlb0xheWVyIG9mIGxlZ2VuZExheWVycyQgfCBhc3luYzsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tbWFwLWxheWVyLWFjdGlvbl9fdGl0bGUgbS1sYXllci1sZWdlbmRfX3RpdGxlXCIgKGNsaWNrKT1cInRvZ2dsZUxlZ2VuZChpbmRleClcIj5cbiAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKSAmJiAhIWdlb0xheWVyLnRpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwibS1sYXllci1sZWdlbmRfX2Ryb3Bkb3duLWljb25cIlxuICAgICAgICAgICAgW2ljb25TdmddPVwibGVnZW5kVGFiID09PSBpbmRleCA/ICdjaGV2cm9uX3RvcCcgOiAnY2hldnJvbl9ib3R0b20nXCJcbiAgICAgICAgICAgIFt3aWR0aF09XCIxMlwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjEyXCJcbiAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICA8aDUgY2xhc3M9XCJhLWg1XCI+e3sgZ2VvTGF5ZXIudGl0bGUgfX08L2g1PlxuICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgKm5nSWY9XCIhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiXG4gICAgICAgICAgICBjbGFzcz1cImEtdG9vbHRpcFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllckxvYWRFcnJvcicgfCBpMThuXCJcbiAgICAgICAgICAgIFtpY29uU3ZnXT1cIidjbG9zZSdcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIjIyXCJcbiAgICAgICAgICAgIFtoZWlnaHRdPVwiMjJcIlxuICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibS1tYXAtbGF5ZXItYWN0aW9uX19pbWFnZVwiXG4gICAgICAgICAgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW4gfHwgbGVnZW5kVGFiICE9PSBpbmRleCB8fCAhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiXG4gICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwibGVnZW5kSGVpZ2h0JCB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZW9MYXllciB8IGxlZ2VuZFVybDogeyBjYXBhYmlsaXRpZXM6ICh3bXNDYXBhYmlsaXRpZXMkIHwgYXN5bmMpIH0gYXMgdXJsXCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIFtzcmNdPVwidXJsIHwgZ2V0U2VjdXJlZEltYWdlIHwgYXN5bmNcIlxuICAgICAgICAgICAgICBbYWx0XT1cIidAcHJ5LndpZGdldC5tYXAubGVnZW5kJyB8IGkxOG46IHsgbGF5ZXI6IGdlb0xheWVyLnRpdGxlIH1cIlxuICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VOb3RQcm92aWRlZFtpbmRleF0gPSB0cnVlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoZ2VvTGF5ZXIgfCBsZWdlbmRVcmw6IHsgY2FwYWJpbGl0aWVzOiAod21zQ2FwYWJpbGl0aWVzJCB8IGFzeW5jKSB9KVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtLW1hcC1sYXllci1hY3Rpb25fX2Vycm9yXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmROb3RQcm92aWRlZCcgfCBpMThuIH19PC9wPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibS1tYXAtc2xpZGUtbGVnZW5kIC1sZWZ0XCIgKm5nSWY9XCJsZWZ0U2xpZGVMYXllcnMubGVuZ3RoID4gMFwiIFtzdHlsZS50b3AucHhdPVwibGVnZW5kVG9wJCB8IGFzeW5jXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJtLW1hcC1zbGlkZS1sZWdlbmRfX3RpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZVRpdGxlJyB8IGkxOG4gfX06PC9zcGFuPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGxheWVyIG9mIGxlZnRTbGlkZUxheWVyc1wiPlxuICAgICAge3sgbGF5ZXIuZ2V0KCd0aXRsZScpIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtLW1hcC1zbGlkZS1sZWdlbmQgLXJpZ2h0XCIgKm5nSWY9XCJyaWdodFNsaWRlTGF5ZXJzLmxlbmd0aCA+IDBcIiBbc3R5bGUudG9wLnB4XT1cImxlZ2VuZFRvcCQgfCBhc3luY1wiPlxuICAgIDxzcGFuIGNsYXNzPVwibS1tYXAtc2xpZGUtbGVnZW5kX190aXRsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGVUaXRsZScgfCBpMThuIH19Ojwvc3Bhbj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsYXllciBvZiByaWdodFNsaWRlTGF5ZXJzXCI+XG4gICAgICB7eyBsYXllci5nZXQoJ3RpdGxlJykgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBbc3R5bGUuaGVpZ2h0LnB4XT1cImhlaWdodCQgfCBhc3luY1wiIGNsYXNzPVwiby1tYXAtd3JhcHBlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJvLW1hcFwiPlxuICAgICAgPGRpdiAjbWFwUmVmIGlkPVwibWFwXCI+PC9kaXY+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgbWluPVwiMFwiXG4gICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgIHN0ZXA9XCIwLjAxXCJcbiAgICAgICAgdmFsdWU9XCI1MFwiXG4gICAgICAgICNzbGlkZXJFbGVtZW50XG4gICAgICAgIGNsYXNzPVwiby1tYXAtc2xpZGVyXCJcbiAgICAgICAgW2NsYXNzLi1oaWRkZW5dPVwiIShoYXNTbGlkZUxheWVyJCB8IGFzeW5jKVwiXG4gICAgICAgIChpbnB1dCk9XCJ0cmlnZ2VyTGF5ZXJSZW5kZXIoKVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICNwb3B1cCBjbGFzcz1cIm0tdG9vbHRpcCBtLXRvb2x0aXAtLXBvcHVwXCIgW2hpZGRlbl09XCJ0cnVlXCIgcm9sZT1cInRvb2x0aXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwibS10b29sdGlwLS1wb3B1cF9faGVhZGVyXCI+XG4gICAgICA8cD57eyB0b29sdGlwTWFuYWdlci50b29sdGlwSW5kZXggKyAxIH19IC8ge3sgdG9vbHRpcE1hbmFnZXIudG9vbHRpcE51bWJlciB9fTwvcD5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeSBhLWJ0bi0taWNvbi1vbmx5XCJcbiAgICAgICAgKGNsaWNrKT1cInRvb2x0aXBNYW5hZ2VyLnRvb2x0aXBNb3ZlKC0xKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdG9vbHRpcE1hbmFnZXIudG9vbHRpcENhbk1vdmUoLTEpXCJcbiAgICAgID5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJhcnJvd19iYWNrXCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAoY2xpY2spPVwidG9vbHRpcE1hbmFnZXIudG9vbHRpcE1vdmUoMSlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXRvb2x0aXBNYW5hZ2VyLnRvb2x0aXBDYW5Nb3ZlKDEpXCJcbiAgICAgID5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJhcnJvd19yaWdodFwiPjwvcHJ5LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeSBhLWJ0bi0taWNvbi1vbmx5XCIgKGNsaWNrKT1cInRvb2x0aXBNYW5hZ2VyLmNsZWFyVG9vbHRpcCh0cnVlKVwiPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLXRvb2x0aXAtLXBvcHVwX19jb250YWluZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgI3BvcHVwQ29udGVudD48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
1188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1tYXAvY29tcG9uZW50L3dpZGdldC1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtbWFwL2NvbXBvbmVudC93aWRnZXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsTUFBTSxFQUdOLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBTUwsY0FBYyxFQUNkLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsbUJBQW1CLEVBRW5CLGNBQWMsRUFFZCxXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLFNBQVMsRUFjVCxlQUFlLEVBQ2YsU0FBUyxFQUNULGlCQUFpQixFQUlqQixjQUFjLEVBR2QsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEQsT0FBTyxFQUFrQixJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFaEQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUs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Q0FBQztvQkFDaEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNqQixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBdG5EVSxrQkFBa0IsbVFBNkdQLGlCQUFpQjtrR0E3RzVCLGtCQUFrQixtVEFNTSxnQkFBZ0IsbUhBQ1YsV0FBVyxxSkMvSHRELHkxL0JBd3JCQTs7MkZEaGtCYSxrQkFBa0I7a0JBSjlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzswQkFnSHZCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCO3lDQXpHbEIsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUNDLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFDcUMsWUFBWTtzQkFBbEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0csa0JBQWtCO3NCQUF6RSxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDMUIsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGlvblJlc3VsdCxcbiAgQXR0cmlidXRlLFxuICBCYXNlV2lkZ2V0TWFwTGF5ZXJPcHRpb25zLFxuICBDaGFydEFnZ3JlZ2F0ZWRXaWRnZXRPcHRpb25zLFxuICBDbGFzcyxcbiAgQ2xhc3NTZWxlY3RvcnMsXG4gIENvbmZpZ1NlbGVjdG9ycyxcbiAgRGFzaGJvYXJkQWN0aW9ucyxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBEYXRhc2V0LFxuICBEYXRhU291cmNlU2VsZWN0b3JzLFxuICBEYXRhc291cmNlVXRpbHMsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEZpZWxkLFxuICBGaWVsZFNlbGVjdG9ycyxcbiAgRmlsdGVyQ29udGV4dCxcbiAgR2VvTWV0YWRhdGEsXG4gIEdlb21ldHJpY0ZpZWxkVHlwZXMsXG4gIEdldENhcGFiaWxpdGllc1Jlc3BvbnNlLFxuICBJdGVtVXRpbHMsXG4gIExheWVyR3JvdXAsXG4gIE1hcEF1dG9MYXllck9wdGlvbnMsXG4gIE1hcEZlYXR1cmVMYXllck9wdGlvbnMsXG4gIE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucyxcbiAgTWFwUmFzdGVyVGlsZUxheWVyT3B0aW9ucyxcbiAgTWFwVmVjdG9yVGlsZUxheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0T3B0aW9ucyxcbiAgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMsXG4gIE1hcFdNVFNMYXllckxheWVyT3B0aW9ucyxcbiAgTmFtZWRRdWVyeVR5cGVzLFxuICBPcGVyYXRpb24sXG4gIFBSWV9HRU9BVVRIX1RPS0VOLFxuICBQcnlBZ2dyZWdhdGlvblNlcnZpY2UsXG4gIFByeUdlb0F1dGhTZXJ2aWNlLFxuICBQcnlJMThuU2VydmljZSxcbiAgUmVzdWx0c2V0VXRpbHMsXG4gIFN5bWJvbFNlcnZpY2UsXG4gIFRvb2x0aXBGYWN0b3J5U2VydmljZSxcbiAgVG9vbHRpcE1vZGUsXG4gIFdJREdFVF9IRUFERVJfSEVJR0hULFxuICB3aWRnZXRNYXBDb25maWdcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwvZXM2JztcbmltcG9ydCB7IEZlYXR1cmUsIE1hcCwgVmlldyB9IGZyb20gJ29sJztcbmltcG9ydCB7IENvb3JkaW5hdGUgfSBmcm9tICdvbC9jb29yZGluYXRlJztcbmltcG9ydCB7IGJvdW5kaW5nRXh0ZW50LCBjcmVhdGVFbXB0eSB9IGZyb20gJ29sL2V4dGVudCc7XG5pbXBvcnQgeyBDaXJjbGUsIEdlb21ldHJ5LCBQb2ludCB9IGZyb20gJ29sL2dlb20nO1xuaW1wb3J0IHsgSGVhdG1hcCwgTGF5ZXIsIFRpbGUgfSBmcm9tICdvbC9sYXllcic7XG5pbXBvcnQgQmFzZUxheWVyIGZyb20gJ29sL2xheWVyL0Jhc2UnO1xuaW1wb3J0IFZlY3RvckxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3Rvcic7XG5pbXBvcnQgeyBmcm9tTG9uTGF0IH0gZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJ29sL3Byb2ovcHJvajQnO1xuaW1wb3J0IHsgRGF0YVRpbGUsIEltYWdlV01TLCBUaWxlV01TIH0gZnJvbSAnb2wvc291cmNlJztcbmltcG9ydCBWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJ29sL3N0eWxlJztcbmltcG9ydCBwcm9qNCBmcm9tICdwcm9qNCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb20sXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgd2l0aExhdGVzdEZyb21cbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi1tYW5hZ2VyLmNsYXNzJztcbmltcG9ydCB7IENxbFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvY3FsLXV0aWxzLmNsYXNzJztcbmltcG9ydCB7IFhNTFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMveG1sLXV0aWxzLmNsYXNzJztcbmltcG9ydCB7IFdpZGdldE1hcExheWVyU2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LW1hcC1sYXllci5zZXJ2aWNlJztcbmltcG9ydCBNYXBib3hWZWN0b3JMYXllciBmcm9tICdvbC9sYXllci9NYXBib3hWZWN0b3InO1xuaW1wb3J0IHsgV2lkZ2V0TWFwVXRpbHMgfSBmcm9tICcuLi91dGlscy93aWRnZXQtbWFwLnV0aWxzJztcbmltcG9ydCB7IExheWVyU2xpZGVyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vbGF5ZXItc2xpZGVyLmNsYXNzJztcbmltcG9ydCBUaWxlTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvVGlsZSc7XG5pbXBvcnQgV2ViR0xUaWxlTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvV2ViR0xUaWxlJztcbmltcG9ydCB7IEF0dHJpYnV0aW9uLCBkZWZhdWx0cyB9IGZyb20gJ29sL2NvbnRyb2wnO1xuaW1wb3J0IFZlY3RvclRpbGVMYXllciBmcm9tICdvbC9sYXllci9WZWN0b3JUaWxlJztcbmltcG9ydCB7IENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBUb29sdGlwTWFuYWdlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL3Rvb2x0aXAtbWFuYWdlci5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBUT09MVElQX1BBRERJTkcgPSAxNTtcbmV4cG9ydCBjb25zdCBOT05fTUFOREFUT1JZX0ZJVF9MQVlFUl9UWVBFUyA9IFsnd21zJywgJ2dlb3NlcnZlciddO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTEFZRVJfR1JPVVAgPSAnREVGQVVMVCc7XG5cbi8vIERlZmluZSBMYW1iZXJ0IFByb2plY3Rpb25cbnByb2o0LmRlZnMoXG4gICdFUFNHOjIxNTQnLFxuICAnK3Byb2o9bGNjICtsYXRfMD00Ni41ICtsb25fMD0zICtsYXRfMT00OSArbGF0XzI9NDQgK3hfMD03MDAwMDAgK3lfMD02NjAwMDAwICtlbGxwcz1HUlM4MCArdG93Z3M4ND0wLDAsMCwwLDAsMCwwICt1bml0cz1tICtub19kZWZzICt0eXBlPWNycydcbik7XG5yZWdpc3Rlcihwcm9qNCk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1tYXAuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldE1hcENvbXBvbmVudCBleHRlbmRzIERhdGFXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcbiAgaWQgPSBgJHtXaWRnZXRNYXBDb21wb25lbnQuaWRDb3VudGVyKyt9YDtcbiAgbWFwVXJsJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBAVmlld0NoaWxkKCdtYXBSZWYnKSBtYXBSZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwb3B1cCcpIHBvcHVwITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncG9wdXBDb250ZW50JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIHBvcHVwQ29udGVudCE6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2V4cG9ydFR5cGVUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgZXhwb3J0VHlwZVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyRWxlbWVudCcpIHNsaWRlckVsZW1lbnQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxNYXBXaWRnZXRPcHRpb25zPjtcbiAgbGF5ZXJUeXBlcyA9IHRoaXMud2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLmltcGxlbWVudGF0aW9uTGlzdFxuICAgIC5maWx0ZXIoKHR5cGUpID0+IHR5cGUgIT09ICdhdXRvJylcbiAgICAuc29ydCgoYSwgYikgPT5cbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgICAgICAuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS4nICsgYSlcbiAgICAgICAgLmxvY2FsZUNvbXBhcmUodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUuJyArIGIpKVxuICAgICk7XG4gIG9wdGlvbnNDb3B5OiBNYXBXaWRnZXRPcHRpb25zID0ge30gYXMgTWFwV2lkZ2V0T3B0aW9ucztcbiAgY2xhc3NlcyQ6IE9ic2VydmFibGU8Q2xhc3NbXT47XG4gIGZpZWxkcyQ6IE9ic2VydmFibGU8RmllbGRbXT47XG4gIHNlbGVjdGVkSWRzJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIGJvdHRvbUxlZnQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGxheWVycyQhOiBPYnNlcnZhYmxlPEJhc2VMYXllcltdPjtcbiAgbWFwITogTWFwO1xuICBhZGRpdGlvbmFsTGF5ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPEdlb21ldHJ5Pj5bXT4oW10pO1xuICBzdHlsZXMkOiBPYnNlcnZhYmxlPFxuICAgIHtcbiAgICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgfVtdXG4gID47XG4gIFdJREdFVF9IRUFERVJfSEVJR0hUID0gV0lER0VUX0hFQURFUl9IRUlHSFQ7XG4gIGkgPSAwO1xuICBpdGVtU3R5bGVzJCE6IE9ic2VydmFibGU8e1xuICAgIFtpZDogc3RyaW5nXToge1xuICAgICAgY2xhc3NpYzogU3R5bGU7XG4gICAgICBib3JkZXJlZDogU3R5bGU7XG4gICAgfTtcbiAgfT47XG4gIGhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgYWN0aW9ucyQgPSB3aWRnZXRNYXBDb25maWcuYWN0aW9ucyQ7XG4gIGdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zJDogT2JzZXJ2YWJsZTxNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNbXT47XG4gIGxlZ2VuZFRhYk9wZW4gPSBmYWxzZTtcbiAgbGF5ZXJzVGFiT3BlbiA9IGZhbHNlO1xuICBsZWdlbmRUYWJDbG9zZWQ6IGJvb2xlYW5bXSA9IFtdO1xuICBsZWdlbmRMYXllcnMkITogT2JzZXJ2YWJsZTwoTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpW10+O1xuICBsZWdlbmRUb3AkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGxheWVyc1RvcCQhOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGxlZ2VuZEhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgbGF5ZXJzSGVpZ2h0JCE6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgaW1hZ2VOb3RQcm92aWRlZDogYm9vbGVhbltdID0gW107XG4gIGJhc2ljQWN0aW9ucyQ6IE9ic2VydmFibGU8KCdjbGljaycgfCAnbGFzc28nIHwgJ3JlY3RhbmdsZScgfCAnem9vbScgfCAnbW92ZScgfCAnZXhwb3J0JyB8ICd1cGxvYWQnKVtdPjtcbiAgem9vbUFuZENlbnRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICB6b29tPzoge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIG1pbjogbnVtYmVyO1xuICAgICAgbWF4OiBudW1iZXI7XG4gICAgfTtcbiAgICBjZW50ZXI/OiBudW1iZXJbXTtcbiAgfT4oe30pO1xuICBtYXBTdHlsZVVybCQhOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+O1xuICBpbnRlcmFjdGlvbk1hbmFnZXI6IEludGVyYWN0aW9uTWFuYWdlciA9IG5ldyBJbnRlcmFjdGlvbk1hbmFnZXIoKTtcbiAgdG9vbHRpcE1hbmFnZXI6IFRvb2x0aXBNYW5hZ2VyID0gbmV3IFRvb2x0aXBNYW5hZ2VyKCk7XG4gIG1hcFN0eWxlTGF5ZXIkITogT2JzZXJ2YWJsZTwoVmVjdG9yVGlsZUxheWVyIHwgVGlsZUxheWVyPGFueT4pW10+O1xuICBTVFlMRV9GUk9NX1VSTCA9ICdfdXJsJztcbiAgTk9fU1RZTEUgPSAnbm9uZSc7XG4gIHdtc0NhcGFiaWxpdGllcyQ6IE9ic2VydmFibGU8XG4gICAgfCB7XG4gICAgICAgIFtwOiBzdHJpbmddOiBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZSB8IG51bGw7XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWRcbiAgPjtcbiAgYXV0b0RhdGFzZXRMYXllcnMkOiBPYnNlcnZhYmxlPE1hcEF1dG9MYXllck9wdGlvbnNbXT47XG4gIGZpdEV4dGVudHMkITogT2JzZXJ2YWJsZTxcbiAgICB7XG4gICAgICBkYXRhc291cmNlOiBzdHJpbmc7XG4gICAgICBleHRlbnQ6IENvb3JkaW5hdGVbXTtcbiAgICAgIGVycm9yOiBib29sZWFuO1xuICAgIH1bXVxuICA+O1xuICBkYXRhc291cmNlRmlsdGVycyQ6IE9ic2VydmFibGU8YW55PjtcbiAgdXNlZENsYXNzZXMkOiBPYnNlcnZhYmxlPGFueT47XG4gIGxheWVyU2xpZGVyID0gbmV3IExheWVyU2xpZGVyKCk7XG4gIGhhc1NsaWRlTGF5ZXIkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzbGlkZXM6IHsgaWQ6IHVuZGVmaW5lZCB8IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W107XG4gIHBvc3NpYmxlU3R5bGVzOiB7XG4gICAgW3A6IHN0cmluZ106IHtcbiAgICAgIGxheWVyczogeyBbcDogc3RyaW5nXTogeyBwYXJhbTogc3RyaW5nOyBzdHlsZXM6IHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gfSB9IHwgbnVsbDtcbiAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgYXR0cmlidXRpb25zID0gbmV3IEF0dHJpYnV0aW9uKCk7XG4gIGFjdGlvbk1lbnVPcGVuJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBhdHRyaWJ1dGlvbnMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBvbFpvb21FbGVtZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgcHJldmlvdXNMYXllcnM6IEJhc2VMYXllcltdID0gW107XG4gIGxheWVyR3JvdXBzJDogT2JzZXJ2YWJsZTxMYXllckdyb3VwW10+O1xuICBsYXllckdyb3VwczogTGF5ZXJHcm91cFtdID0gW107XG4gIGxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0b3JlOiBTdG9yZTxhbnk+LFxuICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBwcml2YXRlIHRvb2x0aXBGYWN0b3J5U2VydmljZTogVG9vbHRpcEZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3ltYm9sU2VydmljZTogU3ltYm9sU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHdpZGdldE1hcExheWVyU2VydmljZTogV2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJ5QWdncmVnYXRpb25TZXJ2aWNlOiBQcnlBZ2dyZWdhdGlvblNlcnZpY2UsXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChQUllfR0VPQVVUSF9UT0tFTikgcHJpdmF0ZSBnZW9BdXRoU2VydmljZTogUHJ5R2VvQXV0aFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoc3RvcmUsIGVsKTtcblxuICAgIHRoaXMuZ2V0T2xab29tRWxlbWVudCgpO1xuXG4gICAgdGhpcy5zbGlkZXMgPSBbXG4gICAgICB7IGlkOiAnYWxsJywgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc2xpZGUuYWxsJykgfSxcbiAgICAgIHsgaWQ6ICdsZWZ0JywgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc2xpZGUubGVmdCcpIH0sXG4gICAgICB7IGlkOiAncmlnaHQnLCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZS5yaWdodCcpIH1cbiAgICBdO1xuXG4gICAgdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2Uud2l0aEdlb0F1dGgodGhpcy5nZW9BdXRoU2VydmljZSk7XG5cbiAgICB0aGlzLmJhc2ljQWN0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuYWN0aW9ucyQsXG4gICAgICB0aGlzLmFjdGlvbk1lbnVPcGVuJCxcbiAgICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkludGVyYWN0aW9uLnNlbGVjdGlvblR5cGUkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2FjdGlvbnMsIG1lbnVPcGVuLCBzZWxlY3Rpb25UeXBlXSkgPT5cbiAgICAgICAgbWVudU9wZW5cbiAgICAgICAgICA/IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbiAhPT0gJ2V4cG9ydCcgJiYgYWN0aW9uICE9PSAndXBsb2FkJylcbiAgICAgICAgICA6IGFjdGlvbnNcbiAgICAgICAgICAgICAgLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24gIT09ICdleHBvcnQnICYmIGFjdGlvbiAhPT0gJ3VwbG9hZCcpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGFjdGlvbikgPT4gc2VsZWN0aW9uVHlwZSA9PT0gYWN0aW9uKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmNsYXNzZXMkID0gdGhpcy5zdG9yZVxuICAgICAgLnNlbGVjdChDbGFzc1NlbGVjdG9ycy5jbGFzc2VzKVxuICAgICAgLnBpcGUobWFwKChjbGFzc2VzKSA9PiBjbGFzc2VzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpKSk7XG4gICAgdGhpcy51c2VkQ2xhc3NlcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmNsYXNzZXMkLCB0aGlzLnVzZWREYXRhc291cmNlcyRdKS5waXBlKFxuICAgICAgbWFwKChbY2xhc3NlcywgZGF0YXNvdXJjZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiBjbGFzc2VzLmZpbHRlcigoY2xhc3NJdGVtKSA9PlxuICAgICAgICAgIGRhdGFzb3VyY2VzLnNvbWUoKGRhdGFTb3VyY2UpID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICduYW1lZFF1ZXJ5JyAmJiAndHlwZScgaW4gZGF0YVNvdXJjZS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlLnJlcXVlc3QudHlwZSA9PT0gTmFtZWRRdWVyeVR5cGVzLk1VTFRJX0NMQVNTIHx8XG4gICAgICAgICAgICAgICAgZGF0YVNvdXJjZS5yZXF1ZXN0LnR5cGUgPT09IE5hbWVkUXVlcnlUeXBlcy5GVUxMX1RFWFRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICdkYXRhc2V0J1xuICAgICAgICAgICAgICA/IGRhdGFTb3VyY2Uub0NsYXNzID09PSBjbGFzc0l0ZW0uaWRcbiAgICAgICAgICAgICAgOiBkYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICduYW1lZFF1ZXJ5JyAmJiAnb0NsYXNzJyBpbiBkYXRhU291cmNlLnJlcXVlc3RcbiAgICAgICAgICAgICAgICA/IGRhdGFTb3VyY2UucmVxdWVzdC5vQ2xhc3MgPT09IGNsYXNzSXRlbS5pZFxuICAgICAgICAgICAgICAgIDogZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAnbmFtZWRRdWVyeScgJiYgJ3R5cGUnIGluIGRhdGFTb3VyY2UucmVxdWVzdFxuICAgICAgICAgICAgICAgICAgPyBkYXRhU291cmNlLnJlcXVlc3QudHlwZSA9PT0gTmFtZWRRdWVyeVR5cGVzLk1PTk9fQ0xBU1NcbiAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChGaWVsZFNlbGVjdG9ycy5maWVsZHMpO1xuXG4gICAgdGhpcy5kYXRhc291cmNlRmlsdGVycyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5kYXRhc291cmNlRmlsdGVycyksXG4gICAgICB0aGlzLmRhdGFzb3VyY2VJZHMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKFtmaWx0ZXJzLCBpZHNdKSA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKGZpbHRlcnMpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWx0ZXJEc0tleSkgPT4gaWRzLmluY2x1ZGVzKGZpbHRlckRzS2V5KSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+ICh7IC4uLnAsIFtjXTogZmlsdGVyc1tjXSB9KSwge30pIGFzIHtcbiAgICAgICAgICAgIFtwOiBzdHJpbmddOiBGaWx0ZXJDb250ZXh0W107XG4gICAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdHlsZXMkID0gdGhpcy5zdG9yZS5zZWxlY3QoQ29uZmlnU2VsZWN0b3JzLm1hcFN0eWxlcykucGlwZShcbiAgICAgIG1hcCgoc3R5bGVzKSA9PlxuICAgICAgICBzdHlsZXMuY29uY2F0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuTk9fU1RZTEUsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5ub1N0eWxlJylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuU1RZTEVfRlJPTV9VUkwsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5zdHlsZUZyb21VcmwnKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuc2VsZWN0ZWRJdGVtSWRzKTtcblxuICAgIHRoaXMuZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnVzZWREYXRhc291cmNlcyQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKVxuICAgICAgKSxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KENvbmZpZ1NlbGVjdG9ycy5nZW9TZXJ2ZXJVcmwpLnBpcGUoc3RhcnRXaXRoKHVuZGVmaW5lZCkpXG4gICAgXSkucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgbWFwKChbZGF0YVNvdXJjZXMsIGdlb1NlcnZlclVybF0pID0+IHtcbiAgICAgICAgaWYgKCFnZW9TZXJ2ZXJVcmwpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzXG4gICAgICAgICAgLmZpbHRlcigoZHMpID0+IERhdGFzb3VyY2VVdGlscy5pc0dlbyhkcykpXG4gICAgICAgICAgLm1hcCgoZHMpID0+IHtcbiAgICAgICAgICAgIGRzID0gZHMgYXMgdW5rbm93biBhcyBEYXRhc2V0O1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFzOiB7XG4gICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICAgICAgICAgIH0gPSB7fTtcbiAgICAgICAgICAgIGRzLm1ldGFkYXRhPy5mb3JFYWNoKChtKSA9PiAobWV0YWRhdGFzW20ubWV0YWRhdGFEZWYubmFtZV0gPSBtLnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0eXBlOiAnZ2Vvc2VydmVyJyxcbiAgICAgICAgICAgICAgdXJsOiBgJHtnZW9TZXJ2ZXJVcmx9LyR7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFzW0dlb01ldGFkYXRhLk5BTUVTUEFDRV0ubGVuZ3RoID4gMCA/IG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdICsgJy8nIDogJydcbiAgICAgICAgICAgICAgfXdtcz9TRVJWSUNFPVdNUyZWRVJTSU9OPTEuMy4wYCxcbiAgICAgICAgICAgICAgcGFyYW1UaWxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogcGFyc2VJbnQobWV0YWRhdGFzW0dlb01ldGFkYXRhLk9QQUNJVFldID8/IDEwMCwgMTApLFxuICAgICAgICAgICAgICBvQ2xhc3M6IGRzLm9DbGFzcyxcbiAgICAgICAgICAgICAga2V5OiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuTkFNRVNQQUNFXSArICc6JyArIG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5LRVldLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdLFxuICAgICAgICAgICAgICBwYXJhbUxheWVyOiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuS0VZXSxcbiAgICAgICAgICAgICAgbmFtZTogZHMubmFtZSxcbiAgICAgICAgICAgICAgZGF0YXNvdXJjZUlkOiBkcy5pZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKGxheWVyKSA9PiBsYXllciBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMpO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpLFxuICAgICAgc3RhcnRXaXRoKFtdKVxuICAgICk7XG5cbiAgICB0aGlzLmF1dG9EYXRhc2V0TGF5ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuZmllbGRzJCxcbiAgICAgIHRoaXMudXNlZERhdGFzb3VyY2VzJC5waXBlKFxuICAgICAgICBzdGFydFdpdGgoW10pLFxuICAgICAgICBtYXAoXG4gICAgICAgICAgKGRhdGFzb3VyY2VzKSA9PlxuICAgICAgICAgICAgZGF0YXNvdXJjZXMuZmlsdGVyKChkcykgPT4gZHMuc291cmNlVHlwZSA9PT0gJ2RhdGFzZXQnICYmICFEYXRhc291cmNlVXRpbHMuaXNHZW8oZHMpKSBhcyBEYXRhc2V0W11cbiAgICAgICAgKVxuICAgICAgKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbY2xhc3NlcywgZmllbGRzLCBkYXRhU2V0c10pID0+XG4gICAgICAgICAgZGF0YVNldHNcbiAgICAgICAgICAgIC5tYXAoKGRzKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gY2xhc3Nlcy5maW5kKChjbGF6eikgPT4gY2xhenouaWQgPT09IGRzLm9DbGFzcyk7XG4gICAgICAgICAgICAgIGNvbnN0IGdlb0F0dHJpYnV0ZXMgPSAoXG4gICAgICAgICAgICAgICAgbW9kZWw/LmF0dHJpYnV0ZXMubWFwKChhdHRyKSA9PiAoeyBhdHRyLCBmaWVsZDogZmllbGRzLmZpbmQoKGYpID0+IGF0dHIuZmllbGQgPT09IGYuaWQpIH0pKSA/PyBbXVxuICAgICAgICAgICAgICApLmZpbHRlcigoeyBhdHRyLCBmaWVsZCB9KSA9PiAhIWZpZWxkICYmIEdlb21ldHJpY0ZpZWxkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpO1xuICAgICAgICAgICAgICByZXR1cm4gZ2VvQXR0cmlidXRlcy5tYXAoXG4gICAgICAgICAgICAgICAgKGdlbykgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGAke2RzLm5hbWV9JHtnZW9BdHRyaWJ1dGVzLmxlbmd0aCA+IDEgPyAnIC0gJyArIGdlby5hdHRyLm5hbWUgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICBvQ2xhc3M6IGRzLm9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAga2V5OiBkcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgc3ViVHlwZTogZ2VvLmZpZWxkIS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbZHMub0NsYXNzXSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlOiBnZW8uYXR0ci50ZWNobmljYWxOYW1lXG4gICAgICAgICAgICAgICAgICB9KSBhcyBNYXBBdXRvTGF5ZXJPcHRpb25zXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZsYXQoKSBhcyBNYXBBdXRvTGF5ZXJPcHRpb25zW11cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMubWFuaWZlc3QkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgobWFuaWZlc3QpID0+XG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICgoKG1hbmlmZXN0Lm9wdGlvbnMgPz8geyBsYXllcnM6IFtdIH0pIGFzIE1hcFdpZGdldE9wdGlvbnMpLmxheWVycyA/PyBbXSkuZmlsdGVyKChsYXllcikgPT5cbiAgICAgICAgICAgICAgICBbJ3dtcyddLmluY2x1ZGVzKGxheWVyLnR5cGUpXG4gICAgICAgICAgICAgICkgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNbXVxuICAgICAgICAgICAgKS5tYXAoKGxheWVyKSA9PiBsYXllci51cmwpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHVybHMpID0+IHVybHMuZm9yRWFjaCgodXJsKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuZ2V0Q2FwYWJpbGl0eSh7IHVybCB9KSkpKVxuICAgICk7XG5cbiAgICB0aGlzLndtc0NhcGFiaWxpdGllcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuY2FwYWJpbGl0aWVzKTtcblxuICAgIHRoaXMub3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMubWFuaWZlc3QkLFxuICAgICAgdGhpcy5yZXN1bHRTZXQkLFxuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuZmllbGRzJCxcbiAgICAgIHRoaXMuc3R5bGVzJCxcbiAgICAgIHRoaXMuZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnMkLFxuICAgICAgdGhpcy53bXNDYXBhYmlsaXRpZXMkLFxuICAgICAgdGhpcy5hdXRvRGF0YXNldExheWVycyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbbWFuaWZlc3QsIHJlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzLCBtYXBTdHlsZXMsIGdlb0xheWVycywgY2FwYWJpbGl0aWVzLCBhdXRvRGF0YXNldExheWVyc10pID0+IHtcbiAgICAgICAgLy8gYXV0byBkZXRlcm1pbmUgbGF5ZXJzIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSBhIHdvcmtpbmcgdmlld1xuICAgICAgICBjb25zdCBhdXRvT3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkpIGFzIE1hcFdpZGdldE9wdGlvbnM7XG4gICAgICAgIGlmICghYXV0b09wdGlvbnMudG9vbHRpcE1vZGUpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy50b29sdGlwTW9kZSA9IFRvb2x0aXBNb2RlLkNMSUNLO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gW1xuICAgICAgICAgIC4uLihhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnR5cGUgIT09ICdhdXRvJyksXG4gICAgICAgICAgLi4uKGF1dG9PcHRpb25zLmF1dG9tYXRpY0xheWVyc1xuICAgICAgICAgICAgPyBhdXRvRGF0YXNldExheWVyc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAobGF5ZXIpID0+XG4gICAgICAgICAgICAgICAgICAgICFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgIWF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5pbmNsdWRlcyhsYXllci5rZXkgKyAnLScgKyBsYXllci5zdWJUeXBlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChsYXllcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLmxheWVyLFxuICAgICAgICAgICAgICAgICAgLi4uKChhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgKHByZXZMYXllcikgPT4gcHJldkxheWVyLmtleSA9PT0gbGF5ZXIua2V5ICYmIHByZXZMYXllci5hdHRyaWJ1dGUgPT09IGxheWVyLmF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgKSA/PyB7fSlcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogW10pXG4gICAgICAgIF07XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzPy5mb3JFYWNoKChsYXllciwgaSkgPT4ge1xuICAgICAgICAgIFdpZGdldE1hcFV0aWxzLnBvcHVsYXRlTG9jYXRpb25BdHRyaWJ1dGUobGF5ZXIsIHJlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzKTtcbiAgICAgICAgICBXaWRnZXRNYXBVdGlscy5wb3B1bGF0ZUludGVuc2l0eUF0dHJpYnV0ZShsYXllciwgcmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMpO1xuICAgICAgICAgIGlmIChhdXRvT3B0aW9ucy5hdHRyaWJ1dGlvbnMpIHtcbiAgICAgICAgICAgIGxheWVyLmF0dHJpYnV0aW9uID0gbGF5ZXIuYXR0cmlidXRpb24gPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhY3R1YWxMYXllcktleXMgPSAoYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKVxuICAgICAgICAgIC5tYXAoKGxheWVyKSA9PiAobGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKS5rZXkgPz8gbnVsbClcbiAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICEha2V5KTtcblxuICAgICAgICAvLyBHZXQgYWxsIHByZXZpb3VzIGxheWVycywgd2l0aG91dCBnZW9zZXJ2ZXIgbGF5ZXJzIHRoYXQgYXJlIG5vdCByZXF1ZXN0ZWQgYW55bW9yZSwgdGhlbiBhZGQgbmV3IGdlb3NlcnZlciBsYXllcnMgKHBvdGVudGlhbGx5IHdpdGggYSBwcmVjb25maWcgZnJvbSBtYW5pZmVzdCkuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycyA9IFtcbiAgICAgICAgICAuLi4oYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKS5tYXAoKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZW9MYXllciA9IGdlb0xheWVycy5maW5kKChnZW9MYXllcikgPT4gbGF5ZXIua2V5ID09PSBnZW9MYXllci5rZXkpID8/IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcidcbiAgICAgICAgICAgICAgPyBnZW9MYXllclxuICAgICAgICAgICAgICAgID8geyAuLi5nZW9MYXllciwgLi4ubGF5ZXIsIHVybDogZ2VvTGF5ZXIudXJsIH1cbiAgICAgICAgICAgICAgICA6IChudWxsIGFzIHVua25vd24gYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKVxuICAgICAgICAgICAgICA6IHsgLi4ubGF5ZXIgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5nZW9MYXllcnMuZmlsdGVyKChsYXllcikgPT4gIWFjdHVhbExheWVyS2V5cy5pbmNsdWRlcyhsYXllci5rZXkpKVxuICAgICAgICBdLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIpO1xuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHRMYXllclRpdGxlKGxheWVyLCBpbmRleCwgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICEhbWFwU3R5bGVzICYmXG4gICAgICAgICAgbWFwU3R5bGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAoIWF1dG9PcHRpb25zLnN0eWxlIHx8ICFtYXBTdHlsZXMubWFwKChzdHlsZSkgPT4gc3R5bGUuaWRlbnRpZmllcikuaW5jbHVkZXMoYXV0b09wdGlvbnMuc3R5bGUpKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBsaWdodFN0eWxlcyA9IG1hcFN0eWxlcy5maWx0ZXIoKHN0eWxlKSA9PiAhKHN0eWxlLmlkZW50aWZpZXIgPz8gJy0nKS5pbmNsdWRlcygnZGFyaycpKTtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5zdHlsZSA9IGxpZ2h0U3R5bGVzLmxlbmd0aCA+IDAgPyBsaWdodFN0eWxlc1swXS5pZGVudGlmaWVyIDogbWFwU3R5bGVzWzBdLmlkZW50aWZpZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyKSB7XG4gICAgICAgICAgY29uc3QgYmFzZSA9IGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllcjtcblxuICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGlnbm9yZUF1dG9MYXllcnMsIHZhbHVlcyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgY29uc3QgcG9zc2libGVJZ25vcmVBdXRvTGF5ZXJLZXlzID0gYXV0b0RhdGFzZXRMYXllcnMubWFwKChsYXllcikgPT4gbGF5ZXIua2V5ICsgJy0nICsgbGF5ZXIuc3ViVHlwZSk7XG4gICAgICAgICAgYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyID0gKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllciA/PyBbXSkuZmlsdGVyKChrZXkpID0+XG4gICAgICAgICAgICBwb3NzaWJsZUlnbm9yZUF1dG9MYXllcktleXMuaW5jbHVkZXMoa2V5KVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgfHwgYmFzZS5sZW5ndGggIT09IGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdE1hbmlmZXN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gV2lkZ2V0TWFwVXRpbHMuYXNzaWduTGF5ZXJzT3JkZXIoYXV0b09wdGlvbnMubGF5ZXJzKTtcblxuICAgICAgICBpZiAoYXV0b09wdGlvbnMuZml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMuZm9yRWFjaChcbiAgICAgICAgICAgIChsYXllcikgPT4gKGxheWVyLmZpdCA9ICFOT05fTUFOREFUT1JZX0ZJVF9MQVlFUl9UWVBFUy5pbmNsdWRlcyhsYXllci50eXBlKSB8fCBhdXRvT3B0aW9ucy5maXQpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgYXV0b09wdGlvbnMuZml0O1xuICAgICAgICB9XG5cbiAgICAgICAgW1xuICAgICAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgIGF1dG9PcHRpb25zLmxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBbJ3dtcycsICdnZW9zZXJ2ZXInXS5pbmNsdWRlcyhsYXllci50eXBlKSkgYXMgKFxuICAgICAgICAgICAgICAgIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICAgICAgICB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1xuICAgICAgICAgICAgICApW11cbiAgICAgICAgICAgICkubWFwKChsYXllcikgPT4gbGF5ZXIudXJsKVxuICAgICAgICAgIClcbiAgICAgICAgXS5mb3JFYWNoKCh1cmwpID0+IHtcbiAgICAgICAgICBpZiAoY2FwYWJpbGl0aWVzICYmIGNhcGFiaWxpdGllc1t1cmxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5nZXRDYXBhYmlsaXR5KHsgdXJsOiB1cmwgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGF1dG9PcHRpb25zO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkLnBpcGUoZmlsdGVyKChvcHQpID0+ICEhb3B0KSkuc3Vic2NyaWJlKChvcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpKTtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZvckVhY2goXG4gICAgICAgICAgKGxheWVyKSA9PiAodGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSA/PyAnTUlTU0lORyBUSVRMRSddID0gZmFsc2UpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmxheWVycyAmJiB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5zb21lKChsYXllcikgPT4gIWxheWVyLmdyb3VwKSlcbiAgICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1xuICAgICAgICAgICAgPy5maWx0ZXIoXG4gICAgICAgICAgICAgIChsKSA9PlxuICAgICAgICAgICAgICAgICFsLmdyb3VwICYmXG4gICAgICAgICAgICAgICAgIXRoaXMubGF5ZXJHcm91cHNcbiAgICAgICAgICAgICAgICAgIC5maW5kKChncm91cCkgPT4gZ3JvdXAubmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUClcbiAgICAgICAgICAgICAgICAgID8udmlzaWJsZUxheWVycy5pbmNsdWRlcyhsLnRpdGxlID8/ICdNSVNTSU5HIFRJVExFJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBERUZBVUxUX0xBWUVSX0dST1VQLFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZUxheWVyczogbGF5ZXIudGl0bGUgPz8gJ01JU1NJTkcgVElUTEUnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5tYXAoKGxheWVyKSA9PiAoe1xuICAgICAgICAgIC4uLmxheWVyLFxuICAgICAgICAgIGdyb3VwOiBsYXllci5ncm91cCA/PyBERUZBVUxUX0xBWUVSX0dST1VQXG4gICAgICAgIH0pKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMubWFwVXJsJCA9IHRoaXMuc3RvcmUuc2VsZWN0KENvbmZpZ1NlbGVjdG9ycy5tYXBVcmwpO1xuXG4gICAgdGhpcy5ib3R0b21MZWZ0JCA9IHRoaXMud2lkZ2V0U2l6ZSQucGlwZShcbiAgICAgIG1hcCgoc2l6ZSkgPT4gYHRyYW5zbGF0ZSgxMHB4ICxjYWxjKCR7c2l6ZS5oZWlnaHR9cHggLSAxMDAlIC0gMTBweCkpYCksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuXG4gICAgdGhpcy5pdGVtU3R5bGVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmVzdWx0U2V0JCwgdGhpcy5tYW5pZmVzdCQsIHRoaXMuc3RhdGljUmVzdWx0U2V0JF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3JzLCBtYW5pZmVzdCwgc3JzXSkgPT4ge1xuICAgICAgICBpZiAoKG1hbmlmZXN0LmRhdGFzb3VyY2UgPT09IHVuZGVmaW5lZCB8fCBtYW5pZmVzdC5kYXRhc291cmNlLmxlbmd0aCA9PT0gMCkgJiYgIXNycykge1xuICAgICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTx7XG4gICAgICAgICAgICAgIFtpZDogc3RyaW5nXToge1xuICAgICAgICAgICAgICAgIGNsYXNzaWM6IFN0eWxlO1xuICAgICAgICAgICAgICAgIGJvcmRlcmVkOiBTdHlsZTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSBPYmplY3QudmFsdWVzKHJzLml0ZW1zKS5yZWR1Y2UoKHAsIGMpID0+IGMubGVuZ3RoICsgcCwgMCk7XG4gICAgICAgICAgICAgIGlmICh0b3RhbCA9PT0gMCkgcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHtcbiAgICAgICAgICAgICAgICBbaWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICAgIGNsYXNzaWM6IFN0eWxlO1xuICAgICAgICAgICAgICAgICAgYm9yZGVyZWQ6IFN0eWxlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMocnMuaXRlbXMpLmZvckVhY2goKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgIChpdGVtKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW1ib2xTZXJ2aWNlLmdldFN5bWJvbEFzSWNvblN0eWxlKGl0ZW0pLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltYm9sU2VydmljZS5nZXRTeW1ib2xBc0ljb25TdHlsZShpdGVtLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICBdKS50aGVuKChbc3R5bGUsIGJTdHlsZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbaXRlbS5pZF0gPSB7IGNsYXNzaWM6IHN0eWxlLCBib3JkZXJlZDogYlN0eWxlIH07XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID49IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmhlaWdodCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpZGdldFNpemUkLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLCB0aGlzLmRpc3BsYXlIZWFkZXIkXSkucGlwZShcbiAgICAgIG1hcCgoW3NpemUsIGRpc3BsYXldKSA9PiAoc2l6ZS5oZWlnaHQgPz8gMTAwKSAtIChkaXNwbGF5ID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKSksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGlvbnMkID0gdGhpcy5vcHRpb25zJC5waXBlKG1hcCgob3B0aW9ucykgPT4gISFvcHRpb25zLmF0dHJpYnV0aW9ucykpO1xuXG4gICAgdGhpcy5sZWdlbmRUb3AkID0gY29tYmluZUxhdGVzdChbdGhpcy5kaXNwbGF5SGVhZGVyJCwgdGhpcy5hdHRyaWJ1dGlvbnMkXSkucGlwZShcbiAgICAgIG1hcCgoW2hlYWRlciwgYXR0cl0pID0+IDUgKyAoaGVhZGVyID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKSArIChhdHRyID8gNjEgOiAwKSlcbiAgICApO1xuXG4gICAgdGhpcy5sZWdlbmRIZWlnaHQkID0gY29tYmluZUxhdGVzdChbdGhpcy53aWRnZXRTaXplJC5waXBlKGRlYm91bmNlVGltZSgxMDApKSwgdGhpcy5sZWdlbmRUb3AkXSkucGlwZShcbiAgICAgIG1hcCgoW3NpemUsIHRvcF0pID0+IHtcbiAgICAgICAgcmV0dXJuIChzaXplLmhlaWdodCA/PyAxMDApIC0gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgLSB0b3AgLSA1NjsgLy8gNTZweCBpcyB0aGUgdG9vbHRpcCBoZWlnaHQgKyBtYXJnaW5cbiAgICAgIH0pLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndtc0NhcGFiaWxpdGllcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKCh3bXNDYXBhYmlsaXRpZXMpID0+XG4gICAgICAgICAgICB3bXNDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyh3bXNDYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAgICAgICAubWFwKCh1cmwpID0+ICh7IHVybCwgbGF5ZXJzOiBYTUxVdGlscy5nZXRQb3NzaWJsZUxheWVyU3R5bGVzKHdtc0NhcGFiaWxpdGllc1t1cmxdPy5kb2MpIH0pKVxuICAgICAgICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gKHsgLi4ucCwgW2MudXJsXTogYyB9KSwge30pXG4gICAgICAgICAgICAgIDoge31cbiAgICAgICAgICApLFxuICAgICAgICAgIHN0YXJ0V2l0aCh7fSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChwb3NzaWJsZVN0eWxlcykgPT4gKHRoaXMucG9zc2libGVTdHlsZXMgPSBwb3NzaWJsZVN0eWxlcykpXG4gICAgKTtcblxuICAgIHRoaXMuaGFzU2xpZGVMYXllciQgPSB0aGlzLm9wdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKG9wdGlvbnMpID0+XG4gICAgICAgIChvcHRpb25zLmxheWVycyA/PyBbXSkubWFwKChsYXllcikgPT4gISFsYXllci5zbGlkZSAmJiBsYXllci5zbGlkZSAhPT0gJ2FsbCcpLnJlZHVjZSgoYSwgYikgPT4gYSB8fCBiLCBmYWxzZSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5sYXllckdyb3VwcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMubGF5ZXJHcm91cHMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmxheWVyR3JvdXBzJC5zdWJzY3JpYmUoKGxheWVyR3JvdXBzKSA9PiB7XG4gICAgICAgIHRoaXMubGF5ZXJHcm91cHMgPSBsYXllckdyb3VwcztcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgRGFzaGJvYXJkQWN0aW9ucy5pbml0RGVmYXVsdExheWVyR3JvdXAoe1xuICAgICAgICBsYXllcnM6IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzXG4gICAgICAgICAgPy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAobGF5ZXIpID0+XG4gICAgICAgICAgICAgIGxheWVyLnRpdGxlID8/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLiR7bGF5ZXIudHlwZX1gLCB7IC4uLmxheWVyIH0pXG4gICAgICAgICAgKVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgaW5pdEludGVyYWN0aW9uTWFuYWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIuaW5pdCh0aGlzKTtcbiAgfVxuXG4gIGluaXRUb29sdGlwTWFuYWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwTWFuYWdlci5pbml0KFxuICAgICAgdGhpcy50b29sdGlwRmFjdG9yeVNlcnZpY2UsXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgdGhpcy5zdG9yZSxcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyxcbiAgICAgIHRoaXMud2lkZ2V0U2l6ZSQsXG4gICAgICB0aGlzLmRpc3BsYXlIZWFkZXIkLFxuICAgICAgdGhpcy5tYXAsXG4gICAgICB0aGlzLnBvcHVwLFxuICAgICAgdGhpcy5wb3B1cENvbnRlbnQsXG4gICAgICB0aGlzLmludGVyYWN0aW9uTWFuYWdlcixcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWFwID0gbmV3IE1hcCh7IHRhcmdldDogdGhpcy5tYXBSZWYubmF0aXZlRWxlbWVudCwgY29udHJvbHM6IGRlZmF1bHRzKHsgYXR0cmlidXRpb246IGZhbHNlIH0pIH0pO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyID0gdGhpcy5pbml0SW50ZXJhY3Rpb25NYW5hZ2VyKCk7XG4gICAgdGhpcy5sYXllclNsaWRlci5pbml0KHRoaXMubWFwLCB0aGlzLnNsaWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy50b29sdGlwTWFuYWdlciA9IHRoaXMuaW5pdFRvb2x0aXBNYW5hZ2VyKCk7XG4gICAgdGhpcy5tYXBTdHlsZVVybCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLm1hcFVybCRdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgdXJsXSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3R5bGUpIHtcbiAgICAgICAgICBjYXNlIHRoaXMuTk9fU1RZTEU6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjYXNlIHRoaXMuU1RZTEVfRlJPTV9VUkw6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsZVVSTCA/PyAnJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGAke3VybH0vc3R5bGVzLyR7b3B0aW9ucy5zdHlsZX0vc3R5bGUuanNvbmA7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG5cbiAgICB0aGlzLm1hcFN0eWxlTGF5ZXIkID0gdGhpcy5tYXBTdHlsZVVybCQucGlwZShcbiAgICAgIG1hcCgoc3R5bGVVcmwpID0+IHtcbiAgICAgICAgaWYgKCFzdHlsZVVybCkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIG5ldyBNYXBib3hWZWN0b3JMYXllcih7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7IHRpdGxlOiAnYmFja2dyb3VuZCcgfSxcbiAgICAgICAgICAgIHN0eWxlVXJsXG4gICAgICAgICAgfSkgLyogLFxuICAgICAgICAgIG5ldyBUaWxlTGF5ZXIoe1xuICAgICAgICAgICAgc291cmNlOiBuZXcgVGlsZURlYnVnKClcbiAgICAgICAgICB9KSAqL1xuICAgICAgICBdO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChvcHRpb25zKSA9PiAoe1xuICAgICAgICAgICAgY2VudGVyOiBmcm9tTG9uTGF0KG9wdGlvbnMuY2VudGVyID8/IFdpZGdldE1hcFV0aWxzLkRFRkFVTFRfTUFQX0NFTlRFUiksXG4gICAgICAgICAgICBtYXhab29tOiBvcHRpb25zLnpvb20/Lm1heCA/PyBXaWRnZXRNYXBVdGlscy5ERUZBVUxUX1pPT01fTUFYLFxuICAgICAgICAgICAgbWluWm9vbTogb3B0aW9ucy56b29tPy5taW4gPz8gV2lkZ2V0TWFwVXRpbHMuREVGQVVMVF9aT09NX01JTixcbiAgICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbT8uc3RhcnQgPz8gV2lkZ2V0TWFwVXRpbHMuREVGQVVMVF9aT09NX1NUQVJUXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2aWV3KSA9PiB0aGlzLm1hcC5zZXRWaWV3KG5ldyBWaWV3KHZpZXcpKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChvcHRpb25zKSA9PiBvcHRpb25zLmF0dHJpYnV0aW9ucyksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGF0dHJpYnV0aW9ucykgPT4ge1xuICAgICAgICAgIGlmICghYXR0cmlidXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVDb250cm9sKHRoaXMuYXR0cmlidXRpb25zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXAuYWRkQ29udHJvbCh0aGlzLmF0dHJpYnV0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmxheWVycyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucmVzdWx0U2V0JCxcbiAgICAgIHRoaXMub3B0aW9ucyQsXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5hZGRpdGlvbmFsTGF5ZXJzJCxcbiAgICAgIHRoaXMuaXRlbVN0eWxlcyQsXG4gICAgICB0aGlzLmRhdGFzb3VyY2VGaWx0ZXJzJCxcbiAgICAgIHRoaXMuZmllbGRzJFxuICAgIF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoXG4gICAgICAgIChbcmVzdWx0U2V0LCBvcHRpb25zLCBjbGFzc2VzLCBhZGRpdGlvbmFsTGF5ZXJzLCBpdGVtU3R5bGVzLCBmaWx0ZXJzLCBmaWVsZHNdKSA9PlxuICAgICAgICAgICEhcmVzdWx0U2V0ICYmICEhb3B0aW9ucyAmJiAhIWNsYXNzZXMgJiYgISFmaWVsZHNcbiAgICAgICksXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmxheWVyR3JvdXBzJCksXG4gICAgICBtYXAoKFtbcmVzdWx0U2V0LCBvcHRpb25zLCBjbGFzc2VzLCBhZGRpdGlvbmFsTGF5ZXJzLCBpdGVtU3R5bGVzLCBmaWx0ZXJzLCBmaWVsZHNdLCBsYXllckdyb3Vwc10pID0+IHtcbiAgICAgICAgbGV0IGhhc1JlbGF0aW9uTGF5ZXIgPSBudWxsIGFzIHVua25vd24gYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPGFueT4+O1xuXG4gICAgICAgIGNvbnN0IGxheWVycyA9IChvcHRpb25zPy5sYXllcnMgfHwgW10pXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIChsYXllcikgPT4gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuZG9udE5lZWRMb2NhdGlvbi5pbmNsdWRlcyhsYXllci50eXBlKSB8fCAhIWxheWVyLmF0dHJpYnV0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgKGxheWVyKSA9PiB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS5kb250TmVlZEludGVuc2l0eS5pbmNsdWRlcyhsYXllci50eXBlKSB8fCAhIWxheWVyLmludGVuc2l0eUF0dHJpYnV0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBpZHgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzRm9yQ2xhc3MgPSBPYmplY3Qua2V5cyhyZXN1bHRTZXQuaXRlbXMpXG4gICAgICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+ICh7XG4gICAgICAgICAgICAgICAgY2xhc3NJZCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldEF0dHJpYnV0ZXNGb3JEcmF3aW5nKGNsYXNzZXMsIGNsYXNzSWQsIGxheWVyKVxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgICAgICAocCwgYykgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgICAgICAgICBbYy5jbGFzc0lkXTogY1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHt9IGFzIHtcbiAgICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5QXR0cmlidXRlOiBBdHRyaWJ1dGU7XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uQXR0cmlidXRlOiBBdHRyaWJ1dGU7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGxheWVyQ2xhc3Nlc0lkID0gY2xhc3Nlcy5tYXAoKGNsYXp6KSA9PiBjbGF6ei5pZCk7XG4gICAgICAgICAgICBpZiAoJ2NsYXNzZXMnIGluIGxheWVyICYmICEhbGF5ZXIuY2xhc3NlcyAmJiBsYXllci5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbGF5ZXJDbGFzc2VzSWQgPSBsYXllci5jbGFzc2VzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB7IG1pbjogMCwgbWF4OiAwIH07XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAoISFsYXllci5pbnRlbnNpdHlBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMocmVzdWx0U2V0Lml0ZW1zKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+XG4gICAgICAgICAgICAgICAgICByZXN1bHRTZXQuaXRlbXNbY2xhc3NJZF0ubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICBJdGVtVXRpbHMuZ2V0QXR0cmlidXRlQ2FsY3VsYXRlZFZhbHVlKGl0ZW0sIGF0dHJpYnV0ZXNGb3JDbGFzc1tpdGVtLm9DbGFzc10uaW50ZW5zaXR5QXR0cmlidXRlKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVkdWNlKChwLCBjKSA9PiBbLi4ucCwgLi4uY10sIFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIGFzIG51bWJlcltdO1xuXG4gICAgICAgICAgICAgIHJhbmdlID0gdmFsdWVzLnJlZHVjZSgocCwgYykgPT4gKHsgbWluOiBNYXRoLm1pbihwLm1pbiwgYyksIG1heDogTWF0aC5tYXgocC5tYXgsIGMpIH0pLCB7XG4gICAgICAgICAgICAgICAgbWluOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgICAgIG1heDogLU51bWJlci5NQVhfVkFMVUVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGltcGwgPSB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS5sYXllcnNJbXBsZW1lbnRhdGlvbltsYXllci50eXBlXTtcbiAgICAgICAgICAgIGlmICghIWltcGwpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0TGF5ZXIgPSBpbXBsKFxuICAgICAgICAgICAgICAgIGxheWVyIGFzIGFueSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzRm9yQ2xhc3MsXG4gICAgICAgICAgICAgICAgbGF5ZXJDbGFzc2VzSWQsXG4gICAgICAgICAgICAgICAgcmVzdWx0U2V0LFxuICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgIGl0ZW1TdHlsZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCdmaXQnLCBsYXllci5maXQpO1xuICAgICAgICAgICAgICByZXN1bHRMYXllci5zZXQoJ3R5cGUnLCBsYXllci50eXBlKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCdzbGlkZScsIGxheWVyLnNsaWRlKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCdvcmRlcicsIGxheWVyLm9yZGVyKTtcbiAgICAgICAgICAgICAgY29uc3QgbWF4TGF5ZXJPcmRlciA9IE1hdGgubWF4KC4uLmFycmF5Lm1hcCgobCkgPT4gbC5vcmRlciA/PyAwKSk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldFpJbmRleChtYXhMYXllck9yZGVyICsgMSAtIChsYXllci5vcmRlciA/PyBpZHgpKTtcbiAgICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdyZWxhdGlvbicpIHtcbiAgICAgICAgICAgICAgICBoYXNSZWxhdGlvbkxheWVyID0gcmVzdWx0TGF5ZXIgYXMgdW5rbm93biBhcyBWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U+O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgndGl0bGUnLCBsYXllci50aXRsZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3FsX2ZpbHRlciA9IENxbFV0aWxzLmdldENRTFBhcmFtc0ZvcihsYXllci5kYXRhc291cmNlSWQsIGZpbHRlcnMsIGNsYXNzZXMsIGZpZWxkcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3FsX2ZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIENRTCBxdWVyeSB0byBnZW9zZXJ2ZXIgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAocmVzdWx0TGF5ZXIgYXMgVGlsZTxUaWxlV01TPikuZ2V0U291cmNlKCkhLnVwZGF0ZVBhcmFtcyh7IGNxbF9maWx0ZXIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGxheWVyLnNsaWRlICYmIGxheWVyLnNsaWRlICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5ZXJTbGlkZXIuYXBwbHlTbGlkZShcbiAgICAgICAgICAgICAgICAgIGxheWVyLnNsaWRlLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIgYXMgdW5rbm93biBhcyBUaWxlTGF5ZXI8YW55PiB8IFZlY3RvckxheWVyPGFueT4gfCBIZWF0bWFwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRMYXllcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYExheWVyIHR5cGUgJHtsYXllci50eXBlfSBpcyB1bmtub3duYCk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsIGFzIHVua25vd24gYXMgQmFzZUxheWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIpO1xuXG4gICAgICAgIGlmICghIWhhc1JlbGF0aW9uTGF5ZXIpIHtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IGxheWVyc1xuICAgICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEobGF5ZXIgaW5zdGFuY2VvZiBUaWxlKSlcbiAgICAgICAgICAgIC5tYXAoKGxheWVyKSA9PlxuICAgICAgICAgICAgICBsYXllclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAuZ2V0U291cmNlKClcbiAgICAgICAgICAgICAgICAuZ2V0RmVhdHVyZXMoKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZlYXR1cmVzOiBGZWF0dXJlPGFueT4pID0+ICEhZmVhdHVyZXMuZ2V0KCdpZCcpIHx8ICEhZmVhdHVyZXMuZ2V0KCdmZWF0dXJlcycpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gWy4uLnAsIC4uLmNdLCBbXSk7XG5cbiAgICAgICAgICByZXN1bHRTZXQucmVsYXRpb25zLmZvckVhY2goKHJlbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBmZWF0dXJlcy5maW5kKChmOiBGZWF0dXJlPFBvaW50IHwgQ2lyY2xlPikgPT4gZi5nZXQoJ2lkJykgPT09IHJlbGF0aW9uLnNvdXJjZSk7XG4gICAgICAgICAgICBjb25zdCBkZXN0ID0gZmVhdHVyZXMuZmluZCgoZjogRmVhdHVyZTxQb2ludCB8IENpcmNsZT4pID0+IGYuZ2V0KCdpZCcpID09PSByZWxhdGlvbi5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICBpZiAoISFzb3VyY2UgJiYgISFkZXN0KSB7XG4gICAgICAgICAgICAgIGhhc1JlbGF0aW9uTGF5ZXIuZ2V0U291cmNlKCk/LmFkZEZlYXR1cmUoV2lkZ2V0TWFwVXRpbHMuZ2V0TGlua0ZlYXR1cmUocmVsYXRpb24sIHNvdXJjZSwgZGVzdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxheWVycy5wdXNoKC4uLmFkZGl0aW9uYWxMYXllcnMpO1xuXG4gICAgICAgIGNvbnN0IHZpc2libGVMYXllcnMgPSBsYXllckdyb3Vwcy5tYXAoKGdyb3VwKSA9PiBncm91cC52aXNpYmxlTGF5ZXJzKS5mbGF0KCk7XG4gICAgICAgIGxheWVycy5mb3JFYWNoKChsYXllciwgaWR4KSA9PiB7XG4gICAgICAgICAgaWYgKCF2aXNpYmxlTGF5ZXJzLmluY2x1ZGVzKGxheWVyLmdldCgndGl0bGUnKSkpIHtcbiAgICAgICAgICAgIGxheWVyLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogUmVzb2x2ZSBidWcgZHJhd2luZyB3ZWJnbGxheWVyIHdpdGhvdXQgbm90aGluZyB1bmRlcm5lYXRoOiBhZGQgZW1wdHkgbGF5ZXIgYmVsb3cgKi9cbiAgICAgICAgY29uc3QgX2xheWVycyA9IHRoaXMuYWRkRW1wdHlXZWJHbExheWVyQmVsb3dTbGlkZUhlYXRtYXBzKGxheWVycyk7XG4gICAgICAgIHRoaXMucHJldmlvdXNMYXllcnMucHVzaCguLi5fbGF5ZXJzKTtcbiAgICAgICAgcmV0dXJuIF9sYXllcnM7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmZpdEV4dGVudHMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuZmllbGRzJCxcbiAgICAgIHRoaXMuZGF0YXNvdXJjZUZpbHRlcnMkLFxuICAgICAgdGhpcy53bXNDYXBhYmlsaXRpZXMkXG4gICAgXSkucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgc3dpdGNoTWFwKChbb3B0aW9ucywgY2xhc3NlcywgZmllbGRzLCBmaWx0ZXJzLCB3bXNDYXBhYmlsaXRpZXNdKSA9PlxuICAgICAgICAob3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbmQoKGxheWVyKSA9PiBbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKSAmJiBsYXllci5maXQpXG4gICAgICAgICAgPyBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgLi4uKChvcHRpb25zLmxheWVycz8uZmlsdGVyKChsYXllcikgPT4gbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcicpID8/IFtdKSBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNbXSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZml0KVxuICAgICAgICAgICAgICAgIC5tYXAoKGxheWVyOiBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMpID0+XG4gICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuZmluZCgoY2xhenopID0+IGNsYXp6LmlkID09PSBsYXllci5vQ2xhc3MpID8/ICh7IGF0dHJpYnV0ZXM6IFtdIH0gYXMgdW5rbm93biBhcyBDbGFzcylcbiAgICAgICAgICAgICAgICAgICkuYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChhdHRyKSA9PiAoeyBhdHRyLCBmaWVsZDogZmllbGRzLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5pZCA9PT0gYXR0ci5maWVsZCkgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHsgYXR0ciwgZmllbGQgfSkgPT4gR2VvbWV0cmljRmllbGRUeXBlcy5pbmNsdWRlcyhmaWVsZD8udHlwZSA/PyAnLS0tLScpKVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh7IGF0dHIsIGZpZWxkIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcnlBZ2dyZWdhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZ2dyZWdhdGUoW2xheWVyLmRhdGFzb3VyY2VJZF0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkaW5hdGU6IHsgb3BlcmF0aW9uOiBPcGVyYXRpb24uRVhURU5ULCBhdHRyaWJ1dGU6IGF0dHIuaWQsIGxhYmVsOiBhdHRyLm5hbWUsIGtlZXAwOiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIENoYXJ0QWdncmVnYXRlZFdpZGdldE9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChleHRlbnRSZXNwb25zZTogQWdncmVnYXRpb25SZXN1bHQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0TWFwVXRpbHMucHJvamVjdEV4dGVudEFnZ3JlZ2F0aW9uUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21zQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBkYXRhc291cmNlOiBsYXllci5kYXRhc291cmNlSWQsIGV4dGVudDogW10sIGVycm9yOiB0cnVlIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmZsYXQoKSxcbiAgICAgICAgICAgICAgLi4uKChvcHRpb25zLmxheWVycz8uZmlsdGVyKChsYXllcikgPT4gbGF5ZXIudHlwZSA9PT0gJ3dtcycpID8/IFtdKSBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9uc1tdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5maXQpXG4gICAgICAgICAgICAgICAgLm1hcCgobGF5ZXI6IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBleHRlbnQgPSBYTUxVdGlscy5nZXRMYXllckV4dGVudChsYXllci5wYXJhbUxheWVyLCB0aGlzLm1hcCwgd21zQ2FwYWJpbGl0aWVzIVtsYXllci51cmxdPy5kb2MpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNvdXJjZTogYHdtcy0ke2xheWVyLnBhcmFtTGF5ZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW50OiBleHRlbnQgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAhZXh0ZW50XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICA6IG9mKFtdKVxuICAgICAgKSxcbiAgICAgIHN0YXJ0V2l0aChcbiAgICAgICAgW10gYXMge1xuICAgICAgICAgIGRhdGFzb3VyY2U6IHN0cmluZztcbiAgICAgICAgICBleHRlbnQ6IENvb3JkaW5hdGVbXTtcbiAgICAgICAgICBlcnJvcjogYm9vbGVhbjtcbiAgICAgICAgfVtdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMubGVnZW5kTGF5ZXJzJCA9IHRoaXMub3B0aW9ucyQucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICAgKG9wdGlvbnMubGF5ZXJzID8/IFtdKS5maWx0ZXIoKGxheWVyKSA9PiBbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKSkgYXMgKFxuICAgICAgICAgICAgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICAgIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICApW11cbiAgICAgICksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuXG4gICAgdGhpcy5sYXllcnNUb3AkID0gY29tYmluZUxhdGVzdChbdGhpcy5sZWdlbmRUb3AkLCB0aGlzLmxlZ2VuZExheWVycyRdKS5waXBlKFxuICAgICAgbWFwKChbbGVnZW5kVG9wLCBsYXllcnNdKSA9PiBsZWdlbmRUb3AgKyAoKGxheWVycy5sZW5ndGggPz8gMCkgPiAwID8gNTAgOiAwKSlcbiAgICApO1xuXG4gICAgdGhpcy5sYXllcnNIZWlnaHQkID0gY29tYmluZUxhdGVzdChbdGhpcy53aWRnZXRTaXplJC5waXBlKGRlYm91bmNlVGltZSgxMDApKSwgdGhpcy5sYXllcnNUb3AkXSkucGlwZShcbiAgICAgIG1hcCgoW3NpemUsIHRvcF0pID0+IHtcbiAgICAgICAgcmV0dXJuIChzaXplLmhlaWdodCA/PyAxMDApIC0gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgLSB0b3AgLSA1MDsgLy8gNTBweCBhY3RzIGFzIGJvdHRvbSBtYXJnaW5cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmxheWVyc1RvcCQsIHRoaXMubGVnZW5kTGF5ZXJzJCwgdGhpcy5vbFpvb21FbGVtZW50JCwgdGhpcy5kaXNwbGF5SGVhZGVyJF0pXG4gICAgICAgIC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMubGF5ZXJzJCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKFtbbGF5ZXJzVG9wLCBsZWdlbmQsIHpvb21FbGVtZW50LCBkaXNwbGF5SGVhZGVyXSwgbGF5ZXJzXSkgPT4ge1xuICAgICAgICAgIGlmICh6b29tRWxlbWVudCkge1xuICAgICAgICAgICAgem9vbUVsZW1lbnQuc3R5bGUudG9wID0gYCR7XG4gICAgICAgICAgICAgIGxheWVyc1RvcCArXG4gICAgICAgICAgICAgICgobGVnZW5kLmxlbmd0aCA/PyAwKSA+IDAgfHwgbGF5ZXJzLmxlbmd0aCA+IDAgPyAyMCA6IDApICtcbiAgICAgICAgICAgICAgKCFkaXNwbGF5SGVhZGVyID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKVxuICAgICAgICAgICAgfXB4YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5tYXBTdHlsZUxheWVyJCxcbiAgICAgICAgdGhpcy5sYXllcnMkLFxuICAgICAgICB0aGlzLnNlbGVjdGVkSWRzJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSkpLFxuICAgICAgICB0aGlzLmZpdEV4dGVudHMkLFxuICAgICAgICB0aGlzLmRhdGFzb3VyY2VGaWx0ZXJzJFxuICAgICAgXSkuc3Vic2NyaWJlKChbbWFwU3R5bGVMYXllciwgbGF5ZXJzLCBzZWxlY3RlZElkcywgZXh0ZW50cywgZmlsdGVyc10pID0+IHtcbiAgICAgICAgY29uc3QgbmVlZGVkQ2FsY3VsYXRlZEV4dGVudHMgPSBsYXllcnMuZmlsdGVyKFxuICAgICAgICAgIChsYXllcikgPT4gWydnZW9zZXJ2ZXInLCAnd21zJ10uaW5jbHVkZXMobGF5ZXIuZ2V0KCd0eXBlJykpICYmIGxheWVyLmdldCgnZml0JylcbiAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5iQ2FsY3VsYXRlZEV4dGVudHMgPSBleHRlbnRzLmZpbHRlcigoZXh0ZW50KSA9PiAhZXh0ZW50LmVycm9yKS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKG5iQ2FsY3VsYXRlZEV4dGVudHMgPj0gbmVlZGVkQ2FsY3VsYXRlZEV4dGVudHMpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRvQXBwbHlMYXllcnMgPSBbLi4ubGF5ZXJzLCAuLi5tYXBTdHlsZUxheWVyXTtcbiAgICAgICAgICAgIHRoaXMubWFwLnNldExheWVycyh0b0FwcGx5TGF5ZXJzKTtcblxuICAgICAgICAgICAgdGhpcy5maXRNYXBGb3JPYmplY3RzKHNlbGVjdGVkSWRzLCBleHRlbnRzKTtcbiAgICAgICAgICAgIHRoaXMubWFwLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgdGhpcy5tYXBcbiAgICAgICAgICAgICAgLmdldEFsbExheWVycygpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiAhKGxheWVyIGluc3RhbmNlb2YgVGlsZSkpXG4gICAgICAgICAgICAgIC5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdldEZlYXR1cmVzID0gKGxheWVyLmdldFNvdXJjZSgpIGFzIFZlY3RvclNvdXJjZSk/LmdldEZlYXR1cmVzO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZ2V0RmVhdHVyZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIChsYXllci5nZXRTb3VyY2UoKSBhcyBWZWN0b3JTb3VyY2UpPy5nZXRGZWF0dXJlcygpLmZvckVhY2goKGZlYXR1cmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gZmVhdHVyZS5nZXQoJ3R5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIFsnYnViYmxlJywgJ21hcmtlcicsICdwb2ludCcsICdsaW5lJywgJ3BvbHlnb24nLCAnbXVsdGktbGluZScsICdtdWx0aS1wb2x5Z29uJ10uaW5jbHVkZXModHlwZSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5zZXRTdHlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZ2V0KHNlbGVjdGVkSWRzLmluY2x1ZGVzKGZlYXR1cmUuZ2V0KCdpZCcpKSA/ICdzZWxlY3RlZFN0eWxlJyA6ICdjbGFzc2ljU3R5bGUnKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1hcC5zZXRMYXllcnMoWy4uLm1hcFN0eWxlTGF5ZXJdKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFbXB0eVdlYkdsTGF5ZXJCZWxvd1NsaWRlSGVhdG1hcHMobGF5ZXJzOiBCYXNlTGF5ZXJbXSkge1xuICAgIGNvbnN0IF9sYXllcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbaV07XG4gICAgICBfbGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgaWYgKGxheWVyLmdldCgndHlwZScpID09PSAnaGVhdG1hcCcgJiYgbGF5ZXIuZ2V0KCdzbGlkZScpKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5RGF0YSA9IG5ldyBVaW50OEFycmF5KDI1NiAqIDI1NiAqIDQpO1xuICAgICAgICBjb25zdCBlbXB0eUxheWVyID0gbmV3IFdlYkdMVGlsZUxheWVyKHtcbiAgICAgICAgICBzb3VyY2U6IG5ldyBEYXRhVGlsZSh7XG4gICAgICAgICAgICBsb2FkZXIoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbXB0eURhdGE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4Wm9vbTogMCxcbiAgICAgICAgICAgIHdyYXBYOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIF9sYXllcnMucHVzaChlbXB0eUxheWVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9sYXllcnM7XG4gIH1cblxuICBvdmVycmlkZSBpbml0UmVzdWx0U2V0JCgpIHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMucmVzdWx0U2V0cyksXG4gICAgICB0aGlzLmRhdGFzb3VyY2VJZHMkLFxuICAgICAgdGhpcy5zdGF0aWNSZXN1bHRTZXQkLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGF0YVNvdXJjZVNlbGVjdG9ycy5kYXRhc2V0cylcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcmVzdWx0U2V0cywgcmVzdWx0U2V0TmFtZXNBcnJheSwgc3RhdGljUmVzdWx0U2V0LCBkZWZpbml0aW9uc10pID0+IHtcbiAgICAgICAgaWYgKCEhc3RhdGljUmVzdWx0U2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRpY1Jlc3VsdFNldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHRTZXRBcnJheSA9IHJlc3VsdFNldE5hbWVzQXJyYXlcbiAgICAgICAgICAuZmlsdGVyKChyc05hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBkZWZpbml0aW9ucy5maW5kKChkc2QpID0+IGRzZC5pZCA9PT0gcnNOYW1lKSBhcyBEYXRhc2V0IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuICFkZWZpbml0aW9uIHx8ICEoZGVmaW5pdGlvbi5tZXRhZGF0YSA/PyBbXSkuZmluZCgobWV0YSkgPT4gbWV0YS5tZXRhZGF0YURlZi5uYW1lID09PSAnX2dlb0tleScpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcCgocnNOYW1lKSA9PiByZXN1bHRTZXRzW3JzTmFtZSA/PyAnJ10pXG4gICAgICAgICAgLmZpbHRlcigocnNOYW1lKSA9PiAhIXJzTmFtZSk7XG4gICAgICAgIHJldHVybiByZXN1bHRTZXRBcnJheS5yZWR1Y2UoKHJzMSwgcnMyKSA9PiBSZXN1bHRzZXRVdGlscy5tZXJnZVJlc3VsdFNldHMocnMxLCByczIpLCB7XG4gICAgICAgICAgaXRlbXM6IHt9LFxuICAgICAgICAgIHJlbGF0aW9uczogW10sXG4gICAgICAgICAgbWVyZ2VkOiByZXN1bHRTZXRBcnJheS5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCB2KSA9PiBlcXVhbChwLCB2KSlcbiAgICApO1xuICB9XG5cbiAgc2V0RGVmYXVsdExheWVyVGl0bGUoXG4gICAgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucyxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNhcGFiaWxpdGllczpcbiAgICAgIHwge1xuICAgICAgICAgIFtwOiBzdHJpbmddOiBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZSB8IG51bGw7XG4gICAgICAgIH1cbiAgICAgIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGlmICghbGF5ZXIudGl0bGUpIHtcbiAgICAgIGlmIChbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKSkge1xuICAgICAgICBjb25zdCBnZW9MYXllciA9IGxheWVyIGFzIE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucyB8IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zO1xuICAgICAgICBjb25zdCBsYXllckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllcyA/IGNhcGFiaWxpdGllc1tnZW9MYXllci51cmxdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChsYXllckNhcGFiaWxpdGllcykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nTGF5ZXIgPSBYTUxVdGlscy5nZXRNYXRjaGluZ0xheWVyKGdlb0xheWVyLnBhcmFtTGF5ZXIsIGxheWVyQ2FwYWJpbGl0aWVzLmRvYyk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nTGF5ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nVGl0bGUgPSBYTUxVdGlscy5maW5kKG1hdGNoaW5nTGF5ZXIuY2hpbGROb2RlcywgJ1RpdGxlJyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdUaXRsZSkge1xuICAgICAgICAgICAgICBsYXllci50aXRsZSA9XG4gICAgICAgICAgICAgICAgISFtYXRjaGluZ1RpdGxlLnRleHRDb250ZW50ICYmIG1hdGNoaW5nVGl0bGUudGV4dENvbnRlbnQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgPyBtYXRjaGluZ1RpdGxlLnRleHRDb250ZW50XG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGF5ZXIudGl0bGUgPSBnZW9MYXllci5wYXJhbUxheWVyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXllci50aXRsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLiR7bGF5ZXIudHlwZX1gLCB7IC4uLmxheWVyIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpdE1hcEZvck9iamVjdHMoXG4gICAgc2VsZWN0ZWRJZHM/OiBzdHJpbmdbXSxcbiAgICBleHRlbnRzOiB7XG4gICAgICBkYXRhc291cmNlOiBzdHJpbmc7XG4gICAgICBleHRlbnQ6IENvb3JkaW5hdGVbXTtcbiAgICB9W10gPSBbXVxuICApIHtcbiAgICBsZXQgZXh0ZW50ID0gY3JlYXRlRW1wdHkoKTtcbiAgICBjb25zdCBsaXN0T2ZNYXJrZXJzID0gW10gYXMgYW55W107XG5cbiAgICAvKiBNYW5kYXRvcnkgZml0ICovXG4gICAgdGhpcy5tYXBcbiAgICAgIC5nZXRBbGxMYXllcnMoKVxuICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldFByb3BlcnRpZXMoKVsnZml0J10pXG4gICAgICAuZmlsdGVyKChsYXllcikgPT4gISFsYXllci5nZXRTb3VyY2UgJiYgISFsYXllci5nZXRTb3VyY2UoKSAmJiAhIShsYXllci5nZXRTb3VyY2UoKSBhcyBWZWN0b3JTb3VyY2UpLmdldEZlYXR1cmVzKVxuICAgICAgLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgIChsYXllci5nZXRTb3VyY2UoKSBhcyBWZWN0b3JTb3VyY2UpLmdldEZlYXR1cmVzKCkuZm9yRWFjaCgoZmVhdHVyZTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBmZWF0dXJlLmdldCgnaWQnKTtcbiAgICAgICAgICBpZiAoIXNlbGVjdGVkSWRzIHx8IHNlbGVjdGVkSWRzLmxlbmd0aCA8PSAwIHx8IChzZWxlY3RlZElkcy5sZW5ndGggPiAwICYmIHNlbGVjdGVkSWRzLmluY2x1ZGVzKGlkKSkpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZS5nZXQoJ3R5cGUnKSkge1xuICAgICAgICAgICAgICBjYXNlICdoZWF0cG9pbnQnOlxuICAgICAgICAgICAgICBjYXNlICdwb2ludCc6XG4gICAgICAgICAgICAgIGNhc2UgJ21hcmtlcic6XG4gICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKGZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnbGluZSc6XG4gICAgICAgICAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaCguLi5mZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3BvbHlnb24nOlxuICAgICAgICAgICAgICBjYXNlICdtdWx0aS1saW5lJzpcbiAgICAgICAgICAgICAgICBsaXN0T2ZNYXJrZXJzLnB1c2goLi4uZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldENvb3JkaW5hdGVzKCkuZmxhdCgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnbXVsdGktcG9seWdvbic6XG4gICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKC4uLmZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpLmZsYXQoKS5mbGF0KCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaChmZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q2VudGVyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRXh0ZW50ID0gYm91bmRpbmdFeHRlbnQoXG4gICAgICBsaXN0T2ZNYXJrZXJzLmZpbHRlcigoY29vcmQpID0+ICEhY29vcmQpLmNvbmNhdCguLi5leHRlbnRzLm1hcCgoZXh0ZW50KSA9PiBleHRlbnQuZXh0ZW50KSlcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgc2VsZWN0ZWRFeHRlbnRbMF0gIT09IEluZmluaXR5ICYmXG4gICAgICBzZWxlY3RlZEV4dGVudFsxXSAhPT0gSW5maW5pdHkgJiZcbiAgICAgIHNlbGVjdGVkRXh0ZW50WzJdICE9PSAtSW5maW5pdHkgJiZcbiAgICAgIHNlbGVjdGVkRXh0ZW50WzNdICE9PSAtSW5maW5pdHlcbiAgICApIHtcbiAgICAgIGV4dGVudCA9IHNlbGVjdGVkRXh0ZW50O1xuICAgIH1cblxuICAgIGlmIChleHRlbnRbMF0gIT09IEluZmluaXR5ICYmIGV4dGVudFsxXSAhPT0gSW5maW5pdHkgJiYgZXh0ZW50WzJdICE9PSAtSW5maW5pdHkgJiYgZXh0ZW50WzNdICE9PSAtSW5maW5pdHkpIHtcbiAgICAgIHRoaXMubWFwLmdldFZpZXcoKS5maXQoZXh0ZW50LCB7IHBhZGRpbmc6IFsyMCwgMjAsIDcwLCA3MF0sIGR1cmF0aW9uOiAyMDAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdHRyaWJ1dGVzRm9yRHJhd2luZyhjbGFzc2VzOiBDbGFzc1tdLCBjbGFzc0lkOiBzdHJpbmcsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBjbGFzc09iaiA9IGNsYXNzZXMuZmluZCgoY2wpID0+IGNsLmlkID09PSBjbGFzc0lkKSA/PyAoeyBhdHRyaWJ1dGVzOiBbXSBhcyBBdHRyaWJ1dGVbXSB9IGFzIENsYXNzKTtcbiAgICBjb25zdCBsb2NhdGlvbkF0dHJpYnV0ZSA9IHRoaXMuZ2V0TG9jYXRpb25BdHRyaWJ1dGUoY2xhc3NPYmosIGxheWVyKTtcbiAgICBjb25zdCBpbnRlbnNpdHlBdHRyaWJ1dGUgPSB0aGlzLmdldEludGVuc2l0eUF0dHJpYnV0ZShcbiAgICAgIGNsYXNzT2JqLFxuICAgICAgbGF5ZXIgYXMgTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9uc1xuICAgICk7XG4gICAgcmV0dXJuIHsgbG9jYXRpb25BdHRyaWJ1dGUsIGludGVuc2l0eUF0dHJpYnV0ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnRlbnNpdHlBdHRyaWJ1dGUoXG4gICAgY2xhc3NPYmo6IENsYXNzIHwgdW5kZWZpbmVkLFxuICAgIGxheWVyOiBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICAoY2xhc3NPYmogfHwgeyBhdHRyaWJ1dGVzOiBbXSB9KS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIudGVjaG5pY2FsTmFtZSA9PT0gbGF5ZXI/LmludGVuc2l0eUF0dHJpYnV0ZSkgPz9cbiAgICAgICh1bmRlZmluZWQgYXMgdW5rbm93biBhcyBBdHRyaWJ1dGUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9jYXRpb25BdHRyaWJ1dGUoY2xhc3NPYmo6IENsYXNzLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKTogQXR0cmlidXRlIHtcbiAgICB0eXBlIGxheWVycyA9IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRNYXJrZXJMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnM7XG4gICAgY29uc3Qgc3BlY2lmaWNMYXllciA9IGxheWVyIGFzIGxheWVycztcbiAgICByZXR1cm4gKFxuICAgICAgY2xhc3NPYmouYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLnRlY2huaWNhbE5hbWUgPT09IHNwZWNpZmljTGF5ZXI/LmF0dHJpYnV0ZSkgPz9cbiAgICAgICh1bmRlZmluZWQgYXMgdW5rbm93biBhcyBBdHRyaWJ1dGUpXG4gICAgKTtcbiAgfVxuXG4gIGNoYW5nZVN0eWxlKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5zdHlsZSA9ICRldmVudDtcbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5zdHlsZSAhPT0gdGhpcy5TVFlMRV9GUk9NX1VSTCkge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuc3R5bGVVUkw7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlU3R5bGVVUkwoJGV2ZW50OiBFdmVudCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnN0eWxlVVJMID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlRml0KCRldmVudDogYm9vbGVhbiwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGxheWVyLmZpdCA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZVNsaWRlKCRldmVudDogdW5kZWZpbmVkIHwgJ2xlZnQnIHwgJ3JpZ2h0JywgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGxheWVyLnNsaWRlID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlQXR0cmlidXRpb25zKCRldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuYXR0cmlidXRpb25zID0gJGV2ZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmF0dHJpYnV0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiAobGF5ZXIuYXR0cmlidXRpb24gPSAnJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uZm9yRWFjaCgobGF5ZXIpID0+IGRlbGV0ZSBsYXllci5hdHRyaWJ1dGlvbik7XG4gICAgfVxuICB9XG5cbiAgYWRkTGF5ZXIoZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICBpZiAoIXRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCB0aXRsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBAcHJ5LndpZGdldC5tYXAubGF5ZXJgLCB7IGluZGV4OiB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5sZW5ndGggKyAxIH0pO1xuXG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMucHVzaCh7XG4gICAgICBhdHRyaWJ1dGU6ICcnLFxuICAgICAgZ3JvdXA6IGdyb3VwLm5hbWUsXG4gICAgICB0aXRsZSxcbiAgICAgIHR5cGU6ICdtYXJrZXInXG4gICAgfSk7XG4gICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVt0aXRsZV0gPSBmYWxzZTtcblxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZUxheWVyR3JvdXAoeyBuYW1lOiBncm91cC5uYW1lLCB2aXNpYmxlTGF5ZXJzOiBbLi4uZ3JvdXAudmlzaWJsZUxheWVycywgdGl0bGVdIH0pXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyT3JkZXIoKTtcbiAgfVxuXG4gIGNoYW5nZUxheWVyVHlwZSgkZXZlbnQ6IGFueSwgaTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmxheWVycykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA/PyBbXTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSA9ICRldmVudDtcbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSA9PT0gJ3dtcycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXSBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9ucztcbiAgICAgIG9wdGlvbnMucGFyYW1MYXllciA9IG9wdGlvbnMucGFyYW1MYXllciA/PyAnJztcbiAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgPz8gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlID09PSAnd210cycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXSBhcyBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnM7XG4gICAgICBvcHRpb25zLnBhcmFtTGF5ZXIgPSBvcHRpb25zLnBhcmFtTGF5ZXIgPz8gJyc7XG4gICAgICBvcHRpb25zLnN0eWxlID0gb3B0aW9ucy5zdHlsZSA/PyAnJztcbiAgICAgIG9wdGlvbnMubWF0cml4U2V0ID0gb3B0aW9ucy5tYXRyaXhTZXQgPz8gJyc7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsID8/ICcnO1xuICAgIH1cbiAgICBpZiAoWydmZWF0dXJlbGF5ZXInLCAndmVjdG9ydGlsZScsICdyYXN0ZXJ0aWxlJ10uaW5jbHVkZXModGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSkpIHtcbiAgICAgIGxldCBvcHRpb25zOiBNYXBGZWF0dXJlTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldIGFzIE1hcEZlYXR1cmVMYXllck9wdGlvbnM7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsID8/ICcnO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVRpdGxlKCRldmVudDogYW55LCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cDogTGF5ZXJHcm91cCkge1xuICAgIGNvbnN0IHZpc2libGVMYXllcnMgPSBncm91cC52aXNpYmxlTGF5ZXJzLm1hcCgobGF5ZXJUaXRsZSkgPT4gKGxheWVyVGl0bGUgPT09IGxheWVyLnRpdGxlID8gJGV2ZW50IDogbGF5ZXJUaXRsZSkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVMYXllckdyb3VwKHsgbmFtZTogZ3JvdXAubmFtZSwgdmlzaWJsZUxheWVycyB9KSk7XG4gICAgZGVsZXRlIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXTtcbiAgICBsYXllci50aXRsZSA9ICRldmVudDtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlWyRldmVudF0gPSB0cnVlO1xuICB9XG5cbiAgZW1pdE1hbmlmZXN0KCkge1xuICAgIHRoaXMucmVtb3ZlRW1wdHlMYXllckdyb3VwcygpO1xuICAgIHRoaXMubWFuaWZlc3RNb2RpZmllZC5lbWl0KHtcbiAgICAgIHdpZGdldEluZGV4OiB0aGlzLndpZGdldEluZGV4LFxuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgb3B0aW9uczogeyAuLi50aGlzLm9wdGlvbnNDb3B5LCBsYXllcnM6ICh0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA/PyBbXSkuZmlsdGVyKChsYXllcikgPT4gISFsYXllci50eXBlKSB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VMb2NhdGlvbkF0dHJpYnV0ZXMoJGV2ZW50OiBhbnksIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuYXR0cmlidXRlID0gJGV2ZW50O1xuICB9XG5cbiAgbGF5ZXJIYXNJbnRlbnNpdHkobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucyk6IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnMge1xuICAgIHJldHVybiA8TWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucz5sYXllcjtcbiAgfVxuXG4gIGNoYW5nZUludGVuc2l0eUF0dHJpYnV0ZXMoJGV2ZW50OiBhbnksIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBsYXllcl8gPSA8TWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucz5sYXllcjtcbiAgICBsYXllcl8uaW50ZW5zaXR5QXR0cmlidXRlID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlQ2xhc3NlcygkZXZlbnQ6IHN0cmluZ1tdLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3Qgc3BlY2lmaWNMYXllciA9IGxheWVyIGFzXG4gICAgICB8IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucztcbiAgICBzcGVjaWZpY0xheWVyLmNsYXNzZXMgPSAkZXZlbnQ7XG4gIH1cblxuICBkZWxldGVMYXllcihpOiBudW1iZXIsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weT8ubGF5ZXJzPy5zcGxpY2UoaSwgMSk7XG4gICAgdGhpcy51cGRhdGVMYXllckdyb3VwKFxuICAgICAgZ3JvdXAubmFtZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGdyb3VwLnZpc2libGVMYXllcnMuZmlsdGVyKChsKSA9PiBsICE9PSBsYXllci50aXRsZSlcbiAgICApO1xuICAgIHRoaXMucmVtb3ZlRW1wdHlMYXllckdyb3VwcygpO1xuICAgIGlmIChsYXllci50eXBlID09PSAnYXV0bycpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuaWdub3JlQXV0b0xheWVyID0gWy4uLih0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllciA/PyBbXSksIGxheWVyLmtleSArICctJyArIGxheWVyLnN1YlR5cGVdO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVVybChcbiAgICAkZXZlbnQ6IEV2ZW50LFxuICAgIGxheWVyOlxuICAgICAgfCBNYXBXTVNMYXllckxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBGZWF0dXJlTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFZlY3RvclRpbGVMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwUmFzdGVyVGlsZUxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zXG4gICkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci51cmwgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VBdHRyaWJ1dGlvbigkZXZlbnQ6IEV2ZW50LCBsYXllcjogQmFzZVdpZGdldE1hcExheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5hdHRyaWJ1dGlvbiA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZVBhcmFtTGF5ZXIoJGV2ZW50OiBFdmVudCwgbGF5ZXI6IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLnBhcmFtTGF5ZXIgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VQYXJhbVRpbGVkKCRldmVudDogYm9vbGVhbiwgbGF5ZXI6IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKSB7XG4gICAgbGF5ZXIucGFyYW1UaWxlZCA9ICRldmVudDtcbiAgICB0aGlzLnRvb2x0aXBNYW5hZ2VyLmNsZWFyVG9vbHRpcCgpO1xuICB9XG5cbiAgY2hhbmdlTWF0cml4U2V0KCRldmVudDogRXZlbnQsIGxheWVyOiBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIubWF0cml4U2V0ID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlUGFyYW1TdHlsZSgkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLnN0eWxlID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgZXhwb3J0KCkge1xuICAgIFdpZGdldE1hcFV0aWxzLmV4cG9ydE1hcEFzSW1hZ2UodGhpcy5tYXAsICdtYXAucG5nJyk7XG4gIH1cblxuICBvdmVycmlkZSB0b0ltYWdlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFdpZGdldE1hcFV0aWxzLmdldE1hcEFzUG5nKHRoaXMubWFwKTtcbiAgfVxuXG4gIGNoYW5nZUNsdXN0ZXJlZChsYXllcjogTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zLCAkZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICBsYXllci5jbHVzdGVyZWQgPSAkZXZlbnQ7XG4gICAgaWYgKGxheWVyLmNsdXN0ZXJlZCkge1xuICAgICAgbGF5ZXIuY2x1c3RlckRpc3RhbmNlID0gMTA7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlQ2x1c3RlckRpc3RhbmNlKGxheWVyOiBNYXBXaWRnZXRNYXJrZXJMYXllck9wdGlvbnMsICRldmVudDogRXZlbnQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuY2x1c3RlckRpc3RhbmNlID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlT3BhY2l0eShsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCAkZXZlbnQ6IHN0cmluZykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5vcGFjaXR5ID0gcGFyc2VJbnQoJGV2ZW50LCAxMCk7XG4gIH1cblxuICBnZXRXTVNMYXllcnMoKTogTGF5ZXI8YW55PltdIHtcbiAgICByZXR1cm4gIXRoaXMubWFwXG4gICAgICA/IFtdXG4gICAgICA6IHRoaXMubWFwXG4gICAgICAgICAgLmdldEFsbExheWVycygpXG4gICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgVGlsZVdNUyB8fCBsYXllci5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEltYWdlV01TKVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIucmVuZGVyZWQgPT09IHRydWUpO1xuICB9XG5cbiAgaXNMYXllclJlbmRlcmVkKGxheWVyOiBhbnkpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldFdNU0xheWVycygpLmZpbmQoKHdtc0xheWVyKSA9PiB3bXNMYXllci5nZXQoJ3RpdGxlJykgPT09IGxheWVyLnRpdGxlKTtcbiAgfVxuXG4gIGNoYW5nZVdtc0NsYXNzKCRldmVudDogYW55LCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5vQ2xhc3MgPSAkZXZlbnQ7XG4gIH1cblxuICB0b2dnbGVMZWdlbmQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubGVnZW5kVGFiQ2xvc2VkW2luZGV4XSA9ICF0aGlzLmxlZ2VuZFRhYkNsb3NlZFtpbmRleF07XG4gIH1cblxuICB0b2dnbGVMZWdlbmRXaW5kb3coKSB7XG4gICAgdGhpcy5sZWdlbmRUYWJPcGVuID0gIXRoaXMubGVnZW5kVGFiT3BlbjtcbiAgICB0aGlzLmxheWVyc1RhYk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZUxheWVyc1dpbmRvdygpIHtcbiAgICB0aGlzLmxheWVyc1RhYk9wZW4gPSAhdGhpcy5sYXllcnNUYWJPcGVuO1xuICAgIHRoaXMubGVnZW5kVGFiT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG1hcExheWVycygpIHtcbiAgICByZXR1cm4gKHRoaXMubWFwID8/IHsgZ2V0TGF5ZXJzOiAoKSA9PiAoeyBnZXRBcnJheTogKCkgPT4gW10gfSkgfSlcbiAgICAgIC5nZXRMYXllcnMoKVxuICAgICAgLmdldEFycmF5KClcbiAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXQoJ3RpdGxlJykgIT09ICdiYWNrZ3JvdW5kJyk7XG4gIH1cblxuICBnZXQgcmlnaHRTbGlkZUxheWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXBMYXllcnMuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0KCdzbGlkZScpID09PSAncmlnaHQnKTtcbiAgfVxuXG4gIGdldCBsZWZ0U2xpZGVMYXllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldCgnc2xpZGUnKSA9PT0gJ2xlZnQnKTtcbiAgfVxuXG4gIGhpZGVBbGxMYXllcnNJbkdyb3VwKGdyb3VwOiBMYXllckdyb3VwKSB7XG5cbiAgfVxuXG4gIGNoYW5nZVZpc2liaWxpdHkoZ3JvdXA6IExheWVyR3JvdXAsIF9sYXllcj86IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLm1hcExheWVycy5maW5kKChsYXllcikgPT4gbGF5ZXIuZ2V0UHJvcGVydGllcygpWyd0aXRsZSddID09PSBfbGF5ZXI/LnRpdGxlKTtcbiAgICBpZiAoZ3JvdXAuc2luZ2xlTGF5ZXIpIHtcbiAgICAgIGNvbnN0IGdyb3VwTGF5ZXJzID1cbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobCkgPT4gbC5ncm91cCA9PT0gZ3JvdXAubmFtZSkubWFwKChsYXllcikgPT4gbGF5ZXIudGl0bGUpID8/IFtdO1xuXG4gICAgICB0aGlzLm1hcExheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICBpZiAoZ3JvdXBMYXllcnMuaW5jbHVkZXMobGF5ZXIuZ2V0UHJvcGVydGllcygpWyd0aXRsZSddKSkge1xuICAgICAgICAgIGxheWVyLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChfbGF5ZXIpIHtcbiAgICAgICAgb2xMYXllcj8uc2V0VmlzaWJsZSh0cnVlKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZUxheWVyR3JvdXAoeyBuYW1lOiBncm91cC5uYW1lLCB2aXNpYmxlTGF5ZXJzOiBbX2xheWVyLnRpdGxlIV19KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7IG5hbWU6IGdyb3VwLm5hbWUsIHZpc2libGVMYXllcnM6IFtdIH0pKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvbExheWVyPy5zZXRWaXNpYmxlKCFvbExheWVyPy5nZXRWaXNpYmxlKCkpO1xuXG4gICAgICBjb25zdCB2aXNpYmxlTGF5ZXJzID0gZ3JvdXAudmlzaWJsZUxheWVycy5pbmNsdWRlcyhfbGF5ZXI/LnRpdGxlISlcbiAgICAgICAgPyBncm91cC52aXNpYmxlTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyICE9PSBfbGF5ZXI/LnRpdGxlKVxuICAgICAgICA6IFsuLi5ncm91cC52aXNpYmxlTGF5ZXJzLCBfbGF5ZXI/LnRpdGxlIV07XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7IG5hbWU6IGdyb3VwLm5hbWUsIHZpc2libGVMYXllcnMgfSkpO1xuICAgIH1cbiAgICB0aGlzLm1hcC51cGRhdGVTaXplKCk7XG4gIH1cblxuICBpc0xheWVyVmlzaWJsZShsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cD86IExheWVyR3JvdXApIHtcbiAgICBpZiAoZ3JvdXA/LnZpc2libGVMYXllcnMpIHtcbiAgICAgIHJldHVybiBncm91cC52aXNpYmxlTGF5ZXJzLmluY2x1ZGVzKGxheWVyLnRpdGxlID8/ICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMubGF5ZXJHcm91cHMuc29tZSgoZ3JvdXApID0+IGdyb3VwLnZpc2libGVMYXllcnMuaW5jbHVkZXMobGF5ZXIudGl0bGUgPz8gJycpKVxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUF1dG9MYXllcigkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuYXV0b21hdGljTGF5ZXJzID0gJGV2ZW50O1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5hdXRvbWF0aWNMYXllcnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllcjtcbiAgICB9XG4gIH1cblxuICBnZXQgbGF5ZXJWaXNpYmxlSWR4KCkge1xuICAgIHJldHVybiB0aGlzLm1hcExheWVycy5tYXAoKGxheWVyLCBpZHgpID0+IChsYXllci5nZXRWaXNpYmxlKCkgPyBpZHggOiAwKSkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgfHwgLTE7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuXG4gICAgLy8gVHJ5aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuICAgIHRoaXMuY2xlYXJMYXllcnModGhpcy5tYXAuZ2V0TGF5ZXJzKCkuZ2V0QXJyYXkoKSk7XG4gICAgdGhpcy5jbGVhckxheWVycyh0aGlzLnByZXZpb3VzTGF5ZXJzKTtcbiAgICB0aGlzLm1hcC5nZXRSZW5kZXJlcigpIS5kaXNwb3NlKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGRlbGV0ZSB0aGlzLm1hcDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5tYXAgPSBudWxsO1xuICAgIHRoaXMudG9vbHRpcE1hbmFnZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgZ2V0U3R5bGUoX2xheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBsYXllciA9IF9sYXllciBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucztcbiAgICBpZiAobGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnM/LlNUWUxFUykge1xuICAgICAgcmV0dXJuIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzPy5TVFlMRVM7XG4gICAgfVxuICAgIC8qIE5vdCBtYW5pZmVzdC1kZWZpbmVkIHN0eWxlOiB1c2UgZmlyc3QgaW4gbGluZSBiZWNhdXNlIGl0J3MgdGhlIGRlZmF1bHQgb25lIHNlbnQgYnkgZ2Vvc2VydmVyICovXG4gICAgY29uc3QgcG9zc2libGVTdHlsZXNGb3JVcmwgPSB0aGlzLnBvc3NpYmxlU3R5bGVzW2xheWVyLnVybF0gPz8geyBsYXllcnM6IHt9IH07XG4gICAgbGV0IHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyID0gcG9zc2libGVTdHlsZXNGb3JVcmwubGF5ZXJzIVtsYXllci5wYXJhbUxheWVyXTtcbiAgICBpZiAoIXBvc3NpYmxlc1N0eWxlc0ZvckxheWVyKSB7XG4gICAgICBwb3NzaWJsZXNTdHlsZXNGb3JMYXllciA9IHBvc3NpYmxlU3R5bGVzRm9yVXJsLmxheWVycyFbKGxheWVyLnBhcmFtTGF5ZXIgPz8gJzonKS5zcGxpdCgnOicpWzFdXSA/PyB7IHN0eWxlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyLnN0eWxlc1swXT8uaWQ7XG4gIH1cblxuICBjaGFuZ2VMYXllclN0eWxlKCRldmVudDogYW55LCBfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyID0gX2xheWVyIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zO1xuICAgIGlmICghbGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnMpIHtcbiAgICAgIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzID0ge307XG4gICAgfVxuICAgIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzLlNUWUxFUyA9ICRldmVudDtcbiAgfVxuXG4gIGdldEFzV21zVHlwZShfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIHJldHVybiBfbGF5ZXIgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnM7XG4gIH1cblxuICBsYXllclN0eWxlT3B0aW9ucyhfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyID0gX2xheWVyIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zO1xuICAgIGNvbnN0IHBvc3NpYmxlU3R5bGVzRm9yVXJsID0gdGhpcy5wb3NzaWJsZVN0eWxlc1tsYXllci51cmxdID8/IHsgbGF5ZXJzOiB7fSB9O1xuICAgIGxldCBwb3NzaWJsZXNTdHlsZXNGb3JMYXllciA9IHBvc3NpYmxlU3R5bGVzRm9yVXJsLmxheWVycyFbbGF5ZXIucGFyYW1MYXllcl07XG4gICAgaWYgKCFwb3NzaWJsZXNTdHlsZXNGb3JMYXllcikge1xuICAgICAgcG9zc2libGVzU3R5bGVzRm9yTGF5ZXIgPSBwb3NzaWJsZVN0eWxlc0ZvclVybC5sYXllcnMhWyhsYXllci5wYXJhbUxheWVyID8/ICc6Jykuc3BsaXQoJzonKVsxXV0gPz8geyBzdHlsZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiBwb3NzaWJsZXNTdHlsZXNGb3JMYXllci5zdHlsZXM7XG4gIH1cblxuICB0cmlnZ2VyTGF5ZXJSZW5kZXIoKSB7XG4gICAgdGhpcy5tYXAucmVuZGVyKCk7XG4gIH1cblxuICBjaGFuZ2VTbGlkZU9wdGlvbigkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuc2xpZGUgPSAkZXZlbnQ7XG4gICAgaWYgKCRldmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLnNsaWRlID0gJ2FsbCcpKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVNZW51KCkge1xuICAgIHRoaXMuYWN0aW9uTWVudU9wZW4kLm5leHQoIXRoaXMuYWN0aW9uTWVudU9wZW4kLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPbFpvb21FbGVtZW50KCkge1xuICAgIHRoaXMub2xab29tRWxlbWVudCQubmV4dChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2wtem9vbScpKTtcbiAgICBpZiAoIXRoaXMub2xab29tRWxlbWVudCQuZ2V0VmFsdWUoKSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmdldE9sWm9vbUVsZW1lbnQoKSwgNTApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB6b29tSW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2wtem9vbS1pbicpO1xuICAgICAgaWYgKHpvb21Jbikge1xuICAgICAgICB6b29tSW4uc2V0QXR0cmlidXRlKCdkYXRhLXRvb2x0aXAnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnpvb21JbicpKTtcbiAgICAgICAgem9vbUluLnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLXBvc2l0aW9uJywgJ2xlZnQnKTtcbiAgICAgICAgem9vbUluLmNsYXNzTGlzdC5hZGQoJ2EtdG9vbHRpcCcsICctLW5vcG9zJyk7XG4gICAgICAgIHpvb21Jbi5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB6b29tT3V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm9sLXpvb20tb3V0Jyk7XG4gICAgICBpZiAoem9vbU91dCkge1xuICAgICAgICB6b29tT3V0LnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwJywgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC56b29tT3V0JykpO1xuICAgICAgICB6b29tT3V0LnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLXBvc2l0aW9uJywgJ2xlZnQnKTtcbiAgICAgICAgem9vbU91dC5jbGFzc0xpc3QuYWRkKCdhLXRvb2x0aXAnLCAnLS1ub3BvcycpO1xuICAgICAgICB6b29tT3V0LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTZWxlY3Rpb24oYWN0aW9uOiAnY2xpY2snIHwgJ2xhc3NvJyB8ICdyZWN0YW5nbGUnIHwgJ3pvb20nIHwgJ21vdmUnIHwgJ2V4cG9ydCcgfCAndXBsb2FkJykge1xuICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkludGVyYWN0aW9uLmNoYW5nZVNlbGVjdGlvbihhY3Rpb24pO1xuICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckxheWVycyhsYXllcnM6IEJhc2VMYXllcltdKSB7XG4gICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllciAmJiAobGF5ZXIgYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPikuZ2V0U291cmNlKCkpIHtcbiAgICAgICAgKGxheWVyIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZT4pLmdldFNvdXJjZSgpIS5jbGVhcigpO1xuICAgICAgICBsYXllci5zZXRTb3VyY2UodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIFRpbGVMYXllciAmJiAobGF5ZXIgYXMgVGlsZUxheWVyPGFueT4pLmdldFNvdXJjZSgpKSB7XG4gICAgICAgIChsYXllciBhcyBUaWxlTGF5ZXI8YW55PikuZ2V0U291cmNlKCkuY2xlYXIoKTtcbiAgICAgICAgbGF5ZXIuc2V0U291cmNlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICBsYXllci5kaXNwb3NlKCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRMYXllckdyb3VwKCkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLmFkZExheWVyR3JvdXAoe1xuICAgICAgICBuYW1lOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5ncm91cCcpICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgICh0aGlzLmxheWVyR3JvdXBzLmxlbmd0aCArIDEpLnRvU3RyaW5nKClcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5sYXllckdyb3Vwc1t0aGlzLmxheWVyR3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgIHRoaXMuYWRkTGF5ZXIoZ3JvdXApO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJHcm91cChuYW1lOiBzdHJpbmcsIG5ld05hbWU/OiBzdHJpbmcsIHNpbmdsZUxheWVyPzogYm9vbGVhbiwgdmlzaWJsZUxheWVycz86IHN0cmluZ1tdKSB7XG4gICAgaWYgKG5ld05hbWUgPT09IHVuZGVmaW5lZCAmJiBzaW5nbGVMYXllciAhPT0gdW5kZWZpbmVkICYmIHZpc2libGVMYXllcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVMYXllckdyb3VwKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgc2luZ2xlTGF5ZXIsXG4gICAgICAgICAgdmlzaWJsZUxheWVyczogc2luZ2xlTGF5ZXIgPyBbdmlzaWJsZUxheWVyc1swXV0gOiB2aXNpYmxlTGF5ZXJzXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobmFtZSAhPT0gbmV3TmFtZSkge1xuICAgICAgaWYgKG5hbWUgPT09IERFRkFVTFRfTEFZRVJfR1JPVVApIHtcbiAgICAgICAgY29uc3QgbGF5ZXJzVG9UcmFuc2ZlciA9XG4gICAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBERUZBVUxUX0xBWUVSX0dST1VQKS5tYXAoKGwpID0+IGwudGl0bGUpID8/IFtdO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIERhc2hib2FyZEFjdGlvbnMuYWRkTGF5ZXJHcm91cCh7XG4gICAgICAgICAgICBuYW1lOiBuZXdOYW1lLFxuICAgICAgICAgICAgc2luZ2xlTGF5ZXIsXG4gICAgICAgICAgICB2aXNpYmxlTGF5ZXJzOiB2aXNpYmxlTGF5ZXJzIS5maWx0ZXIoKGwpID0+IGxheWVyc1RvVHJhbnNmZXIuaW5jbHVkZXMobCkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZUxheWVyR3JvdXAoe1xuICAgICAgICAgICAgbmFtZTogREVGQVVMVF9MQVlFUl9HUk9VUCxcbiAgICAgICAgICAgIG5ld05hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNpbmdsZUxheWVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB2aXNpYmxlTGF5ZXJzOiB2aXNpYmxlTGF5ZXJzIS5maWx0ZXIoKGwpID0+ICFsYXllcnNUb1RyYW5zZmVyLmluY2x1ZGVzKGwpKVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7IG5hbWUsIG5ld05hbWUsIHNpbmdsZUxheWVyLCB2aXNpYmxlTGF5ZXJzIH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIHVwZGF0ZSBncm91cHMgb24gbGF5ZXJzXG4gICAgICBpZiAobmV3TmFtZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnMubWFwKChsYXllcikgPT5cbiAgICAgICAgICBsYXllci5ncm91cCA9PT0gbmFtZVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4ubGF5ZXIsXG4gICAgICAgICAgICAgICAgZ3JvdXA6IG5ld05hbWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBsYXllclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUxheWVyR3JvdXBUaXRsZSgkZXZlbnQ6IEV2ZW50LCBuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVwZGF0ZUxheWVyR3JvdXAobmFtZSwgKCRldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZSk7XG4gIH1cblxuICBkZWxldGVMYXllckdyb3VwKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5jb25maXJtTGF5ZXJHcm91cERlbGV0aW9uKHsgbmFtZSB9KSk7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ3JvdXAgIT09IG5hbWUpO1xuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8TWFwV2lkZ2V0TGF5ZXJPcHRpb25zW10+LCBncm91cDogTGF5ZXJHcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVkTGF5ZXIgPSBldmVudC5pdGVtLmRhdGEgYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zO1xuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lci5pZCAhPT0gZXZlbnQuY29udGFpbmVyLmlkKSB7XG4gICAgICB0aGlzLm1vdmVMYXllckJldHdlZW5Hcm91cHMoXG4gICAgICAgIG1vdmVkTGF5ZXIsXG4gICAgICAgIGV2ZW50LmNvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxheWVyLWdyb3VwJykgPz8gREVGQVVMVF9MQVlFUl9HUk9VUFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5tb3ZlTGF5ZXJJbk9wdGlvbnMoZXZlbnQuY3VycmVudEluZGV4LCBldmVudC5pdGVtLmRhdGEgYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cCk7XG4gIH1cblxuICBtb3ZlTGF5ZXJCZXR3ZWVuR3JvdXBzKG1vdmVkTGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgbmV3R3JvdXA6IHN0cmluZykge1xuICAgIC8vIHJlbW92ZSBpdCBmcm9tIG9sZCBncm91cFxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZUxheWVyR3JvdXAoe1xuICAgICAgICBuYW1lOiBtb3ZlZExheWVyLmdyb3VwISxcbiAgICAgICAgdmlzaWJsZUxheWVyczogdGhpcy5sYXllckdyb3Vwc1xuICAgICAgICAgID8uZmluZCgoZ3JvdXApID0+IGdyb3VwLm5hbWUgPT09IG1vdmVkTGF5ZXIuZ3JvdXAhKVxuICAgICAgICAgID8udmlzaWJsZUxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllciAhPT0gbW92ZWRMYXllci50aXRsZSlcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIGFkZCBpdCB0byBuZXcgZ3JvdXBcbiAgICBtb3ZlZExheWVyLmdyb3VwID0gbmV3R3JvdXA7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlTGF5ZXJHcm91cCh7XG4gICAgICAgIG5hbWU6IG5ld0dyb3VwID8/IERFRkFVTFRfTEFZRVJfR1JPVVAsXG4gICAgICAgIHZpc2libGVMYXllcnM6IG1vdmVkTGF5ZXIudGl0bGUhXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5yZW1vdmVFbXB0eUxheWVyR3JvdXBzKCk7XG4gIH1cblxuICBtb3ZlTGF5ZXJJbk9wdGlvbnModGFyZ2V0SWR4SW5Hcm91cDogbnVtYmVyLCBtb3ZlZExheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICBjb25zdCBncm91cExheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgICAgIC8vIGluZGV4ZXMgaW4gb3B0aW9uc0NvcHlcbiAgICAgIGNvbnN0IGZyb21JbmRleCA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLmZpbmRJbmRleCgobGF5ZXIpID0+IGxheWVyLnRpdGxlID09PSBtb3ZlZExheWVyLnRpdGxlKTtcbiAgICAgIGNvbnN0IHRvSW5kZXggPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5maW5kSW5kZXgoKGxheWVyKSA9PiBsYXllci50aXRsZSA9PT0gZ3JvdXBMYXllcnNbdGFyZ2V0SWR4SW5Hcm91cF0udGl0bGUpO1xuXG4gICAgICBsZXQgbmV3T3JkZXIgPSB0b0luZGV4O1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMuc3BsaWNlKGZyb21JbmRleCwgMSk7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5zcGxpY2UodG9JbmRleCwgMCwgeyAuLi5tb3ZlZExheWVyLCBvcmRlcjogbmV3T3JkZXIgfSk7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyT3JkZXIoKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVFeHBhbmRBbGwoZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdID0gIXRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV07XG4gICAgY29uc3QgbGF5ZXJzVG9FeHBhbmQgPVxuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKS5tYXAoKGxheWVyKSA9PiBsYXllci50aXRsZSkgPz8gW107XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlKS5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgaWYgKGxheWVyc1RvRXhwYW5kLmluY2x1ZGVzKGxheWVyKSlcbiAgICAgICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllcl0gPSB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlTGF5ZXJFeHBhbmQobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0gPSAhdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdO1xuICAgIGlmICh0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0pIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV0gPSB0cnVlO1xuICAgIGlmIChncm91cC52aXNpYmxlTGF5ZXJzLmV2ZXJ5KChsYXllclRpdGxlKSA9PiAhdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllclRpdGxlXSkpIHtcbiAgICAgIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVMYXllck9yZGVyKCkge1xuICAgIGxldCBvcmRlciA9IDE7XG4gICAgdGhpcy5sYXllckdyb3Vwcz8uZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwTGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgICAgIGlmIChncm91cExheWVycykge1xuICAgICAgICBncm91cExheWVycy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLm9yZGVyID0gb3JkZXIrKykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaXNHcm91cFVzZWRCeVdpZGdldExheWVycyhncm91cDogTGF5ZXJHcm91cCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uc29tZSgobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgfVxuXG4gIHJlbW92ZUVtcHR5TGF5ZXJHcm91cHMoKSB7XG4gICAgdGhpcy5sYXllckdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5vcHRpb25zQ29weS5sYXllcnM/Lm1hcCgobGF5ZXIpID0+IGxheWVyLmdyb3VwKS5pbmNsdWRlcyhncm91cC5uYW1lKSAmJlxuICAgICAgICBncm91cC5uYW1lICE9PSBERUZBVUxUX0xBWUVSX0dST1VQXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBEYXNoYm9hcmRBY3Rpb25zLmRlbGV0ZUxheWVyR3JvdXAoe1xuICAgICAgICAgICAgbmFtZTogZ3JvdXAubmFtZVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgREVGQVVMVF9MQVlFUl9HUk9VUCA9IERFRkFVTFRfTEFZRVJfR1JPVVA7XG59XG4iLCI8cHJ5LXdpZGdldC1tYXAtY3NzPjwvcHJ5LXdpZGdldC1tYXAtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1tYXBcIj5cbiAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgW2RhdGFzb3VyY2VJZHNdPVwiKGRhdGFzb3VyY2VJZHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAqbmdJZj1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgW21hbmlmZXN0XT1cIm1hbmlmZXN0XCJcbiAgICAobWFuaWZlc3RNb2RpZmllZCk9XCJtYW5pZmVzdE1vZGlmaWVkLmVtaXQoJGV2ZW50KVwiXG4gICAgW2hlYWRlck9wdGlvbnNdPVwiKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpID8/IHt9XCJcbiAgICAjaGVhZGVyXG4gID5cbiAgICA8cHJ5LXNldHRpbmdzXG4gICAgICAoc2F2ZVRyaWdnZXJlZCk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICBbaGVhZGVyUHJlc2VudF09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICBbb3BlbiRdPVwib3BlbiRcIlxuICAgICAgY2xhc3M9XCJvLXNldHRpbmdzXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfc3R5bGVcIj57eyAnQHByeS53aWRnZXQubWFwLnN0eWxlJyB8IGkxOG4gfX0gOjwvbGFiZWw+XG4gICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU3R5bGUoJGV2ZW50KVwiXG4gICAgICAgICAgW2l0ZW1zXT1cInN0eWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc3R5bGVcIlxuICAgICAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICBiaW5kVmFsdWU9XCJpZGVudGlmaWVyXCJcbiAgICAgICAgICBpZD1cIm1hcF9zdHlsZVwiXG4gICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwib3B0aW9uc0NvcHkuc3R5bGUgPT09IFNUWUxFX0ZST01fVVJMXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJzdHlsZV9VUkxcIj57eyAnQHByeS53aWRnZXQubWFwLnN0eWxlVXJsJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBpZD1cInN0eWxlX1VSTFwiXG4gICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlU3R5bGVVUkwoJGV2ZW50KVwiXG4gICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbnNDb3B5LnN0eWxlVVJMID8/ICcnXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUF1dG9MYXllcigkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuYXV0b21hdGljTGF5ZXJzID8/IGZhbHNlXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuYXV0b0xheWVyJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUF0dHJpYnV0aW9ucygkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuYXR0cmlidXRpb25zID8/IGZhbHNlXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuYXR0cmlidXRpb25zJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVNsaWRlT3B0aW9uKCRldmVudClcIiBbbmdNb2RlbF09XCJoYXNTbGlkZUxheWVyJCB8IGFzeW5jXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGUuZ2xvYmFsJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiby1sYXllci1zZXR0aW5nc1wiIGNka0Ryb3BMaXN0R3JvdXAgY2RrRHJhZ0JvdW5kYXJ5PlxuICAgICAgICA8aDQgY2xhc3M9XCJhLWxhYmVsXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnRpdGxlJyB8IGkxOG4gfX08L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidS1kaXNwbGF5LWZsZXggLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZExheWVyR3JvdXAoKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5hZGRMYXllckdyb3VwJyB8IGkxOG4gfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGxheWVyR3JvdXBzJCB8IGFzeW5jOyBsZXQgZ3JvdXBJZHggPSBpbmRleFwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0dyb3VwVXNlZEJ5V2lkZ2V0TGF5ZXJzKGdyb3VwKVwiIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGQgby1sYXllci1zZXR0aW5nc19fZ3JvdXAtdGl0bGVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllckdyb3VwVGl0bGUte3sgZ3JvdXBJZHggfX1cIj5cbiAgICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MubGF5ZXJHcm91cE5hbWUnIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwiLW9ibGlnYXRvcnktcmVkXCI+Kjwvc3BhblxuICAgICAgICAgICAgICAgID57eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3Mub3B0aW9uYWxDb2xvbicgfCBpMThuIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleFwiPlxuICAgICAgICAgICAgICAgIDxwcnktZWRpdC1pbnB1dFxuICAgICAgICAgICAgICAgICAgZWRpdEJ1dHRvblRvb2x0aXA9XCJAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5lZGl0R3JvdXBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZWQpPVwidXBkYXRlTGF5ZXJHcm91cChncm91cC5uYW1lLCAkZXZlbnQsIGdyb3VwLnNpbmdsZUxheWVyLCBncm91cC52aXNpYmxlTGF5ZXJzKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC5uYW1lID09PSBERUZBVUxUX0xBWUVSX0dST1VQID8gKCdAcHJ5LndpZGdldC5tYXAubm9Hcm91cCcgfCBpMThuKSA6IGdyb3VwLm5hbWVcIlxuICAgICAgICAgICAgICAgID48L3ByeS1lZGl0LWlucHV0PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXAubmFtZSAhPT0gREVGQVVMVF9MQVlFUl9HUk9VUFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwIG8tbGF5ZXItc2V0dGluZ3NfX2RlbGV0ZS1ncm91cFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLmRlbGV0ZUdyb3VwJyB8IGkxOG5cIlxuICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlTGF5ZXJHcm91cChncm91cC5uYW1lKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTZcIiBbd2lkdGhdPVwiMTZcIiBpY29uU3ZnPVwiYmluX25vcm1hbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tcmFkaW8tZ3JvdXBfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICBpZD1cIm11bHRpc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyb3VwLnNpbmdsZUxheWVyXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxheWVyR3JvdXAoZ3JvdXAubmFtZSwgdW5kZWZpbmVkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbbmFtZV09XCJncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtdWx0aXNlbGVjdGlvbi17eyBncm91cElkeCB9fVwiPnt7XG4gICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MubXVsdGlwbGVMYXllcicgfCBpMThuXG4gICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1yYWRpby1ncm91cF9faXRlbVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwibW9ub3NlbGVjdGlvbi17eyBncm91cElkeCB9fVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC5zaW5nbGVMYXllclwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVMYXllckdyb3VwKGdyb3VwLm5hbWUsIHVuZGVmaW5lZCwgJGV2ZW50LCBncm91cC52aXNpYmxlTGF5ZXJzKVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbbmFtZV09XCJncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtb25vc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5zaW5nbGVMYXllcicgfCBpMThuXG4gICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleCAtYWxpZ24tY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkTGF5ZXIoZ3JvdXApXCIgY2xhc3M9XCJhLWJ0biAtbGluay1saWtlXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgKyB7eyAnQHByeS53aWRnZXQubWFwLmFkZExheWVyJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZUV4cGFuZEFsbChncm91cClcIiBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdXG4gICAgICAgICAgICAgICAgICAgID8gKCdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5mb2xkQWxsJyB8IGkxOG4pXG4gICAgICAgICAgICAgICAgICAgIDogKCdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy51bmZvbGRBbGwnIHwgaTE4bilcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICBjbGFzcz1cIm8tbGF5ZXItc2V0dGluZ3NfX2xheWVyc1wiXG4gICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQsIGdyb3VwKVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtbGF5ZXItZ3JvdXBdPVwiZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxheWVyIG9mIG9wdGlvbnNDb3B5Py5sYXllcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImxheWVyLmdyb3VwID09PSBncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwibGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCJsYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1wbGFjZWhvbGRlclwiICpjZGtEcmFnUGxhY2Vob2xkZXI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleCAtYWxpZ24tY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuLWRpc2FibGVkXT1cImxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uU3ZnPVwiZHJhZ19pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4tLWljb24tb25seSB1bmZvbGQtbGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxheWVyRXhwYW5kKGxheWVyLCBncm91cClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCI5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25TdmddPVwibGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXSA/ICdjaGV2cm9uX3RvcCcgOiAnY2hldnJvbl9ib3R0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImEtaDVcIj57eyBsYXllci50aXRsZSA/PyAoJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllcicgfCBpMThuOiB7IGluZGV4OiBpICsgMSB9KSB9fTwvaDU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19kZWxldGUtbGF5ZXIgYS1idG4tLWljb24tb25seSBhLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MuZGVsZXRlTGF5ZXInIHwgaTE4blwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUxheWVyKGksIGxheWVyLCBncm91cClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTZcIiBbd2lkdGhdPVwiMTZcIiBpY29uU3ZnPVwiYmluX25vcm1hbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXVwiIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkc19fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIihsYXllcj8ub3BhY2l0eSA/PyAxMDApICsgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlT3BhY2l0eShsYXllciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRyYW5zbGF0ZT1cIkBwcnkud2lkZ2V0Lm1hcC5vcGFjaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktcmFuZ2U+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllck9wdGlvbnMnIHwgaTE4bjogeyBpbmRleDogaSArIDEgfSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktZWRpdC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiQHByeS53aWRnZXQubWFwLmxheWVyVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRCdXR0b25Ub29sdGlwPVwiQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MuZWRpdExheWVyVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZWQpPVwiY2hhbmdlVGl0bGUoJGV2ZW50LCBsYXllciwgZ3JvdXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1lZGl0LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCIhWydnZW9zZXJ2ZXInLCAnYXV0byddLmluY2x1ZGVzKGxheWVyLnR5cGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbGF5ZXJUeXBlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS50aXRsZScgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VMYXllclR5cGUoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImxheWVyVHlwZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5QcmVmaXg9XCJAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfbGF5ZXJUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0QXNXbXNUeXBlKGxheWVyKSBhcyB3bXNsYXllclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbGF5ZXJTdHlsZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyU3R5bGUnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTGF5ZXJTdHlsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwibGF5ZXJTdHlsZU9wdGlvbnMobGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFN0eWxlKGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sYXllclN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlRml0KCRldmVudCwgbGF5ZXIpXCIgW25nTW9kZWxdPVwibGF5ZXIuZml0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5maXQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3JlbGF0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtdHMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2dlb3NlcnZlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnZmVhdHVyZWxheWVyJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd2ZWN0b3J0aWxlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyYXN0ZXJ0aWxlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdhdXRvJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfY2xhc3Nlc1wiPnt7ICdAcHJ5LndpZGdldC5tYXAuY2xhc3NlcycgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbGFzc2VzKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwidXNlZENsYXNzZXMkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5jbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfY2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3JlbGF0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXRzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2dlb3NlcnZlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdmZWF0dXJlbGF5ZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAndmVjdG9ydGlsZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyYXN0ZXJ0aWxlJ1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmxvY2F0aW9uQXR0cicgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlb21ldHJ5RmllbGRzRm9yOiB7IHJlc3VsdFNldDogcmVzdWx0U2V0JCwgY2xhc3NlczogbGF5ZXIuY2xhc3NlcywgdHlwZTogbGF5ZXIudHlwZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luYyBhcyBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWF0bWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9pbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvbHlnb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpLWxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpLXBvbHlnb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGxheWVyLnR5cGUpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbG9jYXRpb25BdHRyaWJ1dGVfYm90aFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxvY2F0aW9uQXR0cmlidXRlLmJvdGgnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTG9jYXRpb25BdHRyaWJ1dGVzKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sb2NhdGlvbkF0dHJpYnV0ZV9ib3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiWydoZWF0bWFwJywgJ2J1YmJsZSddLmluZGV4T2YobGF5ZXIudHlwZSkgPj0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9pbnRlbnNpdHlBdHRyaWJ1dGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5pbnRlbnNpdHlBdHRyaWJ1dGUnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlSW50ZW5zaXR5QXR0cmlidXRlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZmllbGRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVySGFzSW50ZW5zaXR5KGxheWVyKS5pbnRlbnNpdHlBdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX2ludGVuc2l0eUF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3dtcycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAnd210cycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICdmZWF0dXJlbGF5ZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAndmVjdG9ydGlsZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICdyYXN0ZXJ0aWxlJ1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGF5ZXIudHlwZSAhPT0gJ2dlb3NlcnZlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF93bXNfdXJsXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMudXJsJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfdXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VVcmwoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci51cmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd21zJyB8fCBsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX3BhcmFtTGF5ZXJcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLndtcy5wYXJhbUxheWVyJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfcGFyYW1MYXllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1MYXllcigkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5wYXJhbUxheWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX21hdHJpeFNldFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAud21zLm1hdHJpeFNldCcgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX21hdHJpeFNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlTWF0cml4U2V0KCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLm1hdHJpeFNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ3dtdHMnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc19zdHlsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAud21zLnN0eWxlJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX3dtc19zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1TdHlsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ3dtcycgfHwgbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAudGlsZScgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVBhcmFtVGlsZWQoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllcj8ucGFyYW1UaWxlZCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAud21zLnBhcmFtVGlsZWQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0ICpuZ0lmPVwibGF5ZXIudHlwZSA9PT0gJ21hcmtlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmNsdXN0ZXJpbmcnIHwgaTE4biB9fTwvbGVnZW5kPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2x1c3RlcmVkKGxheWVyLCAkZXZlbnQpXCIgW25nTW9kZWxdPVwibGF5ZXIuY2x1c3RlcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuY2x1c3RlcmVkJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsYXllci5jbHVzdGVyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuY2x1c3RlcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2x1c3RlckRpc3RhbmNlKGxheWVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUcmFuc2xhdGU9XCJAcHJ5LndpZGdldC5tYXAuY2x1c3RlckRpc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heD1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktcmFuZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwib3B0aW9uc0NvcHkuc2xpZGUgPz8gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwic2xpZGVfc2VsZWN0XCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZS50aXRsZScgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU2xpZGUoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInNsaWRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5zbGlkZSA/PyAnYWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInNsaWRlX3NlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwib3B0aW9uc0NvcHkuYXR0cmlidXRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImF0dHJpYnV0aW9uXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5hdHRyaWJ1dGlvbicgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYXR0cmlidXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImNoYW5nZUF0dHJpYnV0aW9uKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5hdHRyaWJ1dGlvbiA/IGxheWVyLmF0dHJpYnV0aW9uIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9wcnktc2V0dGluZ3M+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibS1idG4tZ3JvdXAgLW1hcC1zZWxlY3Rpb24tY2hvaWNlIC12ZXJ0aWNhbFwiXG4gICAgW2NsYXNzLi13aXRoLWhlYWRlcl09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICBbY2xhc3MuLWNsb3NlZF09XCIhKGFjdGlvbk1lbnVPcGVuJCB8IGFzeW5jKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiLXZlcnRpY2FsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYmFzaWNBY3Rpb25zJCB8IGFzeW5jXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwIGEtdG9vbHRpcC0te3sgYWN0aW9uIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU2VsZWN0aW9uKGFjdGlvbilcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLicgKyBhY3Rpb24gfCBpMThuXCJcbiAgICAgICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LWljb24gW2ljb25TdmddPVwiYWN0aW9uXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC4nICsgYWN0aW9uIHwgaTE4biB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5IGEtdG9vbHRpcCAtbWFwLXRvZ2dsZVwiXG4gICAgICBpZD1cIm9wZW5fbWVudVwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImFjdGlvbk1lbnVPcGVuJCB8IGFzeW5jXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJleHBvcnRfdHlwZVwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibWVudVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCJcbiAgICA+XG4gICAgICA8cHJ5LWljb25cbiAgICAgICAgW2ljb25TdmddPVwiKGFjdGlvbk1lbnVPcGVuJCB8IGFzeW5jKSA/ICdjaGV2cm9uX3RvcCcgOiAnY2hldnJvbl9ib3R0b20nXCJcbiAgICAgICAgW3dpZHRoXT1cIjEyXCJcbiAgICAgICAgW2hlaWdodF09XCIyNFwiXG4gICAgICA+PC9wcnktaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLm9wZW4nIHwgaTE4biB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm0tYnRuLWdyb3VwIC1tYXAtc2VsZWN0aW9uLWNob2ljZSAtbWFwLWV4cG9ydFwiIFtjbGFzcy4td2l0aC1oZWFkZXJdPVwiZGlzcGxheUhlYWRlciQgfCBhc3luY1wiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5IGEtdG9vbHRpcFwiXG4gICAgICBpZD1cImV4cG9ydF9jYXJkXCJcbiAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICBhcmlhLWNvbnRyb2xzPVwiZXhwb3J0X3R5cGVcIlxuICAgICAgYXJpYS1oYXNwb3B1cD1cIm1lbnVcIlxuICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAuZXhwb3J0JyB8IGkxOG5cIlxuICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgKGNsaWNrKT1cImV4cG9ydCgpXCJcbiAgICA+XG4gICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImZpbGVfZG93bmxvYWRcIj48L3ByeS1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAuZXhwb3J0JyB8IGkxOG4gfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIEBpZiAoKGxheWVycyQgfCBhc3luYyk/Lmxlbmd0aCkge1xuICAgIDxkaXYgY2xhc3M9XCJvbC1jb250cm9sIG0tbWFwLWFjdGlvblwiIFtzdHlsZS50b3AucHhdPVwibGF5ZXJzVG9wJCB8IGFzeW5jXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwibS1tYXAtYWN0aW9uX19idXR0b25cIlxuICAgICAgICBbY2xhc3MuYS10b29sdGlwXT1cIiF0aGlzLmxheWVyc1RhYk9wZW5cIlxuICAgICAgICBbY2xhc3MuLXRvb2x0aXAtbm8td3JhcF09XCIhdGhpcy5sYXllcnNUYWJPcGVuXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxheWVyc1dpbmRvdygpXCJcbiAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAuc2VsZWN0TGF5ZXJzJyB8IGkxOG5cIlxuICAgICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJsZWZ0XCJcbiAgICAgID5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJsYXllcnNcIiBbd2lkdGhdPVwiMThcIiBbaGVpZ2h0XT1cIjE4XCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibS1tYXAtcG9wLWluIC1tYXgtd2lkdGgtMjIwXCJcbiAgICAgIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwibGF5ZXJzVG9wJCB8IGFzeW5jXCJcbiAgICA+XG4gICAgICA8aDQgY2xhc3M9XCJhLWg0XCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnNlbGVjdExheWVycycgfCBpMThuIH19PC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX2NvbnRlbnRcIiBbc3R5bGUubWF4LWhlaWdodC5weF09XCJsYXllcnNIZWlnaHQkIHwgYXN5bmNcIj5cbiAgICAgICAgQGZvciAoZ3JvdXAgb2YgbGF5ZXJHcm91cHMkIHwgYXN5bmM7IHRyYWNrIGdyb3VwOyBsZXQgZ3JvdXBJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICBAaWYgKGlzR3JvdXBVc2VkQnlXaWRnZXRMYXllcnMoZ3JvdXApKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX190aXRsZSBtLW1hcC1wb3AtaW5fX2dyb3VwLXRpdGxlXCI+XG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cImEtaDVcIj5cbiAgICAgICAgICAgICAgICB7eyBncm91cC5uYW1lID09PSBERUZBVUxUX0xBWUVSX0dST1VQID8gKCdAcHJ5LndpZGdldC5tYXAubm9Hcm91cCcgfCBpMThuKSA6IGdyb3VwLm5hbWUgfX1cbiAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChncm91cC5zaW5nbGVMYXllcikge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX19yYWRpb3NcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicmFkaW8tbGF5ZXItZ3JvdXAte3sgZ3JvdXBJZHggfX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC52aXNpYmxlTGF5ZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VWaXNpYmlsaXR5KGdyb3VwKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInJhZGlvLWxheWVyLWdyb3VwLXt7IGdyb3VwSWR4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLm5vTGF5ZXInIHwgaTE4blxuICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBmb3IgKGxheWVyIG9mIG9wdGlvbnNDb3B5LmxheWVyczsgdHJhY2sgbGF5ZXI7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgQGlmIChsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInJhZGlvLXt7IGdyb3VwLm5hbWUgfX0tbGF5ZXIte3sgaW5kZXggfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JvdXAudmlzaWJsZUxheWVyc1swXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGF5ZXIudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VWaXNpYmlsaXR5KGdyb3VwLCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInJhZGlvLXt7IGdyb3VwLm5hbWUgfX0tbGF5ZXIte3sgaW5kZXggfX1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudGl0bGUgPz8gKCdAcHJ5LndpZGdldC5tYXAubWlzc2luZ1RpdGxlJyB8IGkxOG4pXG4gICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIEBmb3IgKGxheWVyIG9mIG9wdGlvbnNDb3B5LmxheWVyczsgdHJhY2sgbGF5ZXI7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIEBpZiAobGF5ZXIuZ3JvdXAgPT09IGdyb3VwLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX3RpdGxlXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxheWVyc1RhYk9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImlzTGF5ZXJWaXNpYmxlKGxheWVyLCBncm91cClcIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlVmlzaWJpbGl0eShncm91cCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cImNoZWNrYm94LWxheWVyLXt7IGluZGV4IH19XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiY2hlY2tib3gtbGF5ZXIte3sgaW5kZXggfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBsYXllci50aXRsZSA/PyAoJ0Bwcnkud2lkZ2V0Lm1hcC5taXNzaW5nVGl0bGUnIHwgaTE4bikgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmICgobGVnZW5kTGF5ZXJzJCB8IGFzeW5jKT8ubGVuZ3RoKSB7XG4gICAgPGRpdiBjbGFzcz1cIm9sLWNvbnRyb2wgbS1tYXAtYWN0aW9uXCIgW3N0eWxlLnRvcC5weF09XCJsZWdlbmRUb3AkIHwgYXN5bmNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgW2NsYXNzLmEtdG9vbHRpcF09XCIhdGhpcy5sZWdlbmRUYWJPcGVuXCJcbiAgICAgICAgW2NsYXNzLi10b29sdGlwLW5vLXdyYXBdPVwiIXRoaXMubGVnZW5kVGFiT3BlblwiXG4gICAgICAgIGNsYXNzPVwibS1tYXAtYWN0aW9uX19idXR0b25cIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGVnZW5kV2luZG93KClcIlxuICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmRzJyB8IGkxOG5cIlxuICAgICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJsZWZ0XCJcbiAgICAgID5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJsZWdlbmRcIiBbd2lkdGhdPVwiMThcIiBbaGVpZ2h0XT1cIjE1XCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5cIiBbY2xhc3MuLWhpZGRlbl09XCIhbGVnZW5kVGFiT3BlblwiIFtzdHlsZS50b3AucHhdPVwibGVnZW5kVG9wJCB8IGFzeW5jXCI+XG4gICAgICA8aDQgY2xhc3M9XCJhLWg0XCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmRzVGl0bGUnIHwgaTE4biB9fTwvaDQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBnZW9MYXllciBvZiBsZWdlbmRMYXllcnMkIHwgYXN5bmM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xheWVyVmlzaWJsZShnZW9MYXllcilcIiBjbGFzcz1cIm0tbWFwLXBvcC1pbl9fdGl0bGVcIiAoY2xpY2spPVwidG9nZ2xlTGVnZW5kKGluZGV4KVwiPlxuICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJpc0xheWVyUmVuZGVyZWQoZ2VvTGF5ZXIpICYmICEhZ2VvTGF5ZXIudGl0bGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX2Ryb3Bkb3duLWljb25cIlxuICAgICAgICAgICAgW2ljb25TdmddPVwibGVnZW5kVGFiQ2xvc2VkW2luZGV4XSA/ICdjaGV2cm9uX2JvdHRvbScgOiAnY2hldnJvbl90b3AnXCJcbiAgICAgICAgICAgIFt3aWR0aF09XCIxMlwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjEyXCJcbiAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICA8aDUgY2xhc3M9XCJhLWg1XCI+e3sgZ2VvTGF5ZXIudGl0bGUgfX08L2g1PlxuICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgKm5nSWY9XCIhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiXG4gICAgICAgICAgICBjbGFzcz1cImEtdG9vbHRpcFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllckxvYWRFcnJvcicgfCBpMThuXCJcbiAgICAgICAgICAgIFtpY29uU3ZnXT1cIidjbG9zZSdcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIjIyXCJcbiAgICAgICAgICAgIFtoZWlnaHRdPVwiMjJcIlxuICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibS1tYXAtcG9wLWluX19pbWFnZVwiXG4gICAgICAgICAgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW4gfHwgbGVnZW5kVGFiQ2xvc2VkW2luZGV4XSB8fCAhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiXG4gICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwibGVnZW5kSGVpZ2h0JCB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZW9MYXllciB8IGxlZ2VuZFVybDogeyBjYXBhYmlsaXRpZXM6ICh3bXNDYXBhYmlsaXRpZXMkIHwgYXN5bmMpIH0gYXMgdXJsXCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIFtzcmNdPVwidXJsIHwgZ2V0U2VjdXJlZEltYWdlIHwgYXN5bmNcIlxuICAgICAgICAgICAgICBbYWx0XT1cIidAcHJ5LndpZGdldC5tYXAubGVnZW5kJyB8IGkxOG46IHsgbGF5ZXI6IGdlb0xheWVyLnRpdGxlIH1cIlxuICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VOb3RQcm92aWRlZFtpbmRleF0gPSB0cnVlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoZ2VvTGF5ZXIgfCBsZWdlbmRVcmw6IHsgY2FwYWJpbGl0aWVzOiAod21zQ2FwYWJpbGl0aWVzJCB8IGFzeW5jKSB9KVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX2Vycm9yXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmROb3RQcm92aWRlZCcgfCBpMThuIH19PC9wPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICB9XG5cbiAgQGlmIChsZWZ0U2xpZGVMYXllcnMubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1zbGlkZS1sZWdlbmQgLWxlZnRcIiBbc3R5bGUudG9wLnB4XT1cImxlZ2VuZFRvcCQgfCBhc3luY1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtLW1hcC1zbGlkZS1sZWdlbmRfX3RpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZVRpdGxlJyB8IGkxOG4gfX06PC9zcGFuPlxuICAgICAgQGZvciAobGF5ZXIgb2YgbGVmdFNsaWRlTGF5ZXJzOyB0cmFjayBsYXllcikge1xuICAgICAgICA8ZGl2Pnt7IGxheWVyLmdldCgndGl0bGUnKSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgQGlmIChyaWdodFNsaWRlTGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICA8ZGl2IGNsYXNzPVwibS1tYXAtc2xpZGUtbGVnZW5kIC1sZWZ0XCIgW3N0eWxlLnRvcC5weF09XCJsZWdlbmRUb3AkIHwgYXN5bmNcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibS1tYXAtc2xpZGUtbGVnZW5kX190aXRsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGVUaXRsZScgfCBpMThuIH19Ojwvc3Bhbj5cbiAgICAgIEBmb3IgKGxheWVyIG9mIHJpZ2h0U2xpZGVMYXllcnM7IHRyYWNrIGxheWVyKSB7XG4gICAgICAgIDxkaXY+e3sgbGF5ZXIuZ2V0KCd0aXRsZScpIH19PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICA8ZGl2IFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0JCB8IGFzeW5jXCIgY2xhc3M9XCJvLW1hcC13cmFwcGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm8tbWFwXCI+XG4gICAgICA8ZGl2ICNtYXBSZWYgaWQ9XCJtYXBcIj48L2Rpdj5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgc3RlcD1cIjAuMDFcIlxuICAgICAgICB2YWx1ZT1cIjUwXCJcbiAgICAgICAgI3NsaWRlckVsZW1lbnRcbiAgICAgICAgY2xhc3M9XCJvLW1hcC1zbGlkZXJcIlxuICAgICAgICBbY2xhc3MuLWhpZGRlbl09XCIhKGhhc1NsaWRlTGF5ZXIkIHwgYXN5bmMpXCJcbiAgICAgICAgKGlucHV0KT1cInRyaWdnZXJMYXllclJlbmRlcigpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgI3BvcHVwIGNsYXNzPVwibS10b29sdGlwIG0tdG9vbHRpcC0tcG9wdXBcIiBbaGlkZGVuXT1cInRydWVcIiByb2xlPVwidG9vbHRpcFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtLXRvb2x0aXAtLXBvcHVwX19oZWFkZXJcIj5cbiAgICAgIDxwPnt7IHRvb2x0aXBNYW5hZ2VyLnRvb2x0aXBJbmRleCArIDEgfX0gLyB7eyB0b29sdGlwTWFuYWdlci50b29sdGlwTnVtYmVyIH19PC9wPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAoY2xpY2spPVwidG9vbHRpcE1hbmFnZXIudG9vbHRpcE1vdmUoLTEpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiF0b29sdGlwTWFuYWdlci50b29sdGlwQ2FuTW92ZSgtMSlcIlxuICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFycm93X2JhY2tcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnkgYS1idG4tLWljb24tb25seVwiXG4gICAgICAgIChjbGljayk9XCJ0b29sdGlwTWFuYWdlci50b29sdGlwTW92ZSgxKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdG9vbHRpcE1hbmFnZXIudG9vbHRpcENhbk1vdmUoMSlcIlxuICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFycm93X3JpZ2h0XCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9vbHRpcE1hbmFnZXIuY2xlYXJUb29sdGlwKHRydWUpXCI+XG4gICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcC0tcG9wdXBfX2NvbnRhaW5lclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAjcG9wdXBDb250ZW50PjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|