@igo2/geo 1.13.2 → 1.13.4

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 (448) hide show
  1. package/assets/icons/cross_black_18px.svg +88 -88
  2. package/assets/icons/place_blue_36px.svg +55 -55
  3. package/assets/icons/place_green_36px.svg +55 -55
  4. package/assets/icons/place_red_36px.svg +55 -55
  5. package/assets/icons/place_yellow_36px.svg +55 -55
  6. package/esm2020/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +2 -2
  7. package/esm2020/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +2 -2
  8. package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +2 -2
  9. package/esm2020/lib/catalog/catalog-browser/catalog-browser.module.mjs +1 -1
  10. package/esm2020/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +2 -2
  11. package/esm2020/lib/catalog/catalog-library/catalog-library-item.component.mjs +2 -2
  12. package/esm2020/lib/catalog/catalog-library/catalog-library.component.mjs +2 -2
  13. package/esm2020/lib/catalog/catalog-library/catalog-library.module.mjs +1 -1
  14. package/esm2020/lib/catalog/catalog.module.mjs +1 -1
  15. package/esm2020/lib/catalog/index.mjs +1 -1
  16. package/esm2020/lib/catalog/shared/catalog.abstract.mjs +1 -1
  17. package/esm2020/lib/catalog/shared/catalog.enum.mjs +1 -1
  18. package/esm2020/lib/catalog/shared/catalog.interface.mjs +1 -1
  19. package/esm2020/lib/catalog/shared/catalog.service.mjs +1 -1
  20. package/esm2020/lib/catalog/shared/index.mjs +1 -1
  21. package/esm2020/lib/datasource/datasource.module.mjs +1 -1
  22. package/esm2020/lib/datasource/index.mjs +1 -1
  23. package/esm2020/lib/datasource/shared/capabilities.service.mjs +1 -1
  24. package/esm2020/lib/datasource/shared/datasource.service.mjs +1 -1
  25. package/esm2020/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
  26. package/esm2020/lib/datasource/shared/datasources/any-datasource.mjs +1 -1
  27. package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +1 -1
  28. package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +1 -1
  29. package/esm2020/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
  30. package/esm2020/lib/datasource/shared/datasources/carto-datasource.mjs +1 -1
  31. package/esm2020/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
  32. package/esm2020/lib/datasource/shared/datasources/cluster-datasource.mjs +1 -1
  33. package/esm2020/lib/datasource/shared/datasources/data.service.mjs +1 -1
  34. package/esm2020/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
  35. package/esm2020/lib/datasource/shared/datasources/datasource.mjs +1 -1
  36. package/esm2020/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
  37. package/esm2020/lib/datasource/shared/datasources/feature-datasource.mjs +1 -1
  38. package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
  39. package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +1 -1
  40. package/esm2020/lib/datasource/shared/datasources/index.mjs +1 -1
  41. package/esm2020/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
  42. package/esm2020/lib/datasource/shared/datasources/mvt-datasource.mjs +1 -1
  43. package/esm2020/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
  44. package/esm2020/lib/datasource/shared/datasources/osm-datasource.mjs +1 -1
  45. package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
  46. package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +1 -1
  47. package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
  48. package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.mjs +1 -1
  49. package/esm2020/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +1 -1
  50. package/esm2020/lib/datasource/shared/datasources/websocket-datasource.mjs +1 -1
  51. package/esm2020/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
  52. package/esm2020/lib/datasource/shared/datasources/wfs-datasource.mjs +1 -1
  53. package/esm2020/lib/datasource/shared/datasources/wfs.service.mjs +1 -1
  54. package/esm2020/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
  55. package/esm2020/lib/datasource/shared/datasources/wms-datasource.mjs +2 -1
  56. package/esm2020/lib/datasource/shared/datasources/wms-wfs.utils.mjs +1 -1
  57. package/esm2020/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
  58. package/esm2020/lib/datasource/shared/datasources/wmts-datasource.mjs +1 -1
  59. package/esm2020/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
  60. package/esm2020/lib/datasource/shared/datasources/xyz-datasource.mjs +1 -1
  61. package/esm2020/lib/datasource/shared/index.mjs +1 -1
  62. package/esm2020/lib/datasource/shared/options/index.mjs +1 -1
  63. package/esm2020/lib/datasource/shared/options/options-api.interface.mjs +1 -1
  64. package/esm2020/lib/datasource/shared/options/options-api.providers.mjs +1 -1
  65. package/esm2020/lib/datasource/shared/options/options-api.service.mjs +1 -1
  66. package/esm2020/lib/datasource/shared/options/options.service.mjs +1 -1
  67. package/esm2020/lib/datasource/utils/esri-style-generator.mjs +1 -1
  68. package/esm2020/lib/datasource/utils/index.mjs +1 -1
  69. package/esm2020/lib/datasource/utils/tilegrid.mjs +1 -1
  70. package/esm2020/lib/directions/directions-buttons/directions-buttons.component.mjs +2 -2
  71. package/esm2020/lib/directions/directions-buttons/index.mjs +1 -1
  72. package/esm2020/lib/directions/directions-inputs/directions-inputs.component.mjs +2 -2
  73. package/esm2020/lib/directions/directions-inputs/index.mjs +1 -1
  74. package/esm2020/lib/directions/directions-results/directions-results.component.mjs +2 -2
  75. package/esm2020/lib/directions/directions-results/index.mjs +1 -1
  76. package/esm2020/lib/directions/directions-sources/directions-source.interface.mjs +1 -1
  77. package/esm2020/lib/directions/directions-sources/directions-source.mjs +1 -1
  78. package/esm2020/lib/directions/directions-sources/directions-source.provider.mjs +1 -1
  79. package/esm2020/lib/directions/directions-sources/index.mjs +1 -1
  80. package/esm2020/lib/directions/directions-sources/osrm-directions-source.mjs +1 -1
  81. package/esm2020/lib/directions/directions.component.mjs +2 -2
  82. package/esm2020/lib/directions/directions.module.mjs +1 -1
  83. package/esm2020/lib/directions/index.mjs +1 -1
  84. package/esm2020/lib/directions/shared/directions-source.service.mjs +1 -1
  85. package/esm2020/lib/directions/shared/directions.enum.mjs +1 -1
  86. package/esm2020/lib/directions/shared/directions.interface.mjs +1 -1
  87. package/esm2020/lib/directions/shared/directions.service.mjs +1 -1
  88. package/esm2020/lib/directions/shared/directions.utils.mjs +1 -1
  89. package/esm2020/lib/directions/shared/index.mjs +1 -1
  90. package/esm2020/lib/directions/shared/store.mjs +1 -1
  91. package/esm2020/lib/download/download-button/download-button.component.mjs +2 -2
  92. package/esm2020/lib/download/download-button/index.mjs +1 -1
  93. package/esm2020/lib/download/download.module.mjs +1 -1
  94. package/esm2020/lib/download/index.mjs +1 -1
  95. package/esm2020/lib/download/shared/download.interface.mjs +1 -1
  96. package/esm2020/lib/download/shared/download.service.mjs +1 -1
  97. package/esm2020/lib/download/shared/index.mjs +1 -1
  98. package/esm2020/lib/draw/draw/draw-layer-popup.component.mjs +55 -0
  99. package/esm2020/lib/draw/draw/draw-popup.component.mjs +2 -2
  100. package/esm2020/lib/draw/draw/draw-shorcuts.component.mjs +2 -2
  101. package/esm2020/lib/draw/draw/draw.component.mjs +417 -173
  102. package/esm2020/lib/draw/draw/draw.module.mjs +4 -3
  103. package/esm2020/lib/draw/drawingTool.module.mjs +1 -1
  104. package/esm2020/lib/draw/index.mjs +1 -1
  105. package/esm2020/lib/draw/shared/draw-icon.service.mjs +1 -1
  106. package/esm2020/lib/draw/shared/draw-style.service.mjs +1 -1
  107. package/esm2020/lib/draw/shared/draw.enum.mjs +1 -1
  108. package/esm2020/lib/draw/shared/draw.interface.mjs +1 -1
  109. package/esm2020/lib/draw/shared/draw.utils.mjs +1 -1
  110. package/esm2020/lib/draw/shared/index.mjs +1 -1
  111. package/esm2020/lib/feature/feature-details/feature-details.component.mjs +13 -11
  112. package/esm2020/lib/feature/feature-details/feature-details.directive.mjs +1 -1
  113. package/esm2020/lib/feature/feature-details/feature-details.module.mjs +1 -1
  114. package/esm2020/lib/feature/feature-form/feature-form.component.mjs +2 -2
  115. package/esm2020/lib/feature/feature-form/feature-form.module.mjs +1 -1
  116. package/esm2020/lib/feature/feature.module.mjs +1 -1
  117. package/esm2020/lib/feature/index.mjs +1 -1
  118. package/esm2020/lib/feature/shared/feature.enums.mjs +1 -1
  119. package/esm2020/lib/feature/shared/feature.interfaces.mjs +1 -1
  120. package/esm2020/lib/feature/shared/feature.utils.mjs +1 -1
  121. package/esm2020/lib/feature/shared/index.mjs +1 -1
  122. package/esm2020/lib/feature/shared/store.mjs +1 -1
  123. package/esm2020/lib/feature/shared/strategies/in-map-extent.mjs +1 -1
  124. package/esm2020/lib/feature/shared/strategies/in-map-resolution.mjs +1 -1
  125. package/esm2020/lib/feature/shared/strategies/index.mjs +1 -1
  126. package/esm2020/lib/feature/shared/strategies/loading-layer.mjs +1 -1
  127. package/esm2020/lib/feature/shared/strategies/loading.mjs +1 -1
  128. package/esm2020/lib/feature/shared/strategies/selection.mjs +1 -1
  129. package/esm2020/lib/feature/shared/strategies.utils.mjs +1 -1
  130. package/esm2020/lib/filter/filter.module.mjs +1 -1
  131. package/esm2020/lib/filter/index.mjs +1 -1
  132. package/esm2020/lib/filter/ogc-filter-button/index.mjs +1 -1
  133. package/esm2020/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +2 -2
  134. package/esm2020/lib/filter/ogc-filter-form/index.mjs +1 -1
  135. package/esm2020/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +2 -2
  136. package/esm2020/lib/filter/ogc-filter-selection/index.mjs +1 -1
  137. package/esm2020/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +2 -2
  138. package/esm2020/lib/filter/ogc-filter-time/index.mjs +1 -1
  139. package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +2 -2
  140. package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +2 -2
  141. package/esm2020/lib/filter/ogc-filterable-form/index.mjs +1 -1
  142. package/esm2020/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +2 -2
  143. package/esm2020/lib/filter/ogc-filterable-item/index.mjs +1 -1
  144. package/esm2020/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +2 -2
  145. package/esm2020/lib/filter/ogc-filterable-list/index.mjs +1 -1
  146. package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +1 -1
  147. package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +2 -2
  148. package/esm2020/lib/filter/shared/filterable-datasource.pipe.mjs +1 -1
  149. package/esm2020/lib/filter/shared/index.mjs +1 -1
  150. package/esm2020/lib/filter/shared/ogc-filter-time.service.mjs +1 -1
  151. package/esm2020/lib/filter/shared/ogc-filter.enum.mjs +1 -1
  152. package/esm2020/lib/filter/shared/ogc-filter.interface.mjs +1 -1
  153. package/esm2020/lib/filter/shared/ogc-filter.mjs +1 -1
  154. package/esm2020/lib/filter/shared/ogc-filter.service.mjs +1 -1
  155. package/esm2020/lib/filter/shared/spatial-filter.enum.mjs +1 -1
  156. package/esm2020/lib/filter/shared/spatial-filter.interface.mjs +1 -1
  157. package/esm2020/lib/filter/shared/spatial-filter.service.mjs +1 -1
  158. package/esm2020/lib/filter/shared/time-filter.enum.mjs +1 -1
  159. package/esm2020/lib/filter/shared/time-filter.interface.mjs +1 -1
  160. package/esm2020/lib/filter/shared/time-filter.service.mjs +1 -1
  161. package/esm2020/lib/filter/spatial-filter/spatial-filter-item/index.mjs +1 -1
  162. package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +2 -2
  163. package/esm2020/lib/filter/spatial-filter/spatial-filter-list/index.mjs +1 -1
  164. package/esm2020/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +2 -2
  165. package/esm2020/lib/filter/spatial-filter/spatial-filter-type/index.mjs +1 -1
  166. package/esm2020/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +2 -2
  167. package/esm2020/lib/filter/time-filter-button/index.mjs +1 -1
  168. package/esm2020/lib/filter/time-filter-button/time-filter-button.component.mjs +2 -2
  169. package/esm2020/lib/filter/time-filter-form/index.mjs +1 -1
  170. package/esm2020/lib/filter/time-filter-form/time-filter-form.component.mjs +2 -2
  171. package/esm2020/lib/filter/time-filter-item/index.mjs +1 -1
  172. package/esm2020/lib/filter/time-filter-item/time-filter-item.component.mjs +2 -2
  173. package/esm2020/lib/filter/time-filter-list/index.mjs +1 -1
  174. package/esm2020/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +1 -1
  175. package/esm2020/lib/filter/time-filter-list/time-filter-list.component.mjs +2 -2
  176. package/esm2020/lib/geo.module.mjs +1 -1
  177. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +1 -1
  178. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +2 -2
  179. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +1 -1
  180. package/esm2020/lib/geometry/geometry.module.mjs +1 -1
  181. package/esm2020/lib/geometry/index.mjs +1 -1
  182. package/esm2020/lib/geometry/shared/controls/draw.mjs +1 -1
  183. package/esm2020/lib/geometry/shared/controls/index.mjs +1 -1
  184. package/esm2020/lib/geometry/shared/controls/modify.mjs +1 -1
  185. package/esm2020/lib/geometry/shared/controls/slice.mjs +1 -1
  186. package/esm2020/lib/geometry/shared/geometry.errors.mjs +1 -1
  187. package/esm2020/lib/geometry/shared/geometry.interfaces.mjs +1 -1
  188. package/esm2020/lib/geometry/shared/geometry.utils.mjs +1 -1
  189. package/esm2020/lib/geometry/shared/index.mjs +1 -1
  190. package/esm2020/lib/import-export/export-button/export-button.component.mjs +2 -2
  191. package/esm2020/lib/import-export/export-button/index.mjs +1 -1
  192. package/esm2020/lib/import-export/import-export/import-export.component.mjs +2 -2
  193. package/esm2020/lib/import-export/import-export/index.mjs +1 -1
  194. package/esm2020/lib/import-export/import-export.module.mjs +1 -1
  195. package/esm2020/lib/import-export/index.mjs +1 -1
  196. package/esm2020/lib/import-export/shared/drop-geo-file.directive.mjs +1 -1
  197. package/esm2020/lib/import-export/shared/export.errors.mjs +1 -1
  198. package/esm2020/lib/import-export/shared/export.interface.mjs +1 -1
  199. package/esm2020/lib/import-export/shared/export.service.mjs +1 -1
  200. package/esm2020/lib/import-export/shared/export.type.mjs +1 -1
  201. package/esm2020/lib/import-export/shared/export.utils.mjs +1 -1
  202. package/esm2020/lib/import-export/shared/import.errors.mjs +1 -1
  203. package/esm2020/lib/import-export/shared/import.interface.mjs +1 -1
  204. package/esm2020/lib/import-export/shared/import.service.mjs +1 -1
  205. package/esm2020/lib/import-export/shared/import.utils.mjs +1 -1
  206. package/esm2020/lib/import-export/shared/index.mjs +1 -1
  207. package/esm2020/lib/import-export/style-list/index.mjs +1 -1
  208. package/esm2020/lib/import-export/style-list/style-list.interface.mjs +1 -1
  209. package/esm2020/lib/import-export/style-list/style-list.module.mjs +1 -1
  210. package/esm2020/lib/import-export/style-list/style-list.provider.mjs +1 -1
  211. package/esm2020/lib/import-export/style-list/style-list.service.mjs +1 -1
  212. package/esm2020/lib/layer/index.mjs +1 -1
  213. package/esm2020/lib/layer/layer-item/index.mjs +1 -1
  214. package/esm2020/lib/layer/layer-item/layer-item.component.mjs +2 -2
  215. package/esm2020/lib/layer/layer-legend/index.mjs +1 -1
  216. package/esm2020/lib/layer/layer-legend/layer-legend.component.mjs +2 -2
  217. package/esm2020/lib/layer/layer-legend-item/index.mjs +1 -1
  218. package/esm2020/lib/layer/layer-legend-item/layer-legend-item.component.mjs +2 -2
  219. package/esm2020/lib/layer/layer-legend-list/index.mjs +1 -1
  220. package/esm2020/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +1 -1
  221. package/esm2020/lib/layer/layer-legend-list/layer-legend-list.component.mjs +2 -2
  222. package/esm2020/lib/layer/layer-list/index.mjs +1 -1
  223. package/esm2020/lib/layer/layer-list/layer-list-binding.directive.mjs +1 -1
  224. package/esm2020/lib/layer/layer-list/layer-list.component.mjs +2 -2
  225. package/esm2020/lib/layer/layer-list/layer-list.enum.mjs +1 -1
  226. package/esm2020/lib/layer/layer-list-tool/index.mjs +1 -1
  227. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.component.mjs +2 -2
  228. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +1 -1
  229. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +1 -1
  230. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.service.mjs +1 -1
  231. package/esm2020/lib/layer/layer.module.mjs +1 -1
  232. package/esm2020/lib/layer/shared/clusterParam.mjs +1 -1
  233. package/esm2020/lib/layer/shared/index.mjs +1 -1
  234. package/esm2020/lib/layer/shared/layer.enums.mjs +1 -1
  235. package/esm2020/lib/layer/shared/layer.service.mjs +1 -1
  236. package/esm2020/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  237. package/esm2020/lib/layer/shared/layers/any-layer.mjs +1 -1
  238. package/esm2020/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
  239. package/esm2020/lib/layer/shared/layers/image-layer.mjs +1 -1
  240. package/esm2020/lib/layer/shared/layers/index.mjs +1 -1
  241. package/esm2020/lib/layer/shared/layers/layer.interface.mjs +1 -1
  242. package/esm2020/lib/layer/shared/layers/layer.mjs +1 -1
  243. package/esm2020/lib/layer/shared/layers/tile-layer.interface.mjs +1 -1
  244. package/esm2020/lib/layer/shared/layers/tile-layer.mjs +1 -1
  245. package/esm2020/lib/layer/shared/layers/vector-layer.interface.mjs +1 -1
  246. package/esm2020/lib/layer/shared/layers/vector-layer.mjs +1 -1
  247. package/esm2020/lib/layer/shared/layers/vectortile-layer.interface.mjs +1 -1
  248. package/esm2020/lib/layer/shared/layers/vectortile-layer.mjs +1 -1
  249. package/esm2020/lib/layer/shared/style.service.mjs +1 -1
  250. package/esm2020/lib/layer/shared/vector-style.interface.mjs +1 -1
  251. package/esm2020/lib/layer/style-modal/index.mjs +1 -1
  252. package/esm2020/lib/layer/style-modal/style-modal.component.mjs +2 -2
  253. package/esm2020/lib/layer/track-feature-button/index.mjs +1 -1
  254. package/esm2020/lib/layer/track-feature-button/track-feature-button.component.mjs +2 -2
  255. package/esm2020/lib/layer/utils/image-watcher.mjs +1 -1
  256. package/esm2020/lib/layer/utils/index.mjs +1 -1
  257. package/esm2020/lib/layer/utils/layer.utils.mjs +1 -1
  258. package/esm2020/lib/layer/utils/outputLegend.mjs +1 -1
  259. package/esm2020/lib/layer/utils/tile-watcher.mjs +1 -1
  260. package/esm2020/lib/layer/utils/vector-watcher.mjs +1 -1
  261. package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +1 -1
  262. package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +2 -2
  263. package/esm2020/lib/map/baselayers-switcher/index.mjs +1 -1
  264. package/esm2020/lib/map/baselayers-switcher/mini-basemap.component.mjs +2 -2
  265. package/esm2020/lib/map/geolocate-button/geolocate-button.component.mjs +2 -2
  266. package/esm2020/lib/map/geolocate-button/index.mjs +1 -1
  267. package/esm2020/lib/map/index.mjs +1 -1
  268. package/esm2020/lib/map/info-section/index.mjs +1 -1
  269. package/esm2020/lib/map/info-section/info-section.component.mjs +2 -2
  270. package/esm2020/lib/map/map-browser/index.mjs +1 -1
  271. package/esm2020/lib/map/map-browser/map-browser.component.mjs +2 -2
  272. package/esm2020/lib/map/map-center/index.mjs +1 -1
  273. package/esm2020/lib/map/map-center/map-center.component.mjs +2 -2
  274. package/esm2020/lib/map/map.module.mjs +1 -1
  275. package/esm2020/lib/map/menu-button/index.mjs +1 -1
  276. package/esm2020/lib/map/menu-button/menu-button.component.mjs +2 -2
  277. package/esm2020/lib/map/offline-button/index.mjs +1 -1
  278. package/esm2020/lib/map/offline-button/offline-button.component.mjs +2 -2
  279. package/esm2020/lib/map/rotation-button/index.mjs +1 -1
  280. package/esm2020/lib/map/rotation-button/rotation-button.component.mjs +2 -2
  281. package/esm2020/lib/map/shared/controllers/controller.mjs +1 -1
  282. package/esm2020/lib/map/shared/controllers/geolocation.mjs +1 -1
  283. package/esm2020/lib/map/shared/controllers/index.mjs +1 -1
  284. package/esm2020/lib/map/shared/controllers/view.mjs +1 -1
  285. package/esm2020/lib/map/shared/hover-feature.directive.mjs +1 -1
  286. package/esm2020/lib/map/shared/index.mjs +1 -1
  287. package/esm2020/lib/map/shared/linkedLayers.utils.mjs +3 -3
  288. package/esm2020/lib/map/shared/map-pointer-position.directive.mjs +1 -1
  289. package/esm2020/lib/map/shared/map.enums.mjs +1 -1
  290. package/esm2020/lib/map/shared/map.interface.mjs +1 -1
  291. package/esm2020/lib/map/shared/map.mjs +1 -1
  292. package/esm2020/lib/map/shared/map.service.mjs +1 -1
  293. package/esm2020/lib/map/shared/map.utils.mjs +1 -1
  294. package/esm2020/lib/map/shared/mapOffline.directive.mjs +1 -1
  295. package/esm2020/lib/map/shared/projection.interfaces.mjs +1 -1
  296. package/esm2020/lib/map/shared/projection.service.mjs +1 -1
  297. package/esm2020/lib/map/shared/projection.utils.mjs +1 -1
  298. package/esm2020/lib/map/swipe-control/index.mjs +1 -1
  299. package/esm2020/lib/map/swipe-control/swipe-control.component.mjs +2 -2
  300. package/esm2020/lib/map/utils/layer-watcher.mjs +1 -1
  301. package/esm2020/lib/map/wake-lock-button/index.mjs +1 -1
  302. package/esm2020/lib/map/wake-lock-button/wake-lock-button.component.mjs +2 -2
  303. package/esm2020/lib/map/zoom-button/index.mjs +1 -1
  304. package/esm2020/lib/map/zoom-button/zoom-button.component.mjs +2 -2
  305. package/esm2020/lib/measure/index.mjs +1 -1
  306. package/esm2020/lib/measure/measure.module.mjs +1 -1
  307. package/esm2020/lib/measure/measurer/measure-format.pipe.mjs +1 -1
  308. package/esm2020/lib/measure/measurer/measurer-dialog.component.mjs +2 -2
  309. package/esm2020/lib/measure/measurer/measurer-item.component.mjs +2 -2
  310. package/esm2020/lib/measure/measurer/measurer.component.mjs +2 -2
  311. package/esm2020/lib/measure/measurer/measurer.module.mjs +1 -1
  312. package/esm2020/lib/measure/shared/index.mjs +1 -1
  313. package/esm2020/lib/measure/shared/measure.enum.mjs +1 -1
  314. package/esm2020/lib/measure/shared/measure.interfaces.mjs +1 -1
  315. package/esm2020/lib/measure/shared/measure.utils.mjs +1 -1
  316. package/esm2020/lib/metadata/index.mjs +1 -1
  317. package/esm2020/lib/metadata/metadata-button/index.mjs +1 -1
  318. package/esm2020/lib/metadata/metadata-button/metadata-button.component.mjs +3 -3
  319. package/esm2020/lib/metadata/metadata.module.mjs +1 -1
  320. package/esm2020/lib/metadata/shared/index.mjs +1 -1
  321. package/esm2020/lib/metadata/shared/metadata.interface.mjs +1 -1
  322. package/esm2020/lib/metadata/shared/metadata.service.mjs +1 -1
  323. package/esm2020/lib/offline/geoDB/configFileToGeoDB.service.mjs +1 -1
  324. package/esm2020/lib/offline/geoDB/geoDB.enums.mjs +1 -1
  325. package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +1 -1
  326. package/esm2020/lib/offline/geoDB/geoDB.service.mjs +1 -1
  327. package/esm2020/lib/offline/geoDB/index.mjs +1 -1
  328. package/esm2020/lib/offline/index.mjs +1 -1
  329. package/esm2020/lib/offline/shared/geo-network.service.mjs +1 -1
  330. package/esm2020/lib/offline/shared/index.mjs +1 -1
  331. package/esm2020/lib/overlay/index.mjs +1 -1
  332. package/esm2020/lib/overlay/overlay.module.mjs +1 -1
  333. package/esm2020/lib/overlay/shared/index.mjs +1 -1
  334. package/esm2020/lib/overlay/shared/overlay-marker-style.utils.mjs +1 -1
  335. package/esm2020/lib/overlay/shared/overlay.directive.mjs +1 -1
  336. package/esm2020/lib/overlay/shared/overlay.enum.mjs +1 -1
  337. package/esm2020/lib/overlay/shared/overlay.mjs +1 -1
  338. package/esm2020/lib/overlay/shared/overlay.service.mjs +1 -1
  339. package/esm2020/lib/overlay/shared/overlay.utils.mjs +1 -1
  340. package/esm2020/lib/print/index.mjs +1 -1
  341. package/esm2020/lib/print/print/print.component.mjs +2 -2
  342. package/esm2020/lib/print/print-form/index.mjs +1 -1
  343. package/esm2020/lib/print/print-form/print-form.component.mjs +2 -2
  344. package/esm2020/lib/print/print.module.mjs +1 -1
  345. package/esm2020/lib/print/shared/index.mjs +1 -1
  346. package/esm2020/lib/print/shared/print.interface.mjs +1 -1
  347. package/esm2020/lib/print/shared/print.service.mjs +1 -1
  348. package/esm2020/lib/print/shared/print.type.mjs +1 -1
  349. package/esm2020/lib/query/index.mjs +1 -1
  350. package/esm2020/lib/query/query.module.mjs +1 -1
  351. package/esm2020/lib/query/shared/index.mjs +1 -1
  352. package/esm2020/lib/query/shared/query-search-source.mjs +1 -1
  353. package/esm2020/lib/query/shared/query-search-source.providers.mjs +1 -1
  354. package/esm2020/lib/query/shared/query.directive.mjs +1 -1
  355. package/esm2020/lib/query/shared/query.enums.mjs +1 -1
  356. package/esm2020/lib/query/shared/query.interfaces.mjs +1 -1
  357. package/esm2020/lib/query/shared/query.service.mjs +1 -1
  358. package/esm2020/lib/query/shared/query.utils.mjs +1 -1
  359. package/esm2020/lib/search/index.mjs +1 -1
  360. package/esm2020/lib/search/search-bar/search-bar.component.mjs +2 -2
  361. package/esm2020/lib/search/search-bar/search-bar.module.mjs +1 -1
  362. package/esm2020/lib/search/search-bar/search-url-param.directive.mjs +1 -1
  363. package/esm2020/lib/search/search-results/search-results-add-button.component.mjs +2 -2
  364. package/esm2020/lib/search/search-results/search-results-item.component.mjs +2 -2
  365. package/esm2020/lib/search/search-results/search-results.component.mjs +2 -2
  366. package/esm2020/lib/search/search-results/search-results.module.mjs +1 -1
  367. package/esm2020/lib/search/search-selector/search-selector.component.mjs +2 -2
  368. package/esm2020/lib/search/search-selector/search-selector.module.mjs +1 -1
  369. package/esm2020/lib/search/search-settings/search-settings.component.mjs +2 -2
  370. package/esm2020/lib/search/search-settings/search-settings.module.mjs +1 -1
  371. package/esm2020/lib/search/search.module.mjs +1 -1
  372. package/esm2020/lib/search/shared/index.mjs +1 -1
  373. package/esm2020/lib/search/shared/search-pointer-summary.directive.mjs +1 -1
  374. package/esm2020/lib/search/shared/search-source-service.providers.mjs +1 -1
  375. package/esm2020/lib/search/shared/search-source.service.mjs +1 -1
  376. package/esm2020/lib/search/shared/search.enums.mjs +1 -1
  377. package/esm2020/lib/search/shared/search.interfaces.mjs +1 -1
  378. package/esm2020/lib/search/shared/search.service.mjs +1 -1
  379. package/esm2020/lib/search/shared/search.utils.mjs +1 -1
  380. package/esm2020/lib/search/shared/sources/cadastre.mjs +1 -1
  381. package/esm2020/lib/search/shared/sources/cadastre.providers.mjs +1 -1
  382. package/esm2020/lib/search/shared/sources/coordinates.interfaces.mjs +1 -1
  383. package/esm2020/lib/search/shared/sources/coordinates.mjs +1 -1
  384. package/esm2020/lib/search/shared/sources/coordinates.providers.mjs +1 -1
  385. package/esm2020/lib/search/shared/sources/icherche.interfaces.mjs +1 -1
  386. package/esm2020/lib/search/shared/sources/icherche.mjs +1 -1
  387. package/esm2020/lib/search/shared/sources/icherche.providers.mjs +1 -1
  388. package/esm2020/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
  389. package/esm2020/lib/search/shared/sources/ilayer.mjs +1 -1
  390. package/esm2020/lib/search/shared/sources/ilayer.providers.mjs +1 -1
  391. package/esm2020/lib/search/shared/sources/index.mjs +1 -1
  392. package/esm2020/lib/search/shared/sources/nominatim.interfaces.mjs +1 -1
  393. package/esm2020/lib/search/shared/sources/nominatim.mjs +2 -2
  394. package/esm2020/lib/search/shared/sources/nominatim.providers.mjs +1 -1
  395. package/esm2020/lib/search/shared/sources/source.interfaces.mjs +1 -1
  396. package/esm2020/lib/search/shared/sources/source.mjs +1 -1
  397. package/esm2020/lib/search/shared/sources/storedqueries.interfaces.mjs +1 -1
  398. package/esm2020/lib/search/shared/sources/storedqueries.mjs +1 -1
  399. package/esm2020/lib/search/shared/sources/storedqueries.providers.mjs +1 -1
  400. package/esm2020/lib/toast/index.mjs +1 -1
  401. package/esm2020/lib/toast/toast.component.mjs +2 -2
  402. package/esm2020/lib/toast/toast.module.mjs +1 -1
  403. package/esm2020/lib/utils/commonVectorStyle.interface.mjs +1 -1
  404. package/esm2020/lib/utils/commonVectorStyle.mjs +1 -1
  405. package/esm2020/lib/utils/googleLinks.mjs +1 -1
  406. package/esm2020/lib/utils/id-generator.mjs +1 -1
  407. package/esm2020/lib/utils/index.mjs +1 -1
  408. package/esm2020/lib/utils/osmLinks.mjs +1 -1
  409. package/esm2020/lib/wkt/index.mjs +1 -1
  410. package/esm2020/lib/wkt/shared/index.mjs +1 -1
  411. package/esm2020/lib/wkt/shared/wkt.service.mjs +15 -15
  412. package/esm2020/lib/wkt/wkt.module.mjs +1 -1
  413. package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +2 -2
  414. package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +1 -1
  415. package/esm2020/lib/workspace/confirmation-popup/index.mjs +1 -1
  416. package/esm2020/lib/workspace/index.mjs +1 -1
  417. package/esm2020/lib/workspace/shared/edition-workspace.mjs +1 -1
  418. package/esm2020/lib/workspace/shared/edition-workspace.service.mjs +1 -1
  419. package/esm2020/lib/workspace/shared/feature-workspace.mjs +1 -1
  420. package/esm2020/lib/workspace/shared/feature-workspace.service.mjs +1 -1
  421. package/esm2020/lib/workspace/shared/index.mjs +1 -1
  422. package/esm2020/lib/workspace/shared/wfs-workspace.mjs +1 -1
  423. package/esm2020/lib/workspace/shared/wfs-workspace.service.mjs +1 -1
  424. package/esm2020/lib/workspace/shared/wms-workspace.service.mjs +1 -1
  425. package/esm2020/lib/workspace/shared/workspace.utils.mjs +1 -1
  426. package/esm2020/lib/workspace/widgets/index.mjs +1 -1
  427. package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +2 -2
  428. package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +1 -1
  429. package/esm2020/lib/workspace/widgets/widgets.mjs +1 -1
  430. package/esm2020/lib/workspace/workspace-selector/workspace-selector.directive.mjs +1 -1
  431. package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +1 -1
  432. package/esm2020/lib/workspace/workspace-updator/workspace-updator.directive.mjs +1 -1
  433. package/esm2020/lib/workspace/workspace-updator/workspace-updator.module.mjs +1 -1
  434. package/esm2020/lib/workspace/workspace.module.mjs +1 -1
  435. package/esm2020/public_api.mjs +1 -1
  436. package/fesm2015/igo2-geo.mjs +596 -289
  437. package/fesm2015/igo2-geo.mjs.map +1 -1
  438. package/fesm2020/igo2-geo.mjs +582 -289
  439. package/fesm2020/igo2-geo.mjs.map +1 -1
  440. package/lib/draw/draw/draw-layer-popup.component.d.ts +14 -0
  441. package/lib/draw/draw/draw.component.d.ts +38 -10
  442. package/lib/draw/draw/draw.module.d.ts +22 -21
  443. package/lib/draw/shared/draw.interface.d.ts +6 -0
  444. package/lib/feature/feature-details/feature-details.component.d.ts +2 -3
  445. package/lib/import-export/shared/import.interface.d.ts +1 -0
  446. package/ngcc.config.js +3 -3
  447. package/package.json +4 -4
  448. package/style/geo.theming.scss +12 -12
