@provoly/dashboard 1.4.14 → 1.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/admin/components/admin-abac-rules/admin-abac-rules-form/admin-abac-rules-form.component.mjs +7 -7
- package/esm2022/admin/components/admin-abac-rules/admin-abac-rules.component.mjs +3 -3
- package/esm2022/admin/components/admin-abac-rules/components/attribute-condition/attribute-condition.component.mjs +7 -7
- package/esm2022/admin/components/admin-abac-rules/components/composed-condition/composed-condition.component.mjs +10 -10
- package/esm2022/admin/components/admin-abac-rules/components/metadata-condition/metadata-condition.component.mjs +6 -6
- package/esm2022/admin/components/admin-abac-rules/components/select-attribute/select-attribute.component.mjs +3 -3
- package/esm2022/admin/components/admin-abac-rules/components/select-metadata/select-metadata.component.mjs +3 -3
- package/esm2022/admin/components/admin-classes/admin-classes-customize/admin-classes-customize.component.mjs +10 -10
- package/esm2022/admin/components/admin-classes/admin-classes-customize/symbol/admin-classes-customize-symbol.component.mjs +10 -15
- package/esm2022/admin/components/admin-classes/admin-classes-customize/tooltip/admin-classes-customize-tooltip.component.mjs +8 -8
- package/esm2022/admin/components/admin-classes/admin-classes-edit/admin-classes-edit.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-select/admin-classes-select.component.mjs +6 -6
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-edit/admin-attributes-edit.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.mjs +3 -3
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-new/admin-attributes-new.component.mjs +5 -5
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-select/admin-attributes-select.component.mjs +6 -6
- package/esm2022/admin/components/admin-classes/admin-classes-view/admin-classes-view.component.mjs +3 -3
- package/esm2022/admin/components/admin-classes/admin-classes.component.mjs +5 -5
- package/esm2022/admin/components/admin-dataset/admin-dataset.component.mjs +6 -6
- package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +7 -7
- package/esm2022/admin/components/admin-environment/admin-environment-form/admin-environment-form.component.mjs +3 -3
- package/esm2022/admin/components/admin-environment/admin-environment-select/admin-environment-select.component.mjs +5 -5
- package/esm2022/admin/components/admin-environment/admin-environment-update/admin-environment-update.component.mjs +5 -5
- package/esm2022/admin/components/admin-environment/admin-environment.component.mjs +5 -5
- package/esm2022/admin/components/admin-fields/admin-fields-edit/admin-fields-edit.component.mjs +5 -5
- package/esm2022/admin/components/admin-fields/admin-fields-select/admin-fields-select.component.mjs +3 -3
- package/esm2022/admin/components/admin-layout/admin-layout.component.mjs +3 -3
- package/esm2022/admin/components/admin-links/admin-links-new/admin-links-new.component.mjs +5 -5
- package/esm2022/admin/components/admin-links/admin-links.component.mjs +5 -5
- package/esm2022/admin/components/admin-menu/admin-menu.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata/admin-edit-metadata/admin-edit-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata/admin-select-metadata/admin-select-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata/shared/form-metadata/form-metadata.component.mjs +4 -5
- package/esm2022/admin/components/admin-metadata/shared/list-metadata/pry-list-metadata.component.mjs +5 -6
- package/esm2022/admin/components/admin-metadata-rules/admin-metadata-rules.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata-rules/admin-select-metadata-rules/admin-select-metadata-rules.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata-rules/shared/admin-form-metadata-rules/admin-form-metadata-rules.component.mjs +4 -5
- package/esm2022/admin/components/admin-metadata-user/admin-user-edit-metadata/admin-user-edit-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-metadata-user/admin-user-select-metadata/admin-user-select-metadata.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates-form/admin-predicates-form.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates-select/admin-predicates-select.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates-update/admin-predicates-update.component.mjs +5 -5
- package/esm2022/admin/components/admin-predicates/admin-predicates.component.mjs +5 -5
- package/esm2022/admin/components/admin-relation-types/admin-relation-types-modal/admin-relation-types-modal.component.mjs +4 -5
- package/esm2022/admin/components/admin-relation-types/admin-relation-types-select/admin-relation-types-select.component.mjs +5 -5
- package/esm2022/admin/components/admin-relation-types/admin-relation-types.component.mjs +6 -6
- package/esm2022/admin/components/admin-user/admin-user-select/admin-user-select.component.mjs +6 -6
- package/esm2022/admin/components/admin-user/admin-user.component.mjs +5 -5
- package/esm2022/admin/components/association/association.component.mjs +4 -5
- package/esm2022/components/card/card.component.mjs +5 -6
- package/esm2022/components/metadata-editor/metadata-editor.component.mjs +6 -6
- package/esm2022/components/scheme-picker/scheme-picker.component.mjs +7 -7
- package/esm2022/components/stepper/stepper.component.mjs +3 -4
- package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +5 -5
- package/esm2022/dataset/components/dataset-version-form/dataset-version-form.component.mjs +6 -7
- package/esm2022/filters/date/date-filter.component.mjs +5 -6
- package/esm2022/filters/list/list-filter.component.mjs +6 -7
- package/esm2022/filters/number/number-filter.component.mjs +5 -6
- package/esm2022/filters/text/text-filter.component.mjs +5 -6
- package/esm2022/lib/core/components/about/about.component.mjs +3 -3
- package/esm2022/lib/core/components/accordion/accordion-item/accordion-item.component.mjs +7 -7
- package/esm2022/lib/core/components/base-menu/base-menu.component.mjs +6 -6
- package/esm2022/lib/core/components/base-toolbox/base-toolbox.component.mjs +6 -6
- package/esm2022/lib/core/components/base-toolbox-action/base-toolbox-action.component.mjs +6 -7
- package/esm2022/lib/core/components/date-picker/date-picker.component.mjs +4 -4
- package/esm2022/lib/core/components/date-picker/time-picker/loop-scroll-column/loop-scroll-column.component.mjs +3 -4
- package/esm2022/lib/core/components/date-picker/time-picker/time-picker.component.mjs +6 -6
- package/esm2022/lib/core/components/edit-input/edit-input.component.mjs +7 -8
- package/esm2022/lib/core/components/icon/icon.component.mjs +3 -3
- package/esm2022/lib/core/components/modal/modal.component.mjs +5 -6
- package/esm2022/lib/core/components/nq-color-selector/nq-color-selector.component.mjs +5 -5
- package/esm2022/lib/core/components/overlay/dialog-confirm.component.mjs +3 -3
- package/esm2022/lib/core/components/range/range.component.mjs +5 -6
- package/esm2022/lib/core/components/select/select.component.mjs +3 -3
- package/esm2022/lib/core/components/select-image/select-image.component.mjs +5 -5
- package/esm2022/lib/core/components/share/group-share/group-share.component.mjs +6 -6
- package/esm2022/lib/core/components/snackbar/snackbar/snackbar.component.mjs +3 -3
- package/esm2022/lib/core/components/status-modal/status-modal.component.mjs +5 -5
- package/esm2022/lib/core/components/tabs/tab-group.component.mjs +3 -3
- package/esm2022/lib/core/components/toggle/toggle.component.mjs +4 -4
- package/esm2022/lib/core/store/data-source/data-source.effects.mjs +9 -9
- package/esm2022/lib/core/store/search/search.effects.mjs +4 -2
- package/esm2022/lib/core/store/search/search.service.mjs +3 -7
- package/esm2022/lib/core/toolbox/toolbox-manifest.service.mjs +3 -3
- package/esm2022/lib/dashboard/action-bus/service/bus.service.mjs +2 -2
- package/esm2022/lib/dashboard/components/context-menu/context-menu.component.mjs +8 -8
- package/esm2022/lib/dashboard/components/dashboard.component.mjs +12 -12
- package/esm2022/lib/dashboard/components/manifests/manifests.component.mjs +5 -5
- package/esm2022/lib/dashboard/components/metadata/metadata.component.mjs +5 -6
- package/esm2022/lib/dashboard/components/vizualize-raw/vizualize-raw.component.mjs +3 -3
- package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-selector.component.mjs +6 -6
- package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +10 -10
- package/esm2022/lib/dashboard/components/widgets/widget-filler/widget-filler.component.mjs +2 -2
- package/esm2022/lib/dashboard/components/widgets/widget-placement/widget-placement.utils.mjs +2 -2
- package/esm2022/lib/dashboard/filter/components/filter-group/filter-group.component.mjs +7 -7
- package/esm2022/lib/dashboard/resultset-utils.mjs +7 -8
- package/esm2022/lib/dashboard/store/dashboard.effects.mjs +4 -4
- package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +13 -24
- package/esm2022/lib/dashboard/tooltip/components/default/default.tooltip.component.mjs +3 -3
- package/esm2022/notification/components/notification/content/notification-content.component.mjs +3 -3
- package/esm2022/notification/components/notification/notification.component.mjs +5 -5
- package/esm2022/pipeline/components/pipeline-details/pipeline-details.component.mjs +7 -7
- package/esm2022/pipeline/components/pipeline-editor/graph-serializer.utils.mjs +2 -2
- package/esm2022/pipeline/components/pipeline-editor/pipeline-editor.component.mjs +5 -5
- package/esm2022/pipeline/components/pipeline-list/pipeline-list.component.mjs +9 -9
- package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +6 -6
- package/esm2022/presentation/components/presentation.component.mjs +6 -6
- package/esm2022/presentation/components/title-presentation/title-presentation.component.mjs +5 -5
- package/esm2022/restitution/components/restitution/restitution.component.mjs +3 -3
- package/esm2022/restitution/components/restitution-catalog/restitution-catalog.component.mjs +9 -9
- package/esm2022/restitution/components/restitution-list-item/restitution-list-item.component.mjs +3 -3
- package/esm2022/search/components/choose-widget/choose-widget.component.mjs +5 -5
- package/esm2022/search/components/edit-named-query/edit-named-query.component.mjs +9 -9
- package/esm2022/search/search-fulltext/search-fulltext/search-fulltext.component.mjs +3 -3
- package/esm2022/search/search-home/search-home.component.mjs +3 -3
- package/esm2022/search/search-mono-class/components/search-composed/search-composed.component.mjs +3 -3
- package/esm2022/search/search-mono-class/components/search-condition/search-condition.component.mjs +3 -3
- package/esm2022/search/search-mono-class/components/search-mono-class/search-mono-class.component.mjs +8 -8
- package/esm2022/search/search-mono-class/components/search-order/search-order.component.mjs +6 -6
- package/esm2022/search/search-mono-class/components/search-select-attribute/search-select-attribute.component.mjs +3 -3
- package/esm2022/search/search-multi-class/components/multi-class-condition/multi-class-condition.component.mjs +7 -7
- package/esm2022/search/search-multi-class/components/multi-class-field-selection/multi-class-field-selection.component.mjs +6 -6
- package/esm2022/search/search-multi-class/components/search-multi-class/search-multi-class.component.mjs +7 -7
- package/esm2022/search/search-tools/search-tools.component.mjs +13 -13
- package/esm2022/toolbox/components/named-query/named-query.component.mjs +5 -5
- package/esm2022/toolbox/components/save-view/save-view.component.mjs +10 -10
- package/esm2022/toolbox/components/select-grid-layout/select-grid-layout.component.mjs +8 -8
- package/esm2022/toolbox/shared/presentation-form/presentation-form.component.mjs +5 -6
- package/esm2022/tooltips/attribute/attribute-tooltip.component.mjs +3 -3
- package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +4 -4
- package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +2 -2
- package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +12 -12
- package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +13 -7
- package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +7 -7
- package/esm2022/widgets/widget-iframe/component/widget-iframe.component.mjs +7 -7
- package/esm2022/widgets/widget-iframe/messaging/iframe-messaging.service.mjs +2 -2
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +10 -10
- package/esm2022/widgets/widget-map/utils/widget-map.utils.mjs +2 -2
- package/esm2022/widgets/widget-table/component/widget-table.component.mjs +2 -2
- package/esm2022/widgets/widget-table/expand-value/expand-value.component.mjs +4 -5
- package/esm2022/widgets/widget-template/component/widget-template.component.mjs +7 -7
- package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +10 -10
- package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +9 -9
- package/fesm2022/provoly-dashboard-admin.mjs +171 -175
- package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-card.mjs +4 -5
- package/fesm2022/provoly-dashboard-components-card.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs +4 -4
- package/fesm2022/provoly-dashboard-components-metadata-editor.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-scheme-picker.mjs +6 -6
- package/fesm2022/provoly-dashboard-components-scheme-picker.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-components-stepper.mjs +2 -3
- package/fesm2022/provoly-dashboard-components-stepper.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-dataset.mjs +14 -14
- package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-date.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-date.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-list.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-list.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-number.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-number.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-filters-text.mjs +4 -5
- package/fesm2022/provoly-dashboard-filters-text.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-notification.mjs +4 -4
- package/fesm2022/provoly-dashboard-notification.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-pipeline.mjs +21 -21
- package/fesm2022/provoly-dashboard-pipeline.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-presentation.mjs +14 -14
- package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-restitution.mjs +6 -6
- package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-search.mjs +35 -35
- package/fesm2022/provoly-dashboard-search.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-toolbox.mjs +25 -25
- package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-tooltips-attribute.mjs +2 -2
- package/fesm2022/provoly-dashboard-tooltips-attribute.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +3 -3
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +10 -10
- package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +11 -5
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +5 -5
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs +8 -8
- package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +9 -9
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +6 -6
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-template.mjs +7 -7
- package/fesm2022/provoly-dashboard-widgets-widget-template.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +11 -11
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +7 -7
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +204 -219
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -24,11 +24,11 @@ import * as i0 from "@angular/core";
|
|
|
24
24
|
import * as i1 from "@ngrx/store";
|
|
25
25
|
import * as i2 from "@provoly/dashboard";
|
|
26
26
|
import * as i3 from "./widget-map-layer.service";
|
|
27
|
-
import * as i4 from "@angular/
|
|
28
|
-
import * as i5 from "@
|
|
29
|
-
import * as i6 from "@
|
|
30
|
-
import * as i7 from "
|
|
31
|
-
import * as i8 from "
|
|
27
|
+
import * as i4 from "@angular/forms";
|
|
28
|
+
import * as i5 from "@provoly/dashboard/components/checkbox";
|
|
29
|
+
import * as i6 from "@angular/cdk/drag-drop";
|
|
30
|
+
import * as i7 from "../style/css.component";
|
|
31
|
+
import * as i8 from "@angular/common";
|
|
32
32
|
import * as i9 from "../pipe/widget-map-geometry-fields-for.pipe";
|
|
33
33
|
import * as i10 from "../pipe/widget-map-legend-url.pipe";
|
|
34
34
|
export const TOOLTIP_PADDING = 15;
|
|
@@ -189,7 +189,7 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
189
189
|
this.autoDatasetLayers$
|
|
190
190
|
]).pipe(map(([manifest, resultSet, classes, fields, mapStyles, geoLayers, capabilities, autoDatasetLayers]) => {
|
|
191
191
|
// auto determine layers parameters to provide a working view
|
|
192
|
-
const autoOptions =
|
|
192
|
+
const autoOptions = structuredClone(manifest.options ?? {});
|
|
193
193
|
if (!autoOptions.tooltipMode) {
|
|
194
194
|
autoOptions.tooltipMode = TooltipMode.CLICK;
|
|
195
195
|
}
|
|
@@ -281,7 +281,7 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
281
281
|
return autoOptions;
|
|
282
282
|
}), distinctUntilChanged((p, c) => equal(p, c)));
|
|
283
283
|
this.subscriptions.add(this.options$.pipe(filter((opt) => !!opt)).subscribe((options) => {
|
|
284
|
-
this.optionsCopy =
|
|
284
|
+
this.optionsCopy = structuredClone(options);
|
|
285
285
|
this.optionsCopy.layers?.forEach((layer) => (this.layerSettingsExpandedState[layer.title ?? 'MISSING TITLE'] = false));
|
|
286
286
|
this.optionsCopy.layers = this.optionsCopy.layers?.map((layer) => ({
|
|
287
287
|
...layer,
|
|
@@ -1178,11 +1178,11 @@ export class WidgetMapComponent extends DataWidgetComponent {
|
|
|
1178
1178
|
this.optionsCopy.layerGroups = this.optionsCopy.layerGroups.filter((group) => this.optionsCopy.layers?.some((layer) => layer.group === group.name) || group.name === DEFAULT_LAYER_GROUP);
|
|
1179
1179
|
}
|
|
1180
1180
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", 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 }); }
|
|
1181
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", 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 optionsCopy.layerGroups; 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 <div class=\"m-form-label-field u-display-flex -row -gap-10\">\n <input\n id=\"map_layerGroupTitle-{{ groupIdx }}\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"updateLayerGroupName(group, $event)\"\n [value]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n />\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>\n @if (group.name !== DEFAULT_LAYER_GROUP) {\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)=\"updateLayerGroupSingleLayer(group, $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)=\"updateLayerGroupSingleLayer(group, $event)\"\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 }\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 <label class=\"a-label\" for=\"layer_{{ i + 1 }}_title\">{{\n '@pry.widget.map.layerTitle' | i18n\n }}</label>\n <input\n id=\"layer_{{ i + 1 }}_title\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"changeTitle($event, layer, group)\"\n [value]=\"layer.title\"\n />\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 m-map-action--layers\" [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 class=\"m-map-pop-in -max-width-220\" [class.-hidden]=\"!layersTabOpen\" [style.top.px]=\"layersTop$ | async\">\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 (options$ | async)?.layerGroups ?? []; 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]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-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]=\"id + '-' + group.name\"\n id=\"{{ 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=\"{{ id }}-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 m-map-action--legend\" [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 <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (geoLayer of legendLayers$ | async; track geoLayer; let index = $index) {\n @if (isLayerVisible(geoLayer)) {\n <div class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n @if (isLayerRendered(geoLayer) && !!geoLayer.title) {\n <pry-icon\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 }\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n @if (!isLayerRendered(geoLayer)) {\n <pry-icon\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 }\n </div>\n }\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 @if (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 }\n @if (!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })) {\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n }\n </div>\n }\n </div>\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 -right\" [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.tooltipDisplayedIndex$ | async) ?? 0) + 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", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { 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", "name", "inputId", "inhibit"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], 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", "cdkDragScale"], 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" }] }); }
|
|
1181
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", 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 @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | 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 @if (optionsCopy.style === STYLE_FROM_URL) {\n <div class=\"m-form-label-field\">\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 <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\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 @for (group of optionsCopy.layerGroups; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div 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 <div class=\"m-form-label-field u-display-flex -row -gap-10\">\n <input\n id=\"map_layerGroupTitle-{{ groupIdx }}\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"updateLayerGroupName(group, $event)\"\n [value]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n />\n @if (group.name !== DEFAULT_LAYER_GROUP) {\n <button\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 }\n </div>\n </div>\n </div>\n @if (group.name !== DEFAULT_LAYER_GROUP) {\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)=\"updateLayerGroupSingleLayer(group, $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)=\"updateLayerGroupSingleLayer(group, $event)\"\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 }\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 @for (layer of optionsCopy?.layers; track layer; let i = $index) {\n @if (layer.group === group.name) {\n <div\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 @if (layerSettingsExpandedState[layer.title!]) {\n <div 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 <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 <label class=\"a-label\" for=\"layer_{{ i + 1 }}_title\">{{\n '@pry.widget.map.layerTitle' | i18n\n }}</label>\n <input\n id=\"layer_{{ i + 1 }}_title\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"changeTitle($event, layer, group)\"\n [value]=\"layer.title\"\n />\n </div>\n @if (!['geoserver', 'auto'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\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 @if (['geoserver', 'wms'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\n @if (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 }\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 @if (\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 <div\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 }\n </fieldset>\n </div>\n @if (\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 <fieldset\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n @if (\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async; as fields\n ) {\n @if (\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 <div\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 @if (['heatmap', 'bubble'].indexOf(layer.type) >= 0) {\n <div>\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 }\n }\n </fieldset>\n }\n @if (\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 <fieldset\n >\n @if (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 }\n @if (layer.type === 'wms' || layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\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 @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\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 @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\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 @if (layer.type === 'wms' || layer.type === 'geoserver') {\n <div class=\"m-form-label-field\">\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 }\n </fieldset>\n }\n @if (layer.type === 'marker') {\n <fieldset>\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 @if (layer.clustered) {\n <div>\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 }\n </fieldset>\n }\n @if (optionsCopy.slide ?? false) {\n <div class=\"m-form-label-field\">\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 @if (optionsCopy.attributions) {\n <div class=\"m-form-label-field\">\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 }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </pry-settings>\n </pry-widget-header>\n }\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 @for (action of basicActions$ | async; track action) {\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 }\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 m-map-action--layers\" [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 class=\"m-map-pop-in -max-width-220\" [class.-hidden]=\"!layersTabOpen\" [style.top.px]=\"layersTop$ | async\">\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 (options$ | async)?.layerGroups ?? []; 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]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-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]=\"id + '-' + group.name\"\n id=\"{{ 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=\"{{ id }}-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 m-map-action--legend\" [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 <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (geoLayer of legendLayers$ | async; track geoLayer; let index = $index) {\n @if (isLayerVisible(geoLayer)) {\n <div class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n @if (isLayerRendered(geoLayer) && !!geoLayer.title) {\n <pry-icon\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 }\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n @if (!isLayerRendered(geoLayer)) {\n <pry-icon\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 }\n </div>\n }\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 @if (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 }\n @if (!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })) {\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n }\n </div>\n }\n </div>\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 -right\" [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.tooltipDisplayedIndex$ | async) ?? 0) + 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.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: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.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", "autocomplete", "alwaysShowAutosuggestedValues", "externalAutocompleteService", "bindValue", "bindLabel", "iconSize", "bindIcon", "template", "i18nPrefix", "bindClasses", "loading", "elementRef"], outputs: ["searched", "cleared", "clicked", "pressedEnter"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryCheckboxComponent, selector: "pry-checkbox", inputs: ["circle", "name", "inputId", "inhibit"] }, { kind: "component", type: i2.PryRangeComponent, selector: "pry-range", inputs: ["min", "max", "step", "disabled", "labelTranslate"] }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i7.PryWidgetMapCssComponent, selector: "pry-widget-map-css" }, { kind: "pipe", type: i8.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" }] }); }
|
|
1182
1182
|
}
|
|
1183
1183
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetMapComponent, decorators: [{
|
|
1184
1184
|
type: Component,
|
|
1185
|
-
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 optionsCopy.layerGroups; 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 <div class=\"m-form-label-field u-display-flex -row -gap-10\">\n <input\n id=\"map_layerGroupTitle-{{ groupIdx }}\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"updateLayerGroupName(group, $event)\"\n [value]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n />\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>\n @if (group.name !== DEFAULT_LAYER_GROUP) {\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)=\"updateLayerGroupSingleLayer(group, $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)=\"updateLayerGroupSingleLayer(group, $event)\"\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 }\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 <label class=\"a-label\" for=\"layer_{{ i + 1 }}_title\">{{\n '@pry.widget.map.layerTitle' | i18n\n }}</label>\n <input\n id=\"layer_{{ i + 1 }}_title\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"changeTitle($event, layer, group)\"\n [value]=\"layer.title\"\n />\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 m-map-action--layers\" [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 class=\"m-map-pop-in -max-width-220\" [class.-hidden]=\"!layersTabOpen\" [style.top.px]=\"layersTop$ | async\">\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 (options$ | async)?.layerGroups ?? []; 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]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-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]=\"id + '-' + group.name\"\n id=\"{{ 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=\"{{ id }}-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 m-map-action--legend\" [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 <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (geoLayer of legendLayers$ | async; track geoLayer; let index = $index) {\n @if (isLayerVisible(geoLayer)) {\n <div class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n @if (isLayerRendered(geoLayer) && !!geoLayer.title) {\n <pry-icon\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 }\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n @if (!isLayerRendered(geoLayer)) {\n <pry-icon\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 }\n </div>\n }\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 @if (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 }\n @if (!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })) {\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n }\n </div>\n }\n </div>\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 -right\" [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.tooltipDisplayedIndex$ | async) ?? 0) + 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" }]
|
|
1185
|
+
args: [{ selector: 'pry-widget-map', template: "<pry-widget-map-css></pry-widget-map-css>\n<div class=\"o-widget o-widget--map\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [datasourceIds]=\"(datasourceIds$ | 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 @if (optionsCopy.style === STYLE_FROM_URL) {\n <div class=\"m-form-label-field\">\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 <pry-checkbox (ngModelChange)=\"changeAttributions($event)\" [ngModel]=\"optionsCopy.attributions ?? false\">\n {{ '@pry.widget.map.attributions' | i18n }}\n </pry-checkbox>\n <pry-checkbox (ngModelChange)=\"changeSlideOption($event)\" [ngModel]=\"hasSlideLayer$ | async\">\n {{ '@pry.widget.map.slide.global' | i18n }}\n </pry-checkbox>\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 @for (group of optionsCopy.layerGroups; track group; let groupIdx = $index) {\n @if (isGroupUsedByWidgetLayers(group)) {\n <div 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 <div class=\"m-form-label-field u-display-flex -row -gap-10\">\n <input\n id=\"map_layerGroupTitle-{{ groupIdx }}\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"updateLayerGroupName(group, $event)\"\n [value]=\"group.name === DEFAULT_LAYER_GROUP ? ('@pry.widget.map.noGroup' | i18n) : group.name\"\n />\n @if (group.name !== DEFAULT_LAYER_GROUP) {\n <button\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 }\n </div>\n </div>\n </div>\n @if (group.name !== DEFAULT_LAYER_GROUP) {\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)=\"updateLayerGroupSingleLayer(group, $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)=\"updateLayerGroupSingleLayer(group, $event)\"\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 }\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 @for (layer of optionsCopy?.layers; track layer; let i = $index) {\n @if (layer.group === group.name) {\n <div\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 @if (layerSettingsExpandedState[layer.title!]) {\n <div 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 <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 <label class=\"a-label\" for=\"layer_{{ i + 1 }}_title\">{{\n '@pry.widget.map.layerTitle' | i18n\n }}</label>\n <input\n id=\"layer_{{ i + 1 }}_title\"\n class=\"a-form-field\"\n type=\"text\"\n (change)=\"changeTitle($event, layer, group)\"\n [value]=\"layer.title\"\n />\n </div>\n @if (!['geoserver', 'auto'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\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 @if (['geoserver', 'wms'].includes(layer.type)) {\n <div class=\"m-form-label-field\">\n @if (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 }\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 @if (\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 <div\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 }\n </fieldset>\n </div>\n @if (\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 <fieldset\n >\n <legend class=\"u-visually-hidden\">{{ '@pry.widget.map.locationAttr' | i18n }}</legend>\n @if (\n layer\n | geometryFieldsFor: { resultSet: resultSet$, classes: layer.classes, type: layer.type }\n | async; as fields\n ) {\n @if (\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 <div\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 @if (['heatmap', 'bubble'].indexOf(layer.type) >= 0) {\n <div>\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 }\n }\n </fieldset>\n }\n @if (\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 <fieldset\n >\n @if (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 }\n @if (layer.type === 'wms' || layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\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 @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\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 @if (layer.type === 'wmts') {\n <div class=\"m-form-label-field\">\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 @if (layer.type === 'wms' || layer.type === 'geoserver') {\n <div class=\"m-form-label-field\">\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 }\n </fieldset>\n }\n @if (layer.type === 'marker') {\n <fieldset>\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 @if (layer.clustered) {\n <div>\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 }\n </fieldset>\n }\n @if (optionsCopy.slide ?? false) {\n <div class=\"m-form-label-field\">\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 @if (optionsCopy.attributions) {\n <div class=\"m-form-label-field\">\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 }\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </pry-settings>\n </pry-widget-header>\n }\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 @for (action of basicActions$ | async; track action) {\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 }\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 m-map-action--layers\" [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 class=\"m-map-pop-in -max-width-220\" [class.-hidden]=\"!layersTabOpen\" [style.top.px]=\"layersTop$ | async\">\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 (options$ | async)?.layerGroups ?? []; 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]=\"id + '-' + group.name\"\n id=\"{{ id }}-radio-layer-group-{{ groupIdx }}\"\n [ngModel]=\"group.visibleLayers.length\"\n [value]=\"0\"\n (change)=\"changeVisibility(group)\"\n />\n <label class=\"a-label\" for=\"{{ id }}-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]=\"id + '-' + group.name\"\n id=\"{{ 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=\"{{ id }}-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 m-map-action--legend\" [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 <div class=\"m-map-pop-in__content\" [style.max-height.px]=\"layersHeight$ | async\">\n @for (geoLayer of legendLayers$ | async; track geoLayer; let index = $index) {\n @if (isLayerVisible(geoLayer)) {\n <div class=\"m-map-pop-in__title\" (click)=\"toggleLegend(index)\">\n @if (isLayerRendered(geoLayer) && !!geoLayer.title) {\n <pry-icon\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 }\n <h5 class=\"a-h5\">{{ geoLayer.title }}</h5>\n @if (!isLayerRendered(geoLayer)) {\n <pry-icon\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 }\n </div>\n }\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 @if (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 }\n @if (!(geoLayer | legendUrl: { capabilities: (wmsCapabilities$ | async) })) {\n <p class=\"m-map-pop-in__error\">{{ '@pry.widget.map.legendNotProvided' | i18n }}</p>\n }\n </div>\n }\n </div>\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 -right\" [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.tooltipDisplayedIndex$ | async) ?? 0) + 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" }]
|
|
1186
1186
|
}], 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: [{
|
|
1187
1187
|
type: Optional
|
|
1188
1188
|
}, {
|
|
@@ -1204,4 +1204,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
1204
1204
|
type: ViewChild,
|
|
1205
1205
|
args: ['sliderElement']
|
|
1206
1206
|
}] } });
|
|
1207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1tYXAvY29tcG9uZW50L3dpZGdldC1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtbWFwL2NvbXBvbmVudC93aWRnZXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsTUFBTSxFQUdOLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBTUwsY0FBYyxFQUNkLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsbUJBQW1CLEVBRW5CLGNBQWMsRUFFZCxXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLFNBQVMsRUFjVCxlQUFlLEVBQ2YsU0FBUyxFQUNULGlCQUFpQixFQUlqQixjQUFjLEVBR2QsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEQsT0FBTyxFQUFrQixJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFaEQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUs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LENBQUM7OEdBam9EVSxrQkFBa0IsbVFBMkdQLGlCQUFpQjtrR0EzRzVCLGtCQUFrQixtVEFNTSxnQkFBZ0IsbUhBQ1YsV0FBVyxxSkMvSHRELGloaENBb3NCQTs7MkZENWtCYSxrQkFBa0I7a0JBSjlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzswQkE4R3ZCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUJBQWlCO3lDQXZHbEIsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUNDLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFDcUMsWUFBWTtzQkFBbEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0csa0JBQWtCO3NCQUF6RSxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDMUIsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGlvblJlc3VsdCxcbiAgQXR0cmlidXRlLFxuICBCYXNlV2lkZ2V0TWFwTGF5ZXJPcHRpb25zLFxuICBDaGFydEFnZ3JlZ2F0ZWRXaWRnZXRPcHRpb25zLFxuICBDbGFzcyxcbiAgQ2xhc3NTZWxlY3RvcnMsXG4gIENvbmZpZ1NlbGVjdG9ycyxcbiAgRGFzaGJvYXJkQWN0aW9ucyxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBEYXRhc2V0LFxuICBEYXRhU291cmNlU2VsZWN0b3JzLFxuICBEYXRhc291cmNlVXRpbHMsXG4gIERhdGFXaWRnZXRDb21wb25lbnQsXG4gIEZpZWxkLFxuICBGaWVsZFNlbGVjdG9ycyxcbiAgRmlsdGVyQ29udGV4dCxcbiAgR2VvTWV0YWRhdGEsXG4gIEdlb21ldHJpY0ZpZWxkVHlwZXMsXG4gIEdldENhcGFiaWxpdGllc1Jlc3BvbnNlLFxuICBJdGVtVXRpbHMsXG4gIExheWVyR3JvdXAsXG4gIE1hcEF1dG9MYXllck9wdGlvbnMsXG4gIE1hcEZlYXR1cmVMYXllck9wdGlvbnMsXG4gIE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucyxcbiAgTWFwUmFzdGVyVGlsZUxheWVyT3B0aW9ucyxcbiAgTWFwVmVjdG9yVGlsZUxheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0T3B0aW9ucyxcbiAgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMsXG4gIE1hcFdNVFNMYXllckxheWVyT3B0aW9ucyxcbiAgTmFtZWRRdWVyeVR5cGVzLFxuICBPcGVyYXRpb24sXG4gIFBSWV9HRU9BVVRIX1RPS0VOLFxuICBQcnlBZ2dyZWdhdGlvblNlcnZpY2UsXG4gIFByeUdlb0F1dGhTZXJ2aWNlLFxuICBQcnlJMThuU2VydmljZSxcbiAgUmVzdWx0c2V0VXRpbHMsXG4gIFN5bWJvbFNlcnZpY2UsXG4gIFRvb2x0aXBGYWN0b3J5U2VydmljZSxcbiAgVG9vbHRpcE1vZGUsXG4gIFdJREdFVF9IRUFERVJfSEVJR0hULFxuICB3aWRnZXRNYXBDb25maWdcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwvZXM2JztcbmltcG9ydCB7IEZlYXR1cmUsIE1hcCwgVmlldyB9IGZyb20gJ29sJztcbmltcG9ydCB7IENvb3JkaW5hdGUgfSBmcm9tICdvbC9jb29yZGluYXRlJztcbmltcG9ydCB7IGJvdW5kaW5nRXh0ZW50LCBjcmVhdGVFbXB0eSB9IGZyb20gJ29sL2V4dGVudCc7XG5pbXBvcnQgeyBDaXJjbGUsIEdlb21ldHJ5LCBQb2ludCB9IGZyb20gJ29sL2dlb20nO1xuaW1wb3J0IHsgSGVhdG1hcCwgTGF5ZXIsIFRpbGUgfSBmcm9tICdvbC9sYXllcic7XG5pbXBvcnQgQmFzZUxheWVyIGZyb20gJ29sL2xheWVyL0Jhc2UnO1xuaW1wb3J0IFZlY3RvckxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3Rvcic7XG5pbXBvcnQgeyBmcm9tTG9uTGF0IH0gZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gJ29sL3Byb2ovcHJvajQnO1xuaW1wb3J0IHsgRGF0YVRpbGUsIEltYWdlV01TLCBUaWxlV01TIH0gZnJvbSAnb2wvc291cmNlJztcbmltcG9ydCBWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJ29sL3N0eWxlJztcbmltcG9ydCBwcm9qNCBmcm9tICdwcm9qNCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb20sXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgd2l0aExhdGVzdEZyb21cbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi1tYW5hZ2VyLmNsYXNzJztcbmltcG9ydCB7IENxbFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvY3FsLXV0aWxzLmNsYXNzJztcbmltcG9ydCB7IFhNTFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMveG1sLXV0aWxzLmNsYXNzJztcbmltcG9ydCB7IFdpZGdldE1hcExheWVyU2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LW1hcC1sYXllci5zZXJ2aWNlJztcbmltcG9ydCBNYXBib3hWZWN0b3JMYXllciBmcm9tICdvbC9sYXllci9NYXBib3hWZWN0b3InO1xuaW1wb3J0IHsgV2lkZ2V0TWFwVXRpbHMgfSBmcm9tICcuLi91dGlscy93aWRnZXQtbWFwLnV0aWxzJztcbmltcG9ydCB7IExheWVyU2xpZGVyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vbGF5ZXItc2xpZGVyLmNsYXNzJztcbmltcG9ydCBUaWxlTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvVGlsZSc7XG5pbXBvcnQgV2ViR0xUaWxlTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvV2ViR0xUaWxlJztcbmltcG9ydCB7IEF0dHJpYnV0aW9uLCBkZWZhdWx0cyB9IGZyb20gJ29sL2NvbnRyb2wnO1xuaW1wb3J0IFZlY3RvclRpbGVMYXllciBmcm9tICdvbC9sYXllci9WZWN0b3JUaWxlJztcbmltcG9ydCB7IENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBUb29sdGlwTWFuYWdlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL3Rvb2x0aXAtbWFuYWdlci5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBUT09MVElQX1BBRERJTkcgPSAxNTtcbmV4cG9ydCBjb25zdCBOT05fTUFOREFUT1JZX0ZJVF9MQVlFUl9UWVBFUyA9IFsnd21zJywgJ2dlb3NlcnZlciddO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTEFZRVJfR1JPVVAgPSAnREVGQVVMVCc7XG5cbi8vIERlZmluZSBMYW1iZXJ0IFByb2plY3Rpb25cbnByb2o0LmRlZnMoXG4gICdFUFNHOjIxNTQnLFxuICAnK3Byb2o9bGNjICtsYXRfMD00Ni41ICtsb25fMD0zICtsYXRfMT00OSArbGF0XzI9NDQgK3hfMD03MDAwMDAgK3lfMD02NjAwMDAwICtlbGxwcz1HUlM4MCArdG93Z3M4ND0wLDAsMCwwLDAsMCwwICt1bml0cz1tICtub19kZWZzICt0eXBlPWNycydcbik7XG5yZWdpc3Rlcihwcm9qNCk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS13aWRnZXQtbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1tYXAuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldE1hcENvbXBvbmVudCBleHRlbmRzIERhdGFXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcbiAgaWQgPSBgJHtXaWRnZXRNYXBDb21wb25lbnQuaWRDb3VudGVyKyt9YDtcbiAgbWFwVXJsJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBAVmlld0NoaWxkKCdtYXBSZWYnKSBtYXBSZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwb3B1cCcpIHBvcHVwITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgncG9wdXBDb250ZW50JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIHBvcHVwQ29udGVudCE6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2V4cG9ydFR5cGVUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgZXhwb3J0VHlwZVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyRWxlbWVudCcpIHNsaWRlckVsZW1lbnQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxNYXBXaWRnZXRPcHRpb25zPjtcbiAgbGF5ZXJUeXBlcyA9IHRoaXMud2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLmltcGxlbWVudGF0aW9uTGlzdFxuICAgIC5maWx0ZXIoKHR5cGUpID0+IHR5cGUgIT09ICdhdXRvJylcbiAgICAuc29ydCgoYSwgYikgPT5cbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgICAgICAuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS4nICsgYSlcbiAgICAgICAgLmxvY2FsZUNvbXBhcmUodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUuJyArIGIpKVxuICAgICk7XG4gIG9wdGlvbnNDb3B5OiBNYXBXaWRnZXRPcHRpb25zID0ge30gYXMgTWFwV2lkZ2V0T3B0aW9ucztcbiAgY2xhc3NlcyQ6IE9ic2VydmFibGU8Q2xhc3NbXT47XG4gIGZpZWxkcyQ6IE9ic2VydmFibGU8RmllbGRbXT47XG4gIHNlbGVjdGVkSWRzJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIGJvdHRvbUxlZnQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGxheWVycyQhOiBPYnNlcnZhYmxlPEJhc2VMYXllcltdPjtcbiAgbWFwITogTWFwO1xuICBhZGRpdGlvbmFsTGF5ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPEdlb21ldHJ5Pj5bXT4oW10pO1xuICBzdHlsZXMkOiBPYnNlcnZhYmxlPFxuICAgIHtcbiAgICAgIGlkZW50aWZpZXI6IHN0cmluZztcbiAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgfVtdXG4gID47XG4gIFdJREdFVF9IRUFERVJfSEVJR0hUID0gV0lER0VUX0hFQURFUl9IRUlHSFQ7XG4gIGkgPSAwO1xuICBpdGVtU3R5bGVzJCE6IE9ic2VydmFibGU8e1xuICAgIFtpZDogc3RyaW5nXToge1xuICAgICAgY2xhc3NpYzogU3R5bGU7XG4gICAgICBib3JkZXJlZDogU3R5bGU7XG4gICAgfTtcbiAgfT47XG4gIGhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgYWN0aW9ucyQgPSB3aWRnZXRNYXBDb25maWcuYWN0aW9ucyQ7XG4gIGdlb1NlcnZlckxheWVyRGVzY3JpcHRpb25zJDogT2JzZXJ2YWJsZTxNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNbXT47XG4gIGxlZ2VuZFRhYk9wZW4gPSBmYWxzZTtcbiAgbGF5ZXJzVGFiT3BlbiA9IGZhbHNlO1xuICBsZWdlbmRUYWJDbG9zZWQ6IGJvb2xlYW5bXSA9IFtdO1xuICBsZWdlbmRMYXllcnMkITogT2JzZXJ2YWJsZTwoTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpW10+O1xuICBsZWdlbmRUb3AkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGxheWVyc1RvcCQhOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGxlZ2VuZEhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgbGF5ZXJzSGVpZ2h0JCE6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgaW1hZ2VOb3RQcm92aWRlZDogYm9vbGVhbltdID0gW107XG4gIGJhc2ljQWN0aW9ucyQ6IE9ic2VydmFibGU8KCdjbGljaycgfCAnbGFzc28nIHwgJ3JlY3RhbmdsZScgfCAnem9vbScgfCAnbW92ZScgfCAnZXhwb3J0JyB8ICd1cGxvYWQnKVtdPjtcbiAgem9vbUFuZENlbnRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICB6b29tPzoge1xuICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgIG1pbjogbnVtYmVyO1xuICAgICAgbWF4OiBudW1iZXI7XG4gICAgfTtcbiAgICBjZW50ZXI/OiBudW1iZXJbXTtcbiAgfT4oe30pO1xuICBtYXBTdHlsZVVybCQhOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+O1xuICBpbnRlcmFjdGlvbk1hbmFnZXI6IEludGVyYWN0aW9uTWFuYWdlciA9IG5ldyBJbnRlcmFjdGlvbk1hbmFnZXIoKTtcbiAgdG9vbHRpcE1hbmFnZXI6IFRvb2x0aXBNYW5hZ2VyID0gbmV3IFRvb2x0aXBNYW5hZ2VyKCk7XG4gIG1hcFN0eWxlTGF5ZXIkITogT2JzZXJ2YWJsZTwoVmVjdG9yVGlsZUxheWVyIHwgVGlsZUxheWVyPGFueT4pW10+O1xuICBTVFlMRV9GUk9NX1VSTCA9ICdfdXJsJztcbiAgTk9fU1RZTEUgPSAnbm9uZSc7XG4gIHdtc0NhcGFiaWxpdGllcyQ6IE9ic2VydmFibGU8XG4gICAgfCB7XG4gICAgICAgIFtwOiBzdHJpbmddOiBHZXRDYXBhYmlsaXRpZXNSZXNwb25zZSB8IG51bGw7XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWRcbiAgPjtcbiAgYXV0b0RhdGFzZXRMYXllcnMkOiBPYnNlcnZhYmxlPE1hcEF1dG9MYXllck9wdGlvbnNbXT47XG4gIGZpdEV4dGVudHMkITogT2JzZXJ2YWJsZTxcbiAgICB7XG4gICAgICBkYXRhc291cmNlOiBzdHJpbmc7XG4gICAgICBleHRlbnQ6IENvb3JkaW5hdGVbXTtcbiAgICAgIGVycm9yOiBib29sZWFuO1xuICAgIH1bXVxuICA+O1xuICBkYXRhc291cmNlRmlsdGVycyQ6IE9ic2VydmFibGU8YW55PjtcbiAgdXNlZENsYXNzZXMkOiBPYnNlcnZhYmxlPGFueT47XG4gIGxheWVyU2xpZGVyID0gbmV3IExheWVyU2xpZGVyKCk7XG4gIGhhc1NsaWRlTGF5ZXIkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzbGlkZXM6IHsgaWQ6IHVuZGVmaW5lZCB8IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W107XG4gIHBvc3NpYmxlU3R5bGVzOiB7XG4gICAgW3A6IHN0cmluZ106IHtcbiAgICAgIGxheWVyczogeyBbcDogc3RyaW5nXTogeyBwYXJhbTogc3RyaW5nOyBzdHlsZXM6IHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gfSB9IHwgbnVsbDtcbiAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgYXR0cmlidXRpb25zID0gbmV3IEF0dHJpYnV0aW9uKCk7XG4gIGFjdGlvbk1lbnVPcGVuJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBhdHRyaWJ1dGlvbnMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBvbFpvb21FbGVtZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgcHJldmlvdXNMYXllcnM6IEJhc2VMYXllcltdID0gW107XG4gIGxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0b3JlOiBTdG9yZTxhbnk+LFxuICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBwcml2YXRlIHRvb2x0aXBGYWN0b3J5U2VydmljZTogVG9vbHRpcEZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3ltYm9sU2VydmljZTogU3ltYm9sU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHdpZGdldE1hcExheWVyU2VydmljZTogV2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJ5QWdncmVnYXRpb25TZXJ2aWNlOiBQcnlBZ2dyZWdhdGlvblNlcnZpY2UsXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChQUllfR0VPQVVUSF9UT0tFTikgcHJpdmF0ZSBnZW9BdXRoU2VydmljZTogUHJ5R2VvQXV0aFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoc3RvcmUsIGVsKTtcblxuICAgIHRoaXMuZ2V0T2xab29tRWxlbWVudCgpO1xuXG4gICAgdGhpcy5zbGlkZXMgPSBbXG4gICAgICB7IGlkOiAnYWxsJywgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc2xpZGUuYWxsJykgfSxcbiAgICAgIHsgaWQ6ICdsZWZ0JywgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuc2xpZGUubGVmdCcpIH0sXG4gICAgICB7IGlkOiAncmlnaHQnLCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZS5yaWdodCcpIH1cbiAgICBdO1xuXG4gICAgdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2Uud2l0aEdlb0F1dGgodGhpcy5nZW9BdXRoU2VydmljZSk7XG5cbiAgICB0aGlzLmJhc2ljQWN0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuYWN0aW9ucyQsXG4gICAgICB0aGlzLmFjdGlvbk1lbnVPcGVuJCxcbiAgICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkludGVyYWN0aW9uLnNlbGVjdGlvblR5cGUkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2FjdGlvbnMsIG1lbnVPcGVuLCBzZWxlY3Rpb25UeXBlXSkgPT5cbiAgICAgICAgbWVudU9wZW5cbiAgICAgICAgICA/IGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbiAhPT0gJ2V4cG9ydCcgJiYgYWN0aW9uICE9PSAndXBsb2FkJylcbiAgICAgICAgICA6IGFjdGlvbnNcbiAgICAgICAgICAgICAgLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24gIT09ICdleHBvcnQnICYmIGFjdGlvbiAhPT0gJ3VwbG9hZCcpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGFjdGlvbikgPT4gc2VsZWN0aW9uVHlwZSA9PT0gYWN0aW9uKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmNsYXNzZXMkID0gdGhpcy5zdG9yZVxuICAgICAgLnNlbGVjdChDbGFzc1NlbGVjdG9ycy5jbGFzc2VzKVxuICAgICAgLnBpcGUobWFwKChjbGFzc2VzKSA9PiBjbGFzc2VzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpKSk7XG4gICAgdGhpcy51c2VkQ2xhc3NlcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmNsYXNzZXMkLCB0aGlzLnVzZWREYXRhc291cmNlcyRdKS5waXBlKFxuICAgICAgbWFwKChbY2xhc3NlcywgZGF0YXNvdXJjZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiBjbGFzc2VzLmZpbHRlcigoY2xhc3NJdGVtKSA9PlxuICAgICAgICAgIGRhdGFzb3VyY2VzLnNvbWUoKGRhdGFTb3VyY2UpID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICduYW1lZFF1ZXJ5JyAmJiAndHlwZScgaW4gZGF0YVNvdXJjZS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlLnJlcXVlc3QudHlwZSA9PT0gTmFtZWRRdWVyeVR5cGVzLk1VTFRJX0NMQVNTIHx8XG4gICAgICAgICAgICAgICAgZGF0YVNvdXJjZS5yZXF1ZXN0LnR5cGUgPT09IE5hbWVkUXVlcnlUeXBlcy5GVUxMX1RFWFRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICdkYXRhc2V0J1xuICAgICAgICAgICAgICA/IGRhdGFTb3VyY2Uub0NsYXNzID09PSBjbGFzc0l0ZW0uaWRcbiAgICAgICAgICAgICAgOiBkYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICduYW1lZFF1ZXJ5JyAmJiAnb0NsYXNzJyBpbiBkYXRhU291cmNlLnJlcXVlc3RcbiAgICAgICAgICAgICAgICA/IGRhdGFTb3VyY2UucmVxdWVzdC5vQ2xhc3MgPT09IGNsYXNzSXRlbS5pZFxuICAgICAgICAgICAgICAgIDogZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAnbmFtZWRRdWVyeScgJiYgJ3R5cGUnIGluIGRhdGFTb3VyY2UucmVxdWVzdFxuICAgICAgICAgICAgICAgICAgPyBkYXRhU291cmNlLnJlcXVlc3QudHlwZSA9PT0gTmFtZWRRdWVyeVR5cGVzLk1PTk9fQ0xBU1NcbiAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmZpZWxkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChGaWVsZFNlbGVjdG9ycy5maWVsZHMpO1xuXG4gICAgdGhpcy5kYXRhc291cmNlRmlsdGVycyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5kYXRhc291cmNlRmlsdGVycyksXG4gICAgICB0aGlzLmRhdGFzb3VyY2VJZHMkXG4gICAgXSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKFtmaWx0ZXJzLCBpZHNdKSA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKGZpbHRlcnMpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWx0ZXJEc0tleSkgPT4gaWRzLmluY2x1ZGVzKGZpbHRlckRzS2V5KSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+ICh7IC4uLnAsIFtjXTogZmlsdGVyc1tjXSB9KSwge30pIGFzIHtcbiAgICAgICAgICAgIFtwOiBzdHJpbmddOiBGaWx0ZXJDb250ZXh0W107XG4gICAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdHlsZXMkID0gdGhpcy5zdG9yZS5zZWxlY3QoQ29uZmlnU2VsZWN0b3JzLm1hcFN0eWxlcykucGlwZShcbiAgICAgIG1hcCgoc3R5bGVzKSA9PlxuICAgICAgICBzdHlsZXMuY29uY2F0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuTk9fU1RZTEUsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5ub1N0eWxlJylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuU1RZTEVfRlJPTV9VUkwsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5zdHlsZUZyb21VcmwnKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZElkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuc2VsZWN0ZWRJdGVtSWRzKTtcblxuICAgIHRoaXMuZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnVzZWREYXRhc291cmNlcyQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKVxuICAgICAgKSxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KENvbmZpZ1NlbGVjdG9ycy5nZW9TZXJ2ZXJVcmwpLnBpcGUoc3RhcnRXaXRoKHVuZGVmaW5lZCkpXG4gICAgXSkucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgbWFwKChbZGF0YVNvdXJjZXMsIGdlb1NlcnZlclVybF0pID0+IHtcbiAgICAgICAgaWYgKCFnZW9TZXJ2ZXJVcmwpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzXG4gICAgICAgICAgLmZpbHRlcigoZHMpID0+IERhdGFzb3VyY2VVdGlscy5pc0dlbyhkcykpXG4gICAgICAgICAgLm1hcCgoZHMpID0+IHtcbiAgICAgICAgICAgIGRzID0gZHMgYXMgdW5rbm93biBhcyBEYXRhc2V0O1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFzOiB7XG4gICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICAgICAgICAgIH0gPSB7fTtcbiAgICAgICAgICAgIGRzLm1ldGFkYXRhPy5mb3JFYWNoKChtKSA9PiAobWV0YWRhdGFzW20ubWV0YWRhdGFEZWYubmFtZV0gPSBtLnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0eXBlOiAnZ2Vvc2VydmVyJyxcbiAgICAgICAgICAgICAgdXJsOiBgJHtnZW9TZXJ2ZXJVcmx9LyR7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFzW0dlb01ldGFkYXRhLk5BTUVTUEFDRV0ubGVuZ3RoID4gMCA/IG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdICsgJy8nIDogJydcbiAgICAgICAgICAgICAgfXdtcz9TRVJWSUNFPVdNUyZWRVJTSU9OPTEuMy4wYCxcbiAgICAgICAgICAgICAgcGFyYW1UaWxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogcGFyc2VJbnQobWV0YWRhdGFzW0dlb01ldGFkYXRhLk9QQUNJVFldID8/IDEwMCwgMTApLFxuICAgICAgICAgICAgICBvQ2xhc3M6IGRzLm9DbGFzcyxcbiAgICAgICAgICAgICAga2V5OiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuTkFNRVNQQUNFXSArICc6JyArIG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5LRVldLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdLFxuICAgICAgICAgICAgICBwYXJhbUxheWVyOiBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuS0VZXSxcbiAgICAgICAgICAgICAgbmFtZTogZHMubmFtZSxcbiAgICAgICAgICAgICAgZGF0YXNvdXJjZUlkOiBkcy5pZCxcbiAgICAgICAgICAgICAgZ3JvdXA6IERFRkFVTFRfTEFZRVJfR1JPVVBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKChsYXllcikgPT4gbGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKSxcbiAgICAgIHN0YXJ0V2l0aChbXSlcbiAgICApO1xuXG4gICAgdGhpcy5hdXRvRGF0YXNldExheWVycyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY2xhc3NlcyQsXG4gICAgICB0aGlzLnVzZWREYXRhc291cmNlcyQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgbWFwKFxuICAgICAgICAgIChkYXRhc291cmNlcykgPT5cbiAgICAgICAgICAgIGRhdGFzb3VyY2VzLmZpbHRlcigoZHMpID0+IGRzLnNvdXJjZVR5cGUgPT09ICdkYXRhc2V0JyAmJiAhRGF0YXNvdXJjZVV0aWxzLmlzR2VvKGRzKSkgYXMgRGF0YXNldFtdXG4gICAgICAgIClcbiAgICAgIClcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoW2NsYXNzZXMsIGRhdGFTZXRzXSkgPT5cbiAgICAgICAgICBkYXRhU2V0c1xuICAgICAgICAgICAgLm1hcCgoZHMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBjbGFzc2VzLmZpbmQoKGNsYXp6KSA9PiBjbGF6ei5pZCA9PT0gZHMub0NsYXNzKTtcbiAgICAgICAgICAgICAgY29uc3QgZ2VvQXR0cmlidXRlcyA9IChtb2RlbD8uYXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGF0dHIpID8/IFtdKS5maWx0ZXIoKGF0dHIpID0+XG4gICAgICAgICAgICAgICAgR2VvbWV0cmljRmllbGRUeXBlcy5pbmNsdWRlcyhhdHRyLmZpZWxkLnR5cGUpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBnZW9BdHRyaWJ1dGVzLm1hcChcbiAgICAgICAgICAgICAgICAoYXR0cikgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGAke2RzLm5hbWV9JHtnZW9BdHRyaWJ1dGVzLmxlbmd0aCA+IDEgPyAnIC0gJyArIGF0dHIubmFtZSA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgIG9DbGFzczogZHMub0NsYXNzLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IGRzLmlkLFxuICAgICAgICAgICAgICAgICAgICBzdWJUeXBlOiBhdHRyLmZpZWxkIS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbZHMub0NsYXNzXSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlOiBhdHRyLnRlY2huaWNhbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBERUZBVUxUX0xBWUVSX0dST1VQXG4gICAgICAgICAgICAgICAgICB9KSBhcyBNYXBBdXRvTGF5ZXJPcHRpb25zXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZsYXQoKSBhcyBNYXBBdXRvTGF5ZXJPcHRpb25zW11cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMubWFuaWZlc3QkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgobWFuaWZlc3QpID0+XG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICgoKG1hbmlmZXN0Lm9wdGlvbnMgPz8geyBsYXllcnM6IFtdIH0pIGFzIE1hcFdpZGdldE9wdGlvbnMpLmxheWVycyA/PyBbXSkuZmlsdGVyKChsYXllcikgPT5cbiAgICAgICAgICAgICAgICBbJ3dtcyddLmluY2x1ZGVzKGxheWVyLnR5cGUpXG4gICAgICAgICAgICAgICkgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNbXVxuICAgICAgICAgICAgKS5tYXAoKGxheWVyKSA9PiBsYXllci51cmwpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHVybHMpID0+IHVybHMuZm9yRWFjaCgodXJsKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuZ2V0Q2FwYWJpbGl0eSh7IHVybCB9KSkpKVxuICAgICk7XG5cbiAgICB0aGlzLndtc0NhcGFiaWxpdGllcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuY2FwYWJpbGl0aWVzKTtcblxuICAgIHRoaXMub3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMubWFuaWZlc3QkLFxuICAgICAgdGhpcy5yZXN1bHRTZXQkLFxuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuZmllbGRzJCxcbiAgICAgIHRoaXMuc3R5bGVzJCxcbiAgICAgIHRoaXMuZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnMkLFxuICAgICAgdGhpcy53bXNDYXBhYmlsaXRpZXMkLFxuICAgICAgdGhpcy5hdXRvRGF0YXNldExheWVycyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbbWFuaWZlc3QsIHJlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzLCBtYXBTdHlsZXMsIGdlb0xheWVycywgY2FwYWJpbGl0aWVzLCBhdXRvRGF0YXNldExheWVyc10pID0+IHtcbiAgICAgICAgLy8gYXV0byBkZXRlcm1pbmUgbGF5ZXJzIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSBhIHdvcmtpbmcgdmlld1xuICAgICAgICBjb25zdCBhdXRvT3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkpIGFzIE1hcFdpZGdldE9wdGlvbnM7XG4gICAgICAgIGlmICghYXV0b09wdGlvbnMudG9vbHRpcE1vZGUpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy50b29sdGlwTW9kZSA9IFRvb2x0aXBNb2RlLkNMSUNLO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gW1xuICAgICAgICAgIC4uLihhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnR5cGUgIT09ICdhdXRvJyksXG4gICAgICAgICAgLi4uKGF1dG9PcHRpb25zLmF1dG9tYXRpY0xheWVyc1xuICAgICAgICAgICAgPyBhdXRvRGF0YXNldExheWVyc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAobGF5ZXIpID0+XG4gICAgICAgICAgICAgICAgICAgICFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgIWF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5pbmNsdWRlcyhsYXllci5rZXkgKyAnLScgKyBsYXllci5zdWJUeXBlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChsYXllcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLmxheWVyLFxuICAgICAgICAgICAgICAgICAgLi4uKChhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgKHByZXZMYXllcikgPT4gcHJldkxheWVyLmtleSA9PT0gbGF5ZXIua2V5ICYmIHByZXZMYXllci5hdHRyaWJ1dGUgPT09IGxheWVyLmF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgKSA/PyB7fSlcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogW10pXG4gICAgICAgIF07XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzPy5mb3JFYWNoKChsYXllciwgaSkgPT4ge1xuICAgICAgICAgIFdpZGdldE1hcFV0aWxzLnBvcHVsYXRlTG9jYXRpb25BdHRyaWJ1dGUobGF5ZXIsIHJlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzKTtcbiAgICAgICAgICBXaWRnZXRNYXBVdGlscy5wb3B1bGF0ZUludGVuc2l0eUF0dHJpYnV0ZShsYXllciwgcmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMpO1xuICAgICAgICAgIGlmIChhdXRvT3B0aW9ucy5hdHRyaWJ1dGlvbnMpIHtcbiAgICAgICAgICAgIGxheWVyLmF0dHJpYnV0aW9uID0gbGF5ZXIuYXR0cmlidXRpb24gPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhY3R1YWxMYXllcktleXMgPSAoYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKVxuICAgICAgICAgIC5tYXAoKGxheWVyKSA9PiAobGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKS5rZXkgPz8gbnVsbClcbiAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICEha2V5KTtcblxuICAgICAgICAvLyBHZXQgYWxsIHByZXZpb3VzIGxheWVycywgd2l0aG91dCBnZW9zZXJ2ZXIgbGF5ZXJzIHRoYXQgYXJlIG5vdCByZXF1ZXN0ZWQgYW55bW9yZSwgdGhlbiBhZGQgbmV3IGdlb3NlcnZlciBsYXllcnMgKHBvdGVudGlhbGx5IHdpdGggYSBwcmVjb25maWcgZnJvbSBtYW5pZmVzdCkuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycyA9IFtcbiAgICAgICAgICAuLi4oYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKS5tYXAoKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZW9MYXllciA9IGdlb0xheWVycy5maW5kKChnZW9MYXllcikgPT4gbGF5ZXIua2V5ID09PSBnZW9MYXllci5rZXkpID8/IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcidcbiAgICAgICAgICAgICAgPyBnZW9MYXllclxuICAgICAgICAgICAgICAgID8geyAuLi5nZW9MYXllciwgLi4ubGF5ZXIsIHVybDogZ2VvTGF5ZXIudXJsIH1cbiAgICAgICAgICAgICAgICA6IChudWxsIGFzIHVua25vd24gYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKVxuICAgICAgICAgICAgICA6IHsgLi4ubGF5ZXIgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5nZW9MYXllcnMuZmlsdGVyKChsYXllcikgPT4gIWFjdHVhbExheWVyS2V5cy5pbmNsdWRlcyhsYXllci5rZXkpKVxuICAgICAgICBdLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIpO1xuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHRMYXllclRpdGxlKGxheWVyLCBpbmRleCwgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICEhbWFwU3R5bGVzICYmXG4gICAgICAgICAgbWFwU3R5bGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAoIWF1dG9PcHRpb25zLnN0eWxlIHx8ICFtYXBTdHlsZXMubWFwKChzdHlsZSkgPT4gc3R5bGUuaWRlbnRpZmllcikuaW5jbHVkZXMoYXV0b09wdGlvbnMuc3R5bGUpKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBsaWdodFN0eWxlcyA9IG1hcFN0eWxlcy5maWx0ZXIoKHN0eWxlKSA9PiAhKHN0eWxlLmlkZW50aWZpZXIgPz8gJy0nKS5pbmNsdWRlcygnZGFyaycpKTtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5zdHlsZSA9IGxpZ2h0U3R5bGVzLmxlbmd0aCA+IDAgPyBsaWdodFN0eWxlc1swXS5pZGVudGlmaWVyIDogbWFwU3R5bGVzWzBdLmlkZW50aWZpZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyKSB7XG4gICAgICAgICAgY29uc3QgYmFzZSA9IGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllcjtcblxuICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGlnbm9yZUF1dG9MYXllcnMsIHZhbHVlcyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgY29uc3QgcG9zc2libGVJZ25vcmVBdXRvTGF5ZXJLZXlzID0gYXV0b0RhdGFzZXRMYXllcnMubWFwKChsYXllcikgPT4gbGF5ZXIua2V5ICsgJy0nICsgbGF5ZXIuc3ViVHlwZSk7XG4gICAgICAgICAgYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyID0gKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllciA/PyBbXSkuZmlsdGVyKChrZXkpID0+XG4gICAgICAgICAgICBwb3NzaWJsZUlnbm9yZUF1dG9MYXllcktleXMuaW5jbHVkZXMoa2V5KVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgfHwgYmFzZS5sZW5ndGggIT09IGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdE1hbmlmZXN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gV2lkZ2V0TWFwVXRpbHMuYXNzaWduTGF5ZXJzT3JkZXIoYXV0b09wdGlvbnMubGF5ZXJzKTtcblxuICAgICAgICBpZiAoYXV0b09wdGlvbnMuZml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMuZm9yRWFjaChcbiAgICAgICAgICAgIChsYXllcikgPT4gKGxheWVyLmZpdCA9ICFOT05fTUFOREFUT1JZX0ZJVF9MQVlFUl9UWVBFUy5pbmNsdWRlcyhsYXllci50eXBlKSB8fCBhdXRvT3B0aW9ucy5maXQpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgYXV0b09wdGlvbnMuZml0O1xuICAgICAgICB9XG5cbiAgICAgICAgW1xuICAgICAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgIGF1dG9PcHRpb25zLmxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBbJ3dtcycsICdnZW9zZXJ2ZXInXS5pbmNsdWRlcyhsYXllci50eXBlKSkgYXMgKFxuICAgICAgICAgICAgICAgIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICAgICAgICB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1xuICAgICAgICAgICAgICApW11cbiAgICAgICAgICAgICkubWFwKChsYXllcikgPT4gbGF5ZXIudXJsKVxuICAgICAgICAgIClcbiAgICAgICAgXS5mb3JFYWNoKCh1cmwpID0+IHtcbiAgICAgICAgICBpZiAoY2FwYWJpbGl0aWVzICYmIGNhcGFiaWxpdGllc1t1cmxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5nZXRDYXBhYmlsaXR5KHsgdXJsOiB1cmwgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gYXV0b09wdGlvbnMubGF5ZXJzLm1hcCgobGF5ZXIpID0+ICh7XG4gICAgICAgICAgLi4ubGF5ZXIsXG4gICAgICAgICAgdGl0bGU6IGxheWVyLnRpdGxlID8/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLiR7bGF5ZXIudHlwZX1gLCB7IC4uLmxheWVyIH0pLFxuICAgICAgICAgIGdyb3VwOiBsYXllci5ncm91cCA/PyBERUZBVUxUX0xBWUVSX0dST1VQXG4gICAgICAgIH0pKTtcblxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllckdyb3VwcyA9IGF1dG9PcHRpb25zLmxheWVyR3JvdXBzID8/IFtdO1xuICAgICAgICBpZiAoIWF1dG9PcHRpb25zLmxheWVyR3JvdXBzLmZpbmQoKGcpID0+IGcubmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCkpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5sYXllckdyb3Vwcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6ICdERUZBVUxUJyxcbiAgICAgICAgICAgIHNpbmdsZUxheWVyOiBmYWxzZSxcbiAgICAgICAgICAgIHZpc2libGVMYXllcnM6IGF1dG9PcHRpb25zLmxheWVyc1xuICAgICAgICAgICAgICA/IGF1dG9PcHRpb25zLmxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCkubWFwKChsYXllcikgPT4gbGF5ZXIudGl0bGUpXG4gICAgICAgICAgICAgIDogKFtdIGFzIHN0cmluZ1tdKVxuICAgICAgICAgIH0gYXMgTGF5ZXJHcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXV0b09wdGlvbnM7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyQucGlwZShmaWx0ZXIoKG9wdCkgPT4gISFvcHQpKS5zdWJzY3JpYmUoKG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucykpO1xuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uZm9yRWFjaChcbiAgICAgICAgICAobGF5ZXIpID0+ICh0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlID8/ICdNSVNTSU5HIFRJVExFJ10gPSBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8ubWFwKChsYXllcikgPT4gKHtcbiAgICAgICAgICAuLi5sYXllcixcbiAgICAgICAgICBncm91cDogbGF5ZXIuZ3JvdXAgPz8gREVGQVVMVF9MQVlFUl9HUk9VUFxuICAgICAgICB9KSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLm1hcFVybCQgPSB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMubWFwVXJsKTtcblxuICAgIHRoaXMuYm90dG9tTGVmdCQgPSB0aGlzLndpZGdldFNpemUkLnBpcGUoXG4gICAgICBtYXAoKHNpemUpID0+IGB0cmFuc2xhdGUoMTBweCAsY2FsYygke3NpemUuaGVpZ2h0fXB4IC0gMTAwJSAtIDEwcHgpKWApLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcblxuICAgIHRoaXMuaXRlbVN0eWxlcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnJlc3VsdFNldCQsIHRoaXMubWFuaWZlc3QkLCB0aGlzLnN0YXRpY1Jlc3VsdFNldCRdKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKFtycywgbWFuaWZlc3QsIHNyc10pID0+IHtcbiAgICAgICAgaWYgKChtYW5pZmVzdC5kYXRhc291cmNlID09PSB1bmRlZmluZWQgfHwgbWFuaWZlc3QuZGF0YXNvdXJjZS5sZW5ndGggPT09IDApICYmICFzcnMpIHtcbiAgICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8e1xuICAgICAgICAgICAgICBbaWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICBjbGFzc2ljOiBTdHlsZTtcbiAgICAgICAgICAgICAgICBib3JkZXJlZDogU3R5bGU7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gT2JqZWN0LnZhbHVlcyhycy5pdGVtcykucmVkdWNlKChwLCBjKSA9PiBjLmxlbmd0aCArIHAsIDApO1xuICAgICAgICAgICAgICBpZiAodG90YWwgPT09IDApIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB7XG4gICAgICAgICAgICAgICAgW2lkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICAgICAgICBjbGFzc2ljOiBTdHlsZTtcbiAgICAgICAgICAgICAgICAgIGJvcmRlcmVkOiBTdHlsZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHJzLml0ZW1zKS5mb3JFYWNoKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltYm9sU2VydmljZS5nZXRTeW1ib2xBc0ljb25TdHlsZShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW1ib2xTZXJ2aWNlLmdldFN5bWJvbEFzSWNvblN0eWxlKGl0ZW0sIHRydWUpXG4gICAgICAgICAgICAgICAgICBdKS50aGVuKChbc3R5bGUsIGJTdHlsZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2l0ZW0uaWRdID0geyBjbGFzc2ljOiBzdHlsZSwgYm9yZGVyZWQ6IGJTdHlsZSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPj0gdG90YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuaGVpZ2h0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2lkZ2V0U2l6ZSQucGlwZShkZWJvdW5jZVRpbWUoMTAwKSksIHRoaXMuZGlzcGxheUhlYWRlciRdKS5waXBlKFxuICAgICAgbWFwKChbc2l6ZSwgZGlzcGxheV0pID0+IChzaXplLmhlaWdodCA/PyAxMDApIC0gKGRpc3BsYXkgPyBXSURHRVRfSEVBREVSX0hFSUdIVC52YWx1ZSA6IDApKSxcbiAgICAgIGRlbGF5KDEwKVxuICAgICk7XG5cbiAgICB0aGlzLmF0dHJpYnV0aW9ucyQgPSB0aGlzLm9wdGlvbnMkLnBpcGUobWFwKChvcHRpb25zKSA9PiAhIW9wdGlvbnMuYXR0cmlidXRpb25zKSk7XG5cbiAgICB0aGlzLmxlZ2VuZFRvcCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRpc3BsYXlIZWFkZXIkLCB0aGlzLmF0dHJpYnV0aW9ucyRdKS5waXBlKFxuICAgICAgbWFwKChbaGVhZGVyLCBhdHRyXSkgPT4gNSArIChoZWFkZXIgPyBXSURHRVRfSEVBREVSX0hFSUdIVC52YWx1ZSA6IDApICsgKGF0dHIgPyA2MSA6IDApKVxuICAgICk7XG5cbiAgICB0aGlzLmxlZ2VuZEhlaWdodCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpZGdldFNpemUkLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLCB0aGlzLmxlZ2VuZFRvcCRdKS5waXBlKFxuICAgICAgbWFwKChbc2l6ZSwgdG9wXSkgPT4ge1xuICAgICAgICByZXR1cm4gKHNpemUuaGVpZ2h0ID8/IDEwMCkgLSBXSURHRVRfSEVBREVSX0hFSUdIVC52YWx1ZSAtIHRvcCAtIDU2OyAvLyA1NnB4IGlzIHRoZSBwb3BpbiB0aXRsZSBoZWlnaHQgKyBtYXJnaW5cbiAgICAgIH0pLFxuICAgICAgZGVsYXkoMTApXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndtc0NhcGFiaWxpdGllcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKCh3bXNDYXBhYmlsaXRpZXMpID0+XG4gICAgICAgICAgICB3bXNDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyh3bXNDYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAgICAgICAubWFwKCh1cmwpID0+ICh7IHVybCwgbGF5ZXJzOiBYTUxVdGlscy5nZXRQb3NzaWJsZUxheWVyU3R5bGVzKHdtc0NhcGFiaWxpdGllc1t1cmxdPy5kb2MpIH0pKVxuICAgICAgICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gKHsgLi4ucCwgW2MudXJsXTogYyB9KSwge30pXG4gICAgICAgICAgICAgIDoge31cbiAgICAgICAgICApLFxuICAgICAgICAgIHN0YXJ0V2l0aCh7fSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChwb3NzaWJsZVN0eWxlcykgPT4gKHRoaXMucG9zc2libGVTdHlsZXMgPSBwb3NzaWJsZVN0eWxlcykpXG4gICAgKTtcblxuICAgIHRoaXMuaGFzU2xpZGVMYXllciQgPSB0aGlzLm9wdGlvbnMkLnBpcGUoXG4gICAgICBtYXAoKG9wdGlvbnMpID0+XG4gICAgICAgIChvcHRpb25zLmxheWVycyA/PyBbXSkubWFwKChsYXllcikgPT4gISFsYXllci5zbGlkZSAmJiBsYXllci5zbGlkZSAhPT0gJ2FsbCcpLnJlZHVjZSgoYSwgYikgPT4gYSB8fCBiLCBmYWxzZSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgaW5pdEludGVyYWN0aW9uTWFuYWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIuaW5pdCh0aGlzKTtcbiAgfVxuXG4gIGluaXRUb29sdGlwTWFuYWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwTWFuYWdlci5pbml0KFxuICAgICAgdGhpcy50b29sdGlwRmFjdG9yeVNlcnZpY2UsXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgdGhpcy5zdG9yZSxcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyxcbiAgICAgIHRoaXMud2lkZ2V0U2l6ZSQsXG4gICAgICB0aGlzLmRpc3BsYXlIZWFkZXIkLFxuICAgICAgdGhpcy5tYXAsXG4gICAgICB0aGlzLnBvcHVwLFxuICAgICAgdGhpcy5wb3B1cENvbnRlbnQsXG4gICAgICB0aGlzLmludGVyYWN0aW9uTWFuYWdlcixcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWFwID0gbmV3IE1hcCh7IHRhcmdldDogdGhpcy5tYXBSZWYubmF0aXZlRWxlbWVudCwgY29udHJvbHM6IGRlZmF1bHRzKHsgYXR0cmlidXRpb246IGZhbHNlIH0pIH0pO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyID0gdGhpcy5pbml0SW50ZXJhY3Rpb25NYW5hZ2VyKCk7XG4gICAgdGhpcy5sYXllclNsaWRlci5pbml0KHRoaXMubWFwLCB0aGlzLnNsaWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy50b29sdGlwTWFuYWdlciA9IHRoaXMuaW5pdFRvb2x0aXBNYW5hZ2VyKCk7XG4gICAgdGhpcy5tYXBTdHlsZVVybCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm9wdGlvbnMkLCB0aGlzLm1hcFVybCRdKS5waXBlKFxuICAgICAgbWFwKChbb3B0aW9ucywgdXJsXSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMuc3R5bGUpIHtcbiAgICAgICAgICBjYXNlIHRoaXMuTk9fU1RZTEU6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjYXNlIHRoaXMuU1RZTEVfRlJPTV9VUkw6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsZVVSTCA/PyAnJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGAke3VybH0vc3R5bGVzLyR7b3B0aW9ucy5zdHlsZX0vc3R5bGUuanNvbmA7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG5cbiAgICB0aGlzLm1hcFN0eWxlTGF5ZXIkID0gdGhpcy5tYXBTdHlsZVVybCQucGlwZShcbiAgICAgIG1hcCgoc3R5bGVVcmwpID0+IHtcbiAgICAgICAgaWYgKCFzdHlsZVVybCkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIG5ldyBNYXBib3hWZWN0b3JMYXllcih7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7IHRpdGxlOiAnYmFja2dyb3VuZCcgfSxcbiAgICAgICAgICAgIHN0eWxlVXJsXG4gICAgICAgICAgfSkgLyogLFxuICAgICAgICAgIG5ldyBUaWxlTGF5ZXIoe1xuICAgICAgICAgICAgc291cmNlOiBuZXcgVGlsZURlYnVnKClcbiAgICAgICAgICB9KSAqL1xuICAgICAgICBdO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChvcHRpb25zKSA9PiAoe1xuICAgICAgICAgICAgY2VudGVyOiBmcm9tTG9uTGF0KG9wdGlvbnMuY2VudGVyID8/IFdpZGdldE1hcFV0aWxzLkRFRkFVTFRfTUFQX0NFTlRFUiksXG4gICAgICAgICAgICBtYXhab29tOiBvcHRpb25zLnpvb20/Lm1heCA/PyBXaWRnZXRNYXBVdGlscy5ERUZBVUxUX1pPT01fTUFYLFxuICAgICAgICAgICAgbWluWm9vbTogb3B0aW9ucy56b29tPy5taW4gPz8gV2lkZ2V0TWFwVXRpbHMuREVGQVVMVF9aT09NX01JTixcbiAgICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbT8uc3RhcnQgPz8gV2lkZ2V0TWFwVXRpbHMuREVGQVVMVF9aT09NX1NUQVJUXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2aWV3KSA9PiB0aGlzLm1hcC5zZXRWaWV3KG5ldyBWaWV3KHZpZXcpKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChvcHRpb25zKSA9PiBvcHRpb25zLmF0dHJpYnV0aW9ucyksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGF0dHJpYnV0aW9ucykgPT4ge1xuICAgICAgICAgIGlmICghYXR0cmlidXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVDb250cm9sKHRoaXMuYXR0cmlidXRpb25zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXAuYWRkQ29udHJvbCh0aGlzLmF0dHJpYnV0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmxheWVycyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucmVzdWx0U2V0JCxcbiAgICAgIHRoaXMub3B0aW9ucyQsXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5hZGRpdGlvbmFsTGF5ZXJzJCxcbiAgICAgIHRoaXMuaXRlbVN0eWxlcyQsXG4gICAgICB0aGlzLmRhdGFzb3VyY2VGaWx0ZXJzJCxcbiAgICAgIHRoaXMuZmllbGRzJFxuICAgIF0pLnBpcGUoXG4gICAgICBmaWx0ZXIoXG4gICAgICAgIChbcmVzdWx0U2V0LCBvcHRpb25zLCBjbGFzc2VzLCBhZGRpdGlvbmFsTGF5ZXJzLCBpdGVtU3R5bGVzLCBmaWx0ZXJzLCBmaWVsZHNdKSA9PlxuICAgICAgICAgICEhcmVzdWx0U2V0ICYmICEhb3B0aW9ucyAmJiAhIWNsYXNzZXMgJiYgISFmaWVsZHNcbiAgICAgICksXG4gICAgICBtYXAoKFtyZXN1bHRTZXQsIG9wdGlvbnMsIGNsYXNzZXMsIGFkZGl0aW9uYWxMYXllcnMsIGl0ZW1TdHlsZXMsIGZpbHRlcnMsIGZpZWxkc10pID0+IHtcbiAgICAgICAgbGV0IGhhc1JlbGF0aW9uTGF5ZXIgPSBudWxsIGFzIHVua25vd24gYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPGFueT4+O1xuXG4gICAgICAgIGNvbnN0IGxheWVycyA9IChvcHRpb25zPy5sYXllcnMgfHwgW10pXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIChsYXllcikgPT4gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuZG9udE5lZWRMb2NhdGlvbi5pbmNsdWRlcyhsYXllci50eXBlKSB8fCAhIWxheWVyLmF0dHJpYnV0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgKGxheWVyKSA9PiB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS5kb250TmVlZEludGVuc2l0eS5pbmNsdWRlcyhsYXllci50eXBlKSB8fCAhIWxheWVyLmludGVuc2l0eUF0dHJpYnV0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBpZHgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzRm9yQ2xhc3MgPSBPYmplY3Qua2V5cyhyZXN1bHRTZXQuaXRlbXMpXG4gICAgICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+ICh7XG4gICAgICAgICAgICAgICAgY2xhc3NJZCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldEF0dHJpYnV0ZXNGb3JEcmF3aW5nKGNsYXNzZXMsIGNsYXNzSWQsIGxheWVyKVxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgICAgICAocCwgYykgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLnAsXG4gICAgICAgICAgICAgICAgICBbYy5jbGFzc0lkXTogY1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHt9IGFzIHtcbiAgICAgICAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5QXR0cmlidXRlOiBBdHRyaWJ1dGU7XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uQXR0cmlidXRlOiBBdHRyaWJ1dGU7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGxheWVyQ2xhc3Nlc0lkID0gY2xhc3Nlcy5tYXAoKGNsYXp6KSA9PiBjbGF6ei5pZCk7XG4gICAgICAgICAgICBpZiAoJ2NsYXNzZXMnIGluIGxheWVyICYmICEhbGF5ZXIuY2xhc3NlcyAmJiBsYXllci5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbGF5ZXJDbGFzc2VzSWQgPSBsYXllci5jbGFzc2VzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB7IG1pbjogMCwgbWF4OiAwIH07XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAoISFsYXllci5pbnRlbnNpdHlBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMocmVzdWx0U2V0Lml0ZW1zKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNsYXNzSWQpID0+XG4gICAgICAgICAgICAgICAgICByZXN1bHRTZXQuaXRlbXNbY2xhc3NJZF0ubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICBJdGVtVXRpbHMuZ2V0QXR0cmlidXRlQ2FsY3VsYXRlZFZhbHVlKGl0ZW0sIGF0dHJpYnV0ZXNGb3JDbGFzc1tpdGVtLm9DbGFzc10uaW50ZW5zaXR5QXR0cmlidXRlKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVkdWNlKChwLCBjKSA9PiBbLi4ucCwgLi4uY10sIFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIGFzIG51bWJlcltdO1xuXG4gICAgICAgICAgICAgIHJhbmdlID0gdmFsdWVzLnJlZHVjZSgocCwgYykgPT4gKHsgbWluOiBNYXRoLm1pbihwLm1pbiwgYyksIG1heDogTWF0aC5tYXgocC5tYXgsIGMpIH0pLCB7XG4gICAgICAgICAgICAgICAgbWluOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgICAgIG1heDogLU51bWJlci5NQVhfVkFMVUVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGltcGwgPSB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS5sYXllcnNJbXBsZW1lbnRhdGlvbltsYXllci50eXBlXTtcbiAgICAgICAgICAgIGlmICghIWltcGwpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0TGF5ZXIgPSBpbXBsKFxuICAgICAgICAgICAgICAgIGxheWVyIGFzIGFueSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzRm9yQ2xhc3MsXG4gICAgICAgICAgICAgICAgbGF5ZXJDbGFzc2VzSWQsXG4gICAgICAgICAgICAgICAgcmVzdWx0U2V0LFxuICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgIGl0ZW1TdHlsZXMsXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCdmaXQnLCBsYXllci5maXQpO1xuICAgICAgICAgICAgICByZXN1bHRMYXllci5zZXQoJ3R5cGUnLCBsYXllci50eXBlKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCdzbGlkZScsIGxheWVyLnNsaWRlKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCdvcmRlcicsIGxheWVyLm9yZGVyKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCdncm91cCcsIGxheWVyLmdyb3VwID8/IERFRkFVTFRfTEFZRVJfR1JPVVApO1xuICAgICAgICAgICAgICBjb25zdCBtYXhMYXllck9yZGVyID0gTWF0aC5tYXgoLi4uYXJyYXkubWFwKChsKSA9PiBsLm9yZGVyID8/IDApKTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0WkluZGV4KG1heExheWVyT3JkZXIgKyAxIC0gKGxheWVyLm9yZGVyID8/IGlkeCkpO1xuICAgICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ3JlbGF0aW9uJykge1xuICAgICAgICAgICAgICAgIGhhc1JlbGF0aW9uTGF5ZXIgPSByZXN1bHRMYXllciBhcyB1bmtub3duIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZT47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCd0aXRsZScsIGxheWVyLnRpdGxlKTtcblxuICAgICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcWxfZmlsdGVyID0gQ3FsVXRpbHMuZ2V0Q1FMUGFyYW1zRm9yKGxheWVyLmRhdGFzb3VyY2VJZCwgZmlsdGVycywgY2xhc3NlcywgZmllbGRzKTtcblxuICAgICAgICAgICAgICAgIGlmIChjcWxfZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAvLyBBZGRpbmcgQ1FMIHF1ZXJ5IHRvIGdlb3NlcnZlciBsYXllcnNcbiAgICAgICAgICAgICAgICAgIChyZXN1bHRMYXllciBhcyBUaWxlPFRpbGVXTVM+KS5nZXRTb3VyY2UoKSEudXBkYXRlUGFyYW1zKHsgY3FsX2ZpbHRlciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAobGF5ZXIuc2xpZGUgJiYgbGF5ZXIuc2xpZGUgIT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXllclNsaWRlci5hcHBseVNsaWRlKFxuICAgICAgICAgICAgICAgICAgbGF5ZXIuc2xpZGUsXG4gICAgICAgICAgICAgICAgICByZXN1bHRMYXllciBhcyB1bmtub3duIGFzIFRpbGVMYXllcjxhbnk+IHwgVmVjdG9yTGF5ZXI8YW55PiB8IEhlYXRtYXBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExheWVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTGF5ZXIgdHlwZSAke2xheWVyLnR5cGV9IGlzIHVua25vd25gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgdW5rbm93biBhcyBCYXNlTGF5ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gISFsYXllcik7XG5cbiAgICAgICAgaWYgKCEhaGFzUmVsYXRpb25MYXllcikge1xuICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gbGF5ZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gIShsYXllciBpbnN0YW5jZW9mIFRpbGUpKVxuICAgICAgICAgICAgLm1hcCgobGF5ZXIpID0+XG4gICAgICAgICAgICAgIGxheWVyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC5nZXRTb3VyY2UoKVxuICAgICAgICAgICAgICAgIC5nZXRGZWF0dXJlcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZmVhdHVyZXM6IEZlYXR1cmU8YW55PikgPT4gISFmZWF0dXJlcy5nZXQoJ2lkJykgfHwgISFmZWF0dXJlcy5nZXQoJ2ZlYXR1cmVzJykpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucmVkdWNlKChwLCBjKSA9PiBbLi4ucCwgLi4uY10sIFtdKTtcblxuICAgICAgICAgIHJlc3VsdFNldC5yZWxhdGlvbnMuZm9yRWFjaCgocmVsYXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGZlYXR1cmVzLmZpbmQoKGY6IEZlYXR1cmU8UG9pbnQgfCBDaXJjbGU+KSA9PiBmLmdldCgnaWQnKSA9PT0gcmVsYXRpb24uc291cmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBmZWF0dXJlcy5maW5kKChmOiBGZWF0dXJlPFBvaW50IHwgQ2lyY2xlPikgPT4gZi5nZXQoJ2lkJykgPT09IHJlbGF0aW9uLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgIGlmICghIXNvdXJjZSAmJiAhIWRlc3QpIHtcbiAgICAgICAgICAgICAgaGFzUmVsYXRpb25MYXllci5nZXRTb3VyY2UoKT8uYWRkRmVhdHVyZShXaWRnZXRNYXBVdGlscy5nZXRMaW5rRmVhdHVyZShyZWxhdGlvbiwgc291cmNlLCBkZXN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGF5ZXJzLnB1c2goLi4uYWRkaXRpb25hbExheWVycyk7XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZUxheWVycyA9IG9wdGlvbnMubGF5ZXJHcm91cHMhLm1hcCgoZ3JvdXApID0+IGdyb3VwLnZpc2libGVMYXllcnMpLmZsYXQoKTtcbiAgICAgICAgbGF5ZXJzLmZvckVhY2goKGxheWVyLCBpZHgpID0+IHtcbiAgICAgICAgICBpZiAoIXZpc2libGVMYXllcnMuaW5jbHVkZXMobGF5ZXIuZ2V0KCd0aXRsZScpKSkge1xuICAgICAgICAgICAgbGF5ZXIuc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBSZXNvbHZlIGJ1ZyBkcmF3aW5nIHdlYmdsbGF5ZXIgd2l0aG91dCBub3RoaW5nIHVuZGVybmVhdGg6IGFkZCBlbXB0eSBsYXllciBiZWxvdyAqL1xuICAgICAgICBjb25zdCBfbGF5ZXJzID0gdGhpcy5hZGRFbXB0eVdlYkdsTGF5ZXJCZWxvd1NsaWRlSGVhdG1hcHMobGF5ZXJzKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0xheWVycy5wdXNoKC4uLl9sYXllcnMpO1xuICAgICAgICByZXR1cm4gX2xheWVycztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuZml0RXh0ZW50cyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMub3B0aW9ucyQsXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5kYXRhc291cmNlRmlsdGVycyQsXG4gICAgICB0aGlzLndtc0NhcGFiaWxpdGllcyRcbiAgICBdKS5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDEwMCksXG4gICAgICBzd2l0Y2hNYXAoKFtvcHRpb25zLCBjbGFzc2VzLCBmaWx0ZXJzLCB3bXNDYXBhYmlsaXRpZXNdKSA9PlxuICAgICAgICAob3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbmQoKGxheWVyKSA9PiBbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKSAmJiBsYXllci5maXQpXG4gICAgICAgICAgPyBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgLi4uKChvcHRpb25zLmxheWVycz8uZmlsdGVyKChsYXllcikgPT4gbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcicpID8/IFtdKSBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNbXSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZml0KVxuICAgICAgICAgICAgICAgIC5tYXAoKGxheWVyOiBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMpID0+XG4gICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuZmluZCgoY2xhenopID0+IGNsYXp6LmlkID09PSBsYXllci5vQ2xhc3MpID8/ICh7IGF0dHJpYnV0ZXM6IFtdIH0gYXMgdW5rbm93biBhcyBDbGFzcylcbiAgICAgICAgICAgICAgICAgICkuYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiBHZW9tZXRyaWNGaWVsZFR5cGVzLmluY2x1ZGVzKGF0dHIuZmllbGQudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGF0dHIpID0+XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcnlBZ2dyZWdhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZ2dyZWdhdGUoW2xheWVyLmRhdGFzb3VyY2VJZF0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkaW5hdGU6IHsgb3BlcmF0aW9uOiBPcGVyYXRpb24uRVhURU5ULCBhdHRyaWJ1dGU6IGF0dHIuaWQsIGxhYmVsOiBhdHRyLm5hbWUsIGtlZXAwOiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIENoYXJ0QWdncmVnYXRlZFdpZGdldE9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChleHRlbnRSZXNwb25zZTogQWdncmVnYXRpb25SZXN1bHQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0TWFwVXRpbHMucHJvamVjdEV4dGVudEFnZ3JlZ2F0aW9uUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmZpZWxkISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudFJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bXNDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IGRhdGFzb3VyY2U6IGxheWVyLmRhdGFzb3VyY2VJZCwgZXh0ZW50OiBbXSwgZXJyb3I6IHRydWUgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZmxhdCgpLFxuICAgICAgICAgICAgICAuLi4oKG9wdGlvbnMubGF5ZXJzPy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci50eXBlID09PSAnd21zJykgPz8gW10pIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmZpdClcbiAgICAgICAgICAgICAgICAubWFwKChsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVudCA9IFhNTFV0aWxzLmdldExheWVyRXh0ZW50KGxheWVyLnBhcmFtTGF5ZXIsIHRoaXMubWFwLCB3bXNDYXBhYmlsaXRpZXMhW2xheWVyLnVybF0/LmRvYyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhc291cmNlOiBgd21zLSR7bGF5ZXIucGFyYW1MYXllcn1gLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnQ6IGV4dGVudCA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICFleHRlbnRcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIDogb2YoW10pXG4gICAgICApLFxuICAgICAgc3RhcnRXaXRoKFxuICAgICAgICBbXSBhcyB7XG4gICAgICAgICAgZGF0YXNvdXJjZTogc3RyaW5nO1xuICAgICAgICAgIGV4dGVudDogQ29vcmRpbmF0ZVtdO1xuICAgICAgICAgIGVycm9yOiBib29sZWFuO1xuICAgICAgICB9W11cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5sZWdlbmRMYXllcnMkID0gdGhpcy5vcHRpb25zJC5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAob3B0aW9ucykgPT5cbiAgICAgICAgICAob3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+IFsnZ2Vvc2VydmVyJywgJ3dtcyddLmluY2x1ZGVzKGxheWVyLnR5cGUpKSBhcyAoXG4gICAgICAgICAgICB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1xuICAgICAgICAgICAgfCBNYXBXTVNMYXllckxheWVyT3B0aW9uc1xuICAgICAgICAgIClbXVxuICAgICAgKSxcbiAgICAgIGRlbGF5KDEwKVxuICAgICk7XG5cbiAgICB0aGlzLmxheWVyc1RvcCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmxlZ2VuZFRvcCQsIHRoaXMubGVnZW5kTGF5ZXJzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtsZWdlbmRUb3AsIGxheWVyc10pID0+IGxlZ2VuZFRvcCArICgobGF5ZXJzLmxlbmd0aCA/PyAwKSA+IDAgPyA1MCA6IDApKVxuICAgICk7XG5cbiAgICB0aGlzLmxheWVyc0hlaWdodCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpZGdldFNpemUkLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLCB0aGlzLmxheWVyc1RvcCRdKS5waXBlKFxuICAgICAgbWFwKChbc2l6ZSwgdG9wXSkgPT4ge1xuICAgICAgICByZXR1cm4gKHNpemUuaGVpZ2h0ID8/IDEwMCkgLSBXSURHRVRfSEVBREVSX0hFSUdIVC52YWx1ZSAtIHRvcCAtIDUwOyAvLyA1MHB4IGFjdHMgYXMgYm90dG9tIG1hcmdpblxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMubGF5ZXJzVG9wJCwgdGhpcy5sZWdlbmRMYXllcnMkLCB0aGlzLm9sWm9vbUVsZW1lbnQkLCB0aGlzLmRpc3BsYXlIZWFkZXIkXSlcbiAgICAgICAgLnBpcGUod2l0aExhdGVzdEZyb20odGhpcy5sYXllcnMkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW1tsYXllcnNUb3AsIGxlZ2VuZCwgem9vbUVsZW1lbnQsIGRpc3BsYXlIZWFkZXJdLCBsYXllcnNdKSA9PiB7XG4gICAgICAgICAgaWYgKHpvb21FbGVtZW50KSB7XG4gICAgICAgICAgICB6b29tRWxlbWVudC5zdHlsZS50b3AgPSBgJHtcbiAgICAgICAgICAgICAgbGF5ZXJzVG9wICtcbiAgICAgICAgICAgICAgKChsZWdlbmQubGVuZ3RoID8/IDApID4gMCB8fCBsYXllcnMubGVuZ3RoID4gMCA/IDIwIDogMCkgK1xuICAgICAgICAgICAgICAoIWRpc3BsYXlIZWFkZXIgPyBXSURHRVRfSEVBREVSX0hFSUdIVC52YWx1ZSA6IDApXG4gICAgICAgICAgICB9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLm1hcFN0eWxlTGF5ZXIkLFxuICAgICAgICB0aGlzLmxheWVycyQsXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKSksXG4gICAgICAgIHRoaXMuZml0RXh0ZW50cyQsXG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZUZpbHRlcnMkXG4gICAgICBdKS5zdWJzY3JpYmUoKFttYXBTdHlsZUxheWVyLCBsYXllcnMsIHNlbGVjdGVkSWRzLCBleHRlbnRzLCBmaWx0ZXJzXSkgPT4ge1xuICAgICAgICBjb25zdCBuZWVkZWRDYWxjdWxhdGVkRXh0ZW50cyA9IGxheWVycy5maWx0ZXIoXG4gICAgICAgICAgKGxheWVyKSA9PiBbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci5nZXQoJ3R5cGUnKSkgJiYgbGF5ZXIuZ2V0KCdmaXQnKVxuICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmJDYWxjdWxhdGVkRXh0ZW50cyA9IGV4dGVudHMuZmlsdGVyKChleHRlbnQpID0+ICFleHRlbnQuZXJyb3IpLmxlbmd0aDtcblxuICAgICAgICBpZiAobmJDYWxjdWxhdGVkRXh0ZW50cyA+PSBuZWVkZWRDYWxjdWxhdGVkRXh0ZW50cykge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG9BcHBseUxheWVycyA9IFsuLi5sYXllcnMsIC4uLm1hcFN0eWxlTGF5ZXJdO1xuICAgICAgICAgICAgdGhpcy5tYXAuc2V0TGF5ZXJzKHRvQXBwbHlMYXllcnMpO1xuXG4gICAgICAgICAgICB0aGlzLmZpdE1hcEZvck9iamVjdHMoc2VsZWN0ZWRJZHMsIGV4dGVudHMpO1xuICAgICAgICAgICAgdGhpcy5tYXAudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgICAgICB0aGlzLm1hcFxuICAgICAgICAgICAgICAuZ2V0QWxsTGF5ZXJzKClcbiAgICAgICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEobGF5ZXIgaW5zdGFuY2VvZiBUaWxlKSlcbiAgICAgICAgICAgICAgLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0RmVhdHVyZXMgPSAobGF5ZXIuZ2V0U291cmNlKCkgYXMgVmVjdG9yU291cmNlKT8uZ2V0RmVhdHVyZXM7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBnZXRGZWF0dXJlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgKGxheWVyLmdldFNvdXJjZSgpIGFzIFZlY3RvclNvdXJjZSk/LmdldEZlYXR1cmVzKCkuZm9yRWFjaCgoZmVhdHVyZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBmZWF0dXJlLmdldCgndHlwZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgWydidWJibGUnLCAnbWFya2VyJywgJ3BvaW50JywgJ2xpbmUnLCAncG9seWdvbicsICdtdWx0aS1saW5lJywgJ211bHRpLXBvbHlnb24nXS5pbmNsdWRlcyh0eXBlKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5nZXQoc2VsZWN0ZWRJZHMuaW5jbHVkZXMoZmVhdHVyZS5nZXQoJ2lkJykpID8gJ3NlbGVjdGVkU3R5bGUnIDogJ2NsYXNzaWNTdHlsZScpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubWFwLnNldExheWVycyhbLi4ubWFwU3R5bGVMYXllcl0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZEVtcHR5V2ViR2xMYXllckJlbG93U2xpZGVIZWF0bWFwcyhsYXllcnM6IEJhc2VMYXllcltdKSB7XG4gICAgY29uc3QgX2xheWVycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsYXllciA9IGxheWVyc1tpXTtcbiAgICAgIF9sYXllcnMucHVzaChsYXllcik7XG4gICAgICBpZiAobGF5ZXIuZ2V0KCd0eXBlJykgPT09ICdoZWF0bWFwJyAmJiBsYXllci5nZXQoJ3NsaWRlJykpIHtcbiAgICAgICAgY29uc3QgZW1wdHlEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMjU2ICogMjU2ICogNCk7XG4gICAgICAgIGNvbnN0IGVtcHR5TGF5ZXIgPSBuZXcgV2ViR0xUaWxlTGF5ZXIoe1xuICAgICAgICAgIHNvdXJjZTogbmV3IERhdGFUaWxlKHtcbiAgICAgICAgICAgIGxvYWRlcigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5RGF0YTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhab29tOiAwLFxuICAgICAgICAgICAgd3JhcFg6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgICAgX2xheWVycy5wdXNoKGVtcHR5TGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX2xheWVycztcbiAgfVxuXG4gIG92ZXJyaWRlIGluaXRSZXN1bHRTZXQkKCkge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5yZXN1bHRTZXRzKSxcbiAgICAgIHRoaXMuZGF0YXNvdXJjZUlkcyQsXG4gICAgICB0aGlzLnN0YXRpY1Jlc3VsdFNldCQsXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXRhU291cmNlU2VsZWN0b3JzLmRhdGFzZXRzKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtyZXN1bHRTZXRzLCByZXN1bHRTZXROYW1lc0FycmF5LCBzdGF0aWNSZXN1bHRTZXQsIGRlZmluaXRpb25zXSkgPT4ge1xuICAgICAgICBpZiAoISFzdGF0aWNSZXN1bHRTZXQpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGljUmVzdWx0U2V0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdFNldEFycmF5ID0gcmVzdWx0U2V0TmFtZXNBcnJheVxuICAgICAgICAgIC5maWx0ZXIoKHJzTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zLmZpbmQoKGRzZCkgPT4gZHNkLmlkID09PSByc05hbWUpIGFzIERhdGFzZXQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gIWRlZmluaXRpb24gfHwgIShkZWZpbml0aW9uLm1ldGFkYXRhID8/IFtdKS5maW5kKChtZXRhKSA9PiBtZXRhLm1ldGFkYXRhRGVmLm5hbWUgPT09ICdfZ2VvS2V5Jyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKChyc05hbWUpID0+IHJlc3VsdFNldHNbcnNOYW1lID8/ICcnXSlcbiAgICAgICAgICAuZmlsdGVyKChyc05hbWUpID0+ICEhcnNOYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFNldEFycmF5LnJlZHVjZSgocnMxLCByczIpID0+IFJlc3VsdHNldFV0aWxzLm1lcmdlUmVzdWx0U2V0cyhyczEsIHJzMiksIHtcbiAgICAgICAgICBpdGVtczoge30sXG4gICAgICAgICAgcmVsYXRpb25zOiBbXSxcbiAgICAgICAgICBtZXJnZWQ6IHJlc3VsdFNldEFycmF5Lmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIHYpID0+IGVxdWFsKHAsIHYpKVxuICAgICk7XG4gIH1cblxuICBzZXREZWZhdWx0TGF5ZXJUaXRsZShcbiAgICBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgY2FwYWJpbGl0aWVzOlxuICAgICAgfCB7XG4gICAgICAgICAgW3A6IHN0cmluZ106IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlIHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgaWYgKCFsYXllci50aXRsZSkge1xuICAgICAgaWYgKFsnZ2Vvc2VydmVyJywgJ3dtcyddLmluY2x1ZGVzKGxheWVyLnR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGdlb0xheWVyID0gbGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxheWVyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzID8gY2FwYWJpbGl0aWVzW2dlb0xheWVyLnVybF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGxheWVyQ2FwYWJpbGl0aWVzKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hpbmdMYXllciA9IFhNTFV0aWxzLmdldE1hdGNoaW5nTGF5ZXIoZ2VvTGF5ZXIucGFyYW1MYXllciwgbGF5ZXJDYXBhYmlsaXRpZXMuZG9jKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdMYXllcikge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdUaXRsZSA9IFhNTFV0aWxzLmZpbmQobWF0Y2hpbmdMYXllci5jaGlsZE5vZGVzLCAnVGl0bGUnKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1RpdGxlKSB7XG4gICAgICAgICAgICAgIGxheWVyLnRpdGxlID1cbiAgICAgICAgICAgICAgICAhIW1hdGNoaW5nVGl0bGUudGV4dENvbnRlbnQgJiYgbWF0Y2hpbmdUaXRsZS50ZXh0Q29udGVudC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICA/IG1hdGNoaW5nVGl0bGUudGV4dENvbnRlbnRcbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXllci50aXRsZSA9IGdlb0xheWVyLnBhcmFtTGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheWVyLnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYEBwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUuJHtsYXllci50eXBlfWAsIHsgLi4ubGF5ZXIgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZml0TWFwRm9yT2JqZWN0cyhcbiAgICBzZWxlY3RlZElkcz86IHN0cmluZ1tdLFxuICAgIGV4dGVudHM6IHtcbiAgICAgIGRhdGFzb3VyY2U6IHN0cmluZztcbiAgICAgIGV4dGVudDogQ29vcmRpbmF0ZVtdO1xuICAgIH1bXSA9IFtdXG4gICkge1xuICAgIGxldCBleHRlbnQgPSBjcmVhdGVFbXB0eSgpO1xuICAgIGNvbnN0IGxpc3RPZk1hcmtlcnMgPSBbXSBhcyBhbnlbXTtcblxuICAgIC8qIE1hbmRhdG9yeSBmaXQgKi9cbiAgICB0aGlzLm1hcFxuICAgICAgLmdldEFsbExheWVycygpXG4gICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0UHJvcGVydGllcygpWydmaXQnXSlcbiAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiAhIWxheWVyLmdldFNvdXJjZSAmJiAhIWxheWVyLmdldFNvdXJjZSgpICYmICEhKGxheWVyLmdldFNvdXJjZSgpIGFzIFZlY3RvclNvdXJjZSkuZ2V0RmVhdHVyZXMpXG4gICAgICAuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgKGxheWVyLmdldFNvdXJjZSgpIGFzIFZlY3RvclNvdXJjZSkuZ2V0RmVhdHVyZXMoKS5mb3JFYWNoKChmZWF0dXJlOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGZlYXR1cmUuZ2V0KCdpZCcpO1xuICAgICAgICAgIGlmICghc2VsZWN0ZWRJZHMgfHwgc2VsZWN0ZWRJZHMubGVuZ3RoIDw9IDAgfHwgKHNlbGVjdGVkSWRzLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRJZHMuaW5jbHVkZXMoaWQpKSkge1xuICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlLmdldCgndHlwZScpKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ2hlYXRwb2ludCc6XG4gICAgICAgICAgICAgIGNhc2UgJ3BvaW50JzpcbiAgICAgICAgICAgICAgY2FzZSAnbWFya2VyJzpcbiAgICAgICAgICAgICAgICBsaXN0T2ZNYXJrZXJzLnB1c2goZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldENvb3JkaW5hdGVzKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdsaW5lJzpcbiAgICAgICAgICAgICAgY2FzZSAnbGluayc6XG4gICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKC4uLmZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDb29yZGluYXRlcygpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAncG9seWdvbic6XG4gICAgICAgICAgICAgIGNhc2UgJ211bHRpLWxpbmUnOlxuICAgICAgICAgICAgICAgIGxpc3RPZk1hcmtlcnMucHVzaCguLi5mZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKS5mbGF0KCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdtdWx0aS1wb2x5Z29uJzpcbiAgICAgICAgICAgICAgICBsaXN0T2ZNYXJrZXJzLnB1c2goLi4uZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldENvb3JkaW5hdGVzKCkuZmxhdCgpLmZsYXQoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbGlzdE9mTWFya2Vycy5wdXNoKGZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRDZW50ZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFeHRlbnQgPSBib3VuZGluZ0V4dGVudChcbiAgICAgIGxpc3RPZk1hcmtlcnMuZmlsdGVyKChjb29yZCkgPT4gISFjb29yZCkuY29uY2F0KC4uLmV4dGVudHMubWFwKChleHRlbnQpID0+IGV4dGVudC5leHRlbnQpKVxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBzZWxlY3RlZEV4dGVudFswXSAhPT0gSW5maW5pdHkgJiZcbiAgICAgIHNlbGVjdGVkRXh0ZW50WzFdICE9PSBJbmZpbml0eSAmJlxuICAgICAgc2VsZWN0ZWRFeHRlbnRbMl0gIT09IC1JbmZpbml0eSAmJlxuICAgICAgc2VsZWN0ZWRFeHRlbnRbM10gIT09IC1JbmZpbml0eVxuICAgICkge1xuICAgICAgZXh0ZW50ID0gc2VsZWN0ZWRFeHRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGV4dGVudFswXSAhPT0gSW5maW5pdHkgJiYgZXh0ZW50WzFdICE9PSBJbmZpbml0eSAmJiBleHRlbnRbMl0gIT09IC1JbmZpbml0eSAmJiBleHRlbnRbM10gIT09IC1JbmZpbml0eSkge1xuICAgICAgdGhpcy5tYXAuZ2V0VmlldygpLmZpdChleHRlbnQsIHsgcGFkZGluZzogWzIwLCAyMCwgNzAsIDcwXSwgZHVyYXRpb246IDIwMCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEF0dHJpYnV0ZXNGb3JEcmF3aW5nKGNsYXNzZXM6IENsYXNzW10sIGNsYXNzSWQ6IHN0cmluZywgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGNsYXNzT2JqID0gY2xhc3Nlcy5maW5kKChjbCkgPT4gY2wuaWQgPT09IGNsYXNzSWQpID8/ICh7IGF0dHJpYnV0ZXM6IFtdIGFzIEF0dHJpYnV0ZVtdIH0gYXMgQ2xhc3MpO1xuICAgIGNvbnN0IGxvY2F0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRMb2NhdGlvbkF0dHJpYnV0ZShjbGFzc09iaiwgbGF5ZXIpO1xuICAgIGNvbnN0IGludGVuc2l0eUF0dHJpYnV0ZSA9IHRoaXMuZ2V0SW50ZW5zaXR5QXR0cmlidXRlKFxuICAgICAgY2xhc3NPYmosXG4gICAgICBsYXllciBhcyBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zXG4gICAgKTtcbiAgICByZXR1cm4geyBsb2NhdGlvbkF0dHJpYnV0ZSwgaW50ZW5zaXR5QXR0cmlidXRlIH07XG4gIH1cblxuICBwcml2YXRlIGdldEludGVuc2l0eUF0dHJpYnV0ZShcbiAgICBjbGFzc09iajogQ2xhc3MgfCB1bmRlZmluZWQsXG4gICAgbGF5ZXI6IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChjbGFzc09iaiB8fCB7IGF0dHJpYnV0ZXM6IFtdIH0pLmF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci50ZWNobmljYWxOYW1lID09PSBsYXllcj8uaW50ZW5zaXR5QXR0cmlidXRlKSA/P1xuICAgICAgKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIEF0dHJpYnV0ZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhdGlvbkF0dHJpYnV0ZShjbGFzc09iajogQ2xhc3MsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpOiBBdHRyaWJ1dGUge1xuICAgIHR5cGUgbGF5ZXJzID0gTWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucztcbiAgICBjb25zdCBzcGVjaWZpY0xheWVyID0gbGF5ZXIgYXMgbGF5ZXJzO1xuICAgIHJldHVybiAoXG4gICAgICBjbGFzc09iai5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIudGVjaG5pY2FsTmFtZSA9PT0gc3BlY2lmaWNMYXllcj8uYXR0cmlidXRlKSA/P1xuICAgICAgKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIEF0dHJpYnV0ZSlcbiAgICApO1xuICB9XG5cbiAgY2hhbmdlU3R5bGUoJGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LnN0eWxlID0gJGV2ZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LnN0eWxlICE9PSB0aGlzLlNUWUxFX0ZST01fVVJMKSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zQ29weS5zdHlsZVVSTDtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTdHlsZVVSTCgkZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMub3B0aW9uc0NvcHkuc3R5bGVVUkwgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VGaXQoJGV2ZW50OiBib29sZWFuLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgbGF5ZXIuZml0ID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlU2xpZGUoJGV2ZW50OiB1bmRlZmluZWQgfCAnbGVmdCcgfCAncmlnaHQnLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgbGF5ZXIuc2xpZGUgPSAkZXZlbnQ7XG4gIH1cblxuICBjaGFuZ2VBdHRyaWJ1dGlvbnMoJGV2ZW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5hdHRyaWJ1dGlvbnMgPSAkZXZlbnQ7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkuYXR0cmlidXRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uZm9yRWFjaCgobGF5ZXIpID0+IChsYXllci5hdHRyaWJ1dGlvbiA9ICcnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5mb3JFYWNoKChsYXllcikgPT4gZGVsZXRlIGxheWVyLmF0dHJpYnV0aW9uKTtcbiAgICB9XG4gIH1cblxuICBhZGRMYXllcihncm91cDogTGF5ZXJHcm91cCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5sYXllcnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gW107XG4gICAgfVxuICAgIGNvbnN0IHRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYEBwcnkud2lkZ2V0Lm1hcC5sYXllcmAsIHsgaW5kZXg6IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLmxlbmd0aCArIDEgfSk7XG5cbiAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJycsXG4gICAgICBncm91cDogZ3JvdXAubmFtZSxcbiAgICAgIHRpdGxlLFxuICAgICAgdHlwZTogJ21hcmtlcidcbiAgICB9KTtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW3RpdGxlXSA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJHcm91cChncm91cCwgdW5kZWZpbmVkLCB0aXRsZSk7XG4gICAgdGhpcy51cGRhdGVMYXllck9yZGVyKCk7XG4gIH1cblxuICBjaGFuZ2VMYXllclR5cGUoJGV2ZW50OiBhbnksIGk6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5sYXllcnMpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPz8gW107XG4gICAgfVxuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUgPSAkZXZlbnQ7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUgPT09ICd3bXMnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0gYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnM7XG4gICAgICBvcHRpb25zLnBhcmFtTGF5ZXIgPSBvcHRpb25zLnBhcmFtTGF5ZXIgPz8gJyc7XG4gICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMudXJsID8/ICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0udHlwZSA9PT0gJ3dtdHMnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0gYXMgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucy5wYXJhbUxheWVyID0gb3B0aW9ucy5wYXJhbUxheWVyID8/ICcnO1xuICAgICAgb3B0aW9ucy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUgPz8gJyc7XG4gICAgICBvcHRpb25zLm1hdHJpeFNldCA9IG9wdGlvbnMubWF0cml4U2V0ID8/ICcnO1xuICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCA/PyAnJztcbiAgICB9XG4gICAgaWYgKFsnZmVhdHVyZWxheWVyJywgJ3ZlY3RvcnRpbGUnLCAncmFzdGVydGlsZSddLmluY2x1ZGVzKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUpKSB7XG4gICAgICBsZXQgb3B0aW9uczogTWFwRmVhdHVyZUxheWVyT3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXSBhcyBNYXBGZWF0dXJlTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCA/PyAnJztcbiAgICB9XG4gIH1cblxuICB1cGRhdGVMYXllckdyb3VwU2luZ2xlTGF5ZXIoZ3JvdXA6IExheWVyR3JvdXAsIHNpbmdsZUxheWVyOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVMYXllckdyb3VwKGdyb3VwLCBzaW5nbGVMYXllciwgc2luZ2xlTGF5ZXIgPyBbZ3JvdXAudmlzaWJsZUxheWVyc1swXV0gOiBncm91cC52aXNpYmxlTGF5ZXJzKTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyR3JvdXAoZ3JvdXA6IExheWVyR3JvdXAgfCBzdHJpbmcsIHNpbmdsZUxheWVyPzogYm9vbGVhbiwgdmlzaWJsZUxheWVycz86IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgbGF5ZXJHcm91cCA9IHR5cGVvZiBncm91cCA9PT0gJ3N0cmluZycgPyB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5maW5kKChnKSA9PiBnLm5hbWUgPT09IGdyb3VwKSA6IGdyb3VwO1xuICAgIGNvbnN0IGdyb3VwSW5kZXggPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5maW5kSW5kZXgoKGcpID0+IGcubmFtZSA9PT0gbGF5ZXJHcm91cCEubmFtZSk7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMhLm1hcCgoZywgaSkgPT5cbiAgICAgIGkgPT09IGdyb3VwSW5kZXhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5nLFxuICAgICAgICAgICAgc2luZ2xlTGF5ZXI6IHNpbmdsZUxheWVyID8/IGxheWVyR3JvdXAhLnNpbmdsZUxheWVyLFxuICAgICAgICAgICAgdmlzaWJsZUxheWVyczpcbiAgICAgICAgICAgICAgdHlwZW9mIHZpc2libGVMYXllcnMgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBbLi4ubGF5ZXJHcm91cCEudmlzaWJsZUxheWVycywgdmlzaWJsZUxheWVyc11cbiAgICAgICAgICAgICAgICA6IHZpc2libGVMYXllcnMgPz8gbGF5ZXJHcm91cCEudmlzaWJsZUxheWVyc1xuICAgICAgICAgIH1cbiAgICAgICAgOiBnXG4gICAgKTtcbiAgfVxuXG4gIGNoYW5nZVRpdGxlKCRldmVudDogRXZlbnQsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgY29uc3QgbmV3VGl0bGUgPSAoJGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy51cGRhdGVMYXllckdyb3VwKFxuICAgICAgZ3JvdXAsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLm9wdGlvbnNDb3B5XG4gICAgICAgIC5sYXllckdyb3VwcyEuZmlsdGVyKChnKSA9PiBnLm5hbWUgPT09IGdyb3VwLm5hbWUpXG4gICAgICAgIC5tYXAoKGcsIGkpID0+IGcudmlzaWJsZUxheWVycy5tYXAoKGwpID0+IChsID09PSBsYXllci50aXRsZSA/IG5ld1RpdGxlIDogbCkpKVxuICAgICAgICAuZmxhdCgpXG4gICAgKTtcbiAgICBkZWxldGUgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdO1xuICAgIGxheWVyLnRpdGxlID0gbmV3VGl0bGU7XG4gICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtuZXdUaXRsZV0gPSB0cnVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgZW1pdE1hbmlmZXN0KCkge1xuICAgIHRoaXMucmVtb3ZlRW1wdHlMYXllckdyb3VwcygpO1xuICAgIHRoaXMubWFuaWZlc3RNb2RpZmllZC5lbWl0KHtcbiAgICAgIHdpZGdldEluZGV4OiB0aGlzLndpZGdldEluZGV4LFxuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgb3B0aW9uczogeyAuLi50aGlzLm9wdGlvbnNDb3B5LCBsYXllcnM6ICh0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA/PyBbXSkuZmlsdGVyKChsYXllcikgPT4gISFsYXllci50eXBlKSB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VMb2NhdGlvbkF0dHJpYnV0ZXMoJGV2ZW50OiBhbnksIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuYXR0cmlidXRlID0gJGV2ZW50O1xuICB9XG5cbiAgbGF5ZXJIYXNJbnRlbnNpdHkobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucyk6IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnMge1xuICAgIHJldHVybiA8TWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucz5sYXllcjtcbiAgfVxuXG4gIGNoYW5nZUludGVuc2l0eUF0dHJpYnV0ZXMoJGV2ZW50OiBhbnksIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBsYXllcl8gPSA8TWFwV2lkZ2V0SGVhdE1hcExheWVyT3B0aW9ucyB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucz5sYXllcjtcbiAgICBsYXllcl8uaW50ZW5zaXR5QXR0cmlidXRlID0gJGV2ZW50O1xuICB9XG5cbiAgY2hhbmdlQ2xhc3NlcygkZXZlbnQ6IHN0cmluZ1tdLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3Qgc3BlY2lmaWNMYXllciA9IGxheWVyIGFzXG4gICAgICB8IE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFdpZGdldEJ1YmJsZUxheWVyT3B0aW9ucztcbiAgICBzcGVjaWZpY0xheWVyLmNsYXNzZXMgPSAkZXZlbnQ7XG4gIH1cblxuICBkZWxldGVMYXllcihpOiBudW1iZXIsIGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weT8ubGF5ZXJzPy5zcGxpY2UoaSwgMSk7XG4gICAgdGhpcy51cGRhdGVMYXllckdyb3VwKFxuICAgICAgZ3JvdXAsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBncm91cC52aXNpYmxlTGF5ZXJzLmZpbHRlcigobCkgPT4gbCAhPT0gbGF5ZXIudGl0bGUpXG4gICAgKTtcbiAgICB0aGlzLnJlbW92ZUVtcHR5TGF5ZXJHcm91cHMoKTtcbiAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2F1dG8nKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllciA9IFsuLi4odGhpcy5vcHRpb25zQ29weS5pZ25vcmVBdXRvTGF5ZXIgPz8gW10pLCBsYXllci5rZXkgKyAnLScgKyBsYXllci5zdWJUeXBlXTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VVcmwoXG4gICAgJGV2ZW50OiBFdmVudCxcbiAgICBsYXllcjpcbiAgICAgIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwRmVhdHVyZUxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBWZWN0b3JUaWxlTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFJhc3RlclRpbGVMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1xuICApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIudXJsID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlQXR0cmlidXRpb24oJGV2ZW50OiBFdmVudCwgbGF5ZXI6IEJhc2VXaWRnZXRNYXBMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuYXR0cmlidXRpb24gPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VQYXJhbUxheWVyKCRldmVudDogRXZlbnQsIGxheWVyOiBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcFdNVFNMYXllckxheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5wYXJhbUxheWVyID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlUGFyYW1UaWxlZCgkZXZlbnQ6IGJvb2xlYW4sIGxheWVyOiBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucykge1xuICAgIGxheWVyLnBhcmFtVGlsZWQgPSAkZXZlbnQ7XG4gICAgdGhpcy50b29sdGlwTWFuYWdlci5jbGVhclRvb2x0aXAoKTtcbiAgfVxuXG4gIGNoYW5nZU1hdHJpeFNldCgkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLm1hdHJpeFNldCA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZVBhcmFtU3R5bGUoJGV2ZW50OiBFdmVudCwgbGF5ZXI6IE1hcFdNVFNMYXllckxheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5zdHlsZSA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGV4cG9ydCgpIHtcbiAgICBXaWRnZXRNYXBVdGlscy5leHBvcnRNYXBBc0ltYWdlKHRoaXMubWFwLCAnbWFwLnBuZycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9JbWFnZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBXaWRnZXRNYXBVdGlscy5nZXRNYXBBc1BuZyh0aGlzLm1hcCk7XG4gIH1cblxuICBjaGFuZ2VDbHVzdGVyZWQobGF5ZXI6IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucywgJGV2ZW50OiBib29sZWFuKSB7XG4gICAgbGF5ZXIuY2x1c3RlcmVkID0gJGV2ZW50O1xuICAgIGlmIChsYXllci5jbHVzdGVyZWQpIHtcbiAgICAgIGxheWVyLmNsdXN0ZXJEaXN0YW5jZSA9IDEwO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUNsdXN0ZXJEaXN0YW5jZShsYXllcjogTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zLCAkZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLmNsdXN0ZXJEaXN0YW5jZSA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZU9wYWNpdHkobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgJGV2ZW50OiBzdHJpbmcpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIub3BhY2l0eSA9IHBhcnNlSW50KCRldmVudCwgMTApO1xuICB9XG5cbiAgZ2V0V01TTGF5ZXJzKCk6IExheWVyPGFueT5bXSB7XG4gICAgcmV0dXJuICF0aGlzLm1hcFxuICAgICAgPyBbXVxuICAgICAgOiB0aGlzLm1hcFxuICAgICAgICAgIC5nZXRBbGxMYXllcnMoKVxuICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFRpbGVXTVMgfHwgbGF5ZXIuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJbWFnZVdNUylcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnJlbmRlcmVkID09PSB0cnVlKTtcbiAgfVxuXG4gIGlzTGF5ZXJSZW5kZXJlZChsYXllcjogYW55KSB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRXTVNMYXllcnMoKS5maW5kKFxuICAgICAgKHdtc0xheWVyKSA9PiB3bXNMYXllci5nZXQoJ3RpdGxlJykgPT09IGxheWVyLnRpdGxlICYmIHdtc0xheWVyLmdldCgnZ3JvdXAnKSA9PT0gbGF5ZXIuZ3JvdXBcbiAgICApO1xuICB9XG5cbiAgY2hhbmdlV21zQ2xhc3MoJGV2ZW50OiBhbnksIGxheWVyOiBNYXBXTVNMYXllckxheWVyT3B0aW9ucykge1xuICAgIGxheWVyLm9DbGFzcyA9ICRldmVudDtcbiAgfVxuXG4gIHRvZ2dsZUxlZ2VuZChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5sZWdlbmRUYWJDbG9zZWRbaW5kZXhdID0gIXRoaXMubGVnZW5kVGFiQ2xvc2VkW2luZGV4XTtcbiAgfVxuXG4gIHRvZ2dsZUxlZ2VuZFdpbmRvdygpIHtcbiAgICB0aGlzLmxlZ2VuZFRhYk9wZW4gPSAhdGhpcy5sZWdlbmRUYWJPcGVuO1xuICAgIHRoaXMubGF5ZXJzVGFiT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlTGF5ZXJzV2luZG93KCkge1xuICAgIHRoaXMubGF5ZXJzVGFiT3BlbiA9ICF0aGlzLmxheWVyc1RhYk9wZW47XG4gICAgdGhpcy5sZWdlbmRUYWJPcGVuID0gZmFsc2U7XG4gIH1cblxuICBnZXQgbWFwTGF5ZXJzKCkge1xuICAgIHJldHVybiAodGhpcy5tYXAgPz8geyBnZXRMYXllcnM6ICgpID0+ICh7IGdldEFycmF5OiAoKSA9PiBbXSB9KSB9KVxuICAgICAgLmdldExheWVycygpXG4gICAgICAuZ2V0QXJyYXkoKVxuICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldCgndGl0bGUnKSAhPT0gJ2JhY2tncm91bmQnKTtcbiAgfVxuXG4gIGdldCByaWdodFNsaWRlTGF5ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLm1hcExheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXQoJ3NsaWRlJykgPT09ICdyaWdodCcpO1xuICB9XG5cbiAgZ2V0IGxlZnRTbGlkZUxheWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXBMYXllcnMuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0KCdzbGlkZScpID09PSAnbGVmdCcpO1xuICB9XG5cbiAgY2hhbmdlVmlzaWJpbGl0eShncm91cDogTGF5ZXJHcm91cCwgX2xheWVyPzogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3Qgb2xMYXllciA9IHRoaXMubWFwTGF5ZXJzLmZpbmQoXG4gICAgICAobGF5ZXIpID0+IGxheWVyLmdldFByb3BlcnRpZXMoKVsndGl0bGUnXSA9PT0gX2xheWVyPy50aXRsZSAmJiBsYXllci5nZXRQcm9wZXJ0aWVzKClbJ2dyb3VwJ10gPT09IGdyb3VwLm5hbWVcbiAgICApO1xuICAgIGlmIChncm91cC5zaW5nbGVMYXllcikge1xuICAgICAgY29uc3QgZ3JvdXBMYXllcnMgPVxuICAgICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uZmlsdGVyKChsKSA9PiBsLmdyb3VwID09PSBncm91cC5uYW1lKS5tYXAoKGxheWVyKSA9PiBsYXllci50aXRsZSkgPz8gW107XG5cbiAgICAgIHRoaXMubWFwTGF5ZXJzXG4gICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXRQcm9wZXJ0aWVzKClbJ2dyb3VwJ10gPT09IGdyb3VwLm5hbWUpXG4gICAgICAgIC5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgIGlmIChncm91cExheWVycy5pbmNsdWRlcyhsYXllci5nZXRQcm9wZXJ0aWVzKClbJ3RpdGxlJ10pKSB7XG4gICAgICAgICAgICBsYXllci5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgaWYgKF9sYXllcikge1xuICAgICAgICBvbExheWVyPy5zZXRWaXNpYmxlKHRydWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzaWJpbGl0eShncm91cC5uYW1lLCBbX2xheWVyLnRpdGxlIV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVMYXllclZpc2liaWxpdHkoZ3JvdXAubmFtZSwgW10pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvbExheWVyPy5zZXRWaXNpYmxlKCFvbExheWVyPy5nZXRWaXNpYmxlKCkpO1xuXG4gICAgICBjb25zdCB2aXNpYmxlTGF5ZXJzID0gZ3JvdXAudmlzaWJsZUxheWVycy5pbmNsdWRlcyhfbGF5ZXI/LnRpdGxlISlcbiAgICAgICAgPyBncm91cC52aXNpYmxlTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyICE9PSBfbGF5ZXI/LnRpdGxlKVxuICAgICAgICA6IFsuLi5ncm91cC52aXNpYmxlTGF5ZXJzLCBfbGF5ZXI/LnRpdGxlIV07XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzaWJpbGl0eShncm91cC5uYW1lLCB2aXNpYmxlTGF5ZXJzKTtcbiAgICB9XG4gICAgdGhpcy5tYXAudXBkYXRlU2l6ZSgpO1xuICB9XG5cbiAgaXNMYXllclZpc2libGUobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgZ3JvdXA/OiBMYXllckdyb3VwKTogYm9vbGVhbiB7XG4gICAgaWYgKGdyb3VwICYmIGdyb3VwLnZpc2libGVMYXllcnMpIHtcbiAgICAgIHJldHVybiBncm91cC52aXNpYmxlTGF5ZXJzLmluY2x1ZGVzKGxheWVyLnRpdGxlID8/ICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICEhdGhpcy5vcHRpb25zQ29weVxuICAgICAgICAubGF5ZXJHcm91cHMhLmZpbmQoKGcpID0+IGcubmFtZSA9PT0gbGF5ZXIuZ3JvdXApXG4gICAgICAgID8udmlzaWJsZUxheWVycy5pbmNsdWRlcyhsYXllci50aXRsZSA/PyAnJyk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXNpYmlsaXR5KG5hbWU6IHN0cmluZywgdmlzaWJsZUxheWVyczogc3RyaW5nW10gfCBzdHJpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzID0gW1xuICAgICAgLi4uKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPz8gW10pLm1hcCgoZ3JvdXApID0+XG4gICAgICAgIGdyb3VwLm5hbWUgPT09IG5hbWVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICAgIHZpc2libGVMYXllcnM6IHZpc2libGVMYXllcnNcbiAgICAgICAgICAgICAgICA/IHR5cGVvZiB2aXNpYmxlTGF5ZXJzID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgPyBbLi4uZ3JvdXAudmlzaWJsZUxheWVycywgdmlzaWJsZUxheWVyc11cbiAgICAgICAgICAgICAgICAgIDogdmlzaWJsZUxheWVyc1xuICAgICAgICAgICAgICAgIDogZ3JvdXAudmlzaWJsZUxheWVyc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogZ3JvdXBcbiAgICAgIClcbiAgICBdO1xuICB9XG5cbiAgY2hhbmdlQXV0b0xheWVyKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5hdXRvbWF0aWNMYXllcnMgPSAkZXZlbnQ7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5LmF1dG9tYXRpY0xheWVycykge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuaWdub3JlQXV0b0xheWVyO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXllclZpc2libGVJZHgoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwTGF5ZXJzLm1hcCgobGF5ZXIsIGlkeCkgPT4gKGxheWVyLmdldFZpc2libGUoKSA/IGlkeCA6IDApKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSB8fCAtMTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG5cbiAgICAvLyBUcnlpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG4gICAgdGhpcy5jbGVhckxheWVycyh0aGlzLm1hcC5nZXRMYXllcnMoKS5nZXRBcnJheSgpKTtcbiAgICB0aGlzLmNsZWFyTGF5ZXJzKHRoaXMucHJldmlvdXNMYXllcnMpO1xuICAgIHRoaXMubWFwLmdldFJlbmRlcmVyKCkhLmRpc3Bvc2UoKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZGVsZXRlIHRoaXMubWFwO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLm1hcCA9IG51bGw7XG4gICAgdGhpcy50b29sdGlwTWFuYWdlci5kZXN0cm95KCk7XG4gIH1cblxuICBnZXRTdHlsZShfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyID0gX2xheWVyIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zO1xuICAgIGlmIChsYXllci5hZGRpdGlvbmFsUGFyYW1ldGVycz8uU1RZTEVTKSB7XG4gICAgICByZXR1cm4gbGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnM/LlNUWUxFUztcbiAgICB9XG4gICAgLyogTm90IG1hbmlmZXN0LWRlZmluZWQgc3R5bGU6IHVzZSBmaXJzdCBpbiBsaW5lIGJlY2F1c2UgaXQncyB0aGUgZGVmYXVsdCBvbmUgc2VudCBieSBnZW9zZXJ2ZXIgKi9cbiAgICBjb25zdCBwb3NzaWJsZVN0eWxlc0ZvclVybCA9IHRoaXMucG9zc2libGVTdHlsZXNbbGF5ZXIudXJsXSA/PyB7IGxheWVyczoge30gfTtcbiAgICBsZXQgcG9zc2libGVzU3R5bGVzRm9yTGF5ZXIgPSBwb3NzaWJsZVN0eWxlc0ZvclVybC5sYXllcnMhW2xheWVyLnBhcmFtTGF5ZXJdO1xuICAgIGlmICghcG9zc2libGVzU3R5bGVzRm9yTGF5ZXIpIHtcbiAgICAgIHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyID0gcG9zc2libGVTdHlsZXNGb3JVcmwubGF5ZXJzIVsobGF5ZXIucGFyYW1MYXllciA/PyAnOicpLnNwbGl0KCc6JylbMV1dID8/IHsgc3R5bGVzOiBbXSB9O1xuICAgIH1cbiAgICByZXR1cm4gcG9zc2libGVzU3R5bGVzRm9yTGF5ZXIuc3R5bGVzWzBdPy5pZDtcbiAgfVxuXG4gIGNoYW5nZUxheWVyU3R5bGUoJGV2ZW50OiBhbnksIF9sYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgbGF5ZXIgPSBfbGF5ZXIgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnM7XG4gICAgaWYgKCFsYXllci5hZGRpdGlvbmFsUGFyYW1ldGVycykge1xuICAgICAgbGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnMgPSB7fTtcbiAgICB9XG4gICAgbGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnMuU1RZTEVTID0gJGV2ZW50O1xuICB9XG5cbiAgZ2V0QXNXbXNUeXBlKF9sYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIF9sYXllciBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucztcbiAgfVxuXG4gIGxheWVyU3R5bGVPcHRpb25zKF9sYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgbGF5ZXIgPSBfbGF5ZXIgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnM7XG4gICAgY29uc3QgcG9zc2libGVTdHlsZXNGb3JVcmwgPSB0aGlzLnBvc3NpYmxlU3R5bGVzW2xheWVyLnVybF0gPz8geyBsYXllcnM6IHt9IH07XG4gICAgbGV0IHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyID0gcG9zc2libGVTdHlsZXNGb3JVcmwubGF5ZXJzIVtsYXllci5wYXJhbUxheWVyXTtcbiAgICBpZiAoIXBvc3NpYmxlc1N0eWxlc0ZvckxheWVyKSB7XG4gICAgICBwb3NzaWJsZXNTdHlsZXNGb3JMYXllciA9IHBvc3NpYmxlU3R5bGVzRm9yVXJsLmxheWVycyFbKGxheWVyLnBhcmFtTGF5ZXIgPz8gJzonKS5zcGxpdCgnOicpWzFdXSA/PyB7IHN0eWxlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyLnN0eWxlcztcbiAgfVxuXG4gIHRyaWdnZXJMYXllclJlbmRlcigpIHtcbiAgICB0aGlzLm1hcC5yZW5kZXIoKTtcbiAgfVxuXG4gIGNoYW5nZVNsaWRlT3B0aW9uKCRldmVudDogYW55KSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5zbGlkZSA9ICRldmVudDtcbiAgICBpZiAoJGV2ZW50ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiAobGF5ZXIuc2xpZGUgPSAnYWxsJykpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZU1lbnUoKSB7XG4gICAgdGhpcy5hY3Rpb25NZW51T3BlbiQubmV4dCghdGhpcy5hY3Rpb25NZW51T3BlbiQuZ2V0VmFsdWUoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldE9sWm9vbUVsZW1lbnQoKSB7XG4gICAgdGhpcy5vbFpvb21FbGVtZW50JC5uZXh0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vbC16b29tJykpO1xuICAgIGlmICghdGhpcy5vbFpvb21FbGVtZW50JC5nZXRWYWx1ZSgpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZ2V0T2xab29tRWxlbWVudCgpLCA1MCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHpvb21JbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vbC16b29tLWluJyk7XG4gICAgICBpZiAoem9vbUluKSB7XG4gICAgICAgIHpvb21Jbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdG9vbHRpcCcsIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAuem9vbUluJykpO1xuICAgICAgICB6b29tSW4uc2V0QXR0cmlidXRlKCdkYXRhLXRvb2x0aXAtcG9zaXRpb24nLCAnbGVmdCcpO1xuICAgICAgICB6b29tSW4uY2xhc3NMaXN0LmFkZCgnYS10b29sdGlwJywgJy0tbm9wb3MnKTtcbiAgICAgICAgem9vbUluLnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHpvb21PdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2wtem9vbS1vdXQnKTtcbiAgICAgIGlmICh6b29tT3V0KSB7XG4gICAgICAgIHpvb21PdXQuc2V0QXR0cmlidXRlKCdkYXRhLXRvb2x0aXAnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnpvb21PdXQnKSk7XG4gICAgICAgIHpvb21PdXQuc2V0QXR0cmlidXRlKCdkYXRhLXRvb2x0aXAtcG9zaXRpb24nLCAnbGVmdCcpO1xuICAgICAgICB6b29tT3V0LmNsYXNzTGlzdC5hZGQoJ2EtdG9vbHRpcCcsICctLW5vcG9zJyk7XG4gICAgICAgIHpvb21PdXQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVNlbGVjdGlvbihhY3Rpb246ICdjbGljaycgfCAnbGFzc28nIHwgJ3JlY3RhbmdsZScgfCAnem9vbScgfCAnbW92ZScgfCAnZXhwb3J0JyB8ICd1cGxvYWQnKSB7XG4gICAgdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIuc2VsZWN0aW9uSW50ZXJhY3Rpb24uY2hhbmdlU2VsZWN0aW9uKGFjdGlvbik7XG4gICAgdGhpcy50b2dnbGVNZW51KCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTGF5ZXJzKGxheWVyczogQmFzZUxheWVyW10pIHtcbiAgICBsYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIFZlY3RvckxheWVyICYmIChsYXllciBhcyBWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U+KS5nZXRTb3VyY2UoKSkge1xuICAgICAgICAobGF5ZXIgYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPikuZ2V0U291cmNlKCkhLmNsZWFyKCk7XG4gICAgICAgIGxheWVyLnNldFNvdXJjZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgVGlsZUxheWVyICYmIChsYXllciBhcyBUaWxlTGF5ZXI8YW55PikuZ2V0U291cmNlKCkpIHtcbiAgICAgICAgKGxheWVyIGFzIFRpbGVMYXllcjxhbnk+KS5nZXRTb3VyY2UoKS5jbGVhcigpO1xuICAgICAgICBsYXllci5zZXRTb3VyY2UodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGxheWVyLmRpc3Bvc2UoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZExheWVyR3JvdXAoKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyA9IFtcbiAgICAgIC4uLnRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMhLFxuICAgICAge1xuICAgICAgICBuYW1lOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5ncm91cCcpICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgICh0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5sZW5ndGggKyAxKSxcbiAgICAgICAgc2luZ2xlTGF5ZXI6IGZhbHNlLFxuICAgICAgICB2aXNpYmxlTGF5ZXJzOiBbXVxuICAgICAgfVxuICAgIF07XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzW3RoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5hZGRMYXllcihncm91cCk7XG4gIH1cblxuICB1cGRhdGVMYXllckdyb3VwTmFtZShncm91cDogTGF5ZXJHcm91cCwgJGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IFtuYW1lLCBzaW5nbGVMYXllciwgdmlzaWJsZUxheWVyc10gPSBbZ3JvdXAubmFtZSwgZ3JvdXAuc2luZ2xlTGF5ZXIsIGdyb3VwLnZpc2libGVMYXllcnNdO1xuICAgIGNvbnN0IGdyb3VwSW5kZXggPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5maW5kSW5kZXgoKGcpID0+IGcubmFtZSA9PT0gZ3JvdXAubmFtZSk7XG4gICAgY29uc3QgbmV3TmFtZSA9ICgkZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIGlmIChuYW1lID09PSBERUZBVUxUX0xBWUVSX0dST1VQKSB7XG4gICAgICBjb25zdCBsYXllcnNUb1RyYW5zZmVyID1cbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBERUZBVUxUX0xBWUVSX0dST1VQKS5tYXAoKGwpID0+IGwudGl0bGUpID8/IFtdO1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyA9IFtcbiAgICAgICAgLi4udGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyEsXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBuZXdOYW1lLFxuICAgICAgICAgIHNpbmdsZUxheWVyLFxuICAgICAgICAgIHZpc2libGVMYXllcnM6IHZpc2libGVMYXllcnMhLmZpbHRlcigobCkgPT4gbGF5ZXJzVG9UcmFuc2Zlci5pbmNsdWRlcyhsKSlcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzLm1hcCgoZywgaSkgPT5cbiAgICAgICAgaSA9PT0gZ3JvdXBJbmRleFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBuYW1lOiBERUZBVUxUX0xBWUVSX0dST1VQLFxuICAgICAgICAgICAgICBzaW5nbGVMYXllcixcbiAgICAgICAgICAgICAgdmlzaWJsZUxheWVyczogdmlzaWJsZUxheWVycyEuZmlsdGVyKChsKSA9PiAhbGF5ZXJzVG9UcmFuc2Zlci5pbmNsdWRlcyhsKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGdcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5tYXAoKGcsIGkpID0+XG4gICAgICAgIGkgPT09IGdyb3VwSW5kZXggPyB7IG5hbWU6IG5ld05hbWUsIHNpbmdsZUxheWVyLCB2aXNpYmxlTGF5ZXJzIH0gOiBnXG4gICAgICApO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgZ3JvdXBzIG9uIG9wdGlvbnMgbGF5ZXJzXG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLm1hcCgobGF5ZXIpID0+XG4gICAgICAgIGxheWVyLmdyb3VwID09PSBuYW1lXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLmxheWVyLFxuICAgICAgICAgICAgICBncm91cDogbmV3TmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbGF5ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBncm91cHMgb24gb2wgbGF5ZXJzXG4gICAgdGhpcy5tYXBMYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgIGlmIChsYXllci5nZXRQcm9wZXJ0aWVzKClbJ2dyb3VwJ10gPT09IG5hbWUpIGxheWVyLnNldCgnZ3JvdXAnLCBuZXdOYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZUxheWVyR3JvdXAobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMhLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLm5hbWUgIT09IG5hbWUpO1xuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnM/Lm1hcCgobGF5ZXIpID0+XG4gICAgICBsYXllci5ncm91cCA9PSBuYW1lID8geyAuLi5sYXllciwgZ3JvdXA6IERFRkFVTFRfTEFZRVJfR1JPVVAgfSA6IGxheWVyXG4gICAgKTtcbiAgfVxuXG4gIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPE1hcFdpZGdldExheWVyT3B0aW9uc1tdPiwgZ3JvdXA6IExheWVyR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBtb3ZlZExheWVyID0gZXZlbnQuaXRlbS5kYXRhIGFzIE1hcFdpZGdldExheWVyT3B0aW9ucztcbiAgICBpZiAoZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQgIT09IGV2ZW50LmNvbnRhaW5lci5pZCkge1xuICAgICAgdGhpcy5tb3ZlTGF5ZXJCZXR3ZWVuR3JvdXBzKFxuICAgICAgICBtb3ZlZExheWVyLFxuICAgICAgICBldmVudC5jb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXllci1ncm91cCcpID8/IERFRkFVTFRfTEFZRVJfR1JPVVBcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubW92ZUxheWVySW5PcHRpb25zKGV2ZW50LmN1cnJlbnRJbmRleCwgZXZlbnQuaXRlbS5kYXRhIGFzIE1hcFdpZGdldExheWVyT3B0aW9ucywgZ3JvdXApO1xuICB9XG5cbiAgbW92ZUxheWVyQmV0d2Vlbkdyb3Vwcyhtb3ZlZExheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIG5ld0dyb3VwOiBzdHJpbmcpIHtcbiAgICAvLyByZW1vdmUgaXQgZnJvbSBvbGQgZ3JvdXBcbiAgICB0aGlzLnVwZGF0ZUxheWVyR3JvdXAoXG4gICAgICBtb3ZlZExheWVyLmdyb3VwISxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHNcbiAgICAgICAgPy5maW5kKChncm91cCkgPT4gZ3JvdXAubmFtZSA9PT0gbW92ZWRMYXllci5ncm91cCEpXG4gICAgICAgID8udmlzaWJsZUxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllciAhPT0gbW92ZWRMYXllci50aXRsZSlcbiAgICApO1xuXG4gICAgLy8gYWRkIGl0IHRvIG5ldyBncm91cFxuICAgIG1vdmVkTGF5ZXIuZ3JvdXAgPSBuZXdHcm91cDtcbiAgICB0aGlzLnVwZGF0ZUxheWVyR3JvdXAobmV3R3JvdXAgPz8gREVGQVVMVF9MQVlFUl9HUk9VUCwgdW5kZWZpbmVkLCBtb3ZlZExheWVyLnRpdGxlISk7XG4gICAgdGhpcy5yZW1vdmVFbXB0eUxheWVyR3JvdXBzKCk7XG4gIH1cblxuICBtb3ZlTGF5ZXJJbk9wdGlvbnModGFyZ2V0SWR4SW5Hcm91cDogbnVtYmVyLCBtb3ZlZExheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICBjb25zdCBncm91cExheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgICAgIC8vIGluZGV4ZXMgaW4gb3B0aW9uc0NvcHlcbiAgICAgIGNvbnN0IGZyb21JbmRleCA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLmZpbmRJbmRleCgobGF5ZXIpID0+IGxheWVyLnRpdGxlID09PSBtb3ZlZExheWVyLnRpdGxlKTtcbiAgICAgIGNvbnN0IHRvSW5kZXggPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5maW5kSW5kZXgoKGxheWVyKSA9PiBsYXllci50aXRsZSA9PT0gZ3JvdXBMYXllcnNbdGFyZ2V0SWR4SW5Hcm91cF0udGl0bGUpO1xuXG4gICAgICBsZXQgbmV3T3JkZXIgPSB0b0luZGV4O1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMuc3BsaWNlKGZyb21JbmRleCwgMSk7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5zcGxpY2UodG9JbmRleCwgMCwgeyAuLi5tb3ZlZExheWVyLCBvcmRlcjogbmV3T3JkZXIgfSk7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyT3JkZXIoKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVFeHBhbmRBbGwoZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdID0gIXRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV07XG4gICAgY29uc3QgbGF5ZXJzVG9FeHBhbmQgPVxuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKS5tYXAoKGxheWVyKSA9PiBsYXllci50aXRsZSkgPz8gW107XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlKS5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgaWYgKGxheWVyc1RvRXhwYW5kLmluY2x1ZGVzKGxheWVyKSlcbiAgICAgICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllcl0gPSB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlTGF5ZXJFeHBhbmQobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0gPSAhdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdO1xuICAgIGlmICh0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0pIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV0gPSB0cnVlO1xuICAgIGlmIChncm91cC52aXNpYmxlTGF5ZXJzLmV2ZXJ5KChsYXllclRpdGxlKSA9PiAhdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllclRpdGxlXSkpIHtcbiAgICAgIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVMYXllck9yZGVyKCkge1xuICAgIGxldCBvcmRlciA9IDE7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3Vwcz8uZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwTGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgICAgIGlmIChncm91cExheWVycykge1xuICAgICAgICBncm91cExheWVycy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLm9yZGVyID0gb3JkZXIrKykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaXNHcm91cFVzZWRCeVdpZGdldExheWVycyhncm91cDogTGF5ZXJHcm91cCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNDb3B5LmxheWVycz8uc29tZSgobGF5ZXIpID0+IGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgfVxuXG4gIHJlbW92ZUVtcHR5TGF5ZXJHcm91cHMoKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMhLmZpbHRlcihcbiAgICAgIChncm91cCkgPT5cbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LnNvbWUoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSkgfHwgZ3JvdXAubmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgREVGQVVMVF9MQVlFUl9HUk9VUCA9IERFRkFVTFRfTEFZRVJfR1JPVVA7XG59XG4iLCI8cHJ5LXdpZGdldC1tYXAtY3NzPjwvcHJ5LXdpZGdldC1tYXAtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1tYXBcIj5cbiAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgW2RhdGFzb3VyY2VJZHNdPVwiKGRhdGFzb3VyY2VJZHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAqbmdJZj1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgW21hbmlmZXN0XT1cIm1hbmlmZXN0XCJcbiAgICAobWFuaWZlc3RNb2RpZmllZCk9XCJtYW5pZmVzdE1vZGlmaWVkLmVtaXQoJGV2ZW50KVwiXG4gICAgW2hlYWRlck9wdGlvbnNdPVwiKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpID8/IHt9XCJcbiAgICAjaGVhZGVyXG4gID5cbiAgICA8cHJ5LXNldHRpbmdzXG4gICAgICAoc2F2ZVRyaWdnZXJlZCk9XCJlbWl0TWFuaWZlc3QoKVwiXG4gICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICBbaGVhZGVyUHJlc2VudF09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICBbb3BlbiRdPVwib3BlbiRcIlxuICAgICAgY2xhc3M9XCJvLXNldHRpbmdzXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfc3R5bGVcIj57eyAnQHByeS53aWRnZXQubWFwLnN0eWxlJyB8IGkxOG4gfX0gOjwvbGFiZWw+XG4gICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU3R5bGUoJGV2ZW50KVwiXG4gICAgICAgICAgW2l0ZW1zXT1cInN0eWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuc3R5bGVcIlxuICAgICAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICBiaW5kVmFsdWU9XCJpZGVudGlmaWVyXCJcbiAgICAgICAgICBpZD1cIm1hcF9zdHlsZVwiXG4gICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiICpuZ0lmPVwib3B0aW9uc0NvcHkuc3R5bGUgPT09IFNUWUxFX0ZST01fVVJMXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJzdHlsZV9VUkxcIj57eyAnQHByeS53aWRnZXQubWFwLnN0eWxlVXJsJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBpZD1cInN0eWxlX1VSTFwiXG4gICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlU3R5bGVVUkwoJGV2ZW50KVwiXG4gICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbnNDb3B5LnN0eWxlVVJMID8/ICcnXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUF1dG9MYXllcigkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuYXV0b21hdGljTGF5ZXJzID8/IGZhbHNlXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuYXV0b0xheWVyJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUF0dHJpYnV0aW9ucygkZXZlbnQpXCIgW25nTW9kZWxdPVwib3B0aW9uc0NvcHkuYXR0cmlidXRpb25zID8/IGZhbHNlXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuYXR0cmlidXRpb25zJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVNsaWRlT3B0aW9uKCRldmVudClcIiBbbmdNb2RlbF09XCJoYXNTbGlkZUxheWVyJCB8IGFzeW5jXCI+XG4gICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGUuZ2xvYmFsJyB8IGkxOG4gfX1cbiAgICAgIDwvcHJ5LWNoZWNrYm94PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiby1sYXllci1zZXR0aW5nc1wiIGNka0Ryb3BMaXN0R3JvdXAgY2RrRHJhZ0JvdW5kYXJ5PlxuICAgICAgICA8aDQgY2xhc3M9XCJhLWxhYmVsXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnRpdGxlJyB8IGkxOG4gfX08L2g0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidS1kaXNwbGF5LWZsZXggLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZExheWVyR3JvdXAoKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5hZGRMYXllckdyb3VwJyB8IGkxOG4gfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIG9wdGlvbnNDb3B5LmxheWVyR3JvdXBzOyBsZXQgZ3JvdXBJZHggPSBpbmRleFwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0dyb3VwVXNlZEJ5V2lkZ2V0TGF5ZXJzKGdyb3VwKVwiIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGQgby1sYXllci1zZXR0aW5nc19fZ3JvdXAtdGl0bGVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllckdyb3VwVGl0bGUte3sgZ3JvdXBJZHggfX1cIj5cbiAgICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MubGF5ZXJHcm91cE5hbWUnIHwgaTE4biB9fTxzcGFuIGNsYXNzPVwiLW9ibGlnYXRvcnktcmVkXCI+Kjwvc3BhblxuICAgICAgICAgICAgICAgID57eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3Mub3B0aW9uYWxDb2xvbicgfCBpMThuIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGQgdS1kaXNwbGF5LWZsZXggLXJvdyAtZ2FwLTEwXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfbGF5ZXJHcm91cFRpdGxlLXt7IGdyb3VwSWR4IH19XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlTGF5ZXJHcm91cE5hbWUoZ3JvdXAsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ3JvdXAubmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCA/ICgnQHByeS53aWRnZXQubWFwLm5vR3JvdXAnIHwgaTE4bikgOiBncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXAubmFtZSAhPT0gREVGQVVMVF9MQVlFUl9HUk9VUFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4tLWljb24tb25seSBhLXRvb2x0aXAgby1sYXllci1zZXR0aW5nc19fZGVsZXRlLWdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5kZWxldGVHcm91cCcgfCBpMThuXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVMYXllckdyb3VwKGdyb3VwLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTZcIiBbd2lkdGhdPVwiMTZcIiBpY29uU3ZnPVwiYmluX25vcm1hbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAoZ3JvdXAubmFtZSAhPT0gREVGQVVMVF9MQVlFUl9HUk9VUCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1yYWRpby1ncm91cF9faXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwibXVsdGlzZWxlY3Rpb24te3sgZ3JvdXBJZHggfX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC5zaW5nbGVMYXllclwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxheWVyR3JvdXBTaW5nbGVMYXllcihncm91cCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImdyb3VwLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtdWx0aXNlbGVjdGlvbi17eyBncm91cElkeCB9fVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5tdWx0aXBsZUxheWVyJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLXJhZGlvLWdyb3VwX19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJtb25vc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JvdXAuc2luZ2xlTGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVMYXllckdyb3VwU2luZ2xlTGF5ZXIoZ3JvdXAsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImdyb3VwLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtb25vc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnNpbmdsZUxheWVyJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInUtZGlzcGxheS1mbGV4IC1hbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRMYXllcihncm91cClcIiBjbGFzcz1cImEtYnRuIC1saW5rLWxpa2VcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICArIHt7ICdAcHJ5LndpZGdldC5tYXAuYWRkTGF5ZXInIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlRXhwYW5kQWxsKGdyb3VwKVwiIGNsYXNzPVwiYS1idG4gLWxpbmstbGlrZVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgbGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbZ3JvdXAubmFtZV1cbiAgICAgICAgICAgICAgICAgICAgPyAoJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLmZvbGRBbGwnIHwgaTE4bilcbiAgICAgICAgICAgICAgICAgICAgOiAoJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnVuZm9sZEFsbCcgfCBpMThuKVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXJzXCJcbiAgICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgZ3JvdXApXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYXllci1ncm91cF09XCJncm91cC5uYW1lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGF5ZXIgb2Ygb3B0aW9uc0NvcHk/LmxheWVyczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwibGF5ZXIuZ3JvdXAgPT09IGdyb3VwLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19sYXllci13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJsYXllclwiXG4gICAgICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cImxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLXBsYWNlaG9sZGVyXCIgKmNka0RyYWdQbGFjZWhvbGRlcj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19sYXllci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInUtZGlzcGxheS1mbGV4IC1hbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZGlzYWJsZWRdPVwibGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctaGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25Tdmc9XCJkcmFnX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0bi0taWNvbi1vbmx5IHVuZm9sZC1sYXllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGF5ZXJFeHBhbmQobGF5ZXIsIGdyb3VwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblN2Z109XCJsYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdID8gJ2NoZXZyb25fdG9wJyA6ICdjaGV2cm9uX2JvdHRvbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiYS1oNVwiPnt7IGxheWVyLnRpdGxlID8/ICgnQHByeS53aWRnZXQubWFwLmxheWVyJyB8IGkxOG46IHsgaW5kZXg6IGkgKyAxIH0pIH19PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm8tbGF5ZXItc2V0dGluZ3NfX2RlbGV0ZS1sYXllciBhLWJ0bi0taWNvbi1vbmx5IGEtdG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5kZWxldGVMYXllcicgfCBpMThuXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlTGF5ZXIoaSwgbGF5ZXIsIGdyb3VwKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxNlwiIFt3aWR0aF09XCIxNlwiIGljb25Tdmc9XCJiaW5fbm9ybWFsXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdXCIgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19sYXllci1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLXNldHRpbmdzX19wb3B1cF9fY29udGVudF9fZmllbGRzX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHByeS1yYW5nZVxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKGxheWVyPy5vcGFjaXR5ID8/IDEwMCkgKyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VPcGFjaXR5KGxheWVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsVHJhbnNsYXRlPVwiQHByeS53aWRnZXQubWFwLm9wYWNpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1yYW5nZT5cblxuICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmxheWVyT3B0aW9ucycgfCBpMThuOiB7IGluZGV4OiBpICsgMSB9IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImxheWVyX3t7IGkgKyAxIH19X3RpdGxlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyVGl0bGUnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibGF5ZXJfe3sgaSArIDEgfX1fdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VUaXRsZSgkZXZlbnQsIGxheWVyLCBncm91cClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIiAqbmdJZj1cIiFbJ2dlb3NlcnZlcicsICdhdXRvJ10uaW5jbHVkZXMobGF5ZXIudHlwZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllclR5cGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLnRpdGxlJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUxheWVyVHlwZSgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwibGF5ZXJUeXBlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4blByZWZpeD1cIkBwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sYXllclR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIiAqbmdJZj1cIlsnZ2Vvc2VydmVyJywgJ3dtcyddLmluY2x1ZGVzKGxheWVyLnR5cGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRBc1dtc1R5cGUobGF5ZXIpIGFzIHdtc2xheWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllclN0eWxlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTdHlsZScgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VMYXllclN0eWxlKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJsYXllclN0eWxlT3B0aW9ucyhsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0U3R5bGUobGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX2xheWVyU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VGaXQoJGV2ZW50LCBsYXllcilcIiBbbmdNb2RlbF09XCJsYXllci5maXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmZpdCcgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAncmVsYXRpb24nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnd210cycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnZ2Vvc2VydmVyJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdmZWF0dXJlbGF5ZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3ZlY3RvcnRpbGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3Jhc3RlcnRpbGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2F1dG8nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9jbGFzc2VzXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5jbGFzc2VzJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUNsYXNzZXMoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ1c2VkQ2xhc3NlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyLmNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9jbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAncmVsYXRpb24nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnd21zJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtdHMnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnZ2Vvc2VydmVyJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2ZlYXR1cmVsYXllcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd2ZWN0b3J0aWxlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3Jhc3RlcnRpbGUnXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAubG9jYXRpb25BdHRyJyB8IGkxOG4gfX08L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VvbWV0cnlGaWVsZHNGb3I6IHsgcmVzdWx0U2V0OiByZXN1bHRTZXQkLCBjbGFzc2VzOiBsYXllci5jbGFzc2VzLCB0eXBlOiBsYXllci50eXBlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jIGFzIGZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYXRtYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFya2VyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb2ludCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9seWdvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXVsdGktbGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXVsdGktcG9seWdvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmluZGV4T2YobGF5ZXIudHlwZSkgPj0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sb2NhdGlvbkF0dHJpYnV0ZV9ib3RoXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubG9jYXRpb25BdHRyaWJ1dGUuYm90aCcgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VMb2NhdGlvbkF0dHJpYnV0ZXMoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5hdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZExhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX2xvY2F0aW9uQXR0cmlidXRlX2JvdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJbJ2hlYXRtYXAnLCAnYnViYmxlJ10uaW5kZXhPZihsYXllci50eXBlKSA+PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX2ludGVuc2l0eUF0dHJpYnV0ZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmludGVuc2l0eUF0dHJpYnV0ZScgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VJbnRlbnNpdHlBdHRyaWJ1dGVzKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXJIYXNJbnRlbnNpdHkobGF5ZXIpLmludGVuc2l0eUF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfaW50ZW5zaXR5QXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuXG4gICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAnd21zJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICd3bXRzJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2ZlYXR1cmVsYXllcicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICd2ZWN0b3J0aWxlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3Jhc3RlcnRpbGUnXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYXllci50eXBlICE9PSAnZ2Vvc2VydmVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc191cmxcIj57eyAnQHByeS53aWRnZXQubWFwLndtcy51cmwnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX3dtc191cmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImNoYW5nZVVybCgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIiAqbmdJZj1cImxheWVyLnR5cGUgPT09ICd3bXMnIHx8IGxheWVyLnR5cGUgPT09ICd3bXRzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF93bXNfcGFyYW1MYXllclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAud21zLnBhcmFtTGF5ZXInIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX3dtc19wYXJhbUxheWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VQYXJhbUxheWVyKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnBhcmFtTGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIiAqbmdJZj1cImxheWVyLnR5cGUgPT09ICd3bXRzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF93bXNfbWF0cml4U2V0XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMubWF0cml4U2V0JyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfbWF0cml4U2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VNYXRyaXhTZXQoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGF5ZXIubWF0cml4U2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd210cydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX3N0eWxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMuc3R5bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX3N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VQYXJhbVN0eWxlKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJsYXllci50eXBlID09PSAnd21zJyB8fCBsYXllci50eXBlID09PSAnZ2Vvc2VydmVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC50aWxlJyB8IGkxOG4gfX08L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlUGFyYW1UaWxlZCgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyPy5wYXJhbVRpbGVkID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMucGFyYW1UaWxlZCcgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgKm5nSWY9XCJsYXllci50eXBlID09PSAnbWFya2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAuY2x1c3RlcmluZycgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbHVzdGVyZWQobGF5ZXIsICRldmVudClcIiBbbmdNb2RlbF09XCJsYXllci5jbHVzdGVyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5jbHVzdGVyZWQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxheWVyLmNsdXN0ZXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1yYW5nZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci5jbHVzdGVyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbHVzdGVyRGlzdGFuY2UobGF5ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRyYW5zbGF0ZT1cIkBwcnkud2lkZ2V0Lm1hcC5jbHVzdGVyRGlzdGFuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4PVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1yYW5nZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJvcHRpb25zQ29weS5zbGlkZSA/PyBmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJzbGlkZV9zZWxlY3RcIj57eyAnQHByeS53aWRnZXQubWFwLnNsaWRlLnRpdGxlJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VTbGlkZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwic2xpZGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyLnNsaWRlID8/ICdhbGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2xpZGVfc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCIgKm5nSWY9XCJvcHRpb25zQ29weS5hdHRyaWJ1dGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiYXR0cmlidXRpb25cIj57eyAnQHByeS53aWRnZXQubWFwLmF0dHJpYnV0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhdHRyaWJ1dGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlQXR0cmlidXRpb24oJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLmF0dHJpYnV0aW9uID8gbGF5ZXIuYXR0cmlidXRpb24gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ByeS1zZXR0aW5ncz5cbiAgPC9wcnktd2lkZ2V0LWhlYWRlcj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJtLWJ0bi1ncm91cCAtbWFwLXNlbGVjdGlvbi1jaG9pY2UgLXZlcnRpY2FsXCJcbiAgICBbY2xhc3MuLXdpdGgtaGVhZGVyXT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgIFtjbGFzcy4tY2xvc2VkXT1cIiEoYWN0aW9uTWVudU9wZW4kIHwgYXN5bmMpXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCItdmVydGljYWxcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBiYXNpY0FjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seSBhLXRvb2x0aXAgYS10b29sdGlwLS17eyBhY3Rpb24gfX1cIlxuICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTZWxlY3Rpb24oYWN0aW9uKVwiXG4gICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAuJyArIGFjdGlvbiB8IGkxOG5cIlxuICAgICAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCJhY3Rpb25cIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLicgKyBhY3Rpb24gfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwIC1tYXAtdG9nZ2xlXCJcbiAgICAgIGlkPVwib3Blbl9tZW51XCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiYWN0aW9uTWVudU9wZW4kIHwgYXN5bmNcIlxuICAgICAgYXJpYS1jb250cm9scz1cImV4cG9ydF90eXBlXCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVNZW51KClcIlxuICAgID5cbiAgICAgIDxwcnktaWNvblxuICAgICAgICBbaWNvblN2Z109XCIoYWN0aW9uTWVudU9wZW4kIHwgYXN5bmMpID8gJ2NoZXZyb25fdG9wJyA6ICdjaGV2cm9uX2JvdHRvbSdcIlxuICAgICAgICBbd2lkdGhdPVwiMTJcIlxuICAgICAgICBbaGVpZ2h0XT1cIjI0XCJcbiAgICAgID48L3ByeS1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAub3BlbicgfCBpMThuIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXAgLW1hcC1zZWxlY3Rpb24tY2hvaWNlIC1tYXAtZXhwb3J0XCIgW2NsYXNzLi13aXRoLWhlYWRlcl09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwXCJcbiAgICAgIGlkPVwiZXhwb3J0X2NhcmRcIlxuICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJleHBvcnRfdHlwZVwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibWVudVwiXG4gICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5leHBvcnQnIHwgaTE4blwiXG4gICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAoY2xpY2spPVwiZXhwb3J0KClcIlxuICAgID5cbiAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiZmlsZV9kb3dubG9hZFwiPjwvcHJ5LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5leHBvcnQnIHwgaTE4biB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgQGlmICgobGF5ZXJzJCB8IGFzeW5jKT8ubGVuZ3RoKSB7XG4gICAgPGRpdiBjbGFzcz1cIm9sLWNvbnRyb2wgbS1tYXAtYWN0aW9uIG0tbWFwLWFjdGlvbi0tbGF5ZXJzXCIgW3N0eWxlLnRvcC5weF09XCJsYXllcnNUb3AkIHwgYXN5bmNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJtLW1hcC1hY3Rpb25fX2J1dHRvblwiXG4gICAgICAgIFtjbGFzcy5hLXRvb2x0aXBdPVwiIXRoaXMubGF5ZXJzVGFiT3BlblwiXG4gICAgICAgIFtjbGFzcy4tdG9vbHRpcC1uby13cmFwXT1cIiF0aGlzLmxheWVyc1RhYk9wZW5cIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGF5ZXJzV2luZG93KClcIlxuICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5zZWxlY3RMYXllcnMnIHwgaTE4blwiXG4gICAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cImxlZnRcIlxuICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImxheWVyc1wiIFt3aWR0aF09XCIxOFwiIFtoZWlnaHRdPVwiMThcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tbWFwLXBvcC1pbiAtbWF4LXdpZHRoLTIyMFwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCIgW3N0eWxlLnRvcC5weF09XCJsYXllcnNUb3AkIHwgYXN5bmNcIj5cbiAgICAgIDxoNCBjbGFzcz1cImEtaDRcIj57eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3Muc2VsZWN0TGF5ZXJzJyB8IGkxOG4gfX08L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cIm0tbWFwLXBvcC1pbl9fY29udGVudFwiIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cImxheWVyc0hlaWdodCQgfCBhc3luY1wiPlxuICAgICAgICBAZm9yIChncm91cCBvZiAob3B0aW9ucyQgfCBhc3luYyk/LmxheWVyR3JvdXBzID8/IFtdOyB0cmFjayBncm91cDsgbGV0IGdyb3VwSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgQGlmIChpc0dyb3VwVXNlZEJ5V2lkZ2V0TGF5ZXJzKGdyb3VwKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tbWFwLXBvcC1pbl9fdGl0bGUgbS1tYXAtcG9wLWluX19ncm91cC10aXRsZVwiPlxuICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJhLWg1XCI+XG4gICAgICAgICAgICAgICAge3sgZ3JvdXAubmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCA/ICgnQHByeS53aWRnZXQubWFwLm5vR3JvdXAnIHwgaTE4bikgOiBncm91cC5uYW1lIH19XG4gICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAoZ3JvdXAuc2luZ2xlTGF5ZXIpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tbWFwLXBvcC1pbl9fcmFkaW9zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tbWFwLXBvcC1pbl9fdGl0bGVcIiBbY2xhc3MuLWhpZGRlbl09XCIhbGF5ZXJzVGFiT3BlblwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImlkICsgJy0nICsgZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgaWQgfX0tcmFkaW8tbGF5ZXItZ3JvdXAte3sgZ3JvdXBJZHggfX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC52aXNpYmxlTGF5ZXJzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VWaXNpYmlsaXR5KGdyb3VwKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInt7IGlkIH19LXJhZGlvLWxheWVyLWdyb3VwLXt7IGdyb3VwSWR4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLm5vTGF5ZXInIHwgaTE4blxuICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBmb3IgKGxheWVyIG9mIG9wdGlvbnNDb3B5LmxheWVyczsgdHJhY2sgbGF5ZXI7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgQGlmIChsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaWQgKyAnLScgKyBncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgaWQgfX0tcmFkaW8te3sgZ3JvdXAubmFtZSB9fS1sYXllci17eyBpbmRleCB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC52aXNpYmxlTGF5ZXJzWzBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVZpc2liaWxpdHkoZ3JvdXAsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwie3sgaWQgfX0tcmFkaW8te3sgZ3JvdXAubmFtZSB9fS1sYXllci17eyBpbmRleCB9fVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci50aXRsZSA/PyAoJ0Bwcnkud2lkZ2V0Lm1hcC5taXNzaW5nVGl0bGUnIHwgaTE4bilcbiAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgQGZvciAobGF5ZXIgb2Ygb3B0aW9uc0NvcHkubGF5ZXJzOyB0cmFjayBsYXllcjsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgQGlmIChsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tbWFwLXBvcC1pbl9fdGl0bGVcIiBbY2xhc3MuLWhpZGRlbl09XCIhbGF5ZXJzVGFiT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaXNMYXllclZpc2libGUobGF5ZXIsIGdyb3VwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VWaXNpYmlsaXR5KGdyb3VwLCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiY2hlY2tib3gtbGF5ZXIte3sgaW5kZXggfX1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9wcnktY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJjaGVja2JveC1sYXllci17eyBpbmRleCB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGxheWVyLnRpdGxlID8/ICgnQHByeS53aWRnZXQubWFwLm1pc3NpbmdUaXRsZScgfCBpMThuKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKChsZWdlbmRMYXllcnMkIHwgYXN5bmMpPy5sZW5ndGgpIHtcbiAgICA8ZGl2IGNsYXNzPVwib2wtY29udHJvbCBtLW1hcC1hY3Rpb24gbS1tYXAtYWN0aW9uLS1sZWdlbmRcIiBbc3R5bGUudG9wLnB4XT1cImxlZ2VuZFRvcCQgfCBhc3luY1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBbY2xhc3MuYS10b29sdGlwXT1cIiF0aGlzLmxlZ2VuZFRhYk9wZW5cIlxuICAgICAgICBbY2xhc3MuLXRvb2x0aXAtbm8td3JhcF09XCIhdGhpcy5sZWdlbmRUYWJPcGVuXCJcbiAgICAgICAgY2xhc3M9XCJtLW1hcC1hY3Rpb25fX2J1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVMZWdlbmRXaW5kb3coKVwiXG4gICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLmxlZ2VuZHMnIHwgaTE4blwiXG4gICAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cImxlZnRcIlxuICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImxlZ2VuZFwiIFt3aWR0aF09XCIxOFwiIFtoZWlnaHRdPVwiMTVcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tbWFwLXBvcC1pblwiIFtjbGFzcy4taGlkZGVuXT1cIiFsZWdlbmRUYWJPcGVuXCIgW3N0eWxlLnRvcC5weF09XCJsZWdlbmRUb3AkIHwgYXN5bmNcIj5cbiAgICAgIDxoNCBjbGFzcz1cImEtaDRcIj57eyAnQHByeS53aWRnZXQubWFwLmxlZ2VuZHNUaXRsZScgfCBpMThuIH19PC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX2NvbnRlbnRcIiBbc3R5bGUubWF4LWhlaWdodC5weF09XCJsYXllcnNIZWlnaHQkIHwgYXN5bmNcIj5cbiAgICAgICAgQGZvciAoZ2VvTGF5ZXIgb2YgbGVnZW5kTGF5ZXJzJCB8IGFzeW5jOyB0cmFjayBnZW9MYXllcjsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgQGlmIChpc0xheWVyVmlzaWJsZShnZW9MYXllcikpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX3RpdGxlXCIgKGNsaWNrKT1cInRvZ2dsZUxlZ2VuZChpbmRleClcIj5cbiAgICAgICAgICAgICAgQGlmIChpc0xheWVyUmVuZGVyZWQoZ2VvTGF5ZXIpICYmICEhZ2VvTGF5ZXIudGl0bGUpIHtcbiAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1tYXAtcG9wLWluX19kcm9wZG93bi1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uU3ZnXT1cImxlZ2VuZFRhYkNsb3NlZFtpbmRleF0gPyAnY2hldnJvbl9ib3R0b20nIDogJ2NoZXZyb25fdG9wJ1wiXG4gICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCIxMlwiXG4gICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiYS1oNVwiPnt7IGdlb0xheWVyLnRpdGxlIH19PC9oNT5cbiAgICAgICAgICAgICAgQGlmICghaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKSkge1xuICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAubGF5ZXJMb2FkRXJyb3InIHwgaTE4blwiXG4gICAgICAgICAgICAgICAgICBbaWNvblN2Z109XCInY2xvc2UnXCJcbiAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIyMlwiXG4gICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjIyXCJcbiAgICAgICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibS1tYXAtcG9wLWluX19pbWFnZVwiXG4gICAgICAgICAgICBbY2xhc3MuLWhpZGRlbl09XCIhbGVnZW5kVGFiT3BlbiB8fCBsZWdlbmRUYWJDbG9zZWRbaW5kZXhdIHx8ICFpc0xheWVyUmVuZGVyZWQoZ2VvTGF5ZXIpXCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cImxlZ2VuZEhlaWdodCQgfCBhc3luY1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChnZW9MYXllciB8IGxlZ2VuZFVybDogeyBjYXBhYmlsaXRpZXM6ICh3bXNDYXBhYmlsaXRpZXMkIHwgYXN5bmMpIH07IGFzIHVybCkge1xuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJ1cmwgfCBnZXRTZWN1cmVkSW1hZ2UgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW2FsdF09XCInQHByeS53aWRnZXQubWFwLmxlZ2VuZCcgfCBpMThuOiB7IGxheWVyOiBnZW9MYXllci50aXRsZSB9XCJcbiAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VOb3RQcm92aWRlZFtpbmRleF0gPSB0cnVlXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIShnZW9MYXllciB8IGxlZ2VuZFVybDogeyBjYXBhYmlsaXRpZXM6ICh3bXNDYXBhYmlsaXRpZXMkIHwgYXN5bmMpIH0pKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwibS1tYXAtcG9wLWluX19lcnJvclwiPnt7ICdAcHJ5LndpZGdldC5tYXAubGVnZW5kTm90UHJvdmlkZWQnIHwgaTE4biB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKGxlZnRTbGlkZUxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgPGRpdiBjbGFzcz1cIm0tbWFwLXNsaWRlLWxlZ2VuZCAtbGVmdFwiIFtzdHlsZS50b3AucHhdPVwibGVnZW5kVG9wJCB8IGFzeW5jXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm0tbWFwLXNsaWRlLWxlZ2VuZF9fdGl0bGVcIj57eyAnQHByeS53aWRnZXQubWFwLnNsaWRlVGl0bGUnIHwgaTE4biB9fTo8L3NwYW4+XG4gICAgICBAZm9yIChsYXllciBvZiBsZWZ0U2xpZGVMYXllcnM7IHRyYWNrIGxheWVyKSB7XG4gICAgICAgIDxkaXY+e3sgbGF5ZXIuZ2V0KCd0aXRsZScpIH19PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKHJpZ2h0U2xpZGVMYXllcnMubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1zbGlkZS1sZWdlbmQgLXJpZ2h0XCIgW3N0eWxlLnRvcC5weF09XCJsZWdlbmRUb3AkIHwgYXN5bmNcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibS1tYXAtc2xpZGUtbGVnZW5kX190aXRsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGVUaXRsZScgfCBpMThuIH19Ojwvc3Bhbj5cbiAgICAgIEBmb3IgKGxheWVyIG9mIHJpZ2h0U2xpZGVMYXllcnM7IHRyYWNrIGxheWVyKSB7XG4gICAgICAgIDxkaXY+e3sgbGF5ZXIuZ2V0KCd0aXRsZScpIH19PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICA8ZGl2IFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0JCB8IGFzeW5jXCIgY2xhc3M9XCJvLW1hcC13cmFwcGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm8tbWFwXCI+XG4gICAgICA8ZGl2ICNtYXBSZWYgaWQ9XCJtYXBcIj48L2Rpdj5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgc3RlcD1cIjAuMDFcIlxuICAgICAgICB2YWx1ZT1cIjUwXCJcbiAgICAgICAgI3NsaWRlckVsZW1lbnRcbiAgICAgICAgY2xhc3M9XCJvLW1hcC1zbGlkZXJcIlxuICAgICAgICBbY2xhc3MuLWhpZGRlbl09XCIhKGhhc1NsaWRlTGF5ZXIkIHwgYXN5bmMpXCJcbiAgICAgICAgKGlucHV0KT1cInRyaWdnZXJMYXllclJlbmRlcigpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgI3BvcHVwIGNsYXNzPVwibS10b29sdGlwIG0tdG9vbHRpcC0tcG9wdXBcIiBbaGlkZGVuXT1cInRydWVcIiByb2xlPVwidG9vbHRpcFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtLXRvb2x0aXAtLXBvcHVwX19oZWFkZXJcIj5cbiAgICAgIDxwPnt7ICgodG9vbHRpcE1hbmFnZXIudG9vbHRpcERpc3BsYXllZEluZGV4JCB8IGFzeW5jKSA/PyAwKSArIDEgfX0gLyB7eyB0b29sdGlwTWFuYWdlci50b29sdGlwTnVtYmVyIH19PC9wPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAoY2xpY2spPVwidG9vbHRpcE1hbmFnZXIudG9vbHRpcE1vdmUoLTEpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiF0b29sdGlwTWFuYWdlci50b29sdGlwQ2FuTW92ZSgtMSlcIlxuICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFycm93X2JhY2tcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnkgYS1idG4tLWljb24tb25seVwiXG4gICAgICAgIChjbGljayk9XCJ0b29sdGlwTWFuYWdlci50b29sdGlwTW92ZSgxKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdG9vbHRpcE1hbmFnZXIudG9vbHRpcENhbk1vdmUoMSlcIlxuICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFycm93X3JpZ2h0XCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImEtYnRuIGEtYnRuLS1wcmltYXJ5IGEtYnRuLS1pY29uLW9ubHlcIiAoY2xpY2spPVwidG9vbHRpcE1hbmFnZXIuY2xlYXJUb29sdGlwKHRydWUpXCI+XG4gICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0tdG9vbHRpcC0tcG9wdXBfX2NvbnRhaW5lclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAjcG9wdXBDb250ZW50PjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
1207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1tYXAvY29tcG9uZW50L3dpZGdldC1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtbWFwL2NvbXBvbmVudC93aWRnZXQtbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsTUFBTSxFQUdOLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBTUwsY0FBYyxFQUNkLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsbUJBQW1CLEVBRW5CLGNBQWMsRUFFZCxXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLFNBQVMsRUFjVCxlQUFlLEVBQ2YsU0FBUyxFQUNULGlCQUFpQixFQUlqQixjQUFjLEVBR2QsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEQsT0FBTyxFQUFrQixJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFaEQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUs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QUFXLHFKQy9IdEQsaTRvQ0FrdEJBOzsyRkQxbEJhLGtCQUFrQjtrQkFKOUIsU0FBUzsrQkFDRSxnQkFBZ0I7OzBCQThHdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUI7eUNBdkdsQixNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVE7Z0JBQ0MsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPO2dCQUNxQyxZQUFZO3NCQUFsRSxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRyxrQkFBa0I7c0JBQXpFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUMxQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7XG4gIEFnZ3JlZ2F0aW9uUmVzdWx0LFxuICBBdHRyaWJ1dGUsXG4gIEJhc2VXaWRnZXRNYXBMYXllck9wdGlvbnMsXG4gIENoYXJ0QWdncmVnYXRlZFdpZGdldE9wdGlvbnMsXG4gIENsYXNzLFxuICBDbGFzc1NlbGVjdG9ycyxcbiAgQ29uZmlnU2VsZWN0b3JzLFxuICBEYXNoYm9hcmRBY3Rpb25zLFxuICBEYXNoYm9hcmRTZWxlY3RvcnMsXG4gIERhdGFzZXQsXG4gIERhdGFTb3VyY2VTZWxlY3RvcnMsXG4gIERhdGFzb3VyY2VVdGlscyxcbiAgRGF0YVdpZGdldENvbXBvbmVudCxcbiAgRmllbGQsXG4gIEZpZWxkU2VsZWN0b3JzLFxuICBGaWx0ZXJDb250ZXh0LFxuICBHZW9NZXRhZGF0YSxcbiAgR2VvbWV0cmljRmllbGRUeXBlcyxcbiAgR2V0Q2FwYWJpbGl0aWVzUmVzcG9uc2UsXG4gIEl0ZW1VdGlscyxcbiAgTGF5ZXJHcm91cCxcbiAgTWFwQXV0b0xheWVyT3B0aW9ucyxcbiAgTWFwRmVhdHVyZUxheWVyT3B0aW9ucyxcbiAgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zLFxuICBNYXBSYXN0ZXJUaWxlTGF5ZXJPcHRpb25zLFxuICBNYXBWZWN0b3JUaWxlTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMsXG4gIE1hcFdpZGdldExheWVyT3B0aW9ucyxcbiAgTWFwV2lkZ2V0TWFya2VyTGF5ZXJPcHRpb25zLFxuICBNYXBXaWRnZXRPcHRpb25zLFxuICBNYXBXTVNMYXllckxheWVyT3B0aW9ucyxcbiAgTWFwV01UU0xheWVyTGF5ZXJPcHRpb25zLFxuICBOYW1lZFF1ZXJ5VHlwZXMsXG4gIE9wZXJhdGlvbixcbiAgUFJZX0dFT0FVVEhfVE9LRU4sXG4gIFByeUFnZ3JlZ2F0aW9uU2VydmljZSxcbiAgUHJ5R2VvQXV0aFNlcnZpY2UsXG4gIFByeUkxOG5TZXJ2aWNlLFxuICBSZXN1bHRzZXRVdGlscyxcbiAgU3ltYm9sU2VydmljZSxcbiAgVG9vbHRpcEZhY3RvcnlTZXJ2aWNlLFxuICBUb29sdGlwTW9kZSxcbiAgV0lER0VUX0hFQURFUl9IRUlHSFQsXG4gIHdpZGdldE1hcENvbmZpZ1xufSBmcm9tICdAcHJvdm9seS9kYXNoYm9hcmQnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbC9lczYnO1xuaW1wb3J0IHsgRmVhdHVyZSwgTWFwLCBWaWV3IH0gZnJvbSAnb2wnO1xuaW1wb3J0IHsgQ29vcmRpbmF0ZSB9IGZyb20gJ29sL2Nvb3JkaW5hdGUnO1xuaW1wb3J0IHsgYm91bmRpbmdFeHRlbnQsIGNyZWF0ZUVtcHR5IH0gZnJvbSAnb2wvZXh0ZW50JztcbmltcG9ydCB7IENpcmNsZSwgR2VvbWV0cnksIFBvaW50IH0gZnJvbSAnb2wvZ2VvbSc7XG5pbXBvcnQgeyBIZWF0bWFwLCBMYXllciwgVGlsZSB9IGZyb20gJ29sL2xheWVyJztcbmltcG9ydCBCYXNlTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvQmFzZSc7XG5pbXBvcnQgVmVjdG9yTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvVmVjdG9yJztcbmltcG9ydCB7IGZyb21Mb25MYXQgfSBmcm9tICdvbC9wcm9qJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnb2wvcHJvai9wcm9qNCc7XG5pbXBvcnQgeyBEYXRhVGlsZSwgSW1hZ2VXTVMsIFRpbGVXTVMgfSBmcm9tICdvbC9zb3VyY2UnO1xuaW1wb3J0IFZlY3RvclNvdXJjZSBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnb2wvc3R5bGUnO1xuaW1wb3J0IHByb2o0IGZyb20gJ3Byb2o0JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkZWxheSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgZnJvbSxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB3aXRoTGF0ZXN0RnJvbVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uTWFuYWdlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLW1hbmFnZXIuY2xhc3MnO1xuaW1wb3J0IHsgQ3FsVXRpbHMgfSBmcm9tICcuLi91dGlscy9jcWwtdXRpbHMuY2xhc3MnO1xuaW1wb3J0IHsgWE1MVXRpbHMgfSBmcm9tICcuLi91dGlscy94bWwtdXRpbHMuY2xhc3MnO1xuaW1wb3J0IHsgV2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXQtbWFwLWxheWVyLnNlcnZpY2UnO1xuaW1wb3J0IE1hcGJveFZlY3RvckxheWVyIGZyb20gJ29sL2xheWVyL01hcGJveFZlY3Rvcic7XG5pbXBvcnQgeyBXaWRnZXRNYXBVdGlscyB9IGZyb20gJy4uL3V0aWxzL3dpZGdldC1tYXAudXRpbHMnO1xuaW1wb3J0IHsgTGF5ZXJTbGlkZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9sYXllci1zbGlkZXIuY2xhc3MnO1xuaW1wb3J0IFRpbGVMYXllciBmcm9tICdvbC9sYXllci9UaWxlJztcbmltcG9ydCBXZWJHTFRpbGVMYXllciBmcm9tICdvbC9sYXllci9XZWJHTFRpbGUnO1xuaW1wb3J0IHsgQXR0cmlidXRpb24sIGRlZmF1bHRzIH0gZnJvbSAnb2wvY29udHJvbCc7XG5pbXBvcnQgVmVjdG9yVGlsZUxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3RvclRpbGUnO1xuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IFRvb2x0aXBNYW5hZ2VyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vdG9vbHRpcC1tYW5hZ2VyLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IFRPT0xUSVBfUEFERElORyA9IDE1O1xuZXhwb3J0IGNvbnN0IE5PTl9NQU5EQVRPUllfRklUX0xBWUVSX1RZUEVTID0gWyd3bXMnLCAnZ2Vvc2VydmVyJ107XG5leHBvcnQgY29uc3QgREVGQVVMVF9MQVlFUl9HUk9VUCA9ICdERUZBVUxUJztcblxuLy8gRGVmaW5lIExhbWJlcnQgUHJvamVjdGlvblxucHJvajQuZGVmcyhcbiAgJ0VQU0c6MjE1NCcsXG4gICcrcHJvaj1sY2MgK2xhdF8wPTQ2LjUgK2xvbl8wPTMgK2xhdF8xPTQ5ICtsYXRfMj00NCAreF8wPTcwMDAwMCAreV8wPTY2MDAwMDAgK2VsbHBzPUdSUzgwICt0b3dnczg0PTAsMCwwLDAsMCwwLDAgK3VuaXRzPW0gK25vX2RlZnMgK3R5cGU9Y3JzJ1xuKTtcbnJlZ2lzdGVyKHByb2o0KTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHJ5LXdpZGdldC1tYXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0LW1hcC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0TWFwQ29tcG9uZW50IGV4dGVuZHMgRGF0YVdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuICBpZCA9IGAke1dpZGdldE1hcENvbXBvbmVudC5pZENvdW50ZXIrK31gO1xuICBtYXBVcmwkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIEBWaWV3Q2hpbGQoJ21hcFJlZicpIG1hcFJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3BvcHVwJykgcG9wdXAhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwb3B1cENvbnRlbnQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgcG9wdXBDb250ZW50ITogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZXhwb3J0VHlwZVRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBleHBvcnRUeXBlVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdzbGlkZXJFbGVtZW50Jykgc2xpZGVyRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPE1hcFdpZGdldE9wdGlvbnM+O1xuICBsYXllclR5cGVzID0gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuaW1wbGVtZW50YXRpb25MaXN0XG4gICAgLmZpbHRlcigodHlwZSkgPT4gdHlwZSAhPT0gJ2F1dG8nKVxuICAgIC5zb3J0KChhLCBiKSA9PlxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgICAgIC5pbnN0YW50KCdAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLicgKyBhKVxuICAgICAgICAubG9jYWxlQ29tcGFyZSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLmxheWVyVHlwZS4nICsgYikpXG4gICAgKTtcbiAgb3B0aW9uc0NvcHk6IE1hcFdpZGdldE9wdGlvbnMgPSB7fSBhcyBNYXBXaWRnZXRPcHRpb25zO1xuICBjbGFzc2VzJDogT2JzZXJ2YWJsZTxDbGFzc1tdPjtcbiAgZmllbGRzJDogT2JzZXJ2YWJsZTxGaWVsZFtdPjtcbiAgc2VsZWN0ZWRJZHMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgYm90dG9tTGVmdCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgbGF5ZXJzJCE6IE9ic2VydmFibGU8QmFzZUxheWVyW10+O1xuICBtYXAhOiBNYXA7XG4gIGFkZGl0aW9uYWxMYXllcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U8R2VvbWV0cnk+PltdPihbXSk7XG4gIHN0eWxlcyQ6IE9ic2VydmFibGU8XG4gICAge1xuICAgICAgaWRlbnRpZmllcjogc3RyaW5nO1xuICAgICAgbGFiZWw6IHN0cmluZztcbiAgICB9W11cbiAgPjtcbiAgV0lER0VUX0hFQURFUl9IRUlHSFQgPSBXSURHRVRfSEVBREVSX0hFSUdIVDtcbiAgaSA9IDA7XG4gIGl0ZW1TdHlsZXMkITogT2JzZXJ2YWJsZTx7XG4gICAgW2lkOiBzdHJpbmddOiB7XG4gICAgICBjbGFzc2ljOiBTdHlsZTtcbiAgICAgIGJvcmRlcmVkOiBTdHlsZTtcbiAgICB9O1xuICB9PjtcbiAgaGVpZ2h0JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBhY3Rpb25zJCA9IHdpZGdldE1hcENvbmZpZy5hY3Rpb25zJDtcbiAgZ2VvU2VydmVyTGF5ZXJEZXNjcmlwdGlvbnMkOiBPYnNlcnZhYmxlPE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1tdPjtcbiAgbGVnZW5kVGFiT3BlbiA9IGZhbHNlO1xuICBsYXllcnNUYWJPcGVuID0gZmFsc2U7XG4gIGxlZ2VuZFRhYkNsb3NlZDogYm9vbGVhbltdID0gW107XG4gIGxlZ2VuZExheWVycyQhOiBPYnNlcnZhYmxlPChNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMgfCBNYXBXTVNMYXllckxheWVyT3B0aW9ucylbXT47XG4gIGxlZ2VuZFRvcCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgbGF5ZXJzVG9wJCE6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgbGVnZW5kSGVpZ2h0JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBsYXllcnNIZWlnaHQkITogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBpbWFnZU5vdFByb3ZpZGVkOiBib29sZWFuW10gPSBbXTtcbiAgYmFzaWNBY3Rpb25zJDogT2JzZXJ2YWJsZTwoJ2NsaWNrJyB8ICdsYXNzbycgfCAncmVjdGFuZ2xlJyB8ICd6b29tJyB8ICdtb3ZlJyB8ICdleHBvcnQnIHwgJ3VwbG9hZCcpW10+O1xuICB6b29tQW5kQ2VudGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHpvb20/OiB7XG4gICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgbWluOiBudW1iZXI7XG4gICAgICBtYXg6IG51bWJlcjtcbiAgICB9O1xuICAgIGNlbnRlcj86IG51bWJlcltdO1xuICB9Pih7fSk7XG4gIG1hcFN0eWxlVXJsJCE6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD47XG4gIGludGVyYWN0aW9uTWFuYWdlcjogSW50ZXJhY3Rpb25NYW5hZ2VyID0gbmV3IEludGVyYWN0aW9uTWFuYWdlcigpO1xuICB0b29sdGlwTWFuYWdlcjogVG9vbHRpcE1hbmFnZXIgPSBuZXcgVG9vbHRpcE1hbmFnZXIoKTtcbiAgbWFwU3R5bGVMYXllciQhOiBPYnNlcnZhYmxlPChWZWN0b3JUaWxlTGF5ZXIgfCBUaWxlTGF5ZXI8YW55PilbXT47XG4gIFNUWUxFX0ZST01fVVJMID0gJ191cmwnO1xuICBOT19TVFlMRSA9ICdub25lJztcbiAgd21zQ2FwYWJpbGl0aWVzJDogT2JzZXJ2YWJsZTxcbiAgICB8IHtcbiAgICAgICAgW3A6IHN0cmluZ106IEdldENhcGFiaWxpdGllc1Jlc3BvbnNlIHwgbnVsbDtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZFxuICA+O1xuICBhdXRvRGF0YXNldExheWVycyQ6IE9ic2VydmFibGU8TWFwQXV0b0xheWVyT3B0aW9uc1tdPjtcbiAgZml0RXh0ZW50cyQhOiBPYnNlcnZhYmxlPFxuICAgIHtcbiAgICAgIGRhdGFzb3VyY2U6IHN0cmluZztcbiAgICAgIGV4dGVudDogQ29vcmRpbmF0ZVtdO1xuICAgICAgZXJyb3I6IGJvb2xlYW47XG4gICAgfVtdXG4gID47XG4gIGRhdGFzb3VyY2VGaWx0ZXJzJDogT2JzZXJ2YWJsZTxhbnk+O1xuICB1c2VkQ2xhc3NlcyQ6IE9ic2VydmFibGU8YW55PjtcbiAgbGF5ZXJTbGlkZXIgPSBuZXcgTGF5ZXJTbGlkZXIoKTtcbiAgaGFzU2xpZGVMYXllciQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHNsaWRlczogeyBpZDogdW5kZWZpbmVkIHwgc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXTtcbiAgcG9zc2libGVTdHlsZXM6IHtcbiAgICBbcDogc3RyaW5nXToge1xuICAgICAgbGF5ZXJzOiB7IFtwOiBzdHJpbmddOiB7IHBhcmFtOiBzdHJpbmc7IHN0eWxlczogeyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSB9IH0gfCBudWxsO1xuICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgfSA9IHt9O1xuICBhdHRyaWJ1dGlvbnMgPSBuZXcgQXR0cmlidXRpb24oKTtcbiAgYWN0aW9uTWVudU9wZW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIGF0dHJpYnV0aW9ucyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIG9sWm9vbUVsZW1lbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBwcmV2aW91c0xheWVyczogQmFzZUxheWVyW10gPSBbXTtcbiAgbGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGU6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHVibGljIHRyYW5zbGF0ZVNlcnZpY2U6IFByeUkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9vbHRpcEZhY3RvcnlTZXJ2aWNlOiBUb29sdGlwRmFjdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzeW1ib2xTZXJ2aWNlOiBTeW1ib2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgd2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlOiBXaWRnZXRNYXBMYXllclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcnlBZ2dyZWdhdGlvblNlcnZpY2U6IFByeUFnZ3JlZ2F0aW9uU2VydmljZSxcbiAgICBlbDogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBSWV9HRU9BVVRIX1RPS0VOKSBwcml2YXRlIGdlb0F1dGhTZXJ2aWNlOiBQcnlHZW9BdXRoU2VydmljZVxuICApIHtcbiAgICBzdXBlcihzdG9yZSwgZWwpO1xuXG4gICAgdGhpcy5nZXRPbFpvb21FbGVtZW50KCk7XG5cbiAgICB0aGlzLnNsaWRlcyA9IFtcbiAgICAgIHsgaWQ6ICdhbGwnLCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZS5hbGwnKSB9LFxuICAgICAgeyBpZDogJ2xlZnQnLCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZS5sZWZ0JykgfSxcbiAgICAgIHsgaWQ6ICdyaWdodCcsIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnNsaWRlLnJpZ2h0JykgfVxuICAgIF07XG5cbiAgICB0aGlzLndpZGdldE1hcExheWVyU2VydmljZS53aXRoR2VvQXV0aCh0aGlzLmdlb0F1dGhTZXJ2aWNlKTtcblxuICAgIHRoaXMuYmFzaWNBY3Rpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5hY3Rpb25zJCxcbiAgICAgIHRoaXMuYWN0aW9uTWVudU9wZW4kLFxuICAgICAgdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIuc2VsZWN0aW9uSW50ZXJhY3Rpb24uc2VsZWN0aW9uVHlwZSRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbYWN0aW9ucywgbWVudU9wZW4sIHNlbGVjdGlvblR5cGVdKSA9PlxuICAgICAgICBtZW51T3BlblxuICAgICAgICAgID8gYWN0aW9ucy5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uICE9PSAnZXhwb3J0JyAmJiBhY3Rpb24gIT09ICd1cGxvYWQnKVxuICAgICAgICAgIDogYWN0aW9uc1xuICAgICAgICAgICAgICAuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbiAhPT0gJ2V4cG9ydCcgJiYgYWN0aW9uICE9PSAndXBsb2FkJylcbiAgICAgICAgICAgICAgLmZpbHRlcigoYWN0aW9uKSA9PiBzZWxlY3Rpb25UeXBlID09PSBhY3Rpb24pXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuY2xhc3NlcyQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpXG4gICAgICAucGlwZShtYXAoKGNsYXNzZXMpID0+IGNsYXNzZXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSkpKTtcbiAgICB0aGlzLnVzZWRDbGFzc2VzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuY2xhc3NlcyQsIHRoaXMudXNlZERhdGFzb3VyY2VzJF0pLnBpcGUoXG4gICAgICBtYXAoKFtjbGFzc2VzLCBkYXRhc291cmNlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIGNsYXNzZXMuZmlsdGVyKChjbGFzc0l0ZW0pID0+XG4gICAgICAgICAgZGF0YXNvdXJjZXMuc29tZSgoZGF0YVNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2Uuc291cmNlVHlwZSA9PT0gJ25hbWVkUXVlcnknICYmICd0eXBlJyBpbiBkYXRhU291cmNlLnJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UucmVxdWVzdC50eXBlID09PSBOYW1lZFF1ZXJ5VHlwZXMuTVVMVElfQ0xBU1MgfHxcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlLnJlcXVlc3QudHlwZSA9PT0gTmFtZWRRdWVyeVR5cGVzLkZVTExfVEVYVFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2Uuc291cmNlVHlwZSA9PT0gJ2RhdGFzZXQnXG4gICAgICAgICAgICAgID8gZGF0YVNvdXJjZS5vQ2xhc3MgPT09IGNsYXNzSXRlbS5pZFxuICAgICAgICAgICAgICA6IGRhdGFTb3VyY2Uuc291cmNlVHlwZSA9PT0gJ25hbWVkUXVlcnknICYmICdvQ2xhc3MnIGluIGRhdGFTb3VyY2UucmVxdWVzdFxuICAgICAgICAgICAgICAgID8gZGF0YVNvdXJjZS5yZXF1ZXN0Lm9DbGFzcyA9PT0gY2xhc3NJdGVtLmlkXG4gICAgICAgICAgICAgICAgOiBkYXRhU291cmNlLnNvdXJjZVR5cGUgPT09ICduYW1lZFF1ZXJ5JyAmJiAndHlwZScgaW4gZGF0YVNvdXJjZS5yZXF1ZXN0XG4gICAgICAgICAgICAgICAgICA/IGRhdGFTb3VyY2UucmVxdWVzdC50eXBlID09PSBOYW1lZFF1ZXJ5VHlwZXMuTU9OT19DTEFTU1xuICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuZmllbGRzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KEZpZWxkU2VsZWN0b3JzLmZpZWxkcyk7XG5cbiAgICB0aGlzLmRhdGFzb3VyY2VGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmRhdGFzb3VyY2VGaWx0ZXJzKSxcbiAgICAgIHRoaXMuZGF0YXNvdXJjZUlkcyRcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoW2ZpbHRlcnMsIGlkc10pID0+XG4gICAgICAgICAgT2JqZWN0LmtleXMoZmlsdGVycylcbiAgICAgICAgICAgIC5maWx0ZXIoKGZpbHRlckRzS2V5KSA9PiBpZHMuaW5jbHVkZXMoZmlsdGVyRHNLZXkpKVxuICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gKHsgLi4ucCwgW2NdOiBmaWx0ZXJzW2NdIH0pLCB7fSkgYXMge1xuICAgICAgICAgICAgW3A6IHN0cmluZ106IEZpbHRlckNvbnRleHRbXTtcbiAgICAgICAgICB9XG4gICAgICApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKVxuICAgICk7XG5cbiAgICB0aGlzLnN0eWxlcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMubWFwU3R5bGVzKS5waXBlKFxuICAgICAgbWFwKChzdHlsZXMpID0+XG4gICAgICAgIHN0eWxlcy5jb25jYXQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5OT19TVFlMRSxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLm5vU3R5bGUnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5TVFlMRV9GUk9NX1VSTCxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnN0eWxlRnJvbVVybCcpXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkSWRzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5zZWxlY3RlZEl0ZW1JZHMpO1xuXG4gICAgdGhpcy5nZW9TZXJ2ZXJMYXllckRlc2NyaXB0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMudXNlZERhdGFzb3VyY2VzJC5waXBlKFxuICAgICAgICBzdGFydFdpdGgoW10pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpXG4gICAgICApLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoQ29uZmlnU2VsZWN0b3JzLmdlb1NlcnZlclVybCkucGlwZShzdGFydFdpdGgodW5kZWZpbmVkKSlcbiAgICBdKS5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDEwMCksXG4gICAgICBtYXAoKFtkYXRhU291cmNlcywgZ2VvU2VydmVyVXJsXSkgPT4ge1xuICAgICAgICBpZiAoIWdlb1NlcnZlclVybCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNcbiAgICAgICAgICAuZmlsdGVyKChkcykgPT4gRGF0YXNvdXJjZVV0aWxzLmlzR2VvKGRzKSlcbiAgICAgICAgICAubWFwKChkcykgPT4ge1xuICAgICAgICAgICAgZHMgPSBkcyBhcyB1bmtub3duIGFzIERhdGFzZXQ7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YXM6IHtcbiAgICAgICAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgICAgICAgICAgfSA9IHt9O1xuICAgICAgICAgICAgZHMubWV0YWRhdGE/LmZvckVhY2goKG0pID0+IChtZXRhZGF0YXNbbS5tZXRhZGF0YURlZi5uYW1lXSA9IG0udmFsdWUpKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdnZW9zZXJ2ZXInLFxuICAgICAgICAgICAgICB1cmw6IGAke2dlb1NlcnZlclVybH0vJHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YXNbR2VvTWV0YWRhdGEuTkFNRVNQQUNFXS5sZW5ndGggPiAwID8gbWV0YWRhdGFzW0dlb01ldGFkYXRhLk5BTUVTUEFDRV0gKyAnLycgOiAnJ1xuICAgICAgICAgICAgICB9d21zP1NFUlZJQ0U9V01TJlZFUlNJT049MS4zLjBgLFxuICAgICAgICAgICAgICBwYXJhbVRpbGVkOiB0cnVlLFxuICAgICAgICAgICAgICBvcGFjaXR5OiBwYXJzZUludChtZXRhZGF0YXNbR2VvTWV0YWRhdGEuT1BBQ0lUWV0gPz8gMTAwLCAxMCksXG4gICAgICAgICAgICAgIG9DbGFzczogZHMub0NsYXNzLFxuICAgICAgICAgICAgICBrZXk6IG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5OQU1FU1BBQ0VdICsgJzonICsgbWV0YWRhdGFzW0dlb01ldGFkYXRhLktFWV0sXG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogbWV0YWRhdGFzW0dlb01ldGFkYXRhLk5BTUVTUEFDRV0sXG4gICAgICAgICAgICAgIHBhcmFtTGF5ZXI6IG1ldGFkYXRhc1tHZW9NZXRhZGF0YS5LRVldLFxuICAgICAgICAgICAgICBuYW1lOiBkcy5uYW1lLFxuICAgICAgICAgICAgICBkYXRhc291cmNlSWQ6IGRzLmlkLFxuICAgICAgICAgICAgICBncm91cDogREVGQVVMVF9MQVlFUl9HUk9VUFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAoKGxheWVyKSA9PiBsYXllciBhcyBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMpO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gZXF1YWwocCwgYykpLFxuICAgICAgc3RhcnRXaXRoKFtdKVxuICAgICk7XG5cbiAgICB0aGlzLmF1dG9EYXRhc2V0TGF5ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMudXNlZERhdGFzb3VyY2VzJC5waXBlKFxuICAgICAgICBzdGFydFdpdGgoW10pLFxuICAgICAgICBtYXAoXG4gICAgICAgICAgKGRhdGFzb3VyY2VzKSA9PlxuICAgICAgICAgICAgZGF0YXNvdXJjZXMuZmlsdGVyKChkcykgPT4gZHMuc291cmNlVHlwZSA9PT0gJ2RhdGFzZXQnICYmICFEYXRhc291cmNlVXRpbHMuaXNHZW8oZHMpKSBhcyBEYXRhc2V0W11cbiAgICAgICAgKVxuICAgICAgKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbY2xhc3NlcywgZGF0YVNldHNdKSA9PlxuICAgICAgICAgIGRhdGFTZXRzXG4gICAgICAgICAgICAubWFwKChkcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IGNsYXNzZXMuZmluZCgoY2xhenopID0+IGNsYXp6LmlkID09PSBkcy5vQ2xhc3MpO1xuICAgICAgICAgICAgICBjb25zdCBnZW9BdHRyaWJ1dGVzID0gKG1vZGVsPy5hdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gYXR0cikgPz8gW10pLmZpbHRlcigoYXR0cikgPT5cbiAgICAgICAgICAgICAgICBHZW9tZXRyaWNGaWVsZFR5cGVzLmluY2x1ZGVzKGF0dHIuZmllbGQudHlwZSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdlb0F0dHJpYnV0ZXMubWFwKFxuICAgICAgICAgICAgICAgIChhdHRyKSA9PlxuICAgICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2F1dG8nLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogYCR7ZHMubmFtZX0ke2dlb0F0dHJpYnV0ZXMubGVuZ3RoID4gMSA/ICcgLSAnICsgYXR0ci5uYW1lIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgb0NsYXNzOiBkcy5vQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIGtleTogZHMuaWQsXG4gICAgICAgICAgICAgICAgICAgIHN1YlR5cGU6IGF0dHIuZmllbGQhLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFtkcy5vQ2xhc3NdLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6IGF0dHIudGVjaG5pY2FsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IERFRkFVTFRfTEFZRVJfR1JPVVBcbiAgICAgICAgICAgICAgICAgIH0pIGFzIE1hcEF1dG9MYXllck9wdGlvbnNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmxhdCgpIGFzIE1hcEF1dG9MYXllck9wdGlvbnNbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5tYW5pZmVzdCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChtYW5pZmVzdCkgPT5cbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgKCgobWFuaWZlc3Qub3B0aW9ucyA/PyB7IGxheWVyczogW10gfSkgYXMgTWFwV2lkZ2V0T3B0aW9ucykubGF5ZXJzID8/IFtdKS5maWx0ZXIoKGxheWVyKSA9PlxuICAgICAgICAgICAgICAgIFsnd21zJ10uaW5jbHVkZXMobGF5ZXIudHlwZSlcbiAgICAgICAgICAgICAgKSBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9uc1tdXG4gICAgICAgICAgICApLm1hcCgobGF5ZXIpID0+IGxheWVyLnVybClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodXJscykgPT4gdXJscy5mb3JFYWNoKCh1cmwpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5nZXRDYXBhYmlsaXR5KHsgdXJsIH0pKSkpXG4gICAgKTtcblxuICAgIHRoaXMud21zQ2FwYWJpbGl0aWVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5jYXBhYmlsaXRpZXMpO1xuXG4gICAgdGhpcy5vcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5tYW5pZmVzdCQsXG4gICAgICB0aGlzLnJlc3VsdFNldCQsXG4gICAgICB0aGlzLmNsYXNzZXMkLFxuICAgICAgdGhpcy5maWVsZHMkLFxuICAgICAgdGhpcy5zdHlsZXMkLFxuICAgICAgdGhpcy5nZW9TZXJ2ZXJMYXllckRlc2NyaXB0aW9ucyQsXG4gICAgICB0aGlzLndtc0NhcGFiaWxpdGllcyQsXG4gICAgICB0aGlzLmF1dG9EYXRhc2V0TGF5ZXJzJFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFttYW5pZmVzdCwgcmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMsIG1hcFN0eWxlcywgZ2VvTGF5ZXJzLCBjYXBhYmlsaXRpZXMsIGF1dG9EYXRhc2V0TGF5ZXJzXSkgPT4ge1xuICAgICAgICAvLyBhdXRvIGRldGVybWluZSBsYXllcnMgcGFyYW1ldGVycyB0byBwcm92aWRlIGEgd29ya2luZyB2aWV3XG4gICAgICAgIGNvbnN0IGF1dG9PcHRpb25zID0gc3RydWN0dXJlZENsb25lKG1hbmlmZXN0Lm9wdGlvbnMgPz8ge30pIGFzIE1hcFdpZGdldE9wdGlvbnM7XG4gICAgICAgIGlmICghYXV0b09wdGlvbnMudG9vbHRpcE1vZGUpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy50b29sdGlwTW9kZSA9IFRvb2x0aXBNb2RlLkNMSUNLO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gW1xuICAgICAgICAgIC4uLihhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnR5cGUgIT09ICdhdXRvJyksXG4gICAgICAgICAgLi4uKGF1dG9PcHRpb25zLmF1dG9tYXRpY0xheWVyc1xuICAgICAgICAgICAgPyBhdXRvRGF0YXNldExheWVyc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAobGF5ZXIpID0+XG4gICAgICAgICAgICAgICAgICAgICFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgIWF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5pbmNsdWRlcyhsYXllci5rZXkgKyAnLScgKyBsYXllci5zdWJUeXBlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChsYXllcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLmxheWVyLFxuICAgICAgICAgICAgICAgICAgLi4uKChhdXRvT3B0aW9ucy5sYXllcnMgPz8gW10pLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgKHByZXZMYXllcikgPT4gcHJldkxheWVyLmtleSA9PT0gbGF5ZXIua2V5ICYmIHByZXZMYXllci5hdHRyaWJ1dGUgPT09IGxheWVyLmF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgKSA/PyB7fSlcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogW10pXG4gICAgICAgIF07XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzPy5mb3JFYWNoKChsYXllciwgaSkgPT4ge1xuICAgICAgICAgIFdpZGdldE1hcFV0aWxzLnBvcHVsYXRlTG9jYXRpb25BdHRyaWJ1dGUobGF5ZXIsIHJlc3VsdFNldCwgY2xhc3NlcywgZmllbGRzKTtcbiAgICAgICAgICBXaWRnZXRNYXBVdGlscy5wb3B1bGF0ZUludGVuc2l0eUF0dHJpYnV0ZShsYXllciwgcmVzdWx0U2V0LCBjbGFzc2VzLCBmaWVsZHMpO1xuICAgICAgICAgIGlmIChhdXRvT3B0aW9ucy5hdHRyaWJ1dGlvbnMpIHtcbiAgICAgICAgICAgIGxheWVyLmF0dHJpYnV0aW9uID0gbGF5ZXIuYXR0cmlidXRpb24gPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhY3R1YWxMYXllcktleXMgPSAoYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKVxuICAgICAgICAgIC5tYXAoKGxheWVyKSA9PiAobGF5ZXIgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKS5rZXkgPz8gbnVsbClcbiAgICAgICAgICAuZmlsdGVyKChrZXkpID0+ICEha2V5KTtcblxuICAgICAgICAvLyBHZXQgYWxsIHByZXZpb3VzIGxheWVycywgd2l0aG91dCBnZW9zZXJ2ZXIgbGF5ZXJzIHRoYXQgYXJlIG5vdCByZXF1ZXN0ZWQgYW55bW9yZSwgdGhlbiBhZGQgbmV3IGdlb3NlcnZlciBsYXllcnMgKHBvdGVudGlhbGx5IHdpdGggYSBwcmVjb25maWcgZnJvbSBtYW5pZmVzdCkuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycyA9IFtcbiAgICAgICAgICAuLi4oYXV0b09wdGlvbnMubGF5ZXJzID8/IFtdKS5tYXAoKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZW9MYXllciA9IGdlb0xheWVycy5maW5kKChnZW9MYXllcikgPT4gbGF5ZXIua2V5ID09PSBnZW9MYXllci5rZXkpID8/IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbGF5ZXIudHlwZSA9PT0gJ2dlb3NlcnZlcidcbiAgICAgICAgICAgICAgPyBnZW9MYXllclxuICAgICAgICAgICAgICAgID8geyAuLi5nZW9MYXllciwgLi4ubGF5ZXIsIHVybDogZ2VvTGF5ZXIudXJsIH1cbiAgICAgICAgICAgICAgICA6IChudWxsIGFzIHVua25vd24gYXMgTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKVxuICAgICAgICAgICAgICA6IHsgLi4ubGF5ZXIgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5nZW9MYXllcnMuZmlsdGVyKChsYXllcikgPT4gIWFjdHVhbExheWVyS2V5cy5pbmNsdWRlcyhsYXllci5rZXkpKVxuICAgICAgICBdLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIpO1xuXG4gICAgICAgIGF1dG9PcHRpb25zLmxheWVycy5mb3JFYWNoKChsYXllciwgaW5kZXgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHRMYXllclRpdGxlKGxheWVyLCBpbmRleCwgY2FwYWJpbGl0aWVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICEhbWFwU3R5bGVzICYmXG4gICAgICAgICAgbWFwU3R5bGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAoIWF1dG9PcHRpb25zLnN0eWxlIHx8ICFtYXBTdHlsZXMubWFwKChzdHlsZSkgPT4gc3R5bGUuaWRlbnRpZmllcikuaW5jbHVkZXMoYXV0b09wdGlvbnMuc3R5bGUpKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBsaWdodFN0eWxlcyA9IG1hcFN0eWxlcy5maWx0ZXIoKHN0eWxlKSA9PiAhKHN0eWxlLmlkZW50aWZpZXIgPz8gJy0nKS5pbmNsdWRlcygnZGFyaycpKTtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5zdHlsZSA9IGxpZ2h0U3R5bGVzLmxlbmd0aCA+IDAgPyBsaWdodFN0eWxlc1swXS5pZGVudGlmaWVyIDogbWFwU3R5bGVzWzBdLmlkZW50aWZpZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyKSB7XG4gICAgICAgICAgY29uc3QgYmFzZSA9IGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllcjtcblxuICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGlnbm9yZUF1dG9MYXllcnMsIHZhbHVlcyB0aGF0IGFyZSBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgY29uc3QgcG9zc2libGVJZ25vcmVBdXRvTGF5ZXJLZXlzID0gYXV0b0RhdGFzZXRMYXllcnMubWFwKChsYXllcikgPT4gbGF5ZXIua2V5ICsgJy0nICsgbGF5ZXIuc3ViVHlwZSk7XG4gICAgICAgICAgYXV0b09wdGlvbnMuaWdub3JlQXV0b0xheWVyID0gKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllciA/PyBbXSkuZmlsdGVyKChrZXkpID0+XG4gICAgICAgICAgICBwb3NzaWJsZUlnbm9yZUF1dG9MYXllcktleXMuaW5jbHVkZXMoa2V5KVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFhdXRvT3B0aW9ucy5pZ25vcmVBdXRvTGF5ZXIgfHwgYmFzZS5sZW5ndGggIT09IGF1dG9PcHRpb25zLmlnbm9yZUF1dG9MYXllci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdE1hbmlmZXN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gV2lkZ2V0TWFwVXRpbHMuYXNzaWduTGF5ZXJzT3JkZXIoYXV0b09wdGlvbnMubGF5ZXJzKTtcblxuICAgICAgICBpZiAoYXV0b09wdGlvbnMuZml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5sYXllcnMuZm9yRWFjaChcbiAgICAgICAgICAgIChsYXllcikgPT4gKGxheWVyLmZpdCA9ICFOT05fTUFOREFUT1JZX0ZJVF9MQVlFUl9UWVBFUy5pbmNsdWRlcyhsYXllci50eXBlKSB8fCBhdXRvT3B0aW9ucy5maXQpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgYXV0b09wdGlvbnMuZml0O1xuICAgICAgICB9XG5cbiAgICAgICAgW1xuICAgICAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgIGF1dG9PcHRpb25zLmxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBbJ3dtcycsICdnZW9zZXJ2ZXInXS5pbmNsdWRlcyhsYXllci50eXBlKSkgYXMgKFxuICAgICAgICAgICAgICAgIHwgTWFwV01TTGF5ZXJMYXllck9wdGlvbnNcbiAgICAgICAgICAgICAgICB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9uc1xuICAgICAgICAgICAgICApW11cbiAgICAgICAgICAgICkubWFwKChsYXllcikgPT4gbGF5ZXIudXJsKVxuICAgICAgICAgIClcbiAgICAgICAgXS5mb3JFYWNoKCh1cmwpID0+IHtcbiAgICAgICAgICBpZiAoY2FwYWJpbGl0aWVzICYmIGNhcGFiaWxpdGllc1t1cmxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5nZXRDYXBhYmlsaXR5KHsgdXJsOiB1cmwgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXV0b09wdGlvbnMubGF5ZXJzID0gYXV0b09wdGlvbnMubGF5ZXJzLm1hcCgobGF5ZXIpID0+ICh7XG4gICAgICAgICAgLi4ubGF5ZXIsXG4gICAgICAgICAgdGl0bGU6IGxheWVyLnRpdGxlID8/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLiR7bGF5ZXIudHlwZX1gLCB7IC4uLmxheWVyIH0pLFxuICAgICAgICAgIGdyb3VwOiBsYXllci5ncm91cCA/PyBERUZBVUxUX0xBWUVSX0dST1VQXG4gICAgICAgIH0pKTtcblxuICAgICAgICBhdXRvT3B0aW9ucy5sYXllckdyb3VwcyA9IGF1dG9PcHRpb25zLmxheWVyR3JvdXBzID8/IFtdO1xuICAgICAgICBpZiAoIWF1dG9PcHRpb25zLmxheWVyR3JvdXBzLmZpbmQoKGcpID0+IGcubmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCkpIHtcbiAgICAgICAgICBhdXRvT3B0aW9ucy5sYXllckdyb3Vwcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6ICdERUZBVUxUJyxcbiAgICAgICAgICAgIHNpbmdsZUxheWVyOiBmYWxzZSxcbiAgICAgICAgICAgIHZpc2libGVMYXllcnM6IGF1dG9PcHRpb25zLmxheWVyc1xuICAgICAgICAgICAgICA/IGF1dG9PcHRpb25zLmxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCkubWFwKChsYXllcikgPT4gbGF5ZXIudGl0bGUpXG4gICAgICAgICAgICAgIDogKFtdIGFzIHN0cmluZ1tdKVxuICAgICAgICAgIH0gYXMgTGF5ZXJHcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXV0b09wdGlvbnM7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMub3B0aW9ucyQucGlwZShmaWx0ZXIoKG9wdCkgPT4gISFvcHQpKS5zdWJzY3JpYmUoKG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weSA9IHN0cnVjdHVyZWRDbG9uZShvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZvckVhY2goXG4gICAgICAgICAgKGxheWVyKSA9PiAodGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSA/PyAnTUlTU0lORyBUSVRMRSddID0gZmFsc2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnM/Lm1hcCgobGF5ZXIpID0+ICh7XG4gICAgICAgICAgLi4ubGF5ZXIsXG4gICAgICAgICAgZ3JvdXA6IGxheWVyLmdyb3VwID8/IERFRkFVTFRfTEFZRVJfR1JPVVBcbiAgICAgICAgfSkpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5tYXBVcmwkID0gdGhpcy5zdG9yZS5zZWxlY3QoQ29uZmlnU2VsZWN0b3JzLm1hcFVybCk7XG5cbiAgICB0aGlzLmJvdHRvbUxlZnQkID0gdGhpcy53aWRnZXRTaXplJC5waXBlKFxuICAgICAgbWFwKChzaXplKSA9PiBgdHJhbnNsYXRlKDEwcHggLGNhbGMoJHtzaXplLmhlaWdodH1weCAtIDEwMCUgLSAxMHB4KSlgKSxcbiAgICAgIGRlbGF5KDEwKVxuICAgICk7XG5cbiAgICB0aGlzLml0ZW1TdHlsZXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5yZXN1bHRTZXQkLCB0aGlzLm1hbmlmZXN0JCwgdGhpcy5zdGF0aWNSZXN1bHRTZXQkXSkucGlwZShcbiAgICAgIG1lcmdlTWFwKChbcnMsIG1hbmlmZXN0LCBzcnNdKSA9PiB7XG4gICAgICAgIGlmICgobWFuaWZlc3QuZGF0YXNvdXJjZSA9PT0gdW5kZWZpbmVkIHx8IG1hbmlmZXN0LmRhdGFzb3VyY2UubGVuZ3RoID09PSAwKSAmJiAhc3JzKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHtcbiAgICAgICAgICAgICAgW2lkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICAgICAgY2xhc3NpYzogU3R5bGU7XG4gICAgICAgICAgICAgICAgYm9yZGVyZWQ6IFN0eWxlO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0b3RhbCA9IE9iamVjdC52YWx1ZXMocnMuaXRlbXMpLnJlZHVjZSgocCwgYykgPT4gYy5sZW5ndGggKyBwLCAwKTtcbiAgICAgICAgICAgICAgaWYgKHRvdGFsID09PSAwKSByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMge1xuICAgICAgICAgICAgICAgIFtpZDogc3RyaW5nXToge1xuICAgICAgICAgICAgICAgICAgY2xhc3NpYzogU3R5bGU7XG4gICAgICAgICAgICAgICAgICBib3JkZXJlZDogU3R5bGU7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhycy5pdGVtcykuZm9yRWFjaCgoaXRlbXMpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bWJvbFNlcnZpY2UuZ2V0U3ltYm9sQXNJY29uU3R5bGUoaXRlbSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltYm9sU2VydmljZS5nZXRTeW1ib2xBc0ljb25TdHlsZShpdGVtLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgXSkudGhlbigoW3N0eWxlLCBiU3R5bGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpdGVtLmlkXSA9IHsgY2xhc3NpYzogc3R5bGUsIGJvcmRlcmVkOiBiU3R5bGUgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID49IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmhlaWdodCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpZGdldFNpemUkLnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLCB0aGlzLmRpc3BsYXlIZWFkZXIkXSkucGlwZShcbiAgICAgIG1hcCgoW3NpemUsIGRpc3BsYXldKSA9PiAoc2l6ZS5oZWlnaHQgPz8gMTAwKSAtIChkaXNwbGF5ID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKSksXG4gICAgICBkZWxheSgxMClcbiAgICApO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGlvbnMkID0gdGhpcy5vcHRpb25zJC5waXBlKG1hcCgob3B0aW9ucykgPT4gISFvcHRpb25zLmF0dHJpYnV0aW9ucykpO1xuXG4gICAgdGhpcy5sZWdlbmRUb3AkID0gY29tYmluZUxhdGVzdChbdGhpcy5kaXNwbGF5SGVhZGVyJCwgdGhpcy5hdHRyaWJ1dGlvbnMkXSkucGlwZShcbiAgICAgIG1hcCgoW2hlYWRlciwgYXR0cl0pID0+IDUgKyAoaGVhZGVyID8gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgOiAwKSArIChhdHRyID8gNjEgOiAwKSlcbiAgICApO1xuXG4gICAgdGhpcy5sZWdlbmRIZWlnaHQkID0gY29tYmluZUxhdGVzdChbdGhpcy53aWRnZXRTaXplJC5waXBlKGRlYm91bmNlVGltZSgxMDApKSwgdGhpcy5sZWdlbmRUb3AkXSkucGlwZShcbiAgICAgIG1hcCgoW3NpemUsIHRvcF0pID0+IHtcbiAgICAgICAgcmV0dXJuIChzaXplLmhlaWdodCA/PyAxMDApIC0gV0lER0VUX0hFQURFUl9IRUlHSFQudmFsdWUgLSB0b3AgLSA1NjsgLy8gNTZweCBpcyB0aGUgcG9waW4gdGl0bGUgaGVpZ2h0ICsgbWFyZ2luXG4gICAgICB9KSxcbiAgICAgIGRlbGF5KDEwKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy53bXNDYXBhYmlsaXRpZXMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgod21zQ2FwYWJpbGl0aWVzKSA9PlxuICAgICAgICAgICAgd21zQ2FwYWJpbGl0aWVzXG4gICAgICAgICAgICAgID8gT2JqZWN0LmtleXMod21zQ2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgICAgICAgLm1hcCgodXJsKSA9PiAoeyB1cmwsIGxheWVyczogWE1MVXRpbHMuZ2V0UG9zc2libGVMYXllclN0eWxlcyh3bXNDYXBhYmlsaXRpZXNbdXJsXT8uZG9jKSB9KSlcbiAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHAsIGMpID0+ICh7IC4uLnAsIFtjLnVybF06IGMgfSksIHt9KVxuICAgICAgICAgICAgICA6IHt9XG4gICAgICAgICAgKSxcbiAgICAgICAgICBzdGFydFdpdGgoe30pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocG9zc2libGVTdHlsZXMpID0+ICh0aGlzLnBvc3NpYmxlU3R5bGVzID0gcG9zc2libGVTdHlsZXMpKVxuICAgICk7XG5cbiAgICB0aGlzLmhhc1NsaWRlTGF5ZXIkID0gdGhpcy5vcHRpb25zJC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zKSA9PlxuICAgICAgICAob3B0aW9ucy5sYXllcnMgPz8gW10pLm1hcCgobGF5ZXIpID0+ICEhbGF5ZXIuc2xpZGUgJiYgbGF5ZXIuc2xpZGUgIT09ICdhbGwnKS5yZWR1Y2UoKGEsIGIpID0+IGEgfHwgYiwgZmFsc2UpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGluaXRJbnRlcmFjdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLmluaXQodGhpcyk7XG4gIH1cblxuICBpbml0VG9vbHRpcE1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHRpcE1hbmFnZXIuaW5pdChcbiAgICAgIHRoaXMudG9vbHRpcEZhY3RvcnlTZXJ2aWNlLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgIHRoaXMuc3RvcmUsXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMsXG4gICAgICB0aGlzLndpZGdldFNpemUkLFxuICAgICAgdGhpcy5kaXNwbGF5SGVhZGVyJCxcbiAgICAgIHRoaXMubWFwLFxuICAgICAgdGhpcy5wb3B1cCxcbiAgICAgIHRoaXMucG9wdXBDb250ZW50LFxuICAgICAgdGhpcy5pbnRlcmFjdGlvbk1hbmFnZXIsXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoeyB0YXJnZXQ6IHRoaXMubWFwUmVmLm5hdGl2ZUVsZW1lbnQsIGNvbnRyb2xzOiBkZWZhdWx0cyh7IGF0dHJpYnV0aW9uOiBmYWxzZSB9KSB9KTtcbiAgICB0aGlzLmludGVyYWN0aW9uTWFuYWdlciA9IHRoaXMuaW5pdEludGVyYWN0aW9uTWFuYWdlcigpO1xuICAgIHRoaXMubGF5ZXJTbGlkZXIuaW5pdCh0aGlzLm1hcCwgdGhpcy5zbGlkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMudG9vbHRpcE1hbmFnZXIgPSB0aGlzLmluaXRUb29sdGlwTWFuYWdlcigpO1xuICAgIHRoaXMubWFwU3R5bGVVcmwkID0gY29tYmluZUxhdGVzdChbdGhpcy5vcHRpb25zJCwgdGhpcy5tYXBVcmwkXSkucGlwZShcbiAgICAgIG1hcCgoW29wdGlvbnMsIHVybF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnN0eWxlKSB7XG4gICAgICAgICAgY2FzZSB0aGlzLk5PX1NUWUxFOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY2FzZSB0aGlzLlNUWUxFX0ZST01fVVJMOlxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGVVUkwgPz8gJyc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBgJHt1cmx9L3N0eWxlcy8ke29wdGlvbnMuc3R5bGV9L3N0eWxlLmpzb25gO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuXG4gICAgdGhpcy5tYXBTdHlsZUxheWVyJCA9IHRoaXMubWFwU3R5bGVVcmwkLnBpcGUoXG4gICAgICBtYXAoKHN0eWxlVXJsKSA9PiB7XG4gICAgICAgIGlmICghc3R5bGVVcmwpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBuZXcgTWFwYm94VmVjdG9yTGF5ZXIoe1xuICAgICAgICAgICAgcHJvcGVydGllczogeyB0aXRsZTogJ2JhY2tncm91bmQnIH0sXG4gICAgICAgICAgICBzdHlsZVVybFxuICAgICAgICAgIH0pIC8qICxcbiAgICAgICAgICBuZXcgVGlsZUxheWVyKHtcbiAgICAgICAgICAgIHNvdXJjZTogbmV3IFRpbGVEZWJ1ZygpXG4gICAgICAgICAgfSkgKi9cbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgob3B0aW9ucykgPT4gKHtcbiAgICAgICAgICAgIGNlbnRlcjogZnJvbUxvbkxhdChvcHRpb25zLmNlbnRlciA/PyBXaWRnZXRNYXBVdGlscy5ERUZBVUxUX01BUF9DRU5URVIpLFxuICAgICAgICAgICAgbWF4Wm9vbTogb3B0aW9ucy56b29tPy5tYXggPz8gV2lkZ2V0TWFwVXRpbHMuREVGQVVMVF9aT09NX01BWCxcbiAgICAgICAgICAgIG1pblpvb206IG9wdGlvbnMuem9vbT8ubWluID8/IFdpZGdldE1hcFV0aWxzLkRFRkFVTFRfWk9PTV9NSU4sXG4gICAgICAgICAgICB6b29tOiBvcHRpb25zLnpvb20/LnN0YXJ0ID8/IFdpZGdldE1hcFV0aWxzLkRFRkFVTFRfWk9PTV9TVEFSVFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmlldykgPT4gdGhpcy5tYXAuc2V0VmlldyhuZXcgVmlldyh2aWV3KSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgob3B0aW9ucykgPT4gb3B0aW9ucy5hdHRyaWJ1dGlvbnMpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChhdHRyaWJ1dGlvbnMpID0+IHtcbiAgICAgICAgICBpZiAoIWF0dHJpYnV0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlQ29udHJvbCh0aGlzLmF0dHJpYnV0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFwLmFkZENvbnRyb2wodGhpcy5hdHRyaWJ1dGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5sYXllcnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnJlc3VsdFNldCQsXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuYWRkaXRpb25hbExheWVycyQsXG4gICAgICB0aGlzLml0ZW1TdHlsZXMkLFxuICAgICAgdGhpcy5kYXRhc291cmNlRmlsdGVycyQsXG4gICAgICB0aGlzLmZpZWxkcyRcbiAgICBdKS5waXBlKFxuICAgICAgZmlsdGVyKFxuICAgICAgICAoW3Jlc3VsdFNldCwgb3B0aW9ucywgY2xhc3NlcywgYWRkaXRpb25hbExheWVycywgaXRlbVN0eWxlcywgZmlsdGVycywgZmllbGRzXSkgPT5cbiAgICAgICAgICAhIXJlc3VsdFNldCAmJiAhIW9wdGlvbnMgJiYgISFjbGFzc2VzICYmICEhZmllbGRzXG4gICAgICApLFxuICAgICAgbWFwKChbcmVzdWx0U2V0LCBvcHRpb25zLCBjbGFzc2VzLCBhZGRpdGlvbmFsTGF5ZXJzLCBpdGVtU3R5bGVzLCBmaWx0ZXJzLCBmaWVsZHNdKSA9PiB7XG4gICAgICAgIGxldCBoYXNSZWxhdGlvbkxheWVyID0gbnVsbCBhcyB1bmtub3duIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZTxhbnk+PjtcblxuICAgICAgICBjb25zdCBsYXllcnMgPSAob3B0aW9ucz8ubGF5ZXJzIHx8IFtdKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAobGF5ZXIpID0+IHRoaXMud2lkZ2V0TWFwTGF5ZXJTZXJ2aWNlLmRvbnROZWVkTG9jYXRpb24uaW5jbHVkZXMobGF5ZXIudHlwZSkgfHwgISFsYXllci5hdHRyaWJ1dGVcbiAgICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIChsYXllcikgPT4gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UuZG9udE5lZWRJbnRlbnNpdHkuaW5jbHVkZXMobGF5ZXIudHlwZSkgfHwgISFsYXllci5pbnRlbnNpdHlBdHRyaWJ1dGVcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgobGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucywgaWR4LCBhcnJheSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlc0ZvckNsYXNzID0gT2JqZWN0LmtleXMocmVzdWx0U2V0Lml0ZW1zKVxuICAgICAgICAgICAgICAubWFwKChjbGFzc0lkKSA9PiAoe1xuICAgICAgICAgICAgICAgIGNsYXNzSWQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRBdHRyaWJ1dGVzRm9yRHJhd2luZyhjbGFzc2VzLCBjbGFzc0lkLCBsYXllcilcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKHAsIGMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5wLFxuICAgICAgICAgICAgICAgICAgW2MuY2xhc3NJZF06IGNcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB7fSBhcyB7XG4gICAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICAgICAgICAgICAgICAgIGludGVuc2l0eUF0dHJpYnV0ZTogQXR0cmlidXRlO1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkF0dHJpYnV0ZTogQXR0cmlidXRlO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBsYXllckNsYXNzZXNJZCA9IGNsYXNzZXMubWFwKChjbGF6eikgPT4gY2xhenouaWQpO1xuICAgICAgICAgICAgaWYgKCdjbGFzc2VzJyBpbiBsYXllciAmJiAhIWxheWVyLmNsYXNzZXMgJiYgbGF5ZXIuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxheWVyQ2xhc3Nlc0lkID0gbGF5ZXIuY2xhc3NlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJhbmdlID0geyBtaW46IDAsIG1heDogMCB9O1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKCEhbGF5ZXIuaW50ZW5zaXR5QXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKHJlc3VsdFNldC5pdGVtcylcbiAgICAgICAgICAgICAgICAubWFwKChjbGFzc0lkKSA9PlxuICAgICAgICAgICAgICAgICAgcmVzdWx0U2V0Lml0ZW1zW2NsYXNzSWRdLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgICAgSXRlbVV0aWxzLmdldEF0dHJpYnV0ZUNhbGN1bGF0ZWRWYWx1ZShpdGVtLCBhdHRyaWJ1dGVzRm9yQ2xhc3NbaXRlbS5vQ2xhc3NdLmludGVuc2l0eUF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gWy4uLnAsIC4uLmNdLCBbXSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgICAgICByYW5nZSA9IHZhbHVlcy5yZWR1Y2UoKHAsIGMpID0+ICh7IG1pbjogTWF0aC5taW4ocC5taW4sIGMpLCBtYXg6IE1hdGgubWF4KHAubWF4LCBjKSB9KSwge1xuICAgICAgICAgICAgICAgIG1pbjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgICAgICBtYXg6IC1OdW1iZXIuTUFYX1ZBTFVFXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbXBsID0gdGhpcy53aWRnZXRNYXBMYXllclNlcnZpY2UubGF5ZXJzSW1wbGVtZW50YXRpb25bbGF5ZXIudHlwZV07XG4gICAgICAgICAgICBpZiAoISFpbXBsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdExheWVyID0gaW1wbChcbiAgICAgICAgICAgICAgICBsYXllciBhcyBhbnksXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc0ZvckNsYXNzLFxuICAgICAgICAgICAgICAgIGxheWVyQ2xhc3Nlc0lkLFxuICAgICAgICAgICAgICAgIHJlc3VsdFNldCxcbiAgICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgICBpdGVtU3R5bGVzLFxuICAgICAgICAgICAgICAgIHRoaXMubWFwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgnZml0JywgbGF5ZXIuZml0KTtcbiAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIuc2V0KCd0eXBlJywgbGF5ZXIudHlwZSk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgnc2xpZGUnLCBsYXllci5zbGlkZSk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgnb3JkZXInLCBsYXllci5vcmRlcik7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgnZ3JvdXAnLCBsYXllci5ncm91cCA/PyBERUZBVUxUX0xBWUVSX0dST1VQKTtcbiAgICAgICAgICAgICAgY29uc3QgbWF4TGF5ZXJPcmRlciA9IE1hdGgubWF4KC4uLmFycmF5Lm1hcCgobCkgPT4gbC5vcmRlciA/PyAwKSk7XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldFpJbmRleChtYXhMYXllck9yZGVyICsgMSAtIChsYXllci5vcmRlciA/PyBpZHgpKTtcbiAgICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdyZWxhdGlvbicpIHtcbiAgICAgICAgICAgICAgICBoYXNSZWxhdGlvbkxheWVyID0gcmVzdWx0TGF5ZXIgYXMgdW5rbm93biBhcyBWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U+O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc3VsdExheWVyLnNldCgndGl0bGUnLCBsYXllci50aXRsZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3FsX2ZpbHRlciA9IENxbFV0aWxzLmdldENRTFBhcmFtc0ZvcihsYXllci5kYXRhc291cmNlSWQsIGZpbHRlcnMsIGNsYXNzZXMsIGZpZWxkcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3FsX2ZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIENRTCBxdWVyeSB0byBnZW9zZXJ2ZXIgbGF5ZXJzXG4gICAgICAgICAgICAgICAgICAocmVzdWx0TGF5ZXIgYXMgVGlsZTxUaWxlV01TPikuZ2V0U291cmNlKCkhLnVwZGF0ZVBhcmFtcyh7IGNxbF9maWx0ZXIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGxheWVyLnNsaWRlICYmIGxheWVyLnNsaWRlICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5ZXJTbGlkZXIuYXBwbHlTbGlkZShcbiAgICAgICAgICAgICAgICAgIGxheWVyLnNsaWRlLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0TGF5ZXIgYXMgdW5rbm93biBhcyBUaWxlTGF5ZXI8YW55PiB8IFZlY3RvckxheWVyPGFueT4gfCBIZWF0bWFwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRMYXllcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYExheWVyIHR5cGUgJHtsYXllci50eXBlfSBpcyB1bmtub3duYCk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsIGFzIHVua25vd24gYXMgQmFzZUxheWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIpO1xuXG4gICAgICAgIGlmICghIWhhc1JlbGF0aW9uTGF5ZXIpIHtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IGxheWVyc1xuICAgICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+ICEobGF5ZXIgaW5zdGFuY2VvZiBUaWxlKSlcbiAgICAgICAgICAgIC5tYXAoKGxheWVyKSA9PlxuICAgICAgICAgICAgICBsYXllclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAuZ2V0U291cmNlKClcbiAgICAgICAgICAgICAgICAuZ2V0RmVhdHVyZXMoKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGZlYXR1cmVzOiBGZWF0dXJlPGFueT4pID0+ICEhZmVhdHVyZXMuZ2V0KCdpZCcpIHx8ICEhZmVhdHVyZXMuZ2V0KCdmZWF0dXJlcycpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgocCwgYykgPT4gWy4uLnAsIC4uLmNdLCBbXSk7XG5cbiAgICAgICAgICByZXN1bHRTZXQucmVsYXRpb25zLmZvckVhY2goKHJlbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBmZWF0dXJlcy5maW5kKChmOiBGZWF0dXJlPFBvaW50IHwgQ2lyY2xlPikgPT4gZi5nZXQoJ2lkJykgPT09IHJlbGF0aW9uLnNvdXJjZSk7XG4gICAgICAgICAgICBjb25zdCBkZXN0ID0gZmVhdHVyZXMuZmluZCgoZjogRmVhdHVyZTxQb2ludCB8IENpcmNsZT4pID0+IGYuZ2V0KCdpZCcpID09PSByZWxhdGlvbi5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICBpZiAoISFzb3VyY2UgJiYgISFkZXN0KSB7XG4gICAgICAgICAgICAgIGhhc1JlbGF0aW9uTGF5ZXIuZ2V0U291cmNlKCk/LmFkZEZlYXR1cmUoV2lkZ2V0TWFwVXRpbHMuZ2V0TGlua0ZlYXR1cmUocmVsYXRpb24sIHNvdXJjZSwgZGVzdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxheWVycy5wdXNoKC4uLmFkZGl0aW9uYWxMYXllcnMpO1xuXG4gICAgICAgIGNvbnN0IHZpc2libGVMYXllcnMgPSBvcHRpb25zLmxheWVyR3JvdXBzIS5tYXAoKGdyb3VwKSA9PiBncm91cC52aXNpYmxlTGF5ZXJzKS5mbGF0KCk7XG4gICAgICAgIGxheWVycy5mb3JFYWNoKChsYXllciwgaWR4KSA9PiB7XG4gICAgICAgICAgaWYgKCF2aXNpYmxlTGF5ZXJzLmluY2x1ZGVzKGxheWVyLmdldCgndGl0bGUnKSkpIHtcbiAgICAgICAgICAgIGxheWVyLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogUmVzb2x2ZSBidWcgZHJhd2luZyB3ZWJnbGxheWVyIHdpdGhvdXQgbm90aGluZyB1bmRlcm5lYXRoOiBhZGQgZW1wdHkgbGF5ZXIgYmVsb3cgKi9cbiAgICAgICAgY29uc3QgX2xheWVycyA9IHRoaXMuYWRkRW1wdHlXZWJHbExheWVyQmVsb3dTbGlkZUhlYXRtYXBzKGxheWVycyk7XG4gICAgICAgIHRoaXMucHJldmlvdXNMYXllcnMucHVzaCguLi5fbGF5ZXJzKTtcbiAgICAgICAgcmV0dXJuIF9sYXllcnM7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmZpdEV4dGVudHMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5jbGFzc2VzJCxcbiAgICAgIHRoaXMuZGF0YXNvdXJjZUZpbHRlcnMkLFxuICAgICAgdGhpcy53bXNDYXBhYmlsaXRpZXMkXG4gICAgXSkucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgc3dpdGNoTWFwKChbb3B0aW9ucywgY2xhc3NlcywgZmlsdGVycywgd21zQ2FwYWJpbGl0aWVzXSkgPT5cbiAgICAgICAgKG9wdGlvbnMubGF5ZXJzID8/IFtdKS5maW5kKChsYXllcikgPT4gWydnZW9zZXJ2ZXInLCAnd21zJ10uaW5jbHVkZXMobGF5ZXIudHlwZSkgJiYgbGF5ZXIuZml0KVxuICAgICAgICAgID8gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICAgIC4uLigob3B0aW9ucy5sYXllcnM/LmZpbHRlcigobGF5ZXIpID0+IGxheWVyLnR5cGUgPT09ICdnZW9zZXJ2ZXInKSA/PyBbXSkgYXMgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmZpdClcbiAgICAgICAgICAgICAgICAubWFwKChsYXllcjogTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zKSA9PlxuICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmZpbmQoKGNsYXp6KSA9PiBjbGF6ei5pZCA9PT0gbGF5ZXIub0NsYXNzKSA/PyAoeyBhdHRyaWJ1dGVzOiBbXSB9IGFzIHVua25vd24gYXMgQ2xhc3MpXG4gICAgICAgICAgICAgICAgICApLmF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoYXR0cikgPT4gR2VvbWV0cmljRmllbGRUeXBlcy5pbmNsdWRlcyhhdHRyLmZpZWxkLnR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChhdHRyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJ5QWdncmVnYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWdncmVnYXRlKFtsYXllci5kYXRhc291cmNlSWRdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYXRlOiB7IG9wZXJhdGlvbjogT3BlcmF0aW9uLkVYVEVOVCwgYXR0cmlidXRlOiBhdHRyLmlkLCBsYWJlbDogYXR0ci5uYW1lLCBrZWVwMDogZmFsc2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBDaGFydEFnZ3JlZ2F0ZWRXaWRnZXRPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoZXh0ZW50UmVzcG9uc2U6IEFnZ3JlZ2F0aW9uUmVzdWx0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldE1hcFV0aWxzLnByb2plY3RFeHRlbnRBZ2dyZWdhdGlvblJlc3BvbnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5maWVsZCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21zQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBkYXRhc291cmNlOiBsYXllci5kYXRhc291cmNlSWQsIGV4dGVudDogW10sIGVycm9yOiB0cnVlIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmZsYXQoKSxcbiAgICAgICAgICAgICAgLi4uKChvcHRpb25zLmxheWVycz8uZmlsdGVyKChsYXllcikgPT4gbGF5ZXIudHlwZSA9PT0gJ3dtcycpID8/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+IGRlbGV0ZSBsYXllci5hdHRyaWJ1dGlvbik7XG4gICAgfVxuICB9XG5cbiAgYWRkTGF5ZXIoZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICBpZiAoIXRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA9IFtdO1xuICAgIH1cbiAgICBjb25zdCB0aXRsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBAcHJ5LndpZGdldC5tYXAubGF5ZXJgLCB7IGluZGV4OiB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5sZW5ndGggKyAxIH0pO1xuXG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMucHVzaCh7XG4gICAgICBhdHRyaWJ1dGU6ICcnLFxuICAgICAgZ3JvdXA6IGdyb3VwLm5hbWUsXG4gICAgICB0aXRsZSxcbiAgICAgIHR5cGU6ICdtYXJrZXInXG4gICAgfSk7XG4gICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVt0aXRsZV0gPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyR3JvdXAoZ3JvdXAsIHVuZGVmaW5lZCwgdGl0bGUpO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJPcmRlcigpO1xuICB9XG5cbiAgY2hhbmdlTGF5ZXJUeXBlKCRldmVudDogYW55LCBpOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9uc0NvcHkubGF5ZXJzKSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzID8/IFtdO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlID0gJGV2ZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlID09PSAnd21zJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucy5wYXJhbUxheWVyID0gb3B0aW9ucy5wYXJhbUxheWVyID8/ICcnO1xuICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCA/PyAnJztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldLnR5cGUgPT09ICd3bXRzJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzW2ldIGFzIE1hcFdNVFNMYXllckxheWVyT3B0aW9ucztcbiAgICAgIG9wdGlvbnMucGFyYW1MYXllciA9IG9wdGlvbnMucGFyYW1MYXllciA/PyAnJztcbiAgICAgIG9wdGlvbnMuc3R5bGUgPSBvcHRpb25zLnN0eWxlID8/ICcnO1xuICAgICAgb3B0aW9ucy5tYXRyaXhTZXQgPSBvcHRpb25zLm1hdHJpeFNldCA/PyAnJztcbiAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgPz8gJyc7XG4gICAgfVxuICAgIGlmIChbJ2ZlYXR1cmVsYXllcicsICd2ZWN0b3J0aWxlJywgJ3Jhc3RlcnRpbGUnXS5pbmNsdWRlcyh0aGlzLm9wdGlvbnNDb3B5LmxheWVyc1tpXS50eXBlKSkge1xuICAgICAgbGV0IG9wdGlvbnM6IE1hcEZlYXR1cmVMYXllck9wdGlvbnM7XG4gICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnNbaV0gYXMgTWFwRmVhdHVyZUxheWVyT3B0aW9ucztcbiAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgPz8gJyc7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlTGF5ZXJHcm91cFNpbmdsZUxheWVyKGdyb3VwOiBMYXllckdyb3VwLCBzaW5nbGVMYXllcjogYm9vbGVhbikge1xuICAgIHRoaXMudXBkYXRlTGF5ZXJHcm91cChncm91cCwgc2luZ2xlTGF5ZXIsIHNpbmdsZUxheWVyID8gW2dyb3VwLnZpc2libGVMYXllcnNbMF1dIDogZ3JvdXAudmlzaWJsZUxheWVycyk7XG4gIH1cblxuICB1cGRhdGVMYXllckdyb3VwKGdyb3VwOiBMYXllckdyb3VwIHwgc3RyaW5nLCBzaW5nbGVMYXllcj86IGJvb2xlYW4sIHZpc2libGVMYXllcnM/OiBzdHJpbmdbXSB8IHN0cmluZykge1xuICAgIGNvbnN0IGxheWVyR3JvdXAgPSB0eXBlb2YgZ3JvdXAgPT09ICdzdHJpbmcnID8gdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyEuZmluZCgoZykgPT4gZy5uYW1lID09PSBncm91cCkgOiBncm91cDtcbiAgICBjb25zdCBncm91cEluZGV4ID0gdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyEuZmluZEluZGV4KChnKSA9PiBnLm5hbWUgPT09IGxheWVyR3JvdXAhLm5hbWUpO1xuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5tYXAoKGcsIGkpID0+XG4gICAgICBpID09PSBncm91cEluZGV4XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZyxcbiAgICAgICAgICAgIHNpbmdsZUxheWVyOiBzaW5nbGVMYXllciA/PyBsYXllckdyb3VwIS5zaW5nbGVMYXllcixcbiAgICAgICAgICAgIHZpc2libGVMYXllcnM6XG4gICAgICAgICAgICAgIHR5cGVvZiB2aXNpYmxlTGF5ZXJzID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gWy4uLmxheWVyR3JvdXAhLnZpc2libGVMYXllcnMsIHZpc2libGVMYXllcnNdXG4gICAgICAgICAgICAgICAgOiB2aXNpYmxlTGF5ZXJzID8/IGxheWVyR3JvdXAhLnZpc2libGVMYXllcnNcbiAgICAgICAgICB9XG4gICAgICAgIDogZ1xuICAgICk7XG4gIH1cblxuICBjaGFuZ2VUaXRsZSgkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cDogTGF5ZXJHcm91cCkge1xuICAgIGNvbnN0IG5ld1RpdGxlID0gKCRldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJHcm91cChcbiAgICAgIGdyb3VwLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5vcHRpb25zQ29weVxuICAgICAgICAubGF5ZXJHcm91cHMhLmZpbHRlcigoZykgPT4gZy5uYW1lID09PSBncm91cC5uYW1lKVxuICAgICAgICAubWFwKChnLCBpKSA9PiBnLnZpc2libGVMYXllcnMubWFwKChsKSA9PiAobCA9PT0gbGF5ZXIudGl0bGUgPyBuZXdUaXRsZSA6IGwpKSlcbiAgICAgICAgLmZsYXQoKVxuICAgICk7XG4gICAgZGVsZXRlIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXTtcbiAgICBsYXllci50aXRsZSA9IG5ld1RpdGxlO1xuICAgIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbmV3VGl0bGVdID0gdHJ1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGVtaXRNYW5pZmVzdCgpIHtcbiAgICB0aGlzLnJlbW92ZUVtcHR5TGF5ZXJHcm91cHMoKTtcbiAgICB0aGlzLm1hbmlmZXN0TW9kaWZpZWQuZW1pdCh7XG4gICAgICB3aWRnZXRJbmRleDogdGhpcy53aWRnZXRJbmRleCxcbiAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgIC4uLnRoaXMubWFuaWZlc3QsXG4gICAgICAgIG9wdGlvbnM6IHsgLi4udGhpcy5vcHRpb25zQ29weSwgbGF5ZXJzOiAodGhpcy5vcHRpb25zQ29weS5sYXllcnMgPz8gW10pLmZpbHRlcigobGF5ZXIpID0+ICEhbGF5ZXIudHlwZSkgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2hhbmdlTG9jYXRpb25BdHRyaWJ1dGVzKCRldmVudDogYW55LCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLmF0dHJpYnV0ZSA9ICRldmVudDtcbiAgfVxuXG4gIGxheWVySGFzSW50ZW5zaXR5KGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpOiBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zIHwgTWFwV2lkZ2V0QnViYmxlTGF5ZXJPcHRpb25zIHtcbiAgICByZXR1cm4gPE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnM+bGF5ZXI7XG4gIH1cblxuICBjaGFuZ2VJbnRlbnNpdHlBdHRyaWJ1dGVzKCRldmVudDogYW55LCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgbGF5ZXJfID0gPE1hcFdpZGdldEhlYXRNYXBMYXllck9wdGlvbnMgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnM+bGF5ZXI7XG4gICAgbGF5ZXJfLmludGVuc2l0eUF0dHJpYnV0ZSA9ICRldmVudDtcbiAgfVxuXG4gIGNoYW5nZUNsYXNzZXMoJGV2ZW50OiBzdHJpbmdbXSwgbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IHNwZWNpZmljTGF5ZXIgPSBsYXllciBhc1xuICAgICAgfCBNYXBXaWRnZXRIZWF0TWFwTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBXaWRnZXRCdWJibGVMYXllck9wdGlvbnM7XG4gICAgc3BlY2lmaWNMYXllci5jbGFzc2VzID0gJGV2ZW50O1xuICB9XG5cbiAgZGVsZXRlTGF5ZXIoaTogbnVtYmVyLCBsYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cDogTGF5ZXJHcm91cCkge1xuICAgIHRoaXMub3B0aW9uc0NvcHk/LmxheWVycz8uc3BsaWNlKGksIDEpO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJHcm91cChcbiAgICAgIGdyb3VwLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZ3JvdXAudmlzaWJsZUxheWVycy5maWx0ZXIoKGwpID0+IGwgIT09IGxheWVyLnRpdGxlKVxuICAgICk7XG4gICAgdGhpcy5yZW1vdmVFbXB0eUxheWVyR3JvdXBzKCk7XG4gICAgaWYgKGxheWVyLnR5cGUgPT09ICdhdXRvJykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5pZ25vcmVBdXRvTGF5ZXIgPSBbLi4uKHRoaXMub3B0aW9uc0NvcHkuaWdub3JlQXV0b0xheWVyID8/IFtdKSwgbGF5ZXIua2V5ICsgJy0nICsgbGF5ZXIuc3ViVHlwZV07XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlVXJsKFxuICAgICRldmVudDogRXZlbnQsXG4gICAgbGF5ZXI6XG4gICAgICB8IE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcEZlYXR1cmVMYXllck9wdGlvbnNcbiAgICAgIHwgTWFwVmVjdG9yVGlsZUxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBSYXN0ZXJUaWxlTGF5ZXJPcHRpb25zXG4gICAgICB8IE1hcFdNVFNMYXllckxheWVyT3B0aW9uc1xuICAgICAgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLnVybCA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZUF0dHJpYnV0aW9uKCRldmVudDogRXZlbnQsIGxheWVyOiBCYXNlV2lkZ2V0TWFwTGF5ZXJPcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLmF0dHJpYnV0aW9uID0gJGV2ZW50LmN1cnJlbnRUYXJnZXQ/LnZhbHVlO1xuICB9XG5cbiAgY2hhbmdlUGFyYW1MYXllcigkZXZlbnQ6IEV2ZW50LCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIucGFyYW1MYXllciA9ICRldmVudC5jdXJyZW50VGFyZ2V0Py52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZVBhcmFtVGlsZWQoJGV2ZW50OiBib29sZWFuLCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5wYXJhbVRpbGVkID0gJGV2ZW50O1xuICAgIHRoaXMudG9vbHRpcE1hbmFnZXIuY2xlYXJUb29sdGlwKCk7XG4gIH1cblxuICBjaGFuZ2VNYXRyaXhTZXQoJGV2ZW50OiBFdmVudCwgbGF5ZXI6IE1hcFdNVFNMYXllckxheWVyT3B0aW9ucykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5tYXRyaXhTZXQgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VQYXJhbVN0eWxlKCRldmVudDogRXZlbnQsIGxheWVyOiBNYXBXTVRTTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbGF5ZXIuc3R5bGUgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBleHBvcnQoKSB7XG4gICAgV2lkZ2V0TWFwVXRpbHMuZXhwb3J0TWFwQXNJbWFnZSh0aGlzLm1hcCwgJ21hcC5wbmcnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvSW1hZ2UoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gV2lkZ2V0TWFwVXRpbHMuZ2V0TWFwQXNQbmcodGhpcy5tYXApO1xuICB9XG5cbiAgY2hhbmdlQ2x1c3RlcmVkKGxheWVyOiBNYXBXaWRnZXRNYXJrZXJMYXllck9wdGlvbnMsICRldmVudDogYm9vbGVhbikge1xuICAgIGxheWVyLmNsdXN0ZXJlZCA9ICRldmVudDtcbiAgICBpZiAobGF5ZXIuY2x1c3RlcmVkKSB7XG4gICAgICBsYXllci5jbHVzdGVyRGlzdGFuY2UgPSAxMDtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VDbHVzdGVyRGlzdGFuY2UobGF5ZXI6IE1hcFdpZGdldE1hcmtlckxheWVyT3B0aW9ucywgJGV2ZW50OiBFdmVudCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsYXllci5jbHVzdGVyRGlzdGFuY2UgPSAkZXZlbnQuY3VycmVudFRhcmdldD8udmFsdWU7XG4gIH1cblxuICBjaGFuZ2VPcGFjaXR5KGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsICRldmVudDogc3RyaW5nKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxheWVyLm9wYWNpdHkgPSBwYXJzZUludCgkZXZlbnQsIDEwKTtcbiAgfVxuXG4gIGdldFdNU0xheWVycygpOiBMYXllcjxhbnk+W10ge1xuICAgIHJldHVybiAhdGhpcy5tYXBcbiAgICAgID8gW11cbiAgICAgIDogdGhpcy5tYXBcbiAgICAgICAgICAuZ2V0QWxsTGF5ZXJzKClcbiAgICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUaWxlV01TIHx8IGxheWVyLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSW1hZ2VXTVMpXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5yZW5kZXJlZCA9PT0gdHJ1ZSk7XG4gIH1cblxuICBpc0xheWVyUmVuZGVyZWQobGF5ZXI6IGFueSkge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0V01TTGF5ZXJzKCkuZmluZChcbiAgICAgICh3bXNMYXllcikgPT4gd21zTGF5ZXIuZ2V0KCd0aXRsZScpID09PSBsYXllci50aXRsZSAmJiB3bXNMYXllci5nZXQoJ2dyb3VwJykgPT09IGxheWVyLmdyb3VwXG4gICAgKTtcbiAgfVxuXG4gIGNoYW5nZVdtc0NsYXNzKCRldmVudDogYW55LCBsYXllcjogTWFwV01TTGF5ZXJMYXllck9wdGlvbnMpIHtcbiAgICBsYXllci5vQ2xhc3MgPSAkZXZlbnQ7XG4gIH1cblxuICB0b2dnbGVMZWdlbmQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubGVnZW5kVGFiQ2xvc2VkW2luZGV4XSA9ICF0aGlzLmxlZ2VuZFRhYkNsb3NlZFtpbmRleF07XG4gIH1cblxuICB0b2dnbGVMZWdlbmRXaW5kb3coKSB7XG4gICAgdGhpcy5sZWdlbmRUYWJPcGVuID0gIXRoaXMubGVnZW5kVGFiT3BlbjtcbiAgICB0aGlzLmxheWVyc1RhYk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZUxheWVyc1dpbmRvdygpIHtcbiAgICB0aGlzLmxheWVyc1RhYk9wZW4gPSAhdGhpcy5sYXllcnNUYWJPcGVuO1xuICAgIHRoaXMubGVnZW5kVGFiT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG1hcExheWVycygpIHtcbiAgICByZXR1cm4gKHRoaXMubWFwID8/IHsgZ2V0TGF5ZXJzOiAoKSA9PiAoeyBnZXRBcnJheTogKCkgPT4gW10gfSkgfSlcbiAgICAgIC5nZXRMYXllcnMoKVxuICAgICAgLmdldEFycmF5KClcbiAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5nZXQoJ3RpdGxlJykgIT09ICdiYWNrZ3JvdW5kJyk7XG4gIH1cblxuICBnZXQgcmlnaHRTbGlkZUxheWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXBMYXllcnMuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0KCdzbGlkZScpID09PSAncmlnaHQnKTtcbiAgfVxuXG4gIGdldCBsZWZ0U2xpZGVMYXllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwTGF5ZXJzLmZpbHRlcigobGF5ZXIpID0+IGxheWVyLmdldCgnc2xpZGUnKSA9PT0gJ2xlZnQnKTtcbiAgfVxuXG4gIGNoYW5nZVZpc2liaWxpdHkoZ3JvdXA6IExheWVyR3JvdXAsIF9sYXllcj86IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLm1hcExheWVycy5maW5kKFxuICAgICAgKGxheWVyKSA9PiBsYXllci5nZXRQcm9wZXJ0aWVzKClbJ3RpdGxlJ10gPT09IF9sYXllcj8udGl0bGUgJiYgbGF5ZXIuZ2V0UHJvcGVydGllcygpWydncm91cCddID09PSBncm91cC5uYW1lXG4gICAgKTtcbiAgICBpZiAoZ3JvdXAuc2luZ2xlTGF5ZXIpIHtcbiAgICAgIGNvbnN0IGdyb3VwTGF5ZXJzID1cbiAgICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LmZpbHRlcigobCkgPT4gbC5ncm91cCA9PT0gZ3JvdXAubmFtZSkubWFwKChsYXllcikgPT4gbGF5ZXIudGl0bGUpID8/IFtdO1xuXG4gICAgICB0aGlzLm1hcExheWVyc1xuICAgICAgICAuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIuZ2V0UHJvcGVydGllcygpWydncm91cCddID09PSBncm91cC5uYW1lKVxuICAgICAgICAuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICBpZiAoZ3JvdXBMYXllcnMuaW5jbHVkZXMobGF5ZXIuZ2V0UHJvcGVydGllcygpWyd0aXRsZSddKSkge1xuICAgICAgICAgICAgbGF5ZXIuc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGlmIChfbGF5ZXIpIHtcbiAgICAgICAgb2xMYXllcj8uc2V0VmlzaWJsZSh0cnVlKTtcbiAgICAgICAgdGhpcy51cGRhdGVMYXllclZpc2liaWxpdHkoZ3JvdXAubmFtZSwgW19sYXllci50aXRsZSFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJWaXNpYmlsaXR5KGdyb3VwLm5hbWUsIFtdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb2xMYXllcj8uc2V0VmlzaWJsZSghb2xMYXllcj8uZ2V0VmlzaWJsZSgpKTtcblxuICAgICAgY29uc3QgdmlzaWJsZUxheWVycyA9IGdyb3VwLnZpc2libGVMYXllcnMuaW5jbHVkZXMoX2xheWVyPy50aXRsZSEpXG4gICAgICAgID8gZ3JvdXAudmlzaWJsZUxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllciAhPT0gX2xheWVyPy50aXRsZSlcbiAgICAgICAgOiBbLi4uZ3JvdXAudmlzaWJsZUxheWVycywgX2xheWVyPy50aXRsZSFdO1xuICAgICAgdGhpcy51cGRhdGVMYXllclZpc2liaWxpdHkoZ3JvdXAubmFtZSwgdmlzaWJsZUxheWVycyk7XG4gICAgfVxuICAgIHRoaXMubWFwLnVwZGF0ZVNpemUoKTtcbiAgfVxuXG4gIGlzTGF5ZXJWaXNpYmxlKGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwPzogTGF5ZXJHcm91cCk6IGJvb2xlYW4ge1xuICAgIGlmIChncm91cCAmJiBncm91cC52aXNpYmxlTGF5ZXJzKSB7XG4gICAgICByZXR1cm4gZ3JvdXAudmlzaWJsZUxheWVycy5pbmNsdWRlcyhsYXllci50aXRsZSA/PyAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAhIXRoaXMub3B0aW9uc0NvcHlcbiAgICAgICAgLmxheWVyR3JvdXBzIS5maW5kKChnKSA9PiBnLm5hbWUgPT09IGxheWVyLmdyb3VwKVxuICAgICAgICA/LnZpc2libGVMYXllcnMuaW5jbHVkZXMobGF5ZXIudGl0bGUgPz8gJycpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUxheWVyVmlzaWJpbGl0eShuYW1lOiBzdHJpbmcsIHZpc2libGVMYXllcnM6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyA9IFtcbiAgICAgIC4uLih0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzID8/IFtdKS5tYXAoKGdyb3VwKSA9PlxuICAgICAgICBncm91cC5uYW1lID09PSBuYW1lXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLmdyb3VwLFxuICAgICAgICAgICAgICB2aXNpYmxlTGF5ZXJzOiB2aXNpYmxlTGF5ZXJzXG4gICAgICAgICAgICAgICAgPyB0eXBlb2YgdmlzaWJsZUxheWVycyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgID8gWy4uLmdyb3VwLnZpc2libGVMYXllcnMsIHZpc2libGVMYXllcnNdXG4gICAgICAgICAgICAgICAgICA6IHZpc2libGVMYXllcnNcbiAgICAgICAgICAgICAgICA6IGdyb3VwLnZpc2libGVMYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGdyb3VwXG4gICAgICApXG4gICAgXTtcbiAgfVxuXG4gIGNoYW5nZUF1dG9MYXllcigkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuYXV0b21hdGljTGF5ZXJzID0gJGV2ZW50O1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weS5hdXRvbWF0aWNMYXllcnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5Lmlnbm9yZUF1dG9MYXllcjtcbiAgICB9XG4gIH1cblxuICBnZXQgbGF5ZXJWaXNpYmxlSWR4KCkge1xuICAgIHJldHVybiB0aGlzLm1hcExheWVycy5tYXAoKGxheWVyLCBpZHgpID0+IChsYXllci5nZXRWaXNpYmxlKCkgPyBpZHggOiAwKSkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgfHwgLTE7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuXG4gICAgLy8gVHJ5aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuICAgIHRoaXMuY2xlYXJMYXllcnModGhpcy5tYXAuZ2V0TGF5ZXJzKCkuZ2V0QXJyYXkoKSk7XG4gICAgdGhpcy5jbGVhckxheWVycyh0aGlzLnByZXZpb3VzTGF5ZXJzKTtcbiAgICB0aGlzLm1hcC5nZXRSZW5kZXJlcigpIS5kaXNwb3NlKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGRlbGV0ZSB0aGlzLm1hcDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5tYXAgPSBudWxsO1xuICAgIHRoaXMudG9vbHRpcE1hbmFnZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgZ2V0U3R5bGUoX2xheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMpIHtcbiAgICBjb25zdCBsYXllciA9IF9sYXllciBhcyBNYXBXTVNMYXllckxheWVyT3B0aW9ucyB8IE1hcEdlb1NlcnZlckxheWVyT3B0aW9ucztcbiAgICBpZiAobGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnM/LlNUWUxFUykge1xuICAgICAgcmV0dXJuIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzPy5TVFlMRVM7XG4gICAgfVxuICAgIC8qIE5vdCBtYW5pZmVzdC1kZWZpbmVkIHN0eWxlOiB1c2UgZmlyc3QgaW4gbGluZSBiZWNhdXNlIGl0J3MgdGhlIGRlZmF1bHQgb25lIHNlbnQgYnkgZ2Vvc2VydmVyICovXG4gICAgY29uc3QgcG9zc2libGVTdHlsZXNGb3JVcmwgPSB0aGlzLnBvc3NpYmxlU3R5bGVzW2xheWVyLnVybF0gPz8geyBsYXllcnM6IHt9IH07XG4gICAgbGV0IHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyID0gcG9zc2libGVTdHlsZXNGb3JVcmwubGF5ZXJzIVtsYXllci5wYXJhbUxheWVyXTtcbiAgICBpZiAoIXBvc3NpYmxlc1N0eWxlc0ZvckxheWVyKSB7XG4gICAgICBwb3NzaWJsZXNTdHlsZXNGb3JMYXllciA9IHBvc3NpYmxlU3R5bGVzRm9yVXJsLmxheWVycyFbKGxheWVyLnBhcmFtTGF5ZXIgPz8gJzonKS5zcGxpdCgnOicpWzFdXSA/PyB7IHN0eWxlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc3NpYmxlc1N0eWxlc0ZvckxheWVyLnN0eWxlc1swXT8uaWQ7XG4gIH1cblxuICBjaGFuZ2VMYXllclN0eWxlKCRldmVudDogYW55LCBfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyID0gX2xheWVyIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zO1xuICAgIGlmICghbGF5ZXIuYWRkaXRpb25hbFBhcmFtZXRlcnMpIHtcbiAgICAgIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzID0ge307XG4gICAgfVxuICAgIGxheWVyLmFkZGl0aW9uYWxQYXJhbWV0ZXJzLlNUWUxFUyA9ICRldmVudDtcbiAgfVxuXG4gIGdldEFzV21zVHlwZShfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIHJldHVybiBfbGF5ZXIgYXMgTWFwV01TTGF5ZXJMYXllck9wdGlvbnMgfCBNYXBHZW9TZXJ2ZXJMYXllck9wdGlvbnM7XG4gIH1cblxuICBsYXllclN0eWxlT3B0aW9ucyhfbGF5ZXI6IE1hcFdpZGdldExheWVyT3B0aW9ucykge1xuICAgIGNvbnN0IGxheWVyID0gX2xheWVyIGFzIE1hcFdNU0xheWVyTGF5ZXJPcHRpb25zIHwgTWFwR2VvU2VydmVyTGF5ZXJPcHRpb25zO1xuICAgIGNvbnN0IHBvc3NpYmxlU3R5bGVzRm9yVXJsID0gdGhpcy5wb3NzaWJsZVN0eWxlc1tsYXllci51cmxdID8/IHsgbGF5ZXJzOiB7fSB9O1xuICAgIGxldCBwb3NzaWJsZXNTdHlsZXNGb3JMYXllciA9IHBvc3NpYmxlU3R5bGVzRm9yVXJsLmxheWVycyFbbGF5ZXIucGFyYW1MYXllcl07XG4gICAgaWYgKCFwb3NzaWJsZXNTdHlsZXNGb3JMYXllcikge1xuICAgICAgcG9zc2libGVzU3R5bGVzRm9yTGF5ZXIgPSBwb3NzaWJsZVN0eWxlc0ZvclVybC5sYXllcnMhWyhsYXllci5wYXJhbUxheWVyID8/ICc6Jykuc3BsaXQoJzonKVsxXV0gPz8geyBzdHlsZXM6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiBwb3NzaWJsZXNTdHlsZXNGb3JMYXllci5zdHlsZXM7XG4gIH1cblxuICB0cmlnZ2VyTGF5ZXJSZW5kZXIoKSB7XG4gICAgdGhpcy5tYXAucmVuZGVyKCk7XG4gIH1cblxuICBjaGFuZ2VTbGlkZU9wdGlvbigkZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkuc2xpZGUgPSAkZXZlbnQ7XG4gICAgaWYgKCRldmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLnNsaWRlID0gJ2FsbCcpKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVNZW51KCkge1xuICAgIHRoaXMuYWN0aW9uTWVudU9wZW4kLm5leHQoIXRoaXMuYWN0aW9uTWVudU9wZW4kLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPbFpvb21FbGVtZW50KCkge1xuICAgIHRoaXMub2xab29tRWxlbWVudCQubmV4dChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2wtem9vbScpKTtcbiAgICBpZiAoIXRoaXMub2xab29tRWxlbWVudCQuZ2V0VmFsdWUoKSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmdldE9sWm9vbUVsZW1lbnQoKSwgNTApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB6b29tSW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub2wtem9vbS1pbicpO1xuICAgICAgaWYgKHpvb21Jbikge1xuICAgICAgICB6b29tSW4uc2V0QXR0cmlidXRlKCdkYXRhLXRvb2x0aXAnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLnpvb21JbicpKTtcbiAgICAgICAgem9vbUluLnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLXBvc2l0aW9uJywgJ2xlZnQnKTtcbiAgICAgICAgem9vbUluLmNsYXNzTGlzdC5hZGQoJ2EtdG9vbHRpcCcsICctLW5vcG9zJyk7XG4gICAgICAgIHpvb21Jbi5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB6b29tT3V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm9sLXpvb20tb3V0Jyk7XG4gICAgICBpZiAoem9vbU91dCkge1xuICAgICAgICB6b29tT3V0LnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwJywgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0Lm1hcC56b29tT3V0JykpO1xuICAgICAgICB6b29tT3V0LnNldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLXBvc2l0aW9uJywgJ2xlZnQnKTtcbiAgICAgICAgem9vbU91dC5jbGFzc0xpc3QuYWRkKCdhLXRvb2x0aXAnLCAnLS1ub3BvcycpO1xuICAgICAgICB6b29tT3V0LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTZWxlY3Rpb24oYWN0aW9uOiAnY2xpY2snIHwgJ2xhc3NvJyB8ICdyZWN0YW5nbGUnIHwgJ3pvb20nIHwgJ21vdmUnIHwgJ2V4cG9ydCcgfCAndXBsb2FkJykge1xuICAgIHRoaXMuaW50ZXJhY3Rpb25NYW5hZ2VyLnNlbGVjdGlvbkludGVyYWN0aW9uLmNoYW5nZVNlbGVjdGlvbihhY3Rpb24pO1xuICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckxheWVycyhsYXllcnM6IEJhc2VMYXllcltdKSB7XG4gICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XG4gICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllciAmJiAobGF5ZXIgYXMgVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPikuZ2V0U291cmNlKCkpIHtcbiAgICAgICAgKGxheWVyIGFzIFZlY3RvckxheWVyPFZlY3RvclNvdXJjZT4pLmdldFNvdXJjZSgpIS5jbGVhcigpO1xuICAgICAgICBsYXllci5zZXRTb3VyY2UodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIFRpbGVMYXllciAmJiAobGF5ZXIgYXMgVGlsZUxheWVyPGFueT4pLmdldFNvdXJjZSgpKSB7XG4gICAgICAgIChsYXllciBhcyBUaWxlTGF5ZXI8YW55PikuZ2V0U291cmNlKCkuY2xlYXIoKTtcbiAgICAgICAgbGF5ZXIuc2V0U291cmNlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICBsYXllci5kaXNwb3NlKCk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRMYXllckdyb3VwKCkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPSBbXG4gICAgICAuLi50aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzISxcbiAgICAgIHtcbiAgICAgICAgbmFtZTpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MuZ3JvdXAnKSArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICAodGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyEubGVuZ3RoICsgMSksXG4gICAgICAgIHNpbmdsZUxheWVyOiBmYWxzZSxcbiAgICAgICAgdmlzaWJsZUxheWVyczogW11cbiAgICAgIH1cbiAgICBdO1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3Vwc1t0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgIHRoaXMuYWRkTGF5ZXIoZ3JvdXApO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJHcm91cE5hbWUoZ3JvdXA6IExheWVyR3JvdXAsICRldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBbbmFtZSwgc2luZ2xlTGF5ZXIsIHZpc2libGVMYXllcnNdID0gW2dyb3VwLm5hbWUsIGdyb3VwLnNpbmdsZUxheWVyLCBncm91cC52aXNpYmxlTGF5ZXJzXTtcbiAgICBjb25zdCBncm91cEluZGV4ID0gdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyEuZmluZEluZGV4KChnKSA9PiBnLm5hbWUgPT09IGdyb3VwLm5hbWUpO1xuICAgIGNvbnN0IG5ld05hbWUgPSAoJGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG5cbiAgICBpZiAobmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCkge1xuICAgICAgY29uc3QgbGF5ZXJzVG9UcmFuc2ZlciA9XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCkubWFwKChsKSA9PiBsLnRpdGxlKSA/PyBbXTtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPSBbXG4gICAgICAgIC4uLnRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMhLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogbmV3TmFtZSxcbiAgICAgICAgICBzaW5nbGVMYXllcixcbiAgICAgICAgICB2aXNpYmxlTGF5ZXJzOiB2aXNpYmxlTGF5ZXJzIS5maWx0ZXIoKGwpID0+IGxheWVyc1RvVHJhbnNmZXIuaW5jbHVkZXMobCkpXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzID0gdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3Vwcy5tYXAoKGcsIGkpID0+XG4gICAgICAgIGkgPT09IGdyb3VwSW5kZXhcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbmFtZTogREVGQVVMVF9MQVlFUl9HUk9VUCxcbiAgICAgICAgICAgICAgc2luZ2xlTGF5ZXIsXG4gICAgICAgICAgICAgIHZpc2libGVMYXllcnM6IHZpc2libGVMYXllcnMhLmZpbHRlcigobCkgPT4gIWxheWVyc1RvVHJhbnNmZXIuaW5jbHVkZXMobCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBnXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzID0gdGhpcy5vcHRpb25zQ29weS5sYXllckdyb3VwcyEubWFwKChnLCBpKSA9PlxuICAgICAgICBpID09PSBncm91cEluZGV4ID8geyBuYW1lOiBuZXdOYW1lLCBzaW5nbGVMYXllciwgdmlzaWJsZUxheWVycyB9IDogZ1xuICAgICAgKTtcbiAgICB9XG4gICAgLy8gdXBkYXRlIGdyb3VwcyBvbiBvcHRpb25zIGxheWVyc1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmxheWVycykge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5tYXAoKGxheWVyKSA9PlxuICAgICAgICBsYXllci5ncm91cCA9PT0gbmFtZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5sYXllcixcbiAgICAgICAgICAgICAgZ3JvdXA6IG5ld05hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGxheWVyXG4gICAgICApO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgZ3JvdXBzIG9uIG9sIGxheWVyc1xuICAgIHRoaXMubWFwTGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICBpZiAobGF5ZXIuZ2V0UHJvcGVydGllcygpWydncm91cCddID09PSBuYW1lKSBsYXllci5zZXQoJ2dyb3VwJywgbmV3TmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGVMYXllckdyb3VwKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5uYW1lICE9PSBuYW1lKTtcbiAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5tYXAoKGxheWVyKSA9PlxuICAgICAgbGF5ZXIuZ3JvdXAgPT0gbmFtZSA/IHsgLi4ubGF5ZXIsIGdyb3VwOiBERUZBVUxUX0xBWUVSX0dST1VQIH0gOiBsYXllclxuICAgICk7XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxNYXBXaWRnZXRMYXllck9wdGlvbnNbXT4sIGdyb3VwOiBMYXllckdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgbW92ZWRMYXllciA9IGV2ZW50Lml0ZW0uZGF0YSBhcyBNYXBXaWRnZXRMYXllck9wdGlvbnM7XG4gICAgaWYgKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmlkICE9PSBldmVudC5jb250YWluZXIuaWQpIHtcbiAgICAgIHRoaXMubW92ZUxheWVyQmV0d2Vlbkdyb3VwcyhcbiAgICAgICAgbW92ZWRMYXllcixcbiAgICAgICAgZXZlbnQuY29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5ZXItZ3JvdXAnKSA/PyBERUZBVUxUX0xBWUVSX0dST1VQXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm1vdmVMYXllckluT3B0aW9ucyhldmVudC5jdXJyZW50SW5kZXgsIGV2ZW50Lml0ZW0uZGF0YSBhcyBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwKTtcbiAgfVxuXG4gIG1vdmVMYXllckJldHdlZW5Hcm91cHMobW92ZWRMYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBuZXdHcm91cDogc3RyaW5nKSB7XG4gICAgLy8gcmVtb3ZlIGl0IGZyb20gb2xkIGdyb3VwXG4gICAgdGhpcy51cGRhdGVMYXllckdyb3VwKFxuICAgICAgbW92ZWRMYXllci5ncm91cCEsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzXG4gICAgICAgID8uZmluZCgoZ3JvdXApID0+IGdyb3VwLm5hbWUgPT09IG1vdmVkTGF5ZXIuZ3JvdXAhKVxuICAgICAgICA/LnZpc2libGVMYXllcnMuZmlsdGVyKChsYXllcikgPT4gbGF5ZXIgIT09IG1vdmVkTGF5ZXIudGl0bGUpXG4gICAgKTtcblxuICAgIC8vIGFkZCBpdCB0byBuZXcgZ3JvdXBcbiAgICBtb3ZlZExheWVyLmdyb3VwID0gbmV3R3JvdXA7XG4gICAgdGhpcy51cGRhdGVMYXllckdyb3VwKG5ld0dyb3VwID8/IERFRkFVTFRfTEFZRVJfR1JPVVAsIHVuZGVmaW5lZCwgbW92ZWRMYXllci50aXRsZSEpO1xuICAgIHRoaXMucmVtb3ZlRW1wdHlMYXllckdyb3VwcygpO1xuICB9XG5cbiAgbW92ZUxheWVySW5PcHRpb25zKHRhcmdldElkeEluR3JvdXA6IG51bWJlciwgbW92ZWRMYXllcjogTWFwV2lkZ2V0TGF5ZXJPcHRpb25zLCBncm91cDogTGF5ZXJHcm91cCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnNDb3B5LmxheWVycykge1xuICAgICAgY29uc3QgZ3JvdXBMYXllcnMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSk7XG4gICAgICAvLyBpbmRleGVzIGluIG9wdGlvbnNDb3B5XG4gICAgICBjb25zdCBmcm9tSW5kZXggPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVycy5maW5kSW5kZXgoKGxheWVyKSA9PiBsYXllci50aXRsZSA9PT0gbW92ZWRMYXllci50aXRsZSk7XG4gICAgICBjb25zdCB0b0luZGV4ID0gdGhpcy5vcHRpb25zQ29weS5sYXllcnMuZmluZEluZGV4KChsYXllcikgPT4gbGF5ZXIudGl0bGUgPT09IGdyb3VwTGF5ZXJzW3RhcmdldElkeEluR3JvdXBdLnRpdGxlKTtcblxuICAgICAgbGV0IG5ld09yZGVyID0gdG9JbmRleDtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzLnNwbGljZShmcm9tSW5kZXgsIDEpO1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5sYXllcnMuc3BsaWNlKHRvSW5kZXgsIDAsIHsgLi4ubW92ZWRMYXllciwgb3JkZXI6IG5ld09yZGVyIH0pO1xuICAgICAgdGhpcy51cGRhdGVMYXllck9yZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRXhwYW5kQWxsKGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtncm91cC5uYW1lXSA9ICF0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdO1xuICAgIGNvbnN0IGxheWVyc1RvRXhwYW5kID1cbiAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSkubWFwKChsYXllcikgPT4gbGF5ZXIudGl0bGUpID8/IFtdO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZSkuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgIGlmIChsYXllcnNUb0V4cGFuZC5pbmNsdWRlcyhsYXllcikpXG4gICAgICAgIHRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXJdID0gdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtncm91cC5uYW1lXTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZUxheWVyRXhwYW5kKGxheWVyOiBNYXBXaWRnZXRMYXllck9wdGlvbnMsIGdyb3VwOiBMYXllckdyb3VwKSB7XG4gICAgdGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdID0gIXRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXTtcbiAgICBpZiAodGhpcy5sYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdKSB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdID0gdHJ1ZTtcbiAgICBpZiAoZ3JvdXAudmlzaWJsZUxheWVycy5ldmVyeSgobGF5ZXJUaXRsZSkgPT4gIXRoaXMubGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXJUaXRsZV0pKSB7XG4gICAgICB0aGlzLmxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2dyb3VwLm5hbWVdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlTGF5ZXJPcmRlcigpIHtcbiAgICBsZXQgb3JkZXIgPSAxO1xuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHM/LmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBjb25zdCBncm91cExheWVycyA9IHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSk7XG4gICAgICBpZiAoZ3JvdXBMYXllcnMpIHtcbiAgICAgICAgZ3JvdXBMYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IChsYXllci5vcmRlciA9IG9yZGVyKyspKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlzR3JvdXBVc2VkQnlXaWRnZXRMYXllcnMoZ3JvdXA6IExheWVyR3JvdXApIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zQ29weS5sYXllcnM/LnNvbWUoKGxheWVyKSA9PiBsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSk7XG4gIH1cblxuICByZW1vdmVFbXB0eUxheWVyR3JvdXBzKCkge1xuICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJHcm91cHMgPSB0aGlzLm9wdGlvbnNDb3B5LmxheWVyR3JvdXBzIS5maWx0ZXIoXG4gICAgICAoZ3JvdXApID0+XG4gICAgICAgIHRoaXMub3B0aW9uc0NvcHkubGF5ZXJzPy5zb21lKChsYXllcikgPT4gbGF5ZXIuZ3JvdXAgPT09IGdyb3VwLm5hbWUpIHx8IGdyb3VwLm5hbWUgPT09IERFRkFVTFRfTEFZRVJfR1JPVVBcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERFRkFVTFRfTEFZRVJfR1JPVVAgPSBERUZBVUxUX0xBWUVSX0dST1VQO1xufVxuIiwiPHByeS13aWRnZXQtbWFwLWNzcz48L3ByeS13aWRnZXQtbWFwLWNzcz5cbjxkaXYgY2xhc3M9XCJvLXdpZGdldCBvLXdpZGdldC0tbWFwXCI+XG4gIEBpZiAoZGlzcGxheUhlYWRlciQgfCBhc3luYykge1xuICAgIDxwcnktd2lkZ2V0LWhlYWRlclxuICAgICAgW2RhdGFzb3VyY2VJZHNdPVwiKGRhdGFzb3VyY2VJZHMkIHwgYXN5bmMpID8/IFtdXCJcbiAgICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgICBbbWFuaWZlc3RdPVwibWFuaWZlc3RcIlxuICAgICAgKG1hbmlmZXN0TW9kaWZpZWQpPVwibWFuaWZlc3RNb2RpZmllZC5lbWl0KCRldmVudClcIlxuICAgICAgW2hlYWRlck9wdGlvbnNdPVwiKGRpc3BsYXlIZWFkZXIkIHwgYXN5bmMpID8/IHt9XCJcbiAgICAgICNoZWFkZXJcbiAgICAgID5cbiAgICAgIDxwcnktc2V0dGluZ3NcbiAgICAgICAgKHNhdmVUcmlnZ2VyZWQpPVwiZW1pdE1hbmlmZXN0KClcIlxuICAgICAgICAoY2hhbmdlVGl0bGUpPVwiY2hhbmdlV2lkZ2V0VGl0bGUoJGV2ZW50KVwiXG4gICAgICAgIFtoZWFkZXJQcmVzZW50XT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgICAgICBbd2lkZ2V0SW5kZXhdPVwid2lkZ2V0SW5kZXhcIlxuICAgICAgICBbaGVhZGVyXT1cImhlYWRlclwiXG4gICAgICAgIFtvcGVuJF09XCJvcGVuJFwiXG4gICAgICAgIGNsYXNzPVwiby1zZXR0aW5nc1wiXG4gICAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfc3R5bGVcIj57eyAnQHByeS53aWRnZXQubWFwLnN0eWxlJyB8IGkxOG4gfX0gOjwvbGFiZWw+XG4gICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVN0eWxlKCRldmVudClcIlxuICAgICAgICAgICAgW2l0ZW1zXT1cInN0eWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5zdHlsZVwiXG4gICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICBiaW5kVmFsdWU9XCJpZGVudGlmaWVyXCJcbiAgICAgICAgICAgIGlkPVwibWFwX3N0eWxlXCJcbiAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChvcHRpb25zQ29weS5zdHlsZSA9PT0gU1RZTEVfRlJPTV9VUkwpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwic3R5bGVfVVJMXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zdHlsZVVybCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBpZD1cInN0eWxlX1VSTFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlU3R5bGVVUkwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25zQ29weS5zdHlsZVVSTCA/PyAnJ1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VBdXRvTGF5ZXIoJGV2ZW50KVwiIFtuZ01vZGVsXT1cIm9wdGlvbnNDb3B5LmF1dG9tYXRpY0xheWVycyA/PyBmYWxzZVwiPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuYXV0b0xheWVyJyB8IGkxOG4gfX1cbiAgICAgICAgPC9wcnktY2hlY2tib3g+XG4gICAgICAgIDxwcnktY2hlY2tib3ggKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQXR0cmlidXRpb25zKCRldmVudClcIiBbbmdNb2RlbF09XCJvcHRpb25zQ29weS5hdHRyaWJ1dGlvbnMgPz8gZmFsc2VcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQubWFwLmF0dHJpYnV0aW9ucycgfCBpMThuIH19XG4gICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVNsaWRlT3B0aW9uKCRldmVudClcIiBbbmdNb2RlbF09XCJoYXNTbGlkZUxheWVyJCB8IGFzeW5jXCI+XG4gICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZS5nbG9iYWwnIHwgaTE4biB9fVxuICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm8tbGF5ZXItc2V0dGluZ3NcIiBjZGtEcm9wTGlzdEdyb3VwIGNka0RyYWdCb3VuZGFyeT5cbiAgICAgICAgICA8aDQgY2xhc3M9XCJhLWxhYmVsXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnRpdGxlJyB8IGkxOG4gfX08L2g0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1LWRpc3BsYXktZmxleCAtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeVwiIChjbGljayk9XCJhZGRMYXllckdyb3VwKClcIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5hZGRMYXllckdyb3VwJyB8IGkxOG4gfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBmb3IgKGdyb3VwIG9mIG9wdGlvbnNDb3B5LmxheWVyR3JvdXBzOyB0cmFjayBncm91cDsgbGV0IGdyb3VwSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICBAaWYgKGlzR3JvdXBVc2VkQnlXaWRnZXRMYXllcnMoZ3JvdXApKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGQgby1sYXllci1zZXR0aW5nc19fZ3JvdXAtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbGF5ZXJHcm91cFRpdGxlLXt7IGdyb3VwSWR4IH19XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5sYXllckdyb3VwTmFtZScgfCBpMThuIH19PHNwYW4gY2xhc3M9XCItb2JsaWdhdG9yeS1yZWRcIj4qPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID57eyAnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3Mub3B0aW9uYWxDb2xvbicgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInUtZGlzcGxheS1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGQgdS1kaXNwbGF5LWZsZXggLXJvdyAtZ2FwLTEwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sYXllckdyb3VwVGl0bGUte3sgZ3JvdXBJZHggfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVMYXllckdyb3VwTmFtZShncm91cCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ3JvdXAubmFtZSA9PT0gREVGQVVMVF9MQVlFUl9HUk9VUCA/ICgnQHByeS53aWRnZXQubWFwLm5vR3JvdXAnIHwgaTE4bikgOiBncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cC5uYW1lICE9PSBERUZBVUxUX0xBWUVSX0dST1VQKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4tLWljb24tb25seSBhLXRvb2x0aXAgby1sYXllci1zZXR0aW5nc19fZGVsZXRlLWdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5kZWxldGVHcm91cCcgfCBpMThuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVMYXllckdyb3VwKGdyb3VwLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb24gW2hlaWdodF09XCIxNlwiIFt3aWR0aF09XCIxNlwiIGljb25Tdmc9XCJiaW5fbm9ybWFsXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYgKGdyb3VwLm5hbWUgIT09IERFRkFVTFRfTEFZRVJfR1JPVVApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tcmFkaW8tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1yYWRpby1ncm91cF9faXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibXVsdGlzZWxlY3Rpb24te3sgZ3JvdXBJZHggfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JvdXAuc2luZ2xlTGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTGF5ZXJHcm91cFNpbmdsZUxheWVyKGdyb3VwLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm11bHRpc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubGF5ZXJTZXR0aW5ncy5tdWx0aXBsZUxheWVyJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLXJhZGlvLWdyb3VwX19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtb25vc2VsZWN0aW9uLXt7IGdyb3VwSWR4IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyb3VwLnNpbmdsZUxheWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxheWVyR3JvdXBTaW5nbGVMYXllcihncm91cCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1vbm9zZWxlY3Rpb24te3sgZ3JvdXBJZHggfX1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnNpbmdsZUxheWVyJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInUtZGlzcGxheS1mbGV4IC1hbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkTGF5ZXIoZ3JvdXApXCIgY2xhc3M9XCJhLWJ0biAtbGluay1saWtlXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICsge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5hZGRMYXllcicgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVFeHBhbmRBbGwoZ3JvdXApXCIgY2xhc3M9XCJhLWJ0biAtbGluay1saWtlXCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBsYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtncm91cC5uYW1lXVxuICAgICAgICAgICAgICAgICAgICA/ICgnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MuZm9sZEFsbCcgfCBpMThuKVxuICAgICAgICAgICAgICAgICAgICA6ICgnQHByeS53aWRnZXQubWFwLmxheWVyU2V0dGluZ3MudW5mb2xkQWxsJyB8IGkxOG4pXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19sYXllcnNcIlxuICAgICAgICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudCwgZ3JvdXApXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGF5ZXItZ3JvdXBdPVwiZ3JvdXAubmFtZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBAZm9yIChsYXllciBvZiBvcHRpb25zQ29weT8ubGF5ZXJzOyB0cmFjayBsYXllcjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fbGF5ZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwibGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCJsYXllclNldHRpbmdzRXhwYW5kZWRTdGF0ZVtsYXllci50aXRsZSFdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLXBsYWNlaG9sZGVyXCIgKmNka0RyYWdQbGFjZWhvbGRlcj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvLWxheWVyLXNldHRpbmdzX19sYXllci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInUtZGlzcGxheS1mbGV4IC1hbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4tZGlzYWJsZWRdPVwibGF5ZXJTZXR0aW5nc0V4cGFuZGVkU3RhdGVbbGF5ZXIudGl0bGUhXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctaGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25Tdmc9XCJkcmFnX2luZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWJ0bi0taWNvbi1vbmx5IHVuZm9sZC1sYXllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGF5ZXJFeHBhbmQobGF5ZXIsIGdyb3VwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uU3ZnXT1cImxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0gPyAnY2hldnJvbl90b3AnIDogJ2NoZXZyb25fYm90dG9tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJhLWg1XCI+e3sgbGF5ZXIudGl0bGUgPz8gKCdAcHJ5LndpZGdldC5tYXAubGF5ZXInIHwgaTE4bjogeyBpbmRleDogaSArIDEgfSkgfX08L2g1PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1sYXllci1zZXR0aW5nc19fZGVsZXRlLWxheWVyIGEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLmRlbGV0ZUxheWVyJyB8IGkxOG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVMYXllcihpLCBsYXllciwgZ3JvdXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1pY29uIFtoZWlnaHRdPVwiMTZcIiBbd2lkdGhdPVwiMTZcIiBpY29uU3ZnPVwiYmluX25vcm1hbFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxheWVyU2V0dGluZ3NFeHBhbmRlZFN0YXRlW2xheWVyLnRpdGxlIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm8tbGF5ZXItc2V0dGluZ3NfX2xheWVyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiby1zZXR0aW5nc19fcG9wdXBfX2NvbnRlbnRfX2ZpZWxkc19fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1yYW5nZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIobGF5ZXI/Lm9wYWNpdHkgPz8gMTAwKSArICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlT3BhY2l0eShsYXllciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsVHJhbnNsYXRlPVwiQHByeS53aWRnZXQubWFwLm9wYWNpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1yYW5nZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZCBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllck9wdGlvbnMnIHwgaTE4bjogeyBpbmRleDogaSArIDEgfSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJsYXllcl97eyBpICsgMSB9fV90aXRsZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyVGl0bGUnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibGF5ZXJfe3sgaSArIDEgfX1fdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VUaXRsZSgkZXZlbnQsIGxheWVyLCBncm91cClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFbJ2dlb3NlcnZlcicsICdhdXRvJ10uaW5jbHVkZXMobGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX2xheWVyVHlwZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAubGF5ZXJUeXBlLnRpdGxlJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUxheWVyVHlwZSgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImxheWVyVHlwZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllci50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4blByZWZpeD1cIkBwcnkud2lkZ2V0Lm1hcC5sYXllclR5cGUuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfbGF5ZXJUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3ByeS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChbJ2dlb3NlcnZlcicsICd3bXMnXS5pbmNsdWRlcyhsYXllci50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZ2V0QXNXbXNUeXBlKGxheWVyKTsgYXMgd21zbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9sYXllclN0eWxlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxheWVyU3R5bGUnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTGF5ZXJTdHlsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImxheWVyU3R5bGVPcHRpb25zKGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0U3R5bGUobGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX2xheWVyU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94IChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUZpdCgkZXZlbnQsIGxheWVyKVwiIFtuZ01vZGVsXT1cImxheWVyLmZpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC5maXQnIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJ5LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAncmVsYXRpb24nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnd210cycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAnZ2Vvc2VydmVyJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdmZWF0dXJlbGF5ZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3ZlY3RvcnRpbGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3Jhc3RlcnRpbGUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2F1dG8nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cIm1hcF9jbGFzc2VzXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5jbGFzc2VzJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2xhc3NlcygkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ1c2VkQ2xhc3NlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuY2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFsdWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX2NsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3JlbGF0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ3dtcycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICd3bXRzJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSAhPT0gJ2dlb3NlcnZlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdmZWF0dXJlbGF5ZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlICE9PSAndmVjdG9ydGlsZScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgIT09ICdyYXN0ZXJ0aWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmxvY2F0aW9uQXR0cicgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlb21ldHJ5RmllbGRzRm9yOiB7IHJlc3VsdFNldDogcmVzdWx0U2V0JCwgY2xhc3NlczogbGF5ZXIuY2xhc3NlcywgdHlwZTogbGF5ZXIudHlwZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luYzsgYXMgZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWF0bWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9pbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvbHlnb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpLWxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpLXBvbHlnb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmluZGV4T2YobGF5ZXIudHlwZSkgPj0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfbG9jYXRpb25BdHRyaWJ1dGVfYm90aFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmxvY2F0aW9uQXR0cmlidXRlLmJvdGgnIHwgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlTG9jYXRpb25BdHRyaWJ1dGVzKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRMYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF9sb2NhdGlvbkF0dHJpYnV0ZV9ib3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFsnaGVhdG1hcCcsICdidWJibGUnXS5pbmRleE9mKGxheWVyLnR5cGUpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX2ludGVuc2l0eUF0dHJpYnV0ZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLmludGVuc2l0eUF0dHJpYnV0ZScgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VJbnRlbnNpdHlBdHRyaWJ1dGVzKCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXJIYXNJbnRlbnNpdHkobGF5ZXIpLmludGVuc2l0eUF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfaW50ZW5zaXR5QXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnR5cGUgPT09ICd3bXMnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAnZ2Vvc2VydmVyJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3dtdHMnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAnZmVhdHVyZWxheWVyJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ3ZlY3RvcnRpbGUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci50eXBlID09PSAncmFzdGVydGlsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsYXllci50eXBlICE9PSAnZ2Vvc2VydmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX3VybFwiPnt7ICdAcHJ5LndpZGdldC5tYXAud21zLnVybCcgfCBpMThuIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfdXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhLWZvcm0tZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VVcmwoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibGF5ZXIudXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxheWVyLnR5cGUgPT09ICd3bXMnIHx8IGxheWVyLnR5cGUgPT09ICd3bXRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX3BhcmFtTGF5ZXJcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHByeS53aWRnZXQubWFwLndtcy5wYXJhbUxheWVyJyB8IGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm1hcF93bXNfcGFyYW1MYXllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1MYXllcigkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5wYXJhbUxheWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxheWVyLnR5cGUgPT09ICd3bXRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJtYXBfd21zX21hdHJpeFNldFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAcHJ5LndpZGdldC5tYXAud21zLm1hdHJpeFNldCcgfCBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJtYXBfd21zX21hdHJpeFNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlTWF0cml4U2V0KCRldmVudCwgbGF5ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLm1hdHJpeFNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsYXllci50eXBlID09PSAnd210cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwibWFwX3dtc19zdHlsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAud21zLnN0eWxlJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibWFwX3dtc19zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS1mb3JtLWZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2hhbmdlUGFyYW1TdHlsZSgkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci5zdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsYXllci50eXBlID09PSAnd21zJyB8fCBsYXllci50eXBlID09PSAnZ2Vvc2VydmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAudGlsZScgfCBpMThuIH19PC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJ5LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZVBhcmFtVGlsZWQoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXllcj8ucGFyYW1UaWxlZCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0Lm1hcC53bXMucGFyYW1UaWxlZCcgfCBpMThuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsYXllci50eXBlID09PSAnbWFya2VyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmNsdXN0ZXJpbmcnIHwgaTE4biB9fTwvbGVnZW5kPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1mb3JtLWxhYmVsLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1jaGVja2JveCAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDbHVzdGVyZWQobGF5ZXIsICRldmVudClcIiBbbmdNb2RlbF09XCJsYXllci5jbHVzdGVyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5tYXAuY2x1c3RlcmVkJyB8IGkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobGF5ZXIuY2x1c3RlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF5ZXIuY2x1c3RlcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ2x1c3RlckRpc3RhbmNlKGxheWVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUcmFuc2xhdGU9XCJAcHJ5LndpZGdldC5tYXAuY2x1c3RlckRpc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heD1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wcnktcmFuZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW9uc0NvcHkuc2xpZGUgPz8gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWZvcm0tbGFiZWwtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInNsaWRlX3NlbGVjdFwiPnt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGUudGl0bGUnIHwgaTE4biB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcnktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlU2xpZGUoJGV2ZW50LCBsYXllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJzbGlkZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxheWVyLnNsaWRlID8/ICdhbGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhbHVlPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2xpZGVfc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcHJ5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbnNDb3B5LmF0dHJpYnV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZm9ybS1sYWJlbC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhLWxhYmVsXCIgZm9yPVwiYXR0cmlidXRpb25cIj57eyAnQHByeS53aWRnZXQubWFwLmF0dHJpYnV0aW9uJyB8IGkxOG4gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImF0dHJpYnV0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImEtZm9ybS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjaGFuZ2VBdHRyaWJ1dGlvbigkZXZlbnQsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxheWVyLmF0dHJpYnV0aW9uID8gbGF5ZXIuYXR0cmlidXRpb24gOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcHJ5LXNldHRpbmdzPlxuICAgIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG4gIH1cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJtLWJ0bi1ncm91cCAtbWFwLXNlbGVjdGlvbi1jaG9pY2UgLXZlcnRpY2FsXCJcbiAgICBbY2xhc3MuLXdpdGgtaGVhZGVyXT1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgIFtjbGFzcy4tY2xvc2VkXT1cIiEoYWN0aW9uTWVudU9wZW4kIHwgYXN5bmMpXCJcbiAgICA+XG4gICAgPGRpdiBjbGFzcz1cIi12ZXJ0aWNhbFwiPlxuICAgICAgQGZvciAoYWN0aW9uIG9mIGJhc2ljQWN0aW9ucyQgfCBhc3luYzsgdHJhY2sgYWN0aW9uKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwIGEtdG9vbHRpcC0te3sgYWN0aW9uIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU2VsZWN0aW9uKGFjdGlvbilcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLicgKyBhY3Rpb24gfCBpMThuXCJcbiAgICAgICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiBbaWNvblN2Z109XCJhY3Rpb25cIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLicgKyBhY3Rpb24gfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5IGEtdG9vbHRpcCAtbWFwLXRvZ2dsZVwiXG4gICAgICBpZD1cIm9wZW5fbWVudVwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImFjdGlvbk1lbnVPcGVuJCB8IGFzeW5jXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJleHBvcnRfdHlwZVwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibWVudVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCJcbiAgICAgID5cbiAgICAgIDxwcnktaWNvblxuICAgICAgICBbaWNvblN2Z109XCIoYWN0aW9uTWVudU9wZW4kIHwgYXN5bmMpID8gJ2NoZXZyb25fdG9wJyA6ICdjaGV2cm9uX2JvdHRvbSdcIlxuICAgICAgICBbd2lkdGhdPVwiMTJcIlxuICAgICAgICBbaGVpZ2h0XT1cIjI0XCJcbiAgICAgID48L3ByeS1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ1LXZpc3VhbGx5LWhpZGRlblwiPnt7ICdAcHJ5LndpZGdldC5tYXAub3BlbicgfCBpMThuIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibS1idG4tZ3JvdXAgLW1hcC1zZWxlY3Rpb24tY2hvaWNlIC1tYXAtZXhwb3J0XCIgW2NsYXNzLi13aXRoLWhlYWRlcl09XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHkgYS10b29sdGlwXCJcbiAgICAgIGlkPVwiZXhwb3J0X2NhcmRcIlxuICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJleHBvcnRfdHlwZVwiXG4gICAgICBhcmlhLWhhc3BvcHVwPVwibWVudVwiXG4gICAgICBbYXR0ci5kYXRhLXRvb2x0aXBdPVwiJ0Bwcnkud2lkZ2V0Lm1hcC5leHBvcnQnIHwgaTE4blwiXG4gICAgICBkYXRhLXRvb2x0aXAtcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAoY2xpY2spPVwiZXhwb3J0KClcIlxuICAgICAgPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmaWxlX2Rvd25sb2FkXCI+PC9wcnktaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidS12aXN1YWxseS1oaWRkZW5cIj57eyAnQHByeS53aWRnZXQubWFwLmV4cG9ydCcgfCBpMThuIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICBAaWYgKChsYXllcnMkIHwgYXN5bmMpPy5sZW5ndGgpIHtcbiAgICA8ZGl2IGNsYXNzPVwib2wtY29udHJvbCBtLW1hcC1hY3Rpb24gbS1tYXAtYWN0aW9uLS1sYXllcnNcIiBbc3R5bGUudG9wLnB4XT1cImxheWVyc1RvcCQgfCBhc3luY1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cIm0tbWFwLWFjdGlvbl9fYnV0dG9uXCJcbiAgICAgICAgW2NsYXNzLmEtdG9vbHRpcF09XCIhdGhpcy5sYXllcnNUYWJPcGVuXCJcbiAgICAgICAgW2NsYXNzLi10b29sdGlwLW5vLXdyYXBdPVwiIXRoaXMubGF5ZXJzVGFiT3BlblwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVMYXllcnNXaW5kb3coKVwiXG4gICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLnNlbGVjdExheWVycycgfCBpMThuXCJcbiAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgID5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJsYXllcnNcIiBbd2lkdGhdPVwiMThcIiBbaGVpZ2h0XT1cIjE4XCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW4gLW1heC13aWR0aC0yMjBcIiBbY2xhc3MuLWhpZGRlbl09XCIhbGF5ZXJzVGFiT3BlblwiIFtzdHlsZS50b3AucHhdPVwibGF5ZXJzVG9wJCB8IGFzeW5jXCI+XG4gICAgICA8aDQgY2xhc3M9XCJhLWg0XCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLnNlbGVjdExheWVycycgfCBpMThuIH19PC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX2NvbnRlbnRcIiBbc3R5bGUubWF4LWhlaWdodC5weF09XCJsYXllcnNIZWlnaHQkIHwgYXN5bmNcIj5cbiAgICAgICAgQGZvciAoZ3JvdXAgb2YgKG9wdGlvbnMkIHwgYXN5bmMpPy5sYXllckdyb3VwcyA/PyBbXTsgdHJhY2sgZ3JvdXA7IGxldCBncm91cElkeCA9ICRpbmRleCkge1xuICAgICAgICAgIEBpZiAoaXNHcm91cFVzZWRCeVdpZGdldExheWVycyhncm91cCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX3RpdGxlIG0tbWFwLXBvcC1pbl9fZ3JvdXAtdGl0bGVcIj5cbiAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiYS1oNVwiPlxuICAgICAgICAgICAgICAgIHt7IGdyb3VwLm5hbWUgPT09IERFRkFVTFRfTEFZRVJfR1JPVVAgPyAoJ0Bwcnkud2lkZ2V0Lm1hcC5ub0dyb3VwJyB8IGkxOG4pIDogZ3JvdXAubmFtZSB9fVxuICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKGdyb3VwLnNpbmdsZUxheWVyKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX3JhZGlvc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX3RpdGxlXCIgW2NsYXNzLi1oaWRkZW5dPVwiIWxheWVyc1RhYk9wZW5cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJpZCArICctJyArIGdyb3VwLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cInt7IGlkIH19LXJhZGlvLWxheWVyLWdyb3VwLXt7IGdyb3VwSWR4IH19XCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JvdXAudmlzaWJsZUxheWVycy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlVmlzaWJpbGl0eShncm91cClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cInt7IGlkIH19LXJhZGlvLWxheWVyLWdyb3VwLXt7IGdyb3VwSWR4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ0Bwcnkud2lkZ2V0Lm1hcC5sYXllclNldHRpbmdzLm5vTGF5ZXInIHwgaTE4blxuICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBmb3IgKGxheWVyIG9mIG9wdGlvbnNDb3B5LmxheWVyczsgdHJhY2sgbGF5ZXI7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgQGlmIChsYXllci5ncm91cCA9PT0gZ3JvdXAubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiaWQgKyAnLScgKyBncm91cC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgaWQgfX0tcmFkaW8te3sgZ3JvdXAubmFtZSB9fS1sYXllci17eyBpbmRleCB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncm91cC52aXNpYmxlTGF5ZXJzWzBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJsYXllci50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVZpc2liaWxpdHkoZ3JvdXAsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImEtbGFiZWxcIiBmb3I9XCJ7eyBpZCB9fS1yYWRpby17eyBncm91cC5uYW1lIH19LWxheWVyLXt7IGluZGV4IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnRpdGxlID8/ICgnQHByeS53aWRnZXQubWFwLm1pc3NpbmdUaXRsZScgfCBpMThuKVxuICAgICAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBAZm9yIChsYXllciBvZiBvcHRpb25zQ29weS5sYXllcnM7IHRyYWNrIGxheWVyOyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGxheWVyLmdyb3VwID09PSBncm91cC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX190aXRsZVwiIFtjbGFzcy4taGlkZGVuXT1cIiFsYXllcnNUYWJPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc0xheWVyVmlzaWJsZShsYXllciwgZ3JvdXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVZpc2liaWxpdHkoZ3JvdXAsIGxheWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJjaGVja2JveC1sYXllci17eyBpbmRleCB9fVwiXG4gICAgICAgICAgICAgICAgICAgID48L3ByeS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYS1sYWJlbFwiIGZvcj1cImNoZWNrYm94LWxheWVyLXt7IGluZGV4IH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbGF5ZXIudGl0bGUgPz8gKCdAcHJ5LndpZGdldC5tYXAubWlzc2luZ1RpdGxlJyB8IGkxOG4pIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAoKGxlZ2VuZExheWVycyQgfCBhc3luYyk/Lmxlbmd0aCkge1xuICAgIDxkaXYgY2xhc3M9XCJvbC1jb250cm9sIG0tbWFwLWFjdGlvbiBtLW1hcC1hY3Rpb24tLWxlZ2VuZFwiIFtzdHlsZS50b3AucHhdPVwibGVnZW5kVG9wJCB8IGFzeW5jXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIFtjbGFzcy5hLXRvb2x0aXBdPVwiIXRoaXMubGVnZW5kVGFiT3BlblwiXG4gICAgICAgIFtjbGFzcy4tdG9vbHRpcC1uby13cmFwXT1cIiF0aGlzLmxlZ2VuZFRhYk9wZW5cIlxuICAgICAgICBjbGFzcz1cIm0tbWFwLWFjdGlvbl9fYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxlZ2VuZFdpbmRvdygpXCJcbiAgICAgICAgW2F0dHIuZGF0YS10b29sdGlwXT1cIidAcHJ5LndpZGdldC5tYXAubGVnZW5kcycgfCBpMThuXCJcbiAgICAgICAgZGF0YS10b29sdGlwLXBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgID5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJsZWdlbmRcIiBbd2lkdGhdPVwiMThcIiBbaGVpZ2h0XT1cIjE1XCI+PC9wcnktaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLW1hcC1wb3AtaW5cIiBbY2xhc3MuLWhpZGRlbl09XCIhbGVnZW5kVGFiT3BlblwiIFtzdHlsZS50b3AucHhdPVwibGVnZW5kVG9wJCB8IGFzeW5jXCI+XG4gICAgICA8aDQgY2xhc3M9XCJhLWg0XCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmRzVGl0bGUnIHwgaTE4biB9fTwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX19jb250ZW50XCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwibGF5ZXJzSGVpZ2h0JCB8IGFzeW5jXCI+XG4gICAgICAgIEBmb3IgKGdlb0xheWVyIG9mIGxlZ2VuZExheWVycyQgfCBhc3luYzsgdHJhY2sgZ2VvTGF5ZXI7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgIEBpZiAoaXNMYXllclZpc2libGUoZ2VvTGF5ZXIpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1tYXAtcG9wLWluX190aXRsZVwiIChjbGljayk9XCJ0b2dnbGVMZWdlbmQoaW5kZXgpXCI+XG4gICAgICAgICAgICAgIEBpZiAoaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKSAmJiAhIWdlb0xheWVyLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm0tbWFwLXBvcC1pbl9fZHJvcGRvd24taWNvblwiXG4gICAgICAgICAgICAgICAgICBbaWNvblN2Z109XCJsZWdlbmRUYWJDbG9zZWRbaW5kZXhdID8gJ2NoZXZyb25fYm90dG9tJyA6ICdjaGV2cm9uX3RvcCdcIlxuICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTJcIlxuICAgICAgICAgICAgICAgID48L3ByeS1pY29uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cImEtaDVcIj57eyBnZW9MYXllci50aXRsZSB9fTwvaDU+XG4gICAgICAgICAgICAgIEBpZiAoIWlzTGF5ZXJSZW5kZXJlZChnZW9MYXllcikpIHtcbiAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYS10b29sdGlwXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdG9vbHRpcF09XCInQHByeS53aWRnZXQubWFwLmxheWVyTG9hZEVycm9yJyB8IGkxOG5cIlxuICAgICAgICAgICAgICAgICAgW2ljb25TdmddPVwiJ2Nsb3NlJ1wiXG4gICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMjJcIlxuICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCIyMlwiXG4gICAgICAgICAgICAgICAgPjwvcHJ5LWljb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm0tbWFwLXBvcC1pbl9faW1hZ2VcIlxuICAgICAgICAgICAgW2NsYXNzLi1oaWRkZW5dPVwiIWxlZ2VuZFRhYk9wZW4gfHwgbGVnZW5kVGFiQ2xvc2VkW2luZGV4XSB8fCAhaXNMYXllclJlbmRlcmVkKGdlb0xheWVyKVwiXG4gICAgICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJsZWdlbmRIZWlnaHQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChnZW9MYXllciB8IGxlZ2VuZFVybDogeyBjYXBhYmlsaXRpZXM6ICh3bXNDYXBhYmlsaXRpZXMkIHwgYXN5bmMpIH07IGFzIHVybCkge1xuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJ1cmwgfCBnZXRTZWN1cmVkSW1hZ2UgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW2FsdF09XCInQHByeS53aWRnZXQubWFwLmxlZ2VuZCcgfCBpMThuOiB7IGxheWVyOiBnZW9MYXllci50aXRsZSB9XCJcbiAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VOb3RQcm92aWRlZFtpbmRleF0gPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghKGdlb0xheWVyIHwgbGVnZW5kVXJsOiB7IGNhcGFiaWxpdGllczogKHdtc0NhcGFiaWxpdGllcyQgfCBhc3luYykgfSkpIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtLW1hcC1wb3AtaW5fX2Vycm9yXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5sZWdlbmROb3RQcm92aWRlZCcgfCBpMThuIH19PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIEBpZiAobGVmdFNsaWRlTGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICA8ZGl2IGNsYXNzPVwibS1tYXAtc2xpZGUtbGVnZW5kIC1sZWZ0XCIgW3N0eWxlLnRvcC5weF09XCJsZWdlbmRUb3AkIHwgYXN5bmNcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibS1tYXAtc2xpZGUtbGVnZW5kX190aXRsZVwiPnt7ICdAcHJ5LndpZGdldC5tYXAuc2xpZGVUaXRsZScgfCBpMThuIH19Ojwvc3Bhbj5cbiAgICAgIEBmb3IgKGxheWVyIG9mIGxlZnRTbGlkZUxheWVyczsgdHJhY2sgbGF5ZXIpIHtcbiAgICAgICAgPGRpdj57eyBsYXllci5nZXQoJ3RpdGxlJykgfX08L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIEBpZiAocmlnaHRTbGlkZUxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgPGRpdiBjbGFzcz1cIm0tbWFwLXNsaWRlLWxlZ2VuZCAtcmlnaHRcIiBbc3R5bGUudG9wLnB4XT1cImxlZ2VuZFRvcCQgfCBhc3luY1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtLW1hcC1zbGlkZS1sZWdlbmRfX3RpdGxlXCI+e3sgJ0Bwcnkud2lkZ2V0Lm1hcC5zbGlkZVRpdGxlJyB8IGkxOG4gfX06PC9zcGFuPlxuICAgICAgQGZvciAobGF5ZXIgb2YgcmlnaHRTbGlkZUxheWVyczsgdHJhY2sgbGF5ZXIpIHtcbiAgICAgICAgPGRpdj57eyBsYXllci5nZXQoJ3RpdGxlJykgfX08L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxkaXYgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHQkIHwgYXN5bmNcIiBjbGFzcz1cIm8tbWFwLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tYXBcIj5cbiAgICAgIDxkaXYgI21hcFJlZiBpZD1cIm1hcFwiPjwvZGl2PlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgIG1pbj1cIjBcIlxuICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICBzdGVwPVwiMC4wMVwiXG4gICAgICAgIHZhbHVlPVwiNTBcIlxuICAgICAgICAjc2xpZGVyRWxlbWVudFxuICAgICAgICBjbGFzcz1cIm8tbWFwLXNsaWRlclwiXG4gICAgICAgIFtjbGFzcy4taGlkZGVuXT1cIiEoaGFzU2xpZGVMYXllciQgfCBhc3luYylcIlxuICAgICAgICAoaW5wdXQpPVwidHJpZ2dlckxheWVyUmVuZGVyKClcIlxuICAgICAgICAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICNwb3B1cCBjbGFzcz1cIm0tdG9vbHRpcCBtLXRvb2x0aXAtLXBvcHVwXCIgW2hpZGRlbl09XCJ0cnVlXCIgcm9sZT1cInRvb2x0aXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwibS10b29sdGlwLS1wb3B1cF9faGVhZGVyXCI+XG4gICAgICA8cD57eyAoKHRvb2x0aXBNYW5hZ2VyLnRvb2x0aXBEaXNwbGF5ZWRJbmRleCQgfCBhc3luYykgPz8gMCkgKyAxIH19IC8ge3sgdG9vbHRpcE1hbmFnZXIudG9vbHRpcE51bWJlciB9fTwvcD5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0tcHJpbWFyeSBhLWJ0bi0taWNvbi1vbmx5XCJcbiAgICAgICAgKGNsaWNrKT1cInRvb2x0aXBNYW5hZ2VyLnRvb2x0aXBNb3ZlKC0xKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdG9vbHRpcE1hbmFnZXIudG9vbHRpcENhbk1vdmUoLTEpXCJcbiAgICAgICAgPlxuICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFycm93X2JhY2tcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnkgYS1idG4tLWljb24tb25seVwiXG4gICAgICAgIChjbGljayk9XCJ0b29sdGlwTWFuYWdlci50b29sdGlwTW92ZSgxKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdG9vbHRpcE1hbmFnZXIudG9vbHRpcENhbk1vdmUoMSlcIlxuICAgICAgICA+XG4gICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiYXJyb3dfcmlnaHRcIj48L3ByeS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnkgYS1idG4tLWljb24tb25seVwiIChjbGljayk9XCJ0b29sdGlwTWFuYWdlci5jbGVhclRvb2x0aXAodHJ1ZSlcIj5cbiAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJjbG9zZVwiPjwvcHJ5LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS10b29sdGlwLS1wb3B1cF9fY29udGFpbmVyXCI+XG4gICAgICA8bmctY29udGFpbmVyICNwb3B1cENvbnRlbnQ+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|