@igo2/integration 1.12.0 → 1.13.0-alpha.1
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/{esm2015/igo2-integration.js → esm2020/igo2-integration.mjs} +0 -0
- package/esm2020/lib/about/about-tool/about-tool.component.mjs +185 -0
- package/{esm2015/lib/about/about-tool/index.js → esm2020/lib/about/about-tool/index.mjs} +0 -0
- package/{esm2015/lib/about/about.module.js → esm2020/lib/about/about.module.mjs} +9 -11
- package/{esm2015/lib/about/index.js → esm2020/lib/about/index.mjs} +0 -0
- package/{esm2015/lib/analytics/analytics-listener.service.js → esm2020/lib/analytics/analytics-listener.service.mjs} +0 -0
- package/{esm2015/lib/analytics/analytics.module.js → esm2020/lib/analytics/analytics.module.mjs} +2 -2
- package/{esm2015/lib/analytics/index.js → esm2020/lib/analytics/index.mjs} +0 -0
- package/{esm2015/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.js → esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs} +3 -7
- package/{esm2015/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.js → esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs} +3 -5
- package/{esm2015/lib/catalog/catalog-library-tool/catalog-library-tool.component.js → esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs} +3 -7
- package/{esm2015/lib/catalog/catalog-library-tool/catalog-library-tool.module.js → esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs} +3 -5
- package/{esm2015/lib/catalog/catalog.module.js → esm2020/lib/catalog/catalog.module.mjs} +2 -2
- package/{esm2015/lib/catalog/catalog.state.js → esm2020/lib/catalog/catalog.state.mjs} +0 -0
- package/{esm2015/lib/catalog/index.js → esm2020/lib/catalog/index.mjs} +0 -0
- package/{esm2015/lib/context/context-editor-tool/context-editor-tool.component.js → esm2020/lib/context/context-editor-tool/context-editor-tool.component.mjs} +3 -6
- package/{esm2015/lib/context/context-manager-tool/context-manager-tool.component.js → esm2020/lib/context/context-manager-tool/context-manager-tool.component.mjs} +3 -6
- package/{esm2015/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.js → esm2020/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs} +3 -6
- package/{esm2015/lib/context/context-share-tool/context-share-tool.component.js → esm2020/lib/context/context-share-tool/context-share-tool.component.mjs} +3 -6
- package/{esm2015/lib/context/context.module.js → esm2020/lib/context/context.module.mjs} +2 -2
- package/{esm2015/lib/context/context.state.js → esm2020/lib/context/context.state.mjs} +0 -0
- package/{esm2015/lib/context/index.js → esm2020/lib/context/index.mjs} +0 -0
- package/{esm2015/lib/directions/directions-tool/directions-tool.component.js → esm2020/lib/directions/directions-tool/directions-tool.component.mjs} +3 -6
- package/{esm2015/lib/directions/directions-tool/index.js → esm2020/lib/directions/directions-tool/index.mjs} +0 -0
- package/{esm2015/lib/directions/directions.module.js → esm2020/lib/directions/directions.module.mjs} +2 -2
- package/esm2020/lib/directions/directions.state.mjs +64 -0
- package/{esm2015/lib/directions/index.js → esm2020/lib/directions/index.mjs} +0 -0
- package/{esm2015/lib/draw/draw.module.js → esm2020/lib/draw/draw.module.mjs} +2 -2
- package/{esm2015/lib/draw/draw.state.js → esm2020/lib/draw/draw.state.mjs} +0 -0
- package/{esm2015/lib/draw/drawing-tool/drawing-tool.component.js → esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs} +3 -7
- package/{esm2015/lib/draw/index.js → esm2020/lib/draw/index.mjs} +0 -0
- package/{esm2015/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.js → esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs} +0 -0
- package/{esm2015/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.js → esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs} +3 -7
- package/{esm2015/lib/filter/active-ogc-filter-tool/index.js → esm2020/lib/filter/active-ogc-filter-tool/index.mjs} +0 -0
- package/{esm2015/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.js → esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs} +0 -0
- package/{esm2015/lib/filter/active-time-filter-tool/active-time-filter-tool.component.js → esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs} +3 -7
- package/{esm2015/lib/filter/active-time-filter-tool/index.js → esm2020/lib/filter/active-time-filter-tool/index.mjs} +0 -0
- package/{esm2015/lib/filter/filter.module.js → esm2020/lib/filter/filter.module.mjs} +2 -2
- package/{esm2015/lib/filter/index.js → esm2020/lib/filter/index.mjs} +0 -0
- package/{esm2015/lib/filter/ogc-filter-tool/index.js → esm2020/lib/filter/ogc-filter-tool/index.mjs} +0 -0
- package/{esm2015/lib/filter/ogc-filter-tool/ogc-filter-tool.component.js → esm2020/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs} +3 -6
- package/{esm2015/lib/filter/spatial-filter-tool/index.js → esm2020/lib/filter/spatial-filter-tool/index.mjs} +0 -0
- package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +535 -0
- package/{esm2015/lib/filter/time-filter-tool/index.js → esm2020/lib/filter/time-filter-tool/index.mjs} +0 -0
- package/{esm2015/lib/filter/time-filter-tool/time-filter-tool.component.js → esm2020/lib/filter/time-filter-tool/time-filter-tool.component.mjs} +3 -6
- package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +137 -0
- package/{esm2015/lib/import-export/import-export-tool/index.js → esm2020/lib/import-export/import-export-tool/index.mjs} +0 -0
- package/{esm2015/lib/import-export/import-export.module.js → esm2020/lib/import-export/import-export.module.mjs} +7 -9
- package/{esm2015/lib/import-export/import-export.state.js → esm2020/lib/import-export/import-export.state.mjs} +0 -0
- package/{esm2015/lib/import-export/index.js → esm2020/lib/import-export/index.mjs} +0 -0
- package/{esm2015/lib/integration.module.js → esm2020/lib/integration.module.mjs} +2 -2
- package/{esm2015/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.js → esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs} +14 -22
- package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +89 -0
- package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +218 -0
- package/{esm2015/lib/map/advanced-map-tool/index.js → esm2020/lib/map/advanced-map-tool/index.mjs} +0 -0
- package/{esm2015/lib/map/index.js → esm2020/lib/map/index.mjs} +0 -0
- package/{esm2015/lib/map/layer-list-tool.state.js → esm2020/lib/map/layer-list-tool.state.mjs} +0 -0
- package/{esm2015/lib/map/map-details-tool/index.js → esm2020/lib/map/map-details-tool/index.mjs} +0 -0
- package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +256 -0
- package/{esm2015/lib/map/map-legend/index.js → esm2020/lib/map/map-legend/index.mjs} +0 -0
- package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +275 -0
- package/{esm2015/lib/map/map-proximity-tool/index.js → esm2020/lib/map/map-proximity-tool/index.mjs} +0 -0
- package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +206 -0
- package/{esm2015/lib/map/map-proximity.state.js → esm2020/lib/map/map-proximity.state.mjs} +10 -11
- package/{esm2015/lib/map/map-tool/index.js → esm2020/lib/map/map-tool/index.mjs} +0 -0
- package/esm2020/lib/map/map-tool/map-tool.component.mjs +130 -0
- package/{esm2015/lib/map/map-tools/index.js → esm2020/lib/map/map-tools/index.mjs} +0 -0
- package/esm2020/lib/map/map-tools/map-tools.component.mjs +478 -0
- package/esm2020/lib/map/map.module.mjs +141 -0
- package/esm2020/lib/map/map.state.mjs +47 -0
- package/{esm2015/lib/measure/index.js → esm2020/lib/measure/index.mjs} +0 -0
- package/{esm2015/lib/measure/measure.module.js → esm2020/lib/measure/measure.module.mjs} +2 -2
- package/{esm2015/lib/measure/measure.state.js → esm2020/lib/measure/measure.state.mjs} +0 -0
- package/{esm2015/lib/measure/measurer-tool/measurer-tool.component.js → esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs} +3 -7
- package/{esm2015/lib/measure/measurer-tool/measurer-tool.module.js → esm2020/lib/measure/measurer-tool/measurer-tool.module.mjs} +2 -4
- package/{esm2015/lib/print/index.js → esm2020/lib/print/index.mjs} +0 -0
- package/{esm2015/lib/print/print-tool/index.js → esm2020/lib/print/print-tool/index.mjs} +0 -0
- package/{esm2015/lib/print/print-tool/print-tool.component.js → esm2020/lib/print/print-tool/print-tool.component.mjs} +3 -6
- package/{esm2015/lib/print/print.module.js → esm2020/lib/print/print.module.mjs} +2 -2
- package/{esm2015/lib/search/index.js → esm2020/lib/search/index.mjs} +0 -0
- package/{esm2015/lib/search/query.state.js → esm2020/lib/search/query.state.mjs} +0 -0
- package/{esm2015/lib/search/search-bar/search-bar-binding.directive.js → esm2020/lib/search/search-bar/search-bar-binding.directive.mjs} +0 -0
- package/{esm2015/lib/search/search-bar/search-bar.module.js → esm2020/lib/search/search-bar/search-bar.module.mjs} +2 -2
- package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +577 -0
- package/{esm2015/lib/search/search-results-tool/search-results-tool.module.js → esm2020/lib/search/search-results-tool/search-results-tool.module.mjs} +13 -15
- package/{esm2015/lib/search/search.module.js → esm2020/lib/search/search.module.mjs} +2 -2
- package/{esm2015/lib/search/search.state.js → esm2020/lib/search/search.state.mjs} +0 -0
- package/{esm2015/lib/storage/index.js → esm2020/lib/storage/index.mjs} +0 -0
- package/{esm2015/lib/storage/storage.module.js → esm2020/lib/storage/storage.module.mjs} +2 -2
- package/{esm2015/lib/storage/storage.state.js → esm2020/lib/storage/storage.state.mjs} +0 -0
- package/{esm2015/lib/tool/index.js → esm2020/lib/tool/index.mjs} +0 -0
- package/{esm2015/lib/tool/tool.module.js → esm2020/lib/tool/tool.module.mjs} +2 -2
- package/{esm2015/lib/tool/tool.state.js → esm2020/lib/tool/tool.state.mjs} +0 -0
- package/{esm2015/lib/workspace/index.js → esm2020/lib/workspace/index.mjs} +0 -0
- package/esm2020/lib/workspace/shared/edition-actions.service.mjs +156 -0
- package/{esm2015/lib/workspace/shared/feature-actions.service.js → esm2020/lib/workspace/shared/feature-actions.service.mjs} +0 -0
- package/{esm2015/lib/workspace/shared/index.js → esm2020/lib/workspace/shared/index.mjs} +0 -0
- package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +158 -0
- package/{esm2015/lib/workspace/shared/workspace.utils.js → esm2020/lib/workspace/shared/workspace.utils.mjs} +0 -0
- package/{esm2015/lib/workspace/workspace-button/index.js → esm2020/lib/workspace/workspace-button/index.mjs} +0 -0
- package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +69 -0
- package/{esm2015/lib/workspace/workspace.module.js → esm2020/lib/workspace/workspace.module.mjs} +6 -8
- package/esm2020/lib/workspace/workspace.state.mjs +188 -0
- package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
- package/fesm2015/igo2-integration.mjs +6606 -0
- package/fesm2015/igo2-integration.mjs.map +1 -0
- package/{fesm2015/igo2-integration.js → fesm2020/igo2-integration.mjs} +336 -565
- package/fesm2020/igo2-integration.mjs.map +1 -0
- package/{igo2-integration.d.ts → index.d.ts} +0 -0
- package/lib/about/about-tool/about-tool.component.d.ts +1 -1
- package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +1 -1
- package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +1 -1
- package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +1 -1
- package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +1 -1
- package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +1 -1
- package/lib/context/context-share-tool/context-share-tool.component.d.ts +1 -1
- package/lib/directions/directions-tool/directions-tool.component.d.ts +1 -1
- package/lib/draw/drawing-tool/drawing-tool.component.d.ts +1 -1
- package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +1 -1
- package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +1 -1
- package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +1 -1
- package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +3 -1
- package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +1 -1
- package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +1 -1
- package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +1 -1
- package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +1 -1
- package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +1 -1
- package/lib/map/map-details-tool/map-details-tool.component.d.ts +1 -1
- package/lib/map/map-legend/map-legend-tool.component.d.ts +1 -1
- package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +1 -1
- package/lib/map/map-tool/map-tool.component.d.ts +1 -1
- package/lib/map/map-tools/map-tools.component.d.ts +1 -1
- package/lib/map/map.state.d.ts +3 -2
- package/lib/measure/measurer-tool/measurer-tool.component.d.ts +1 -1
- package/lib/print/print-tool/print-tool.component.d.ts +1 -1
- package/lib/search/search-bar/search-bar-binding.directive.d.ts +1 -1
- package/lib/search/search-results-tool/search-results-tool.component.d.ts +1 -1
- package/lib/workspace/workspace-button/workspace-button.component.d.ts +1 -1
- package/package.json +24 -11
- package/bundles/igo2-integration.umd.js +0 -7861
- package/bundles/igo2-integration.umd.js.map +0 -1
- package/esm2015/lib/about/about-tool/about-tool.component.js +0 -190
- package/esm2015/lib/directions/directions.state.js +0 -66
- package/esm2015/lib/filter/spatial-filter-tool/spatial-filter-tool.component.js +0 -544
- package/esm2015/lib/import-export/import-export-tool/import-export-tool.component.js +0 -145
- package/esm2015/lib/map/advanced-map-tool/advanced-map-tool.component.js +0 -99
- package/esm2015/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.js +0 -234
- package/esm2015/lib/map/map-details-tool/map-details-tool.component.js +0 -274
- package/esm2015/lib/map/map-legend/map-legend-tool.component.js +0 -289
- package/esm2015/lib/map/map-proximity-tool/map-proximity-tool.component.js +0 -221
- package/esm2015/lib/map/map-tool/map-tool.component.js +0 -142
- package/esm2015/lib/map/map-tools/map-tools.component.js +0 -496
- package/esm2015/lib/map/map.module.js +0 -143
- package/esm2015/lib/map/map.state.js +0 -46
- package/esm2015/lib/search/search-results-tool/search-results-tool.component.js +0 -598
- package/esm2015/lib/workspace/shared/edition-actions.service.js +0 -157
- package/esm2015/lib/workspace/shared/wfs-actions.service.js +0 -159
- package/esm2015/lib/workspace/workspace-button/workspace-button.component.js +0 -74
- package/esm2015/lib/workspace/workspace.state.js +0 -190
- package/fesm2015/igo2-integration.js.map +0 -1
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
|
|
3
|
+
import { forkJoin, Subject } from 'rxjs';
|
|
4
|
+
import { tap, take, takeUntil } from 'rxjs/operators';
|
|
5
|
+
import { moveToOlFeatures, FeatureMotion, featureToOl, SpatialFilterType, SpatialFilterItemType, createOverlayMarkerStyle, MeasureLengthUnit } from '@igo2/geo';
|
|
6
|
+
import { EntityStore, ToolComponent } from '@igo2/common';
|
|
7
|
+
import olFormatGeoJSON from 'ol/format/GeoJSON';
|
|
8
|
+
import { BehaviorSubject } from 'rxjs';
|
|
9
|
+
import { ImportExportMode } from './../../import-export/import-export.state';
|
|
10
|
+
import * as olstyle from 'ol/style';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/material/icon";
|
|
13
|
+
import * as i2 from "@igo2/geo";
|
|
14
|
+
import * as i3 from "../../map/map.state";
|
|
15
|
+
import * as i4 from "@igo2/core";
|
|
16
|
+
import * as i5 from "./../../import-export/import-export.state";
|
|
17
|
+
import * as i6 from "../../tool/tool.state";
|
|
18
|
+
import * as i7 from "../../workspace/workspace.state";
|
|
19
|
+
import * as i8 from "@angular/common";
|
|
20
|
+
function SpatialFilterToolComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementContainerStart(0);
|
|
22
|
+
i0.ɵɵelement(1, "igo-feature-details", 3);
|
|
23
|
+
i0.ɵɵelementContainerEnd();
|
|
24
|
+
} if (rf & 2) {
|
|
25
|
+
const feature_r1 = ctx.ngIf;
|
|
26
|
+
i0.ɵɵadvance(1);
|
|
27
|
+
i0.ɵɵproperty("feature", feature_r1);
|
|
28
|
+
} }
|
|
29
|
+
/**
|
|
30
|
+
* Tool to apply spatial filter
|
|
31
|
+
*/
|
|
32
|
+
let SpatialFilterToolComponent = class SpatialFilterToolComponent {
|
|
33
|
+
constructor(matIconRegistry, spatialFilterService, dataSourceService, layerService, mapState, messageService, languageService, importExportState, toolState, workspaceState, cdRef) {
|
|
34
|
+
this.matIconRegistry = matIconRegistry;
|
|
35
|
+
this.spatialFilterService = spatialFilterService;
|
|
36
|
+
this.dataSourceService = dataSourceService;
|
|
37
|
+
this.layerService = layerService;
|
|
38
|
+
this.mapState = mapState;
|
|
39
|
+
this.messageService = messageService;
|
|
40
|
+
this.languageService = languageService;
|
|
41
|
+
this.importExportState = importExportState;
|
|
42
|
+
this.toolState = toolState;
|
|
43
|
+
this.workspaceState = workspaceState;
|
|
44
|
+
this.cdRef = cdRef;
|
|
45
|
+
this.itemType = SpatialFilterItemType.Address;
|
|
46
|
+
this.layers = [];
|
|
47
|
+
this.activeLayers = [];
|
|
48
|
+
this.buffer = 0;
|
|
49
|
+
this.iterator = 1;
|
|
50
|
+
this.selectedFeature$ = new BehaviorSubject(undefined);
|
|
51
|
+
this.format = new olFormatGeoJSON();
|
|
52
|
+
this.store = new EntityStore([]); // Store to print results at the end
|
|
53
|
+
this.spatialListStore = new EntityStore([]);
|
|
54
|
+
this.loading = false;
|
|
55
|
+
this.thematicLength = 0;
|
|
56
|
+
this.measureUnit = MeasureLengthUnit.Meters;
|
|
57
|
+
this.unsubscribe$ = new Subject();
|
|
58
|
+
}
|
|
59
|
+
get map() {
|
|
60
|
+
return this.mapState.map;
|
|
61
|
+
}
|
|
62
|
+
ngOnInit() {
|
|
63
|
+
for (const layer of this.map.layers) {
|
|
64
|
+
if (layer.title && layer.title.includes(this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'))) {
|
|
65
|
+
this.layers.push(layer);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
ngOnDestroy() {
|
|
70
|
+
this.unsubscribe$.next();
|
|
71
|
+
this.unsubscribe$.complete();
|
|
72
|
+
}
|
|
73
|
+
getOutputType(event) {
|
|
74
|
+
this.type = event;
|
|
75
|
+
this.queryType = undefined;
|
|
76
|
+
}
|
|
77
|
+
getOutputQueryType(event) {
|
|
78
|
+
this.queryType = event;
|
|
79
|
+
if (this.queryType) {
|
|
80
|
+
this.loadFilterList();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
activateExportTool() {
|
|
84
|
+
const ids = [];
|
|
85
|
+
const re = new RegExp('^Zone \\d+');
|
|
86
|
+
for (const layer of this.layers) {
|
|
87
|
+
if (!layer.title.match(re)) {
|
|
88
|
+
ids.push(layer.id);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
this.importExportState.setMode(ImportExportMode.export);
|
|
92
|
+
this.importExportState.setsExportOptions({ layers: ids });
|
|
93
|
+
this.toolState.toolbox.activateTool('importExport');
|
|
94
|
+
}
|
|
95
|
+
activateWorkspace(record) {
|
|
96
|
+
let layerToOpenWks;
|
|
97
|
+
this.workspaceState.store.entities$.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
|
|
98
|
+
if (!record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
|
|
99
|
+
if (this.itemType === SpatialFilterItemType.Thematics) {
|
|
100
|
+
for (const thematic of this.thematics) {
|
|
101
|
+
if (!thematic.zeroResults) {
|
|
102
|
+
layerToOpenWks = this.activeLayers.find(layer => layer.title.includes(thematic.name + ' ' + this.iterator.toString()));
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const title = 'Adresses ' + this.iterator.toString();
|
|
109
|
+
this.activeLayers.forEach((layer) => {
|
|
110
|
+
if (layer.title.includes(title)) {
|
|
111
|
+
layerToOpenWks = layer;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (layerToOpenWks) {
|
|
116
|
+
this.workspaceState.workspacePanelExpanded = true;
|
|
117
|
+
this.workspaceState.setActiveWorkspaceById(layerToOpenWks.id);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (record && this.activeLayers.length && this.workspaceState.store.all().length > 1) {
|
|
121
|
+
this.selectWorkspaceEntity(record);
|
|
122
|
+
this.moveendKey = this.map.ol.on('moveend', () => {
|
|
123
|
+
this.selectWorkspaceEntity(record);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
selectWorkspaceEntity(record) {
|
|
129
|
+
this.workspaceState.store.all().forEach(workspace => {
|
|
130
|
+
workspace.entityStore.state.updateAll({ selected: false });
|
|
131
|
+
if (workspace.title.includes(record.added[0].meta.title)) {
|
|
132
|
+
this.workspaceState.setActiveWorkspaceById(workspace.id);
|
|
133
|
+
workspace.entityStore.state.updateMany(record.added, { selected: true });
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
loadFilterList() {
|
|
138
|
+
this.spatialFilterService
|
|
139
|
+
.loadFilterList(this.queryType)
|
|
140
|
+
.pipe(takeUntil(this.unsubscribe$))
|
|
141
|
+
.subscribe((features) => {
|
|
142
|
+
features.sort((a, b) => {
|
|
143
|
+
if (a.properties.nom < b.properties.nom) {
|
|
144
|
+
return -1;
|
|
145
|
+
}
|
|
146
|
+
if (a.properties.nom > b.properties.nom) {
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
return 0;
|
|
150
|
+
});
|
|
151
|
+
this.spatialListStore.clear();
|
|
152
|
+
this.spatialListStore.load(features);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
getOutputToggleSearch() {
|
|
156
|
+
this.loadThematics();
|
|
157
|
+
}
|
|
158
|
+
getOutputClearSearch() {
|
|
159
|
+
this.zone = undefined;
|
|
160
|
+
this.queryType = undefined;
|
|
161
|
+
}
|
|
162
|
+
clearMap() {
|
|
163
|
+
this.map.removeLayers(this.layers);
|
|
164
|
+
this.layers = [];
|
|
165
|
+
this.activeLayers = [];
|
|
166
|
+
this.thematicLength = 0;
|
|
167
|
+
this.iterator = 1;
|
|
168
|
+
if (this.type === SpatialFilterType.Predefined) {
|
|
169
|
+
this.zone = undefined;
|
|
170
|
+
this.queryType = undefined;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
loadThematics() {
|
|
174
|
+
this.loading = true;
|
|
175
|
+
let zeroResults = true;
|
|
176
|
+
let thematics;
|
|
177
|
+
if (this.buffer === 0 || this.type === SpatialFilterType.Point) {
|
|
178
|
+
this.tryAddFeaturesToMap([this.zone]);
|
|
179
|
+
}
|
|
180
|
+
if (this.itemType !== SpatialFilterItemType.Thematics) {
|
|
181
|
+
const theme = {
|
|
182
|
+
name: ''
|
|
183
|
+
};
|
|
184
|
+
thematics = [theme];
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
thematics = this.thematics;
|
|
188
|
+
}
|
|
189
|
+
if (this.measureUnit === MeasureLengthUnit.Kilometers && this.type !== SpatialFilterType.Point) {
|
|
190
|
+
this.buffer = this.buffer * 1000;
|
|
191
|
+
}
|
|
192
|
+
if (this.type === SpatialFilterType.Polygon) {
|
|
193
|
+
this.buffer = 0; // to avoid buffer enter a second time in terrAPI
|
|
194
|
+
}
|
|
195
|
+
const observables$ = [];
|
|
196
|
+
thematics.forEach(thematic => {
|
|
197
|
+
observables$.push(this.spatialFilterService
|
|
198
|
+
.loadFilterItem(this.zone, this.itemType, this.queryType, thematic, this.buffer)
|
|
199
|
+
.pipe(tap((features) => {
|
|
200
|
+
this.store.insertMany(features);
|
|
201
|
+
const featuresPoint = [];
|
|
202
|
+
const featuresLinePoly = [];
|
|
203
|
+
let idPoint;
|
|
204
|
+
let idLinePoly;
|
|
205
|
+
features.forEach(feature => {
|
|
206
|
+
if (feature.geometry.type === 'Point') {
|
|
207
|
+
feature.properties.longitude = feature.geometry.coordinates[0];
|
|
208
|
+
feature.properties.latitude = feature.geometry.coordinates[1];
|
|
209
|
+
featuresPoint.push(feature);
|
|
210
|
+
idPoint = feature.meta.id;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
featuresLinePoly.push(feature);
|
|
214
|
+
idLinePoly = feature.meta.id;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
this.tryAddPointToMap(featuresPoint, idPoint);
|
|
218
|
+
this.tryAddLayerToMap(featuresLinePoly, idLinePoly);
|
|
219
|
+
if (features.length) {
|
|
220
|
+
zeroResults = false;
|
|
221
|
+
this.thematicLength += 1;
|
|
222
|
+
thematic.zeroResults = false;
|
|
223
|
+
this.cdRef.detectChanges();
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
thematic.zeroResults = true;
|
|
227
|
+
}
|
|
228
|
+
if (features.length >= 10000) {
|
|
229
|
+
this.messageService.alert(this.languageService.translate.instant('igo.geo.spatialFilter.maxSizeAlert'), this.languageService.translate.instant('igo.geo.spatialFilter.warning'), { timeOut: 10000 });
|
|
230
|
+
}
|
|
231
|
+
})));
|
|
232
|
+
});
|
|
233
|
+
forkJoin(observables$).pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
|
|
234
|
+
this.loading = false;
|
|
235
|
+
if (zeroResults) {
|
|
236
|
+
this.messageService.alert(this.languageService.translate.instant('igo.geo.spatialFilter.zeroResults'), this.languageService.translate.instant('igo.geo.spatialFilter.warning'), { timeOut: 10000 });
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
onZoneChange(feature, buffer) {
|
|
241
|
+
this.zone = feature;
|
|
242
|
+
if (feature) {
|
|
243
|
+
buffer ? this.tryAddFeaturesToMap([feature], true) : this.tryAddFeaturesToMap([feature]);
|
|
244
|
+
this.zoomToFeatureExtent(feature);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Try to add zone feature to the map overlay
|
|
249
|
+
*/
|
|
250
|
+
tryAddFeaturesToMap(features, buffer) {
|
|
251
|
+
let i = 1;
|
|
252
|
+
for (const feature of features) {
|
|
253
|
+
if (this.type === SpatialFilterType.Predefined) {
|
|
254
|
+
for (const layer of this.layers) {
|
|
255
|
+
if (layer.options._internal &&
|
|
256
|
+
layer.options._internal.code === feature.properties.code &&
|
|
257
|
+
!buffer) {
|
|
258
|
+
if (!layer.title?.startsWith('Zone')) {
|
|
259
|
+
const index = this.layers.indexOf(layer);
|
|
260
|
+
this.layers.splice(index, 1);
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (layer.title?.startsWith('Zone')) {
|
|
265
|
+
this.activeLayers = [];
|
|
266
|
+
const index = this.layers.indexOf(layer);
|
|
267
|
+
this.layers.splice(index, 1);
|
|
268
|
+
this.map.removeLayer(layer);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
if (buffer) {
|
|
274
|
+
for (const layer of this.activeLayers) {
|
|
275
|
+
if (this.activeLayers.length === 1 && layer.title?.startsWith('Zone')) {
|
|
276
|
+
const index = this.layers.indexOf(layer);
|
|
277
|
+
this.layers.splice(index, 1);
|
|
278
|
+
this.map.removeLayer(layer);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
this.activeLayers = [];
|
|
283
|
+
}
|
|
284
|
+
for (const layer of this.layers) {
|
|
285
|
+
if (layer.title?.startsWith('Zone')) {
|
|
286
|
+
i++;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
this.defaultStyle = (_feature, resolution) => {
|
|
290
|
+
const coordinates = features[0].coordinates;
|
|
291
|
+
return new olstyle.Style({
|
|
292
|
+
image: new olstyle.Circle({
|
|
293
|
+
radius: coordinates
|
|
294
|
+
? this.buffer /
|
|
295
|
+
Math.cos((Math.PI / 180) * coordinates[1]) /
|
|
296
|
+
resolution
|
|
297
|
+
: undefined,
|
|
298
|
+
fill: new olstyle.Fill({
|
|
299
|
+
color: 'rgba(200, 200, 20, 0.2)'
|
|
300
|
+
}),
|
|
301
|
+
stroke: new olstyle.Stroke({
|
|
302
|
+
width: 1,
|
|
303
|
+
color: 'orange'
|
|
304
|
+
})
|
|
305
|
+
}),
|
|
306
|
+
stroke: new olstyle.Stroke({
|
|
307
|
+
width: 1,
|
|
308
|
+
color: 'orange'
|
|
309
|
+
}),
|
|
310
|
+
fill: new olstyle.Fill({
|
|
311
|
+
color: 'rgba(200, 200, 20, 0.2)'
|
|
312
|
+
})
|
|
313
|
+
});
|
|
314
|
+
};
|
|
315
|
+
this.dataSourceService
|
|
316
|
+
.createAsyncDataSource({
|
|
317
|
+
type: 'vector',
|
|
318
|
+
queryable: true
|
|
319
|
+
})
|
|
320
|
+
.pipe(take(1))
|
|
321
|
+
.subscribe((dataSource) => {
|
|
322
|
+
const olLayer = this.layerService.createLayer({
|
|
323
|
+
isIgoInternalLayer: true,
|
|
324
|
+
title: ('Zone ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
|
|
325
|
+
workspace: { enabled: true },
|
|
326
|
+
_internal: {
|
|
327
|
+
code: this.type === SpatialFilterType.Predefined
|
|
328
|
+
? feature.properties.code
|
|
329
|
+
: undefined
|
|
330
|
+
},
|
|
331
|
+
source: dataSource,
|
|
332
|
+
visible: true
|
|
333
|
+
});
|
|
334
|
+
const featuresOl = features.map(f => {
|
|
335
|
+
return featureToOl(f, this.map.projection);
|
|
336
|
+
});
|
|
337
|
+
if (this.type !== SpatialFilterType.Predefined) {
|
|
338
|
+
const type = this.type === SpatialFilterType.Point ? 'Cercle' : 'Polygone';
|
|
339
|
+
featuresOl[0].set('nom', 'Zone', true);
|
|
340
|
+
featuresOl[0].set('type', type, true);
|
|
341
|
+
}
|
|
342
|
+
const ol = dataSource.ol;
|
|
343
|
+
ol.addFeatures(featuresOl);
|
|
344
|
+
olLayer.ol.setStyle(this.defaultStyle);
|
|
345
|
+
this.map.addLayer(olLayer);
|
|
346
|
+
this.layers.push(olLayer);
|
|
347
|
+
this.activeLayers.push(olLayer);
|
|
348
|
+
this.cdRef.detectChanges();
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Try to add point features to the map
|
|
354
|
+
* Necessary to create clusters
|
|
355
|
+
*/
|
|
356
|
+
tryAddPointToMap(features, id) {
|
|
357
|
+
let i = 1;
|
|
358
|
+
if (features.length) {
|
|
359
|
+
if (this.map === undefined) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
for (const layer of this.layers) {
|
|
363
|
+
if (layer.title?.startsWith(features[0].meta.title)) {
|
|
364
|
+
i++;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
this.dataSourceService
|
|
368
|
+
.createAsyncDataSource({
|
|
369
|
+
type: 'cluster',
|
|
370
|
+
id,
|
|
371
|
+
queryable: true,
|
|
372
|
+
distance: 120,
|
|
373
|
+
meta: {
|
|
374
|
+
title: 'Cluster'
|
|
375
|
+
}
|
|
376
|
+
})
|
|
377
|
+
.pipe(take(1))
|
|
378
|
+
.subscribe((dataSource) => {
|
|
379
|
+
const icon = features[0].meta.icon;
|
|
380
|
+
let style;
|
|
381
|
+
if (!icon) {
|
|
382
|
+
style = createOverlayMarkerStyle();
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
style = this.createSvgIcon(icon) || createOverlayMarkerStyle();
|
|
386
|
+
}
|
|
387
|
+
const olLayer = this.layerService.createLayer({
|
|
388
|
+
isIgoInternalLayer: true,
|
|
389
|
+
title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
|
|
390
|
+
source: dataSource,
|
|
391
|
+
visible: true,
|
|
392
|
+
style
|
|
393
|
+
});
|
|
394
|
+
const featuresOl = features.map(feature => {
|
|
395
|
+
return featureToOl(feature, this.map.projection);
|
|
396
|
+
});
|
|
397
|
+
const ol = dataSource.ol;
|
|
398
|
+
ol.getSource().addFeatures(featuresOl);
|
|
399
|
+
if (this.layers.find(layer => layer.id === olLayer.id)) {
|
|
400
|
+
this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
|
|
401
|
+
i = i - 1;
|
|
402
|
+
olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
|
|
403
|
+
olLayer.options.title = olLayer.title;
|
|
404
|
+
}
|
|
405
|
+
this.iterator = i;
|
|
406
|
+
this.map.addLayer(olLayer);
|
|
407
|
+
this.layers.push(olLayer);
|
|
408
|
+
this.pushLayer(olLayer);
|
|
409
|
+
this.cdRef.detectChanges();
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
createSvgIcon(icon) {
|
|
414
|
+
let style;
|
|
415
|
+
this.matIconRegistry.getNamedSvgIcon(icon).subscribe(svgObj => {
|
|
416
|
+
const xmlSerializer = new XMLSerializer();
|
|
417
|
+
svgObj.setAttribute('width', '30');
|
|
418
|
+
svgObj.setAttribute('height', '30');
|
|
419
|
+
svgObj.setAttribute('fill', 'rgba(0, 128, 255)');
|
|
420
|
+
svgObj.setAttribute('stroke', 'white');
|
|
421
|
+
const svg = xmlSerializer.serializeToString(svgObj);
|
|
422
|
+
style = new olstyle.Style({
|
|
423
|
+
image: new olstyle.Icon({
|
|
424
|
+
src: 'data:image/svg+xml;utf8,' + svg
|
|
425
|
+
})
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
return style;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Try to add line or polygon features to the map
|
|
432
|
+
*/
|
|
433
|
+
tryAddLayerToMap(features, id) {
|
|
434
|
+
let i = 1;
|
|
435
|
+
if (features.length) {
|
|
436
|
+
if (this.map === undefined) {
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
for (const layer of this.layers) {
|
|
440
|
+
if (layer.title?.startsWith(features[0].meta.title)) {
|
|
441
|
+
i++;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
this.dataSourceService
|
|
445
|
+
.createAsyncDataSource({
|
|
446
|
+
type: 'vector',
|
|
447
|
+
id,
|
|
448
|
+
queryable: true
|
|
449
|
+
})
|
|
450
|
+
.pipe(take(1))
|
|
451
|
+
.subscribe((dataSource) => {
|
|
452
|
+
const olLayer = this.layerService.createLayer({
|
|
453
|
+
isIgoInternalLayer: true,
|
|
454
|
+
title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
|
|
455
|
+
source: dataSource,
|
|
456
|
+
visible: true
|
|
457
|
+
});
|
|
458
|
+
const featuresOl = features.map(feature => {
|
|
459
|
+
return featureToOl(feature, this.map.projection);
|
|
460
|
+
});
|
|
461
|
+
const ol = dataSource.ol;
|
|
462
|
+
ol.addFeatures(featuresOl);
|
|
463
|
+
if (this.layers.find(layer => layer.id === olLayer.id)) {
|
|
464
|
+
this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
|
|
465
|
+
i = i - 1;
|
|
466
|
+
olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
|
|
467
|
+
olLayer.options.title = olLayer.title;
|
|
468
|
+
}
|
|
469
|
+
this.map.addLayer(olLayer);
|
|
470
|
+
this.layers.push(olLayer);
|
|
471
|
+
this.pushLayer(olLayer);
|
|
472
|
+
this.cdRef.detectChanges();
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
zoomToFeatureExtent(feature) {
|
|
477
|
+
if (feature) {
|
|
478
|
+
const olFeature = this.format.readFeature(feature, {
|
|
479
|
+
dataProjection: feature.projection,
|
|
480
|
+
featureProjection: this.map.projection
|
|
481
|
+
});
|
|
482
|
+
moveToOlFeatures(this.map, [olFeature], FeatureMotion.Zoom);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
pushLayer(layer) {
|
|
486
|
+
for (const lay of this.activeLayers) {
|
|
487
|
+
if (lay.id === layer.id) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
this.activeLayers.push(layer);
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
SpatialFilterToolComponent.ɵfac = function SpatialFilterToolComponent_Factory(t) { return new (t || SpatialFilterToolComponent)(i0.ɵɵdirectiveInject(i1.MatIconRegistry), i0.ɵɵdirectiveInject(i2.SpatialFilterService), i0.ɵɵdirectiveInject(i2.DataSourceService), i0.ɵɵdirectiveInject(i2.LayerService), i0.ɵɵdirectiveInject(i3.MapState), i0.ɵɵdirectiveInject(i4.MessageService), i0.ɵɵdirectiveInject(i4.LanguageService), i0.ɵɵdirectiveInject(i5.ImportExportState), i0.ɵɵdirectiveInject(i6.ToolState), i0.ɵɵdirectiveInject(i7.WorkspaceState), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
495
|
+
SpatialFilterToolComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SpatialFilterToolComponent, selectors: [["igo-spatial-filter-tool"]], inputs: { type: "type", itemType: "itemType", freehandDrawIsActive: "freehandDrawIsActive" }, decls: 6, vars: 16, consts: [[3, "store", "selectedQueryType", "zone", "layers", "eventType", "eventQueryType", "zoneChange", "zoneWithBufferChange", "bufferChange", "measureUnitChange"], [3, "type", "queryType", "map", "zone", "loading", "store", "layers", "allLayers", "thematicLength", "radiusEvent", "bufferEvent", "measureUnitChange", "freehandControl", "drawZoneEvent", "zoneWithBufferChange", "itemTypeChange", "thematicChange", "toggleSearch", "clearButtonEvent", "clearSearchEvent", "export", "openWorkspace", "entityChange"], [4, "ngIf"], [3, "feature"]], template: function SpatialFilterToolComponent_Template(rf, ctx) { if (rf & 1) {
|
|
496
|
+
i0.ɵɵelementStart(0, "igo-panel")(1, "igo-spatial-filter-type", 0);
|
|
497
|
+
i0.ɵɵlistener("eventType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventType_1_listener($event) { return ctx.getOutputType($event); })("eventQueryType", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_eventQueryType_1_listener($event) { return ctx.getOutputQueryType($event); })("zoneChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneChange_1_listener($event) { return ctx.onZoneChange($event); })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_zoneWithBufferChange_1_listener($event) { return ctx.onZoneChange($event, true); })("bufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_bufferChange_1_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_type_measureUnitChange_1_listener($event) { return ctx.measureUnit = $event; });
|
|
498
|
+
i0.ɵɵelementEnd();
|
|
499
|
+
i0.ɵɵelementStart(2, "igo-spatial-filter-item", 1);
|
|
500
|
+
i0.ɵɵlistener("radiusEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_radiusEvent_2_listener($event) { return ctx.buffer = $event; })("bufferEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_bufferEvent_2_listener($event) { return ctx.buffer = $event; })("measureUnitChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_measureUnitChange_2_listener($event) { return ctx.measureUnit = $event; })("freehandControl", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_freehandControl_2_listener($event) { return ctx.freehandDrawIsActive = $event; })("drawZoneEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_drawZoneEvent_2_listener($event) { return ctx.zone = $event; })("zoneWithBufferChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_zoneWithBufferChange_2_listener($event) { return ctx.onZoneChange($event, true); })("itemTypeChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_itemTypeChange_2_listener($event) { return ctx.itemType = $event; })("thematicChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_thematicChange_2_listener($event) { return ctx.thematics = $event; })("toggleSearch", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_toggleSearch_2_listener() { return ctx.getOutputToggleSearch(); })("clearButtonEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearButtonEvent_2_listener() { return ctx.clearMap(); })("clearSearchEvent", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_clearSearchEvent_2_listener() { return ctx.getOutputClearSearch(); })("export", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_export_2_listener() { return ctx.activateExportTool(); })("openWorkspace", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_openWorkspace_2_listener() { return ctx.activateWorkspace(); })("entityChange", function SpatialFilterToolComponent_Template_igo_spatial_filter_item_entityChange_2_listener($event) { return ctx.activateWorkspace($event); });
|
|
501
|
+
i0.ɵɵelementEnd()();
|
|
502
|
+
i0.ɵɵelementStart(3, "igo-panel");
|
|
503
|
+
i0.ɵɵtemplate(4, SpatialFilterToolComponent_ng_container_4_Template, 2, 1, "ng-container", 2);
|
|
504
|
+
i0.ɵɵpipe(5, "async");
|
|
505
|
+
i0.ɵɵelementEnd();
|
|
506
|
+
} if (rf & 2) {
|
|
507
|
+
i0.ɵɵadvance(1);
|
|
508
|
+
i0.ɵɵproperty("store", ctx.spatialListStore)("selectedQueryType", ctx.queryType)("zone", ctx.zone)("layers", ctx.activeLayers);
|
|
509
|
+
i0.ɵɵadvance(1);
|
|
510
|
+
i0.ɵɵproperty("type", ctx.type)("queryType", ctx.queryType)("map", ctx.map)("zone", ctx.zone)("loading", ctx.loading)("store", ctx.store)("layers", ctx.activeLayers)("allLayers", ctx.layers)("thematicLength", ctx.thematicLength);
|
|
511
|
+
i0.ɵɵadvance(2);
|
|
512
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(5, 14, ctx.selectedFeature$));
|
|
513
|
+
} }, dependencies: [i2.SpatialFilterTypeComponent, i2.SpatialFilterItemComponent, i8.NgIf, i8.AsyncPipe], changeDetection: 0 });
|
|
514
|
+
SpatialFilterToolComponent = __decorate([
|
|
515
|
+
ToolComponent({
|
|
516
|
+
name: 'spatialFilter',
|
|
517
|
+
title: 'igo.integration.tools.spatialFilter',
|
|
518
|
+
icon: 'selection-marker'
|
|
519
|
+
})
|
|
520
|
+
/**
|
|
521
|
+
* Spatial Filter Type
|
|
522
|
+
*/
|
|
523
|
+
], SpatialFilterToolComponent);
|
|
524
|
+
export { SpatialFilterToolComponent };
|
|
525
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SpatialFilterToolComponent, [{
|
|
526
|
+
type: Component,
|
|
527
|
+
args: [{ selector: 'igo-spatial-filter-tool', changeDetection: ChangeDetectionStrategy.OnPush, template: "<igo-panel>\r\n <igo-spatial-filter-type\r\n [store]=\"spatialListStore\"\r\n [selectedQueryType]=\"queryType\"\r\n [zone]=\"zone\"\r\n [layers]=\"activeLayers\"\r\n (eventType)=\"getOutputType($event)\"\r\n (eventQueryType)=\"getOutputQueryType($event)\"\r\n (zoneChange)=\"onZoneChange($event)\"\r\n (zoneWithBufferChange)=\"onZoneChange($event, true)\"\r\n (bufferChange)=\"buffer = $event\"\r\n (measureUnitChange)=\"measureUnit = $event\">\r\n </igo-spatial-filter-type>\r\n\r\n <igo-spatial-filter-item\r\n [type]=\"type\"\r\n [queryType]=\"queryType\"\r\n [map]=\"map\"\r\n [zone]=\"zone\"\r\n [loading]=\"loading\"\r\n [store]=\"store\"\r\n [layers]=\"activeLayers\"\r\n [allLayers]=\"layers\"\r\n [thematicLength]=\"thematicLength\"\r\n (radiusEvent)=\"buffer = $event\"\r\n (bufferEvent)=\"buffer = $event\"\r\n (measureUnitChange)=\"measureUnit = $event\"\r\n (freehandControl)=\"freehandDrawIsActive = $event\"\r\n (drawZoneEvent)=\"zone = $event\"\r\n (zoneWithBufferChange)=\"onZoneChange($event, true)\"\r\n (itemTypeChange)=\"itemType = $event\"\r\n (thematicChange)=\"thematics = $event\"\r\n (toggleSearch)=\"getOutputToggleSearch()\"\r\n (clearButtonEvent)=\"clearMap()\"\r\n (clearSearchEvent)=\"getOutputClearSearch()\"\r\n (export)=\"activateExportTool()\"\r\n (openWorkspace)=\"activateWorkspace()\"\r\n (entityChange)=\"activateWorkspace($event)\">\r\n </igo-spatial-filter-item>\r\n</igo-panel>\r\n\r\n<igo-panel>\r\n <ng-container *ngIf=\"selectedFeature$ | async as feature\">\r\n <igo-feature-details [feature]=\"feature\"></igo-feature-details>\r\n </ng-container>\r\n</igo-panel>" }]
|
|
528
|
+
}], function () { return [{ type: i1.MatIconRegistry }, { type: i2.SpatialFilterService }, { type: i2.DataSourceService }, { type: i2.LayerService }, { type: i3.MapState }, { type: i4.MessageService }, { type: i4.LanguageService }, { type: i5.ImportExportState }, { type: i6.ToolState }, { type: i7.WorkspaceState }, { type: i0.ChangeDetectorRef }]; }, { type: [{
|
|
529
|
+
type: Input
|
|
530
|
+
}], itemType: [{
|
|
531
|
+
type: Input
|
|
532
|
+
}], freehandDrawIsActive: [{
|
|
533
|
+
type: Input
|
|
534
|
+
}] }); })();
|
|
535
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pbnRlZ3JhdGlvbi9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci10b29sL3NwYXRpYWwtZmlsdGVyLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXItdG9vbC9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUFjLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUtMLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsV0FBVyxFQUlYLGlCQUFpQixFQUNqQixxQkFBcUIsRUFLckIsd0JBQXdCLEVBRXhCLGlCQUFpQixFQUNsQixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNoRyxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7SUNPbEMsNkJBQTBEO0lBQ3hELHlDQUErRDtJQUNqRSwwQkFBZTs7O0lBRFEsZUFBbUI7SUFBbkIsb0NBQW1C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QkFBQSw0QkFBQSx5QkFBQSxzQ0FBQTtRQTJCQSxlQUErQjtRQUEvQixrRUFBK0I7O0FEZ0JuQywwQkFBMEI7SUFkdEMsYUFBYSxDQUFDO1FBQ2IsSUFBSSxFQUFFLGVBQWU7UUFDckIsS0FBSyxFQUFFLHFDQUFxQztRQUM1QyxJQUFJLEVBQUUsa0JBQWtCO0tBQ3pCLENBQUM7SUFDRjs7T0FFRztHQU9VLDBCQUEwQixDQW1pQnRDO1NBbmlCWSwwQkFBMEI7dUZBQTFCLDBCQUEwQjtjQU50QyxTQUFTOzJCQUNFLHlCQUF5QixtQkFHbEIsdUJBQXVCLENBQUMsTUFBTTt1V0FPdEMsSUFBSTtrQkFBWixLQUFLO1lBQ0csUUFBUTtrQkFBaEIsS0FBSztZQUNHLG9CQUFvQjtrQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0SWNvblJlZ2lzdHJ5IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBJZ29NYXAsXHJcbiAgRGF0YVNvdXJjZVNlcnZpY2UsXHJcbiAgTGF5ZXJTZXJ2aWNlLFxyXG4gIEZlYXR1cmUsXHJcbiAgbW92ZVRvT2xGZWF0dXJlcyxcclxuICBGZWF0dXJlTW90aW9uLFxyXG4gIENsdXN0ZXJEYXRhU291cmNlLFxyXG4gIGZlYXR1cmVUb09sLFxyXG4gIERhdGFTb3VyY2UsXHJcbiAgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMsXHJcbiAgU3BhdGlhbEZpbHRlclNlcnZpY2UsXHJcbiAgU3BhdGlhbEZpbHRlclR5cGUsXHJcbiAgU3BhdGlhbEZpbHRlckl0ZW1UeXBlLFxyXG4gIFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGUsXHJcbiAgU3BhdGlhbEZpbHRlclRoZW1hdGljLFxyXG4gIExheWVyLFxyXG4gIFZlY3RvckxheWVyLFxyXG4gIGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSxcclxuICBFeHBvcnRPcHRpb25zLFxyXG4gIE1lYXN1cmVMZW5ndGhVbml0XHJcbn0gZnJvbSAnQGlnbzIvZ2VvJztcclxuaW1wb3J0IHsgRW50aXR5U3RvcmUsIFRvb2xDb21wb25lbnQgfSBmcm9tICdAaWdvMi9jb21tb24nO1xyXG5pbXBvcnQgb2xGb3JtYXRHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcclxuaW1wb3J0IG9sU291cmNlVmVjdG9yIGZyb20gJ29sL3NvdXJjZS9WZWN0b3InO1xyXG5pbXBvcnQgb2xTb3VyY2VDbHVzdGVyIGZyb20gJ29sL3NvdXJjZS9DbHVzdGVyJztcclxuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hcFN0YXRlIH0gZnJvbSAnLi4vLi4vbWFwL21hcC5zdGF0ZSc7XHJcbmltcG9ydCB7IEltcG9ydEV4cG9ydE1vZGUsIEltcG9ydEV4cG9ydFN0YXRlIH0gZnJvbSAnLi8uLi8uLi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQuc3RhdGUnO1xyXG5pbXBvcnQgKiBhcyBvbHN0eWxlIGZyb20gJ29sL3N0eWxlJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UsIExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5pbXBvcnQgeyBUb29sU3RhdGUgfSBmcm9tICcuLi8uLi90b29sL3Rvb2wuc3RhdGUnO1xyXG5pbXBvcnQgeyBXb3Jrc3BhY2VTdGF0ZSB9IGZyb20gJy4uLy4uL3dvcmtzcGFjZS93b3Jrc3BhY2Uuc3RhdGUnO1xyXG5pbXBvcnQgeyBFdmVudHNLZXkgfSBmcm9tICdvbC9ldmVudHMnO1xyXG5cclxuLyoqXHJcbiAqIFRvb2wgdG8gYXBwbHkgc3BhdGlhbCBmaWx0ZXJcclxuICovXHJcbkBUb29sQ29tcG9uZW50KHtcclxuICBuYW1lOiAnc3BhdGlhbEZpbHRlcicsXHJcbiAgdGl0bGU6ICdpZ28uaW50ZWdyYXRpb24udG9vbHMuc3BhdGlhbEZpbHRlcicsXHJcbiAgaWNvbjogJ3NlbGVjdGlvbi1tYXJrZXInXHJcbn0pXHJcbi8qKlxyXG4gKiBTcGF0aWFsIEZpbHRlciBUeXBlXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lnby1zcGF0aWFsLWZpbHRlci10b29sJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTcGF0aWFsRmlsdGVyVG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBnZXQgbWFwKCk6IElnb01hcCB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXBTdGF0ZS5tYXA7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSB0eXBlOiBTcGF0aWFsRmlsdGVyVHlwZTtcclxuICBASW5wdXQoKSBpdGVtVHlwZTogU3BhdGlhbEZpbHRlckl0ZW1UeXBlID0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLkFkZHJlc3M7XHJcbiAgQElucHV0KCkgZnJlZWhhbmREcmF3SXNBY3RpdmU6IGJvb2xlYW47XHJcblxyXG4gIHB1YmxpYyBsYXllcnM6IExheWVyW10gPSBbXTtcclxuICBwdWJsaWMgYWN0aXZlTGF5ZXJzOiBMYXllcltdID0gW107XHJcblxyXG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGU7XHJcbiAgcHVibGljIHRoZW1hdGljczogU3BhdGlhbEZpbHRlclRoZW1hdGljW107XHJcbiAgcHVibGljIHpvbmU6IEZlYXR1cmU7XHJcbiAgcHVibGljIHpvbmVXaXRoQnVmZmVyOiBGZWF0dXJlO1xyXG4gIHB1YmxpYyBidWZmZXIgPSAwO1xyXG5cclxuICBwdWJsaWMgaXRlcmF0b3IgPSAxO1xyXG5cclxuICBwdWJsaWMgc2VsZWN0ZWRGZWF0dXJlJDogQmVoYXZpb3JTdWJqZWN0PEZlYXR1cmU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChcclxuICAgIHVuZGVmaW5lZFxyXG4gICk7XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0ID0gbmV3IG9sRm9ybWF0R2VvSlNPTigpO1xyXG5cclxuICBwdWJsaWMgc3RvcmU6IEVudGl0eVN0b3JlPEZlYXR1cmU+ID0gbmV3IEVudGl0eVN0b3JlPEZlYXR1cmU+KFtdKTsgLy8gU3RvcmUgdG8gcHJpbnQgcmVzdWx0cyBhdCB0aGUgZW5kXHJcblxyXG4gIHB1YmxpYyBzcGF0aWFsTGlzdFN0b3JlOiBFbnRpdHlTdG9yZTxGZWF0dXJlPiA9IG5ldyBFbnRpdHlTdG9yZTxGZWF0dXJlPihbXSk7XHJcblxyXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyB0aGVtYXRpY0xlbmd0aCA9IDA7XHJcblxyXG4gIHB1YmxpYyBtZWFzdXJlVW5pdDogTWVhc3VyZUxlbmd0aFVuaXQgPSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnM7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIG1vdmVlbmRLZXk6IEV2ZW50c0tleTtcclxuXHJcbiAgcHVibGljIGRlZmF1bHRTdHlsZTogb2xzdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xzdHlsZS5TdHlsZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBtYXRJY29uUmVnaXN0cnk6IE1hdEljb25SZWdpc3RyeSxcclxuICAgIHByaXZhdGUgc3BhdGlhbEZpbHRlclNlcnZpY2U6IFNwYXRpYWxGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkYXRhU291cmNlU2VydmljZTogRGF0YVNvdXJjZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYXBTdGF0ZTogTWFwU3RhdGUsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGltcG9ydEV4cG9ydFN0YXRlOiBJbXBvcnRFeHBvcnRTdGF0ZSxcclxuICAgIHByaXZhdGUgdG9vbFN0YXRlOiBUb29sU3RhdGUsXHJcbiAgICBwcml2YXRlIHdvcmtzcGFjZVN0YXRlOiBXb3Jrc3BhY2VTdGF0ZSxcclxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5tYXAubGF5ZXJzKSB7XHJcbiAgICAgIGlmIChsYXllci50aXRsZSAmJiBsYXllci50aXRsZS5pbmNsdWRlcyh0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInKSkpIHtcclxuICAgICAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3V0cHV0VHlwZShldmVudDogU3BhdGlhbEZpbHRlclR5cGUpIHtcclxuICAgIHRoaXMudHlwZSA9IGV2ZW50O1xyXG4gICAgdGhpcy5xdWVyeVR5cGUgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRPdXRwdXRRdWVyeVR5cGUoZXZlbnQ6IFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGUpIHtcclxuICAgIHRoaXMucXVlcnlUeXBlID0gZXZlbnQ7XHJcbiAgICBpZiAodGhpcy5xdWVyeVR5cGUpIHtcclxuICAgICAgdGhpcy5sb2FkRmlsdGVyTGlzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWN0aXZhdGVFeHBvcnRUb29sKCkge1xyXG4gICAgY29uc3QgaWRzID0gW107XHJcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15ab25lIFxcXFxkKycpO1xyXG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xyXG4gICAgICBpZiAoIWxheWVyLnRpdGxlLm1hdGNoKHJlKSkge1xyXG4gICAgICAgIGlkcy5wdXNoKGxheWVyLmlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5pbXBvcnRFeHBvcnRTdGF0ZS5zZXRNb2RlKEltcG9ydEV4cG9ydE1vZGUuZXhwb3J0KTtcclxuICAgIHRoaXMuaW1wb3J0RXhwb3J0U3RhdGUuc2V0c0V4cG9ydE9wdGlvbnMoeyBsYXllcnM6IGlkcyB9IGFzIEV4cG9ydE9wdGlvbnMpO1xyXG4gICAgdGhpcy50b29sU3RhdGUudG9vbGJveC5hY3RpdmF0ZVRvb2woJ2ltcG9ydEV4cG9ydCcpO1xyXG4gIH1cclxuXHJcbiAgYWN0aXZhdGVXb3Jrc3BhY2UocmVjb3JkPykge1xyXG4gICAgbGV0IGxheWVyVG9PcGVuV2tzO1xyXG4gICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5lbnRpdGllcyQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAoIXJlY29yZCAmJiB0aGlzLmFjdGl2ZUxheWVycy5sZW5ndGggJiYgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5hbGwoKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbVR5cGUgPT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5UaGVtYXRpY3MpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB0aGVtYXRpYyBvZiB0aGlzLnRoZW1hdGljcykge1xyXG4gICAgICAgICAgICAgIGlmICghdGhlbWF0aWMuemVyb1Jlc3VsdHMpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyVG9PcGVuV2tzID0gdGhpcy5hY3RpdmVMYXllcnMuZmluZChsYXllciA9PiBsYXllci50aXRsZS5pbmNsdWRlcyh0aGVtYXRpYy5uYW1lICsgJyAnICsgdGhpcy5pdGVyYXRvci50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAnQWRyZXNzZXMgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVMYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcclxuICAgICAgICAgICAgICBpZiAobGF5ZXIudGl0bGUuaW5jbHVkZXModGl0bGUpKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllclRvT3BlbldrcyA9IGxheWVyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGF5ZXJUb09wZW5Xa3MpIHtcclxuICAgICAgICAgIHRoaXMud29ya3NwYWNlU3RhdGUud29ya3NwYWNlUGFuZWxFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnNldEFjdGl2ZVdvcmtzcGFjZUJ5SWQobGF5ZXJUb09wZW5Xa3MuaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChyZWNvcmQgJiYgdGhpcy5hY3RpdmVMYXllcnMubGVuZ3RoICYmIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuYWxsKCkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0V29ya3NwYWNlRW50aXR5KHJlY29yZCk7XHJcbiAgICAgICAgdGhpcy5tb3ZlZW5kS2V5ID0gdGhpcy5tYXAub2wub24oJ21vdmVlbmQnLCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdFdvcmtzcGFjZUVudGl0eShyZWNvcmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0V29ya3NwYWNlRW50aXR5KHJlY29yZCkge1xyXG4gICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5hbGwoKS5mb3JFYWNoKHdvcmtzcGFjZSA9PiB7XHJcbiAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5zdGF0ZS51cGRhdGVBbGwoe3NlbGVjdGVkOiBmYWxzZX0pO1xyXG4gICAgICBpZiAod29ya3NwYWNlLnRpdGxlLmluY2x1ZGVzKHJlY29yZC5hZGRlZFswXS5tZXRhLnRpdGxlKSkge1xyXG4gICAgICAgIHRoaXMud29ya3NwYWNlU3RhdGUuc2V0QWN0aXZlV29ya3NwYWNlQnlJZCh3b3Jrc3BhY2UuaWQpO1xyXG4gICAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5zdGF0ZS51cGRhdGVNYW55KHJlY29yZC5hZGRlZCwge3NlbGVjdGVkOiB0cnVlfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkRmlsdGVyTGlzdCgpIHtcclxuICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcclxuICAgICAgLmxvYWRGaWx0ZXJMaXN0KHRoaXMucXVlcnlUeXBlKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB7XHJcbiAgICAgICAgZmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgaWYgKGEucHJvcGVydGllcy5ub20gPCBiLnByb3BlcnRpZXMubm9tKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhLnByb3BlcnRpZXMubm9tID4gYi5wcm9wZXJ0aWVzLm5vbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc3BhdGlhbExpc3RTdG9yZS5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuc3BhdGlhbExpc3RTdG9yZS5sb2FkKGZlYXR1cmVzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRPdXRwdXRUb2dnbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLmxvYWRUaGVtYXRpY3MoKTtcclxuICB9XHJcblxyXG4gIGdldE91dHB1dENsZWFyU2VhcmNoKCkge1xyXG4gICAgdGhpcy56b25lID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5xdWVyeVR5cGUgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBjbGVhck1hcCgpIHtcclxuICAgIHRoaXMubWFwLnJlbW92ZUxheWVycyh0aGlzLmxheWVycyk7XHJcbiAgICB0aGlzLmxheWVycyA9IFtdO1xyXG4gICAgdGhpcy5hY3RpdmVMYXllcnMgPSBbXTtcclxuICAgIHRoaXMudGhlbWF0aWNMZW5ndGggPSAwO1xyXG4gICAgdGhpcy5pdGVyYXRvciA9IDE7XHJcbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuem9uZSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5xdWVyeVR5cGUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRUaGVtYXRpY3MoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IHplcm9SZXN1bHRzID0gdHJ1ZTtcclxuICAgIGxldCB0aGVtYXRpY3M7XHJcbiAgICBpZiAodGhpcy5idWZmZXIgPT09IDAgfHwgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCkge1xyXG4gICAgICB0aGlzLnRyeUFkZEZlYXR1cmVzVG9NYXAoW3RoaXMuem9uZV0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXRlbVR5cGUgIT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5UaGVtYXRpY3MpIHtcclxuICAgICAgY29uc3QgdGhlbWU6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYyA9IHtcclxuICAgICAgICBuYW1lOiAnJ1xyXG4gICAgICB9O1xyXG4gICAgICB0aGVtYXRpY3MgPSBbdGhlbWVdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhlbWF0aWNzID0gdGhpcy50aGVtYXRpY3M7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuS2lsb21ldGVycyAmJiB0aGlzLnR5cGUgIT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50KSB7XHJcbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIgKiAxMDAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9seWdvbikge1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IDA7IC8vIHRvIGF2b2lkIGJ1ZmZlciBlbnRlciBhIHNlY29uZCB0aW1lIGluIHRlcnJBUElcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvYnNlcnZhYmxlcyQ6IE9ic2VydmFibGU8RmVhdHVyZVtdPltdID0gW107XHJcbiAgICB0aGVtYXRpY3MuZm9yRWFjaCh0aGVtYXRpYyA9PiB7XHJcbiAgICAgIG9ic2VydmFibGVzJC5wdXNoKFxyXG4gICAgICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcclxuICAgICAgICAgIC5sb2FkRmlsdGVySXRlbShcclxuICAgICAgICAgICAgdGhpcy56b25lLFxyXG4gICAgICAgICAgICB0aGlzLml0ZW1UeXBlLFxyXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5VHlwZSxcclxuICAgICAgICAgICAgdGhlbWF0aWMsXHJcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgdGFwKChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZS5pbnNlcnRNYW55KGZlYXR1cmVzKTtcclxuICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlc1BvaW50OiBGZWF0dXJlW10gPSBbXTtcclxuICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlc0xpbmVQb2x5OiBGZWF0dXJlW10gPSBbXTtcclxuICAgICAgICAgICAgICBsZXQgaWRQb2ludDtcclxuICAgICAgICAgICAgICBsZXQgaWRMaW5lUG9seTtcclxuICAgICAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xyXG4gICAgICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMubG9uZ2l0dWRlID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1swXTtcclxuICAgICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLmxhdGl0dWRlID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXTtcclxuICAgICAgICAgICAgICAgICAgZmVhdHVyZXNQb2ludC5wdXNoKGZlYXR1cmUpO1xyXG4gICAgICAgICAgICAgICAgICBpZFBvaW50ID0gZmVhdHVyZS5tZXRhLmlkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZmVhdHVyZXNMaW5lUG9seS5wdXNoKGZlYXR1cmUpO1xyXG4gICAgICAgICAgICAgICAgICBpZExpbmVQb2x5ID0gZmVhdHVyZS5tZXRhLmlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnRyeUFkZFBvaW50VG9NYXAoZmVhdHVyZXNQb2ludCwgaWRQb2ludCk7XHJcbiAgICAgICAgICAgICAgdGhpcy50cnlBZGRMYXllclRvTWFwKGZlYXR1cmVzTGluZVBvbHksIGlkTGluZVBvbHkpO1xyXG4gICAgICAgICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHplcm9SZXN1bHRzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRoZW1hdGljTGVuZ3RoICs9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGVtYXRpYy56ZXJvUmVzdWx0cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoZW1hdGljLnplcm9SZXN1bHRzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGggPj0gMTAwMDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIubWF4U2l6ZUFsZXJ0J1xyXG4gICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXHJcbiAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgIHsgdGltZU91dDogMTAwMDAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3JrSm9pbihvYnNlcnZhYmxlcyQpLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmICh6ZXJvUmVzdWx0cykge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXHJcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci56ZXJvUmVzdWx0cydcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci53YXJuaW5nJ1xyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHsgdGltZU91dDogMTAwMDAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25ab25lQ2hhbmdlKGZlYXR1cmU6IEZlYXR1cmUsIGJ1ZmZlcj86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuem9uZSA9IGZlYXR1cmU7XHJcbiAgICBpZiAoZmVhdHVyZSkge1xyXG4gICAgICBidWZmZXIgPyB0aGlzLnRyeUFkZEZlYXR1cmVzVG9NYXAoW2ZlYXR1cmVdLCB0cnVlKSA6IHRoaXMudHJ5QWRkRmVhdHVyZXNUb01hcChbZmVhdHVyZV0pO1xyXG4gICAgICB0aGlzLnpvb21Ub0ZlYXR1cmVFeHRlbnQoZmVhdHVyZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcnkgdG8gYWRkIHpvbmUgZmVhdHVyZSB0byB0aGUgbWFwIG92ZXJsYXlcclxuICAgKi9cclxuICBwdWJsaWMgdHJ5QWRkRmVhdHVyZXNUb01hcChmZWF0dXJlczogRmVhdHVyZVtdLCBidWZmZXI/OiBib29sZWFuKSB7XHJcbiAgICBsZXQgaSA9IDE7XHJcbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcclxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgbGF5ZXIub3B0aW9ucy5faW50ZXJuYWwgJiZcclxuICAgICAgICAgICAgbGF5ZXIub3B0aW9ucy5faW50ZXJuYWwuY29kZSA9PT0gZmVhdHVyZS5wcm9wZXJ0aWVzLmNvZGUgJiZcclxuICAgICAgICAgICAgIWJ1ZmZlclxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmICghbGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoJ1pvbmUnKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sYXllcnMuaW5kZXhPZihsYXllcik7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoJ1pvbmUnKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmluZGV4T2YobGF5ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmxheWVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihsYXllcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChidWZmZXIpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5hY3RpdmVMYXllcnMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlTGF5ZXJzLmxlbmd0aCA9PT0gMSAmJiBsYXllci50aXRsZT8uc3RhcnRzV2l0aCgnWm9uZScpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcclxuICAgICAgICAgICAgICB0aGlzLmxheWVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKGxheWVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcclxuICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoJ1pvbmUnKSkge1xyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRlZmF1bHRTdHlsZSA9IChfZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gKGZlYXR1cmVzWzBdIGFzIGFueSkuY29vcmRpbmF0ZXM7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBvbHN0eWxlLlN0eWxlKHtcclxuICAgICAgICAgIGltYWdlOiBuZXcgb2xzdHlsZS5DaXJjbGUoe1xyXG4gICAgICAgICAgICByYWRpdXM6IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgICAgPyB0aGlzLmJ1ZmZlciAvXHJcbiAgICAgICAgICAgICAgICBNYXRoLmNvcygoTWF0aC5QSSAvIDE4MCkgKiBjb29yZGluYXRlc1sxXSkgL1xyXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvblxyXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBmaWxsOiBuZXcgb2xzdHlsZS5GaWxsKHtcclxuICAgICAgICAgICAgICBjb2xvcjogJ3JnYmEoMjAwLCAyMDAsIDIwLCAwLjIpJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgc3Ryb2tlOiBuZXcgb2xzdHlsZS5TdHJva2Uoe1xyXG4gICAgICAgICAgICAgIHdpZHRoOiAxLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiAnb3JhbmdlJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7XHJcbiAgICAgICAgICAgIHdpZHRoOiAxLFxyXG4gICAgICAgICAgICBjb2xvcjogJ29yYW5nZSdcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmlsbDogbmV3IG9sc3R5bGUuRmlsbCh7XHJcbiAgICAgICAgICAgIGNvbG9yOiAncmdiYSgyMDAsIDIwMCwgMjAsIDAuMiknXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2VTZXJ2aWNlXHJcbiAgICAgICAgLmNyZWF0ZUFzeW5jRGF0YVNvdXJjZSh7XHJcbiAgICAgICAgICB0eXBlOiAndmVjdG9yJyxcclxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZVxyXG4gICAgICAgIH0gYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMpXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhU291cmNlOiBEYXRhU291cmNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBvbExheWVyID0gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXIoe1xyXG4gICAgICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiAoJ1pvbmUgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcclxuICAgICAgICAgICAgKSkgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHsgZW5hYmxlZDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICBfaW50ZXJuYWw6IHtcclxuICAgICAgICAgICAgICBjb2RlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgID8gZmVhdHVyZS5wcm9wZXJ0aWVzLmNvZGVcclxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhU291cmNlLFxyXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgICAgICB9KSBhcyBWZWN0b3JMYXllcjtcclxuICAgICAgICAgIGNvbnN0IGZlYXR1cmVzT2wgPSBmZWF0dXJlcy5tYXAoZiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVG9PbChmLCB0aGlzLm1hcC5wcm9qZWN0aW9uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCA/ICdDZXJjbGUnIDogJ1BvbHlnb25lJztcclxuICAgICAgICAgICAgZmVhdHVyZXNPbFswXS5zZXQoJ25vbScsICdab25lJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGZlYXR1cmVzT2xbMF0uc2V0KCd0eXBlJywgdHlwZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBvbCA9IGRhdGFTb3VyY2Uub2wgYXMgb2xTb3VyY2VWZWN0b3I8T2xHZW9tZXRyeT4gfCBvbFNvdXJjZUNsdXN0ZXI7XHJcbiAgICAgICAgICBvbC5hZGRGZWF0dXJlcyhmZWF0dXJlc09sKTtcclxuICAgICAgICAgIG9sTGF5ZXIub2wuc2V0U3R5bGUodGhpcy5kZWZhdWx0U3R5bGUpO1xyXG4gICAgICAgICAgdGhpcy5tYXAuYWRkTGF5ZXIob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLmxheWVycy5wdXNoKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVMYXllcnMucHVzaChvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJ5IHRvIGFkZCBwb2ludCBmZWF0dXJlcyB0byB0aGUgbWFwXHJcbiAgICogTmVjZXNzYXJ5IHRvIGNyZWF0ZSBjbHVzdGVyc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5QWRkUG9pbnRUb01hcChmZWF0dXJlczogRmVhdHVyZVtdLCBpZCkge1xyXG4gICAgbGV0IGkgPSAxO1xyXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5tYXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XHJcbiAgICAgICAgaWYgKGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUpKSB7XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVNlcnZpY2VcclxuICAgICAgICAuY3JlYXRlQXN5bmNEYXRhU291cmNlKHtcclxuICAgICAgICAgIHR5cGU6ICdjbHVzdGVyJyxcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgcXVlcnlhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgZGlzdGFuY2U6IDEyMCxcclxuICAgICAgICAgIG1ldGE6IHtcclxuICAgICAgICAgICAgdGl0bGU6ICdDbHVzdGVyJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMpXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhU291cmNlOiBDbHVzdGVyRGF0YVNvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaWNvbiA9IGZlYXR1cmVzWzBdLm1ldGEuaWNvbjtcclxuICAgICAgICAgIGxldCBzdHlsZTogb2xzdHlsZS5TdHlsZTtcclxuICAgICAgICAgIGlmICghaWNvbikge1xyXG4gICAgICAgICAgICBzdHlsZSA9IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3R5bGUgPSB0aGlzLmNyZWF0ZVN2Z0ljb24oaWNvbikgfHwgY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3Qgb2xMYXllciA9IHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyKHtcclxuICAgICAgICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxyXG4gICAgICAgICAgICB0aXRsZTogKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUgKyAnICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXHJcbiAgICAgICAgICAgICkpIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhU291cmNlLFxyXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBzdHlsZVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgZmVhdHVyZXNPbCA9IGZlYXR1cmVzLm1hcChmZWF0dXJlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVUb09sKGZlYXR1cmUsIHRoaXMubWFwLnByb2plY3Rpb24pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBvbCA9IGRhdGFTb3VyY2Uub2wgYXMgb2xTb3VyY2VDbHVzdGVyO1xyXG4gICAgICAgICAgb2wuZ2V0U291cmNlKCkuYWRkRmVhdHVyZXMoZmVhdHVyZXNPbCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gb2xMYXllci5pZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIoXHJcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gb2xMYXllci5pZClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaSA9IGkgLSAxO1xyXG4gICAgICAgICAgICBvbExheWVyLnRpdGxlID0gKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUgKyAnICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXHJcbiAgICAgICAgICAgICkpIGFzIHN0cmluZztcclxuICAgICAgICAgICAgb2xMYXllci5vcHRpb25zLnRpdGxlID0gb2xMYXllci50aXRsZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpO1xyXG4gICAgICAgICAgdGhpcy5tYXAuYWRkTGF5ZXIob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLmxheWVycy5wdXNoKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5wdXNoTGF5ZXIob2xMYXllcik7XHJcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU3ZnSWNvbihpY29uKTogb2xzdHlsZS5TdHlsZSB7XHJcbiAgICBsZXQgc3R5bGU6IG9sc3R5bGUuU3R5bGU7XHJcbiAgICB0aGlzLm1hdEljb25SZWdpc3RyeS5nZXROYW1lZFN2Z0ljb24oaWNvbikuc3Vic2NyaWJlKHN2Z09iaiA9PiB7XHJcbiAgICAgIGNvbnN0IHhtbFNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpO1xyXG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCd3aWR0aCcsICczMCcpO1xyXG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMzAnKTtcclxuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdyZ2JhKDAsIDEyOCwgMjU1KScpO1xyXG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnd2hpdGUnKTtcclxuICAgICAgY29uc3Qgc3ZnID0geG1sU2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhzdmdPYmopO1xyXG4gICAgICBzdHlsZSA9IG5ldyBvbHN0eWxlLlN0eWxlKHtcclxuICAgICAgICBpbWFnZTogbmV3IG9sc3R5bGUuSWNvbih7XHJcbiAgICAgICAgICBzcmM6ICdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwnICsgc3ZnXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzdHlsZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVHJ5IHRvIGFkZCBsaW5lIG9yIHBvbHlnb24gZmVhdHVyZXMgdG8gdGhlIG1hcFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5QWRkTGF5ZXJUb01hcChmZWF0dXJlczogRmVhdHVyZVtdLCBpZCkge1xyXG4gICAgbGV0IGkgPSAxO1xyXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5tYXAgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XHJcbiAgICAgICAgaWYgKGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUpKSB7XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVNlcnZpY2VcclxuICAgICAgICAuY3JlYXRlQXN5bmNEYXRhU291cmNlKHtcclxuICAgICAgICAgIHR5cGU6ICd2ZWN0b3InLFxyXG4gICAgICAgICAgaWQsXHJcbiAgICAgICAgICBxdWVyeWFibGU6IHRydWVcclxuICAgICAgICB9IGFzIFF1ZXJ5YWJsZURhdGFTb3VyY2VPcHRpb25zKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb2xMYXllciA9IHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyKHtcclxuICAgICAgICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxyXG4gICAgICAgICAgICB0aXRsZTogKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUgKyAnICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXHJcbiAgICAgICAgICAgICkpIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhU291cmNlLFxyXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IGZlYXR1cmVzT2wgPSBmZWF0dXJlcy5tYXAoZmVhdHVyZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVG9PbChmZWF0dXJlLCB0aGlzLm1hcC5wcm9qZWN0aW9uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3Qgb2wgPSBkYXRhU291cmNlLm9sIGFzIG9sU291cmNlVmVjdG9yPE9sR2VvbWV0cnk+O1xyXG4gICAgICAgICAgb2wuYWRkRmVhdHVyZXMoZmVhdHVyZXNPbCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gb2xMYXllci5pZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIoXHJcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gb2xMYXllci5pZClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaSA9IGkgLSAxO1xyXG4gICAgICAgICAgICBvbExheWVyLnRpdGxlID0gKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUgKyAnICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXHJcbiAgICAgICAgICAgICkpIGFzIHN0cmluZztcclxuICAgICAgICAgICAgb2xMYXllci5vcHRpb25zLnRpdGxlID0gb2xMYXllci50aXRsZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubWFwLmFkZExheWVyKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvbExheWVyKTtcclxuICAgICAgICAgIHRoaXMucHVzaExheWVyKG9sTGF5ZXIpO1xyXG4gICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB6b29tVG9GZWF0dXJlRXh0ZW50KGZlYXR1cmUpIHtcclxuICAgIGlmIChmZWF0dXJlKSB7XHJcbiAgICAgIGNvbnN0IG9sRmVhdHVyZSA9IHRoaXMuZm9ybWF0LnJlYWRGZWF0dXJlKGZlYXR1cmUsIHtcclxuICAgICAgICBkYXRhUHJvamVjdGlvbjogZmVhdHVyZS5wcm9qZWN0aW9uLFxyXG4gICAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiB0aGlzLm1hcC5wcm9qZWN0aW9uXHJcbiAgICAgIH0pO1xyXG4gICAgICBtb3ZlVG9PbEZlYXR1cmVzKHRoaXMubWFwLCBbb2xGZWF0dXJlXSwgRmVhdHVyZU1vdGlvbi5ab29tKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1c2hMYXllcihsYXllcikge1xyXG4gICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5hY3RpdmVMYXllcnMpIHtcclxuICAgICAgaWYgKGxheS5pZCA9PT0gbGF5ZXIuaWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdGl2ZUxheWVycy5wdXNoKGxheWVyKTtcclxuICB9XHJcbn1cclxuIiwiPGlnby1wYW5lbD5cclxuICA8aWdvLXNwYXRpYWwtZmlsdGVyLXR5cGVcclxuICAgIFtzdG9yZV09XCJzcGF0aWFsTGlzdFN0b3JlXCJcclxuICAgIFtzZWxlY3RlZFF1ZXJ5VHlwZV09XCJxdWVyeVR5cGVcIlxyXG4gICAgW3pvbmVdPVwiem9uZVwiXHJcbiAgICBbbGF5ZXJzXT1cImFjdGl2ZUxheWVyc1wiXHJcbiAgICAoZXZlbnRUeXBlKT1cImdldE91dHB1dFR5cGUoJGV2ZW50KVwiXHJcbiAgICAoZXZlbnRRdWVyeVR5cGUpPVwiZ2V0T3V0cHV0UXVlcnlUeXBlKCRldmVudClcIlxyXG4gICAgKHpvbmVDaGFuZ2UpPVwib25ab25lQ2hhbmdlKCRldmVudClcIlxyXG4gICAgKHpvbmVXaXRoQnVmZmVyQ2hhbmdlKT1cIm9uWm9uZUNoYW5nZSgkZXZlbnQsIHRydWUpXCJcclxuICAgIChidWZmZXJDaGFuZ2UpPVwiYnVmZmVyID0gJGV2ZW50XCJcclxuICAgIChtZWFzdXJlVW5pdENoYW5nZSk9XCJtZWFzdXJlVW5pdCA9ICRldmVudFwiPlxyXG4gIDwvaWdvLXNwYXRpYWwtZmlsdGVyLXR5cGU+XHJcblxyXG4gIDxpZ28tc3BhdGlhbC1maWx0ZXItaXRlbVxyXG4gICAgW3R5cGVdPVwidHlwZVwiXHJcbiAgICBbcXVlcnlUeXBlXT1cInF1ZXJ5VHlwZVwiXHJcbiAgICBbbWFwXT1cIm1hcFwiXHJcbiAgICBbem9uZV09XCJ6b25lXCJcclxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgW3N0b3JlXT1cInN0b3JlXCJcclxuICAgIFtsYXllcnNdPVwiYWN0aXZlTGF5ZXJzXCJcclxuICAgIFthbGxMYXllcnNdPVwibGF5ZXJzXCJcclxuICAgIFt0aGVtYXRpY0xlbmd0aF09XCJ0aGVtYXRpY0xlbmd0aFwiXHJcbiAgICAocmFkaXVzRXZlbnQpPVwiYnVmZmVyID0gJGV2ZW50XCJcclxuICAgIChidWZmZXJFdmVudCk9XCJidWZmZXIgPSAkZXZlbnRcIlxyXG4gICAgKG1lYXN1cmVVbml0Q2hhbmdlKT1cIm1lYXN1cmVVbml0ID0gJGV2ZW50XCJcclxuICAgIChmcmVlaGFuZENvbnRyb2wpPVwiZnJlZWhhbmREcmF3SXNBY3RpdmUgPSAkZXZlbnRcIlxyXG4gICAgKGRyYXdab25lRXZlbnQpPVwiem9uZSA9ICRldmVudFwiXHJcbiAgICAoem9uZVdpdGhCdWZmZXJDaGFuZ2UpPVwib25ab25lQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgKGl0ZW1UeXBlQ2hhbmdlKT1cIml0ZW1UeXBlID0gJGV2ZW50XCJcclxuICAgICh0aGVtYXRpY0NoYW5nZSk9XCJ0aGVtYXRpY3MgPSAkZXZlbnRcIlxyXG4gICAgKHRvZ2dsZVNlYXJjaCk9XCJnZXRPdXRwdXRUb2dnbGVTZWFyY2goKVwiXHJcbiAgICAoY2xlYXJCdXR0b25FdmVudCk9XCJjbGVhck1hcCgpXCJcclxuICAgIChjbGVhclNlYXJjaEV2ZW50KT1cImdldE91dHB1dENsZWFyU2VhcmNoKClcIlxyXG4gICAgKGV4cG9ydCk9XCJhY3RpdmF0ZUV4cG9ydFRvb2woKVwiXHJcbiAgICAob3BlbldvcmtzcGFjZSk9XCJhY3RpdmF0ZVdvcmtzcGFjZSgpXCJcclxuICAgIChlbnRpdHlDaGFuZ2UpPVwiYWN0aXZhdGVXb3Jrc3BhY2UoJGV2ZW50KVwiPlxyXG4gIDwvaWdvLXNwYXRpYWwtZmlsdGVyLWl0ZW0+XHJcbjwvaWdvLXBhbmVsPlxyXG5cclxuPGlnby1wYW5lbD5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGZWF0dXJlJCB8IGFzeW5jIGFzIGZlYXR1cmVcIj5cclxuICAgIDxpZ28tZmVhdHVyZS1kZXRhaWxzIFtmZWF0dXJlXT1cImZlYXR1cmVcIj48L2lnby1mZWF0dXJlLWRldGFpbHM+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvaWdvLXBhbmVsPiJdfQ==
|