@@ -1,5 +1,5 @@
1
- import { Component, Input, ChangeDetectionStrategy, Output } from '@angular/core';
2
- import { FEATURE, FeatureStoreSelectionStrategy, tryBindStoreLayer, tryAddLoadingStrategy, tryAddSelectionStrategy, FeatureMotion, FeatureStoreLoadingStrategy, featureToOl } from '../../feature';
1
+ import { Component, Input, ChangeDetectionStrategy, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { FEATURE, FeatureStore, FeatureStoreSelectionStrategy, tryBindStoreLayer, tryAddLoadingStrategy, tryAddSelectionStrategy, FeatureMotion, FeatureStoreLoadingStrategy, featureToOl } from '../../feature';
3
3
  import { FontType, GeometryType } from '../shared/draw.enum';
4
4
  import { BehaviorSubject } from 'rxjs';
5
5
  import { VectorLayer } from '../../layer/shared/layers/vector-layer';
@@ -11,7 +11,7 @@ import OlCircle from 'ol/geom/Circle';
11
11
  import OlPoint from 'ol/geom/Point';
12
12
  import OlGeoJSON from 'ol/format/GeoJSON';
13
13
  import { getDistance } from 'ol/sphere';
14
- import { skip, first } from 'rxjs/operators';
14
+ import { first, skip } from 'rxjs/operators';
15
15
  import { DrawPopupComponent } from './draw-popup.component';
16
16
  import { DrawShorcutsComponent } from './draw-shorcuts.component';
17
17
  import { getTooltipsOfOlGeometry } from '../../measure/shared/measure.utils';
@@ -20,6 +20,7 @@ import { transform } from 'ol/proj';
20
20
  import { StyleModalComponent } from '../../layer/style-modal/style-modal.component';
21
21
  import { trigger, state, style, animate, transition } from '@angular/animations';
22
22
  import Point from 'ol/geom/Point';
23
+ import { DrawLayerPopupComponent } from './draw-layer-popup.component';
23
24
  import * as i0 from "@angular/core";
24
25
  import * as i1 from "@igo2/core";
25
26
  import * as i2 from "@angular/forms";
@@ -29,92 +30,118 @@ import * as i5 from "../shared/draw-icon.service";
29
30
  import * as i6 from "@angular/common";
30
31
  import * as i7 from "@angular/material/button";
31
32
  import * as i8 from "@angular/material/button-toggle";
32
- import * as i9 from "@angular/material/form-field";
33
- import * as i10 from "@angular/material/icon";
34
- import * as i11 from "@angular/material/badge";
35
- import * as i12 from "@angular/material/tooltip";
36
- import * as i13 from "@angular/material/select";
37
- import * as i14 from "@angular/material/core";
38
- import * as i15 from "@angular/material/slide-toggle";
39
- import * as i16 from "@igo2/common";
40
- import * as i17 from "@ngx-translate/core";
41
- function DrawComponent_button_23_Template(rf, ctx) { if (rf & 1) {
42
- const _r5 = i0.ɵɵgetCurrentView();
43
- i0.ɵɵelementStart(0, "button", 14);
44
- i0.ɵɵlistener("click", function DrawComponent_button_23_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.deleteDrawings()); });
33
+ import * as i9 from "@angular/material/divider";
34
+ import * as i10 from "@angular/material/form-field";
35
+ import * as i11 from "@angular/material/icon";
36
+ import * as i12 from "@angular/material/badge";
37
+ import * as i13 from "@angular/material/tooltip";
38
+ import * as i14 from "@angular/material/select";
39
+ import * as i15 from "@angular/material/core";
40
+ import * as i16 from "@angular/material/slide-toggle";
41
+ import * as i17 from "@igo2/common";
42
+ import * as i18 from "@ngx-translate/core";
43
+ const _c0 = ["selectedLayer"];
44
+ function DrawComponent_mat_option_30_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "mat-option", 2);
46
+ i0.ɵɵtext(1);
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const layer_r7 = ctx.$implicit;
50
+ i0.ɵɵproperty("value", layer_r7);
51
+ i0.ɵɵadvance(1);
52
+ i0.ɵɵtextInterpolate1(" ", layer_r7.title, " ");
53
+ } }
54
+ function DrawComponent_button_34_Template(rf, ctx) { if (rf & 1) {
55
+ const _r9 = i0.ɵɵgetCurrentView();
56
+ i0.ɵɵelementStart(0, "button", 20);
57
+ i0.ɵɵlistener("click", function DrawComponent_button_34_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r8.activeDrawingLayer.visible = !ctx_r8.activeDrawingLayer.visible); });
58
+ i0.ɵɵpipe(1, "translate");
59
+ i0.ɵɵpipe(2, "translate");
60
+ i0.ɵɵelement(3, "mat-icon", 21);
61
+ i0.ɵɵelementEnd();
62
+ } if (rf & 2) {
63
+ const ctx_r2 = i0.ɵɵnextContext();
64
+ i0.ɵɵproperty("color", ctx_r2.activeDrawingLayer.visible ? "primary" : "default")("matTooltip", ctx_r2.activeDrawingLayer.visible ? i0.ɵɵpipeBind1(1, 3, "igo.geo.layer.hideLayer") : i0.ɵɵpipeBind1(2, 5, "igo.geo.layer.showLayer"));
65
+ i0.ɵɵadvance(3);
66
+ i0.ɵɵproperty("svgIcon", ctx_r2.activeDrawingLayer.visible ? "eye" : "eye-off");
67
+ } }
68
+ function DrawComponent_button_37_Template(rf, ctx) { if (rf & 1) {
69
+ const _r11 = i0.ɵɵgetCurrentView();
70
+ i0.ɵɵelementStart(0, "button", 22);
71
+ i0.ɵɵlistener("click", function DrawComponent_button_37_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r10.deleteDrawings()); });
45
72
  i0.ɵɵpipe(1, "translate");
46
73
  i0.ɵɵpipe(2, "async");
47
- i0.ɵɵelement(3, "mat-icon", 15);
74
+ i0.ɵɵelement(3, "mat-icon", 23);
48
75
  i0.ɵɵelementEnd();
49
76
  } if (rf & 2) {
50
- const ctx_r0 = i0.ɵɵnextContext();
51
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.draw.delete"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r0.selectedFeatures$).length === 0);
77
+ const ctx_r3 = i0.ɵɵnextContext();
78
+ i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.draw.delete"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r3.selectedFeatures$).length === 0);
52
79
  } }
53
- function DrawComponent_mat_form_field_28_div_6_Template(rf, ctx) { if (rf & 1) {
54
- i0.ɵɵelementStart(0, "div", 19);
55
- i0.ɵɵelement(1, "img", 20);
80
+ function DrawComponent_mat_form_field_42_div_6_Template(rf, ctx) { if (rf & 1) {
81
+ i0.ɵɵelementStart(0, "div", 27);
82
+ i0.ɵɵelement(1, "img", 28);
56
83
  i0.ɵɵelementEnd();
57
84
  } if (rf & 2) {
58
- const ctx_r6 = i0.ɵɵnextContext(2);
85
+ const ctx_r12 = i0.ɵɵnextContext(2);
59
86
  i0.ɵɵadvance(1);
60
- i0.ɵɵpropertyInterpolate("src", ctx_r6.icon, i0.ɵɵsanitizeUrl);
87
+ i0.ɵɵpropertyInterpolate("src", ctx_r12.icon, i0.ɵɵsanitizeUrl);
61
88
  } }
62
- function DrawComponent_mat_form_field_28_mat_option_10_Template(rf, ctx) { if (rf & 1) {
63
- const _r10 = i0.ɵɵgetCurrentView();
64
- i0.ɵɵelementStart(0, "mat-option", 21);
65
- i0.ɵɵlistener("click", function DrawComponent_mat_form_field_28_mat_option_10_Template_mat_option_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r10); const icon_html_r8 = restoredCtx.$implicit; const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.onIconChange(icon_html_r8)); });
66
- i0.ɵɵelementStart(1, "div", 19);
67
- i0.ɵɵelement(2, "img", 20);
89
+ function DrawComponent_mat_form_field_42_mat_option_10_Template(rf, ctx) { if (rf & 1) {
90
+ const _r16 = i0.ɵɵgetCurrentView();
91
+ i0.ɵɵelementStart(0, "mat-option", 29);
92
+ i0.ɵɵlistener("click", function DrawComponent_mat_form_field_42_mat_option_10_Template_mat_option_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r16); const icon_html_r14 = restoredCtx.$implicit; const ctx_r15 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r15.onIconChange(icon_html_r14)); });
93
+ i0.ɵɵelementStart(1, "div", 27);
94
+ i0.ɵɵelement(2, "img", 28);
68
95
  i0.ɵɵelementEnd()();
69
96
  } if (rf & 2) {
70
- const icon_html_r8 = ctx.$implicit;
71
- i0.ɵɵproperty("value", icon_html_r8);
97
+ const icon_html_r14 = ctx.$implicit;
98
+ i0.ɵɵproperty("value", icon_html_r14);
72
99
  i0.ɵɵadvance(2);
73
- i0.ɵɵpropertyInterpolate("src", icon_html_r8, i0.ɵɵsanitizeUrl);
100
+ i0.ɵɵpropertyInterpolate("src", icon_html_r14, i0.ɵɵsanitizeUrl);
74
101
  } }
75
- function DrawComponent_mat_form_field_28_Template(rf, ctx) { if (rf & 1) {
76
- const _r12 = i0.ɵɵgetCurrentView();
102
+ function DrawComponent_mat_form_field_42_Template(rf, ctx) { if (rf & 1) {
103
+ const _r18 = i0.ɵɵgetCurrentView();
77
104
  i0.ɵɵelementStart(0, "mat-form-field")(1, "mat-label");
78
105
  i0.ɵɵtext(2);
79
106
  i0.ɵɵpipe(3, "translate");
80
107
  i0.ɵɵelementEnd();
81
108
  i0.ɵɵelementStart(4, "mat-select")(5, "mat-select-trigger");
82
- i0.ɵɵtemplate(6, DrawComponent_mat_form_field_28_div_6_Template, 2, 1, "div", 16);
109
+ i0.ɵɵtemplate(6, DrawComponent_mat_form_field_42_div_6_Template, 2, 1, "div", 24);
83
110
  i0.ɵɵelementEnd();
84
- i0.ɵɵelementStart(7, "mat-option", 17);
85
- i0.ɵɵlistener("click", function DrawComponent_mat_form_field_28_Template_mat_option_click_7_listener() { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.onIconChange()); });
111
+ i0.ɵɵelementStart(7, "mat-option", 25);
112
+ i0.ɵɵlistener("click", function DrawComponent_mat_form_field_42_Template_mat_option_click_7_listener() { i0.ɵɵrestoreView(_r18); const ctx_r17 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r17.onIconChange()); });
86
113
  i0.ɵɵtext(8);
87
114
  i0.ɵɵpipe(9, "translate");
88
115
  i0.ɵɵelementEnd();
89
- i0.ɵɵtemplate(10, DrawComponent_mat_form_field_28_mat_option_10_Template, 3, 2, "mat-option", 18);
116
+ i0.ɵɵtemplate(10, DrawComponent_mat_form_field_42_mat_option_10_Template, 3, 2, "mat-option", 26);
90
117
  i0.ɵɵelementEnd()();
91
118
  } if (rf & 2) {
92
- const ctx_r2 = i0.ɵɵnextContext();
119
+ const ctx_r5 = i0.ɵɵnextContext();
93
120
  i0.ɵɵadvance(2);
94
121
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 4, "igo.geo.draw.icon"));
95
122
  i0.ɵɵadvance(4);
96
- i0.ɵɵproperty("ngIf", ctx_r2.icon);
123
+ i0.ɵɵproperty("ngIf", ctx_r5.icon);
97
124
  i0.ɵɵadvance(2);
98
125
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 6, "igo.geo.draw.noIcon"));
99
126
  i0.ɵɵadvance(2);
100
- i0.ɵɵproperty("ngForOf", ctx_r2.icons);
127
+ i0.ɵɵproperty("ngForOf", ctx_r5.icons);
101
128
  } }
102
- function DrawComponent_button_32_Template(rf, ctx) { if (rf & 1) {
103
- const _r14 = i0.ɵɵgetCurrentView();
104
- i0.ɵɵelementStart(0, "button", 22);
105
- i0.ɵɵlistener("click", function DrawComponent_button_32_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.openStyleModalDialog()); });
129
+ function DrawComponent_button_46_Template(rf, ctx) { if (rf & 1) {
130
+ const _r20 = i0.ɵɵgetCurrentView();
131
+ i0.ɵɵelementStart(0, "button", 30);
132
+ i0.ɵɵlistener("click", function DrawComponent_button_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r19 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r19.openStyleModalDialog()); });
106
133
  i0.ɵɵpipe(1, "translate");
107
134
  i0.ɵɵtext(2);
108
135
  i0.ɵɵpipe(3, "translate");
109
- i0.ɵɵelement(4, "mat-icon", 23);
136
+ i0.ɵɵelement(4, "mat-icon", 31);
110
137
  i0.ɵɵelementEnd();
111
138
  } if (rf & 2) {
112
- const ctx_r3 = i0.ɵɵnextContext();
139
+ const ctx_r6 = i0.ɵɵnextContext();
113
140
  i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 3, "igo.geo.layer.style.styleModalTooltip"));
114
141
  i0.ɵɵadvance(2);
115
142
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, "igo.geo.layer.style.styleModal"), " ");
116
143
  i0.ɵɵadvance(2);
117
- i0.ɵɵproperty("matBadge", ctx_r3.selectedFeatures$.value.length);
144
+ i0.ɵɵproperty("matBadge", ctx_r6.selectedFeatures$.value.length);
118
145
  } }
