@igo2/geo 18.0.0-next.9 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +4 -6
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +13 -10
  3. package/esm2022/lib/datasource/shared/capabilities.service.mjs +1 -1
  4. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +2 -1
  5. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
  6. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
  7. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +151 -102
  8. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +177 -83
  9. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +93 -44
  10. package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
  11. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +1 -1
  12. package/esm2022/lib/directions/directions.component.mjs +55 -31
  13. package/esm2022/lib/directions/shared/directions.enum.mjs +51 -7
  14. package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
  15. package/esm2022/lib/directions/shared/directions.service.mjs +122 -96
  16. package/esm2022/lib/directions/shared/directions.utils.mjs +281 -318
  17. package/esm2022/lib/directions/shared/store.mjs +2 -2
  18. package/esm2022/lib/download/download-button/download-button.component.mjs +8 -20
  19. package/esm2022/lib/download/shared/download.service.mjs +1 -1
  20. package/esm2022/lib/draw/draw/draw-popup.component.mjs +1 -1
  21. package/esm2022/lib/draw/draw/draw.component.mjs +5 -12
  22. package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
  23. package/esm2022/lib/environment/environment.interface.mjs +1 -1
  24. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +2 -2
  25. package/esm2022/lib/feature/shared/feature-store.utils.mjs +7 -6
  26. package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
  27. package/esm2022/lib/feature/shared/store.mjs +1 -1
  28. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +3 -3
  29. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +7 -4
  30. package/esm2022/lib/feature/shared/strategies/selection.mjs +5 -4
  31. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +3 -3
  32. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +2 -2
  33. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +5 -3
  34. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +1 -1
  35. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +8 -1
  36. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1 -1
  37. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +2 -8
  38. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +2 -8
  39. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +2 -2
  40. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +13 -10
  41. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +2 -2
  42. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +4 -2
  43. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +5 -16
  44. package/esm2022/lib/import-export/export-button/export-button.component.mjs +4 -17
  45. package/esm2022/lib/import-export/import-export/import-export.component.mjs +23 -12
  46. package/esm2022/lib/import-export/shared/export.service.mjs +7 -4
  47. package/esm2022/lib/import-export/shared/import.utils.mjs +3 -3
  48. package/esm2022/lib/layer/index.mjs +10 -5
  49. package/esm2022/lib/layer/layer-group/index.mjs +2 -0
  50. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
  51. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +76 -161
  52. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +5 -8
  53. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +5 -6
  54. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +14 -21
  55. package/esm2022/lib/layer/layer-list/index.mjs +1 -3
  56. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +176 -785
  57. package/esm2022/lib/layer/layer-list-tool/index.mjs +1 -2
  58. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +51 -84
  59. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -2
  60. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +56 -16
  61. package/esm2022/lib/layer/layer-search/index.mjs +2 -0
  62. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
  63. package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
  64. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +25 -0
  65. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
  66. package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
  67. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
  68. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
  69. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
  70. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
  71. package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
  72. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
  73. package/esm2022/lib/layer/layer.module.mjs +51 -33
  74. package/esm2022/lib/layer/shared/index.mjs +2 -1
  75. package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
  76. package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
  77. package/esm2022/lib/layer/shared/layer.service.mjs +31 -16
  78. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  79. package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
  80. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
  81. package/esm2022/lib/layer/shared/layers/image-layer.mjs +8 -3
  82. package/esm2022/lib/layer/shared/layers/index.mjs +6 -1
  83. package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
  84. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
  85. package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
  86. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -11
  87. package/esm2022/lib/layer/shared/layers/layer.mjs +108 -117
  88. package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
  89. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
  90. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
  91. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
  92. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +8 -3
  93. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +9 -3
  94. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +8 -3
  95. package/esm2022/lib/layer/utils/layer.utils.mjs +47 -1
  96. package/esm2022/lib/layer/utils/outputLegend.mjs +5 -1
  97. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +3 -3
  98. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -6
  99. package/esm2022/lib/map/map-center/map-center.component.mjs +1 -2
  100. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
  101. package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
  102. package/esm2022/lib/map/shared/hover-feature.directive.mjs +1 -9
  103. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +113 -123
  104. package/esm2022/lib/map/shared/map.abstract.mjs +4 -3
  105. package/esm2022/lib/map/shared/map.mjs +7 -243
  106. package/esm2022/lib/map/shared/map.service.mjs +1 -1
  107. package/esm2022/lib/map/shared/map.utils.mjs +3 -3
  108. package/esm2022/lib/map/shared/mapOffline.directive.mjs +9 -5
  109. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +1 -3
  110. package/esm2022/lib/map/utils/index.mjs +2 -0
  111. package/esm2022/lib/map/utils/layer-watcher.mjs +45 -13
  112. package/esm2022/lib/measure/measurer/measurer.component.mjs +7 -25
  113. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +6 -18
  114. package/esm2022/lib/offline/offline.provider.mjs +10 -11
  115. package/esm2022/lib/print/shared/print.service.mjs +3 -3
  116. package/esm2022/lib/query/shared/query.directive.mjs +9 -5
  117. package/esm2022/lib/query/shared/query.service.mjs +7 -7
  118. package/esm2022/lib/query/shared/query.utils.mjs +5 -1
  119. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +15 -9
  120. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +1 -10
  121. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
  122. package/esm2022/lib/search/shared/sources/workspace.mjs +1 -1
  123. package/esm2022/lib/workspace/shared/edition-workspace.mjs +6 -4
  124. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +19 -17
  125. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +17 -2
  126. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +22 -4
  127. package/esm2022/lib/workspace/shared/workspace.utils.mjs +6 -3
  128. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +2 -2
  129. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +6 -2
  130. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +4 -3
  131. package/fesm2022/igo2-geo.mjs +22952 -22018
  132. package/fesm2022/igo2-geo.mjs.map +1 -1
  133. package/lib/datasource/shared/capabilities.service.d.ts +7 -2
  134. package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +2 -2
  135. package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +5 -5
  136. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
  137. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
  138. package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
  139. package/lib/directions/directions-sources/directions-source.d.ts +2 -2
  140. package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
  141. package/lib/directions/directions.component.d.ts +5 -5
  142. package/lib/directions/shared/directions.enum.d.ts +42 -1
  143. package/lib/directions/shared/directions.interface.d.ts +50 -25
  144. package/lib/directions/shared/directions.service.d.ts +46 -8
  145. package/lib/directions/shared/directions.utils.d.ts +102 -23
  146. package/lib/directions/shared/store.d.ts +3 -3
  147. package/lib/download/download-button/download-button.component.d.ts +4 -8
  148. package/lib/download/shared/download.service.d.ts +1 -1
  149. package/lib/draw/draw/draw.component.d.ts +2 -2
  150. package/lib/draw/shared/draw.utils.d.ts +2 -1
  151. package/lib/environment/environment.interface.d.ts +2 -0
  152. package/lib/feature/shared/feature-store.utils.d.ts +1 -1
  153. package/lib/feature/shared/feature.interfaces.d.ts +1 -1
  154. package/lib/feature/shared/store.d.ts +1 -1
  155. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
  156. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
  157. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
  158. package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
  159. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
  160. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
  161. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
  162. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  163. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
  164. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  165. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
  166. package/lib/import-export/export-button/export-button.component.d.ts +3 -7
  167. package/lib/import-export/import-export/import-export.component.d.ts +1 -2
  168. package/lib/import-export/shared/export.service.d.ts +2 -2
  169. package/lib/layer/index.d.ts +9 -4
  170. package/lib/layer/layer-group/index.d.ts +1 -0
  171. package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
  172. package/lib/layer/layer-item/layer-item.component.d.ts +19 -42
  173. package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
  174. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
  175. package/lib/layer/layer-list/index.d.ts +0 -2
  176. package/lib/layer/layer-list/layer-list.component.d.ts +51 -128
  177. package/lib/layer/layer-list-tool/index.d.ts +0 -1
  178. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
  179. package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
  180. package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
  181. package/lib/layer/layer-search/index.d.ts +1 -0
  182. package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
  183. package/lib/layer/layer-unavailable/index.d.ts +2 -0
  184. package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
  185. package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
  186. package/lib/layer/layer-viewer/index.d.ts +2 -0
  187. package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
  188. package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
  189. package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
  190. package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
  191. package/lib/layer/layer-visibility-button/index.d.ts +1 -0
  192. package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
  193. package/lib/layer/layer.module.d.ts +18 -6
  194. package/lib/layer/shared/index.d.ts +1 -0
  195. package/lib/layer/shared/layer-controller.d.ts +81 -0
  196. package/lib/layer/shared/layer-selection.d.ts +14 -0
  197. package/lib/layer/shared/layer.service.d.ts +9 -5
  198. package/lib/layer/shared/layers/any-layer.d.ts +3 -6
  199. package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
  200. package/lib/layer/shared/layers/image-layer.d.ts +5 -2
  201. package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
  202. package/lib/layer/shared/layers/index.d.ts +5 -0
  203. package/lib/layer/shared/layers/layer-base.d.ts +75 -0
  204. package/lib/layer/shared/layers/layer-group.d.ts +32 -0
  205. package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
  206. package/lib/layer/shared/layers/layer.d.ts +27 -45
  207. package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
  208. package/lib/layer/shared/layers/linked/index.d.ts +3 -0
  209. package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
  210. package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
  211. package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
  212. package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
  213. package/lib/layer/shared/layers/vector-layer.d.ts +7 -3
  214. package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
  215. package/lib/layer/utils/layer.utils.d.ts +12 -2
  216. package/lib/layer/utils/outputLegend.d.ts +2 -2
  217. package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
  218. package/lib/map/shared/hover-feature.directive.d.ts +0 -1
  219. package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
  220. package/lib/map/shared/map.abstract.d.ts +12 -29
  221. package/lib/map/shared/map.d.ts +10 -85
  222. package/lib/map/shared/map.service.d.ts +1 -1
  223. package/lib/map/shared/map.utils.d.ts +5 -3
  224. package/lib/map/utils/index.d.ts +1 -0
  225. package/lib/map/utils/layer-watcher.d.ts +18 -8
  226. package/lib/measure/measurer/measurer.component.d.ts +0 -8
  227. package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
  228. package/lib/offline/offline.provider.d.ts +1 -1
  229. package/lib/query/shared/query.service.d.ts +1 -1
  230. package/lib/query/shared/query.utils.d.ts +2 -1
  231. package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
  232. package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
  233. package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
  234. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
  235. package/locale/en.geo.json +104 -89
  236. package/locale/fr.geo.json +103 -89
  237. package/package.json +5 -5
  238. package/src/geo-theme.scss +1 -1
  239. package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
  240. package/src/lib/directions/directions.theming.scss +2 -0
  241. package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
  242. package/src/lib/layer/layer-item/layer-item.theme.scss +4 -9
  243. package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
  244. package/src/lib/layer/layer-list/layer-list.theme.scss +50 -0
  245. package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
  246. package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
  247. package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
  248. package/src/lib/layer/layer.theming.scss +14 -3
  249. package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
  250. package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
  251. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
  252. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
  253. package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
  254. package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
  255. package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
@@ -11,12 +11,13 @@ import { tryAddLoadingStrategy } from '../../feature/shared/strategies.utils';
11
11
  import { FeatureStoreLoadingStrategy } from '../../feature/shared/strategies/loading';
12
12
  import { VectorLayer } from '../../layer/shared/layers/vector-layer';
13
13
  import { createOverlayMarkerStyle } from '../../style/shared/overlay/overlay-marker-style.utils';
14
- import { DirectionRelativePositionType, DirectionType } from './directions.enum';
14
+ import { DirectionRelativePositionType, DirectionsType, ManeuverModifier, ManeuverType } from './directions.enum';
15
15
  /**
16
- * Function that updat the sort of the list base on the provided field.
17
- * @param source stop store
18
- * @param direction asc / desc sort order
19
- * @param field the field to use to sort the view
16
+ * Updates the sorting of the stops in the provided StopsStore based on the specified field and direction.
17
+ *
18
+ * @param {StopsStore} stopsStore - The StopsStore to update the sorting for.
19
+ * @param {'asc' | 'desc'} [direction='asc'] - The direction of sorting ('asc' for ascending, 'desc' for descending).
20
+ * @param {string} [field='position'] - The field to sort the stops by.
20
21
  */
21
22
  export function updateStoreSorting(stopsStore, direction = 'asc', field = 'position') {
22
23
  stopsStore.view.sort({
@@ -24,70 +25,73 @@ export function updateStoreSorting(stopsStore, direction = 'asc', field = 'posit
24
25
  valueAccessor: (entity) => entity[field]
25
26
  });
26
27
  }
27
- export function computeRelativePosition(index, totalLength) {
28
+ /**
29
+ * Computes the relative position of a stop in a list of stops.
30
+ *
31
+ * @param {number} stopIndex - The index of the stop.
32
+ * @param {number} stopListLength - The total number of stops.
33
+ * @return {DirectionRelativePositionType} The relative position of the stop.
34
+ */
35
+ export function computeRelativePosition(stopIndex, stopListLength) {
28
36
  let relativePosition = DirectionRelativePositionType.Intermediate;
29
- if (index === 0) {
37
+ if (stopIndex === 0) {
30
38
  relativePosition = DirectionRelativePositionType.Start;
31
39
  }
32
- else if (index === totalLength - 1) {
40
+ else if (stopIndex === stopListLength) {
33
41
  relativePosition = DirectionRelativePositionType.End;
34
42
  }
35
43
  return relativePosition;
36
44
  }
37
- export function computeStopsPosition(stopsStore) {
38
- const stopsToComputePosition = [...stopsStore.all()];
39
- stopsToComputePosition.sort((a, b) => a.position - b.position);
40
- stopsToComputePosition.map((stop, i) => {
41
- stop.position = i;
42
- stop.relativePosition = computeRelativePosition(stop.position, stopsToComputePosition.length);
43
- });
44
- if (stopsToComputePosition) {
45
- stopsStore.updateMany(stopsToComputePosition);
45
+ /**
46
+ * Computes the position and relative position of stops in the given stopsStore.
47
+ *
48
+ * @param {StopsStore} stopsStore - The store containing the stops.
49
+ */
50
+ export function computeStopsPosition(deletedStopIndex, stopsStore) {
51
+ for (const stop of stopsStore.all()) {
52
+ stop.position =
53
+ stop.position > deletedStopIndex ? (stop.position -= 1) : stop.position;
54
+ stop.relativePosition = computeRelativePosition(stop.position, stopsStore.all().length - 1);
46
55
  }
47
56
  }
48
57
  /**
49
- * Function that add a stop to the stop store. Stop are always added before the last stop.
50
- * @param stopsStore stop store as an EntityStore
58
+ * Adds a stop to the given stopsStore. The stop is always added as the last stop.
59
+ *
60
+ * @param {StopsStore} stopsStore - The store containing the stops.
61
+ * @return {Stop} The newly added stop.
51
62
  */
52
63
  export function addStopToStore(stopsStore) {
53
64
  const id = uuid();
54
65
  const stops = stopsStore.all();
55
- let positions;
56
- if (stopsStore.count === 0) {
57
- positions = [0];
58
- }
59
- else {
60
- positions = stops.map((stop) => stop.position);
61
- }
62
- const maxPosition = Math.max(...positions);
63
- const insertPosition = maxPosition;
64
- const lastPosition = maxPosition + 1;
65
- const stopToUpdate = stopsStore
66
- .all()
67
- .find((stop) => stop.position === maxPosition);
68
- if (stopToUpdate) {
69
- stopToUpdate.position = lastPosition;
70
- stopToUpdate.relativePosition = computeRelativePosition(lastPosition, stopsStore.count + 1);
66
+ const insertIndex = stops.length;
67
+ for (const stop of stopsStore.all()) {
68
+ stop.relativePosition = computeRelativePosition(stop.position, stops.length);
71
69
  }
72
70
  stopsStore.insert({
73
71
  id,
74
- position: insertPosition,
75
- relativePosition: computeRelativePosition(insertPosition, stopsStore.count + 1)
72
+ position: insertIndex,
73
+ relativePosition: computeRelativePosition(insertIndex, stops.length)
76
74
  });
77
75
  updateStoreSorting(stopsStore);
78
76
  return stopsStore.get(id);
79
77
  }
78
+ /**
79
+ * Removes a stop from the given stopsStore and updates the positions of the remaining stops.
80
+ *
81
+ * @param {StopsStore} stopsStore - The store containing the stops.
82
+ * @param {Stop} stop - The stop to be removed.
83
+ */
80
84
  export function removeStopFromStore(stopsStore, stop) {
81
85
  stopsStore.delete(stop);
82
- computeStopsPosition(stopsStore);
86
+ computeStopsPosition(stop.position, stopsStore);
83
87
  }
84
88
  /**
85
- * Create a style for the directions stops and routes
89
+ * Create a style for the directions steps, stops and route
86
90
  * @param feature OlFeature
87
91
  * @returns OL style function
88
92
  */
89
93
  export function directionsStyle(feature) {
90
- const vertexStyle = [
94
+ const stepStyle = [
91
95
  new olStyle.Style({
92
96
  geometry: feature.getGeometry(),
93
97
  image: new olStyle.Circle({
@@ -116,16 +120,22 @@ export function directionsStyle(feature) {
116
120
  })
117
121
  })
118
122
  ];
119
- if (feature.get('type') === DirectionType.Stop) {
123
+ if (feature.get('type') === DirectionsType.Stop) {
120
124
  return stopStyle;
121
125
  }
122
- if (feature.get('type') === 'vertex') {
123
- return vertexStyle;
126
+ if (feature.get('type') === DirectionsType.Vertex) {
127
+ return stepStyle;
124
128
  }
125
- if (feature.get('type') === DirectionType.Route) {
129
+ if (feature.get('type') === DirectionsType.Route) {
126
130
  return routeStyle;
127
131
  }
128
132
  }
133
+ /**
134
+ * Initializes the stops feature store with the provided language service.
135
+ *
136
+ * @param {StopsFeatureStore} stopsFeatureStore - The stops feature store to initialize.
137
+ * @param {LanguageService} languageService - The language service used for translations.
138
+ */
129
139
  export function initStopsFeatureStore(stopsFeatureStore, languageService) {
130
140
  const loadingStrategy = new FeatureStoreLoadingStrategy({
131
141
  motion: FeatureMotion.None
@@ -133,10 +143,11 @@ export function initStopsFeatureStore(stopsFeatureStore, languageService) {
133
143
  const stopsLayer = new VectorLayer({
134
144
  isIgoInternalLayer: true,
135
145
  id: 'igo-direction-stops-layer',
136
- title: languageService.translate.instant('igo.geo.directionsForm.stopLayer'),
146
+ title: languageService.translate.instant('igo.geo.directions.layer.stops'),
137
147
  zIndex: 911,
138
148
  source: new FeatureDataSource(),
139
149
  showInLayerList: true,
150
+ visible: true,
140
151
  workspace: {
141
152
  enabled: false
142
153
  },
@@ -155,9 +166,14 @@ export function initStopsFeatureStore(stopsFeatureStore, languageService) {
155
166
  style: directionsStyle
156
167
  });
157
168
  tryBindStoreLayer(stopsFeatureStore, stopsLayer);
158
- stopsFeatureStore.layer.visible = true;
159
169
  tryAddLoadingStrategy(stopsFeatureStore, loadingStrategy);
160
170
  }
171
+ /**
172
+ * Initializes the routes feature store with the provided language service.
173
+ *
174
+ * @param {StopsFeatureStore} routesFeatureStore - The routes feature store to initialize.
175
+ * @param {LanguageService} languageService - The language service used for translations.
176
+ */
161
177
  export function initRoutesFeatureStore(routesFeatureStore, languageService) {
162
178
  const loadingStrategy = new FeatureStoreLoadingStrategy({
163
179
  motion: FeatureMotion.None
@@ -165,10 +181,11 @@ export function initRoutesFeatureStore(routesFeatureStore, languageService) {
165
181
  const routeLayer = new VectorLayer({
166
182
  isIgoInternalLayer: true,
167
183
  id: 'igo-direction-route-layer',
168
- title: languageService.translate.instant('igo.geo.directionsForm.routeLayer'),
184
+ title: languageService.translate.instant('igo.geo.directions.layer.route'),
169
185
  zIndex: 910,
170
186
  source: new FeatureDataSource(),
171
187
  showInLayerList: true,
188
+ visible: true,
172
189
  workspace: {
173
190
  enabled: false
174
191
  },
@@ -180,10 +197,14 @@ export function initRoutesFeatureStore(routesFeatureStore, languageService) {
180
197
  style: directionsStyle
181
198
  });
182
199
  tryBindStoreLayer(routesFeatureStore, routeLayer);
183
- routesFeatureStore.layer.visible = true;
184
200
  tryAddLoadingStrategy(routesFeatureStore, loadingStrategy);
185
201
  }
186
- export function initStepFeatureStore(stepFeatureStore) {
202
+ /**
203
+ * Initializes the routes feature store.
204
+ *
205
+ * @param {StopsFeatureStore} stepsFeatureStore - The steps feature store to initialize.
206
+ */
207
+ export function initStepsFeatureStore(stepsFeatureStore) {
187
208
  const loadingStrategy = new FeatureStoreLoadingStrategy({
188
209
  motion: FeatureMotion.None
189
210
  });
@@ -194,6 +215,7 @@ export function initStepFeatureStore(stepFeatureStore) {
194
215
  zIndex: 910,
195
216
  source: new FeatureDataSource(),
196
217
  showInLayerList: false,
218
+ visible: true,
197
219
  workspace: {
198
220
  enabled: false
199
221
  },
@@ -204,44 +226,53 @@ export function initStepFeatureStore(stepFeatureStore) {
204
226
  browsable: false,
205
227
  style: directionsStyle
206
228
  });
207
- tryBindStoreLayer(stepFeatureStore, stepLayer);
208
- stepFeatureStore.layer.visible = true;
209
- tryAddLoadingStrategy(stepFeatureStore, loadingStrategy);
229
+ tryBindStoreLayer(stepsFeatureStore, stepLayer);
230
+ tryAddLoadingStrategy(stepsFeatureStore, loadingStrategy);
210
231
  }
211
- export function addStopToStopsFeatureStore(stop, stopsStore, stopsFeatureStore, projection, languageService) {
232
+ /**
233
+ * Adds a stop to the stopsFeatureStore.
234
+ *
235
+ * @param {Stop} stop - The stop to be added.
236
+ * @param {StopsFeatureStore} stopsFeatureStore - The stopsFeatureStore to add the stop to.
237
+ * @param {string} projection - The projection of the stop coordinates.
238
+ * @param {LanguageService} languageService - The language service for translating stop text.
239
+ */
240
+ export function addStopToStopsFeatureStore(stop, stopsFeatureStore, projection, languageService) {
212
241
  let stopColor;
213
242
  let stopText;
214
243
  switch (stop.relativePosition) {
215
244
  case DirectionRelativePositionType.Start:
216
245
  stopColor = '#008000';
217
- stopText = languageService.translate.instant('igo.geo.directionsForm.start');
246
+ stopText = languageService.translate.instant('igo.geo.directions.input.start');
218
247
  break;
219
248
  case DirectionRelativePositionType.End:
220
249
  stopColor = '#f64139';
221
- stopText = languageService.translate.instant('igo.geo.directionsForm.end');
250
+ stopText = languageService.translate.instant('igo.geo.directions.input.end');
222
251
  break;
223
252
  default:
224
253
  stopColor = '#ffd700';
225
254
  stopText =
226
- languageService.translate.instant('igo.geo.directionsForm.intermediate') +
255
+ languageService.translate.instant('igo.geo.directions.input.intermediate') +
227
256
  ' #' +
228
257
  stop.position;
229
258
  break;
230
259
  }
231
- const geometry = new olGeom.Point(olProj.transform(stop.coordinates, projection, stopsFeatureStore.map.projection));
232
- const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometry, {
233
- featureProjection: stopsFeatureStore.map.projection,
234
- dataProjection: stopsFeatureStore.map.projection
260
+ const point = new olGeom.Point(olProj.transform(stop.coordinates, projection, stopsFeatureStore.map.projectionCode));
261
+ const geojsonGeom = new OlGeoJSON().writeGeometryObject(point, {
262
+ featureProjection: stopsFeatureStore.map.projectionCode,
263
+ dataProjection: stopsFeatureStore.map.projectionCode
235
264
  });
236
265
  const previousStop = stopsFeatureStore.get(stop.id);
237
- const previousStopRevision = previousStop ? previousStop.meta.revision : 0;
266
+ const previousStopRevision = previousStop
267
+ ? previousStop.meta.revision
268
+ : 0;
238
269
  const stopFeatureStore = {
239
270
  type: FEATURE,
240
271
  geometry: geojsonGeom,
241
- projection: stopsFeatureStore.map.projection,
272
+ projection: stopsFeatureStore.map.projectionCode,
242
273
  properties: {
243
274
  id: stop.id,
244
- type: DirectionType.Stop,
275
+ type: DirectionsType.Stop,
245
276
  stopText,
246
277
  stopColor,
247
278
  stopOpacity: 1,
@@ -251,309 +282,241 @@ export function addStopToStopsFeatureStore(stop, stopsStore, stopsFeatureStore,
251
282
  id: stop.id,
252
283
  revision: previousStopRevision + 1
253
284
  },
254
- ol: new olFeature({ geometry })
285
+ ol: new olFeature({ point })
255
286
  };
256
287
  stopsFeatureStore.update(stopFeatureStore);
257
288
  }
258
- export function addDirectionToRoutesFeatureStore(routesFeatureStore, direction, projection, active = false) {
259
- const geom = direction.geometry.coordinates;
260
- const geometry4326 = new olGeom.LineString(geom);
261
- const geometry = geometry4326.transform(projection, routesFeatureStore.map.projection);
262
- const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometry, {
263
- featureProjection: routesFeatureStore.map.projection,
264
- dataProjection: routesFeatureStore.map.projection
289
+ /**
290
+ * Adds a route to the routes feature store.
291
+ *
292
+ * @param {RoutesFeatureStore} routesFeatureStore - The routes feature store to add the route to.
293
+ * @param {Directions} directions - The directions object containing the geometry and other information.
294
+ * @param {string} projection - The projection of the geometry coordinates.
295
+ * @param {boolean} [active=false] - Indicates whether the direction is active or not. Default is false.
296
+ */
297
+ export function addRouteToRoutesFeatureStore(routesFeatureStore, directions, projection, active = false) {
298
+ const coordinate = directions.geometry.coordinates;
299
+ const linestring4326 = new olGeom.LineString(coordinate);
300
+ const linestringStore = linestring4326.transform(projection, routesFeatureStore.map.projectionCode);
301
+ const geojsonGeom = new OlGeoJSON().writeGeometryObject(linestringStore, {
302
+ featureProjection: routesFeatureStore.map.projectionCode,
303
+ dataProjection: routesFeatureStore.map.projectionCode
265
304
  });
266
- const previousRoute = routesFeatureStore.get(direction.id);
267
- const previousRouteRevision = previousRoute ? previousRoute.meta.revision : 0;
305
+ const previousRoute = routesFeatureStore.get(directions.id);
306
+ const previousRouteRevision = previousRoute
307
+ ? previousRoute.meta.revision
308
+ : 0;
268
309
  const routeFeatureStore = {
269
310
  type: FEATURE,
270
311
  geometry: geojsonGeom,
271
- projection: routesFeatureStore.map.projection,
312
+ projection: routesFeatureStore.map.projectionCode,
272
313
  properties: {
273
- id: direction.id,
274
- type: DirectionType.Route,
314
+ id: directions.id,
315
+ type: DirectionsType.Route,
275
316
  active,
276
- direction
317
+ directions
277
318
  },
278
319
  meta: {
279
- id: direction.id,
320
+ id: directions.id,
280
321
  revision: previousRouteRevision + 1
281
322
  },
282
- ol: new olFeature({ geometry })
323
+ ol: new olFeature({ linestringStore })
283
324
  };
284
325
  routesFeatureStore.update(routeFeatureStore);
285
326
  }
286
- export function formatDistance(distance) {
287
- if (distance === 0) {
288
- return;
289
- }
290
- if (distance >= 100000) {
291
- return NumberUtils.roundToNDecimal(Math.round(distance) / 1000, 1) + ' km';
292
- }
293
- if (distance >= 10000) {
294
- return (NumberUtils.roundToNDecimal(Math.round(distance) / 100 / 10, 1) + ' km');
327
+ /**
328
+ * Formats the given distance in meters to a human-readable string.
329
+ *
330
+ * @param {number} meters - The distance in meters to be formatted.
331
+ * @return {string | undefined} The formatted distance string.
332
+ */
333
+ export function formatDistance(meters) {
334
+ if (meters === 0) {
335
+ return undefined;
295
336
  }
296
- if (distance >= 1000) {
297
- return (NumberUtils.roundToNDecimal(Math.round(distance) / 100 / 10, 1) + ' km');
337
+ if (meters < 1000) {
338
+ return `${Math.round(meters)} m`;
298
339
  }
299
- return NumberUtils.roundToNDecimal(distance, 0) + ' m';
340
+ const kilometers = meters / 1000;
341
+ const roundToDecimal = kilometers >= 10 ? 1 : 0;
342
+ return `${NumberUtils.roundToNDecimal(kilometers, roundToDecimal)} km`.replace('.', ',');
300
343
  }
301
- export function formatDuration(duration) {
302
- if (duration >= 3600) {
303
- const hour = Math.floor(duration / 3600);
304
- const minute = Math.round((duration / 3600 - hour) * 60);
305
- if (minute === 60) {
306
- return hour + 1 + ' h';
307
- }
308
- return hour + ' h ' + minute + ' min';
344
+ /**
345
+ * Formats the given duration in seconds to a human-readable string.
346
+ *
347
+ * @param {number} seconds - The duration in seconds to be formatted.
348
+ * @return {string} The formatted duration string.
349
+ */
350
+ export function formatDuration(seconds) {
351
+ const hours = Math.floor(seconds / 3600);
352
+ const minutes = Math.floor((seconds % 3600) / 60);
353
+ if (hours) {
354
+ return `${hours} h ${minutes} min`;
309
355
  }
310
- if (duration >= 60) {
311
- return Math.round(duration / 60) + ' min';
356
+ if (minutes) {
357
+ return `${minutes} min`;
312
358
  }
313
- return duration + ' s';
359
+ return '< 1 min';
314
360
  }
315
- export function formatInstruction(type, modifier, route = 'Voie', direction, stepPosition, exit, languageService, lastStep = false) {
361
+ export function formatStep(step, languageService, lastStep = false) {
362
+ const maneuverType = step.maneuver.type;
363
+ const maneuverModifier = step.maneuver.modifier;
364
+ const name = step.name;
365
+ const maneuverBearingAfter = step.maneuver.bearing_after;
316
366
  const translate = languageService.translate;
317
- let directive;
318
- let image = 'arrow_forward';
319
- let cssClass = 'rotate-270';
320
- const translatedDirection = translateBearing(direction, languageService);
321
- const translatedModifier = translateModifier(modifier, languageService);
322
- const prefix = modifier === 'straight'
323
- ? ''
324
- : translate.instant('igo.geo.directions.modifier.prefix');
325
- let aggregatedDirection = prefix + translatedModifier;
326
- if (modifier?.search('slight') >= 0) {
327
- aggregatedDirection = translatedModifier;
328
- }
329
- if (modifier === 'uturn') {
330
- image = 'arrow_forward';
331
- cssClass = 'rotate-90';
332
- }
333
- else if (modifier === 'sharp right') {
334
- image = 'subdirectory_arrow_right';
335
- cssClass = 'icon-flipped';
336
- }
337
- else if (modifier === 'right') {
338
- image = 'subdirectory_arrow_right';
339
- cssClass = 'icon-flipped';
340
- }
341
- else if (modifier === 'slight right') {
342
- image = 'arrow_forward';
343
- cssClass = 'rotate-290';
344
- }
345
- else if (modifier === 'straight') {
346
- image = 'arrow_forward';
347
- }
348
- else if (modifier === 'slight left') {
349
- image = 'arrow_forward';
350
- cssClass = 'rotate-250';
351
- }
352
- else if (modifier === 'left') {
353
- image = 'subdirectory_arrow_left';
354
- cssClass = 'icon-flipped';
355
- }
356
- else if (modifier === 'sharp left') {
357
- image = 'subdirectory_arrow_left';
358
- cssClass = 'icon-flipped';
359
- }
360
- if (type === 'turn') {
361
- if (modifier === 'straight') {
362
- directive = translate.instant('igo.geo.directions.turn.straight', {
363
- route
367
+ const translatedManeuverBearingAfter = translateManeuverBearing(maneuverBearingAfter, languageService);
368
+ const translatedManeuverModifier = translateManeuverModifier(maneuverModifier, languageService);
369
+ let iconName = 'straight'; // arrow point up by default
370
+ let instruction = '';
371
+ if (maneuverType === ManeuverType.Turn) {
372
+ if (maneuverModifier === ManeuverModifier.Uturn ||
373
+ maneuverModifier === ManeuverModifier.Straight) {
374
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.turn.${maneuverModifier}`, {
375
+ maneuverModifier: translatedManeuverModifier,
376
+ name
364
377
  });
365
- }
366
- else if (modifier === 'uturn') {
367
- directive = translate.instant('igo.geo.directions.turn.uturn', { route });
378
+ if (maneuverModifier === ManeuverModifier.Uturn) {
379
+ iconName = 'u_turn_left';
380
+ }
368
381
  }
369
382
  else {
370
- directive = translate.instant('igo.geo.directions.turn.else', {
371
- route,
372
- aggregatedDirection,
373
- translatedModifier
383
+ instruction = translate.instant('igo.geo.directions.results.maneuverType.turn.else', {
384
+ maneuverModifier: translatedManeuverModifier,
385
+ name
374
386
  });
387
+ if (maneuverModifier === ManeuverModifier.SlightRight) {
388
+ iconName = 'turn_slight_right';
389
+ }
390
+ else if (maneuverModifier === ManeuverModifier.Right ||
391
+ maneuverModifier === ManeuverModifier.SharpRight) {
392
+ iconName = 'turn_right';
393
+ }
394
+ else if (maneuverModifier === ManeuverModifier.Left ||
395
+ maneuverModifier === ManeuverModifier.SharpLeft) {
396
+ iconName = 'turn_left';
397
+ }
398
+ else if (maneuverModifier === ManeuverModifier.SlightLeft) {
399
+ iconName = 'turn_slight_left';
400
+ }
375
401
  }
376
402
  }
377
- else if (type === 'new name') {
378
- directive = translate.instant('igo.geo.directions.new name', {
379
- route,
380
- translatedDirection
403
+ else if (maneuverType === ManeuverType.NewName) {
404
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.new name`, {
405
+ name,
406
+ maneuverBearing: translatedManeuverBearingAfter
381
407
  });
382
- image = 'explore';
383
- cssClass = '';
384
408
  }
385
- else if (type === 'depart') {
386
- directive = translate.instant('igo.geo.directions.depart', {
387
- route,
388
- translatedDirection
409
+ else if (maneuverType === ManeuverType.Depart) {
410
+ iconName = 'directions';
411
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.depart`, {
412
+ name,
413
+ maneuverBearing: translatedManeuverBearingAfter
389
414
  });
390
- image = 'explore';
391
- cssClass = '';
392
415
  }
393
- else if (type === 'arrive') {
394
- if (lastStep) {
395
- const coma = !translatedModifier ? '' : ', ';
396
- aggregatedDirection = !translatedModifier ? '' : aggregatedDirection;
397
- directive = translate.instant('igo.geo.directions.arrive.lastStep', {
398
- coma,
399
- aggregatedDirection
400
- });
401
- }
402
- else {
403
- directive = translate.instant('igo.geo.directions.arrive.intermediate', {
404
- route
405
- });
406
- image = 'location_on';
407
- cssClass = '';
408
- }
416
+ else if (maneuverType === ManeuverType.Arrive) {
417
+ iconName = 'sports_score';
418
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.arrive.${lastStep ? 'lastStep' : 'intermediate'}`, {
419
+ name
420
+ });
409
421
  }
410
- else if (type === 'merge') {
411
- directive = translate.instant('igo.geo.directions.merge', { route });
412
- image = 'arrow_forward';
413
- cssClass = 'rotate-270';
422
+ else if (maneuverType === ManeuverType.Merge) {
423
+ instruction = translate.instant('igo.geo.directions.results.maneuverType.merge', {
424
+ name
425
+ });
426
+ iconName = 'merge';
414
427
  }
415
- else if (type === 'on ramp') {
416
- directive = translate.instant('igo.geo.directions.on ramp', {
417
- aggregatedDirection
428
+ else if (maneuverType === ManeuverType.OnRamp ||
429
+ maneuverType === ManeuverType.OffRamp) {
430
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.${maneuverType}`, {
431
+ maneuverModifier: translatedManeuverModifier
418
432
  });
419
433
  }
420
- else if (type === 'off ramp') {
421
- directive = translate.instant('igo.geo.directions.off ramp', {
422
- aggregatedDirection
434
+ else if (maneuverType === ManeuverType.Fork) {
435
+ const directionKey = maneuverModifier.search('left') >= 0 ? 'left' : 'right';
436
+ iconName =
437
+ directionKey === 'left' ? 'turn_slight_left' : 'turn_slight_right';
438
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.fork.${directionKey}`, {
439
+ name
423
440
  });
424
441
  }
425
- else if (type === 'fork') {
426
- if (modifier.search('left') >= 0) {
427
- directive = translate.instant('igo.geo.directions.fork.left', { route });
428
- }
429
- else if (modifier.search('right') >= 0) {
430
- directive = translate.instant('igo.geo.directions.fork.right', { route });
442
+ else if (maneuverType === ManeuverType.EndOfRoad ||
443
+ maneuverType === ManeuverType.UseLane ||
444
+ maneuverType === ManeuverType.Continue) {
445
+ if (maneuverType === ManeuverType.Continue) {
446
+ if (maneuverModifier === ManeuverModifier.Uturn) {
447
+ iconName = 'u_turn_left';
448
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.turn.${maneuverModifier}`, {
449
+ maneuverModifier: translatedManeuverModifier,
450
+ name
451
+ });
452
+ }
453
+ else {
454
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.${maneuverType}`, {
455
+ maneuverModifier: translatedManeuverModifier,
456
+ name
457
+ });
458
+ }
431
459
  }
432
460
  else {
433
- directive = translate.instant('igo.geo.directions.fork.else', { route });
461
+ if (maneuverModifier === ManeuverModifier.SharpRight ||
462
+ maneuverModifier === ManeuverModifier.Right) {
463
+ iconName = 'turn_right';
464
+ }
465
+ else if (maneuverModifier === ManeuverModifier.SharpLeft ||
466
+ maneuverModifier === ManeuverModifier.Left) {
467
+ iconName = 'turn_left';
468
+ }
469
+ else if (maneuverModifier === ManeuverModifier.SlightRight) {
470
+ iconName = 'turn_slight_right';
471
+ }
472
+ else if (maneuverModifier === ManeuverModifier.SlightLeft) {
473
+ iconName = 'turn_slight_left';
474
+ }
475
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.${maneuverType}`, {
476
+ maneuverModifier: translatedManeuverModifier,
477
+ name
478
+ });
434
479
  }
435
480
  }
436
- else if (type === 'end of road') {
437
- directive = translate.instant('igo.geo.directions.end of road', {
438
- translatedModifier,
439
- route
440
- });
441
- }
442
- else if (type === 'use lane') {
443
- directive = translate.instant('igo.geo.directions.use lane');
444
- }
445
- else if (type === 'continue' && modifier !== 'uturn') {
446
- directive = translate.instant('igo.geo.directions.continue.notUturn', {
447
- route
448
- });
449
- image = 'arrow_forward';
450
- cssClass = 'rotate-270';
451
- }
452
- else if (type === 'roundabout') {
453
- const cntSuffix = exit === 1
454
- ? translate.instant('igo.geo.directions.cntSuffix.first')
455
- : translate.instant('igo.geo.directions.cntSuffix.secondAndMore');
456
- directive = translate.instant('igo.geo.directions.roundabout', {
457
- exit,
458
- cntSuffix,
459
- route
481
+ else if (maneuverType === ManeuverType.Roundabout ||
482
+ maneuverType === ManeuverType.Rotary ||
483
+ maneuverType === ManeuverType.RoundaboutTurn ||
484
+ maneuverType === ManeuverType.ExitRoundabout) {
485
+ const roundaboutKey = maneuverType.replace('roundabout ', '');
486
+ instruction = translate.instant(`igo.geo.directions.results.maneuverType.${roundaboutKey}`, {
487
+ name
460
488
  });
461
- image = 'donut_large';
462
- cssClass = '';
489
+ iconName = 'donut_large';
463
490
  }
464
- else if (type === 'rotary') {
465
- directive = translate.instant('igo.geo.directions.rotary');
466
- image = 'donut_large';
467
- cssClass = '';
491
+ else if (maneuverType === ManeuverType.Notification) {
492
+ instruction = translate.instant('igo.geo.directions.results.maneuverType.notification');
468
493
  }
469
- else if (type === 'roundabout turn') {
470
- directive = translate.instant('igo.geo.directions.roundabout turn');
471
- image = 'donut_large';
472
- cssClass = '';
473
- }
474
- else if (type === 'exit roundabout') {
475
- directive = translate.instant('igo.geo.directions.exit roundabout', {
476
- route
477
- });
478
- image = 'arrow_forward';
479
- cssClass = 'rotate-270';
480
- }
481
- else if (type === 'notification') {
482
- directive = translate.instant('igo.geo.directions.notification');
483
- }
484
- else if (modifier === 'uturn') {
485
- directive = translate.instant('igo.geo.directions.uturnText', {
486
- translatedDirection,
487
- route
488
- });
489
- }
490
- else {
491
- directive = translate.instant('igo.geo.directions.unknown');
492
- }
493
- image = lastStep ? 'flag' : image;
494
- cssClass = lastStep ? '' : cssClass;
495
- image = stepPosition === 0 ? 'explore' : image;
496
- cssClass = stepPosition === 0 ? '' : cssClass;
497
- return { instruction: directive, image, cssClass };
494
+ return { instruction, iconName };
498
495
  }
499
- export function translateModifier(modifier, languageService) {
496
+ /**
497
+ * Translates a maneuver modifier into a human-readable string using the provided language service.
498
+ *
499
+ * @param {ManeuverModifier} maneuverModifier - The maneuver modifier to be translated.
500
+ * @param {LanguageService} languageService - The language service used for translation.
501
+ * @return {string | undefined} The translated maneuver modifier string, or undefined if the modifier is falsy.
502
+ */
503
+ export function translateManeuverModifier(maneuverModifier, languageService) {
500
504
  const translate = languageService.translate;
501
- if (modifier === 'uturn') {
502
- return translate.instant('igo.geo.directions.uturn');
503
- }
504
- else if (modifier === 'sharp right') {
505
- return translate.instant('igo.geo.directions.sharp right');
506
- }
507
- else if (modifier === 'right') {
508
- return translate.instant('igo.geo.directions.right');
509
- }
510
- else if (modifier === 'slight right') {
511
- return translate.instant('igo.geo.directions.slight right');
512
- }
513
- else if (modifier === 'sharp left') {
514
- return languageService.translate.instant('igo.geo.directions.sharp left');
515
- }
516
- else if (modifier === 'left') {
517
- return languageService.translate.instant('igo.geo.directions.left');
518
- }
519
- else if (modifier === 'slight left') {
520
- return languageService.translate.instant('igo.geo.directions.slight left');
521
- }
522
- else if (modifier === 'straight') {
523
- return languageService.translate.instant('igo.geo.directions.straight');
524
- }
525
- else {
526
- return modifier;
527
- }
505
+ return maneuverModifier
506
+ ? translate.instant(`igo.geo.directions.results.maneuverModifier.${maneuverModifier}`)
507
+ : undefined;
528
508
  }
529
- export function translateBearing(bearing, languageService) {
509
+ /**
510
+ * Translates the given bearing value into a human-readable direction using the provided language service.
511
+ *
512
+ * @param {number} bearing - The bearing value to be translated.
513
+ * @param {LanguageService} languageService - The language service used for translation.
514
+ * @return {string} The translated direction corresponding to the given bearing value.
515
+ */
516
+ export function translateManeuverBearing(bearing, languageService) {
530
517
  const translate = languageService.translate;
531
- if (bearing >= 337 || bearing < 23) {
532
- return translate.instant('igo.geo.cardinalPoints.n');
533
- }
534
- else if (bearing < 67) {
535
- return translate.instant('igo.geo.cardinalPoints.ne');
536
- }
537
- else if (bearing < 113) {
538
- return translate.instant('igo.geo.cardinalPoints.e');
539
- }
540
- else if (bearing < 157) {
541
- return translate.instant('igo.geo.cardinalPoints.se');
542
- }
543
- else if (bearing < 203) {
544
- return translate.instant('igo.geo.cardinalPoints.s');
545
- }
546
- else if (bearing < 247) {
547
- return translate.instant('igo.geo.cardinalPoints.sw');
548
- }
549
- else if (bearing < 293) {
550
- return translate.instant('igo.geo.cardinalPoints.w');
551
- }
552
- else if (bearing < 337) {
553
- return translate.instant('igo.geo.cardinalPoints.nw');
554
- }
555
- else {
556
- return;
557
- }
518
+ const directions = ['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'];
519
+ const directionIndex = Math.round(bearing / 45) % 8;
520
+ return translate.instant(`igo.geo.directions.results.direction.${directions[directionIndex]}`);
558
521
  }
559
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2RpcmVjdGlvbnMvc2hhcmVkL2RpcmVjdGlvbnMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEQsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2pHLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsYUFBYSxFQUNkLE1BQU0sbUJBQW1CLENBQUM7QUFjM0I7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFVBQXNCLEVBQ3RCLFlBQTRCLEtBQUssRUFDakMsS0FBSyxHQUFHLFVBQVU7SUFFbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIs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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTnVtYmVyVXRpbHMsIHV1aWQgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCBvbEZlYXR1cmUgZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCAqIGFzIG9sR2VvbSBmcm9tICdvbC9nZW9tJztcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5IH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5pbXBvcnQgKiBhcyBvbFByb2ogZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgKiBhcyBvbFN0eWxlIGZyb20gJ29sL3N0eWxlJztcblxuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9mZWF0dXJlLWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgdHJ5QmluZFN0b3JlTGF5ZXIgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLXN0b3JlLnV0aWxzJztcbmltcG9ydCB7IEZFQVRVUkUsIEZlYXR1cmVNb3Rpb24gfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLmVudW1zJztcbmltcG9ydCB7IEZlYXR1cmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cnlBZGRMb2FkaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9zdHJhdGVnaWVzLnV0aWxzJztcbmltcG9ydCB7IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0cmF0ZWdpZXMvbG9hZGluZyc7XG5pbXBvcnQgeyBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvdmVjdG9yLWxheWVyJztcbmltcG9ydCB7IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlL3NoYXJlZC9vdmVybGF5L292ZXJsYXktbWFya2VyLXN0eWxlLnV0aWxzJztcbmltcG9ydCB7XG4gIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLFxuICBEaXJlY3Rpb25UeXBlXG59IGZyb20gJy4vZGlyZWN0aW9ucy5lbnVtJztcbmltcG9ydCB7XG4gIERpcmVjdGlvbixcbiAgRmVhdHVyZVdpdGhEaXJlY3Rpb24sXG4gIEZlYXR1cmVXaXRoU3RvcCxcbiAgU3RvcFxufSBmcm9tICcuL2RpcmVjdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIFJvdXRlc0ZlYXR1cmVTdG9yZSxcbiAgU3RlcEZlYXR1cmVTdG9yZSxcbiAgU3RvcHNGZWF0dXJlU3RvcmUsXG4gIFN0b3BzU3RvcmVcbn0gZnJvbSAnLi9zdG9yZSc7XG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCB1cGRhdCB0aGUgc29ydCBvZiB0aGUgbGlzdCBiYXNlIG9uIHRoZSBwcm92aWRlZCBmaWVsZC5cbiAqIEBwYXJhbSBzb3VyY2Ugc3RvcCBzdG9yZVxuICogQHBhcmFtIGRpcmVjdGlvbiBhc2MgLyBkZXNjIHNvcnQgb3JkZXJcbiAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gdXNlIHRvIHNvcnQgdGhlIHZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0b3JlU29ydGluZyhcbiAgc3RvcHNTdG9yZTogU3RvcHNTdG9yZSxcbiAgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnLFxuICBmaWVsZCA9ICdwb3NpdGlvbidcbikge1xuICBzdG9wc1N0b3JlLnZpZXcuc29ydCh7XG4gICAgZGlyZWN0aW9uLFxuICAgIHZhbHVlQWNjZXNzb3I6IChlbnRpdHk6IFN0b3ApID0+IGVudGl0eVtmaWVsZF1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbihcbiAgaW5kZXg6IG51bWJlcixcbiAgdG90YWxMZW5ndGhcbik6IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlIHtcbiAgbGV0IHJlbGF0aXZlUG9zaXRpb24gPSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5JbnRlcm1lZGlhdGU7XG4gIGlmIChpbmRleCA9PT0gMCkge1xuICAgIHJlbGF0aXZlUG9zaXRpb24gPSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5TdGFydDtcbiAgfSBlbHNlIGlmIChpbmRleCA9PT0gdG90YWxMZW5ndGggLSAxKSB7XG4gICAgcmVsYXRpdmVQb3NpdGlvbiA9IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkVuZDtcbiAgfVxuICByZXR1cm4gcmVsYXRpdmVQb3NpdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUpIHtcbiAgY29uc3Qgc3RvcHNUb0NvbXB1dGVQb3NpdGlvbiA9IFsuLi5zdG9wc1N0b3JlLmFsbCgpXTtcbiAgc3RvcHNUb0NvbXB1dGVQb3NpdGlvbi5zb3J0KChhLCBiKSA9PiBhLnBvc2l0aW9uIC0gYi5wb3NpdGlvbik7XG4gIHN0b3BzVG9Db21wdXRlUG9zaXRpb24ubWFwKChzdG9wLCBpKSA9PiB7XG4gICAgc3RvcC5wb3NpdGlvbiA9IGk7XG4gICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBzdG9wLnBvc2l0aW9uLFxuICAgICAgc3RvcHNUb0NvbXB1dGVQb3NpdGlvbi5sZW5ndGhcbiAgICApO1xuICB9KTtcbiAgaWYgKHN0b3BzVG9Db21wdXRlUG9zaXRpb24pIHtcbiAgICBzdG9wc1N0b3JlLnVwZGF0ZU1hbnkoc3RvcHNUb0NvbXB1dGVQb3NpdGlvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGFkZCBhIHN0b3AgdG8gdGhlIHN0b3Agc3RvcmUuIFN0b3AgYXJlIGFsd2F5cyBhZGRlZCBiZWZvcmUgdGhlIGxhc3Qgc3RvcC5cbiAqIEBwYXJhbSBzdG9wc1N0b3JlIHN0b3Agc3RvcmUgYXMgYW4gRW50aXR5U3RvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0b3BUb1N0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUpOiBTdG9wIHtcbiAgY29uc3QgaWQgPSB1dWlkKCk7XG4gIGNvbnN0IHN0b3BzID0gc3RvcHNTdG9yZS5hbGwoKTtcbiAgbGV0IHBvc2l0aW9uczogbnVtYmVyW107XG4gIGlmIChzdG9wc1N0b3JlLmNvdW50ID09PSAwKSB7XG4gICAgcG9zaXRpb25zID0gWzBdO1xuICB9IGVsc2Uge1xuICAgIHBvc2l0aW9ucyA9IHN0b3BzLm1hcCgoc3RvcCkgPT4gc3RvcC5wb3NpdGlvbik7XG4gIH1cbiAgY29uc3QgbWF4UG9zaXRpb246IG51bWJlciA9IE1hdGgubWF4KC4uLnBvc2l0aW9ucyk7XG4gIGNvbnN0IGluc2VydFBvc2l0aW9uOiBudW1iZXIgPSBtYXhQb3NpdGlvbjtcbiAgY29uc3QgbGFzdFBvc2l0aW9uOiBudW1iZXIgPSBtYXhQb3NpdGlvbiArIDE7XG5cbiAgY29uc3Qgc3RvcFRvVXBkYXRlID0gc3RvcHNTdG9yZVxuICAgIC5hbGwoKVxuICAgIC5maW5kKChzdG9wKSA9PiBzdG9wLnBvc2l0aW9uID09PSBtYXhQb3NpdGlvbik7XG4gIGlmIChzdG9wVG9VcGRhdGUpIHtcbiAgICBzdG9wVG9VcGRhdGUucG9zaXRpb24gPSBsYXN0UG9zaXRpb247XG4gICAgc3RvcFRvVXBkYXRlLnJlbGF0aXZlUG9zaXRpb24gPSBjb21wdXRlUmVsYXRpdmVQb3NpdGlvbihcbiAgICAgIGxhc3RQb3NpdGlvbixcbiAgICAgIHN0b3BzU3RvcmUuY291bnQgKyAxXG4gICAgKTtcbiAgfVxuXG4gIHN0b3BzU3RvcmUuaW5zZXJ0KHtcbiAgICBpZCxcbiAgICBwb3NpdGlvbjogaW5zZXJ0UG9zaXRpb24sXG4gICAgcmVsYXRpdmVQb3NpdGlvbjogY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBpbnNlcnRQb3NpdGlvbixcbiAgICAgIHN0b3BzU3RvcmUuY291bnQgKyAxXG4gICAgKVxuICB9KTtcblxuICB1cGRhdGVTdG9yZVNvcnRpbmcoc3RvcHNTdG9yZSk7XG4gIHJldHVybiBzdG9wc1N0b3JlLmdldChpZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdG9wRnJvbVN0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUsIHN0b3A6IFN0b3ApIHtcbiAgc3RvcHNTdG9yZS5kZWxldGUoc3RvcCk7XG4gIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKHN0b3BzU3RvcmUpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0eWxlIGZvciB0aGUgZGlyZWN0aW9ucyBzdG9wcyBhbmQgcm91dGVzXG4gKiBAcGFyYW0gZmVhdHVyZSBPbEZlYXR1cmVcbiAqIEByZXR1cm5zIE9MIHN0eWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3Rpb25zU3R5bGUoXG4gIGZlYXR1cmU6IG9sRmVhdHVyZTxPbEdlb21ldHJ5PlxuKTogb2xTdHlsZS5TdHlsZSB8IG9sU3R5bGUuU3R5bGVbXSB7XG4gIGNvbnN0IHZlcnRleFN0eWxlID0gW1xuICAgIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgIGdlb21ldHJ5OiBmZWF0dXJlLmdldEdlb21ldHJ5KCksXG4gICAgICBpbWFnZTogbmV3IG9sU3R5bGUuQ2lyY2xlKHtcbiAgICAgICAgcmFkaXVzOiA3LFxuICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7IGNvbG9yOiAnI0ZGMDAwMCcsIHdpZHRoOiAzIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIF07XG5cbiAgY29uc3Qgc3RvcFN0eWxlID0gY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKHtcbiAgICB0ZXh0OiBmZWF0dXJlLmdldCgnc3RvcFRleHQnKSxcbiAgICBvcGFjaXR5OiBmZWF0dXJlLmdldCgnc3RvcE9wYWNpdHknKSxcbiAgICBtYXJrZXJDb2xvcjogZmVhdHVyZS5nZXQoJ3N0b3BDb2xvcicpLFxuICAgIG1hcmtlck91dGxpbmVDb2xvcjogWzI1NSwgMjU1LCAyNTVdXG4gIH0pO1xuXG4gIGNvbnN0IHJvdXRlU3R5bGUgPSBbXG4gICAgbmV3IG9sU3R5bGUuU3R5bGUoe1xuICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xuICAgICAgICBjb2xvcjogYHJnYmEoMTA2LCAxMjEsIDEzMCwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDEwXG4gICAgICB9KVxuICAgIH0pLFxuICAgIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgIHN0cm9rZTogbmV3IG9sU3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgY29sb3I6IGByZ2JhKDc5LCAxNjksIDIyMSwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDZcbiAgICAgIH0pXG4gICAgfSlcbiAgXTtcblxuICBpZiAoZmVhdHVyZS5nZXQoJ3R5cGUnKSA9PT0gRGlyZWN0aW9uVHlwZS5TdG9wKSB7XG4gICAgcmV0dXJuIHN0b3BTdHlsZTtcbiAgfVxuICBpZiAoZmVhdHVyZS5nZXQoJ3R5cGUnKSA9PT0gJ3ZlcnRleCcpIHtcbiAgICByZXR1cm4gdmVydGV4U3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09IERpcmVjdGlvblR5cGUuUm91dGUpIHtcbiAgICByZXR1cm4gcm91dGVTdHlsZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdFN0b3BzRmVhdHVyZVN0b3JlKFxuICBzdG9wc0ZlYXR1cmVTdG9yZTogU3RvcHNGZWF0dXJlU3RvcmUsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlXG4pIHtcbiAgY29uc3QgbG9hZGluZ1N0cmF0ZWd5ID0gbmV3IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSh7XG4gICAgbW90aW9uOiBGZWF0dXJlTW90aW9uLk5vbmVcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcHNMYXllciA9IG5ldyBWZWN0b3JMYXllcih7XG4gICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxuICAgIGlkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgdGl0bGU6IGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnN0b3BMYXllcidcbiAgICApLFxuICAgIHpJbmRleDogOTExLFxuICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgc2hvd0luTGF5ZXJMaXN0OiB0cnVlLFxuICAgIHdvcmtzcGFjZToge1xuICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICB9LFxuICAgIGxpbmtlZExheWVyczoge1xuICAgICAgbGlua0lkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgICBsaW5rczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3luY2VkRGVsZXRlOiB0cnVlLFxuICAgICAgICAgIGxpbmtlZElkczogWydpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ10sXG4gICAgICAgICAgcHJvcGVydGllczogW11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHN0b3BzRmVhdHVyZVN0b3JlLCBzdG9wc0xheWVyKTtcbiAgc3RvcHNGZWF0dXJlU3RvcmUubGF5ZXIudmlzaWJsZSA9IHRydWU7XG4gIHRyeUFkZExvYWRpbmdTdHJhdGVneShzdG9wc0ZlYXR1cmVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRSb3V0ZXNGZWF0dXJlU3RvcmUoXG4gIHJvdXRlc0ZlYXR1cmVTdG9yZTogUm91dGVzRmVhdHVyZVN0b3JlLFxuICBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZVxuKSB7XG4gIGNvbnN0IGxvYWRpbmdTdHJhdGVneSA9IG5ldyBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3koe1xuICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lXG4gIH0pO1xuXG4gIGNvbnN0IHJvdXRlTGF5ZXIgPSBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcbiAgICBpZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInLFxuICAgIHRpdGxlOiBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5yb3V0ZUxheWVyJ1xuICAgICksXG4gICAgekluZGV4OiA5MTAsXG4gICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcbiAgICBzaG93SW5MYXllckxpc3Q6IHRydWUsXG4gICAgd29ya3NwYWNlOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZVxuICAgIH0sXG4gICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICBsaW5rSWQ6ICdpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ1xuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHJvdXRlc0ZlYXR1cmVTdG9yZSwgcm91dGVMYXllcik7XG4gIHJvdXRlc0ZlYXR1cmVTdG9yZS5sYXllci52aXNpYmxlID0gdHJ1ZTtcbiAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KHJvdXRlc0ZlYXR1cmVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRTdGVwRmVhdHVyZVN0b3JlKHN0ZXBGZWF0dXJlU3RvcmU6IFN0ZXBGZWF0dXJlU3RvcmUpIHtcbiAgY29uc3QgbG9hZGluZ1N0cmF0ZWd5ID0gbmV3IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSh7XG4gICAgbW90aW9uOiBGZWF0dXJlTW90aW9uLk5vbmVcbiAgfSk7XG5cbiAgY29uc3Qgc3RlcExheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgaWQ6ICdpZ28tZGlyZWN0aW9uLXN0ZXAtbGF5ZXInLFxuICAgIHRpdGxlOiAnJyxcbiAgICB6SW5kZXg6IDkxMCxcbiAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxuICAgIHNob3dJbkxheWVyTGlzdDogZmFsc2UsXG4gICAgd29ya3NwYWNlOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZVxuICAgIH0sXG4gICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICBsaW5rSWQ6ICdpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ1xuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogZmFsc2UsXG4gICAgYnJvd3NhYmxlOiBmYWxzZSxcbiAgICBzdHlsZTogZGlyZWN0aW9uc1N0eWxlXG4gIH0pO1xuICB0cnlCaW5kU3RvcmVMYXllcihzdGVwRmVhdHVyZVN0b3JlLCBzdGVwTGF5ZXIpO1xuICBzdGVwRmVhdHVyZVN0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xuICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3koc3RlcEZlYXR1cmVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0b3BUb1N0b3BzRmVhdHVyZVN0b3JlKFxuICBzdG9wOiBTdG9wLFxuICBzdG9wc1N0b3JlOiBTdG9wc1N0b3JlLFxuICBzdG9wc0ZlYXR1cmVTdG9yZTogU3RvcHNGZWF0dXJlU3RvcmUsXG4gIHByb2plY3Rpb246IHN0cmluZyxcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbikge1xuICBsZXQgc3RvcENvbG9yO1xuICBsZXQgc3RvcFRleHQ7XG5cbiAgc3dpdGNoIChzdG9wLnJlbGF0aXZlUG9zaXRpb24pIHtcbiAgICBjYXNlIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLlN0YXJ0OlxuICAgICAgc3RvcENvbG9yID0gJyMwMDgwMDAnO1xuICAgICAgc3RvcFRleHQgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnN0YXJ0J1xuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGUuRW5kOlxuICAgICAgc3RvcENvbG9yID0gJyNmNjQxMzknO1xuICAgICAgc3RvcFRleHQgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmVuZCdcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RvcENvbG9yID0gJyNmZmQ3MDAnO1xuICAgICAgc3RvcFRleHQgPVxuICAgICAgICBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uaW50ZXJtZWRpYXRlJ1xuICAgICAgICApICtcbiAgICAgICAgJyAjJyArXG4gICAgICAgIHN0b3AucG9zaXRpb247XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IGdlb21ldHJ5ID0gbmV3IG9sR2VvbS5Qb2ludChcbiAgICBvbFByb2oudHJhbnNmb3JtKFxuICAgICAgc3RvcC5jb29yZGluYXRlcyxcbiAgICAgIHByb2plY3Rpb24sXG4gICAgICBzdG9wc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvblxuICAgIClcbiAgKTtcblxuICBjb25zdCBnZW9qc29uR2VvbSA9IG5ldyBPbEdlb0pTT04oKS53cml0ZUdlb21ldHJ5T2JqZWN0KGdlb21ldHJ5LCB7XG4gICAgZmVhdHVyZVByb2plY3Rpb246IHN0b3BzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uLFxuICAgIGRhdGFQcm9qZWN0aW9uOiBzdG9wc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvblxuICB9KSBhcyBGZWF0dXJlR2VvbWV0cnk7XG5cbiAgY29uc3QgcHJldmlvdXNTdG9wID0gc3RvcHNGZWF0dXJlU3RvcmUuZ2V0KHN0b3AuaWQpO1xuICBjb25zdCBwcmV2aW91c1N0b3BSZXZpc2lvbiA9IHByZXZpb3VzU3RvcCA/IHByZXZpb3VzU3RvcC5tZXRhLnJldmlzaW9uIDogMDtcblxuICBjb25zdCBzdG9wRmVhdHVyZVN0b3JlOiBGZWF0dXJlV2l0aFN0b3AgPSB7XG4gICAgdHlwZTogRkVBVFVSRSxcbiAgICBnZW9tZXRyeTogZ2VvanNvbkdlb20sXG4gICAgcHJvamVjdGlvbjogc3RvcHNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb24sXG4gICAgcHJvcGVydGllczoge1xuICAgICAgaWQ6IHN0b3AuaWQsXG4gICAgICB0eXBlOiBEaXJlY3Rpb25UeXBlLlN0b3AsXG4gICAgICBzdG9wVGV4dCxcbiAgICAgIHN0b3BDb2xvcixcbiAgICAgIHN0b3BPcGFjaXR5OiAxLFxuICAgICAgc3RvcFxuICAgIH0sXG4gICAgbWV0YToge1xuICAgICAgaWQ6IHN0b3AuaWQsXG4gICAgICByZXZpc2lvbjogcHJldmlvdXNTdG9wUmV2aXNpb24gKyAxXG4gICAgfSxcbiAgICBvbDogbmV3IG9sRmVhdHVyZSh7IGdlb21ldHJ5IH0pXG4gIH07XG4gIHN0b3BzRmVhdHVyZVN0b3JlLnVwZGF0ZShzdG9wRmVhdHVyZVN0b3JlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZERpcmVjdGlvblRvUm91dGVzRmVhdHVyZVN0b3JlKFxuICByb3V0ZXNGZWF0dXJlU3RvcmU6IFJvdXRlc0ZlYXR1cmVTdG9yZSxcbiAgZGlyZWN0aW9uOiBEaXJlY3Rpb24sXG4gIHByb2plY3Rpb246IHN0cmluZyxcbiAgYWN0aXZlID0gZmFsc2Vcbikge1xuICBjb25zdCBnZW9tID0gZGlyZWN0aW9uLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICBjb25zdCBnZW9tZXRyeTQzMjYgPSBuZXcgb2xHZW9tLkxpbmVTdHJpbmcoZ2VvbSk7XG4gIGNvbnN0IGdlb21ldHJ5ID0gZ2VvbWV0cnk0MzI2LnRyYW5zZm9ybShcbiAgICBwcm9qZWN0aW9uLFxuICAgIHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvblxuICApO1xuXG4gIGNvbnN0IGdlb2pzb25HZW9tID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoZ2VvbWV0cnksIHtcbiAgICBmZWF0dXJlUHJvamVjdGlvbjogcm91dGVzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uLFxuICAgIGRhdGFQcm9qZWN0aW9uOiByb3V0ZXNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb25cbiAgfSkgYXMgRmVhdHVyZUdlb21ldHJ5O1xuXG4gIGNvbnN0IHByZXZpb3VzUm91dGUgPSByb3V0ZXNGZWF0dXJlU3RvcmUuZ2V0KGRpcmVjdGlvbi5pZCk7XG4gIGNvbnN0IHByZXZpb3VzUm91dGVSZXZpc2lvbiA9IHByZXZpb3VzUm91dGUgPyBwcmV2aW91c1JvdXRlLm1ldGEucmV2aXNpb24gOiAwO1xuXG4gIGNvbnN0IHJvdXRlRmVhdHVyZVN0b3JlOiBGZWF0dXJlV2l0aERpcmVjdGlvbiA9IHtcbiAgICB0eXBlOiBGRUFUVVJFLFxuICAgIGdlb21ldHJ5OiBnZW9qc29uR2VvbSxcbiAgICBwcm9qZWN0aW9uOiByb3V0ZXNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb24sXG4gICAgcHJvcGVydGllczoge1xuICAgICAgaWQ6IGRpcmVjdGlvbi5pZCxcbiAgICAgIHR5cGU6IERpcmVjdGlvblR5cGUuUm91dGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBkaXJlY3Rpb25cbiAgICB9LFxuICAgIG1ldGE6IHtcbiAgICAgIGlkOiBkaXJlY3Rpb24uaWQsXG4gICAgICByZXZpc2lvbjogcHJldmlvdXNSb3V0ZVJldmlzaW9uICsgMVxuICAgIH0sXG4gICAgb2w6IG5ldyBvbEZlYXR1cmUoeyBnZW9tZXRyeSB9KVxuICB9O1xuICByb3V0ZXNGZWF0dXJlU3RvcmUudXBkYXRlKHJvdXRlRmVhdHVyZVN0b3JlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERpc3RhbmNlKGRpc3RhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGlzdGFuY2UgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGRpc3RhbmNlID49IDEwMDAwMCkge1xuICAgIHJldHVybiBOdW1iZXJVdGlscy5yb3VuZFRvTkRlY2ltYWwoTWF0aC5yb3VuZChkaXN0YW5jZSkgLyAxMDAwLCAxKSArICcga20nO1xuICB9XG4gIGlmIChkaXN0YW5jZSA+PSAxMDAwMCkge1xuICAgIHJldHVybiAoXG4gICAgICBOdW1iZXJVdGlscy5yb3VuZFRvTkRlY2ltYWwoTWF0aC5yb3VuZChkaXN0YW5jZSkgLyAxMDAgLyAxMCwgMSkgKyAnIGttJ1xuICAgICk7XG4gIH1cbiAgaWYgKGRpc3RhbmNlID49IDEwMDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgTnVtYmVyVXRpbHMucm91bmRUb05EZWNpbWFsKE1hdGgucm91bmQoZGlzdGFuY2UpIC8gMTAwIC8gMTAsIDEpICsgJyBrbSdcbiAgICApO1xuICB9XG4gIHJldHVybiBOdW1iZXJVdGlscy5yb3VuZFRvTkRlY2ltYWwoZGlzdGFuY2UsIDApICsgJyBtJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZHVyYXRpb24gPj0gMzYwMCkge1xuICAgIGNvbnN0IGhvdXIgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gMzYwMCk7XG4gICAgY29uc3QgbWludXRlID0gTWF0aC5yb3VuZCgoZHVyYXRpb24gLyAzNjAwIC0gaG91cikgKiA2MCk7XG4gICAgaWYgKG1pbnV0ZSA9PT0gNjApIHtcbiAgICAgIHJldHVybiBob3VyICsgMSArICcgaCc7XG4gICAgfVxuICAgIHJldHVybiBob3VyICsgJyBoICcgKyBtaW51dGUgKyAnIG1pbic7XG4gIH1cblxuICBpZiAoZHVyYXRpb24gPj0gNjApIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChkdXJhdGlvbiAvIDYwKSArICcgbWluJztcbiAgfVxuICByZXR1cm4gZHVyYXRpb24gKyAnIHMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SW5zdHJ1Y3Rpb24oXG4gIHR5cGUsXG4gIG1vZGlmaWVyLFxuICByb3V0ZSA9ICdWb2llJyxcbiAgZGlyZWN0aW9uLFxuICBzdGVwUG9zaXRpb24sXG4gIGV4aXQsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICBsYXN0U3RlcCA9IGZhbHNlXG4pIHtcbiAgY29uc3QgdHJhbnNsYXRlID0gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgbGV0IGRpcmVjdGl2ZTtcbiAgbGV0IGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICBsZXQgY3NzQ2xhc3MgPSAncm90YXRlLTI3MCc7XG4gIGNvbnN0IHRyYW5zbGF0ZWREaXJlY3Rpb24gPSB0cmFuc2xhdGVCZWFyaW5nKGRpcmVjdGlvbiwgbGFuZ3VhZ2VTZXJ2aWNlKTtcbiAgY29uc3QgdHJhbnNsYXRlZE1vZGlmaWVyID0gdHJhbnNsYXRlTW9kaWZpZXIobW9kaWZpZXIsIGxhbmd1YWdlU2VydmljZSk7XG4gIGNvbnN0IHByZWZpeCA9XG4gICAgbW9kaWZpZXIgPT09ICdzdHJhaWdodCdcbiAgICAgID8gJydcbiAgICAgIDogdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5tb2RpZmllci5wcmVmaXgnKTtcblxuICBsZXQgYWdncmVnYXRlZERpcmVjdGlvbiA9IHByZWZpeCArIHRyYW5zbGF0ZWRNb2RpZmllcjtcblxuICBpZiAobW9kaWZpZXI/LnNlYXJjaCgnc2xpZ2h0JykgPj0gMCkge1xuICAgIGFnZ3JlZ2F0ZWREaXJlY3Rpb24gPSB0cmFuc2xhdGVkTW9kaWZpZXI7XG4gIH1cblxuICBpZiAobW9kaWZpZXIgPT09ICd1dHVybicpIHtcbiAgICBpbWFnZSA9ICdhcnJvd19mb3J3YXJkJztcbiAgICBjc3NDbGFzcyA9ICdyb3RhdGUtOTAnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgcmlnaHQnKSB7XG4gICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5X2Fycm93X3JpZ2h0JztcbiAgICBjc3NDbGFzcyA9ICdpY29uLWZsaXBwZWQnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAncmlnaHQnKSB7XG4gICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5X2Fycm93X3JpZ2h0JztcbiAgICBjc3NDbGFzcyA9ICdpY29uLWZsaXBwZWQnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IHJpZ2h0Jykge1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yOTAnO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc3RyYWlnaHQnKSB7XG4gICAgaW1hZ2UgPSAnYXJyb3dfZm9yd2FyZCc7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzbGlnaHQgbGVmdCcpIHtcbiAgICBpbWFnZSA9ICdhcnJvd19mb3J3YXJkJztcbiAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjUwJztcbiAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ2xlZnQnKSB7XG4gICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5X2Fycm93X2xlZnQnO1xuICAgIGNzc0NsYXNzID0gJ2ljb24tZmxpcHBlZCc7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzaGFycCBsZWZ0Jykge1xuICAgIGltYWdlID0gJ3N1YmRpcmVjdG9yeV9hcnJvd19sZWZ0JztcbiAgICBjc3NDbGFzcyA9ICdpY29uLWZsaXBwZWQnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICd0dXJuJykge1xuICAgIGlmIChtb2RpZmllciA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy50dXJuLnN0cmFpZ2h0Jywge1xuICAgICAgICByb3V0ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3V0dXJuJykge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy50dXJuLnV0dXJuJywgeyByb3V0ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy50dXJuLmVsc2UnLCB7XG4gICAgICAgIHJvdXRlLFxuICAgICAgICBhZ2dyZWdhdGVkRGlyZWN0aW9uLFxuICAgICAgICB0cmFuc2xhdGVkTW9kaWZpZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbmV3IG5hbWUnKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5uZXcgbmFtZScsIHtcbiAgICAgIHJvdXRlLFxuICAgICAgdHJhbnNsYXRlZERpcmVjdGlvblxuICAgIH0pO1xuICAgIGltYWdlID0gJ2V4cGxvcmUnO1xuICAgIGNzc0NsYXNzID0gJyc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RlcGFydCcpIHtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLmRlcGFydCcsIHtcbiAgICAgIHJvdXRlLFxuICAgICAgdHJhbnNsYXRlZERpcmVjdGlvblxuICAgIH0pO1xuICAgIGltYWdlID0gJ2V4cGxvcmUnO1xuICAgIGNzc0NsYXNzID0gJyc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Fycml2ZScpIHtcbiAgICBpZiAobGFzdFN0ZXApIHtcbiAgICAgIGNvbnN0IGNvbWEgPSAhdHJhbnNsYXRlZE1vZGlmaWVyID8gJycgOiAnLCAnO1xuICAgICAgYWdncmVnYXRlZERpcmVjdGlvbiA9ICF0cmFuc2xhdGVkTW9kaWZpZXIgPyAnJyA6IGFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLmFycml2ZS5sYXN0U3RlcCcsIHtcbiAgICAgICAgY29tYSxcbiAgICAgICAgYWdncmVnYXRlZERpcmVjdGlvblxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuYXJyaXZlLmludGVybWVkaWF0ZScsIHtcbiAgICAgICAgcm91dGVcbiAgICAgIH0pO1xuICAgICAgaW1hZ2UgPSAnbG9jYXRpb25fb24nO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21lcmdlJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMubWVyZ2UnLCB7IHJvdXRlIH0pO1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvbiByYW1wJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMub24gcmFtcCcsIHtcbiAgICAgIGFnZ3JlZ2F0ZWREaXJlY3Rpb25cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb2ZmIHJhbXAnKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5vZmYgcmFtcCcsIHtcbiAgICAgIGFnZ3JlZ2F0ZWREaXJlY3Rpb25cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnZm9yaycpIHtcbiAgICBpZiAobW9kaWZpZXIuc2VhcmNoKCdsZWZ0JykgPj0gMCkge1xuICAgICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5mb3JrLmxlZnQnLCB7IHJvdXRlIH0pO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIuc2VhcmNoKCdyaWdodCcpID49IDApIHtcbiAgICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuZm9yay5yaWdodCcsIHsgcm91dGUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuZm9yay5lbHNlJywgeyByb3V0ZSB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2VuZCBvZiByb2FkJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuZW5kIG9mIHJvYWQnLCB7XG4gICAgICB0cmFuc2xhdGVkTW9kaWZpZXIsXG4gICAgICByb3V0ZVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2UgbGFuZScpIHtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnVzZSBsYW5lJyk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbnRpbnVlJyAmJiBtb2RpZmllciAhPT0gJ3V0dXJuJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuY29udGludWUubm90VXR1cm4nLCB7XG4gICAgICByb3V0ZVxuICAgIH0pO1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyb3VuZGFib3V0Jykge1xuICAgIGNvbnN0IGNudFN1ZmZpeCA9XG4gICAgICBleGl0ID09PSAxXG4gICAgICAgID8gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5jbnRTdWZmaXguZmlyc3QnKVxuICAgICAgICA6IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuY250U3VmZml4LnNlY29uZEFuZE1vcmUnKTtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnJvdW5kYWJvdXQnLCB7XG4gICAgICBleGl0LFxuICAgICAgY250U3VmZml4LFxuICAgICAgcm91dGVcbiAgICB9KTtcbiAgICBpbWFnZSA9ICdkb251dF9sYXJnZSc7XG4gICAgY3NzQ2xhc3MgPSAnJztcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncm90YXJ5Jykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMucm90YXJ5Jyk7XG4gICAgaW1hZ2UgPSAnZG9udXRfbGFyZ2UnO1xuICAgIGNzc0NsYXNzID0gJyc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JvdW5kYWJvdXQgdHVybicpIHtcbiAgICBkaXJlY3RpdmUgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnJvdW5kYWJvdXQgdHVybicpO1xuICAgIGltYWdlID0gJ2RvbnV0X2xhcmdlJztcbiAgICBjc3NDbGFzcyA9ICcnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleGl0IHJvdW5kYWJvdXQnKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5leGl0IHJvdW5kYWJvdXQnLCB7XG4gICAgICByb3V0ZVxuICAgIH0pO1xuICAgIGltYWdlID0gJ2Fycm93X2ZvcndhcmQnO1xuICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdub3RpZmljYXRpb24nKSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5ub3RpZmljYXRpb24nKTtcbiAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3V0dXJuJykge1xuICAgIGRpcmVjdGl2ZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMudXR1cm5UZXh0Jywge1xuICAgICAgdHJhbnNsYXRlZERpcmVjdGlvbixcbiAgICAgIHJvdXRlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aXZlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy51bmtub3duJyk7XG4gIH1cblxuICBpbWFnZSA9IGxhc3RTdGVwID8gJ2ZsYWcnIDogaW1hZ2U7XG4gIGNzc0NsYXNzID0gbGFzdFN0ZXAgPyAnJyA6IGNzc0NsYXNzO1xuICBpbWFnZSA9IHN0ZXBQb3NpdGlvbiA9PT0gMCA/ICdleHBsb3JlJyA6IGltYWdlO1xuICBjc3NDbGFzcyA9IHN0ZXBQb3NpdGlvbiA9PT0gMCA/ICcnIDogY3NzQ2xhc3M7XG5cbiAgcmV0dXJuIHsgaW5zdHJ1Y3Rpb246IGRpcmVjdGl2ZSwgaW1hZ2UsIGNzc0NsYXNzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVNb2RpZmllcihtb2RpZmllciwgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UpIHtcbiAgY29uc3QgdHJhbnNsYXRlID0gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgaWYgKG1vZGlmaWVyID09PSAndXR1cm4nKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMudXR1cm4nKTtcbiAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3NoYXJwIHJpZ2h0Jykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnNoYXJwIHJpZ2h0Jyk7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdyaWdodCcpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5yaWdodCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IHJpZ2h0Jykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnNsaWdodCByaWdodCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgbGVmdCcpIHtcbiAgICByZXR1cm4gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuc2hhcnAgbGVmdCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnbGVmdCcpIHtcbiAgICByZXR1cm4gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMubGVmdCcpO1xuICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IGxlZnQnKSB7XG4gICAgcmV0dXJuIGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnNsaWdodCBsZWZ0Jyk7XG4gIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzdHJhaWdodCcpIHtcbiAgICByZXR1cm4gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMuc3RyYWlnaHQnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbW9kaWZpZXI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZUJlYXJpbmcoXG4gIGJlYXJpbmc6IG51bWJlcixcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbikge1xuICBjb25zdCB0cmFuc2xhdGUgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICBpZiAoYmVhcmluZyA+PSAzMzcgfHwgYmVhcmluZyA8IDIzKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLm4nKTtcbiAgfSBlbHNlIGlmIChiZWFyaW5nIDwgNjcpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMubmUnKTtcbiAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMTEzKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLmUnKTtcbiAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMTU3KSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLnNlJyk7XG4gIH0gZWxzZSBpZiAoYmVhcmluZyA8IDIwMykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5zJyk7XG4gIH0gZWxzZSBpZiAoYmVhcmluZyA8IDI0Nykge1xuICAgIHJldHVybiB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5zdycpO1xuICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAyOTMpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMudycpO1xuICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAzMzcpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMubncnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiJdfQ==
522
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2RpcmVjdGlvbnMvc2hhcmVkL2RpcmVjdGlvbnMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFaEQsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBSXBDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2pHLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixZQUFZLEVBQ2IsTUFBTSxtQkFBbUIsQ0FBQztBQWUzQjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFVBQXNCLEVBQ3RCLFlBQTRCLEtBQUssRUFDakMsS0FBSyxHQUFHLFVBQVU7SUFFbEIsVUFBVSxDQUFDLElB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Q0FDdEMsT0FBZSxFQUNmLGVBQWdDO0lBRWhDLE1BQU0sU0FBUyxHQUFxQixlQUFlLENBQUMsU0FBUyxDQUFDO0lBQzlELE1BQU0sVUFBVSxHQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTFFLE1BQU0sY0FBYyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1RCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQ3RCLHdDQUF3QyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FDckUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IE51bWJlclV0aWxzLCB1dWlkIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgb2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xuaW1wb3J0IHsgQ29vcmRpbmF0ZSB9IGZyb20gJ29sL2Nvb3JkaW5hdGUnO1xuaW1wb3J0IE9sR2VvSlNPTiBmcm9tICdvbC9mb3JtYXQvR2VvSlNPTic7XG5pbXBvcnQgKiBhcyBvbEdlb20gZnJvbSAnb2wvZ2VvbSc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0ICogYXMgb2xQcm9qIGZyb20gJ29sL3Byb2onO1xuaW1wb3J0ICogYXMgb2xTdHlsZSBmcm9tICdvbC9zdHlsZSc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9mZWF0dXJlLWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgdHJ5QmluZFN0b3JlTGF5ZXIgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLXN0b3JlLnV0aWxzJztcbmltcG9ydCB7IEZFQVRVUkUsIEZlYXR1cmVNb3Rpb24gfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLmVudW1zJztcbmltcG9ydCB7IEZlYXR1cmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cnlBZGRMb2FkaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9zdHJhdGVnaWVzLnV0aWxzJztcbmltcG9ydCB7IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0cmF0ZWdpZXMvbG9hZGluZyc7XG5pbXBvcnQgeyBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllcnMvdmVjdG9yLWxheWVyJztcbmltcG9ydCB7IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSB9IGZyb20gJy4uLy4uL3N0eWxlL3NoYXJlZC9vdmVybGF5L292ZXJsYXktbWFya2VyLXN0eWxlLnV0aWxzJztcbmltcG9ydCB7XG4gIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLFxuICBEaXJlY3Rpb25zVHlwZSxcbiAgTWFuZXV2ZXJNb2RpZmllcixcbiAgTWFuZXV2ZXJUeXBlXG59IGZyb20gJy4vZGlyZWN0aW9ucy5lbnVtJztcbmltcG9ydCB7XG4gIERpcmVjdGlvbnMsXG4gIEZlYXR1cmVXaXRoRGlyZWN0aW9ucyxcbiAgRmVhdHVyZVdpdGhTdG9wLFxuICBJZ29TdGVwLFxuICBTdG9wXG59IGZyb20gJy4vZGlyZWN0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgUm91dGVzRmVhdHVyZVN0b3JlLFxuICBTdGVwc0ZlYXR1cmVTdG9yZSxcbiAgU3RvcHNGZWF0dXJlU3RvcmUsXG4gIFN0b3BzU3RvcmVcbn0gZnJvbSAnLi9zdG9yZSc7XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgc29ydGluZyBvZiB0aGUgc3RvcHMgaW4gdGhlIHByb3ZpZGVkIFN0b3BzU3RvcmUgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgZGlyZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNTdG9yZX0gc3RvcHNTdG9yZSAtIFRoZSBTdG9wc1N0b3JlIHRvIHVwZGF0ZSB0aGUgc29ydGluZyBmb3IuXG4gKiBAcGFyYW0geydhc2MnIHwgJ2Rlc2MnfSBbZGlyZWN0aW9uPSdhc2MnXSAtIFRoZSBkaXJlY3Rpb24gb2Ygc29ydGluZyAoJ2FzYycgZm9yIGFzY2VuZGluZywgJ2Rlc2MnIGZvciBkZXNjZW5kaW5nKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmllbGQ9J3Bvc2l0aW9uJ10gLSBUaGUgZmllbGQgdG8gc29ydCB0aGUgc3RvcHMgYnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdG9yZVNvcnRpbmcoXG4gIHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUsXG4gIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJyxcbiAgZmllbGQgPSAncG9zaXRpb24nXG4pOiB2b2lkIHtcbiAgc3RvcHNTdG9yZS52aWV3LnNvcnQoe1xuICAgIGRpcmVjdGlvbixcbiAgICB2YWx1ZUFjY2Vzc29yOiAoZW50aXR5OiBTdG9wKSA9PiBlbnRpdHlbZmllbGRdXG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiBhIHN0b3AgaW4gYSBsaXN0IG9mIHN0b3BzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdG9wSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHN0b3AuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RvcExpc3RMZW5ndGggLSBUaGUgdG90YWwgbnVtYmVyIG9mIHN0b3BzLlxuICogQHJldHVybiB7RGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGV9IFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgc3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZWxhdGl2ZVBvc2l0aW9uKFxuICBzdG9wSW5kZXg6IG51bWJlcixcbiAgc3RvcExpc3RMZW5ndGg6IG51bWJlclxuKTogRGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGUge1xuICBsZXQgcmVsYXRpdmVQb3NpdGlvbjogRGlyZWN0aW9uUmVsYXRpdmVQb3NpdGlvblR5cGUgPVxuICAgIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkludGVybWVkaWF0ZTtcbiAgaWYgKHN0b3BJbmRleCA9PT0gMCkge1xuICAgIHJlbGF0aXZlUG9zaXRpb24gPSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5TdGFydDtcbiAgfSBlbHNlIGlmIChzdG9wSW5kZXggPT09IHN0b3BMaXN0TGVuZ3RoKSB7XG4gICAgcmVsYXRpdmVQb3NpdGlvbiA9IERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLkVuZDtcbiAgfVxuICByZXR1cm4gcmVsYXRpdmVQb3NpdGlvbjtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcG9zaXRpb24gYW5kIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHN0b3BzIGluIHRoZSBnaXZlbiBzdG9wc1N0b3JlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNTdG9yZX0gc3RvcHNTdG9yZSAtIFRoZSBzdG9yZSBjb250YWluaW5nIHRoZSBzdG9wcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKFxuICBkZWxldGVkU3RvcEluZGV4OiBudW1iZXIsXG4gIHN0b3BzU3RvcmU6IFN0b3BzU3RvcmVcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHN0b3Agb2Ygc3RvcHNTdG9yZS5hbGwoKSkge1xuICAgIHN0b3AucG9zaXRpb24gPVxuICAgICAgc3RvcC5wb3NpdGlvbiA+IGRlbGV0ZWRTdG9wSW5kZXggPyAoc3RvcC5wb3NpdGlvbiAtPSAxKSA6IHN0b3AucG9zaXRpb247XG4gICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBzdG9wLnBvc2l0aW9uLFxuICAgICAgc3RvcHNTdG9yZS5hbGwoKS5sZW5ndGggLSAxXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgYSBzdG9wIHRvIHRoZSBnaXZlbiBzdG9wc1N0b3JlLiBUaGUgc3RvcCBpcyBhbHdheXMgYWRkZWQgYXMgdGhlIGxhc3Qgc3RvcC5cbiAqXG4gKiBAcGFyYW0ge1N0b3BzU3RvcmV9IHN0b3BzU3RvcmUgLSBUaGUgc3RvcmUgY29udGFpbmluZyB0aGUgc3RvcHMuXG4gKiBAcmV0dXJuIHtTdG9wfSBUaGUgbmV3bHkgYWRkZWQgc3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0b3BUb1N0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUpOiBTdG9wIHtcbiAgY29uc3QgaWQ6IHN0cmluZyA9IHV1aWQoKTtcbiAgY29uc3Qgc3RvcHM6IFN0b3BbXSA9IHN0b3BzU3RvcmUuYWxsKCk7XG4gIGNvbnN0IGluc2VydEluZGV4ID0gc3RvcHMubGVuZ3RoO1xuXG4gIGZvciAoY29uc3Qgc3RvcCBvZiBzdG9wc1N0b3JlLmFsbCgpKSB7XG4gICAgc3RvcC5yZWxhdGl2ZVBvc2l0aW9uID0gY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oXG4gICAgICBzdG9wLnBvc2l0aW9uLFxuICAgICAgc3RvcHMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIHN0b3BzU3RvcmUuaW5zZXJ0KHtcbiAgICBpZCxcbiAgICBwb3NpdGlvbjogaW5zZXJ0SW5kZXgsXG4gICAgcmVsYXRpdmVQb3NpdGlvbjogY29tcHV0ZVJlbGF0aXZlUG9zaXRpb24oaW5zZXJ0SW5kZXgsIHN0b3BzLmxlbmd0aClcbiAgfSk7XG5cbiAgdXBkYXRlU3RvcmVTb3J0aW5nKHN0b3BzU3RvcmUpO1xuICByZXR1cm4gc3RvcHNTdG9yZS5nZXQoaWQpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYSBzdG9wIGZyb20gdGhlIGdpdmVuIHN0b3BzU3RvcmUgYW5kIHVwZGF0ZXMgdGhlIHBvc2l0aW9ucyBvZiB0aGUgcmVtYWluaW5nIHN0b3BzLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNTdG9yZX0gc3RvcHNTdG9yZSAtIFRoZSBzdG9yZSBjb250YWluaW5nIHRoZSBzdG9wcy5cbiAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRvIGJlIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdG9wRnJvbVN0b3JlKHN0b3BzU3RvcmU6IFN0b3BzU3RvcmUsIHN0b3A6IFN0b3ApOiB2b2lkIHtcbiAgc3RvcHNTdG9yZS5kZWxldGUoc3RvcCk7XG4gIGNvbXB1dGVTdG9wc1Bvc2l0aW9uKHN0b3AucG9zaXRpb24sIHN0b3BzU3RvcmUpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0eWxlIGZvciB0aGUgZGlyZWN0aW9ucyBzdGVwcywgc3RvcHMgYW5kIHJvdXRlXG4gKiBAcGFyYW0gZmVhdHVyZSBPbEZlYXR1cmVcbiAqIEByZXR1cm5zIE9MIHN0eWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3Rpb25zU3R5bGUoXG4gIGZlYXR1cmU6IG9sRmVhdHVyZTxPbEdlb21ldHJ5PlxuKTogb2xTdHlsZS5TdHlsZSB8IG9sU3R5bGUuU3R5bGVbXSB7XG4gIGNvbnN0IHN0ZXBTdHlsZSA9IFtcbiAgICBuZXcgb2xTdHlsZS5TdHlsZSh7XG4gICAgICBnZW9tZXRyeTogZmVhdHVyZS5nZXRHZW9tZXRyeSgpLFxuICAgICAgaW1hZ2U6IG5ldyBvbFN0eWxlLkNpcmNsZSh7XG4gICAgICAgIHJhZGl1czogNyxcbiAgICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2UoeyBjb2xvcjogJyNGRjAwMDAnLCB3aWR0aDogMyB9KVxuICAgICAgfSlcbiAgICB9KVxuICBdO1xuXG4gIGNvbnN0IHN0b3BTdHlsZTogb2xTdHlsZS5TdHlsZSA9IGNyZWF0ZU92ZXJsYXlNYXJrZXJTdHlsZSh7XG4gICAgdGV4dDogZmVhdHVyZS5nZXQoJ3N0b3BUZXh0JyksXG4gICAgb3BhY2l0eTogZmVhdHVyZS5nZXQoJ3N0b3BPcGFjaXR5JyksXG4gICAgbWFya2VyQ29sb3I6IGZlYXR1cmUuZ2V0KCdzdG9wQ29sb3InKSxcbiAgICBtYXJrZXJPdXRsaW5lQ29sb3I6IFsyNTUsIDI1NSwgMjU1XVxuICB9KTtcblxuICBjb25zdCByb3V0ZVN0eWxlOiBvbFN0eWxlLlN0eWxlW10gPSBbXG4gICAgbmV3IG9sU3R5bGUuU3R5bGUoe1xuICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xuICAgICAgICBjb2xvcjogYHJnYmEoMTA2LCAxMjEsIDEzMCwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDEwXG4gICAgICB9KVxuICAgIH0pLFxuICAgIG5ldyBvbFN0eWxlLlN0eWxlKHtcbiAgICAgIHN0cm9rZTogbmV3IG9sU3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgY29sb3I6IGByZ2JhKDc5LCAxNjksIDIyMSwgJHtmZWF0dXJlLmdldCgnYWN0aXZlJykgPyAwLjc1IDogMH0pYCxcbiAgICAgICAgd2lkdGg6IDZcbiAgICAgIH0pXG4gICAgfSlcbiAgXTtcblxuICBpZiAoZmVhdHVyZS5nZXQoJ3R5cGUnKSA9PT0gRGlyZWN0aW9uc1R5cGUuU3RvcCkge1xuICAgIHJldHVybiBzdG9wU3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09IERpcmVjdGlvbnNUeXBlLlZlcnRleCkge1xuICAgIHJldHVybiBzdGVwU3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09IERpcmVjdGlvbnNUeXBlLlJvdXRlKSB7XG4gICAgcmV0dXJuIHJvdXRlU3R5bGU7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgc3RvcHMgZmVhdHVyZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBsYW5ndWFnZSBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNGZWF0dXJlU3RvcmV9IHN0b3BzRmVhdHVyZVN0b3JlIC0gVGhlIHN0b3BzIGZlYXR1cmUgc3RvcmUgdG8gaW5pdGlhbGl6ZS5cbiAqIEBwYXJhbSB7TGFuZ3VhZ2VTZXJ2aWNlfSBsYW5ndWFnZVNlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U3RvcHNGZWF0dXJlU3RvcmUoXG4gIHN0b3BzRmVhdHVyZVN0b3JlOiBTdG9wc0ZlYXR1cmVTdG9yZSxcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbik6IHZvaWQge1xuICBjb25zdCBsb2FkaW5nU3RyYXRlZ3k6IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSA9XG4gICAgbmV3IEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSh7XG4gICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uTm9uZVxuICAgIH0pO1xuXG4gIGNvbnN0IHN0b3BzTGF5ZXI6IFZlY3RvckxheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgaWQ6ICdpZ28tZGlyZWN0aW9uLXN0b3BzLWxheWVyJyxcbiAgICB0aXRsZTogbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnMubGF5ZXIuc3RvcHMnKSxcbiAgICB6SW5kZXg6IDkxMSxcbiAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxuICAgIHNob3dJbkxheWVyTGlzdDogdHJ1ZSxcbiAgICB2aXNpYmxlOiB0cnVlLFxuICAgIHdvcmtzcGFjZToge1xuICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICB9LFxuICAgIGxpbmtlZExheWVyczoge1xuICAgICAgbGlua0lkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgICBsaW5rczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3luY2VkRGVsZXRlOiB0cnVlLFxuICAgICAgICAgIGxpbmtlZElkczogWydpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ10sXG4gICAgICAgICAgcHJvcGVydGllczogW11cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHN0b3BzRmVhdHVyZVN0b3JlLCBzdG9wc0xheWVyKTtcbiAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KHN0b3BzRmVhdHVyZVN0b3JlLCBsb2FkaW5nU3RyYXRlZ3kpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSByb3V0ZXMgZmVhdHVyZSBzdG9yZSB3aXRoIHRoZSBwcm92aWRlZCBsYW5ndWFnZSBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNGZWF0dXJlU3RvcmV9IHJvdXRlc0ZlYXR1cmVTdG9yZSAtIFRoZSByb3V0ZXMgZmVhdHVyZSBzdG9yZSB0byBpbml0aWFsaXplLlxuICogQHBhcmFtIHtMYW5ndWFnZVNlcnZpY2V9IGxhbmd1YWdlU2VydmljZSAtIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIHVzZWQgZm9yIHRyYW5zbGF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRSb3V0ZXNGZWF0dXJlU3RvcmUoXG4gIHJvdXRlc0ZlYXR1cmVTdG9yZTogUm91dGVzRmVhdHVyZVN0b3JlLFxuICBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZVxuKTogdm9pZCB7XG4gIGNvbnN0IGxvYWRpbmdTdHJhdGVneTogRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5ID1cbiAgICBuZXcgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KHtcbiAgICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lXG4gICAgfSk7XG5cbiAgY29uc3Qgcm91dGVMYXllcjogVmVjdG9yTGF5ZXIgPSBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgIGlzSWdvSW50ZXJuYWxMYXllcjogdHJ1ZSxcbiAgICBpZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInLFxuICAgIHRpdGxlOiBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5sYXllci5yb3V0ZScpLFxuICAgIHpJbmRleDogOTEwLFxuICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgc2hvd0luTGF5ZXJMaXN0OiB0cnVlLFxuICAgIHZpc2libGU6IHRydWUsXG4gICAgd29ya3NwYWNlOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZVxuICAgIH0sXG4gICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICBsaW5rSWQ6ICdpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ1xuICAgIH0sXG4gICAgZXhwb3J0YWJsZTogdHJ1ZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHJvdXRlc0ZlYXR1cmVTdG9yZSwgcm91dGVMYXllcik7XG4gIHRyeUFkZExvYWRpbmdTdHJhdGVneShyb3V0ZXNGZWF0dXJlU3RvcmUsIGxvYWRpbmdTdHJhdGVneSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIHJvdXRlcyBmZWF0dXJlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSB7U3RvcHNGZWF0dXJlU3RvcmV9IHN0ZXBzRmVhdHVyZVN0b3JlIC0gVGhlIHN0ZXBzIGZlYXR1cmUgc3RvcmUgdG8gaW5pdGlhbGl6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRTdGVwc0ZlYXR1cmVTdG9yZShzdGVwc0ZlYXR1cmVTdG9yZTogU3RlcHNGZWF0dXJlU3RvcmUpIHtcbiAgY29uc3QgbG9hZGluZ1N0cmF0ZWd5OiBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3kgPVxuICAgIG5ldyBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3koe1xuICAgICAgbW90aW9uOiBGZWF0dXJlTW90aW9uLk5vbmVcbiAgICB9KTtcblxuICBjb25zdCBzdGVwTGF5ZXI6IFZlY3RvckxheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICBpc0lnb0ludGVybmFsTGF5ZXI6IHRydWUsXG4gICAgaWQ6ICdpZ28tZGlyZWN0aW9uLXN0ZXAtbGF5ZXInLFxuICAgIHRpdGxlOiAnJyxcbiAgICB6SW5kZXg6IDkxMCxcbiAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxuICAgIHNob3dJbkxheWVyTGlzdDogZmFsc2UsXG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgICB3b3Jrc3BhY2U6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgfSxcbiAgICBsaW5rZWRMYXllcnM6IHtcbiAgICAgIGxpbmtJZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInXG4gICAgfSxcbiAgICBleHBvcnRhYmxlOiBmYWxzZSxcbiAgICBicm93c2FibGU6IGZhbHNlLFxuICAgIHN0eWxlOiBkaXJlY3Rpb25zU3R5bGVcbiAgfSk7XG4gIHRyeUJpbmRTdG9yZUxheWVyKHN0ZXBzRmVhdHVyZVN0b3JlLCBzdGVwTGF5ZXIpO1xuICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3koc3RlcHNGZWF0dXJlU3RvcmUsIGxvYWRpbmdTdHJhdGVneSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHN0b3AgdG8gdGhlIHN0b3BzRmVhdHVyZVN0b3JlLlxuICpcbiAqIEBwYXJhbSB7U3RvcH0gc3RvcCAtIFRoZSBzdG9wIHRvIGJlIGFkZGVkLlxuICogQHBhcmFtIHtTdG9wc0ZlYXR1cmVTdG9yZX0gc3RvcHNGZWF0dXJlU3RvcmUgLSBUaGUgc3RvcHNGZWF0dXJlU3RvcmUgdG8gYWRkIHRoZSBzdG9wIHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3Rpb24gLSBUaGUgcHJvamVjdGlvbiBvZiB0aGUgc3RvcCBjb29yZGluYXRlcy5cbiAqIEBwYXJhbSB7TGFuZ3VhZ2VTZXJ2aWNlfSBsYW5ndWFnZVNlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSBmb3IgdHJhbnNsYXRpbmcgc3RvcCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkU3RvcFRvU3RvcHNGZWF0dXJlU3RvcmUoXG4gIHN0b3A6IFN0b3AsXG4gIHN0b3BzRmVhdHVyZVN0b3JlOiBTdG9wc0ZlYXR1cmVTdG9yZSxcbiAgcHJvamVjdGlvbjogc3RyaW5nLFxuICBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZVxuKTogdm9pZCB7XG4gIGxldCBzdG9wQ29sb3I6IHN0cmluZztcbiAgbGV0IHN0b3BUZXh0OiBzdHJpbmc7XG5cbiAgc3dpdGNoIChzdG9wLnJlbGF0aXZlUG9zaXRpb24pIHtcbiAgICBjYXNlIERpcmVjdGlvblJlbGF0aXZlUG9zaXRpb25UeXBlLlN0YXJ0OlxuICAgICAgc3RvcENvbG9yID0gJyMwMDgwMDAnO1xuICAgICAgc3RvcFRleHQgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQuc3RhcnQnXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBEaXJlY3Rpb25SZWxhdGl2ZVBvc2l0aW9uVHlwZS5FbmQ6XG4gICAgICBzdG9wQ29sb3IgPSAnI2Y2NDEzOSc7XG4gICAgICBzdG9wVGV4dCA9IGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5pbnB1dC5lbmQnXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0b3BDb2xvciA9ICcjZmZkNzAwJztcbiAgICAgIHN0b3BUZXh0ID1cbiAgICAgICAgbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuaW5wdXQuaW50ZXJtZWRpYXRlJ1xuICAgICAgICApICtcbiAgICAgICAgJyAjJyArXG4gICAgICAgIHN0b3AucG9zaXRpb247XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IHBvaW50OiBvbEdlb20uUG9pbnQgPSBuZXcgb2xHZW9tLlBvaW50KFxuICAgIG9sUHJvai50cmFuc2Zvcm0oXG4gICAgICBzdG9wLmNvb3JkaW5hdGVzLFxuICAgICAgcHJvamVjdGlvbixcbiAgICAgIHN0b3BzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uQ29kZVxuICAgIClcbiAgKTtcblxuICBjb25zdCBnZW9qc29uR2VvbTogRmVhdHVyZUdlb21ldHJ5ID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoXG4gICAgcG9pbnQsXG4gICAge1xuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHN0b3BzRmVhdHVyZVN0b3JlLm1hcC5wcm9qZWN0aW9uQ29kZSxcbiAgICAgIGRhdGFQcm9qZWN0aW9uOiBzdG9wc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGVcbiAgICB9XG4gICkgYXMgRmVhdHVyZUdlb21ldHJ5O1xuXG4gIGNvbnN0IHByZXZpb3VzU3RvcDogRmVhdHVyZVdpdGhTdG9wID0gc3RvcHNGZWF0dXJlU3RvcmUuZ2V0KHN0b3AuaWQpO1xuICBjb25zdCBwcmV2aW91c1N0b3BSZXZpc2lvbjogbnVtYmVyID0gcHJldmlvdXNTdG9wXG4gICAgPyBwcmV2aW91c1N0b3AubWV0YS5yZXZpc2lvblxuICAgIDogMDtcblxuICBjb25zdCBzdG9wRmVhdHVyZVN0b3JlOiBGZWF0dXJlV2l0aFN0b3AgPSB7XG4gICAgdHlwZTogRkVBVFVSRSxcbiAgICBnZW9tZXRyeTogZ2VvanNvbkdlb20sXG4gICAgcHJvamVjdGlvbjogc3RvcHNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb25Db2RlLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIGlkOiBzdG9wLmlkLFxuICAgICAgdHlwZTogRGlyZWN0aW9uc1R5cGUuU3RvcCxcbiAgICAgIHN0b3BUZXh0LFxuICAgICAgc3RvcENvbG9yLFxuICAgICAgc3RvcE9wYWNpdHk6IDEsXG4gICAgICBzdG9wXG4gICAgfSxcbiAgICBtZXRhOiB7XG4gICAgICBpZDogc3RvcC5pZCxcbiAgICAgIHJldmlzaW9uOiBwcmV2aW91c1N0b3BSZXZpc2lvbiArIDFcbiAgICB9LFxuICAgIG9sOiBuZXcgb2xGZWF0dXJlKHsgcG9pbnQgfSlcbiAgfTtcbiAgc3RvcHNGZWF0dXJlU3RvcmUudXBkYXRlKHN0b3BGZWF0dXJlU3RvcmUpO1xufVxuXG4vKipcbiAqIEFkZHMgYSByb3V0ZSB0byB0aGUgcm91dGVzIGZlYXR1cmUgc3RvcmUuXG4gKlxuICogQHBhcmFtIHtSb3V0ZXNGZWF0dXJlU3RvcmV9IHJvdXRlc0ZlYXR1cmVTdG9yZSAtIFRoZSByb3V0ZXMgZmVhdHVyZSBzdG9yZSB0byBhZGQgdGhlIHJvdXRlIHRvLlxuICogQHBhcmFtIHtEaXJlY3Rpb25zfSBkaXJlY3Rpb25zIC0gVGhlIGRpcmVjdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGdlb21ldHJ5IGFuZCBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0aW9uIC0gVGhlIHByb2plY3Rpb24gb2YgdGhlIGdlb21ldHJ5IGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtib29sZWFufSBbYWN0aXZlPWZhbHNlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkaXJlY3Rpb24gaXMgYWN0aXZlIG9yIG5vdC4gRGVmYXVsdCBpcyBmYWxzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFJvdXRlVG9Sb3V0ZXNGZWF0dXJlU3RvcmUoXG4gIHJvdXRlc0ZlYXR1cmVTdG9yZTogUm91dGVzRmVhdHVyZVN0b3JlLFxuICBkaXJlY3Rpb25zOiBEaXJlY3Rpb25zLFxuICBwcm9qZWN0aW9uOiBzdHJpbmcsXG4gIGFjdGl2ZSA9IGZhbHNlXG4pOiB2b2lkIHtcbiAgY29uc3QgY29vcmRpbmF0ZTogQ29vcmRpbmF0ZSA9IGRpcmVjdGlvbnMuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gIGNvbnN0IGxpbmVzdHJpbmc0MzI2OiBvbEdlb20uTGluZVN0cmluZyA9IG5ldyBvbEdlb20uTGluZVN0cmluZyhjb29yZGluYXRlKTtcbiAgY29uc3QgbGluZXN0cmluZ1N0b3JlOiBvbEdlb20uTGluZVN0cmluZyA9IGxpbmVzdHJpbmc0MzI2LnRyYW5zZm9ybShcbiAgICBwcm9qZWN0aW9uLFxuICAgIHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGVcbiAgKTtcblxuICBjb25zdCBnZW9qc29uR2VvbTogRmVhdHVyZUdlb21ldHJ5ID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoXG4gICAgbGluZXN0cmluZ1N0b3JlLFxuICAgIHtcbiAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiByb3V0ZXNGZWF0dXJlU3RvcmUubWFwLnByb2plY3Rpb25Db2RlLFxuICAgICAgZGF0YVByb2plY3Rpb246IHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGVcbiAgICB9XG4gICkgYXMgRmVhdHVyZUdlb21ldHJ5O1xuXG4gIGNvbnN0IHByZXZpb3VzUm91dGU6IEZlYXR1cmVXaXRoRGlyZWN0aW9ucyA9IHJvdXRlc0ZlYXR1cmVTdG9yZS5nZXQoXG4gICAgZGlyZWN0aW9ucy5pZFxuICApO1xuICBjb25zdCBwcmV2aW91c1JvdXRlUmV2aXNpb246IG51bWJlciA9IHByZXZpb3VzUm91dGVcbiAgICA/IHByZXZpb3VzUm91dGUubWV0YS5yZXZpc2lvblxuICAgIDogMDtcblxuICBjb25zdCByb3V0ZUZlYXR1cmVTdG9yZTogRmVhdHVyZVdpdGhEaXJlY3Rpb25zID0ge1xuICAgIHR5cGU6IEZFQVRVUkUsXG4gICAgZ2VvbWV0cnk6IGdlb2pzb25HZW9tLFxuICAgIHByb2plY3Rpb246IHJvdXRlc0ZlYXR1cmVTdG9yZS5tYXAucHJvamVjdGlvbkNvZGUsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgaWQ6IGRpcmVjdGlvbnMuaWQsXG4gICAgICB0eXBlOiBEaXJlY3Rpb25zVHlwZS5Sb3V0ZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGRpcmVjdGlvbnNcbiAgICB9LFxuICAgIG1ldGE6IHtcbiAgICAgIGlkOiBkaXJlY3Rpb25zLmlkLFxuICAgICAgcmV2aXNpb246IHByZXZpb3VzUm91dGVSZXZpc2lvbiArIDFcbiAgICB9LFxuICAgIG9sOiBuZXcgb2xGZWF0dXJlKHsgbGluZXN0cmluZ1N0b3JlIH0pXG4gIH07XG4gIHJvdXRlc0ZlYXR1cmVTdG9yZS51cGRhdGUocm91dGVGZWF0dXJlU3RvcmUpO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGdpdmVuIGRpc3RhbmNlIGluIG1ldGVycyB0byBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWV0ZXJzIC0gVGhlIGRpc3RhbmNlIGluIG1ldGVycyB0byBiZSBmb3JtYXR0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBmb3JtYXR0ZWQgZGlzdGFuY2Ugc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2UobWV0ZXJzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWV0ZXJzID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChtZXRlcnMgPCAxMDAwKSB7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobWV0ZXJzKX0gbWA7XG4gIH1cblxuICBjb25zdCBraWxvbWV0ZXJzOiBudW1iZXIgPSBtZXRlcnMgLyAxMDAwO1xuICBjb25zdCByb3VuZFRvRGVjaW1hbDogMCB8IDEgPSBraWxvbWV0ZXJzID49IDEwID8gMSA6IDA7XG5cbiAgcmV0dXJuIGAke051bWJlclV0aWxzLnJvdW5kVG9ORGVjaW1hbChraWxvbWV0ZXJzLCByb3VuZFRvRGVjaW1hbCl9IGttYC5yZXBsYWNlKFxuICAgICcuJyxcbiAgICAnLCdcbiAgKTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBnaXZlbiBkdXJhdGlvbiBpbiBzZWNvbmRzIHRvIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgdG8gYmUgZm9ybWF0dGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGR1cmF0aW9uIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKTtcbiAgY29uc3QgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigoc2Vjb25kcyAlIDM2MDApIC8gNjApO1xuXG4gIGlmIChob3Vycykge1xuICAgIHJldHVybiBgJHtob3Vyc30gaCAke21pbnV0ZXN9IG1pbmA7XG4gIH1cblxuICBpZiAobWludXRlcykge1xuICAgIHJldHVybiBgJHttaW51dGVzfSBtaW5gO1xuICB9XG5cbiAgcmV0dXJuICc8IDEgbWluJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN0ZXAoXG4gIHN0ZXA6IElnb1N0ZXAsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICBsYXN0U3RlcCA9IGZhbHNlXG4pIHtcbiAgY29uc3QgbWFuZXV2ZXJUeXBlOiBNYW5ldXZlclR5cGUgPSBzdGVwLm1hbmV1dmVyLnR5cGU7XG4gIGNvbnN0IG1hbmV1dmVyTW9kaWZpZXI6IE1hbmV1dmVyTW9kaWZpZXIgPSBzdGVwLm1hbmV1dmVyLm1vZGlmaWVyO1xuICBjb25zdCBuYW1lOiBzdHJpbmcgPSBzdGVwLm5hbWU7XG4gIGNvbnN0IG1hbmV1dmVyQmVhcmluZ0FmdGVyOiBudW1iZXIgPSBzdGVwLm1hbmV1dmVyLmJlYXJpbmdfYWZ0ZXI7XG5cbiAgY29uc3QgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlID0gbGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgY29uc3QgdHJhbnNsYXRlZE1hbmV1dmVyQmVhcmluZ0FmdGVyOiBzdHJpbmcgPSB0cmFuc2xhdGVNYW5ldXZlckJlYXJpbmcoXG4gICAgbWFuZXV2ZXJCZWFyaW5nQWZ0ZXIsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlXG4gICk7XG4gIGNvbnN0IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyOiBzdHJpbmcgPSB0cmFuc2xhdGVNYW5ldXZlck1vZGlmaWVyKFxuICAgIG1hbmV1dmVyTW9kaWZpZXIsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlXG4gICk7XG5cbiAgbGV0IGljb25OYW1lID0gJ3N0cmFpZ2h0JzsgLy8gYXJyb3cgcG9pbnQgdXAgYnkgZGVmYXVsdFxuICBsZXQgaW5zdHJ1Y3Rpb24gPSAnJztcblxuICBpZiAobWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuVHVybikge1xuICAgIGlmIChcbiAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuVXR1cm4gfHxcbiAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU3RyYWlnaHRcbiAgICApIHtcbiAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUudHVybi4ke21hbmV1dmVyTW9kaWZpZXJ9YCxcbiAgICAgICAge1xuICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChtYW5ldXZlck1vZGlmaWVyID09PSBNYW5ldXZlck1vZGlmaWVyLlV0dXJuKSB7XG4gICAgICAgIGljb25OYW1lID0gJ3VfdHVybl9sZWZ0JztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS50dXJuLmVsc2UnLFxuICAgICAgICB7XG4gICAgICAgICAgbWFuZXV2ZXJNb2RpZmllcjogdHJhbnNsYXRlZE1hbmV1dmVyTW9kaWZpZXIsXG4gICAgICAgICAgbmFtZVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TbGlnaHRSaWdodCkge1xuICAgICAgICBpY29uTmFtZSA9ICd0dXJuX3NsaWdodF9yaWdodCc7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBtYW5ldXZlck1vZGlmaWVyID09PSBNYW5ldXZlck1vZGlmaWVyLlJpZ2h0IHx8XG4gICAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU2hhcnBSaWdodFxuICAgICAgKSB7XG4gICAgICAgIGljb25OYW1lID0gJ3R1cm5fcmlnaHQnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5MZWZ0IHx8XG4gICAgICAgIG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU2hhcnBMZWZ0XG4gICAgICApIHtcbiAgICAgICAgaWNvbk5hbWUgPSAndHVybl9sZWZ0JztcbiAgICAgIH0gZWxzZSBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TbGlnaHRMZWZ0KSB7XG4gICAgICAgIGljb25OYW1lID0gJ3R1cm5fc2xpZ2h0X2xlZnQnO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5OZXdOYW1lKSB7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUubmV3IG5hbWVgLFxuICAgICAge1xuICAgICAgICBuYW1lLFxuICAgICAgICBtYW5ldXZlckJlYXJpbmc6IHRyYW5zbGF0ZWRNYW5ldXZlckJlYXJpbmdBZnRlclxuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSBpZiAobWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuRGVwYXJ0KSB7XG4gICAgaWNvbk5hbWUgPSAnZGlyZWN0aW9ucyc7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuZGVwYXJ0YCxcbiAgICAgIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWFuZXV2ZXJCZWFyaW5nOiB0cmFuc2xhdGVkTWFuZXV2ZXJCZWFyaW5nQWZ0ZXJcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2UgaWYgKG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLkFycml2ZSkge1xuICAgIGljb25OYW1lID0gJ3Nwb3J0c19zY29yZSc7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuYXJyaXZlLiR7bGFzdFN0ZXAgPyAnbGFzdFN0ZXAnIDogJ2ludGVybWVkaWF0ZSd9YCxcbiAgICAgIHtcbiAgICAgICAgbmFtZVxuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSBpZiAobWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuTWVyZ2UpIHtcbiAgICBpbnN0cnVjdGlvbiA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS5tZXJnZScsXG4gICAgICB7XG4gICAgICAgIG5hbWVcbiAgICAgIH1cbiAgICApO1xuICAgIGljb25OYW1lID0gJ21lcmdlJztcbiAgfSBlbHNlIGlmIChcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5PblJhbXAgfHxcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5PZmZSYW1wXG4gICkge1xuICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICBgaWdvLmdlby5kaXJlY3Rpb25zLnJlc3VsdHMubWFuZXV2ZXJUeXBlLiR7bWFuZXV2ZXJUeXBlfWAsXG4gICAgICB7XG4gICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyXG4gICAgICB9XG4gICAgKTtcbiAgfSBlbHNlIGlmIChtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5Gb3JrKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uS2V5OiBzdHJpbmcgPVxuICAgICAgbWFuZXV2ZXJNb2RpZmllci5zZWFyY2goJ2xlZnQnKSA+PSAwID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICBpY29uTmFtZSA9XG4gICAgICBkaXJlY3Rpb25LZXkgPT09ICdsZWZ0JyA/ICd0dXJuX3NsaWdodF9sZWZ0JyA6ICd0dXJuX3NsaWdodF9yaWdodCc7XG4gICAgaW5zdHJ1Y3Rpb24gPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuZm9yay4ke2RpcmVjdGlvbktleX1gLFxuICAgICAge1xuICAgICAgICBuYW1lXG4gICAgICB9XG4gICAgKTtcbiAgfSBlbHNlIGlmIChcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5FbmRPZlJvYWQgfHxcbiAgICBtYW5ldXZlclR5cGUgPT09IE1hbmV1dmVyVHlwZS5Vc2VMYW5lIHx8XG4gICAgbWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuQ29udGludWVcbiAgKSB7XG4gICAgaWYgKG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLkNvbnRpbnVlKSB7XG4gICAgICBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5VdHVybikge1xuICAgICAgICBpY29uTmFtZSA9ICd1X3R1cm5fbGVmdCc7XG4gICAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS50dXJuLiR7bWFuZXV2ZXJNb2RpZmllcn1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS4ke21hbmV1dmVyVHlwZX1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICBtYW5ldXZlck1vZGlmaWVyID09PSBNYW5ldXZlck1vZGlmaWVyLlNoYXJwUmlnaHQgfHxcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5SaWdodFxuICAgICAgKSB7XG4gICAgICAgIGljb25OYW1lID0gJ3R1cm5fcmlnaHQnO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TaGFycExlZnQgfHxcbiAgICAgICAgbWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5MZWZ0XG4gICAgICApIHtcbiAgICAgICAgaWNvbk5hbWUgPSAndHVybl9sZWZ0JztcbiAgICAgIH0gZWxzZSBpZiAobWFuZXV2ZXJNb2RpZmllciA9PT0gTWFuZXV2ZXJNb2RpZmllci5TbGlnaHRSaWdodCkge1xuICAgICAgICBpY29uTmFtZSA9ICd0dXJuX3NsaWdodF9yaWdodCc7XG4gICAgICB9IGVsc2UgaWYgKG1hbmV1dmVyTW9kaWZpZXIgPT09IE1hbmV1dmVyTW9kaWZpZXIuU2xpZ2h0TGVmdCkge1xuICAgICAgICBpY29uTmFtZSA9ICd0dXJuX3NsaWdodF9sZWZ0JztcbiAgICAgIH1cbiAgICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlclR5cGUuJHttYW5ldXZlclR5cGV9YCxcbiAgICAgICAge1xuICAgICAgICAgIG1hbmV1dmVyTW9kaWZpZXI6IHRyYW5zbGF0ZWRNYW5ldXZlck1vZGlmaWVyLFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgbWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuUm91bmRhYm91dCB8fFxuICAgIG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLlJvdGFyeSB8fFxuICAgIG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLlJvdW5kYWJvdXRUdXJuIHx8XG4gICAgbWFuZXV2ZXJUeXBlID09PSBNYW5ldXZlclR5cGUuRXhpdFJvdW5kYWJvdXRcbiAgKSB7XG4gICAgY29uc3Qgcm91bmRhYm91dEtleSA9IG1hbmV1dmVyVHlwZS5yZXBsYWNlKCdyb3VuZGFib3V0ICcsICcnKTtcbiAgICBpbnN0cnVjdGlvbiA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgYGlnby5nZW8uZGlyZWN0aW9ucy5yZXN1bHRzLm1hbmV1dmVyVHlwZS4ke3JvdW5kYWJvdXRLZXl9YCxcbiAgICAgIHtcbiAgICAgICAgbmFtZVxuICAgICAgfVxuICAgICk7XG4gICAgaWNvbk5hbWUgPSAnZG9udXRfbGFyZ2UnO1xuICB9IGVsc2UgaWYgKG1hbmV1dmVyVHlwZSA9PT0gTWFuZXV2ZXJUeXBlLk5vdGlmaWNhdGlvbikge1xuICAgIGluc3RydWN0aW9uID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAnaWdvLmdlby5kaXJlY3Rpb25zLnJlc3VsdHMubWFuZXV2ZXJUeXBlLm5vdGlmaWNhdGlvbidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHsgaW5zdHJ1Y3Rpb24sIGljb25OYW1lIH07XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1hbmV1dmVyIG1vZGlmaWVyIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgdXNpbmcgdGhlIHByb3ZpZGVkIGxhbmd1YWdlIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIHtNYW5ldXZlck1vZGlmaWVyfSBtYW5ldXZlck1vZGlmaWVyIC0gVGhlIG1hbmV1dmVyIG1vZGlmaWVyIHRvIGJlIHRyYW5zbGF0ZWQuXG4gKiBAcGFyYW0ge0xhbmd1YWdlU2VydmljZX0gbGFuZ3VhZ2VTZXJ2aWNlIC0gVGhlIGxhbmd1YWdlIHNlcnZpY2UgdXNlZCBmb3IgdHJhbnNsYXRpb24uXG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSB0cmFuc2xhdGVkIG1hbmV1dmVyIG1vZGlmaWVyIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIHRoZSBtb2RpZmllciBpcyBmYWxzeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU1hbmV1dmVyTW9kaWZpZXIoXG4gIG1hbmV1dmVyTW9kaWZpZXI6IE1hbmV1dmVyTW9kaWZpZXIsXG4gIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlXG4pOiBzdHJpbmcge1xuICBjb25zdCB0cmFuc2xhdGUgPSBsYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICByZXR1cm4gbWFuZXV2ZXJNb2RpZmllclxuICAgID8gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5tYW5ldXZlck1vZGlmaWVyLiR7bWFuZXV2ZXJNb2RpZmllcn1gXG4gICAgICApXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyB0aGUgZ2l2ZW4gYmVhcmluZyB2YWx1ZSBpbnRvIGEgaHVtYW4tcmVhZGFibGUgZGlyZWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBsYW5ndWFnZSBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBiZWFyaW5nIC0gVGhlIGJlYXJpbmcgdmFsdWUgdG8gYmUgdHJhbnNsYXRlZC5cbiAqIEBwYXJhbSB7TGFuZ3VhZ2VTZXJ2aWNlfSBsYW5ndWFnZVNlcnZpY2UgLSBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB1c2VkIGZvciB0cmFuc2xhdGlvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRyYW5zbGF0ZWQgZGlyZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGJlYXJpbmcgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVNYW5ldXZlckJlYXJpbmcoXG4gIGJlYXJpbmc6IG51bWJlcixcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2Vcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSA9IGxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gIGNvbnN0IGRpcmVjdGlvbnM6IHN0cmluZ1tdID0gWyduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3JywgJ253J107XG5cbiAgY29uc3QgZGlyZWN0aW9uSW5kZXg6IG51bWJlciA9IE1hdGgucm91bmQoYmVhcmluZyAvIDQ1KSAlIDg7XG5cbiAgcmV0dXJuIHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgIGBpZ28uZ2VvLmRpcmVjdGlvbnMucmVzdWx0cy5kaXJlY3Rpb24uJHtkaXJlY3Rpb25zW2RpcmVjdGlvbkluZGV4XX1gXG4gICk7XG59XG4iXX0=