@igo2/integration 1.12.1 → 1.13.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/{esm2015/igo2-integration.js → esm2020/igo2-integration.mjs} +0 -0
  2. package/esm2020/lib/about/about-tool/about-tool.component.mjs +185 -0
  3. package/{esm2015/lib/about/about-tool/index.js → esm2020/lib/about/about-tool/index.mjs} +1 -1
  4. package/{esm2015/lib/about/about.module.js → esm2020/lib/about/about.module.mjs} +9 -11
  5. package/{esm2015/lib/about/index.js → esm2020/lib/about/index.mjs} +1 -1
  6. package/{esm2015/lib/analytics/analytics-listener.service.js → esm2020/lib/analytics/analytics-listener.service.mjs} +1 -1
  7. package/{esm2015/lib/analytics/analytics.module.js → esm2020/lib/analytics/analytics.module.mjs} +2 -2
  8. package/{esm2015/lib/analytics/index.js → esm2020/lib/analytics/index.mjs} +1 -1
  9. 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
  10. 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
  11. 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
  12. 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
  13. package/{esm2015/lib/catalog/catalog.module.js → esm2020/lib/catalog/catalog.module.mjs} +2 -2
  14. package/{esm2015/lib/catalog/catalog.state.js → esm2020/lib/catalog/catalog.state.mjs} +1 -1
  15. package/{esm2015/lib/catalog/index.js → esm2020/lib/catalog/index.mjs} +1 -1
  16. 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
  17. 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
  18. 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
  19. 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
  20. package/{esm2015/lib/context/context.module.js → esm2020/lib/context/context.module.mjs} +2 -2
  21. package/{esm2015/lib/context/context.state.js → esm2020/lib/context/context.state.mjs} +1 -1
  22. package/{esm2015/lib/context/index.js → esm2020/lib/context/index.mjs} +1 -1
  23. package/{esm2015/lib/directions/directions-tool/directions-tool.component.js → esm2020/lib/directions/directions-tool/directions-tool.component.mjs} +3 -6
  24. package/{esm2015/lib/directions/directions-tool/index.js → esm2020/lib/directions/directions-tool/index.mjs} +1 -1
  25. package/{esm2015/lib/directions/directions.module.js → esm2020/lib/directions/directions.module.mjs} +2 -2
  26. package/esm2020/lib/directions/directions.state.mjs +64 -0
  27. package/{esm2015/lib/directions/index.js → esm2020/lib/directions/index.mjs} +1 -1
  28. package/{esm2015/lib/draw/draw.module.js → esm2020/lib/draw/draw.module.mjs} +2 -2
  29. package/{esm2015/lib/draw/draw.state.js → esm2020/lib/draw/draw.state.mjs} +1 -1
  30. package/{esm2015/lib/draw/drawing-tool/drawing-tool.component.js → esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs} +3 -7
  31. package/{esm2015/lib/draw/index.js → esm2020/lib/draw/index.mjs} +1 -1
  32. 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} +1 -1
  33. 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
  34. package/{esm2015/lib/filter/active-ogc-filter-tool/index.js → esm2020/lib/filter/active-ogc-filter-tool/index.mjs} +1 -1
  35. 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} +1 -1
  36. 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
  37. package/{esm2015/lib/filter/active-time-filter-tool/index.js → esm2020/lib/filter/active-time-filter-tool/index.mjs} +1 -1
  38. package/{esm2015/lib/filter/filter.module.js → esm2020/lib/filter/filter.module.mjs} +2 -2
  39. package/{esm2015/lib/filter/index.js → esm2020/lib/filter/index.mjs} +1 -1
  40. package/{esm2015/lib/filter/ogc-filter-tool/index.js → esm2020/lib/filter/ogc-filter-tool/index.mjs} +1 -1
  41. 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
  42. package/{esm2015/lib/filter/spatial-filter-tool/index.js → esm2020/lib/filter/spatial-filter-tool/index.mjs} +1 -1
  43. package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +535 -0
  44. package/{esm2015/lib/filter/time-filter-tool/index.js → esm2020/lib/filter/time-filter-tool/index.mjs} +1 -1
  45. 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
  46. package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +137 -0
  47. package/{esm2015/lib/import-export/import-export-tool/index.js → esm2020/lib/import-export/import-export-tool/index.mjs} +1 -1
  48. package/{esm2015/lib/import-export/import-export.module.js → esm2020/lib/import-export/import-export.module.mjs} +7 -9
  49. package/{esm2015/lib/import-export/import-export.state.js → esm2020/lib/import-export/import-export.state.mjs} +1 -1
  50. package/{esm2015/lib/import-export/index.js → esm2020/lib/import-export/index.mjs} +1 -1
  51. package/{esm2015/lib/integration.module.js → esm2020/lib/integration.module.mjs} +2 -2
  52. package/esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +473 -0
  53. package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +89 -0
  54. package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +218 -0
  55. package/{esm2015/lib/map/advanced-map-tool/index.js → esm2020/lib/map/advanced-map-tool/index.mjs} +1 -1
  56. package/{esm2015/lib/map/index.js → esm2020/lib/map/index.mjs} +1 -1
  57. package/{esm2015/lib/map/layer-list-tool.state.js → esm2020/lib/map/layer-list-tool.state.mjs} +1 -1
  58. package/{esm2015/lib/map/map-details-tool/index.js → esm2020/lib/map/map-details-tool/index.mjs} +1 -1
  59. package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +256 -0
  60. package/{esm2015/lib/map/map-legend/index.js → esm2020/lib/map/map-legend/index.mjs} +1 -1
  61. package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +275 -0
  62. package/{esm2015/lib/map/map-proximity-tool/index.js → esm2020/lib/map/map-proximity-tool/index.mjs} +1 -1
  63. package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +206 -0
  64. package/{esm2015/lib/map/map-proximity.state.js → esm2020/lib/map/map-proximity.state.mjs} +10 -11
  65. package/{esm2015/lib/map/map-tool/index.js → esm2020/lib/map/map-tool/index.mjs} +1 -1
  66. package/esm2020/lib/map/map-tool/map-tool.component.mjs +130 -0
  67. package/{esm2015/lib/map/map-tools/index.js → esm2020/lib/map/map-tools/index.mjs} +1 -1
  68. package/esm2020/lib/map/map-tools/map-tools.component.mjs +478 -0
  69. package/{esm2015/lib/map/map.module.js → esm2020/lib/map/map.module.mjs} +29 -31
  70. package/{esm2015/lib/map/map.state.js → esm2020/lib/map/map.state.mjs} +1 -1
  71. package/{esm2015/lib/measure/index.js → esm2020/lib/measure/index.mjs} +1 -1
  72. package/{esm2015/lib/measure/measure.module.js → esm2020/lib/measure/measure.module.mjs} +2 -2
  73. package/{esm2015/lib/measure/measure.state.js → esm2020/lib/measure/measure.state.mjs} +1 -1
  74. package/{esm2015/lib/measure/measurer-tool/measurer-tool.component.js → esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs} +3 -7
  75. package/{esm2015/lib/measure/measurer-tool/measurer-tool.module.js → esm2020/lib/measure/measurer-tool/measurer-tool.module.mjs} +2 -4
  76. package/{esm2015/lib/print/index.js → esm2020/lib/print/index.mjs} +1 -1
  77. package/{esm2015/lib/print/print-tool/index.js → esm2020/lib/print/print-tool/index.mjs} +1 -1
  78. package/{esm2015/lib/print/print-tool/print-tool.component.js → esm2020/lib/print/print-tool/print-tool.component.mjs} +3 -6
  79. package/{esm2015/lib/print/print.module.js → esm2020/lib/print/print.module.mjs} +2 -2
  80. package/{esm2015/lib/search/index.js → esm2020/lib/search/index.mjs} +1 -1
  81. package/{esm2015/lib/search/query.state.js → esm2020/lib/search/query.state.mjs} +1 -1
  82. package/{esm2015/lib/search/search-bar/search-bar-binding.directive.js → esm2020/lib/search/search-bar/search-bar-binding.directive.mjs} +1 -1
  83. package/{esm2015/lib/search/search-bar/search-bar.module.js → esm2020/lib/search/search-bar/search-bar.module.mjs} +2 -2
  84. package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +577 -0
  85. 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
  86. package/{esm2015/lib/search/search.module.js → esm2020/lib/search/search.module.mjs} +2 -2
  87. package/{esm2015/lib/search/search.state.js → esm2020/lib/search/search.state.mjs} +1 -1
  88. package/{esm2015/lib/storage/index.js → esm2020/lib/storage/index.mjs} +1 -1
  89. package/{esm2015/lib/storage/storage.module.js → esm2020/lib/storage/storage.module.mjs} +2 -2
  90. package/{esm2015/lib/storage/storage.state.js → esm2020/lib/storage/storage.state.mjs} +1 -1
  91. package/{esm2015/lib/tool/index.js → esm2020/lib/tool/index.mjs} +1 -1
  92. package/{esm2015/lib/tool/tool.module.js → esm2020/lib/tool/tool.module.mjs} +2 -2
  93. package/{esm2015/lib/tool/tool.state.js → esm2020/lib/tool/tool.state.mjs} +1 -1
  94. package/{esm2015/lib/workspace/index.js → esm2020/lib/workspace/index.mjs} +1 -1
  95. package/esm2020/lib/workspace/shared/edition-actions.service.mjs +156 -0
  96. package/{esm2015/lib/workspace/shared/feature-actions.service.js → esm2020/lib/workspace/shared/feature-actions.service.mjs} +1 -1
  97. package/{esm2015/lib/workspace/shared/index.js → esm2020/lib/workspace/shared/index.mjs} +1 -1
  98. package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +158 -0
  99. package/{esm2015/lib/workspace/shared/workspace.utils.js → esm2020/lib/workspace/shared/workspace.utils.mjs} +1 -1
  100. package/{esm2015/lib/workspace/workspace-button/index.js → esm2020/lib/workspace/workspace-button/index.mjs} +1 -1
  101. package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +69 -0
  102. package/{esm2015/lib/workspace/workspace.module.js → esm2020/lib/workspace/workspace.module.mjs} +6 -8
  103. package/esm2020/lib/workspace/workspace.state.mjs +188 -0
  104. package/{esm2015/public_api.js → esm2020/public_api.mjs} +1 -1
  105. package/fesm2015/igo2-integration.mjs +6606 -0
  106. package/fesm2015/igo2-integration.mjs.map +1 -0
  107. package/{fesm2015/igo2-integration.js → fesm2020/igo2-integration.mjs} +303 -534
  108. package/fesm2020/igo2-integration.mjs.map +1 -0
  109. package/{igo2-integration.d.ts → index.d.ts} +0 -0
  110. package/lib/about/about-tool/about-tool.component.d.ts +1 -1
  111. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +1 -1
  112. package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +1 -1
  113. package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +1 -1
  114. package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +1 -1
  115. package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +1 -1
  116. package/lib/context/context-share-tool/context-share-tool.component.d.ts +1 -1
  117. package/lib/directions/directions-tool/directions-tool.component.d.ts +1 -1
  118. package/lib/draw/drawing-tool/drawing-tool.component.d.ts +1 -1
  119. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +1 -1
  120. package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +1 -1
  121. package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +1 -1
  122. package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +1 -1
  123. package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +1 -1
  124. package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +1 -1
  125. package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +4 -4
  126. package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +1 -1
  127. package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +4 -4
  128. package/lib/map/map-details-tool/map-details-tool.component.d.ts +1 -1
  129. package/lib/map/map-legend/map-legend-tool.component.d.ts +1 -1
  130. package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +1 -1
  131. package/lib/map/map-tool/map-tool.component.d.ts +1 -1
  132. package/lib/map/map-tools/map-tools.component.d.ts +1 -1
  133. package/lib/measure/measurer-tool/measurer-tool.component.d.ts +1 -1
  134. package/lib/print/print-tool/print-tool.component.d.ts +1 -1
  135. package/lib/search/search-bar/search-bar-binding.directive.d.ts +1 -1
  136. package/lib/search/search-results-tool/search-results-tool.component.d.ts +1 -1
  137. package/lib/workspace/workspace-button/workspace-button.component.d.ts +1 -1
  138. package/ngcc.config.js +3 -3
  139. package/package.json +24 -11
  140. package/bundles/igo2-integration.umd.js +0 -7863
  141. package/bundles/igo2-integration.umd.js.map +0 -1
  142. package/esm2015/lib/about/about-tool/about-tool.component.js +0 -190
  143. package/esm2015/lib/directions/directions.state.js +0 -66
  144. package/esm2015/lib/filter/spatial-filter-tool/spatial-filter-tool.component.js +0 -545
  145. package/esm2015/lib/import-export/import-export-tool/import-export-tool.component.js +0 -145
  146. package/esm2015/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.js +0 -481
  147. package/esm2015/lib/map/advanced-map-tool/advanced-map-tool.component.js +0 -99
  148. package/esm2015/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.js +0 -234
  149. package/esm2015/lib/map/map-details-tool/map-details-tool.component.js +0 -274
  150. package/esm2015/lib/map/map-legend/map-legend-tool.component.js +0 -289
  151. package/esm2015/lib/map/map-proximity-tool/map-proximity-tool.component.js +0 -221
  152. package/esm2015/lib/map/map-tool/map-tool.component.js +0 -142
  153. package/esm2015/lib/map/map-tools/map-tools.component.js +0 -496
  154. package/esm2015/lib/search/search-results-tool/search-results-tool.component.js +0 -598
  155. package/esm2015/lib/workspace/shared/edition-actions.service.js +0 -157
  156. package/esm2015/lib/workspace/shared/wfs-actions.service.js +0 -159
  157. package/esm2015/lib/workspace/workspace-button/workspace-button.component.js +0 -74
  158. package/esm2015/lib/workspace/workspace.state.js +0 -190
  159. package/fesm2015/igo2-integration.js.map +0 -1
@@ -1,545 +0,0 @@
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
- var _a, _b, _c, _d;
252
- let i = 1;
253
- for (const feature of features) {
254
- if (this.type === SpatialFilterType.Predefined) {
255
- for (const layer of this.layers) {
256
- if (layer.options._internal &&
257
- layer.options._internal.code === feature.properties.code &&
258
- !buffer) {
259
- if (!((_a = layer.title) === null || _a === void 0 ? void 0 : _a.startsWith('Zone'))) {
260
- const index = this.layers.indexOf(layer);
261
- this.layers.splice(index, 1);
262
- }
263
- return;
264
- }
265
- if ((_b = layer.title) === null || _b === void 0 ? void 0 : _b.startsWith('Zone')) {
266
- this.activeLayers = [];
267
- const index = this.layers.indexOf(layer);
268
- this.layers.splice(index, 1);
269
- this.map.removeLayer(layer);
270
- }
271
- }
272
- }
273
- else {
274
- if (buffer) {
275
- for (const layer of this.activeLayers) {
276
- if (this.activeLayers.length === 1 && ((_c = layer.title) === null || _c === void 0 ? void 0 : _c.startsWith('Zone'))) {
277
- const index = this.layers.indexOf(layer);
278
- this.layers.splice(index, 1);
279
- this.map.removeLayer(layer);
280
- }
281
- }
282
- }
283
- this.activeLayers = [];
284
- }
285
- for (const layer of this.layers) {
286
- if ((_d = layer.title) === null || _d === void 0 ? void 0 : _d.startsWith('Zone')) {
287
- i++;
288
- }
289
- }
290
- this.defaultStyle = (_feature, resolution) => {
291
- const coordinates = features[0].coordinates;
292
- return new olstyle.Style({
293
- image: new olstyle.Circle({
294
- radius: coordinates
295
- ? this.buffer /
296
- Math.cos((Math.PI / 180) * coordinates[1]) /
297
- resolution
298
- : undefined,
299
- fill: new olstyle.Fill({
300
- color: 'rgba(200, 200, 20, 0.2)'
301
- }),
302
- stroke: new olstyle.Stroke({
303
- width: 1,
304
- color: 'orange'
305
- })
306
- }),
307
- stroke: new olstyle.Stroke({
308
- width: 1,
309
- color: 'orange'
310
- }),
311
- fill: new olstyle.Fill({
312
- color: 'rgba(200, 200, 20, 0.2)'
313
- })
314
- });
315
- };
316
- this.dataSourceService
317
- .createAsyncDataSource({
318
- type: 'vector',
319
- queryable: true
320
- })
321
- .pipe(take(1))
322
- .subscribe((dataSource) => {
323
- const olLayer = this.layerService.createLayer({
324
- isIgoInternalLayer: true,
325
- title: ('Zone ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
326
- workspace: { enabled: true },
327
- _internal: {
328
- code: this.type === SpatialFilterType.Predefined
329
- ? feature.properties.code
330
- : undefined
331
- },
332
- source: dataSource,
333
- visible: true
334
- });
335
- const featuresOl = features.map(f => {
336
- return featureToOl(f, this.map.projection);
337
- });
338
- if (this.type !== SpatialFilterType.Predefined) {
339
- const type = this.type === SpatialFilterType.Point ? 'Cercle' : 'Polygone';
340
- featuresOl[0].set('nom', 'Zone', true);
341
- featuresOl[0].set('type', type, true);
342
- }
343
- const ol = dataSource.ol;
344
- ol.addFeatures(featuresOl);
345
- olLayer.ol.setStyle(this.defaultStyle);
346
- this.map.addLayer(olLayer);
347
- this.layers.push(olLayer);
348
- this.activeLayers.push(olLayer);
349
- this.cdRef.detectChanges();
350
- });
351
- }
352
- }
353
- /**
354
- * Try to add point features to the map
355
- * Necessary to create clusters
356
- */
357
- tryAddPointToMap(features, id) {
358
- var _a;
359
- let i = 1;
360
- if (features.length) {
361
- if (this.map === undefined) {
362
- return;
363
- }
364
- for (const layer of this.layers) {
365
- if ((_a = layer.title) === null || _a === void 0 ? void 0 : _a.startsWith(features[0].meta.title)) {
366
- i++;
367
- }
368
- }
369
- this.dataSourceService
370
- .createAsyncDataSource({
371
- type: 'cluster',
372
- id,
373
- queryable: true,
374
- distance: 120,
375
- meta: {
376
- title: 'Cluster'
377
- }
378
- })
379
- .pipe(take(1))
380
- .subscribe((dataSource) => {
381
- const icon = features[0].meta.icon;
382
- let style;
383
- if (!icon) {
384
- style = createOverlayMarkerStyle();
385
- }
386
- else {
387
- style = this.createSvgIcon(icon) || createOverlayMarkerStyle();
388
- }
389
- const olLayer = this.layerService.createLayer({
390
- isIgoInternalLayer: true,
391
- title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
392
- source: dataSource,
393
- visible: true,
394
- style
395
- });
396
- const featuresOl = features.map(feature => {
397
- return featureToOl(feature, this.map.projection);
398
- });
399
- const ol = dataSource.ol;
400
- ol.getSource().addFeatures(featuresOl);
401
- if (this.layers.find(layer => layer.id === olLayer.id)) {
402
- this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
403
- i = i - 1;
404
- olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
405
- olLayer.options.title = olLayer.title;
406
- }
407
- this.iterator = i;
408
- this.map.addLayer(olLayer);
409
- this.layers.push(olLayer);
410
- this.pushLayer(olLayer);
411
- this.cdRef.detectChanges();
412
- });
413
- }
414
- }
415
- createSvgIcon(icon) {
416
- let style;
417
- this.matIconRegistry.getNamedSvgIcon(icon).subscribe(svgObj => {
418
- const xmlSerializer = new XMLSerializer();
419
- svgObj.setAttribute('width', '30');
420
- svgObj.setAttribute('height', '30');
421
- svgObj.setAttribute('fill', 'rgba(0, 128, 255)');
422
- svgObj.setAttribute('stroke', 'white');
423
- const svg = xmlSerializer.serializeToString(svgObj);
424
- style = new olstyle.Style({
425
- image: new olstyle.Icon({
426
- src: 'data:image/svg+xml;utf8,' + svg
427
- })
428
- });
429
- });
430
- return style;
431
- }
432
- /**
433
- * Try to add line or polygon features to the map
434
- */
435
- tryAddLayerToMap(features, id) {
436
- var _a;
437
- let i = 1;
438
- if (features.length) {
439
- if (this.map === undefined) {
440
- return;
441
- }
442
- for (const layer of this.layers) {
443
- if ((_a = layer.title) === null || _a === void 0 ? void 0 : _a.startsWith(features[0].meta.title)) {
444
- i++;
445
- }
446
- }
447
- this.dataSourceService
448
- .createAsyncDataSource({
449
- type: 'vector',
450
- id,
451
- queryable: true
452
- })
453
- .pipe(take(1))
454
- .subscribe((dataSource) => {
455
- const olLayer = this.layerService.createLayer({
456
- isIgoInternalLayer: true,
457
- title: (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter')),
458
- source: dataSource,
459
- visible: true
460
- });
461
- const featuresOl = features.map(feature => {
462
- return featureToOl(feature, this.map.projection);
463
- });
464
- const ol = dataSource.ol;
465
- ol.addFeatures(featuresOl);
466
- if (this.layers.find(layer => layer.id === olLayer.id)) {
467
- this.map.removeLayer(this.layers.find(layer => layer.id === olLayer.id));
468
- i = i - 1;
469
- olLayer.title = (features[0].meta.title + ' ' + i + ' - ' + this.languageService.translate.instant('igo.geo.spatialFilter.spatialFilter'));
470
- olLayer.options.title = olLayer.title;
471
- }
472
- this.map.addLayer(olLayer);
473
- this.layers.push(olLayer);
474
- this.pushLayer(olLayer);
475
- this.cdRef.detectChanges();
476
- });
477
- }
478
- }
479
- zoomToFeatureExtent(feature) {
480
- if (feature) {
481
- const olFeature = this.format.readFeature(feature, {
482
- dataProjection: feature.projection,
483
- featureProjection: this.map.projection
484
- });
485
- moveToOlFeatures(this.map, [olFeature], FeatureMotion.Zoom);
486
- }
487
- }
488
- pushLayer(layer) {
489
- for (const lay of this.activeLayers) {
490
- if (lay.id === layer.id) {
491
- return;
492
- }
493
- }
494
- this.activeLayers.push(layer);
495
- }
496
- };
497
- 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)); };
498
- 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) {
499
- i0.ɵɵelementStart(0, "igo-panel");
500
- i0.ɵɵelementStart(1, "igo-spatial-filter-type", 0);
501
- 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; });
502
- i0.ɵɵelementEnd();
503
- i0.ɵɵelementStart(2, "igo-spatial-filter-item", 1);
504
- 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); });
505
- i0.ɵɵelementEnd();
506
- i0.ɵɵelementEnd();
507
- i0.ɵɵelementStart(3, "igo-panel");
508
- i0.ɵɵtemplate(4, SpatialFilterToolComponent_ng_container_4_Template, 2, 1, "ng-container", 2);
509
- i0.ɵɵpipe(5, "async");
510
- i0.ɵɵelementEnd();
511
- } if (rf & 2) {
512
- i0.ɵɵadvance(1);
513
- i0.ɵɵproperty("store", ctx.spatialListStore)("selectedQueryType", ctx.queryType)("zone", ctx.zone)("layers", ctx.activeLayers);
514
- i0.ɵɵadvance(1);
515
- 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);
516
- i0.ɵɵadvance(2);
517
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(5, 14, ctx.selectedFeature$));
518
- } }, directives: [i2.SpatialFilterTypeComponent, i2.SpatialFilterItemComponent, i8.NgIf], pipes: [i8.AsyncPipe], styles: [""], changeDetection: 0 });
519
- SpatialFilterToolComponent = __decorate([
520
- ToolComponent({
521
- name: 'spatialFilter',
522
- title: 'igo.integration.tools.spatialFilter',
523
- icon: 'selection-marker'
524
- })
525
- /**
526
- * Spatial Filter Type
527
- */
528
- ], SpatialFilterToolComponent);
529
- export { SpatialFilterToolComponent };
530
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SpatialFilterToolComponent, [{
531
- type: Component,
532
- args: [{
533
- selector: 'igo-spatial-filter-tool',
534
- templateUrl: './spatial-filter-tool.component.html',
535
- styleUrls: ['./spatial-filter-tool.component.scss'],
536
- changeDetection: ChangeDetectionStrategy.OnPush
537
- }]
538
- }], 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: [{
539
- type: Input
540
- }], itemType: [{
541
- type: Input
542
- }], freehandDrawIsActive: [{
543
- type: Input
544
- }] }); })();
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pbnRlZ3JhdGlvbi9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci10b29sL3NwYXRpYWwtZmlsdGVyLXRvb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXItdG9vbC9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUFjLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUtMLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsV0FBVyxFQUlYLGlCQUFpQixFQUNqQixxQkFBcUIsRUFLckIsd0JBQXdCLEVBRXhCLGlCQUFpQixFQUNsQixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNoRyxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7SUNPbEMsNkJBQTBEO0lBQ3hELHlDQUErRDtJQUNqRSwwQkFBZTs7O0lBRFEsZUFBbUI7SUFBbkIsb0NBQW1C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QixvQ0FBQSxrQkFBQSw0QkFBQTtRQWExQixlQUFhO1FBQWIsK0JBQWEsNEJBQUEsZ0JBQUEsa0JBQUEsd0JBQUEsb0JBQUEsNEJBQUEseUJBQUEsc0NBQUE7UUEyQkEsZUFBK0I7UUFBL0Isa0VBQStCOztBRGdCbkMsMEJBQTBCO0lBZHRDLGFBQWEsQ0FBQztRQUNiLElBQUksRUFBRSxlQUFlO1FBQ3JCLEtBQUssRUFBRSxxQ0FBcUM7UUFDNUMsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QixDQUFDO0lBQ0Y7O09BRUc7R0FPVSwwQkFBMEIsQ0FtaUJ0QztTQW5pQlksMEJBQTBCO3VGQUExQiwwQkFBMEI7Y0FOdEMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLFdBQVcsRUFBRSxzQ0FBc0M7Z0JBQ25ELFNBQVMsRUFBRSxDQUFDLHNDQUFzQyxDQUFDO2dCQUNuRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNoRDt1V0FNVSxJQUFJO2tCQUFaLEtBQUs7WUFDRyxRQUFRO2tCQUFoQixLQUFLO1lBQ0csb0JBQW9CO2tCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0SWNvblJlZ2lzdHJ5IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIElnb01hcCxcbiAgRGF0YVNvdXJjZVNlcnZpY2UsXG4gIExheWVyU2VydmljZSxcbiAgRmVhdHVyZSxcbiAgbW92ZVRvT2xGZWF0dXJlcyxcbiAgRmVhdHVyZU1vdGlvbixcbiAgQ2x1c3RlckRhdGFTb3VyY2UsXG4gIGZlYXR1cmVUb09sLFxuICBEYXRhU291cmNlLFxuICBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucyxcbiAgU3BhdGlhbEZpbHRlclNlcnZpY2UsXG4gIFNwYXRpYWxGaWx0ZXJUeXBlLFxuICBTcGF0aWFsRmlsdGVySXRlbVR5cGUsXG4gIFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGUsXG4gIFNwYXRpYWxGaWx0ZXJUaGVtYXRpYyxcbiAgTGF5ZXIsXG4gIFZlY3RvckxheWVyLFxuICBjcmVhdGVPdmVybGF5TWFya2VyU3R5bGUsXG4gIEV4cG9ydE9wdGlvbnMsXG4gIE1lYXN1cmVMZW5ndGhVbml0XG59IGZyb20gJ0BpZ28yL2dlbyc7XG5pbXBvcnQgeyBFbnRpdHlTdG9yZSwgVG9vbENvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbic7XG5pbXBvcnQgb2xGb3JtYXRHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCBvbFNvdXJjZVZlY3RvciBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcbmltcG9ydCBvbFNvdXJjZUNsdXN0ZXIgZnJvbSAnb2wvc291cmNlL0NsdXN0ZXInO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWFwU3RhdGUgfSBmcm9tICcuLi8uLi9tYXAvbWFwLnN0YXRlJztcbmltcG9ydCB7IEltcG9ydEV4cG9ydE1vZGUsIEltcG9ydEV4cG9ydFN0YXRlIH0gZnJvbSAnLi8uLi8uLi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQuc3RhdGUnO1xuaW1wb3J0ICogYXMgb2xzdHlsZSBmcm9tICdvbC9zdHlsZSc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSwgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XG5pbXBvcnQgeyBUb29sU3RhdGUgfSBmcm9tICcuLi8uLi90b29sL3Rvb2wuc3RhdGUnO1xuaW1wb3J0IHsgV29ya3NwYWNlU3RhdGUgfSBmcm9tICcuLi8uLi93b3Jrc3BhY2Uvd29ya3NwYWNlLnN0YXRlJztcbmltcG9ydCB7IEV2ZW50c0tleSB9IGZyb20gJ29sL2V2ZW50cyc7XG5cbi8qKlxuICogVG9vbCB0byBhcHBseSBzcGF0aWFsIGZpbHRlclxuICovXG5AVG9vbENvbXBvbmVudCh7XG4gIG5hbWU6ICdzcGF0aWFsRmlsdGVyJyxcbiAgdGl0bGU6ICdpZ28uaW50ZWdyYXRpb24udG9vbHMuc3BhdGlhbEZpbHRlcicsXG4gIGljb246ICdzZWxlY3Rpb24tbWFya2VyJ1xufSlcbi8qKlxuICogU3BhdGlhbCBGaWx0ZXIgVHlwZVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tc3BhdGlhbC1maWx0ZXItdG9vbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWZpbHRlci10b29sLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3BhdGlhbC1maWx0ZXItdG9vbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsRmlsdGVyVG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZ2V0IG1hcCgpOiBJZ29NYXAge1xuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcbiAgfVxuXG4gIEBJbnB1dCgpIHR5cGU6IFNwYXRpYWxGaWx0ZXJUeXBlO1xuICBASW5wdXQoKSBpdGVtVHlwZTogU3BhdGlhbEZpbHRlckl0ZW1UeXBlID0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLkFkZHJlc3M7XG4gIEBJbnB1dCgpIGZyZWVoYW5kRHJhd0lzQWN0aXZlOiBib29sZWFuO1xuXG4gIHB1YmxpYyBsYXllcnM6IExheWVyW10gPSBbXTtcbiAgcHVibGljIGFjdGl2ZUxheWVyczogTGF5ZXJbXSA9IFtdO1xuXG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGU7XG4gIHB1YmxpYyB0aGVtYXRpY3M6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpY1tdO1xuICBwdWJsaWMgem9uZTogRmVhdHVyZTtcbiAgcHVibGljIHpvbmVXaXRoQnVmZmVyOiBGZWF0dXJlO1xuICBwdWJsaWMgYnVmZmVyID0gMDtcblxuICBwdWJsaWMgaXRlcmF0b3IgPSAxO1xuXG4gIHB1YmxpYyBzZWxlY3RlZEZlYXR1cmUkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgIHVuZGVmaW5lZFxuICApO1xuXG4gIHByaXZhdGUgZm9ybWF0ID0gbmV3IG9sRm9ybWF0R2VvSlNPTigpO1xuXG4gIHB1YmxpYyBzdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pOyAvLyBTdG9yZSB0byBwcmludCByZXN1bHRzIGF0IHRoZSBlbmRcblxuICBwdWJsaWMgc3BhdGlhbExpc3RTdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4gPSBuZXcgRW50aXR5U3RvcmU8RmVhdHVyZT4oW10pO1xuXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgcHVibGljIHRoZW1hdGljTGVuZ3RoID0gMDtcblxuICBwdWJsaWMgbWVhc3VyZVVuaXQ6IE1lYXN1cmVMZW5ndGhVbml0ID0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzO1xuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBtb3ZlZW5kS2V5OiBFdmVudHNLZXk7XG5cbiAgcHVibGljIGRlZmF1bHRTdHlsZTogb2xzdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xzdHlsZS5TdHlsZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtYXRJY29uUmVnaXN0cnk6IE1hdEljb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHNwYXRpYWxGaWx0ZXJTZXJ2aWNlOiBTcGF0aWFsRmlsdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFTb3VyY2VTZXJ2aWNlOiBEYXRhU291cmNlU2VydmljZSxcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFwU3RhdGU6IE1hcFN0YXRlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbXBvcnRFeHBvcnRTdGF0ZTogSW1wb3J0RXhwb3J0U3RhdGUsXG4gICAgcHJpdmF0ZSB0b29sU3RhdGU6IFRvb2xTdGF0ZSxcbiAgICBwcml2YXRlIHdvcmtzcGFjZVN0YXRlOiBXb3Jrc3BhY2VTdGF0ZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLm1hcC5sYXllcnMpIHtcbiAgICAgIGlmIChsYXllci50aXRsZSAmJiBsYXllci50aXRsZS5pbmNsdWRlcyh0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInKSkpIHtcbiAgICAgICAgdGhpcy5sYXllcnMucHVzaChsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXRPdXRwdXRUeXBlKGV2ZW50OiBTcGF0aWFsRmlsdGVyVHlwZSkge1xuICAgIHRoaXMudHlwZSA9IGV2ZW50O1xuICAgIHRoaXMucXVlcnlUeXBlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0T3V0cHV0UXVlcnlUeXBlKGV2ZW50OiBTcGF0aWFsRmlsdGVyUXVlcnlUeXBlKSB7XG4gICAgdGhpcy5xdWVyeVR5cGUgPSBldmVudDtcbiAgICBpZiAodGhpcy5xdWVyeVR5cGUpIHtcbiAgICAgIHRoaXMubG9hZEZpbHRlckxpc3QoKTtcbiAgICB9XG4gIH1cblxuICBhY3RpdmF0ZUV4cG9ydFRvb2woKSB7XG4gICAgY29uc3QgaWRzID0gW107XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeWm9uZSBcXFxcZCsnKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICBpZiAoIWxheWVyLnRpdGxlLm1hdGNoKHJlKSkge1xuICAgICAgICBpZHMucHVzaChsYXllci5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW1wb3J0RXhwb3J0U3RhdGUuc2V0TW9kZShJbXBvcnRFeHBvcnRNb2RlLmV4cG9ydCk7XG4gICAgdGhpcy5pbXBvcnRFeHBvcnRTdGF0ZS5zZXRzRXhwb3J0T3B0aW9ucyh7IGxheWVyczogaWRzIH0gYXMgRXhwb3J0T3B0aW9ucyk7XG4gICAgdGhpcy50b29sU3RhdGUudG9vbGJveC5hY3RpdmF0ZVRvb2woJ2ltcG9ydEV4cG9ydCcpO1xuICB9XG5cbiAgYWN0aXZhdGVXb3Jrc3BhY2UocmVjb3JkPykge1xuICAgIGxldCBsYXllclRvT3BlbldrcztcbiAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnN0b3JlLmVudGl0aWVzJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIXJlY29yZCAmJiB0aGlzLmFjdGl2ZUxheWVycy5sZW5ndGggJiYgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zdG9yZS5hbGwoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRoZW1hdGljIG9mIHRoaXMudGhlbWF0aWNzKSB7XG4gICAgICAgICAgICAgIGlmICghdGhlbWF0aWMuemVyb1Jlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBsYXllclRvT3BlbldrcyA9IHRoaXMuYWN0aXZlTGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIudGl0bGUuaW5jbHVkZXModGhlbWF0aWMubmFtZSArICcgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAnQWRyZXNzZXMgJyArIHRoaXMuaXRlcmF0b3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChsYXllci50aXRsZS5pbmNsdWRlcyh0aXRsZSkpIHtcbiAgICAgICAgICAgICAgICBsYXllclRvT3BlbldrcyA9IGxheWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllclRvT3Blbldrcykge1xuICAgICAgICAgIHRoaXMud29ya3NwYWNlU3RhdGUud29ya3NwYWNlUGFuZWxFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy53b3Jrc3BhY2VTdGF0ZS5zZXRBY3RpdmVXb3Jrc3BhY2VCeUlkKGxheWVyVG9PcGVuV2tzLmlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWNvcmQgJiYgdGhpcy5hY3RpdmVMYXllcnMubGVuZ3RoICYmIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuYWxsKCkubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLnNlbGVjdFdvcmtzcGFjZUVudGl0eShyZWNvcmQpO1xuICAgICAgICB0aGlzLm1vdmVlbmRLZXkgPSB0aGlzLm1hcC5vbC5vbignbW92ZWVuZCcsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNlbGVjdFdvcmtzcGFjZUVudGl0eShyZWNvcmQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0V29ya3NwYWNlRW50aXR5KHJlY29yZCkge1xuICAgIHRoaXMud29ya3NwYWNlU3RhdGUuc3RvcmUuYWxsKCkuZm9yRWFjaCh3b3Jrc3BhY2UgPT4ge1xuICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZUFsbCh7c2VsZWN0ZWQ6IGZhbHNlfSk7XG4gICAgICBpZiAod29ya3NwYWNlLnRpdGxlLmluY2x1ZGVzKHJlY29yZC5hZGRlZFswXS5tZXRhLnRpdGxlKSkge1xuICAgICAgICB0aGlzLndvcmtzcGFjZVN0YXRlLnNldEFjdGl2ZVdvcmtzcGFjZUJ5SWQod29ya3NwYWNlLmlkKTtcbiAgICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLnN0YXRlLnVwZGF0ZU1hbnkocmVjb3JkLmFkZGVkLCB7c2VsZWN0ZWQ6IHRydWV9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZpbHRlckxpc3QoKSB7XG4gICAgdGhpcy5zcGF0aWFsRmlsdGVyU2VydmljZVxuICAgICAgLmxvYWRGaWx0ZXJMaXN0KHRoaXMucXVlcnlUeXBlKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGZlYXR1cmVzOiBGZWF0dXJlW10pID0+IHtcbiAgICAgICAgZmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGlmIChhLnByb3BlcnRpZXMubm9tIDwgYi5wcm9wZXJ0aWVzLm5vbSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYS5wcm9wZXJ0aWVzLm5vbSA+IGIucHJvcGVydGllcy5ub20pIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3BhdGlhbExpc3RTdG9yZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNwYXRpYWxMaXN0U3RvcmUubG9hZChmZWF0dXJlcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldE91dHB1dFRvZ2dsZVNlYXJjaCgpIHtcbiAgICB0aGlzLmxvYWRUaGVtYXRpY3MoKTtcbiAgfVxuXG4gIGdldE91dHB1dENsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuem9uZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsZWFyTWFwKCkge1xuICAgIHRoaXMubWFwLnJlbW92ZUxheWVycyh0aGlzLmxheWVycyk7XG4gICAgdGhpcy5sYXllcnMgPSBbXTtcbiAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xuICAgIHRoaXMudGhlbWF0aWNMZW5ndGggPSAwO1xuICAgIHRoaXMuaXRlcmF0b3IgPSAxO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQpIHtcbiAgICAgIHRoaXMuem9uZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucXVlcnlUeXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRoZW1hdGljcygpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGxldCB6ZXJvUmVzdWx0cyA9IHRydWU7XG4gICAgbGV0IHRoZW1hdGljcztcbiAgICBpZiAodGhpcy5idWZmZXIgPT09IDAgfHwgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCkge1xuICAgICAgdGhpcy50cnlBZGRGZWF0dXJlc1RvTWFwKFt0aGlzLnpvbmVdKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXRlbVR5cGUgIT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5UaGVtYXRpY3MpIHtcbiAgICAgIGNvbnN0IHRoZW1lOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMgPSB7XG4gICAgICAgIG5hbWU6ICcnXG4gICAgICB9O1xuICAgICAgdGhlbWF0aWNzID0gW3RoZW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWF0aWNzID0gdGhpcy50aGVtYXRpY3M7XG4gICAgfVxuICAgIGlmICh0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzICYmIHRoaXMudHlwZSAhPT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIgKiAxMDAwO1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2x5Z29uKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IDA7IC8vIHRvIGF2b2lkIGJ1ZmZlciBlbnRlciBhIHNlY29uZCB0aW1lIGluIHRlcnJBUElcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZhYmxlcyQ6IE9ic2VydmFibGU8RmVhdHVyZVtdPltdID0gW107XG4gICAgdGhlbWF0aWNzLmZvckVhY2godGhlbWF0aWMgPT4ge1xuICAgICAgb2JzZXJ2YWJsZXMkLnB1c2goXG4gICAgICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgICAgICAubG9hZEZpbHRlckl0ZW0oXG4gICAgICAgICAgICB0aGlzLnpvbmUsXG4gICAgICAgICAgICB0aGlzLml0ZW1UeXBlLFxuICAgICAgICAgICAgdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICB0aGVtYXRpYyxcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyXG4gICAgICAgICAgKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFwKChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmUuaW5zZXJ0TWFueShmZWF0dXJlcyk7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzUG9pbnQ6IEZlYXR1cmVbXSA9IFtdO1xuICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlc0xpbmVQb2x5OiBGZWF0dXJlW10gPSBbXTtcbiAgICAgICAgICAgICAgbGV0IGlkUG9pbnQ7XG4gICAgICAgICAgICAgIGxldCBpZExpbmVQb2x5O1xuICAgICAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcy5sb25naXR1ZGUgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xuICAgICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLmxhdGl0dWRlID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXTtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzUG9pbnQucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgIGlkUG9pbnQgPSBmZWF0dXJlLm1ldGEuaWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZlYXR1cmVzTGluZVBvbHkucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgIGlkTGluZVBvbHkgPSBmZWF0dXJlLm1ldGEuaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB0aGlzLnRyeUFkZFBvaW50VG9NYXAoZmVhdHVyZXNQb2ludCwgaWRQb2ludCk7XG4gICAgICAgICAgICAgIHRoaXMudHJ5QWRkTGF5ZXJUb01hcChmZWF0dXJlc0xpbmVQb2x5LCBpZExpbmVQb2x5KTtcbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHplcm9SZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50aGVtYXRpY0xlbmd0aCArPSAxO1xuICAgICAgICAgICAgICAgIHRoZW1hdGljLnplcm9SZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlbWF0aWMuemVyb1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCA+PSAxMDAwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5tYXhTaXplQWxlcnQnXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIud2FybmluZydcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB7IHRpbWVPdXQ6IDEwMDAwIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmb3JrSm9pbihvYnNlcnZhYmxlcyQpLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHplcm9SZXN1bHRzKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnplcm9SZXN1bHRzJ1xuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7IHRpbWVPdXQ6IDEwMDAwIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uWm9uZUNoYW5nZShmZWF0dXJlOiBGZWF0dXJlLCBidWZmZXI/OiBib29sZWFuKSB7XG4gICAgdGhpcy56b25lID0gZmVhdHVyZTtcbiAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgYnVmZmVyID8gdGhpcy50cnlBZGRGZWF0dXJlc1RvTWFwKFtmZWF0dXJlXSwgdHJ1ZSkgOiB0aGlzLnRyeUFkZEZlYXR1cmVzVG9NYXAoW2ZlYXR1cmVdKTtcbiAgICAgIHRoaXMuem9vbVRvRmVhdHVyZUV4dGVudChmZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGFkZCB6b25lIGZlYXR1cmUgdG8gdGhlIG1hcCBvdmVybGF5XG4gICAqL1xuICBwdWJsaWMgdHJ5QWRkRmVhdHVyZXNUb01hcChmZWF0dXJlczogRmVhdHVyZVtdLCBidWZmZXI/OiBib29sZWFuKSB7XG4gICAgbGV0IGkgPSAxO1xuICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGF5ZXIub3B0aW9ucy5faW50ZXJuYWwgJiZcbiAgICAgICAgICAgIGxheWVyLm9wdGlvbnMuX2ludGVybmFsLmNvZGUgPT09IGZlYXR1cmUucHJvcGVydGllcy5jb2RlICYmXG4gICAgICAgICAgICAhYnVmZmVyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoIWxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTGF5ZXJzID0gW107XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGF5ZXJzLmluZGV4T2YobGF5ZXIpO1xuICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuYWN0aXZlTGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVMYXllcnMubGVuZ3RoID09PSAxICYmIGxheWVyLnRpdGxlPy5zdGFydHNXaXRoKCdab25lJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxheWVycy5pbmRleE9mKGxheWVyKTtcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUxheWVycyA9IFtdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoJ1pvbmUnKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kZWZhdWx0U3R5bGUgPSAoX2ZlYXR1cmUsIHJlc29sdXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSAoZmVhdHVyZXNbMF0gYXMgYW55KS5jb29yZGluYXRlcztcbiAgICAgICAgcmV0dXJuIG5ldyBvbHN0eWxlLlN0eWxlKHtcbiAgICAgICAgICBpbWFnZTogbmV3IG9sc3R5bGUuQ2lyY2xlKHtcbiAgICAgICAgICAgIHJhZGl1czogY29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgPyB0aGlzLmJ1ZmZlciAvXG4gICAgICAgICAgICAgICAgTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogY29vcmRpbmF0ZXNbMV0pIC9cbiAgICAgICAgICAgICAgICByZXNvbHV0aW9uXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZmlsbDogbmV3IG9sc3R5bGUuRmlsbCh7XG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgyMDAsIDIwMCwgMjAsIDAuMiknXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN0cm9rZTogbmV3IG9sc3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICAgIGNvbG9yOiAnb3JhbmdlJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7XG4gICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgIGNvbG9yOiAnb3JhbmdlJ1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGZpbGw6IG5ldyBvbHN0eWxlLkZpbGwoe1xuICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDIwMCwgMjAwLCAyMCwgMC4yKSdcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmRhdGFTb3VyY2VTZXJ2aWNlXG4gICAgICAgIC5jcmVhdGVBc3luY0RhdGFTb3VyY2Uoe1xuICAgICAgICAgIHR5cGU6ICd2ZWN0b3InLFxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZVxuICAgICAgICB9IGFzIFF1ZXJ5YWJsZURhdGFTb3VyY2VPcHRpb25zKVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhU291cmNlOiBEYXRhU291cmNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2xMYXllciA9IHRoaXMubGF5ZXJTZXJ2aWNlLmNyZWF0ZUxheWVyKHtcbiAgICAgICAgICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcbiAgICAgICAgICAgIHRpdGxlOiAoJ1pvbmUgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXG4gICAgICAgICAgICApKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgX2ludGVybmFsOiB7XG4gICAgICAgICAgICAgIGNvZGU6XG4gICAgICAgICAgICAgICAgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkXG4gICAgICAgICAgICAgICAgICA/IGZlYXR1cmUucHJvcGVydGllcy5jb2RlXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZSxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgICAgICB9KSBhcyBWZWN0b3JMYXllcjtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlc09sID0gZmVhdHVyZXMubWFwKGYgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVUb09sKGYsIHRoaXMubWFwLnByb2plY3Rpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50ID8gJ0NlcmNsZScgOiAnUG9seWdvbmUnO1xuICAgICAgICAgICAgZmVhdHVyZXNPbFswXS5zZXQoJ25vbScsICdab25lJywgdHJ1ZSk7XG4gICAgICAgICAgICBmZWF0dXJlc09sWzBdLnNldCgndHlwZScsIHR5cGUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvbCA9IGRhdGFTb3VyY2Uub2wgYXMgb2xTb3VyY2VWZWN0b3I8T2xHZW9tZXRyeT4gfCBvbFNvdXJjZUNsdXN0ZXI7XG4gICAgICAgICAgb2wuYWRkRmVhdHVyZXMoZmVhdHVyZXNPbCk7XG4gICAgICAgICAgb2xMYXllci5vbC5zZXRTdHlsZSh0aGlzLmRlZmF1bHRTdHlsZSk7XG4gICAgICAgICAgdGhpcy5tYXAuYWRkTGF5ZXIob2xMYXllcik7XG4gICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvbExheWVyKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVycy5wdXNoKG9sTGF5ZXIpO1xuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGFkZCBwb2ludCBmZWF0dXJlcyB0byB0aGUgbWFwXG4gICAqIE5lY2Vzc2FyeSB0byBjcmVhdGUgY2x1c3RlcnNcbiAgICovXG4gIHByaXZhdGUgdHJ5QWRkUG9pbnRUb01hcChmZWF0dXJlczogRmVhdHVyZVtdLCBpZCkge1xuICAgIGxldCBpID0gMTtcbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5tYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgIGlmIChsYXllci50aXRsZT8uc3RhcnRzV2l0aChmZWF0dXJlc1swXS5tZXRhLnRpdGxlKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kYXRhU291cmNlU2VydmljZVxuICAgICAgICAuY3JlYXRlQXN5bmNEYXRhU291cmNlKHtcbiAgICAgICAgICB0eXBlOiAnY2x1c3RlcicsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcXVlcnlhYmxlOiB0cnVlLFxuICAgICAgICAgIGRpc3RhbmNlOiAxMjAsXG4gICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgdGl0bGU6ICdDbHVzdGVyJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucylcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YVNvdXJjZTogQ2x1c3RlckRhdGFTb3VyY2UpID0+IHtcbiAgICAgICAgICBjb25zdCBpY29uID0gZmVhdHVyZXNbMF0ubWV0YS5pY29uO1xuICAgICAgICAgIGxldCBzdHlsZTogb2xzdHlsZS5TdHlsZTtcbiAgICAgICAgICBpZiAoIWljb24pIHtcbiAgICAgICAgICAgIHN0eWxlID0gY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5jcmVhdGVTdmdJY29uKGljb24pIHx8IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG9sTGF5ZXIgPSB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllcih7XG4gICAgICAgICAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgICAgICAgICB0aXRsZTogKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUgKyAnICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xuICAgICAgICAgICAgKSkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgc291cmNlOiBkYXRhU291cmNlLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHN0eWxlXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBmZWF0dXJlc09sID0gZmVhdHVyZXMubWFwKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVUb09sKGZlYXR1cmUsIHRoaXMubWFwLnByb2plY3Rpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IG9sID0gZGF0YVNvdXJjZS5vbCBhcyBvbFNvdXJjZUNsdXN0ZXI7XG4gICAgICAgICAgb2wuZ2V0U291cmNlKCkuYWRkRmVhdHVyZXMoZmVhdHVyZXNPbCk7XG4gICAgICAgICAgaWYgKHRoaXMubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIuaWQgPT09IG9sTGF5ZXIuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihcbiAgICAgICAgICAgICAgdGhpcy5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gb2xMYXllci5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpID0gaSAtIDE7XG4gICAgICAgICAgICBvbExheWVyLnRpdGxlID0gKGZlYXR1cmVzWzBdLm1ldGEudGl0bGUgKyAnICcgKyBpICsgJyAtICcgKyB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zcGF0aWFsRmlsdGVyJ1xuICAgICAgICAgICAgKSkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgb2xMYXllci5vcHRpb25zLnRpdGxlID0gb2xMYXllci50aXRsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGk7XG4gICAgICAgICAgdGhpcy5tYXAuYWRkTGF5ZXIob2xMYXllcik7XG4gICAgICAgICAgdGhpcy5sYXllcnMucHVzaChvbExheWVyKTtcbiAgICAgICAgICB0aGlzLnB1c2hMYXllcihvbExheWVyKTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdmdJY29uKGljb24pOiBvbHN0eWxlLlN0eWxlIHtcbiAgICBsZXQgc3R5bGU6IG9sc3R5bGUuU3R5bGU7XG4gICAgdGhpcy5tYXRJY29uUmVnaXN0cnkuZ2V0TmFtZWRTdmdJY29uKGljb24pLnN1YnNjcmliZShzdmdPYmogPT4ge1xuICAgICAgY29uc3QgeG1sU2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCd3aWR0aCcsICczMCcpO1xuICAgICAgc3ZnT2JqLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzMwJyk7XG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCdmaWxsJywgJ3JnYmEoMCwgMTI4LCAyNTUpJyk7XG4gICAgICBzdmdPYmouc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnd2hpdGUnKTtcbiAgICAgIGNvbnN0IHN2ZyA9IHhtbFNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoc3ZnT2JqKTtcbiAgICAgIHN0eWxlID0gbmV3IG9sc3R5bGUuU3R5bGUoe1xuICAgICAgICBpbWFnZTogbmV3IG9sc3R5bGUuSWNvbih7XG4gICAgICAgICAgc3JjOiAnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsJyArIHN2Z1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG4gIC8qKlxuICAgKiBUcnkgdG8gYWRkIGxpbmUgb3IgcG9seWdvbiBmZWF0dXJlcyB0byB0aGUgbWFwXG4gICAqL1xuICBwcml2YXRlIHRyeUFkZExheWVyVG9NYXAoZmVhdHVyZXM6IEZlYXR1cmVbXSwgaWQpIHtcbiAgICBsZXQgaSA9IDE7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMubWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICBpZiAobGF5ZXIudGl0bGU/LnN0YXJ0c1dpdGgoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSkpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVNvdXJjZVNlcnZpY2VcbiAgICAgICAgLmNyZWF0ZUFzeW5jRGF0YVNvdXJjZSh7XG4gICAgICAgICAgdHlwZTogJ3ZlY3RvcicsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcXVlcnlhYmxlOiB0cnVlXG4gICAgICAgIH0gYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpID0+IHtcbiAgICAgICAgICBjb25zdCBvbExheWVyID0gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXIoe1xuICAgICAgICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6IChmZWF0dXJlc1swXS5tZXRhLnRpdGxlICsgJyAnICsgaSArICcgLSAnICsgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc3BhdGlhbEZpbHRlcidcbiAgICAgICAgICAgICkpIGFzIHN0cmluZyxcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZSxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlc09sID0gZmVhdHVyZXMubWFwKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVUb09sKGZlYXR1cmUsIHRoaXMubWFwLnByb2plY3Rpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IG9sID0gZGF0YVNvdXJjZS5vbCBhcyBvbFNvdXJjZVZlY3RvcjxPbEdlb21ldHJ5PjtcbiAgICAgICAgICBvbC5hZGRGZWF0dXJlcyhmZWF0dXJlc09sKTtcbiAgICAgICAgICBpZiAodGhpcy5sYXllcnMuZmluZChsYXllciA9PiBsYXllci5pZCA9PT0gb2xMYXllci5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKFxuICAgICAgICAgICAgICB0aGlzLmxheWVycy5maW5kKGxheWVyID0+IGxheWVyLmlkID09PSBvbExheWVyLmlkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGkgPSBpIC0gMTtcbiAgICAgICAgICAgIG9sTGF5ZXIudGl0bGUgPSAoZmVhdHVyZXNbMF0ubWV0YS50aXRsZSArICcgJyArIGkgKyAnIC0gJyArIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNwYXRpYWxGaWx0ZXInXG4gICAgICAgICAgICApKSBhcyBzdHJpbmc7XG4gICAgICAgICAgICBvbExheWVyLm9wdGlvbnMudGl0bGUgPSBvbExheWVyLnRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1hcC5hZGRMYXllcihvbExheWVyKTtcbiAgICAgICAgICB0aGlzLmxheWVycy5wdXNoKG9sTGF5ZXIpO1xuICAgICAgICAgIHRoaXMucHVzaExheWVyKG9sTGF5ZXIpO1xuICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB6b29tVG9GZWF0dXJlRXh0ZW50KGZlYXR1cmUpIHtcbiAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgY29uc3Qgb2xGZWF0dXJlID0gdGhpcy5mb3JtYXQucmVhZEZlYXR1cmUoZmVhdHVyZSwge1xuICAgICAgICBkYXRhUHJvamVjdGlvbjogZmVhdHVyZS5wcm9qZWN0aW9uLFxuICAgICAgICBmZWF0dXJlUHJvamVjdGlvbjogdGhpcy5tYXAucHJvamVjdGlvblxuICAgICAgfSk7XG4gICAgICBtb3ZlVG9PbEZlYXR1cmVzKHRoaXMubWFwLCBbb2xGZWF0dXJlXSwgRmVhdHVyZU1vdGlvbi5ab29tKTtcbiAgICB9XG4gIH1cblxuICBwdXNoTGF5ZXIobGF5ZXIpIHtcbiAgICBmb3IgKGNvbnN0IGxheSBvZiB0aGlzLmFjdGl2ZUxheWVycykge1xuICAgICAgaWYgKGxheS5pZCA9PT0gbGF5ZXIuaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlTGF5ZXJzLnB1c2gobGF5ZXIpO1xuICB9XG59XG4iLCI8aWdvLXBhbmVsPlxuICA8aWdvLXNwYXRpYWwtZmlsdGVyLXR5cGVcbiAgICBbc3RvcmVdPVwic3BhdGlhbExpc3RTdG9yZVwiXG4gICAgW3NlbGVjdGVkUXVlcnlUeXBlXT1cInF1ZXJ5VHlwZVwiXG4gICAgW3pvbmVdPVwiem9uZVwiXG4gICAgW2xheWVyc109XCJhY3RpdmVMYXllcnNcIlxuICAgIChldmVudFR5cGUpPVwiZ2V0T3V0cHV0VHlwZSgkZXZlbnQpXCJcbiAgICAoZXZlbnRRdWVyeVR5cGUpPVwiZ2V0T3V0cHV0UXVlcnlUeXBlKCRldmVudClcIlxuICAgICh6b25lQ2hhbmdlKT1cIm9uWm9uZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAoem9uZVdpdGhCdWZmZXJDaGFuZ2UpPVwib25ab25lQ2hhbmdlKCRldmVudCwgdHJ1ZSlcIlxuICAgIChidWZmZXJDaGFuZ2UpPVwiYnVmZmVyID0gJGV2ZW50XCJcbiAgICAobWVhc3VyZVVuaXRDaGFuZ2UpPVwibWVhc3VyZVVuaXQgPSAkZXZlbnRcIj5cbiAgPC9pZ28tc3BhdGlhbC1maWx0ZXItdHlwZT5cblxuICA8aWdvLXNwYXRpYWwtZmlsdGVyLWl0ZW1cbiAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICBbcXVlcnlUeXBlXT1cInF1ZXJ5VHlwZVwiXG4gICAgW21hcF09XCJtYXBcIlxuICAgIFt6b25lXT1cInpvbmVcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtzdG9yZV09XCJzdG9yZVwiXG4gICAgW2xheWVyc109XCJhY3RpdmVMYXllcnNcIlxuICAgIFthbGxMYXllcnNdPVwibGF5ZXJzXCJcbiAgICBbdGhlbWF0aWNMZW5ndGhdPVwidGhlbWF0aWNMZW5ndGhcIlxuICAgIChyYWRpdXNFdmVudCk9XCJidWZmZXIgPSAkZXZlbnRcIlxuICAgIChidWZmZXJFdmVudCk9XCJidWZmZXIgPSAkZXZlbnRcIlxuICAgIChtZWFzdXJlVW5pdENoYW5nZSk9XCJtZWFzdXJlVW5pdCA9ICRldmVudFwiXG4gICAgKGZyZWVoYW5kQ29udHJvbCk9XCJmcmVlaGFuZERyYXdJc0FjdGl2ZSA9ICRldmVudFwiXG4gICAgKGRyYXdab25lRXZlbnQpPVwiem9uZSA9ICRldmVudFwiXG4gICAgKHpvbmVXaXRoQnVmZmVyQ2hhbmdlKT1cIm9uWm9uZUNoYW5nZSgkZXZlbnQsIHRydWUpXCJcbiAgICAoaXRlbVR5cGVDaGFuZ2UpPVwiaXRlbVR5cGUgPSAkZXZlbnRcIlxuICAgICh0aGVtYXRpY0NoYW5nZSk9XCJ0aGVtYXRpY3MgPSAkZXZlbnRcIlxuICAgICh0b2dnbGVTZWFyY2gpPVwiZ2V0T3V0cHV0VG9nZ2xlU2VhcmNoKClcIlxuICAgIChjbGVhckJ1dHRvbkV2ZW50KT1cImNsZWFyTWFwKClcIlxuICAgIChjbGVhclNlYXJjaEV2ZW50KT1cImdldE91dHB1dENsZWFyU2VhcmNoKClcIlxuICAgIChleHBvcnQpPVwiYWN0aXZhdGVFeHBvcnRUb29sKClcIlxuICAgIChvcGVuV29ya3NwYWNlKT1cImFjdGl2YXRlV29ya3NwYWNlKClcIlxuICAgIChlbnRpdHlDaGFuZ2UpPVwiYWN0aXZhdGVXb3Jrc3BhY2UoJGV2ZW50KVwiPlxuICA8L2lnby1zcGF0aWFsLWZpbHRlci1pdGVtPlxuPC9pZ28tcGFuZWw+XG5cbjxpZ28tcGFuZWw+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZlYXR1cmUkIHwgYXN5bmMgYXMgZmVhdHVyZVwiPlxuICAgIDxpZ28tZmVhdHVyZS1kZXRhaWxzIFtmZWF0dXJlXT1cImZlYXR1cmVcIj48L2lnby1mZWF0dXJlLWRldGFpbHM+XG4gIDwvbmctY29udGFpbmVyPlxuPC9pZ28tcGFuZWw+Il19