@igo2/integration 1.15.3 → 1.15.5

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 (214) hide show
  1. package/esm2020/igo2-integration.mjs +4 -4
  2. package/esm2020/lib/about/about-tool/about-tool.component.mjs +185 -185
  3. package/esm2020/lib/about/about-tool/index.mjs +2 -2
  4. package/esm2020/lib/about/about.module.mjs +55 -55
  5. package/esm2020/lib/about/index.mjs +2 -2
  6. package/esm2020/lib/analytics/analytics-listener.service.mjs +127 -127
  7. package/esm2020/lib/analytics/analytics.module.mjs +16 -16
  8. package/esm2020/lib/analytics/index.mjs +2 -2
  9. package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs +113 -113
  10. package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs +29 -29
  11. package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs +89 -89
  12. package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs +29 -29
  13. package/esm2020/lib/catalog/catalog.module.mjs +24 -24
  14. package/esm2020/lib/catalog/catalog.state.mjs +54 -54
  15. package/esm2020/lib/catalog/index.mjs +6 -6
  16. package/esm2020/lib/context/context-editor-tool/context-editor-tool.component.mjs +34 -34
  17. package/esm2020/lib/context/context-manager-tool/context-manager-tool.component.mjs +44 -44
  18. package/esm2020/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs +25 -25
  19. package/esm2020/lib/context/context-share-tool/context-share-tool.component.mjs +34 -34
  20. package/esm2020/lib/context/context.module.mjs +39 -39
  21. package/esm2020/lib/context/context.state.mjs +88 -88
  22. package/esm2020/lib/context/index.mjs +6 -6
  23. package/esm2020/lib/directions/directions-tool/directions-tool.component.mjs +84 -84
  24. package/esm2020/lib/directions/directions-tool/index.mjs +2 -2
  25. package/esm2020/lib/directions/directions.module.mjs +26 -26
  26. package/esm2020/lib/directions/directions.state.mjs +64 -64
  27. package/esm2020/lib/directions/index.mjs +3 -3
  28. package/esm2020/lib/draw/draw.module.mjs +21 -21
  29. package/esm2020/lib/draw/draw.state.mjs +39 -39
  30. package/esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs +72 -72
  31. package/esm2020/lib/draw/index.mjs +3 -3
  32. package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs +10 -10
  33. package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs +44 -44
  34. package/esm2020/lib/filter/active-ogc-filter-tool/index.mjs +2 -2
  35. package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs +10 -10
  36. package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs +44 -44
  37. package/esm2020/lib/filter/active-time-filter-tool/index.mjs +2 -2
  38. package/esm2020/lib/filter/filter.module.mjs +51 -51
  39. package/esm2020/lib/filter/index.mjs +6 -6
  40. package/esm2020/lib/filter/ogc-filter-tool/index.mjs +2 -2
  41. package/esm2020/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs +25 -25
  42. package/esm2020/lib/filter/spatial-filter-tool/index.mjs +2 -2
  43. package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +535 -535
  44. package/esm2020/lib/filter/time-filter-tool/index.mjs +2 -2
  45. package/esm2020/lib/filter/time-filter-tool/time-filter-tool.component.mjs +25 -25
  46. package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +141 -141
  47. package/esm2020/lib/import-export/import-export-tool/index.mjs +2 -2
  48. package/esm2020/lib/import-export/import-export.module.mjs +51 -51
  49. package/esm2020/lib/import-export/import-export.state.mjs +41 -41
  50. package/esm2020/lib/import-export/index.mjs +3 -3
  51. package/esm2020/lib/integration.module.mjs +72 -72
  52. package/esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +472 -472
  53. package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +89 -89
  54. package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +218 -218
  55. package/esm2020/lib/map/advanced-map-tool/index.mjs +2 -2
  56. package/esm2020/lib/map/index.mjs +9 -9
  57. package/esm2020/lib/map/layer-list-tool.state.mjs +42 -42
  58. package/esm2020/lib/map/map-details-tool/index.mjs +2 -2
  59. package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +256 -256
  60. package/esm2020/lib/map/map-legend/index.mjs +2 -2
  61. package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +275 -275
  62. package/esm2020/lib/map/map-proximity-tool/index.mjs +2 -2
  63. package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +203 -203
  64. package/esm2020/lib/map/map-proximity.state.mjs +167 -167
  65. package/esm2020/lib/map/map-tool/index.mjs +2 -2
  66. package/esm2020/lib/map/map-tool/map-tool.component.mjs +130 -130
  67. package/esm2020/lib/map/map-tools/index.mjs +2 -2
  68. package/esm2020/lib/map/map-tools/map-tools.component.mjs +495 -495
  69. package/esm2020/lib/map/map.module.mjs +144 -144
  70. package/esm2020/lib/map/map.state.mjs +47 -47
  71. package/esm2020/lib/measure/index.mjs +4 -4
  72. package/esm2020/lib/measure/measure.module.mjs +20 -20
  73. package/esm2020/lib/measure/measure.state.mjs +35 -35
  74. package/esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs +45 -45
  75. package/esm2020/lib/measure/measurer-tool/measurer-tool.module.mjs +25 -25
  76. package/esm2020/lib/print/index.mjs +2 -2
  77. package/esm2020/lib/print/print-tool/index.mjs +2 -2
  78. package/esm2020/lib/print/print-tool/print-tool.component.mjs +33 -33
  79. package/esm2020/lib/print/print.module.mjs +26 -26
  80. package/esm2020/lib/search/index.mjs +7 -7
  81. package/esm2020/lib/search/query.state.mjs +42 -34
  82. package/esm2020/lib/search/search-bar/search-bar-binding.directive.mjs +61 -61
  83. package/esm2020/lib/search/search-bar/search-bar.module.mjs +22 -22
  84. package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +593 -593
  85. package/esm2020/lib/search/search-results-tool/search-results-tool.module.mjs +65 -65
  86. package/esm2020/lib/search/search.module.mjs +24 -24
  87. package/esm2020/lib/search/search.state.mjs +132 -132
  88. package/esm2020/lib/storage/index.mjs +2 -2
  89. package/esm2020/lib/storage/storage.module.mjs +16 -16
  90. package/esm2020/lib/storage/storage.state.mjs +23 -23
  91. package/esm2020/lib/tool/index.mjs +2 -2
  92. package/esm2020/lib/tool/tool.module.mjs +16 -16
  93. package/esm2020/lib/tool/tool.state.mjs +52 -52
  94. package/esm2020/lib/workspace/index.mjs +4 -4
  95. package/esm2020/lib/workspace/shared/edition-actions.service.mjs +156 -156
  96. package/esm2020/lib/workspace/shared/feature-actions.service.mjs +144 -144
  97. package/esm2020/lib/workspace/shared/index.mjs +3 -3
  98. package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +158 -158
  99. package/esm2020/lib/workspace/shared/workspace.utils.mjs +7 -7
  100. package/esm2020/lib/workspace/workspace-button/index.mjs +2 -2
  101. package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +69 -69
  102. package/esm2020/lib/workspace/workspace.module.mjs +37 -37
  103. package/esm2020/lib/workspace/workspace.state.mjs +188 -188
  104. package/esm2020/public_api.mjs +35 -35
  105. package/fesm2015/igo2-integration.mjs +6558 -6553
  106. package/fesm2015/igo2-integration.mjs.map +1 -1
  107. package/fesm2020/igo2-integration.mjs +6114 -6109
  108. package/fesm2020/igo2-integration.mjs.map +1 -1
  109. package/index.d.ts +5 -5
  110. package/lib/about/about-tool/about-tool.component.d.ts +34 -34
  111. package/lib/about/about-tool/index.d.ts +1 -1
  112. package/lib/about/about.module.d.ts +16 -16
  113. package/lib/about/index.d.ts +1 -1
  114. package/lib/analytics/analytics-listener.service.d.ts +33 -33
  115. package/lib/analytics/analytics.module.d.ts +6 -6
  116. package/lib/analytics/index.d.ts +1 -1
  117. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +57 -57
  118. package/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.d.ts +12 -12
  119. package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +50 -50
  120. package/lib/catalog/catalog-library-tool/catalog-library-tool.module.d.ts +12 -12
  121. package/lib/catalog/catalog.module.d.ts +8 -8
  122. package/lib/catalog/catalog.state.d.ts +37 -37
  123. package/lib/catalog/index.d.ts +5 -5
  124. package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +9 -9
  125. package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +15 -15
  126. package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +5 -5
  127. package/lib/context/context-share-tool/context-share-tool.component.d.ts +13 -13
  128. package/lib/context/context.module.d.ts +11 -11
  129. package/lib/context/context.state.d.ts +37 -37
  130. package/lib/context/index.d.ts +5 -5
  131. package/lib/directions/directions-tool/directions-tool.component.d.ts +54 -54
  132. package/lib/directions/directions-tool/index.d.ts +1 -1
  133. package/lib/directions/directions.module.d.ts +10 -10
  134. package/lib/directions/directions.state.d.ts +28 -28
  135. package/lib/directions/index.d.ts +2 -2
  136. package/lib/draw/draw.module.d.ts +8 -8
  137. package/lib/draw/draw.state.d.ts +16 -16
  138. package/lib/draw/drawing-tool/drawing-tool.component.d.ts +31 -31
  139. package/lib/draw/index.d.ts +2 -2
  140. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.d.ts +2 -2
  141. package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +12 -12
  142. package/lib/filter/active-ogc-filter-tool/index.d.ts +1 -1
  143. package/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.d.ts +2 -2
  144. package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +12 -12
  145. package/lib/filter/active-time-filter-tool/index.d.ts +1 -1
  146. package/lib/filter/filter.module.d.ts +15 -15
  147. package/lib/filter/index.d.ts +5 -5
  148. package/lib/filter/ogc-filter-tool/index.d.ts +1 -1
  149. package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +6 -6
  150. package/lib/filter/spatial-filter-tool/index.d.ts +1 -1
  151. package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +82 -82
  152. package/lib/filter/time-filter-tool/index.d.ts +1 -1
  153. package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +6 -6
  154. package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +33 -33
  155. package/lib/import-export/import-export-tool/index.d.ts +1 -1
  156. package/lib/import-export/import-export.module.d.ts +15 -15
  157. package/lib/import-export/import-export.state.d.ts +24 -24
  158. package/lib/import-export/index.d.ts +2 -2
  159. package/lib/integration.module.d.ts +20 -20
  160. package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +97 -97
  161. package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +12 -12
  162. package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +65 -65
  163. package/lib/map/advanced-map-tool/index.d.ts +1 -1
  164. package/lib/map/index.d.ts +8 -8
  165. package/lib/map/layer-list-tool.state.d.ts +19 -19
  166. package/lib/map/map-details-tool/index.d.ts +1 -1
  167. package/lib/map/map-details-tool/map-details-tool.component.d.ts +38 -38
  168. package/lib/map/map-legend/index.d.ts +1 -1
  169. package/lib/map/map-legend/map-legend-tool.component.d.ts +40 -40
  170. package/lib/map/map-proximity-tool/index.d.ts +1 -1
  171. package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +36 -36
  172. package/lib/map/map-proximity.state.d.ts +31 -31
  173. package/lib/map/map-tool/index.d.ts +1 -1
  174. package/lib/map/map-tool/map-tool.component.d.ts +27 -27
  175. package/lib/map/map-tools/index.d.ts +1 -1
  176. package/lib/map/map-tools/map-tools.component.d.ts +66 -66
  177. package/lib/map/map.module.d.ts +38 -38
  178. package/lib/map/map.state.d.ts +24 -24
  179. package/lib/measure/index.d.ts +3 -3
  180. package/lib/measure/measure.module.d.ts +7 -7
  181. package/lib/measure/measure.state.d.ts +16 -16
  182. package/lib/measure/measurer-tool/measurer-tool.component.d.ts +24 -24
  183. package/lib/measure/measurer-tool/measurer-tool.module.d.ts +11 -11
  184. package/lib/print/index.d.ts +1 -1
  185. package/lib/print/print-tool/index.d.ts +1 -1
  186. package/lib/print/print-tool/print-tool.component.d.ts +10 -10
  187. package/lib/print/print.module.d.ts +10 -10
  188. package/lib/search/index.d.ts +6 -6
  189. package/lib/search/query.state.d.ts +24 -20
  190. package/lib/search/search-bar/search-bar-binding.directive.d.ts +20 -20
  191. package/lib/search/search-bar/search-bar.module.d.ts +11 -11
  192. package/lib/search/search-results-tool/search-results-tool.component.d.ts +100 -100
  193. package/lib/search/search-results-tool/search-results-tool.module.d.ts +18 -18
  194. package/lib/search/search.module.d.ts +8 -8
  195. package/lib/search/search.state.d.ts +60 -60
  196. package/lib/storage/index.d.ts +1 -1
  197. package/lib/storage/storage.module.d.ts +6 -6
  198. package/lib/storage/storage.state.d.ts +12 -12
  199. package/lib/tool/index.d.ts +1 -1
  200. package/lib/tool/tool.module.d.ts +6 -6
  201. package/lib/tool/tool.state.d.ts +22 -22
  202. package/lib/workspace/index.d.ts +3 -3
  203. package/lib/workspace/shared/edition-actions.service.d.ts +26 -26
  204. package/lib/workspace/shared/feature-actions.service.d.ts +25 -25
  205. package/lib/workspace/shared/index.d.ts +2 -2
  206. package/lib/workspace/shared/wfs-actions.service.d.ts +27 -27
  207. package/lib/workspace/shared/workspace.utils.d.ts +2 -2
  208. package/lib/workspace/workspace-button/index.d.ts +1 -1
  209. package/lib/workspace/workspace-button/workspace-button.component.d.ts +21 -21
  210. package/lib/workspace/workspace.module.d.ts +12 -12
  211. package/lib/workspace/workspace.state.d.ts +63 -63
  212. package/ngcc.config.js +3 -3
  213. package/package.json +3 -3
  214. package/public_api.d.ts +31 -31
@@ -1,472 +1,472 @@
1
- import { Component, Input } from '@angular/core';
2
- import { formatScale } from '@igo2/geo';
3
- import { Clipboard } from '@igo2/utils';
4
- import { StorageScope } from '@igo2/core';
5
- import { BehaviorSubject, combineLatest } from 'rxjs';
6
- import { Validators } from '@angular/forms';
7
- import { debounceTime } from 'rxjs/operators';
8
- import { zoneMtm, zoneUtm, computeProjectionsConstraints } from '@igo2/geo';
9
- import * as olproj from 'ol/proj';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../../map.state";
12
- import * as i2 from "@igo2/core";
13
- import * as i3 from "@angular/forms";
14
- import * as i4 from "@angular/material/form-field";
15
- import * as i5 from "@angular/material/select";
16
- import * as i6 from "@angular/material/core";
17
- import * as i7 from "@angular/material/input";
18
- import * as i8 from "@angular/common";
19
- import * as i9 from "@angular/material/icon";
20
- import * as i10 from "@angular/material/slide-toggle";
21
- import * as i11 from "@angular/material/button";
22
- import * as i12 from "@ngx-translate/core";
23
- function AdvancedCoordinatesComponent_mat_form_field_2_Template(rf, ctx) { if (rf & 1) {
24
- i0.ɵɵelementStart(0, "mat-form-field", 14);
25
- i0.ɵɵelement(1, "textarea", 15, 16);
26
- i0.ɵɵpipe(3, "translate");
27
- i0.ɵɵelementEnd();
28
- } if (rf & 2) {
29
- const ctx_r0 = i0.ɵɵnextContext();
30
- i0.ɵɵadvance(1);
31
- i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lon"))("value", ctx_r0.coordinates[0]);
32
- } }
33
- function AdvancedCoordinatesComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
34
- i0.ɵɵelementStart(0, "mat-form-field", 14);
35
- i0.ɵɵelement(1, "textarea", 15, 16);
36
- i0.ɵɵpipe(3, "translate");
37
- i0.ɵɵelementEnd();
38
- } if (rf & 2) {
39
- const ctx_r2 = i0.ɵɵnextContext();
40
- i0.ɵɵadvance(1);
41
- i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.est"))("value", ctx_r2.coordinates[0]);
42
- } }
43
- function AdvancedCoordinatesComponent_mat_form_field_5_Template(rf, ctx) { if (rf & 1) {
44
- i0.ɵɵelementStart(0, "mat-form-field", 17);
45
- i0.ɵɵelement(1, "textarea", 15, 16);
46
- i0.ɵɵpipe(3, "translate");
47
- i0.ɵɵelementEnd();
48
- } if (rf & 2) {
49
- const ctx_r3 = i0.ɵɵnextContext();
50
- i0.ɵɵadvance(1);
51
- i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lat"))("value", ctx_r3.coordinates[1]);
52
- } }
53
- function AdvancedCoordinatesComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
54
- i0.ɵɵelementStart(0, "mat-form-field", 17);
55
- i0.ɵɵelement(1, "textarea", 15, 16);
56
- i0.ɵɵpipe(3, "translate");
57
- i0.ɵɵelementEnd();
58
- } if (rf & 2) {
59
- const ctx_r5 = i0.ɵɵnextContext();
60
- i0.ɵɵadvance(1);
61
- i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.nord"))("value", ctx_r5.coordinates[1]);
62
- } }
63
- function AdvancedCoordinatesComponent_mat_option_17_Template(rf, ctx) { if (rf & 1) {
64
- i0.ɵɵelementStart(0, "mat-option", 18);
65
- i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_mat_option_17_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
66
- i0.ɵɵtext(1);
67
- i0.ɵɵelementEnd();
68
- } if (rf & 2) {
69
- const projection_r11 = ctx.$implicit;
70
- i0.ɵɵproperty("value", projection_r11);
71
- i0.ɵɵadvance(1);
72
- i0.ɵɵtextInterpolate1(" ", projection_r11.translatedValue || projection_r11.alias, " ");
73
- } }
74
- /**
75
- * Tool to display the coordinates and a cursor of the center of the map
76
- */
77
- export class AdvancedCoordinatesComponent {
78
- constructor(mapState, languageService, messageService, cdRef, storageService, config, formBuilder) {
79
- this.mapState = mapState;
80
- this.languageService = languageService;
81
- this.messageService = messageService;
82
- this.cdRef = cdRef;
83
- this.storageService = storageService;
84
- this.config = config;
85
- this.formBuilder = formBuilder;
86
- this.formattedScale$ = new BehaviorSubject('');
87
- this.projections$ = new BehaviorSubject([]);
88
- this.center = this.storageService.get('centerToggle');
89
- this.inMtmZone = true;
90
- this.inLambert2 = { 32198: true, 3798: true };
91
- this._projectionsLimitations = {};
92
- this.defaultProj = {
93
- translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
94
- translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
95
- };
96
- this.currentZones = { utm: undefined, mtm: undefined };
97
- this.units = true;
98
- this.computeProjections();
99
- this.buildForm();
100
- }
101
- get map() {
102
- return this.mapState.map;
103
- }
104
- get inputProj() {
105
- return this.form.get('inputProj').value;
106
- }
107
- set inputProj(value) {
108
- this.form.patchValue({ inputProj: value });
109
- }
110
- get projectionsLimitations() {
111
- return this._projectionsLimitations || {};
112
- }
113
- set projectionsLimitations(value) {
114
- this._projectionsLimitations = value;
115
- }
116
- /**
117
- * Listen a state of the map, a state of a form, update the coordinates
118
- */
119
- ngOnInit() {
120
- this.mapState$$ = combineLatest([this.map.viewController.state$.pipe(debounceTime(50)), this.form.valueChanges])
121
- .subscribe(() => {
122
- this.setScaleValue(this.map);
123
- this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
124
- const currentMtmZone = zoneMtm(this.currentCenterDefaultProj[0]);
125
- const currentUtmZone = zoneUtm(this.currentCenterDefaultProj[0]);
126
- if (!this.inMtmZone && currentMtmZone !== this.currentZones.mtm) {
127
- this.back2quebec();
128
- }
129
- let zoneChange = false;
130
- if (currentMtmZone !== this.currentZones.mtm) {
131
- this.currentZones.mtm = currentMtmZone;
132
- zoneChange = true;
133
- }
134
- if (currentUtmZone !== this.currentZones.utm) {
135
- this.currentZones.utm = currentUtmZone;
136
- zoneChange = true;
137
- }
138
- if (zoneChange) {
139
- this.updateProjectionsZoneChange();
140
- }
141
- this.checkLambert(this.currentCenterDefaultProj);
142
- this.coordinates = this.getCoordinates();
143
- this.cdRef.detectChanges();
144
- this.storageService.set('currentProjection', this.inputProj, StorageScope.SESSION);
145
- });
146
- const tempInputProj = this.storageService.get('currentProjection');
147
- this.inputProj = this.projections$.value[0];
148
- if (tempInputProj !== null) {
149
- const pos = this.positionInList(tempInputProj);
150
- this.inputProj = this.projections$.value[pos];
151
- this.updateZoneMtmUtm();
152
- }
153
- this.map.mapCenter$.next(this.center);
154
- this.coordinates = this.getCoordinates();
155
- this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
156
- }
157
- ngOnDestroy() {
158
- this.map.mapCenter$.next(false);
159
- this.mapState$$.unsubscribe();
160
- }
161
- setScaleValue(map) {
162
- this.formattedScale$.next(': ~ 1 / ' + formatScale(map.viewController.getScale()));
163
- }
164
- /**
165
- * Coordinates of the center of the map on the appropriate systeme of coordinates
166
- * @returns Array of two numbers
167
- */
168
- getCoordinates() {
169
- this.currentZones.mtm = zoneMtm(this.currentCenterDefaultProj[0]);
170
- this.currentZones.utm = zoneUtm(this.currentCenterDefaultProj[0]);
171
- let coord;
172
- const code = this.inputProj.code;
173
- let decimal = 2;
174
- if (code.includes('EPSG:4326') || code.includes('EPSG:4269')) {
175
- decimal = 5;
176
- }
177
- this.units = (code === 'EPSG:4326' || code === 'EPSG:4269');
178
- coord = this.map.viewController.getCenter(code).map(c => c.toFixed(decimal));
179
- return coord;
180
- }
181
- /**
182
- * Copy the coordinates to a clipboard
183
- */
184
- copyTextToClipboard() {
185
- const successful = Clipboard.copy(this.coordinates.toString());
186
- if (successful) {
187
- this.messageService.success('igo.integration.advanced-map-tool.advanced-coordinates.copyMsg', 'igo.integration.advanced-map-tool.advanced-coordinates.copyTitle');
188
- }
189
- }
190
- /**
191
- * Display a cursor on the center of the map
192
- */
193
- displayCenter(toggle) {
194
- this.center = toggle;
195
- this.map.mapCenter$.next(toggle);
196
- this.storageService.set('centerToggle', toggle, StorageScope.SESSION);
197
- }
198
- /**
199
- * Builder of the form
200
- */
201
- buildForm() {
202
- this.form = this.formBuilder.group({
203
- inputProj: ['', [Validators.required]]
204
- });
205
- }
206
- /**
207
- * Update list of projections after changing of the state of the map
208
- */
209
- updateProjectionsZoneChange() {
210
- let modifiedProj = this.projections$.value;
211
- const translate = this.languageService.translate;
212
- modifiedProj.map(p => {
213
- if (p.translateKey === 'mtm') {
214
- const zone = zoneMtm(this.currentCenterDefaultProj[0]);
215
- if (zone) {
216
- const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
217
- p.alias = `MTM ${zone}`;
218
- p.code = code;
219
- p.zone = `${zone}`;
220
- p.translatedValue = translate.instant('igo.geo.importExportForm.projections.mtm', p);
221
- }
222
- else {
223
- p.alias = '';
224
- this.inMtmZone = false;
225
- if (this.inputProj.translateKey === 'mtm') {
226
- this.inputProj = this.projections$.value[0];
227
- }
228
- }
229
- }
230
- if (p.translateKey === 'utm') {
231
- const zone = zoneUtm(this.currentCenterDefaultProj[0]);
232
- const code = `EPSG:326${zone}`;
233
- p.alias = `UTM ${zone}`;
234
- p.code = code;
235
- p.zone = `${zone}`;
236
- p.translatedValue = translate.instant('igo.geo.importExportForm.projections.utm', p);
237
- }
238
- });
239
- modifiedProj = modifiedProj.filter(p => p.alias !== '');
240
- this.projections$.next(modifiedProj);
241
- }
242
- /**
243
- * Create a list of currents projections
244
- */
245
- computeProjections() {
246
- this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
247
- const projections = [];
248
- if (!this.currentCenterDefaultProj) {
249
- this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
250
- }
251
- const translate = this.languageService.translate;
252
- if (this.projectionsConstraints.wgs84) {
253
- projections.push({
254
- translatedValue: translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
255
- translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
256
- });
257
- }
258
- if (this.projectionsConstraints.nad83) {
259
- projections.push({
260
- translatedValue: translate.instant('igo.geo.importExportForm.projections.nad83', { code: 'EPSG:4269' }),
261
- translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4269', zone: ''
262
- });
263
- }
264
- if (this.projectionsConstraints.webMercator) {
265
- projections.push({
266
- translatedValue: translate.instant('igo.geo.importExportForm.projections.webMercator', { code: 'EPSG:3857' }),
267
- translateKey: 'webMercator', alias: 'Web Mercator', code: 'EPSG:3857', zone: ''
268
- });
269
- }
270
- if (this.projectionsConstraints.mtm) {
271
- // Quebec
272
- const zone = zoneMtm(this.currentCenterDefaultProj[0]);
273
- if (zone) {
274
- this.inMtmZone = true;
275
- const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
276
- projections.splice(3, 0, {
277
- translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
278
- translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
279
- });
280
- }
281
- else {
282
- this.inMtmZone = false;
283
- }
284
- }
285
- if (this.projectionsConstraints.utm) {
286
- const order = this.inMtmZone ? 4 : 3;
287
- const zone = zoneUtm(this.currentCenterDefaultProj[0]);
288
- const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
289
- projections.splice(order, 0, {
290
- translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone }),
291
- translateKey: 'utm', alias: `UTM ${zone}`, code, zone: `${zone}`
292
- });
293
- }
294
- let configProjection = [];
295
- if (this.projectionsConstraints.projFromConfig) {
296
- configProjection = this.config.getConfig('projections') || [];
297
- }
298
- this.projections$.next(projections.concat(configProjection));
299
- }
300
- /**
301
- * Push the MTM in the array of systeme of coordinates
302
- * @param projections Array of the InputProjections
303
- */
304
- pushMtm(projections) {
305
- if (this.projectionsConstraints.mtm) {
306
- const zone = zoneMtm(this.currentCenterDefaultProj[0]);
307
- const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
308
- projections.splice(3, 0, {
309
- translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
310
- translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
311
- });
312
- }
313
- }
314
- /**
315
- * Updates the list of systems of coordinates for territory of Quebec
316
- * push MTM and UTM in the Array
317
- */
318
- back2quebec() {
319
- const projections = this.projections$.value;
320
- this.pushMtm(projections);
321
- this.inMtmZone = true;
322
- }
323
- /**
324
- * Update the numbers of the zones when application is restarted
325
- */
326
- updateZoneMtmUtm() {
327
- if (this.inputProj.translateKey === 'mtm') {
328
- const zone = zoneMtm(this.currentCenterDefaultProj[0]);
329
- this.inputProj.alias = `MTM ${zone}`;
330
- const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
331
- this.inputProj.code = code;
332
- this.inputProj.zone = `${zone}`;
333
- this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone });
334
- }
335
- if (this.inputProj.translateKey === 'utm') {
336
- const zone = zoneUtm(this.currentCenterDefaultProj[0]);
337
- this.inputProj.alias = `UTM ${zone}`;
338
- const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
339
- this.inputProj.code = code;
340
- this.inputProj.zone = `${zone}`;
341
- this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone });
342
- }
343
- }
344
- /**
345
- * Compute the position of a current projection in a list. 0 if the projection is not in the list
346
- * @param translateKey string, translate key of a projection
347
- * @returns numeric, position of an element in the array
348
- */
349
- positionInList(tempInputProj) {
350
- const tk = tempInputProj.translateKey;
351
- const alias = tempInputProj.alias;
352
- let position; // = undefined;
353
- let iter = 0;
354
- this.projections$.value.map((projection) => {
355
- if (tk) {
356
- if (tk === projection.translateKey) {
357
- position = iter;
358
- }
359
- }
360
- else if (alias === projection.alias) {
361
- position = iter;
362
- }
363
- iter++;
364
- });
365
- position = position ? position : 0;
366
- return position;
367
- }
368
- /**
369
- * Change the list of projections depending on the projections of Lambert
370
- * @param coordinates An array of numbers, longitude and latitude
371
- */
372
- checkLambert(coordinates) {
373
- const lambertProjections = this.config.getConfig('projections');
374
- lambertProjections.forEach(projection => {
375
- let modifiedProj = this.projections$.value;
376
- const extent = projection.extent;
377
- const code = projection.code.match(/\d+/);
378
- const currentExtentWGS = olproj.transformExtent(extent, projection.code, this.defaultProj.code);
379
- if (coordinates[0] < currentExtentWGS[0] || coordinates[0] > currentExtentWGS[2] ||
380
- coordinates[1] < currentExtentWGS[1] || coordinates[1] > currentExtentWGS[3]) {
381
- this.inLambert2[code] = false;
382
- if (this.inputProj.alias === projection.alias) {
383
- this.inputProj = this.projections$.value[0];
384
- }
385
- modifiedProj = modifiedProj.filter(p => p.alias !== projection.alias);
386
- this.projections$.next(modifiedProj);
387
- }
388
- else {
389
- if (!this.inLambert2[code]) {
390
- this.projections$.next(modifiedProj.concat(projection));
391
- this.inLambert2[code] = true;
392
- }
393
- }
394
- });
395
- }
396
- }
397
- AdvancedCoordinatesComponent.ɵfac = function AdvancedCoordinatesComponent_Factory(t) { return new (t || AdvancedCoordinatesComponent)(i0.ɵɵdirectiveInject(i1.MapState), i0.ɵɵdirectiveInject(i2.LanguageService), i0.ɵɵdirectiveInject(i2.MessageService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.StorageService), i0.ɵɵdirectiveInject(i2.ConfigService), i0.ɵɵdirectiveInject(i3.UntypedFormBuilder)); };
398
- AdvancedCoordinatesComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AdvancedCoordinatesComponent, selectors: [["igo-advanced-coordinates"]], inputs: { projectionsLimitations: "projectionsLimitations" }, decls: 33, vars: 37, consts: [[1, "advanced-coordinates__coordinates-container"], [1, "advanced-coordinates__coordinates-container__inner"], ["class", "coordinates", 4, "ngIf", "ngIfElse"], ["elseBlock", ""], ["class", "coordinates2", 4, "ngIf", "ngIfElse"], ["elseBlock2", ""], ["mat-icon-button", "", 1, "igo-form-button-group", "advanced-coordinates__copy-coordinates", 3, "click"], ["svgIcon", "content-copy"], [1, "igo-form", "advanced-coordinates__form", 3, "formGroup"], [1, "igo-input-container"], [3, "value", "valueChange"], ["matTooltipShowDelay", "500", 3, "value", "click", 4, "ngFor", "ngForOf"], [1, "center-toggle", "mat-typography", 3, "checked", "labelPosition", "change"], [1, "igo-zoom", "mat-typography"], [1, "coordinates"], ["matInput", "", "readonly", "", "rows", "1", 3, "placeholder", "value"], ["textArea", ""], [1, "coordinates2"], ["matTooltipShowDelay", "500", 3, "value", "click"]], template: function AdvancedCoordinatesComponent_Template(rf, ctx) { if (rf & 1) {
399
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
400
- i0.ɵɵtemplate(2, AdvancedCoordinatesComponent_mat_form_field_2_Template, 4, 4, "mat-form-field", 2);
401
- i0.ɵɵtemplate(3, AdvancedCoordinatesComponent_ng_template_3_Template, 4, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
402
- i0.ɵɵtemplate(5, AdvancedCoordinatesComponent_mat_form_field_5_Template, 4, 4, "mat-form-field", 4);
403
- i0.ɵɵtemplate(6, AdvancedCoordinatesComponent_ng_template_6_Template, 4, 4, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
404
- i0.ɵɵelementEnd();
405
- i0.ɵɵelementStart(8, "button", 6);
406
- i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_Template_button_click_8_listener() { return ctx.copyTextToClipboard(); });
407
- i0.ɵɵpipe(9, "translate");
408
- i0.ɵɵelement(10, "mat-icon", 7);
409
- i0.ɵɵelementEnd()();
410
- i0.ɵɵelementStart(11, "form", 8)(12, "mat-form-field", 9)(13, "mat-label");
411
- i0.ɵɵtext(14);
412
- i0.ɵɵpipe(15, "translate");
413
- i0.ɵɵelementEnd();
414
- i0.ɵɵelementStart(16, "mat-select", 10);
415
- i0.ɵɵlistener("valueChange", function AdvancedCoordinatesComponent_Template_mat_select_valueChange_16_listener($event) { return ctx.inputProj = $event; });
416
- i0.ɵɵtemplate(17, AdvancedCoordinatesComponent_mat_option_17_Template, 2, 2, "mat-option", 11);
417
- i0.ɵɵpipe(18, "async");
418
- i0.ɵɵelementEnd()();
419
- i0.ɵɵelementStart(19, "mat-slide-toggle", 12);
420
- i0.ɵɵlistener("change", function AdvancedCoordinatesComponent_Template_mat_slide_toggle_change_19_listener($event) { return ctx.displayCenter($event.checked); });
421
- i0.ɵɵtext(20);
422
- i0.ɵɵpipe(21, "translate");
423
- i0.ɵɵelementEnd()();
424
- i0.ɵɵelementStart(22, "p", 13);
425
- i0.ɵɵtext(23);
426
- i0.ɵɵpipe(24, "translate");
427
- i0.ɵɵelementEnd();
428
- i0.ɵɵelementStart(25, "p", 13);
429
- i0.ɵɵtext(26);
430
- i0.ɵɵpipe(27, "translate");
431
- i0.ɵɵpipe(28, "async");
432
- i0.ɵɵelementEnd();
433
- i0.ɵɵelementStart(29, "p", 13);
434
- i0.ɵɵtext(30);
435
- i0.ɵɵpipe(31, "translate");
436
- i0.ɵɵpipe(32, "number");
437
- i0.ɵɵelementEnd();
438
- } if (rf & 2) {
439
- const _r1 = i0.ɵɵreference(4);
440
- const _r4 = i0.ɵɵreference(7);
441
- i0.ɵɵadvance(2);
442
- i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r1);
443
- i0.ɵɵadvance(3);
444
- i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r4);
445
- i0.ɵɵadvance(3);
446
- i0.ɵɵattribute("aria-label", i0.ɵɵpipeBind1(9, 18, "igo.integration.advanced-map-tool.advanced-coordinates.copy"));
447
- i0.ɵɵadvance(3);
448
- i0.ɵɵproperty("formGroup", ctx.form);
449
- i0.ɵɵadvance(3);
450
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(15, 20, "igo.integration.advanced-map-tool.advanced-coordinates.coordSystem"));
451
- i0.ɵɵadvance(2);
452
- i0.ɵɵproperty("value", ctx.inputProj);
453
- i0.ɵɵadvance(1);
454
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(18, 22, ctx.projections$));
455
- i0.ɵɵadvance(2);
456
- i0.ɵɵproperty("checked", ctx.center)("labelPosition", "before");
457
- i0.ɵɵadvance(1);
458
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 24, "igo.integration.advanced-map-tool.advanced-coordinates.center"), " ");
459
- i0.ɵɵadvance(3);
460
- i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(24, 26, "igo.integration.advanced-map-tool.advanced-coordinates.zoom"), " ", ctx.map.viewController.getZoom(), "");
461
- i0.ɵɵadvance(3);
462
- i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(27, 28, "igo.integration.advanced-map-tool.advanced-coordinates.scale"), " ", i0.ɵɵpipeBind1(28, 30, ctx.formattedScale$), "");
463
- i0.ɵɵadvance(4);
464
- i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(31, 32, "igo.integration.advanced-map-tool.advanced-coordinates.resolution"), " ", i0.ɵɵpipeBind2(32, 34, ctx.map.viewController.getResolution(), "1.0-0"), "");
465
- } }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatusGroup, i3.FormGroupDirective, i4.MatFormField, i4.MatLabel, i5.MatSelect, i6.MatOption, i7.MatInput, i8.NgForOf, i8.NgIf, i9.MatIcon, i10.MatSlideToggle, i11.MatButton, i8.AsyncPipe, i8.DecimalPipe, i12.TranslatePipe], styles: ["textarea[_ngcontent-%COMP%]{resize:none}mat-form-field[_ngcontent-%COMP%]{padding:10px 15px}mat-form-field.coordinates2[_ngcontent-%COMP%]{padding:0 10px 0 3px}mat-form-field.igo-input-container[_ngcontent-%COMP%]{width:100%;padding:0 15px}.igo-form-button-group[_ngcontent-%COMP%]{padding:0 10px;margin:0 10px}.igo-zoom[_ngcontent-%COMP%]{padding:0 15px}.advanced-coordinates__coordinates-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center}.advanced-coordinates__coordinates-container__inner[_ngcontent-%COMP%]{flex:1 1 0}.advanced-coordinates__coordinates-container__inner[_ngcontent-%COMP%] .mat-form-field[_ngcontent-%COMP%]{width:50%}.advanced-coordinates__form[_ngcontent-%COMP%] .mat-slide-toggle{padding:10px 15px 35px;width:100%}.advanced-coordinates__form[_ngcontent-%COMP%] .mat-slide-toggle-content{width:100%}"] });
466
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AdvancedCoordinatesComponent, [{
467
- type: Component,
468
- args: [{ selector: 'igo-advanced-coordinates', template: "<div class=\"advanced-coordinates__coordinates-container\">\r\n <div class=\"advanced-coordinates__coordinates-container__inner\">\r\n <mat-form-field *ngIf=\"units; else elseBlock\" class=\"coordinates\">\r\n <textarea #textArea matInput readonly rows=\"1\"\r\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lon' | translate\"\r\n [value]=\"coordinates[0]\"></textarea>\r\n </mat-form-field>\r\n <ng-template #elseBlock >\r\n <mat-form-field class=\"coordinates\">\r\n <textarea #textArea matInput readonly rows=\"1\"\r\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.est' | translate\"\r\n [value]=\"coordinates[0]\"></textarea></mat-form-field>\r\n </ng-template>\r\n\r\n <mat-form-field *ngIf=\"units; else elseBlock2\" class=\"coordinates2\">\r\n <textarea #textArea matInput readonly rows=\"1\"\r\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lat' | translate\"\r\n [value]=\"coordinates[1]\"></textarea>\r\n </mat-form-field>\r\n <ng-template #elseBlock2 >\r\n <mat-form-field class=\"coordinates2\"> <textarea #textArea matInput readonly rows=\"1\"\r\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.nord' | translate\"\r\n [value]=\"coordinates[1]\"></textarea></mat-form-field>\r\n </ng-template>\r\n </div>\r\n\r\n <button mat-icon-button [attr.aria-label]=\"'igo.integration.advanced-map-tool.advanced-coordinates.copy' | translate\" class=\"igo-form-button-group advanced-coordinates__copy-coordinates\"\r\n (click)=\"copyTextToClipboard()\">\r\n <mat-icon svgIcon=\"content-copy\"></mat-icon>\r\n</button>\r\n</div>\r\n<form class=\"igo-form advanced-coordinates__form\" [formGroup]=\"form\">\r\n <mat-form-field class=\"igo-input-container\">\r\n <mat-label>{{'igo.integration.advanced-map-tool.advanced-coordinates.coordSystem' | translate}}</mat-label>\r\n <mat-select [(value)]=\"inputProj\">\r\n <mat-option matTooltipShowDelay=\"500\"\r\n *ngFor=\"let projection of (projections$ | async)\"\r\n [value]=\"projection\"\r\n (click)=\"$event.stopPropagation()\">\r\n {{projection.translatedValue || projection.alias }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-slide-toggle class=\"center-toggle mat-typography\"\r\n [checked]=\"center\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"displayCenter($event.checked)\">\r\n {{'igo.integration.advanced-map-tool.advanced-coordinates.center' | translate}}\r\n </mat-slide-toggle> \r\n</form>\r\n\r\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.zoom' | translate}} {{map.viewController.getZoom() }}</p>\r\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.scale' | translate}} {{ formattedScale$ | async }}</p>\r\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.resolution' | translate}} {{map.viewController.getResolution() | number: '1.0-0' }}</p>", styles: ["textarea{resize:none}mat-form-field{padding:10px 15px}mat-form-field.coordinates2{padding:0 10px 0 3px}mat-form-field.igo-input-container{width:100%;padding:0 15px}.igo-form-button-group{padding:0 10px;margin:0 10px}.igo-zoom{padding:0 15px}.advanced-coordinates__coordinates-container{display:flex;flex-direction:row;align-items:center}.advanced-coordinates__coordinates-container__inner{flex:1 1 0}.advanced-coordinates__coordinates-container__inner .mat-form-field{width:50%}.advanced-coordinates__form ::ng-deep .mat-slide-toggle{padding:10px 15px 35px;width:100%}.advanced-coordinates__form ::ng-deep .mat-slide-toggle-content{width:100%}\n"] }]
469
- }], function () { return [{ type: i1.MapState }, { type: i2.LanguageService }, { type: i2.MessageService }, { type: i0.ChangeDetectorRef }, { type: i2.StorageService }, { type: i2.ConfigService }, { type: i3.UntypedFormBuilder }]; }, { projectionsLimitations: [{
470
- type: Input
471
- }] }); })();
472
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUEyRCxNQUFNLFdBQVcsQ0FBQztBQUVqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBbUQsWUFBWSxFQUFpQixNQUFNLFlBQVksQ0FBQztBQUMxRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUF3QyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7OztJQ1A5QiwwQ0FBa0U7SUFDOUQsbUNBRXNDOztJQUMxQyxpQkFBaUI7OztJQUZYLGVBQXdGO0lBQXhGLGdIQUF3RixnQ0FBQTs7O0lBSTVGLDBDQUFvQztJQUNsQyxtQ0FFa0M7O0lBQUEsaUJBQWlCOzs7SUFEckQsZUFBd0Y7SUFBeEYsZ0hBQXdGLGdDQUFBOzs7SUFJMUYsMENBQW9FO0lBQ2hFLG1DQUVzQzs7SUFDMUMsaUJBQWlCOzs7SUFGWCxlQUF3RjtJQUF4RixnSEFBd0YsZ0NBQUE7OztJQUk1RiwwQ0FBcUM7SUFBRSxtQ0FFSDs7SUFBQSxpQkFBaUI7OztJQURyRCxlQUF5RjtJQUF6RixpSEFBeUYsZ0NBQUE7OztJQWN6RixzQ0FHcUM7SUFBbkMsaUlBQVMsd0JBQXdCLElBQUM7SUFDbEMsWUFDRjtJQUFBLGlCQUFhOzs7SUFIWCxzQ0FBb0I7SUFFcEIsZUFDRjtJQURFLHVGQUNGOztBRDlCTjs7R0FFRztBQU1ILE1BQU0sT0FBTyw0QkFBNEI7SUFxQ3ZDLFlBQ1MsUUFBa0IsRUFDakIsZUFBZ0MsRUFDaEMsY0FBOEIsRUFDOUIsS0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsTUFBcUIsRUFDckIsV0FBK0I7UUFOaEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNqQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQTNDbEMsb0JBQWUsR0FBNEIsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkUsaUJBQVksR0FBd0MsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFJNUUsV0FBTSxHQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBWSxDQUFDO1FBQ3BFLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIsZUFBVSxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFFdkMsNEJBQXVCLEdBQWtDLEVBQUUsQ0FBQztRQUU1RCxnQkFBVyxHQUFxQjtZQUN0QyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDRDQUE0QyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzVILFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFO1NBQ25FLENBQUM7UUFDTSxpQkFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDbkQsVUFBSyxHQUFZLElBQUksQ0FBQztRQTRCekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUE3QkgsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLEtBQXVCO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFDSSxzQkFBc0IsQ0FBQyxLQUFvQztRQUM3RCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFjRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMzRyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLGNBQWMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDL0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3BCO1lBQ0QsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUM7Z0JBQ3ZDLFVBQVUsR0FBRyxJQUFJLENBQUM7YUFDbkI7WUFDRCxJQUFJLGNBQWMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDO2dCQUN2QyxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQ25CO1lBQ0QsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7YUFDcEM7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBcUIsQ0FBQztRQUN2RixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksYUFBYSxLQUFLLElBQUksRUFDMUI7WUFDRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBVztRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFDRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLEtBQUssQ0FBQztRQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ2pDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM1RCxPQUFPLEdBQUcsQ0FBQyxDQUFDO1NBQ2I7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDNUQsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDN0UsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FDekIsZ0VBQWdFLEVBQ2hFLGtFQUFrRSxDQUFDLENBQUM7U0FDdkU7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhLENBQUMsTUFBZTtRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDakMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLDJCQUEyQjtRQUNqQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQztRQUNqRCxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7Z0JBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxJQUFJLEVBQUU7b0JBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7b0JBQ3JFLENBQUMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztvQkFDeEIsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ2QsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO29CQUNuQixDQUFDLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsMENBQTBDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ3RGO3FCQUNJO29CQUNILENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNiLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTt3QkFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDN0M7aUJBQ0Y7YUFDRjtZQUNELElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7Z0JBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxJQUFJLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLEtBQUssR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUN4QixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN0RjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDekYsTUFBTSxXQUFXLEdBQXVCLEVBQUUsQ0FBQztRQUUzQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxRjtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRTtZQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLGVBQWUsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLDRDQUE0QyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUN2RyxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRTthQUNuRSxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRTtZQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLGVBQWUsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLDRDQUE0QyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUN2RyxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRTthQUNuRSxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRTtZQUMzQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLGVBQWUsRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLGtEQUFrRCxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUM3RyxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRTthQUNoRixDQUFDLENBQUM7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRTtZQUNuQyxTQUFTO1lBQ1QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDckUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUN2QixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO29CQUNuSCxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUU7aUJBQ2pFLENBQUMsQ0FBQzthQUNKO2lCQUNJO2dCQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ3hCO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDaEUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFO2dCQUMzQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNuSCxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUU7YUFDakUsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLEVBQUU7WUFDOUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE9BQU8sQ0FBQyxXQUFvQztRQUNsRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3JFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDckIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbkgsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFO2FBQUMsQ0FBQyxDQUFDO1NBQ3hFO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFdBQVc7UUFDakIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7WUFDekMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7U0FDckk7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTtZQUN6QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3JJO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsYUFBK0I7UUFDNUMsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksUUFBUSxDQUFDLENBQUMsZUFBZTtRQUM3QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN6QyxJQUFJLEVBQUUsRUFBRTtnQkFDTixJQUFJLEVBQUUsS0FBSyxVQUFVLENBQUMsWUFBWSxFQUFFO29CQUNsQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2lCQUNqQjthQUNGO2lCQUNJLElBQUksS0FBSyxLQUFLLFVBQVUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ25DLFFBQVEsR0FBRyxJQUFJLENBQUM7YUFDakI7WUFDRCxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxXQUE2QjtRQUN4QyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUMzQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hHLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxLQUFLLEVBQUU7b0JBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdDO2dCQUNELFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3hDO2lCQUNJO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUNoQzthQUNKO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzt3R0EzVlUsNEJBQTRCOytFQUE1Qiw0QkFBNEI7UUNsQnpDLDhCQUF5RCxhQUFBO1FBRXJELG1HQUlpQjtRQUNqQiw4SEFLYztRQUVkLG1HQUlpQjtRQUNqQiw4SEFJYztRQUNoQixpQkFBTTtRQUVOLGlDQUNrQztRQUFoQyx5R0FBUyx5QkFBcUIsSUFBQzs7UUFDL0IsK0JBQTRDO1FBQ2hELGlCQUFTLEVBQUE7UUFFVCxnQ0FBcUUseUJBQUEsaUJBQUE7UUFFdEQsYUFBb0Y7O1FBQUEsaUJBQVk7UUFDM0csdUNBQWtDO1FBQXRCLDBKQUFxQjtRQUMvQiw4RkFLYTs7UUFDZixpQkFBYSxFQUFBO1FBRWYsNkNBRzJDO1FBQXpDLDRIQUFVLGlDQUE2QixJQUFDO1FBQ3hDLGFBQ0Y7O1FBQUEsaUJBQW1CLEVBQUE7UUFHckIsOEJBQW1DO1FBQUEsYUFBK0c7O1FBQUEsaUJBQUk7UUFDdEosOEJBQW1DO1FBQUEsYUFBNEc7OztRQUFBLGlCQUFJO1FBQ25KLDhCQUFtQztRQUFBLGFBQTZJOzs7UUFBQSxpQkFBSTs7OztRQW5EL0osZUFBYTtRQUFiLGdDQUFhLGlCQUFBO1FBWWIsZUFBYTtRQUFiLGdDQUFhLGlCQUFBO1FBWVIsZUFBNkY7UUFBN0Ysa0hBQTZGO1FBS3JFLGVBQWtCO1FBQWxCLG9DQUFrQjtRQUVyRCxlQUFvRjtRQUFwRixrSEFBb0Y7UUFDbkYsZUFBcUI7UUFBckIscUNBQXFCO1FBRU4sZUFBeUI7UUFBekIsa0VBQXlCO1FBUXBELGVBQWtCO1FBQWxCLG9DQUFrQiwyQkFBQTtRQUdsQixlQUNGO1FBREUsd0hBQ0Y7UUFHaUMsZUFBK0c7UUFBL0csMkpBQStHO1FBQy9HLGVBQTRHO1FBQTVHLHVLQUE0RztRQUM1RyxlQUE2STtRQUE3SSx3TUFBNkk7O3VGRG5DbkssNEJBQTRCO2NBTHhDLFNBQVM7MkJBQ0UsMEJBQTBCO2dQQXFDaEMsc0JBQXNCO2tCQUR6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZvcm1hdFNjYWxlLCBJZ29NYXAsIElucHV0UHJvamVjdGlvbnMsIFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zIH0gZnJvbSAnQGlnbzIvZ2VvJztcclxuaW1wb3J0IHsgTWFwU3RhdGUgfSBmcm9tICcuLi8uLi9tYXAuc3RhdGUnO1xyXG5pbXBvcnQgeyBDbGlwYm9hcmQgfSBmcm9tICdAaWdvMi91dGlscyc7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlLCBMYW5ndWFnZVNlcnZpY2UsIFN0b3JhZ2VTZXJ2aWNlLCBTdG9yYWdlU2NvcGUsIENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IHpvbmVNdG0sIHpvbmVVdG0sIGNvbXB1dGVQcm9qZWN0aW9uc0NvbnN0cmFpbnRzIH0gZnJvbSAnQGlnbzIvZ2VvJztcclxuaW1wb3J0ICogYXMgb2xwcm9qIGZyb20gJ29sL3Byb2onO1xyXG4vKipcclxuICogVG9vbCB0byBkaXNwbGF5IHRoZSBjb29yZGluYXRlcyBhbmQgYSBjdXJzb3Igb2YgdGhlIGNlbnRlciBvZiB0aGUgbWFwXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lnby1hZHZhbmNlZC1jb29yZGluYXRlcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLWNvb3JkaW5hdGVzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC1jb29yZGluYXRlcy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZENvb3JkaW5hdGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHB1YmxpYyBmb3JtYXR0ZWRTY2FsZSQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XHJcbiAgcHVibGljIHByb2plY3Rpb25zJDogQmVoYXZpb3JTdWJqZWN0PElucHV0UHJvamVjdGlvbnNbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcclxuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBwdWJsaWMgY29vcmRpbmF0ZXM6IHN0cmluZ1tdO1xyXG4gIHByaXZhdGUgY3VycmVudENlbnRlckRlZmF1bHRQcm9qOiBbbnVtYmVyLCBudW1iZXJdO1xyXG4gIHB1YmxpYyBjZW50ZXI6IGJvb2xlYW4gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnY2VudGVyVG9nZ2xlJykgYXMgYm9vbGVhbjtcclxuICBwcml2YXRlIGluTXRtWm9uZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBpbkxhbWJlcnQyID0gezMyMTk4OiB0cnVlLCAzNzk4OiB0cnVlfTtcclxuICBwcml2YXRlIG1hcFN0YXRlJCQ6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9wcm9qZWN0aW9uc0xpbWl0YXRpb25zOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucyA9IHt9O1xyXG4gIHByaXZhdGUgcHJvamVjdGlvbnNDb25zdHJhaW50czogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnM7XHJcbiAgcHJpdmF0ZSBkZWZhdWx0UHJvajogSW5wdXRQcm9qZWN0aW9ucyA9IHtcclxuICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy53Z3M4NCcsIHsgY29kZTogJ0VQU0c6NDMyNicgfSksXHJcbiAgICB0cmFuc2xhdGVLZXk6ICd3Z3M4NCcsIGFsaWFzOiAnV0dTODQnLCBjb2RlOiAnRVBTRzo0MzI2Jywgem9uZTogJydcclxuICB9O1xyXG4gIHByaXZhdGUgY3VycmVudFpvbmVzID0geyB1dG06IHVuZGVmaW5lZCwgbXRtOiB1bmRlZmluZWQgfTtcclxuICBwdWJsaWMgdW5pdHM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGdldCBtYXAoKTogSWdvTWFwIHtcclxuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcclxuICB9XHJcblxyXG4gIGdldCBpbnB1dFByb2ooKTogSW5wdXRQcm9qZWN0aW9ucyB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnaW5wdXRQcm9qJykudmFsdWU7XHJcbiAgfVxyXG4gIHNldCBpbnB1dFByb2oodmFsdWU6IElucHV0UHJvamVjdGlvbnMpIHtcclxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgaW5wdXRQcm9qOiB2YWx1ZSB9KTtcclxuICB9XHJcbiAgZ2V0IHByb2plY3Rpb25zTGltaXRhdGlvbnMoKTogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnMge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3Rpb25zTGltaXRhdGlvbnMgfHwge307XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBwcm9qZWN0aW9uc0xpbWl0YXRpb25zKHZhbHVlOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucykge1xyXG4gICAgdGhpcy5fcHJvamVjdGlvbnNMaW1pdGF0aW9ucyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgbWFwU3RhdGU6IE1hcFN0YXRlLFxyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyKSB7XHJcbiAgICAgIHRoaXMuY29tcHV0ZVByb2plY3Rpb25zKCk7XHJcbiAgICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3RlbiBhIHN0YXRlIG9mIHRoZSBtYXAsIGEgc3RhdGUgb2YgYSBmb3JtLCB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hcFN0YXRlJCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm1hcC52aWV3Q29udHJvbGxlci5zdGF0ZSQucGlwZShkZWJvdW5jZVRpbWUoNTApKSwgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlc10pXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0U2NhbGVWYWx1ZSh0aGlzLm1hcCk7XHJcbiAgICAgIHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKHRoaXMuZGVmYXVsdFByb2ouY29kZSk7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRNdG1ab25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRVdG1ab25lID0gem9uZVV0bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XHJcbiAgICAgIGlmICghdGhpcy5pbk10bVpvbmUgJiYgY3VycmVudE10bVpvbmUgIT09IHRoaXMuY3VycmVudFpvbmVzLm10bSkge1xyXG4gICAgICAgIHRoaXMuYmFjazJxdWViZWMoKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgem9uZUNoYW5nZSA9IGZhbHNlO1xyXG4gICAgICBpZiAoY3VycmVudE10bVpvbmUgIT09IHRoaXMuY3VycmVudFpvbmVzLm10bSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFpvbmVzLm10bSA9IGN1cnJlbnRNdG1ab25lO1xyXG4gICAgICAgIHpvbmVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjdXJyZW50VXRtWm9uZSAhPT0gdGhpcy5jdXJyZW50Wm9uZXMudXRtKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Wm9uZXMudXRtID0gY3VycmVudFV0bVpvbmU7XHJcbiAgICAgICAgem9uZUNoYW5nZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHpvbmVDaGFuZ2UpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVByb2plY3Rpb25zWm9uZUNoYW5nZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2hlY2tMYW1iZXJ0KHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qKTtcclxuICAgICAgdGhpcy5jb29yZGluYXRlcyA9IHRoaXMuZ2V0Q29vcmRpbmF0ZXMoKTtcclxuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KCdjdXJyZW50UHJvamVjdGlvbicsIHRoaXMuaW5wdXRQcm9qLCBTdG9yYWdlU2NvcGUuU0VTU0lPTik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ZW1wSW5wdXRQcm9qID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoJ2N1cnJlbnRQcm9qZWN0aW9uJykgYXMgSW5wdXRQcm9qZWN0aW9ucztcclxuICAgIHRoaXMuaW5wdXRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWVbMF07XHJcbiAgICBpZiAodGVtcElucHV0UHJvaiAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgY29uc3QgcG9zID0gdGhpcy5wb3NpdGlvbkluTGlzdCh0ZW1wSW5wdXRQcm9qKTtcclxuICAgICAgdGhpcy5pbnB1dFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVtwb3NdO1xyXG4gICAgICB0aGlzLnVwZGF0ZVpvbmVNdG1VdG0oKTtcclxuICAgIH1cclxuICAgIHRoaXMubWFwLm1hcENlbnRlciQubmV4dCh0aGlzLmNlbnRlcik7XHJcbiAgICB0aGlzLmNvb3JkaW5hdGVzID0gdGhpcy5nZXRDb29yZGluYXRlcygpO1xyXG4gICAgdGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2ogPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5nZXRDZW50ZXIodGhpcy5kZWZhdWx0UHJvai5jb2RlKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tYXAubWFwQ2VudGVyJC5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMubWFwU3RhdGUkJC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2NhbGVWYWx1ZShtYXA6IElnb01hcCkge1xyXG4gICAgdGhpcy5mb3JtYXR0ZWRTY2FsZSQubmV4dCgnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwLnZpZXdDb250cm9sbGVyLmdldFNjYWxlKCkpKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgbWFwIG9uIHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW1lIG9mIGNvb3JkaW5hdGVzXHJcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHdvIG51bWJlcnNcclxuICAgKi9cclxuICBnZXRDb29yZGluYXRlcygpOiBzdHJpbmdbXSB7XHJcbiAgICB0aGlzLmN1cnJlbnRab25lcy5tdG0gPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcclxuICAgIHRoaXMuY3VycmVudFpvbmVzLnV0bSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgbGV0IGNvb3JkO1xyXG4gICAgY29uc3QgY29kZSA9IHRoaXMuaW5wdXRQcm9qLmNvZGU7XHJcbiAgICBsZXQgZGVjaW1hbCA9IDI7XHJcbiAgICBpZiAoY29kZS5pbmNsdWRlcygnRVBTRzo0MzI2JykgfHwgY29kZS5pbmNsdWRlcygnRVBTRzo0MjY5JykpIHtcclxuICAgICAgZGVjaW1hbCA9IDU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVuaXRzID0gKGNvZGUgPT09ICdFUFNHOjQzMjYnIHx8IGNvZGUgPT09ICdFUFNHOjQyNjknKTtcclxuICAgIGNvb3JkID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKGNvZGUpLm1hcChjID0+IGMudG9GaXhlZChkZWNpbWFsKSk7XHJcbiAgICByZXR1cm4gY29vcmQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3B5IHRoZSBjb29yZGluYXRlcyB0byBhIGNsaXBib2FyZFxyXG4gICAqL1xyXG4gIGNvcHlUZXh0VG9DbGlwYm9hcmQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gQ2xpcGJvYXJkLmNvcHkodGhpcy5jb29yZGluYXRlcy50b1N0cmluZygpKTtcclxuICAgIGlmIChzdWNjZXNzZnVsKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhcclxuICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHlNc2cnLFxyXG4gICAgICAgICdpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29weVRpdGxlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5IGEgY3Vyc29yIG9uIHRoZSBjZW50ZXIgb2YgdGhlIG1hcFxyXG4gICAqL1xyXG4gIGRpc3BsYXlDZW50ZXIodG9nZ2xlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmNlbnRlciA9IHRvZ2dsZTtcclxuICAgIHRoaXMubWFwLm1hcENlbnRlciQubmV4dCh0b2dnbGUpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2NlbnRlclRvZ2dsZScsIHRvZ2dsZSwgU3RvcmFnZVNjb3BlLlNFU1NJT04pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRlciBvZiB0aGUgZm9ybVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGlucHV0UHJvajogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBsaXN0IG9mIHByb2plY3Rpb25zIGFmdGVyIGNoYW5naW5nIG9mIHRoZSBzdGF0ZSBvZiB0aGUgbWFwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVQcm9qZWN0aW9uc1pvbmVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBsZXQgbW9kaWZpZWRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWU7XHJcbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XHJcbiAgICBtb2RpZmllZFByb2oubWFwKHAgPT4ge1xyXG4gICAgICBpZiAocC50cmFuc2xhdGVLZXkgPT09ICdtdG0nKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IHpvbmVNdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICAgIGlmICh6b25lKSB7XHJcbiAgICAgICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzIxOCR7em9uZX1gIDogYEVQU0c6MzIxJHs4MCArIHpvbmV9YDtcclxuICAgICAgICAgIHAuYWxpYXMgPSBgTVRNICR7em9uZX1gO1xyXG4gICAgICAgICAgcC5jb2RlID0gY29kZTtcclxuICAgICAgICAgIHAuem9uZSA9IGAke3pvbmV9YDtcclxuICAgICAgICAgIHAudHJhbnNsYXRlZFZhbHVlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5tdG0nLCBwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBwLmFsaWFzID0gJyc7XHJcbiAgICAgICAgICB0aGlzLmluTXRtWm9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXRQcm9qLnRyYW5zbGF0ZUtleSA9PT0gJ210bScpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVswXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHAudHJhbnNsYXRlS2V5ID09PSAndXRtJykge1xyXG4gICAgICAgIGNvbnN0IHpvbmUgPSB6b25lVXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcclxuICAgICAgICBjb25zdCBjb2RlID0gYEVQU0c6MzI2JHt6b25lfWA7XHJcbiAgICAgICAgcC5hbGlhcyA9IGBVVE0gJHt6b25lfWA7XHJcbiAgICAgICAgcC5jb2RlID0gY29kZTtcclxuICAgICAgICBwLnpvbmUgPSBgJHt6b25lfWA7XHJcbiAgICAgICAgcC50cmFuc2xhdGVkVmFsdWUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLnV0bScsIHApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIG1vZGlmaWVkUHJvaiA9IG1vZGlmaWVkUHJvai5maWx0ZXIocCA9PiBwLmFsaWFzICE9PSAnJyk7XHJcbiAgICB0aGlzLnByb2plY3Rpb25zJC5uZXh0KG1vZGlmaWVkUHJvaik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBsaXN0IG9mIGN1cnJlbnRzIHByb2plY3Rpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb21wdXRlUHJvamVjdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMgPSBjb21wdXRlUHJvamVjdGlvbnNDb25zdHJhaW50cyh0aGlzLnByb2plY3Rpb25zTGltaXRhdGlvbnMpO1xyXG4gICAgY29uc3QgcHJvamVjdGlvbnM6IElucHV0UHJvamVjdGlvbnNbXSA9IFtdO1xyXG5cclxuICAgIGlmICghdGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2opIHtcclxuICAgICAgdGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2ogPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5nZXRDZW50ZXIodGhpcy5kZWZhdWx0UHJvai5jb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XHJcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLndnczg0KSB7XHJcbiAgICAgIHByb2plY3Rpb25zLnB1c2goe1xyXG4gICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy53Z3M4NCcsIHsgY29kZTogJ0VQU0c6NDMyNicgfSksXHJcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAnd2dzODQnLCBhbGlhczogJ1dHUzg0JywgY29kZTogJ0VQU0c6NDMyNicsIHpvbmU6ICcnXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMubmFkODMpIHtcclxuICAgICAgcHJvamVjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm5hZDgzJywgeyBjb2RlOiAnRVBTRzo0MjY5JyB9KSxcclxuICAgICAgICB0cmFuc2xhdGVLZXk6ICduYWQ4MycsIGFsaWFzOiAnTkFEODMnLCBjb2RlOiAnRVBTRzo0MjY5Jywgem9uZTogJydcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy53ZWJNZXJjYXRvcikge1xyXG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHtcclxuICAgICAgICB0cmFuc2xhdGVkVmFsdWU6IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMud2ViTWVyY2F0b3InLCB7IGNvZGU6ICdFUFNHOjM4NTcnIH0pLFxyXG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ3dlYk1lcmNhdG9yJywgYWxpYXM6ICdXZWIgTWVyY2F0b3InLCBjb2RlOiAnRVBTRzozODU3Jywgem9uZTogJydcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm10bSkge1xyXG4gICAgICAvLyBRdWViZWNcclxuICAgICAgY29uc3Qgem9uZSA9IHpvbmVNdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICBpZiAoem9uZSkge1xyXG4gICAgICAgIHRoaXMuaW5NdG1ab25lID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzIxOCR7em9uZX1gIDogYEVQU0c6MzIxJHs4MCArIHpvbmV9YDtcclxuICAgICAgICBwcm9qZWN0aW9ucy5zcGxpY2UoMywgMCwge1xyXG4gICAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm10bScsIHsgY29kZSwgem9uZSB9KSxcclxuICAgICAgICAgIHRyYW5zbGF0ZUtleTogJ210bScsIGFsaWFzOiBgTVRNICR7em9uZX1gLCBjb2RlLCB6b25lOiBgJHt6b25lfWBcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmluTXRtWm9uZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnV0bSkge1xyXG4gICAgICBjb25zdCBvcmRlciA9IHRoaXMuaW5NdG1ab25lID8gNCA6IDM7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSB6b25lVXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcclxuICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyNjAke3pvbmV9YCA6IGBFUFNHOjMyNiR7em9uZX1gO1xyXG4gICAgICBwcm9qZWN0aW9ucy5zcGxpY2Uob3JkZXIsIDAsIHtcclxuICAgICAgICB0cmFuc2xhdGVkVmFsdWU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMudXRtJywgeyBjb2RlLCB6b25lIH0pLFxyXG4gICAgICAgIHRyYW5zbGF0ZUtleTogJ3V0bScsIGFsaWFzOiBgVVRNICR7em9uZX1gLCBjb2RlLCB6b25lOiBgJHt6b25lfWBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgY29uZmlnUHJvamVjdGlvbiA9IFtdO1xyXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5wcm9qRnJvbUNvbmZpZykge1xyXG4gICAgICBjb25maWdQcm9qZWN0aW9uID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdwcm9qZWN0aW9ucycpIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChwcm9qZWN0aW9ucy5jb25jYXQoY29uZmlnUHJvamVjdGlvbikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVzaCB0aGUgTVRNIGluIHRoZSBhcnJheSBvZiBzeXN0ZW1lIG9mIGNvb3JkaW5hdGVzXHJcbiAgICogQHBhcmFtIHByb2plY3Rpb25zIEFycmF5IG9mIHRoZSBJbnB1dFByb2plY3Rpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwdXNoTXRtKHByb2plY3Rpb25zOiBBcnJheTxJbnB1dFByb2plY3Rpb25zPik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5tdG0pIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHpvbmVNdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xyXG4gICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzIxOCR7em9uZX1gIDogYEVQU0c6MzIxJHs4MCArIHpvbmV9YDtcclxuICAgICAgcHJvamVjdGlvbnMuc3BsaWNlKDMsIDAsIHtcclxuICAgICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5tdG0nLCB7IGNvZGUsIHpvbmUgfSksXHJcbiAgICAgICAgICB0cmFuc2xhdGVLZXk6ICdtdG0nLCBhbGlhczogYE1UTSAke3pvbmV9YCwgY29kZSwgem9uZTogYCR7em9uZX1gfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBsaXN0IG9mIHN5c3RlbXMgb2YgY29vcmRpbmF0ZXMgZm9yIHRlcnJpdG9yeSBvZiBRdWViZWNcclxuICAgKiBwdXNoIE1UTSBhbmQgVVRNIGluIHRoZSBBcnJheVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYmFjazJxdWViZWMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwcm9qZWN0aW9ucyA9IHRoaXMucHJvamVjdGlvbnMkLnZhbHVlO1xyXG4gICAgdGhpcy5wdXNoTXRtKHByb2plY3Rpb25zKTtcclxuICAgIHRoaXMuaW5NdG1ab25lID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbnVtYmVycyBvZiB0aGUgem9uZXMgd2hlbiBhcHBsaWNhdGlvbiBpcyByZXN0YXJ0ZWRcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZVpvbmVNdG1VdG0oKSB7XHJcbiAgICBpZiAodGhpcy5pbnB1dFByb2oudHJhbnNsYXRlS2V5ID09PSAnbXRtJykge1xyXG4gICAgICBjb25zdCB6b25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XHJcbiAgICAgIHRoaXMuaW5wdXRQcm9qLmFsaWFzID0gYE1UTSAke3pvbmV9YDtcclxuICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyMTgke3pvbmV9YCA6IGBFUFNHOjMyMSR7ODAgKyB6b25lfWA7XHJcbiAgICAgIHRoaXMuaW5wdXRQcm9qLmNvZGUgPSBjb2RlO1xyXG4gICAgICB0aGlzLmlucHV0UHJvai56b25lID0gYCR7em9uZX1gO1xyXG4gICAgICB0aGlzLmlucHV0UHJvai50cmFuc2xhdGVkVmFsdWUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm10bScsIHsgY29kZSwgem9uZSB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlucHV0UHJvai50cmFuc2xhdGVLZXkgPT09ICd1dG0nKSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSB6b25lVXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcclxuICAgICAgdGhpcy5pbnB1dFByb2ouYWxpYXMgPSBgVVRNICR7em9uZX1gO1xyXG4gICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzI2MCR7em9uZX1gIDogYEVQU0c6MzI2JHt6b25lfWA7XHJcbiAgICAgIHRoaXMuaW5wdXRQcm9qLmNvZGUgPSBjb2RlO1xyXG4gICAgICB0aGlzLmlucHV0UHJvai56b25lID0gYCR7em9uZX1gO1xyXG4gICAgICB0aGlzLmlucHV0UHJvai50cmFuc2xhdGVkVmFsdWUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLnV0bScsIHsgY29kZSwgem9uZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIGEgY3VycmVudCBwcm9qZWN0aW9uIGluIGEgbGlzdC4gMCBpZiB0aGUgcHJvamVjdGlvbiBpcyBub3QgaW4gdGhlIGxpc3RcclxuICAgKiBAcGFyYW0gdHJhbnNsYXRlS2V5IHN0cmluZywgdHJhbnNsYXRlIGtleSBvZiBhIHByb2plY3Rpb25cclxuICAgKiBAcmV0dXJucyBudW1lcmljLCBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IGluIHRoZSBhcnJheVxyXG4gICAqL1xyXG4gIHBvc2l0aW9uSW5MaXN0KHRlbXBJbnB1dFByb2o6IElucHV0UHJvamVjdGlvbnMpOiBudW1iZXIge1xyXG4gICAgY29uc3QgdGsgPSB0ZW1wSW5wdXRQcm9qLnRyYW5zbGF0ZUtleTtcclxuICAgIGNvbnN0IGFsaWFzID0gdGVtcElucHV0UHJvai5hbGlhcztcclxuICAgIGxldCBwb3NpdGlvbjsgLy8gPSB1bmRlZmluZWQ7XHJcbiAgICBsZXQgaXRlciA9IDA7XHJcbiAgICB0aGlzLnByb2plY3Rpb25zJC52YWx1ZS5tYXAoKHByb2plY3Rpb24pID0+IHtcclxuICAgICAgaWYgKHRrKSB7XHJcbiAgICAgICAgaWYgKHRrID09PSBwcm9qZWN0aW9uLnRyYW5zbGF0ZUtleSkge1xyXG4gICAgICAgICAgcG9zaXRpb24gPSBpdGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhbGlhcyA9PT0gcHJvamVjdGlvbi5hbGlhcykge1xyXG4gICAgICAgIHBvc2l0aW9uID0gaXRlcjtcclxuICAgICAgfVxyXG4gICAgICBpdGVyKys7XHJcbiAgICB9KTtcclxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPyBwb3NpdGlvbiA6IDA7XHJcbiAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2UgdGhlIGxpc3Qgb2YgcHJvamVjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBwcm9qZWN0aW9ucyBvZiBMYW1iZXJ0XHJcbiAgICogQHBhcmFtIGNvb3JkaW5hdGVzIEFuIGFycmF5IG9mIG51bWJlcnMsIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVcclxuICAgKi9cclxuICBjaGVja0xhbWJlcnQoY29vcmRpbmF0ZXM6IFtudW1iZXIsIG51bWJlcl0pIHtcclxuICAgIGNvbnN0IGxhbWJlcnRQcm9qZWN0aW9ucyA9IHRoaXMuY29uZmlnLmdldENvbmZpZygncHJvamVjdGlvbnMnKTtcclxuICAgIGxhbWJlcnRQcm9qZWN0aW9ucy5mb3JFYWNoKHByb2plY3Rpb24gPT4ge1xyXG4gICAgICAgIGxldCBtb2RpZmllZFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZTtcclxuICAgICAgICBjb25zdCBleHRlbnQgPSBwcm9qZWN0aW9uLmV4dGVudDtcclxuICAgICAgICBjb25zdCBjb2RlID0gcHJvamVjdGlvbi5jb2RlLm1hdGNoKC9cXGQrLyk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudEV4dGVudFdHUyA9IG9scHJvai50cmFuc2Zvcm1FeHRlbnQoZXh0ZW50LCBwcm9qZWN0aW9uLmNvZGUsIHRoaXMuZGVmYXVsdFByb2ouY29kZSk7XHJcbiAgICAgICAgaWYgKGNvb3JkaW5hdGVzWzBdIDwgY3VycmVudEV4dGVudFdHU1swXSB8fCBjb29yZGluYXRlc1swXSA+IGN1cnJlbnRFeHRlbnRXR1NbMl0gfHxcclxuICAgICAgICAgICAgY29vcmRpbmF0ZXNbMV0gPCBjdXJyZW50RXh0ZW50V0dTWzFdIHx8IGNvb3JkaW5hdGVzWzFdID4gY3VycmVudEV4dGVudFdHU1szXSkge1xyXG4gICAgICAgICAgICB0aGlzLmluTGFtYmVydDJbY29kZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRQcm9qLmFsaWFzID09PSBwcm9qZWN0aW9uLmFsaWFzKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtb2RpZmllZFByb2ogPSBtb2RpZmllZFByb2ouZmlsdGVyKHAgPT4gcC5hbGlhcyAhPT0gcHJvamVjdGlvbi5hbGlhcyk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvamVjdGlvbnMkLm5leHQobW9kaWZpZWRQcm9qKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbkxhbWJlcnQyW2NvZGVdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3Rpb25zJC5uZXh0KG1vZGlmaWVkUHJvai5jb25jYXQocHJvamVjdGlvbikpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbkxhbWJlcnQyW2NvZGVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYWR2YW5jZWQtY29vcmRpbmF0ZXNfX2Nvb3JkaW5hdGVzLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJhZHZhbmNlZC1jb29yZGluYXRlc19fY29vcmRpbmF0ZXMtY29udGFpbmVyX19pbm5lclwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwidW5pdHM7IGVsc2UgZWxzZUJsb2NrXCIgY2xhc3M9XCJjb29yZGluYXRlc1wiPlxyXG4gICAgICAgIDx0ZXh0YXJlYSAgI3RleHRBcmVhIG1hdElucHV0IHJlYWRvbmx5IHJvd3M9XCIxXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmxvbicgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImNvb3JkaW5hdGVzWzBdXCI+PC90ZXh0YXJlYT5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jayA+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvb3JkaW5hdGVzXCI+XHJcbiAgICAgICAgPHRleHRhcmVhICN0ZXh0QXJlYSBtYXRJbnB1dCByZWFkb25seSByb3dzPVwiMVwiXHJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCInaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmVzdCcgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMF1cIj48L3RleHRhcmVhPjwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInVuaXRzOyBlbHNlIGVsc2VCbG9jazJcIiBjbGFzcz1cImNvb3JkaW5hdGVzMlwiPlxyXG4gICAgICAgIDx0ZXh0YXJlYSAjdGV4dEFyZWEgbWF0SW5wdXQgcmVhZG9ubHkgcm93cz1cIjFcIlxyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMubGF0JyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMV1cIj48L3RleHRhcmVhPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrMiA+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvb3JkaW5hdGVzMlwiPiAgPHRleHRhcmVhICN0ZXh0QXJlYSBtYXRJbnB1dCByZWFkb25seSByb3dzPVwiMVwiXHJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCInaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLm5vcmQnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgW3ZhbHVlXT1cImNvb3JkaW5hdGVzWzFdXCI+PC90ZXh0YXJlYT48L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2F0dHIuYXJpYS1sYWJlbF09XCInaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHknIHwgdHJhbnNsYXRlXCIgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXAgYWR2YW5jZWQtY29vcmRpbmF0ZXNfX2NvcHktY29vcmRpbmF0ZXNcIlxyXG4gICAgKGNsaWNrKT1cImNvcHlUZXh0VG9DbGlwYm9hcmQoKVwiPlxyXG4gICAgPG1hdC1pY29uIHN2Z0ljb249XCJjb250ZW50LWNvcHlcIj48L21hdC1pY29uPlxyXG48L2J1dHRvbj5cclxuPC9kaXY+XHJcbjxmb3JtIGNsYXNzPVwiaWdvLWZvcm0gYWR2YW5jZWQtY29vcmRpbmF0ZXNfX2Zvcm1cIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpZ28taW5wdXQtY29udGFpbmVyXCI+XHJcbiAgICA8bWF0LWxhYmVsPnt7J2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5jb29yZFN5c3RlbScgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiaW5wdXRQcm9qXCI+XHJcbiAgICAgIDxtYXQtb3B0aW9uIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBwcm9qZWN0aW9uIG9mIChwcm9qZWN0aW9ucyQgfCBhc3luYylcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJwcm9qZWN0aW9uXCJcclxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAge3twcm9qZWN0aW9uLnRyYW5zbGF0ZWRWYWx1ZSB8fCBwcm9qZWN0aW9uLmFsaWFzIH19XHJcbiAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgIDwvbWF0LXNlbGVjdD5cclxuICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDxtYXQtc2xpZGUtdG9nZ2xlIGNsYXNzPVwiY2VudGVyLXRvZ2dsZSBtYXQtdHlwb2dyYXBoeVwiXHJcbiAgICBbY2hlY2tlZF09XCJjZW50ZXJcIlxyXG4gICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxyXG4gICAgKGNoYW5nZSk9XCJkaXNwbGF5Q2VudGVyKCRldmVudC5jaGVja2VkKVwiPlxyXG4gICAge3snaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNlbnRlcicgfCB0cmFuc2xhdGV9fVxyXG4gIDwvbWF0LXNsaWRlLXRvZ2dsZT4gXHJcbjwvZm9ybT5cclxuXHJcbjxwIGNsYXNzPVwiaWdvLXpvb20gbWF0LXR5cG9ncmFwaHlcIj57eydpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuem9vbScgfCB0cmFuc2xhdGV9fSB7e21hcC52aWV3Q29udHJvbGxlci5nZXRab29tKCkgfX08L3A+XHJcbjxwIGNsYXNzPVwiaWdvLXpvb20gbWF0LXR5cG9ncmFwaHlcIj57eydpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuc2NhbGUnIHwgdHJhbnNsYXRlfX0ge3sgZm9ybWF0dGVkU2NhbGUkIHwgYXN5bmMgfX08L3A+XHJcbjxwIGNsYXNzPVwiaWdvLXpvb20gbWF0LXR5cG9ncmFwaHlcIj57eydpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMucmVzb2x1dGlvbicgfCB0cmFuc2xhdGV9fSB7e21hcC52aWV3Q29udHJvbGxlci5nZXRSZXNvbHV0aW9uKCkgfCBudW1iZXI6ICcxLjAtMCcgfX08L3A+Il19
1
+ import { Component, Input } from '@angular/core';
2
+ import { formatScale } from '@igo2/geo';
3
+ import { Clipboard } from '@igo2/utils';
4
+ import { StorageScope } from '@igo2/core';
5
+ import { BehaviorSubject, combineLatest } from 'rxjs';
6
+ import { Validators } from '@angular/forms';
7
+ import { debounceTime } from 'rxjs/operators';
8
+ import { zoneMtm, zoneUtm, computeProjectionsConstraints } from '@igo2/geo';
9
+ import * as olproj from 'ol/proj';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../map.state";
12
+ import * as i2 from "@igo2/core";
13
+ import * as i3 from "@angular/forms";
14
+ import * as i4 from "@angular/material/form-field";
15
+ import * as i5 from "@angular/material/select";
16
+ import * as i6 from "@angular/material/core";
17
+ import * as i7 from "@angular/material/input";
18
+ import * as i8 from "@angular/common";
19
+ import * as i9 from "@angular/material/icon";
20
+ import * as i10 from "@angular/material/slide-toggle";
21
+ import * as i11 from "@angular/material/button";
22
+ import * as i12 from "@ngx-translate/core";
23
+ function AdvancedCoordinatesComponent_mat_form_field_2_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵelementStart(0, "mat-form-field", 14);
25
+ i0.ɵɵelement(1, "textarea", 15, 16);
26
+ i0.ɵɵpipe(3, "translate");
27
+ i0.ɵɵelementEnd();
28
+ } if (rf & 2) {
29
+ const ctx_r0 = i0.ɵɵnextContext();
30
+ i0.ɵɵadvance(1);
31
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lon"))("value", ctx_r0.coordinates[0]);
32
+ } }
33
+ function AdvancedCoordinatesComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
34
+ i0.ɵɵelementStart(0, "mat-form-field", 14);
35
+ i0.ɵɵelement(1, "textarea", 15, 16);
36
+ i0.ɵɵpipe(3, "translate");
37
+ i0.ɵɵelementEnd();
38
+ } if (rf & 2) {
39
+ const ctx_r2 = i0.ɵɵnextContext();
40
+ i0.ɵɵadvance(1);
41
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.est"))("value", ctx_r2.coordinates[0]);
42
+ } }
43
+ function AdvancedCoordinatesComponent_mat_form_field_5_Template(rf, ctx) { if (rf & 1) {
44
+ i0.ɵɵelementStart(0, "mat-form-field", 17);
45
+ i0.ɵɵelement(1, "textarea", 15, 16);
46
+ i0.ɵɵpipe(3, "translate");
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const ctx_r3 = i0.ɵɵnextContext();
50
+ i0.ɵɵadvance(1);
51
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.lat"))("value", ctx_r3.coordinates[1]);
52
+ } }
53
+ function AdvancedCoordinatesComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelementStart(0, "mat-form-field", 17);
55
+ i0.ɵɵelement(1, "textarea", 15, 16);
56
+ i0.ɵɵpipe(3, "translate");
57
+ i0.ɵɵelementEnd();
58
+ } if (rf & 2) {
59
+ const ctx_r5 = i0.ɵɵnextContext();
60
+ i0.ɵɵadvance(1);
61
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 2, "igo.integration.advanced-map-tool.advanced-coordinates.nord"))("value", ctx_r5.coordinates[1]);
62
+ } }
63
+ function AdvancedCoordinatesComponent_mat_option_17_Template(rf, ctx) { if (rf & 1) {
64
+ i0.ɵɵelementStart(0, "mat-option", 18);
65
+ i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_mat_option_17_Template_mat_option_click_0_listener($event) { return $event.stopPropagation(); });
66
+ i0.ɵɵtext(1);
67
+ i0.ɵɵelementEnd();
68
+ } if (rf & 2) {
69
+ const projection_r11 = ctx.$implicit;
70
+ i0.ɵɵproperty("value", projection_r11);
71
+ i0.ɵɵadvance(1);
72
+ i0.ɵɵtextInterpolate1(" ", projection_r11.translatedValue || projection_r11.alias, " ");
73
+ } }
74
+ /**
75
+ * Tool to display the coordinates and a cursor of the center of the map
76
+ */
77
+ export class AdvancedCoordinatesComponent {
78
+ constructor(mapState, languageService, messageService, cdRef, storageService, config, formBuilder) {
79
+ this.mapState = mapState;
80
+ this.languageService = languageService;
81
+ this.messageService = messageService;
82
+ this.cdRef = cdRef;
83
+ this.storageService = storageService;
84
+ this.config = config;
85
+ this.formBuilder = formBuilder;
86
+ this.formattedScale$ = new BehaviorSubject('');
87
+ this.projections$ = new BehaviorSubject([]);
88
+ this.center = this.storageService.get('centerToggle');
89
+ this.inMtmZone = true;
90
+ this.inLambert2 = { 32198: true, 3798: true };
91
+ this._projectionsLimitations = {};
92
+ this.defaultProj = {
93
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
94
+ translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
95
+ };
96
+ this.currentZones = { utm: undefined, mtm: undefined };
97
+ this.units = true;
98
+ this.computeProjections();
99
+ this.buildForm();
100
+ }
101
+ get map() {
102
+ return this.mapState.map;
103
+ }
104
+ get inputProj() {
105
+ return this.form.get('inputProj').value;
106
+ }
107
+ set inputProj(value) {
108
+ this.form.patchValue({ inputProj: value });
109
+ }
110
+ get projectionsLimitations() {
111
+ return this._projectionsLimitations || {};
112
+ }
113
+ set projectionsLimitations(value) {
114
+ this._projectionsLimitations = value;
115
+ }
116
+ /**
117
+ * Listen a state of the map, a state of a form, update the coordinates
118
+ */
119
+ ngOnInit() {
120
+ this.mapState$$ = combineLatest([this.map.viewController.state$.pipe(debounceTime(50)), this.form.valueChanges])
121
+ .subscribe(() => {
122
+ this.setScaleValue(this.map);
123
+ this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
124
+ const currentMtmZone = zoneMtm(this.currentCenterDefaultProj[0]);
125
+ const currentUtmZone = zoneUtm(this.currentCenterDefaultProj[0]);
126
+ if (!this.inMtmZone && currentMtmZone !== this.currentZones.mtm) {
127
+ this.back2quebec();
128
+ }
129
+ let zoneChange = false;
130
+ if (currentMtmZone !== this.currentZones.mtm) {
131
+ this.currentZones.mtm = currentMtmZone;
132
+ zoneChange = true;
133
+ }
134
+ if (currentUtmZone !== this.currentZones.utm) {
135
+ this.currentZones.utm = currentUtmZone;
136
+ zoneChange = true;
137
+ }
138
+ if (zoneChange) {
139
+ this.updateProjectionsZoneChange();
140
+ }
141
+ this.checkLambert(this.currentCenterDefaultProj);
142
+ this.coordinates = this.getCoordinates();
143
+ this.cdRef.detectChanges();
144
+ this.storageService.set('currentProjection', this.inputProj, StorageScope.SESSION);
145
+ });
146
+ const tempInputProj = this.storageService.get('currentProjection');
147
+ this.inputProj = this.projections$.value[0];
148
+ if (tempInputProj !== null) {
149
+ const pos = this.positionInList(tempInputProj);
150
+ this.inputProj = this.projections$.value[pos];
151
+ this.updateZoneMtmUtm();
152
+ }
153
+ this.map.mapCenter$.next(this.center);
154
+ this.coordinates = this.getCoordinates();
155
+ this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
156
+ }
157
+ ngOnDestroy() {
158
+ this.map.mapCenter$.next(false);
159
+ this.mapState$$.unsubscribe();
160
+ }
161
+ setScaleValue(map) {
162
+ this.formattedScale$.next(': ~ 1 / ' + formatScale(map.viewController.getScale()));
163
+ }
164
+ /**
165
+ * Coordinates of the center of the map on the appropriate systeme of coordinates
166
+ * @returns Array of two numbers
167
+ */
168
+ getCoordinates() {
169
+ this.currentZones.mtm = zoneMtm(this.currentCenterDefaultProj[0]);
170
+ this.currentZones.utm = zoneUtm(this.currentCenterDefaultProj[0]);
171
+ let coord;
172
+ const code = this.inputProj.code;
173
+ let decimal = 2;
174
+ if (code.includes('EPSG:4326') || code.includes('EPSG:4269')) {
175
+ decimal = 5;
176
+ }
177
+ this.units = (code === 'EPSG:4326' || code === 'EPSG:4269');
178
+ coord = this.map.viewController.getCenter(code).map(c => c.toFixed(decimal));
179
+ return coord;
180
+ }
181
+ /**
182
+ * Copy the coordinates to a clipboard
183
+ */
184
+ copyTextToClipboard() {
185
+ const successful = Clipboard.copy(this.coordinates.toString());
186
+ if (successful) {
187
+ this.messageService.success('igo.integration.advanced-map-tool.advanced-coordinates.copyMsg', 'igo.integration.advanced-map-tool.advanced-coordinates.copyTitle');
188
+ }
189
+ }
190
+ /**
191
+ * Display a cursor on the center of the map
192
+ */
193
+ displayCenter(toggle) {
194
+ this.center = toggle;
195
+ this.map.mapCenter$.next(toggle);
196
+ this.storageService.set('centerToggle', toggle, StorageScope.SESSION);
197
+ }
198
+ /**
199
+ * Builder of the form
200
+ */
201
+ buildForm() {
202
+ this.form = this.formBuilder.group({
203
+ inputProj: ['', [Validators.required]]
204
+ });
205
+ }
206
+ /**
207
+ * Update list of projections after changing of the state of the map
208
+ */
209
+ updateProjectionsZoneChange() {
210
+ let modifiedProj = this.projections$.value;
211
+ const translate = this.languageService.translate;
212
+ modifiedProj.map(p => {
213
+ if (p.translateKey === 'mtm') {
214
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
215
+ if (zone) {
216
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
217
+ p.alias = `MTM ${zone}`;
218
+ p.code = code;
219
+ p.zone = `${zone}`;
220
+ p.translatedValue = translate.instant('igo.geo.importExportForm.projections.mtm', p);
221
+ }
222
+ else {
223
+ p.alias = '';
224
+ this.inMtmZone = false;
225
+ if (this.inputProj.translateKey === 'mtm') {
226
+ this.inputProj = this.projections$.value[0];
227
+ }
228
+ }
229
+ }
230
+ if (p.translateKey === 'utm') {
231
+ const zone = zoneUtm(this.currentCenterDefaultProj[0]);
232
+ const code = `EPSG:326${zone}`;
233
+ p.alias = `UTM ${zone}`;
234
+ p.code = code;
235
+ p.zone = `${zone}`;
236
+ p.translatedValue = translate.instant('igo.geo.importExportForm.projections.utm', p);
237
+ }
238
+ });
239
+ modifiedProj = modifiedProj.filter(p => p.alias !== '');
240
+ this.projections$.next(modifiedProj);
241
+ }
242
+ /**
243
+ * Create a list of currents projections
244
+ */
245
+ computeProjections() {
246
+ this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
247
+ const projections = [];
248
+ if (!this.currentCenterDefaultProj) {
249
+ this.currentCenterDefaultProj = this.map.viewController.getCenter(this.defaultProj.code);
250
+ }
251
+ const translate = this.languageService.translate;
252
+ if (this.projectionsConstraints.wgs84) {
253
+ projections.push({
254
+ translatedValue: translate.instant('igo.geo.importExportForm.projections.wgs84', { code: 'EPSG:4326' }),
255
+ translateKey: 'wgs84', alias: 'WGS84', code: 'EPSG:4326', zone: ''
256
+ });
257
+ }
258
+ if (this.projectionsConstraints.nad83) {
259
+ projections.push({
260
+ translatedValue: translate.instant('igo.geo.importExportForm.projections.nad83', { code: 'EPSG:4269' }),
261
+ translateKey: 'nad83', alias: 'NAD83', code: 'EPSG:4269', zone: ''
262
+ });
263
+ }
264
+ if (this.projectionsConstraints.webMercator) {
265
+ projections.push({
266
+ translatedValue: translate.instant('igo.geo.importExportForm.projections.webMercator', { code: 'EPSG:3857' }),
267
+ translateKey: 'webMercator', alias: 'Web Mercator', code: 'EPSG:3857', zone: ''
268
+ });
269
+ }
270
+ if (this.projectionsConstraints.mtm) {
271
+ // Quebec
272
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
273
+ if (zone) {
274
+ this.inMtmZone = true;
275
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
276
+ projections.splice(3, 0, {
277
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
278
+ translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
279
+ });
280
+ }
281
+ else {
282
+ this.inMtmZone = false;
283
+ }
284
+ }
285
+ if (this.projectionsConstraints.utm) {
286
+ const order = this.inMtmZone ? 4 : 3;
287
+ const zone = zoneUtm(this.currentCenterDefaultProj[0]);
288
+ const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
289
+ projections.splice(order, 0, {
290
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone }),
291
+ translateKey: 'utm', alias: `UTM ${zone}`, code, zone: `${zone}`
292
+ });
293
+ }
294
+ let configProjection = [];
295
+ if (this.projectionsConstraints.projFromConfig) {
296
+ configProjection = this.config.getConfig('projections') || [];
297
+ }
298
+ this.projections$.next(projections.concat(configProjection));
299
+ }
300
+ /**
301
+ * Push the MTM in the array of systeme of coordinates
302
+ * @param projections Array of the InputProjections
303
+ */
304
+ pushMtm(projections) {
305
+ if (this.projectionsConstraints.mtm) {
306
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
307
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
308
+ projections.splice(3, 0, {
309
+ translatedValue: this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone }),
310
+ translateKey: 'mtm', alias: `MTM ${zone}`, code, zone: `${zone}`
311
+ });
312
+ }
313
+ }
314
+ /**
315
+ * Updates the list of systems of coordinates for territory of Quebec
316
+ * push MTM and UTM in the Array
317
+ */
318
+ back2quebec() {
319
+ const projections = this.projections$.value;
320
+ this.pushMtm(projections);
321
+ this.inMtmZone = true;
322
+ }
323
+ /**
324
+ * Update the numbers of the zones when application is restarted
325
+ */
326
+ updateZoneMtmUtm() {
327
+ if (this.inputProj.translateKey === 'mtm') {
328
+ const zone = zoneMtm(this.currentCenterDefaultProj[0]);
329
+ this.inputProj.alias = `MTM ${zone}`;
330
+ const code = zone < 10 ? `EPSG:3218${zone}` : `EPSG:321${80 + zone}`;
331
+ this.inputProj.code = code;
332
+ this.inputProj.zone = `${zone}`;
333
+ this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.mtm', { code, zone });
334
+ }
335
+ if (this.inputProj.translateKey === 'utm') {
336
+ const zone = zoneUtm(this.currentCenterDefaultProj[0]);
337
+ this.inputProj.alias = `UTM ${zone}`;
338
+ const code = zone < 10 ? `EPSG:3260${zone}` : `EPSG:326${zone}`;
339
+ this.inputProj.code = code;
340
+ this.inputProj.zone = `${zone}`;
341
+ this.inputProj.translatedValue = this.languageService.translate.instant('igo.geo.importExportForm.projections.utm', { code, zone });
342
+ }
343
+ }
344
+ /**
345
+ * Compute the position of a current projection in a list. 0 if the projection is not in the list
346
+ * @param translateKey string, translate key of a projection
347
+ * @returns numeric, position of an element in the array
348
+ */
349
+ positionInList(tempInputProj) {
350
+ const tk = tempInputProj.translateKey;
351
+ const alias = tempInputProj.alias;
352
+ let position; // = undefined;
353
+ let iter = 0;
354
+ this.projections$.value.map((projection) => {
355
+ if (tk) {
356
+ if (tk === projection.translateKey) {
357
+ position = iter;
358
+ }
359
+ }
360
+ else if (alias === projection.alias) {
361
+ position = iter;
362
+ }
363
+ iter++;
364
+ });
365
+ position = position ? position : 0;
366
+ return position;
367
+ }
368
+ /**
369
+ * Change the list of projections depending on the projections of Lambert
370
+ * @param coordinates An array of numbers, longitude and latitude
371
+ */
372
+ checkLambert(coordinates) {
373
+ const lambertProjections = this.config.getConfig('projections');
374
+ lambertProjections.forEach(projection => {
375
+ let modifiedProj = this.projections$.value;
376
+ const extent = projection.extent;
377
+ const code = projection.code.match(/\d+/);
378
+ const currentExtentWGS = olproj.transformExtent(extent, projection.code, this.defaultProj.code);
379
+ if (coordinates[0] < currentExtentWGS[0] || coordinates[0] > currentExtentWGS[2] ||
380
+ coordinates[1] < currentExtentWGS[1] || coordinates[1] > currentExtentWGS[3]) {
381
+ this.inLambert2[code] = false;
382
+ if (this.inputProj.alias === projection.alias) {
383
+ this.inputProj = this.projections$.value[0];
384
+ }
385
+ modifiedProj = modifiedProj.filter(p => p.alias !== projection.alias);
386
+ this.projections$.next(modifiedProj);
387
+ }
388
+ else {
389
+ if (!this.inLambert2[code]) {
390
+ this.projections$.next(modifiedProj.concat(projection));
391
+ this.inLambert2[code] = true;
392
+ }
393
+ }
394
+ });
395
+ }
396
+ }
397
+ AdvancedCoordinatesComponent.ɵfac = function AdvancedCoordinatesComponent_Factory(t) { return new (t || AdvancedCoordinatesComponent)(i0.ɵɵdirectiveInject(i1.MapState), i0.ɵɵdirectiveInject(i2.LanguageService), i0.ɵɵdirectiveInject(i2.MessageService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.StorageService), i0.ɵɵdirectiveInject(i2.ConfigService), i0.ɵɵdirectiveInject(i3.UntypedFormBuilder)); };
398
+ AdvancedCoordinatesComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AdvancedCoordinatesComponent, selectors: [["igo-advanced-coordinates"]], inputs: { projectionsLimitations: "projectionsLimitations" }, decls: 33, vars: 37, consts: [[1, "advanced-coordinates__coordinates-container"], [1, "advanced-coordinates__coordinates-container__inner"], ["class", "coordinates", 4, "ngIf", "ngIfElse"], ["elseBlock", ""], ["class", "coordinates2", 4, "ngIf", "ngIfElse"], ["elseBlock2", ""], ["mat-icon-button", "", 1, "igo-form-button-group", "advanced-coordinates__copy-coordinates", 3, "click"], ["svgIcon", "content-copy"], [1, "igo-form", "advanced-coordinates__form", 3, "formGroup"], [1, "igo-input-container"], [3, "value", "valueChange"], ["matTooltipShowDelay", "500", 3, "value", "click", 4, "ngFor", "ngForOf"], [1, "center-toggle", "mat-typography", 3, "checked", "labelPosition", "change"], [1, "igo-zoom", "mat-typography"], [1, "coordinates"], ["matInput", "", "readonly", "", "rows", "1", 3, "placeholder", "value"], ["textArea", ""], [1, "coordinates2"], ["matTooltipShowDelay", "500", 3, "value", "click"]], template: function AdvancedCoordinatesComponent_Template(rf, ctx) { if (rf & 1) {
399
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
400
+ i0.ɵɵtemplate(2, AdvancedCoordinatesComponent_mat_form_field_2_Template, 4, 4, "mat-form-field", 2);
401
+ i0.ɵɵtemplate(3, AdvancedCoordinatesComponent_ng_template_3_Template, 4, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
402
+ i0.ɵɵtemplate(5, AdvancedCoordinatesComponent_mat_form_field_5_Template, 4, 4, "mat-form-field", 4);
403
+ i0.ɵɵtemplate(6, AdvancedCoordinatesComponent_ng_template_6_Template, 4, 4, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
404
+ i0.ɵɵelementEnd();
405
+ i0.ɵɵelementStart(8, "button", 6);
406
+ i0.ɵɵlistener("click", function AdvancedCoordinatesComponent_Template_button_click_8_listener() { return ctx.copyTextToClipboard(); });
407
+ i0.ɵɵpipe(9, "translate");
408
+ i0.ɵɵelement(10, "mat-icon", 7);
409
+ i0.ɵɵelementEnd()();
410
+ i0.ɵɵelementStart(11, "form", 8)(12, "mat-form-field", 9)(13, "mat-label");
411
+ i0.ɵɵtext(14);
412
+ i0.ɵɵpipe(15, "translate");
413
+ i0.ɵɵelementEnd();
414
+ i0.ɵɵelementStart(16, "mat-select", 10);
415
+ i0.ɵɵlistener("valueChange", function AdvancedCoordinatesComponent_Template_mat_select_valueChange_16_listener($event) { return ctx.inputProj = $event; });
416
+ i0.ɵɵtemplate(17, AdvancedCoordinatesComponent_mat_option_17_Template, 2, 2, "mat-option", 11);
417
+ i0.ɵɵpipe(18, "async");
418
+ i0.ɵɵelementEnd()();
419
+ i0.ɵɵelementStart(19, "mat-slide-toggle", 12);
420
+ i0.ɵɵlistener("change", function AdvancedCoordinatesComponent_Template_mat_slide_toggle_change_19_listener($event) { return ctx.displayCenter($event.checked); });
421
+ i0.ɵɵtext(20);
422
+ i0.ɵɵpipe(21, "translate");
423
+ i0.ɵɵelementEnd()();
424
+ i0.ɵɵelementStart(22, "p", 13);
425
+ i0.ɵɵtext(23);
426
+ i0.ɵɵpipe(24, "translate");
427
+ i0.ɵɵelementEnd();
428
+ i0.ɵɵelementStart(25, "p", 13);
429
+ i0.ɵɵtext(26);
430
+ i0.ɵɵpipe(27, "translate");
431
+ i0.ɵɵpipe(28, "async");
432
+ i0.ɵɵelementEnd();
433
+ i0.ɵɵelementStart(29, "p", 13);
434
+ i0.ɵɵtext(30);
435
+ i0.ɵɵpipe(31, "translate");
436
+ i0.ɵɵpipe(32, "number");
437
+ i0.ɵɵelementEnd();
438
+ } if (rf & 2) {
439
+ const _r1 = i0.ɵɵreference(4);
440
+ const _r4 = i0.ɵɵreference(7);
441
+ i0.ɵɵadvance(2);
442
+ i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r1);
443
+ i0.ɵɵadvance(3);
444
+ i0.ɵɵproperty("ngIf", ctx.units)("ngIfElse", _r4);
445
+ i0.ɵɵadvance(3);
446
+ i0.ɵɵattribute("aria-label", i0.ɵɵpipeBind1(9, 18, "igo.integration.advanced-map-tool.advanced-coordinates.copy"));
447
+ i0.ɵɵadvance(3);
448
+ i0.ɵɵproperty("formGroup", ctx.form);
449
+ i0.ɵɵadvance(3);
450
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(15, 20, "igo.integration.advanced-map-tool.advanced-coordinates.coordSystem"));
451
+ i0.ɵɵadvance(2);
452
+ i0.ɵɵproperty("value", ctx.inputProj);
453
+ i0.ɵɵadvance(1);
454
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(18, 22, ctx.projections$));
455
+ i0.ɵɵadvance(2);
456
+ i0.ɵɵproperty("checked", ctx.center)("labelPosition", "before");
457
+ i0.ɵɵadvance(1);
458
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 24, "igo.integration.advanced-map-tool.advanced-coordinates.center"), " ");
459
+ i0.ɵɵadvance(3);
460
+ i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(24, 26, "igo.integration.advanced-map-tool.advanced-coordinates.zoom"), " ", ctx.map.viewController.getZoom(), "");
461
+ i0.ɵɵadvance(3);
462
+ i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(27, 28, "igo.integration.advanced-map-tool.advanced-coordinates.scale"), " ", i0.ɵɵpipeBind1(28, 30, ctx.formattedScale$), "");
463
+ i0.ɵɵadvance(4);
464
+ i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(31, 32, "igo.integration.advanced-map-tool.advanced-coordinates.resolution"), " ", i0.ɵɵpipeBind2(32, 34, ctx.map.viewController.getResolution(), "1.0-0"), "");
465
+ } }, dependencies: [i3.ɵNgNoValidate, i3.NgControlStatusGroup, i3.FormGroupDirective, i4.MatFormField, i4.MatLabel, i5.MatSelect, i6.MatOption, i7.MatInput, i8.NgForOf, i8.NgIf, i9.MatIcon, i10.MatSlideToggle, i11.MatButton, i8.AsyncPipe, i8.DecimalPipe, i12.TranslatePipe], styles: ["textarea[_ngcontent-%COMP%]{resize:none}mat-form-field[_ngcontent-%COMP%]{padding:10px 15px}mat-form-field.coordinates2[_ngcontent-%COMP%]{padding:0 10px 0 3px}mat-form-field.igo-input-container[_ngcontent-%COMP%]{width:100%;padding:0 15px}.igo-form-button-group[_ngcontent-%COMP%]{padding:0 10px;margin:0 10px}.igo-zoom[_ngcontent-%COMP%]{padding:0 15px}.advanced-coordinates__coordinates-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center}.advanced-coordinates__coordinates-container__inner[_ngcontent-%COMP%]{flex:1 1 0}.advanced-coordinates__coordinates-container__inner[_ngcontent-%COMP%] .mat-form-field[_ngcontent-%COMP%]{width:50%}.advanced-coordinates__form[_ngcontent-%COMP%] .mat-slide-toggle{padding:10px 15px 35px;width:100%}.advanced-coordinates__form[_ngcontent-%COMP%] .mat-slide-toggle-content{width:100%}"] });
466
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AdvancedCoordinatesComponent, [{
467
+ type: Component,
468
+ args: [{ selector: 'igo-advanced-coordinates', template: "<div class=\"advanced-coordinates__coordinates-container\">\n <div class=\"advanced-coordinates__coordinates-container__inner\">\n <mat-form-field *ngIf=\"units; else elseBlock\" class=\"coordinates\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lon' | translate\"\n [value]=\"coordinates[0]\"></textarea>\n </mat-form-field>\n <ng-template #elseBlock >\n <mat-form-field class=\"coordinates\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.est' | translate\"\n [value]=\"coordinates[0]\"></textarea></mat-form-field>\n </ng-template>\n\n <mat-form-field *ngIf=\"units; else elseBlock2\" class=\"coordinates2\">\n <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.lat' | translate\"\n [value]=\"coordinates[1]\"></textarea>\n </mat-form-field>\n <ng-template #elseBlock2 >\n <mat-form-field class=\"coordinates2\"> <textarea #textArea matInput readonly rows=\"1\"\n [placeholder]=\"'igo.integration.advanced-map-tool.advanced-coordinates.nord' | translate\"\n [value]=\"coordinates[1]\"></textarea></mat-form-field>\n </ng-template>\n </div>\n\n <button mat-icon-button [attr.aria-label]=\"'igo.integration.advanced-map-tool.advanced-coordinates.copy' | translate\" class=\"igo-form-button-group advanced-coordinates__copy-coordinates\"\n (click)=\"copyTextToClipboard()\">\n <mat-icon svgIcon=\"content-copy\"></mat-icon>\n</button>\n</div>\n<form class=\"igo-form advanced-coordinates__form\" [formGroup]=\"form\">\n <mat-form-field class=\"igo-input-container\">\n <mat-label>{{'igo.integration.advanced-map-tool.advanced-coordinates.coordSystem' | translate}}</mat-label>\n <mat-select [(value)]=\"inputProj\">\n <mat-option matTooltipShowDelay=\"500\"\n *ngFor=\"let projection of (projections$ | async)\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\">\n {{projection.translatedValue || projection.alias }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-slide-toggle class=\"center-toggle mat-typography\"\n [checked]=\"center\"\n [labelPosition]=\"'before'\"\n (change)=\"displayCenter($event.checked)\">\n {{'igo.integration.advanced-map-tool.advanced-coordinates.center' | translate}}\n </mat-slide-toggle> \n</form>\n\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.zoom' | translate}} {{map.viewController.getZoom() }}</p>\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.scale' | translate}} {{ formattedScale$ | async }}</p>\n<p class=\"igo-zoom mat-typography\">{{'igo.integration.advanced-map-tool.advanced-coordinates.resolution' | translate}} {{map.viewController.getResolution() | number: '1.0-0' }}</p>", styles: ["textarea{resize:none}mat-form-field{padding:10px 15px}mat-form-field.coordinates2{padding:0 10px 0 3px}mat-form-field.igo-input-container{width:100%;padding:0 15px}.igo-form-button-group{padding:0 10px;margin:0 10px}.igo-zoom{padding:0 15px}.advanced-coordinates__coordinates-container{display:flex;flex-direction:row;align-items:center}.advanced-coordinates__coordinates-container__inner{flex:1 1 0}.advanced-coordinates__coordinates-container__inner .mat-form-field{width:50%}.advanced-coordinates__form ::ng-deep .mat-slide-toggle{padding:10px 15px 35px;width:100%}.advanced-coordinates__form ::ng-deep .mat-slide-toggle-content{width:100%}\n"] }]
469
+ }], function () { return [{ type: i1.MapState }, { type: i2.LanguageService }, { type: i2.MessageService }, { type: i0.ChangeDetectorRef }, { type: i2.StorageService }, { type: i2.ConfigService }, { type: i3.UntypedFormBuilder }]; }, { projectionsLimitations: [{
470
+ type: Input
471
+ }] }); })();
472
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaW50ZWdyYXRpb24vc3JjL2xpYi9tYXAvYWR2YW5jZWQtbWFwLXRvb2wvYWR2YW5jZWQtY29vcmRpbmF0ZXMvYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUEyRCxNQUFNLFdBQVcsQ0FBQztBQUVqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBbUQsWUFBWSxFQUFpQixNQUFNLFlBQVksQ0FBQztBQUMxRyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUF3QyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7OztJQ1A5QiwwQ0FBa0U7SUFDOUQsbUNBRXNDOztJQUMxQyxpQkFBaUI7OztJQUZYLGVBQXdGO0lBQXhGLGdIQUF3RixnQ0FBQTs7O0lBSTVGLDBDQUFvQztJQUNsQyxtQ0FFa0M7O0lB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RkFLYTs7UUFDZixpQkFBYSxFQUFBO1FBRWYsNkNBRzJDO1FBQXpDLDRIQUFVLGlDQUE2QixJQUFDO1FBQ3hDLGFBQ0Y7O1FBQUEsaUJBQW1CLEVBQUE7UUFHckIsOEJBQW1DO1FBQUEsYUFBK0c7O1FBQUEsaUJBQUk7UUFDdEosOEJBQW1DO1FBQUEsYUFBNEc7OztRQUFBLGlCQUFJO1FBQ25KLDhCQUFtQztRQUFBLGFBQTZJOzs7UUFBQSxpQkFBSTs7OztRQW5EL0osZUFBYTtRQUFiLGdDQUFhLGlCQUFBO1FBWWIsZUFBYTtRQUFiLGdDQUFhLGlCQUFBO1FBWVIsZUFBNkY7UUFBN0Ysa0hBQTZGO1FBS3JFLGVBQWtCO1FBQWxCLG9DQUFrQjtRQUVyRCxlQUFvRjtRQUFwRixrSEFBb0Y7UUFDbkYsZUFBcUI7UUFBckIscUNBQXFCO1FBRU4sZUFBeUI7UUFBekIsa0VBQXlCO1FBUXBELGVBQWtCO1FBQWxCLG9DQUFrQiwyQkFBQTtRQUdsQixlQUNGO1FBREUsd0hBQ0Y7UUFHaUMsZUFBK0c7UUFBL0csMkpBQStHO1FBQy9HLGVBQTRHO1FBQTVHLHVLQUE0RztRQUM1RyxlQUE2STtRQUE3SSx3TUFBNkk7O3VGRG5DbkssNEJBQTRCO2NBTHhDLFNBQVM7MkJBQ0UsMEJBQTBCO2dQQXFDaEMsc0JBQXNCO2tCQUR6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXRTY2FsZSwgSWdvTWFwLCBJbnB1dFByb2plY3Rpb25zLCBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucyB9IGZyb20gJ0BpZ28yL2dlbyc7XG5pbXBvcnQgeyBNYXBTdGF0ZSB9IGZyb20gJy4uLy4uL21hcC5zdGF0ZSc7XG5pbXBvcnQgeyBDbGlwYm9hcmQgfSBmcm9tICdAaWdvMi91dGlscyc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSwgTGFuZ3VhZ2VTZXJ2aWNlLCBTdG9yYWdlU2VydmljZSwgU3RvcmFnZVNjb3BlLCBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgem9uZU10bSwgem9uZVV0bSwgY29tcHV0ZVByb2plY3Rpb25zQ29uc3RyYWludHMgfSBmcm9tICdAaWdvMi9nZW8nO1xuaW1wb3J0ICogYXMgb2xwcm9qIGZyb20gJ29sL3Byb2onO1xuLyoqXG4gKiBUb29sIHRvIGRpc3BsYXkgdGhlIGNvb3JkaW5hdGVzIGFuZCBhIGN1cnNvciBvZiB0aGUgY2VudGVyIG9mIHRoZSBtYXBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLWFkdmFuY2VkLWNvb3JkaW5hdGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLWNvb3JkaW5hdGVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZENvb3JkaW5hdGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwdWJsaWMgZm9ybWF0dGVkU2NhbGUkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICBwdWJsaWMgcHJvamVjdGlvbnMkOiBCZWhhdmlvclN1YmplY3Q8SW5wdXRQcm9qZWN0aW9uc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHVibGljIGNvb3JkaW5hdGVzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBjdXJyZW50Q2VudGVyRGVmYXVsdFByb2o6IFtudW1iZXIsIG51bWJlcl07XG4gIHB1YmxpYyBjZW50ZXI6IGJvb2xlYW4gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnY2VudGVyVG9nZ2xlJykgYXMgYm9vbGVhbjtcbiAgcHJpdmF0ZSBpbk10bVpvbmU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIGluTGFtYmVydDIgPSB7MzIxOTg6IHRydWUsIDM3OTg6IHRydWV9O1xuICBwcml2YXRlIG1hcFN0YXRlJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfcHJvamVjdGlvbnNMaW1pdGF0aW9uczogUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnMgPSB7fTtcbiAgcHJpdmF0ZSBwcm9qZWN0aW9uc0NvbnN0cmFpbnRzOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucztcbiAgcHJpdmF0ZSBkZWZhdWx0UHJvajogSW5wdXRQcm9qZWN0aW9ucyA9IHtcbiAgICB0cmFuc2xhdGVkVmFsdWU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMud2dzODQnLCB7IGNvZGU6ICdFUFNHOjQzMjYnIH0pLFxuICAgIHRyYW5zbGF0ZUtleTogJ3dnczg0JywgYWxpYXM6ICdXR1M4NCcsIGNvZGU6ICdFUFNHOjQzMjYnLCB6b25lOiAnJ1xuICB9O1xuICBwcml2YXRlIGN1cnJlbnRab25lcyA9IHsgdXRtOiB1bmRlZmluZWQsIG10bTogdW5kZWZpbmVkIH07XG4gIHB1YmxpYyB1bml0czogYm9vbGVhbiA9IHRydWU7XG4gIGdldCBtYXAoKTogSWdvTWFwIHtcbiAgICByZXR1cm4gdGhpcy5tYXBTdGF0ZS5tYXA7XG4gIH1cblxuICBnZXQgaW5wdXRQcm9qKCk6IElucHV0UHJvamVjdGlvbnMge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdpbnB1dFByb2onKS52YWx1ZTtcbiAgfVxuICBzZXQgaW5wdXRQcm9qKHZhbHVlOiBJbnB1dFByb2plY3Rpb25zKSB7XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBpbnB1dFByb2o6IHZhbHVlIH0pO1xuICB9XG4gIGdldCBwcm9qZWN0aW9uc0xpbWl0YXRpb25zKCk6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvamVjdGlvbnNMaW1pdGF0aW9ucyB8fCB7fTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBwcm9qZWN0aW9uc0xpbWl0YXRpb25zKHZhbHVlOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucykge1xuICAgIHRoaXMuX3Byb2plY3Rpb25zTGltaXRhdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtYXBTdGF0ZTogTWFwU3RhdGUsXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIpIHtcbiAgICAgIHRoaXMuY29tcHV0ZVByb2plY3Rpb25zKCk7XG4gICAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIH1cblxuICAvKipcbiAgICogTGlzdGVuIGEgc3RhdGUgb2YgdGhlIG1hcCwgYSBzdGF0ZSBvZiBhIGZvcm0sIHVwZGF0ZSB0aGUgY29vcmRpbmF0ZXNcbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWFwU3RhdGUkJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMubWFwLnZpZXdDb250cm9sbGVyLnN0YXRlJC5waXBlKGRlYm91bmNlVGltZSg1MCkpLCB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzXSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFNjYWxlVmFsdWUodGhpcy5tYXApO1xuICAgICAgdGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2ogPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5nZXRDZW50ZXIodGhpcy5kZWZhdWx0UHJvai5jb2RlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNdG1ab25lID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICBjb25zdCBjdXJyZW50VXRtWm9uZSA9IHpvbmVVdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xuICAgICAgaWYgKCF0aGlzLmluTXRtWm9uZSAmJiBjdXJyZW50TXRtWm9uZSAhPT0gdGhpcy5jdXJyZW50Wm9uZXMubXRtKSB7XG4gICAgICAgIHRoaXMuYmFjazJxdWViZWMoKTtcbiAgICAgIH1cbiAgICAgIGxldCB6b25lQ2hhbmdlID0gZmFsc2U7XG4gICAgICBpZiAoY3VycmVudE10bVpvbmUgIT09IHRoaXMuY3VycmVudFpvbmVzLm10bSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRab25lcy5tdG0gPSBjdXJyZW50TXRtWm9uZTtcbiAgICAgICAgem9uZUNoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFV0bVpvbmUgIT09IHRoaXMuY3VycmVudFpvbmVzLnV0bSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRab25lcy51dG0gPSBjdXJyZW50VXRtWm9uZTtcbiAgICAgICAgem9uZUNoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoem9uZUNoYW5nZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVByb2plY3Rpb25zWm9uZUNoYW5nZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGVja0xhbWJlcnQodGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2opO1xuICAgICAgdGhpcy5jb29yZGluYXRlcyA9IHRoaXMuZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQoJ2N1cnJlbnRQcm9qZWN0aW9uJywgdGhpcy5pbnB1dFByb2osIFN0b3JhZ2VTY29wZS5TRVNTSU9OKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBJbnB1dFByb2ogPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnY3VycmVudFByb2plY3Rpb24nKSBhcyBJbnB1dFByb2plY3Rpb25zO1xuICAgIHRoaXMuaW5wdXRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWVbMF07XG4gICAgaWYgKHRlbXBJbnB1dFByb2ogIT09IG51bGwpXG4gICAge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5wb3NpdGlvbkluTGlzdCh0ZW1wSW5wdXRQcm9qKTtcbiAgICAgIHRoaXMuaW5wdXRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWVbcG9zXTtcbiAgICAgIHRoaXMudXBkYXRlWm9uZU10bVV0bSgpO1xuICAgIH1cbiAgICB0aGlzLm1hcC5tYXBDZW50ZXIkLm5leHQodGhpcy5jZW50ZXIpO1xuICAgIHRoaXMuY29vcmRpbmF0ZXMgPSB0aGlzLmdldENvb3JkaW5hdGVzKCk7XG4gICAgdGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2ogPSB0aGlzLm1hcC52aWV3Q29udHJvbGxlci5nZXRDZW50ZXIodGhpcy5kZWZhdWx0UHJvai5jb2RlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubWFwLm1hcENlbnRlciQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5tYXBTdGF0ZSQkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRTY2FsZVZhbHVlKG1hcDogSWdvTWFwKSB7XG4gICAgdGhpcy5mb3JtYXR0ZWRTY2FsZSQubmV4dCgnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwLnZpZXdDb250cm9sbGVyLmdldFNjYWxlKCkpKTtcbiAgfVxuICAvKipcbiAgICogQ29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgbWFwIG9uIHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW1lIG9mIGNvb3JkaW5hdGVzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHR3byBudW1iZXJzXG4gICAqL1xuICBnZXRDb29yZGluYXRlcygpOiBzdHJpbmdbXSB7XG4gICAgdGhpcy5jdXJyZW50Wm9uZXMubXRtID0gem9uZU10bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgdGhpcy5jdXJyZW50Wm9uZXMudXRtID0gem9uZVV0bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgbGV0IGNvb3JkO1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLmlucHV0UHJvai5jb2RlO1xuICAgIGxldCBkZWNpbWFsID0gMjtcbiAgICBpZiAoY29kZS5pbmNsdWRlcygnRVBTRzo0MzI2JykgfHwgY29kZS5pbmNsdWRlcygnRVBTRzo0MjY5JykpIHtcbiAgICAgIGRlY2ltYWwgPSA1O1xuICAgIH1cbiAgICB0aGlzLnVuaXRzID0gKGNvZGUgPT09ICdFUFNHOjQzMjYnIHx8IGNvZGUgPT09ICdFUFNHOjQyNjknKTtcbiAgICBjb29yZCA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldENlbnRlcihjb2RlKS5tYXAoYyA9PiBjLnRvRml4ZWQoZGVjaW1hbCkpO1xuICAgIHJldHVybiBjb29yZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSBjb29yZGluYXRlcyB0byBhIGNsaXBib2FyZFxuICAgKi9cbiAgY29weVRleHRUb0NsaXBib2FyZCgpOiB2b2lkIHtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gQ2xpcGJvYXJkLmNvcHkodGhpcy5jb29yZGluYXRlcy50b1N0cmluZygpKTtcbiAgICBpZiAoc3VjY2Vzc2Z1bCkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHlNc2cnLFxuICAgICAgICAnaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHlUaXRsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGEgY3Vyc29yIG9uIHRoZSBjZW50ZXIgb2YgdGhlIG1hcFxuICAgKi9cbiAgZGlzcGxheUNlbnRlcih0b2dnbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNlbnRlciA9IHRvZ2dsZTtcbiAgICB0aGlzLm1hcC5tYXBDZW50ZXIkLm5leHQodG9nZ2xlKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCgnY2VudGVyVG9nZ2xlJywgdG9nZ2xlLCBTdG9yYWdlU2NvcGUuU0VTU0lPTik7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRlciBvZiB0aGUgZm9ybVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBpbnB1dFByb2o6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBsaXN0IG9mIHByb2plY3Rpb25zIGFmdGVyIGNoYW5naW5nIG9mIHRoZSBzdGF0ZSBvZiB0aGUgbWFwXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVByb2plY3Rpb25zWm9uZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBsZXQgbW9kaWZpZWRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWU7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIG1vZGlmaWVkUHJvai5tYXAocCA9PiB7XG4gICAgICBpZiAocC50cmFuc2xhdGVLZXkgPT09ICdtdG0nKSB7XG4gICAgICAgIGNvbnN0IHpvbmUgPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICAgICAgaWYgKHpvbmUpIHtcbiAgICAgICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzIxOCR7em9uZX1gIDogYEVQU0c6MzIxJHs4MCArIHpvbmV9YDtcbiAgICAgICAgICBwLmFsaWFzID0gYE1UTSAke3pvbmV9YDtcbiAgICAgICAgICBwLmNvZGUgPSBjb2RlO1xuICAgICAgICAgIHAuem9uZSA9IGAke3pvbmV9YDtcbiAgICAgICAgICBwLnRyYW5zbGF0ZWRWYWx1ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMubXRtJywgcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcC5hbGlhcyA9ICcnO1xuICAgICAgICAgIHRoaXMuaW5NdG1ab25lID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXRQcm9qLnRyYW5zbGF0ZUtleSA9PT0gJ210bScpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRQcm9qID0gdGhpcy5wcm9qZWN0aW9ucyQudmFsdWVbMF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocC50cmFuc2xhdGVLZXkgPT09ICd1dG0nKSB7XG4gICAgICAgIGNvbnN0IHpvbmUgPSB6b25lVXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICAgICAgY29uc3QgY29kZSA9IGBFUFNHOjMyNiR7em9uZX1gO1xuICAgICAgICBwLmFsaWFzID0gYFVUTSAke3pvbmV9YDtcbiAgICAgICAgcC5jb2RlID0gY29kZTtcbiAgICAgICAgcC56b25lID0gYCR7em9uZX1gO1xuICAgICAgICBwLnRyYW5zbGF0ZWRWYWx1ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ucHJvamVjdGlvbnMudXRtJywgcCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9kaWZpZWRQcm9qID0gbW9kaWZpZWRQcm9qLmZpbHRlcihwID0+IHAuYWxpYXMgIT09ICcnKTtcbiAgICB0aGlzLnByb2plY3Rpb25zJC5uZXh0KG1vZGlmaWVkUHJvaik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbGlzdCBvZiBjdXJyZW50cyBwcm9qZWN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlUHJvamVjdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzID0gY29tcHV0ZVByb2plY3Rpb25zQ29uc3RyYWludHModGhpcy5wcm9qZWN0aW9uc0xpbWl0YXRpb25zKTtcbiAgICBjb25zdCBwcm9qZWN0aW9uczogSW5wdXRQcm9qZWN0aW9uc1tdID0gW107XG5cbiAgICBpZiAoIXRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvaiA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldENlbnRlcih0aGlzLmRlZmF1bHRQcm9qLmNvZGUpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLndnczg0KSB7XG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLndnczg0JywgeyBjb2RlOiAnRVBTRzo0MzI2JyB9KSxcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAnd2dzODQnLCBhbGlhczogJ1dHUzg0JywgY29kZTogJ0VQU0c6NDMyNicsIHpvbmU6ICcnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm5hZDgzKSB7XG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm5hZDgzJywgeyBjb2RlOiAnRVBTRzo0MjY5JyB9KSxcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAnbmFkODMnLCBhbGlhczogJ05BRDgzJywgY29kZTogJ0VQU0c6NDI2OScsIHpvbmU6ICcnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLndlYk1lcmNhdG9yKSB7XG4gICAgICBwcm9qZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLndlYk1lcmNhdG9yJywgeyBjb2RlOiAnRVBTRzozODU3JyB9KSxcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAnd2ViTWVyY2F0b3InLCBhbGlhczogJ1dlYiBNZXJjYXRvcicsIGNvZGU6ICdFUFNHOjM4NTcnLCB6b25lOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMubXRtKSB7XG4gICAgICAvLyBRdWViZWNcbiAgICAgIGNvbnN0IHpvbmUgPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICAgIGlmICh6b25lKSB7XG4gICAgICAgIHRoaXMuaW5NdG1ab25lID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyMTgke3pvbmV9YCA6IGBFUFNHOjMyMSR7ODAgKyB6b25lfWA7XG4gICAgICAgIHByb2plY3Rpb25zLnNwbGljZSgzLCAwLCB7XG4gICAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLm10bScsIHsgY29kZSwgem9uZSB9KSxcbiAgICAgICAgICB0cmFuc2xhdGVLZXk6ICdtdG0nLCBhbGlhczogYE1UTSAke3pvbmV9YCwgY29kZSwgem9uZTogYCR7em9uZX1gXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuaW5NdG1ab25lID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMudXRtKSB7XG4gICAgICBjb25zdCBvcmRlciA9IHRoaXMuaW5NdG1ab25lID8gNCA6IDM7XG4gICAgICBjb25zdCB6b25lID0gem9uZVV0bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzI2MCR7em9uZX1gIDogYEVQU0c6MzI2JHt6b25lfWA7XG4gICAgICBwcm9qZWN0aW9ucy5zcGxpY2Uob3JkZXIsIDAsIHtcbiAgICAgICAgdHJhbnNsYXRlZFZhbHVlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLnV0bScsIHsgY29kZSwgem9uZSB9KSxcbiAgICAgICAgdHJhbnNsYXRlS2V5OiAndXRtJywgYWxpYXM6IGBVVE0gJHt6b25lfWAsIGNvZGUsIHpvbmU6IGAke3pvbmV9YFxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBjb25maWdQcm9qZWN0aW9uID0gW107XG4gICAgaWYgKHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy5wcm9qRnJvbUNvbmZpZykge1xuICAgICAgY29uZmlnUHJvamVjdGlvbiA9IHRoaXMuY29uZmlnLmdldENvbmZpZygncHJvamVjdGlvbnMnKSB8fCBbXTtcbiAgICB9XG4gICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChwcm9qZWN0aW9ucy5jb25jYXQoY29uZmlnUHJvamVjdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggdGhlIE1UTSBpbiB0aGUgYXJyYXkgb2Ygc3lzdGVtZSBvZiBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0gcHJvamVjdGlvbnMgQXJyYXkgb2YgdGhlIElucHV0UHJvamVjdGlvbnNcbiAgICovXG4gIHByaXZhdGUgcHVzaE10bShwcm9qZWN0aW9uczogQXJyYXk8SW5wdXRQcm9qZWN0aW9ucz4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm10bSkge1xuICAgICAgY29uc3Qgem9uZSA9IHpvbmVNdG0odGhpcy5jdXJyZW50Q2VudGVyRGVmYXVsdFByb2pbMF0pO1xuICAgICAgY29uc3QgY29kZSA9IHpvbmUgPCAxMCA/IGBFUFNHOjMyMTgke3pvbmV9YCA6IGBFUFNHOjMyMSR7ODAgKyB6b25lfWA7XG4gICAgICBwcm9qZWN0aW9ucy5zcGxpY2UoMywgMCwge1xuICAgICAgICAgIHRyYW5zbGF0ZWRWYWx1ZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5tdG0nLCB7IGNvZGUsIHpvbmUgfSksXG4gICAgICAgICAgdHJhbnNsYXRlS2V5OiAnbXRtJywgYWxpYXM6IGBNVE0gJHt6b25lfWAsIGNvZGUsIHpvbmU6IGAke3pvbmV9YH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBsaXN0IG9mIHN5c3RlbXMgb2YgY29vcmRpbmF0ZXMgZm9yIHRlcnJpdG9yeSBvZiBRdWViZWNcbiAgICogcHVzaCBNVE0gYW5kIFVUTSBpbiB0aGUgQXJyYXlcbiAgICovXG4gIHByaXZhdGUgYmFjazJxdWViZWMoKTogdm9pZCB7XG4gICAgY29uc3QgcHJvamVjdGlvbnMgPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZTtcbiAgICB0aGlzLnB1c2hNdG0ocHJvamVjdGlvbnMpO1xuICAgIHRoaXMuaW5NdG1ab25lID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG51bWJlcnMgb2YgdGhlIHpvbmVzIHdoZW4gYXBwbGljYXRpb24gaXMgcmVzdGFydGVkXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVpvbmVNdG1VdG0oKSB7XG4gICAgaWYgKHRoaXMuaW5wdXRQcm9qLnRyYW5zbGF0ZUtleSA9PT0gJ210bScpIHtcbiAgICAgIGNvbnN0IHpvbmUgPSB6b25lTXRtKHRoaXMuY3VycmVudENlbnRlckRlZmF1bHRQcm9qWzBdKTtcbiAgICAgIHRoaXMuaW5wdXRQcm9qLmFsaWFzID0gYE1UTSAke3pvbmV9YDtcbiAgICAgIGNvbnN0IGNvZGUgPSB6b25lIDwgMTAgPyBgRVBTRzozMjE4JHt6b25lfWAgOiBgRVBTRzozMjEkezgwICsgem9uZX1gO1xuICAgICAgdGhpcy5pbnB1dFByb2ouY29kZSA9IGNvZGU7XG4gICAgICB0aGlzLmlucHV0UHJvai56b25lID0gYCR7em9uZX1gO1xuICAgICAgdGhpcy5pbnB1dFByb2oudHJhbnNsYXRlZFZhbHVlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5tdG0nLCB7IGNvZGUsIHpvbmUgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlucHV0UHJvai50cmFuc2xhdGVLZXkgPT09ICd1dG0nKSB7XG4gICAgICBjb25zdCB6b25lID0gem9uZVV0bSh0aGlzLmN1cnJlbnRDZW50ZXJEZWZhdWx0UHJvalswXSk7XG4gICAgICB0aGlzLmlucHV0UHJvai5hbGlhcyA9IGBVVE0gJHt6b25lfWA7XG4gICAgICBjb25zdCBjb2RlID0gem9uZSA8IDEwID8gYEVQU0c6MzI2MCR7em9uZX1gIDogYEVQU0c6MzI2JHt6b25lfWA7XG4gICAgICB0aGlzLmlucHV0UHJvai5jb2RlID0gY29kZTtcbiAgICAgIHRoaXMuaW5wdXRQcm9qLnpvbmUgPSBgJHt6b25lfWA7XG4gICAgICB0aGlzLmlucHV0UHJvai50cmFuc2xhdGVkVmFsdWUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLnV0bScsIHsgY29kZSwgem9uZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgcG9zaXRpb24gb2YgYSBjdXJyZW50IHByb2plY3Rpb24gaW4gYSBsaXN0LiAwIGlmIHRoZSBwcm9qZWN0aW9uIGlzIG5vdCBpbiB0aGUgbGlzdFxuICAgKiBAcGFyYW0gdHJhbnNsYXRlS2V5IHN0cmluZywgdHJhbnNsYXRlIGtleSBvZiBhIHByb2plY3Rpb25cbiAgICogQHJldHVybnMgbnVtZXJpYywgcG9zaXRpb24gb2YgYW4gZWxlbWVudCBpbiB0aGUgYXJyYXlcbiAgICovXG4gIHBvc2l0aW9uSW5MaXN0KHRlbXBJbnB1dFByb2o6IElucHV0UHJvamVjdGlvbnMpOiBudW1iZXIge1xuICAgIGNvbnN0IHRrID0gdGVtcElucHV0UHJvai50cmFuc2xhdGVLZXk7XG4gICAgY29uc3QgYWxpYXMgPSB0ZW1wSW5wdXRQcm9qLmFsaWFzO1xuICAgIGxldCBwb3NpdGlvbjsgLy8gPSB1bmRlZmluZWQ7XG4gICAgbGV0IGl0ZXIgPSAwO1xuICAgIHRoaXMucHJvamVjdGlvbnMkLnZhbHVlLm1hcCgocHJvamVjdGlvbikgPT4ge1xuICAgICAgaWYgKHRrKSB7XG4gICAgICAgIGlmICh0ayA9PT0gcHJvamVjdGlvbi50cmFuc2xhdGVLZXkpIHtcbiAgICAgICAgICBwb3NpdGlvbiA9IGl0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGFsaWFzID09PSBwcm9qZWN0aW9uLmFsaWFzKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaXRlcjtcbiAgICAgIH1cbiAgICAgIGl0ZXIrKztcbiAgICB9KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID8gcG9zaXRpb24gOiAwO1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGxpc3Qgb2YgcHJvamVjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBwcm9qZWN0aW9ucyBvZiBMYW1iZXJ0XG4gICAqIEBwYXJhbSBjb29yZGluYXRlcyBBbiBhcnJheSBvZiBudW1iZXJzLCBsb25naXR1ZGUgYW5kIGxhdGl0dWRlXG4gICAqL1xuICBjaGVja0xhbWJlcnQoY29vcmRpbmF0ZXM6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBsYW1iZXJ0UHJvamVjdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ3Byb2plY3Rpb25zJyk7XG4gICAgbGFtYmVydFByb2plY3Rpb25zLmZvckVhY2gocHJvamVjdGlvbiA9PiB7XG4gICAgICAgIGxldCBtb2RpZmllZFByb2ogPSB0aGlzLnByb2plY3Rpb25zJC52YWx1ZTtcbiAgICAgICAgY29uc3QgZXh0ZW50ID0gcHJvamVjdGlvbi5leHRlbnQ7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBwcm9qZWN0aW9uLmNvZGUubWF0Y2goL1xcZCsvKTtcbiAgICAgICAgY29uc3QgY3VycmVudEV4dGVudFdHUyA9IG9scHJvai50cmFuc2Zvcm1FeHRlbnQoZXh0ZW50LCBwcm9qZWN0aW9uLmNvZGUsIHRoaXMuZGVmYXVsdFByb2ouY29kZSk7XG4gICAgICAgIGlmIChjb29yZGluYXRlc1swXSA8IGN1cnJlbnRFeHRlbnRXR1NbMF0gfHwgY29vcmRpbmF0ZXNbMF0gPiBjdXJyZW50RXh0ZW50V0dTWzJdIHx8XG4gICAgICAgICAgICBjb29yZGluYXRlc1sxXSA8IGN1cnJlbnRFeHRlbnRXR1NbMV0gfHwgY29vcmRpbmF0ZXNbMV0gPiBjdXJyZW50RXh0ZW50V0dTWzNdKSB7XG4gICAgICAgICAgICB0aGlzLmluTGFtYmVydDJbY29kZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0UHJvai5hbGlhcyA9PT0gcHJvamVjdGlvbi5hbGlhcykge1xuICAgICAgICAgICAgICB0aGlzLmlucHV0UHJvaiA9IHRoaXMucHJvamVjdGlvbnMkLnZhbHVlWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbW9kaWZpZWRQcm9qID0gbW9kaWZpZWRQcm9qLmZpbHRlcihwID0+IHAuYWxpYXMgIT09IHByb2plY3Rpb24uYWxpYXMpO1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0aW9ucyQubmV4dChtb2RpZmllZFByb2opO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluTGFtYmVydDJbY29kZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3Rpb25zJC5uZXh0KG1vZGlmaWVkUHJvai5jb25jYXQocHJvamVjdGlvbikpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5MYW1iZXJ0Mltjb2RlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkdmFuY2VkLWNvb3JkaW5hdGVzX19jb29yZGluYXRlcy1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImFkdmFuY2VkLWNvb3JkaW5hdGVzX19jb29yZGluYXRlcy1jb250YWluZXJfX2lubmVyXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwidW5pdHM7IGVsc2UgZWxzZUJsb2NrXCIgY2xhc3M9XCJjb29yZGluYXRlc1wiPlxuICAgICAgICA8dGV4dGFyZWEgICN0ZXh0QXJlYSBtYXRJbnB1dCByZWFkb25seSByb3dzPVwiMVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMubG9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImNvb3JkaW5hdGVzWzBdXCI+PC90ZXh0YXJlYT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrID5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvb3JkaW5hdGVzXCI+XG4gICAgICAgIDx0ZXh0YXJlYSAjdGV4dEFyZWEgbWF0SW5wdXQgcmVhZG9ubHkgcm93cz1cIjFcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIidpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuZXN0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMF1cIj48L3RleHRhcmVhPjwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInVuaXRzOyBlbHNlIGVsc2VCbG9jazJcIiBjbGFzcz1cImNvb3JkaW5hdGVzMlwiPlxuICAgICAgICA8dGV4dGFyZWEgI3RleHRBcmVhIG1hdElucHV0IHJlYWRvbmx5IHJvd3M9XCIxXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5sYXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMV1cIj48L3RleHRhcmVhPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2syID5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImNvb3JkaW5hdGVzMlwiPiAgPHRleHRhcmVhICN0ZXh0QXJlYSBtYXRJbnB1dCByZWFkb25seSByb3dzPVwiMVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5ub3JkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbdmFsdWVdPVwiY29vcmRpbmF0ZXNbMV1cIj48L3RleHRhcmVhPjwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2F0dHIuYXJpYS1sYWJlbF09XCInaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNvcHknIHwgdHJhbnNsYXRlXCIgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXAgYWR2YW5jZWQtY29vcmRpbmF0ZXNfX2NvcHktY29vcmRpbmF0ZXNcIlxuICAgIChjbGljayk9XCJjb3B5VGV4dFRvQ2xpcGJvYXJkKClcIj5cbiAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvbnRlbnQtY29weVwiPjwvbWF0LWljb24+XG48L2J1dHRvbj5cbjwvZGl2PlxuPGZvcm0gY2xhc3M9XCJpZ28tZm9ybSBhZHZhbmNlZC1jb29yZGluYXRlc19fZm9ybVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpZ28taW5wdXQtY29udGFpbmVyXCI+XG4gICAgPG1hdC1sYWJlbD57eydpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMuY29vcmRTeXN0ZW0nIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cbiAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJpbnB1dFByb2pcIj5cbiAgICAgIDxtYXQtb3B0aW9uIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgcHJvamVjdGlvbiBvZiAocHJvamVjdGlvbnMkIHwgYXN5bmMpXCJcbiAgICAgICAgW3ZhbHVlXT1cInByb2plY3Rpb25cIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIHt7cHJvamVjdGlvbi50cmFuc2xhdGVkVmFsdWUgfHwgcHJvamVjdGlvbi5hbGlhcyB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPG1hdC1zbGlkZS10b2dnbGUgY2xhc3M9XCJjZW50ZXItdG9nZ2xlIG1hdC10eXBvZ3JhcGh5XCJcbiAgICBbY2hlY2tlZF09XCJjZW50ZXJcIlxuICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcbiAgICAoY2hhbmdlKT1cImRpc3BsYXlDZW50ZXIoJGV2ZW50LmNoZWNrZWQpXCI+XG4gICAge3snaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLmNlbnRlcicgfCB0cmFuc2xhdGV9fVxuICA8L21hdC1zbGlkZS10b2dnbGU+IFxuPC9mb3JtPlxuXG48cCBjbGFzcz1cImlnby16b29tIG1hdC10eXBvZ3JhcGh5XCI+e3snaWdvLmludGVncmF0aW9uLmFkdmFuY2VkLW1hcC10b29sLmFkdmFuY2VkLWNvb3JkaW5hdGVzLnpvb20nIHwgdHJhbnNsYXRlfX0ge3ttYXAudmlld0NvbnRyb2xsZXIuZ2V0Wm9vbSgpIH19PC9wPlxuPHAgY2xhc3M9XCJpZ28tem9vbSBtYXQtdHlwb2dyYXBoeVwiPnt7J2lnby5pbnRlZ3JhdGlvbi5hZHZhbmNlZC1tYXAtdG9vbC5hZHZhbmNlZC1jb29yZGluYXRlcy5zY2FsZScgfCB0cmFuc2xhdGV9fSB7eyBmb3JtYXR0ZWRTY2FsZSQgfCBhc3luYyB9fTwvcD5cbjxwIGNsYXNzPVwiaWdvLXpvb20gbWF0LXR5cG9ncmFwaHlcIj57eydpZ28uaW50ZWdyYXRpb24uYWR2YW5jZWQtbWFwLXRvb2wuYWR2YW5jZWQtY29vcmRpbmF0ZXMucmVzb2x1dGlvbicgfCB0cmFuc2xhdGV9fSB7e21hcC52aWV3Q29udHJvbGxlci5nZXRSZXNvbHV0aW9uKCkgfCBudW1iZXI6ICcxLjAtMCcgfX08L3A+Il19