@igo2/geo 18.0.1-next.2 → 18.0.2

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 (512) hide show
  1. package/esm2022/igo2-geo.mjs +5 -0
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +234 -0
  3. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +272 -0
  4. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +246 -0
  5. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +19 -0
  6. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +136 -0
  7. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +60 -0
  8. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +232 -0
  9. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +24 -0
  10. package/esm2022/lib/catalog/catalog-library/index.mjs +4 -0
  11. package/esm2022/lib/catalog/catalog.module.mjs +26 -0
  12. package/esm2022/lib/catalog/index.mjs +6 -0
  13. package/esm2022/lib/catalog/shared/catalog.abstract.mjs +32 -0
  14. package/esm2022/lib/catalog/shared/catalog.enum.mjs +16 -0
  15. package/esm2022/lib/catalog/shared/catalog.interface.mjs +2 -0
  16. package/esm2022/lib/catalog/shared/catalog.service.mjs +706 -0
  17. package/esm2022/lib/catalog/shared/catalogs.mjs +75 -0
  18. package/esm2022/lib/catalog/shared/index.mjs +5 -0
  19. package/esm2022/lib/datasource/index.mjs +3 -0
  20. package/esm2022/lib/datasource/shared/capabilities.interface.mjs +17 -0
  21. package/esm2022/lib/datasource/shared/capabilities.service.mjs +441 -0
  22. package/esm2022/lib/datasource/shared/datasource.service.mjs +258 -0
  23. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +2 -0
  24. package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +2 -0
  25. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +2 -0
  26. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +222 -0
  27. package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +2 -0
  28. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +118 -0
  29. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +2 -0
  30. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +24 -0
  31. package/esm2022/lib/datasource/shared/datasources/data.service.mjs +3 -0
  32. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +2 -0
  33. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +42 -0
  34. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +2 -0
  35. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +52 -0
  36. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +2 -0
  37. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +70 -0
  38. package/esm2022/lib/datasource/shared/datasources/index.mjs +36 -0
  39. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +2 -0
  40. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +33 -0
  41. package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +2 -0
  42. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +14 -0
  43. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +2 -0
  44. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +60 -0
  45. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +2 -0
  46. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +17 -0
  47. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +2 -0
  48. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +56 -0
  49. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +2 -0
  50. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +137 -0
  51. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +170 -0
  52. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +2 -0
  53. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +227 -0
  54. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +224 -0
  55. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +2 -0
  56. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +18 -0
  57. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +2 -0
  58. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +11 -0
  59. package/esm2022/lib/datasource/shared/index.mjs +6 -0
  60. package/esm2022/lib/datasource/shared/options/index.mjs +5 -0
  61. package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +2 -0
  62. package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +15 -0
  63. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +85 -0
  64. package/esm2022/lib/datasource/shared/options/options.service.mjs +3 -0
  65. package/esm2022/lib/datasource/utils/index.mjs +2 -0
  66. package/esm2022/lib/datasource/utils/tilegrid.mjs +20 -0
  67. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +246 -0
  68. package/esm2022/lib/directions/directions-buttons/index.mjs +2 -0
  69. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +312 -0
  70. package/esm2022/lib/directions/directions-inputs/index.mjs +2 -0
  71. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +192 -0
  72. package/esm2022/lib/directions/directions-results/index.mjs +2 -0
  73. package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +5 -0
  74. package/esm2022/lib/directions/directions-sources/directions-source.mjs +3 -0
  75. package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +23 -0
  76. package/esm2022/lib/directions/directions-sources/index.mjs +5 -0
  77. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +159 -0
  78. package/esm2022/lib/directions/directions.component.mjs +437 -0
  79. package/esm2022/lib/directions/directions.module.mjs +46 -0
  80. package/esm2022/lib/directions/directions.provider.mjs +16 -0
  81. package/esm2022/lib/directions/index.mjs +8 -0
  82. package/esm2022/lib/directions/shared/directions-source.service.mjs +18 -0
  83. package/esm2022/lib/directions/shared/directions.enum.mjs +72 -0
  84. package/esm2022/lib/directions/shared/directions.interface.mjs +2 -0
  85. package/esm2022/lib/directions/shared/directions.service.mjs +239 -0
  86. package/esm2022/lib/directions/shared/directions.utils.mjs +522 -0
  87. package/esm2022/lib/directions/shared/index.mjs +6 -0
  88. package/esm2022/lib/directions/shared/store.mjs +21 -0
  89. package/esm2022/lib/download/download-button/download-button.component.mjs +48 -0
  90. package/esm2022/lib/download/download-button/index.mjs +2 -0
  91. package/esm2022/lib/download/download.module.mjs +24 -0
  92. package/esm2022/lib/download/index.mjs +3 -0
  93. package/esm2022/lib/download/shared/download.interface.mjs +2 -0
  94. package/esm2022/lib/download/shared/download.service.mjs +67 -0
  95. package/esm2022/lib/download/shared/index.mjs +3 -0
  96. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +42 -0
  97. package/esm2022/lib/draw/draw/draw-popup.component.mjs +421 -0
  98. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +28 -0
  99. package/esm2022/lib/draw/draw/draw.component.mjs +1136 -0
  100. package/esm2022/lib/draw/draw/draw.module.mjs +19 -0
  101. package/esm2022/lib/draw/drawingTool.module.mjs +18 -0
  102. package/esm2022/lib/draw/index.mjs +3 -0
  103. package/esm2022/lib/draw/shared/draw-icon.service.mjs +30 -0
  104. package/esm2022/lib/draw/shared/draw.enum.mjs +21 -0
  105. package/esm2022/lib/draw/shared/draw.interface.mjs +2 -0
  106. package/esm2022/lib/draw/shared/draw.utils.mjs +125 -0
  107. package/esm2022/lib/draw/shared/index.mjs +5 -0
  108. package/esm2022/lib/environment/environment.interface.mjs +2 -0
  109. package/esm2022/lib/environment/index.mjs +2 -0
  110. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +306 -0
  111. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +56 -0
  112. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +26 -0
  113. package/esm2022/lib/feature/feature-details/index.mjs +4 -0
  114. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +101 -0
  115. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +19 -0
  116. package/esm2022/lib/feature/feature.module.mjs +26 -0
  117. package/esm2022/lib/feature/index.mjs +5 -0
  118. package/esm2022/lib/feature/shared/feature-store.utils.mjs +28 -0
  119. package/esm2022/lib/feature/shared/feature.enums.mjs +9 -0
  120. package/esm2022/lib/feature/shared/feature.interfaces.mjs +2 -0
  121. package/esm2022/lib/feature/shared/feature.utils.mjs +332 -0
  122. package/esm2022/lib/feature/shared/index.mjs +8 -0
  123. package/esm2022/lib/feature/shared/store.mjs +143 -0
  124. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +216 -0
  125. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +119 -0
  126. package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +99 -0
  127. package/esm2022/lib/feature/shared/strategies/index.mjs +8 -0
  128. package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +103 -0
  129. package/esm2022/lib/feature/shared/strategies/loading.mjs +136 -0
  130. package/esm2022/lib/feature/shared/strategies/search.mjs +158 -0
  131. package/esm2022/lib/feature/shared/strategies/selection.mjs +385 -0
  132. package/esm2022/lib/feature/shared/strategies.utils.mjs +37 -0
  133. package/esm2022/lib/filter/filter.module.mjs +131 -0
  134. package/esm2022/lib/filter/index.mjs +17 -0
  135. package/esm2022/lib/filter/ogc-filter-button/index.mjs +2 -0
  136. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +141 -0
  137. package/esm2022/lib/filter/ogc-filter-form/index.mjs +2 -0
  138. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +325 -0
  139. package/esm2022/lib/filter/ogc-filter-selection/index.mjs +2 -0
  140. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +787 -0
  141. package/esm2022/lib/filter/ogc-filter-time/index.mjs +3 -0
  142. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +201 -0
  143. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +665 -0
  144. package/esm2022/lib/filter/ogc-filterable-form/index.mjs +2 -0
  145. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +66 -0
  146. package/esm2022/lib/filter/ogc-filterable-item/index.mjs +2 -0
  147. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +244 -0
  148. package/esm2022/lib/filter/ogc-filterable-list/index.mjs +3 -0
  149. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +39 -0
  150. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +32 -0
  151. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +63 -0
  152. package/esm2022/lib/filter/shared/index.mjs +12 -0
  153. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +72 -0
  154. package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +30 -0
  155. package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +2 -0
  156. package/esm2022/lib/filter/shared/ogc-filter.mjs +756 -0
  157. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +47 -0
  158. package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +23 -0
  159. package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +2 -0
  160. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +282 -0
  161. package/esm2022/lib/filter/shared/time-filter.enum.mjs +13 -0
  162. package/esm2022/lib/filter/shared/time-filter.interface.mjs +2 -0
  163. package/esm2022/lib/filter/shared/time-filter.service.mjs +107 -0
  164. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +2 -0
  165. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +875 -0
  166. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +2 -0
  167. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +191 -0
  168. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +2 -0
  169. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +120 -0
  170. package/esm2022/lib/filter/time-filter-button/index.mjs +2 -0
  171. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +70 -0
  172. package/esm2022/lib/filter/time-filter-form/index.mjs +2 -0
  173. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +537 -0
  174. package/esm2022/lib/filter/time-filter-item/index.mjs +2 -0
  175. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +90 -0
  176. package/esm2022/lib/filter/time-filter-list/index.mjs +3 -0
  177. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +39 -0
  178. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +24 -0
  179. package/esm2022/lib/geo.module.mjs +63 -0
  180. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +559 -0
  181. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +170 -0
  182. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +24 -0
  183. package/esm2022/lib/geometry/geometry-form-field/index.mjs +4 -0
  184. package/esm2022/lib/geometry/geometry.module.mjs +18 -0
  185. package/esm2022/lib/geometry/index.mjs +3 -0
  186. package/esm2022/lib/geometry/shared/controls/draw.mjs +340 -0
  187. package/esm2022/lib/geometry/shared/controls/index.mjs +4 -0
  188. package/esm2022/lib/geometry/shared/controls/modify.mjs +538 -0
  189. package/esm2022/lib/geometry/shared/controls/slice.mjs +190 -0
  190. package/esm2022/lib/geometry/shared/geometry.errors.mjs +24 -0
  191. package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +2 -0
  192. package/esm2022/lib/geometry/shared/geometry.utils.mjs +113 -0
  193. package/esm2022/lib/geometry/shared/index.mjs +5 -0
  194. package/esm2022/lib/import-export/export-button/export-button.component.mjs +49 -0
  195. package/esm2022/lib/import-export/export-button/index.mjs +2 -0
  196. package/esm2022/lib/import-export/import-export/import-export.component.mjs +876 -0
  197. package/esm2022/lib/import-export/import-export/index.mjs +2 -0
  198. package/esm2022/lib/import-export/import-export.module.mjs +31 -0
  199. package/esm2022/lib/import-export/index.mjs +5 -0
  200. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +114 -0
  201. package/esm2022/lib/import-export/shared/export.errors.mjs +15 -0
  202. package/esm2022/lib/import-export/shared/export.interface.mjs +2 -0
  203. package/esm2022/lib/import-export/shared/export.service.mjs +378 -0
  204. package/esm2022/lib/import-export/shared/export.type.mjs +13 -0
  205. package/esm2022/lib/import-export/shared/export.utils.mjs +51 -0
  206. package/esm2022/lib/import-export/shared/import.errors.mjs +39 -0
  207. package/esm2022/lib/import-export/shared/import.interface.mjs +2 -0
  208. package/esm2022/lib/import-export/shared/import.service.mjs +221 -0
  209. package/esm2022/lib/import-export/shared/import.utils.mjs +203 -0
  210. package/esm2022/lib/import-export/shared/index.mjs +11 -0
  211. package/esm2022/lib/layer/index.mjs +16 -0
  212. package/esm2022/lib/layer/layer-group/index.mjs +2 -0
  213. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
  214. package/esm2022/lib/layer/layer-item/index.mjs +2 -0
  215. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +196 -0
  216. package/esm2022/lib/layer/layer-legend/index.mjs +2 -0
  217. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +287 -0
  218. package/esm2022/lib/layer/layer-legend-item/index.mjs +2 -0
  219. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +85 -0
  220. package/esm2022/lib/layer/layer-legend-list/index.mjs +3 -0
  221. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +54 -0
  222. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +104 -0
  223. package/esm2022/lib/layer/layer-list/index.mjs +2 -0
  224. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +232 -0
  225. package/esm2022/lib/layer/layer-list-tool/index.mjs +4 -0
  226. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +92 -0
  227. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -0
  228. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +61 -0
  229. package/esm2022/lib/layer/layer-search/index.mjs +2 -0
  230. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
  231. package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
  232. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +26 -0
  233. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
  234. package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
  235. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
  236. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
  237. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
  238. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
  239. package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
  240. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
  241. package/esm2022/lib/layer/layer.module.mjs +107 -0
  242. package/esm2022/lib/layer/shared/clusterParam.mjs +2 -0
  243. package/esm2022/lib/layer/shared/index.mjs +6 -0
  244. package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
  245. package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
  246. package/esm2022/lib/layer/shared/layer.enums.mjs +2 -0
  247. package/esm2022/lib/layer/shared/layer.service.mjs +315 -0
  248. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +2 -0
  249. package/esm2022/lib/layer/shared/layers/any-layer.mjs +2 -0
  250. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +2 -0
  251. package/esm2022/lib/layer/shared/layers/image-layer.mjs +75 -0
  252. package/esm2022/lib/layer/shared/layers/index.mjs +18 -0
  253. package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
  254. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
  255. package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
  256. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +7 -0
  257. package/esm2022/lib/layer/shared/layers/layer.mjs +178 -0
  258. package/esm2022/lib/layer/shared/layers/legend.interface.mjs +2 -0
  259. package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
  260. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
  261. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
  262. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
  263. package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +2 -0
  264. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +55 -0
  265. package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +2 -0
  266. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +576 -0
  267. package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +2 -0
  268. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +112 -0
  269. package/esm2022/lib/layer/track-feature-button/index.mjs +2 -0
  270. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +54 -0
  271. package/esm2022/lib/layer/utils/image-watcher.mjs +62 -0
  272. package/esm2022/lib/layer/utils/index.mjs +6 -0
  273. package/esm2022/lib/layer/utils/layer.utils.mjs +57 -0
  274. package/esm2022/lib/layer/utils/outputLegend.mjs +32 -0
  275. package/esm2022/lib/layer/utils/tile-watcher.mjs +52 -0
  276. package/esm2022/lib/layer/utils/vector-watcher.mjs +50 -0
  277. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +20 -0
  278. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +87 -0
  279. package/esm2022/lib/map/baselayers-switcher/index.mjs +3 -0
  280. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +122 -0
  281. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +78 -0
  282. package/esm2022/lib/map/geolocate-button/index.mjs +2 -0
  283. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +73 -0
  284. package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +2 -0
  285. package/esm2022/lib/map/home-extent-button/index.mjs +3 -0
  286. package/esm2022/lib/map/index.mjs +14 -0
  287. package/esm2022/lib/map/info-section/index.mjs +2 -0
  288. package/esm2022/lib/map/info-section/info-section.component.mjs +15 -0
  289. package/esm2022/lib/map/map-browser/index.mjs +2 -0
  290. package/esm2022/lib/map/map-browser/map-browser.component.mjs +67 -0
  291. package/esm2022/lib/map/map-center/index.mjs +2 -0
  292. package/esm2022/lib/map/map-center/map-center.component.mjs +56 -0
  293. package/esm2022/lib/map/map.module.mjs +89 -0
  294. package/esm2022/lib/map/menu-button/index.mjs +2 -0
  295. package/esm2022/lib/map/menu-button/menu-button.component.mjs +57 -0
  296. package/esm2022/lib/map/offline-button/index.mjs +2 -0
  297. package/esm2022/lib/map/offline-button/offline-button.component.mjs +53 -0
  298. package/esm2022/lib/map/rotation-button/index.mjs +2 -0
  299. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +58 -0
  300. package/esm2022/lib/map/shared/controllers/controller.mjs +44 -0
  301. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +8 -0
  302. package/esm2022/lib/map/shared/controllers/geolocation.mjs +431 -0
  303. package/esm2022/lib/map/shared/controllers/index.mjs +5 -0
  304. package/esm2022/lib/map/shared/controllers/view.mjs +361 -0
  305. package/esm2022/lib/map/shared/hover-feature.directive.mjs +481 -0
  306. package/esm2022/lib/map/shared/index.mjs +15 -0
  307. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +238 -0
  308. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +122 -0
  309. package/esm2022/lib/map/shared/map.abstract.mjs +24 -0
  310. package/esm2022/lib/map/shared/map.enums.mjs +6 -0
  311. package/esm2022/lib/map/shared/map.interface.mjs +2 -0
  312. package/esm2022/lib/map/shared/map.mjs +201 -0
  313. package/esm2022/lib/map/shared/map.service.mjs +29 -0
  314. package/esm2022/lib/map/shared/map.utils.mjs +455 -0
  315. package/esm2022/lib/map/shared/mapOffline.directive.mjs +114 -0
  316. package/esm2022/lib/map/shared/projection.interfaces.mjs +2 -0
  317. package/esm2022/lib/map/shared/projection.service.mjs +67 -0
  318. package/esm2022/lib/map/shared/projection.utils.mjs +122 -0
  319. package/esm2022/lib/map/swipe-control/index.mjs +2 -0
  320. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +211 -0
  321. package/esm2022/lib/map/utils/index.mjs +2 -0
  322. package/esm2022/lib/map/utils/layer-watcher.mjs +112 -0
  323. package/esm2022/lib/map/wake-lock-button/index.mjs +2 -0
  324. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +103 -0
  325. package/esm2022/lib/map/zoom-button/index.mjs +2 -0
  326. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +35 -0
  327. package/esm2022/lib/measure/index.mjs +3 -0
  328. package/esm2022/lib/measure/measure.module.mjs +20 -0
  329. package/esm2022/lib/measure/measurer/index.mjs +6 -0
  330. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +40 -0
  331. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +38 -0
  332. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +143 -0
  333. package/esm2022/lib/measure/measurer/measurer.component.mjs +948 -0
  334. package/esm2022/lib/measure/measurer/measurer.module.mjs +20 -0
  335. package/esm2022/lib/measure/shared/index.mjs +4 -0
  336. package/esm2022/lib/measure/shared/measure.enum.mjs +37 -0
  337. package/esm2022/lib/measure/shared/measure.interfaces.mjs +2 -0
  338. package/esm2022/lib/measure/shared/measure.utils.mjs +497 -0
  339. package/esm2022/lib/metadata/index.mjs +4 -0
  340. package/esm2022/lib/metadata/metadata-button/index.mjs +2 -0
  341. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +96 -0
  342. package/esm2022/lib/metadata/metadata.module.mjs +29 -0
  343. package/esm2022/lib/metadata/shared/index.mjs +3 -0
  344. package/esm2022/lib/metadata/shared/metadata.interface.mjs +2 -0
  345. package/esm2022/lib/metadata/shared/metadata.service.mjs +18 -0
  346. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +130 -0
  347. package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +6 -0
  348. package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +2 -0
  349. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +172 -0
  350. package/esm2022/lib/offline/geoDB/index.mjs +5 -0
  351. package/esm2022/lib/offline/index.mjs +6 -0
  352. package/esm2022/lib/offline/layerDB/index.mjs +3 -0
  353. package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +2 -0
  354. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +83 -0
  355. package/esm2022/lib/offline/offline.interface.mjs +2 -0
  356. package/esm2022/lib/offline/offline.provider.mjs +50 -0
  357. package/esm2022/lib/offline/shared/geo-network.service.mjs +79 -0
  358. package/esm2022/lib/offline/shared/index.mjs +2 -0
  359. package/esm2022/lib/overlay/index.mjs +2 -0
  360. package/esm2022/lib/overlay/shared/index.mjs +4 -0
  361. package/esm2022/lib/overlay/shared/overlay.enum.mjs +8 -0
  362. package/esm2022/lib/overlay/shared/overlay.mjs +139 -0
  363. package/esm2022/lib/overlay/shared/overlay.utils.mjs +17 -0
  364. package/esm2022/lib/print/index.mjs +4 -0
  365. package/esm2022/lib/print/print/print.component.mjs +116 -0
  366. package/esm2022/lib/print/print-form/index.mjs +2 -0
  367. package/esm2022/lib/print/print-form/print-form.component.mjs +320 -0
  368. package/esm2022/lib/print/print.module.mjs +20 -0
  369. package/esm2022/lib/print/shared/geopdf.mjs +68 -0
  370. package/esm2022/lib/print/shared/index.mjs +5 -0
  371. package/esm2022/lib/print/shared/print.interface.mjs +2 -0
  372. package/esm2022/lib/print/shared/print.service.mjs +1136 -0
  373. package/esm2022/lib/print/shared/print.type.mjs +30 -0
  374. package/esm2022/lib/query/index.mjs +2 -0
  375. package/esm2022/lib/query/query.module.mjs +27 -0
  376. package/esm2022/lib/query/shared/index.mjs +8 -0
  377. package/esm2022/lib/query/shared/query-search-source.mjs +35 -0
  378. package/esm2022/lib/query/shared/query-search-source.providers.mjs +22 -0
  379. package/esm2022/lib/query/shared/query.directive.mjs +290 -0
  380. package/esm2022/lib/query/shared/query.enums.mjs +32 -0
  381. package/esm2022/lib/query/shared/query.interfaces.mjs +2 -0
  382. package/esm2022/lib/query/shared/query.service.mjs +753 -0
  383. package/esm2022/lib/query/shared/query.utils.mjs +45 -0
  384. package/esm2022/lib/search/index.mjs +10 -0
  385. package/esm2022/lib/search/search-bar/search-bar.component.mjs +483 -0
  386. package/esm2022/lib/search/search-bar/search-bar.module.mjs +19 -0
  387. package/esm2022/lib/search/search-results/index.mjs +5 -0
  388. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +101 -0
  389. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +433 -0
  390. package/esm2022/lib/search/search-results/search-results-item.component.mjs +119 -0
  391. package/esm2022/lib/search/search-results/search-results.component.mjs +297 -0
  392. package/esm2022/lib/search/search-results/search-results.directive.mjs +7 -0
  393. package/esm2022/lib/search/search-results/search-results.module.mjs +20 -0
  394. package/esm2022/lib/search/search-selector/search-selector.component.mjs +118 -0
  395. package/esm2022/lib/search/search-selector/search-selector.module.mjs +19 -0
  396. package/esm2022/lib/search/search-settings/search-settings.component.mjs +264 -0
  397. package/esm2022/lib/search/search-settings/search-settings.module.mjs +19 -0
  398. package/esm2022/lib/search/search.module.mjs +77 -0
  399. package/esm2022/lib/search/shared/index.mjs +10 -0
  400. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +328 -0
  401. package/esm2022/lib/search/shared/search-source-service.providers.mjs +20 -0
  402. package/esm2022/lib/search/shared/search-source.service.mjs +56 -0
  403. package/esm2022/lib/search/shared/search.enums.mjs +4 -0
  404. package/esm2022/lib/search/shared/search.interfaces.mjs +2 -0
  405. package/esm2022/lib/search/shared/search.provider.mjs +20 -0
  406. package/esm2022/lib/search/shared/search.service.mjs +149 -0
  407. package/esm2022/lib/search/shared/search.utils.mjs +92 -0
  408. package/esm2022/lib/search/shared/sources/cadastre.mjs +142 -0
  409. package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +32 -0
  410. package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +2 -0
  411. package/esm2022/lib/search/shared/sources/coordinates.mjs +168 -0
  412. package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +52 -0
  413. package/esm2022/lib/search/shared/sources/icherche-icons.mjs +32 -0
  414. package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +2 -0
  415. package/esm2022/lib/search/shared/sources/icherche.mjs +816 -0
  416. package/esm2022/lib/search/shared/sources/icherche.providers.mjs +87 -0
  417. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +2 -0
  418. package/esm2022/lib/search/shared/sources/ilayer.mjs +339 -0
  419. package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +58 -0
  420. package/esm2022/lib/search/shared/sources/index.mjs +23 -0
  421. package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +2 -0
  422. package/esm2022/lib/search/shared/sources/nominatim.mjs +263 -0
  423. package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +31 -0
  424. package/esm2022/lib/search/shared/sources/source.interfaces.mjs +13 -0
  425. package/esm2022/lib/search/shared/sources/source.mjs +221 -0
  426. package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +2 -0
  427. package/esm2022/lib/search/shared/sources/storedqueries.mjs +454 -0
  428. package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +56 -0
  429. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +2 -0
  430. package/esm2022/lib/search/shared/sources/workspace.mjs +192 -0
  431. package/esm2022/lib/search/shared/sources/workspace.providers.mjs +31 -0
  432. package/esm2022/lib/style/index.mjs +5 -0
  433. package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +360 -0
  434. package/esm2022/lib/style/shared/datasource/index.mjs +2 -0
  435. package/esm2022/lib/style/shared/feature/feature-style.mjs +162 -0
  436. package/esm2022/lib/style/shared/feature/index.mjs +2 -0
  437. package/esm2022/lib/style/shared/font.enum.mjs +17 -0
  438. package/esm2022/lib/style/shared/index.mjs +5 -0
  439. package/esm2022/lib/style/shared/overlay/index.mjs +3 -0
  440. package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +39 -0
  441. package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +88 -0
  442. package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +78 -0
  443. package/esm2022/lib/style/shared/vector/conversion.utils.mjs +27 -0
  444. package/esm2022/lib/style/shared/vector/index.mjs +4 -0
  445. package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +2 -0
  446. package/esm2022/lib/style/style-list/index.mjs +5 -0
  447. package/esm2022/lib/style/style-list/style-list.interface.mjs +2 -0
  448. package/esm2022/lib/style/style-list/style-list.module.mjs +23 -0
  449. package/esm2022/lib/style/style-list/style-list.provider.mjs +21 -0
  450. package/esm2022/lib/style/style-list/style-list.service.mjs +52 -0
  451. package/esm2022/lib/style/style-modal/drawing/index.mjs +2 -0
  452. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +193 -0
  453. package/esm2022/lib/style/style-modal/index.mjs +5 -0
  454. package/esm2022/lib/style/style-modal/layer/index.mjs +2 -0
  455. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +142 -0
  456. package/esm2022/lib/style/style-modal/layer-button/index.mjs +2 -0
  457. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +44 -0
  458. package/esm2022/lib/style/style-modal/shared/index.mjs +2 -0
  459. package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +2 -0
  460. package/esm2022/lib/style/style-service/draw-style.service.mjs +255 -0
  461. package/esm2022/lib/style/style-service/index.mjs +3 -0
  462. package/esm2022/lib/style/style-service/style.service.mjs +393 -0
  463. package/esm2022/lib/style/style.module.mjs +46 -0
  464. package/esm2022/lib/toast/index.mjs +2 -0
  465. package/esm2022/lib/toast/toast.component.mjs +99 -0
  466. package/esm2022/lib/toast/toast.module.mjs +24 -0
  467. package/esm2022/lib/utils/googleLinks.mjs +13 -0
  468. package/esm2022/lib/utils/id-generator.mjs +112 -0
  469. package/esm2022/lib/utils/index.mjs +5 -0
  470. package/esm2022/lib/utils/osmLinks.mjs +9 -0
  471. package/esm2022/lib/utils/propertyTypeDetector/index.mjs +3 -0
  472. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +2 -0
  473. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +64 -0
  474. package/esm2022/lib/wkt/index.mjs +2 -0
  475. package/esm2022/lib/wkt/shared/index.mjs +2 -0
  476. package/esm2022/lib/wkt/shared/wkt.service.mjs +235 -0
  477. package/esm2022/lib/wkt/wkt.module.mjs +25 -0
  478. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +36 -0
  479. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +19 -0
  480. package/esm2022/lib/workspace/confirmation-popup/index.mjs +3 -0
  481. package/esm2022/lib/workspace/index.mjs +8 -0
  482. package/esm2022/lib/workspace/shared/edition-workspace.mjs +301 -0
  483. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +720 -0
  484. package/esm2022/lib/workspace/shared/feature-workspace.mjs +41 -0
  485. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +113 -0
  486. package/esm2022/lib/workspace/shared/index.mjs +8 -0
  487. package/esm2022/lib/workspace/shared/wfs-workspace.mjs +41 -0
  488. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +121 -0
  489. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +248 -0
  490. package/esm2022/lib/workspace/shared/workspace.utils.mjs +188 -0
  491. package/esm2022/lib/workspace/widgets/index.mjs +4 -0
  492. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +48 -0
  493. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +19 -0
  494. package/esm2022/lib/workspace/widgets/widgets.mjs +15 -0
  495. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +172 -0
  496. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
  497. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +137 -0
  498. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +19 -0
  499. package/esm2022/lib/workspace/workspace.module.mjs +32 -0
  500. package/esm2022/public_api.mjs +56 -0
  501. package/fesm2022/igo2-geo.mjs +717 -691
  502. package/fesm2022/igo2-geo.mjs.map +1 -1
  503. package/lib/datasource/shared/datasources/datasource.d.ts +2 -2
  504. package/lib/directions/shared/directions.service.d.ts +0 -1
  505. package/lib/offline/geoDB/geoDB.service.d.ts +1 -1
  506. package/lib/offline/layerDB/layerDB.service.d.ts +1 -1
  507. package/lib/style/style-list/style-list.provider.d.ts +8 -1
  508. package/lib/style/style-list/style-list.service.d.ts +1 -1
  509. package/package.json +16 -14
  510. package/src/lib/layer/layer-list/layer-list.theme.scss +1 -2
  511. package/src/lib/map/menu-button/menu-button.theming.scss +3 -3
  512. package/src/style/style.scss +1 -1
@@ -0,0 +1,875 @@
1
+ import { SelectionModel } from '@angular/cdk/collections';
2
+ import { NestedTreeControl } from '@angular/cdk/tree';
3
+ import { AsyncPipe, NgFor, NgIf } from '@angular/common';
4
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';
5
+ import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
6
+ import { MatButtonModule } from '@angular/material/button';
7
+ import { MatCheckboxModule } from '@angular/material/checkbox';
8
+ import { MatOptionModule } from '@angular/material/core';
9
+ import { MatFormFieldModule } from '@angular/material/form-field';
10
+ import { MatIconModule } from '@angular/material/icon';
11
+ import { MatInputModule } from '@angular/material/input';
12
+ import { MatRadioModule } from '@angular/material/radio';
13
+ import { MatSelectModule } from '@angular/material/select';
14
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
15
+ import { MatTableModule } from '@angular/material/table';
16
+ import { MatTooltipModule } from '@angular/material/tooltip';
17
+ import { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';
18
+ import { EntityStore, EntityStoreFilterSelectionStrategy, EntityTableColumnRenderer, EntityTableComponent } from '@igo2/common/entity';
19
+ import { LanguageService } from '@igo2/core/language';
20
+ import { IgoLanguageModule } from '@igo2/core/language';
21
+ import { MessageService } from '@igo2/core/message';
22
+ import * as olproj from 'ol/proj';
23
+ import * as olStyle from 'ol/style';
24
+ import { BehaviorSubject } from 'rxjs';
25
+ import { debounceTime } from 'rxjs/operators';
26
+ import { FeatureDataSource } from '../../../datasource/shared';
27
+ import { GeometryType } from '../../../draw';
28
+ import { FeatureMotion, FeatureStoreSelectionStrategy } from '../../../feature';
29
+ import { GeometryFormFieldInputComponent } from '../../../geometry/geometry-form-field/geometry-form-field-input.component';
30
+ import { VectorLayer } from '../../../layer/shared';
31
+ import { IgoMap } from '../../../map/shared/map';
32
+ import { MeasureLengthUnit } from '../../../measure';
33
+ import { SpatialFilterQueryType, SpatialFilterType } from '../../shared/spatial-filter.enum';
34
+ import { SpatialFilterService } from '../../shared/spatial-filter.service';
35
+ import { SpatialFilterItemType } from './../../shared/spatial-filter.enum';
36
+ import * as i0 from "@angular/core";
37
+ import * as i1 from "../../shared/spatial-filter.service";
38
+ import * as i2 from "@igo2/core/message";
39
+ import * as i3 from "@igo2/core/language";
40
+ import * as i4 from "@angular/forms";
41
+ import * as i5 from "@angular/material/slide-toggle";
42
+ import * as i6 from "@angular/material/form-field";
43
+ import * as i7 from "@angular/material/input";
44
+ import * as i8 from "@angular/material/select";
45
+ import * as i9 from "@angular/material/core";
46
+ import * as i10 from "@angular/material/radio";
47
+ import * as i11 from "@angular/material/table";
48
+ import * as i12 from "@angular/material/checkbox";
49
+ import * as i13 from "@angular/material/tree";
50
+ import * as i14 from "@angular/material/button";
51
+ import * as i15 from "@angular/material/icon";
52
+ import * as i16 from "@angular/material/tooltip";
53
+ import * as i17 from "@ngx-translate/core";
54
+ /**
55
+ * Spatial-Filter-Item (search parameters)
56
+ */
57
+ export class SpatialFilterItemComponent {
58
+ cdRef;
59
+ spatialFilterService;
60
+ messageService;
61
+ languageService;
62
+ map;
63
+ get type() {
64
+ return this._type;
65
+ }
66
+ set type(type) {
67
+ this._type = type;
68
+ const index = this.geometryTypes.findIndex((geom) => geom === this.type);
69
+ this.geometryType = this.geometryTypes[index];
70
+ this.formControl.reset();
71
+ this.radius = undefined;
72
+ this.drawGuide$.next(null);
73
+ this.drawStyle$.next(undefined);
74
+ // Necessary to keep reference to the geometry form field input
75
+ if (this.type === SpatialFilterType.Predefined) {
76
+ const geojson = {
77
+ type: 'Point',
78
+ coordinates: ''
79
+ };
80
+ this.formControl.setValue(geojson);
81
+ }
82
+ // Necessary to apply the right style when geometry type is Point
83
+ if (this.type === SpatialFilterType.Point) {
84
+ this.radius = 1000; // Base radius
85
+ this.radiusFormControl.setValue(this.radius);
86
+ this.PointStyle = (feature, resolution) => {
87
+ const geom = feature.getGeometry();
88
+ const coordinates = olproj.transform(geom.getCoordinates(), this.map.projection, 'EPSG:4326');
89
+ return new olStyle.Style({
90
+ image: new olStyle.Circle({
91
+ radius: this.radius /
92
+ Math.cos((Math.PI / 180) * coordinates[1]) /
93
+ resolution, // Latitude correction
94
+ stroke: new olStyle.Stroke({
95
+ width: 2,
96
+ color: 'rgba(0, 153, 255)'
97
+ }),
98
+ fill: new olStyle.Fill({
99
+ color: 'rgba(0, 153, 255, 0.2)'
100
+ })
101
+ })
102
+ });
103
+ };
104
+ this.overlayStyle = this.PointStyle;
105
+ this.drawStyle$.next(this.overlayStyle);
106
+ }
107
+ else {
108
+ // If geometry types is Polygon
109
+ this.radius = undefined;
110
+ this.PolyStyle = () => {
111
+ return new olStyle.Style({
112
+ stroke: new olStyle.Stroke({
113
+ width: 2,
114
+ color: 'rgba(0, 153, 255)'
115
+ }),
116
+ fill: new olStyle.Fill({
117
+ color: 'rgba(0, 153, 255, 0.2)'
118
+ })
119
+ });
120
+ };
121
+ const color = [0, 153, 255];
122
+ const drawStyle = () => {
123
+ return new olStyle.Style({
124
+ image: new olStyle.Circle({
125
+ radius: 8,
126
+ stroke: new olStyle.Stroke({
127
+ width: 2,
128
+ color: 'rgba(0, 153, 255)'
129
+ }),
130
+ fill: new olStyle.Fill({
131
+ color: 'rgba(0, 153, 255, 0.2)'
132
+ })
133
+ }),
134
+ stroke: new olStyle.Stroke({
135
+ color: color.concat([1]),
136
+ width: 2
137
+ }),
138
+ fill: new olStyle.Fill({
139
+ color: color.concat([0.2])
140
+ })
141
+ });
142
+ };
143
+ this.overlayStyle = this.PolyStyle;
144
+ this.drawStyle$.next(drawStyle);
145
+ }
146
+ this.overlayStyle$.next(this.overlayStyle);
147
+ }
148
+ _type;
149
+ queryType;
150
+ zone;
151
+ loading;
152
+ get store() {
153
+ return this._store;
154
+ }
155
+ set store(store) {
156
+ this._store = store;
157
+ this._store.entities$.subscribe(() => {
158
+ this.cdRef.detectChanges();
159
+ });
160
+ }
161
+ _store;
162
+ /**
163
+ * Available measure units for the measure type given
164
+ * @internal
165
+ */
166
+ get measureUnits() {
167
+ return [MeasureLengthUnit.Meters, MeasureLengthUnit.Kilometers];
168
+ }
169
+ layers = [];
170
+ allLayers = [];
171
+ get thematicLength() {
172
+ return this._thematicLength;
173
+ }
174
+ set thematicLength(value) {
175
+ this._thematicLength = value;
176
+ }
177
+ _thematicLength;
178
+ toggleSearch = new EventEmitter();
179
+ itemTypeChange = new EventEmitter();
180
+ thematicChange = new EventEmitter();
181
+ drawZoneEvent = new EventEmitter();
182
+ bufferEvent = new EventEmitter();
183
+ zoneWithBufferChange = new EventEmitter();
184
+ measureUnitChange = new EventEmitter();
185
+ radiusEvent = new EventEmitter();
186
+ freehandControl = new EventEmitter();
187
+ predefinedRadius = new EventEmitter();
188
+ clearButtonEvent = new EventEmitter();
189
+ clearSearchEvent = new EventEmitter();
190
+ export = new EventEmitter();
191
+ openWorkspace = new EventEmitter();
192
+ entityChange = new EventEmitter();
193
+ itemType = [
194
+ SpatialFilterItemType.Address,
195
+ SpatialFilterItemType.Thematics
196
+ ];
197
+ selectedItemType = SpatialFilterItemType.Address;
198
+ selectedSourceAddress;
199
+ treeControl = new NestedTreeControl((node) => node.children);
200
+ // For thematics and results tables
201
+ displayedColumns = ['name', 'select'];
202
+ childrens = [];
203
+ groups = [];
204
+ thematics = [];
205
+ dataSource = new MatTreeNestedDataSource();
206
+ selectedThematics = new SelectionModel(true, []);
207
+ // For geometry form field input
208
+ value$ = new BehaviorSubject(undefined);
209
+ drawGuide$ = new BehaviorSubject(null);
210
+ overlayStyle$ = new BehaviorSubject(undefined);
211
+ drawStyle$ = new BehaviorSubject(undefined);
212
+ value$$;
213
+ radiusChanges$$;
214
+ bufferChanges$$;
215
+ formControl = new UntypedFormControl();
216
+ geometryType;
217
+ geometryTypeField = false;
218
+ geometryTypes = [
219
+ GeometryType.Point,
220
+ GeometryType.Polygon
221
+ ];
222
+ drawGuideField = false;
223
+ drawGuide = null;
224
+ drawGuidePlaceholder = '';
225
+ measure = false;
226
+ drawControlIsActive = true;
227
+ freehandDrawIsActive = false;
228
+ drawStyle;
229
+ drawZone;
230
+ overlayStyle;
231
+ PointStyle;
232
+ PolyStyle;
233
+ radius;
234
+ buffer = 0;
235
+ radiusFormControl = new UntypedFormControl();
236
+ bufferFormControl = new UntypedFormControl();
237
+ measureUnit = MeasureLengthUnit.Meters;
238
+ zoneWithBuffer;
239
+ listIsVisible = true;
240
+ tableTemplate;
241
+ constructor(cdRef, spatialFilterService, messageService, languageService) {
242
+ this.cdRef = cdRef;
243
+ this.spatialFilterService = spatialFilterService;
244
+ this.messageService = messageService;
245
+ this.languageService = languageService;
246
+ }
247
+ ngOnInit() {
248
+ this.spatialFilterService
249
+ .loadThematicsList()
250
+ .subscribe((items) => {
251
+ for (const item of items) {
252
+ this.childrens.push(item);
253
+ this.childrens.sort((a, b) => {
254
+ return a.name.localeCompare(b.name);
255
+ });
256
+ }
257
+ this.groups.push(this.languageService.translate.instant('igo.geo.terrapi.limites'));
258
+ const limits = {
259
+ name: this.groups[0],
260
+ children: []
261
+ };
262
+ this.thematics.push(limits);
263
+ this.childrens.forEach((child) => {
264
+ if (child.group && this.groups.indexOf(child.group) === -1) {
265
+ this.groups.push(child.group);
266
+ const thematic = {
267
+ name: child.group,
268
+ children: []
269
+ };
270
+ this.thematics.push(thematic);
271
+ }
272
+ if (!child.group) {
273
+ if (child.name ===
274
+ this.languageService.translate.instant('igo.geo.terrapi.AdmRegion') ||
275
+ child.name ===
276
+ this.languageService.translate.instant('igo.geo.terrapi.Mun') ||
277
+ child.name ===
278
+ this.languageService.translate.instant('igo.geo.terrapi.Arrond') ||
279
+ child.name ===
280
+ this.languageService.translate.instant('igo.geo.terrapi.CircFed') ||
281
+ child.name ===
282
+ this.languageService.translate.instant('igo.geo.terrapi.CircProv') ||
283
+ child.name ===
284
+ this.languageService.translate.instant('igo.geo.terrapi.DirReg') ||
285
+ child.name ===
286
+ this.languageService.translate.instant('igo.geo.terrapi.MRC') ||
287
+ child.name ===
288
+ this.languageService.translate.instant('igo.geo.terrapi.RegTour')) {
289
+ child.group = limits.name;
290
+ }
291
+ else if (child.name ===
292
+ this.languageService.translate.instant('igo.geo.terrapi.routes')) {
293
+ child.group = this.languageService.translate.instant('igo.geo.spatialFilter.group.transport');
294
+ }
295
+ else {
296
+ const thematic = {
297
+ name: child.name,
298
+ children: [],
299
+ source: child.source
300
+ };
301
+ this.thematics.push(thematic);
302
+ }
303
+ }
304
+ this.thematics.sort((a, b) => {
305
+ return a.name.localeCompare(b.name);
306
+ });
307
+ });
308
+ this.thematics.forEach((thematic) => {
309
+ for (const child of this.childrens) {
310
+ if (child.group === thematic.name) {
311
+ thematic.children.push(child);
312
+ }
313
+ }
314
+ });
315
+ });
316
+ this.dataSource.data = this.thematics;
317
+ this.drawGuide$.next(null);
318
+ this.value$.next(this.formControl.value ? this.formControl.value : undefined);
319
+ this.value$$ = this.formControl.valueChanges.subscribe((value) => {
320
+ if (value) {
321
+ this.value$.next(value);
322
+ this.drawZone = this.formControl.value;
323
+ if (this.buffer !== 0) {
324
+ this.drawZoneEvent.emit(this.drawZone);
325
+ this.bufferFormControl.setValue(this.buffer);
326
+ }
327
+ }
328
+ else {
329
+ this.value$.next(undefined);
330
+ this.drawZone = undefined;
331
+ }
332
+ });
333
+ this.value$.subscribe(() => {
334
+ this.getRadius();
335
+ this.cdRef.detectChanges();
336
+ });
337
+ this.radiusChanges$$ = this.radiusFormControl.valueChanges.subscribe(() => {
338
+ this.getRadius();
339
+ this.cdRef.detectChanges();
340
+ });
341
+ this.bufferChanges$$ = this.bufferFormControl.valueChanges
342
+ .pipe(debounceTime(500))
343
+ .subscribe((value) => {
344
+ if (this.measureUnit === MeasureLengthUnit.Meters &&
345
+ value > 0 &&
346
+ value <= 100000) {
347
+ this.buffer = value;
348
+ this.bufferEvent.emit(value);
349
+ this.spatialFilterService
350
+ .loadBufferGeometry(this.drawZone, SpatialFilterType.Polygon, value)
351
+ .subscribe((featureGeom) => {
352
+ this.zoneWithBuffer = featureGeom;
353
+ this.zoneWithBufferChange.emit(this.zoneWithBuffer);
354
+ });
355
+ }
356
+ else if (this.measureUnit === MeasureLengthUnit.Kilometers &&
357
+ value > 0 &&
358
+ value <= 100) {
359
+ this.buffer = value;
360
+ this.bufferEvent.emit(value);
361
+ this.spatialFilterService
362
+ .loadBufferGeometry(this.drawZone, SpatialFilterType.Polygon, value * 1000)
363
+ .subscribe((featureGeom) => {
364
+ this.zoneWithBuffer = featureGeom;
365
+ this.zoneWithBufferChange.emit(this.zoneWithBuffer);
366
+ });
367
+ }
368
+ else if (value === 0) {
369
+ this.buffer = value;
370
+ this.bufferEvent.emit(value);
371
+ this.drawZoneEvent.emit(this.drawZone);
372
+ }
373
+ else if (value < 0 ||
374
+ (this.measureUnit === MeasureLengthUnit.Meters && value > 100000) ||
375
+ (this.measureUnit === MeasureLengthUnit.Kilometers && value > 100)) {
376
+ this.bufferFormControl.setValue(0);
377
+ this.buffer = 0;
378
+ this.messageService.alert('igo.geo.spatialFilter.bufferAlert', 'igo.geo.spatialFilter.warning');
379
+ }
380
+ });
381
+ const selectedRecordStrategy = new EntityStoreFilterSelectionStrategy({});
382
+ const selectionStrategy = new FeatureStoreSelectionStrategy({
383
+ layer: new VectorLayer({
384
+ zIndex: 300,
385
+ source: new FeatureDataSource(),
386
+ style: undefined,
387
+ showInLayerList: false,
388
+ exportable: false,
389
+ browsable: false
390
+ }),
391
+ map: this.map,
392
+ hitTolerance: 15,
393
+ motion: FeatureMotion.Default,
394
+ many: true,
395
+ dragBox: true
396
+ });
397
+ this.store.addStrategy(selectionStrategy, true);
398
+ this.store.addStrategy(selectedRecordStrategy, false);
399
+ }
400
+ /**
401
+ * Unsubscribe to the value stream
402
+ * @internal
403
+ */
404
+ ngOnDestroy() {
405
+ this.value$$.unsubscribe();
406
+ this.radiusChanges$$.unsubscribe();
407
+ this.bufferChanges$$.unsubscribe();
408
+ this.cdRef.detach();
409
+ if (this.radiusChanges$$) {
410
+ this.radiusChanges$$.unsubscribe();
411
+ }
412
+ if (this.value$$) {
413
+ this.value$$.unsubscribe();
414
+ }
415
+ }
416
+ onItemTypeChange(event) {
417
+ this.selectedItemType = event.value;
418
+ this.itemTypeChange.emit(this.selectedItemType);
419
+ }
420
+ /**
421
+ * Set the measure unit
422
+ * @internal
423
+ */
424
+ onMeasureUnitChange(unit) {
425
+ if (unit === this.measureUnit) {
426
+ return;
427
+ }
428
+ else {
429
+ this.measureUnit = unit;
430
+ this.measureUnitChange.emit(this.measureUnit);
431
+ if (this.isPolygon()) {
432
+ this.measureUnit === MeasureLengthUnit.Meters
433
+ ? this.bufferFormControl.setValue(this.bufferFormControl.value * 1000)
434
+ : this.bufferFormControl.setValue(this.bufferFormControl.value / 1000);
435
+ }
436
+ else if (this.isPoint()) {
437
+ this.measureUnit === MeasureLengthUnit.Meters
438
+ ? this.radiusFormControl.setValue(this.radiusFormControl.value * 1000)
439
+ : this.radiusFormControl.setValue(this.radiusFormControl.value / 1000);
440
+ }
441
+ }
442
+ }
443
+ isPredefined() {
444
+ return this.type === SpatialFilterType.Predefined;
445
+ }
446
+ isPolygon() {
447
+ return this.type === SpatialFilterType.Polygon;
448
+ }
449
+ isPoint() {
450
+ return this.type === SpatialFilterType.Point;
451
+ }
452
+ hasChild(_, node) {
453
+ if (node.children) {
454
+ return node.children.length;
455
+ }
456
+ return false;
457
+ }
458
+ onToggleClick(node) {
459
+ this.treeControl.isExpanded(node)
460
+ ? this.treeControl.collapse(node)
461
+ : this.treeControl.expand(node);
462
+ }
463
+ isAllSelected(node) {
464
+ let numSelected;
465
+ let numNodes = 0;
466
+ if (!node) {
467
+ numSelected = this.selectedThematics.selected.length;
468
+ this.thematics.forEach((thematic) => {
469
+ if (this.groups.indexOf(thematic.name) === -1) {
470
+ numNodes++;
471
+ }
472
+ });
473
+ this.childrens.forEach((children) => {
474
+ if (!this.thematics.find((thematic) => thematic.source === children.source)) {
475
+ numNodes++;
476
+ }
477
+ });
478
+ }
479
+ else {
480
+ numSelected = node.children.length;
481
+ node.children.forEach((children) => {
482
+ if (this.selectedThematics.selected.find((thematic) => thematic === children)) {
483
+ numNodes++;
484
+ }
485
+ });
486
+ }
487
+ if (numNodes >= 1) {
488
+ return numSelected === numNodes;
489
+ }
490
+ else {
491
+ return false;
492
+ }
493
+ }
494
+ hasChildrenSelected(node) {
495
+ let bool = false;
496
+ node.children.forEach((child) => {
497
+ if (this.selectedThematics.selected.find((thematic) => thematic.source === child.source)) {
498
+ bool = true;
499
+ }
500
+ });
501
+ return bool;
502
+ }
503
+ /**
504
+ * Apply header checkbox
505
+ */
506
+ masterToggle() {
507
+ this.isAllSelected() ? this.selectedThematics.clear() : this.selectAll();
508
+ const selectedThematicsName = [];
509
+ for (const thematic of this.selectedThematics.selected) {
510
+ selectedThematicsName.push(thematic);
511
+ }
512
+ if (this.isAllSelected()) {
513
+ this.thematics.forEach((thematic) => {
514
+ if (this.hasChild(0, thematic)) {
515
+ this.treeControl.expand(thematic);
516
+ }
517
+ });
518
+ }
519
+ else {
520
+ this.thematics.forEach((thematic) => {
521
+ if (this.hasChild(0, thematic)) {
522
+ this.treeControl.collapse(thematic);
523
+ }
524
+ });
525
+ }
526
+ this.thematicChange.emit(selectedThematicsName);
527
+ }
528
+ selectAll(node) {
529
+ if (!node) {
530
+ this.thematics.forEach((thematic) => {
531
+ if (this.groups.indexOf(thematic.name) === -1) {
532
+ this.selectedThematics.select(thematic);
533
+ }
534
+ });
535
+ this.childrens.forEach((children) => {
536
+ if (!this.selectedThematics.selected.find((thematic) => thematic.source === children.source)) {
537
+ this.selectedThematics.select(children);
538
+ }
539
+ });
540
+ }
541
+ else {
542
+ if (this.hasChild(0, node)) {
543
+ node.children.forEach((children) => this.selectedThematics.select(children));
544
+ }
545
+ }
546
+ }
547
+ childrensToggle(node) {
548
+ this.isAllSelected(node)
549
+ ? node.children.forEach((child) => this.selectedThematics.deselect(child))
550
+ : this.selectAll(node);
551
+ const selectedThematicsName = [];
552
+ for (const thematic of this.selectedThematics.selected) {
553
+ selectedThematicsName.push(thematic);
554
+ }
555
+ this.treeControl.expand(node);
556
+ this.thematicChange.emit(selectedThematicsName);
557
+ }
558
+ /**
559
+ * Apply changes to the thematics selected tree and emit event
560
+ */
561
+ onToggleChange(nodeSelected) {
562
+ let selected = false;
563
+ if (this.selectedThematics.selected.find((thematic) => thematic.source === nodeSelected.source) !== undefined) {
564
+ selected = true;
565
+ }
566
+ this.childrens.forEach((children) => {
567
+ if (children === nodeSelected && selected === false) {
568
+ this.selectedThematics.select(children);
569
+ }
570
+ if (children === nodeSelected && selected === true) {
571
+ this.selectedThematics.deselect(children);
572
+ }
573
+ });
574
+ this.thematics.forEach((thematic) => {
575
+ if (thematic === nodeSelected && selected === false) {
576
+ this.selectedThematics.select(thematic);
577
+ }
578
+ if (thematic === nodeSelected && selected === true) {
579
+ this.selectedThematics.deselect(thematic);
580
+ }
581
+ });
582
+ const selectedThematicsName = [];
583
+ for (const thematic of this.selectedThematics.selected) {
584
+ selectedThematicsName.push(thematic);
585
+ }
586
+ this.thematicChange.emit(selectedThematicsName);
587
+ }
588
+ onDrawControlChange() {
589
+ this.drawControlIsActive = !this.drawControlIsActive;
590
+ }
591
+ onfreehandControlChange() {
592
+ this.freehandDrawIsActive = !this.freehandDrawIsActive;
593
+ this.freehandControl.emit(this.freehandDrawIsActive);
594
+ if (this.isPoint()) {
595
+ this.predefinedRadius.emit(!this.freehandDrawIsActive);
596
+ if (this.freehandDrawIsActive) {
597
+ this.overlayStyle$.next(undefined);
598
+ this.drawStyle$.next(undefined);
599
+ }
600
+ }
601
+ else {
602
+ this.predefinedRadius.emit(false);
603
+ }
604
+ }
605
+ /**
606
+ * Launch search button
607
+ */
608
+ toggleSearchButton() {
609
+ if (!this.isPredefined()) {
610
+ if (this.buffer > 0) {
611
+ this.zoneWithBuffer.meta = {
612
+ id: undefined,
613
+ title: 'Zone'
614
+ };
615
+ this.zoneWithBuffer.properties = {
616
+ nom: 'Zone',
617
+ type: this.type
618
+ };
619
+ this.drawZoneEvent.emit(this.zoneWithBuffer);
620
+ }
621
+ else {
622
+ this.drawZone.meta = {
623
+ id: undefined,
624
+ title: 'Zone'
625
+ };
626
+ this.drawZone.properties = {
627
+ nom: 'Zone',
628
+ type: this.type
629
+ };
630
+ this.drawZoneEvent.emit(this.drawZone);
631
+ }
632
+ }
633
+ if (this.isPoint()) {
634
+ this.radiusEvent.emit(this.radius);
635
+ }
636
+ else if (this.isPolygon()) {
637
+ this.bufferEvent.emit(this.buffer);
638
+ }
639
+ this.toggleSearch.emit();
640
+ this.store.entities$.pipe(debounceTime(500)).subscribe((value) => {
641
+ if (value.length && this.layers.length === this.thematicLength + 1) {
642
+ this.openWorkspace.emit();
643
+ this.createTableTemplate();
644
+ }
645
+ });
646
+ }
647
+ /**
648
+ * Launch clear button (clear store and map layers)
649
+ */
650
+ clearButton() {
651
+ this.loading = true;
652
+ if (this.store) {
653
+ this.store.clear();
654
+ }
655
+ if (this.isPoint() || this.isPolygon()) {
656
+ this.drawZone = undefined;
657
+ this.formControl.reset();
658
+ }
659
+ this.bufferFormControl.setValue(0);
660
+ this.buffer = 0;
661
+ this.bufferEvent.emit(0);
662
+ this.clearButtonEvent.emit();
663
+ this.loading = false;
664
+ this.tableTemplate = undefined;
665
+ }
666
+ clearDrawZone() {
667
+ this.formControl.reset();
668
+ this.bufferFormControl.setValue(0);
669
+ this.buffer = 0;
670
+ }
671
+ /**
672
+ * Launch clear search (clear field if type is predefined)
673
+ */
674
+ clearSearch() {
675
+ this.selectedThematics.clear();
676
+ this.bufferFormControl.setValue(0);
677
+ this.buffer = 0;
678
+ this.bufferEvent.emit(0);
679
+ this.thematicChange.emit([]);
680
+ this.clearSearchEvent.emit();
681
+ }
682
+ /**
683
+ * Verify conditions of incomplete fields or busy service
684
+ */
685
+ disableSearchButton() {
686
+ if (this.type === SpatialFilterType.Predefined) {
687
+ if (this.selectedItemType === SpatialFilterItemType.Address) {
688
+ if (this.queryType !== undefined && this.zone !== undefined) {
689
+ return this.loading;
690
+ }
691
+ }
692
+ if (this.selectedItemType === SpatialFilterItemType.Thematics) {
693
+ if (this.queryType !== undefined &&
694
+ this.zone !== undefined &&
695
+ this.selectedThematics.selected.length > 0) {
696
+ return this.loading;
697
+ }
698
+ }
699
+ }
700
+ if (this.type === SpatialFilterType.Polygon ||
701
+ this.type === SpatialFilterType.Point) {
702
+ if (this.selectedItemType === SpatialFilterItemType.Address &&
703
+ this.formControl.value !== null) {
704
+ return this.loading;
705
+ }
706
+ if (this.selectedItemType === SpatialFilterItemType.Thematics) {
707
+ if (this.selectedThematics.selected.length > 0 &&
708
+ this.formControl.value !== null) {
709
+ return this.loading;
710
+ }
711
+ }
712
+ }
713
+ return true;
714
+ }
715
+ disabledClearSearch() {
716
+ let disable = true;
717
+ this.selectedItemType === SpatialFilterItemType.Address
718
+ ? (disable = this.queryType === undefined)
719
+ : (disable =
720
+ this.queryType === undefined &&
721
+ this.selectedThematics.selected.length === 0);
722
+ return disable;
723
+ }
724
+ /**
725
+ * Manage radius value at user change
726
+ */
727
+ getRadius() {
728
+ let formValue;
729
+ if (this.formControl.value !== null) {
730
+ this.measureUnit === MeasureLengthUnit.Meters
731
+ ? (formValue = this.formControl.value.radius)
732
+ : (formValue = this.formControl.value.radius / 1000);
733
+ }
734
+ else {
735
+ formValue = undefined;
736
+ }
737
+ if (this.type === SpatialFilterType.Point) {
738
+ if (!this.freehandDrawIsActive) {
739
+ if (this.radiusFormControl.value < 0 ||
740
+ (this.measureUnit === MeasureLengthUnit.Meters &&
741
+ this.radiusFormControl.value >= 100000) ||
742
+ (this.measureUnit === MeasureLengthUnit.Kilometers &&
743
+ this.radiusFormControl.value >= 100)) {
744
+ this.messageService.alert('igo.geo.spatialFilter.radiusAlert', 'igo.geo.spatialFilter.warning');
745
+ this.radius = 1000;
746
+ this.measureUnit === MeasureLengthUnit.Meters
747
+ ? this.radiusFormControl.setValue(this.radius)
748
+ : this.radiusFormControl.setValue(this.radius / 1000);
749
+ this.drawGuide$.next(this.radius);
750
+ return;
751
+ }
752
+ }
753
+ else {
754
+ if (formValue) {
755
+ if (formValue >= 100000) {
756
+ this.messageService.alert('igo.geo.spatialFilter.radiusAlert', 'igo.geo.spatialFilter.warning');
757
+ this.formControl.reset();
758
+ return;
759
+ }
760
+ if (formValue !== this.radiusFormControl.value) {
761
+ this.radiusFormControl.setValue(formValue);
762
+ return;
763
+ }
764
+ }
765
+ }
766
+ if (this.measureUnit === MeasureLengthUnit.Meters) {
767
+ this.radius = this.radiusFormControl.value;
768
+ this.drawGuide$.next(this.radius);
769
+ }
770
+ else {
771
+ this.radius = this.radiusFormControl.value * 1000;
772
+ this.drawGuide$.next(this.radius * 1000);
773
+ }
774
+ this.overlayStyle$.next(this.PointStyle);
775
+ this.drawStyle$.next(this.PointStyle);
776
+ }
777
+ }
778
+ toggleVisibleList() {
779
+ this.listIsVisible = !this.listIsVisible;
780
+ }
781
+ createTableTemplate() {
782
+ const typeColumn = {
783
+ name: 'meta.title',
784
+ title: this.languageService.translate.instant('igo.geo.spatialFilter.type'),
785
+ renderer: EntityTableColumnRenderer.UnsanitizedHTML
786
+ };
787
+ const nameColumn = {
788
+ name: 'properties.nom',
789
+ title: this.languageService.translate.instant('igo.geo.spatialFilter.searchResults'),
790
+ renderer: EntityTableColumnRenderer.UnsanitizedHTML
791
+ };
792
+ const columns = [typeColumn, nameColumn];
793
+ this.tableTemplate = {
794
+ selection: true,
795
+ sort: true,
796
+ columns
797
+ };
798
+ }
799
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialFilterItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SpatialFilterService }, { token: i2.MessageService }, { token: i3.LanguageService }], target: i0.ɵɵFactoryTarget.Component });
800
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SpatialFilterItemComponent, isStandalone: true, selector: "igo-spatial-filter-item", inputs: { map: "map", type: "type", queryType: "queryType", zone: "zone", loading: "loading", store: "store", layers: "layers", allLayers: "allLayers", thematicLength: "thematicLength" }, outputs: { toggleSearch: "toggleSearch", itemTypeChange: "itemTypeChange", thematicChange: "thematicChange", drawZoneEvent: "drawZoneEvent", bufferEvent: "bufferEvent", zoneWithBufferChange: "zoneWithBufferChange", measureUnitChange: "measureUnitChange", radiusEvent: "radiusEvent", freehandControl: "freehandControl", predefinedRadius: "predefinedRadius", clearButtonEvent: "clearButtonEvent", clearSearchEvent: "clearSearchEvent", export: "export", openWorkspace: "openWorkspace", entityChange: "entityChange" }, ngImport: i0, template: "<igo-geometry-form-field-input\n [formControl]=\"formControl\"\n [map]=\"map\"\n [geometryType]=\"geometryType\"\n [drawGuide]=\"drawGuide$ | async\"\n [measure]=\"measure\"\n [drawControlIsActive]=\"drawControlIsActive\"\n [freehandDrawIsActive]=\"freehandDrawIsActive\"\n [drawStyle]=\"drawStyle$ | async\"\n [overlayStyle]=\"overlayStyle$ | async\"\n [radius]=\"radius\"\n [predefinedRadius]=\"$any(predefinedRadius)\"\n>\n</igo-geometry-form-field-input>\n\n<div class=\"header\">\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onDrawControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.drawControl' | translate }}\n </mat-slide-toggle>\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"freehandDrawIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onfreehandControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.freehandControl' | translate }}\n </mat-slide-toggle>\n</div>\n\n<div class=\"buffer-unit\" *ngIf=\"isPolygon()\">\n <mat-form-field class=\"buffer\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.buffer' | translate }}\"\n [formControl]=\"bufferFormControl\"\n [value]=\"0\"\n [readonly]=\"this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<div class=\"radius-unit\" *ngIf=\"isPoint()\">\n <mat-form-field class=\"radius\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.radius' | translate }}\"\n [formControl]=\"radiusFormControl\"\n [value]=\"1000\"\n (input)=\"getRadius()\"\n [readonly]=\"this.freehandDrawIsActive && this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<mat-label class=\"title mat-typography\"\n >{{ 'igo.geo.spatialFilter.search' | translate }} :\n</mat-label>\n<mat-radio-group [value]=\"selectedItemType\">\n <mat-radio-button\n *ngFor=\"let item of itemType\"\n [value]=\"item\"\n (change)=\"onItemTypeChange($event)\"\n >\n {{ 'igo.geo.spatialFilter.' + item | translate }}\n </mat-radio-button>\n</mat-radio-group>\n\n<div\n class=\"thematics\"\n *ngIf=\"\n (selectedItemType === 'Thematics' && !tableTemplate) ||\n (selectedItemType === 'Thematics' && tableTemplate && !listIsVisible)\n \"\n>\n <mat-table>\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef class=\"thematics-header\">{{\n 'igo.geo.spatialFilter.Thematics' | translate\n }}</mat-header-cell>\n </ng-container>\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef class=\"checks-header\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selectedThematics.hasValue() && !isAllSelected()\"\n >\n </mat-checkbox>\n </mat-header-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li class=\"mat-tree-node\">\n <!-- use a disabled button to provide padding for tree leaf -->\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button mat-icon-button disabled></button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? onToggleChange(node) : null\"\n [checked]=\"selectedThematics.isSelected(node)\"\n >\n </mat-checkbox>\n </li>\n </mat-tree-node>\n\n <!-- This is the tree node template for expandable nodes -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"mat-tree-node\">\n <button mat-icon-button (click)=\"onToggleClick(node)\">\n <mat-icon>{{\n treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\n }}</mat-icon>\n </button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check-2\"\n (change)=\"$event ? childrensToggle(node) : null\"\n [checked]=\"isAllSelected(node)\"\n [indeterminate]=\"hasChildrenSelected(node) && !isAllSelected(node)\"\n >\n </mat-checkbox>\n </div>\n <ul\n class=\"tree-ul\"\n [class.example-tree-invisible]=\"!treeControl.isExpanded(node)\"\n >\n <ng-container matTreeNodeOutlet></ng-container>\n </ul>\n </mat-nested-tree-node>\n </mat-tree>\n</div>\n\n<div class=\"buttons\">\n <button\n *ngIf=\"isPredefined()\"\n mat-raised-button\n class=\"clear-search-button\"\n [disabled]=\"disabledClearSearch()\"\n (click)=\"clearSearch()\"\n >\n {{ 'igo.geo.spatialFilter.clearSearch' | translate }}\n </button>\n\n <button\n *ngIf=\"isPolygon() || isPoint()\"\n mat-raised-button\n class=\"clear-form-button\"\n [disabled]=\"this.formControl.value === null\"\n (click)=\"clearDrawZone()\"\n >\n {{ 'igo.geo.spatialFilter.clearForm' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"search-button\"\n [disabled]=\"disableSearchButton()\"\n color=\"primary\"\n (click)=\"toggleSearchButton()\"\n >\n {{ 'igo.geo.spatialFilter.goSearch' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"remove-button\"\n [disabled]=\"allLayers.length === 0\"\n (click)=\"clearButton()\"\n >\n {{ 'igo.geo.spatialFilter.removeLayer' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"export-button\"\n [disabled]=\"!store.entities$.getValue().length\"\n (click)=\"export.emit()\"\n >\n {{ 'igo.geo.spatialFilter.exportLayer' | translate }}\n </button>\n</div>\n\n<button\n class=\"expand-more\"\n *ngIf=\"store.all().length && tableTemplate && !listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.showSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n>\n <mat-icon>expand_more</mat-icon>\n</button>\n\n<div\n class=\"results\"\n *ngIf=\"store.all().length && tableTemplate && listIsVisible\"\n>\n <button\n *ngIf=\"listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.hideSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n >\n <mat-icon>expand_less</mat-icon>\n </button>\n <igo-entity-table\n class=\"results-list\"\n [template]=\"tableTemplate\"\n [store]=\"store\"\n (entitySelectChange)=\"entityChange.emit($event)\"\n >\n </igo-entity-table>\n</div>\n", styles: [":host .header{margin-top:5px;width:100%}:host .mat-mdc-slide-toggle{padding:5px;width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .title{margin-left:5px;font-size:initial}:host .mat-mdc-radio-group{display:flex;flex-direction:column}:host .mat-mdc-radio-button{display:inline-flex;position:relative;margin-left:12px}:host .mat-mdc-form-field{margin-top:5px}:host .mat-column-select{overflow:auto}:host .buttons{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:16px 0}:host .thematics{max-height:35%;overflow:auto;margin-top:5px;width:98%}:host .results{overflow:auto;max-height:250px;width:98%}:host .mat-column-typeResults{max-width:100px;margin-right:5px}:host .buffer-unit,:host .radius-unit{display:flex;width:100%;padding:5px;box-sizing:border-box}:host .radius,:host .buffer{flex-flow:column nowrap;flex:2}:host .unit-field{flex:1;margin-left:8px}:host .example-tree-invisible{display:none}:host .tree-ul{margin:0;padding:0 0 0 20px;list-style-type:none}:host .tree-check,:host .tree-check-2{position:relative;margin-left:auto;margin-right:5px}:host .thematics-header{max-width:250px}:host .checks-header{padding:none;max-width:calc(100% - 316px);overflow:hidden}:host .mat-mdc-checkbox{padding:5px}:host .mat-tree-node{position:relative;min-height:42px;width:280px}:host .mat-mdc-header-cell{height:56px}:host .results{max-height:45%;width:98%}:host .results igo-entity-table ::ng-deep div.table-container{overflow:unset}\n"], dependencies: [{ kind: "component", type: GeometryFormFieldInputComponent, selector: "igo-geometry-form-field-input", inputs: ["map", "geometryType", "drawGuide", "measure", "drawControlIsActive", "freehandDrawIsActive", "predefinedRadius", "controlOptions", "drawStyle", "overlayStyle", "value", "radius"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i5.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i10.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i10.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i13.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], outputs: ["activation", "expandedChange"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i13.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i13.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i13.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i13.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i13.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i14.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i16.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: EntityTableComponent, selector: "igo-entity-table", inputs: ["store", "paginator", "template", "scrollBehavior", "sortNullsFirst", "withPaginator", "paginatorOptions"], outputs: ["entityClick", "entitySelectChange", "entitySortChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i17.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
801
+ }
802
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpatialFilterItemComponent, decorators: [{
803
+ type: Component,
804
+ args: [{ selector: 'igo-spatial-filter-item', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
805
+ GeometryFormFieldInputComponent,
806
+ FormsModule,
807
+ ReactiveFormsModule,
808
+ NgIf,
809
+ MatSlideToggleModule,
810
+ MatFormFieldModule,
811
+ MatInputModule,
812
+ MatSelectModule,
813
+ NgFor,
814
+ MatOptionModule,
815
+ MatRadioModule,
816
+ MatTableModule,
817
+ MatCheckboxModule,
818
+ MatTreeModule,
819
+ MatButtonModule,
820
+ MatIconModule,
821
+ MatTooltipModule,
822
+ EntityTableComponent,
823
+ AsyncPipe,
824
+ IgoLanguageModule
825
+ ], template: "<igo-geometry-form-field-input\n [formControl]=\"formControl\"\n [map]=\"map\"\n [geometryType]=\"geometryType\"\n [drawGuide]=\"drawGuide$ | async\"\n [measure]=\"measure\"\n [drawControlIsActive]=\"drawControlIsActive\"\n [freehandDrawIsActive]=\"freehandDrawIsActive\"\n [drawStyle]=\"drawStyle$ | async\"\n [overlayStyle]=\"overlayStyle$ | async\"\n [radius]=\"radius\"\n [predefinedRadius]=\"$any(predefinedRadius)\"\n>\n</igo-geometry-form-field-input>\n\n<div class=\"header\">\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onDrawControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.drawControl' | translate }}\n </mat-slide-toggle>\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"freehandDrawIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onfreehandControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.freehandControl' | translate }}\n </mat-slide-toggle>\n</div>\n\n<div class=\"buffer-unit\" *ngIf=\"isPolygon()\">\n <mat-form-field class=\"buffer\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.buffer' | translate }}\"\n [formControl]=\"bufferFormControl\"\n [value]=\"0\"\n [readonly]=\"this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<div class=\"radius-unit\" *ngIf=\"isPoint()\">\n <mat-form-field class=\"radius\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.radius' | translate }}\"\n [formControl]=\"radiusFormControl\"\n [value]=\"1000\"\n (input)=\"getRadius()\"\n [readonly]=\"this.freehandDrawIsActive && this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<mat-label class=\"title mat-typography\"\n >{{ 'igo.geo.spatialFilter.search' | translate }} :\n</mat-label>\n<mat-radio-group [value]=\"selectedItemType\">\n <mat-radio-button\n *ngFor=\"let item of itemType\"\n [value]=\"item\"\n (change)=\"onItemTypeChange($event)\"\n >\n {{ 'igo.geo.spatialFilter.' + item | translate }}\n </mat-radio-button>\n</mat-radio-group>\n\n<div\n class=\"thematics\"\n *ngIf=\"\n (selectedItemType === 'Thematics' && !tableTemplate) ||\n (selectedItemType === 'Thematics' && tableTemplate && !listIsVisible)\n \"\n>\n <mat-table>\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef class=\"thematics-header\">{{\n 'igo.geo.spatialFilter.Thematics' | translate\n }}</mat-header-cell>\n </ng-container>\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef class=\"checks-header\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selectedThematics.hasValue() && !isAllSelected()\"\n >\n </mat-checkbox>\n </mat-header-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li class=\"mat-tree-node\">\n <!-- use a disabled button to provide padding for tree leaf -->\n <!-- eslint-disable-next-line @angular-eslint/template/elements-content -->\n <button mat-icon-button disabled></button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? onToggleChange(node) : null\"\n [checked]=\"selectedThematics.isSelected(node)\"\n >\n </mat-checkbox>\n </li>\n </mat-tree-node>\n\n <!-- This is the tree node template for expandable nodes -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"mat-tree-node\">\n <button mat-icon-button (click)=\"onToggleClick(node)\">\n <mat-icon>{{\n treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\n }}</mat-icon>\n </button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check-2\"\n (change)=\"$event ? childrensToggle(node) : null\"\n [checked]=\"isAllSelected(node)\"\n [indeterminate]=\"hasChildrenSelected(node) && !isAllSelected(node)\"\n >\n </mat-checkbox>\n </div>\n <ul\n class=\"tree-ul\"\n [class.example-tree-invisible]=\"!treeControl.isExpanded(node)\"\n >\n <ng-container matTreeNodeOutlet></ng-container>\n </ul>\n </mat-nested-tree-node>\n </mat-tree>\n</div>\n\n<div class=\"buttons\">\n <button\n *ngIf=\"isPredefined()\"\n mat-raised-button\n class=\"clear-search-button\"\n [disabled]=\"disabledClearSearch()\"\n (click)=\"clearSearch()\"\n >\n {{ 'igo.geo.spatialFilter.clearSearch' | translate }}\n </button>\n\n <button\n *ngIf=\"isPolygon() || isPoint()\"\n mat-raised-button\n class=\"clear-form-button\"\n [disabled]=\"this.formControl.value === null\"\n (click)=\"clearDrawZone()\"\n >\n {{ 'igo.geo.spatialFilter.clearForm' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"search-button\"\n [disabled]=\"disableSearchButton()\"\n color=\"primary\"\n (click)=\"toggleSearchButton()\"\n >\n {{ 'igo.geo.spatialFilter.goSearch' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"remove-button\"\n [disabled]=\"allLayers.length === 0\"\n (click)=\"clearButton()\"\n >\n {{ 'igo.geo.spatialFilter.removeLayer' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"export-button\"\n [disabled]=\"!store.entities$.getValue().length\"\n (click)=\"export.emit()\"\n >\n {{ 'igo.geo.spatialFilter.exportLayer' | translate }}\n </button>\n</div>\n\n<button\n class=\"expand-more\"\n *ngIf=\"store.all().length && tableTemplate && !listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.showSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n>\n <mat-icon>expand_more</mat-icon>\n</button>\n\n<div\n class=\"results\"\n *ngIf=\"store.all().length && tableTemplate && listIsVisible\"\n>\n <button\n *ngIf=\"listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.hideSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n >\n <mat-icon>expand_less</mat-icon>\n </button>\n <igo-entity-table\n class=\"results-list\"\n [template]=\"tableTemplate\"\n [store]=\"store\"\n (entitySelectChange)=\"entityChange.emit($event)\"\n >\n </igo-entity-table>\n</div>\n", styles: [":host .header{margin-top:5px;width:100%}:host .mat-mdc-slide-toggle{padding:5px;width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .title{margin-left:5px;font-size:initial}:host .mat-mdc-radio-group{display:flex;flex-direction:column}:host .mat-mdc-radio-button{display:inline-flex;position:relative;margin-left:12px}:host .mat-mdc-form-field{margin-top:5px}:host .mat-column-select{overflow:auto}:host .buttons{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:16px 0}:host .thematics{max-height:35%;overflow:auto;margin-top:5px;width:98%}:host .results{overflow:auto;max-height:250px;width:98%}:host .mat-column-typeResults{max-width:100px;margin-right:5px}:host .buffer-unit,:host .radius-unit{display:flex;width:100%;padding:5px;box-sizing:border-box}:host .radius,:host .buffer{flex-flow:column nowrap;flex:2}:host .unit-field{flex:1;margin-left:8px}:host .example-tree-invisible{display:none}:host .tree-ul{margin:0;padding:0 0 0 20px;list-style-type:none}:host .tree-check,:host .tree-check-2{position:relative;margin-left:auto;margin-right:5px}:host .thematics-header{max-width:250px}:host .checks-header{padding:none;max-width:calc(100% - 316px);overflow:hidden}:host .mat-mdc-checkbox{padding:5px}:host .mat-tree-node{position:relative;min-height:42px;width:280px}:host .mat-mdc-header-cell{height:56px}:host .results{max-height:45%;width:98%}:host .results igo-entity-table ::ng-deep div.table-container{overflow:unset}\n"] }]
826
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SpatialFilterService }, { type: i2.MessageService }, { type: i3.LanguageService }], propDecorators: { map: [{
827
+ type: Input
828
+ }], type: [{
829
+ type: Input
830
+ }], queryType: [{
831
+ type: Input
832
+ }], zone: [{
833
+ type: Input
834
+ }], loading: [{
835
+ type: Input
836
+ }], store: [{
837
+ type: Input
838
+ }], layers: [{
839
+ type: Input
840
+ }], allLayers: [{
841
+ type: Input
842
+ }], thematicLength: [{
843
+ type: Input
844
+ }], toggleSearch: [{
845
+ type: Output
846
+ }], itemTypeChange: [{
847
+ type: Output
848
+ }], thematicChange: [{
849
+ type: Output
850
+ }], drawZoneEvent: [{
851
+ type: Output
852
+ }], bufferEvent: [{
853
+ type: Output
854
+ }], zoneWithBufferChange: [{
855
+ type: Output
856
+ }], measureUnitChange: [{
857
+ type: Output
858
+ }], radiusEvent: [{
859
+ type: Output
860
+ }], freehandControl: [{
861
+ type: Output
862
+ }], predefinedRadius: [{
863
+ type: Output
864
+ }], clearButtonEvent: [{
865
+ type: Output
866
+ }], clearSearchEvent: [{
867
+ type: Output
868
+ }], export: [{
869
+ type: Output
870
+ }], openWorkspace: [{
871
+ type: Output
872
+ }], entityChange: [{
873
+ type: Output
874
+ }] } });
875
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXIvc3BhdGlhbC1maWx0ZXItaXRlbS9zcGF0aWFsLWZpbHRlci1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci9zcGF0aWFsLWZpbHRlci1pdGVtL3NwYXRpYWwtZmlsdGVyLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FB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Q0wsZUFBZTt3QkFDZixjQUFjO3dCQUNkLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsU0FBUzt3QkFDVCxpQkFBaUI7cUJBQ2xCO29MQUdRLEdBQUc7c0JBQVgsS0FBSztnQkFHRixJQUFJO3NCQURQLEtBQUs7Z0JBbUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFHRixLQUFLO3NCQURSLEtBQUs7Z0JBb0JHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBU0ksWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBOZXN0ZWRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3Jtc01vZHVsZSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1Db250cm9sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0VHJlZU1vZHVsZSwgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90cmVlJztcblxuaW1wb3J0IHtcbiAgRW50aXR5U3RvcmUsXG4gIEVudGl0eVN0b3JlRmlsdGVyU2VsZWN0aW9uU3RyYXRlZ3ksXG4gIEVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIsXG4gIEVudGl0eVRhYmxlQ29tcG9uZW50LFxuICBFbnRpdHlUYWJsZVRlbXBsYXRlXG59IGZyb20gJ0BpZ28yL2NvbW1vbi9lbnRpdHknO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL21lc3NhZ2UnO1xuXG5pbXBvcnQgT2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcbmltcG9ydCBPbFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xuaW1wb3J0ICogYXMgb2xwcm9qIGZyb20gJ29sL3Byb2onO1xuaW1wb3J0ICogYXMgb2xTdHlsZSBmcm9tICdvbC9zdHlsZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZlYXR1cmVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQnO1xuaW1wb3J0IHsgR2VvbWV0cnlUeXBlIH0gZnJvbSAnLi4vLi4vLi4vZHJhdyc7XG5pbXBvcnQgeyBGZWF0dXJlTW90aW9uLCBGZWF0dXJlU3RvcmVTZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gJy4uLy4uLy4uL2ZlYXR1cmUnO1xuaW1wb3J0IHsgR2VvbWV0cnlGb3JtRmllbGRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2dlb21ldHJ5L2dlb21ldHJ5LWZvcm0tZmllbGQvZ2VvbWV0cnktZm9ybS1maWVsZC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvSlNPTkdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vLi4vZ2VvbWV0cnkvc2hhcmVkL2dlb21ldHJ5LmludGVyZmFjZXMnO1xuaW1wb3J0IHsgQW55TGF5ZXIsIFZlY3RvckxheWVyIH0gZnJvbSAnLi4vLi4vLi4vbGF5ZXIvc2hhcmVkJztcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uLy4uL21hcC9zaGFyZWQvbWFwJztcbmltcG9ydCB7IE1lYXN1cmVMZW5ndGhVbml0IH0gZnJvbSAnLi4vLi4vLi4vbWVhc3VyZSc7XG5pbXBvcnQge1xuICBTcGF0aWFsRmlsdGVyUXVlcnlUeXBlLFxuICBTcGF0aWFsRmlsdGVyVHlwZVxufSBmcm9tICcuLi8uLi9zaGFyZWQvc3BhdGlhbC1maWx0ZXIuZW51bSc7XG5pbXBvcnQgeyBTcGF0aWFsRmlsdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zcGF0aWFsLWZpbHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLy4uLy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTcGF0aWFsRmlsdGVySXRlbVR5cGUgfSBmcm9tICcuLy4uLy4uL3NoYXJlZC9zcGF0aWFsLWZpbHRlci5lbnVtJztcbmltcG9ydCB7IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYyB9IGZyb20gJy4vLi4vLi4vc2hhcmVkL3NwYXRpYWwtZmlsdGVyLmludGVyZmFjZSc7XG5cbi8qKlxuICogU3BhdGlhbC1GaWx0ZXItSXRlbSAoc2VhcmNoIHBhcmFtZXRlcnMpXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1zcGF0aWFsLWZpbHRlci1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwYXRpYWwtZmlsdGVyLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWZpbHRlci1pdGVtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgR2VvbWV0cnlGb3JtRmllbGRJbnB1dENvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nSWYsXG4gICAgTWF0U2xpZGVUb2dnbGVNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBOZ0ZvcixcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgTWF0UmFkaW9Nb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0VHJlZU1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIEVudGl0eVRhYmxlQ29tcG9uZW50LFxuICAgIEFzeW5jUGlwZSxcbiAgICBJZ29MYW5ndWFnZU1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNwYXRpYWxGaWx0ZXJJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xuICBASW5wdXQoKSBtYXA6IElnb01hcDtcblxuICBASW5wdXQoKVxuICBnZXQgdHlwZSgpOiBTcGF0aWFsRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbiAgc2V0IHR5cGUodHlwZTogU3BhdGlhbEZpbHRlclR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2VvbWV0cnlUeXBlcy5maW5kSW5kZXgoXG4gICAgICAoZ2VvbSkgPT4gZ2VvbSA9PT0gKHRoaXMudHlwZSBhcyBhbnkpXG4gICAgKTtcbiAgICB0aGlzLmdlb21ldHJ5VHlwZSA9IHRoaXMuZ2VvbWV0cnlUeXBlc1tpbmRleF07XG4gICAgdGhpcy5mb3JtQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMucmFkaXVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZHJhd0d1aWRlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuZHJhd1N0eWxlJC5uZXh0KHVuZGVmaW5lZCk7XG5cbiAgICAvLyBOZWNlc3NhcnkgdG8ga2VlcCByZWZlcmVuY2UgdG8gdGhlIGdlb21ldHJ5IGZvcm0gZmllbGQgaW5wdXRcbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XG4gICAgICBjb25zdCBnZW9qc29uOiBHZW9KU09OR2VvbWV0cnkgPSB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiAnJ1xuICAgICAgfTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoZ2VvanNvbik7XG4gICAgfVxuXG4gICAgLy8gTmVjZXNzYXJ5IHRvIGFwcGx5IHRoZSByaWdodCBzdHlsZSB3aGVuIGdlb21ldHJ5IHR5cGUgaXMgUG9pbnRcbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludCkge1xuICAgICAgdGhpcy5yYWRpdXMgPSAxMDAwOyAvLyBCYXNlIHJhZGl1c1xuICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnJhZGl1cyk7XG4gICAgICB0aGlzLlBvaW50U3R5bGUgPSAoXG4gICAgICAgIGZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PixcbiAgICAgICAgcmVzb2x1dGlvbjogbnVtYmVyXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgZ2VvbSA9IGZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBPbFBvaW50O1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IG9scHJvai50cmFuc2Zvcm0oXG4gICAgICAgICAgZ2VvbS5nZXRDb29yZGluYXRlcygpLFxuICAgICAgICAgIHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICAgICAgJ0VQU0c6NDMyNidcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgICAgICBpbWFnZTogbmV3IG9sU3R5bGUuQ2lyY2xlKHtcbiAgICAgICAgICAgIHJhZGl1czpcbiAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgL1xuICAgICAgICAgICAgICBNYXRoLmNvcygoTWF0aC5QSSAvIDE4MCkgKiBjb29yZGluYXRlc1sxXSkgL1xuICAgICAgICAgICAgICByZXNvbHV0aW9uLCAvLyBMYXRpdHVkZSBjb3JyZWN0aW9uXG4gICAgICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7XG4gICAgICAgICAgICAgIHdpZHRoOiAyLFxuICAgICAgICAgICAgICBjb2xvcjogJ3JnYmEoMCwgMTUzLCAyNTUpJ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaWxsOiBuZXcgb2xTdHlsZS5GaWxsKHtcbiAgICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDE1MywgMjU1LCAwLjIpJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB0aGlzLm92ZXJsYXlTdHlsZSA9IHRoaXMuUG9pbnRTdHlsZTtcbiAgICAgIHRoaXMuZHJhd1N0eWxlJC5uZXh0KHRoaXMub3ZlcmxheVN0eWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgZ2VvbWV0cnkgdHlwZXMgaXMgUG9seWdvblxuICAgICAgdGhpcy5yYWRpdXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLlBvbHlTdHlsZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7XG4gICAgICAgICAgICB3aWR0aDogMixcbiAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAxNTMsIDI1NSknXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZmlsbDogbmV3IG9sU3R5bGUuRmlsbCh7XG4gICAgICAgICAgICBjb2xvcjogJ3JnYmEoMCwgMTUzLCAyNTUsIDAuMiknXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgY29uc3QgY29sb3IgPSBbMCwgMTUzLCAyNTVdO1xuICAgICAgY29uc3QgZHJhd1N0eWxlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IG9sU3R5bGUuU3R5bGUoe1xuICAgICAgICAgIGltYWdlOiBuZXcgb2xTdHlsZS5DaXJjbGUoe1xuICAgICAgICAgICAgcmFkaXVzOiA4LFxuICAgICAgICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xuICAgICAgICAgICAgICB3aWR0aDogMixcbiAgICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDE1MywgMjU1KSdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlsbDogbmV3IG9sU3R5bGUuRmlsbCh7XG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAxNTMsIDI1NSwgMC4yKSdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xuICAgICAgICAgICAgY29sb3I6IGNvbG9yLmNvbmNhdChbMV0pLFxuICAgICAgICAgICAgd2lkdGg6IDJcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaWxsOiBuZXcgb2xTdHlsZS5GaWxsKHtcbiAgICAgICAgICAgIGNvbG9yOiBjb2xvci5jb25jYXQoWzAuMl0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5vdmVybGF5U3R5bGUgPSB0aGlzLlBvbHlTdHlsZTtcbiAgICAgIHRoaXMuZHJhd1N0eWxlJC5uZXh0KGRyYXdTdHlsZSk7XG4gICAgfVxuICAgIHRoaXMub3ZlcmxheVN0eWxlJC5uZXh0KHRoaXMub3ZlcmxheVN0eWxlKTtcbiAgfVxuICBwcml2YXRlIF90eXBlOiBTcGF0aWFsRmlsdGVyVHlwZTtcblxuICBASW5wdXQoKSBxdWVyeVR5cGU6IFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGU7XG5cbiAgQElucHV0KCkgem9uZTogRmVhdHVyZTtcblxuICBASW5wdXQoKSBsb2FkaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBzdG9yZSgpOiBFbnRpdHlTdG9yZTxGZWF0dXJlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlO1xuICB9XG4gIHNldCBzdG9yZShzdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT4pIHtcbiAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMuX3N0b3JlLmVudGl0aWVzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBfc3RvcmU6IEVudGl0eVN0b3JlPEZlYXR1cmU+O1xuXG4gIC8qKlxuICAgKiBBdmFpbGFibGUgbWVhc3VyZSB1bml0cyBmb3IgdGhlIG1lYXN1cmUgdHlwZSBnaXZlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBtZWFzdXJlVW5pdHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzLCBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzXTtcbiAgfVxuXG4gIEBJbnB1dCgpIGxheWVyczogQW55TGF5ZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGFsbExheWVyczogQW55TGF5ZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIGdldCB0aGVtYXRpY0xlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90aGVtYXRpY0xlbmd0aDtcbiAgfVxuICBzZXQgdGhlbWF0aWNMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RoZW1hdGljTGVuZ3RoID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfdGhlbWF0aWNMZW5ndGg6IG51bWJlcjtcblxuICBAT3V0cHV0KCkgdG9nZ2xlU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBpdGVtVHlwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U3BhdGlhbEZpbHRlckl0ZW1UeXBlPigpO1xuXG4gIEBPdXRwdXQoKSB0aGVtYXRpY0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U3BhdGlhbEZpbHRlclRoZW1hdGljW10+KCk7XG5cbiAgQE91dHB1dCgpIGRyYXdab25lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEZlYXR1cmU+KCk7XG5cbiAgQE91dHB1dCgpIGJ1ZmZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSB6b25lV2l0aEJ1ZmZlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmVhdHVyZT4oKTtcbiAgQE91dHB1dCgpIG1lYXN1cmVVbml0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNZWFzdXJlTGVuZ3RoVW5pdD4oKTtcblxuICBAT3V0cHV0KCkgcmFkaXVzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGZyZWVoYW5kQ29udHJvbCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHByZWRlZmluZWRSYWRpdXMgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQE91dHB1dCgpIGNsZWFyQnV0dG9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGNsZWFyU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGV4cG9ydCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgb3BlbldvcmtzcGFjZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGVudGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIHB1YmxpYyBpdGVtVHlwZTogU3BhdGlhbEZpbHRlckl0ZW1UeXBlW10gPSBbXG4gICAgU3BhdGlhbEZpbHRlckl0ZW1UeXBlLkFkZHJlc3MsXG4gICAgU3BhdGlhbEZpbHRlckl0ZW1UeXBlLlRoZW1hdGljc1xuICBdO1xuICBwdWJsaWMgc2VsZWN0ZWRJdGVtVHlwZTogU3BhdGlhbEZpbHRlckl0ZW1UeXBlID1cbiAgICBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcztcbiAgcHVibGljIHNlbGVjdGVkU291cmNlQWRkcmVzcztcblxuICB0cmVlQ29udHJvbDogTmVzdGVkVHJlZUNvbnRyb2w8U3BhdGlhbEZpbHRlclRoZW1hdGljPiA9XG4gICAgbmV3IE5lc3RlZFRyZWVDb250cm9sPFNwYXRpYWxGaWx0ZXJUaGVtYXRpYz4oKG5vZGUpID0+IG5vZGUuY2hpbGRyZW4pO1xuXG4gIC8vIEZvciB0aGVtYXRpY3MgYW5kIHJlc3VsdHMgdGFibGVzXG4gIHB1YmxpYyBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFsnbmFtZScsICdzZWxlY3QnXTtcbiAgcHVibGljIGNoaWxkcmVuczogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcbiAgcHVibGljIGdyb3Vwczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHRoZW1hdGljczogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcbiAgcHVibGljIGRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2U8U3BhdGlhbEZpbHRlclRoZW1hdGljPigpO1xuICBwdWJsaWMgc2VsZWN0ZWRUaGVtYXRpY3MgPSBuZXcgU2VsZWN0aW9uTW9kZWw8U3BhdGlhbEZpbHRlclRoZW1hdGljPihcbiAgICB0cnVlLFxuICAgIFtdXG4gICk7XG5cbiAgLy8gRm9yIGdlb21ldHJ5IGZvcm0gZmllbGQgaW5wdXRcbiAgdmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxHZW9KU09OR2VvbWV0cnk+KHVuZGVmaW5lZCk7XG4gIGRyYXdHdWlkZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4obnVsbCk7XG4gIG92ZXJsYXlTdHlsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIG9sU3R5bGUuU3R5bGUgfCAoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IG9sU3R5bGUuU3R5bGUpXG4gID4odW5kZWZpbmVkKTtcbiAgZHJhd1N0eWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgb2xTdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xTdHlsZS5TdHlsZSlcbiAgPih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgdmFsdWUkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHJhZGl1c0NoYW5nZXMkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGJ1ZmZlckNoYW5nZXMkJDogU3Vic2NyaXB0aW9uO1xuXG4gIHB1YmxpYyBmb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcbiAgcHVibGljIGdlb21ldHJ5VHlwZTogR2VvbWV0cnlUeXBlO1xuICBwdWJsaWMgZ2VvbWV0cnlUeXBlRmllbGQgPSBmYWxzZTtcbiAgcHVibGljIGdlb21ldHJ5VHlwZXM6IEdlb21ldHJ5VHlwZVtdID0gW1xuICAgIEdlb21ldHJ5VHlwZS5Qb2ludCxcbiAgICBHZW9tZXRyeVR5cGUuUG9seWdvblxuICBdO1xuICBwdWJsaWMgZHJhd0d1aWRlRmllbGQgPSBmYWxzZTtcbiAgcHVibGljIGRyYXdHdWlkZTogbnVtYmVyID0gbnVsbDtcbiAgcHVibGljIGRyYXdHdWlkZVBsYWNlaG9sZGVyID0gJyc7XG4gIHB1YmxpYyBtZWFzdXJlID0gZmFsc2U7XG4gIHB1YmxpYyBkcmF3Q29udHJvbElzQWN0aXZlID0gdHJ1ZTtcbiAgcHVibGljIGZyZWVoYW5kRHJhd0lzQWN0aXZlID0gZmFsc2U7XG4gIHB1YmxpYyBkcmF3U3R5bGU6IG9sU3R5bGUuU3R5bGUgfCAoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IG9sU3R5bGUuU3R5bGUpO1xuICBwdWJsaWMgZHJhd1pvbmU7XG4gIHB1YmxpYyBvdmVybGF5U3R5bGU6IG9sU3R5bGUuU3R5bGUgfCAoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IG9sU3R5bGUuU3R5bGUpO1xuICBwdWJsaWMgUG9pbnRTdHlsZTogb2xTdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xTdHlsZS5TdHlsZSk7XG4gIHB1YmxpYyBQb2x5U3R5bGU6IG9sU3R5bGUuU3R5bGUgfCAoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IG9sU3R5bGUuU3R5bGUpO1xuXG4gIHB1YmxpYyByYWRpdXM6IG51bWJlcjtcbiAgcHVibGljIGJ1ZmZlciA9IDA7XG4gIHB1YmxpYyByYWRpdXNGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcbiAgcHVibGljIGJ1ZmZlckZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xuXG4gIHB1YmxpYyBtZWFzdXJlVW5pdDogTWVhc3VyZUxlbmd0aFVuaXQgPSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnM7XG4gIHB1YmxpYyB6b25lV2l0aEJ1ZmZlcjtcblxuICBwdWJsaWMgbGlzdElzVmlzaWJsZSA9IHRydWU7XG4gIHB1YmxpYyB0YWJsZVRlbXBsYXRlOiBFbnRpdHlUYWJsZVRlbXBsYXRlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc3BhdGlhbEZpbHRlclNlcnZpY2U6IFNwYXRpYWxGaWx0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgIC5sb2FkVGhlbWF0aWNzTGlzdCgpXG4gICAgICAuc3Vic2NyaWJlKChpdGVtczogU3BhdGlhbEZpbHRlclRoZW1hdGljW10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbnMucHVzaChpdGVtKTtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKFxuICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnRlcnJhcGkubGltaXRlcycpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxpbWl0czogU3BhdGlhbEZpbHRlclRoZW1hdGljID0ge1xuICAgICAgICAgIG5hbWU6IHRoaXMuZ3JvdXBzWzBdLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRoZW1hdGljcy5wdXNoKGxpbWl0cyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLmdyb3VwICYmIHRoaXMuZ3JvdXBzLmluZGV4T2YoY2hpbGQuZ3JvdXApID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMucHVzaChjaGlsZC5ncm91cCk7XG4gICAgICAgICAgICBjb25zdCB0aGVtYXRpYzogU3BhdGlhbEZpbHRlclRoZW1hdGljID0ge1xuICAgICAgICAgICAgICBuYW1lOiBjaGlsZC5ncm91cCxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50aGVtYXRpY3MucHVzaCh0aGVtYXRpYyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFjaGlsZC5ncm91cCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgJ2lnby5nZW8udGVycmFwaS5BZG1SZWdpb24nXG4gICAgICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnRlcnJhcGkuTXVuJykgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnRlcnJhcGkuQXJyb25kJ1xuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnRlcnJhcGkuQ2lyY0ZlZCdcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgIGNoaWxkLm5hbWUgPT09XG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby50ZXJyYXBpLkNpcmNQcm92J1xuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnRlcnJhcGkuRGlyUmVnJ1xuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby50ZXJyYXBpLk1SQycpIHx8XG4gICAgICAgICAgICAgIGNoaWxkLm5hbWUgPT09XG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby50ZXJyYXBpLlJlZ1RvdXInXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNoaWxkLmdyb3VwID0gbGltaXRzLm5hbWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxuICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby50ZXJyYXBpLnJvdXRlcycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2hpbGQuZ3JvdXAgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLmdyb3VwLnRyYW5zcG9ydCdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRoZW1hdGljOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogY2hpbGQubmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgICAgc291cmNlOiBjaGlsZC5zb3VyY2VcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdGhpcy50aGVtYXRpY3MucHVzaCh0aGVtYXRpYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGhlbWF0aWNzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50aGVtYXRpY3MuZm9yRWFjaCgodGhlbWF0aWMpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW5zKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuZ3JvdXAgPT09IHRoZW1hdGljLm5hbWUpIHtcbiAgICAgICAgICAgICAgdGhlbWF0aWMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLnRoZW1hdGljcztcblxuICAgIHRoaXMuZHJhd0d1aWRlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMudmFsdWUkLm5leHQoXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgdGhpcy52YWx1ZSQkID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgKHZhbHVlOiBHZW9KU09OR2VvbWV0cnkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSQubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5kcmF3Wm9uZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgYXMgRmVhdHVyZTtcbiAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd1pvbmVFdmVudC5lbWl0KHRoaXMuZHJhd1pvbmUpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgICB0aGlzLmRyYXdab25lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMudmFsdWUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmdldFJhZGl1cygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJhZGl1c0NoYW5nZXMkJCA9IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmdldFJhZGl1cygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmJ1ZmZlckNoYW5nZXMkJCA9IHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnMgJiZcbiAgICAgICAgICB2YWx1ZSA+IDAgJiZcbiAgICAgICAgICB2YWx1ZSA8PSAxMDAwMDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5idWZmZXIgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlckV2ZW50LmVtaXQodmFsdWUpO1xuICAgICAgICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgICAgICAgIC5sb2FkQnVmZmVyR2VvbWV0cnkodGhpcy5kcmF3Wm9uZSwgU3BhdGlhbEZpbHRlclR5cGUuUG9seWdvbiwgdmFsdWUpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChmZWF0dXJlR2VvbTogRmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyID0gZmVhdHVyZUdlb207XG4gICAgICAgICAgICAgIHRoaXMuem9uZVdpdGhCdWZmZXJDaGFuZ2UuZW1pdCh0aGlzLnpvbmVXaXRoQnVmZmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0LktpbG9tZXRlcnMgJiZcbiAgICAgICAgICB2YWx1ZSA+IDAgJiZcbiAgICAgICAgICB2YWx1ZSA8PSAxMDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5idWZmZXIgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlckV2ZW50LmVtaXQodmFsdWUpO1xuICAgICAgICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgICAgICAgIC5sb2FkQnVmZmVyR2VvbWV0cnkoXG4gICAgICAgICAgICAgIHRoaXMuZHJhd1pvbmUsXG4gICAgICAgICAgICAgIFNwYXRpYWxGaWx0ZXJUeXBlLlBvbHlnb24sXG4gICAgICAgICAgICAgIHZhbHVlICogMTAwMFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZmVhdHVyZUdlb206IEZlYXR1cmUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy56b25lV2l0aEJ1ZmZlciA9IGZlYXR1cmVHZW9tO1xuICAgICAgICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyQ2hhbmdlLmVtaXQodGhpcy56b25lV2l0aEJ1ZmZlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuYnVmZmVyID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5idWZmZXJFdmVudC5lbWl0KHZhbHVlKTtcbiAgICAgICAgICB0aGlzLmRyYXdab25lRXZlbnQuZW1pdCh0aGlzLmRyYXdab25lKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB2YWx1ZSA8IDAgfHxcbiAgICAgICAgICAodGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzICYmIHZhbHVlID4gMTAwMDAwKSB8fFxuICAgICAgICAgICh0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzICYmIHZhbHVlID4gMTAwKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKDApO1xuICAgICAgICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5idWZmZXJBbGVydCcsXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZFJlY29yZFN0cmF0ZWd5ID0gbmV3IEVudGl0eVN0b3JlRmlsdGVyU2VsZWN0aW9uU3RyYXRlZ3koe30pO1xuICAgIGNvbnN0IHNlbGVjdGlvblN0cmF0ZWd5ID0gbmV3IEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KHtcbiAgICAgIGxheWVyOiBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgICAgICB6SW5kZXg6IDMwMCxcbiAgICAgICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcbiAgICAgICAgc3R5bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc2hvd0luTGF5ZXJMaXN0OiBmYWxzZSxcbiAgICAgICAgZXhwb3J0YWJsZTogZmFsc2UsXG4gICAgICAgIGJyb3dzYWJsZTogZmFsc2VcbiAgICAgIH0pLFxuICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgIGhpdFRvbGVyYW5jZTogMTUsXG4gICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uRGVmYXVsdCxcbiAgICAgIG1hbnk6IHRydWUsXG4gICAgICBkcmFnQm94OiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0b3JlLmFkZFN0cmF0ZWd5KHNlbGVjdGlvblN0cmF0ZWd5LCB0cnVlKTtcbiAgICB0aGlzLnN0b3JlLmFkZFN0cmF0ZWd5KHNlbGVjdGVkUmVjb3JkU3RyYXRlZ3ksIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSB0byB0aGUgdmFsdWUgc3RyZWFtXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy52YWx1ZSQkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yYWRpdXNDaGFuZ2VzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmJ1ZmZlckNoYW5nZXMkJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2RSZWYuZGV0YWNoKCk7XG4gICAgaWYgKHRoaXMucmFkaXVzQ2hhbmdlcyQkKSB7XG4gICAgICB0aGlzLnJhZGl1c0NoYW5nZXMkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZSQkKSB7XG4gICAgICB0aGlzLnZhbHVlJCQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBvbkl0ZW1UeXBlQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1UeXBlID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5pdGVtVHlwZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtZWFzdXJlIHVuaXRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbk1lYXN1cmVVbml0Q2hhbmdlKHVuaXQ6IE1lYXN1cmVMZW5ndGhVbml0KSB7XG4gICAgaWYgKHVuaXQgPT09IHRoaXMubWVhc3VyZVVuaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9IHVuaXQ7XG4gICAgICB0aGlzLm1lYXN1cmVVbml0Q2hhbmdlLmVtaXQodGhpcy5tZWFzdXJlVW5pdCk7XG4gICAgICBpZiAodGhpcy5pc1BvbHlnb24oKSkge1xuICAgICAgICB0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnNcbiAgICAgICAgICA/IHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5idWZmZXJGb3JtQ29udHJvbC52YWx1ZSAqIDEwMDApXG4gICAgICAgICAgOiB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKFxuICAgICAgICAgICAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnZhbHVlIC8gMTAwMFxuICAgICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BvaW50KCkpIHtcbiAgICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzXG4gICAgICAgICAgPyB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWUgKiAxMDAwKVxuICAgICAgICAgIDogdGhpcy5yYWRpdXNGb3JtQ29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSAvIDEwMDBcbiAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNQcmVkZWZpbmVkKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQ7XG4gIH1cblxuICBpc1BvbHlnb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9seWdvbjtcbiAgfVxuXG4gIGlzUG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQ7XG4gIH1cblxuICBoYXNDaGlsZChfOiBudW1iZXIsIG5vZGU6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uVG9nZ2xlQ2xpY2sobm9kZTogU3BhdGlhbEZpbHRlclRoZW1hdGljKSB7XG4gICAgdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXG4gICAgICA/IHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2Uobm9kZSlcbiAgICAgIDogdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSk7XG4gIH1cblxuICBpc0FsbFNlbGVjdGVkKG5vZGU/OiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMpIHtcbiAgICBsZXQgbnVtU2VsZWN0ZWQ7XG4gICAgbGV0IG51bU5vZGVzID0gMDtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5sZW5ndGg7XG4gICAgICB0aGlzLnRoZW1hdGljcy5mb3JFYWNoKCh0aGVtYXRpYykgPT4ge1xuICAgICAgICBpZiAodGhpcy5ncm91cHMuaW5kZXhPZih0aGVtYXRpYy5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICBudW1Ob2RlcysrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkcmVuKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy50aGVtYXRpY3MuZmluZChcbiAgICAgICAgICAgICh0aGVtYXRpYykgPT4gdGhlbWF0aWMuc291cmNlID09PSBjaGlsZHJlbi5zb3VyY2VcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIG51bU5vZGVzKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1TZWxlY3RlZCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZHJlbikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAgICAgKHRoZW1hdGljKSA9PiB0aGVtYXRpYyA9PT0gY2hpbGRyZW5cbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIG51bU5vZGVzKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChudW1Ob2RlcyA+PSAxKSB7XG4gICAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bU5vZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaGFzQ2hpbGRyZW5TZWxlY3RlZChub2RlOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMpIHtcbiAgICBsZXQgYm9vbCA9IGZhbHNlO1xuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAgICh0aGVtYXRpYykgPT4gdGhlbWF0aWMuc291cmNlID09PSBjaGlsZC5zb3VyY2VcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGJvb2wgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBib29sO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGhlYWRlciBjaGVja2JveFxuICAgKi9cbiAgbWFzdGVyVG9nZ2xlKCkge1xuICAgIHRoaXMuaXNBbGxTZWxlY3RlZCgpID8gdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5jbGVhcigpIDogdGhpcy5zZWxlY3RBbGwoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWF0aWNzTmFtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRoZW1hdGljIG9mIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkVGhlbWF0aWNzTmFtZS5wdXNoKHRoZW1hdGljKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMudGhlbWF0aWNzLmZvckVhY2goKHRoZW1hdGljKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NoaWxkKDAsIHRoZW1hdGljKSkge1xuICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKHRoZW1hdGljKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGhlbWF0aWNzLmZvckVhY2goKHRoZW1hdGljKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NoaWxkKDAsIHRoZW1hdGljKSkge1xuICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2UodGhlbWF0aWMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KHNlbGVjdGVkVGhlbWF0aWNzTmFtZSk7XG4gIH1cblxuICBzZWxlY3RBbGwobm9kZT86IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhpcy50aGVtYXRpY3MuZm9yRWFjaCgodGhlbWF0aWMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBzLmluZGV4T2YodGhlbWF0aWMubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3QodGhlbWF0aWMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkcmVuKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAgICAgKHRoZW1hdGljKSA9PiB0aGVtYXRpYy5zb3VyY2UgPT09IGNoaWxkcmVuLnNvdXJjZVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3QoY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaGFzQ2hpbGQoMCwgbm9kZSkpIHtcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZHJlbikgPT5cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLnNlbGVjdChjaGlsZHJlbilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGlsZHJlbnNUb2dnbGUobm9kZTogU3BhdGlhbEZpbHRlclRoZW1hdGljKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkKG5vZGUpXG4gICAgICA/IG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3MuZGVzZWxlY3QoY2hpbGQpKVxuICAgICAgOiB0aGlzLnNlbGVjdEFsbChub2RlKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWF0aWNzTmFtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRoZW1hdGljIG9mIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkVGhlbWF0aWNzTmFtZS5wdXNoKHRoZW1hdGljKTtcbiAgICB9XG4gICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSk7XG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KHNlbGVjdGVkVGhlbWF0aWNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgY2hhbmdlcyB0byB0aGUgdGhlbWF0aWNzIHNlbGVjdGVkIHRyZWUgYW5kIGVtaXQgZXZlbnRcbiAgICovXG4gIG9uVG9nZ2xlQ2hhbmdlKG5vZGVTZWxlY3RlZDogU3BhdGlhbEZpbHRlclRoZW1hdGljKSB7XG4gICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAodGhlbWF0aWMpID0+IHRoZW1hdGljLnNvdXJjZSA9PT0gbm9kZVNlbGVjdGVkLnNvdXJjZVxuICAgICAgKSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGRyZW4pID0+IHtcbiAgICAgIGlmIChjaGlsZHJlbiA9PT0gbm9kZVNlbGVjdGVkICYmIHNlbGVjdGVkID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLnNlbGVjdChjaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGRyZW4gPT09IG5vZGVTZWxlY3RlZCAmJiBzZWxlY3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLmRlc2VsZWN0KGNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRoZW1hdGljcy5mb3JFYWNoKCh0aGVtYXRpYykgPT4ge1xuICAgICAgaWYgKHRoZW1hdGljID09PSBub2RlU2VsZWN0ZWQgJiYgc2VsZWN0ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0KHRoZW1hdGljKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGVtYXRpYyA9PT0gbm9kZVNlbGVjdGVkICYmIHNlbGVjdGVkID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3MuZGVzZWxlY3QodGhlbWF0aWMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRUaGVtYXRpY3NOYW1lOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWNbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGhlbWF0aWMgb2YgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWRUaGVtYXRpY3NOYW1lLnB1c2godGhlbWF0aWMpO1xuICAgIH1cbiAgICB0aGlzLnRoZW1hdGljQ2hhbmdlLmVtaXQoc2VsZWN0ZWRUaGVtYXRpY3NOYW1lKTtcbiAgfVxuXG4gIG9uRHJhd0NvbnRyb2xDaGFuZ2UoKSB7XG4gICAgdGhpcy5kcmF3Q29udHJvbElzQWN0aXZlID0gIXRoaXMuZHJhd0NvbnRyb2xJc0FjdGl2ZTtcbiAgfVxuXG4gIG9uZnJlZWhhbmRDb250cm9sQ2hhbmdlKCkge1xuICAgIHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUgPSAhdGhpcy5mcmVlaGFuZERyYXdJc0FjdGl2ZTtcbiAgICB0aGlzLmZyZWVoYW5kQ29udHJvbC5lbWl0KHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpO1xuICAgIGlmICh0aGlzLmlzUG9pbnQoKSkge1xuICAgICAgdGhpcy5wcmVkZWZpbmVkUmFkaXVzLmVtaXQoIXRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpO1xuICAgICAgaWYgKHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5U3R5bGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kcmF3U3R5bGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVkZWZpbmVkUmFkaXVzLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2ggc2VhcmNoIGJ1dHRvblxuICAgKi9cbiAgdG9nZ2xlU2VhcmNoQnV0dG9uKCkge1xuICAgIGlmICghdGhpcy5pc1ByZWRlZmluZWQoKSkge1xuICAgICAgaWYgKHRoaXMuYnVmZmVyID4gMCkge1xuICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyLm1ldGEgPSB7XG4gICAgICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0aXRsZTogJ1pvbmUnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuem9uZVdpdGhCdWZmZXIucHJvcGVydGllcyA9IHtcbiAgICAgICAgICBub206ICdab25lJyxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUgYXMgc3RyaW5nXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZHJhd1pvbmVFdmVudC5lbWl0KHRoaXMuem9uZVdpdGhCdWZmZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kcmF3Wm9uZS5tZXRhID0ge1xuICAgICAgICAgIGlkOiB1bmRlZmluZWQsXG4gICAgICAgICAgdGl0bGU6ICdab25lJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYXdab25lLnByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgbm9tOiAnWm9uZScsXG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlIGFzIHN0cmluZ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYXdab25lRXZlbnQuZW1pdCh0aGlzLmRyYXdab25lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQb2ludCgpKSB7XG4gICAgICB0aGlzLnJhZGl1c0V2ZW50LmVtaXQodGhpcy5yYWRpdXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1BvbHlnb24oKSkge1xuICAgICAgdGhpcy5idWZmZXJFdmVudC5lbWl0KHRoaXMuYnVmZmVyKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVTZWFyY2guZW1pdCgpO1xuICAgIHRoaXMuc3RvcmUuZW50aXRpZXMkLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggJiYgdGhpcy5sYXllcnMubGVuZ3RoID09PSB0aGlzLnRoZW1hdGljTGVuZ3RoICsgMSkge1xuICAgICAgICB0aGlzLm9wZW5Xb3Jrc3BhY2UuZW1pdCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlVGVtcGxhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2ggY2xlYXIgYnV0dG9uIChjbGVhciBzdG9yZSBhbmQgbWFwIGxheWVycylcbiAgICovXG4gIGNsZWFyQnV0dG9uKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuc3RvcmUpIHtcbiAgICAgIHRoaXMuc3RvcmUuY2xlYXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQb2ludCgpIHx8IHRoaXMuaXNQb2x5Z29uKCkpIHtcbiAgICAgIHRoaXMuZHJhd1pvbmUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUoMCk7XG4gICAgdGhpcy5idWZmZXIgPSAwO1xuICAgIHRoaXMuYnVmZmVyRXZlbnQuZW1pdCgwKTtcbiAgICB0aGlzLmNsZWFyQnV0dG9uRXZlbnQuZW1pdCgpO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudGFibGVUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsZWFyRHJhd1pvbmUoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUoMCk7XG4gICAgdGhpcy5idWZmZXIgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaCBjbGVhciBzZWFyY2ggKGNsZWFyIGZpZWxkIGlmIHR5cGUgaXMgcHJlZGVmaW5lZClcbiAgICovXG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3MuY2xlYXIoKTtcbiAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKDApO1xuICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICB0aGlzLmJ1ZmZlckV2ZW50LmVtaXQoMCk7XG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KFtdKTtcbiAgICB0aGlzLmNsZWFyU2VhcmNoRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBjb25kaXRpb25zIG9mIGluY29tcGxldGUgZmllbGRzIG9yIGJ1c3kgc2VydmljZVxuICAgKi9cbiAgZGlzYWJsZVNlYXJjaEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcykge1xuICAgICAgICBpZiAodGhpcy5xdWVyeVR5cGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnpvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbVR5cGUgPT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5UaGVtYXRpY3MpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucXVlcnlUeXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB0aGlzLnpvbmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9seWdvbiB8fFxuICAgICAgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbVR5cGUgPT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5BZGRyZXNzICYmXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtVHlwZSA9PT0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLlRoZW1hdGljcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZGlzYWJsZWRDbGVhclNlYXJjaCgpIHtcbiAgICBsZXQgZGlzYWJsZSA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzc1xuICAgICAgPyAoZGlzYWJsZSA9IHRoaXMucXVlcnlUeXBlID09PSB1bmRlZmluZWQpXG4gICAgICA6IChkaXNhYmxlID1cbiAgICAgICAgICB0aGlzLnF1ZXJ5VHlwZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5sZW5ndGggPT09IDApO1xuXG4gICAgcmV0dXJuIGRpc2FibGU7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlIHJhZGl1cyB2YWx1ZSBhdCB1c2VyIGNoYW5nZVxuICAgKi9cbiAgZ2V0UmFkaXVzKCkge1xuICAgIGxldCBmb3JtVmFsdWU7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVyc1xuICAgICAgICA/IChmb3JtVmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlLnJhZGl1cylcbiAgICAgICAgOiAoZm9ybVZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZS5yYWRpdXMgLyAxMDAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybVZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50KSB7XG4gICAgICBpZiAoIXRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWUgPCAwIHx8XG4gICAgICAgICAgKHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycyAmJlxuICAgICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSA+PSAxMDAwMDApIHx8XG4gICAgICAgICAgKHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0LktpbG9tZXRlcnMgJiZcbiAgICAgICAgICAgIHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWUgPj0gMTAwKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5yYWRpdXNBbGVydCcsXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnJhZGl1cyA9IDEwMDA7XG4gICAgICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzXG4gICAgICAgICAgICA/IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5yYWRpdXMpXG4gICAgICAgICAgICA6IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5yYWRpdXMgLyAxMDAwKTtcbiAgICAgICAgICB0aGlzLmRyYXdHdWlkZSQubmV4dCh0aGlzLnJhZGl1cyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm9ybVZhbHVlKSB7XG4gICAgICAgICAgaWYgKGZvcm1WYWx1ZSA+PSAxMDAwMDApIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIucmFkaXVzQWxlcnQnLFxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5yZXNldCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZm9ybVZhbHVlICE9PSB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnNldFZhbHVlKGZvcm1WYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzKSB7XG4gICAgICAgIHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgdGhpcy5kcmF3R3VpZGUkLm5leHQodGhpcy5yYWRpdXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnZhbHVlICogMTAwMDtcbiAgICAgICAgdGhpcy5kcmF3R3VpZGUkLm5leHQodGhpcy5yYWRpdXMgKiAxMDAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3ZlcmxheVN0eWxlJC5uZXh0KHRoaXMuUG9pbnRTdHlsZSk7XG4gICAgICB0aGlzLmRyYXdTdHlsZSQubmV4dCh0aGlzLlBvaW50U3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVZpc2libGVMaXN0KCkge1xuICAgIHRoaXMubGlzdElzVmlzaWJsZSA9ICF0aGlzLmxpc3RJc1Zpc2libGU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRhYmxlVGVtcGxhdGUoKSB7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IHtcbiAgICAgIG5hbWU6ICdtZXRhLnRpdGxlJyxcbiAgICAgIHRpdGxlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci50eXBlJ1xuICAgICAgKSxcbiAgICAgIHJlbmRlcmVyOiBFbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLlVuc2FuaXRpemVkSFRNTFxuICAgIH07XG4gICAgY29uc3QgbmFtZUNvbHVtbiA9IHtcbiAgICAgIG5hbWU6ICdwcm9wZXJ0aWVzLm5vbScsXG4gICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc2VhcmNoUmVzdWx0cydcbiAgICAgICksXG4gICAgICByZW5kZXJlcjogRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlci5VbnNhbml0aXplZEhUTUxcbiAgICB9O1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbdHlwZUNvbHVtbiwgbmFtZUNvbHVtbl07XG5cbiAgICB0aGlzLnRhYmxlVGVtcGxhdGUgPSB7XG4gICAgICBzZWxlY3Rpb246IHRydWUsXG4gICAgICBzb3J0OiB0cnVlLFxuICAgICAgY29sdW1uc1xuICAgIH07XG4gIH1cbn1cbiIsIjxpZ28tZ2VvbWV0cnktZm9ybS1maWVsZC1pbnB1dFxuICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICBbbWFwXT1cIm1hcFwiXG4gIFtnZW9tZXRyeVR5cGVdPVwiZ2VvbWV0cnlUeXBlXCJcbiAgW2RyYXdHdWlkZV09XCJkcmF3R3VpZGUkIHwgYXN5bmNcIlxuICBbbWVhc3VyZV09XCJtZWFzdXJlXCJcbiAgW2RyYXdDb250cm9sSXNBY3RpdmVdPVwiZHJhd0NvbnRyb2xJc0FjdGl2ZVwiXG4gIFtmcmVlaGFuZERyYXdJc0FjdGl2ZV09XCJmcmVlaGFuZERyYXdJc0FjdGl2ZVwiXG4gIFtkcmF3U3R5bGVdPVwiZHJhd1N0eWxlJCB8IGFzeW5jXCJcbiAgW292ZXJsYXlTdHlsZV09XCJvdmVybGF5U3R5bGUkIHwgYXN5bmNcIlxuICBbcmFkaXVzXT1cInJhZGl1c1wiXG4gIFtwcmVkZWZpbmVkUmFkaXVzXT1cIiRhbnkocHJlZGVmaW5lZFJhZGl1cylcIlxuPlxuPC9pZ28tZ2VvbWV0cnktZm9ybS1maWVsZC1pbnB1dD5cblxuPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICpuZ0lmPVwiIWlzUHJlZGVmaW5lZCgpXCJcbiAgICBbY2hlY2tlZF09XCJkcmF3Q29udHJvbElzQWN0aXZlXCJcbiAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgKGNoYW5nZSk9XCJvbkRyYXdDb250cm9sQ2hhbmdlKClcIlxuICA+XG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5kcmF3Q29udHJvbCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICpuZ0lmPVwiIWlzUHJlZGVmaW5lZCgpXCJcbiAgICBbY2hlY2tlZF09XCJmcmVlaGFuZERyYXdJc0FjdGl2ZVwiXG4gICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxuICAgIChjaGFuZ2UpPVwib25mcmVlaGFuZENvbnRyb2xDaGFuZ2UoKVwiXG4gID5cbiAgICB7eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLmZyZWVoYW5kQ29udHJvbCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJidWZmZXItdW5pdFwiICpuZ0lmPVwiaXNQb2x5Z29uKClcIj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiYnVmZmVyXCI+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgIG1hdElucHV0XG4gICAgICBwbGFjZWhvbGRlcj1cInt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuYnVmZmVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiYnVmZmVyRm9ybUNvbnRyb2xcIlxuICAgICAgW3ZhbHVlXT1cIjBcIlxuICAgICAgW3JlYWRvbmx5XT1cInRoaXMuZm9ybUNvbnRyb2wudmFsdWUgPT09IG51bGxcIlxuICAgIC8+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidW5pdC1maWVsZFwiPlxuICAgIDxtYXQtc2VsZWN0XG4gICAgICBbdmFsdWVdPVwibWVhc3VyZVVuaXRcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1lYXN1cmVVbml0Q2hhbmdlKCRldmVudC52YWx1ZSlcIlxuICAgID5cbiAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBtZWFzdXJlVW5pdCBvZiBtZWFzdXJlVW5pdHNcIlxuICAgICAgICBbdmFsdWVdPVwibWVhc3VyZVVuaXRcIlxuICAgICAgPlxuICAgICAgICB7eyAnaWdvLmdlby5tZWFzdXJlLicgKyBtZWFzdXJlVW5pdCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwicmFkaXVzLXVuaXRcIiAqbmdJZj1cImlzUG9pbnQoKVwiPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJyYWRpdXNcIj5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgbWF0SW5wdXRcbiAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5yYWRpdXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJyYWRpdXNGb3JtQ29udHJvbFwiXG4gICAgICBbdmFsdWVdPVwiMTAwMFwiXG4gICAgICAoaW5wdXQpPVwiZ2V0UmFkaXVzKClcIlxuICAgICAgW3JlYWRvbmx5XT1cInRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUgJiYgdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA9PT0gbnVsbFwiXG4gICAgLz5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ1bml0LWZpZWxkXCI+XG4gICAgPG1hdC1zZWxlY3RcbiAgICAgIFt2YWx1ZV09XCJtZWFzdXJlVW5pdFwiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uTWVhc3VyZVVuaXRDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiXG4gICAgPlxuICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IG1lYXN1cmVVbml0IG9mIG1lYXN1cmVVbml0c1wiXG4gICAgICAgIFt2YWx1ZV09XCJtZWFzdXJlVW5pdFwiXG4gICAgICA+XG4gICAgICAgIHt7ICdpZ28uZ2VvLm1lYXN1cmUuJyArIG1lYXN1cmVVbml0IHwgdHJhbnNsYXRlIH19XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgPC9tYXQtc2VsZWN0PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG5cbjxtYXQtbGFiZWwgY2xhc3M9XCJ0aXRsZSBtYXQtdHlwb2dyYXBoeVwiXG4gID57eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNlYXJjaCcgfCB0cmFuc2xhdGUgfX0gOlxuPC9tYXQtbGFiZWw+XG48bWF0LXJhZGlvLWdyb3VwIFt2YWx1ZV09XCJzZWxlY3RlZEl0ZW1UeXBlXCI+XG4gIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbVR5cGVcIlxuICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAoY2hhbmdlKT1cIm9uSXRlbVR5cGVDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICB7eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLicgKyBpdGVtIHwgdHJhbnNsYXRlIH19XG4gIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbjwvbWF0LXJhZGlvLWdyb3VwPlxuXG48ZGl2XG4gIGNsYXNzPVwidGhlbWF0aWNzXCJcbiAgKm5nSWY9XCJcbiAgICAoc2VsZWN0ZWRJdGVtVHlwZSA9PT0gJ1RoZW1hdGljcycgJiYgIXRhYmxlVGVtcGxhdGUpIHx8XG4gICAgKHNlbGVjdGVkSXRlbVR5cGUgPT09ICdUaGVtYXRpY3MnICYmIHRhYmxlVGVtcGxhdGUgJiYgIWxpc3RJc1Zpc2libGUpXG4gIFwiXG4+XG4gIDxtYXQtdGFibGU+XG4gICAgPCEtLSBOYW1lIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cbiAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ0aGVtYXRpY3MtaGVhZGVyXCI+e3tcbiAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5UaGVtYXRpY3MnIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTZWxlY3QgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiY2hlY2tzLWhlYWRlclwiPlxuICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0ZWRUaGVtYXRpY3MuaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LXJvdz5cbiAgPC9tYXQtdGFibGU+XG5cbiAgPG1hdC10cmVlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIj5cbiAgICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgbGVhZiBub2RlcyAtLT5cbiAgICA8bWF0LXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiIG1hdFRyZWVOb2RlVG9nZ2xlPlxuICAgICAgPGxpIGNsYXNzPVwibWF0LXRyZWUtbm9kZVwiPlxuICAgICAgICA8IS0tIHVzZSBhIGRpc2FibGVkIGJ1dHRvbiB0byBwcm92aWRlIHBhZGRpbmcgZm9yIHRyZWUgbGVhZiAtLT5cbiAgICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2VsZW1lbnRzLWNvbnRlbnQgLS0+XG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGRpc2FibGVkPjwvYnV0dG9uPlxuICAgICAgICB7eyBub2RlLm5hbWUgfX1cbiAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgIGNsYXNzPVwidHJlZS1jaGVja1wiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBvblRvZ2dsZUNoYW5nZShub2RlKSA6IG51bGxcIlxuICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkVGhlbWF0aWNzLmlzU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgPC9saT5cbiAgICA8L21hdC10cmVlLW5vZGU+XG5cbiAgICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgZXhwYW5kYWJsZSBub2RlcyAtLT5cbiAgICA8bWF0LW5lc3RlZC10cmVlLW5vZGUgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGU7IHdoZW46IGhhc0NoaWxkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LXRyZWUtbm9kZVwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25Ub2dnbGVDbGljayhub2RlKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj57e1xuICAgICAgICAgICAgdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCdcbiAgICAgICAgICB9fTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB7eyBub2RlLm5hbWUgfX1cbiAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgIGNsYXNzPVwidHJlZS1jaGVjay0yXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IGNoaWxkcmVuc1RvZ2dsZShub2RlKSA6IG51bGxcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImhhc0NoaWxkcmVuU2VsZWN0ZWQobm9kZSkgJiYgIWlzQWxsU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgPC9kaXY+XG4gICAgICA8dWxcbiAgICAgICAgY2xhc3M9XCJ0cmVlLXVsXCJcbiAgICAgICAgW2NsYXNzLmV4YW1wbGUtdHJlZS1pbnZpc2libGVdPVwiIXRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSlcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdFRyZWVOb2RlT3V0bGV0PjwvbmctY29udGFpbmVyPlxuICAgICAgPC91bD5cbiAgICA8L21hdC1uZXN0ZWQtdHJlZS1ub2RlPlxuICA8L21hdC10cmVlPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gIDxidXR0b25cbiAgICAqbmdJZj1cImlzUHJlZGVmaW5lZCgpXCJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNsYXNzPVwiY2xlYXItc2VhcmNoLWJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkQ2xlYXJTZWFyY2goKVwiXG4gICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIlxuICA+XG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5jbGVhclNlYXJjaCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiaXNQb2x5Z29uKCkgfHwgaXNQb2ludCgpXCJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNsYXNzPVwiY2xlYXItZm9ybS1idXR0b25cIlxuICAgIFtkaXNhYmxlZF09XCJ0aGlzLmZvcm1Db250cm9sLnZhbHVlID09PSBudWxsXCJcbiAgICAoY2xpY2spPVwiY2xlYXJEcmF3Wm9uZSgpXCJcbiAgPlxuICAgIHt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuY2xlYXJGb3JtJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICBjbGFzcz1cInNlYXJjaC1idXR0b25cIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlU2VhcmNoQnV0dG9uKClcIlxuICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZVNlYXJjaEJ1dHRvbigpXCJcbiAgPlxuICAgIHt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuZ29TZWFyY2gnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNsYXNzPVwicmVtb3ZlLWJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cImFsbExheWVycy5sZW5ndGggPT09IDBcIlxuICAgIChjbGljayk9XCJjbGVhckJ1dHRvbigpXCJcbiAgPlxuICAgIHt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIucmVtb3ZlTGF5ZXInIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNsYXNzPVwiZXhwb3J0LWJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cIiFzdG9yZS5lbnRpdGllcyQuZ2V0VmFsdWUoKS5sZW5ndGhcIlxuICAgIChjbGljayk9XCJleHBvcnQuZW1pdCgpXCJcbiAgPlxuICAgIHt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuZXhwb3J0TGF5ZXInIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxidXR0b25cbiAgY2xhc3M9XCJleHBhbmQtbW9yZVwiXG4gICpuZ0lmPVwic3RvcmUuYWxsKCkubGVuZ3RoICYmIHRhYmxlVGVtcGxhdGUgJiYgIWxpc3RJc1Zpc2libGVcIlxuICBtYXQtaWNvbi1idXR0b25cbiAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc2hvd1NlYXJjaFJlc3VsdHMnIHwgdHJhbnNsYXRlXCJcbiAgKGNsaWNrKT1cInRvZ2dsZVZpc2libGVMaXN0KClcIlxuPlxuICA8bWF0LWljb24+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuPC9idXR0b24+XG5cbjxkaXZcbiAgY2xhc3M9XCJyZXN1bHRzXCJcbiAgKm5nSWY9XCJzdG9yZS5hbGwoKS5sZW5ndGggJiYgdGFibGVUZW1wbGF0ZSAmJiBsaXN0SXNWaXNpYmxlXCJcbj5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwibGlzdElzVmlzaWJsZVwiXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5oaWRlU2VhcmNoUmVzdWx0cycgfCB0cmFuc2xhdGVcIlxuICAgIChjbGljayk9XCJ0b2dnbGVWaXNpYmxlTGlzdCgpXCJcbiAgPlxuICAgIDxtYXQtaWNvbj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuICA8aWdvLWVudGl0eS10YWJsZVxuICAgIGNsYXNzPVwicmVzdWx0cy1saXN0XCJcbiAgICBbdGVtcGxhdGVdPVwidGFibGVUZW1wbGF0ZVwiXG4gICAgW3N0b3JlXT1cInN0b3JlXCJcbiAgICAoZW50aXR5U2VsZWN0Q2hhbmdlKT1cImVudGl0eUNoYW5nZS5lbWl0KCRldmVudClcIlxuICA+XG4gIDwvaWdvLWVudGl0eS10YWJsZT5cbjwvZGl2PlxuIl19