@igo2/integration 1.15.4 → 16.0.0-rc.1

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