@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.
- package/README.md +201 -460
- package/esm2022/index.mjs +34 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +123 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +25 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +55 -84
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +46 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/assets/slice.svg +23 -0
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { SharedModule } from 'primeng/api';
|
|
5
|
+
import { ButtonModule } from 'primeng/button';
|
|
6
|
+
import { DialogModule } from 'primeng/dialog';
|
|
7
|
+
import { InputTextModule } from 'primeng/inputtext';
|
|
8
|
+
import { ProgressBarModule } from 'primeng/progressbar';
|
|
9
|
+
import { RadioButtonModule } from 'primeng/radiobutton';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/common";
|
|
12
|
+
import * as i2 from "@angular/forms";
|
|
13
|
+
import * as i3 from "primeng/api";
|
|
14
|
+
import * as i4 from "primeng/button";
|
|
15
|
+
import * as i5 from "primeng/dialog";
|
|
16
|
+
import * as i6 from "primeng/inputtext";
|
|
17
|
+
import * as i7 from "primeng/progressbar";
|
|
18
|
+
import * as i8 from "primeng/radiobutton";
|
|
19
|
+
/**
|
|
20
|
+
* The Region Editor's "Save mask" dialog: filename + mask type while idle, a
|
|
21
|
+
* progress bar (rasterize, then encode) with a Cancel button while the export
|
|
22
|
+
* runs. Presentational — the editor owns the state and the export
|
|
23
|
+
* ({@link MaskExportService}); the dialog only reports edits and clicks.
|
|
24
|
+
*/
|
|
25
|
+
export class SaveMaskDialogComponent {
|
|
26
|
+
constructor() {
|
|
27
|
+
/** The dialog is open. */
|
|
28
|
+
this.visible = false;
|
|
29
|
+
/** The dialog was closed (`false`); two-way with {@link visible}. */
|
|
30
|
+
this.visibleChange = new EventEmitter();
|
|
31
|
+
/** The PNG filename. */
|
|
32
|
+
this.filename = '';
|
|
33
|
+
/** The filename was edited; two-way with {@link filename}. */
|
|
34
|
+
this.filenameChange = new EventEmitter();
|
|
35
|
+
/** The mask type: binary, or one label value per class. */
|
|
36
|
+
this.mode = 'binary';
|
|
37
|
+
/** The mask type was changed; two-way with {@link mode}. */
|
|
38
|
+
this.modeChange = new EventEmitter();
|
|
39
|
+
/** True while the export runs (the form is replaced by progress). */
|
|
40
|
+
this.busy = false;
|
|
41
|
+
/** 0–100 rasterization progress. */
|
|
42
|
+
this.progress = 0;
|
|
43
|
+
/** True once rasterizing is done and the PNG is being encoded. */
|
|
44
|
+
this.encoding = false;
|
|
45
|
+
/** Download clicked with a non-blank filename. */
|
|
46
|
+
this.confirm = new EventEmitter();
|
|
47
|
+
/** Cancel clicked while the export runs. */
|
|
48
|
+
this.cancelExport = new EventEmitter();
|
|
49
|
+
}
|
|
50
|
+
close() {
|
|
51
|
+
this.visibleChange.emit(false);
|
|
52
|
+
}
|
|
53
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SaveMaskDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
54
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SaveMaskDialogComponent, isStandalone: true, selector: "region-save-mask-dialog", inputs: { visible: "visible", filename: "filename", mode: "mode", busy: "busy", progress: "progress", encoding: "encoding" }, outputs: { visibleChange: "visibleChange", filenameChange: "filenameChange", modeChange: "modeChange", confirm: "confirm", cancelExport: "cancelExport" }, ngImport: i0, template: "<p-dialog\n header=\"Save Mask\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"true\"\n appendTo=\"body\"\n [style]=\"{ width: '30rem' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [closable]=\"!busy\"\n [closeOnEscape]=\"!busy\"\n>\n <!-- Idle: filename + mask-type form. -->\n <div *ngIf=\"!busy\" class=\"flex flex-column gap-3 pt-2\">\n <label for=\"mask-filename\" class=\"font-medium\">Mask filename</label>\n <input\n id=\"mask-filename\"\n type=\"text\"\n pInputText\n [ngModel]=\"filename\"\n (ngModelChange)=\"filenameChange.emit($event)\"\n class=\"w-full\"\n />\n <span class=\"font-medium\">Mask type</span>\n <div class=\"flex align-items-center gap-2\">\n <p-radioButton\n inputId=\"mask-binary\"\n name=\"maskMode\"\n value=\"binary\"\n [ngModel]=\"mode\"\n (ngModelChange)=\"modeChange.emit($event)\"\n ></p-radioButton>\n <label for=\"mask-binary\">Binary <span class=\"text-color-secondary\">(regions 1, background 0)</span></label>\n </div>\n <div class=\"flex align-items-center gap-2\">\n <p-radioButton\n inputId=\"mask-multiclass\"\n name=\"maskMode\"\n value=\"multiclass\"\n [ngModel]=\"mode\"\n (ngModelChange)=\"modeChange.emit($event)\"\n ></p-radioButton>\n <label for=\"mask-multiclass\"\n >Multi-class <span class=\"text-color-secondary\">(unique id per region, background 0)</span></label\n >\n </div>\n </div>\n\n <!-- Busy: progress while the worker rasterizes + encodes the PNG. -->\n <div *ngIf=\"busy\" class=\"flex flex-column gap-3 pt-2\">\n <span>{{ encoding ? 'Encoding PNG\u2026' : 'Rasterizing regions\u2026' }}</span>\n <p-progressBar\n [mode]=\"encoding ? 'indeterminate' : 'determinate'\"\n [value]=\"progress\"\n [style]=\"{ height: '0.75rem' }\"\n ></p-progressBar>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button *ngIf=\"!busy\" label=\"Cancel\" icon=\"pi pi-times\" [text]=\"true\" (onClick)=\"close()\"></p-button>\n <p-button\n *ngIf=\"!busy\"\n label=\"Download\"\n icon=\"pi pi-download\"\n [disabled]=\"!filename || !filename.trim()\"\n (onClick)=\"confirm.emit()\"\n ></p-button>\n <p-button\n *ngIf=\"busy\"\n label=\"Cancel\"\n icon=\"pi pi-times\"\n [text]=\"true\"\n (onClick)=\"cancelExport.emit()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i5.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i6.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i7.ProgressBar, selector: "p-progressBar", inputs: ["value", "showValue", "styleClass", "style", "unit", "mode", "color"] }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i8.RadioButton, selector: "p-radioButton", inputs: ["value", "formControlName", "name", "disabled", "label", "variant", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "labelStyleClass", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SaveMaskDialogComponent, decorators: [{
|
|
57
|
+
type: Component,
|
|
58
|
+
args: [{ selector: 'region-save-mask-dialog', standalone: true, imports: [
|
|
59
|
+
CommonModule,
|
|
60
|
+
FormsModule,
|
|
61
|
+
SharedModule,
|
|
62
|
+
ButtonModule,
|
|
63
|
+
DialogModule,
|
|
64
|
+
InputTextModule,
|
|
65
|
+
ProgressBarModule,
|
|
66
|
+
RadioButtonModule,
|
|
67
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dialog\n header=\"Save Mask\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"true\"\n appendTo=\"body\"\n [style]=\"{ width: '30rem' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [closable]=\"!busy\"\n [closeOnEscape]=\"!busy\"\n>\n <!-- Idle: filename + mask-type form. -->\n <div *ngIf=\"!busy\" class=\"flex flex-column gap-3 pt-2\">\n <label for=\"mask-filename\" class=\"font-medium\">Mask filename</label>\n <input\n id=\"mask-filename\"\n type=\"text\"\n pInputText\n [ngModel]=\"filename\"\n (ngModelChange)=\"filenameChange.emit($event)\"\n class=\"w-full\"\n />\n <span class=\"font-medium\">Mask type</span>\n <div class=\"flex align-items-center gap-2\">\n <p-radioButton\n inputId=\"mask-binary\"\n name=\"maskMode\"\n value=\"binary\"\n [ngModel]=\"mode\"\n (ngModelChange)=\"modeChange.emit($event)\"\n ></p-radioButton>\n <label for=\"mask-binary\">Binary <span class=\"text-color-secondary\">(regions 1, background 0)</span></label>\n </div>\n <div class=\"flex align-items-center gap-2\">\n <p-radioButton\n inputId=\"mask-multiclass\"\n name=\"maskMode\"\n value=\"multiclass\"\n [ngModel]=\"mode\"\n (ngModelChange)=\"modeChange.emit($event)\"\n ></p-radioButton>\n <label for=\"mask-multiclass\"\n >Multi-class <span class=\"text-color-secondary\">(unique id per region, background 0)</span></label\n >\n </div>\n </div>\n\n <!-- Busy: progress while the worker rasterizes + encodes the PNG. -->\n <div *ngIf=\"busy\" class=\"flex flex-column gap-3 pt-2\">\n <span>{{ encoding ? 'Encoding PNG\u2026' : 'Rasterizing regions\u2026' }}</span>\n <p-progressBar\n [mode]=\"encoding ? 'indeterminate' : 'determinate'\"\n [value]=\"progress\"\n [style]=\"{ height: '0.75rem' }\"\n ></p-progressBar>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button *ngIf=\"!busy\" label=\"Cancel\" icon=\"pi pi-times\" [text]=\"true\" (onClick)=\"close()\"></p-button>\n <p-button\n *ngIf=\"!busy\"\n label=\"Download\"\n icon=\"pi pi-download\"\n [disabled]=\"!filename || !filename.trim()\"\n (onClick)=\"confirm.emit()\"\n ></p-button>\n <p-button\n *ngIf=\"busy\"\n label=\"Cancel\"\n icon=\"pi pi-times\"\n [text]=\"true\"\n (onClick)=\"cancelExport.emit()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n" }]
|
|
68
|
+
}], propDecorators: { visible: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], visibleChange: [{
|
|
71
|
+
type: Output
|
|
72
|
+
}], filename: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}], filenameChange: [{
|
|
75
|
+
type: Output
|
|
76
|
+
}], mode: [{
|
|
77
|
+
type: Input
|
|
78
|
+
}], modeChange: [{
|
|
79
|
+
type: Output
|
|
80
|
+
}], busy: [{
|
|
81
|
+
type: Input
|
|
82
|
+
}], progress: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], encoding: [{
|
|
85
|
+
type: Input
|
|
86
|
+
}], confirm: [{
|
|
87
|
+
type: Output
|
|
88
|
+
}], cancelExport: [{
|
|
89
|
+
type: Output
|
|
90
|
+
}] } });
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS1tYXNrLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3Ivc2F2ZS1tYXNrLWRpYWxvZy9zYXZlLW1hc2stZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9zYXZlLW1hc2stZGlhbG9nL3NhdmUtbWFzay1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7QUFJeEQ7Ozs7O0dBS0c7QUFpQkgsTUFBTSxPQUFPLHVCQUF1QjtJQWhCcEM7UUFpQkUsMEJBQTBCO1FBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDekIscUVBQXFFO1FBQzNELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUV0RCx3QkFBd0I7UUFDZixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLDhEQUE4RDtRQUNwRCxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdEQsMkRBQTJEO1FBQ2xELFNBQUksR0FBYSxRQUFRLENBQUM7UUFDbkMsNERBQTREO1FBQ2xELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRXBELHFFQUFxRTtRQUM1RCxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLG9DQUFvQztRQUMzQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLGtFQUFrRTtRQUN6RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLGtEQUFrRDtRQUN4QyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUM3Qyw0Q0FBNEM7UUFDbEMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBS25EO0lBSFcsS0FBSztRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OEdBOUJVLHVCQUF1QjtrR0FBdkIsdUJBQXVCLDRXQ2xDcEMsOCtFQTRFQSwyQ0R0REksWUFBWSxrSUFDWixXQUFXLDhtQkFDWCxZQUFZLHFJQUNaLFlBQVksNlhBQ1osWUFBWSx1dUJBQ1osZUFBZSx3SEFDZixpQkFBaUIsc0xBQ2pCLGlCQUFpQjs7MkZBS1IsdUJBQXVCO2tCQWhCbkMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsaUJBQWlCO3FCQUNsQixtQkFFZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsT0FBTztzQkFBZixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0UsUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUdFLElBQUk7c0JBQVosS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdFLElBQUk7c0JBQVosS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0ksT0FBTztzQkFBaEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBJbnB1dFRleHRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dCc7XG5pbXBvcnQgeyBQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IHsgUmFkaW9CdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3JhZGlvYnV0dG9uJztcblxuaW1wb3J0IHsgTWFza01vZGUgfSBmcm9tICcuLi9tYXNrLWV4cG9ydC5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgUmVnaW9uIEVkaXRvcidzIFwiU2F2ZSBtYXNrXCIgZGlhbG9nOiBmaWxlbmFtZSArIG1hc2sgdHlwZSB3aGlsZSBpZGxlLCBhXG4gKiBwcm9ncmVzcyBiYXIgKHJhc3Rlcml6ZSwgdGhlbiBlbmNvZGUpIHdpdGggYSBDYW5jZWwgYnV0dG9uIHdoaWxlIHRoZSBleHBvcnRcbiAqIHJ1bnMuIFByZXNlbnRhdGlvbmFsIOKAlCB0aGUgZWRpdG9yIG93bnMgdGhlIHN0YXRlIGFuZCB0aGUgZXhwb3J0XG4gKiAoe0BsaW5rIE1hc2tFeHBvcnRTZXJ2aWNlfSk7IHRoZSBkaWFsb2cgb25seSByZXBvcnRzIGVkaXRzIGFuZCBjbGlja3MuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1zYXZlLW1hc2stZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIERpYWxvZ01vZHVsZSxcbiAgICBJbnB1dFRleHRNb2R1bGUsXG4gICAgUHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgUmFkaW9CdXR0b25Nb2R1bGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zYXZlLW1hc2stZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNhdmVNYXNrRGlhbG9nQ29tcG9uZW50IHtcbiAgLyoqIFRoZSBkaWFsb2cgaXMgb3Blbi4gKi9cbiAgQElucHV0KCkgdmlzaWJsZSA9IGZhbHNlO1xuICAvKiogVGhlIGRpYWxvZyB3YXMgY2xvc2VkIChgZmFsc2VgKTsgdHdvLXdheSB3aXRoIHtAbGluayB2aXNpYmxlfS4gKi9cbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIFRoZSBQTkcgZmlsZW5hbWUuICovXG4gIEBJbnB1dCgpIGZpbGVuYW1lID0gJyc7XG4gIC8qKiBUaGUgZmlsZW5hbWUgd2FzIGVkaXRlZDsgdHdvLXdheSB3aXRoIHtAbGluayBmaWxlbmFtZX0uICovXG4gIEBPdXRwdXQoKSBmaWxlbmFtZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBUaGUgbWFzayB0eXBlOiBiaW5hcnksIG9yIG9uZSBsYWJlbCB2YWx1ZSBwZXIgY2xhc3MuICovXG4gIEBJbnB1dCgpIG1vZGU6IE1hc2tNb2RlID0gJ2JpbmFyeSc7XG4gIC8qKiBUaGUgbWFzayB0eXBlIHdhcyBjaGFuZ2VkOyB0d28td2F5IHdpdGgge0BsaW5rIG1vZGV9LiAqL1xuICBAT3V0cHV0KCkgbW9kZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWFza01vZGU+KCk7XG5cbiAgLyoqIFRydWUgd2hpbGUgdGhlIGV4cG9ydCBydW5zICh0aGUgZm9ybSBpcyByZXBsYWNlZCBieSBwcm9ncmVzcykuICovXG4gIEBJbnB1dCgpIGJ1c3kgPSBmYWxzZTtcbiAgLyoqIDDigJMxMDAgcmFzdGVyaXphdGlvbiBwcm9ncmVzcy4gKi9cbiAgQElucHV0KCkgcHJvZ3Jlc3MgPSAwO1xuICAvKiogVHJ1ZSBvbmNlIHJhc3Rlcml6aW5nIGlzIGRvbmUgYW5kIHRoZSBQTkcgaXMgYmVpbmcgZW5jb2RlZC4gKi9cbiAgQElucHV0KCkgZW5jb2RpbmcgPSBmYWxzZTtcblxuICAvKiogRG93bmxvYWQgY2xpY2tlZCB3aXRoIGEgbm9uLWJsYW5rIGZpbGVuYW1lLiAqL1xuICBAT3V0cHV0KCkgY29uZmlybSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIENhbmNlbCBjbGlja2VkIHdoaWxlIHRoZSBleHBvcnQgcnVucy4gKi9cbiAgQE91dHB1dCgpIGNhbmNlbEV4cG9ydCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcm90ZWN0ZWQgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG59XG4iLCI8cC1kaWFsb2dcbiAgaGVhZGVyPVwiU2F2ZSBNYXNrXCJcbiAgW3Zpc2libGVdPVwidmlzaWJsZVwiXG4gICh2aXNpYmxlQ2hhbmdlKT1cInZpc2libGVDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBhcHBlbmRUbz1cImJvZHlcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzMwcmVtJyB9XCJcbiAgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuICBbY2xvc2FibGVdPVwiIWJ1c3lcIlxuICBbY2xvc2VPbkVzY2FwZV09XCIhYnVzeVwiXG4+XG4gIDwhLS0gSWRsZTogZmlsZW5hbWUgKyBtYXNrLXR5cGUgZm9ybS4gLS0+XG4gIDxkaXYgKm5nSWY9XCIhYnVzeVwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMyBwdC0yXCI+XG4gICAgPGxhYmVsIGZvcj1cIm1hc2stZmlsZW5hbWVcIiBjbGFzcz1cImZvbnQtbWVkaXVtXCI+TWFzayBmaWxlbmFtZTwvbGFiZWw+XG4gICAgPGlucHV0XG4gICAgICBpZD1cIm1hc2stZmlsZW5hbWVcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcElucHV0VGV4dFxuICAgICAgW25nTW9kZWxdPVwiZmlsZW5hbWVcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsZW5hbWVDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwidy1mdWxsXCJcbiAgICAvPlxuICAgIDxzcGFuIGNsYXNzPVwiZm9udC1tZWRpdW1cIj5NYXNrIHR5cGU8L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8cC1yYWRpb0J1dHRvblxuICAgICAgICBpbnB1dElkPVwibWFzay1iaW5hcnlcIlxuICAgICAgICBuYW1lPVwibWFza01vZGVcIlxuICAgICAgICB2YWx1ZT1cImJpbmFyeVwiXG4gICAgICAgIFtuZ01vZGVsXT1cIm1vZGVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtb2RlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICA+PC9wLXJhZGlvQnV0dG9uPlxuICAgICAgPGxhYmVsIGZvcj1cIm1hc2stYmluYXJ5XCI+QmluYXJ5IDxzcGFuIGNsYXNzPVwidGV4dC1jb2xvci1zZWNvbmRhcnlcIj4ocmVnaW9ucyAxLCBiYWNrZ3JvdW5kIDApPC9zcGFuPjwvbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8cC1yYWRpb0J1dHRvblxuICAgICAgICBpbnB1dElkPVwibWFzay1tdWx0aWNsYXNzXCJcbiAgICAgICAgbmFtZT1cIm1hc2tNb2RlXCJcbiAgICAgICAgdmFsdWU9XCJtdWx0aWNsYXNzXCJcbiAgICAgICAgW25nTW9kZWxdPVwibW9kZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1vZGVDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgID48L3AtcmFkaW9CdXR0b24+XG4gICAgICA8bGFiZWwgZm9yPVwibWFzay1tdWx0aWNsYXNzXCJcbiAgICAgICAgPk11bHRpLWNsYXNzIDxzcGFuIGNsYXNzPVwidGV4dC1jb2xvci1zZWNvbmRhcnlcIj4odW5pcXVlIGlkIHBlciByZWdpb24sIGJhY2tncm91bmQgMCk8L3NwYW4+PC9sYWJlbFxuICAgICAgPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEJ1c3k6IHByb2dyZXNzIHdoaWxlIHRoZSB3b3JrZXIgcmFzdGVyaXplcyArIGVuY29kZXMgdGhlIFBORy4gLS0+XG4gIDxkaXYgKm5nSWY9XCJidXN5XCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGdhcC0zIHB0LTJcIj5cbiAgICA8c3Bhbj57eyBlbmNvZGluZyA/ICdFbmNvZGluZyBQTkfigKYnIDogJ1Jhc3Rlcml6aW5nIHJlZ2lvbnPigKYnIH19PC9zcGFuPlxuICAgIDxwLXByb2dyZXNzQmFyXG4gICAgICBbbW9kZV09XCJlbmNvZGluZyA/ICdpbmRldGVybWluYXRlJyA6ICdkZXRlcm1pbmF0ZSdcIlxuICAgICAgW3ZhbHVlXT1cInByb2dyZXNzXCJcbiAgICAgIFtzdHlsZV09XCJ7IGhlaWdodDogJzAuNzVyZW0nIH1cIlxuICAgID48L3AtcHJvZ3Jlc3NCYXI+XG4gIDwvZGl2PlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gKm5nSWY9XCIhYnVzeVwiIGxhYmVsPVwiQ2FuY2VsXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgW3RleHRdPVwidHJ1ZVwiIChvbkNsaWNrKT1cImNsb3NlKClcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgKm5nSWY9XCIhYnVzeVwiXG4gICAgICBsYWJlbD1cIkRvd25sb2FkXCJcbiAgICAgIGljb249XCJwaSBwaS1kb3dubG9hZFwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWZpbGVuYW1lIHx8ICFmaWxlbmFtZS50cmltKClcIlxuICAgICAgKG9uQ2xpY2spPVwiY29uZmlybS5lbWl0KClcIlxuICAgID48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgKm5nSWY9XCJidXN5XCJcbiAgICAgIGxhYmVsPVwiQ2FuY2VsXCJcbiAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIChvbkNsaWNrKT1cImNhbmNlbEV4cG9ydC5lbWl0KClcIlxuICAgID48L3AtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cbiJdfQ==
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { SharedModule } from 'primeng/api';
|
|
5
|
+
import { ButtonModule } from 'primeng/button';
|
|
6
|
+
import { DialogModule } from 'primeng/dialog';
|
|
7
|
+
import { InputTextModule } from 'primeng/inputtext';
|
|
8
|
+
import { ProgressBarModule } from 'primeng/progressbar';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common";
|
|
11
|
+
import * as i2 from "@angular/forms";
|
|
12
|
+
import * as i3 from "primeng/api";
|
|
13
|
+
import * as i4 from "primeng/button";
|
|
14
|
+
import * as i5 from "primeng/dialog";
|
|
15
|
+
import * as i6 from "primeng/inputtext";
|
|
16
|
+
import * as i7 from "primeng/progressbar";
|
|
17
|
+
/**
|
|
18
|
+
* A GeoJSON filename dialog, used by the Region Editor for both "Save Regions
|
|
19
|
+
* As" (server save: overwrite warning, progress + Cancel while busy) and
|
|
20
|
+
* "Export Regions" (download). Presentational — the editor owns the state and
|
|
21
|
+
* the I/O ({@link RegionPersistenceService}).
|
|
22
|
+
*/
|
|
23
|
+
export class SaveRegionsDialogComponent {
|
|
24
|
+
constructor() {
|
|
25
|
+
/** The dialog title. */
|
|
26
|
+
this.header = 'Save Regions As';
|
|
27
|
+
/** The confirm button's label. */
|
|
28
|
+
this.confirmLabel = 'Save';
|
|
29
|
+
/** The confirm button's PrimeIcons class. */
|
|
30
|
+
this.confirmIcon = 'pi pi-save';
|
|
31
|
+
/** id of the filename input (unique per dialog instance). */
|
|
32
|
+
this.inputId = 'geojson-filename';
|
|
33
|
+
/** The dialog is open. */
|
|
34
|
+
this.visible = false;
|
|
35
|
+
/** The dialog was closed (`false`); two-way with {@link visible}. */
|
|
36
|
+
this.visibleChange = new EventEmitter();
|
|
37
|
+
/** The GeoJSON filename. */
|
|
38
|
+
this.filename = '';
|
|
39
|
+
/** The filename was edited; two-way with {@link filename}. */
|
|
40
|
+
this.filenameChange = new EventEmitter();
|
|
41
|
+
/** Shows the "will be overwritten" warning. */
|
|
42
|
+
this.fileExists = false;
|
|
43
|
+
/** True while the save runs (the form is replaced by progress). */
|
|
44
|
+
this.busy = false;
|
|
45
|
+
/** Save/Export clicked with a non-blank filename. */
|
|
46
|
+
this.confirm = new EventEmitter();
|
|
47
|
+
/** Cancel clicked while the save runs. */
|
|
48
|
+
this.cancelSave = new EventEmitter();
|
|
49
|
+
}
|
|
50
|
+
close() {
|
|
51
|
+
this.visibleChange.emit(false);
|
|
52
|
+
}
|
|
53
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SaveRegionsDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
54
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SaveRegionsDialogComponent, isStandalone: true, selector: "region-save-regions-dialog", inputs: { header: "header", confirmLabel: "confirmLabel", confirmIcon: "confirmIcon", inputId: "inputId", visible: "visible", filename: "filename", fileExists: "fileExists", busy: "busy" }, outputs: { visibleChange: "visibleChange", filenameChange: "filenameChange", confirm: "confirm", cancelSave: "cancelSave" }, ngImport: i0, template: "<p-dialog\n [header]=\"header\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"true\"\n appendTo=\"body\"\n [style]=\"{ width: '30rem' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [closable]=\"!busy\"\n [closeOnEscape]=\"!busy\"\n>\n <!-- Idle: filename + overwrite warning. -->\n <div *ngIf=\"!busy\" class=\"flex flex-column gap-3 pt-2\">\n <label [for]=\"inputId\" class=\"font-medium\">GeoJSON filename</label>\n <input\n [id]=\"inputId\"\n type=\"text\"\n pInputText\n [ngModel]=\"filename\"\n (ngModelChange)=\"filenameChange.emit($event)\"\n class=\"w-full\"\n />\n <small *ngIf=\"fileExists\" class=\"p-error\">\n <i class=\"pi pi-exclamation-triangle mr-1\"></i>\n This file already exists and will be overwritten.\n </small>\n </div>\n\n <!-- Busy: progress while regions serialize + upload. -->\n <div *ngIf=\"busy\" class=\"flex flex-column gap-3 pt-2\">\n <span>Saving regions\u2026</span>\n <p-progressBar mode=\"indeterminate\" [style]=\"{ height: '0.75rem' }\"></p-progressBar>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button *ngIf=\"!busy\" label=\"Cancel\" icon=\"pi pi-times\" [text]=\"true\" (onClick)=\"close()\"></p-button>\n <p-button\n *ngIf=\"!busy\"\n [label]=\"confirmLabel\"\n [icon]=\"confirmIcon\"\n [disabled]=\"!filename || !filename.trim()\"\n (onClick)=\"confirm.emit()\"\n ></p-button>\n <p-button\n *ngIf=\"busy\"\n label=\"Cancel\"\n icon=\"pi pi-times\"\n [text]=\"true\"\n (onClick)=\"cancelSave.emit()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i5.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i6.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i7.ProgressBar, selector: "p-progressBar", inputs: ["value", "showValue", "styleClass", "style", "unit", "mode", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SaveRegionsDialogComponent, decorators: [{
|
|
57
|
+
type: Component,
|
|
58
|
+
args: [{ selector: 'region-save-regions-dialog', standalone: true, imports: [
|
|
59
|
+
CommonModule,
|
|
60
|
+
FormsModule,
|
|
61
|
+
SharedModule,
|
|
62
|
+
ButtonModule,
|
|
63
|
+
DialogModule,
|
|
64
|
+
InputTextModule,
|
|
65
|
+
ProgressBarModule,
|
|
66
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-dialog\n [header]=\"header\"\n [visible]=\"visible\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [modal]=\"true\"\n appendTo=\"body\"\n [style]=\"{ width: '30rem' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [closable]=\"!busy\"\n [closeOnEscape]=\"!busy\"\n>\n <!-- Idle: filename + overwrite warning. -->\n <div *ngIf=\"!busy\" class=\"flex flex-column gap-3 pt-2\">\n <label [for]=\"inputId\" class=\"font-medium\">GeoJSON filename</label>\n <input\n [id]=\"inputId\"\n type=\"text\"\n pInputText\n [ngModel]=\"filename\"\n (ngModelChange)=\"filenameChange.emit($event)\"\n class=\"w-full\"\n />\n <small *ngIf=\"fileExists\" class=\"p-error\">\n <i class=\"pi pi-exclamation-triangle mr-1\"></i>\n This file already exists and will be overwritten.\n </small>\n </div>\n\n <!-- Busy: progress while regions serialize + upload. -->\n <div *ngIf=\"busy\" class=\"flex flex-column gap-3 pt-2\">\n <span>Saving regions\u2026</span>\n <p-progressBar mode=\"indeterminate\" [style]=\"{ height: '0.75rem' }\"></p-progressBar>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button *ngIf=\"!busy\" label=\"Cancel\" icon=\"pi pi-times\" [text]=\"true\" (onClick)=\"close()\"></p-button>\n <p-button\n *ngIf=\"!busy\"\n [label]=\"confirmLabel\"\n [icon]=\"confirmIcon\"\n [disabled]=\"!filename || !filename.trim()\"\n (onClick)=\"confirm.emit()\"\n ></p-button>\n <p-button\n *ngIf=\"busy\"\n label=\"Cancel\"\n icon=\"pi pi-times\"\n [text]=\"true\"\n (onClick)=\"cancelSave.emit()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n" }]
|
|
67
|
+
}], propDecorators: { header: [{
|
|
68
|
+
type: Input
|
|
69
|
+
}], confirmLabel: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}], confirmIcon: [{
|
|
72
|
+
type: Input
|
|
73
|
+
}], inputId: [{
|
|
74
|
+
type: Input
|
|
75
|
+
}], visible: [{
|
|
76
|
+
type: Input
|
|
77
|
+
}], visibleChange: [{
|
|
78
|
+
type: Output
|
|
79
|
+
}], filename: [{
|
|
80
|
+
type: Input
|
|
81
|
+
}], filenameChange: [{
|
|
82
|
+
type: Output
|
|
83
|
+
}], fileExists: [{
|
|
84
|
+
type: Input
|
|
85
|
+
}], busy: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], confirm: [{
|
|
88
|
+
type: Output
|
|
89
|
+
}], cancelSave: [{
|
|
90
|
+
type: Output
|
|
91
|
+
}] } });
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS1yZWdpb25zLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3Ivc2F2ZS1yZWdpb25zLWRpYWxvZy9zYXZlLXJlZ2lvbnMtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9zYXZlLXJlZ2lvbnMtZGlhbG9nL3NhdmUtcmVnaW9ucy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7OztBQUV4RDs7Ozs7R0FLRztBQWdCSCxNQUFNLE9BQU8sMEJBQTBCO0lBZnZDO1FBZ0JFLHdCQUF3QjtRQUNmLFdBQU0sR0FBRyxpQkFBaUIsQ0FBQztRQUNwQyxrQ0FBa0M7UUFDekIsaUJBQVksR0FBRyxNQUFNLENBQUM7UUFDL0IsNkNBQTZDO1FBQ3BDLGdCQUFXLEdBQUcsWUFBWSxDQUFDO1FBQ3BDLDZEQUE2RDtRQUNwRCxZQUFPLEdBQUcsa0JBQWtCLENBQUM7UUFFdEMsMEJBQTBCO1FBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDekIscUVBQXFFO1FBQzNELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUV0RCw0QkFBNEI7UUFDbkIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUN2Qiw4REFBOEQ7UUFDcEQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXRELCtDQUErQztRQUN0QyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzVCLG1FQUFtRTtRQUMxRCxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBRXRCLHFEQUFxRDtRQUMzQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUM3QywwQ0FBMEM7UUFDaEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FLakQ7SUFIVyxLQUFLO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQzs4R0FoQ1UsMEJBQTBCO2tHQUExQiwwQkFBMEIsaVpDOUJ2QywrcERBcURBLDJDRGxDSSxZQUFZLGtJQUNaLFdBQVcsOG1CQUNYLFlBQVkscUlBQ1osWUFBWSw2WEFDWixZQUFZLHV1QkFDWixlQUFlLHdIQUNmLGlCQUFpQjs7MkZBS1IsMEJBQTBCO2tCQWZ0QyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsaUJBQWlCO3FCQUNsQixtQkFFZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0UsUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUdFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUdJLE9BQU87c0JBQWhCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2hhcmVkTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Byb2dyZXNzYmFyJztcblxuLyoqXG4gKiBBIEdlb0pTT04gZmlsZW5hbWUgZGlhbG9nLCB1c2VkIGJ5IHRoZSBSZWdpb24gRWRpdG9yIGZvciBib3RoIFwiU2F2ZSBSZWdpb25zXG4gKiBBc1wiIChzZXJ2ZXIgc2F2ZTogb3ZlcndyaXRlIHdhcm5pbmcsIHByb2dyZXNzICsgQ2FuY2VsIHdoaWxlIGJ1c3kpIGFuZFxuICogXCJFeHBvcnQgUmVnaW9uc1wiIChkb3dubG9hZCkuIFByZXNlbnRhdGlvbmFsIOKAlCB0aGUgZWRpdG9yIG93bnMgdGhlIHN0YXRlIGFuZFxuICogdGhlIEkvTyAoe0BsaW5rIFJlZ2lvblBlcnNpc3RlbmNlU2VydmljZX0pLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdpb24tc2F2ZS1yZWdpb25zLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgU2hhcmVkTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBEaWFsb2dNb2R1bGUsXG4gICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgIFByb2dyZXNzQmFyTW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc2F2ZS1yZWdpb25zLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTYXZlUmVnaW9uc0RpYWxvZ0NvbXBvbmVudCB7XG4gIC8qKiBUaGUgZGlhbG9nIHRpdGxlLiAqL1xuICBASW5wdXQoKSBoZWFkZXIgPSAnU2F2ZSBSZWdpb25zIEFzJztcbiAgLyoqIFRoZSBjb25maXJtIGJ1dHRvbidzIGxhYmVsLiAqL1xuICBASW5wdXQoKSBjb25maXJtTGFiZWwgPSAnU2F2ZSc7XG4gIC8qKiBUaGUgY29uZmlybSBidXR0b24ncyBQcmltZUljb25zIGNsYXNzLiAqL1xuICBASW5wdXQoKSBjb25maXJtSWNvbiA9ICdwaSBwaS1zYXZlJztcbiAgLyoqIGlkIG9mIHRoZSBmaWxlbmFtZSBpbnB1dCAodW5pcXVlIHBlciBkaWFsb2cgaW5zdGFuY2UpLiAqL1xuICBASW5wdXQoKSBpbnB1dElkID0gJ2dlb2pzb24tZmlsZW5hbWUnO1xuXG4gIC8qKiBUaGUgZGlhbG9nIGlzIG9wZW4uICovXG4gIEBJbnB1dCgpIHZpc2libGUgPSBmYWxzZTtcbiAgLyoqIFRoZSBkaWFsb2cgd2FzIGNsb3NlZCAoYGZhbHNlYCk7IHR3by13YXkgd2l0aCB7QGxpbmsgdmlzaWJsZX0uICovXG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKiBUaGUgR2VvSlNPTiBmaWxlbmFtZS4gKi9cbiAgQElucHV0KCkgZmlsZW5hbWUgPSAnJztcbiAgLyoqIFRoZSBmaWxlbmFtZSB3YXMgZWRpdGVkOyB0d28td2F5IHdpdGgge0BsaW5rIGZpbGVuYW1lfS4gKi9cbiAgQE91dHB1dCgpIGZpbGVuYW1lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIFNob3dzIHRoZSBcIndpbGwgYmUgb3ZlcndyaXR0ZW5cIiB3YXJuaW5nLiAqL1xuICBASW5wdXQoKSBmaWxlRXhpc3RzID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBzYXZlIHJ1bnMgKHRoZSBmb3JtIGlzIHJlcGxhY2VkIGJ5IHByb2dyZXNzKS4gKi9cbiAgQElucHV0KCkgYnVzeSA9IGZhbHNlO1xuXG4gIC8qKiBTYXZlL0V4cG9ydCBjbGlja2VkIHdpdGggYSBub24tYmxhbmsgZmlsZW5hbWUuICovXG4gIEBPdXRwdXQoKSBjb25maXJtID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogQ2FuY2VsIGNsaWNrZWQgd2hpbGUgdGhlIHNhdmUgcnVucy4gKi9cbiAgQE91dHB1dCgpIGNhbmNlbFNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJvdGVjdGVkIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxufVxuIiwiPHAtZGlhbG9nXG4gIFtoZWFkZXJdPVwiaGVhZGVyXCJcbiAgW3Zpc2libGVdPVwidmlzaWJsZVwiXG4gICh2aXNpYmxlQ2hhbmdlKT1cInZpc2libGVDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBhcHBlbmRUbz1cImJvZHlcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzMwcmVtJyB9XCJcbiAgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuICBbY2xvc2FibGVdPVwiIWJ1c3lcIlxuICBbY2xvc2VPbkVzY2FwZV09XCIhYnVzeVwiXG4+XG4gIDwhLS0gSWRsZTogZmlsZW5hbWUgKyBvdmVyd3JpdGUgd2FybmluZy4gLS0+XG4gIDxkaXYgKm5nSWY9XCIhYnVzeVwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMyBwdC0yXCI+XG4gICAgPGxhYmVsIFtmb3JdPVwiaW5wdXRJZFwiIGNsYXNzPVwiZm9udC1tZWRpdW1cIj5HZW9KU09OIGZpbGVuYW1lPC9sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHBJbnB1dFRleHRcbiAgICAgIFtuZ01vZGVsXT1cImZpbGVuYW1lXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbGVuYW1lQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgLz5cbiAgICA8c21hbGwgKm5nSWY9XCJmaWxlRXhpc3RzXCIgY2xhc3M9XCJwLWVycm9yXCI+XG4gICAgICA8aSBjbGFzcz1cInBpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIG1yLTFcIj48L2k+XG4gICAgICBUaGlzIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgPC9zbWFsbD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBCdXN5OiBwcm9ncmVzcyB3aGlsZSByZWdpb25zIHNlcmlhbGl6ZSArIHVwbG9hZC4gLS0+XG4gIDxkaXYgKm5nSWY9XCJidXN5XCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGdhcC0zIHB0LTJcIj5cbiAgICA8c3Bhbj5TYXZpbmcgcmVnaW9uc+KApjwvc3Bhbj5cbiAgICA8cC1wcm9ncmVzc0JhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIFtzdHlsZV09XCJ7IGhlaWdodDogJzAuNzVyZW0nIH1cIj48L3AtcHJvZ3Jlc3NCYXI+XG4gIDwvZGl2PlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8cC1idXR0b24gKm5nSWY9XCIhYnVzeVwiIGxhYmVsPVwiQ2FuY2VsXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgW3RleHRdPVwidHJ1ZVwiIChvbkNsaWNrKT1cImNsb3NlKClcIj48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgKm5nSWY9XCIhYnVzeVwiXG4gICAgICBbbGFiZWxdPVwiY29uZmlybUxhYmVsXCJcbiAgICAgIFtpY29uXT1cImNvbmZpcm1JY29uXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLnRyaW0oKVwiXG4gICAgICAob25DbGljayk9XCJjb25maXJtLmVtaXQoKVwiXG4gICAgPjwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICAqbmdJZj1cImJ1c3lcIlxuICAgICAgbGFiZWw9XCJDYW5jZWxcIlxuICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgKG9uQ2xpY2spPVwiY2FuY2VsU2F2ZS5lbWl0KClcIlxuICAgID48L3AtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cbiJdfQ==
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { Region, Rectangle, Polygon, MultiPolygon } from './models/region';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { rasterizePolygon, unionMasks } from './geometry/raster';
|
|
4
|
+
import { maskToPolygons } from './geometry/contour';
|
|
5
|
+
import { simplifyRing } from './geometry/ring';
|
|
6
|
+
import { clonePolygon, makePolygon, rectToRing } from './models/polygon-factory';
|
|
5
7
|
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "./toolbar/wand/wand.service";
|
|
7
8
|
/**
|
|
8
9
|
* Pure (DOM-free) region set-operations — merge / inverse / ungroup (jit-ui#85).
|
|
9
10
|
*
|
|
10
11
|
* Raster-based, reusing the wand/brush mask pipeline
|
|
11
|
-
* ({@link
|
|
12
|
+
* ({@link rasterizePolygon} → {@link maskToPolygons}, the pure `geometry/` modules),
|
|
12
13
|
* so "select + merge" yields the same geometry as brushing regions together:
|
|
13
14
|
* one engine, one set of behaviours, holes + multi-part results for free.
|
|
14
15
|
*
|
|
@@ -27,9 +28,6 @@ export class RegionOpsService {
|
|
|
27
28
|
* large-extent selections (small selections keep full resolution).
|
|
28
29
|
*/
|
|
29
30
|
static { this.MAX_OP_PIXELS = 16_000_000; }
|
|
30
|
-
constructor(wand) {
|
|
31
|
-
this.wand = wand;
|
|
32
|
-
}
|
|
33
31
|
/**
|
|
34
32
|
* Geometric union of `regions` into a single region: a {@link Polygon} when
|
|
35
33
|
* the union is one connected piece, a {@link MultiPolygon} when it stays
|
|
@@ -45,9 +43,7 @@ export class RegionOpsService {
|
|
|
45
43
|
const mask = this.unionMask(regions, imageWidth, imageHeight, scale);
|
|
46
44
|
if (!mask)
|
|
47
45
|
return null;
|
|
48
|
-
|
|
49
|
-
const sh = Math.max(1, Math.round(imageHeight * scale));
|
|
50
|
-
let polys = this.wand.maskToPolygons(mask.mask, mask.bw, mask.bh, sw, sh, mask.bx, mask.by, 1, 1);
|
|
46
|
+
let polys = maskToPolygons(mask.mask, mask.bw, mask.bh, mask.bx, mask.by, 1, 1);
|
|
51
47
|
if (scale !== 1)
|
|
52
48
|
polys = polys.map((p) => this.scalePolygon(p, 1 / scale));
|
|
53
49
|
return this.regionFromParts(polys, regions[0]);
|
|
@@ -91,15 +87,10 @@ export class RegionOpsService {
|
|
|
91
87
|
}
|
|
92
88
|
/** A copy of `p` with every coordinate (and hole coordinate) multiplied by `s`. */
|
|
93
89
|
scalePolygon(p, s) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
poly.closed = p.closed;
|
|
99
|
-
poly.coordinates = poly.xpoints.map((x, i) => [x, poly.ypoints[i]]);
|
|
100
|
-
if (p.holes)
|
|
101
|
-
poly.holes = p.holes.map((ring) => ring.map(([x, y]) => [x * s, y * s]));
|
|
102
|
-
return poly;
|
|
90
|
+
return makePolygon(p.xpoints.map((x) => x * s), p.ypoints.map((y) => y * s), {
|
|
91
|
+
closed: p.closed,
|
|
92
|
+
holes: p.holes?.map((ring) => ring.map(([x, y]) => [x * s, y * s])),
|
|
93
|
+
});
|
|
103
94
|
}
|
|
104
95
|
/**
|
|
105
96
|
* Replace `regions` with their inverse inside the image rectangle: the image
|
|
@@ -121,11 +112,13 @@ export class RegionOpsService {
|
|
|
121
112
|
return null;
|
|
122
113
|
const comps = merged.bounds instanceof MultiPolygon
|
|
123
114
|
? merged.bounds.polygons
|
|
124
|
-
: merged.bounds instanceof Polygon
|
|
115
|
+
: merged.bounds instanceof Polygon
|
|
116
|
+
? [merged.bounds]
|
|
117
|
+
: [];
|
|
125
118
|
if (comps.length === 0)
|
|
126
119
|
return null;
|
|
127
120
|
// Image rectangle exterior with every component outline as a hole.
|
|
128
|
-
const rect =
|
|
121
|
+
const rect = makePolygon([0, imageWidth, imageWidth, 0], [0, 0, imageHeight, imageHeight]);
|
|
129
122
|
rect.holes = comps.map((c) => c.xpoints.map((x, i) => [x, c.ypoints[i]]));
|
|
130
123
|
// Each component's own hole (donut interior) is *outside* the region, so it
|
|
131
124
|
// stays solid in the inverse — emit it as its own island part.
|
|
@@ -133,23 +126,13 @@ export class RegionOpsService {
|
|
|
133
126
|
for (const c of comps) {
|
|
134
127
|
if (c.holes) {
|
|
135
128
|
for (const ring of c.holes) {
|
|
136
|
-
parts.push(
|
|
129
|
+
parts.push(makePolygon(ring.map((p) => p[0]), ring.map((p) => p[1])));
|
|
137
130
|
}
|
|
138
131
|
}
|
|
139
132
|
}
|
|
140
133
|
const bounds = parts.length === 1 ? parts[0] : Object.assign(new MultiPolygon(), { polygons: parts });
|
|
141
134
|
return this.makeRegion(bounds, regions[0]);
|
|
142
135
|
}
|
|
143
|
-
/** A closed straight-edged Polygon from parallel coord arrays. */
|
|
144
|
-
ringPolygon(xs, ys) {
|
|
145
|
-
const p = new Polygon();
|
|
146
|
-
p.xpoints = xs.slice();
|
|
147
|
-
p.ypoints = ys.slice();
|
|
148
|
-
p.npoints = xs.length;
|
|
149
|
-
p.coordinates = xs.map((x, i) => [x, ys[i]]);
|
|
150
|
-
p.closed = true;
|
|
151
|
-
return p;
|
|
152
|
-
}
|
|
153
136
|
/**
|
|
154
137
|
* Split a region into its disjoint parts — one region per {@link MultiPolygon}
|
|
155
138
|
* part. A single connected {@link Polygon}/{@link Rectangle} has nothing to
|
|
@@ -158,9 +141,7 @@ export class RegionOpsService {
|
|
|
158
141
|
ungroup(region) {
|
|
159
142
|
const b = region.bounds;
|
|
160
143
|
if (b instanceof MultiPolygon) {
|
|
161
|
-
return b.polygons
|
|
162
|
-
.filter((p) => p.xpoints.length >= 3)
|
|
163
|
-
.map((p) => this.makeRegion(this.clonePolygon(p), region));
|
|
144
|
+
return b.polygons.filter((p) => p.xpoints.length >= 3).map((p) => this.makeRegion(clonePolygon(p), region));
|
|
164
145
|
}
|
|
165
146
|
return [region];
|
|
166
147
|
}
|
|
@@ -199,21 +180,11 @@ export class RegionOpsService {
|
|
|
199
180
|
return s.xs.length >= 3 ? s : { xs: xs.slice(), ys: ys.slice() };
|
|
200
181
|
};
|
|
201
182
|
const ext = keepOrSrc(p.xpoints, p.ypoints);
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
poly.closed = true;
|
|
208
|
-
if (p.holes) {
|
|
209
|
-
const holes = p.holes.map((ring) => {
|
|
210
|
-
const s = keepOrSrc(ring.map((q) => q[0]), ring.map((q) => q[1]));
|
|
211
|
-
return s.xs.map((x, i) => [x, s.ys[i]]);
|
|
212
|
-
});
|
|
213
|
-
if (holes.length)
|
|
214
|
-
poly.holes = holes;
|
|
215
|
-
}
|
|
216
|
-
return poly;
|
|
183
|
+
const holes = p.holes?.map((ring) => {
|
|
184
|
+
const s = keepOrSrc(ring.map((q) => q[0]), ring.map((q) => q[1]));
|
|
185
|
+
return s.xs.map((x, i) => [x, s.ys[i]]);
|
|
186
|
+
});
|
|
187
|
+
return makePolygon(ext.xs, ext.ys, { holes });
|
|
217
188
|
}
|
|
218
189
|
// ── internals ──────────────────────────────────────────────────────────
|
|
219
190
|
/** Union of every region's filled mask (exterior minus holes), or null.
|
|
@@ -239,21 +210,20 @@ export class RegionOpsService {
|
|
|
239
210
|
const scHoles = (holes) => !holes || scale === 1 ? holes : holes.map((ring) => ring.map(([x, y]) => [x * scale, y * scale]));
|
|
240
211
|
const b = region?.bounds;
|
|
241
212
|
if (b instanceof Rectangle) {
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
return this.wand.rasterizePolygon(sc(xs), sc(ys), sw, sh);
|
|
213
|
+
const ring = rectToRing(b);
|
|
214
|
+
return rasterizePolygon(sc(ring.xs), sc(ring.ys), sw, sh);
|
|
245
215
|
}
|
|
246
216
|
if (b instanceof Polygon) {
|
|
247
217
|
if (b.closed === false || b.xpoints.length < 3)
|
|
248
218
|
return null;
|
|
249
|
-
return
|
|
219
|
+
return rasterizePolygon(sc(b.xpoints), sc(b.ypoints), sw, sh, scHoles(b.holes));
|
|
250
220
|
}
|
|
251
221
|
if (b instanceof MultiPolygon) {
|
|
252
222
|
let acc = null;
|
|
253
223
|
for (const part of b.polygons) {
|
|
254
224
|
if (part.xpoints.length < 3)
|
|
255
225
|
continue;
|
|
256
|
-
const m =
|
|
226
|
+
const m = rasterizePolygon(sc(part.xpoints), sc(part.ypoints), sw, sh, scHoles(part.holes));
|
|
257
227
|
if (m)
|
|
258
228
|
acc = acc ? unionMasks(acc, m) : m;
|
|
259
229
|
}
|
|
@@ -279,23 +249,11 @@ export class RegionOpsService {
|
|
|
279
249
|
r.label = proto?.label ?? 'Region';
|
|
280
250
|
return r;
|
|
281
251
|
}
|
|
282
|
-
|
|
283
|
-
const poly = new Polygon();
|
|
284
|
-
poly.npoints = p.npoints;
|
|
285
|
-
poly.xpoints = p.xpoints.slice();
|
|
286
|
-
poly.ypoints = p.ypoints.slice();
|
|
287
|
-
poly.coordinates = p.coordinates.map((c) => c.slice());
|
|
288
|
-
poly.closed = p.closed;
|
|
289
|
-
poly.bezier = p.bezier;
|
|
290
|
-
if (p.holes)
|
|
291
|
-
poly.holes = p.holes.map((ring) => ring.map((pt) => pt.slice()));
|
|
292
|
-
return poly;
|
|
293
|
-
}
|
|
294
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionOpsService, deps: [{ token: i1.WandService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
252
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionOpsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
295
253
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionOpsService, providedIn: 'root' }); }
|
|
296
254
|
}
|
|
297
255
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionOpsService, decorators: [{
|
|
298
256
|
type: Injectable,
|
|
299
257
|
args: [{ providedIn: 'root' }]
|
|
300
|
-
}]
|
|
301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLW9wcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tb3BzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFZLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7OztBQUUxRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCOzs7Ozs7O09BT0c7YUFDcUIsa0JBQWEsR0FBRyxVQUFVLEFBQWIsQ0FBYztJQUVuRCxZQUFvQixJQUFpQjtRQUFqQixTQUFJLEdBQUosSUFBSSxDQUFhO0lBQUcsQ0FBQztJQUV6Qzs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFpQixFQUFFLFVBQWtCLEVBQUUsV0FBbUI7UUFDOUQsMEVBQTBFO1FBQzFFLDZFQUE2RTtRQUM3RSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLENB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RyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7OEdBcFFVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBREgsTUFBTTs7MkZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlZ2lvbiwgUmVjdGFuZ2xlLCBQb2x5Z29uLCBNdWx0aVBvbHlnb24gfSBmcm9tICcuL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgQkJveE1hc2ssIHVuaW9uTWFza3MsIHNpbXBsaWZ5UmluZyB9IGZyb20gJy4vbW9kZWxzL2dlb21ldHJ5JztcbmltcG9ydCB7IFdhbmRTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcblxuLyoqXG4gKiBQdXJlIChET00tZnJlZSkgcmVnaW9uIHNldC1vcGVyYXRpb25zIOKAlCBtZXJnZSAvIGludmVyc2UgLyB1bmdyb3VwIChqaXQtdWkjODUpLlxuICpcbiAqIFJhc3Rlci1iYXNlZCwgcmV1c2luZyB0aGUgd2FuZC9icnVzaCBtYXNrIHBpcGVsaW5lXG4gKiAoe0BsaW5rIFdhbmRTZXJ2aWNlLnJhc3Rlcml6ZVBvbHlnb259IOKGkiB7QGxpbmsgV2FuZFNlcnZpY2UubWFza1RvUG9seWdvbnN9KSxcbiAqIHNvIFwic2VsZWN0ICsgbWVyZ2VcIiB5aWVsZHMgdGhlIHNhbWUgZ2VvbWV0cnkgYXMgYnJ1c2hpbmcgcmVnaW9ucyB0b2dldGhlcjpcbiAqIG9uZSBlbmdpbmUsIG9uZSBzZXQgb2YgYmVoYXZpb3VycywgaG9sZXMgKyBtdWx0aS1wYXJ0IHJlc3VsdHMgZm9yIGZyZWUuXG4gKlxuICogRXZlcnkgbWV0aG9kIHRha2VzIHRoZSBjdXJyZW50IHJlZ2lvbnMgcGx1cyB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhbmQgcmV0dXJuc1xuICogbmV3IHtAbGluayBSZWdpb259KHMpOyBpdCBuZXZlciBtdXRhdGVzIHRoZSBzdG9yZS4gQ2FsbGVycyBjb21taXQgdGhlIHJlc3VsdFxuICogdGhyb3VnaCB0aGUgbm9ybWFsIHJlZ2lvbi13cml0ZSBwYXRoIChzbyB1bmRvL3JlZG8gYXBwbGllcykuIENvb3JkaW5hdGVzIGFyZVxuICogaW1hZ2UgcGl4ZWxzIHRocm91Z2hvdXQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVnaW9uT3BzU2VydmljZSB7XG4gIC8qKlxuICAgKiBMYXJnZXN0IHJhc3RlciAoaW4gcGl4ZWxzKSBhIHJlZ2lvbiBzZXQtb3Agd2lsbCBhbGxvY2F0ZSBvbiB0aGUgbWFpbiB0aHJlYWQuXG4gICAqIFNlbGVjdGlvbnMgd2hvc2UgY2xpcHBlZCBiYm94IGV4Y2VlZHMgdGhpcyBhcmUgcmFzdGVyaXplZCBhdCBhIHByb3BvcnRpb25hbFxuICAgKiBkb3duc2NhbGUgKHRoZW4gdGhlIHRyYWNlZCBnZW9tZXRyeSBpcyBzY2FsZWQgYmFjayksIHNvIG1lcmdlL2ludmVyc2Ugc3RheVxuICAgKiByZXNwb25zaXZlIG9uIGdpZ2FwaXhlbCBzbGlkZXMuIH4xNiBNUCBrZWVwcyB0aGUgc3luY2hyb25vdXMgY29udG91ciB0cmFjZVxuICAgKiB3ZWxsIHVuZGVyIGEgc2Vjb25kOyB0aGUgZG93bnNjYWxlIG9ubHkgYWZmZWN0cyBib3VuZGFyeSBmaWRlbGl0eSBvZiB2ZXJ5XG4gICAqIGxhcmdlLWV4dGVudCBzZWxlY3Rpb25zIChzbWFsbCBzZWxlY3Rpb25zIGtlZXAgZnVsbCByZXNvbHV0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9PUF9QSVhFTFMgPSAxNl8wMDBfMDAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd2FuZDogV2FuZFNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIEdlb21ldHJpYyB1bmlvbiBvZiBgcmVnaW9uc2AgaW50byBhIHNpbmdsZSByZWdpb246IGEge0BsaW5rIFBvbHlnb259IHdoZW5cbiAgICogdGhlIHVuaW9uIGlzIG9uZSBjb25uZWN0ZWQgcGllY2UsIGEge0BsaW5rIE11bHRpUG9seWdvbn0gd2hlbiBpdCBzdGF5c1xuICAgKiBkaXNqb2ludCwgd2l0aCBob2xlcyBwcmVzZXJ2ZWQuIFJldHVybnMgbnVsbCB3aGVuIG5vdGhpbmcgcmFzdGVyaXNlcyAoZS5nLlxuICAgKiBvbmx5IG9wZW4gcG9seWxpbmVzIHdlcmUgc2VsZWN0ZWQpLlxuICAgKi9cbiAgbWVyZ2UocmVnaW9uczogUmVnaW9uW10sIGltYWdlV2lkdGg6IG51bWJlciwgaW1hZ2VIZWlnaHQ6IG51bWJlcik6IFJlZ2lvbiB8IG51bGwge1xuICAgIC8vIFRoZSByYXN0ZXIgaXMgYm91bmRlZCBieSB0aGUgc2VsZWN0aW9uJ3MgYmJveCwgbm90IHRoZSBpbWFnZSDigJQgYnV0IG9uIGFcbiAgICAvLyB3aG9sZS1zbGlkZSBpbWFnZSBhIGxhcmdlLWV4dGVudCBzZWxlY3Rpb24gc3RpbGwgc3BhbnMgYmlsbGlvbnMgb2YgcGl4ZWxzLFxuICAgIC8vIHdoaWNoIGZyZWV6ZXMgKG9yIG92ZXJmbG93cyB0aGUgdHlwZWQtYXJyYXkgbGltaXQpIG9uIHRoZSBtYWluIHRocmVhZC5cbiAgICAvLyBSYXN0ZXJpemUgYXQgYSBjYXBwZWQgcmVzb2x1dGlvbiBhbmQgc2NhbGUgdGhlIHRyYWNlZCBwb2x5Z29ucyBiYWNrIHVwLlxuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5vcFJhc3RlclNjYWxlKHJlZ2lvbnMsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTtcbiAgICBjb25zdCBtYXNrID0gdGhpcy51bmlvbk1hc2socmVnaW9ucywgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQsIHNjYWxlKTtcbiAgICBpZiAoIW1hc2spIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN3ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChpbWFnZVdpZHRoICogc2NhbGUpKTtcbiAgICBjb25zdCBzaCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaW1hZ2VIZWlnaHQgKiBzY2FsZSkpO1xuICAgIGxldCBwb2x5cyA9IHRoaXMud2FuZC5tYXNrVG9Qb2x5Z29ucyhtYXNrLm1hc2ssIG1hc2suYncsIG1hc2suYmgsIHN3LCBzaCwgbWFzay5ieCwgbWFzay5ieSwgMSwgMSk7XG4gICAgaWYgKHNjYWxlICE9PSAxKSBwb2x5cyA9IHBvbHlzLm1hcCgocCkgPT4gdGhpcy5zY2FsZVBvbHlnb24ocCwgMSAvIHNjYWxlKSk7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uRnJvbVBhcnRzKHBvbHlzLCByZWdpb25zWzBdKTtcbiAgfVxuXG4gIC8qKiBEb3duc2NhbGUgZmFjdG9yICjiiaQgMSkga2VlcGluZyB0aGUgc2VsZWN0aW9uJ3MgY2xpcHBlZCBiYm94IHdpdGhpblxuICAgKiAge0BsaW5rIE1BWF9PUF9QSVhFTFN9OyAxIHdoZW4gaXQgYWxyZWFkeSBmaXRzLiAqL1xuICBwcml2YXRlIG9wUmFzdGVyU2NhbGUocmVnaW9uczogUmVnaW9uW10sIFc6IG51bWJlciwgSDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgbWluWCA9IEluZmluaXR5LCBtaW5ZID0gSW5maW5pdHksIG1heFggPSAtSW5maW5pdHksIG1heFkgPSAtSW5maW5pdHk7XG4gICAgY29uc3Qgc2NhbiA9ICh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB4IG9mIHhzKSB7IGlmICh4IDwgbWluWCkgbWluWCA9IHg7IGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7IH1cbiAgICAgIGZvciAoY29uc3QgeSBvZiB5cykgeyBpZiAoeSA8IG1pblkpIG1pblkgPSB5OyBpZiAoeSA+IG1heFkpIG1heFkgPSB5OyB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucyB8fCBbXSkge1xuICAgICAgY29uc3QgYiA9IHI/LmJvdW5kcztcbiAgICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSBzY2FuKFtiLngsIGIueCArIGIud2lkdGhdLCBbYi55LCBiLnkgKyBiLmhlaWdodF0pO1xuICAgICAgZWxzZSBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24pIHNjYW4oYi54cG9pbnRzLCBiLnlwb2ludHMpO1xuICAgICAgZWxzZSBpZiAoYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHNjYW4ocC54cG9pbnRzLCBwLnlwb2ludHMpO1xuICAgIH1cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtaW5YKSkgcmV0dXJuIDE7XG4gICAgY29uc3QgYncgPSBNYXRoLm1pbihXLCBtYXhYKSAtIE1hdGgubWF4KDAsIG1pblgpO1xuICAgIGNvbnN0IGJoID0gTWF0aC5taW4oSCwgbWF4WSkgLSBNYXRoLm1heCgwLCBtaW5ZKTtcbiAgICBjb25zdCBhcmVhID0gYncgKiBiaDtcbiAgICBpZiAoIShhcmVhID4gUmVnaW9uT3BzU2VydmljZS5NQVhfT1BfUElYRUxTKSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGguc3FydChSZWdpb25PcHNTZXJ2aWNlLk1BWF9PUF9QSVhFTFMgLyBhcmVhKTtcbiAgfVxuXG4gIC8qKiBBIGNvcHkgb2YgYHBgIHdpdGggZXZlcnkgY29vcmRpbmF0ZSAoYW5kIGhvbGUgY29vcmRpbmF0ZSkgbXVsdGlwbGllZCBieSBgc2AuICovXG4gIHByaXZhdGUgc2NhbGVQb2x5Z29uKHA6IFBvbHlnb24sIHM6IG51bWJlcik6IFBvbHlnb24ge1xuICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgIHBvbHkueHBvaW50cyA9IHAueHBvaW50cy5tYXAoKHgpID0+IHggKiBzKTtcbiAgICBwb2x5Lnlwb2ludHMgPSBwLnlwb2ludHMubWFwKCh5KSA9PiB5ICogcyk7XG4gICAgcG9seS5ucG9pbnRzID0gcG9seS54cG9pbnRzLmxlbmd0aDtcbiAgICBwb2x5LmNsb3NlZCA9IHAuY2xvc2VkO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBwb2x5Lnhwb2ludHMubWFwKCh4LCBpKSA9PiBbeCwgcG9seS55cG9pbnRzW2ldXSk7XG4gICAgaWYgKHAuaG9sZXMpIHBvbHkuaG9sZXMgPSBwLmhvbGVzLm1hcCgocmluZykgPT4gcmluZy5tYXAoKFt4LCB5XSkgPT4gW3ggKiBzLCB5ICogc10pKTtcbiAgICByZXR1cm4gcG9seTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGByZWdpb25zYCB3aXRoIHRoZWlyIGludmVyc2UgaW5zaWRlIHRoZSBpbWFnZSByZWN0YW5nbGU6IHRoZSBpbWFnZVxuICAgKiBtaW51cyB0aGUgc2VsZWN0aW9uJ3MgdW5pb24gKHRoZSBmb3JtZXIgcmVnaW9ucyBiZWNvbWUgaG9sZXMpLiBSZXR1cm5zIG51bGxcbiAgICogZm9yIGEgZGVnZW5lcmF0ZSBpbWFnZSBvciBhbiBlbXB0eSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIERvbmUgKnZlY3RvcmlhbGx5KiBzbyBpdCBzY2FsZXMgdG8gZ2lnYXBpeGVsIGltYWdlczogdGhlIHNlbGVjdGlvbiBpc1xuICAgKiB1bmlvbmVkIGZpcnN0IChyYXN0ZXIsIGJvdW5kZWQgYnkgdGhlIFJPSXMnIGV4dGVudCDigJQgbmV2ZXIgdGhlIHdob2xlIGltYWdlKSxcbiAgICogdGhlbiB0aGUgcmVzdWx0IGlzIHRoZSBpbWFnZSByZWN0YW5nbGUgYXMgdGhlIGV4dGVyaW9yIHdpdGggZWFjaCB1bmlvblxuICAgKiBjb21wb25lbnQncyBvdXRsaW5lIHB1bmNoZWQgb3V0IGFzIGEgaG9sZS4gQSBjb21wb25lbnQncyBvd24gaG9sZSAoYSBkb251dClcbiAgICogYmVjb21lcyBhIHNvbGlkIGlzbGFuZCBwYXJ0LiBPbmx5IHRoZSBpbWFnZSdzIGNvcm5lciBjb29yZGluYXRlcyBhcmUgdXNlZCDigJRcbiAgICogbm8gZnVsbC1pbWFnZSBidWZmZXIgaXMgZXZlciBhbGxvY2F0ZWQuXG4gICAqL1xuICBpbnZlcnNlKHJlZ2lvbnM6IFJlZ2lvbltdLCBpbWFnZVdpZHRoOiBudW1iZXIsIGltYWdlSGVpZ2h0OiBudW1iZXIpOiBSZWdpb24gfCBudWxsIHtcbiAgICBpZiAoaW1hZ2VXaWR0aCA8PSAwIHx8IGltYWdlSGVpZ2h0IDw9IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMubWVyZ2UocmVnaW9ucywgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpO1xuICAgIGlmICghbWVyZ2VkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb21wczogUG9seWdvbltdID0gbWVyZ2VkLmJvdW5kcyBpbnN0YW5jZW9mIE11bHRpUG9seWdvblxuICAgICAgPyBtZXJnZWQuYm91bmRzLnBvbHlnb25zXG4gICAgICA6IG1lcmdlZC5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uID8gW21lcmdlZC5ib3VuZHNdIDogW107XG4gICAgaWYgKGNvbXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBJbWFnZSByZWN0YW5nbGUgZXh0ZXJpb3Igd2l0aCBldmVyeSBjb21wb25lbnQgb3V0bGluZSBhcyBhIGhvbGUuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmluZ1BvbHlnb24oXG4gICAgICBbMCwgaW1hZ2VXaWR0aCwgaW1hZ2VXaWR0aCwgMF0sIFswLCAwLCBpbWFnZUhlaWdodCwgaW1hZ2VIZWlnaHRdKTtcbiAgICByZWN0LmhvbGVzID0gY29tcHMubWFwKChjKSA9PiBjLnhwb2ludHMubWFwKCh4LCBpKSA9PiBbeCwgYy55cG9pbnRzW2ldXSkpO1xuXG4gICAgLy8gRWFjaCBjb21wb25lbnQncyBvd24gaG9sZSAoZG9udXQgaW50ZXJpb3IpIGlzICpvdXRzaWRlKiB0aGUgcmVnaW9uLCBzbyBpdFxuICAgIC8vIHN0YXlzIHNvbGlkIGluIHRoZSBpbnZlcnNlIOKAlCBlbWl0IGl0IGFzIGl0cyBvd24gaXNsYW5kIHBhcnQuXG4gICAgY29uc3QgcGFydHM6IFBvbHlnb25bXSA9IFtyZWN0XTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY29tcHMpIHtcbiAgICAgIGlmIChjLmhvbGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBjLmhvbGVzKSB7XG4gICAgICAgICAgcGFydHMucHVzaCh0aGlzLnJpbmdQb2x5Z29uKHJpbmcubWFwKChwKSA9PiBwWzBdKSwgcmluZy5tYXAoKHApID0+IHBbMV0pKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYm91bmRzID0gcGFydHMubGVuZ3RoID09PSAxID8gcGFydHNbMF0gOiBPYmplY3QuYXNzaWduKG5ldyBNdWx0aVBvbHlnb24oKSwgeyBwb2x5Z29uczogcGFydHMgfSk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlZ2lvbihib3VuZHMsIHJlZ2lvbnNbMF0pO1xuICB9XG5cbiAgLyoqIEEgY2xvc2VkIHN0cmFpZ2h0LWVkZ2VkIFBvbHlnb24gZnJvbSBwYXJhbGxlbCBjb29yZCBhcnJheXMuICovXG4gIHByaXZhdGUgcmluZ1BvbHlnb24oeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10pOiBQb2x5Z29uIHtcbiAgICBjb25zdCBwID0gbmV3IFBvbHlnb24oKTtcbiAgICBwLnhwb2ludHMgPSB4cy5zbGljZSgpO1xuICAgIHAueXBvaW50cyA9IHlzLnNsaWNlKCk7XG4gICAgcC5ucG9pbnRzID0geHMubGVuZ3RoO1xuICAgIHAuY29vcmRpbmF0ZXMgPSB4cy5tYXAoKHgsIGkpID0+IFt4LCB5c1tpXV0pO1xuICAgIHAuY2xvc2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCBhIHJlZ2lvbiBpbnRvIGl0cyBkaXNqb2ludCBwYXJ0cyDigJQgb25lIHJlZ2lvbiBwZXIge0BsaW5rIE11bHRpUG9seWdvbn1cbiAgICogcGFydC4gQSBzaW5nbGUgY29ubmVjdGVkIHtAbGluayBQb2x5Z29ufS97QGxpbmsgUmVjdGFuZ2xlfSBoYXMgbm90aGluZyB0b1xuICAgKiBzcGxpdCBhbmQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkIChhcyBhIG9uZS1lbGVtZW50IGxpc3QpLlxuICAgKi9cbiAgdW5ncm91cChyZWdpb246IFJlZ2lvbik6IFJlZ2lvbltdIHtcbiAgICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgICBpZiAoYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikge1xuICAgICAgcmV0dXJuIGIucG9seWdvbnNcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC54cG9pbnRzLmxlbmd0aCA+PSAzKVxuICAgICAgICAubWFwKChwKSA9PiB0aGlzLm1ha2VSZWdpb24odGhpcy5jbG9uZVBvbHlnb24ocCksIHJlZ2lvbikpO1xuICAgIH1cbiAgICByZXR1cm4gW3JlZ2lvbl07XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHVuZ3JvdXBpbmcgYHJlZ2lvbmAgd291bGQgYWN0dWFsbHkgc3BsaXQgaXQgKOKJpTIgcGFydHMpLiAqL1xuICBjYW5Vbmdyb3VwKHJlZ2lvbjogUmVnaW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlZ2lvbi5ib3VuZHMgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24gJiYgcmVnaW9uLmJvdW5kcy5wb2x5Z29ucy5sZW5ndGggPiAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXBsaWZ5IGEgcmVnaW9uJ3Mgb3V0bGluZShzKSB3aXRoIERvdWdsYXPigJNQZXVja2VyIOKAlCBkcm9wIHZlcnRpY2VzIHdpdGhpblxuICAgKiBgYWx0aXR1ZGVQeGAgcGl4ZWxzIG9mIHRoZSBsaW5lIGJldHdlZW4gdGhlaXIga2VwdCBuZWlnaGJvdXJzLiBBcHBsaWVzIHRvXG4gICAqIHRoZSBleHRlcmlvciBhbmQgZXZlcnkgaG9sZSwgb2YgYSBwb2x5Z29uIG9yIGVhY2ggcGFydCBvZiBhIE11bHRpUG9seWdvbjsgYVxuICAgKiByaW5nIHRoYXQgd291bGQgZGVnZW5lcmF0ZSBiZWxvdyBhIHRyaWFuZ2xlIGlzIGxlZnQgYXQgaXRzIHByZXZpb3VzIGRldGFpbFxuICAgKiAodGhlIHBhcnQvaG9sZSBpcyBrZXB0LCBub3QgZHJvcHBlZCkuIFJlY3RhbmdsZXMgYW5kIG9wZW4gcG9seWxpbmVzIGFyZVxuICAgKiByZXR1cm5lZCB1bmNoYW5nZWQuIFJlc3VsdCBpcyBhbHdheXMgYSBzdHJhaWdodC1lZGdlZCBwb2x5Z29uIChhbnkgQsOpemllclxuICAgKiBzbW9vdGhpbmcgaXMgZHJvcHBlZCwgc2luY2UgdGhlIGFuY2hvciBzZXQgY2hhbmdlcykuXG4gICAqL1xuICBzaW1wbGlmeShyZWdpb246IFJlZ2lvbiwgYWx0aXR1ZGVQeDogbnVtYmVyKTogUmVnaW9uIHtcbiAgICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgICBpZiAoIShhbHRpdHVkZVB4ID4gMCkpIHJldHVybiByZWdpb247XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uICYmIGIuY2xvc2VkICE9PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFrZVJlZ2lvbih0aGlzLnNpbXBsaWZ5UG9seWdvbihiLCBhbHRpdHVkZVB4KSwgcmVnaW9uKTtcbiAgICB9XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICAgIGNvbnN0IG1wID0gbmV3IE11bHRpUG9seWdvbigpO1xuICAgICAgbXAucG9seWdvbnMgPSBiLnBvbHlnb25zLm1hcCgocCkgPT4gdGhpcy5zaW1wbGlmeVBvbHlnb24ocCwgYWx0aXR1ZGVQeCkpO1xuICAgICAgcmV0dXJuIHRoaXMubWFrZVJlZ2lvbihtcCwgcmVnaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lvbjtcbiAgfVxuXG4gIC8qKiBEb3VnbGFz4oCTUGV1Y2tlciB0aGUgZXh0ZXJpb3IgKyBlYWNoIGhvbGUgb2Ygb25lIHBvbHlnb24uIEEgcmluZyB0aGF0XG4gICAqICBjb2xsYXBzZXMgYmVsb3cgMyB2ZXJ0aWNlcyBrZWVwcyBpdHMgb3JpZ2luYWwgcG9pbnRzIChuZXZlciBkZWdlbmVyYXRlcykuICovXG4gIHByaXZhdGUgc2ltcGxpZnlQb2x5Z29uKHA6IFBvbHlnb24sIGVwczogbnVtYmVyKTogUG9seWdvbiB7XG4gICAgY29uc3Qga2VlcE9yU3JjID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKTogeyB4czogbnVtYmVyW107IHlzOiBudW1iZXJbXSB9ID0+IHtcbiAgICAgIGNvbnN0IHMgPSBzaW1wbGlmeVJpbmcoeHMsIHlzLCBlcHMpO1xuICAgICAgcmV0dXJuIHMueHMubGVuZ3RoID49IDMgPyBzIDogeyB4czogeHMuc2xpY2UoKSwgeXM6IHlzLnNsaWNlKCkgfTtcbiAgICB9O1xuICAgIGNvbnN0IGV4dCA9IGtlZXBPclNyYyhwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0gZXh0LnhzLmxlbmd0aDtcbiAgICBwb2x5Lnhwb2ludHMgPSBleHQueHM7XG4gICAgcG9seS55cG9pbnRzID0gZXh0LnlzO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBleHQueHMubWFwKCh4LCBpKSA9PiBbeCwgZXh0LnlzW2ldXSk7XG4gICAgcG9seS5jbG9zZWQgPSB0cnVlO1xuICAgIGlmIChwLmhvbGVzKSB7XG4gICAgICBjb25zdCBob2xlcyA9IHAuaG9sZXMubWFwKChyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBrZWVwT3JTcmMocmluZy5tYXAoKHEpID0+IHFbMF0pLCByaW5nLm1hcCgocSkgPT4gcVsxXSkpO1xuICAgICAgICByZXR1cm4gcy54cy5tYXAoKHgsIGkpID0+IFt4LCBzLnlzW2ldXSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChob2xlcy5sZW5ndGgpIHBvbHkuaG9sZXMgPSBob2xlcztcbiAgICB9XG4gICAgcmV0dXJuIHBvbHk7XG4gIH1cblxuICAvLyDilIDilIAgaW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBVbmlvbiBvZiBldmVyeSByZWdpb24ncyBmaWxsZWQgbWFzayAoZXh0ZXJpb3IgbWludXMgaG9sZXMpLCBvciBudWxsLlxuICAgKiAgYHNjYWxlYCAo4omkIDEpIGRvd25zY2FsZXMgdGhlIHJhc3RlciBmb3IgbGFyZ2Ugc2VsZWN0aW9uczsgY29vcmRpbmF0ZXMgYW5kXG4gICAqICB0aGUgY2xpcCBib3VuZHMgYXJlIHNjYWxlZCB0byBtYXRjaC4gKi9cbiAgcHJpdmF0ZSB1bmlvbk1hc2socmVnaW9uczogUmVnaW9uW10sIFc6IG51bWJlciwgSDogbnVtYmVyLCBzY2FsZSA9IDEpOiBCQm94TWFzayB8IG51bGwge1xuICAgIGxldCBhY2M6IEJCb3hNYXNrIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgcmVnaW9ucyB8fCBbXSkge1xuICAgICAgY29uc3QgbSA9IHRoaXMucmFzdGVyaXplUmVnaW9uKHJlZ2lvbiwgVywgSCwgc2NhbGUpO1xuICAgICAgaWYgKCFtKSBjb250aW51ZTtcbiAgICAgIGFjYyA9IGFjYyA/IHVuaW9uTWFza3MoYWNjLCBtKSA6IG07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH1cblxuICAvKiogUmFzdGVyaXNlIGFueSByZWdpb24gKHJlY3QgLyBjbG9zZWQgcG9seWdvbiAvIG11bHRpLXBvbHlnb24sIGhvbGVzIHB1bmNoZWRcbiAgICogIG91dCkgaW50byBhIGJib3ggbWFzay4gTnVsbCBmb3Igb3BlbiBwb2x5bGluZXMgb3IgZGVnZW5lcmF0ZSBnZW9tZXRyeS5cbiAgICogIGBzY2FsZWAgKOKJpCAxKSBzaHJpbmtzIHRoZSBjb29yZGluYXRlcyBhbmQgY2xpcCBib3VuZHMgZm9yIGEgZG93bnNjYWxlZCByYXN0ZXIuICovXG4gIHByaXZhdGUgcmFzdGVyaXplUmVnaW9uKHJlZ2lvbjogUmVnaW9uLCBXOiBudW1iZXIsIEg6IG51bWJlciwgc2NhbGUgPSAxKTogQkJveE1hc2sgfCBudWxsIHtcbiAgICBjb25zdCBzdyA9IHNjYWxlID09PSAxID8gVyA6IE1hdGgubWF4KDEsIE1hdGgucm91bmQoVyAqIHNjYWxlKSk7XG4gICAgY29uc3Qgc2ggPSBzY2FsZSA9PT0gMSA/IEggOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKEggKiBzY2FsZSkpO1xuICAgIGNvbnN0IHNjID0gKGFycjogbnVtYmVyW10pID0+IChzY2FsZSA9PT0gMSA/IGFyciA6IGFyci5tYXAoKHYpID0+IHYgKiBzY2FsZSkpO1xuICAgIGNvbnN0IHNjSG9sZXMgPSAoaG9sZXM/OiBudW1iZXJbXVtdW10pID0+XG4gICAgICAhaG9sZXMgfHwgc2NhbGUgPT09IDEgPyBob2xlcyA6IGhvbGVzLm1hcCgocmluZykgPT4gcmluZy5tYXAoKFt4LCB5XSkgPT4gW3ggKiBzY2FsZSwgeSAqIHNjYWxlXSkpO1xuICAgIGNvbnN0IGIgPSByZWdpb24/LmJvdW5kcztcbiAgICBpZiAoYiBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgY29uc3QgeHMgPSBbYi54LCBiLnggKyBiLndpZHRoLCBiLnggKyBiLndpZHRoLCBiLnhdO1xuICAgICAgY29uc3QgeXMgPSBbYi55LCBiLnksIGIueSArIGIuaGVpZ2h0LCBiLnkgKyBiLmhlaWdodF07XG4gICAgICByZXR1cm4gdGhpcy53YW5kLnJhc3Rlcml6ZVBvbHlnb24oc2MoeHMpLCBzYyh5cyksIHN3LCBzaCk7XG4gICAgfVxuICAgIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbikge1xuICAgICAgaWYgKGIuY2xvc2VkID09PSBmYWxzZSB8fCBiLnhwb2ludHMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGhpcy53YW5kLnJhc3Rlcml6ZVBvbHlnb24oc2MoYi54cG9pbnRzKSwgc2MoYi55cG9pbnRzKSwgc3csIHNoLCBzY0hvbGVzKGIuaG9sZXMpKTtcbiAgICB9XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICAgIGxldCBhY2M6IEJCb3hNYXNrIHwgbnVsbCA9IG51bGw7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgYi5wb2x5Z29ucykge1xuICAgICAgICBpZiAocGFydC54cG9pbnRzLmxlbmd0aCA8IDMpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBtID0gdGhpcy53YW5kLnJhc3Rlcml6ZVBvbHlnb24oc2MocGFydC54cG9pbnRzKSwgc2MocGFydC55cG9pbnRzKSwgc3csIHNoLCBzY0hvbGVzKHBhcnQuaG9sZXMpKTtcbiAgICAgICAgaWYgKG0pIGFjYyA9IGFjYyA/IHVuaW9uTWFza3MoYWNjLCBtKSA6IG07XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBXcmFwIHRyYWNlZCBwYXJ0cyBhcyBvbmUgcmVnaW9uIChQb2x5Z29uIGlmIHNpbmdsZSwgZWxzZSBNdWx0aVBvbHlnb24pLFxuICAgKiAgaW5oZXJpdGluZyBjb2xvdXIvbGFiZWwgZnJvbSBgcHJvdG9gLiBOdWxsIHdoZW4gdGhlcmUgYXJlIG5vIHBhcnRzLiAqL1xuICBwcml2YXRlIHJlZ2lvbkZyb21QYXJ0cyhwb2x5czogUG9seWdvbltdLCBwcm90bzogUmVnaW9uIHwgdW5kZWZpbmVkKTogUmVnaW9uIHwgbnVsbCB7XG4gICAgaWYgKCFwb2x5cyB8fCBwb2x5cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChwb2x5cy5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLm1ha2VSZWdpb24ocG9seXNbMF0sIHByb3RvKTtcbiAgICBjb25zdCBtcCA9IG5ldyBNdWx0aVBvbHlnb24oKTtcbiAgICBtcC5wb2x5Z29ucyA9IHBvbHlzO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZWdpb24obXAsIHByb3RvKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVJlZ2lvbihib3VuZHM6IFBvbHlnb24gfCBNdWx0aVBvbHlnb24sIHByb3RvOiBSZWdpb24gfCB1bmRlZmluZWQpOiBSZWdpb24ge1xuICAgIGNvbnN0IHIgPSBuZXcgUmVnaW9uKCk7XG4gICAgci5ib3VuZHMgPSBib3VuZHM7XG4gICAgci5jb2xvciA9IHByb3RvPy5jb2xvcjtcbiAgICByLmxhYmVsID0gcHJvdG8/LmxhYmVsID8/ICdSZWdpb24nO1xuICAgIHJldHVybiByO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZVBvbHlnb24ocDogUG9seWdvbik6IFBvbHlnb24ge1xuICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgIHBvbHkubnBvaW50cyA9IHAubnBvaW50cztcbiAgICBwb2x5Lnhwb2ludHMgPSBwLnhwb2ludHMuc2xpY2UoKTtcbiAgICBwb2x5Lnlwb2ludHMgPSBwLnlwb2ludHMuc2xpY2UoKTtcbiAgICBwb2x5LmNvb3JkaW5hdGVzID0gcC5jb29yZGluYXRlcy5tYXAoKGMpID0+IGMuc2xpY2UoKSk7XG4gICAgcG9seS5jbG9zZWQgPSBwLmNsb3NlZDtcbiAgICBwb2x5LmJlemllciA9IHAuYmV6aWVyO1xuICAgIGlmIChwLmhvbGVzKSBwb2x5LmhvbGVzID0gcC5ob2xlcy5tYXAoKHJpbmcpID0+IHJpbmcubWFwKChwdCkgPT4gcHQuc2xpY2UoKSkpO1xuICAgIHJldHVybiBwb2x5O1xuICB9XG59XG4iXX0=
|
|
258
|
+
}] });
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLW9wcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tb3BzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFZLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRWpGOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0I7Ozs7Ozs7T0FPRzthQUNxQixrQkFBYSxHQUFHLFVBQVUsQUFBYixDQUFjO0lBRW5EOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE9BQWlCLEVBQUUsVUFBa0IsRUFBRSxXQUFtQjtRQUM5RCwwRUFBMEU7UUFDMUUsNkVBQTZFO1FBQzdFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixJQUFJLEtBQUssR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFD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bmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSZWdpb24sIFJlY3RhbmdsZSwgUG9seWdvbiwgTXVsdGlQb2x5Z29uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IEJCb3hNYXNrLCByYXN0ZXJpemVQb2x5Z29uLCB1bmlvbk1hc2tzIH0gZnJvbSAnLi9nZW9tZXRyeS9yYXN0ZXInO1xuaW1wb3J0IHsgbWFza1RvUG9seWdvbnMgfSBmcm9tICcuL2dlb21ldHJ5L2NvbnRvdXInO1xuaW1wb3J0IHsgc2ltcGxpZnlSaW5nIH0gZnJvbSAnLi9nZW9tZXRyeS9yaW5nJztcbmltcG9ydCB7IGNsb25lUG9seWdvbiwgbWFrZVBvbHlnb24sIHJlY3RUb1JpbmcgfSBmcm9tICcuL21vZGVscy9wb2x5Z29uLWZhY3RvcnknO1xuXG4vKipcbiAqIFB1cmUgKERPTS1mcmVlKSByZWdpb24gc2V0LW9wZXJhdGlvbnMg4oCUIG1lcmdlIC8gaW52ZXJzZSAvIHVuZ3JvdXAgKGppdC11aSM4NSkuXG4gKlxuICogUmFzdGVyLWJhc2VkLCByZXVzaW5nIHRoZSB3YW5kL2JydXNoIG1hc2sgcGlwZWxpbmVcbiAqICh7QGxpbmsgcmFzdGVyaXplUG9seWdvbn0g4oaSIHtAbGluayBtYXNrVG9Qb2x5Z29uc30sIHRoZSBwdXJlIGBnZW9tZXRyeS9gIG1vZHVsZXMpLFxuICogc28gXCJzZWxlY3QgKyBtZXJnZVwiIHlpZWxkcyB0aGUgc2FtZSBnZW9tZXRyeSBhcyBicnVzaGluZyByZWdpb25zIHRvZ2V0aGVyOlxuICogb25lIGVuZ2luZSwgb25lIHNldCBvZiBiZWhhdmlvdXJzLCBob2xlcyArIG11bHRpLXBhcnQgcmVzdWx0cyBmb3IgZnJlZS5cbiAqXG4gKiBFdmVyeSBtZXRob2QgdGFrZXMgdGhlIGN1cnJlbnQgcmVnaW9ucyBwbHVzIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFuZCByZXR1cm5zXG4gKiBuZXcge0BsaW5rIFJlZ2lvbn0ocyk7IGl0IG5ldmVyIG11dGF0ZXMgdGhlIHN0b3JlLiBDYWxsZXJzIGNvbW1pdCB0aGUgcmVzdWx0XG4gKiB0aHJvdWdoIHRoZSBub3JtYWwgcmVnaW9uLXdyaXRlIHBhdGggKHNvIHVuZG8vcmVkbyBhcHBsaWVzKS4gQ29vcmRpbmF0ZXMgYXJlXG4gKiBpbWFnZSBwaXhlbHMgdGhyb3VnaG91dC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBSZWdpb25PcHNTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIExhcmdlc3QgcmFzdGVyIChpbiBwaXhlbHMpIGEgcmVnaW9uIHNldC1vcCB3aWxsIGFsbG9jYXRlIG9uIHRoZSBtYWluIHRocmVhZC5cbiAgICogU2VsZWN0aW9ucyB3aG9zZSBjbGlwcGVkIGJib3ggZXhjZWVkcyB0aGlzIGFyZSByYXN0ZXJpemVkIGF0IGEgcHJvcG9ydGlvbmFsXG4gICAqIGRvd25zY2FsZSAodGhlbiB0aGUgdHJhY2VkIGdlb21ldHJ5IGlzIHNjYWxlZCBiYWNrKSwgc28gbWVyZ2UvaW52ZXJzZSBzdGF5XG4gICAqIHJlc3BvbnNpdmUgb24gZ2lnYXBpeGVsIHNsaWRlcy4gfjE2IE1QIGtlZXBzIHRoZSBzeW5jaHJvbm91cyBjb250b3VyIHRyYWNlXG4gICAqIHdlbGwgdW5kZXIgYSBzZWNvbmQ7IHRoZSBkb3duc2NhbGUgb25seSBhZmZlY3RzIGJvdW5kYXJ5IGZpZGVsaXR5IG9mIHZlcnlcbiAgICogbGFyZ2UtZXh0ZW50IHNlbGVjdGlvbnMgKHNtYWxsIHNlbGVjdGlvbnMga2VlcCBmdWxsIHJlc29sdXRpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX09QX1BJWEVMUyA9IDE2XzAwMF8wMDA7XG5cbiAgLyoqXG4gICAqIEdlb21ldHJpYyB1bmlvbiBvZiBgcmVnaW9uc2AgaW50byBhIHNpbmdsZSByZWdpb246IGEge0BsaW5rIFBvbHlnb259IHdoZW5cbiAgICogdGhlIHVuaW9uIGlzIG9uZSBjb25uZWN0ZWQgcGllY2UsIGEge0BsaW5rIE11bHRpUG9seWdvbn0gd2hlbiBpdCBzdGF5c1xuICAgKiBkaXNqb2ludCwgd2l0aCBob2xlcyBwcmVzZXJ2ZWQuIFJldHVybnMgbnVsbCB3aGVuIG5vdGhpbmcgcmFzdGVyaXNlcyAoZS5nLlxuICAgKiBvbmx5IG9wZW4gcG9seWxpbmVzIHdlcmUgc2VsZWN0ZWQpLlxuICAgKi9cbiAgbWVyZ2UocmVnaW9uczogUmVnaW9uW10sIGltYWdlV2lkdGg6IG51bWJlciwgaW1hZ2VIZWlnaHQ6IG51bWJlcik6IFJlZ2lvbiB8IG51bGwge1xuICAgIC8vIFRoZSByYXN0ZXIgaXMgYm91bmRlZCBieSB0aGUgc2VsZWN0aW9uJ3MgYmJveCwgbm90IHRoZSBpbWFnZSDigJQgYnV0IG9uIGFcbiAgICAvLyB3aG9sZS1zbGlkZSBpbWFnZSBhIGxhcmdlLWV4dGVudCBzZWxlY3Rpb24gc3RpbGwgc3BhbnMgYmlsbGlvbnMgb2YgcGl4ZWxzLFxuICAgIC8vIHdoaWNoIGZyZWV6ZXMgKG9yIG92ZXJmbG93cyB0aGUgdHlwZWQtYXJyYXkgbGltaXQpIG9uIHRoZSBtYWluIHRocmVhZC5cbiAgICAvLyBSYXN0ZXJpemUgYXQgYSBjYXBwZWQgcmVzb2x1dGlvbiBhbmQgc2NhbGUgdGhlIHRyYWNlZCBwb2x5Z29ucyBiYWNrIHVwLlxuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5vcFJhc3RlclNjYWxlKHJlZ2lvbnMsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTtcbiAgICBjb25zdCBtYXNrID0gdGhpcy51bmlvbk1hc2socmVnaW9ucywgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQsIHNjYWxlKTtcbiAgICBpZiAoIW1hc2spIHJldHVybiBudWxsO1xuICAgIGxldCBwb2x5cyA9IG1hc2tUb1BvbHlnb25zKG1hc2subWFzaywgbWFzay5idywgbWFzay5iaCwgbWFzay5ieCwgbWFzay5ieSwgMSwgMSk7XG4gICAgaWYgKHNjYWxlICE9PSAxKSBwb2x5cyA9IHBvbHlzLm1hcCgocCkgPT4gdGhpcy5zY2FsZVBvbHlnb24ocCwgMSAvIHNjYWxlKSk7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uRnJvbVBhcnRzKHBvbHlzLCByZWdpb25zWzBdKTtcbiAgfVxuXG4gIC8qKiBEb3duc2NhbGUgZmFjdG9yICjiiaQgMSkga2VlcGluZyB0aGUgc2VsZWN0aW9uJ3MgY2xpcHBlZCBiYm94IHdpdGhpblxuICAgKiAge0BsaW5rIE1BWF9PUF9QSVhFTFN9OyAxIHdoZW4gaXQgYWxyZWFkeSBmaXRzLiAqL1xuICBwcml2YXRlIG9wUmFzdGVyU2NhbGUocmVnaW9uczogUmVnaW9uW10sIFc6IG51bWJlciwgSDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgbWluWCA9IEluZmluaXR5LFxuICAgICAgbWluWSA9IEluZmluaXR5LFxuICAgICAgbWF4WCA9IC1JbmZpbml0eSxcbiAgICAgIG1heFkgPSAtSW5maW5pdHk7XG4gICAgY29uc3Qgc2NhbiA9ICh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHkgb2YgeXMpIHtcbiAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiByZWdpb25zIHx8IFtdKSB7XG4gICAgICBjb25zdCBiID0gcj8uYm91bmRzO1xuICAgICAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHNjYW4oW2IueCwgYi54ICsgYi53aWR0aF0sIFtiLnksIGIueSArIGIuaGVpZ2h0XSk7XG4gICAgICBlbHNlIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbikgc2NhbihiLnhwb2ludHMsIGIueXBvaW50cyk7XG4gICAgICBlbHNlIGlmIChiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSBmb3IgKGNvbnN0IHAgb2YgYi5wb2x5Z29ucykgc2NhbihwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgfVxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1pblgpKSByZXR1cm4gMTtcbiAgICBjb25zdCBidyA9IE1hdGgubWluKFcsIG1heFgpIC0gTWF0aC5tYXgoMCwgbWluWCk7XG4gICAgY29uc3QgYmggPSBNYXRoLm1pbihILCBtYXhZKSAtIE1hdGgubWF4KDAsIG1pblkpO1xuICAgIGNvbnN0IGFyZWEgPSBidyAqIGJoO1xuICAgIGlmICghKGFyZWEgPiBSZWdpb25PcHNTZXJ2aWNlLk1BWF9PUF9QSVhFTFMpKSByZXR1cm4gMTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KFJlZ2lvbk9wc1NlcnZpY2UuTUFYX09QX1BJWEVMUyAvIGFyZWEpO1xuICB9XG5cbiAgLyoqIEEgY29weSBvZiBgcGAgd2l0aCBldmVyeSBjb29yZGluYXRlIChhbmQgaG9sZSBjb29yZGluYXRlKSBtdWx0aXBsaWVkIGJ5IGBzYC4gKi9cbiAgcHJpdmF0ZSBzY2FsZVBvbHlnb24ocDogUG9seWdvbiwgczogbnVtYmVyKTogUG9seWdvbiB7XG4gICAgcmV0dXJuIG1ha2VQb2x5Z29uKFxuICAgICAgcC54cG9pbnRzLm1hcCgoeCkgPT4geCAqIHMpLFxuICAgICAgcC55cG9pbnRzLm1hcCgoeSkgPT4geSAqIHMpLFxuICAgICAge1xuICAgICAgICBjbG9zZWQ6IHAuY2xvc2VkLFxuICAgICAgICBob2xlczogcC5ob2xlcz8ubWFwKChyaW5nKSA9PiByaW5nLm1hcCgoW3gsIHldKSA9PiBbeCAqIHMsIHkgKiBzXSkpLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgYHJlZ2lvbnNgIHdpdGggdGhlaXIgaW52ZXJzZSBpbnNpZGUgdGhlIGltYWdlIHJlY3RhbmdsZTogdGhlIGltYWdlXG4gICAqIG1pbnVzIHRoZSBzZWxlY3Rpb24ncyB1bmlvbiAodGhlIGZvcm1lciByZWdpb25zIGJlY29tZSBob2xlcykuIFJldHVybnMgbnVsbFxuICAgKiBmb3IgYSBkZWdlbmVyYXRlIGltYWdlIG9yIGFuIGVtcHR5IHNlbGVjdGlvbi5cbiAgICpcbiAgICogRG9uZSAqdmVjdG9yaWFsbHkqIHNvIGl0IHNjYWxlcyB0byBnaWdhcGl4ZWwgaW1hZ2VzOiB0aGUgc2VsZWN0aW9uIGlzXG4gICAqIHVuaW9uZWQgZmlyc3QgKHJhc3RlciwgYm91bmRlZCBieSB0aGUgUk9JcycgZXh0ZW50IOKAlCBuZXZlciB0aGUgd2hvbGUgaW1hZ2UpLFxuICAgKiB0aGVuIHRoZSByZXN1bHQgaXMgdGhlIGltYWdlIHJlY3RhbmdsZSBhcyB0aGUgZXh0ZXJpb3Igd2l0aCBlYWNoIHVuaW9uXG4gICAqIGNvbXBvbmVudCdzIG91dGxpbmUgcHVuY2hlZCBvdXQgYXMgYSBob2xlLiBBIGNvbXBvbmVudCdzIG93biBob2xlIChhIGRvbnV0KVxuICAgKiBiZWNvbWVzIGEgc29saWQgaXNsYW5kIHBhcnQuIE9ubHkgdGhlIGltYWdlJ3MgY29ybmVyIGNvb3JkaW5hdGVzIGFyZSB1c2VkIOKAlFxuICAgKiBubyBmdWxsLWltYWdlIGJ1ZmZlciBpcyBldmVyIGFsbG9jYXRlZC5cbiAgICovXG4gIGludmVyc2UocmVnaW9uczogUmVnaW9uW10sIGltYWdlV2lkdGg6IG51bWJlciwgaW1hZ2VIZWlnaHQ6IG51bWJlcik6IFJlZ2lvbiB8IG51bGwge1xuICAgIGlmIChpbWFnZVdpZHRoIDw9IDAgfHwgaW1hZ2VIZWlnaHQgPD0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWVyZ2VkID0gdGhpcy5tZXJnZShyZWdpb25zLCBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCk7XG4gICAgaWYgKCFtZXJnZWQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbXBzOiBQb2x5Z29uW10gPVxuICAgICAgbWVyZ2VkLmJvdW5kcyBpbnN0YW5jZW9mIE11bHRpUG9seWdvblxuICAgICAgICA/IG1lcmdlZC5ib3VuZHMucG9seWdvbnNcbiAgICAgICAgOiBtZXJnZWQuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvblxuICAgICAgICAgID8gW21lcmdlZC5ib3VuZHNdXG4gICAgICAgICAgOiBbXTtcbiAgICBpZiAoY29tcHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEltYWdlIHJlY3RhbmdsZSBleHRlcmlvciB3aXRoIGV2ZXJ5IGNvbXBvbmVudCBvdXRsaW5lIGFzIGEgaG9sZS5cbiAgICBjb25zdCByZWN0ID0gbWFrZVBvbHlnb24oWzAsIGltYWdlV2lkdGgsIGltYWdlV2lkdGgsIDBdLCBbMCwgMCwgaW1hZ2VIZWlnaHQsIGltYWdlSGVpZ2h0XSk7XG4gICAgcmVjdC5ob2xlcyA9IGNvbXBzLm1hcCgoYykgPT4gYy54cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIGMueXBvaW50c1tpXV0pKTtcblxuICAgIC8vIEVhY2ggY29tcG9uZW50J3Mgb3duIGhvbGUgKGRvbnV0IGludGVyaW9yKSBpcyAqb3V0c2lkZSogdGhlIHJlZ2lvbiwgc28gaXRcbiAgICAvLyBzdGF5cyBzb2xpZCBpbiB0aGUgaW52ZXJzZSDigJQgZW1pdCBpdCBhcyBpdHMgb3duIGlzbGFuZCBwYXJ0LlxuICAgIGNvbnN0IHBhcnRzOiBQb2x5Z29uW10gPSBbcmVjdF07XG4gICAgZm9yIChjb25zdCBjIG9mIGNvbXBzKSB7XG4gICAgICBpZiAoYy5ob2xlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgYy5ob2xlcykge1xuICAgICAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICAgICBtYWtlUG9seWdvbihcbiAgICAgICAgICAgICAgcmluZy5tYXAoKHApID0+IHBbMF0pLFxuICAgICAgICAgICAgICByaW5nLm1hcCgocCkgPT4gcFsxXSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYm91bmRzID0gcGFydHMubGVuZ3RoID09PSAxID8gcGFydHNbMF0gOiBPYmplY3QuYXNzaWduKG5ldyBNdWx0aVBvbHlnb24oKSwgeyBwb2x5Z29uczogcGFydHMgfSk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlZ2lvbihib3VuZHMsIHJlZ2lvbnNbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IGEgcmVnaW9uIGludG8gaXRzIGRpc2pvaW50IHBhcnRzIOKAlCBvbmUgcmVnaW9uIHBlciB7QGxpbmsgTXVsdGlQb2x5Z29ufVxuICAgKiBwYXJ0LiBBIHNpbmdsZSBjb25uZWN0ZWQge0BsaW5rIFBvbHlnb259L3tAbGluayBSZWN0YW5nbGV9IGhhcyBub3RoaW5nIHRvXG4gICAqIHNwbGl0IGFuZCBpcyByZXR1cm5lZCB1bmNoYW5nZWQgKGFzIGEgb25lLWVsZW1lbnQgbGlzdCkuXG4gICAqL1xuICB1bmdyb3VwKHJlZ2lvbjogUmVnaW9uKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICAgIGlmIChiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSB7XG4gICAgICByZXR1cm4gYi5wb2x5Z29ucy5maWx0ZXIoKHApID0+IHAueHBvaW50cy5sZW5ndGggPj0gMykubWFwKChwKSA9PiB0aGlzLm1ha2VSZWdpb24oY2xvbmVQb2x5Z29uKHApLCByZWdpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZWdpb25dO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB1bmdyb3VwaW5nIGByZWdpb25gIHdvdWxkIGFjdHVhbGx5IHNwbGl0IGl0ICjiiaUyIHBhcnRzKS4gKi9cbiAgY2FuVW5ncm91cChyZWdpb246IFJlZ2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWdpb24uYm91bmRzIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uICYmIHJlZ2lvbi5ib3VuZHMucG9seWdvbnMubGVuZ3RoID4gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW1wbGlmeSBhIHJlZ2lvbidzIG91dGxpbmUocykgd2l0aCBEb3VnbGFz4oCTUGV1Y2tlciDigJQgZHJvcCB2ZXJ0aWNlcyB3aXRoaW5cbiAgICogYGFsdGl0dWRlUHhgIHBpeGVscyBvZiB0aGUgbGluZSBiZXR3ZWVuIHRoZWlyIGtlcHQgbmVpZ2hib3Vycy4gQXBwbGllcyB0b1xuICAgKiB0aGUgZXh0ZXJpb3IgYW5kIGV2ZXJ5IGhvbGUsIG9mIGEgcG9seWdvbiBvciBlYWNoIHBhcnQgb2YgYSBNdWx0aVBvbHlnb247IGFcbiAgICogcmluZyB0aGF0IHdvdWxkIGRlZ2VuZXJhdGUgYmVsb3cgYSB0cmlhbmdsZSBpcyBsZWZ0IGF0IGl0cyBwcmV2aW91cyBkZXRhaWxcbiAgICogKHRoZSBwYXJ0L2hvbGUgaXMga2VwdCwgbm90IGRyb3BwZWQpLiBSZWN0YW5nbGVzIGFuZCBvcGVuIHBvbHlsaW5lcyBhcmVcbiAgICogcmV0dXJuZWQgdW5jaGFuZ2VkLiBSZXN1bHQgaXMgYWx3YXlzIGEgc3RyYWlnaHQtZWRnZWQgcG9seWdvbiAoYW55IELDqXppZXJcbiAgICogc21vb3RoaW5nIGlzIGRyb3BwZWQsIHNpbmNlIHRoZSBhbmNob3Igc2V0IGNoYW5nZXMpLlxuICAgKi9cbiAgc2ltcGxpZnkocmVnaW9uOiBSZWdpb24sIGFsdGl0dWRlUHg6IG51bWJlcik6IFJlZ2lvbiB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgaWYgKCEoYWx0aXR1ZGVQeCA+IDApKSByZXR1cm4gcmVnaW9uO1xuICAgIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbiAmJiBiLmNsb3NlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ha2VSZWdpb24odGhpcy5zaW1wbGlmeVBvbHlnb24oYiwgYWx0aXR1ZGVQeCksIHJlZ2lvbik7XG4gICAgfVxuICAgIGlmIChiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSB7XG4gICAgICBjb25zdCBtcCA9IG5ldyBNdWx0aVBvbHlnb24oKTtcbiAgICAgIG1wLnBvbHlnb25zID0gYi5wb2x5Z29ucy5tYXAoKHApID0+IHRoaXMuc2ltcGxpZnlQb2x5Z29uKHAsIGFsdGl0dWRlUHgpKTtcbiAgICAgIHJldHVybiB0aGlzLm1ha2VSZWdpb24obXAsIHJlZ2lvbik7XG4gICAgfVxuICAgIHJldHVybiByZWdpb247XG4gIH1cblxuICAvKiogRG91Z2xhc+KAk1BldWNrZXIgdGhlIGV4dGVyaW9yICsgZWFjaCBob2xlIG9mIG9uZSBwb2x5Z29uLiBBIHJpbmcgdGhhdFxuICAgKiAgY29sbGFwc2VzIGJlbG93IDMgdmVydGljZXMga2VlcHMgaXRzIG9yaWdpbmFsIHBvaW50cyAobmV2ZXIgZGVnZW5lcmF0ZXMpLiAqL1xuICBwcml2YXRlIHNpbXBsaWZ5UG9seWdvbihwOiBQb2x5Z29uLCBlcHM6IG51bWJlcik6IFBvbHlnb24ge1xuICAgIGNvbnN0IGtlZXBPclNyYyA9ICh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSk6IHsgeHM6IG51bWJlcltdOyB5czogbnVtYmVyW10gfSA9PiB7XG4gICAgICBjb25zdCBzID0gc2ltcGxpZnlSaW5nKHhzLCB5cywgZXBzKTtcbiAgICAgIHJldHVybiBzLnhzLmxlbmd0aCA+PSAzID8gcyA6IHsgeHM6IHhzLnNsaWNlKCksIHlzOiB5cy5zbGljZSgpIH07XG4gICAgfTtcbiAgICBjb25zdCBleHQgPSBrZWVwT3JTcmMocC54cG9pbnRzLCBwLnlwb2ludHMpO1xuICAgIGNvbnN0IGhvbGVzID0gcC5ob2xlcz8ubWFwKChyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzID0ga2VlcE9yU3JjKFxuICAgICAgICByaW5nLm1hcCgocSkgPT4gcVswXSksXG4gICAgICAgIHJpbmcubWFwKChxKSA9PiBxWzFdKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gcy54cy5tYXAoKHgsIGkpID0+IFt4LCBzLnlzW2ldXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1ha2VQb2x5Z29uKGV4dC54cywgZXh0LnlzLCB7IGhvbGVzIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVW5pb24gb2YgZXZlcnkgcmVnaW9uJ3MgZmlsbGVkIG1hc2sgKGV4dGVyaW9yIG1pbnVzIGhvbGVzKSwgb3IgbnVsbC5cbiAgICogIGBzY2FsZWAgKOKJpCAxKSBkb3duc2NhbGVzIHRoZSByYXN0ZXIgZm9yIGxhcmdlIHNlbGVjdGlvbnM7IGNvb3JkaW5hdGVzIGFuZFxuICAgKiAgdGhlIGNsaXAgYm91bmRzIGFyZSBzY2FsZWQgdG8gbWF0Y2guICovXG4gIHByaXZhdGUgdW5pb25NYXNrKHJlZ2lvbnM6IFJlZ2lvbltdLCBXOiBudW1iZXIsIEg6IG51bWJlciwgc2NhbGUgPSAxKTogQkJveE1hc2sgfCBudWxsIHtcbiAgICBsZXQgYWNjOiBCQm94TWFzayB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHJlZ2lvbnMgfHwgW10pIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLnJhc3Rlcml6ZVJlZ2lvbihyZWdpb24sIFcsIEgsIHNjYWxlKTtcbiAgICAgIGlmICghbSkgY29udGludWU7XG4gICAgICBhY2MgPSBhY2MgPyB1bmlvbk1hc2tzKGFjYywgbSkgOiBtO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgLyoqIFJhc3RlcmlzZSBhbnkgcmVnaW9uIChyZWN0IC8gY2xvc2VkIHBvbHlnb24gLyBtdWx0aS1wb2x5Z29uLCBob2xlcyBwdW5jaGVkXG4gICAqICBvdXQpIGludG8gYSBiYm94IG1hc2suIE51bGwgZm9yIG9wZW4gcG9seWxpbmVzIG9yIGRlZ2VuZXJhdGUgZ2VvbWV0cnkuXG4gICAqICBgc2NhbGVgICjiiaQgMSkgc2hyaW5rcyB0aGUgY29vcmRpbmF0ZXMgYW5kIGNsaXAgYm91bmRzIGZvciBhIGRvd25zY2FsZWQgcmFzdGVyLiAqL1xuICBwcml2YXRlIHJhc3Rlcml6ZVJlZ2lvbihyZWdpb246IFJlZ2lvbiwgVzogbnVtYmVyLCBIOiBudW1iZXIsIHNjYWxlID0gMSk6IEJCb3hNYXNrIHwgbnVsbCB7XG4gICAgY29uc3Qgc3cgPSBzY2FsZSA9PT0gMSA/IFcgOiBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKFcgKiBzY2FsZSkpO1xuICAgIGNvbnN0IHNoID0gc2NhbGUgPT09IDEgPyBIIDogTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChIICogc2NhbGUpKTtcbiAgICBjb25zdCBzYyA9IChhcnI6IG51bWJlcltdKSA9PiAoc2NhbGUgPT09IDEgPyBhcnIgOiBhcnIubWFwKCh2KSA9PiB2ICogc2NhbGUpKTtcbiAgICBjb25zdCBzY0hvbGVzID0gKGhvbGVzPzogbnVtYmVyW11bXVtdKSA9PlxuICAgICAgIWhvbGVzIHx8IHNjYWxlID09PSAxID8gaG9sZXMgOiBob2xlcy5tYXAoKHJpbmcpID0+IHJpbmcubWFwKChbeCwgeV0pID0+IFt4ICogc2NhbGUsIHkgKiBzY2FsZV0pKTtcbiAgICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHM7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIGNvbnN0IHJpbmcgPSByZWN0VG9SaW5nKGIpO1xuICAgICAgcmV0dXJuIHJhc3Rlcml6ZVBvbHlnb24oc2MocmluZy54cyksIHNjKHJpbmcueXMpLCBzdywgc2gpO1xuICAgIH1cbiAgICBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24pIHtcbiAgICAgIGlmIChiLmNsb3NlZCA9PT0gZmFsc2UgfHwgYi54cG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHJhc3Rlcml6ZVBvbHlnb24oc2MoYi54cG9pbnRzKSwgc2MoYi55cG9pbnRzKSwgc3csIHNoLCBzY0hvbGVzKGIuaG9sZXMpKTtcbiAgICB9XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICAgIGxldCBhY2M6IEJCb3hNYXNrIHwgbnVsbCA9IG51bGw7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgYi5wb2x5Z29ucykge1xuICAgICAgICBpZiAocGFydC54cG9pbnRzLmxlbmd0aCA8IDMpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBtID0gcmFzdGVyaXplUG9seWdvbihzYyhwYXJ0Lnhwb2ludHMpLCBzYyhwYXJ0Lnlwb2ludHMpLCBzdywgc2gsIHNjSG9sZXMocGFydC5ob2xlcykpO1xuICAgICAgICBpZiAobSkgYWNjID0gYWNjID8gdW5pb25NYXNrcyhhY2MsIG0pIDogbTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFdyYXAgdHJhY2VkIHBhcnRzIGFzIG9uZSByZWdpb24gKFBvbHlnb24gaWYgc2luZ2xlLCBlbHNlIE11bHRpUG9seWdvbiksXG4gICAqICBpbmhlcml0aW5nIGNvbG91ci9sYWJlbCBmcm9tIGBwcm90b2AuIE51bGwgd2hlbiB0aGVyZSBhcmUgbm8gcGFydHMuICovXG4gIHByaXZhdGUgcmVnaW9uRnJvbVBhcnRzKHBvbHlzOiBQb2x5Z29uW10sIHByb3RvOiBSZWdpb24gfCB1bmRlZmluZWQpOiBSZWdpb24gfCBudWxsIHtcbiAgICBpZiAoIXBvbHlzIHx8IHBvbHlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHBvbHlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMubWFrZVJlZ2lvbihwb2x5c1swXSwgcHJvdG8pO1xuICAgIGNvbnN0IG1wID0gbmV3IE11bHRpUG9seWdvbigpO1xuICAgIG1wLnBvbHlnb25zID0gcG9seXM7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlZ2lvbihtcCwgcHJvdG8pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlUmVnaW9uKGJvdW5kczogUG9seWdvbiB8IE11bHRpUG9seWdvbiwgcHJvdG86IFJlZ2lvbiB8IHVuZGVmaW5lZCk6IFJlZ2lvbiB7XG4gICAgY29uc3QgciA9IG5ldyBSZWdpb24oKTtcbiAgICByLmJvdW5kcyA9IGJvdW5kcztcbiAgICByLmNvbG9yID0gcHJvdG8/LmNvbG9yO1xuICAgIHIubGFiZWwgPSBwcm90bz8ubGFiZWwgPz8gJ1JlZ2lvbic7XG4gICAgcmV0dXJuIHI7XG4gIH1cbn1cbiJdfQ==
|