119
146
  export class DrawComponent {
120
147
  constructor(languageService, formBuilder, drawStyleService, dialog, drawIconService) {
@@ -146,13 +173,21 @@ export class DrawComponent {
146
173
  ]
147
174
  };
148
175
  this.geometryType = GeometryType; // Reference to the GeometryType enum
176
+ this._stores = [];
177
+ this._drawControls = [];
178
+ this.activeLayerChange = new EventEmitter();
179
+ this.drawControlsEvent = new EventEmitter();
180
+ this.layersIDEvent = new EventEmitter();
181
+ this.layerCounterID = 0;
149
182
  this.draw$ = new BehaviorSubject({}); // Observable of draw
150
- this.olDrawingLayerSource = new OlVectorSource();
183
+ this.activeDrawingLayerSource = new OlVectorSource();
151
184
  this.selectedFeatures$ = new BehaviorSubject([]);
152
185
  this.drawControlIsDisabled = true;
153
186
  this.drawControlIsActive = false;
154
187
  this.subscriptions$$ = [];
155
188
  this.position = 'bottom';
189
+ this.isCreatingNewLayer = false;
190
+ this.currGeometryType = this.geometryType.Point;
156
191
  this.buildForm();
157
192
  this.fillColor = this.drawStyleService.getFillColor();
158
193
  this.strokeColor = this.drawStyleService.getStrokeColor();
@@ -163,19 +198,85 @@ export class DrawComponent {
163
198
  this.fontSize = this.drawStyleService.getFontSize();
164
199
  this.fontStyle = this.drawStyleService.getFontStyle();
165
200
  }
201
+ get stores() {
202
+ return this._stores;
203
+ }
204
+ set stores(value) {
205
+ this._stores = value;
206
+ }
207
+ get drawControls() {
208
+ return this._drawControls;
209
+ }
210
+ set drawControls(value) {
211
+ this._drawControls = value;
212
+ }
213
+ get activeDrawingLayer() {
214
+ return this._activeDrawingLayer;
215
+ }
216
+ set activeDrawingLayer(value) {
217
+ this._activeDrawingLayer = value;
218
+ }
166
219
  // Initialize the store that will contain the entities and create the Draw control
167
220
  ngOnInit() {
168
- this.initStore();
169
- this.drawControl = this.createDrawControl(this.fillColor, this.strokeColor, this.strokeWidth);
170
- this.drawControl.setGeometryType(this.geometryType.Point);
171
- this.toggleDrawControl();
221
+ if (!this.stores.length) {
222
+ this.activeStore = new FeatureStore([], {
223
+ map: this.map
224
+ });
225
+ this.initStore();
226
+ this.activeDrawControl = this.createDrawControl(this.fillColor, this.strokeColor, this.strokeWidth);
227
+ this.activeDrawControl.setGeometryType(this.geometryType.Point);
228
+ this.toggleDrawControl();
229
+ this.stores.push(this.activeStore);
230
+ this.drawControls.push([this.activeDrawingLayer.id, this.activeDrawControl]);
231
+ this.drawControlsEvent.emit(this.drawControls);
232
+ this.layersIDEvent.emit(this.activeDrawingLayer.id);
233
+ this.onLayerChange(this.activeDrawingLayer);
234
+ }
235
+ else {
236
+ this.activeStore = this.stores.find(store => store.layer.id === this.activeDrawingLayer.id);
237
+ this.activeDrawControl = this.drawControls.find(dc => dc[0] === this.activeDrawingLayer.id)[1];
238
+ this.deactivateDrawControl();
239
+ this.allLayers.forEach(layer => {
240
+ if (layer.id !== this.activeDrawingLayer.id) {
241
+ layer.opacity = 0;
242
+ }
243
+ let store = this.stores.find(s => s.layer.id === layer.id);
244
+ this.subscriptions$$.push(store.stateView
245
+ .manyBy$((record) => {
246
+ return record.state.selected === true;
247
+ })
248
+ .pipe(first())
249
+ .subscribe((records) => {
250
+ records.forEach((record) => {
251
+ record.state.selected = false;
252
+ });
253
+ }));
254
+ this.subscriptions$$.push(store.stateView
255
+ .manyBy$((record) => {
256
+ return record.state.selected === true;
257
+ })
258
+ .pipe(skip(1) // Skip initial emission
259
+ )
260
+ .subscribe((records) => {
261
+ this.selectedFeatures$.next(records.map((record) => record.entity));
262
+ }));
263
+ this.subscriptions$$.push(store.count$.subscribe((cnt) => {
264
+ cnt >= 1
265
+ ? (this.activeStore.layer.options.showInLayerList = true)
266
+ : (this.activeStore.layer.options.showInLayerList = false);
267
+ }));
268
+ });
269
+ this.onLayerChange(this.activeDrawingLayer);
270
+ }
172
271
  }
173
272
  /**
174
273
  * Remove the drawing layer and the interactions
175
274
  * @internal
176
275
  */
177
276
  ngOnDestroy() {
178
- this.drawControl.setOlMap(undefined);
277
+ this.allLayers.forEach(layer => layer.opacity = 1);
278
+ this.activeStore.state.updateAll({ selected: false });
279
+ this.deactivateDrawControl();
179
280
  this.subscriptions$$.map((s) => s.unsubscribe());
180
281
  }
181
282
  /**
@@ -186,61 +287,20 @@ export class DrawComponent {
186
287
  * @returns a Draw Control
187
288
  */
188
289
  createDrawControl(fillColor, strokeColor, strokeWidth) {
189
- const drawControl = new DrawControl({
290
+ const activeDrawControl = new DrawControl({
190
291
  geometryType: undefined,
191
- drawingLayerSource: this.olDrawingLayerSource,
292
+ drawingLayerSource: this.activeDrawingLayerSource,
192
293
  drawingLayerStyle: new OlStyle.Style({}),
193
294
  interactionStyle: createInteractionStyle(fillColor, strokeColor, strokeWidth)
194
295
  });
195
- return drawControl;
296
+ return activeDrawControl;
196
297
  }
197
298
  /**
198
299
  * Store initialization, including drawing layer creation
199
300
  */
200
- initStore() {
201
- this.map.removeLayer(this.olDrawingLayer);
202
- // this.map.addLayer()
203
- this.olDrawingLayer = new VectorLayer({
204
- isIgoInternalLayer: true,
205
- id: 'igo-draw-layer',
206
- title: this.languageService.translate.instant('igo.geo.draw.drawing'),
207
- zIndex: 200,
208
- source: new FeatureDataSource(),
209
- style: (feature, resolution) => {
210
- return this.drawStyleService.createIndividualElementStyle(feature, resolution, this.labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'), this.icon);
211
- },
212
- showInLayerList: true,
213
- exportable: true,
214
- browsable: false,
215
- workspace: {
216
- enabled: false
217
- }
218
- });
219
- tryBindStoreLayer(this.store, this.olDrawingLayer);
220
- tryAddLoadingStrategy(this.store, new FeatureStoreLoadingStrategy({
221
- motion: FeatureMotion.None
222
- }));
223
- tryAddSelectionStrategy(this.store, new FeatureStoreSelectionStrategy({
224
- map: this.map,
225
- motion: FeatureMotion.None,
226
- many: true
227
- }));
228
- this.store.layer.visible = true;
229
- this.store.source.ol.on('removefeature', (event) => {
230
- const olGeometry = event.feature.getGeometry();
231
- this.clearLabelsOfOlGeometry(olGeometry);
232
- });
233
- this.subscriptions$$.push(this.store.stateView
234
- .manyBy$((record) => {
235
- return record.state.selected === true;
236
- })
237
- .pipe(first())
238
- .subscribe((records) => {
239
- records.forEach((record) => {
240
- record.state.selected = false;
241
- });
242
- }));
243
- this.subscriptions$$.push(this.store.stateView
301
+ initStore(newTitle, isNewLayer) {
302
+ this.createLayer(newTitle, isNewLayer);
303
+ this.subscriptions$$.push(this.activeStore.stateView
244
304
  .manyBy$((record) => {
245
305
  return record.state.selected === true;
246
306
  })
@@ -249,13 +309,10 @@ export class DrawComponent {
249
309
  .subscribe((records) => {
250
310
  this.selectedFeatures$.next(records.map((record) => record.entity));
251
311
  }));
252
- this.subscriptions$$.push(this.store.count$.subscribe((cnt) => {
253
- if (cnt > 0) {
254
- this.store.setLayerExtent();
255
- }
312
+ this.subscriptions$$.push(this.activeStore.count$.subscribe((cnt) => {
256
313
  cnt >= 1
257
- ? (this.store.layer.options.showInLayerList = true)
258
- : (this.store.layer.options.showInLayerList = false);
314
+ ? (this.activeStore.layer.options.showInLayerList = true)
315
+ : (this.activeStore.layer.options.showInLayerList = false);
259
316
  }));
260
317
  }
261
318
  /**
@@ -322,12 +379,12 @@ export class DrawComponent {
322
379
  }
323
380
  // deletes the feature
324
381
  else {
325
- this.olDrawingLayerSource
382
+ this.activeDrawingLayerSource
326
383
  .getFeatures()
327
384
  .forEach((drawingLayerFeature) => {
328
385
  const geometry = drawingLayerFeature.getGeometry();
329
386
  if (olGeometry === geometry) {
330
- this.olDrawingLayerSource.removeFeature(drawingLayerFeature);
387
+ this.activeDrawingLayerSource.removeFeature(drawingLayerFeature);
331
388
  }
332
389
  });
333
390
  }
@@ -341,10 +398,10 @@ export class DrawComponent {
341
398
  onDrawEnd(olGeometry, radius) {
342
399
  this.addFeatureToStore(olGeometry, radius);
343
400
  this.clearLabelsOfOlGeometry(olGeometry);
344
- this.store.layer.ol.getSource().refresh();
401
+ this.activeStore.layer.ol.getSource().refresh();
345
402
  }
346
403
  onModifyDraw(olGeometry) {
347
- const entities = this.store.all();
404
+ const entities = this.activeStore.all();
348
405
  entities.forEach((entity) => {
349
406
  const entityId = entity.properties.id;
350
407
  const olGeometryId = olGeometry.ol_uid;
@@ -358,7 +415,7 @@ export class DrawComponent {
358
415
  });
359
416
  }
360
417
  onSelectDraw(olFeature, label) {
361
- const entities = this.store.all();
418
+ const entities = this.activeStore.all();
362
419
  const olGeometry = olFeature.getGeometry();
363
420
  olGeometry.ol_uid = olFeature.get('id');
364
421
  const olGeometryCoordinates = JSON.stringify(olGeometry.getCoordinates()[0]);
@@ -429,7 +486,7 @@ export class DrawComponent {
429
486
  lon4326 = point4326[0];
430
487
  lat4326 = point4326[1];
431
488
  }
432
- this.store.update({
489
+ this.activeStore.update({
433
490
  type: FEATURE,
434
491
  geometry,
435
492
  projection: projection.getCode(),
@@ -458,6 +515,40 @@ export class DrawComponent {
458
515
  stroke: ['']
459
516
  });
460
517
  }
518
+ setupLayer(isNewLayer) {
519
+ setTimeout(() => {
520
+ const dialogRef = this.dialog.open(DrawLayerPopupComponent, {
521
+ disableClose: false,
522
+ });
523
+ dialogRef.afterClosed().subscribe((label) => {
524
+ if (dialogRef.componentInstance.confirmFlag) {
525
+ this.activeStore.state.updateAll({ selected: false });
526
+ this.activeStore = new FeatureStore([], { map: this.map });
527
+ this.activeDrawingLayerSource = new OlVectorSource();
528
+ this.activeDrawingLayer.opacity = 0;
529
+ this.deactivateDrawControl();
530
+ this.initStore(label, isNewLayer);
531
+ this.activeDrawControl = this.createDrawControl(this.fillColor, this.strokeColor, this.strokeWidth);
532
+ this.activeDrawControl.setGeometryType(this.currGeometryType);
533
+ this.toggleDrawControl();
534
+ this.stores.push(this.activeStore);
535
+ this.drawControls.push([this.activeDrawingLayer.id, this.activeDrawControl]);
536
+ this.drawControlsEvent.emit(this.drawControls);
537
+ this.layersIDEvent.emit(this.activeDrawingLayer.id);
538
+ this.isCreatingNewLayer = false;
539
+ if (!this.labelsAreShown) {
540
+ this.onToggleLabels();
541
+ }
542
+ this.activeLayerChange.emit(this.activeDrawingLayer);
543
+ }
544
+ else {
545
+ this.select.value = this.activeDrawingLayer;
546
+ this.select.selectionChange.emit(this.activeDrawingLayer);
547
+ }
548
+ });
549
+ }, 250);
550
+ }
551
+ // HTML user interactions
461
552
  /**
462
553
  * Called when the user double-clicks the selected drawing
463
554
  */
@@ -471,12 +562,14 @@ export class DrawComponent {
471
562
  this.dialog.open(DrawShorcutsComponent);
472
563
  }
473
564
  deleteDrawings() {
474
- this.store.deleteMany(this.selectedFeatures$.value);
565
+ this.activeStore.deleteMany(this.selectedFeatures$.value);
475
566
  this.selectedFeatures$.value.forEach((selectedFeature) => {
476
- this.olDrawingLayerSource.getFeatures().forEach((drawingLayerFeature) => {
567
+ this.activeDrawingLayerSource
568
+ .getFeatures()
569
+ .forEach((drawingLayerFeature) => {
477
570
  const geometry = drawingLayerFeature.getGeometry();
478
571
  if (selectedFeature.properties.id === geometry.ol_uid) {
479
- this.olDrawingLayerSource.removeFeature(drawingLayerFeature);
572
+ this.activeDrawingLayerSource.removeFeature(drawingLayerFeature);
480
573
  }
481
574
  });
482
575
  });
@@ -489,8 +582,9 @@ export class DrawComponent {
489
582
  this.drawStyleService.toggleLabelsAreShown();
490
583
  this.labelsAreShown = !this.labelsAreShown;
491
584
  this.icon
492
- ? this.onColorChange(this.labelsAreShown, true, this.fillColor, this.strokeColor)
493
- : this.onColorChange(this.labelsAreShown, false, this.fillColor, this.strokeColor);
585
+ ? this.elementStyle(this.labelsAreShown, true)
586
+ : this.elementStyle(this.labelsAreShown, false);
587
+ this.createDrawControl();
494
588
  }
495
589
  /**
496
590
  * Called when the user toggles the Draw control is toggled
@@ -500,6 +594,69 @@ export class DrawComponent {
500
594
  toggleIsChecked ? this.toggleDrawControl() : this.deactivateDrawControl();
501
595
  }
502
596
  // User changes properties of a drawing element
597
+ /**
598
+ * Display the current layer with the current store and the current layerSource
599
+ */
600
+ onLayerChange(currLayer) {
601
+ if (currLayer) {
602
+ this.activeStore.state.updateAll({ selected: false });
603
+ this.isCreatingNewLayer = false;
604
+ this.activeDrawingLayer.opacity = 0;
605
+ this.activeDrawingLayer = currLayer;
606
+ this.activeDrawingLayer.opacity = 1;
607
+ this.deactivateDrawControl();
608
+ if (!this.labelsAreShown) {
609
+ this.onToggleLabels();
610
+ }
611
+ this.activeStore = this.stores.find(store => store.layer.id === this.activeDrawingLayer.id);
612
+ this.activeDrawControl = this.drawControls.find(dc => dc[0] === this.activeDrawingLayer.id)[1];
613
+ this.activeDrawingLayerSource = this.activeDrawControl.olDrawingLayerSource;
614
+ this.activeDrawControl.setGeometryType(this.currGeometryType);
615
+ this.toggleDrawControl();
616
+ }
617
+ else {
618
+ this.setupLayer(true);
619
+ }
620
+ this.activeLayerChange.emit(this.activeDrawingLayer);
621
+ }
622
+ createLayer(newTitle, isNewLayer) {
623
+ for (const layer of this.allLayers) {
624
+ let numberId = Number(layer.id.replace('igo-draw-layer', ''));
625
+ this.layerCounterID = Math.max(numberId, this.layerCounterID);
626
+ }
627
+ this.activeDrawingLayer = new VectorLayer({
628
+ isIgoInternalLayer: true,
629
+ id: 'igo-draw-layer' + ++this.layerCounterID,
630
+ title: isNewLayer
631
+ ? newTitle
632
+ : this.languageService.translate.instant('igo.geo.draw.drawing'),
633
+ zIndex: 200,
634
+ source: new FeatureDataSource(),
635
+ style: (feature, resolution) => {
636
+ return this.drawStyleService.createIndividualElementStyle(feature, resolution, this.labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'), this.icon);
637
+ },
638
+ showInLayerList: true,
639
+ exportable: true,
640
+ browsable: false,
641
+ workspace: {
642
+ enabled: false
643
+ }
644
+ });
645
+ tryBindStoreLayer(this.activeStore, this.activeDrawingLayer);
646
+ tryAddLoadingStrategy(this.activeStore, new FeatureStoreLoadingStrategy({
647
+ motion: FeatureMotion.None
648
+ }));
649
+ tryAddSelectionStrategy(this.activeStore, new FeatureStoreSelectionStrategy({
650
+ map: this.map,
651
+ motion: FeatureMotion.None,
652
+ many: true
653
+ }));
654
+ this.activeStore.layer.visible = true;
655
+ this.activeStore.source.ol.on('removefeature', (event) => {
656
+ const olGeometry = event.feature.getGeometry();
657
+ this.clearLabelsOfOlGeometry(olGeometry);
658
+ });
659
+ }
503
660
  /**
504
661
  * Called when the user changes the color in a color picker
505
662
  * @param labelsAreShown wheter the labels are shown or not
@@ -512,16 +669,14 @@ export class DrawComponent {
512
669
  this.selectedFeatures$.value.forEach((feature) => {
513
670
  let olFeature = featureToOl(feature, this.map.ol.getView().getProjection().getCode());
514
671
  this.updateFillAndStrokeColor(olFeature, fillColor, strokeColor);
515
- const entity = this.store
672
+ const entity = this.activeStore
516
673
  .all()
517
674
  .find((e) => e.meta.id === olFeature.getId());
518
675
  entity.properties.drawingStyle.fill = olFeature.get('fillColor_');
519
676
  entity.properties.drawingStyle.stroke = olFeature.get('strokeColor_');
520
- this.store.update(entity);
677
+ this.activeStore.update(entity);
521
678
  });
522
679
  }
523
- this.fillColor = fillColor;
524
- this.strokeColor = strokeColor;
525
680
  this.elementStyle(labelsAreShown, isAnIcon);
526
681
  this.createDrawControl();
527
682
  }
@@ -536,12 +691,12 @@ export class DrawComponent {
536
691
  this.selectedFeatures$.value.forEach((feature) => {
537
692
  let olFeature = featureToOl(feature, this.map.ol.getView().getProjection().getCode());
538
693
  this.updateFontSizeAndStyle(olFeature, size, style);
539
- const entity = this.store
694
+ const entity = this.activeStore
540
695
  .all()
541
696
  .find((e) => e.meta.id === olFeature.getId());
542
697
  entity.properties.fontStyle = olFeature.get('fontStyle_');
543
- this.store.update(entity);
544
- olFeature = this.store.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
698
+ this.activeStore.update(entity);
699
+ olFeature = this.activeStore.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
545
700
  olFeature.setProperties({ fontStyle: entity.properties.fontStyle });
546
701
  olFeature.changed();
547
702
  });
@@ -563,13 +718,13 @@ export class DrawComponent {
563
718
  this.selectedFeatures$.value.forEach((feature) => {
564
719
  let olFeature = featureToOl(feature, this.map.ol.getView().getProjection().getCode());
565
720
  this.updateOffset(olFeature, offsetX, offsetY);
566
- const entity = this.store
721
+ const entity = this.activeStore
567
722
  .all()
568
723
  .find((e) => e.meta.id === olFeature.getId());
569
724
  entity.properties.offsetX = olFeature.get('offsetX_');
570
725
  entity.properties.offsetY = olFeature.get('offsetY_');
571
- this.store.update(entity);
572
- olFeature = this.store.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
726
+ this.activeStore.update(entity);
727
+ olFeature = this.activeStore.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
573
728
  olFeature.setProperties({ offsetX: entity.properties.offsetX, offsetY: entity.properties.offsetY });
574
729
  olFeature.changed();
575
730
  });
@@ -586,7 +741,8 @@ export class DrawComponent {
586
741
  * @param geometryType the geometry type selected by the user
587
742
  */
588
743
  onGeometryTypeChange(geometryType) {
589
- this.drawControl.setGeometryType(geometryType);
744
+ this.currGeometryType = geometryType;
745
+ this.activeDrawControl.setGeometryType(geometryType);
590
746
  this.toggleDrawControl();
591
747
  }
592
748
  // Updates the properties of olFeature inputted
@@ -617,13 +773,57 @@ export class DrawComponent {
617
773
  offsetY_: offsetY
618
774
  }, true);
619
775
  }
620
- /**
621
- * Check the amount of rows as a possible alternative
622
- */
776
+ // Updates values of the selected element on the HTML view
777
+ getFeatureFontSize() {
778
+ return this.selectedFeatures$.value.length > 0
779
+ ? this.selectedFeatures$.value[0].properties.fontStyle
780
+ .split(' ')[0]
781
+ .replace('px', '')
782
+ : '20';
783
+ }
784
+ getFeatureFontStyle() {
785
+ return this.selectedFeatures$.value.length > 0
786
+ ? this.selectedFeatures$.value[0].properties.fontStyle.substring(this.selectedFeatures$.value[0].properties.fontStyle.indexOf(' ') + 1)
787
+ : FontType.Arial;
788
+ }
789
+ getFeatureFillColor() {
790
+ return this.selectedFeatures$.value.length > 0
791
+ ? this.selectedFeatures$.value[0].properties.drawingStyle.fill
792
+ : 'rgba(255,255,255,0.4)';
793
+ }
794
+ getFeatureStrokeColor() {
795
+ return this.selectedFeatures$.value.length > 0
796
+ ? this.selectedFeatures$.value[0].properties.drawingStyle.stroke
797
+ : 'rgba(143,7,7,1)';
798
+ }
799
+ getFeatureOffsetX() {
800
+ return this.selectedFeatures$.value.length > 0
801
+ ? this.selectedFeatures$.value[0].properties.offsetX
802
+ : this.drawStyleService.getOffsetX();
803
+ }
804
+ getFeatureOffsetY() {
805
+ return this.selectedFeatures$.value.length > 0
806
+ ? this.selectedFeatures$.value[0].properties.offsetY
807
+ : '0';
808
+ }
809
+ get allFontStyles() {
810
+ return Object.values(FontType);
811
+ }
812
+ get allLayers() {
813
+ return this.map.layers.filter((layer) => layer.id.includes('igo-draw-layer'));
814
+ }
623
815
  updateHeightTable() {
624
- this.numberOfDrawings = this.store.count$.getValue();
625
- this.numberOfDrawings > 10 ? this.tableTemplate.tableHeight = '35vh' : this.tableTemplate.tableHeight = 'auto';
816
+ // Check the amount of rows as a possible alternative
817
+ this.numberOfDrawings = this.activeStore.count$.getValue();
818
+ this.numberOfDrawings > 10
819
+ ? (this.tableTemplate.tableHeight = '35vh')
820
+ : (this.tableTemplate.tableHeight = 'auto');
626
821
  }
822
+ updateActiveLayer() {
823
+ let currLayer = this.allLayers.find(layer => layer.title === this.activeDrawingLayer.title);
824
+ return currLayer ? currLayer : this.allLayers[0];
825
+ }
826
+ // Helper methods
627
827
  /**
628
828
  * Activate the correct control
629
829
  */
@@ -648,20 +848,20 @@ export class DrawComponent {
648
848
  * @param olGeometry the new geometry to insert in the store
649
849
  */
650
850
  replaceFeatureInStore(entity, olGeometry, radius) {
651
- this.store.delete(entity);
851
+ this.activeStore.delete(entity);
652
852
  this.onDrawEnd(olGeometry, radius);
653
853
  }
654
854
  /**
655
855
  * Deactivate the active draw control
656
856
  */
657
857
  deactivateDrawControl() {
658
- if (!this.drawControl) {
858
+ if (!this.activeDrawControl) {
659
859
  return;
660
860
  }
661
861
  if (this.drawEnd$$) {
662
862
  this.drawEnd$$.unsubscribe();
663
863
  }
664
- this.drawControl.setOlMap(undefined);
864
+ this.activeDrawControl.setOlMap(undefined);
665
865
  this.drawControlIsActive = false;
666
866
  }
667
867
  /**
@@ -670,37 +870,43 @@ export class DrawComponent {
670
870
  activateDrawControl() {
671
871
  this.drawControlIsDisabled = false;
672
872
  this.drawControlIsActive = true;
673
- this.drawEnd$$ = this.drawControl.end$.subscribe((olGeometry) => {
873
+ this.drawEnd$$ = this.activeDrawControl.end$.subscribe((olGeometry) => {
674
874
  this.openDrawDialog(olGeometry, true);
675
875
  });
676
- this.drawControl.modify$.subscribe((olGeometry) => {
876
+ this.activeDrawControl.modify$.subscribe((olGeometry) => {
677
877
  this.onModifyDraw(olGeometry);
678
878
  });
679
879
  if (!this.drawSelect$$) {
680
- this.drawSelect$$ = this.drawControl.select$.subscribe((olFeature) => {
880
+ this.drawSelect$$ = this.activeDrawControl.select$.subscribe((olFeature) => {
681
881
  this.openDrawDialog(olFeature, false);
682
882
  });
683
883
  }
684
- this.drawControl.setOlMap(this.map.ol, true);
884
+ this.activeDrawControl.setOlMap(this.map.ol, true);
685
885
  }
686
886
  /**
687
887
  * Recreates the style of the feature stored
688
888
  */
689
889
  elementStyle(labelsAreShown, isAnIcon) {
690
890
  if (isAnIcon) {
691
- this.store.layer.ol.setStyle((feature, resolution) => {
891
+ this.activeStore.layer.ol.setStyle((feature, resolution) => {
692
892
  return this.drawStyleService.createIndividualElementStyle(feature, resolution, labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'), this.icon);
693
893
  });
694
894
  }
695
895
  else {
696
- this.store.layer.ol.setStyle((feature, resolution) => {
896
+ this.activeStore.layer.ol.setStyle((feature, resolution) => {
697
897
  return this.drawStyleService.createIndividualElementStyle(feature, resolution, labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'));
698
898
  });
699
899
  }
700
900
  }
701
901
  }
702
902
  DrawComponent.ɵfac = function DrawComponent_Factory(t) { return new (t || DrawComponent)(i0.ɵɵdirectiveInject(i1.LanguageService), i0.ɵɵdirectiveInject(i2.UntypedFormBuilder), i0.ɵɵdirectiveInject(i3.DrawStyleService), i0.ɵɵdirectiveInject(i4.MatDialog), i0.ɵɵdirectiveInject(i5.DrawIconService)); };
703
- DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent, selectors: [["igo-draw"]], inputs: { map: "map", store: "store" }, outputs: { fillColor: "fillColor", strokeColor: "strokeColor", strokeWidth: "strokeWidth", fontSize: "fontSize", fontStyle: "fontStyle" }, decls: 33, vars: 36, consts: [[1, "geometry-type-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], [1, "draw-options", "mat-typography"], [3, "disabled", "checked", "labelPosition", "change"], [3, "checked", "labelPosition", "change"], ["class", "deleteBtn", "mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "disabled", "click", 4, "ngIf"], ["id", "storeElements", 1, "table-compact", 3, "store", "template", "dblclick"], ["table", ""], [1, "icon-options"], [4, "ngIf"], ["mat-icon-button", "", "color", "accent", "disableRipple", "true", 3, "click"], ["svgIcon", "keyboard-outline", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "shortcuts-icon", 3, "matTooltip"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click", 4, "ngIf"], ["mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "deleteBtn", 3, "matTooltip", "disabled", "click"], ["svgIcon", "delete"], ["class", "box", 4, "ngIf"], ["value", "", 3, "click"], [3, "value", "click", 4, "ngFor", "ngForOf"], [1, "box"], [3, "src"], [3, "value", "click"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click"], ["svgIcon", "palette", "matBadgeColor", "warn", "matBadgeSize", "medium", 1, "style-icon", 3, "matBadge"]], template: function DrawComponent_Template(rf, ctx) { if (rf & 1) {
903
+ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent, selectors: [["igo-draw"]], viewQuery: function DrawComponent_Query(rf, ctx) { if (rf & 1) {
904
+ i0.ɵɵviewQuery(_c0, 5);
905
+ } if (rf & 2) {
906
+ let _t;
907
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.select = _t.first);
908
+ } }, inputs: { map: "map", stores: "stores", drawControls: "drawControls", activeDrawingLayer: "activeDrawingLayer" }, outputs: { activeLayerChange: "activeLayerChange", drawControlsEvent: "drawControlsEvent", layersIDEvent: "layersIDEvent", fillColor: "fillColor", strokeColor: "strokeColor", strokeWidth: "strokeWidth", fontSize: "fontSize", fontStyle: "fontStyle" }, decls: 47, vars: 45, consts: [[1, "geometry-type-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], [1, "draw-options", "mat-typography"], [3, "disabled", "checked", "labelPosition", "change"], [3, "checked", "labelPosition", "change"], ["appearance", "outline", 1, "layer-select"], [3, "value", "selectionChange"], ["selectedLayer", ""], [3, "value", 4, "ngFor", "ngForOf"], ["id", "createNewLayer"], ["mat-icon-button", "", "collapsibleButton", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "color", "matTooltip", "click", 4, "ngIf"], ["class", "deleteBtn", "mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "disabled", "click", 4, "ngIf"], [1, "table-compact", 3, "store", "template", "dblclick"], ["table", ""], [1, "icon-options"], [4, "ngIf"], ["mat-icon-button", "", "color", "accent", "disableRipple", "true", 3, "click"], ["svgIcon", "keyboard-outline", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "shortcuts-icon", 3, "matTooltip"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click", 4, "ngIf"], ["mat-icon-button", "", "collapsibleButton", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "color", "matTooltip", "click"], [3, "svgIcon"], ["mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "deleteBtn", 3, "matTooltip", "disabled", "click"], ["svgIcon", "delete"], ["class", "box", 4, "ngIf"], ["value", "", 3, "click"], [3, "value", "click", 4, "ngFor", "ngForOf"], [1, "box"], [3, "src"], [3, "value", "click"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click"], ["svgIcon", "palette", "matBadgeColor", "warn", "matBadgeSize", "medium", 1, "style-icon", 3, "matBadge"]], template: function DrawComponent_Template(rf, ctx) { if (rf & 1) {
909
+ const _r21 = i0.ɵɵgetCurrentView();
704
910
  i0.ɵɵelementStart(0, "div")(1, "div", 0)(2, "mat-button-toggle-group", 1);
705
911
  i0.ɵɵlistener("change", function DrawComponent_Template_mat_button_toggle_group_change_2_listener($event) { return ctx.onGeometryTypeChange($event.value); });
706
912
  i0.ɵɵelementStart(3, "mat-button-toggle", 2);
@@ -729,20 +935,35 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
729
935
  i0.ɵɵtext(20);
730
936
  i0.ɵɵpipe(21, "translate");
731
937
  i0.ɵɵelementEnd()();
732
- i0.ɵɵelementStart(22, "div");
733
- i0.ɵɵtemplate(23, DrawComponent_button_23_Template, 4, 6, "button", 6);
734
- i0.ɵɵelementStart(24, "div")(25, "igo-entity-table", 7, 8);
735
- i0.ɵɵlistener("dblclick", function DrawComponent_Template_igo_entity_table_dblclick_25_listener() { return ctx.editLabelDrawing(); });
938
+ i0.ɵɵelement(22, "mat-divider");
939
+ i0.ɵɵelementStart(23, "div")(24, "mat-form-field", 6)(25, "mat-label");
940
+ i0.ɵɵtext(26);
941
+ i0.ɵɵpipe(27, "translate");
942
+ i0.ɵɵelementEnd();
943
+ i0.ɵɵelementStart(28, "mat-select", 7, 8);
944
+ i0.ɵɵlistener("selectionChange", function DrawComponent_Template_mat_select_selectionChange_28_listener() { i0.ɵɵrestoreView(_r21); const _r0 = i0.ɵɵreference(29); return i0.ɵɵresetView(ctx.onLayerChange(_r0.value)); });
945
+ i0.ɵɵtemplate(30, DrawComponent_mat_option_30_Template, 2, 2, "mat-option", 9);
946
+ i0.ɵɵelementStart(31, "mat-option", 10);
947
+ i0.ɵɵtext(32);
948
+ i0.ɵɵpipe(33, "translate");
949
+ i0.ɵɵelementEnd()()();
950
+ i0.ɵɵtemplate(34, DrawComponent_button_34_Template, 4, 7, "button", 11);
951
+ i0.ɵɵelementEnd();
952
+ i0.ɵɵelement(35, "mat-divider");
953
+ i0.ɵɵelementStart(36, "div");
954
+ i0.ɵɵtemplate(37, DrawComponent_button_37_Template, 4, 6, "button", 12);
955
+ i0.ɵɵelementStart(38, "div")(39, "igo-entity-table", 13, 14);
956
+ i0.ɵɵlistener("dblclick", function DrawComponent_Template_igo_entity_table_dblclick_39_listener() { return ctx.editLabelDrawing(); });
736
957
  i0.ɵɵelementEnd()()();
737
- i0.ɵɵelementStart(27, "div", 9);
738
- i0.ɵɵtemplate(28, DrawComponent_mat_form_field_28_Template, 11, 8, "mat-form-field", 10);
958
+ i0.ɵɵelementStart(41, "div", 15);
959
+ i0.ɵɵtemplate(42, DrawComponent_mat_form_field_42_Template, 11, 8, "mat-form-field", 16);
739
960
  i0.ɵɵelementEnd();
740
- i0.ɵɵelementStart(29, "button", 11);
741
- i0.ɵɵlistener("click", function DrawComponent_Template_button_click_29_listener() { return ctx.openShorcutsDialog(); });
742
- i0.ɵɵelement(30, "mat-icon", 12);
743
- i0.ɵɵpipe(31, "translate");
961
+ i0.ɵɵelementStart(43, "button", 17);
962
+ i0.ɵɵlistener("click", function DrawComponent_Template_button_click_43_listener() { return ctx.openShorcutsDialog(); });
963
+ i0.ɵɵelement(44, "mat-icon", 18);
964
+ i0.ɵɵpipe(45, "translate");
744
965
  i0.ɵɵelementEnd();
745
- i0.ɵɵtemplate(32, DrawComponent_button_32_Template, 5, 7, "button", 13);
966
+ i0.ɵɵtemplate(46, DrawComponent_button_46_Template, 5, 7, "button", 19);
746
967
  i0.ɵɵelementEnd();
747
968
  } if (rf & 2) {
748
969
  i0.ɵɵadvance(2);
@@ -750,38 +971,48 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
750
971
  i0.ɵɵadvance(1);
751
972
  i0.ɵɵproperty("value", ctx.geometryType.Point);
752
973
  i0.ɵɵadvance(1);
753
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 22, "igo.geo.draw." + ctx.geometryType.Point), " ");
974
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 27, "igo.geo.draw." + ctx.geometryType.Point), " ");
754
975
  i0.ɵɵadvance(2);
755
976
  i0.ɵɵproperty("value", ctx.geometryType.LineString);
756
977
  i0.ɵɵadvance(1);
757
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 24, "igo.geo.draw." + ctx.geometryType.LineString), " ");
978
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 29, "igo.geo.draw." + ctx.geometryType.LineString), " ");
758
979
  i0.ɵɵadvance(2);
759
980
  i0.ɵɵproperty("value", ctx.geometryType.Polygon);
760
981
  i0.ɵɵadvance(1);
761
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(11, 26, "igo.geo.draw." + ctx.geometryType.Polygon), " ");
982
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(11, 31, "igo.geo.draw." + ctx.geometryType.Polygon), " ");
762
983
  i0.ɵɵadvance(2);
763
984
  i0.ɵɵproperty("value", ctx.geometryType.Circle);
764
985
  i0.ɵɵadvance(1);
765
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(14, 28, "igo.geo.draw." + ctx.geometryType.Circle), " ");
986
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(14, 33, "igo.geo.draw." + ctx.geometryType.Circle), " ");
766
987
  i0.ɵɵadvance(3);
767
988
  i0.ɵɵproperty("disabled", ctx.drawControlIsDisabled)("checked", ctx.drawControlIsActive)("labelPosition", "before");
768
989
  i0.ɵɵadvance(1);
769
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(18, 30, "igo.geo.spatialFilter.drawControl"), " ");
990
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(18, 35, "igo.geo.spatialFilter.drawControl"), " ");
770
991
  i0.ɵɵadvance(2);
771
992
  i0.ɵɵproperty("checked", ctx.labelsAreShown)("labelPosition", "before");
772
993
  i0.ɵɵadvance(1);
773
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 32, "igo.geo.draw.toggleMapTooltips"), " ");
994
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 37, "igo.geo.draw.toggleMapTooltips"), " ");
995
+ i0.ɵɵadvance(6);
996
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(27, 39, "igo.geo.draw.layer.title"));
997
+ i0.ɵɵadvance(2);
998
+ i0.ɵɵproperty("value", ctx.updateActiveLayer());
999
+ i0.ɵɵadvance(2);
1000
+ i0.ɵɵproperty("ngForOf", ctx.allLayers);
1001
+ i0.ɵɵadvance(2);
1002
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(33, 41, "igo.geo.draw.layer.createNewLayer"), " ");
1003
+ i0.ɵɵadvance(2);
1004
+ i0.ɵɵproperty("ngIf", ctx.activeDrawingLayer);
774
1005
  i0.ɵɵadvance(3);
775
- i0.ɵɵproperty("ngIf", ctx.store.count$.getValue() > 0);
1006
+ i0.ɵɵproperty("ngIf", ctx.activeStore.count$.getValue() > 0);
776
1007
  i0.ɵɵadvance(2);
777
- i0.ɵɵproperty("store", ctx.store)("template", ctx.tableTemplate);
1008
+ i0.ɵɵproperty("store", ctx.activeStore)("template", ctx.tableTemplate);
778
1009
  i0.ɵɵadvance(3);
779
1010
  i0.ɵɵproperty("ngIf", ctx.icons.length >= 1);
780
1011
  i0.ɵɵadvance(2);
781
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(31, 34, "igo.geo.draw.shortcuts"));
1012
+ i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(45, 43, "igo.geo.draw.shortcuts"));
782
1013
  i0.ɵɵadvance(2);
783
1014
  i0.ɵɵproperty("ngIf", ctx.selectedFeatures$.value.length);
784
- } }, dependencies: [i6.NgForOf, i6.NgIf, i7.MatButton, i8.MatButtonToggleGroup, i8.MatButtonToggle, i9.MatFormField, i9.MatLabel, i10.MatIcon, i11.MatBadge, i12.MatTooltip, i13.MatSelect, i13.MatSelectTrigger, i14.MatOption, i15.MatSlideToggle, i16.EntityTableComponent, i6.AsyncPipe, i17.TranslatePipe], styles: [".geometry-type-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:25%}.draw-options[_ngcontent-%COMP%]{overflow-x:hidden}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options[_ngcontent-%COMP%]{margin:5px 5px 0}.deleteBtn[_ngcontent-%COMP%]{margin-left:12px}img[_ngcontent-%COMP%]{width:100%;height:100%}.box[_ngcontent-%COMP%]{width:25px;height:25px}"], data: { animation: [
1015
+ } }, dependencies: [i6.NgForOf, i6.NgIf, i7.MatButton, i8.MatButtonToggleGroup, i8.MatButtonToggle, i9.MatDivider, i10.MatFormField, i10.MatLabel, i11.MatIcon, i12.MatBadge, i13.MatTooltip, i14.MatSelect, i14.MatSelectTrigger, i15.MatOption, i16.MatSlideToggle, i17.EntityTableComponent, i6.AsyncPipe, i18.TranslatePipe], styles: [".geometry-type-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:25%}.draw-options[_ngcontent-%COMP%]{overflow-x:hidden}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options[_ngcontent-%COMP%]{margin:5px 5px 0}.edition-drawing[_ngcontent-%COMP%]{padding:10px 0}img[_ngcontent-%COMP%]{width:100%;height:100%}.deleteBtn[_ngcontent-%COMP%]{margin-left:12px}.storeTable[_ngcontent-%COMP%]{height:auto!important}.layer-select[_ngcontent-%COMP%]{width:85%;padding:10px 10px 0%}.input-button-container[_ngcontent-%COMP%]{padding:10px}.input-button-container[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:25%}.input-button-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{left:8px;bottom:10px}"], data: { animation: [
785
1016
  trigger('openClose', [
786
1017
  state('open', style({
787
1018
  opacity: 1
@@ -806,8 +1037,22 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
806
1037
  transition('open => closed', [animate('600ms ease')]),
807
1038
  transition('closed => open', [animate('800ms ease')])
808
1039
  ])
809
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\r\n <div class=\"geometry-type-toggle mat-typography\">\r\n <mat-button-toggle-group\r\n (change)=\"onGeometryTypeChange($event.value)\" [value]=\"geometryType.Point\">\r\n <mat-button-toggle [value]=\"geometryType.Point\">\r\n {{'igo.geo.draw.' + geometryType.Point | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.LineString\">\r\n {{'igo.geo.draw.' + geometryType.LineString | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.Polygon\">\r\n {{'igo.geo.draw.' + geometryType.Polygon | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.Circle\">\r\n {{'igo.geo.draw.' + geometryType.Circle | translate}}\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n\r\n <div class=\"draw-options mat-typography\">\r\n <mat-slide-toggle\r\n [disabled]=\"drawControlIsDisabled\"\r\n [checked]=\"drawControlIsActive\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onToggleDrawControl($event.checked)\">\r\n {{'igo.geo.spatialFilter.drawControl' | translate}}\r\n </mat-slide-toggle>\r\n\r\n <mat-slide-toggle\r\n [checked]=\"labelsAreShown\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onToggleLabels()\">\r\n {{'igo.geo.draw.toggleMapTooltips' | translate}}\r\n </mat-slide-toggle>\r\n </div>\r\n\r\n <div>\r\n <button *ngIf=\"store.count$.getValue() > 0\"\r\n class=\"deleteBtn\"\r\n mat-icon-button\r\n color=\"warn\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.draw.delete' | translate\"\r\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\r\n (click)=\"deleteDrawings()\">\r\n <mat-icon svgIcon=\"delete\"></mat-icon>\r\n </button>\r\n\r\n <div>\r\n <igo-entity-table\r\n #table\r\n class=\"table-compact\"\r\n id=\"storeElements\"\r\n [store]=\"store\"\r\n [template]=\"tableTemplate\"\r\n (dblclick)=\"editLabelDrawing()\">\r\n </igo-entity-table>\r\n </div>\r\n </div>\r\n\r\n <div class=\"icon-options\">\r\n <mat-form-field *ngIf=\"icons.length >= 1\">\r\n <mat-label>{{ 'igo.geo.draw.icon' | translate }}</mat-label>\r\n <mat-select>\r\n <mat-select-trigger>\r\n <div *ngIf=\"icon\" class=\"box\">\r\n <img src=\"{{ icon }}\">\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"\" (click)=\"onIconChange()\">{{ 'igo.geo.draw.noIcon' | translate }}</mat-option>\r\n <mat-option\r\n *ngFor=\"let icon_html of icons\"\r\n [value]=\"icon_html\"\r\n (click)=\"onIconChange(icon_html)\">\r\n <div class=\"box\">\r\n <img src=\"{{ icon_html }}\">\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <button\r\n mat-icon-button\r\n color=\"accent\"\r\n disableRipple=\"true\"\r\n (click)=\"openShorcutsDialog()\">\r\n <mat-icon\r\n class=\"shortcuts-icon\"\r\n svgIcon=\"keyboard-outline\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.draw.shortcuts' | translate\">\r\n </mat-icon>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"selectedFeatures$.value.length\"\r\n mat-raised-button\r\n color=\"primary\"\r\n (click)=\"openStyleModalDialog()\"\r\n [matTooltip]=\"'igo.geo.layer.style.styleModalTooltip' | translate\">\r\n {{'igo.geo.layer.style.styleModal' | translate}}\r\n <mat-icon\r\n class=\"style-icon\"\r\n svgIcon=\"palette\"\r\n [matBadge]=\"selectedFeatures$.value.length\"\r\n matBadgeColor=\"warn\"\r\n matBadgeSize=\"medium\">\r\n </mat-icon>\r\n </button>\r\n</div>\r\n", styles: [".geometry-type-toggle{padding:10px;text-align:center}.geometry-type-toggle mat-button-toggle-group{width:100%}.geometry-type-toggle mat-button-toggle-group mat-button-toggle{width:25%}.draw-options{overflow-x:hidden}.draw-options mat-slide-toggle{width:100%;margin:10px}.draw-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options{margin:5px 5px 0}.deleteBtn{margin-left:12px}img{width:100%;height:100%}.box{width:25px;height:25px}\n"] }]
810
- }], function () { return [{ type: i1.LanguageService }, { type: i2.UntypedFormBuilder }, { type: i3.DrawStyleService }, { type: i4.MatDialog }, { type: i5.DrawIconService }]; }, { fillColor: [{
1040
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <div class=\"geometry-type-toggle mat-typography\">\n <mat-button-toggle-group\n (change)=\"onGeometryTypeChange($event.value)\" [value]=\"geometryType.Point\">\n <mat-button-toggle [value]=\"geometryType.Point\">\n {{'igo.geo.draw.' + geometryType.Point | translate}}\n </mat-button-toggle>\n\n <mat-button-toggle [value]=\"geometryType.LineString\">\n {{'igo.geo.draw.' + geometryType.LineString | translate}}\n </mat-button-toggle>\n\n <mat-button-toggle [value]=\"geometryType.Polygon\">\n {{'igo.geo.draw.' + geometryType.Polygon | translate}}\n </mat-button-toggle>\n\n <mat-button-toggle [value]=\"geometryType.Circle\">\n {{'igo.geo.draw.' + geometryType.Circle | translate}}\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div class=\"draw-options mat-typography\">\n <mat-slide-toggle\n [disabled]=\"drawControlIsDisabled\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleDrawControl($event.checked)\">\n {{'igo.geo.spatialFilter.drawControl' | translate}}\n </mat-slide-toggle>\n\n <mat-slide-toggle\n [checked]=\"labelsAreShown\"\n [labelPosition]=\"'before'\"\n (change)=\"onToggleLabels()\"\n >\n {{ 'igo.geo.draw.toggleMapTooltips' | translate }}\n </mat-slide-toggle>\n </div>\n\n <mat-divider></mat-divider>\n\n <div>\n <mat-form-field appearance=\"outline\" class=\"layer-select\">\n <mat-label>{{'igo.geo.draw.layer.title' | translate}}</mat-label>\n <mat-select #selectedLayer (selectionChange)=\"onLayerChange(selectedLayer.value)\" [value]=\"updateActiveLayer()\">\n <mat-option *ngFor=\"let layer of allLayers\" [value]=\"layer\">\n {{ layer.title }}\n </mat-option>\n <mat-option id=\"createNewLayer\" >\n {{'igo.geo.draw.layer.createNewLayer' | translate}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <button\n *ngIf=\"activeDrawingLayer\"\n mat-icon-button\n [color]=\"activeDrawingLayer.visible ? 'primary' : 'default'\"\n collapsibleButton\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"activeDrawingLayer.visible ?\n ('igo.geo.layer.hideLayer' | translate) :\n ('igo.geo.layer.showLayer' | translate)\"\n (click)=\"activeDrawingLayer.visible = !activeDrawingLayer.visible\">\n <mat-icon\n [svgIcon]=\"activeDrawingLayer.visible ? 'eye' : 'eye-off'\">\n </mat-icon>\n </button>\n </div>\n <mat-divider></mat-divider>\n <div>\n <button\n *ngIf=\"activeStore.count$.getValue() > 0\"\n class=\"deleteBtn\"\n mat-icon-button\n color=\"warn\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.draw.delete' | translate\"\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\n (click)=\"deleteDrawings()\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n\n <div>\n <igo-entity-table\n #table\n class=\"table-compact\"\n [store]=\"activeStore\"\n [template]=\"tableTemplate\"\n (dblclick)=\"editLabelDrawing()\">\n </igo-entity-table>\n </div>\n </div>\n\n <div class=\"icon-options\">\n <mat-form-field *ngIf=\"icons.length >= 1\">\n <mat-label>{{ 'igo.geo.draw.icon' | translate }}</mat-label>\n <mat-select>\n <mat-select-trigger>\n <div *ngIf=\"icon\" class=\"box\">\n <img src=\"{{ icon }}\">\n </div>\n </mat-select-trigger>\n <mat-option value=\"\" (click)=\"onIconChange()\">{{ 'igo.geo.draw.noIcon' | translate }}</mat-option>\n <mat-option\n *ngFor=\"let icon_html of icons\"\n [value]=\"icon_html\"\n (click)=\"onIconChange(icon_html)\">\n <div class=\"box\">\n <img src=\"{{ icon_html }}\">\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <button\n mat-icon-button\n color=\"accent\"\n disableRipple=\"true\"\n (click)=\"openShorcutsDialog()\"\n >\n <mat-icon\n class=\"shortcuts-icon\"\n svgIcon=\"keyboard-outline\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.draw.shortcuts' | translate\"\n >\n </mat-icon>\n </button>\n\n <button\n *ngIf=\"selectedFeatures$.value.length\"\n mat-raised-button\n color=\"primary\"\n (click)=\"openStyleModalDialog()\"\n [matTooltip]=\"'igo.geo.layer.style.styleModalTooltip' | translate\">\n {{'igo.geo.layer.style.styleModal' | translate}}\n <mat-icon\n class=\"style-icon\"\n svgIcon=\"palette\"\n [matBadge]=\"selectedFeatures$.value.length\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"medium\">\n </mat-icon>\n </button>\n</div>\n", styles: [".geometry-type-toggle{padding:10px;text-align:center}.geometry-type-toggle mat-button-toggle-group{width:100%}.geometry-type-toggle mat-button-toggle-group mat-button-toggle{width:25%}.draw-options{overflow-x:hidden}.draw-options mat-slide-toggle{width:100%;margin:10px}.draw-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options{margin:5px 5px 0}.edition-drawing{padding:10px 0}img{width:100%;height:100%}.deleteBtn{margin-left:12px}.storeTable{height:auto!important}.layer-select{width:85%;padding:10px 10px 0%}.input-button-container{padding:10px}.input-button-container mat-form-field{width:25%}.input-button-container button{left:8px;bottom:10px}\n"] }]
1041
+ }], function () { return [{ type: i1.LanguageService }, { type: i2.UntypedFormBuilder }, { type: i3.DrawStyleService }, { type: i4.MatDialog }, { type: i5.DrawIconService }]; }, { map: [{
1042
+ type: Input
1043
+ }], stores: [{
1044
+ type: Input
1045
+ }], drawControls: [{
1046
+ type: Input
1047
+ }], activeDrawingLayer: [{
1048
+ type: Input
1049
+ }], activeLayerChange: [{
1050
+ type: Output
1051
+ }], drawControlsEvent: [{
1052
+ type: Output
1053
+ }], layersIDEvent: [{
1054
+ type: Output
1055
+ }], fillColor: [{
811
1056
  type: Output
812
1057
  }], strokeColor: [{
813
1058
  type: Output
@@ -817,9 +1062,8 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
817
1062
  type: Output
818
1063
  }], fontStyle: [{
819
1064
  type: Output
820
- }], map: [{
821
- type: Input
822
- }], store: [{
823
- type: Input
1065
+ }], select: [{
1066
+ type: ViewChild,
1067
+ args: ['selectedLayer']
824
1068
  }] }); })();
825
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCx1QkFBdUIsRUFDdkIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxPQUFPLEVBRVAsNkJBQTZCLEVBQzdCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFDYiwyQkFBMkIsRUFDM0IsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFJckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQU1sRSxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFcEMsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFJMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxN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LFNBQVM7MkJBQ0UsVUFBVSxjQUNSO29CQUNWLE9BQU8sQ0FBQyxXQUFXLEVBQUU7d0JBQ25CLEtBQUssQ0FDSCxNQUFNLEVBQ04sS0FBSyxDQUFDOzRCQUNKLE9BQU8sRUFBRSxDQUFDO3lCQUNYLENBQUMsQ0FDSDt3QkFDRCxLQUFLLENBQ0gsUUFBUSxFQUNSLEtBQUssQ0FBQzs0QkFDSixPQUFPLEVBQUUsQ0FBQzt5QkFDWCxDQUFDLENBQ0g7d0JBQ0QsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7d0JBQ3JELFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3FCQUN0RCxDQUFDO2lCQUNILG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNO3dMQTRCckMsU0FBUztrQkFBbEIsTUFBTTtZQUNHLFdBQVc7a0JBQXBCLE1BQU07WUFDRyxXQUFXO2tCQUFwQixNQUFNO1lBRUcsUUFBUTtrQkFBakIsTUFBTTtZQUNHLFNBQVM7a0JBQWxCLE1BQU07WUFDRSxHQUFHO2tCQUFYLEtBQUs7WUFDRyxLQUFLO2tCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIE91dHB1dFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBGRUFUVVJFLFxyXG4gIEZlYXR1cmVTdG9yZSxcclxuICBGZWF0dXJlU3RvcmVTZWxlY3Rpb25TdHJhdGVneSxcclxuICB0cnlCaW5kU3RvcmVMYXllcixcclxuICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3ksXHJcbiAgdHJ5QWRkU2VsZWN0aW9uU3RyYXRlZ3ksXHJcbiAgRmVhdHVyZU1vdGlvbixcclxuICBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3ksXHJcbiAgZmVhdHVyZVRvT2xcclxufSBmcm9tICcuLi8uLi9mZWF0dXJlJztcclxuXHJcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBGb250VHlwZSwgR2VvbWV0cnlUeXBlIH0gZnJvbSAnLi4vc2hhcmVkL2RyYXcuZW51bSc7XHJcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRHJhdywgRmVhdHVyZVdpdGhEcmF3IH0gZnJvbSAnLi4vc2hhcmVkL2RyYXcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBWZWN0b3JTb3VyY2VFdmVudCBhcyBPbFZlY3RvclNvdXJjZUV2ZW50IH0gZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCB7IFZlY3RvckxheWVyIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy92ZWN0b3ItbGF5ZXInO1xyXG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2ZlYXR1cmUtZGF0YXNvdXJjZSc7XHJcbmltcG9ydCB7IERyYXdDb250cm9sIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvc2hhcmVkL2NvbnRyb2xzL2RyYXcnO1xyXG5pbXBvcnQge1xyXG4gIEVudGl0eVJlY29yZCxcclxuICBFbnRpdHlUYWJsZVRlbXBsYXRlXHJcbn0gZnJvbSAnQGlnbzIvY29tbW9uJztcclxuXHJcbmltcG9ydCAqIGFzIE9sU3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xyXG5pbXBvcnQgT2xWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCBPbENpcmNsZSBmcm9tICdvbC9nZW9tL0NpcmNsZSc7XHJcbmltcG9ydCBPbFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xyXG5pbXBvcnQgT2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xyXG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcclxuaW1wb3J0IE9sT3ZlcmxheSBmcm9tICdvbC9PdmVybGF5JztcclxuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBnZXREaXN0YW5jZSB9IGZyb20gJ29sL3NwaGVyZSc7XHJcbmltcG9ydCB7IERyYXdTdHlsZVNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvZHJhdy1zdHlsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgc2tpcCwgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERyYXdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vZHJhdy1wb3B1cC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcmF3U2hvcmN1dHNDb21wb25lbnQgfSBmcm9tICcuL2RyYXctc2hvcmN1dHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgZ2V0VG9vbHRpcHNPZk9sR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9tZWFzdXJlL3NoYXJlZC9tZWFzdXJlLnV0aWxzJztcclxuaW1wb3J0IHsgY3JlYXRlSW50ZXJhY3Rpb25TdHlsZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LnV0aWxzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtIH0gZnJvbSAnb2wvcHJvaic7XHJcbmltcG9ydCB7IERyYXdJY29uU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LWljb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN0eWxlTW9kYWxDb21wb25lbnQsIFN0eWxlTW9kYWxEYXRhIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc3R5bGUtbW9kYWwvc3R5bGUtbW9kYWwuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7XHJcbiAgdHJpZ2dlcixcclxuICBzdGF0ZSxcclxuICBzdHlsZSxcclxuICBhbmltYXRlLFxyXG4gIHRyYW5zaXRpb25cclxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpZ28tZHJhdycsXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignb3BlbkNsb3NlJywgW1xyXG4gICAgICBzdGF0ZShcclxuICAgICAgICAnb3BlbicsXHJcbiAgICAgICAgc3R5bGUoe1xyXG4gICAgICAgICAgb3BhY2l0eTogMVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHN0YXRlKFxyXG4gICAgICAgICdjbG9zZWQnLFxyXG4gICAgICAgIHN0eWxlKHtcclxuICAgICAgICAgIG9wYWNpdHk6IDBcclxuICAgICAgICB9KVxyXG4gICAgICApLFxyXG4gICAgICB0cmFuc2l0aW9uKCdvcGVuID0+IGNsb3NlZCcsIFthbmltYXRlKCc2MDBtcyBlYXNlJyldKSxcclxuICAgICAgdHJhbnNpdGlvbignY2xvc2VkID0+IG9wZW4nLCBbYW5pbWF0ZSgnODAwbXMgZWFzZScpXSlcclxuICAgIF0pXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHJhdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZHJhdy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmF3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKlxyXG4gICAqIFRhYmxlIHRlbXBsYXRlXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgcHVibGljIHRhYmxlVGVtcGxhdGU6IEVudGl0eVRhYmxlVGVtcGxhdGUgPSB7XHJcbiAgICBzZWxlY3Rpb246IHRydWUsXHJcbiAgICBzZWxlY3RNYW55OiB0cnVlLFxyXG4gICAgc2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICBzb3J0OiB0cnVlLFxyXG4gICAgZml4ZWRIZWFkZXI6IHRydWUsXHJcbiAgICB0YWJsZUhlaWdodDogJ2F1dG8nLFxyXG4gICAgY29sdW1uczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0RyYXdpbmcnLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kcmF3LmxhYmVscycpLFxyXG4gICAgICAgIHRvb2x0aXA6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcuY2hhbmdlTGFiZWwnKSxcclxuICAgICAgICB2YWx1ZUFjY2Vzc29yOiAoZmVhdHVyZTogRmVhdHVyZVdpdGhEcmF3KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLmRyYXc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGdlb21ldHJ5VHlwZSA9IEdlb21ldHJ5VHlwZTsgLy8gUmVmZXJlbmNlIHRvIHRoZSBHZW9tZXRyeVR5cGUgZW51bVxyXG5cclxuICBAT3V0cHV0KCkgZmlsbENvbG9yOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHN0cm9rZUNvbG9yOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHN0cm9rZVdpZHRoOiBudW1iZXI7XHJcblxyXG4gIEBPdXRwdXQoKSBmb250U2l6ZTogc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSBmb250U3R5bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBtYXA6IElnb01hcDsgLy8gTWFwIHRvIGRyYXcgb25cclxuICBASW5wdXQoKSBzdG9yZTogRmVhdHVyZVN0b3JlPEZlYXR1cmVXaXRoRHJhdz47IC8vIERyYXdpbmcgc3RvcmVcclxuXHJcbiAgcHVibGljIGRyYXckOiBCZWhhdmlvclN1YmplY3Q8RHJhdz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTsgLy8gT2JzZXJ2YWJsZSBvZiBkcmF3XHJcblxyXG4gIHByaXZhdGUgb2xEcmF3aW5nTGF5ZXJTb3VyY2UgPSBuZXcgT2xWZWN0b3JTb3VyY2UoKTtcclxuICBwcml2YXRlIGRyYXdDb250cm9sOiBEcmF3Q29udHJvbDtcclxuICBwcml2YXRlIGRyYXdFbmQkJDogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgZHJhd1NlbGVjdCQkOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBvbERyYXdpbmdMYXllcjogVmVjdG9yTGF5ZXI7XHJcbiAgcHVibGljIHNlbGVjdGVkRmVhdHVyZXMkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZVdpdGhEcmF3W10+ID1cclxuICAgIG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xyXG4gIHB1YmxpYyBmaWxsRm9ybTogc3RyaW5nO1xyXG4gIHB1YmxpYyBzdHJva2VGb3JtOiBzdHJpbmc7XHJcbiAgcHVibGljIGRyYXdDb250cm9sSXNEaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGRyYXdDb250cm9sSXNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGFiZWxzQXJlU2hvd246IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zJCQ6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHB1YmxpYyBwb3NpdGlvbjogc3RyaW5nID0gJ2JvdHRvbSc7XHJcbiAgcHVibGljIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgcHVibGljIGljb25zOiBBcnJheTxzdHJpbmc+O1xyXG4gIHB1YmxpYyBpY29uOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgbnVtYmVyT2ZEcmF3aW5nczogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGRyYXdTdHlsZVNlcnZpY2U6IERyYXdTdHlsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBkcmF3SWNvblNlcnZpY2U6IERyYXdJY29uU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgIHRoaXMuZmlsbENvbG9yID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldEZpbGxDb2xvcigpO1xyXG4gICAgdGhpcy5zdHJva2VDb2xvciA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRTdHJva2VDb2xvcigpO1xyXG4gICAgdGhpcy5zdHJva2VXaWR0aCA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRTdHJva2VXaWR0aCgpO1xyXG4gICAgdGhpcy5sYWJlbHNBcmVTaG93biA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRMYWJlbHNBcmVTaG93bigpO1xyXG4gICAgdGhpcy5pY29ucyA9IHRoaXMuZHJhd0ljb25TZXJ2aWNlLmdldEljb25zKCk7XHJcbiAgICB0aGlzLmljb24gPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0SWNvbigpO1xyXG5cclxuICAgIHRoaXMuZm9udFNpemUgPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0Rm9udFNpemUoKTtcclxuICAgIHRoaXMuZm9udFN0eWxlID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldEZvbnRTdHlsZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RvcmUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGVudGl0aWVzIGFuZCBjcmVhdGUgdGhlIERyYXcgY29udHJvbFxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0U3RvcmUoKTtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2wgPSB0aGlzLmNyZWF0ZURyYXdDb250cm9sKFxyXG4gICAgICB0aGlzLmZpbGxDb2xvcixcclxuICAgICAgdGhpcy5zdHJva2VDb2xvcixcclxuICAgICAgdGhpcy5zdHJva2VXaWR0aFxyXG4gICAgKTtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2wuc2V0R2VvbWV0cnlUeXBlKHRoaXMuZ2VvbWV0cnlUeXBlLlBvaW50IGFzIGFueSk7XHJcbiAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIGRyYXdpbmcgbGF5ZXIgYW5kIHRoZSBpbnRlcmFjdGlvbnNcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2wuc2V0T2xNYXAodW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLm1hcCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERyYXcgQ29udHJvbFxyXG4gICAqIEBwYXJhbSBmaWxsQ29sb3IgdGhlIGZpbGwgY29sb3JcclxuICAgKiBAcGFyYW0gc3Ryb2tlQ29sb3IgdGhlIHN0cm9rZSBjb2xvclxyXG4gICAqIEBwYXJhbSBzdHJva2VXaWR0aCB0aGUgc3Ryb2tlIHdpZHRoXHJcbiAgICogQHJldHVybnMgYSBEcmF3IENvbnRyb2xcclxuICAgKi9cclxuICBjcmVhdGVEcmF3Q29udHJvbChcclxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcclxuICAgIHN0cm9rZUNvbG9yPzogc3RyaW5nLFxyXG4gICAgc3Ryb2tlV2lkdGg/OiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGRyYXdDb250cm9sID0gbmV3IERyYXdDb250cm9sKHtcclxuICAgICAgZ2VvbWV0cnlUeXBlOiB1bmRlZmluZWQsXHJcbiAgICAgIGRyYXdpbmdMYXllclNvdXJjZTogdGhpcy5vbERyYXdpbmdMYXllclNvdXJjZSxcclxuICAgICAgZHJhd2luZ0xheWVyU3R5bGU6IG5ldyBPbFN0eWxlLlN0eWxlKHt9KSxcclxuICAgICAgaW50ZXJhY3Rpb25TdHlsZTogY3JlYXRlSW50ZXJhY3Rpb25TdHlsZShcclxuICAgICAgICBmaWxsQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGhcclxuICAgICAgKVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGRyYXdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcmUgaW5pdGlhbGl6YXRpb24sIGluY2x1ZGluZyBkcmF3aW5nIGxheWVyIGNyZWF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0U3RvcmUoKSB7XHJcbiAgICB0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzLm9sRHJhd2luZ0xheWVyKTtcclxuXHJcbiAgICAvLyB0aGlzLm1hcC5hZGRMYXllcigpXHJcbiAgICB0aGlzLm9sRHJhd2luZ0xheWVyID0gbmV3IFZlY3RvckxheWVyKHtcclxuICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxyXG4gICAgICBpZDogJ2lnby1kcmF3LWxheWVyJyxcclxuICAgICAgdGl0bGU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcuZHJhd2luZycpLFxyXG4gICAgICB6SW5kZXg6IDIwMCxcclxuICAgICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcclxuICAgICAgc3R5bGU6IChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd1N0eWxlU2VydmljZS5jcmVhdGVJbmRpdmlkdWFsRWxlbWVudFN0eWxlKFxyXG4gICAgICAgICAgZmVhdHVyZSxcclxuICAgICAgICAgIHJlc29sdXRpb24sXHJcbiAgICAgICAgICB0aGlzLmxhYmVsc0FyZVNob3duLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2ZvbnRTdHlsZScpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLmZpbGwsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFgnKSxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRZJyksXHJcbiAgICAgICAgICB0aGlzLmljb25cclxuICAgICAgICApO1xyXG4gICAgICB9LFxyXG4gICAgICBzaG93SW5MYXllckxpc3Q6IHRydWUsXHJcbiAgICAgIGV4cG9ydGFibGU6IHRydWUsXHJcbiAgICAgIGJyb3dzYWJsZTogZmFsc2UsXHJcbiAgICAgIHdvcmtzcGFjZToge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdHJ5QmluZFN0b3JlTGF5ZXIodGhpcy5zdG9yZSwgdGhpcy5vbERyYXdpbmdMYXllcik7XHJcblxyXG4gICAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KFxyXG4gICAgICB0aGlzLnN0b3JlLFxyXG4gICAgICBuZXcgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KHtcclxuICAgICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uTm9uZVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0cnlBZGRTZWxlY3Rpb25TdHJhdGVneShcclxuICAgICAgdGhpcy5zdG9yZSxcclxuICAgICAgbmV3IEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KHtcclxuICAgICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lLFxyXG4gICAgICAgIG1hbnk6IHRydWVcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICB0aGlzLnN0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5zdG9yZS5zb3VyY2Uub2wub24oXHJcbiAgICAgICdyZW1vdmVmZWF0dXJlJyxcclxuICAgICAgKGV2ZW50OiBPbFZlY3RvclNvdXJjZUV2ZW50PE9sR2VvbWV0cnk+KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2xHZW9tZXRyeSA9IGV2ZW50LmZlYXR1cmUuZ2V0R2VvbWV0cnkoKTtcclxuICAgICAgICB0aGlzLmNsZWFyTGFiZWxzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2goXHJcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGVWaWV3XHJcbiAgICAgICAgLm1hbnlCeSQoKHJlY29yZDogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoRHJhdz4pID0+IHtcclxuICAgICAgICAgIHJldHVybiByZWNvcmQuc3RhdGUuc2VsZWN0ZWQgPT09IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpcnN0KClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgocmVjb3JkczogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoRHJhdz5bXSkgPT4ge1xyXG4gICAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+IHtcclxuICAgICAgICAgICAgcmVjb3JkLnN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMkJC5wdXNoKFxyXG4gICAgICB0aGlzLnN0b3JlLnN0YXRlVmlld1xyXG4gICAgICAgIC5tYW55QnkkKChyZWNvcmQ6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aERyYXc+KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBza2lwKDEpIC8vIFNraXAgaW5pdGlhbCBlbWlzc2lvblxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhEcmF3PltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLm5leHQocmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gcmVjb3JkLmVudGl0eSkpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2goXHJcbiAgICAgIHRoaXMuc3RvcmUuY291bnQkLnN1YnNjcmliZSgoY250KSA9PiB7XHJcbiAgICAgICAgaWYgKGNudCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuc3RvcmUuc2V0TGF5ZXJFeHRlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY250ID49IDFcclxuICAgICAgICAgID8gKHRoaXMuc3RvcmUubGF5ZXIub3B0aW9ucy5zaG93SW5MYXllckxpc3QgPSB0cnVlKVxyXG4gICAgICAgICAgOiAodGhpcy5zdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuLyoqXHJcbiAqIE9wZW4gdGhlIHN0eWxlIG1vZGFsIGRpYWxvZyBib3hcclxuICovXHJcbiAgb3BlblN0eWxlTW9kYWxEaWFsb2coKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gb3BlbiB0aGUgZGlhbG9nIGJveCB1c2VkIHRvIHN0eWxlIGZlYXR1cmVzXHJcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU3R5bGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZmVhdHVyZXM6IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgIGljb25zOiB0aGlzLmljb25zLFxyXG4gICAgICAgICAgaWNvbjogdGhpcy5pY29uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gd2hlbiBkaWFsb2cgYm94IGlzIGNsb3NlZCwgZ2V0IGxhYmVsIGFuZCBzZXQgaXQgdG8gZ2VvbWV0cnlcclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChkYXRhOiBTdHlsZU1vZGFsRGF0YSkgPT4ge1xyXG4gICAgICAgIC8vIGNoZWNrcyBpZiB0aGUgdXNlciBjbGlja2VkIG9rXHJcbiAgICAgICAgaWYgKGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtRmxhZykge1xyXG4gICAgICAgICAgdGhpcy5vbkZvbnRDaGFuZ2UodGhpcy5sYWJlbHNBcmVTaG93biwgZGF0YS5mb250U2l6ZSwgZGF0YS5mb250U3R5bGUpO1xyXG4gICAgICAgICAgdGhpcy5vbkNvbG9yQ2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIHRoaXMuaWNvbiA/IHRydWUgOiBmYWxzZSwgZGF0YS5maWxsQ29sb3IsIGRhdGEuc3Ryb2tlQ29sb3IpO1xyXG4gICAgICAgICAgdGhpcy5vbk9mZnNldExhYmVsQ2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIGRhdGEub2Zmc2V0WCwgZGF0YS5vZmZzZXRZKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW4gYSBkaWFsb2cgYm94IHRvIGVudGVyIGxhYmVsIGFuZCBkbyBzb21ldGhpbmdcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBnZW9tZXRyeSBhdCBkcmF3IGVuZCBvciBzZWxlY3RlZCBnZW9tZXRyeVxyXG4gICAqIEBwYXJhbSBkcmF3RW5kIGV2ZW50IGZpcmVkIGF0IGRyYXdFbmQ/XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvcGVuRHJhd0RpYWxvZyhvbEdlb21ldHJ5LCBpc0RyYXdFbmQ6IGJvb2xlYW4pIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBvcGVuIHRoZSBkaWFsb2cgYm94IHVzZWQgdG8gZW50ZXIgbGFiZWxcclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEcmF3UG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICAgIGRhdGE6IHsgY3VycmVudExhYmVsOiBvbEdlb21ldHJ5LmdldCgnZHJhdycpIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyB3aGVuIGRpYWxvZyBib3ggaXMgY2xvc2VkLCBnZXQgbGFiZWwgYW5kIHNldCBpdCB0byBnZW9tZXRyeVxyXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGxhYmVsOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAvLyBjaGVja3MgaWYgdGhlIHVzZXIgY2xpY2tlZCBva1xyXG4gICAgICAgIGlmIChkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUZsYWcpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlTGFiZWxPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgbGFiZWwpO1xyXG4gICAgICAgICAgaWYgKCFvbEdlb21ldHJ5LnZhbHVlc18uZm9udFN0eWxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEdlb21ldHJ5LCAnMjAnLCBGb250VHlwZS5BcmlhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIW9sR2VvbWV0cnkudmFsdWVzXy5kcmF3aW5nU3R5bGUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWxsQW5kU3Ryb2tlQ29sb3IoXHJcbiAgICAgICAgICAgICAgb2xHZW9tZXRyeSxcclxuICAgICAgICAgICAgICAncmdiYSgyNTUsMjU1LDI1NSwwLjQpJyxcclxuICAgICAgICAgICAgICAncmdiYSgxNDMsNyw3LDEpJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCEob2xHZW9tZXRyeS52YWx1ZXNfLm9mZnNldFggfHwgb2xHZW9tZXRyeS52YWx1ZXNfLm9mZnNldFkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KFxyXG4gICAgICAgICAgICAgIG9sR2VvbWV0cnksXHJcbiAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICBvbEdlb21ldHJ5IGluc3RhbmNlb2YgUG9pbnQgPyAtMTUgOiAwXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgZXZlbnQgd2FzIGZpcmVkIGF0IGRyYXcgZW5kXHJcbiAgICAgICAgICBpZiAoaXNEcmF3RW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25EcmF3RW5kKG9sR2VvbWV0cnkpO1xyXG4gICAgICAgICAgICAvLyBpZiBldmVudCB3YXMgZmlyZWQgYXQgc2VsZWN0XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0RHJhdyhvbEdlb21ldHJ5LCBsYWJlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodFRhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRlbGV0ZXMgdGhlIGZlYXR1cmVcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub2xEcmF3aW5nTGF5ZXJTb3VyY2VcclxuICAgICAgICAgICAgLmdldEZlYXR1cmVzKClcclxuICAgICAgICAgICAgLmZvckVhY2goKGRyYXdpbmdMYXllckZlYXR1cmUpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IGRyYXdpbmdMYXllckZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sR2VvbWV0cnkgPT09IGdlb21ldHJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9sRHJhd2luZ0xheWVyU291cmNlLnJlbW92ZUZlYXR1cmUoZHJhd2luZ0xheWVyRmVhdHVyZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBkcmF3IHNvdXJjZSBhbmQgdHJhY2sgdGhlIGdlb21ldHJ5IGJlaW5nIGRyYXdcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cclxuICAgKi9cclxuICBwcml2YXRlIG9uRHJhd0VuZChvbEdlb21ldHJ5OiBPbEdlb21ldHJ5LCByYWRpdXM/OiBudW1iZXIpIHtcclxuICAgIHRoaXMuYWRkRmVhdHVyZVRvU3RvcmUob2xHZW9tZXRyeSwgcmFkaXVzKTtcclxuICAgIHRoaXMuY2xlYXJMYWJlbHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XHJcbiAgICB0aGlzLnN0b3JlLmxheWVyLm9sLmdldFNvdXJjZSgpLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb2RpZnlEcmF3KG9sR2VvbWV0cnkpIHtcclxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5zdG9yZS5hbGwoKTtcclxuXHJcbiAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHkpID0+IHtcclxuICAgICAgY29uc3QgZW50aXR5SWQgPSBlbnRpdHkucHJvcGVydGllcy5pZDtcclxuXHJcbiAgICAgIGNvbnN0IG9sR2VvbWV0cnlJZCA9IG9sR2VvbWV0cnkub2xfdWlkO1xyXG5cclxuICAgICAgaWYgKGVudGl0eUlkID09PSBvbEdlb21ldHJ5SWQpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxhYmVsT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnksIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXcpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShcclxuICAgICAgICAgIG9sR2VvbWV0cnksXHJcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5mb250U3R5bGUuc3BsaXQoJyAnKVswXS5yZXBsYWNlKCdweCcsICcnKSxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5zdWJzdHJpbmcoXHJcbiAgICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5pbmRleE9mKCcgJykgKyAxXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpbGxBbmRTdHJva2VDb2xvcihcclxuICAgICAgICAgIG9sR2VvbWV0cnksXHJcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5kcmF3aW5nU3R5bGUuZmlsbCxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5zdHJva2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KFxyXG4gICAgICAgICAgb2xHZW9tZXRyeSxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFgsXHJcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRZXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnJlcGxhY2VGZWF0dXJlSW5TdG9yZShlbnRpdHksIG9sR2VvbWV0cnkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25TZWxlY3REcmF3KG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LCBsYWJlbDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMuc3RvcmUuYWxsKCk7XHJcblxyXG4gICAgY29uc3Qgb2xHZW9tZXRyeSA9IG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueTtcclxuICAgIG9sR2VvbWV0cnkub2xfdWlkID0gb2xGZWF0dXJlLmdldCgnaWQnKTtcclxuXHJcbiAgICBjb25zdCBvbEdlb21ldHJ5Q29vcmRpbmF0ZXMgPSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgb2xHZW9tZXRyeS5nZXRDb29yZGluYXRlcygpWzBdXHJcbiAgICApO1xyXG5cclxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xyXG4gICAgICBjb25zdCBlbnRpdHlDb29yZGluYXRlcyA9IEpTT04uc3RyaW5naWZ5KGVudGl0eS5nZW9tZXRyeS5jb29yZGluYXRlc1swXSk7XHJcblxyXG4gICAgICBpZiAob2xHZW9tZXRyeUNvb3JkaW5hdGVzID09PSBlbnRpdHlDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gb2xGZWF0dXJlXHJcbiAgICAgICAgICAuZ2V0KCdmb250U3R5bGUnKVxyXG4gICAgICAgICAgLnNwbGl0KCcgJylbMF1cclxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgICAgICBjb25zdCBmb250U3R5bGUgPSBvbEZlYXR1cmVcclxuICAgICAgICAgIC5nZXQoJ2ZvbnRTdHlsZScpXHJcbiAgICAgICAgICAuc3Vic3RyaW5nKG9sRmVhdHVyZS5nZXQoJ2ZvbnRTdHlsZScpLmluZGV4T2YoJyAnKSArIDEpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWxsQ29sb3IgPSBvbEZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5maWxsO1xyXG4gICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gb2xGZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlO1xyXG5cclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WCcpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBvbEZlYXR1cmUuZ2V0KCdvZmZzZXRZJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhZDogbnVtYmVyID0gZW50aXR5LnByb3BlcnRpZXMucmFkXHJcbiAgICAgICAgICA/IGVudGl0eS5wcm9wZXJ0aWVzLnJhZFxyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVMYWJlbE9mT2xHZW9tZXRyeShvbEdlb21ldHJ5LCBsYWJlbCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGb250U2l6ZUFuZFN0eWxlKG9sR2VvbWV0cnksIGZvbnRTaXplLCBmb250U3R5bGUpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKG9sR2VvbWV0cnksIGZpbGxDb2xvciwgc3Ryb2tlQ29sb3IpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KG9sR2VvbWV0cnksIG9mZnNldFgsIG9mZnNldFkpO1xyXG4gICAgICAgIHRoaXMucmVwbGFjZUZlYXR1cmVJblN0b3JlKGVudGl0eSwgb2xHZW9tZXRyeSwgcmFkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYSBmZWF0dXJlIHdpdGggZHJhdyBsYWJlbCB0byB0aGUgc3RvcmUuIFRoZSBsb2FkaW5nIHN0cmFnZWd5IG9mIHRoZSBzdG9yZVxyXG4gICAqIHdpbGwgdHJpZ2dlciBhbmQgYWRkIHRoZSBmZWF0dXJlIHRvIHRoZSBtYXAuXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGRGZWF0dXJlVG9TdG9yZShcclxuICAgIG9sR2VvbWV0cnksXHJcbiAgICByYWRpdXM/OiBudW1iZXIsXHJcbiAgICBmZWF0dXJlPzogRmVhdHVyZVdpdGhEcmF3XHJcbiAgKSB7XHJcbiAgICBsZXQgcmFkOiBudW1iZXI7XHJcbiAgICBsZXQgY2VudGVyNDMyNjogQXJyYXk8bnVtYmVyPjtcclxuICAgIGxldCBwb2ludDQzMjY6IEFycmF5PG51bWJlcj47XHJcbiAgICBsZXQgbG9uNDMyNjogbnVtYmVyO1xyXG4gICAgbGV0IGxhdDQzMjY6IG51bWJlcjtcclxuICAgIGNvbnN0IGZlYXR1cmVJZCA9IGZlYXR1cmUgPyBmZWF0dXJlLnByb3BlcnRpZXMuaWQgOiBvbEdlb21ldHJ5Lm9sX3VpZDtcclxuICAgIGNvbnN0IHByb2plY3Rpb24gPSB0aGlzLm1hcC5vbC5nZXRWaWV3KCkuZ2V0UHJvamVjdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3Qob2xHZW9tZXRyeSwge1xyXG4gICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbixcclxuICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25cclxuICAgIH0pIGFzIGFueTtcclxuXHJcbiAgICBpZiAob2xHZW9tZXRyeSBpbnN0YW5jZW9mIE9sQ2lyY2xlIHx8IHJhZGl1cykge1xyXG4gICAgICBpZiAocmFkaXVzKSB7XHJcbiAgICAgICAgcmFkID0gcmFkaXVzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnUG9pbnQnO1xyXG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gb2xHZW9tZXRyeS5nZXRDZW50ZXIoKTtcclxuICAgICAgICBjb25zdCBleHRlbnQ0MzI2ID0gdHJhbnNmb3JtKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzJdLFxyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzNdXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgcHJvamVjdGlvbixcclxuICAgICAgICAgICdFUFNHOjQzMjYnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjZW50ZXI0MzI2ID0gdHJhbnNmb3JtKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzBdLFxyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzFdXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgcHJvamVjdGlvbixcclxuICAgICAgICAgICdFUFNHOjQzMjYnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsb240MzI2ID0gY2VudGVyNDMyNlswXTtcclxuICAgICAgICBsYXQ0MzI2ID0gY2VudGVyNDMyNlsxXTtcclxuICAgICAgICByYWQgPSBnZXREaXN0YW5jZShjZW50ZXI0MzI2LCBleHRlbnQ0MzI2KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChvbEdlb21ldHJ5IGluc3RhbmNlb2YgT2xQb2ludCkge1xyXG4gICAgICBwb2ludDQzMjYgPSB0cmFuc2Zvcm0oXHJcbiAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxcclxuICAgICAgICBwcm9qZWN0aW9uLFxyXG4gICAgICAgICdFUFNHOjQzMjYnXHJcbiAgICAgICk7XHJcbiAgICAgIGxvbjQzMjYgPSBwb2ludDQzMjZbMF07XHJcbiAgICAgIGxhdDQzMjYgPSBwb2ludDQzMjZbMV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yZS51cGRhdGUoe1xyXG4gICAgICB0eXBlOiBGRUFUVVJFLFxyXG4gICAgICBnZW9tZXRyeSxcclxuICAgICAgcHJvamVjdGlvbjogcHJvamVjdGlvbi5nZXRDb2RlKCksXHJcbiAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICBpZDogZmVhdHVyZUlkLFxyXG4gICAgICAgIGRyYXc6IG9sR2VvbWV0cnkuZ2V0KCdfbGFiZWwnKSxcclxuICAgICAgICBsb25naXR1ZGU6IGxvbjQzMjYgPyBsb240MzI2IDogbnVsbCxcclxuICAgICAgICBsYXRpdHVkZTogbGF0NDMyNiA/IGxhdDQzMjYgOiBudWxsLFxyXG4gICAgICAgIHJhZDogcmFkID8gcmFkIDogbnVsbCxcclxuICAgICAgICBmb250U3R5bGU6IG9sR2VvbWV0cnkuZ2V0KCdmb250U3R5bGVfJyksXHJcbiAgICAgICAgZHJhd2luZ1N0eWxlOiB7XHJcbiAgICAgICAgICBmaWxsOiBvbEdlb21ldHJ5LmdldCgnZmlsbENvbG9yXycpLFxyXG4gICAgICAgICAgc3Ryb2tlOiBvbEdlb21ldHJ5LmdldCgnc3Ryb2tlQ29sb3JfJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9mZnNldFg6IG9sR2VvbWV0cnkuZ2V0KCdvZmZzZXRYXycpLFxyXG4gICAgICAgIG9mZnNldFk6IG9sR2VvbWV0cnkuZ2V0KCdvZmZzZXRZXycpXHJcbiAgICAgIH0sXHJcbiAgICAgIG1ldGE6IHtcclxuICAgICAgICBpZDogZmVhdHVyZUlkXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEZvcm0oKSB7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZmlsbDogWycnXSxcclxuICAgICAgc3Ryb2tlOiBbJyddXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGRvdWJsZS1jbGlja3MgdGhlIHNlbGVjdGVkIGRyYXdpbmdcclxuICAgKi9cclxuICBlZGl0TGFiZWxEcmF3aW5nKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG9sR2VvbWV0cnkgPSBmZWF0dXJlVG9PbChcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlWzBdLFxyXG4gICAgICAgIHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMub3BlbkRyYXdEaWFsb2cob2xHZW9tZXRyeSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlblNob3JjdXRzRGlhbG9nKCkge1xyXG4gICAgdGhpcy5kaWFsb2cub3BlbihEcmF3U2hvcmN1dHNDb21wb25lbnQpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRHJhd2luZ3MoKSB7XHJcbiAgICB0aGlzLnN0b3JlLmRlbGV0ZU1hbnkodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmZvckVhY2goKHNlbGVjdGVkRmVhdHVyZSkgPT4ge1xyXG4gICAgICB0aGlzLm9sRHJhd2luZ0xheWVyU291cmNlLmdldEZlYXR1cmVzKCkuZm9yRWFjaCgoZHJhd2luZ0xheWVyRmVhdHVyZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gZHJhd2luZ0xheWVyRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlLnByb3BlcnRpZXMuaWQgPT09IGdlb21ldHJ5Lm9sX3VpZCkge1xyXG4gICAgICAgICAgdGhpcy5vbERyYXdpbmdMYXllclNvdXJjZS5yZW1vdmVGZWF0dXJlKGRyYXdpbmdMYXllckZlYXR1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlSGVpZ2h0VGFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIGxhYmVscyB0b2dnbGVcclxuICAgKi9cclxuICBvblRvZ2dsZUxhYmVscygpIHtcclxuICAgIHRoaXMuZHJhd1N0eWxlU2VydmljZS50b2dnbGVMYWJlbHNBcmVTaG93bigpO1xyXG4gICAgdGhpcy5sYWJlbHNBcmVTaG93biA9ICF0aGlzLmxhYmVsc0FyZVNob3duO1xyXG4gICAgdGhpcy5pY29uXHJcbiAgICAgID8gdGhpcy5vbkNvbG9yQ2hhbmdlKFxyXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcclxuICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICB0aGlzLmZpbGxDb2xvcixcclxuICAgICAgICAgIHRoaXMuc3Ryb2tlQ29sb3JcclxuICAgICAgICApXHJcbiAgICAgIDogdGhpcy5vbkNvbG9yQ2hhbmdlKFxyXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcclxuICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgdGhpcy5maWxsQ29sb3IsXHJcbiAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yXHJcbiAgICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIERyYXcgY29udHJvbCBpcyB0b2dnbGVkXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgb25Ub2dnbGVEcmF3Q29udHJvbCh0b2dnbGVJc0NoZWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRvZ2dsZUlzQ2hlY2tlZCA/IHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKSA6IHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVc2VyIGNoYW5nZXMgcHJvcGVydGllcyBvZiBhIGRyYXdpbmcgZWxlbWVudFxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBjb2xvciBpbiBhIGNvbG9yIHBpY2tlclxyXG4gICAqIEBwYXJhbSBsYWJlbHNBcmVTaG93biB3aGV0ZXIgdGhlIGxhYmVscyBhcmUgc2hvd24gb3Igbm90XHJcbiAgICogQHBhcmFtIGlzQW5JY29uIHdoZXRlciB0aGUgZmVhdHVyZSBpcyBhbiBpY29uIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBmaWxsQ29sb3Igd2hpY2ggaXMgdGhlIGZpbGxpbmcgY29sb3JcclxuICAgKiBAcGFyYW0gc3Ryb2tlQ29sb3Igd2hpY2ggaXMgdGhlIHN0cm9rZSBjb2xvclxyXG4gICAqL1xyXG4gIG9uQ29sb3JDaGFuZ2UoXHJcbiAgICBsYWJlbHNBcmVTaG93bjogYm9vbGVhbixcclxuICAgIGlzQW5JY29uOiBib29sZWFuLFxyXG4gICAgZmlsbENvbG9yOiBzdHJpbmcsXHJcbiAgICBzdHJva2VDb2xvcjogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwICYmICFpc0FuSWNvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmZvckVhY2goKGZlYXR1cmUpID0+IHtcclxuICAgICAgICBsZXQgb2xGZWF0dXJlID0gZmVhdHVyZVRvT2woXHJcbiAgICAgICAgICBmZWF0dXJlLFxyXG4gICAgICAgICAgdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKS5nZXRDb2RlKClcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKG9sRmVhdHVyZSwgZmlsbENvbG9yLCBzdHJva2VDb2xvcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuc3RvcmVcclxuICAgICAgICAgIC5hbGwoKVxyXG4gICAgICAgICAgLmZpbmQoKGUpID0+IGUubWV0YS5pZCA9PT0gb2xGZWF0dXJlLmdldElkKCkpO1xyXG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5maWxsID0gb2xGZWF0dXJlLmdldCgnZmlsbENvbG9yXycpO1xyXG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5zdHJva2UgPSBvbEZlYXR1cmUuZ2V0KCdzdHJva2VDb2xvcl8nKTtcclxuICAgICAgICB0aGlzLnN0b3JlLnVwZGF0ZShlbnRpdHkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsbENvbG9yID0gZmlsbENvbG9yO1xyXG4gICAgdGhpcy5zdHJva2VDb2xvciA9IHN0cm9rZUNvbG9yO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duLCBpc0FuSWNvbik7XHJcbiAgICB0aGlzLmNyZWF0ZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBmb250IHNpemUgb3IvYW5kIHN0eWxlXHJcbiAgICogQHBhcmFtIGxhYmVsc0FyZVNob3duIHdoZXRlciB0aGUgbGFiZWxzIGFyZSBzaG93biBvciBub3RcclxuICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZm9udFxyXG4gICAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2YgdGhlIGZvbnRcclxuICAgKi9cclxuXHJcbiAgb25Gb250Q2hhbmdlKGxhYmVsc0FyZVNob3duOiBib29sZWFuLCBzaXplOiBzdHJpbmcsIHN0eWxlOiBGb250VHlwZSkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmZvckVhY2goKGZlYXR1cmUpID0+IHtcclxuICAgICAgICBsZXQgb2xGZWF0dXJlID0gZmVhdHVyZVRvT2woXHJcbiAgICAgICAgICBmZWF0dXJlLFxyXG4gICAgICAgICAgdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKS5nZXRDb2RlKClcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEZlYXR1cmUsIHNpemUsIHN0eWxlKTtcclxuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLnN0b3JlXHJcbiAgICAgICAgICAuYWxsKClcclxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5mb250U3R5bGUgPSBvbEZlYXR1cmUuZ2V0KCdmb250U3R5bGVfJyk7XHJcbiAgICAgICAgdGhpcy5zdG9yZS51cGRhdGUoZW50aXR5KTtcclxuICAgICAgICBvbEZlYXR1cmUgPSB0aGlzLnN0b3JlLmxheWVyLm9sLmdldFNvdXJjZSgpLmdldEZlYXR1cmVzKCkuZmluZChmID0+IGYuZ2V0SWQoKSA9PT0gZW50aXR5Lm1ldGEuaWQpO1xyXG4gICAgICAgIG9sRmVhdHVyZS5zZXRQcm9wZXJ0aWVzKHsgZm9udFN0eWxlOiBlbnRpdHkucHJvcGVydGllcy5mb250U3R5bGUgfSk7XHJcbiAgICAgICAgb2xGZWF0dXJlLmNoYW5nZWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmZvbnRTaXplID0gc2l6ZTtcclxuICAgICAgdGhpcy5mb250U3R5bGUgPSBzdHlsZTtcclxuXHJcbiAgICAgIHRoaXMuZHJhd1N0eWxlU2VydmljZS5zZXRGb250U2l6ZShzaXplKTtcclxuICAgICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnNldEZvbnRTdHlsZShzdHlsZSk7XHJcblxyXG4gICAgICB0aGlzLmVsZW1lbnRTdHlsZShsYWJlbHNBcmVTaG93bik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiB0aGUgaG9yaXpvbnRhbC92ZXJ0aWNhbCBvZmZzZXRcclxuICAgKiBAcGFyYW0gbGFiZWxzQXJlU2hvd24gd2hldGVyIHRoZSBsYWJlbHMgYXJlIHNob3duIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBvZmZzZXRYIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBsYWJlbFxyXG4gICAqIEBwYXJhbSBvZmZzZXRZIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgbGFiZWxcclxuICAgKi9cclxuXHJcbiAgb25PZmZzZXRMYWJlbENoYW5nZShcclxuICAgIGxhYmVsc0FyZVNob3duOiBib29sZWFuLFxyXG4gICAgb2Zmc2V0WDogbnVtYmVyLFxyXG4gICAgb2Zmc2V0WTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xyXG4gICAgICAgIGxldCBvbEZlYXR1cmUgPSBmZWF0dXJlVG9PbChcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICB0aGlzLm1hcC5vbC5nZXRWaWV3KCkuZ2V0UHJvamVjdGlvbigpLmdldENvZGUoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXQob2xGZWF0dXJlLCBvZmZzZXRYLCBvZmZzZXRZKTtcclxuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLnN0b3JlXHJcbiAgICAgICAgICAuYWxsKClcclxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRYID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WF8nKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRZID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WV8nKTtcclxuICAgICAgICB0aGlzLnN0b3JlLnVwZGF0ZShlbnRpdHkpO1xyXG4gICAgICAgIG9sRmVhdHVyZSA9IHRoaXMuc3RvcmUubGF5ZXIub2wuZ2V0U291cmNlKCkuZ2V0RmVhdHVyZXMoKS5maW5kKGYgPT4gZi5nZXRJZCgpID09PSBlbnRpdHkubWV0YS5pZCk7XHJcbiAgICAgICAgb2xGZWF0dXJlLnNldFByb3BlcnRpZXMoeyBvZmZzZXRYOiBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRYLCBvZmZzZXRZOiBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRZIH0pO1xyXG4gICAgICAgIG9sRmVhdHVyZS5jaGFuZ2VkKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmVsZW1lbnRTdHlsZShsYWJlbHNBcmVTaG93bik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkljb25DaGFuZ2UoZXZlbnQ/KSB7XHJcbiAgICB0aGlzLmljb24gPSBldmVudDtcclxuICAgIHRoaXMuZHJhd1N0eWxlU2VydmljZS5zZXRJY29uKHRoaXMuaWNvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRTdHlsZSh0cnVlLCB0aGlzLmljb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyBnZW9tZXRyeSB0eXBlXHJcbiAgICogQHBhcmFtIGdlb21ldHJ5VHlwZSB0aGUgZ2VvbWV0cnkgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlclxyXG4gICAqL1xyXG4gIG9uR2VvbWV0cnlUeXBlQ2hhbmdlKGdlb21ldHJ5VHlwZTogVHlwZSkge1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbC5zZXRHZW9tZXRyeVR5cGUoZ2VvbWV0cnlUeXBlKTtcclxuICAgIHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2Ygb2xGZWF0dXJlIGlucHV0dGVkXHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbGFiZWwgb2YgYSBnZW9tZXRyeSB3aGVuIGEgbGFiZWwgaXMgZW50ZXJlZCBpbiBhIGRpYWxvZyBib3hcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSB0aGUgZ2VvbWV0cnlcclxuICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVMYWJlbE9mT2xHZW9tZXRyeShvbEdlb21ldHJ5OiBPbEdlb21ldHJ5LCBsYWJlbDogc3RyaW5nKSB7XHJcbiAgICBvbEdlb21ldHJ5LnNldFByb3BlcnRpZXMoXHJcbiAgICAgIHtcclxuICAgICAgICBfbGFiZWw6IGxhYmVsXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvbnRTaXplQW5kU3R5bGUoXHJcbiAgICBvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PixcclxuICAgIGZvbnRTaXplOiBzdHJpbmcsXHJcbiAgICBmb250U3R5bGU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgb2xGZWF0dXJlLnNldFByb3BlcnRpZXMoXHJcbiAgICAgIHtcclxuICAgICAgICBmb250U3R5bGVfOiBgJHtmb250U2l6ZX1weCAke2ZvbnRTdHlsZX1gXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbGxBbmRTdHJva2VDb2xvcihcclxuICAgIG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LFxyXG4gICAgZmlsbENvbG9yOiBzdHJpbmcsXHJcbiAgICBzdHJva2VDb2xvcjogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyhcclxuICAgICAge1xyXG4gICAgICAgIGZpbGxDb2xvcl86IGZpbGxDb2xvcixcclxuICAgICAgICBzdHJva2VDb2xvcl86IHN0cm9rZUNvbG9yXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU9mZnNldChcclxuICAgIG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LFxyXG4gICAgb2Zmc2V0WDogbnVtYmVyLFxyXG4gICAgb2Zmc2V0WTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyhcclxuICAgICAge1xyXG4gICAgICAgIG9mZnNldFhfOiBvZmZzZXRYLFxyXG4gICAgICAgIG9mZnNldFlfOiBvZmZzZXRZXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayB0aGUgYW1vdW50IG9mIHJvd3MgYXMgYSBwb3NzaWJsZSBhbHRlcm5hdGl2ZVxyXG4gICAqL1xyXG4gIHVwZGF0ZUhlaWdodFRhYmxlKCkge1xyXG4gICAgdGhpcy5udW1iZXJPZkRyYXdpbmdzID0gdGhpcy5zdG9yZS5jb3VudCQuZ2V0VmFsdWUoKTtcclxuICAgIHRoaXMubnVtYmVyT2ZEcmF3aW5ncyA+IDEwID8gdGhpcy50YWJsZVRlbXBsYXRlLnRhYmxlSGVpZ2h0ID0gJzM1dmgnOiB0aGlzLnRhYmxlVGVtcGxhdGUudGFibGVIZWlnaHQgPSAnYXV0byc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmF0ZSB0aGUgY29ycmVjdCBjb250cm9sXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0b2dnbGVEcmF3Q29udHJvbCgpIHtcclxuICAgIHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XHJcbiAgICB0aGlzLmFjdGl2YXRlRHJhd0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSB0b29sdGlwcyBvZiBhbiBPTCBnZW9tZXRyeVxyXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9MIGdlb21ldHJ5IHdpdGggdG9vbHRpcHNcclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFyTGFiZWxzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpIHtcclxuICAgIGdldFRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpLmZvckVhY2goXHJcbiAgICAgIChvbFRvb2x0aXA6IE9sT3ZlcmxheSB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICAgIGlmIChvbFRvb2x0aXAgJiYgb2xUb29sdGlwLmdldE1hcCgpKSB7XHJcbiAgICAgICAgICB0aGlzLm1hcC5vbC5yZW1vdmVPdmVybGF5KG9sVG9vbHRpcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXBsYWNlIHRoZSBmZWF0dXJlIGluIHRoZSBzdG9yZVxyXG4gICAqIEBwYXJhbSBlbnRpdHkgdGhlIGVudGl0eSB0byByZXBsYWNlXHJcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgdGhlIG5ldyBnZW9tZXRyeSB0byBpbnNlcnQgaW4gdGhlIHN0b3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXBsYWNlRmVhdHVyZUluU3RvcmUoXHJcbiAgICBlbnRpdHksXHJcbiAgICBvbEdlb21ldHJ5OiBPbEdlb21ldHJ5LFxyXG4gICAgcmFkaXVzPzogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICB0aGlzLnN0b3JlLmRlbGV0ZShlbnRpdHkpO1xyXG4gICAgdGhpcy5vbkRyYXdFbmQob2xHZW9tZXRyeSwgcmFkaXVzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlYWN0aXZhdGUgdGhlIGFjdGl2ZSBkcmF3IGNvbnRyb2xcclxuICAgKi9cclxuICBwcml2YXRlIGRlYWN0aXZhdGVEcmF3Q29udHJvbCgpIHtcclxuICAgIGlmICghdGhpcy5kcmF3Q29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZHJhd0VuZCQkKSB7XHJcbiAgICAgIHRoaXMuZHJhd0VuZCQkLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kcmF3Q29udHJvbC5zZXRPbE1hcCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbElzQWN0aXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmF0ZSBhIGdpdmVuIGNvbnRyb2xcclxuICAgKi9cclxuICBwcml2YXRlIGFjdGl2YXRlRHJhd0NvbnRyb2woKSB7XHJcbiAgICB0aGlzLmRyYXdDb250cm9sSXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbElzQWN0aXZlID0gdHJ1ZTtcclxuICAgIHRoaXMuZHJhd0VuZCQkID0gdGhpcy5kcmF3Q29udHJvbC5lbmQkLnN1YnNjcmliZShcclxuICAgICAgKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnkpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5EcmF3RGlhbG9nKG9sR2VvbWV0cnksIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZHJhd0NvbnRyb2wubW9kaWZ5JC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnkpID0+IHtcclxuICAgICAgdGhpcy5vbk1vZGlmeURyYXcob2xHZW9tZXRyeSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZHJhd1NlbGVjdCQkKSB7XHJcbiAgICAgIHRoaXMuZHJhd1NlbGVjdCQkID0gdGhpcy5kcmF3Q29udHJvbC5zZWxlY3QkLnN1YnNjcmliZShcclxuICAgICAgICAob2xGZWF0dXJlOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT4pID0+IHtcclxuICAgICAgICAgIHRoaXMub3BlbkRyYXdEaWFsb2cob2xGZWF0dXJlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZHJhd0NvbnRyb2wuc2V0T2xNYXAodGhpcy5tYXAub2wsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVjcmVhdGVzIHRoZSBzdHlsZSBvZiB0aGUgZmVhdHVyZSBzdG9yZWRcclxuICAgKi9cclxuICBwcml2YXRlIGVsZW1lbnRTdHlsZShsYWJlbHNBcmVTaG93bjogYm9vbGVhbiwgaXNBbkljb24/KSB7XHJcbiAgICBpZiAoaXNBbkljb24pIHtcclxuICAgICAgdGhpcy5zdG9yZS5sYXllci5vbC5zZXRTdHlsZSgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuY3JlYXRlSW5kaXZpZHVhbEVsZW1lbnRTdHlsZShcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgbGFiZWxzQXJlU2hvd24sXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZm9udFN0eWxlJyksXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuZmlsbCxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5zdHJva2UsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnb2Zmc2V0WCcpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFknKSxcclxuICAgICAgICAgIHRoaXMuaWNvblxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdG9yZS5sYXllci5vbC5zZXRTdHlsZSgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuY3JlYXRlSW5kaXZpZHVhbEVsZW1lbnRTdHlsZShcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgbGFiZWxzQXJlU2hvd24sXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZm9udFN0eWxlJyksXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuZmlsbCxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5zdHJva2UsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnb2Zmc2V0WCcpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFknKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJnZW9tZXRyeS10eXBlLXRvZ2dsZSBtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwXHJcbiAgICAgIChjaGFuZ2UpPVwib25HZW9tZXRyeVR5cGVDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuUG9pbnRcIj5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuUG9pbnRcIj5cclxuICAgICAgICB7eydpZ28uZ2VvLmRyYXcuJyArIGdlb21ldHJ5VHlwZS5Qb2ludCB8IHRyYW5zbGF0ZX19XHJcbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcblxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImdlb21ldHJ5VHlwZS5MaW5lU3RyaW5nXCI+XHJcbiAgICAgICAge3snaWdvLmdlby5kcmF3LicgKyBnZW9tZXRyeVR5cGUuTGluZVN0cmluZyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcblxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImdlb21ldHJ5VHlwZS5Qb2x5Z29uXCI+XHJcbiAgICAgICAge3snaWdvLmdlby5kcmF3LicgKyBnZW9tZXRyeVR5cGUuUG9seWdvbiB8IHRyYW5zbGF0ZX19XHJcbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcblxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImdlb21ldHJ5VHlwZS5DaXJjbGVcIj5cclxuICAgICAgICB7eydpZ28uZ2VvLmRyYXcuJyArIGdlb21ldHJ5VHlwZS5DaXJjbGUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImRyYXctb3B0aW9ucyBtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgPG1hdC1zbGlkZS10b2dnbGVcclxuICAgICAgW2Rpc2FibGVkXT1cImRyYXdDb250cm9sSXNEaXNhYmxlZFwiXHJcbiAgICAgIFtjaGVja2VkXT1cImRyYXdDb250cm9sSXNBY3RpdmVcIlxyXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXHJcbiAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVEcmF3Q29udHJvbCgkZXZlbnQuY2hlY2tlZClcIj5cclxuICAgICAge3snaWdvLmdlby5zcGF0aWFsRmlsdGVyLmRyYXdDb250cm9sJyB8IHRyYW5zbGF0ZX19XHJcbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XHJcblxyXG4gICAgPG1hdC1zbGlkZS10b2dnbGVcclxuICAgICAgW2NoZWNrZWRdPVwibGFiZWxzQXJlU2hvd25cIlxyXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXHJcbiAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVMYWJlbHMoKVwiPlxyXG4gICAgICB7eydpZ28uZ2VvLmRyYXcudG9nZ2xlTWFwVG9vbHRpcHMnIHwgdHJhbnNsYXRlfX1cclxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJzdG9yZS5jb3VudCQuZ2V0VmFsdWUoKSA+IDBcIlxyXG4gICAgICBjbGFzcz1cImRlbGV0ZUJ0blwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxyXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZHJhdy5kZWxldGUnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgW2Rpc2FibGVkXT1cIihzZWxlY3RlZEZlYXR1cmVzJCB8IGFzeW5jKS5sZW5ndGggPT09IDBcIlxyXG4gICAgICAoY2xpY2spPVwiZGVsZXRlRHJhd2luZ3MoKVwiPlxyXG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiPjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2PlxyXG4gICAgICA8aWdvLWVudGl0eS10YWJsZVxyXG4gICAgICAgICN0YWJsZVxyXG4gICAgICAgIGNsYXNzPVwidGFibGUtY29tcGFjdFwiXHJcbiAgICAgICAgaWQ9XCJzdG9yZUVsZW1lbnRzXCJcclxuICAgICAgICBbc3RvcmVdPVwic3RvcmVcIlxyXG4gICAgICAgIFt0ZW1wbGF0ZV09XCJ0YWJsZVRlbXBsYXRlXCJcclxuICAgICAgICAoZGJsY2xpY2spPVwiZWRpdExhYmVsRHJhd2luZygpXCI+XHJcbiAgICAgIDwvaWdvLWVudGl0eS10YWJsZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaWNvbi1vcHRpb25zXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpY29ucy5sZW5ndGggPj0gMVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLmRyYXcuaWNvbicgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3Q+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpY29uXCIgY2xhc3M9XCJib3hcIj5cclxuICAgICAgICAgICAgPGltZyBzcmM9XCJ7eyBpY29uIH19XCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiIChjbGljayk9XCJvbkljb25DaGFuZ2UoKVwiPnt7ICdpZ28uZ2VvLmRyYXcubm9JY29uJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGljb25faHRtbCBvZiBpY29uc1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiaWNvbl9odG1sXCJcclxuICAgICAgICAgIChjbGljayk9XCJvbkljb25DaGFuZ2UoaWNvbl9odG1sKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxyXG4gICAgICAgICAgICA8aW1nIHNyYz1cInt7IGljb25faHRtbCB9fVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uXHJcbiAgICBtYXQtaWNvbi1idXR0b25cclxuICAgIGNvbG9yPVwiYWNjZW50XCJcclxuICAgIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCJcclxuICAgIChjbGljayk9XCJvcGVuU2hvcmN1dHNEaWFsb2coKVwiPlxyXG4gICAgPG1hdC1pY29uXHJcbiAgICAgIGNsYXNzPVwic2hvcnRjdXRzLWljb25cIlxyXG4gICAgICBzdmdJY29uPVwia2V5Ym9hcmQtb3V0bGluZVwiXHJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXHJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kcmF3LnNob3J0Y3V0cycgfCB0cmFuc2xhdGVcIj5cclxuICAgIDwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDxidXR0b25cclxuICAgICpuZ0lmPVwic2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoXCJcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgKGNsaWNrKT1cIm9wZW5TdHlsZU1vZGFsRGlhbG9nKClcIlxyXG4gICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIuc3R5bGUuc3R5bGVNb2RhbFRvb2x0aXAnIHwgdHJhbnNsYXRlXCI+XHJcbiAgICB7eydpZ28uZ2VvLmxheWVyLnN0eWxlLnN0eWxlTW9kYWwnIHwgdHJhbnNsYXRlfX1cclxuICAgIDxtYXQtaWNvblxyXG4gICAgICBjbGFzcz1cInN0eWxlLWljb25cIlxyXG4gICAgICBzdmdJY29uPVwicGFsZXR0ZVwiXHJcbiAgICAgIFttYXRCYWRnZV09XCJzZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGhcIlxyXG4gICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXHJcbiAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiPlxyXG4gICAgPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcbiJdfQ==
1069
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCx1QkFBdUIsRUFDdkIsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLE9BQU8sRUFDUCxZQUFZLEVBQ1osNkJBQTZCLEVBQzdCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFDYiwyQkFBMkIsRUFDM0IsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFJckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQU1sRSxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFcEMsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFJMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxP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QUM7eUJBQ1gsQ0FBQyxDQUNIO3dCQUNELFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNyRCxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztxQkFDdEQsQ0FBQztpQkFDSCxtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTTt3TEEyQnRDLEdBQUc7a0JBQVgsS0FBSztZQUdGLE1BQU07a0JBRFQsS0FBSztZQVVGLFlBQVk7a0JBRGYsS0FBSztZQVVGLGtCQUFrQjtrQkFEckIsS0FBSztZQVNJLGlCQUFpQjtrQkFBMUIsTUFBTTtZQUNHLGlCQUFpQjtrQkFBMUIsTUFBTTtZQUNHLGFBQWE7a0JBQXRCLE1BQU07WUFFRyxTQUFTO2tCQUFsQixNQUFNO1lBQ0csV0FBVztrQkFBcEIsTUFBTTtZQUNHLFdBQVc7a0JBQXBCLE1BQU07WUFFRyxRQUFRO2tCQUFqQixNQUFNO1lBQ0csU0FBUztrQkFBbEIsTUFBTTtZQTJCcUIsTUFBTTtrQkFBakMsU0FBUzttQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICBGRUFUVVJFLFxuICBGZWF0dXJlU3RvcmUsXG4gIEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5LFxuICB0cnlCaW5kU3RvcmVMYXllcixcbiAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5LFxuICB0cnlBZGRTZWxlY3Rpb25TdHJhdGVneSxcbiAgRmVhdHVyZU1vdGlvbixcbiAgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5LFxuICBmZWF0dXJlVG9PbFxufSBmcm9tICcuLi8uLi9mZWF0dXJlJztcblxuaW1wb3J0IHsgTGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRm9udFR5cGUsIEdlb21ldHJ5VHlwZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LmVudW0nO1xuaW1wb3J0IHsgSWdvTWFwIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZC9tYXAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERyYXcsIEZlYXR1cmVXaXRoRHJhdyB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LmludGVyZmFjZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBWZWN0b3JTb3VyY2VFdmVudCBhcyBPbFZlY3RvclNvdXJjZUV2ZW50IH0gZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgeyBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvdmVjdG9yLWxheWVyJztcbmltcG9ydCB7IEZlYXR1cmVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvZmVhdHVyZS1kYXRhc291cmNlJztcbmltcG9ydCB7IERyYXdDb250cm9sIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvc2hhcmVkL2NvbnRyb2xzL2RyYXcnO1xuaW1wb3J0IHtcbiAgRW50aXR5UmVjb3JkLFxuICBFbnRpdHlUYWJsZVRlbXBsYXRlXG59IGZyb20gJ0BpZ28yL2NvbW1vbic7XG5cbmltcG9ydCAqIGFzIE9sU3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xuaW1wb3J0IE9sVmVjdG9yU291cmNlIGZyb20gJ29sL3NvdXJjZS9WZWN0b3InO1xuaW1wb3J0IE9sQ2lyY2xlIGZyb20gJ29sL2dlb20vQ2lyY2xlJztcbmltcG9ydCBPbFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xuaW1wb3J0IE9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCBPbEdlb0pTT04gZnJvbSAnb2wvZm9ybWF0L0dlb0pTT04nO1xuaW1wb3J0IE9sT3ZlcmxheSBmcm9tICdvbC9PdmVybGF5JztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5IH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5pbXBvcnQgeyBnZXREaXN0YW5jZSB9IGZyb20gJ29sL3NwaGVyZSc7XG5pbXBvcnQgeyBEcmF3U3R5bGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2RyYXctc3R5bGUuc2VydmljZSc7XG5pbXBvcnQgeyBmaXJzdCwgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERyYXdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vZHJhdy1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJhd1Nob3JjdXRzQ29tcG9uZW50IH0gZnJvbSAnLi9kcmF3LXNob3JjdXRzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRUb29sdGlwc09mT2xHZW9tZXRyeSB9IGZyb20gJy4uLy4uL21lYXN1cmUvc2hhcmVkL21lYXN1cmUudXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlSW50ZXJhY3Rpb25TdHlsZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LnV0aWxzJztcbmltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gJ29sL3Byb2onO1xuaW1wb3J0IHsgRHJhd0ljb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2RyYXctaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFN0eWxlTW9kYWxDb21wb25lbnQsIFN0eWxlTW9kYWxEYXRhIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc3R5bGUtbW9kYWwvc3R5bGUtbW9kYWwuY29tcG9uZW50JztcblxuaW1wb3J0IHtcbiAgdHJpZ2dlcixcbiAgc3RhdGUsXG4gIHN0eWxlLFxuICBhbmltYXRlLFxuICB0cmFuc2l0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xuXG5pbXBvcnQgeyBEcmF3TGF5ZXJQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vZHJhdy1sYXllci1wb3B1cC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tZHJhdycsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdvcGVuQ2xvc2UnLCBbXG4gICAgICBzdGF0ZShcbiAgICAgICAgJ29wZW4nLFxuICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHN0YXRlKFxuICAgICAgICAnY2xvc2VkJyxcbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICB0cmFuc2l0aW9uKCdvcGVuID0+IGNsb3NlZCcsIFthbmltYXRlKCc2MDBtcyBlYXNlJyldKSxcbiAgICAgIHRyYW5zaXRpb24oJ2Nsb3NlZCA9PiBvcGVuJywgW2FuaW1hdGUoJzgwMG1zIGVhc2UnKV0pXG4gICAgXSlcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2RyYXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kcmF3LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIERyYXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUYWJsZSB0ZW1wbGF0ZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyB0YWJsZVRlbXBsYXRlOiBFbnRpdHlUYWJsZVRlbXBsYXRlID0ge1xuICAgIHNlbGVjdGlvbjogdHJ1ZSxcbiAgICBzZWxlY3RNYW55OiB0cnVlLFxuICAgIHNlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxuICAgIHNvcnQ6IHRydWUsXG4gICAgZml4ZWRIZWFkZXI6IHRydWUsXG4gICAgdGFibGVIZWlnaHQ6ICdhdXRvJyxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdEcmF3aW5nJyxcbiAgICAgICAgdGl0bGU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcubGFiZWxzJyksXG4gICAgICAgIHRvb2x0aXA6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcuY2hhbmdlTGFiZWwnKSxcbiAgICAgICAgdmFsdWVBY2Nlc3NvcjogKGZlYXR1cmU6IEZlYXR1cmVXaXRoRHJhdykgPT4ge1xuICAgICAgICAgIHJldHVybiBmZWF0dXJlLnByb3BlcnRpZXMuZHJhdztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cbiAgfTtcblxuICBwdWJsaWMgZ2VvbWV0cnlUeXBlID0gR2VvbWV0cnlUeXBlOyAvLyBSZWZlcmVuY2UgdG8gdGhlIEdlb21ldHJ5VHlwZSBlbnVtXG4gIEBJbnB1dCgpIG1hcDogSWdvTWFwOyAvLyBNYXAgdG8gZHJhdyBvblxuXG4gIEBJbnB1dCgpXG4gIGdldCBzdG9yZXMoKTogRmVhdHVyZVN0b3JlPEZlYXR1cmVXaXRoRHJhdz5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlcztcbiAgfVxuICBzZXQgc3RvcmVzKHZhbHVlOiBGZWF0dXJlU3RvcmU8RmVhdHVyZVdpdGhEcmF3PltdKSB7XG4gICAgdGhpcy5fc3RvcmVzID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfc3RvcmVzOkZlYXR1cmVTdG9yZTxGZWF0dXJlV2l0aERyYXc+W10gPSBbXTtcblxuICBASW5wdXQoKVxuICBnZXQgZHJhd0NvbnRyb2xzKCk6IFtzdHJpbmcsIERyYXdDb250cm9sXVtde1xuICAgIHJldHVybiB0aGlzLl9kcmF3Q29udHJvbHM7XG4gIH1cbiAgc2V0IGRyYXdDb250cm9scyh2YWx1ZTogW3N0cmluZywgRHJhd0NvbnRyb2xdW10pe1xuICAgIHRoaXMuX2RyYXdDb250cm9scyA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2RyYXdDb250cm9scyA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVEcmF3aW5nTGF5ZXIoKTogVmVjdG9yTGF5ZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEcmF3aW5nTGF5ZXI7XG4gIH1cbiAgc2V0IGFjdGl2ZURyYXdpbmdMYXllcih2YWx1ZTogVmVjdG9yTGF5ZXIpIHtcbiAgICB0aGlzLl9hY3RpdmVEcmF3aW5nTGF5ZXIgPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9hY3RpdmVEcmF3aW5nTGF5ZXI6IFZlY3RvckxheWVyO1xuXG4gIEBPdXRwdXQoKSBhY3RpdmVMYXllckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VmVjdG9yTGF5ZXI+KCk7XG4gIEBPdXRwdXQoKSBkcmF3Q29udHJvbHNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8W3N0cmluZywgRHJhd0NvbnRyb2xdW10+KCk7XG4gIEBPdXRwdXQoKSBsYXllcnNJREV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpIGZpbGxDb2xvcjogc3RyaW5nO1xuICBAT3V0cHV0KCkgc3Ryb2tlQ29sb3I6IHN0cmluZztcbiAgQE91dHB1dCgpIHN0cm9rZVdpZHRoOiBudW1iZXI7XG5cbiAgQE91dHB1dCgpIGZvbnRTaXplOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBmb250U3R5bGU6IHN0cmluZztcblxuICBwdWJsaWMgYWN0aXZlU3RvcmU6IEZlYXR1cmVTdG9yZTxGZWF0dXJlV2l0aERyYXc+O1xuICBwcml2YXRlIGxheWVyQ291bnRlcklEOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZHJhdyQ6IEJlaGF2aW9yU3ViamVjdDxEcmF3PiA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pOyAvLyBPYnNlcnZhYmxlIG9mIGRyYXdcbiAgcHJpdmF0ZSBhY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UgPSBuZXcgT2xWZWN0b3JTb3VyY2UoKTtcbiAgcHJpdmF0ZSBhY3RpdmVEcmF3Q29udHJvbDogRHJhd0NvbnRyb2w7XG4gIHByaXZhdGUgZHJhd0VuZCQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZHJhd1NlbGVjdCQkOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBzZWxlY3RlZEZlYXR1cmVzJDogQmVoYXZpb3JTdWJqZWN0PEZlYXR1cmVXaXRoRHJhd1tdPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIHB1YmxpYyBmaWxsRm9ybTogc3RyaW5nO1xuICBwdWJsaWMgc3Ryb2tlRm9ybTogc3RyaW5nO1xuICBwdWJsaWMgZHJhd0NvbnRyb2xJc0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGRyYXdDb250cm9sSXNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGxhYmVsc0FyZVNob3duOiBib29sZWFuO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMkJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwdWJsaWMgcG9zaXRpb246IHN0cmluZyA9ICdib3R0b20nO1xuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHVibGljIGljb25zOiBBcnJheTxzdHJpbmc+O1xuICBwdWJsaWMgaWNvbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgbnVtYmVyT2ZEcmF3aW5nczogbnVtYmVyO1xuICBwdWJsaWMgaXNDcmVhdGluZ05ld0xheWVyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgY3Vyckdlb21ldHJ5VHlwZSA9IHRoaXMuZ2VvbWV0cnlUeXBlLlBvaW50IGFzIGFueTtcblxuICBAVmlld0NoaWxkKCdzZWxlY3RlZExheWVyJykgc2VsZWN0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgZHJhd1N0eWxlU2VydmljZTogRHJhd1N0eWxlU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgZHJhd0ljb25TZXJ2aWNlOiBEcmF3SWNvblNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5idWlsZEZvcm0oKTtcbiAgICB0aGlzLmZpbGxDb2xvciA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRGaWxsQ29sb3IoKTtcbiAgICB0aGlzLnN0cm9rZUNvbG9yID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldFN0cm9rZUNvbG9yKCk7XG4gICAgdGhpcy5zdHJva2VXaWR0aCA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRTdHJva2VXaWR0aCgpO1xuICAgIHRoaXMubGFiZWxzQXJlU2hvd24gPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0TGFiZWxzQXJlU2hvd24oKTtcbiAgICB0aGlzLmljb25zID0gdGhpcy5kcmF3SWNvblNlcnZpY2UuZ2V0SWNvbnMoKTtcbiAgICB0aGlzLmljb24gPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0SWNvbigpO1xuXG4gICAgdGhpcy5mb250U2l6ZSA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRGb250U2l6ZSgpO1xuICAgIHRoaXMuZm9udFN0eWxlID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldEZvbnRTdHlsZSgpO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RvcmUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGVudGl0aWVzIGFuZCBjcmVhdGUgdGhlIERyYXcgY29udHJvbFxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuc3RvcmVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5hY3RpdmVTdG9yZSA9IG5ldyBGZWF0dXJlU3RvcmU8RmVhdHVyZVdpdGhEcmF3PihbXSwge1xuICAgICAgICBtYXA6IHRoaXMubWFwXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW5pdFN0b3JlKCk7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sID0gdGhpcy5jcmVhdGVEcmF3Q29udHJvbChcbiAgICAgICAgdGhpcy5maWxsQ29sb3IsXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IsXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGhcbiAgICAgICk7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sLnNldEdlb21ldHJ5VHlwZSh0aGlzLmdlb21ldHJ5VHlwZS5Qb2ludCBhcyBhbnkpO1xuICAgICAgdGhpcy50b2dnbGVEcmF3Q29udHJvbCgpO1xuICAgICAgdGhpcy5zdG9yZXMucHVzaCh0aGlzLmFjdGl2ZVN0b3JlKTtcbiAgICAgIHRoaXMuZHJhd0NvbnRyb2xzLnB1c2goW3RoaXMuYWN0aXZlRHJhd2luZ0xheWVyLmlkLCB0aGlzLmFjdGl2ZURyYXdDb250cm9sXSk7XG4gICAgICB0aGlzLmRyYXdDb250cm9sc0V2ZW50LmVtaXQodGhpcy5kcmF3Q29udHJvbHMpO1xuICAgICAgdGhpcy5sYXllcnNJREV2ZW50LmVtaXQodGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIuaWQpO1xuICAgICAgdGhpcy5vbkxheWVyQ2hhbmdlKHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVTdG9yZSA9IHRoaXMuc3RvcmVzLmZpbmQoc3RvcmUgPT4gc3RvcmUubGF5ZXIuaWQgPT09IHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLmlkKTtcbiAgICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wgPSB0aGlzLmRyYXdDb250cm9scy5maW5kKGRjID0+IGRjWzBdID09PSB0aGlzLmFjdGl2ZURyYXdpbmdMYXllci5pZClbMV07XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcmF3Q29udHJvbCgpO1xuICAgICAgdGhpcy5hbGxMYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICAgIGlmIChsYXllci5pZCAhPT0gdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIuaWQpIHtcbiAgICAgICAgICBsYXllci5vcGFjaXR5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RvcmUgPSB0aGlzLnN0b3Jlcy5maW5kKHMgPT4gcy5sYXllci5pZCA9PT0gbGF5ZXIuaWQpO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2goXG4gICAgICAgICAgc3RvcmUuc3RhdGVWaWV3XG4gICAgICAgICAgICAubWFueUJ5JCgocmVjb3JkOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhEcmF3PikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBmaXJzdCgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhEcmF3PltdKSA9PiB7XG4gICAgICAgICAgICAgIHJlY29yZHMuZm9yRWFjaCgocmVjb3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVjb3JkLnN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMkJC5wdXNoKFxuICAgICAgICAgIHN0b3JlLnN0YXRlVmlld1xuICAgICAgICAgICAgLm1hbnlCeSQoKHJlY29yZDogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoRHJhdz4pID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5zZWxlY3RlZCA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc2tpcCgxKSAvLyBTa2lwIGluaXRpYWwgZW1pc3Npb25cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlY29yZHM6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aERyYXc+W10pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC5uZXh0KHJlY29yZHMubWFwKChyZWNvcmQpID0+IHJlY29yZC5lbnRpdHkpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zJCQucHVzaChcbiAgICAgICAgICBzdG9yZS5jb3VudCQuc3Vic2NyaWJlKChjbnQpID0+IHtcbiAgICAgICAgICAgIGNudCA+PSAxXG4gICAgICAgICAgICAgID8gKHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub3B0aW9ucy5zaG93SW5MYXllckxpc3QgPSB0cnVlKVxuICAgICAgICAgICAgICA6ICh0aGlzLmFjdGl2ZVN0b3JlLmxheWVyLm9wdGlvbnMuc2hvd0luTGF5ZXJMaXN0ID0gZmFsc2UpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub25MYXllckNoYW5nZSh0aGlzLmFjdGl2ZURyYXdpbmdMYXllcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZHJhd2luZyBsYXllciBhbmQgdGhlIGludGVyYWN0aW9uc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuYWxsTGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4gbGF5ZXIub3BhY2l0eSA9IDEpO1xuICAgIHRoaXMuYWN0aXZlU3RvcmUuc3RhdGUudXBkYXRlQWxsKHtzZWxlY3RlZDogZmFsc2V9KTtcbiAgICB0aGlzLmRlYWN0aXZhdGVEcmF3Q29udHJvbCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLm1hcCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEcmF3IENvbnRyb2xcbiAgICogQHBhcmFtIGZpbGxDb2xvciB0aGUgZmlsbCBjb2xvclxuICAgKiBAcGFyYW0gc3Ryb2tlQ29sb3IgdGhlIHN0cm9rZSBjb2xvclxuICAgKiBAcGFyYW0gc3Ryb2tlV2lkdGggdGhlIHN0cm9rZSB3aWR0aFxuICAgKiBAcmV0dXJucyBhIERyYXcgQ29udHJvbFxuICAgKi9cbiAgY3JlYXRlRHJhd0NvbnRyb2woXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIHN0cm9rZUNvbG9yPzogc3RyaW5nLFxuICAgIHN0cm9rZVdpZHRoPzogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGFjdGl2ZURyYXdDb250cm9sID0gbmV3IERyYXdDb250cm9sKHtcbiAgICAgIGdlb21ldHJ5VHlwZTogdW5kZWZpbmVkLFxuICAgICAgZHJhd2luZ0xheWVyU291cmNlOiB0aGlzLmFjdGl2ZURyYXdpbmdMYXllclNvdXJjZSxcbiAgICAgIGRyYXdpbmdMYXllclN0eWxlOiBuZXcgT2xTdHlsZS5TdHlsZSh7fSksXG4gICAgICBpbnRlcmFjdGlvblN0eWxlOiBjcmVhdGVJbnRlcmFjdGlvblN0eWxlKFxuICAgICAgICBmaWxsQ29sb3IsXG4gICAgICAgIHN0cm9rZUNvbG9yLFxuICAgICAgICBzdHJva2VXaWR0aFxuICAgICAgKVxuICAgIH0pO1xuICAgIHJldHVybiBhY3RpdmVEcmF3Q29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBpbml0aWFsaXphdGlvbiwgaW5jbHVkaW5nIGRyYXdpbmcgbGF5ZXIgY3JlYXRpb25cbiAgICovXG5cbiAgcHJpdmF0ZSBpbml0U3RvcmUobmV3VGl0bGU/OiBzdHJpbmcsIGlzTmV3TGF5ZXI/OiBib29sZWFuKSB7XG4gICAgdGhpcy5jcmVhdGVMYXllcihuZXdUaXRsZSwgaXNOZXdMYXllcik7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zJCQucHVzaChcbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUuc3RhdGVWaWV3XG4gICAgICAgIC5tYW55QnkkKChyZWNvcmQ6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aERyYXc+KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5zZWxlY3RlZCA9PT0gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc2tpcCgxKSAvLyBTa2lwIGluaXRpYWwgZW1pc3Npb25cbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhEcmF3PltdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC5uZXh0KHJlY29yZHMubWFwKChyZWNvcmQpID0+IHJlY29yZC5lbnRpdHkpKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zJCQucHVzaChcbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUuY291bnQkLnN1YnNjcmliZSgoY250KSA9PiB7XG4gICAgICAgIGNudCA+PSAxXG4gICAgICAgICAgPyAodGhpcy5hY3RpdmVTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IHRydWUpXG4gICAgICAgICAgOiAodGhpcy5hY3RpdmVTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4vKipcbiAqIE9wZW4gdGhlIHN0eWxlIG1vZGFsIGRpYWxvZyBib3hcbiAqL1xuICBvcGVuU3R5bGVNb2RhbERpYWxvZygpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIG9wZW4gdGhlIGRpYWxvZyBib3ggdXNlZCB0byBzdHlsZSBmZWF0dXJlc1xuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTdHlsZU1vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBmZWF0dXJlczogdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC5nZXRWYWx1ZSgpLFxuICAgICAgICAgIGljb25zOiB0aGlzLmljb25zLFxuICAgICAgICAgIGljb246IHRoaXMuaWNvblxuICAgICAgICB9LFxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgLy8gd2hlbiBkaWFsb2cgYm94IGlzIGNsb3NlZCwgZ2V0IGxhYmVsIGFuZCBzZXQgaXQgdG8gZ2VvbWV0cnlcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoZGF0YTogU3R5bGVNb2RhbERhdGEpID0+IHtcbiAgICAgICAgLy8gY2hlY2tzIGlmIHRoZSB1c2VyIGNsaWNrZWQgb2tcbiAgICAgICAgaWYgKGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtRmxhZykge1xuICAgICAgICAgIHRoaXMub25Gb250Q2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIGRhdGEuZm9udFNpemUsIGRhdGEuZm9udFN0eWxlKTtcbiAgICAgICAgICB0aGlzLm9uQ29sb3JDaGFuZ2UodGhpcy5sYWJlbHNBcmVTaG93biwgdGhpcy5pY29uID8gdHJ1ZSA6IGZhbHNlLCBkYXRhLmZpbGxDb2xvciwgZGF0YS5zdHJva2VDb2xvcik7XG4gICAgICAgICAgdGhpcy5vbk9mZnNldExhYmVsQ2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIGRhdGEub2Zmc2V0WCwgZGF0YS5vZmZzZXRZKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMjUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZGlhbG9nIGJveCB0byBlbnRlciBsYWJlbCBhbmQgZG8gc29tZXRoaW5nXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IGdlb21ldHJ5IGF0IGRyYXcgZW5kIG9yIHNlbGVjdGVkIGdlb21ldHJ5XG4gICAqIEBwYXJhbSBkcmF3RW5kIGV2ZW50IGZpcmVkIGF0IGRyYXdFbmQ/XG4gICAqL1xuICBwcml2YXRlIG9wZW5EcmF3RGlhbG9nKG9sR2VvbWV0cnksIGlzRHJhd0VuZDogYm9vbGVhbikge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gb3BlbiB0aGUgZGlhbG9nIGJveCB1c2VkIHRvIGVudGVyIGxhYmVsXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERyYXdQb3B1cENvbXBvbmVudCwge1xuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICBkYXRhOiB7IGN1cnJlbnRMYWJlbDogb2xHZW9tZXRyeS5nZXQoJ2RyYXcnKSB9XG4gICAgICB9KTtcblxuICAgICAgLy8gd2hlbiBkaWFsb2cgYm94IGlzIGNsb3NlZCwgZ2V0IGxhYmVsIGFuZCBzZXQgaXQgdG8gZ2VvbWV0cnlcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBjaGVja3MgaWYgdGhlIHVzZXIgY2xpY2tlZCBva1xuICAgICAgICBpZiAoZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbmZpcm1GbGFnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVMYWJlbE9mT2xHZW9tZXRyeShvbEdlb21ldHJ5LCBsYWJlbCk7XG4gICAgICAgICAgaWYgKCFvbEdlb21ldHJ5LnZhbHVlc18uZm9udFN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvbnRTaXplQW5kU3R5bGUob2xHZW9tZXRyeSwgJzIwJywgRm9udFR5cGUuQXJpYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW9sR2VvbWV0cnkudmFsdWVzXy5kcmF3aW5nU3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKFxuICAgICAgICAgICAgICBvbEdlb21ldHJ5LFxuICAgICAgICAgICAgICAncmdiYSgyNTUsMjU1LDI1NSwwLjQpJyxcbiAgICAgICAgICAgICAgJ3JnYmEoMTQzLDcsNywxKSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKG9sR2VvbWV0cnkudmFsdWVzXy5vZmZzZXRYIHx8IG9sR2VvbWV0cnkudmFsdWVzXy5vZmZzZXRZKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVPZmZzZXQoXG4gICAgICAgICAgICAgIG9sR2VvbWV0cnksXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIG9sR2VvbWV0cnkgaW5zdGFuY2VvZiBQb2ludCA/IC0xNSA6IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgZXZlbnQgd2FzIGZpcmVkIGF0IGRyYXcgZW5kXG4gICAgICAgICAgaWYgKGlzRHJhd0VuZCkge1xuICAgICAgICAgICAgdGhpcy5vbkRyYXdFbmQob2xHZW9tZXRyeSk7XG4gICAgICAgICAgICAvLyBpZiBldmVudCB3YXMgZmlyZWQgYXQgc2VsZWN0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3REcmF3KG9sR2VvbWV0cnksIGxhYmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVIZWlnaHRUYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlbGV0ZXMgdGhlIGZlYXR1cmVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2VcbiAgICAgICAgICAgIC5nZXRGZWF0dXJlcygpXG4gICAgICAgICAgICAuZm9yRWFjaCgoZHJhd2luZ0xheWVyRmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IGRyYXdpbmdMYXllckZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XG4gICAgICAgICAgICAgIGlmIChvbEdlb21ldHJ5ID09PSBnZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyU291cmNlLnJlbW92ZUZlYXR1cmUoXG4gICAgICAgICAgICAgICAgICBkcmF3aW5nTGF5ZXJGZWF0dXJlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDI1MCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGRyYXcgc291cmNlIGFuZCB0cmFjayB0aGUgZ2VvbWV0cnkgYmVpbmcgZHJhd1xuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cbiAgICovXG4gIHByaXZhdGUgb25EcmF3RW5kKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnksIHJhZGl1cz86IG51bWJlcikge1xuICAgIHRoaXMuYWRkRmVhdHVyZVRvU3RvcmUob2xHZW9tZXRyeSwgcmFkaXVzKTtcbiAgICB0aGlzLmNsZWFyTGFiZWxzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xuICAgIHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub2wuZ2V0U291cmNlKCkucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1vZGlmeURyYXcob2xHZW9tZXRyeSkge1xuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5hY3RpdmVTdG9yZS5hbGwoKTtcblxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5SWQgPSBlbnRpdHkucHJvcGVydGllcy5pZDtcblxuICAgICAgY29uc3Qgb2xHZW9tZXRyeUlkID0gb2xHZW9tZXRyeS5vbF91aWQ7XG5cbiAgICAgIGlmIChlbnRpdHlJZCA9PT0gb2xHZW9tZXRyeUlkKSB7XG4gICAgICAgIHRoaXMudXBkYXRlTGFiZWxPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgZW50aXR5LnByb3BlcnRpZXMuZHJhdyk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShcbiAgICAgICAgICBvbEdlb21ldHJ5LFxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5zcGxpdCgnICcpWzBdLnJlcGxhY2UoJ3B4JywgJycpLFxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5mb250U3R5bGUuaW5kZXhPZignICcpICsgMVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWxsQW5kU3Ryb2tlQ29sb3IoXG4gICAgICAgICAgb2xHZW9tZXRyeSxcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5kcmF3aW5nU3R5bGUuZmlsbCxcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5kcmF3aW5nU3R5bGUuc3Ryb2tlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KFxuICAgICAgICAgIG9sR2VvbWV0cnksXG4gICAgICAgICAgZW50aXR5LnByb3BlcnRpZXMub2Zmc2V0WCxcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRZXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVwbGFjZUZlYXR1cmVJblN0b3JlKGVudGl0eSwgb2xHZW9tZXRyeSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uU2VsZWN0RHJhdyhvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PiwgbGFiZWw6IHN0cmluZykge1xuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5hY3RpdmVTdG9yZS5hbGwoKTtcblxuICAgIGNvbnN0IG9sR2VvbWV0cnkgPSBvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XG4gICAgb2xHZW9tZXRyeS5vbF91aWQgPSBvbEZlYXR1cmUuZ2V0KCdpZCcpO1xuXG4gICAgY29uc3Qgb2xHZW9tZXRyeUNvb3JkaW5hdGVzID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICBvbEdlb21ldHJ5LmdldENvb3JkaW5hdGVzKClbMF1cbiAgICApO1xuXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlDb29yZGluYXRlcyA9IEpTT04uc3RyaW5naWZ5KGVudGl0eS5nZW9tZXRyeS5jb29yZGluYXRlc1swXSk7XG4gICAgICBpZiAob2xHZW9tZXRyeUNvb3JkaW5hdGVzID09PSBlbnRpdHlDb29yZGluYXRlcykge1xuICAgICAgICBjb25zdCBmb250U2l6ZSA9IG9sRmVhdHVyZVxuICAgICAgICAgIC5nZXQoJ2ZvbnRTdHlsZScpXG4gICAgICAgICAgLnNwbGl0KCcgJylbMF1cbiAgICAgICAgICAucmVwbGFjZSgncHgnLCAnJyk7XG4gICAgICAgIGNvbnN0IGZvbnRTdHlsZSA9IG9sRmVhdHVyZVxuICAgICAgICAgIC5nZXQoJ2ZvbnRTdHlsZScpXG4gICAgICAgICAgLnN1YnN0cmluZyhvbEZlYXR1cmUuZ2V0KCdmb250U3R5bGUnKS5pbmRleE9mKCcgJykgKyAxKTtcblxuICAgICAgICBjb25zdCBmaWxsQ29sb3IgPSBvbEZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5maWxsO1xuICAgICAgICBjb25zdCBzdHJva2VDb2xvciA9IG9sRmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLnN0cm9rZTtcblxuICAgICAgICBjb25zdCBvZmZzZXRYID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WCcpO1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WScpO1xuXG4gICAgICAgIGNvbnN0IHJhZDogbnVtYmVyID0gZW50aXR5LnByb3BlcnRpZXMucmFkXG4gICAgICAgICAgPyBlbnRpdHkucHJvcGVydGllcy5yYWRcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy51cGRhdGVMYWJlbE9mT2xHZW9tZXRyeShvbEdlb21ldHJ5LCBsYWJlbCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEdlb21ldHJ5LCBmb250U2l6ZSwgZm9udFN0eWxlKTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWxsQW5kU3Ryb2tlQ29sb3Iob2xHZW9tZXRyeSwgZmlsbENvbG9yLCBzdHJva2VDb2xvcik7XG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KG9sR2VvbWV0cnksIG9mZnNldFgsIG9mZnNldFkpO1xuICAgICAgICB0aGlzLnJlcGxhY2VGZWF0dXJlSW5TdG9yZShlbnRpdHksIG9sR2VvbWV0cnksIHJhZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZmVhdHVyZSB3aXRoIGRyYXcgbGFiZWwgdG8gdGhlIHN0b3JlLiBUaGUgbG9hZGluZyBzdHJhZ2VneSBvZiB0aGUgc3RvcmVcbiAgICogd2lsbCB0cmlnZ2VyIGFuZCBhZGQgdGhlIGZlYXR1cmUgdG8gdGhlIG1hcC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIGFkZEZlYXR1cmVUb1N0b3JlKFxuICAgIG9sR2VvbWV0cnksXG4gICAgcmFkaXVzPzogbnVtYmVyLFxuICAgIGZlYXR1cmU/OiBGZWF0dXJlV2l0aERyYXdcbiAgKSB7XG4gICAgbGV0IHJhZDogbnVtYmVyO1xuICAgIGxldCBjZW50ZXI0MzI2OiBBcnJheTxudW1iZXI+O1xuICAgIGxldCBwb2ludDQzMjY6IEFycmF5PG51bWJlcj47XG4gICAgbGV0IGxvbjQzMjY6IG51bWJlcjtcbiAgICBsZXQgbGF0NDMyNjogbnVtYmVyO1xuICAgIGNvbnN0IGZlYXR1cmVJZCA9IGZlYXR1cmUgPyBmZWF0dXJlLnByb3BlcnRpZXMuaWQgOiBvbEdlb21ldHJ5Lm9sX3VpZDtcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKTtcblxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3Qob2xHZW9tZXRyeSwge1xuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHByb2plY3Rpb24sXG4gICAgICBkYXRhUHJvamVjdGlvbjogcHJvamVjdGlvblxuICAgIH0pIGFzIGFueTtcblxuICAgIGlmIChvbEdlb21ldHJ5IGluc3RhbmNlb2YgT2xDaXJjbGUgfHwgcmFkaXVzKSB7XG4gICAgICBpZiAocmFkaXVzKSB7XG4gICAgICAgIHJhZCA9IHJhZGl1cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnUG9pbnQnO1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IG9sR2VvbWV0cnkuZ2V0Q2VudGVyKCk7XG4gICAgICAgIGNvbnN0IGV4dGVudDQzMjYgPSB0cmFuc2Zvcm0oXG4gICAgICAgICAgW1xuICAgICAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKVsyXSxcbiAgICAgICAgICAgIG9sR2VvbWV0cnkuZ2V0RmxhdENvb3JkaW5hdGVzKClbM11cbiAgICAgICAgICBdLFxuICAgICAgICAgIHByb2plY3Rpb24sXG4gICAgICAgICAgJ0VQU0c6NDMyNidcbiAgICAgICAgKTtcbiAgICAgICAgY2VudGVyNDMyNiA9IHRyYW5zZm9ybShcbiAgICAgICAgICBbXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzBdLFxuICAgICAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKVsxXVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvamVjdGlvbixcbiAgICAgICAgICAnRVBTRzo0MzI2J1xuICAgICAgICApO1xuICAgICAgICBsb240MzI2ID0gY2VudGVyNDMyNlswXTtcbiAgICAgICAgbGF0NDMyNiA9IGNlbnRlcjQzMjZbMV07XG4gICAgICAgIHJhZCA9IGdldERpc3RhbmNlKGNlbnRlcjQzMjYsIGV4dGVudDQzMjYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbEdlb21ldHJ5IGluc3RhbmNlb2YgT2xQb2ludCkge1xuICAgICAgcG9pbnQ0MzI2ID0gdHJhbnNmb3JtKFxuICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpLFxuICAgICAgICBwcm9qZWN0aW9uLFxuICAgICAgICAnRVBTRzo0MzI2J1xuICAgICAgKTtcbiAgICAgIGxvbjQzMjYgPSBwb2ludDQzMjZbMF07XG4gICAgICBsYXQ0MzI2ID0gcG9pbnQ0MzI2WzFdO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlU3RvcmUudXBkYXRlKHtcbiAgICAgIHR5cGU6IEZFQVRVUkUsXG4gICAgICBnZW9tZXRyeSxcbiAgICAgIHByb2plY3Rpb246IHByb2plY3Rpb24uZ2V0Q29kZSgpLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpZDogZmVhdHVyZUlkLFxuICAgICAgICBkcmF3OiBvbEdlb21ldHJ5LmdldCgnX2xhYmVsJyksXG4gICAgICAgIGxvbmdpdHVkZTogbG9uNDMyNiA/IGxvbjQzMjYgOiBudWxsLFxuICAgICAgICBsYXRpdHVkZTogbGF0NDMyNiA/IGxhdDQzMjYgOiBudWxsLFxuICAgICAgICByYWQ6IHJhZCA/IHJhZCA6IG51bGwsXG4gICAgICAgIGZvbnRTdHlsZTogb2xHZW9tZXRyeS5nZXQoJ2ZvbnRTdHlsZV8nKSxcbiAgICAgICAgZHJhd2luZ1N0eWxlOiB7XG4gICAgICAgICAgZmlsbDogb2xHZW9tZXRyeS5nZXQoJ2ZpbGxDb2xvcl8nKSxcbiAgICAgICAgICBzdHJva2U6IG9sR2VvbWV0cnkuZ2V0KCdzdHJva2VDb2xvcl8nKVxuICAgICAgICB9LFxuICAgICAgICBvZmZzZXRYOiBvbEdlb21ldHJ5LmdldCgnb2Zmc2V0WF8nKSxcbiAgICAgICAgb2Zmc2V0WTogb2xHZW9tZXRyeS5nZXQoJ29mZnNldFlfJylcbiAgICAgIH0sXG4gICAgICBtZXRhOiB7XG4gICAgICAgIGlkOiBmZWF0dXJlSWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKCkge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZmlsbDogWycnXSxcbiAgICAgIHN0cm9rZTogWycnXVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldHVwTGF5ZXIoaXNOZXdMYXllcj86IGJvb2xlYW4pIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRHJhd0xheWVyUG9wdXBDb21wb25lbnQsIHtcbiAgICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUZsYWcpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVN0b3JlLnN0YXRlLnVwZGF0ZUFsbCh7c2VsZWN0ZWQ6IGZhbHNlfSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTdG9yZSA9IG5ldyBGZWF0dXJlU3RvcmU8RmVhdHVyZVdpdGhEcmF3PihbXSwgeyBtYXA6IHRoaXMubWFwIH0pO1xuICAgICAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyU291cmNlID0gbmV3IE9sVmVjdG9yU291cmNlKCk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIub3BhY2l0eSA9IDA7XG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcbiAgICAgICAgICB0aGlzLmluaXRTdG9yZShsYWJlbCwgaXNOZXdMYXllcik7XG4gICAgICAgICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbCA9IHRoaXMuY3JlYXRlRHJhd0NvbnRyb2woXG4gICAgICAgICAgICB0aGlzLmZpbGxDb2xvcixcbiAgICAgICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICB0aGlzLnN0cm9rZVdpZHRoXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sLnNldEdlb21ldHJ5VHlwZSh0aGlzLmN1cnJHZW9tZXRyeVR5cGUpO1xuICAgICAgICAgIHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5wdXNoKHRoaXMuYWN0aXZlU3RvcmUpO1xuICAgICAgICAgIHRoaXMuZHJhd0NvbnRyb2xzLnB1c2goW3RoaXMuYWN0aXZlRHJhd2luZ0xheWVyLmlkLCB0aGlzLmFjdGl2ZURyYXdDb250cm9sXSk7XG4gICAgICAgICAgdGhpcy5kcmF3Q29udHJvbHNFdmVudC5lbWl0KHRoaXMuZHJhd0NvbnRyb2xzKTtcbiAgICAgICAgICB0aGlzLmxheWVyc0lERXZlbnQuZW1pdCh0aGlzLmFjdGl2ZURyYXdpbmdMYXllci5pZCk7XG4gICAgICAgICAgdGhpcy5pc0NyZWF0aW5nTmV3TGF5ZXIgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoIXRoaXMubGFiZWxzQXJlU2hvd24pe1xuICAgICAgICAgICAgdGhpcy5vblRvZ2dsZUxhYmVscygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFjdGl2ZUxheWVyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXI7XG4gICAgICAgICAgdGhpcy5zZWxlY3Quc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAyNTApO1xuICB9XG5cbiAgLy8gSFRNTCB1c2VyIGludGVyYWN0aW9uc1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBkb3VibGUtY2xpY2tzIHRoZSBzZWxlY3RlZCBkcmF3aW5nXG4gICAqL1xuICBlZGl0TGFiZWxEcmF3aW5nKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCkge1xuICAgICAgY29uc3Qgb2xHZW9tZXRyeSA9IGZlYXR1cmVUb09sKFxuICAgICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlWzBdLFxuICAgICAgICB0aGlzLm1hcC5vbC5nZXRWaWV3KCkuZ2V0UHJvamVjdGlvbigpLmdldENvZGUoKVxuICAgICAgKTtcbiAgICAgIHRoaXMub3BlbkRyYXdEaWFsb2cob2xHZW9tZXRyeSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5TaG9yY3V0c0RpYWxvZygpIHtcbiAgICB0aGlzLmRpYWxvZy5vcGVuKERyYXdTaG9yY3V0c0NvbXBvbmVudCk7XG4gIH1cblxuICBkZWxldGVEcmF3aW5ncygpIHtcbiAgICB0aGlzLmFjdGl2ZVN0b3JlLmRlbGV0ZU1hbnkodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5mb3JFYWNoKChzZWxlY3RlZEZlYXR1cmUpID0+IHtcbiAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyU291cmNlXG4gICAgICAgIC5nZXRGZWF0dXJlcygpXG4gICAgICAgIC5mb3JFYWNoKChkcmF3aW5nTGF5ZXJGZWF0dXJlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBkcmF3aW5nTGF5ZXJGZWF0dXJlLmdldEdlb21ldHJ5KCkgYXMgYW55O1xuICAgICAgICAgIGlmIChzZWxlY3RlZEZlYXR1cmUucHJvcGVydGllcy5pZCA9PT0gZ2VvbWV0cnkub2xfdWlkKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURyYXdpbmdMYXllclNvdXJjZS5yZW1vdmVGZWF0dXJlKGRyYXdpbmdMYXllckZlYXR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVIZWlnaHRUYWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIGxhYmVscyB0b2dnbGVcbiAgICovXG4gIG9uVG9nZ2xlTGFiZWxzKCkge1xuICAgIHRoaXMuZHJhd1N0eWxlU2VydmljZS50b2dnbGVMYWJlbHNBcmVTaG93bigpO1xuICAgIHRoaXMubGFiZWxzQXJlU2hvd24gPSAhdGhpcy5sYWJlbHNBcmVTaG93bjtcbiAgICB0aGlzLmljb25cbiAgICAgID8gdGhpcy5lbGVtZW50U3R5bGUoXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcbiAgICAgICAgICB0cnVlXG4gICAgICAgIClcbiAgICAgIDogdGhpcy5lbGVtZW50U3R5bGUoXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgIHRoaXMuY3JlYXRlRHJhd0NvbnRyb2woKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciB0b2dnbGVzIHRoZSBEcmF3IGNvbnRyb2wgaXMgdG9nZ2xlZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uVG9nZ2xlRHJhd0NvbnRyb2wodG9nZ2xlSXNDaGVja2VkOiBib29sZWFuKSB7XG4gICAgdG9nZ2xlSXNDaGVja2VkID8gdGhpcy50b2dnbGVEcmF3Q29udHJvbCgpIDogdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcbiAgfVxuXG4gIC8vIFVzZXIgY2hhbmdlcyBwcm9wZXJ0aWVzIG9mIGEgZHJhd2luZyBlbGVtZW50XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGN1cnJlbnQgbGF5ZXIgd2l0aCB0aGUgY3VycmVudCBzdG9yZSBhbmQgdGhlIGN1cnJlbnQgbGF5ZXJTb3VyY2VcbiAgICovXG5cbiAgcHVibGljIG9uTGF5ZXJDaGFuZ2UoY3VyckxheWVyPzogVmVjdG9yTGF5ZXIpIHtcbiAgICBpZiAoY3VyckxheWVyKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0b3JlLnN0YXRlLnVwZGF0ZUFsbCh7c2VsZWN0ZWQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLmlzQ3JlYXRpbmdOZXdMYXllciA9IGZhbHNlO1xuICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIub3BhY2l0eSA9IDA7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdpbmdMYXllciA9IGN1cnJMYXllcjtcbiAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLm9wYWNpdHkgPSAxO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcbiAgICAgIGlmICghdGhpcy5sYWJlbHNBcmVTaG93bil7XG4gICAgICAgIHRoaXMub25Ub2dnbGVMYWJlbHMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUgPSB0aGlzLnN0b3Jlcy5maW5kKHN0b3JlID0+IHN0b3JlLmxheWVyLmlkID09PSB0aGlzLmFjdGl2ZURyYXdpbmdMYXllci5pZCk7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sID0gdGhpcy5kcmF3Q29udHJvbHMuZmluZChkYyA9PiBkY1swXSA9PT0gdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIuaWQpWzFdO1xuICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UgPSB0aGlzLmFjdGl2ZURyYXdDb250cm9sLm9sRHJhd2luZ0xheWVyU291cmNlO1xuICAgICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbC5zZXRHZW9tZXRyeVR5cGUodGhpcy5jdXJyR2VvbWV0cnlUeXBlKTtcbiAgICAgIHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXR1cExheWVyKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUxheWVyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUxheWVyKG5ld1RpdGxlPywgaXNOZXdMYXllcj8pIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuYWxsTGF5ZXJzKXtcbiAgICAgIGxldCBudW1iZXJJZCA9IE51bWJlcihsYXllci5pZC5yZXBsYWNlKCdpZ28tZHJhdy1sYXllcicsJycpKTtcbiAgICAgIHRoaXMubGF5ZXJDb3VudGVySUQgPSBNYXRoLm1heChudW1iZXJJZCx0aGlzLmxheWVyQ291bnRlcklEKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIgPSBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxuICAgICAgaWQ6ICdpZ28tZHJhdy1sYXllcicgKyArK3RoaXMubGF5ZXJDb3VudGVySUQsXG4gICAgICB0aXRsZTogaXNOZXdMYXllclxuICAgICAgICA/IG5ld1RpdGxlXG4gICAgICAgIDogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZHJhdy5kcmF3aW5nJyksXG4gICAgICB6SW5kZXg6IDIwMCxcbiAgICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgICBzdHlsZTogKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd1N0eWxlU2VydmljZS5jcmVhdGVJbmRpdmlkdWFsRWxlbWVudFN0eWxlKFxuICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICB0aGlzLmxhYmVsc0FyZVNob3duLFxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdmb250U3R5bGUnKSxcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuZmlsbCxcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlLFxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRYJyksXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFknKSxcbiAgICAgICAgICB0aGlzLmljb25cbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBzaG93SW5MYXllckxpc3Q6IHRydWUsXG4gICAgICBleHBvcnRhYmxlOiB0cnVlLFxuICAgICAgYnJvd3NhYmxlOiBmYWxzZSxcbiAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5QmluZFN0b3JlTGF5ZXIodGhpcy5hY3RpdmVTdG9yZSwgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIpO1xuXG4gICAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KFxuICAgICAgdGhpcy5hY3RpdmVTdG9yZSxcbiAgICAgIG5ldyBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3koe1xuICAgICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uTm9uZVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdHJ5QWRkU2VsZWN0aW9uU3RyYXRlZ3koXG4gICAgICB0aGlzLmFjdGl2ZVN0b3JlLFxuICAgICAgbmV3IEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KHtcbiAgICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgICAgbW90aW9uOiBGZWF0dXJlTW90aW9uLk5vbmUsXG4gICAgICAgIG1hbnk6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZVN0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZlU3RvcmUuc291cmNlLm9sLm9uKFxuICAgICAgJ3JlbW92ZWZlYXR1cmUnLFxuICAgICAgKGV2ZW50OiBPbFZlY3RvclNvdXJjZUV2ZW50PE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICAgIGNvbnN0IG9sR2VvbWV0cnkgPSBldmVudC5mZWF0dXJlLmdldEdlb21ldHJ5KCk7XG4gICAgICAgIHRoaXMuY2xlYXJMYWJlbHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBjb2xvciBpbiBhIGNvbG9yIHBpY2tlclxuICAgKiBAcGFyYW0gbGFiZWxzQXJlU2hvd24gd2hldGVyIHRoZSBsYWJlbHMgYXJlIHNob3duIG9yIG5vdFxuICAgKiBAcGFyYW0gaXNBbkljb24gd2hldGVyIHRoZSBmZWF0dXJlIGlzIGFuIGljb24gb3Igbm90XG4gICAqIEBwYXJhbSBmaWxsQ29sb3Igd2hpY2ggaXMgdGhlIGZpbGxpbmcgY29sb3JcbiAgICogQHBhcmFtIHN0cm9rZUNvbG9yIHdoaWNoIGlzIHRoZSBzdHJva2UgY29sb3JcbiAgICovXG4gIG9uQ29sb3JDaGFuZ2UoXG4gICAgbGFiZWxzQXJlU2hvd246IGJvb2xlYW4sXG4gICAgaXNBbkljb246IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yOiBzdHJpbmcsXG4gICAgc3Ryb2tlQ29sb3I6IHN0cmluZ1xuICApIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwICYmICFpc0FuSWNvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XG4gICAgICAgIGxldCBvbEZlYXR1cmUgPSBmZWF0dXJlVG9PbChcbiAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgIHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKG9sRmVhdHVyZSwgZmlsbENvbG9yLCBzdHJva2VDb2xvcik7XG5cbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5hY3RpdmVTdG9yZVxuICAgICAgICAgIC5hbGwoKVxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcbiAgICAgICAgZW50aXR5LnByb3BlcnRpZXMuZHJhd2luZ1N0eWxlLmZpbGwgPSBvbEZlYXR1cmUuZ2V0KCdmaWxsQ29sb3JfJyk7XG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5zdHJva2UgPSBvbEZlYXR1cmUuZ2V0KCdzdHJva2VDb2xvcl8nKTtcbiAgICAgICAgdGhpcy5hY3RpdmVTdG9yZS51cGRhdGUoZW50aXR5KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duLCBpc0FuSWNvbik7XG4gICAgdGhpcy5jcmVhdGVEcmF3Q29udHJvbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIGZvbnQgc2l6ZSBvci9hbmQgc3R5bGVcbiAgICogQHBhcmFtIGxhYmVsc0FyZVNob3duIHdoZXRlciB0aGUgbGFiZWxzIGFyZSBzaG93biBvciBub3RcbiAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGZvbnRcbiAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiB0aGUgZm9udFxuICAgKi9cblxuICBvbkZvbnRDaGFuZ2UobGFiZWxzQXJlU2hvd246IGJvb2xlYW4sIHNpemU6IHN0cmluZywgc3R5bGU6IEZvbnRUeXBlKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XG4gICAgICAgIGxldCBvbEZlYXR1cmUgPSBmZWF0dXJlVG9PbChcbiAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgIHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEZlYXR1cmUsIHNpemUsIHN0eWxlKTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5hY3RpdmVTdG9yZVxuICAgICAgICAgIC5hbGwoKVxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcbiAgICAgICAgZW50aXR5LnByb3BlcnRpZXMuZm9udFN0eWxlID0gb2xGZWF0dXJlLmdldCgnZm9udFN0eWxlXycpO1xuICAgICAgICB0aGlzLmFjdGl2ZVN0b3JlLnVwZGF0ZShlbnRpdHkpO1xuICAgICAgICBvbEZlYXR1cmUgPSB0aGlzLmFjdGl2ZVN0b3JlLmxheWVyLm9sLmdldFNvdXJjZSgpLmdldEZlYXR1cmVzKCkuZmluZChmID0+IGYuZ2V0SWQoKSA9PT0gZW50aXR5Lm1ldGEuaWQpO1xuICAgICAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyh7IGZvbnRTdHlsZTogZW50aXR5LnByb3BlcnRpZXMuZm9udFN0eWxlIH0pO1xuICAgICAgICBvbEZlYXR1cmUuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZm9udFNpemUgPSBzaXplO1xuICAgICAgdGhpcy5mb250U3R5bGUgPSBzdHlsZTtcblxuICAgICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnNldEZvbnRTaXplKHNpemUpO1xuICAgICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnNldEZvbnRTdHlsZShzdHlsZSk7XG5cbiAgICAgIHRoaXMuZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyB0aGUgdmFsdWUgb2YgdGhlIGhvcml6b250YWwvdmVydGljYWwgb2Zmc2V0XG4gICAqIEBwYXJhbSBsYWJlbHNBcmVTaG93biB3aGV0ZXIgdGhlIGxhYmVscyBhcmUgc2hvd24gb3Igbm90XG4gICAqIEBwYXJhbSBvZmZzZXRYIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBsYWJlbFxuICAgKiBAcGFyYW0gb2Zmc2V0WSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIGxhYmVsXG4gICAqL1xuXG4gIG9uT2Zmc2V0TGFiZWxDaGFuZ2UoXG4gICAgbGFiZWxzQXJlU2hvd246IGJvb2xlYW4sXG4gICAgb2Zmc2V0WDogbnVtYmVyLFxuICAgIG9mZnNldFk6IG51bWJlclxuICApIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmZvckVhY2goKGZlYXR1cmUpID0+IHtcbiAgICAgICAgbGV0IG9sRmVhdHVyZSA9IGZlYXR1cmVUb09sKFxuICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKS5nZXRDb2RlKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXQob2xGZWF0dXJlLCBvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5hY3RpdmVTdG9yZVxuICAgICAgICAgIC5hbGwoKVxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcbiAgICAgICAgZW50aXR5LnByb3BlcnRpZXMub2Zmc2V0WCA9IG9sRmVhdHVyZS5nZXQoJ29mZnNldFhfJyk7XG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFkgPSBvbEZlYXR1cmUuZ2V0KCdvZmZzZXRZXycpO1xuICAgICAgICB0aGlzLmFjdGl2ZVN0b3JlLnVwZGF0ZShlbnRpdHkpO1xuICAgICAgICBvbEZlYXR1cmUgPSB0aGlzLmFjdGl2ZVN0b3JlLmxheWVyLm9sLmdldFNvdXJjZSgpLmdldEZlYXR1cmVzKCkuZmluZChmID0+IGYuZ2V0SWQoKSA9PT0gZW50aXR5Lm1ldGEuaWQpO1xuICAgICAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyh7IG9mZnNldFg6IGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFgsIG9mZnNldFk6IGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFkgfSk7XG4gICAgICAgIG9sRmVhdHVyZS5jaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duKTtcbiAgICB9XG4gIH1cblxuICBvbkljb25DaGFuZ2UoZXZlbnQ/KSB7XG4gICAgdGhpcy5pY29uID0gZXZlbnQ7XG4gICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnNldEljb24odGhpcy5pY29uKTtcbiAgICB0aGlzLmVsZW1lbnRTdHlsZSh0cnVlLCB0aGlzLmljb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBuZXcgZ2VvbWV0cnkgdHlwZVxuICAgKiBAcGFyYW0gZ2VvbWV0cnlUeXBlIHRoZSBnZW9tZXRyeSB0eXBlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyXG4gICAqL1xuICBvbkdlb21ldHJ5VHlwZUNoYW5nZShnZW9tZXRyeVR5cGU6IFR5cGUpIHtcbiAgICB0aGlzLmN1cnJHZW9tZXRyeVR5cGUgPSBnZW9tZXRyeVR5cGU7XG4gICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbC5zZXRHZW9tZXRyeVR5cGUoZ2VvbWV0cnlUeXBlKTtcbiAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XG4gIH1cblxuICAvLyBVcGRhdGVzIHRoZSBwcm9wZXJ0aWVzIG9mIG9sRmVhdHVyZSBpbnB1dHRlZFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGxhYmVsIG9mIGEgZ2VvbWV0cnkgd2hlbiBhIGxhYmVsIGlzIGVudGVyZWQgaW4gYSBkaWFsb2cgYm94XG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IHRoZSBnZW9tZXRyeVxuICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxhYmVsT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnk6IE9sR2VvbWV0cnksIGxhYmVsOiBzdHJpbmcpIHtcbiAgICBvbEdlb21ldHJ5LnNldFByb3BlcnRpZXMoXG4gICAgICB7XG4gICAgICAgIF9sYWJlbDogbGFiZWxcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRm9udFNpemVBbmRTdHlsZShcbiAgICBvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PixcbiAgICBmb250U2l6ZTogc3RyaW5nLFxuICAgIGZvbnRTdHlsZTogc3RyaW5nXG4gICkge1xuICAgIG9sRmVhdHVyZS5zZXRQcm9wZXJ0aWVzKFxuICAgICAge1xuICAgICAgICBmb250U3R5bGVfOiBgJHtmb250U2l6ZX1weCAke2ZvbnRTdHlsZX1gXG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbGxBbmRTdHJva2VDb2xvcihcbiAgICBvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PixcbiAgICBmaWxsQ29sb3I6IHN0cmluZyxcbiAgICBzdHJva2VDb2xvcjogc3RyaW5nXG4gICkge1xuICAgIG9sRmVhdHVyZS5zZXRQcm9wZXJ0aWVzKFxuICAgICAge1xuICAgICAgICBmaWxsQ29sb3JfOiBmaWxsQ29sb3IsXG4gICAgICAgIHN0cm9rZUNvbG9yXzogc3Ryb2tlQ29sb3JcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT2Zmc2V0KFxuICAgIG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LFxuICAgIG9mZnNldFg6IG51bWJlcixcbiAgICBvZmZzZXRZOiBudW1iZXJcbiAgKSB7XG4gICAgb2xGZWF0dXJlLnNldFByb3BlcnRpZXMoXG4gICAgICB7XG4gICAgICAgIG9mZnNldFhfOiBvZmZzZXRYLFxuICAgICAgICBvZmZzZXRZXzogb2Zmc2V0WVxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlcyB2YWx1ZXMgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQgb24gdGhlIEhUTUwgdmlld1xuXG4gIGdldEZlYXR1cmVGb250U2l6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCA+IDBcbiAgICAgID8gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLmZvbnRTdHlsZVxuICAgICAgICAgIC5zcGxpdCgnICcpWzBdXG4gICAgICAgICAgLnJlcGxhY2UoJ3B4JywgJycpXG4gICAgICA6ICcyMCc7XG4gIH1cblxuICBnZXRGZWF0dXJlRm9udFN0eWxlKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCA+IDBcbiAgICAgID8gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5zdWJzdHJpbmcoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5pbmRleE9mKCcgJykgKyAxXG4gICAgICAgIClcbiAgICAgIDogRm9udFR5cGUuQXJpYWw7XG4gIH1cblxuICBnZXRGZWF0dXJlRmlsbENvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCA+IDBcbiAgICAgID8gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5maWxsXG4gICAgICA6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuNCknO1xuICB9XG5cbiAgZ2V0RmVhdHVyZVN0cm9rZUNvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCA+IDBcbiAgICAgID8gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5zdHJva2VcbiAgICAgIDogJ3JnYmEoMTQzLDcsNywxKSc7XG4gIH1cblxuICBnZXRGZWF0dXJlT2Zmc2V0WCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwXG4gICAgICA/IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWVbMF0ucHJvcGVydGllcy5vZmZzZXRYXG4gICAgICA6IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRPZmZzZXRYKCk7XG4gIH1cblxuICBnZXRGZWF0dXJlT2Zmc2V0WSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwXG4gICAgICA/IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWVbMF0ucHJvcGVydGllcy5vZmZzZXRZXG4gICAgICA6ICcwJztcbiAgfVxuXG4gIGdldCBhbGxGb250U3R5bGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhGb250VHlwZSk7XG4gIH1cblxuICBnZXQgYWxsTGF5ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLm1hcC5sYXllcnMuZmlsdGVyKChsYXllcikgPT5cbiAgICAgIGxheWVyLmlkLmluY2x1ZGVzKCdpZ28tZHJhdy1sYXllcicpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUhlaWdodFRhYmxlKCkge1xuICAgIC8vIENoZWNrIHRoZSBhbW91bnQgb2Ygcm93cyBhcyBhIHBvc3NpYmxlIGFsdGVybmF0aXZlXG5cbiAgICB0aGlzLm51bWJlck9mRHJhd2luZ3MgPSB0aGlzLmFjdGl2ZVN0b3JlLmNvdW50JC5nZXRWYWx1ZSgpO1xuICAgIHRoaXMubnVtYmVyT2ZEcmF3aW5ncyA+IDEwXG4gICAgICA/ICh0aGlzLnRhYmxlVGVtcGxhdGUudGFibGVIZWlnaHQgPSAnMzV2aCcpXG4gICAgICA6ICh0aGlzLnRhYmxlVGVtcGxhdGUudGFibGVIZWlnaHQgPSAnYXV0bycpO1xuICB9XG5cbiAgdXBkYXRlQWN0aXZlTGF5ZXIoKSB7XG4gICAgbGV0IGN1cnJMYXllciA9IHRoaXMuYWxsTGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIudGl0bGUgPT09IHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLnRpdGxlKTtcbiAgICByZXR1cm4gY3VyckxheWVyID8gY3VyckxheWVyIDogdGhpcy5hbGxMYXllcnNbMF07XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kc1xuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgY29ycmVjdCBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIHRvZ2dsZURyYXdDb250cm9sKCkge1xuICAgIHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XG4gICAgdGhpcy5hY3RpdmF0ZURyYXdDb250cm9sKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIHRvb2x0aXBzIG9mIGFuIE9MIGdlb21ldHJ5XG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9MIGdlb21ldHJ5IHdpdGggdG9vbHRpcHNcbiAgICovXG4gIHByaXZhdGUgY2xlYXJMYWJlbHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSkge1xuICAgIGdldFRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpLmZvckVhY2goXG4gICAgICAob2xUb29sdGlwOiBPbE92ZXJsYXkgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKG9sVG9vbHRpcCAmJiBvbFRvb2x0aXAuZ2V0TWFwKCkpIHtcbiAgICAgICAgICB0aGlzLm1hcC5vbC5yZW1vdmVPdmVybGF5KG9sVG9vbHRpcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBmZWF0dXJlIGluIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gZW50aXR5IHRoZSBlbnRpdHkgdG8gcmVwbGFjZVxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSB0aGUgbmV3IGdlb21ldHJ5IHRvIGluc2VydCBpbiB0aGUgc3RvcmVcbiAgICovXG4gIHByaXZhdGUgcmVwbGFjZUZlYXR1cmVJblN0b3JlKFxuICAgIGVudGl0eSxcbiAgICBvbEdlb21ldHJ5OiBPbEdlb21ldHJ5LFxuICAgIHJhZGl1cz86IG51bWJlclxuICApIHtcbiAgICB0aGlzLmFjdGl2ZVN0b3JlLmRlbGV0ZShlbnRpdHkpO1xuICAgIHRoaXMub25EcmF3RW5kKG9sR2VvbWV0cnksIHJhZGl1cyk7XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSB0aGUgYWN0aXZlIGRyYXcgY29udHJvbFxuICAgKi9cbiAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJhd0NvbnRyb2woKSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZURyYXdDb250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhd0VuZCQkKSB7XG4gICAgICB0aGlzLmRyYXdFbmQkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuc2V0T2xNYXAodW5kZWZpbmVkKTtcbiAgICB0aGlzLmRyYXdDb250cm9sSXNBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhIGdpdmVuIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgYWN0aXZhdGVEcmF3Q29udHJvbCgpIHtcbiAgICB0aGlzLmRyYXdDb250cm9sSXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZHJhd0NvbnRyb2xJc0FjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5kcmF3RW5kJCQgPSB0aGlzLmFjdGl2ZURyYXdDb250cm9sLmVuZCQuc3Vic2NyaWJlKFxuICAgICAgKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnkpID0+IHtcbiAgICAgICAgdGhpcy5vcGVuRHJhd0RpYWxvZyhvbEdlb21ldHJ5LCB0cnVlKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbC5tb2RpZnkkLnN1YnNjcmliZSgob2xHZW9tZXRyeTogT2xHZW9tZXRyeSkgPT4ge1xuICAgICAgdGhpcy5vbk1vZGlmeURyYXcob2xHZW9tZXRyeSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMuZHJhd1NlbGVjdCQkKSB7XG4gICAgICB0aGlzLmRyYXdTZWxlY3QkJCA9IHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuc2VsZWN0JC5zdWJzY3JpYmUoXG4gICAgICAgIChvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PikgPT4ge1xuICAgICAgICAgIHRoaXMub3BlbkRyYXdEaWFsb2cob2xGZWF0dXJlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbC5zZXRPbE1hcCh0aGlzLm1hcC5vbCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjcmVhdGVzIHRoZSBzdHlsZSBvZiB0aGUgZmVhdHVyZSBzdG9yZWRcbiAgICovXG4gIHByaXZhdGUgZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duOiBib29sZWFuLCBpc0FuSWNvbj8pIHtcbiAgICBpZiAoaXNBbkljb24pIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub2wuc2V0U3R5bGUoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd1N0eWxlU2VydmljZS5jcmVhdGVJbmRpdmlkdWFsRWxlbWVudFN0eWxlKFxuICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICBsYWJlbHNBcmVTaG93bixcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZm9udFN0eWxlJyksXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLmZpbGwsXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLnN0cm9rZSxcbiAgICAgICAgICBmZWF0dXJlLmdldCgnb2Zmc2V0WCcpLFxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRZJyksXG4gICAgICAgICAgdGhpcy5pY29uXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVTdG9yZS5sYXllci5vbC5zZXRTdHlsZSgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmNyZWF0ZUluZGl2aWR1YWxFbGVtZW50U3R5bGUoXG4gICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICByZXNvbHV0aW9uLFxuICAgICAgICAgIGxhYmVsc0FyZVNob3duLFxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdmb250U3R5bGUnKSxcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuZmlsbCxcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlLFxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRYJyksXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFknKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2PlxuICA8ZGl2IGNsYXNzPVwiZ2VvbWV0cnktdHlwZS10b2dnbGUgbWF0LXR5cG9ncmFwaHlcIj5cbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBcbiAgICAgIChjaGFuZ2UpPVwib25HZW9tZXRyeVR5cGVDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuUG9pbnRcIj5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBbdmFsdWVdPVwiZ2VvbWV0cnlUeXBlLlBvaW50XCI+XG4gICAgICAgIHt7J2lnby5nZW8uZHJhdy4nICsgZ2VvbWV0cnlUeXBlLlBvaW50IHwgdHJhbnNsYXRlfX1cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBbdmFsdWVdPVwiZ2VvbWV0cnlUeXBlLkxpbmVTdHJpbmdcIj5cbiAgICAgICAge3snaWdvLmdlby5kcmF3LicgKyBnZW9tZXRyeVR5cGUuTGluZVN0cmluZyB8IHRyYW5zbGF0ZX19XG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImdlb21ldHJ5VHlwZS5Qb2x5Z29uXCI+XG4gICAgICAgIHt7J2lnby5nZW8uZHJhdy4nICsgZ2VvbWV0cnlUeXBlLlBvbHlnb24gfCB0cmFuc2xhdGV9fVxuICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cblxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuQ2lyY2xlXCI+XG4gICAgICAgIHt7J2lnby5nZW8uZHJhdy4nICsgZ2VvbWV0cnlUeXBlLkNpcmNsZSB8IHRyYW5zbGF0ZX19XG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkcmF3LW9wdGlvbnMgbWF0LXR5cG9ncmFwaHlcIj5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgW2Rpc2FibGVkXT1cImRyYXdDb250cm9sSXNEaXNhYmxlZFwiXG4gICAgICBbY2hlY2tlZF09XCJkcmF3Q29udHJvbElzQWN0aXZlXCJcbiAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcbiAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVEcmF3Q29udHJvbCgkZXZlbnQuY2hlY2tlZClcIj5cbiAgICAgIHt7J2lnby5nZW8uc3BhdGlhbEZpbHRlci5kcmF3Q29udHJvbCcgfCB0cmFuc2xhdGV9fVxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICBbY2hlY2tlZF09XCJsYWJlbHNBcmVTaG93blwiXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlTGFiZWxzKClcIlxuICAgID5cbiAgICAgIHt7ICdpZ28uZ2VvLmRyYXcudG9nZ2xlTWFwVG9vbHRpcHMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICA8L2Rpdj5cblxuICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cblxuICA8ZGl2PlxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwibGF5ZXItc2VsZWN0XCI+XG4gICAgICA8bWF0LWxhYmVsPnt7J2lnby5nZW8uZHJhdy5sYXllci50aXRsZScgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1zZWxlY3QgI3NlbGVjdGVkTGF5ZXIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkxheWVyQ2hhbmdlKHNlbGVjdGVkTGF5ZXIudmFsdWUpXCIgW3ZhbHVlXT1cInVwZGF0ZUFjdGl2ZUxheWVyKClcIj5cbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGxheWVyIG9mIGFsbExheWVyc1wiIFt2YWx1ZV09XCJsYXllclwiPlxuICAgICAgICAgIHt7IGxheWVyLnRpdGxlIH19XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPG1hdC1vcHRpb24gaWQ9XCJjcmVhdGVOZXdMYXllclwiID5cbiAgICAgICAgICB7eydpZ28uZ2VvLmRyYXcubGF5ZXIuY3JlYXRlTmV3TGF5ZXInIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJhY3RpdmVEcmF3aW5nTGF5ZXJcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBbY29sb3JdPVwiYWN0aXZlRHJhd2luZ0xheWVyLnZpc2libGUgPyAncHJpbWFyeScgOiAnZGVmYXVsdCdcIlxuICAgICAgY29sbGFwc2libGVCdXR0b25cbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cImFjdGl2ZURyYXdpbmdMYXllci52aXNpYmxlID9cbiAgICAgICAgICAgICAgICAgICAgKCdpZ28uZ2VvLmxheWVyLmhpZGVMYXllcicgfCB0cmFuc2xhdGUpIDpcbiAgICAgICAgICAgICAgICAgICAgKCdpZ28uZ2VvLmxheWVyLnNob3dMYXllcicgfCB0cmFuc2xhdGUpXCJcbiAgICAgIChjbGljayk9XCJhY3RpdmVEcmF3aW5nTGF5ZXIudmlzaWJsZSA9ICFhY3RpdmVEcmF3aW5nTGF5ZXIudmlzaWJsZVwiPlxuICAgICAgPG1hdC1pY29uXG4gICAgICAgIFtzdmdJY29uXT1cImFjdGl2ZURyYXdpbmdMYXllci52aXNpYmxlID8gJ2V5ZScgOiAnZXllLW9mZidcIj5cbiAgICAgIDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPGRpdj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImFjdGl2ZVN0b3JlLmNvdW50JC5nZXRWYWx1ZSgpID4gMFwiXG4gICAgICBjbGFzcz1cImRlbGV0ZUJ0blwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kcmF3LmRlbGV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgW2Rpc2FibGVkXT1cIihzZWxlY3RlZEZlYXR1cmVzJCB8IGFzeW5jKS5sZW5ndGggPT09IDBcIlxuICAgICAgKGNsaWNrKT1cImRlbGV0ZURyYXdpbmdzKClcIj5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCI+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXY+XG4gICAgICA8aWdvLWVudGl0eS10YWJsZVxuICAgICAgICAjdGFibGVcbiAgICAgICAgY2xhc3M9XCJ0YWJsZS1jb21wYWN0XCJcbiAgICAgICAgW3N0b3JlXT1cImFjdGl2ZVN0b3JlXCJcbiAgICAgICAgW3RlbXBsYXRlXT1cInRhYmxlVGVtcGxhdGVcIlxuICAgICAgICAoZGJsY2xpY2spPVwiZWRpdExhYmVsRHJhd2luZygpXCI+XG4gICAgICA8L2lnby1lbnRpdHktdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJpY29uLW9wdGlvbnNcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpY29ucy5sZW5ndGggPj0gMVwiPlxuICAgICAgPG1hdC1sYWJlbD57eyAnaWdvLmdlby5kcmF3Lmljb24nIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICA8bWF0LXNlbGVjdD5cbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaWNvblwiIGNsYXNzPVwiYm94XCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cInt7IGljb24gfX1cIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiXCIgKGNsaWNrKT1cIm9uSWNvbkNoYW5nZSgpXCI+e3sgJ2lnby5nZW8uZHJhdy5ub0ljb24nIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpY29uX2h0bWwgb2YgaWNvbnNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJpY29uX2h0bWxcIlxuICAgICAgICAgIChjbGljayk9XCJvbkljb25DaGFuZ2UoaWNvbl9odG1sKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgIDxpbWcgc3JjPVwie3sgaWNvbl9odG1sIH19XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8YnV0dG9uXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgY29sb3I9XCJhY2NlbnRcIlxuICAgIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCJcbiAgICAoY2xpY2spPVwib3BlblNob3JjdXRzRGlhbG9nKClcIlxuICA+XG4gICAgPG1hdC1pY29uXG4gICAgICBjbGFzcz1cInNob3J0Y3V0cy1pY29uXCJcbiAgICAgIHN2Z0ljb249XCJrZXlib2FyZC1vdXRsaW5lXCJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRyYXcuc2hvcnRjdXRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgPlxuICAgIDwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICAqbmdJZj1cInNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aFwiXG4gICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgIChjbGljayk9XCJvcGVuU3R5bGVNb2RhbERpYWxvZygpXCJcbiAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5zdHlsZS5zdHlsZU1vZGFsVG9vbHRpcCcgfCB0cmFuc2xhdGVcIj5cbiAgICB7eydpZ28uZ2VvLmxheWVyLnN0eWxlLnN0eWxlTW9kYWwnIHwgdHJhbnNsYXRlfX1cbiAgICA8bWF0LWljb25cbiAgICAgIGNsYXNzPVwic3R5bGUtaWNvblwiXG4gICAgICBzdmdJY29uPVwicGFsZXR0ZVwiXG4gICAgICBbbWF0QmFkZ2VdPVwic2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoXCJcbiAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiPlxuICAgIDwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=