@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.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 (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -59,4 +59,4 @@ export function cropImage(image, opts = {}) {
59
59
  const final = downsampleRgba(cropped.data, cropped.width, cropped.height, factor);
60
60
  return new ProcessingImage(final.width, final.height, 4, final.data);
61
61
  }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvY2Vzc2luZy9pbWFnZS1jcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVlyRCxzRkFBc0Y7QUFDdEYsU0FBUyxRQUFRLENBQ2YsR0FBc0IsRUFBRSxRQUFnQixFQUFFLFNBQWlCLEVBQzNELENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFFMUMsMEVBQTBFO0lBQzFFLG9DQUFvQztJQUNwQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDM0IsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFPLEdBQUcsQ0FBQyxFQUFFLENBQWUsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7WUFDcEMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsY0FBYyxDQUNyQixHQUFzQixFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxNQUFjO0lBRTNFLElBQUksTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUMxRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQU8sR0FBRyxDQUFDLEVBQUUsQ0FBZSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7WUFDcEMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQXNCLEVBQUUsT0FBeUIsRUFBRTtJQUMzRSxzREFBc0Q7SUFDdEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDekUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUN0QixHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FDdkUsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEYsT0FBTyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvY2Vzc2luZ0ltYWdlIH0gZnJvbSAnLi9wcm9jZXNzaW5nLWltYWdlJztcblxuLyoqIENyb3Agb3B0aW9ucyBpbiBzb3VyY2UtaW1hZ2UgcGl4ZWxzLiBPdXQtb2YtcmFuZ2UgdmFsdWVzIGFyZSBjbGFtcGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcm9wSW1hZ2VPcHRpb25zIHtcbiAgeD86IG51bWJlcjtcbiAgeT86IG51bWJlcjtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgLyoqIFBvd2VyLW9mLXR3byBkb3duc2FtcGxlIGxldmVsIGFwcGxpZWQgdG8gdGhlIGNyb3AgKDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuICBsZXZlbD86IG51bWJlcjtcbn1cblxuLyoqIENvcHkgYSBjbGFtcGVkIHJlY3RhbmdsZSBvZiBhbiBSR0JBIHNvdXJjZSBpbnRvIGEgZnJlc2gsIHRpZ2h0bHktcGFja2VkIGJ1ZmZlci4gKi9cbmZ1bmN0aW9uIGNyb3BSZ2JhKFxuICBzcmM6IFVpbnQ4Q2xhbXBlZEFycmF5LCBzcmNXaWR0aDogbnVtYmVyLCBzcmNIZWlnaHQ6IG51bWJlcixcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuKTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gIC8vIENsYW1wIHRoZSByZWN0YW5nbGUgdG8gdGhlIGltYWdlIHNvIGJhZCBwYXJhbXMgc25hcCB0byB0aGUgdmFsaWQgcmVnaW9uXG4gIC8vIGluc3RlYWQgb2YgcmVhZGluZyBvdXQgb2YgYm91bmRzLlxuICBjb25zdCB4MCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNyY1dpZHRoIC0gMSwgTWF0aC5mbG9vcih4KSkpO1xuICBjb25zdCB5MCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNyY0hlaWdodCAtIDEsIE1hdGguZmxvb3IoeSkpKTtcbiAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzcmNXaWR0aCAtIHgwLCBNYXRoLmZsb29yKHcpKSk7XG4gIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKHNyY0hlaWdodCAtIHkwLCBNYXRoLmZsb29yKGgpKSk7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjUm93ID0gKHkwICsgcm93KSAqIHNyY1dpZHRoICsgeDA7XG4gICAgY29uc3QgZHN0Um93ID0gcm93ICogd2lkdGg7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBjb25zdCBzaSA9IChzcmNSb3cgKyBjb2wpICogNDtcbiAgICAgIGNvbnN0IGRpID0gKGRzdFJvdyArIGNvbCkgKiA0O1xuICAgICAgb3V0W2RpXSAgICAgPSBzcmNbc2ldICAgICBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAxXSA9IHNyY1tzaSArIDFdIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDJdID0gc3JjW3NpICsgMl0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgM10gPSBzcmNbc2kgKyAzXSBhcyBudW1iZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGRhdGE6IG91dCwgd2lkdGgsIGhlaWdodCB9O1xufVxuXG4vKiogTmVhcmVzdC1uZWlnaGJvdXIgZG93bnNhbXBsZSBieSBhbiBpbnRlZ2VyIGZhY3RvciAo4omlMSkuIGZhY3Rvcj0xIGlzIGEgbm8tb3AuICovXG5mdW5jdGlvbiBkb3duc2FtcGxlUmdiYShcbiAgc3JjOiBVaW50OENsYW1wZWRBcnJheSwgc3JjV2lkdGg6IG51bWJlciwgc3JjSGVpZ2h0OiBudW1iZXIsIGZhY3RvcjogbnVtYmVyLFxuKTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gIGlmIChmYWN0b3IgPD0gMSkgcmV0dXJuIHsgZGF0YTogc3JjLCB3aWR0aDogc3JjV2lkdGgsIGhlaWdodDogc3JjSGVpZ2h0IH07XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihzcmNXaWR0aCAvIGZhY3RvcikpO1xuICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHNyY0hlaWdodCAvIGZhY3RvcikpO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHN5ID0gTWF0aC5taW4oc3JjSGVpZ2h0IC0gMSwgcm93ICogZmFjdG9yKTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHtcbiAgICAgIGNvbnN0IHN4ID0gTWF0aC5taW4oc3JjV2lkdGggLSAxLCBjb2wgKiBmYWN0b3IpO1xuICAgICAgY29uc3Qgc2kgPSAoc3kgKiBzcmNXaWR0aCArIHN4KSAqIDQ7XG4gICAgICBjb25zdCBkaSA9IChyb3cgKiB3aWR0aCArIGNvbCkgKiA0O1xuICAgICAgb3V0W2RpXSAgICAgPSBzcmNbc2ldICAgICBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAxXSA9IHNyY1tzaSArIDFdIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDJdID0gc3JjW3NpICsgMl0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgM10gPSBzcmNbc2kgKyAzXSBhcyBudW1iZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGRhdGE6IG91dCwgd2lkdGgsIGhlaWdodCB9O1xufVxuXG4vKipcbiAqIENyb3AgYSByZWN0YW5ndWxhciByZWdpb24gb3V0IG9mIGEge0BsaW5rIFByb2Nlc3NpbmdJbWFnZX0gKGJyb3dzZXItc2lkZSwgdGhlXG4gKiBjb3VudGVycGFydCBvZiB0aGUgSklUIHNlcnZlcidzIFNsaWRlIENyb3ApLCBvcHRpb25hbGx5IGRvd25zYW1wbGluZyB0aGUgY3JvcFxuICogYnkgYDJebGV2ZWxgLiBUaGUgcmVjdGFuZ2xlIGlzIGluIHNvdXJjZSBwaXhlbHMgYW5kIGNsYW1wZWQgdG8gdGhlIGltYWdlLCBzb1xuICogb3V0LW9mLXJhbmdlIHZhbHVlcyBzbmFwIHRvIHRoZSB2YWxpZCByZWdpb24gcmF0aGVyIHRoYW4gdGhyb3dpbmcuIEFsd2F5c1xuICogcmV0dXJucyBhIDQtY2hhbm5lbCAoUkdCQSkgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9wSW1hZ2UoaW1hZ2U6IFByb2Nlc3NpbmdJbWFnZSwgb3B0czogQ3JvcEltYWdlT3B0aW9ucyA9IHt9KTogUHJvY2Vzc2luZ0ltYWdlIHtcbiAgLy8gV29yayBvbiBSR0JBIHNvIHRoZSBjcm9wIGlzIGNoYW5uZWwtY291bnQgYWdub3N0aWMuXG4gIGNvbnN0IHNyYyA9IGltYWdlLmNoYW5uZWxzID09PSA0ID8gaW1hZ2UuZGF0YSA6IGltYWdlLnRvSW1hZ2VEYXRhKCkuZGF0YTtcbiAgY29uc3QgY3JvcHBlZCA9IGNyb3BSZ2JhKFxuICAgIHNyYywgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCxcbiAgICBOdW1iZXIob3B0cy54ID8/IDApLCBOdW1iZXIob3B0cy55ID8/IDApLFxuICAgIE51bWJlcihvcHRzLndpZHRoID8/IGltYWdlLndpZHRoKSwgTnVtYmVyKG9wdHMuaGVpZ2h0ID8/IGltYWdlLmhlaWdodCksXG4gICk7XG4gIGNvbnN0IGxldmVsID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihOdW1iZXIob3B0cy5sZXZlbCA/PyAwKSkpO1xuICBjb25zdCBmYWN0b3IgPSBsZXZlbCA+IDAgPyAyICoqIGxldmVsIDogMTtcbiAgY29uc3QgZmluYWwgPSBkb3duc2FtcGxlUmdiYShjcm9wcGVkLmRhdGEsIGNyb3BwZWQud2lkdGgsIGNyb3BwZWQuaGVpZ2h0LCBmYWN0b3IpO1xuICByZXR1cm4gbmV3IFByb2Nlc3NpbmdJbWFnZShmaW5hbC53aWR0aCwgZmluYWwuaGVpZ2h0LCA0LCBmaW5hbC5kYXRhKTtcbn1cbiJdfQ==
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvY2Vzc2luZy9pbWFnZS1jcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVlyRCxzRkFBc0Y7QUFDdEYsU0FBUyxRQUFRLENBQ2YsR0FBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsQ0FBUyxFQUNULENBQVMsRUFDVCxDQUFTLEVBQ1QsQ0FBUztJQUVULDBFQUEwRTtJQUMxRSxvQ0FBb0M7SUFDcEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQWlCLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQzNCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFXLENBQUM7WUFDNUIsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDdEMsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixTQUFTLGNBQWMsQ0FDckIsR0FBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsTUFBYztJQUVkLElBQUksTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUMxRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBVyxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7WUFDcEMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQXNCLEVBQUUsT0FBeUIsRUFBRTtJQUMzRSxzREFBc0Q7SUFDdEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDekUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUN0QixHQUFHLEVBQ0gsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsTUFBTSxFQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQ3BDLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xGLE9BQU8sSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb2Nlc3NpbmdJbWFnZSB9IGZyb20gJy4vcHJvY2Vzc2luZy1pbWFnZSc7XG5cbi8qKiBDcm9wIG9wdGlvbnMgaW4gc291cmNlLWltYWdlIHBpeGVscy4gT3V0LW9mLXJhbmdlIHZhbHVlcyBhcmUgY2xhbXBlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvcEltYWdlT3B0aW9ucyB7XG4gIHg/OiBudW1iZXI7XG4gIHk/OiBudW1iZXI7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIC8qKiBQb3dlci1vZi10d28gZG93bnNhbXBsZSBsZXZlbCBhcHBsaWVkIHRvIHRoZSBjcm9wICgwID0gZnVsbCByZXNvbHV0aW9uKS4gKi9cbiAgbGV2ZWw/OiBudW1iZXI7XG59XG5cbi8qKiBDb3B5IGEgY2xhbXBlZCByZWN0YW5nbGUgb2YgYW4gUkdCQSBzb3VyY2UgaW50byBhIGZyZXNoLCB0aWdodGx5LXBhY2tlZCBidWZmZXIuICovXG5mdW5jdGlvbiBjcm9wUmdiYShcbiAgc3JjOiBVaW50OENsYW1wZWRBcnJheSxcbiAgc3JjV2lkdGg6IG51bWJlcixcbiAgc3JjSGVpZ2h0OiBudW1iZXIsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbik6IHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAvLyBDbGFtcCB0aGUgcmVjdGFuZ2xlIHRvIHRoZSBpbWFnZSBzbyBiYWQgcGFyYW1zIHNuYXAgdG8gdGhlIHZhbGlkIHJlZ2lvblxuICAvLyBpbnN0ZWFkIG9mIHJlYWRpbmcgb3V0IG9mIGJvdW5kcy5cbiAgY29uc3QgeDAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzcmNXaWR0aCAtIDEsIE1hdGguZmxvb3IoeCkpKTtcbiAgY29uc3QgeTAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzcmNIZWlnaHQgLSAxLCBNYXRoLmZsb29yKHkpKSk7XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc3JjV2lkdGggLSB4MCwgTWF0aC5mbG9vcih3KSkpO1xuICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzcmNIZWlnaHQgLSB5MCwgTWF0aC5mbG9vcihoKSkpO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHNyY1JvdyA9ICh5MCArIHJvdykgKiBzcmNXaWR0aCArIHgwO1xuICAgIGNvbnN0IGRzdFJvdyA9IHJvdyAqIHdpZHRoO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgY29uc3Qgc2kgPSAoc3JjUm93ICsgY29sKSAqIDQ7XG4gICAgICBjb25zdCBkaSA9IChkc3RSb3cgKyBjb2wpICogNDtcbiAgICAgIG91dFtkaV0gPSBzcmNbc2ldIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDFdID0gc3JjW3NpICsgMV0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgMl0gPSBzcmNbc2kgKyAyXSBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAzXSA9IHNyY1tzaSArIDNdIGFzIG51bWJlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZGF0YTogb3V0LCB3aWR0aCwgaGVpZ2h0IH07XG59XG5cbi8qKiBOZWFyZXN0LW5laWdoYm91ciBkb3duc2FtcGxlIGJ5IGFuIGludGVnZXIgZmFjdG9yICjiiaUxKS4gZmFjdG9yPTEgaXMgYSBuby1vcC4gKi9cbmZ1bmN0aW9uIGRvd25zYW1wbGVSZ2JhKFxuICBzcmM6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICBzcmNXaWR0aDogbnVtYmVyLFxuICBzcmNIZWlnaHQ6IG51bWJlcixcbiAgZmFjdG9yOiBudW1iZXIsXG4pOiB7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgaWYgKGZhY3RvciA8PSAxKSByZXR1cm4geyBkYXRhOiBzcmMsIHdpZHRoOiBzcmNXaWR0aCwgaGVpZ2h0OiBzcmNIZWlnaHQgfTtcbiAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHNyY1dpZHRoIC8gZmFjdG9yKSk7XG4gIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Ioc3JjSGVpZ2h0IC8gZmFjdG9yKSk7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3Qgc3kgPSBNYXRoLm1pbihzcmNIZWlnaHQgLSAxLCByb3cgKiBmYWN0b3IpO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgY29uc3Qgc3ggPSBNYXRoLm1pbihzcmNXaWR0aCAtIDEsIGNvbCAqIGZhY3Rvcik7XG4gICAgICBjb25zdCBzaSA9IChzeSAqIHNyY1dpZHRoICsgc3gpICogNDtcbiAgICAgIGNvbnN0IGRpID0gKHJvdyAqIHdpZHRoICsgY29sKSAqIDQ7XG4gICAgICBvdXRbZGldID0gc3JjW3NpXSBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAxXSA9IHNyY1tzaSArIDFdIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDJdID0gc3JjW3NpICsgMl0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgM10gPSBzcmNbc2kgKyAzXSBhcyBudW1iZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGRhdGE6IG91dCwgd2lkdGgsIGhlaWdodCB9O1xufVxuXG4vKipcbiAqIENyb3AgYSByZWN0YW5ndWxhciByZWdpb24gb3V0IG9mIGEge0BsaW5rIFByb2Nlc3NpbmdJbWFnZX0gKGJyb3dzZXItc2lkZSwgdGhlXG4gKiBjb3VudGVycGFydCBvZiB0aGUgSklUIHNlcnZlcidzIFNsaWRlIENyb3ApLCBvcHRpb25hbGx5IGRvd25zYW1wbGluZyB0aGUgY3JvcFxuICogYnkgYDJebGV2ZWxgLiBUaGUgcmVjdGFuZ2xlIGlzIGluIHNvdXJjZSBwaXhlbHMgYW5kIGNsYW1wZWQgdG8gdGhlIGltYWdlLCBzb1xuICogb3V0LW9mLXJhbmdlIHZhbHVlcyBzbmFwIHRvIHRoZSB2YWxpZCByZWdpb24gcmF0aGVyIHRoYW4gdGhyb3dpbmcuIEFsd2F5c1xuICogcmV0dXJucyBhIDQtY2hhbm5lbCAoUkdCQSkgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9wSW1hZ2UoaW1hZ2U6IFByb2Nlc3NpbmdJbWFnZSwgb3B0czogQ3JvcEltYWdlT3B0aW9ucyA9IHt9KTogUHJvY2Vzc2luZ0ltYWdlIHtcbiAgLy8gV29yayBvbiBSR0JBIHNvIHRoZSBjcm9wIGlzIGNoYW5uZWwtY291bnQgYWdub3N0aWMuXG4gIGNvbnN0IHNyYyA9IGltYWdlLmNoYW5uZWxzID09PSA0ID8gaW1hZ2UuZGF0YSA6IGltYWdlLnRvSW1hZ2VEYXRhKCkuZGF0YTtcbiAgY29uc3QgY3JvcHBlZCA9IGNyb3BSZ2JhKFxuICAgIHNyYyxcbiAgICBpbWFnZS53aWR0aCxcbiAgICBpbWFnZS5oZWlnaHQsXG4gICAgTnVtYmVyKG9wdHMueCA/PyAwKSxcbiAgICBOdW1iZXIob3B0cy55ID8/IDApLFxuICAgIE51bWJlcihvcHRzLndpZHRoID8/IGltYWdlLndpZHRoKSxcbiAgICBOdW1iZXIob3B0cy5oZWlnaHQgPz8gaW1hZ2UuaGVpZ2h0KSxcbiAgKTtcbiAgY29uc3QgbGV2ZWwgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKE51bWJlcihvcHRzLmxldmVsID8/IDApKSk7XG4gIGNvbnN0IGZhY3RvciA9IGxldmVsID4gMCA/IDIgKiogbGV2ZWwgOiAxO1xuICBjb25zdCBmaW5hbCA9IGRvd25zYW1wbGVSZ2JhKGNyb3BwZWQuZGF0YSwgY3JvcHBlZC53aWR0aCwgY3JvcHBlZC5oZWlnaHQsIGZhY3Rvcik7XG4gIHJldHVybiBuZXcgUHJvY2Vzc2luZ0ltYWdlKGZpbmFsLndpZHRoLCBmaW5hbC5oZWlnaHQsIDQsIGZpbmFsLmRhdGEpO1xufVxuIl19
@@ -13,38 +13,51 @@ export class ProcessingImage {
13
13
  this.channels = channels;
14
14
  this.data = data;
15
15
  }
16
- /** Convert to browser-native ImageData (RGBA). */
16
+ /**
17
+ * Convert to browser-native ImageData (RGBA). Gray (1), gray+alpha (2) and
18
+ * RGB (3) are expanded; other channel counts throw.
19
+ */
17
20
  toImageData() {
18
21
  if (this.channels === 4) {
19
22
  return new ImageData(this.data, this.width, this.height);
20
23
  }
21
- // Expand grayscale or RGB to RGBA
24
+ const c = this.channels;
25
+ if (c < 1 || c > 3) {
26
+ throw new Error(`ProcessingImage: cannot convert ${c} channels to RGBA (expected 1–4).`);
27
+ }
22
28
  const rgba = new Uint8ClampedArray(this.width * this.height * 4);
23
29
  for (let i = 0; i < this.width * this.height; i++) {
24
- if (this.channels === 1) {
25
- rgba[i * 4] = this.data[i];
26
- rgba[i * 4 + 1] = this.data[i];
27
- rgba[i * 4 + 2] = this.data[i];
30
+ const src = i * c;
31
+ const dst = i * 4;
32
+ if (c === 3) {
33
+ rgba[dst] = this.data[src];
34
+ rgba[dst + 1] = this.data[src + 1];
35
+ rgba[dst + 2] = this.data[src + 2];
28
36
  }
29
- else if (this.channels === 3) {
30
- rgba[i * 4] = this.data[i * 3];
31
- rgba[i * 4 + 1] = this.data[i * 3 + 1];
32
- rgba[i * 4 + 2] = this.data[i * 3 + 2];
37
+ else {
38
+ rgba[dst] = rgba[dst + 1] = rgba[dst + 2] = this.data[src];
33
39
  }
34
- rgba[i * 4 + 3] = 255;
40
+ rgba[dst + 3] = c === 2 ? this.data[src + 1] : 255;
35
41
  }
36
42
  return new ImageData(rgba, this.width, this.height);
37
43
  }
38
- /** Convert to Blob for saving/downloading. */
44
+ /** Convert to Blob for saving/downloading. Rejects when the browser can't encode it. */
39
45
  async toBlob(mime = 'image/png') {
40
46
  const canvas = document.createElement('canvas');
41
47
  canvas.width = this.width;
42
48
  canvas.height = this.height;
43
49
  const ctx = canvas.getContext('2d');
50
+ if (!ctx)
51
+ throw new Error('ProcessingImage: no 2D canvas context available.');
44
52
  ctx.putImageData(this.toImageData(), 0, 0);
45
- return new Promise((resolve) => {
46
- canvas.toBlob((blob) => resolve(blob), mime);
53
+ return new Promise((resolve, reject) => {
54
+ canvas.toBlob((blob) => {
55
+ if (blob)
56
+ resolve(blob);
57
+ else
58
+ reject(new Error(`ProcessingImage: the browser could not encode the image as ${mime}.`));
59
+ }, mime);
47
60
  });
48
61
  }
49
62
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc2luZy1pbWFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvY2Vzc2luZy9wcm9jZXNzaW5nLWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBTTFCLHFDQUFxQztJQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQW9CO1FBQ3ZDLE9BQU8sSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFDN0QsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsWUFBWSxLQUFhLEVBQUUsTUFBYyxFQUFFLFFBQWdCLEVBQUUsSUFBdUI7UUFDbEYsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0Qsa0NBQWtDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWUsV0FBVztRQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUUsQ0FBQztRQUNyQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pZmllZCBpbWFnZSBjb250YWluZXIgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lLlxuICogRGVjb3VwbGVzIHBpcGVsaW5lIGxvZ2ljIGZyb20gYW55IHNwZWNpZmljIGxpYnJhcnkncyBpbWFnZSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9jZXNzaW5nSW1hZ2Uge1xuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2hhbm5lbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7XG5cbiAgLyoqIENyZWF0ZSBmcm9tIGJyb3dzZXIgSW1hZ2VEYXRhLiAqL1xuICBzdGF0aWMgZnJvbUltYWdlRGF0YShpbWFnZURhdGE6IEltYWdlRGF0YSk6IFByb2Nlc3NpbmdJbWFnZSB7XG4gICAgcmV0dXJuIG5ldyBQcm9jZXNzaW5nSW1hZ2UoaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0LCA0LFxuICAgICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGltYWdlRGF0YS5kYXRhKSk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgY2hhbm5lbHM6IG51bWJlciwgZGF0YTogVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5jaGFubmVscyA9IGNoYW5uZWxzO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gIH1cblxuICAvKiogQ29udmVydCB0byBicm93c2VyLW5hdGl2ZSBJbWFnZURhdGEgKFJHQkEpLiAqL1xuICB0b0ltYWdlRGF0YSgpOiBJbWFnZURhdGEge1xuICAgIGlmICh0aGlzLmNoYW5uZWxzID09PSA0KSB7XG4gICAgICByZXR1cm4gbmV3IEltYWdlRGF0YSh0aGlzLmRhdGEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9XG4gICAgLy8gRXhwYW5kIGdyYXlzY2FsZSBvciBSR0IgdG8gUkdCQVxuICAgIGNvbnN0IHJnYmEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hhbm5lbHMgPT09IDEpIHtcbiAgICAgICAgcmdiYVtpICogNF0gPSB0aGlzLmRhdGFbaV07XG4gICAgICAgIHJnYmFbaSAqIDQgKyAxXSA9IHRoaXMuZGF0YVtpXTtcbiAgICAgICAgcmdiYVtpICogNCArIDJdID0gdGhpcy5kYXRhW2ldO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoYW5uZWxzID09PSAzKSB7XG4gICAgICAgIHJnYmFbaSAqIDRdID0gdGhpcy5kYXRhW2kgKiAzXTtcbiAgICAgICAgcmdiYVtpICogNCArIDFdID0gdGhpcy5kYXRhW2kgKiAzICsgMV07XG4gICAgICAgIHJnYmFbaSAqIDQgKyAyXSA9IHRoaXMuZGF0YVtpICogMyArIDJdO1xuICAgICAgfVxuICAgICAgcmdiYVtpICogNCArIDNdID0gMjU1O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEltYWdlRGF0YShyZ2JhLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIH1cblxuICAvKiogQ29udmVydCB0byBCbG9iIGZvciBzYXZpbmcvZG93bmxvYWRpbmcuICovXG4gIGFzeW5jIHRvQmxvYihtaW1lOiBzdHJpbmcgPSAnaW1hZ2UvcG5nJyk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpITtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKHRoaXMudG9JbWFnZURhdGEoKSwgMCwgMCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiByZXNvbHZlKGJsb2IhKSwgbWltZSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc2luZy1pbWFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvY2Vzc2luZy9wcm9jZXNzaW5nLWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBTTFCLHFDQUFxQztJQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQW9CO1FBQ3ZDLE9BQU8sSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxZQUFZLEtBQWEsRUFBRSxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxJQUF1QjtRQUNsRixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3JELENBQUM7UUFDRCxPQUFPLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBZSxXQUFXO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQzlFLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxJQUFJO29CQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7b0JBQ25CLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyw4REFBOEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbmlmaWVkIGltYWdlIGNvbnRhaW5lciB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUuXG4gKiBEZWNvdXBsZXMgcGlwZWxpbmUgbG9naWMgZnJvbSBhbnkgc3BlY2lmaWMgbGlicmFyeSdzIGltYWdlIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2Nlc3NpbmdJbWFnZSB7XG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuICByZWFkb25seSBjaGFubmVsczogbnVtYmVyO1xuICByZWFkb25seSBkYXRhOiBVaW50OENsYW1wZWRBcnJheTtcblxuICAvKiogQ3JlYXRlIGZyb20gYnJvd3NlciBJbWFnZURhdGEuICovXG4gIHN0YXRpYyBmcm9tSW1hZ2VEYXRhKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvY2Vzc2luZ0ltYWdlIHtcbiAgICByZXR1cm4gbmV3IFByb2Nlc3NpbmdJbWFnZShpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQsIDQsIG5ldyBVaW50OENsYW1wZWRBcnJheShpbWFnZURhdGEuZGF0YSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3Iod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNoYW5uZWxzOiBudW1iZXIsIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuY2hhbm5lbHMgPSBjaGFubmVscztcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdG8gYnJvd3Nlci1uYXRpdmUgSW1hZ2VEYXRhIChSR0JBKS4gR3JheSAoMSksIGdyYXkrYWxwaGEgKDIpIGFuZFxuICAgKiBSR0IgKDMpIGFyZSBleHBhbmRlZDsgb3RoZXIgY2hhbm5lbCBjb3VudHMgdGhyb3cuXG4gICAqL1xuICB0b0ltYWdlRGF0YSgpOiBJbWFnZURhdGEge1xuICAgIGlmICh0aGlzLmNoYW5uZWxzID09PSA0KSB7XG4gICAgICByZXR1cm4gbmV3IEltYWdlRGF0YSh0aGlzLmRhdGEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9XG4gICAgY29uc3QgYyA9IHRoaXMuY2hhbm5lbHM7XG4gICAgaWYgKGMgPCAxIHx8IGMgPiAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2Nlc3NpbmdJbWFnZTogY2Fubm90IGNvbnZlcnQgJHtjfSBjaGFubmVscyB0byBSR0JBIChleHBlY3RlZCAx4oCTNCkuYCk7XG4gICAgfVxuICAgIGNvbnN0IHJnYmEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkrKykge1xuICAgICAgY29uc3Qgc3JjID0gaSAqIGM7XG4gICAgICBjb25zdCBkc3QgPSBpICogNDtcbiAgICAgIGlmIChjID09PSAzKSB7XG4gICAgICAgIHJnYmFbZHN0XSA9IHRoaXMuZGF0YVtzcmNdO1xuICAgICAgICByZ2JhW2RzdCArIDFdID0gdGhpcy5kYXRhW3NyYyArIDFdO1xuICAgICAgICByZ2JhW2RzdCArIDJdID0gdGhpcy5kYXRhW3NyYyArIDJdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmdiYVtkc3RdID0gcmdiYVtkc3QgKyAxXSA9IHJnYmFbZHN0ICsgMl0gPSB0aGlzLmRhdGFbc3JjXTtcbiAgICAgIH1cbiAgICAgIHJnYmFbZHN0ICsgM10gPSBjID09PSAyID8gdGhpcy5kYXRhW3NyYyArIDFdIDogMjU1O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEltYWdlRGF0YShyZ2JhLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIH1cblxuICAvKiogQ29udmVydCB0byBCbG9iIGZvciBzYXZpbmcvZG93bmxvYWRpbmcuIFJlamVjdHMgd2hlbiB0aGUgYnJvd3NlciBjYW4ndCBlbmNvZGUgaXQuICovXG4gIGFzeW5jIHRvQmxvYihtaW1lOiBzdHJpbmcgPSAnaW1hZ2UvcG5nJyk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3NpbmdJbWFnZTogbm8gMkQgY2FudmFzIGNvbnRleHQgYXZhaWxhYmxlLicpO1xuICAgIGN0eC5wdXRJbWFnZURhdGEodGhpcy50b0ltYWdlRGF0YSgpLCAwLCAwKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgICBpZiAoYmxvYikgcmVzb2x2ZShibG9iKTtcbiAgICAgICAgZWxzZSByZWplY3QobmV3IEVycm9yKGBQcm9jZXNzaW5nSW1hZ2U6IHRoZSBicm93c2VyIGNvdWxkIG5vdCBlbmNvZGUgdGhlIGltYWdlIGFzICR7bWltZX0uYCkpO1xuICAgICAgfSwgbWltZSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -4,12 +4,25 @@ import { OpenSeadragonVisualizerService } from './implementations/osd/openseadra
4
4
  import { NapariVisualizerService } from './implementations/napari-js/napari-visualizer.service';
5
5
  import { VisualizerStore } from './store/visualizer-store.service';
6
6
  import { RegionStore } from './store/region-store.service';
7
- import { WandToolService } from './toolbar/wand/wand-tool.service';
8
- import { VertexEraserToolService } from './toolbar/vertex-eraser/vertex-eraser-tool.service';
9
- import { ZoomToBoxToolService } from './toolbar/zoom-to-box/zoom-to-box-tool.service';
7
+ import { SamToolService } from './toolbar/segmentation/sam-tool.service';
8
+ import { SamPointToolService } from './toolbar/segmentation/sam-point-tool.service';
9
+ import { CellSegmentToolService } from './toolbar/segmentation/cell-segment-tool.service';
10
+ import { SpatialSelectionStore } from './store/spatial-selection.service';
11
+ import { IntensityProfileService } from './intensity/intensity-profile.service';
10
12
  import { VISUALIZER } from './contracts/visualizer.contract';
11
13
  import { REGION_EDITOR_API } from './contracts/region-editor-api.contract';
12
14
  import { CHANNEL_HISTOGRAM_API } from './contracts/channel-histogram-api.contract';
15
+ /**
16
+ * The three host-facing contracts, all served by the router. Shared by
17
+ * {@link provideVisualization} (component scope) and `VisualizationModule` (root),
18
+ * so both bind them the same way; at each scope they resolve to that scope's router.
19
+ * Package-internal (not exported from the public API).
20
+ */
21
+ export const VISUALIZER_TOKEN_BINDINGS = [
22
+ { provide: VISUALIZER, useExisting: RoutingVisualizerService },
23
+ { provide: REGION_EDITOR_API, useExisting: RoutingVisualizerService },
24
+ { provide: CHANNEL_HISTOGRAM_API, useExisting: RoutingVisualizerService },
25
+ ];
13
26
  /**
14
27
  * A self-contained, isolated visualization backend chain for a component subtree.
15
28
  *
@@ -37,10 +50,20 @@ import { CHANNEL_HISTOGRAM_API } from './contracts/channel-histogram-api.contrac
37
50
  * embedded viewer gets its own router/Plotly/OSD/stores/tools while the rest of the
38
51
  * app keeps the default root instance.
39
52
  *
53
+ * In an application's own providers (`bootstrapApplication(App, { providers: [
54
+ * provideVisualization(), …] })`) it binds the one app-wide chain instead — the
55
+ * standalone counterpart of importing the deprecated `VisualizationModule`.
56
+ *
40
57
  * Lists EVERY stateful service in the chain. Stateless collaborators (HttpClient,
41
58
  * MessageService, WandService) deliberately resolve to root — they hold no
42
- * per-viewer state, so sharing them is correct and keeps this list minimal. When a
43
- * new stateful service joins the rendering chain, add it here too.
59
+ * per-viewer state, so sharing them is correct and keeps this list minimal. The
60
+ * SAM model session (`SamSessionService`) is also root on purpose: every viewer's
61
+ * SAM tools share one model download and Worker/GPU session (see its doc; a host
62
+ * can provide it at a viewer component to get a per-viewer session that is
63
+ * disposed with the viewer). When a
64
+ * new stateful service joins the rendering chain, add it here too —
65
+ * `provide-visualization.spec.ts` fails until it is listed (or allow-listed there as
66
+ * deliberately shared).
44
67
  */
45
68
  export function provideVisualization() {
46
69
  return [
@@ -50,14 +73,17 @@ export function provideVisualization() {
50
73
  NapariVisualizerService,
51
74
  VisualizerStore,
52
75
  RegionStore,
53
- WandToolService,
54
- VertexEraserToolService,
55
- ZoomToBoxToolService,
56
- // The three host-facing contracts are all served by the router — bound here at
57
- // the SAME (component) scope so they resolve to the isolated instance, not root.
58
- { provide: VISUALIZER, useExisting: RoutingVisualizerService },
59
- { provide: REGION_EDITOR_API, useExisting: RoutingVisualizerService },
60
- { provide: CHANNEL_HISTOGRAM_API, useExisting: RoutingVisualizerService },
76
+ SpatialSelectionStore,
77
+ IntensityProfileService,
78
+ // The canvas tools (wand, brush, eraser, zoom-to-box, SAM point) are not here:
79
+ // each backend above builds its own instances in its CanvasToolManager. The
80
+ // SAM point tools report through the chain's SamPointToolService.
81
+ SamToolService,
82
+ SamPointToolService,
83
+ CellSegmentToolService,
84
+ // The host-facing contracts, bound here at the SAME (component) scope so they
85
+ // resolve to the isolated router instance, not root.
86
+ ...VISUALIZER_TOKEN_BINDINGS,
61
87
  ];
62
88
  }
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS12aXN1YWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlLXZpc3VhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVuRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsT0FBTztRQUNMLHdCQUF3QjtRQUN4QixhQUFhO1FBQ2IsOEJBQThCO1FBQzlCLHVCQUF1QjtRQUN2QixlQUFlO1FBQ2YsV0FBVztRQUNYLGVBQWU7UUFDZix1QkFBdUI7UUFDdkIsb0JBQW9CO1FBQ3BCLCtFQUErRTtRQUMvRSxpRkFBaUY7UUFDakYsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSx3QkFBd0IsRUFBRTtRQUM5RCxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7UUFDckUsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFO0tBQzFFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yb3V0aW5nLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQbG90bHlTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L3Bsb3RseS5zZXJ2aWNlJztcbmltcG9ydCB7IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL29zZC9vcGVuc2VhZHJhZ29uLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kVG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci92ZXJ0ZXgtZXJhc2VyL3ZlcnRleC1lcmFzZXItdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21Ub0JveFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBWSVNVQUxJWkVSIH0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSRUdJT05fRURJVE9SX0FQSSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IENIQU5ORUxfSElTVE9HUkFNX0FQSSB9IGZyb20gJy4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5cbi8qKlxuICogQSBzZWxmLWNvbnRhaW5lZCwgaXNvbGF0ZWQgdmlzdWFsaXphdGlvbiBiYWNrZW5kIGNoYWluIGZvciBhIGNvbXBvbmVudCBzdWJ0cmVlLlxuICpcbiAqIFRoZSBjaGFpbiBzZXJ2aWNlcyBhcmUgYHByb3ZpZGVkSW46ICdyb290J2Agc2luZ2xldG9ucywgc28gYnkgZGVmYXVsdCB0aGUgd2hvbGVcbiAqIGFwcCBzaGFyZXMgb25lIHZpZXdlcidzIHN0YXRlIChyZWdpb25zLCBpbWFnZSwgY2hhbm5lbHMsIHJlbmRlciBoYW5kbGVzKSDigJQgd2hpY2hcbiAqIGlzIGNvcnJlY3QgZm9yIHRoZSBzaW5nbGUgbWFpbiB2aWV3ZXIuIEEgY29uc3VtZXIgdGhhdCBuZWVkcyBhIFNFQ09ORCwgaW5kZXBlbmRlbnRcbiAqIHZpZXdlciAoZS5nLiBhIG1vZGFsIHRoYXQgbW91bnRzIGA8dmlzdWFsaXplcj5gIG92ZXIgdGhlIGxpdmUgbWFpbiB2aWV3XG4gKiBhbmQgbXVzdCBub3QgY2xvYmJlciBpdHMgcmVnaW9ucy9pbWFnZSkgZHJvcHMgdGhpcyBpbnRvIGl0cyBjb21wb25lbnQgYHByb3ZpZGVyc2A6XG4gKlxuICogYGBgdHNcbiAqIEBDb21wb25lbnQoe1xuICogICAuLi4sXG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIC4uLnByb3ZpZGVWaXN1YWxpemF0aW9uKCksICAgICAgICAgICAgICAgICAvLyBpc29sYXRlZCBjaGFpbiBpbnN0YW5jZVxuICogICAgIC8vIHBsdXMgdGhlIGhvc3QgcG9ydHMgKyBjb25maWcgZm9yIFRISVMgdmlld2VyOlxuICogICAgIHsgcHJvdmlkZTogSU1BR0VfU1RBVEVfUE9SVCwgdXNlQ2xhc3M6IE15SW1hZ2VTdGF0ZUFkYXB0ZXIgfSxcbiAqICAgICB7IHByb3ZpZGU6IFRJTEVfQUNDRVNTX1BPUlQsIHVzZUNsYXNzOiBNeVRpbGVBY2Nlc3NBZGFwdGVyIH0sXG4gKiAgICAgeyBwcm92aWRlOiBSRUdJT05fSU9fUE9SVCwgICB1c2VDbGFzczogTXlSZWdpb25Jb0FkYXB0ZXIgfSxcbiAqICAgICB7IHByb3ZpZGU6IFZJWl9DT05GSUcsICAgICAgIHVzZVZhbHVlOiB7IHNsaWRlQ3JvcFNlcnZlcjogJycgfSB9LFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICpcbiAqIENvbXBvbmVudC1zY29wZWQgcHJvdmlkZXJzIHNoYWRvdyB0aGUgcm9vdCBzaW5nbGV0b25zIGZvciB0aGF0IHN1YnRyZWUsIHNvIHRoZVxuICogZW1iZWRkZWQgdmlld2VyIGdldHMgaXRzIG93biByb3V0ZXIvUGxvdGx5L09TRC9zdG9yZXMvdG9vbHMgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlXG4gKiBhcHAga2VlcHMgdGhlIGRlZmF1bHQgcm9vdCBpbnN0YW5jZS5cbiAqXG4gKiBMaXN0cyBFVkVSWSBzdGF0ZWZ1bCBzZXJ2aWNlIGluIHRoZSBjaGFpbi4gU3RhdGVsZXNzIGNvbGxhYm9yYXRvcnMgKEh0dHBDbGllbnQsXG4gKiBNZXNzYWdlU2VydmljZSwgV2FuZFNlcnZpY2UpIGRlbGliZXJhdGVseSByZXNvbHZlIHRvIHJvb3Qg4oCUIHRoZXkgaG9sZCBub1xuICogcGVyLXZpZXdlciBzdGF0ZSwgc28gc2hhcmluZyB0aGVtIGlzIGNvcnJlY3QgYW5kIGtlZXBzIHRoaXMgbGlzdCBtaW5pbWFsLiBXaGVuIGFcbiAqIG5ldyBzdGF0ZWZ1bCBzZXJ2aWNlIGpvaW5zIHRoZSByZW5kZXJpbmcgY2hhaW4sIGFkZCBpdCBoZXJlIHRvby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVWaXN1YWxpemF0aW9uKCk6IFByb3ZpZGVyW10ge1xuICByZXR1cm4gW1xuICAgIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSxcbiAgICBQbG90bHlTZXJ2aWNlLFxuICAgIE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICBOYXBhcmlWaXN1YWxpemVyU2VydmljZSxcbiAgICBWaXN1YWxpemVyU3RvcmUsXG4gICAgUmVnaW9uU3RvcmUsXG4gICAgV2FuZFRvb2xTZXJ2aWNlLFxuICAgIFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIFpvb21Ub0JveFRvb2xTZXJ2aWNlLFxuICAgIC8vIFRoZSB0aHJlZSBob3N0LWZhY2luZyBjb250cmFjdHMgYXJlIGFsbCBzZXJ2ZWQgYnkgdGhlIHJvdXRlciDigJQgYm91bmQgaGVyZSBhdFxuICAgIC8vIHRoZSBTQU1FIChjb21wb25lbnQpIHNjb3BlIHNvIHRoZXkgcmVzb2x2ZSB0byB0aGUgaXNvbGF0ZWQgaW5zdGFuY2UsIG5vdCByb290LlxuICAgIHsgcHJvdmlkZTogVklTVUFMSVpFUiwgdXNlRXhpc3Rpbmc6IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9LFxuICAgIHsgcHJvdmlkZTogUkVHSU9OX0VESVRPUl9BUEksIHVzZUV4aXN0aW5nOiBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UgfSxcbiAgICB7IHByb3ZpZGU6IENIQU5ORUxfSElTVE9HUkFNX0FQSSwgdXNlRXhpc3Rpbmc6IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9LFxuICBdO1xufVxuIl19
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS12aXN1YWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlLXZpc3VhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFlO0lBQ25ELEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7SUFDOUQsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFO0lBQ3JFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSx3QkFBd0IsRUFBRTtDQUMxRSxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPO1FBQ0wsd0JBQXdCO1FBQ3hCLGFBQWE7UUFDYiw4QkFBOEI7UUFDOUIsdUJBQXVCO1FBQ3ZCLGVBQWU7UUFDZixXQUFXO1FBQ1gscUJBQXFCO1FBQ3JCLHVCQUF1QjtRQUN2QiwrRUFBK0U7UUFDL0UsNEVBQTRFO1FBQzVFLGtFQUFrRTtRQUNsRSxjQUFjO1FBQ2QsbUJBQW1CO1FBQ25CLHNCQUFzQjtRQUN0Qiw4RUFBOEU7UUFDOUUscURBQXFEO1FBQ3JELEdBQUcseUJBQXlCO0tBQzdCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yb3V0aW5nLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQbG90bHlTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L3Bsb3RseS5zZXJ2aWNlJztcbmltcG9ydCB7IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL29zZC9vcGVuc2VhZHJhZ29uLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlIH0gZnJvbSAnLi9pbnRlbnNpdHkvaW50ZW5zaXR5LXByb2ZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBWSVNVQUxJWkVSIH0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSRUdJT05fRURJVE9SX0FQSSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IENIQU5ORUxfSElTVE9HUkFNX0FQSSB9IGZyb20gJy4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5cbi8qKlxuICogVGhlIHRocmVlIGhvc3QtZmFjaW5nIGNvbnRyYWN0cywgYWxsIHNlcnZlZCBieSB0aGUgcm91dGVyLiBTaGFyZWQgYnlcbiAqIHtAbGluayBwcm92aWRlVmlzdWFsaXphdGlvbn0gKGNvbXBvbmVudCBzY29wZSkgYW5kIGBWaXN1YWxpemF0aW9uTW9kdWxlYCAocm9vdCksXG4gKiBzbyBib3RoIGJpbmQgdGhlbSB0aGUgc2FtZSB3YXk7IGF0IGVhY2ggc2NvcGUgdGhleSByZXNvbHZlIHRvIHRoYXQgc2NvcGUncyByb3V0ZXIuXG4gKiBQYWNrYWdlLWludGVybmFsIChub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSSkuXG4gKi9cbmV4cG9ydCBjb25zdCBWSVNVQUxJWkVSX1RPS0VOX0JJTkRJTkdTOiBQcm92aWRlcltdID0gW1xuICB7IHByb3ZpZGU6IFZJU1VBTElaRVIsIHVzZUV4aXN0aW5nOiBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UgfSxcbiAgeyBwcm92aWRlOiBSRUdJT05fRURJVE9SX0FQSSwgdXNlRXhpc3Rpbmc6IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9LFxuICB7IHByb3ZpZGU6IENIQU5ORUxfSElTVE9HUkFNX0FQSSwgdXNlRXhpc3Rpbmc6IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9LFxuXTtcblxuLyoqXG4gKiBBIHNlbGYtY29udGFpbmVkLCBpc29sYXRlZCB2aXN1YWxpemF0aW9uIGJhY2tlbmQgY2hhaW4gZm9yIGEgY29tcG9uZW50IHN1YnRyZWUuXG4gKlxuICogVGhlIGNoYWluIHNlcnZpY2VzIGFyZSBgcHJvdmlkZWRJbjogJ3Jvb3QnYCBzaW5nbGV0b25zLCBzbyBieSBkZWZhdWx0IHRoZSB3aG9sZVxuICogYXBwIHNoYXJlcyBvbmUgdmlld2VyJ3Mgc3RhdGUgKHJlZ2lvbnMsIGltYWdlLCBjaGFubmVscywgcmVuZGVyIGhhbmRsZXMpIOKAlCB3aGljaFxuICogaXMgY29ycmVjdCBmb3IgdGhlIHNpbmdsZSBtYWluIHZpZXdlci4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgU0VDT05ELCBpbmRlcGVuZGVudFxuICogdmlld2VyIChlLmcuIGEgbW9kYWwgdGhhdCBtb3VudHMgYDx2aXN1YWxpemVyPmAgb3ZlciB0aGUgbGl2ZSBtYWluIHZpZXdcbiAqIGFuZCBtdXN0IG5vdCBjbG9iYmVyIGl0cyByZWdpb25zL2ltYWdlKSBkcm9wcyB0aGlzIGludG8gaXRzIGNvbXBvbmVudCBgcHJvdmlkZXJzYDpcbiAqXG4gKiBgYGB0c1xuICogQENvbXBvbmVudCh7XG4gKiAgIC4uLixcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgLi4ucHJvdmlkZVZpc3VhbGl6YXRpb24oKSwgICAgICAgICAgICAgICAgIC8vIGlzb2xhdGVkIGNoYWluIGluc3RhbmNlXG4gKiAgICAgLy8gcGx1cyB0aGUgaG9zdCBwb3J0cyArIGNvbmZpZyBmb3IgVEhJUyB2aWV3ZXI6XG4gKiAgICAgeyBwcm92aWRlOiBJTUFHRV9TVEFURV9QT1JULCB1c2VDbGFzczogTXlJbWFnZVN0YXRlQWRhcHRlciB9LFxuICogICAgIHsgcHJvdmlkZTogVElMRV9BQ0NFU1NfUE9SVCwgdXNlQ2xhc3M6IE15VGlsZUFjY2Vzc0FkYXB0ZXIgfSxcbiAqICAgICB7IHByb3ZpZGU6IFJFR0lPTl9JT19QT1JULCAgIHVzZUNsYXNzOiBNeVJlZ2lvbklvQWRhcHRlciB9LFxuICogICAgIHsgcHJvdmlkZTogVklaX0NPTkZJRywgICAgICAgdXNlVmFsdWU6IHsgc2xpZGVDcm9wU2VydmVyOiAnJyB9IH0sXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQ29tcG9uZW50LXNjb3BlZCBwcm92aWRlcnMgc2hhZG93IHRoZSByb290IHNpbmdsZXRvbnMgZm9yIHRoYXQgc3VidHJlZSwgc28gdGhlXG4gKiBlbWJlZGRlZCB2aWV3ZXIgZ2V0cyBpdHMgb3duIHJvdXRlci9QbG90bHkvT1NEL3N0b3Jlcy90b29scyB3aGlsZSB0aGUgcmVzdCBvZiB0aGVcbiAqIGFwcCBrZWVwcyB0aGUgZGVmYXVsdCByb290IGluc3RhbmNlLlxuICpcbiAqIEluIGFuIGFwcGxpY2F0aW9uJ3Mgb3duIHByb3ZpZGVycyAoYGJvb3RzdHJhcEFwcGxpY2F0aW9uKEFwcCwgeyBwcm92aWRlcnM6IFtcbiAqIHByb3ZpZGVWaXN1YWxpemF0aW9uKCksIOKApl0gfSlgKSBpdCBiaW5kcyB0aGUgb25lIGFwcC13aWRlIGNoYWluIGluc3RlYWQg4oCUIHRoZVxuICogc3RhbmRhbG9uZSBjb3VudGVycGFydCBvZiBpbXBvcnRpbmcgdGhlIGRlcHJlY2F0ZWQgYFZpc3VhbGl6YXRpb25Nb2R1bGVgLlxuICpcbiAqIExpc3RzIEVWRVJZIHN0YXRlZnVsIHNlcnZpY2UgaW4gdGhlIGNoYWluLiBTdGF0ZWxlc3MgY29sbGFib3JhdG9ycyAoSHR0cENsaWVudCxcbiAqIE1lc3NhZ2VTZXJ2aWNlLCBXYW5kU2VydmljZSkgZGVsaWJlcmF0ZWx5IHJlc29sdmUgdG8gcm9vdCDigJQgdGhleSBob2xkIG5vXG4gKiBwZXItdmlld2VyIHN0YXRlLCBzbyBzaGFyaW5nIHRoZW0gaXMgY29ycmVjdCBhbmQga2VlcHMgdGhpcyBsaXN0IG1pbmltYWwuIFRoZVxuICogU0FNIG1vZGVsIHNlc3Npb24gKGBTYW1TZXNzaW9uU2VydmljZWApIGlzIGFsc28gcm9vdCBvbiBwdXJwb3NlOiBldmVyeSB2aWV3ZXInc1xuICogU0FNIHRvb2xzIHNoYXJlIG9uZSBtb2RlbCBkb3dubG9hZCBhbmQgV29ya2VyL0dQVSBzZXNzaW9uIChzZWUgaXRzIGRvYzsgYSBob3N0XG4gKiBjYW4gcHJvdmlkZSBpdCBhdCBhIHZpZXdlciBjb21wb25lbnQgdG8gZ2V0IGEgcGVyLXZpZXdlciBzZXNzaW9uIHRoYXQgaXNcbiAqIGRpc3Bvc2VkIHdpdGggdGhlIHZpZXdlcikuIFdoZW4gYVxuICogbmV3IHN0YXRlZnVsIHNlcnZpY2Ugam9pbnMgdGhlIHJlbmRlcmluZyBjaGFpbiwgYWRkIGl0IGhlcmUgdG9vIOKAlFxuICogYHByb3ZpZGUtdmlzdWFsaXphdGlvbi5zcGVjLnRzYCBmYWlscyB1bnRpbCBpdCBpcyBsaXN0ZWQgKG9yIGFsbG93LWxpc3RlZCB0aGVyZSBhc1xuICogZGVsaWJlcmF0ZWx5IHNoYXJlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmlzdWFsaXphdGlvbigpOiBQcm92aWRlcltdIHtcbiAgcmV0dXJuIFtcbiAgICBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UsXG4gICAgUGxvdGx5U2VydmljZSxcbiAgICBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UsXG4gICAgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgVmlzdWFsaXplclN0b3JlLFxuICAgIFJlZ2lvblN0b3JlLFxuICAgIFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBJbnRlbnNpdHlQcm9maWxlU2VydmljZSxcbiAgICAvLyBUaGUgY2FudmFzIHRvb2xzICh3YW5kLCBicnVzaCwgZXJhc2VyLCB6b29tLXRvLWJveCwgU0FNIHBvaW50KSBhcmUgbm90IGhlcmU6XG4gICAgLy8gZWFjaCBiYWNrZW5kIGFib3ZlIGJ1aWxkcyBpdHMgb3duIGluc3RhbmNlcyBpbiBpdHMgQ2FudmFzVG9vbE1hbmFnZXIuIFRoZVxuICAgIC8vIFNBTSBwb2ludCB0b29scyByZXBvcnQgdGhyb3VnaCB0aGUgY2hhaW4ncyBTYW1Qb2ludFRvb2xTZXJ2aWNlLlxuICAgIFNhbVRvb2xTZXJ2aWNlLFxuICAgIFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICAvLyBUaGUgaG9zdC1mYWNpbmcgY29udHJhY3RzLCBib3VuZCBoZXJlIGF0IHRoZSBTQU1FIChjb21wb25lbnQpIHNjb3BlIHNvIHRoZXlcbiAgICAvLyByZXNvbHZlIHRvIHRoZSBpc29sYXRlZCByb3V0ZXIgaW5zdGFuY2UsIG5vdCByb290LlxuICAgIC4uLlZJU1VBTElaRVJfVE9LRU5fQklORElOR1MsXG4gIF07XG59XG4iXX0=
@@ -0,0 +1,99 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { TooltipModule } from 'primeng/tooltip';
5
+ import { presetKey } from '../../store/class-color.util';
6
+ import { HexColorPickerComponent } from '../../hex-color-picker/hex-color-picker.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ import * as i2 from "primeng/button";
10
+ import * as i3 from "primeng/tooltip";
11
+ /**
12
+ * The Region Editor's docked "Classes" panel (jit-ui#70): every annotation
13
+ * class with its colour swatch and region count. A row click picks the active
14
+ * class (and re-classifies a selection), the swatch recolours the class, the
15
+ * trash removes it, Manage opens the full editor. Presentational: the editor
16
+ * applies every action.
17
+ */
18
+ export class ClassesPanelComponent {
19
+ constructor() {
20
+ /** The classes in display order. */
21
+ this.classes = [];
22
+ /** Region count per class, keyed by {@link presetKey} under `matchMode`. */
23
+ this.counts = new Map();
24
+ /** How labels are matched to classes (keys {@link counts}). */
25
+ this.matchMode = 'exact';
26
+ /** The active class (highlighted), or null. */
27
+ this.activeClass = null;
28
+ /** Number of selected regions (changes what a row click does). */
29
+ this.selectedCount = 0;
30
+ /** The class regions revert to; it can't be removed while in use. */
31
+ this.defaultClassName = 'Region';
32
+ /** A row was clicked: make the class active / apply it to the selection. */
33
+ this.pick = new EventEmitter();
34
+ /** A class's swatch picked a new colour. */
35
+ this.recolor = new EventEmitter();
36
+ /** A class's trash button (its name). */
37
+ this.remove = new EventEmitter();
38
+ /** Manage clicked. */
39
+ this.manage = new EventEmitter();
40
+ /** trackBy for the class rows so re-sorting doesn't re-create the pickers. */
41
+ this.trackByName = (_, c) => c.name;
42
+ /** The rows drawn, rebuilt when an input changes rather than per check. */
43
+ this.rows = [];
44
+ }
45
+ ngOnChanges() {
46
+ this.rows = this.classes.map((c) => ({
47
+ name: c.name,
48
+ color: c.color,
49
+ count: this.count(c.name),
50
+ canRemove: this.canRemove(c.name),
51
+ rowTooltip: this.rowTooltip(c.name),
52
+ removeTooltip: this.removeTooltip(c.name),
53
+ }));
54
+ }
55
+ count(name) {
56
+ return this.counts.get(presetKey({ matchMode: this.matchMode }, name)) ?? 0;
57
+ }
58
+ canRemove(name) {
59
+ return !(name === this.defaultClassName && this.count(name) > 0);
60
+ }
61
+ rowTooltip(name) {
62
+ return this.selectedCount
63
+ ? `Apply “${name}” to the selected region(s)`
64
+ : `Set “${name}” active — new regions use it`;
65
+ }
66
+ removeTooltip(name) {
67
+ const inUse = this.count(name) > 0;
68
+ if (name === this.defaultClassName && inUse)
69
+ return 'The default class cannot be removed while in use';
70
+ return inUse ? `Remove class — its regions revert to ${this.defaultClassName}` : 'Remove class';
71
+ }
72
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassesPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
73
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ClassesPanelComponent, isStandalone: true, selector: "region-classes-panel", inputs: { classes: "classes", counts: "counts", matchMode: "matchMode", activeClass: "activeClass", selectedCount: "selectedCount", defaultClassName: "defaultClassName" }, outputs: { pick: "pick", recolor: "recolor", remove: "remove", manage: "manage" }, usesOnChanges: true, ngImport: i0, template: "<!-- Docked \"Classes\" panel (jit-ui#70): the always-visible list of annotation\n classes above the regions table. Click a row to make it the active class\n (new regions inherit it; with rows selected it re-classifies them); recolour\n via the swatch; the badge shows how many regions use the class. \"Manage\"\n opens the full editor (fallback palette, auto-add, matching, import/export). -->\n<div class=\"classes-panel\">\n <div class=\"classes-panel-header\">\n <span class=\"classes-panel-title\">Classes</span>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-cog\"\n label=\"Manage\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Manage classes \u2014 add / remove, palette, matching, import/export\"\n tooltipPosition=\"bottom\"\n (click)=\"manage.emit()\"\n ></button>\n </div>\n <div class=\"classes-panel-body\">\n <div\n *ngFor=\"let c of rows; trackBy: trackByName\"\n class=\"class-row\"\n [class.active]=\"activeClass === c.name\"\n (click)=\"pick.emit(c.name)\"\n [pTooltip]=\"c.rowTooltip\"\n tooltipPosition=\"bottom\"\n >\n <span class=\"row-swatch\" (click)=\"$event.stopPropagation()\">\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"recolor.emit({ name: c.name, color: $event })\">\n </hex-color-picker>\n </span>\n <span class=\"row-name\">{{ c.name }}</span>\n <span class=\"row-count\" [class.zero]=\"c.count === 0\">{{ c.count }}</span>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning row-del\"\n [disabled]=\"!c.canRemove\"\n [pTooltip]=\"c.removeTooltip\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"'Remove class ' + c.name\"\n (click)=\"$event.stopPropagation(); remove.emit(c.name)\"\n ></button>\n </div>\n <div *ngIf=\"!classes.length\" class=\"classes-empty\">No classes yet \u2014 add one from Manage.</div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;flex:0 0 auto}.classes-panel{display:flex;flex-direction:column;flex:0 0 auto;border-bottom:1px solid var(--surface-border)}.classes-panel-header{display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border-bottom:1px solid var(--surface-border)}.classes-panel-title{font-size:.75rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-color-secondary);margin-right:auto}.classes-panel-body{height:7rem;min-height:2.5rem;max-height:60vh;overflow-x:hidden;overflow-y:auto;resize:vertical}::ng-deep region-classes-panel .classes-panel-body .hex-picker-swatch{width:1.25rem;height:1.25rem;border-width:1px}.class-row{display:flex;align-items:center;gap:.5rem;padding:.1rem .5rem;cursor:pointer;border-left:3px solid transparent}.class-row:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.class-row.active{background:var(--highlight-bg, rgba(51, 153, 255, .12));border-left-color:var(--primary-color)}.class-row .row-swatch{flex:0 0 auto;display:inline-flex}.class-row .row-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.85rem}.class-row.active .row-name{color:var(--primary-color);font-weight:600}.class-row .row-count{flex:0 0 auto;min-width:1.5rem;text-align:center;font-size:.72rem;font-variant-numeric:tabular-nums;color:var(--text-color-secondary);background:var(--surface-200, rgba(0, 0, 0, .06));border-radius:10px;padding:0 .4rem}.class-row .row-count.zero{opacity:.5}.class-row .row-del{flex:0 0 auto}.classes-empty{font-size:.8rem;color:var(--text-color-secondary);padding:.5rem}::ng-deep region-classes-panel .classes-panel-body .class-row .p-button.p-button-icon-only{width:1.75rem;height:1.75rem;padding:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassesPanelComponent, decorators: [{
76
+ type: Component,
77
+ args: [{ selector: 'region-classes-panel', standalone: true, imports: [CommonModule, ButtonModule, TooltipModule, HexColorPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Docked \"Classes\" panel (jit-ui#70): the always-visible list of annotation\n classes above the regions table. Click a row to make it the active class\n (new regions inherit it; with rows selected it re-classifies them); recolour\n via the swatch; the badge shows how many regions use the class. \"Manage\"\n opens the full editor (fallback palette, auto-add, matching, import/export). -->\n<div class=\"classes-panel\">\n <div class=\"classes-panel-header\">\n <span class=\"classes-panel-title\">Classes</span>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-cog\"\n label=\"Manage\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Manage classes \u2014 add / remove, palette, matching, import/export\"\n tooltipPosition=\"bottom\"\n (click)=\"manage.emit()\"\n ></button>\n </div>\n <div class=\"classes-panel-body\">\n <div\n *ngFor=\"let c of rows; trackBy: trackByName\"\n class=\"class-row\"\n [class.active]=\"activeClass === c.name\"\n (click)=\"pick.emit(c.name)\"\n [pTooltip]=\"c.rowTooltip\"\n tooltipPosition=\"bottom\"\n >\n <span class=\"row-swatch\" (click)=\"$event.stopPropagation()\">\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"recolor.emit({ name: c.name, color: $event })\">\n </hex-color-picker>\n </span>\n <span class=\"row-name\">{{ c.name }}</span>\n <span class=\"row-count\" [class.zero]=\"c.count === 0\">{{ c.count }}</span>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning row-del\"\n [disabled]=\"!c.canRemove\"\n [pTooltip]=\"c.removeTooltip\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"'Remove class ' + c.name\"\n (click)=\"$event.stopPropagation(); remove.emit(c.name)\"\n ></button>\n </div>\n <div *ngIf=\"!classes.length\" class=\"classes-empty\">No classes yet \u2014 add one from Manage.</div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;flex:0 0 auto}.classes-panel{display:flex;flex-direction:column;flex:0 0 auto;border-bottom:1px solid var(--surface-border)}.classes-panel-header{display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border-bottom:1px solid var(--surface-border)}.classes-panel-title{font-size:.75rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-color-secondary);margin-right:auto}.classes-panel-body{height:7rem;min-height:2.5rem;max-height:60vh;overflow-x:hidden;overflow-y:auto;resize:vertical}::ng-deep region-classes-panel .classes-panel-body .hex-picker-swatch{width:1.25rem;height:1.25rem;border-width:1px}.class-row{display:flex;align-items:center;gap:.5rem;padding:.1rem .5rem;cursor:pointer;border-left:3px solid transparent}.class-row:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.class-row.active{background:var(--highlight-bg, rgba(51, 153, 255, .12));border-left-color:var(--primary-color)}.class-row .row-swatch{flex:0 0 auto;display:inline-flex}.class-row .row-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.85rem}.class-row.active .row-name{color:var(--primary-color);font-weight:600}.class-row .row-count{flex:0 0 auto;min-width:1.5rem;text-align:center;font-size:.72rem;font-variant-numeric:tabular-nums;color:var(--text-color-secondary);background:var(--surface-200, rgba(0, 0, 0, .06));border-radius:10px;padding:0 .4rem}.class-row .row-count.zero{opacity:.5}.class-row .row-del{flex:0 0 auto}.classes-empty{font-size:.8rem;color:var(--text-color-secondary);padding:.5rem}::ng-deep region-classes-panel .classes-panel-body .class-row .p-button.p-button-icon-only{width:1.75rem;height:1.75rem;padding:0}\n"] }]
78
+ }], propDecorators: { classes: [{
79
+ type: Input
80
+ }], counts: [{
81
+ type: Input
82
+ }], matchMode: [{
83
+ type: Input
84
+ }], activeClass: [{
85
+ type: Input
86
+ }], selectedCount: [{
87
+ type: Input
88
+ }], defaultClassName: [{
89
+ type: Input
90
+ }], pick: [{
91
+ type: Output
92
+ }], recolor: [{
93
+ type: Output
94
+ }], remove: [{
95
+ type: Output
96
+ }], manage: [{
97
+ type: Output
98
+ }] } });
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvY2xhc3Nlcy1wYW5lbC9jbGFzc2VzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9jbGFzc2VzLXBhbmVsL2NsYXNzZXMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUdoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7Ozs7O0FBWTVGOzs7Ozs7R0FNRztBQVNILE1BQU0sT0FBTyxxQkFBcUI7SUFSbEM7UUFTRSxvQ0FBb0M7UUFDM0IsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFDckMsNEVBQTRFO1FBQ25FLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUM1QywrREFBK0Q7UUFDdEQsY0FBUyxHQUFjLE9BQU8sQ0FBQztRQUN4QywrQ0FBK0M7UUFDdEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQzNDLGtFQUFrRTtRQUN6RCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUMzQixxRUFBcUU7UUFDNUQscUJBQWdCLEdBQUcsUUFBUSxDQUFDO1FBRXJDLDRFQUE0RTtRQUNsRSxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM1Qyw0Q0FBNEM7UUFDbEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO1FBQ3hFLHlDQUF5QztRQUMvQixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM5QyxzQkFBc0I7UUFDWixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUU1Qyw4RUFBOEU7UUFDM0QsZ0JBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFXLEVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFNUUsMkVBQTJFO1FBQ2pFLFNBQUksR0FBZSxFQUFFLENBQUM7S0FnQ2pDO0lBOUJDLFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25DLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDMUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBWTtRQUM1QixPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVTLFVBQVUsQ0FBQyxJQUFZO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGFBQWE7WUFDdkIsQ0FBQyxDQUFDLFVBQVUsSUFBSSw2QkFBNkI7WUFDN0MsQ0FBQyxDQUFDLFFBQVEsSUFBSSwrQkFBK0IsQ0FBQztJQUNsRCxDQUFDO0lBRVMsYUFBYSxDQUFDLElBQVk7UUFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLGdCQUFnQixJQUFJLEtBQUs7WUFBRSxPQUFPLGtEQUFrRCxDQUFDO1FBQ3ZHLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyx3Q0FBd0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUNsRyxDQUFDOzhHQTFEVSxxQkFBcUI7a0dBQXJCLHFCQUFxQixvV0NsQ2xDLHloRUFpREEsc3hERHBCWSxZQUFZLCtQQUFFLFlBQVksNE9BQUUsYUFBYSxzWEFBRSx1QkFBdUI7OzJGQUtqRSxxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixDQUFDLG1CQUc1RCx1QkFBdUIsQ0FBQyxNQUFNOzhCQUl0QyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHSSxJQUFJO3NCQUFiLE1BQU07Z0JBRUcsT0FBTztzQkFBaEIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcblxuaW1wb3J0IHsgQ2xhc3NQcmVzZXQsIE1hdGNoTW9kZSB9IGZyb20gJy4uLy4uL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgcHJlc2V0S2V5IH0gZnJvbSAnLi4vLi4vc3RvcmUvY2xhc3MtY29sb3IudXRpbCc7XG5pbXBvcnQgeyBIZXhDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2hleC1jb2xvci1waWNrZXIvaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQnO1xuXG4vKiogT25lIGNsYXNzIHJvdyBhcyB0aGUgdGVtcGxhdGUgZHJhd3MgaXQsIGRlcml2ZWQgb25jZSBwZXIgaW5wdXQgY2hhbmdlLiAqL1xuaW50ZXJmYWNlIENsYXNzUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb2xvcjogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBjYW5SZW1vdmU6IGJvb2xlYW47XG4gIHJvd1Rvb2x0aXA6IHN0cmluZztcbiAgcmVtb3ZlVG9vbHRpcDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBSZWdpb24gRWRpdG9yJ3MgZG9ja2VkIFwiQ2xhc3Nlc1wiIHBhbmVsIChqaXQtdWkjNzApOiBldmVyeSBhbm5vdGF0aW9uXG4gKiBjbGFzcyB3aXRoIGl0cyBjb2xvdXIgc3dhdGNoIGFuZCByZWdpb24gY291bnQuIEEgcm93IGNsaWNrIHBpY2tzIHRoZSBhY3RpdmVcbiAqIGNsYXNzIChhbmQgcmUtY2xhc3NpZmllcyBhIHNlbGVjdGlvbiksIHRoZSBzd2F0Y2ggcmVjb2xvdXJzIHRoZSBjbGFzcywgdGhlXG4gKiB0cmFzaCByZW1vdmVzIGl0LCBNYW5hZ2Ugb3BlbnMgdGhlIGZ1bGwgZWRpdG9yLiBQcmVzZW50YXRpb25hbDogdGhlIGVkaXRvclxuICogYXBwbGllcyBldmVyeSBhY3Rpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1jbGFzc2VzLXBhbmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnV0dG9uTW9kdWxlLCBUb29sdGlwTW9kdWxlLCBIZXhDb2xvclBpY2tlckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jbGFzc2VzLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2xhc3Nlc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBjbGFzc2VzIGluIGRpc3BsYXkgb3JkZXIuICovXG4gIEBJbnB1dCgpIGNsYXNzZXM6IENsYXNzUHJlc2V0W10gPSBbXTtcbiAgLyoqIFJlZ2lvbiBjb3VudCBwZXIgY2xhc3MsIGtleWVkIGJ5IHtAbGluayBwcmVzZXRLZXl9IHVuZGVyIGBtYXRjaE1vZGVgLiAqL1xuICBASW5wdXQoKSBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogSG93IGxhYmVscyBhcmUgbWF0Y2hlZCB0byBjbGFzc2VzIChrZXlzIHtAbGluayBjb3VudHN9KS4gKi9cbiAgQElucHV0KCkgbWF0Y2hNb2RlOiBNYXRjaE1vZGUgPSAnZXhhY3QnO1xuICAvKiogVGhlIGFjdGl2ZSBjbGFzcyAoaGlnaGxpZ2h0ZWQpLCBvciBudWxsLiAqL1xuICBASW5wdXQoKSBhY3RpdmVDbGFzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBOdW1iZXIgb2Ygc2VsZWN0ZWQgcmVnaW9ucyAoY2hhbmdlcyB3aGF0IGEgcm93IGNsaWNrIGRvZXMpLiAqL1xuICBASW5wdXQoKSBzZWxlY3RlZENvdW50ID0gMDtcbiAgLyoqIFRoZSBjbGFzcyByZWdpb25zIHJldmVydCB0bzsgaXQgY2FuJ3QgYmUgcmVtb3ZlZCB3aGlsZSBpbiB1c2UuICovXG4gIEBJbnB1dCgpIGRlZmF1bHRDbGFzc05hbWUgPSAnUmVnaW9uJztcblxuICAvKiogQSByb3cgd2FzIGNsaWNrZWQ6IG1ha2UgdGhlIGNsYXNzIGFjdGl2ZSAvIGFwcGx5IGl0IHRvIHRoZSBzZWxlY3Rpb24uICovXG4gIEBPdXRwdXQoKSBwaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBBIGNsYXNzJ3Mgc3dhdGNoIHBpY2tlZCBhIG5ldyBjb2xvdXIuICovXG4gIEBPdXRwdXQoKSByZWNvbG9yID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9PigpO1xuICAvKiogQSBjbGFzcydzIHRyYXNoIGJ1dHRvbiAoaXRzIG5hbWUpLiAqL1xuICBAT3V0cHV0KCkgcmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBNYW5hZ2UgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIG1hbmFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogdHJhY2tCeSBmb3IgdGhlIGNsYXNzIHJvd3Mgc28gcmUtc29ydGluZyBkb2Vzbid0IHJlLWNyZWF0ZSB0aGUgcGlja2Vycy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYWNrQnlOYW1lID0gKF86IG51bWJlciwgYzogQ2xhc3NSb3cpOiBzdHJpbmcgPT4gYy5uYW1lO1xuXG4gIC8qKiBUaGUgcm93cyBkcmF3biwgcmVidWlsdCB3aGVuIGFuIGlucHV0IGNoYW5nZXMgcmF0aGVyIHRoYW4gcGVyIGNoZWNrLiAqL1xuICBwcm90ZWN0ZWQgcm93czogQ2xhc3NSb3dbXSA9IFtdO1xuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IHRoaXMuY2xhc3Nlcy5tYXAoKGMpID0+ICh7XG4gICAgICBuYW1lOiBjLm5hbWUsXG4gICAgICBjb2xvcjogYy5jb2xvcixcbiAgICAgIGNvdW50OiB0aGlzLmNvdW50KGMubmFtZSksXG4gICAgICBjYW5SZW1vdmU6IHRoaXMuY2FuUmVtb3ZlKGMubmFtZSksXG4gICAgICByb3dUb29sdGlwOiB0aGlzLnJvd1Rvb2x0aXAoYy5uYW1lKSxcbiAgICAgIHJlbW92ZVRvb2x0aXA6IHRoaXMucmVtb3ZlVG9vbHRpcChjLm5hbWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY291bnQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudHMuZ2V0KHByZXNldEtleSh7IG1hdGNoTW9kZTogdGhpcy5tYXRjaE1vZGUgfSwgbmFtZSkpID8/IDA7XG4gIH1cblxuICBwcml2YXRlIGNhblJlbW92ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShuYW1lID09PSB0aGlzLmRlZmF1bHRDbGFzc05hbWUgJiYgdGhpcy5jb3VudChuYW1lKSA+IDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJvd1Rvb2x0aXAobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50XG4gICAgICA/IGBBcHBseSDigJwke25hbWV94oCdIHRvIHRoZSBzZWxlY3RlZCByZWdpb24ocylgXG4gICAgICA6IGBTZXQg4oCcJHtuYW1lfeKAnSBhY3RpdmUg4oCUIG5ldyByZWdpb25zIHVzZSBpdGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlVG9vbHRpcChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluVXNlID0gdGhpcy5jb3VudChuYW1lKSA+IDA7XG4gICAgaWYgKG5hbWUgPT09IHRoaXMuZGVmYXVsdENsYXNzTmFtZSAmJiBpblVzZSkgcmV0dXJuICdUaGUgZGVmYXVsdCBjbGFzcyBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBpbiB1c2UnO1xuICAgIHJldHVybiBpblVzZSA/IGBSZW1vdmUgY2xhc3Mg4oCUIGl0cyByZWdpb25zIHJldmVydCB0byAke3RoaXMuZGVmYXVsdENsYXNzTmFtZX1gIDogJ1JlbW92ZSBjbGFzcyc7XG4gIH1cbn1cbiIsIjwhLS0gRG9ja2VkIFwiQ2xhc3Nlc1wiIHBhbmVsIChqaXQtdWkjNzApOiB0aGUgYWx3YXlzLXZpc2libGUgbGlzdCBvZiBhbm5vdGF0aW9uXG4gICAgIGNsYXNzZXMgYWJvdmUgdGhlIHJlZ2lvbnMgdGFibGUuIENsaWNrIGEgcm93IHRvIG1ha2UgaXQgdGhlIGFjdGl2ZSBjbGFzc1xuICAgICAobmV3IHJlZ2lvbnMgaW5oZXJpdCBpdDsgd2l0aCByb3dzIHNlbGVjdGVkIGl0IHJlLWNsYXNzaWZpZXMgdGhlbSk7IHJlY29sb3VyXG4gICAgIHZpYSB0aGUgc3dhdGNoOyB0aGUgYmFkZ2Ugc2hvd3MgaG93IG1hbnkgcmVnaW9ucyB1c2UgdGhlIGNsYXNzLiBcIk1hbmFnZVwiXG4gICAgIG9wZW5zIHRoZSBmdWxsIGVkaXRvciAoZmFsbGJhY2sgcGFsZXR0ZSwgYXV0by1hZGQsIG1hdGNoaW5nLCBpbXBvcnQvZXhwb3J0KS4gLS0+XG48ZGl2IGNsYXNzPVwiY2xhc3Nlcy1wYW5lbFwiPlxuICA8ZGl2IGNsYXNzPVwiY2xhc3Nlcy1wYW5lbC1oZWFkZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cImNsYXNzZXMtcGFuZWwtdGl0bGVcIj5DbGFzc2VzPC9zcGFuPlxuICAgIDxidXR0b25cbiAgICAgIHBCdXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgaWNvbj1cInBpIHBpLWNvZ1wiXG4gICAgICBsYWJlbD1cIk1hbmFnZVwiXG4gICAgICBjbGFzcz1cInAtYnV0dG9uLXNtIHAtYnV0dG9uLXRleHRcIlxuICAgICAgcFRvb2x0aXA9XCJNYW5hZ2UgY2xhc3NlcyDigJQgYWRkIC8gcmVtb3ZlLCBwYWxldHRlLCBtYXRjaGluZywgaW1wb3J0L2V4cG9ydFwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cIm1hbmFnZS5lbWl0KClcIlxuICAgID48L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjbGFzc2VzLXBhbmVsLWJvZHlcIj5cbiAgICA8ZGl2XG4gICAgICAqbmdGb3I9XCJsZXQgYyBvZiByb3dzOyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICBjbGFzcz1cImNsYXNzLXJvd1wiXG4gICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZUNsYXNzID09PSBjLm5hbWVcIlxuICAgICAgKGNsaWNrKT1cInBpY2suZW1pdChjLm5hbWUpXCJcbiAgICAgIFtwVG9vbHRpcF09XCJjLnJvd1Rvb2x0aXBcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cInJvdy1zd2F0Y2hcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxoZXgtY29sb3ItcGlja2VyIFtjb2xvcl09XCJjLmNvbG9yXCIgKGNvbG9yQ2hhbmdlKT1cInJlY29sb3IuZW1pdCh7IG5hbWU6IGMubmFtZSwgY29sb3I6ICRldmVudCB9KVwiPlxuICAgICAgICA8L2hleC1jb2xvci1waWNrZXI+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInJvdy1uYW1lXCI+e3sgYy5uYW1lIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctY291bnRcIiBbY2xhc3MuemVyb109XCJjLmNvdW50ID09PSAwXCI+e3sgYy5jb3VudCB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgcEJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCJcbiAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXdhcm5pbmcgcm93LWRlbFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhYy5jYW5SZW1vdmVcIlxuICAgICAgICBbcFRvb2x0aXBdPVwiYy5yZW1vdmVUb29sdGlwXCJcbiAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlIGNsYXNzICcgKyBjLm5hbWVcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmUuZW1pdChjLm5hbWUpXCJcbiAgICAgID48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiIWNsYXNzZXMubGVuZ3RoXCIgY2xhc3M9XCJjbGFzc2VzLWVtcHR5XCI+Tm8gY2xhc3NlcyB5ZXQg4oCUIGFkZCBvbmUgZnJvbSBNYW5hZ2UuPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A file name without its extension: `slide.ome.tif` → `slide.ome`. A name with
3
+ * no extension — or only a leading dot, like `.hidden` — is returned whole, so
4
+ * a derived name is never a bare `.geojson`. `fallback` stands in for a missing
5
+ * name.
6
+ */
7
+ export function fileStem(name, fallback) {
8
+ if (!name)
9
+ return fallback;
10
+ const dot = name.lastIndexOf('.');
11
+ return dot > 0 ? name.substring(0, dot) : name;
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tZWRpdG9yL2ZpbGUtc3RlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBK0IsRUFBRSxRQUFnQjtJQUN4RSxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZmlsZSBuYW1lIHdpdGhvdXQgaXRzIGV4dGVuc2lvbjogYHNsaWRlLm9tZS50aWZgIOKGkiBgc2xpZGUub21lYC4gQSBuYW1lIHdpdGhcbiAqIG5vIGV4dGVuc2lvbiDigJQgb3Igb25seSBhIGxlYWRpbmcgZG90LCBsaWtlIGAuaGlkZGVuYCDigJQgaXMgcmV0dXJuZWQgd2hvbGUsIHNvXG4gKiBhIGRlcml2ZWQgbmFtZSBpcyBuZXZlciBhIGJhcmUgYC5nZW9qc29uYC4gYGZhbGxiYWNrYCBzdGFuZHMgaW4gZm9yIGEgbWlzc2luZ1xuICogbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVTdGVtKG5hbWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIW5hbWUpIHJldHVybiBmYWxsYmFjaztcbiAgY29uc3QgZG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpO1xuICByZXR1cm4gZG90ID4gMCA/IG5hbWUuc3Vic3RyaW5nKDAsIGRvdCkgOiBuYW1lO1xufVxuIl19
@@ -0,0 +1,118 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { SharedModule } from 'primeng/api';
5
+ import { ButtonModule } from 'primeng/button';
6
+ import { CheckboxModule } from 'primeng/checkbox';
7
+ import { DialogModule } from 'primeng/dialog';
8
+ import { InputTextModule } from 'primeng/inputtext';
9
+ import { SelectButtonModule } from 'primeng/selectbutton';
10
+ import { TooltipModule } from 'primeng/tooltip';
11
+ import { HexColorPickerComponent } from '../../hex-color-picker/hex-color-picker.component';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/common";
14
+ import * as i2 from "@angular/forms";
15
+ import * as i3 from "primeng/api";
16
+ import * as i4 from "primeng/button";
17
+ import * as i5 from "primeng/checkbox";
18
+ import * as i6 from "primeng/dialog";
19
+ import * as i7 from "primeng/inputtext";
20
+ import * as i8 from "primeng/selectbutton";
21
+ import * as i9 from "primeng/tooltip";
22
+ /**
23
+ * "Manage annotation classes" (jit-ui#70): edit the classes, the fallback
24
+ * palette, auto-add and label matching of a working copy of the preset set,
25
+ * plus reset / import / export. The editor owns the draft (`[(draft)]`); every
26
+ * edit here emits a new draft object (nothing is changed in place), and Apply
27
+ * asks the editor to persist it.
28
+ */
29
+ export class ManageClassesDialogComponent {
30
+ constructor() {
31
+ /** The dialog is open. */
32
+ this.visible = false;
33
+ /** The dialog was closed (`false`); two-way with {@link visible}. */
34
+ this.visibleChange = new EventEmitter();
35
+ /** The working copy being edited (null until the dialog is opened). */
36
+ this.draft = null;
37
+ /** Every edit: the new draft object; two-way with {@link draft}. */
38
+ this.draftChange = new EventEmitter();
39
+ /** Apply clicked: persist the draft and close. */
40
+ this.apply = new EventEmitter();
41
+ /** Reset clicked: restore the default classes. */
42
+ this.resetDefaults = new EventEmitter();
43
+ /** A preset JSON file was chosen (the input's change event). */
44
+ this.importFile = new EventEmitter();
45
+ /** Export clicked. */
46
+ this.export = new EventEmitter();
47
+ this.matchModeOptions = [
48
+ { label: 'Exact', value: 'exact' },
49
+ { label: 'Normalized', value: 'normalized' },
50
+ ];
51
+ /** Rows keep their DOM (and input focus) while their class object is replaced. */
52
+ this.trackByIndex = (i) => i;
53
+ }
54
+ addClass() {
55
+ this.update((d) => ({ classes: [...d.classes, { name: '', color: '#888888', source: 'user' }] }));
56
+ }
57
+ removeClass(i) {
58
+ this.update((d) => ({ classes: d.classes.filter((_, k) => k !== i) }));
59
+ }
60
+ patchClass(i, patch) {
61
+ this.update((d) => ({ classes: d.classes.map((c, k) => (k === i ? { ...c, ...patch } : c)) }));
62
+ }
63
+ addFallbackColor() {
64
+ this.update((d) => ({ fallbackPalette: [...d.fallbackPalette, '#888888'] }));
65
+ }
66
+ removeFallbackColor(i) {
67
+ this.update((d) => ({ fallbackPalette: d.fallbackPalette.filter((_, k) => k !== i) }));
68
+ }
69
+ setFallbackColor(i, color) {
70
+ this.update((d) => ({ fallbackPalette: d.fallbackPalette.map((c, k) => (k === i ? color : c)) }));
71
+ }
72
+ setAutoPromote(autoPromote) {
73
+ this.update(() => ({ autoPromote }));
74
+ }
75
+ setMatchMode(matchMode) {
76
+ this.update(() => ({ matchMode }));
77
+ }
78
+ update(change) {
79
+ if (!this.draft)
80
+ return;
81
+ this.draft = { ...this.draft, ...change(this.draft) };
82
+ this.draftChange.emit(this.draft);
83
+ }
84
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ManageClassesDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
85
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ManageClassesDialogComponent, isStandalone: true, selector: "region-manage-classes-dialog", inputs: { visible: "visible", draft: "draft" }, outputs: { visibleChange: "visibleChange", draftChange: "draftChange", apply: "apply", resetDefaults: "resetDefaults", importFile: "importFile", export: "export" }, ngImport: i0, template: "<p-dialog\n header=\"Manage annotation classes\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"true\"\n appendTo=\"body\"\n [style]=\"{ width: '34rem' }\"\n [draggable]=\"true\"\n [resizable]=\"false\"\n>\n <div *ngIf=\"draft\" class=\"manage-dialog flex flex-column gap-3 pt-2\">\n <div class=\"manage-classes flex flex-column gap-2\">\n <div\n *ngFor=\"let c of draft.classes; let i = index; trackBy: trackByIndex\"\n class=\"manage-class-row flex align-items-center gap-2\"\n >\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"patchClass(i, { color: $event })\"></hex-color-picker>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm flex-1\"\n [ngModel]=\"c.name\"\n (ngModelChange)=\"patchClass(i, { name: $event })\"\n placeholder=\"Class name\"\n aria-label=\"Class name\"\n />\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning\"\n pTooltip=\"Remove class\"\n tooltipPosition=\"bottom\"\n aria-label=\"Remove class\"\n (click)=\"removeClass(i)\"\n ></button>\n </div>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n label=\"Add class\"\n class=\"p-button-sm p-button-text align-self-start\"\n (click)=\"addClass()\"\n ></button>\n </div>\n\n <div class=\"manage-section flex flex-column gap-2\">\n <span class=\"section-title font-medium\"\n >Fallback palette <small class=\"text-color-secondary\">\u2014 colours for classes not listed</small></span\n >\n <div class=\"fallback-palette flex align-items-center flex-wrap gap-2\">\n <span\n *ngFor=\"let col of draft.fallbackPalette; let i = index; trackBy: trackByIndex\"\n class=\"fallback-swatch flex align-items-center\"\n >\n <hex-color-picker [color]=\"col\" (colorChange)=\"setFallbackColor(i, $event)\"></hex-color-picker>\n <i\n class=\"pi pi-times icon-hover ml-1\"\n pTooltip=\"Remove\"\n tooltipPosition=\"bottom\"\n (click)=\"removeFallbackColor(i)\"\n ></i>\n </span>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Add fallback colour\"\n tooltipPosition=\"bottom\"\n aria-label=\"Add fallback colour\"\n (click)=\"addFallbackColor()\"\n ></button>\n </div>\n </div>\n\n <div class=\"flex align-items-center gap-2\">\n <p-checkbox\n [ngModel]=\"draft.autoPromote\"\n (ngModelChange)=\"setAutoPromote($event)\"\n [binary]=\"true\"\n inputId=\"autoPromote\"\n ></p-checkbox>\n <label for=\"autoPromote\">Auto-add detected classes to this list as they appear</label>\n </div>\n\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">Label matching</span>\n <p-selectButton\n [options]=\"matchModeOptions\"\n [ngModel]=\"draft.matchMode\"\n (ngModelChange)=\"setMatchMode($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n ></p-selectButton>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"manage-footer flex align-items-center flex-wrap gap-2 w-full\">\n <span class=\"flex align-items-center flex-wrap gap-1\">\n <p-button label=\"Reset\" icon=\"pi pi-refresh\" [text]=\"true\" (onClick)=\"resetDefaults.emit()\"></p-button>\n <p-button label=\"Import\" icon=\"pi pi-upload\" [text]=\"true\" (onClick)=\"presetFileInput.click()\"></p-button>\n <input\n #presetFileInput\n type=\"file\"\n accept=\".json,application/json\"\n hidden\n (change)=\"importFile.emit($event); presetFileInput.value = ''\"\n />\n <p-button label=\"Export\" icon=\"pi pi-download\" [text]=\"true\" (onClick)=\"export.emit()\"></p-button>\n </span>\n <span class=\"flex-1\"></span>\n <!-- Apply persists to the server and closes. -->\n <p-button label=\"Apply\" icon=\"pi pi-check\" (onClick)=\"apply.emit()\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".manage-dialog .manage-class-row hex-color-picker,.manage-dialog .fallback-palette hex-color-picker{flex:0 0 auto}.manage-dialog .fallback-palette .icon-hover{cursor:pointer;color:var(--text-color-secondary)}.manage-dialog .fallback-palette .icon-hover:hover{color:var(--primary-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i5.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i6.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i7.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i8.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
86
+ }
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ManageClassesDialogComponent, decorators: [{
88
+ type: Component,
89
+ args: [{ selector: 'region-manage-classes-dialog', standalone: true, imports: [
90
+ CommonModule,
91
+ FormsModule,
92
+ SharedModule,
93
+ ButtonModule,
94
+ CheckboxModule,
95
+ DialogModule,
96
+ InputTextModule,
97
+ SelectButtonModule,
98
+ TooltipModule,
99
+ HexColorPickerComponent,
100
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dialog\n header=\"Manage annotation classes\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"true\"\n appendTo=\"body\"\n [style]=\"{ width: '34rem' }\"\n [draggable]=\"true\"\n [resizable]=\"false\"\n>\n <div *ngIf=\"draft\" class=\"manage-dialog flex flex-column gap-3 pt-2\">\n <div class=\"manage-classes flex flex-column gap-2\">\n <div\n *ngFor=\"let c of draft.classes; let i = index; trackBy: trackByIndex\"\n class=\"manage-class-row flex align-items-center gap-2\"\n >\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"patchClass(i, { color: $event })\"></hex-color-picker>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm flex-1\"\n [ngModel]=\"c.name\"\n (ngModelChange)=\"patchClass(i, { name: $event })\"\n placeholder=\"Class name\"\n aria-label=\"Class name\"\n />\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning\"\n pTooltip=\"Remove class\"\n tooltipPosition=\"bottom\"\n aria-label=\"Remove class\"\n (click)=\"removeClass(i)\"\n ></button>\n </div>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n label=\"Add class\"\n class=\"p-button-sm p-button-text align-self-start\"\n (click)=\"addClass()\"\n ></button>\n </div>\n\n <div class=\"manage-section flex flex-column gap-2\">\n <span class=\"section-title font-medium\"\n >Fallback palette <small class=\"text-color-secondary\">\u2014 colours for classes not listed</small></span\n >\n <div class=\"fallback-palette flex align-items-center flex-wrap gap-2\">\n <span\n *ngFor=\"let col of draft.fallbackPalette; let i = index; trackBy: trackByIndex\"\n class=\"fallback-swatch flex align-items-center\"\n >\n <hex-color-picker [color]=\"col\" (colorChange)=\"setFallbackColor(i, $event)\"></hex-color-picker>\n <i\n class=\"pi pi-times icon-hover ml-1\"\n pTooltip=\"Remove\"\n tooltipPosition=\"bottom\"\n (click)=\"removeFallbackColor(i)\"\n ></i>\n </span>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Add fallback colour\"\n tooltipPosition=\"bottom\"\n aria-label=\"Add fallback colour\"\n (click)=\"addFallbackColor()\"\n ></button>\n </div>\n </div>\n\n <div class=\"flex align-items-center gap-2\">\n <p-checkbox\n [ngModel]=\"draft.autoPromote\"\n (ngModelChange)=\"setAutoPromote($event)\"\n [binary]=\"true\"\n inputId=\"autoPromote\"\n ></p-checkbox>\n <label for=\"autoPromote\">Auto-add detected classes to this list as they appear</label>\n </div>\n\n <div class=\"flex align-items-center gap-3\">\n <span class=\"font-medium\">Label matching</span>\n <p-selectButton\n [options]=\"matchModeOptions\"\n [ngModel]=\"draft.matchMode\"\n (ngModelChange)=\"setMatchMode($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n ></p-selectButton>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"manage-footer flex align-items-center flex-wrap gap-2 w-full\">\n <span class=\"flex align-items-center flex-wrap gap-1\">\n <p-button label=\"Reset\" icon=\"pi pi-refresh\" [text]=\"true\" (onClick)=\"resetDefaults.emit()\"></p-button>\n <p-button label=\"Import\" icon=\"pi pi-upload\" [text]=\"true\" (onClick)=\"presetFileInput.click()\"></p-button>\n <input\n #presetFileInput\n type=\"file\"\n accept=\".json,application/json\"\n hidden\n (change)=\"importFile.emit($event); presetFileInput.value = ''\"\n />\n <p-button label=\"Export\" icon=\"pi pi-download\" [text]=\"true\" (onClick)=\"export.emit()\"></p-button>\n </span>\n <span class=\"flex-1\"></span>\n <!-- Apply persists to the server and closes. -->\n <p-button label=\"Apply\" icon=\"pi pi-check\" (onClick)=\"apply.emit()\"></p-button>\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".manage-dialog .manage-class-row hex-color-picker,.manage-dialog .fallback-palette hex-color-picker{flex:0 0 auto}.manage-dialog .fallback-palette .icon-hover{cursor:pointer;color:var(--text-color-secondary)}.manage-dialog .fallback-palette .icon-hover:hover{color:var(--primary-color)}\n"] }]
101
+ }], propDecorators: { visible: [{
102
+ type: Input
103
+ }], visibleChange: [{
104
+ type: Output
105
+ }], draft: [{
106
+ type: Input
107
+ }], draftChange: [{
108
+ type: Output
109
+ }], apply: [{
110
+ type: Output
111
+ }], resetDefaults: [{
112
+ type: Output
113
+ }], importFile: [{
114
+ type: Output
115
+ }], export: [{
116
+ type: Output
117
+ }] } });
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLWNsYXNzZXMtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9tYW5hZ2UtY2xhc3Nlcy1kaWFsb2cvbWFuYWdlLWNsYXNzZXMtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9tYW5hZ2UtY2xhc3Nlcy1kaWFsb2cvbWFuYWdlLWNsYXNzZXMtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7Ozs7Ozs7Ozs7O0FBRTVGOzs7Ozs7R0FNRztBQW9CSCxNQUFNLE9BQU8sNEJBQTRCO0lBbkJ6QztRQW9CRSwwQkFBMEI7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUN6QixxRUFBcUU7UUFDM0Qsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXRELHVFQUF1RTtRQUM5RCxVQUFLLEdBQXFCLElBQUksQ0FBQztRQUN4QyxvRUFBb0U7UUFDMUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRXRELGtEQUFrRDtRQUN4QyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMzQyxrREFBa0Q7UUFDeEMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ25ELGdFQUFnRTtRQUN0RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNqRCxzQkFBc0I7UUFDWixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV6QixxQkFBZ0IsR0FBRztZQUNwQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUNsQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtTQUM3QyxDQUFDO1FBRUYsa0ZBQWtGO1FBQy9ELGlCQUFZLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztLQXVDNUQ7SUFyQ1csUUFBUTtRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFUyxXQUFXLENBQUMsQ0FBUztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFUyxVQUFVLENBQUMsQ0FBUyxFQUFFLEtBQTJCO1FBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVTLG1CQUFtQixDQUFDLENBQVM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRVMsZ0JBQWdCLENBQUMsQ0FBUyxFQUFFLEtBQWE7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFUyxjQUFjLENBQUMsV0FBb0I7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFUyxZQUFZLENBQUMsU0FBb0I7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxNQUFNLENBQUMsTUFBNEM7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDOzhHQWhFVSw0QkFBNEI7a0dBQTVCLDRCQUE0Qiw2U0N4Q3pDLHkzSUF1SEEseVZEOUZJLFlBQVksK1BBQ1osV0FBVyw4bUJBQ1gsWUFBWSxxSUFDWixZQUFZLDJrQkFDWixjQUFjLGdaQUNkLFlBQVksdXVCQUNaLGVBQWUsd0hBQ2Ysa0JBQWtCLHdWQUNsQixhQUFhLHNYQUNiLHVCQUF1Qjs7MkZBTWQsNEJBQTRCO2tCQW5CeEMsU0FBUzsrQkFDRSw4QkFBOEIsY0FDNUIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLHVCQUF1QjtxQkFDeEIsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLE9BQU87c0JBQWYsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNO2dCQUdFLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLEtBQUs7c0JBQWQsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgU2VsZWN0QnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zZWxlY3RidXR0b24nO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5cbmltcG9ydCB7IENsYXNzUHJlc2V0LCBNYXRjaE1vZGUsIFByZXNldFNldCB9IGZyb20gJy4uLy4uL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcblxuLyoqXG4gKiBcIk1hbmFnZSBhbm5vdGF0aW9uIGNsYXNzZXNcIiAoaml0LXVpIzcwKTogZWRpdCB0aGUgY2xhc3NlcywgdGhlIGZhbGxiYWNrXG4gKiBwYWxldHRlLCBhdXRvLWFkZCBhbmQgbGFiZWwgbWF0Y2hpbmcgb2YgYSB3b3JraW5nIGNvcHkgb2YgdGhlIHByZXNldCBzZXQsXG4gKiBwbHVzIHJlc2V0IC8gaW1wb3J0IC8gZXhwb3J0LiBUaGUgZWRpdG9yIG93bnMgdGhlIGRyYWZ0IChgWyhkcmFmdCldYCk7IGV2ZXJ5XG4gKiBlZGl0IGhlcmUgZW1pdHMgYSBuZXcgZHJhZnQgb2JqZWN0IChub3RoaW5nIGlzIGNoYW5nZWQgaW4gcGxhY2UpLCBhbmQgQXBwbHlcbiAqIGFza3MgdGhlIGVkaXRvciB0byBwZXJzaXN0IGl0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdpb24tbWFuYWdlLWNsYXNzZXMtZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENoZWNrYm94TW9kdWxlLFxuICAgIERpYWxvZ01vZHVsZSxcbiAgICBJbnB1dFRleHRNb2R1bGUsXG4gICAgU2VsZWN0QnV0dG9uTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tYW5hZ2UtY2xhc3Nlcy1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYW5hZ2UtY2xhc3Nlcy1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hbmFnZUNsYXNzZXNEaWFsb2dDb21wb25lbnQge1xuICAvKiogVGhlIGRpYWxvZyBpcyBvcGVuLiAqL1xuICBASW5wdXQoKSB2aXNpYmxlID0gZmFsc2U7XG4gIC8qKiBUaGUgZGlhbG9nIHdhcyBjbG9zZWQgKGBmYWxzZWApOyB0d28td2F5IHdpdGgge0BsaW5rIHZpc2libGV9LiAqL1xuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKiogVGhlIHdvcmtpbmcgY29weSBiZWluZyBlZGl0ZWQgKG51bGwgdW50aWwgdGhlIGRpYWxvZyBpcyBvcGVuZWQpLiAqL1xuICBASW5wdXQoKSBkcmFmdDogUHJlc2V0U2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBFdmVyeSBlZGl0OiB0aGUgbmV3IGRyYWZ0IG9iamVjdDsgdHdvLXdheSB3aXRoIHtAbGluayBkcmFmdH0uICovXG4gIEBPdXRwdXQoKSBkcmFmdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJlc2V0U2V0PigpO1xuXG4gIC8qKiBBcHBseSBjbGlja2VkOiBwZXJzaXN0IHRoZSBkcmFmdCBhbmQgY2xvc2UuICovXG4gIEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIFJlc2V0IGNsaWNrZWQ6IHJlc3RvcmUgdGhlIGRlZmF1bHQgY2xhc3Nlcy4gKi9cbiAgQE91dHB1dCgpIHJlc2V0RGVmYXVsdHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBBIHByZXNldCBKU09OIGZpbGUgd2FzIGNob3NlbiAodGhlIGlucHV0J3MgY2hhbmdlIGV2ZW50KS4gKi9cbiAgQE91dHB1dCgpIGltcG9ydEZpbGUgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICAvKiogRXhwb3J0IGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBleHBvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1hdGNoTW9kZU9wdGlvbnMgPSBbXG4gICAgeyBsYWJlbDogJ0V4YWN0JywgdmFsdWU6ICdleGFjdCcgfSxcbiAgICB7IGxhYmVsOiAnTm9ybWFsaXplZCcsIHZhbHVlOiAnbm9ybWFsaXplZCcgfSxcbiAgXTtcblxuICAvKiogUm93cyBrZWVwIHRoZWlyIERPTSAoYW5kIGlucHV0IGZvY3VzKSB3aGlsZSB0aGVpciBjbGFzcyBvYmplY3QgaXMgcmVwbGFjZWQuICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5SW5kZXggPSAoaTogbnVtYmVyKTogbnVtYmVyID0+IGk7XG5cbiAgcHJvdGVjdGVkIGFkZENsYXNzKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKChkKSA9PiAoeyBjbGFzc2VzOiBbLi4uZC5jbGFzc2VzLCB7IG5hbWU6ICcnLCBjb2xvcjogJyM4ODg4ODgnLCBzb3VyY2U6ICd1c2VyJyB9XSB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlQ2xhc3MoaTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoKGQpID0+ICh7IGNsYXNzZXM6IGQuY2xhc3Nlcy5maWx0ZXIoKF8sIGspID0+IGsgIT09IGkpIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXRjaENsYXNzKGk6IG51bWJlciwgcGF0Y2g6IFBhcnRpYWw8Q2xhc3NQcmVzZXQ+KTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoKGQpID0+ICh7IGNsYXNzZXM6IGQuY2xhc3Nlcy5tYXAoKGMsIGspID0+IChrID09PSBpID8geyAuLi5jLCAuLi5wYXRjaCB9IDogYykpIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRGYWxsYmFja0NvbG9yKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKChkKSA9PiAoeyBmYWxsYmFja1BhbGV0dGU6IFsuLi5kLmZhbGxiYWNrUGFsZXR0ZSwgJyM4ODg4ODgnXSB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlRmFsbGJhY2tDb2xvcihpOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZSgoZCkgPT4gKHsgZmFsbGJhY2tQYWxldHRlOiBkLmZhbGxiYWNrUGFsZXR0ZS5maWx0ZXIoKF8sIGspID0+IGsgIT09IGkpIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRGYWxsYmFja0NvbG9yKGk6IG51bWJlciwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKChkKSA9PiAoeyBmYWxsYmFja1BhbGV0dGU6IGQuZmFsbGJhY2tQYWxldHRlLm1hcCgoYywgaykgPT4gKGsgPT09IGkgPyBjb2xvciA6IGMpKSB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0QXV0b1Byb21vdGUoYXV0b1Byb21vdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZSgoKSA9PiAoeyBhdXRvUHJvbW90ZSB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0TWF0Y2hNb2RlKG1hdGNoTW9kZTogTWF0Y2hNb2RlKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoKCkgPT4gKHsgbWF0Y2hNb2RlIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKGNoYW5nZTogKGQ6IFByZXNldFNldCkgPT4gUGFydGlhbDxQcmVzZXRTZXQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWZ0KSByZXR1cm47XG4gICAgdGhpcy5kcmFmdCA9IHsgLi4udGhpcy5kcmFmdCwgLi4uY2hhbmdlKHRoaXMuZHJhZnQpIH07XG4gICAgdGhpcy5kcmFmdENoYW5nZS5lbWl0KHRoaXMuZHJhZnQpO1xuICB9XG59XG4iLCI8cC1kaWFsb2dcbiAgaGVhZGVyPVwiTWFuYWdlIGFubm90YXRpb24gY2xhc3Nlc1wiXG4gIFt2aXNpYmxlXT1cInZpc2libGVcIlxuICAodmlzaWJsZUNoYW5nZSk9XCJ2aXNpYmxlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gIFttb2RhbF09XCJ0cnVlXCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICczNHJlbScgfVwiXG4gIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuPlxuICA8ZGl2ICpuZ0lmPVwiZHJhZnRcIiBjbGFzcz1cIm1hbmFnZS1kaWFsb2cgZmxleCBmbGV4LWNvbHVtbiBnYXAtMyBwdC0yXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1hbmFnZS1jbGFzc2VzIGZsZXggZmxleC1jb2x1bW4gZ2FwLTJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IGMgb2YgZHJhZnQuY2xhc3NlczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgY2xhc3M9XCJtYW5hZ2UtY2xhc3Mtcm93IGZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgID5cbiAgICAgICAgPGhleC1jb2xvci1waWNrZXIgW2NvbG9yXT1cImMuY29sb3JcIiAoY29sb3JDaGFuZ2UpPVwicGF0Y2hDbGFzcyhpLCB7IGNvbG9yOiAkZXZlbnQgfSlcIj48L2hleC1jb2xvci1waWNrZXI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgY2xhc3M9XCJwLWlucHV0dGV4dC1zbSBmbGV4LTFcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cImMubmFtZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hDbGFzcyhpLCB7IG5hbWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJDbGFzcyBuYW1lXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xhc3MgbmFtZVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCJcbiAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXNtIHAtYnV0dG9uLXRleHQgcC1idXR0b24td2FybmluZ1wiXG4gICAgICAgICAgcFRvb2x0aXA9XCJSZW1vdmUgY2xhc3NcIlxuICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBjbGFzc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNsYXNzKGkpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHBCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgbGFiZWw9XCJBZGQgY2xhc3NcIlxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXNtIHAtYnV0dG9uLXRleHQgYWxpZ24tc2VsZi1zdGFydFwiXG4gICAgICAgIChjbGljayk9XCJhZGRDbGFzcygpXCJcbiAgICAgID48L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYW5hZ2Utc2VjdGlvbiBmbGV4IGZsZXgtY29sdW1uIGdhcC0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNlY3Rpb24tdGl0bGUgZm9udC1tZWRpdW1cIlxuICAgICAgICA+RmFsbGJhY2sgcGFsZXR0ZSA8c21hbGwgY2xhc3M9XCJ0ZXh0LWNvbG9yLXNlY29uZGFyeVwiPuKAlCBjb2xvdXJzIGZvciBjbGFzc2VzIG5vdCBsaXN0ZWQ8L3NtYWxsPjwvc3BhblxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImZhbGxiYWNrLXBhbGV0dGUgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC0yXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBkcmFmdC5mYWxsYmFja1BhbGV0dGU7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJmYWxsYmFjay1zd2F0Y2ggZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPGhleC1jb2xvci1waWNrZXIgW2NvbG9yXT1cImNvbFwiIChjb2xvckNoYW5nZSk9XCJzZXRGYWxsYmFja0NvbG9yKGksICRldmVudClcIj48L2hleC1jb2xvci1waWNrZXI+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwicGkgcGktdGltZXMgaWNvbi1ob3ZlciBtbC0xXCJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiUmVtb3ZlXCJcbiAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmFsbGJhY2tDb2xvcihpKVwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXNtIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgIHBUb29sdGlwPVwiQWRkIGZhbGxiYWNrIGNvbG91clwiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQWRkIGZhbGxiYWNrIGNvbG91clwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZEZhbGxiYWNrQ29sb3IoKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8cC1jaGVja2JveFxuICAgICAgICBbbmdNb2RlbF09XCJkcmFmdC5hdXRvUHJvbW90ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldEF1dG9Qcm9tb3RlKCRldmVudClcIlxuICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICBpbnB1dElkPVwiYXV0b1Byb21vdGVcIlxuICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgIDxsYWJlbCBmb3I9XCJhdXRvUHJvbW90ZVwiPkF1dG8tYWRkIGRldGVjdGVkIGNsYXNzZXMgdG8gdGhpcyBsaXN0IGFzIHRoZXkgYXBwZWFyPC9sYWJlbD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmb250LW1lZGl1bVwiPkxhYmVsIG1hdGNoaW5nPC9zcGFuPlxuICAgICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICAgIFtvcHRpb25zXT1cIm1hdGNoTW9kZU9wdGlvbnNcIlxuICAgICAgICBbbmdNb2RlbF09XCJkcmFmdC5tYXRjaE1vZGVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRNYXRjaE1vZGUoJGV2ZW50KVwiXG4gICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgID48L3Atc2VsZWN0QnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1hbmFnZS1mb290ZXIgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC0yIHctZnVsbFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTFcIj5cbiAgICAgICAgPHAtYnV0dG9uIGxhYmVsPVwiUmVzZXRcIiBpY29uPVwicGkgcGktcmVmcmVzaFwiIFt0ZXh0XT1cInRydWVcIiAob25DbGljayk9XCJyZXNldERlZmF1bHRzLmVtaXQoKVwiPjwvcC1idXR0b24+XG4gICAgICAgIDxwLWJ1dHRvbiBsYWJlbD1cIkltcG9ydFwiIGljb249XCJwaSBwaS11cGxvYWRcIiBbdGV4dF09XCJ0cnVlXCIgKG9uQ2xpY2spPVwicHJlc2V0RmlsZUlucHV0LmNsaWNrKClcIj48L3AtYnV0dG9uPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAjcHJlc2V0RmlsZUlucHV0XG4gICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgIGFjY2VwdD1cIi5qc29uLGFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgIGhpZGRlblxuICAgICAgICAgIChjaGFuZ2UpPVwiaW1wb3J0RmlsZS5lbWl0KCRldmVudCk7IHByZXNldEZpbGVJbnB1dC52YWx1ZSA9ICcnXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHAtYnV0dG9uIGxhYmVsPVwiRXhwb3J0XCIgaWNvbj1cInBpIHBpLWRvd25sb2FkXCIgW3RleHRdPVwidHJ1ZVwiIChvbkNsaWNrKT1cImV4cG9ydC5lbWl0KClcIj48L3AtYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LTFcIj48L3NwYW4+XG4gICAgICA8IS0tIEFwcGx5IHBlcnNpc3RzIHRvIHRoZSBzZXJ2ZXIgYW5kIGNsb3Nlcy4gLS0+XG4gICAgICA8cC1idXR0b24gbGFiZWw9XCJBcHBseVwiIGljb249XCJwaSBwaS1jaGVja1wiIChvbkNsaWNrKT1cImFwcGx5LmVtaXQoKVwiPjwvcC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuIl19