@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.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 (579) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +34 -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/image.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  13. package/esm2022/lib/contracts/intensity.mjs +48 -5
  14. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  15. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  16. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  17. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  18. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  19. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  20. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  21. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  25. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  26. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  28. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  29. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  30. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  31. package/esm2022/lib/geometry/contour.mjs +63 -0
  32. package/esm2022/lib/geometry/loft.mjs +128 -0
  33. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  34. package/esm2022/lib/geometry/raster.mjs +98 -0
  35. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  36. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  37. package/esm2022/lib/geometry/ring.mjs +201 -0
  38. package/esm2022/lib/geometry/section.mjs +215 -0
  39. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  40. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  41. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  42. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  43. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  45. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
  46. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
  47. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  48. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
  49. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  50. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  51. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  52. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  53. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
  54. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  55. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  56. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  57. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  58. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  59. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
  60. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
  61. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  62. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
  63. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  64. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  65. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  66. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  67. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
  68. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  69. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  70. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  71. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  72. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  73. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  74. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  75. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  76. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  77. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  78. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  79. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  80. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  81. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  82. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  83. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  84. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  85. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  86. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
  87. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
  88. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  89. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  90. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  91. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  92. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  93. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  94. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  95. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  96. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  97. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  98. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  99. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  100. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  101. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  102. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  103. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  104. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  105. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  106. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  107. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  108. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  109. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  110. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  111. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  112. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  113. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  114. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  115. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  116. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  117. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  118. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  119. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  120. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  121. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  122. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  123. package/esm2022/lib/models/bezier.mjs +1 -11
  124. package/esm2022/lib/models/class-preset.mjs +41 -3
  125. package/esm2022/lib/models/geometry.mjs +27 -164
  126. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  127. package/esm2022/lib/models/polygon-factory.mjs +134 -0
  128. package/esm2022/lib/models/region-clone.mjs +68 -0
  129. package/esm2022/lib/models/region-geojson.mjs +411 -0
  130. package/esm2022/lib/models/region.mjs +34 -33
  131. package/esm2022/lib/models/shape.mjs +18 -16
  132. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  133. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  134. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  135. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  136. package/esm2022/lib/plot.utilities.mjs +296 -473
  137. package/esm2022/lib/processing/image-crop.mjs +1 -1
  138. package/esm2022/lib/processing/processing-image.mjs +28 -15
  139. package/esm2022/lib/provide-visualization.mjs +40 -14
  140. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  141. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  142. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
  143. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  144. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  145. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  146. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  147. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  148. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  149. package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
  150. package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
  151. package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
  152. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
  153. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  154. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  155. package/esm2022/lib/region-ops.service.mjs +28 -70
  156. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  157. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  158. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  159. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  160. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  161. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  162. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  163. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  164. package/esm2022/lib/region-source/region-source.mjs +67 -0
  165. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  166. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  167. package/esm2022/lib/render-orchestrator.mjs +14 -11
  168. package/esm2022/lib/render-session.mjs +207 -0
  169. package/esm2022/lib/routing-visualizer.service.mjs +858 -414
  170. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  171. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  172. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  173. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  174. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  175. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  176. package/esm2022/lib/spatial/lod.mjs +187 -0
  177. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  178. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  179. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  180. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  181. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  182. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  183. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  184. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  185. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  186. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  187. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  188. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  189. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  190. package/esm2022/lib/spatial/stats.mjs +71 -0
  191. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  192. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  193. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  194. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  195. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  196. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  197. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  198. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  199. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  200. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  201. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  202. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  203. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  204. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  205. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  206. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  207. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  208. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  209. package/esm2022/lib/store/class-color.util.mjs +53 -5
  210. package/esm2022/lib/store/class-signatures.mjs +63 -0
  211. package/esm2022/lib/store/region-history.mjs +146 -0
  212. package/esm2022/lib/store/region-scope-cache.mjs +144 -0
  213. package/esm2022/lib/store/region-selection.mjs +82 -0
  214. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  215. package/esm2022/lib/store/region-store.service.mjs +986 -670
  216. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  217. package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
  218. package/esm2022/lib/toast-outlets.mjs +5 -4
  219. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  220. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  221. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  222. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  223. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  224. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
  225. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  226. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  227. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  228. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  229. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  230. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  231. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  232. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  233. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  234. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  235. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  236. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  237. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  238. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
  239. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  240. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  241. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  242. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  243. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  244. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  245. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  246. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  247. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  248. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  249. package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
  250. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  251. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  252. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  253. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  254. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  255. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  256. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  257. package/esm2022/lib/util/supersede.mjs +56 -0
  258. package/esm2022/lib/visualization.module.mjs +39 -141
  259. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  260. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  261. package/esm2022/lib/visualizer/region-load.mjs +123 -0
  262. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  263. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  264. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  265. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  266. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  267. package/esm2022/lib/visualizer.component.mjs +602 -1902
  268. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  269. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  270. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  271. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
  272. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  273. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
  274. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
  275. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  276. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  277. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  278. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  279. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  280. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  281. package/fesm2022/mask.worker.js +36 -917
  282. package/fesm2022/onnx-sam.worker.js +52 -16
  283. package/fesm2022/region-source.worker.js +1067 -0
  284. package/fesm2022/spatial-math.worker.js +471 -0
  285. package/fesm2022/tsne.worker.js +32 -15
  286. package/index.d.ts +19 -10
  287. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  288. package/lib/contracts/capabilities.contract.d.ts +4 -2
  289. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  290. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  291. package/lib/contracts/color.d.ts +27 -0
  292. package/lib/contracts/colormap-lut.d.ts +19 -4
  293. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  294. package/lib/contracts/display-types.d.ts +21 -0
  295. package/lib/contracts/image.contract.d.ts +4 -0
  296. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  297. package/lib/contracts/intensity.d.ts +13 -2
  298. package/lib/contracts/plot-type.d.ts +3 -1
  299. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  300. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  301. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  302. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  303. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  304. package/lib/contracts/region-editor-api.contract.d.ts +85 -1
  305. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  306. package/lib/contracts/region-store.contract.d.ts +22 -0
  307. package/lib/contracts/sam.contract.d.ts +7 -0
  308. package/lib/contracts/section-view.contract.d.ts +44 -0
  309. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  310. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  311. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  312. package/lib/contracts/visualizer.contract.d.ts +231 -54
  313. package/lib/contracts/viz-config.d.ts +9 -0
  314. package/lib/geometry/contour.d.ts +24 -0
  315. package/lib/geometry/loft.d.ts +22 -0
  316. package/lib/geometry/polylabel.d.ts +23 -0
  317. package/lib/geometry/raster.d.ts +42 -0
  318. package/lib/geometry/reconstruct.d.ts +54 -0
  319. package/lib/geometry/reslice-image.d.ts +33 -0
  320. package/lib/geometry/ring.d.ts +67 -0
  321. package/lib/geometry/section.d.ts +52 -0
  322. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  323. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  324. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  325. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  326. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  327. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  328. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
  329. package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
  330. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  331. package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
  332. package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
  333. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  334. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  335. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  336. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
  337. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  338. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  339. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  340. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  341. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  342. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  343. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
  344. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  345. package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
  346. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  347. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  348. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  349. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  350. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  351. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  352. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  353. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  354. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  355. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  356. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  357. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  358. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  359. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  360. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  361. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  362. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  363. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  364. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  365. package/lib/implementations/osd/osd-export.d.ts +36 -0
  366. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  367. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  368. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  369. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
  370. package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
  371. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  372. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  373. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  374. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  375. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  376. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  377. package/lib/implementations/osd/simple-source.d.ts +161 -0
  378. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  379. package/lib/implementations/osd/tile-client.d.ts +11 -14
  380. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  381. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  382. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  383. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  384. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  385. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  386. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  387. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  388. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  389. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  390. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  391. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  392. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  393. package/lib/implementations/region-centroids.d.ts +14 -0
  394. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  395. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  396. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  397. package/lib/implementations/tile-server/index.d.ts +5 -0
  398. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  399. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  400. package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
  401. package/lib/implementations/tile-server/transport.d.ts +62 -0
  402. package/lib/intensity/intensity-profile.d.ts +66 -0
  403. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  404. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  405. package/lib/models/bezier.d.ts +0 -5
  406. package/lib/models/class-preset.d.ts +25 -0
  407. package/lib/models/geometry.d.ts +14 -48
  408. package/lib/models/polygon-edit.d.ts +72 -0
  409. package/lib/models/polygon-factory.d.ts +45 -0
  410. package/lib/models/region-clone.d.ts +20 -0
  411. package/lib/models/region-geojson.d.ts +57 -0
  412. package/lib/models/region.d.ts +59 -4
  413. package/lib/models/shape.d.ts +8 -0
  414. package/lib/plot-mode/contribution-host.d.ts +125 -0
  415. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  416. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  417. package/lib/plot.utilities.d.ts +19 -30
  418. package/lib/processing/processing-image.d.ts +5 -2
  419. package/lib/provide-visualization.d.ts +19 -2
  420. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  421. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  422. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
  423. package/lib/region-editor/file-stem.d.ts +7 -0
  424. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  425. package/lib/region-editor/mask-export.service.d.ts +54 -0
  426. package/lib/region-editor/mask-raster.d.ts +2 -8
  427. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  428. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  429. package/lib/region-editor/region-editor.component.d.ts +283 -200
  430. package/lib/region-editor/region-metrics.d.ts +34 -0
  431. package/lib/region-editor/region-persistence.service.d.ts +77 -0
  432. package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
  433. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  434. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  435. package/lib/region-ops.service.d.ts +1 -7
  436. package/lib/region-overlay/region-geometry.d.ts +158 -0
  437. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  438. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  439. package/lib/region-overlay/region-style.d.ts +52 -0
  440. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  441. package/lib/region-source/http-region-source.d.ts +45 -0
  442. package/lib/region-source/region-source-ops.d.ts +89 -0
  443. package/lib/region-source/region-source-worker.d.ts +7 -0
  444. package/lib/region-source/region-source.d.ts +82 -0
  445. package/lib/region-source/region-tiles.d.ts +289 -0
  446. package/lib/region-source/worker-region-source.d.ts +65 -0
  447. package/lib/render-orchestrator.d.ts +6 -2
  448. package/lib/render-session.d.ts +75 -0
  449. package/lib/routing-visualizer.service.d.ts +248 -59
  450. package/lib/section-pane/section-pane.component.d.ts +47 -0
  451. package/lib/spatial/density-raster.d.ts +6 -0
  452. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  453. package/lib/spatial/embedding-compute.d.ts +21 -2
  454. package/lib/spatial/glyphs.d.ts +16 -0
  455. package/lib/spatial/lod.d.ts +94 -0
  456. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  457. package/lib/spatial/spatial-density.d.ts +15 -5
  458. package/lib/spatial/spatial-encoding.d.ts +11 -44
  459. package/lib/spatial/spatial-expression.d.ts +40 -22
  460. package/lib/spatial/spatial-framing.d.ts +1 -0
  461. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  462. package/lib/spatial/spatial-hover.d.ts +4 -16
  463. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  464. package/lib/spatial/spatial-selection.d.ts +21 -26
  465. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  466. package/lib/spatial/spatial-tiles.d.ts +9 -256
  467. package/lib/spatial/stats.d.ts +38 -0
  468. package/lib/spatial/transcript-grouping.d.ts +119 -0
  469. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  470. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  471. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  472. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  473. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  474. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  475. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  476. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  477. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  478. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  479. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  480. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  481. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  482. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  483. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  484. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  485. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  486. package/lib/store/class-color.util.d.ts +39 -2
  487. package/lib/store/class-signatures.d.ts +11 -0
  488. package/lib/store/region-history.d.ts +66 -0
  489. package/lib/store/region-scope-cache.d.ts +65 -0
  490. package/lib/store/region-selection.d.ts +36 -0
  491. package/lib/store/region-source-scope.d.ts +68 -0
  492. package/lib/store/region-store.service.d.ts +312 -116
  493. package/lib/store/visualizer-store.service.d.ts +32 -33
  494. package/lib/toast-outlets.d.ts +4 -3
  495. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  496. package/lib/toolbar/canvas-tools.d.ts +20 -0
  497. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  498. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  499. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  500. package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
  501. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  502. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  503. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  504. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  505. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  506. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  507. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  508. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  509. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  510. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  511. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  512. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  513. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  514. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
  515. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  516. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  517. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  518. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  519. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  520. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  521. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  522. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  523. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  524. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  525. package/lib/toolbar/toolbar.component.d.ts +55 -84
  526. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  527. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  528. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  529. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  530. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  531. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  532. package/lib/util/mark-for-check.d.ts +11 -0
  533. package/lib/util/supersede.d.ts +53 -0
  534. package/lib/visualization.module.d.ts +18 -39
  535. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  536. package/lib/visualizer/region-actions.d.ts +54 -0
  537. package/lib/visualizer/region-load.d.ts +46 -0
  538. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  539. package/lib/visualizer/tool-modes.d.ts +49 -0
  540. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  541. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  542. package/lib/visualizer/volume-sections.d.ts +64 -0
  543. package/lib/visualizer.component.d.ts +232 -447
  544. package/lib/workers/spatial-math-ops.d.ts +65 -0
  545. package/lib/workers/spatial-math-worker.d.ts +7 -0
  546. package/lib/workers/spatial-math.d.ts +74 -0
  547. package/package.json +12 -3
  548. package/src/lib/assets/slice.svg +23 -0
  549. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  550. package/src/lib/styles/viz-icons.scss +14 -0
  551. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  552. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  553. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  554. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  555. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  556. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  557. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  558. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  559. package/src/lib/assets/cell-detection.svg +0 -37
  560. package/src/lib/assets/click.svg +0 -1
  561. package/src/lib/assets/colormap-luts.json +0 -1
  562. package/src/lib/assets/edit-selection-white.svg +0 -47
  563. package/src/lib/assets/icons/colormap-earth.png +0 -0
  564. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  565. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  566. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  567. package/src/lib/assets/picture-segmentation.svg +0 -43
  568. package/src/lib/assets/test/download-379.svg +0 -1
  569. package/src/lib/assets/test/download-98.svg +0 -1
  570. package/src/lib/assets/test/json-1.svg +0 -1
  571. package/src/lib/assets/test/load-53.svg +0 -1
  572. package/src/lib/assets/test/mask-44.svg +0 -1
  573. package/src/lib/assets/test/mask-download-44.svg +0 -15
  574. package/src/lib/assets/test/mask-save-44.svg +0 -11
  575. package/src/lib/assets/test/overlay-1.svg +0 -1
  576. package/src/lib/assets/test/overlay-4.svg +0 -1
  577. package/src/lib/assets/test/region-26.svg +0 -1
  578. package/src/lib/assets/test/save-56.svg +0 -1
  579. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -0,0 +1,229 @@
1
+ /**
2
+ * A {@link RegionSource} over a GeoJSON string, parsed and tiled in the region-source Web Worker.
3
+ *
4
+ * One worker serves every open source. Where no worker can start (jsdom, SSR, a blocked worker
5
+ * URL) the same tables run on the main thread; if the worker dies, each source re-opens itself
6
+ * there from its text (which the host holds anyway: it handed it over) and carries on — whether
7
+ * it had a call in flight then or not (see {@link RegionSourceWorkerClient.generation}).
8
+ */
9
+ import { RegionTileCache, abortable } from './region-source';
10
+ import { RegionSourceTables, } from './region-source-ops';
11
+ /** The worker died under a call; the caller re-opens on the main thread. */
12
+ class WorkerLostError extends Error {
13
+ constructor() {
14
+ super('The region-source worker stopped.');
15
+ this.name = 'WorkerLostError';
16
+ }
17
+ }
18
+ /** Owns the region-source worker and the calls in flight on it. */
19
+ export class RegionSourceWorkerClient {
20
+ /**
21
+ * `factory` is optional: without one the real worker module is imported on demand —
22
+ * dynamically, because it holds an `import.meta.url` that ts-jest's CommonJS compile
23
+ * rejects.
24
+ */
25
+ constructor(factory) {
26
+ this.factory = factory;
27
+ this.worker = null;
28
+ this.starting = null;
29
+ this.unavailable = false;
30
+ this.nextId = 1;
31
+ this.pending = new Map();
32
+ /** The main-thread tables, once anything runs here. */
33
+ this.local = null;
34
+ this.tables = 0;
35
+ }
36
+ /** Whether calls now run on the main thread. */
37
+ get inThread() {
38
+ return this.unavailable;
39
+ }
40
+ /**
41
+ * Which table set calls run on: bumped when the worker is lost. A handle opened under another
42
+ * names a table that is gone (or, here, another source's), so its source must open again.
43
+ */
44
+ get generation() {
45
+ return this.tables;
46
+ }
47
+ /** Run `request` in the worker, or here when there is none. */
48
+ async call(request) {
49
+ return (await this.run(request)).result;
50
+ }
51
+ /** {@link call}, with the {@link generation} the request ran on. */
52
+ async run(request) {
53
+ const started = await this.ensureWorker();
54
+ // The worker may have been lost while this waited for it.
55
+ const worker = started === this.worker ? started : null;
56
+ const generation = this.tables;
57
+ if (!worker)
58
+ return { result: (this.local ??= new RegionSourceTables()).run(request), generation };
59
+ const id = this.nextId++;
60
+ const result = await new Promise((resolve, reject) => {
61
+ this.pending.set(id, { resolve: resolve, reject });
62
+ worker.postMessage({ ...request, id });
63
+ });
64
+ return { result, generation };
65
+ }
66
+ /** Terminate the worker; calls in flight reject. */
67
+ dispose() {
68
+ this.lose();
69
+ }
70
+ ensureWorker() {
71
+ if (this.worker)
72
+ return Promise.resolve(this.worker);
73
+ if (this.unavailable || (!this.factory && typeof Worker === 'undefined')) {
74
+ this.unavailable = true;
75
+ return Promise.resolve(null);
76
+ }
77
+ if (!this.starting) {
78
+ const starting = this.startWorker();
79
+ this.starting = starting;
80
+ void starting.then(() => {
81
+ if (this.starting === starting)
82
+ this.starting = null;
83
+ });
84
+ }
85
+ return this.starting;
86
+ }
87
+ async startWorker() {
88
+ try {
89
+ const made = this.factory
90
+ ? this.factory()
91
+ : import('./region-source-worker').then((m) => m.createRegionSourceWorker());
92
+ const worker = made instanceof Promise ? await made : made;
93
+ worker.onmessage = (event) => this.onReply(event.data);
94
+ worker.onerror = (event) => {
95
+ event.preventDefault?.();
96
+ if (worker === this.worker) {
97
+ console.warn('[region-source] worker failed; tiling on the main thread');
98
+ this.lose();
99
+ }
100
+ };
101
+ this.worker = worker;
102
+ return worker;
103
+ }
104
+ catch (err) {
105
+ console.warn('[region-source] worker unavailable; tiling on the main thread', err);
106
+ this.unavailable = true;
107
+ return null;
108
+ }
109
+ }
110
+ onReply(reply) {
111
+ const call = this.pending.get(reply.id);
112
+ if (!call)
113
+ return;
114
+ this.pending.delete(reply.id);
115
+ if (reply.ok)
116
+ call.resolve(reply.result);
117
+ else
118
+ call.reject(new Error(reply.error));
119
+ }
120
+ /** Stop the worker for good: every later call runs here, every call in flight is lost. */
121
+ lose() {
122
+ if (this.worker)
123
+ this.tables++;
124
+ this.unavailable = true;
125
+ this.worker?.terminate();
126
+ this.worker = null;
127
+ const calls = [...this.pending.values()];
128
+ this.pending.clear();
129
+ for (const call of calls)
130
+ call.reject(new WorkerLostError());
131
+ }
132
+ }
133
+ let shared = null;
134
+ /** The worker client every GeoJSON source shares. */
135
+ export function sharedRegionSourceClient() {
136
+ return (shared ??= new RegionSourceWorkerClient());
137
+ }
138
+ /**
139
+ * Open a GeoJSON FeatureCollection string as a tiled region source. Rejects on invalid JSON or
140
+ * a collection without `features`.
141
+ */
142
+ export async function openGeoJsonRegionSource(text, client = sharedRegionSourceClient()) {
143
+ // The worker lost under the open: open on the main thread instead.
144
+ const opened = await client
145
+ .run({ op: 'open', text })
146
+ .catch((err) => (err instanceof WorkerLostError ? client.run({ op: 'open', text }) : Promise.reject(err)));
147
+ const { handle, info } = opened.result;
148
+ return new WorkerRegionSource(client, text, handle, opened.generation, info);
149
+ }
150
+ /**
151
+ * The 3D reconstruction of a region from its outlines on a stack (see `geometry/reconstruct`),
152
+ * meshed in the region-source worker (on the main thread where there is none).
153
+ */
154
+ export function reconstructInWorker(slices, options, client = sharedRegionSourceClient()) {
155
+ return client.call({ op: 'mesh', slices, options });
156
+ }
157
+ class WorkerRegionSource {
158
+ constructor(client, text, handle,
159
+ /** The client's {@link RegionSourceWorkerClient.generation} {@link handle} was opened under. */
160
+ generation, info) {
161
+ this.client = client;
162
+ this.text = text;
163
+ this.handle = handle;
164
+ this.generation = generation;
165
+ this.info = info;
166
+ this.cache = new RegionTileCache();
167
+ this.disposed = false;
168
+ /** The main-thread re-open after the worker died, shared by every call that finds it so. */
169
+ this.reopening = null;
170
+ }
171
+ getTile(z, key, signal) {
172
+ const tile = this.cache.get(z, key, () => this.call((handle) => ({ op: 'tile', handle, z, level: key.level, gx: key.gx, gy: key.gy })));
173
+ return abortable(tile, signal);
174
+ }
175
+ getFeatures(ids) {
176
+ return this.call((handle) => ({ op: 'features', handle, ids }));
177
+ }
178
+ getIndex(z, query) {
179
+ return this.call((handle) => ({ op: 'index', handle, z, query }));
180
+ }
181
+ getClassOutlines(classes, level, exclude) {
182
+ return this.call((handle) => ({ op: 'outlines', handle, classes, level, exclude }));
183
+ }
184
+ getClassCounts(z, exclude) {
185
+ return this.call((handle) => ({ op: 'classes', handle, z, exclude }));
186
+ }
187
+ exportGeoJson(exclude, extra) {
188
+ return this.call((handle) => ({ op: 'export', handle, exclude, extra }));
189
+ }
190
+ dispose() {
191
+ if (this.disposed)
192
+ return;
193
+ this.disposed = true;
194
+ this.cache.clear();
195
+ // A handle from a lost worker's tables names nothing here, or another source's table.
196
+ if (this.generation !== this.client.generation)
197
+ return;
198
+ void this.client.call({ op: 'close', handle: this.handle }).catch(() => undefined);
199
+ }
200
+ /**
201
+ * Run a request on this source's table; when the worker died (under this call or before it),
202
+ * re-open here and run it there.
203
+ */
204
+ async call(make) {
205
+ for (let attempt = 0;; attempt++) {
206
+ if (this.generation !== this.client.generation)
207
+ await this.reopen();
208
+ try {
209
+ return await this.client.call(make(this.handle));
210
+ }
211
+ catch (err) {
212
+ if (!(err instanceof WorkerLostError) || attempt > 0)
213
+ throw err;
214
+ }
215
+ }
216
+ }
217
+ /** Open this source's text again on the client's current tables, once for every call waiting. */
218
+ reopen() {
219
+ this.reopening ??= this.client
220
+ .run({ op: 'open', text: this.text })
221
+ .then(({ result, generation }) => {
222
+ this.handle = result.handle;
223
+ this.generation = generation;
224
+ })
225
+ .finally(() => (this.reopening = null));
226
+ return this.reopening;
227
+ }
228
+ }
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXJlZ2lvbi1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBZ0IsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRixPQUFPLEVBS0wsa0JBQWtCLEdBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFlN0IsNEVBQTRFO0FBQzVFLE1BQU0sZUFBZ0IsU0FBUSxLQUFLO0lBQ2pDO1FBQ0UsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFPRCxtRUFBbUU7QUFDbkUsTUFBTSxPQUFPLHdCQUF3QjtJQVVuQzs7OztPQUlHO0lBQ0gsWUFBNkIsT0FBbUM7UUFBbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFkeEQsV0FBTSxHQUFrQixJQUFJLENBQUM7UUFDN0IsYUFBUSxHQUFrQyxJQUFJLENBQUM7UUFDL0MsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNGLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUMxRCx1REFBdUQ7UUFDL0MsVUFBSyxHQUE4QixJQUFJLENBQUM7UUFDeEMsV0FBTSxHQUFHLENBQUMsQ0FBQztJQU9nRCxDQUFDO0lBRXBFLGdEQUFnRDtJQUNoRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsK0RBQStEO0lBQy9ELEtBQUssQ0FBQyxJQUFJLENBQWdDLE9BQVU7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SUFDSCxDQUFDO0lBRUQsaUdBQWlHO0lBQ3pGLE1BQU07UUFDWixJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxNQUFNO2FBQzNCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUMvQixDQUFDLENBQUM7YUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB7QGxpbmsgUmVnaW9uU291cmNlfSBvdmVyIGEgR2VvSlNPTiBzdHJpbmcsIHBhcnNlZCBhbmQgdGlsZWQgaW4gdGhlIHJlZ2lvbi1zb3VyY2UgV2ViIFdvcmtlci5cbiAqXG4gKiBPbmUgd29ya2VyIHNlcnZlcyBldmVyeSBvcGVuIHNvdXJjZS4gV2hlcmUgbm8gd29ya2VyIGNhbiBzdGFydCAoanNkb20sIFNTUiwgYSBibG9ja2VkIHdvcmtlclxuICogVVJMKSB0aGUgc2FtZSB0YWJsZXMgcnVuIG9uIHRoZSBtYWluIHRocmVhZDsgaWYgdGhlIHdvcmtlciBkaWVzLCBlYWNoIHNvdXJjZSByZS1vcGVucyBpdHNlbGZcbiAqIHRoZXJlIGZyb20gaXRzIHRleHQgKHdoaWNoIHRoZSBob3N0IGhvbGRzIGFueXdheTogaXQgaGFuZGVkIGl0IG92ZXIpIGFuZCBjYXJyaWVzIG9uIOKAlCB3aGV0aGVyXG4gKiBpdCBoYWQgYSBjYWxsIGluIGZsaWdodCB0aGVuIG9yIG5vdCAoc2VlIHtAbGluayBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQuZ2VuZXJhdGlvbn0pLlxuICovXG5pbXBvcnQgeyBSZWdpb25Tb3VyY2UsIFJlZ2lvblRpbGVDYWNoZSwgU291cmNlRmVhdHVyZSwgYWJvcnRhYmxlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlJztcbmltcG9ydCB7XG4gIFJlZ2lvblNvdXJjZU1lc3NhZ2UsXG4gIFJlZ2lvblNvdXJjZVJlcGx5LFxuICBSZWdpb25Tb3VyY2VSZXF1ZXN0LFxuICBSZWdpb25Tb3VyY2VSZXN1bHRzLFxuICBSZWdpb25Tb3VyY2VUYWJsZXMsXG59IGZyb20gJy4vcmVnaW9uLXNvdXJjZS1vcHMnO1xuaW1wb3J0IHR5cGUge1xuICBDbGFzc091dGxpbmVzLFxuICBSZWdpb25JbmRleFBhZ2UsXG4gIFJlZ2lvbkluZGV4UXVlcnksXG4gIFJlZ2lvblNvdXJjZUluZm8sXG4gIFJlZ2lvblRpbGUsXG4gIFJlZ2lvblRpbGVLZXksXG59IGZyb20gJy4vcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVjb25zdHJ1Y3RPcHRpb25zLCBTbGljZU91dGxpbmVzIH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmVjb25zdHJ1Y3QnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcblxuLyoqIE1ha2VzIHRoZSB3b3JrZXI7IG1heSBiZSBhc3luYywgYXMgdGhlIGRlZmF1bHQgb25lIGlzIChpdCBpbXBvcnRzIHRoZSBmYWN0b3J5IG9uIGRlbWFuZCkuICovXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VXb3JrZXJGYWN0b3J5ID0gKCkgPT4gV29ya2VyIHwgUHJvbWlzZTxXb3JrZXI+O1xuXG4vKiogVGhlIHdvcmtlciBkaWVkIHVuZGVyIGEgY2FsbDsgdGhlIGNhbGxlciByZS1vcGVucyBvbiB0aGUgbWFpbiB0aHJlYWQuICovXG5jbGFzcyBXb3JrZXJMb3N0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdUaGUgcmVnaW9uLXNvdXJjZSB3b3JrZXIgc3RvcHBlZC4nKTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2VyTG9zdEVycm9yJztcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGVuZGluZ0NhbGwge1xuICByZXNvbHZlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQ7XG4gIHJlamVjdDogKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuLyoqIE93bnMgdGhlIHJlZ2lvbi1zb3VyY2Ugd29ya2VyIGFuZCB0aGUgY2FsbHMgaW4gZmxpZ2h0IG9uIGl0LiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCB7XG4gIHByaXZhdGUgd29ya2VyOiBXb3JrZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGFydGluZzogUHJvbWlzZTxXb3JrZXIgfCBudWxsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVuYXZhaWxhYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgbmV4dElkID0gMTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxudW1iZXIsIFBlbmRpbmdDYWxsPigpO1xuICAvKiogVGhlIG1haW4tdGhyZWFkIHRhYmxlcywgb25jZSBhbnl0aGluZyBydW5zIGhlcmUuICovXG4gIHByaXZhdGUgbG9jYWw6IFJlZ2lvblNvdXJjZVRhYmxlcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRhYmxlcyA9IDA7XG5cbiAgLyoqXG4gICAqIGBmYWN0b3J5YCBpcyBvcHRpb25hbDogd2l0aG91dCBvbmUgdGhlIHJlYWwgd29ya2VyIG1vZHVsZSBpcyBpbXBvcnRlZCBvbiBkZW1hbmQg4oCUXG4gICAqIGR5bmFtaWNhbGx5LCBiZWNhdXNlIGl0IGhvbGRzIGFuIGBpbXBvcnQubWV0YS51cmxgIHRoYXQgdHMtamVzdCdzIENvbW1vbkpTIGNvbXBpbGVcbiAgICogcmVqZWN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yeT86IFJlZ2lvblNvdXJjZVdvcmtlckZhY3RvcnkpIHt9XG5cbiAgLyoqIFdoZXRoZXIgY2FsbHMgbm93IHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQuICovXG4gIGdldCBpblRocmVhZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51bmF2YWlsYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCB0YWJsZSBzZXQgY2FsbHMgcnVuIG9uOiBidW1wZWQgd2hlbiB0aGUgd29ya2VyIGlzIGxvc3QuIEEgaGFuZGxlIG9wZW5lZCB1bmRlciBhbm90aGVyXG4gICAqIG5hbWVzIGEgdGFibGUgdGhhdCBpcyBnb25lIChvciwgaGVyZSwgYW5vdGhlciBzb3VyY2UncyksIHNvIGl0cyBzb3VyY2UgbXVzdCBvcGVuIGFnYWluLlxuICAgKi9cbiAgZ2V0IGdlbmVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXM7XG4gIH1cblxuICAvKiogUnVuIGByZXF1ZXN0YCBpbiB0aGUgd29ya2VyLCBvciBoZXJlIHdoZW4gdGhlcmUgaXMgbm9uZS4gKi9cbiAgYXN5bmMgY2FsbDxSIGV4dGVuZHMgUmVnaW9uU291cmNlUmVxdWVzdD4ocmVxdWVzdDogUik6IFByb21pc2U8UmVnaW9uU291cmNlUmVzdWx0c1tSWydvcCddXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5ydW4ocmVxdWVzdCkpLnJlc3VsdDtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgY2FsbH0sIHdpdGggdGhlIHtAbGluayBnZW5lcmF0aW9ufSB0aGUgcmVxdWVzdCByYW4gb24uICovXG4gIGFzeW5jIHJ1bjxSIGV4dGVuZHMgUmVnaW9uU291cmNlUmVxdWVzdD4oXG4gICAgcmVxdWVzdDogUixcbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogUmVnaW9uU291cmNlUmVzdWx0c1tSWydvcCddXTsgZ2VuZXJhdGlvbjogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgdGhpcy5lbnN1cmVXb3JrZXIoKTtcbiAgICAvLyBUaGUgd29ya2VyIG1heSBoYXZlIGJlZW4gbG9zdCB3aGlsZSB0aGlzIHdhaXRlZCBmb3IgaXQuXG4gICAgY29uc3Qgd29ya2VyID0gc3RhcnRlZCA9PT0gdGhpcy53b3JrZXIgPyBzdGFydGVkIDogbnVsbDtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdGhpcy50YWJsZXM7XG4gICAgaWYgKCF3b3JrZXIpIHJldHVybiB7IHJlc3VsdDogKHRoaXMubG9jYWwgPz89IG5ldyBSZWdpb25Tb3VyY2VUYWJsZXMoKSkucnVuKHJlcXVlc3QpLCBnZW5lcmF0aW9uIH07XG4gICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBQcm9taXNlPFJlZ2lvblNvdXJjZVJlc3VsdHNbUlsnb3AnXV0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQoaWQsIHsgcmVzb2x2ZTogcmVzb2x2ZSBhcyAodjogdW5rbm93bikgPT4gdm9pZCwgcmVqZWN0IH0pO1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgLi4ucmVxdWVzdCwgaWQgfSBhcyBSZWdpb25Tb3VyY2VNZXNzYWdlKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXN1bHQsIGdlbmVyYXRpb24gfTtcbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgdGhlIHdvcmtlcjsgY2FsbHMgaW4gZmxpZ2h0IHJlamVjdC4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlV29ya2VyKCk6IFByb21pc2U8V29ya2VyIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLndvcmtlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLndvcmtlcik7XG4gICAgaWYgKHRoaXMudW5hdmFpbGFibGUgfHwgKCF0aGlzLmZhY3RvcnkgJiYgdHlwZW9mIFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICB0aGlzLnVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdGFydGluZykge1xuICAgICAgY29uc3Qgc3RhcnRpbmcgPSB0aGlzLnN0YXJ0V29ya2VyKCk7XG4gICAgICB0aGlzLnN0YXJ0aW5nID0gc3RhcnRpbmc7XG4gICAgICB2b2lkIHN0YXJ0aW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGFydGluZyA9PT0gc3RhcnRpbmcpIHRoaXMuc3RhcnRpbmcgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0aW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFdvcmtlcigpOiBQcm9taXNlPFdvcmtlciB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFkZSA9IHRoaXMuZmFjdG9yeVxuICAgICAgICA/IHRoaXMuZmFjdG9yeSgpXG4gICAgICAgIDogaW1wb3J0KCcuL3JlZ2lvbi1zb3VyY2Utd29ya2VyJykudGhlbigobSkgPT4gbS5jcmVhdGVSZWdpb25Tb3VyY2VXb3JrZXIoKSk7XG4gICAgICBjb25zdCB3b3JrZXIgPSBtYWRlIGluc3RhbmNlb2YgUHJvbWlzZSA/IGF3YWl0IG1hZGUgOiBtYWRlO1xuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50PFJlZ2lvblNvdXJjZVJlcGx5PikgPT4gdGhpcy5vblJlcGx5KGV2ZW50LmRhdGEpO1xuICAgICAgd29ya2VyLm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICAgICAgaWYgKHdvcmtlciA9PT0gdGhpcy53b3JrZXIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb24tc291cmNlXSB3b3JrZXIgZmFpbGVkOyB0aWxpbmcgb24gdGhlIG1haW4gdGhyZWFkJyk7XG4gICAgICAgICAgdGhpcy5sb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb24tc291cmNlXSB3b3JrZXIgdW5hdmFpbGFibGU7IHRpbGluZyBvbiB0aGUgbWFpbiB0aHJlYWQnLCBlcnIpO1xuICAgICAgdGhpcy51bmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUmVwbHkocmVwbHk6IFJlZ2lvblNvdXJjZVJlcGx5KTogdm9pZCB7XG4gICAgY29uc3QgY2FsbCA9IHRoaXMucGVuZGluZy5nZXQocmVwbHkuaWQpO1xuICAgIGlmICghY2FsbCkgcmV0dXJuO1xuICAgIHRoaXMucGVuZGluZy5kZWxldGUocmVwbHkuaWQpO1xuICAgIGlmIChyZXBseS5vaykgY2FsbC5yZXNvbHZlKHJlcGx5LnJlc3VsdCk7XG4gICAgZWxzZSBjYWxsLnJlamVjdChuZXcgRXJyb3IocmVwbHkuZXJyb3IpKTtcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSB3b3JrZXIgZm9yIGdvb2Q6IGV2ZXJ5IGxhdGVyIGNhbGwgcnVucyBoZXJlLCBldmVyeSBjYWxsIGluIGZsaWdodCBpcyBsb3N0LiAqL1xuICBwcml2YXRlIGxvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud29ya2VyKSB0aGlzLnRhYmxlcysrO1xuICAgIHRoaXMudW5hdmFpbGFibGUgPSB0cnVlO1xuICAgIHRoaXMud29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgY29uc3QgY2FsbHMgPSBbLi4udGhpcy5wZW5kaW5nLnZhbHVlcygpXTtcbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGNhbGwgb2YgY2FsbHMpIGNhbGwucmVqZWN0KG5ldyBXb3JrZXJMb3N0RXJyb3IoKSk7XG4gIH1cbn1cblxubGV0IHNoYXJlZDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50IHwgbnVsbCA9IG51bGw7XG5cbi8qKiBUaGUgd29ya2VyIGNsaWVudCBldmVyeSBHZW9KU09OIHNvdXJjZSBzaGFyZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkUmVnaW9uU291cmNlQ2xpZW50KCk6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCB7XG4gIHJldHVybiAoc2hhcmVkID8/PSBuZXcgUmVnaW9uU291cmNlV29ya2VyQ2xpZW50KCkpO1xufVxuXG4vKipcbiAqIE9wZW4gYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uIHN0cmluZyBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UuIFJlamVjdHMgb24gaW52YWxpZCBKU09OIG9yXG4gKiBhIGNvbGxlY3Rpb24gd2l0aG91dCBgZmVhdHVyZXNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoXG4gIHRleHQ6IHN0cmluZyxcbiAgY2xpZW50OiBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQgPSBzaGFyZWRSZWdpb25Tb3VyY2VDbGllbnQoKSxcbik6IFByb21pc2U8UmVnaW9uU291cmNlPiB7XG4gIC8vIFRoZSB3b3JrZXIgbG9zdCB1bmRlciB0aGUgb3Blbjogb3BlbiBvbiB0aGUgbWFpbiB0aHJlYWQgaW5zdGVhZC5cbiAgY29uc3Qgb3BlbmVkID0gYXdhaXQgY2xpZW50XG4gICAgLnJ1bih7IG9wOiAnb3BlbicsIHRleHQgfSlcbiAgICAuY2F0Y2goKGVycikgPT4gKGVyciBpbnN0YW5jZW9mIFdvcmtlckxvc3RFcnJvciA/IGNsaWVudC5ydW4oeyBvcDogJ29wZW4nLCB0ZXh0IH0pIDogUHJvbWlzZS5yZWplY3QoZXJyKSkpO1xuICBjb25zdCB7IGhhbmRsZSwgaW5mbyB9ID0gb3BlbmVkLnJlc3VsdDtcbiAgcmV0dXJuIG5ldyBXb3JrZXJSZWdpb25Tb3VyY2UoY2xpZW50LCB0ZXh0LCBoYW5kbGUsIG9wZW5lZC5nZW5lcmF0aW9uLCBpbmZvKTtcbn1cblxuLyoqXG4gKiBUaGUgM0QgcmVjb25zdHJ1Y3Rpb24gb2YgYSByZWdpb24gZnJvbSBpdHMgb3V0bGluZXMgb24gYSBzdGFjayAoc2VlIGBnZW9tZXRyeS9yZWNvbnN0cnVjdGApLFxuICogbWVzaGVkIGluIHRoZSByZWdpb24tc291cmNlIHdvcmtlciAob24gdGhlIG1haW4gdGhyZWFkIHdoZXJlIHRoZXJlIGlzIG5vbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25zdHJ1Y3RJbldvcmtlcihcbiAgc2xpY2VzOiByZWFkb25seSBTbGljZU91dGxpbmVzW10sXG4gIG9wdGlvbnM/OiBSZWNvbnN0cnVjdE9wdGlvbnMsXG4gIGNsaWVudDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50ID0gc2hhcmVkUmVnaW9uU291cmNlQ2xpZW50KCksXG4pOiBQcm9taXNlPE1lc2g+IHtcbiAgcmV0dXJuIGNsaWVudC5jYWxsKHsgb3A6ICdtZXNoJywgc2xpY2VzLCBvcHRpb25zIH0pO1xufVxuXG5jbGFzcyBXb3JrZXJSZWdpb25Tb3VyY2UgaW1wbGVtZW50cyBSZWdpb25Tb3VyY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFJlZ2lvblRpbGVDYWNoZSgpO1xuICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG4gIC8qKiBUaGUgbWFpbi10aHJlYWQgcmUtb3BlbiBhZnRlciB0aGUgd29ya2VyIGRpZWQsIHNoYXJlZCBieSBldmVyeSBjYWxsIHRoYXQgZmluZHMgaXQgc28uICovXG4gIHByaXZhdGUgcmVvcGVuaW5nOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGhhbmRsZTogbnVtYmVyLFxuICAgIC8qKiBUaGUgY2xpZW50J3Mge0BsaW5rIFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudC5nZW5lcmF0aW9ufSB7QGxpbmsgaGFuZGxlfSB3YXMgb3BlbmVkIHVuZGVyLiAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGlvbjogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm8sXG4gICkge31cblxuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT4ge1xuICAgIGNvbnN0IHRpbGUgPSB0aGlzLmNhY2hlLmdldCh6LCBrZXksICgpID0+XG4gICAgICB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICd0aWxlJywgaGFuZGxlLCB6LCBsZXZlbDoga2V5LmxldmVsLCBneDoga2V5Lmd4LCBneToga2V5Lmd5IH0pKSxcbiAgICApO1xuICAgIHJldHVybiBhYm9ydGFibGUodGlsZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGdldEZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFNvdXJjZUZlYXR1cmVbXT4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdmZWF0dXJlcycsIGhhbmRsZSwgaWRzIH0pKTtcbiAgfVxuXG4gIGdldEluZGV4KHo6IG51bWJlciwgcXVlcnk6IFJlZ2lvbkluZGV4UXVlcnkpOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdpbmRleCcsIGhhbmRsZSwgeiwgcXVlcnkgfSkpO1xuICB9XG5cbiAgZ2V0Q2xhc3NPdXRsaW5lcyhcbiAgICBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gICk6IFByb21pc2U8Q2xhc3NPdXRsaW5lc1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbCgoaGFuZGxlKSA9PiAoeyBvcDogJ291dGxpbmVzJywgaGFuZGxlLCBjbGFzc2VzLCBsZXZlbCwgZXhjbHVkZSB9KSk7XG4gIH1cblxuICBnZXRDbGFzc0NvdW50cyh6OiBudW1iZXIgfCBudWxsLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKChoYW5kbGUpID0+ICh7IG9wOiAnY2xhc3NlcycsIGhhbmRsZSwgeiwgZXhjbHVkZSB9KSk7XG4gIH1cblxuICBleHBvcnRHZW9Kc29uKGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdLCBleHRyYTogcmVhZG9ubHkgb2JqZWN0W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdleHBvcnQnLCBoYW5kbGUsIGV4Y2x1ZGUsIGV4dHJhIH0pKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgLy8gQSBoYW5kbGUgZnJvbSBhIGxvc3Qgd29ya2VyJ3MgdGFibGVzIG5hbWVzIG5vdGhpbmcgaGVyZSwgb3IgYW5vdGhlciBzb3VyY2UncyB0YWJsZS5cbiAgICBpZiAodGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmNsaWVudC5nZW5lcmF0aW9uKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLmNsaWVudC5jYWxsKHsgb3A6ICdjbG9zZScsIGhhbmRsZTogdGhpcy5oYW5kbGUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByZXF1ZXN0IG9uIHRoaXMgc291cmNlJ3MgdGFibGU7IHdoZW4gdGhlIHdvcmtlciBkaWVkICh1bmRlciB0aGlzIGNhbGwgb3IgYmVmb3JlIGl0KSxcbiAgICogcmUtb3BlbiBoZXJlIGFuZCBydW4gaXQgdGhlcmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNhbGw8UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KFxuICAgIG1ha2U6IChoYW5kbGU6IG51bWJlcikgPT4gUixcbiAgKTogUHJvbWlzZTxSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dPiB7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAodGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmNsaWVudC5nZW5lcmF0aW9uKSBhd2FpdCB0aGlzLnJlb3BlbigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwobWFrZSh0aGlzLmhhbmRsZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIFdvcmtlckxvc3RFcnJvcikgfHwgYXR0ZW1wdCA+IDApIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT3BlbiB0aGlzIHNvdXJjZSdzIHRleHQgYWdhaW4gb24gdGhlIGNsaWVudCdzIGN1cnJlbnQgdGFibGVzLCBvbmNlIGZvciBldmVyeSBjYWxsIHdhaXRpbmcuICovXG4gIHByaXZhdGUgcmVvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVvcGVuaW5nID8/PSB0aGlzLmNsaWVudFxuICAgICAgLnJ1bih7IG9wOiAnb3BlbicsIHRleHQ6IHRoaXMudGV4dCB9KVxuICAgICAgLnRoZW4oKHsgcmVzdWx0LCBnZW5lcmF0aW9uIH0pID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSByZXN1bHQuaGFuZGxlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+ICh0aGlzLnJlb3BlbmluZyA9IG51bGwpKTtcbiAgICByZXR1cm4gdGhpcy5yZW9wZW5pbmc7XG4gIH1cbn1cbiJdfQ==
@@ -8,11 +8,12 @@ export class RenderOrchestrator {
8
8
  if (!smallInfo) {
9
9
  try {
10
10
  await this.host.renderPhase(info, false);
11
- this.host.finished(false, 'finished plotting');
11
+ this.host.finished(false);
12
12
  }
13
13
  catch (err) {
14
14
  console.error('Preview failed', err);
15
- this.host.finished(false, 'plotting aborted');
15
+ this.host.finished(false);
16
+ this.host.renderFailed(err);
16
17
  }
17
18
  return;
18
19
  }
@@ -21,7 +22,6 @@ export class RenderOrchestrator {
21
22
  await this.host.renderPhase(smallInfo, false);
22
23
  this.host.smallShown();
23
24
  smallReleasedOverlay = true;
24
- console.log('multi-tier: small tier rendered, starting large');
25
25
  }
26
26
  catch (err) {
27
27
  // Small-tier render failed (older backend without tier support, transient
@@ -31,17 +31,20 @@ export class RenderOrchestrator {
31
31
  try {
32
32
  await this.renderLargeWithRetry(info);
33
33
  this.host.sharpenSettled();
34
- if (smallReleasedOverlay) {
35
- this.host.finished(true, 'multi-tier: large tier rendered, sharpening complete');
36
- }
37
- else {
38
- this.host.finished(false, 'finished plotting (large only after small fallback)');
39
- }
34
+ this.host.finished(smallReleasedOverlay);
40
35
  }
41
36
  catch (err) {
42
37
  this.host.sharpenSettled();
43
38
  console.error('Large-tier preview failed after retry', err);
44
- this.host.sharpenFailed(err);
39
+ if (smallReleasedOverlay) {
40
+ this.host.sharpenFailed(err);
41
+ }
42
+ else {
43
+ // The small tier never made it either: there is no preview to fall back
44
+ // on, and the overlay is still up.
45
+ this.host.finished(false);
46
+ this.host.renderFailed(err);
47
+ }
45
48
  }
46
49
  }
47
50
  /** One retry after a brief delay before giving up on the large tier. */
@@ -84,4 +87,4 @@ export class SliceScrubber {
84
87
  }
85
88
  }
86
89
  }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9yY2hlc3RyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLW9yY2hlc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQ0EsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLElBQXVCLEVBQ3ZCLGVBQWUsSUFBSTtRQURuQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBTztJQUMxQixDQUFDO0lBRUosZ0ZBQWdGO0lBQ2hGLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBZ0IsRUFBRSxTQUE0QjtRQUN6RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1lBQ25GLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUscURBQXFELENBQUMsQ0FBQztZQUNuRixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsb0JBQW9CLENBQUMsSUFBZ0I7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyx3REFBd0QsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1RSxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDdEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUNsQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFDVSxLQUEwQixFQUMxQixVQUFVLEdBQUc7UUFEYixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUMxQixZQUFPLEdBQVAsT0FBTyxDQUFNO1FBSmYsVUFBSyxHQUF5QyxJQUFJLENBQUM7SUFLeEQsQ0FBQztJQUVKLGlEQUFpRDtJQUNqRCxLQUFLLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELG1GQUFtRjtJQUNuRixNQUFNLENBQUMsQ0FBUztRQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuXG4vKipcbiAqIFR3by1wYXNzIChzbWFsbOKGkmxhcmdlKSByZW5kZXIgc2VxdWVuY2luZywgZXh0cmFjdGVkIGZyb21cbiAqIFZpc3VhbGl6ZXJDb21wb25lbnQgKHJlZmFjdG9yaW5nIHBsYW4sIFN0ZXAgNyDigJQgYSBwdXJlIG1vdmUgb2YgdGhlXG4gKiBvcmNoZXN0cmF0aW9uOyB0aGUgY29tcG9uZW50IGtlZXBzIHRoZSBVSSBmbGFncyBhbmQgc3VwcGxpZXMgdGhlbSB0aHJvdWdoXG4gKiB0aGUgaG9zdCBjYWxsYmFja3MpLlxuICpcbiAqIFdoZW4gdGhlIGZpbGUgaGFzIHNtYWxsLXRpZXIgVVJMcyB3ZSByZW5kZXIgdGhlIHNtYWxsIHRpZXIgZmlyc3QgZm9yIGEgZmFzdFxuICogYmx1cnJ5IHByZXZpZXcsIHJlbGVhc2UgdGhlIGxvYWRpbmcgb3ZlcmxheSAoa2VlcGluZyBhIHRyYW5zbHVjZW50XG4gKiBcInNoYXJwZW5pbmdcIiBzcGlubmVyKSwgdGhlbiBzaGFycGVuIGJ5IHJlLXJlbmRlcmluZyB0aGUgY2Fub25pY2FsIGxhcmdlIHRpZXJcbiAqIGluIHBsYWNlLiBXaXRob3V0IGEgc21hbGwgdGllciBpdCdzIHRoZSBvcmlnaW5hbCBzaW5nbGUgcGFzcy4gVGhlIGxhcmdlIHBhc3NcbiAqIHJldHJpZXMgb25jZSBhZnRlciBhIHNob3J0IGRlbGF5IOKAlCB0aGUgcHJldmlldyBlbmRwb2ludCBjYW4gaGl0IGEgdHJhbnNpZW50XG4gKiA1MDMgb3IgYSBsb2NrLWNvbnRlbnRpb24gd2luZG93LCBhbmQgdGhlIHNlY29uZCBhdHRlbXB0IHVzdWFsbHkgbGFuZHMgb25cbiAqIGZyZXNoIHByZS1nZW4tY2FjaGVkIFBOR3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHdvUGFzc1JlbmRlckhvc3Qge1xuICAvKiogTG9hZCArIHBsb3Qgb25lIHBoYXNlICh0aGUgY29tcG9uZW50IG93bnMgZGl2L3NjcmVlbi9wbG90LXR5cGUveiBhbmQgdGhlXG4gICAqICBuZXdlci1jbGljayBmaWxlbmFtZSBndWFyZCkuIGBpblBsYWNlYCB1cGRhdGVzIHRoZSBleGlzdGluZyByZW5kZXIgc28gdGhlXG4gICAqICBjYW52YXMgZG9lc24ndCBibGFuayBkdXJpbmcgdGhlIHNtYWxs4oaSbGFyZ2Ugc3dhcC4gKi9cbiAgcmVuZGVyUGhhc2UoaW5mbzogSUltYWdlSW5mbywgaW5QbGFjZTogYm9vbGVhbik6IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBUaGUgc21hbGwgdGllciBpcyBvbiBzY3JlZW4g4oCUIGRyb3AgdGhlIGZ1bGwgbG9hZGluZyBvdmVybGF5IHNvIHRoZSB1c2VyXG4gICAqICBzZWVzIHRoZSBibHVycnkgcHJldmlldywgYW5kIHNob3cgdGhlIHNoYXJwZW5pbmcgc3Bpbm5lci4gKi9cbiAgc21hbGxTaG93bigpOiB2b2lkO1xuICAvKiogVGhlIGxhcmdlIHJlbmRlciBzZXR0bGVkIChlaXRoZXIgd2F5KSDigJQgc2hhcnBlbmluZyBzcGlubmVyIG9mZi4gKi9cbiAgc2hhcnBlblNldHRsZWQoKTogdm9pZDtcbiAgLyoqIFJlbmRlcmluZyBmaW5pc2hlZC4gYHZpYVNtYWxsYCA9IHRoZSBvdmVybGF5IHdhcyBhbHJlYWR5IHJlbGVhc2VkIGJ5IHRoZVxuICAgKiAgc21hbGwgdGllciAoc28gb25seSByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgYXBwbHkgdGhlIFJPSSk7IG90aGVyd2lzZVxuICAgKiAgZG8gdGhlIGZ1bGwgZmluYWxpemUgKG92ZXJsYXkgKyBydW5uaW5nICsgUk9JKS4gKi9cbiAgZmluaXNoZWQodmlhU21hbGw6IGJvb2xlYW4sIGxvZ1RhZzogc3RyaW5nKTogdm9pZDtcbiAgLyoqIEJvdGggbGFyZ2UtdGllciBhdHRlbXB0cyBmYWlsZWQ7IHRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGVcbiAgICogIGZhbGxiYWNrLiBTdXJmYWNlIGl0IHRvIHRoZSB1c2VyIGFuZCByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgUk9JLiAqL1xuICBzaGFycGVuRmFpbGVkKGVycjogdW5rbm93bik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJPcmNoZXN0cmF0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3Q6IFR3b1Bhc3NSZW5kZXJIb3N0LFxuICAgIHByaXZhdGUgcmV0cnlEZWxheU1zID0gMTAwMCxcbiAgKSB7fVxuXG4gIC8qKiBSdW4gdGhlIHJlbmRlcjogc2luZ2xlLXBhc3Mgd2hlbiBgc21hbGxJbmZvYCBpcyBudWxsLCB0d28tcGFzcyBvdGhlcndpc2UuICovXG4gIGFzeW5jIHJlbmRlcihpbmZvOiBJSW1hZ2VJbmZvLCBzbWFsbEluZm86IElJbWFnZUluZm8gfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzbWFsbEluZm8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZChmYWxzZSwgJ2ZpbmlzaGVkIHBsb3R0aW5nJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignUHJldmlldyBmYWlsZWQnLCBlcnIpO1xuICAgICAgICB0aGlzLmhvc3QuZmluaXNoZWQoZmFsc2UsICdwbG90dGluZyBhYm9ydGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNtYWxsUmVsZWFzZWRPdmVybGF5ID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaG9zdC5yZW5kZXJQaGFzZShzbWFsbEluZm8sIGZhbHNlKTtcbiAgICAgIHRoaXMuaG9zdC5zbWFsbFNob3duKCk7XG4gICAgICBzbWFsbFJlbGVhc2VkT3ZlcmxheSA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZygnbXVsdGktdGllcjogc21hbGwgdGllciByZW5kZXJlZCwgc3RhcnRpbmcgbGFyZ2UnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFNtYWxsLXRpZXIgcmVuZGVyIGZhaWxlZCAob2xkZXIgYmFja2VuZCB3aXRob3V0IHRpZXIgc3VwcG9ydCwgdHJhbnNpZW50XG4gICAgICAvLyBlcnJvciwg4oCmKS4gQ29udGludWUgd2l0aCBsYXJnZSBvbmx5OyB0aGUgb3ZlcmxheSBzdGF5cyB1cCB1bnRpbCBpdCBsYW5kcy5cbiAgICAgIGNvbnNvbGUud2FybignU21hbGwtdGllciBwcmV2aWV3IGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGxhcmdlJywgZXJyKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvKTtcbiAgICAgIHRoaXMuaG9zdC5zaGFycGVuU2V0dGxlZCgpO1xuICAgICAgaWYgKHNtYWxsUmVsZWFzZWRPdmVybGF5KSB7XG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZCh0cnVlLCAnbXVsdGktdGllcjogbGFyZ2UgdGllciByZW5kZXJlZCwgc2hhcnBlbmluZyBjb21wbGV0ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ob3N0LmZpbmlzaGVkKGZhbHNlLCAnZmluaXNoZWQgcGxvdHRpbmcgKGxhcmdlIG9ubHkgYWZ0ZXIgc21hbGwgZmFsbGJhY2spJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmhvc3Quc2hhcnBlblNldHRsZWQoKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgYWZ0ZXIgcmV0cnknLCBlcnIpO1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5GYWlsZWQoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogT25lIHJldHJ5IGFmdGVyIGEgYnJpZWYgZGVsYXkgYmVmb3JlIGdpdmluZyB1cCBvbiB0aGUgbGFyZ2UgdGllci4gKi9cbiAgcHJpdmF0ZSByZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvOiBJSW1hZ2VJbmZvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgb24gZmlyc3QgdHJ5LCByZXRyeWluZyBpbiAxcycsIGVycik7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy5yZXRyeURlbGF5TXMpKS50aGVuKCgpID0+XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKGV4dHJhY3RlZCB3aXRoIHRoZSBvcmNoZXN0cmF0b3IpOiBjb2FsZXNjZSB0aGVcbiAqIHJhcGlkIGNoYW5nZXMgYSBzbGlkZXIgZHJhZyBmaXJlcyBzbyBhIHNsaWNlIHN3YXAgZG9lc24ndCBydW4gb24gZXZlcnlcbiAqIHBpeGVsOyB0aGUgZmluYWwgdmFsdWUgbGFuZHMgaW1tZWRpYXRlbHkgdmlhIHtAbGluayBjb21taXR9IChvblNsaWRlRW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWNlU2NydWJiZXIge1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwbHk6ICh6OiBudW1iZXIpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSBkZWxheU1zID0gMTIwLFxuICApIHt9XG5cbiAgLyoqIERlYm91bmNlZCBhcHBsaWNhdGlvbiBvZiB6IHdoaWxlIGRyYWdnaW5nLiAqL1xuICBzY3J1Yih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseSh6KTtcbiAgICB9LCB0aGlzLmRlbGF5TXMpO1xuICB9XG5cbiAgLyoqIEFwcGx5IHogaW1tZWRpYXRlbHkgKHNsaWRlIGVuZCAvIGtleWJvYXJkIHN0ZXApLCBkcm9wcGluZyBhbnkgcGVuZGluZyBzY3J1Yi4gKi9cbiAgY29tbWl0KHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5hcHBseSh6KTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgcGVuZGluZyBzY3J1YiB3aXRob3V0IGFwcGx5aW5nICh0ZWFyZG93bikuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9yY2hlc3RyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLW9yY2hlc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1Q0EsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLElBQXVCLEVBQ3ZCLGVBQWUsSUFBSTtRQURuQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBTztJQUMxQixDQUFDO0lBRUosZ0ZBQWdGO0lBQ2hGLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBZ0IsRUFBRSxTQUE0QjtRQUN6RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVELElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHdFQUF3RTtnQkFDeEUsbUNBQW1DO2dCQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ2hFLG9CQUFvQixDQUFDLElBQWdCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUUsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3RGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FDbEMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBR3hCLFlBQ1UsS0FBMEIsRUFDMUIsVUFBVSxHQUFHO1FBRGIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBTTtRQUpmLFVBQUssR0FBeUMsSUFBSSxDQUFDO0lBS3hELENBQUM7SUFFSixpREFBaUQ7SUFDakQsS0FBSyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsTUFBTSxDQUFDLENBQVM7UUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcblxuLyoqXG4gKiBUd28tcGFzcyAoc21hbGzihpJsYXJnZSkgcmVuZGVyIHNlcXVlbmNpbmcsIGV4dHJhY3RlZCBmcm9tXG4gKiBWaXN1YWxpemVyQ29tcG9uZW50IChyZWZhY3RvcmluZyBwbGFuLCBTdGVwIDcg4oCUIGEgcHVyZSBtb3ZlIG9mIHRoZVxuICogb3JjaGVzdHJhdGlvbjsgdGhlIGNvbXBvbmVudCBrZWVwcyB0aGUgVUkgZmxhZ3MgYW5kIHN1cHBsaWVzIHRoZW0gdGhyb3VnaFxuICogdGhlIGhvc3QgY2FsbGJhY2tzKS5cbiAqXG4gKiBXaGVuIHRoZSBmaWxlIGhhcyBzbWFsbC10aWVyIFVSTHMgd2UgcmVuZGVyIHRoZSBzbWFsbCB0aWVyIGZpcnN0IGZvciBhIGZhc3RcbiAqIGJsdXJyeSBwcmV2aWV3LCByZWxlYXNlIHRoZSBsb2FkaW5nIG92ZXJsYXkgKGtlZXBpbmcgYSB0cmFuc2x1Y2VudFxuICogXCJzaGFycGVuaW5nXCIgc3Bpbm5lciksIHRoZW4gc2hhcnBlbiBieSByZS1yZW5kZXJpbmcgdGhlIGNhbm9uaWNhbCBsYXJnZSB0aWVyXG4gKiBpbiBwbGFjZS4gV2l0aG91dCBhIHNtYWxsIHRpZXIgaXQncyB0aGUgb3JpZ2luYWwgc2luZ2xlIHBhc3MuIFRoZSBsYXJnZSBwYXNzXG4gKiByZXRyaWVzIG9uY2UgYWZ0ZXIgYSBzaG9ydCBkZWxheSDigJQgdGhlIHByZXZpZXcgZW5kcG9pbnQgY2FuIGhpdCBhIHRyYW5zaWVudFxuICogNTAzIG9yIGEgbG9jay1jb250ZW50aW9uIHdpbmRvdywgYW5kIHRoZSBzZWNvbmQgYXR0ZW1wdCB1c3VhbGx5IGxhbmRzIG9uXG4gKiBmcmVzaCBwcmUtZ2VuLWNhY2hlZCBQTkdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR3b1Bhc3NSZW5kZXJIb3N0IHtcbiAgLyoqIExvYWQgKyBwbG90IG9uZSBwaGFzZSAodGhlIGNvbXBvbmVudCBvd25zIGRpdi9zY3JlZW4vcGxvdC10eXBlL3ogYW5kIHRoZVxuICAgKiAgbmV3ZXItY2xpY2sgZmlsZW5hbWUgZ3VhcmQpLiBgaW5QbGFjZWAgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcmVuZGVyIHNvIHRoZVxuICAgKiAgY2FudmFzIGRvZXNuJ3QgYmxhbmsgZHVyaW5nIHRoZSBzbWFsbOKGkmxhcmdlIHN3YXAuIFJlamVjdHMgd2hlbiB0aGUgcGhhc2VcbiAgICogIGNvdWxkIG5vdCBiZSBkcmF3biAoaW5jbHVkaW5nIGEgYmFja2VuZCdzIGBwbG90KClgIHJlc29sdmluZyBmYWxzZSkuICovXG4gIHJlbmRlclBoYXNlKGluZm86IElJbWFnZUluZm8sIGluUGxhY2U6IGJvb2xlYW4pOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogVGhlIHNtYWxsIHRpZXIgaXMgb24gc2NyZWVuIOKAlCBkcm9wIHRoZSBmdWxsIGxvYWRpbmcgb3ZlcmxheSBzbyB0aGUgdXNlclxuICAgKiAgc2VlcyB0aGUgYmx1cnJ5IHByZXZpZXcsIGFuZCBzaG93IHRoZSBzaGFycGVuaW5nIHNwaW5uZXIuICovXG4gIHNtYWxsU2hvd24oKTogdm9pZDtcbiAgLyoqIFRoZSBsYXJnZSByZW5kZXIgc2V0dGxlZCAoZWl0aGVyIHdheSkg4oCUIHNoYXJwZW5pbmcgc3Bpbm5lciBvZmYuICovXG4gIHNoYXJwZW5TZXR0bGVkKCk6IHZvaWQ7XG4gIC8qKiBSZW5kZXJpbmcgZmluaXNoZWQuIGB2aWFTbWFsbGAgPSB0aGUgb3ZlcmxheSB3YXMgYWxyZWFkeSByZWxlYXNlZCBieSB0aGVcbiAgICogIHNtYWxsIHRpZXIgKHNvIG9ubHkgcmVsZWFzZSB0aGUgcnVubmluZyBndWFyZCArIGFwcGx5IHRoZSBST0kpOyBvdGhlcndpc2VcbiAgICogIGRvIHRoZSBmdWxsIGZpbmFsaXplIChvdmVybGF5ICsgcnVubmluZyArIFJPSSkuICovXG4gIGZpbmlzaGVkKHZpYVNtYWxsOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJvdGggbGFyZ2UtdGllciBhdHRlbXB0cyBmYWlsZWQ7IHRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGVcbiAgICogIGZhbGxiYWNrLiBTdXJmYWNlIGl0IHRvIHRoZSB1c2VyIGFuZCByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgUk9JLiAqL1xuICBzaGFycGVuRmFpbGVkKGVycjogdW5rbm93bik6IHZvaWQ7XG4gIC8qKiBOb3RoaW5nIGNvdWxkIGJlIGRyYXduOiB0aGUgc2luZ2xlIHBhc3MgZmFpbGVkLCBvciBib3RoIHRpZXJzIGRpZC4gQ2FsbGVkXG4gICAqICBhZnRlciB7QGxpbmsgZmluaXNoZWR9ICh3aGljaCByZWxlYXNlcyB0aGUgb3ZlcmxheSksIHRvIHRlbGwgdGhlIHVzZXIuICovXG4gIHJlbmRlckZhaWxlZChlcnI6IHVua25vd24pOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUmVuZGVyT3JjaGVzdHJhdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0OiBUd29QYXNzUmVuZGVySG9zdCxcbiAgICBwcml2YXRlIHJldHJ5RGVsYXlNcyA9IDEwMDAsXG4gICkge31cblxuICAvKiogUnVuIHRoZSByZW5kZXI6IHNpbmdsZS1wYXNzIHdoZW4gYHNtYWxsSW5mb2AgaXMgbnVsbCwgdHdvLXBhc3Mgb3RoZXJ3aXNlLiAqL1xuICBhc3luYyByZW5kZXIoaW5mbzogSUltYWdlSW5mbywgc21hbGxJbmZvOiBJSW1hZ2VJbmZvIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc21hbGxJbmZvKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmhvc3QucmVuZGVyUGhhc2UoaW5mbywgZmFsc2UpO1xuICAgICAgICB0aGlzLmhvc3QuZmluaXNoZWQoZmFsc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ByZXZpZXcgZmFpbGVkJywgZXJyKTtcbiAgICAgICAgdGhpcy5ob3N0LmZpbmlzaGVkKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ob3N0LnJlbmRlckZhaWxlZChlcnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzbWFsbFJlbGVhc2VkT3ZlcmxheSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmhvc3QucmVuZGVyUGhhc2Uoc21hbGxJbmZvLCBmYWxzZSk7XG4gICAgICB0aGlzLmhvc3Quc21hbGxTaG93bigpO1xuICAgICAgc21hbGxSZWxlYXNlZE92ZXJsYXkgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gU21hbGwtdGllciByZW5kZXIgZmFpbGVkIChvbGRlciBiYWNrZW5kIHdpdGhvdXQgdGllciBzdXBwb3J0LCB0cmFuc2llbnRcbiAgICAgIC8vIGVycm9yLCDigKYpLiBDb250aW51ZSB3aXRoIGxhcmdlIG9ubHk7IHRoZSBvdmVybGF5IHN0YXlzIHVwIHVudGlsIGl0IGxhbmRzLlxuICAgICAgY29uc29sZS53YXJuKCdTbWFsbC10aWVyIHByZXZpZXcgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbGFyZ2UnLCBlcnIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckxhcmdlV2l0aFJldHJ5KGluZm8pO1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5TZXR0bGVkKCk7XG4gICAgICB0aGlzLmhvc3QuZmluaXNoZWQoc21hbGxSZWxlYXNlZE92ZXJsYXkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5TZXR0bGVkKCk7XG4gICAgICBjb25zb2xlLmVycm9yKCdMYXJnZS10aWVyIHByZXZpZXcgZmFpbGVkIGFmdGVyIHJldHJ5JywgZXJyKTtcbiAgICAgIGlmIChzbWFsbFJlbGVhc2VkT3ZlcmxheSkge1xuICAgICAgICB0aGlzLmhvc3Quc2hhcnBlbkZhaWxlZChlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIHNtYWxsIHRpZXIgbmV2ZXIgbWFkZSBpdCBlaXRoZXI6IHRoZXJlIGlzIG5vIHByZXZpZXcgdG8gZmFsbCBiYWNrXG4gICAgICAgIC8vIG9uLCBhbmQgdGhlIG92ZXJsYXkgaXMgc3RpbGwgdXAuXG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJGYWlsZWQoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT25lIHJldHJ5IGFmdGVyIGEgYnJpZWYgZGVsYXkgYmVmb3JlIGdpdmluZyB1cCBvbiB0aGUgbGFyZ2UgdGllci4gKi9cbiAgcHJpdmF0ZSByZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvOiBJSW1hZ2VJbmZvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgb24gZmlyc3QgdHJ5LCByZXRyeWluZyBpbiAxcycsIGVycik7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy5yZXRyeURlbGF5TXMpKS50aGVuKCgpID0+XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKGV4dHJhY3RlZCB3aXRoIHRoZSBvcmNoZXN0cmF0b3IpOiBjb2FsZXNjZSB0aGVcbiAqIHJhcGlkIGNoYW5nZXMgYSBzbGlkZXIgZHJhZyBmaXJlcyBzbyBhIHNsaWNlIHN3YXAgZG9lc24ndCBydW4gb24gZXZlcnlcbiAqIHBpeGVsOyB0aGUgZmluYWwgdmFsdWUgbGFuZHMgaW1tZWRpYXRlbHkgdmlhIHtAbGluayBjb21taXR9IChvblNsaWRlRW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWNlU2NydWJiZXIge1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwbHk6ICh6OiBudW1iZXIpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSBkZWxheU1zID0gMTIwLFxuICApIHt9XG5cbiAgLyoqIERlYm91bmNlZCBhcHBsaWNhdGlvbiBvZiB6IHdoaWxlIGRyYWdnaW5nLiAqL1xuICBzY3J1Yih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseSh6KTtcbiAgICB9LCB0aGlzLmRlbGF5TXMpO1xuICB9XG5cbiAgLyoqIEFwcGx5IHogaW1tZWRpYXRlbHkgKHNsaWRlIGVuZCAvIGtleWJvYXJkIHN0ZXApLCBkcm9wcGluZyBhbnkgcGVuZGluZyBzY3J1Yi4gKi9cbiAgY29tbWl0KHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5hcHBseSh6KTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgcGVuZGluZyBzY3J1YiB3aXRob3V0IGFwcGx5aW5nICh0ZWFyZG93bikuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,207 @@
1
+ import { RenderOrchestrator } from './render-orchestrator';
2
+ import { Supersede } from './util/supersede';
3
+ /** A user-facing message for a failure: an HttpErrorResponse's server message, an
4
+ * Error's message, or the status text, else the value itself. */
5
+ export function errorMessage(err) {
6
+ const e = err;
7
+ return e?.error?.message || e?.message || e?.statusText || String(err);
8
+ }
9
+ /**
10
+ * The viewer's render pipeline: one image (or image-less dataset) at a time, the newest
11
+ * always winning.
12
+ *
13
+ * Every render takes a task from a {@link Supersede}: a newer render, a Cancel or
14
+ * teardown makes the older one stale — its callbacks return early instead of painting,
15
+ * releasing the newer render's overlay or applying its ROIs — and aborts the signal its
16
+ * loads were given, so superseded network work stops at the source. Sequencing of the
17
+ * small→large tiers lives in {@link RenderOrchestrator}; this owns the UI flags it
18
+ * drives ({@link running}, {@link sharpening}).
19
+ */
20
+ export class ImageRenderSession {
21
+ constructor(host) {
22
+ this.host = host;
23
+ /** A render is in flight. */
24
+ this.running = false;
25
+ /** The small tier is on screen and the large one is still loading. */
26
+ this.sharpening = false;
27
+ /** Set once the plot div exists; an image-less draw before then waits for it. */
28
+ this.viewReady = false;
29
+ this.pendingDraw = null;
30
+ this.supersede = new Supersede();
31
+ }
32
+ /**
33
+ * Render `info` (which has urls), preempting whatever is in flight. A newer image
34
+ * ALWAYS preempts: dropping it while the old one finished reported image B as loaded
35
+ * while image A stayed on screen, and a cold image held the slot for its whole
36
+ * server-side cache fill.
37
+ */
38
+ render(info) {
39
+ const host = this.host;
40
+ const viz = host.visualizer;
41
+ const urls = info.urls;
42
+ const task = this.supersede.next();
43
+ if (this.running) {
44
+ // Stop the previous render's frame streaming (napari volume/surface preload keeps
45
+ // fetching otherwise) and clear its sharpen flag. Its callbacks are already inert.
46
+ viz.cancelLoading?.();
47
+ this.sharpening = false;
48
+ }
49
+ // Measure the plot div directly so the toolbar height is excluded.
50
+ const screenHeight = document.getElementById(host.plotDivName)?.offsetHeight || 500;
51
+ host.beforeReset();
52
+ viz.reset();
53
+ host.prepare(info);
54
+ this.running = true;
55
+ const smallCount = info.smallUrls?.length ?? 0;
56
+ const small = host.isHeatmap() && smallCount > 0 && smallCount === urls.length
57
+ ? { ...info, urls: info.smallUrls }
58
+ : null;
59
+ let overlayReleased = false;
60
+ const releaseOverlay = () => {
61
+ if (overlayReleased)
62
+ return;
63
+ overlayReleased = true;
64
+ host.releaseOverlay(info);
65
+ };
66
+ const settle = () => {
67
+ this.running = false;
68
+ host.landed(info);
69
+ };
70
+ new RenderOrchestrator({
71
+ // inPlace=true updates the existing render instead of rebuilding it, so the
72
+ // canvas doesn't blank during the small→large swap.
73
+ renderPhase: (phaseInfo, inPlace) => {
74
+ const phase = (rebuild) => {
75
+ // Superseded BEFORE this phase started — don't even issue the load (the
76
+ // orchestrator calls this per tier and retries the sharpen pass).
77
+ if (!task.isCurrent())
78
+ return Promise.resolve(null);
79
+ // The backend that loads is the one for the type selected NOW (see RoutingVisualizerService).
80
+ const plotType = host.plotType();
81
+ return viz.load(phaseInfo, host.zIndex(), task.signal).then((loaded) => {
82
+ if (!task.isCurrent())
83
+ return null;
84
+ // Guard against a newer click reaching us mid-render.
85
+ if (phaseInfo.fileName !== loaded.filename)
86
+ return null;
87
+ // The type changed while this loaded (a spatial dataset cleared mid-switch falls
88
+ // back to Image): the loaded image is the old backend's, so load for the new one.
89
+ if (host.plotType() !== plotType)
90
+ return phase(true);
91
+ return viz
92
+ .plot(host.plotDivName, loaded, phaseInfo, screenHeight, plotType, inPlace && !rebuild)
93
+ .then((drawn) => {
94
+ // A backend that cannot draw (no plot target, no WebGPU, no tile descriptor)
95
+ // resolves false: a failed phase, so the retry/failure paths run.
96
+ if (drawn === false && task.isCurrent())
97
+ throw new Error('the renderer could not draw the image');
98
+ return drawn;
99
+ });
100
+ });
101
+ };
102
+ return phase(false);
103
+ },
104
+ smallShown: () => {
105
+ if (!task.isCurrent())
106
+ return;
107
+ // Still caching server-side: keep the full cache-progress overlay up rather than
108
+ // a translucent spinner over a blank canvas; finished() releases it.
109
+ if (host.isCaching())
110
+ return;
111
+ // Small tier on screen: drop the full overlay, keep a translucent spinner so the
112
+ // blurry render isn't mistaken for the final image.
113
+ releaseOverlay();
114
+ this.sharpening = true;
115
+ },
116
+ sharpenSettled: () => {
117
+ if (task.isCurrent())
118
+ this.sharpening = false;
119
+ },
120
+ finished: () => {
121
+ if (!task.isCurrent())
122
+ return;
123
+ releaseOverlay(); // idempotent: now if smallShown deferred it or was skipped
124
+ settle();
125
+ },
126
+ sharpenFailed: (err) => {
127
+ if (!task.isCurrent())
128
+ return;
129
+ // The small tier stays on screen as the fallback.
130
+ host.alert('warn', 'Preview not sharpened', `The full-resolution preview did not load (${errorMessage(err)}). ` +
131
+ 'The low-resolution preview is still shown. Try clicking the image again.');
132
+ settle();
133
+ },
134
+ renderFailed: (err) => {
135
+ if (!task.isCurrent())
136
+ return;
137
+ host.alert('error', 'Could not draw the image', `${info.fileName ?? 'The image'}: ${errorMessage(err)}. Try opening it again.`);
138
+ },
139
+ }).render(info, small);
140
+ }
141
+ /**
142
+ * Draw a spatial mode with no image behind it: the observations alone, framed on their
143
+ * own extent. The image info is a placeholder naming the dataset, so regions drawn here
144
+ * are kept per dataset like any image's. Supersedes (and is superseded by) image renders.
145
+ */
146
+ async plotWithoutImage(dataset) {
147
+ if (!this.viewReady) {
148
+ // A host that creates the viewer AFTER publishing the dataset has it replayed before
149
+ // the plot div exists; drawing now finds no target. Draw once the view is ready.
150
+ this.pendingDraw = dataset;
151
+ return;
152
+ }
153
+ const host = this.host;
154
+ const task = this.supersede.next();
155
+ const info = {
156
+ isGrayscale: false,
157
+ trueImageSize: [0, 0],
158
+ urls: [],
159
+ isStack: false,
160
+ showStack: false,
161
+ scaleRatio: true,
162
+ fileName: `spatial:${dataset.id}`,
163
+ imageMeta: [],
164
+ };
165
+ const height = document.getElementById(host.plotDivName)?.offsetHeight || 500;
166
+ let failure = null;
167
+ try {
168
+ // A backend that cannot draw (no WebGPU, no plot target) resolves false rather than throwing.
169
+ if (!(await host.visualizer.plot(host.plotDivName, null, info, height, host.plotType()))) {
170
+ failure = 'the renderer could not start';
171
+ }
172
+ }
173
+ catch (err) {
174
+ failure = err;
175
+ }
176
+ // Superseded: a newer render owns the loading state now.
177
+ if (!task.isCurrent())
178
+ return;
179
+ if (failure) {
180
+ console.warn('[visualizer] could not draw the spatial dataset', failure);
181
+ const e = failure;
182
+ // An image-less dataset has no tissue image to fall back on, so say so rather than
183
+ // leave an empty canvas that looks finished.
184
+ host.alert('error', 'Could not draw the dataset', `${dataset.name ?? dataset.id}: ${e?.message ?? String(failure)}.`);
185
+ }
186
+ host.setImageLoading(false);
187
+ host.detectChanges();
188
+ }
189
+ /**
190
+ * The plot div exists now: run an image-less draw that arrived before it did — only if
191
+ * its dataset is still the one on offer (by id: the port may re-emit the same dataset
192
+ * as a new object, and the current object is the one to draw) and no image has arrived.
193
+ */
194
+ viewIsReady(current, hasImage) {
195
+ this.viewReady = true;
196
+ const pending = this.pendingDraw;
197
+ this.pendingDraw = null;
198
+ if (pending && current && current.id === pending.id && !hasImage)
199
+ void this.plotWithoutImage(current);
200
+ }
201
+ /** Cancel the render in flight: abort its loads and make its callbacks inert. */
202
+ cancel() {
203
+ this.supersede.cancel();
204
+ this.running = false;
205
+ }
206
+ }
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlci1zZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3QztrRUFDa0U7QUFDbEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFZO0lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEdBQXFGLENBQUM7SUFDaEcsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUEyQkQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFVN0IsWUFBNkIsSUFBdUI7UUFBdkIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFUcEQsNkJBQTZCO1FBQzdCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsc0VBQXNFO1FBQ3RFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsaUZBQWlGO1FBQ3pFLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZ0JBQVcsR0FBMEIsSUFBSSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBRVUsQ0FBQztJQUV4RDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxJQUFnQjtRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFD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QixJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUFFLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsTUFBTTtRQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBsb3RUeXBlIH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IElWaXN1YWxpemVyIH0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZW5kZXJPcmNoZXN0cmF0b3IgfSBmcm9tICcuL3JlbmRlci1vcmNoZXN0cmF0b3InO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi91dGlsL3N1cGVyc2VkZSc7XG5cbi8qKiBBIHVzZXItZmFjaW5nIG1lc3NhZ2UgZm9yIGEgZmFpbHVyZTogYW4gSHR0cEVycm9yUmVzcG9uc2UncyBzZXJ2ZXIgbWVzc2FnZSwgYW5cbiAqICBFcnJvcidzIG1lc3NhZ2UsIG9yIHRoZSBzdGF0dXMgdGV4dCwgZWxzZSB0aGUgdmFsdWUgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBlID0gZXJyIGFzIHsgZXJyb3I/OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfTsgbWVzc2FnZT86IHN0cmluZzsgc3RhdHVzVGV4dD86IHN0cmluZyB9IHwgbnVsbDtcbiAgcmV0dXJuIGU/LmVycm9yPy5tZXNzYWdlIHx8IGU/Lm1lc3NhZ2UgfHwgZT8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbn1cblxuLyoqIFRoZSB2aWV3ZXIgYSByZW5kZXIgc2Vzc2lvbiBkcmF3cyBpbnRvLCBhbmQgd2hhdCBpdCB0ZWxscyB0aGUgdmlld2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJTZXNzaW9uSG9zdCB7XG4gIHJlYWRvbmx5IHBsb3REaXZOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZpc3VhbGl6ZXI6IElWaXN1YWxpemVyO1xuICAvKiogVGhlIHNsaWNlIHRvIGxvYWQsIHJlYWQgd2hlbiBlYWNoIHBoYXNlIHN0YXJ0cy4gKi9cbiAgekluZGV4KCk6IG51bWJlcjtcbiAgcGxvdFR5cGUoKTogUGxvdFR5cGU7XG4gIC8qKiBBIDJEIHZpZXc6IG9ubHkgaXQgcmVuZGVycyB0aGUgc21hbGwgdGllciBmaXJzdCAodGhlIGluLXBsYWNlIHNoYXJwZW4gcGFzcyBkb2VzXG4gICAqICBub3QgcmVidWlsZCBhIDNEIHNjZW5lLCBzbyBpdCBibGFua2VkIG9uZSkuICovXG4gIGlzSGVhdG1hcCgpOiBib29sZWFuO1xuICAvKiogQSBzZXJ2ZXItc2lkZSBjYWNoZSBmaWxsIGlzIGluIHByb2dyZXNzIChrZWVwcyB0aGUgZnVsbCBvdmVybGF5IHVwKS4gKi9cbiAgaXNDYWNoaW5nKCk6IGJvb2xlYW47XG4gIC8qKiBUaGUgdmlldyBpcyBhYm91dCB0byBiZSB0b3JuIGRvd246IGVuZCB3aGF0IHdhcyBib3VuZCB0byBpdCAoY29udHJpYnV0ZWQgc2Vzc2lvbnMpLiAqL1xuICBiZWZvcmVSZXNldCgpOiB2b2lkO1xuICAvKiogTGF5IHRoZSBuZXcgaW1hZ2Ugb3V0IChzdGFjayBmbGFnLCBzbGljZSBib3VuZHMsIGluaXRpYWwgc2xpY2UpIG9uY2UgdGhlIG9sZCB2aWV3IGlzIGdvbmUuICovXG4gIHByZXBhcmUoaW5mbzogSUltYWdlSW5mbyk6IHZvaWQ7XG4gIC8qKiBEcm9wIHRoZSBsb2FkaW5nIG92ZXJsYXkgdGhlIHJlbmRlciBvd25zIChvbmNlIHBlciByZW5kZXIpLiAqL1xuICByZWxlYXNlT3ZlcmxheShpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZDtcbiAgLyoqIFRoZSByZW5kZXIgbGFuZGVkLCBzaGFycCBvciBhcyBhIGZhbGxiYWNrOiBhcHBseSBST0lzLCBzdGFydCBzZXNzaW9ucy4gKi9cbiAgbGFuZGVkKGluZm86IElJbWFnZUluZm8pOiB2b2lkO1xuICBzZXRJbWFnZUxvYWRpbmcobG9hZGluZzogYm9vbGVhbik6IHZvaWQ7XG4gIGFsZXJ0KHNldmVyaXR5OiAnd2FybicgfCAnZXJyb3InLCBzdW1tYXJ5OiBzdHJpbmcsIGRldGFpbDogc3RyaW5nKTogdm9pZDtcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSB2aWV3ZXIncyByZW5kZXIgcGlwZWxpbmU6IG9uZSBpbWFnZSAob3IgaW1hZ2UtbGVzcyBkYXRhc2V0KSBhdCBhIHRpbWUsIHRoZSBuZXdlc3RcbiAqIGFsd2F5cyB3aW5uaW5nLlxuICpcbiAqIEV2ZXJ5IHJlbmRlciB0YWtlcyBhIHRhc2sgZnJvbSBhIHtAbGluayBTdXBlcnNlZGV9OiBhIG5ld2VyIHJlbmRlciwgYSBDYW5jZWwgb3JcbiAqIHRlYXJkb3duIG1ha2VzIHRoZSBvbGRlciBvbmUgc3RhbGUg4oCUIGl0cyBjYWxsYmFja3MgcmV0dXJuIGVhcmx5IGluc3RlYWQgb2YgcGFpbnRpbmcsXG4gKiByZWxlYXNpbmcgdGhlIG5ld2VyIHJlbmRlcidzIG92ZXJsYXkgb3IgYXBwbHlpbmcgaXRzIFJPSXMg4oCUIGFuZCBhYm9ydHMgdGhlIHNpZ25hbCBpdHNcbiAqIGxvYWRzIHdlcmUgZ2l2ZW4sIHNvIHN1cGVyc2VkZWQgbmV0d29yayB3b3JrIHN0b3BzIGF0IHRoZSBzb3VyY2UuIFNlcXVlbmNpbmcgb2YgdGhlXG4gKiBzbWFsbOKGkmxhcmdlIHRpZXJzIGxpdmVzIGluIHtAbGluayBSZW5kZXJPcmNoZXN0cmF0b3J9OyB0aGlzIG93bnMgdGhlIFVJIGZsYWdzIGl0XG4gKiBkcml2ZXMgKHtAbGluayBydW5uaW5nfSwge0BsaW5rIHNoYXJwZW5pbmd9KS5cbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlUmVuZGVyU2Vzc2lvbiB7XG4gIC8qKiBBIHJlbmRlciBpcyBpbiBmbGlnaHQuICovXG4gIHJ1bm5pbmcgPSBmYWxzZTtcbiAgLyoqIFRoZSBzbWFsbCB0aWVyIGlzIG9uIHNjcmVlbiBhbmQgdGhlIGxhcmdlIG9uZSBpcyBzdGlsbCBsb2FkaW5nLiAqL1xuICBzaGFycGVuaW5nID0gZmFsc2U7XG4gIC8qKiBTZXQgb25jZSB0aGUgcGxvdCBkaXYgZXhpc3RzOyBhbiBpbWFnZS1sZXNzIGRyYXcgYmVmb3JlIHRoZW4gd2FpdHMgZm9yIGl0LiAqL1xuICBwcml2YXRlIHZpZXdSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdEcmF3OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cGVyc2VkZSA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFJlbmRlclNlc3Npb25Ib3N0KSB7fVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYGluZm9gICh3aGljaCBoYXMgdXJscyksIHByZWVtcHRpbmcgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LiBBIG5ld2VyIGltYWdlXG4gICAqIEFMV0FZUyBwcmVlbXB0czogZHJvcHBpbmcgaXQgd2hpbGUgdGhlIG9sZCBvbmUgZmluaXNoZWQgcmVwb3J0ZWQgaW1hZ2UgQiBhcyBsb2FkZWRcbiAgICogd2hpbGUgaW1hZ2UgQSBzdGF5ZWQgb24gc2NyZWVuLCBhbmQgYSBjb2xkIGltYWdlIGhlbGQgdGhlIHNsb3QgZm9yIGl0cyB3aG9sZVxuICAgKiBzZXJ2ZXItc2lkZSBjYWNoZSBmaWxsLlxuICAgKi9cbiAgcmVuZGVyKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0O1xuICAgIGNvbnN0IHZpeiA9IGhvc3QudmlzdWFsaXplcjtcbiAgICBjb25zdCB1cmxzID0gaW5mby51cmxzO1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnN1cGVyc2VkZS5uZXh0KCk7XG4gICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgLy8gU3RvcCB0aGUgcHJldmlvdXMgcmVuZGVyJ3MgZnJhbWUgc3RyZWFtaW5nIChuYXBhcmkgdm9sdW1lL3N1cmZhY2UgcHJlbG9hZCBrZWVwc1xuICAgICAgLy8gZmV0Y2hpbmcgb3RoZXJ3aXNlKSBhbmQgY2xlYXIgaXRzIHNoYXJwZW4gZmxhZy4gSXRzIGNhbGxiYWNrcyBhcmUgYWxyZWFkeSBpbmVydC5cbiAgICAgIHZpei5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICAgIHRoaXMuc2hhcnBlbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBNZWFzdXJlIHRoZSBwbG90IGRpdiBkaXJlY3RseSBzbyB0aGUgdG9vbGJhciBoZWlnaHQgaXMgZXhjbHVkZWQuXG4gICAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaG9zdC5wbG90RGl2TmFtZSk/Lm9mZnNldEhlaWdodCB8fCA1MDA7XG4gICAgaG9zdC5iZWZvcmVSZXNldCgpO1xuICAgIHZpei5yZXNldCgpO1xuICAgIGhvc3QucHJlcGFyZShpbmZvKTtcbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHNtYWxsQ291bnQgPSBpbmZvLnNtYWxsVXJscz8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3Qgc21hbGwgPVxuICAgICAgaG9zdC5pc0hlYXRtYXAoKSAmJiBzbWFsbENvdW50ID4gMCAmJiBzbWFsbENvdW50ID09PSB1cmxzLmxlbmd0aFxuICAgICAgICA/IHsgLi4uaW5mbywgdXJsczogaW5mby5zbWFsbFVybHMgYXMgc3RyaW5nW10gfVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IG92ZXJsYXlSZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlbGVhc2VPdmVybGF5ID0gKCkgPT4ge1xuICAgICAgaWYgKG92ZXJsYXlSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgb3ZlcmxheVJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgIGhvc3QucmVsZWFzZU92ZXJsYXkoaW5mbyk7XG4gICAgfTtcbiAgICBjb25zdCBzZXR0bGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgIGhvc3QubGFuZGVkKGluZm8pO1xuICAgIH07XG5cbiAgICBuZXcgUmVuZGVyT3JjaGVzdHJhdG9yKHtcbiAgICAgIC8vIGluUGxhY2U9dHJ1ZSB1cGRhdGVzIHRoZSBleGlzdGluZyByZW5kZXIgaW5zdGVhZCBvZiByZWJ1aWxkaW5nIGl0LCBzbyB0aGVcbiAgICAgIC8vIGNhbnZhcyBkb2Vzbid0IGJsYW5rIGR1cmluZyB0aGUgc21hbGzihpJsYXJnZSBzd2FwLlxuICAgICAgcmVuZGVyUGhhc2U6IChwaGFzZUluZm8sIGluUGxhY2UpID0+IHtcbiAgICAgICAgY29uc3QgcGhhc2UgPSAocmVidWlsZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+ID0+IHtcbiAgICAgICAgICAvLyBTdXBlcnNlZGVkIEJFRk9SRSB0aGlzIHBoYXNlIHN0YXJ0ZWQg4oCUIGRvbid0IGV2ZW4gaXNzdWUgdGhlIGxvYWQgKHRoZVxuICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBjYWxscyB0aGlzIHBlciB0aWVyIGFuZCByZXRyaWVzIHRoZSBzaGFycGVuIHBhc3MpLlxuICAgICAgICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAvLyBUaGUgYmFja2VuZCB0aGF0IGxvYWRzIGlzIHRoZSBvbmUgZm9yIHRoZSB0eXBlIHNlbGVjdGVkIE5PVyAoc2VlIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSkuXG4gICAgICAgICAgY29uc3QgcGxvdFR5cGUgPSBob3N0LnBsb3RUeXBlKCk7XG4gICAgICAgICAgcmV0dXJuIHZpei5sb2FkKHBoYXNlSW5mbywgaG9zdC56SW5kZXgoKSwgdGFzay5zaWduYWwpLnRoZW4oKGxvYWRlZCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYSBuZXdlciBjbGljayByZWFjaGluZyB1cyBtaWQtcmVuZGVyLlxuICAgICAgICAgICAgaWYgKHBoYXNlSW5mby5maWxlTmFtZSAhPT0gbG9hZGVkLmZpbGVuYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIC8vIFRoZSB0eXBlIGNoYW5nZWQgd2hpbGUgdGhpcyBsb2FkZWQgKGEgc3BhdGlhbCBkYXRhc2V0IGNsZWFyZWQgbWlkLXN3aXRjaCBmYWxsc1xuICAgICAgICAgICAgLy8gYmFjayB0byBJbWFnZSk6IHRoZSBsb2FkZWQgaW1hZ2UgaXMgdGhlIG9sZCBiYWNrZW5kJ3MsIHNvIGxvYWQgZm9yIHRoZSBuZXcgb25lLlxuICAgICAgICAgICAgaWYgKGhvc3QucGxvdFR5cGUoKSAhPT0gcGxvdFR5cGUpIHJldHVybiBwaGFzZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB2aXpcbiAgICAgICAgICAgICAgLnBsb3QoaG9zdC5wbG90RGl2TmFtZSwgbG9hZGVkLCBwaGFzZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UgJiYgIXJlYnVpbGQpXG4gICAgICAgICAgICAgIC50aGVuKChkcmF3bikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEEgYmFja2VuZCB0aGF0IGNhbm5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCBubyB0aWxlIGRlc2NyaXB0b3IpXG4gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXMgZmFsc2U6IGEgZmFpbGVkIHBoYXNlLCBzbyB0aGUgcmV0cnkvZmFpbHVyZSBwYXRocyBydW4uXG4gICAgICAgICAgICAgICAgaWYgKGRyYXduID09PSBmYWxzZSAmJiB0YXNrLmlzQ3VycmVudCgpKSB0aHJvdyBuZXcgRXJyb3IoJ3RoZSByZW5kZXJlciBjb3VsZCBub3QgZHJhdyB0aGUgaW1hZ2UnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhd247XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGhhc2UoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIHNtYWxsU2hvd246ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIC8vIFN0aWxsIGNhY2hpbmcgc2VydmVyLXNpZGU6IGtlZXAgdGhlIGZ1bGwgY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSB1cCByYXRoZXIgdGhhblxuICAgICAgICAvLyBhIHRyYW5zbHVjZW50IHNwaW5uZXIgb3ZlciBhIGJsYW5rIGNhbnZhczsgZmluaXNoZWQoKSByZWxlYXNlcyBpdC5cbiAgICAgICAgaWYgKGhvc3QuaXNDYWNoaW5nKCkpIHJldHVybjtcbiAgICAgICAgLy8gU21hbGwgdGllciBvbiBzY3JlZW46IGRyb3AgdGhlIGZ1bGwgb3ZlcmxheSwga2VlcCBhIHRyYW5zbHVjZW50IHNwaW5uZXIgc28gdGhlXG4gICAgICAgIC8vIGJsdXJyeSByZW5kZXIgaXNuJ3QgbWlzdGFrZW4gZm9yIHRoZSBmaW5hbCBpbWFnZS5cbiAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5zaGFycGVuaW5nID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBzaGFycGVuU2V0dGxlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGFzay5pc0N1cnJlbnQoKSkgdGhpcy5zaGFycGVuaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZmluaXNoZWQ6ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIHJlbGVhc2VPdmVybGF5KCk7IC8vIGlkZW1wb3RlbnQ6IG5vdyBpZiBzbWFsbFNob3duIGRlZmVycmVkIGl0IG9yIHdhcyBza2lwcGVkXG4gICAgICAgIHNldHRsZSgpO1xuICAgICAgfSxcbiAgICAgIHNoYXJwZW5GYWlsZWQ6IChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIC8vIFRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGUgZmFsbGJhY2suXG4gICAgICAgIGhvc3QuYWxlcnQoXG4gICAgICAgICAgJ3dhcm4nLFxuICAgICAgICAgICdQcmV2aWV3IG5vdCBzaGFycGVuZWQnLFxuICAgICAgICAgIGBUaGUgZnVsbC1yZXNvbHV0aW9uIHByZXZpZXcgZGlkIG5vdCBsb2FkICgke2Vycm9yTWVzc2FnZShlcnIpfSkuIGAgK1xuICAgICAgICAgICAgJ1RoZSBsb3ctcmVzb2x1dGlvbiBwcmV2aWV3IGlzIHN0aWxsIHNob3duLiBUcnkgY2xpY2tpbmcgdGhlIGltYWdlIGFnYWluLicsXG4gICAgICAgICk7XG4gICAgICAgIHNldHRsZSgpO1xuICAgICAgfSxcbiAgICAgIHJlbmRlckZhaWxlZDogKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIXRhc2suaXNDdXJyZW50KCkpIHJldHVybjtcbiAgICAgICAgaG9zdC5hbGVydChcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICdDb3VsZCBub3QgZHJhdyB0aGUgaW1hZ2UnLFxuICAgICAgICAgIGAke2luZm8uZmlsZU5hbWUgPz8gJ1RoZSBpbWFnZSd9OiAke2Vycm9yTWVzc2FnZShlcnIpfS4gVHJ5IG9wZW5pbmcgaXQgYWdhaW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSkucmVuZGVyKGluZm8sIHNtYWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IGEgc3BhdGlhbCBtb2RlIHdpdGggbm8gaW1hZ2UgYmVoaW5kIGl0OiB0aGUgb2JzZXJ2YXRpb25zIGFsb25lLCBmcmFtZWQgb24gdGhlaXJcbiAgICogb3duIGV4dGVudC4gVGhlIGltYWdlIGluZm8gaXMgYSBwbGFjZWhvbGRlciBuYW1pbmcgdGhlIGRhdGFzZXQsIHNvIHJlZ2lvbnMgZHJhd24gaGVyZVxuICAgKiBhcmUga2VwdCBwZXIgZGF0YXNldCBsaWtlIGFueSBpbWFnZSdzLiBTdXBlcnNlZGVzIChhbmQgaXMgc3VwZXJzZWRlZCBieSkgaW1hZ2UgcmVuZGVycy5cbiAgICovXG4gIGFzeW5jIHBsb3RXaXRob3V0SW1hZ2UoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMudmlld1JlYWR5KSB7XG4gICAgICAvLyBBIGhvc3QgdGhhdCBjcmVhdGVzIHRoZSB2aWV3ZXIgQUZURVIgcHVibGlzaGluZyB0aGUgZGF0YXNldCBoYXMgaXQgcmVwbGF5ZWQgYmVmb3JlXG4gICAgICAvLyB0aGUgcGxvdCBkaXYgZXhpc3RzOyBkcmF3aW5nIG5vdyBmaW5kcyBubyB0YXJnZXQuIERyYXcgb25jZSB0aGUgdmlldyBpcyByZWFkeS5cbiAgICAgIHRoaXMucGVuZGluZ0RyYXcgPSBkYXRhc2V0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0O1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnN1cGVyc2VkZS5uZXh0KCk7XG4gICAgY29uc3QgaW5mbzogSUltYWdlSW5mbyA9IHtcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIHRydWVJbWFnZVNpemU6IFswLCAwXSxcbiAgICAgIHVybHM6IFtdLFxuICAgICAgaXNTdGFjazogZmFsc2UsXG4gICAgICBzaG93U3RhY2s6IGZhbHNlLFxuICAgICAgc2NhbGVSYXRpbzogdHJ1ZSxcbiAgICAgIGZpbGVOYW1lOiBgc3BhdGlhbDoke2RhdGFzZXQuaWR9YCxcbiAgICAgIGltYWdlTWV0YTogW10sXG4gICAgfTtcbiAgICBjb25zdCBoZWlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChob3N0LnBsb3REaXZOYW1lKT8ub2Zmc2V0SGVpZ2h0IHx8IDUwMDtcbiAgICBsZXQgZmFpbHVyZTogdW5rbm93biA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEEgYmFja2VuZCB0aGF0IGNhbm5vdCBkcmF3IChubyBXZWJHUFUsIG5vIHBsb3QgdGFyZ2V0KSByZXNvbHZlcyBmYWxzZSByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAgICAgIGlmICghKGF3YWl0IGhvc3QudmlzdWFsaXplci5wbG90KGhvc3QucGxvdERpdk5hbWUsIG51bGwsIGluZm8sIGhlaWdodCwgaG9zdC5wbG90VHlwZSgpKSkpIHtcbiAgICAgICAgZmFpbHVyZSA9ICd0aGUgcmVuZGVyZXIgY291bGQgbm90IHN0YXJ0JztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGZhaWx1cmUgPSBlcnI7XG4gICAgfVxuICAgIC8vIFN1cGVyc2VkZWQ6IGEgbmV3ZXIgcmVuZGVyIG93bnMgdGhlIGxvYWRpbmcgc3RhdGUgbm93LlxuICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuO1xuICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBjb3VsZCBub3QgZHJhdyB0aGUgc3BhdGlhbCBkYXRhc2V0JywgZmFpbHVyZSk7XG4gICAgICBjb25zdCBlID0gZmFpbHVyZSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgICAgIC8vIEFuIGltYWdlLWxlc3MgZGF0YXNldCBoYXMgbm8gdGlzc3VlIGltYWdlIHRvIGZhbGwgYmFjayBvbiwgc28gc2F5IHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBsZWF2ZSBhbiBlbXB0eSBjYW52YXMgdGhhdCBsb29rcyBmaW5pc2hlZC5cbiAgICAgIGhvc3QuYWxlcnQoXG4gICAgICAgICdlcnJvcicsXG4gICAgICAgICdDb3VsZCBub3QgZHJhdyB0aGUgZGF0YXNldCcsXG4gICAgICAgIGAke2RhdGFzZXQubmFtZSA/PyBkYXRhc2V0LmlkfTogJHtlPy5tZXNzYWdlID8/IFN0cmluZyhmYWlsdXJlKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGhvc3Quc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICBob3N0LmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxvdCBkaXYgZXhpc3RzIG5vdzogcnVuIGFuIGltYWdlLWxlc3MgZHJhdyB0aGF0IGFycml2ZWQgYmVmb3JlIGl0IGRpZCDigJQgb25seSBpZlxuICAgKiBpdHMgZGF0YXNldCBpcyBzdGlsbCB0aGUgb25lIG9uIG9mZmVyIChieSBpZDogdGhlIHBvcnQgbWF5IHJlLWVtaXQgdGhlIHNhbWUgZGF0YXNldFxuICAgKiBhcyBhIG5ldyBvYmplY3QsIGFuZCB0aGUgY3VycmVudCBvYmplY3QgaXMgdGhlIG9uZSB0byBkcmF3KSBhbmQgbm8gaW1hZ2UgaGFzIGFycml2ZWQuXG4gICAqL1xuICB2aWV3SXNSZWFkeShjdXJyZW50OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIGhhc0ltYWdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aWV3UmVhZHkgPSB0cnVlO1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdEcmF3O1xuICAgIHRoaXMucGVuZGluZ0RyYXcgPSBudWxsO1xuICAgIGlmIChwZW5kaW5nICYmIGN1cnJlbnQgJiYgY3VycmVudC5pZCA9PT0gcGVuZGluZy5pZCAmJiAhaGFzSW1hZ2UpIHZvaWQgdGhpcy5wbG90V2l0aG91dEltYWdlKGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqIENhbmNlbCB0aGUgcmVuZGVyIGluIGZsaWdodDogYWJvcnQgaXRzIGxvYWRzIGFuZCBtYWtlIGl0cyBjYWxsYmFja3MgaW5lcnQuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1cGVyc2VkZS5jYW5jZWwoKTtcbiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgfVxufVxuIl19