@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +28 -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/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/sam.contract.mjs +1 -1
- 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/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -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 +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -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 +263 -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 +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -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 +182 -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 +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- 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 +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -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/classes-panel/classes-panel.component.mjs +99 -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 +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -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/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- 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 +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- 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 +114 -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 +81 -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 +68 -117
- 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 +60 -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.component.mjs +480 -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-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.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 -34430
- 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/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -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/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 +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -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 +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -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 +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -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 +89 -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 +121 -878
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -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 +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- 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 +80 -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 +18 -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 +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -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/classes-panel/classes-panel.component.d.ts +56 -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 +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -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 +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- 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 +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -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 +60 -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 +40 -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 +47 -83
- 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 +27 -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.component.d.ts +201 -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/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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseCssColor } from '../../contracts/color';
|
|
1
2
|
export class DisplayPipeline {
|
|
2
3
|
constructor(host) {
|
|
3
4
|
this.host = host;
|
|
@@ -5,10 +6,13 @@ export class DisplayPipeline {
|
|
|
5
6
|
/**
|
|
6
7
|
* Apply the current display pipeline to an RGBA buffer in place; returns
|
|
7
8
|
* whether any opaque pixel was written.
|
|
8
|
-
* - Grayscale: intensity → window
|
|
9
|
+
* - Grayscale: intensity → window → invert → gamma → colormap LUT.
|
|
9
10
|
* - RGB/multichannel: additive pseudo-colour merge — each visible channel's
|
|
10
|
-
*
|
|
11
|
-
* "Merge Channels")
|
|
11
|
+
* intensity (window → invert → gamma, see {@link channelIntensity}) is
|
|
12
|
+
* tinted by its assigned colour and summed (Fiji "Merge Channels"), then
|
|
13
|
+
* clamped. Invert is per channel, before the merge, as napari-js inverts
|
|
14
|
+
* each additive layer (NAPARI-BOUNDARY-2) — not the composite. Defaults
|
|
15
|
+
* (R=red, G=green, B=blue) are the identity.
|
|
12
16
|
*/
|
|
13
17
|
applyToRgba(d) {
|
|
14
18
|
let changed = false;
|
|
@@ -22,21 +26,24 @@ export class DisplayPipeline {
|
|
|
22
26
|
const wMin = ch ? ch.min : 0;
|
|
23
27
|
const wSpan = ch && ch.max > ch.min ? ch.max - ch.min : 255;
|
|
24
28
|
const invGamma = ch && ch.gamma > 0 ? 1 / ch.gamma : 1;
|
|
25
|
-
// Precompute raw(0..255) -> final RGB once (256 window+gamma+
|
|
29
|
+
// Precompute raw(0..255) -> final RGB once (256 window+invert+gamma+colormap
|
|
26
30
|
// evaluations) and map each pixel by table lookup — a Math.pow per pixel
|
|
27
31
|
// (~262k/tile) made the window/gamma sliders crawl on large stacks.
|
|
32
|
+
// The order is napari-js's `windowGamma` (window → invert → gamma), so the
|
|
33
|
+
// same channel state draws the same image under both backends; only the
|
|
34
|
+
// exponent differs by convention (ImageJ t^(1/γ) here, converted to
|
|
35
|
+
// napari's t^γ at the napari boundary).
|
|
28
36
|
const rL = new Uint8ClampedArray(256);
|
|
29
37
|
const gL = new Uint8ClampedArray(256);
|
|
30
38
|
const bL = new Uint8ClampedArray(256);
|
|
31
39
|
for (let raw = 0; raw < 256; raw++) {
|
|
32
40
|
let t = (raw - wMin) / wSpan;
|
|
33
41
|
t = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
42
|
+
if (invertBg)
|
|
43
|
+
t = 1 - t;
|
|
34
44
|
if (invGamma !== 1)
|
|
35
45
|
t = Math.pow(t, invGamma);
|
|
36
|
-
|
|
37
|
-
if (invertBg)
|
|
38
|
-
v = 255 - v;
|
|
39
|
-
const c = lut[v];
|
|
46
|
+
const c = lut[Math.round(t * 255)];
|
|
40
47
|
rL[raw] = c[0];
|
|
41
48
|
gL[raw] = c[1];
|
|
42
49
|
bL[raw] = c[2];
|
|
@@ -64,7 +71,7 @@ export class DisplayPipeline {
|
|
|
64
71
|
const c = chans[k];
|
|
65
72
|
if (c && !c.visible)
|
|
66
73
|
continue;
|
|
67
|
-
const v = this.channelIntensity(d[i + k], c);
|
|
74
|
+
const v = this.channelIntensity(d[i + k], c, invertBg);
|
|
68
75
|
const tint = tints[k];
|
|
69
76
|
oR += v * tint[0];
|
|
70
77
|
oG += v * tint[1];
|
|
@@ -76,11 +83,6 @@ export class DisplayPipeline {
|
|
|
76
83
|
oG = 255;
|
|
77
84
|
if (oB > 255)
|
|
78
85
|
oB = 255;
|
|
79
|
-
if (invertBg) {
|
|
80
|
-
oR = 255 - oR;
|
|
81
|
-
oG = 255 - oG;
|
|
82
|
-
oB = 255 - oB;
|
|
83
|
-
}
|
|
84
86
|
d[i] = oR;
|
|
85
87
|
d[i + 1] = oG;
|
|
86
88
|
d[i + 2] = oB;
|
|
@@ -89,55 +91,115 @@ export class DisplayPipeline {
|
|
|
89
91
|
}
|
|
90
92
|
return changed;
|
|
91
93
|
}
|
|
92
|
-
/** Precomputed lum(0..255) → tinted-RGB lookup for a channel's window/
|
|
93
|
-
* colour. Building it costs 256 channelIntensity() calls; using it makes a
|
|
94
|
+
/** Precomputed lum(0..255) → tinted-RGB lookup for a channel's window/invert/
|
|
95
|
+
* gamma/colour. Building it costs 256 channelIntensity() calls; using it makes a
|
|
94
96
|
* full-tile recolor ~262k array lookups instead of ~262k Math.pow() calls. */
|
|
95
97
|
channelRgbLut(st) {
|
|
96
98
|
const r = new Uint8ClampedArray(256);
|
|
97
99
|
const g = new Uint8ClampedArray(256);
|
|
98
100
|
const b = new Uint8ClampedArray(256);
|
|
99
101
|
const [tr, tg, tb] = this.tint01(st);
|
|
102
|
+
const invert = this.host.invertBg();
|
|
100
103
|
for (let lum = 0; lum < 256; lum++) {
|
|
101
|
-
const v = this.channelIntensity(lum, st);
|
|
104
|
+
const v = this.channelIntensity(lum, st, invert);
|
|
102
105
|
r[lum] = v * tr;
|
|
103
106
|
g[lum] = v * tg;
|
|
104
107
|
b[lum] = v * tb;
|
|
105
108
|
}
|
|
106
109
|
return { r, g, b };
|
|
107
110
|
}
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
111
|
+
/**
|
|
112
|
+
* Additive ('lighter') merge of single-band channel planes into one opaque
|
|
113
|
+
* RGBA image — what OSD's drawer shows for a per-channel image, where each
|
|
114
|
+
* channel tile is tinted by {@link channelRgbLut}. Hidden channels, missing
|
|
115
|
+
* planes and planes of another size contribute nothing. A plane is RGBA
|
|
116
|
+
* (`bands` 4, R=G=B, transparent pixels skipped) or one byte per pixel
|
|
117
|
+
* (`bands` 1). Used by the serverless multichannel compositor, the
|
|
118
|
+
* multichannel composite export and the Plotly image's channel display.
|
|
119
|
+
*/
|
|
120
|
+
compositeChannels(planes, states, bands = 4) {
|
|
121
|
+
const len = planes.find((p) => p && p.length)?.length ?? 0;
|
|
122
|
+
const out = new Uint8ClampedArray((len / bands) * 4);
|
|
123
|
+
for (let c = 0; c < planes.length; c++) {
|
|
124
|
+
const st = states[c];
|
|
125
|
+
const pd = planes[c];
|
|
126
|
+
if ((st && st.visible === false) || !pd || pd.length !== len)
|
|
127
|
+
continue;
|
|
128
|
+
this.addChannel(out, pd, st, bands);
|
|
129
|
+
}
|
|
130
|
+
for (let i = 3; i < out.length; i += 4)
|
|
131
|
+
out[i] = 255; // opaque
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
/** Add one single-band plane (RGBA or one byte per pixel, see
|
|
135
|
+
* {@link compositeChannels}), tinted by its channel state, onto `out`
|
|
136
|
+
* (Uint8ClampedArray clamps → additive 'lighter'). */
|
|
137
|
+
addChannel(out, plane, st, bands = 4) {
|
|
138
|
+
const { r, g, b } = this.channelRgbLut(st);
|
|
139
|
+
for (let i = 0, p = 0; i < out.length; i += 4, p += bands) {
|
|
140
|
+
if (bands === 4 && plane[p + 3] === 0)
|
|
141
|
+
continue;
|
|
142
|
+
const lum = plane[p]; // single-band plane (R=G=B)
|
|
143
|
+
out[i] += r[lum];
|
|
144
|
+
out[i + 1] += g[lum];
|
|
145
|
+
out[i + 2] += b[lum];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* A channel's display intensity (0..255, before its tint): window → invert →
|
|
150
|
+
* gamma, the order of napari-js's `windowGamma`, which every additive napari
|
|
151
|
+
* layer applies on its own before the layers are summed (NAPARI-BOUNDARY-2).
|
|
152
|
+
* The gamma exponent is the ImageJ one (t^(1/γ)). An empty window span maps to
|
|
153
|
+
* 0 before the invert; with no channel state the value passes through.
|
|
154
|
+
*/
|
|
155
|
+
channelIntensity(val, c, invert = false) {
|
|
156
|
+
let t;
|
|
157
|
+
if (!c) {
|
|
158
|
+
t = val / 255;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
const span = c.max > c.min ? c.max - c.min : 0;
|
|
162
|
+
t = span ? (val - c.min) / span : 0;
|
|
163
|
+
t = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
164
|
+
}
|
|
165
|
+
if (invert)
|
|
166
|
+
t = 1 - t;
|
|
167
|
+
if (c && c.gamma > 0 && c.gamma !== 1)
|
|
118
168
|
t = Math.pow(t, 1 / c.gamma);
|
|
119
169
|
return t * 255;
|
|
120
170
|
}
|
|
121
171
|
/** A channel's pseudo-colour tint as [r,g,b] in 0..1 (default white). */
|
|
122
172
|
tint01(c) {
|
|
123
|
-
const
|
|
124
|
-
return
|
|
173
|
+
const rgb = parseCssColor(c?.color);
|
|
174
|
+
return rgb ? [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255] : [1, 1, 1];
|
|
125
175
|
}
|
|
126
176
|
/** True when any RGB channel is windowed/hidden/gamma'd/re-tinted or the
|
|
127
177
|
* background is inverted — otherwise the tile passes through unchanged. */
|
|
128
178
|
rgbNeedsRecolor() {
|
|
129
|
-
|
|
179
|
+
return rgbNeedsRecolor(this.host.channelStates(), this.host.invertBg());
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** An RGB image's channels' tints when nothing re-tinted them: the identity merge. */
|
|
183
|
+
const RGB_DEFAULT_TINTS = ['#ff0000', '#00ff00', '#0000ff'];
|
|
184
|
+
/**
|
|
185
|
+
* Whether an RGB image's channel states (R, G, B) change how it looks: any band windowed, hidden,
|
|
186
|
+
* gamma'd or re-tinted, or the image inverted. False means the RGB pixels pass through as they
|
|
187
|
+
* are — every backend's cue to keep drawing the image directly.
|
|
188
|
+
*/
|
|
189
|
+
export function rgbNeedsRecolor(channelStates, invert) {
|
|
190
|
+
if (invert)
|
|
191
|
+
return true;
|
|
192
|
+
for (let k = 0; k < 3; k++) {
|
|
193
|
+
const c = channelStates[k];
|
|
194
|
+
if (c &&
|
|
195
|
+
(!c.visible ||
|
|
196
|
+
c.min !== 0 ||
|
|
197
|
+
c.max !== 255 ||
|
|
198
|
+
c.gamma !== 1 ||
|
|
199
|
+
(c.color || '').toLowerCase() !== RGB_DEFAULT_TINTS[k])) {
|
|
130
200
|
return true;
|
|
131
|
-
const defaults = ['#ff0000', '#00ff00', '#0000ff'];
|
|
132
|
-
const channelStates = this.host.channelStates();
|
|
133
|
-
for (let k = 0; k < 3; k++) {
|
|
134
|
-
const c = channelStates[k];
|
|
135
|
-
if (c && (!c.visible || c.min !== 0 || c.max !== 255 || c.gamma !== 1 ||
|
|
136
|
-
(c.color || '').toLowerCase() !== defaults[k])) {
|
|
137
|
-
return true;
|
|
138
|
-
}
|
|
139
201
|
}
|
|
140
|
-
return false;
|
|
141
202
|
}
|
|
203
|
+
return false;
|
|
142
204
|
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1waXBlbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL29zZC9kaXNwbGF5LXBpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSxNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUFvQixJQUF5QjtRQUF6QixTQUFJLEdBQUosSUFBSSxDQUFxQjtJQUFHLENBQUM7SUFFakQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxDQUFvQjtRQUM5QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDdkIsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzVELE1BQU0sUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENB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QUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2hELENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5cbi8qKlxuICogVGhlIE9TRCBwaXhlbCBkaXNwbGF5IHBpcGVsaW5lIChyZWZhY3RvcmluZyBwbGFuLCBTdGVwIDQg4oCUIGEgcHVyZSBtb3ZlIG9mXG4gKiB0aGUgcmVjb2xvciBtYXRoIG91dCBvZiB0aGUgdmlzdWFsaXplciBzZXJ2aWNlKS4gU3RhdGVsZXNzOiBldmVyeSBjYWxsIHJlYWRzXG4gKiB0aGUgY3VycmVudCBkaXNwbGF5IHN0YXRlIHRocm91Z2ggdGhlIGhvc3QgY2xvc3VyZXMsIGV4YWN0bHkgbGlrZSB0aGUgbW92ZWRcbiAqIGNvZGUgcmVhZCB0aGUgc2VydmljZSdzIGZpZWxkcy4gU2hhcmVkIGJ5IHRpbGUgcmVjb2xvcmluZyBhbmQgdGhlIGNvbXBvc2l0ZVxuICogZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGxheVBpcGVsaW5lSG9zdCB7XG4gIC8qKiBHcmF5c2NhbGUgaW1hZ2UgKGNvbG9ybWFwIExVVCBwYXRoKSB2cyBSR0IvbXVsdGljaGFubmVsIChhZGRpdGl2ZSB0aW50KS4gKi9cbiAgaXNHcmF5c2NhbGUoKTogYm9vbGVhbjtcbiAgLyoqIDI1Ni1lbnRyeSBjb2xvcm1hcCBMVVQgKGdyYXlzY2FsZSBwYXRoKTsgbnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmUuICovXG4gIGNvbG9yTHV0KCk6IFJnYltdIHwgbnVsbDtcbiAgLyoqIExhdGVzdCBwZXItY2hhbm5lbCBkaXNwbGF5IHN0YXRlIGZyb20gdGhlIHN0b3JlLiAqL1xuICBjaGFubmVsU3RhdGVzKCk6IElDaGFubmVsU3RhdGVbXTtcbiAgLyoqIEludmVydGVkIGJhY2tncm91bmQgKHdoaXRlID0gemVybykuICovXG4gIGludmVydEJnKCk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNwbGF5UGlwZWxpbmUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGhvc3Q6IERpc3BsYXlQaXBlbGluZUhvc3QpIHt9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBjdXJyZW50IGRpc3BsYXkgcGlwZWxpbmUgdG8gYW4gUkdCQSBidWZmZXIgaW4gcGxhY2U7IHJldHVybnNcbiAgICogd2hldGhlciBhbnkgb3BhcXVlIHBpeGVsIHdhcyB3cml0dGVuLlxuICAgKiAgLSBHcmF5c2NhbGU6IGludGVuc2l0eSDihpIgd2luZG93ICsgZ2FtbWEgKyBpbnZlcnQg4oaSIGNvbG9ybWFwIExVVC5cbiAgICogIC0gUkdCL211bHRpY2hhbm5lbDogYWRkaXRpdmUgcHNldWRvLWNvbG91ciBtZXJnZSDigJQgZWFjaCB2aXNpYmxlIGNoYW5uZWwnc1xuICAgKiAgICB3aW5kb3dlZCBpbnRlbnNpdHkgaXMgdGludGVkIGJ5IGl0cyBhc3NpZ25lZCBjb2xvdXIgYW5kIHN1bW1lZCAoRmlqaVxuICAgKiAgICBcIk1lcmdlIENoYW5uZWxzXCIpLiBEZWZhdWx0cyAoUj1yZWQsIEc9Z3JlZW4sIEI9Ymx1ZSkgYXJlIHRoZSBpZGVudGl0eS5cbiAgICovXG4gIGFwcGx5VG9SZ2JhKGQ6IFVpbnQ4Q2xhbXBlZEFycmF5KTogYm9vbGVhbiB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjaGFubmVsU3RhdGVzID0gdGhpcy5ob3N0LmNoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBpbnZlcnRCZyA9IHRoaXMuaG9zdC5pbnZlcnRCZygpO1xuICAgIGlmICh0aGlzLmhvc3QuaXNHcmF5c2NhbGUoKSkge1xuICAgICAgY29uc3QgbHV0ID0gdGhpcy5ob3N0LmNvbG9yTHV0KCk7XG4gICAgICBpZiAoIWx1dCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgY2ggPSBjaGFubmVsU3RhdGVzWzBdO1xuICAgICAgY29uc3Qgd01pbiA9IGNoID8gY2gubWluIDogMDtcbiAgICAgIGNvbnN0IHdTcGFuID0gY2ggJiYgY2gubWF4ID4gY2gubWluID8gY2gubWF4IC0gY2gubWluIDogMjU1O1xuICAgICAgY29uc3QgaW52R2FtbWEgPSBjaCAmJiBjaC5nYW1tYSA+IDAgPyAxIC8gY2guZ2FtbWEgOiAxO1xuICAgICAgLy8gUHJlY29tcHV0ZSByYXcoMC4uMjU1KSAtPiBmaW5hbCBSR0Igb25jZSAoMjU2IHdpbmRvdytnYW1tYStpbnZlcnQrY29sb3JtYXBcbiAgICAgIC8vIGV2YWx1YXRpb25zKSBhbmQgbWFwIGVhY2ggcGl4ZWwgYnkgdGFibGUgbG9va3VwIOKAlCBhIE1hdGgucG93IHBlciBwaXhlbFxuICAgICAgLy8gKH4yNjJrL3RpbGUpIG1hZGUgdGhlIHdpbmRvdy9nYW1tYSBzbGlkZXJzIGNyYXdsIG9uIGxhcmdlIHN0YWNrcy5cbiAgICAgIGNvbnN0IHJMID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDI1Nik7XG4gICAgICBjb25zdCBnTCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgyNTYpO1xuICAgICAgY29uc3QgYkwgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMjU2KTtcbiAgICAgIGZvciAobGV0IHJhdyA9IDA7IHJhdyA8IDI1NjsgcmF3KyspIHtcbiAgICAgICAgbGV0IHQgPSAocmF3IC0gd01pbikgLyB3U3BhbjtcbiAgICAgICAgdCA9IHQgPCAwID8gMCA6IHQgPiAxID8gMSA6IHQ7XG4gICAgICAgIGlmIChpbnZHYW1tYSAhPT0gMSkgdCA9IE1hdGgucG93KHQsIGludkdhbW1hKTtcbiAgICAgICAgbGV0IHYgPSBNYXRoLnJvdW5kKHQgKiAyNTUpO1xuICAgICAgICBpZiAoaW52ZXJ0QmcpIHYgPSAyNTUgLSB2O1xuICAgICAgICBjb25zdCBjID0gbHV0W3ZdO1xuICAgICAgICByTFtyYXddID0gY1swXTtcbiAgICAgICAgZ0xbcmF3XSA9IGNbMV07XG4gICAgICAgIGJMW3Jhd10gPSBjWzJdO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgIC8vIG1heFJnYiAoY29udHJhY3RzL2ludGVuc2l0eSkgaW5saW5lZCBvbiBwdXJwb3NlOiB0aGlzIGxvb3AgcnVuc1xuICAgICAgICAvLyB+MjYyayB0aW1lcyBwZXIgdGlsZSBvbiBldmVyeSByZWNvbG9yLlxuICAgICAgICBjb25zdCByYXcgPVxuICAgICAgICAgIGRbaV0gPj0gZFtpICsgMV0gPyAoZFtpXSA+PSBkW2kgKyAyXSA/IGRbaV0gOiBkW2kgKyAyXSkgOiBkW2kgKyAxXSA+PSBkW2kgKyAyXSA/IGRbaSArIDFdIDogZFtpICsgMl07XG4gICAgICAgIGRbaV0gPSByTFtyYXddO1xuICAgICAgICBkW2kgKyAxXSA9IGdMW3Jhd107XG4gICAgICAgIGRbaSArIDJdID0gYkxbcmF3XTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNoYW5zID0gW2NoYW5uZWxTdGF0ZXNbMF0sIGNoYW5uZWxTdGF0ZXNbMV0sIGNoYW5uZWxTdGF0ZXNbMl1dO1xuICAgICAgY29uc3QgdGludHMgPSBjaGFucy5tYXAoKGMpID0+IHRoaXMudGludDAxKGMpKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBpZiAoZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBsZXQgb1IgPSAwLCBvRyA9IDAsIG9CID0gMDtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCAzOyBrKyspIHtcbiAgICAgICAgICBjb25zdCBjID0gY2hhbnNba107XG4gICAgICAgICAgaWYgKGMgJiYgIWMudmlzaWJsZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgdiA9IHRoaXMuY2hhbm5lbEludGVuc2l0eShkW2kgKyBrXSwgYyk7XG4gICAgICAgICAgY29uc3QgdGludCA9IHRpbnRzW2tdO1xuICAgICAgICAgIG9SICs9IHYgKiB0aW50WzBdO1xuICAgICAgICAgIG9HICs9IHYgKiB0aW50WzFdO1xuICAgICAgICAgIG9CICs9IHYgKiB0aW50WzJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvUiA+IDI1NSkgb1IgPSAyNTU7XG4gICAgICAgIGlmIChvRyA+IDI1NSkgb0cgPSAyNTU7XG4gICAgICAgIGlmIChvQiA+IDI1NSkgb0IgPSAyNTU7XG4gICAgICAgIGlmIChpbnZlcnRCZykgeyBvUiA9IDI1NSAtIG9SOyBvRyA9IDI1NSAtIG9HOyBvQiA9IDI1NSAtIG9COyB9XG4gICAgICAgIGRbaV0gPSBvUjtcbiAgICAgICAgZFtpICsgMV0gPSBvRztcbiAgICAgICAgZFtpICsgMl0gPSBvQjtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgLyoqIFByZWNvbXB1dGVkIGx1bSgwLi4yNTUpIOKGkiB0aW50ZWQtUkdCIGxvb2t1cCBmb3IgYSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hL1xuICAgKiAgY29sb3VyLiBCdWlsZGluZyBpdCBjb3N0cyAyNTYgY2hhbm5lbEludGVuc2l0eSgpIGNhbGxzOyB1c2luZyBpdCBtYWtlcyBhXG4gICAqICBmdWxsLXRpbGUgcmVjb2xvciB+MjYyayBhcnJheSBsb29rdXBzIGluc3RlYWQgb2YgfjI2MmsgTWF0aC5wb3coKSBjYWxscy4gKi9cbiAgY2hhbm5lbFJnYkx1dChzdD86IElDaGFubmVsU3RhdGUpOiB7IHI6IFVpbnQ4Q2xhbXBlZEFycmF5OyBnOiBVaW50OENsYW1wZWRBcnJheTsgYjogVWludDhDbGFtcGVkQXJyYXkgfSB7XG4gICAgY29uc3QgciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgyNTYpO1xuICAgIGNvbnN0IGcgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMjU2KTtcbiAgICBjb25zdCBiID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDI1Nik7XG4gICAgY29uc3QgW3RyLCB0ZywgdGJdID0gdGhpcy50aW50MDEoc3QpO1xuICAgIGZvciAobGV0IGx1bSA9IDA7IGx1bSA8IDI1NjsgbHVtKyspIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLmNoYW5uZWxJbnRlbnNpdHkobHVtLCBzdCk7XG4gICAgICByW2x1bV0gPSB2ICogdHI7XG4gICAgICBnW2x1bV0gPSB2ICogdGc7XG4gICAgICBiW2x1bV0gPSB2ICogdGI7XG4gICAgfVxuICAgIHJldHVybiB7IHIsIGcsIGIgfTtcbiAgfVxuXG4gIC8qKiBXaW5kb3dlZCArIGdhbW1hIGludGVuc2l0eSAoMC4uMjU1KSBmb3IgYSBjaGFubmVsLCBpZ25vcmluZyB0aW50L2ludmVydC4gKi9cbiAgY2hhbm5lbEludGVuc2l0eSh2YWw6IG51bWJlciwgYz86IElDaGFubmVsU3RhdGUpOiBudW1iZXIge1xuICAgIGlmICghYykgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBzcGFuID0gYy5tYXggPiBjLm1pbiA/IGMubWF4IC0gYy5taW4gOiAwO1xuICAgIGlmICghc3BhbikgcmV0dXJuIDA7XG4gICAgbGV0IHQgPSAodmFsIC0gYy5taW4pIC8gc3BhbjtcbiAgICB0ID0gdCA8IDAgPyAwIDogdCA+IDEgPyAxIDogdDtcbiAgICBpZiAoYy5nYW1tYSA+IDAgJiYgYy5nYW1tYSAhPT0gMSkgdCA9IE1hdGgucG93KHQsIDEgLyBjLmdhbW1hKTtcbiAgICByZXR1cm4gdCAqIDI1NTtcbiAgfVxuXG4gIC8qKiBBIGNoYW5uZWwncyBwc2V1ZG8tY29sb3VyIHRpbnQgYXMgW3IsZyxiXSBpbiAwLi4xIChkZWZhdWx0IHdoaXRlKS4gKi9cbiAgdGludDAxKGM/OiBJQ2hhbm5lbFN0YXRlKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCBtID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGM/LmNvbG9yID8/ICcnKTtcbiAgICByZXR1cm4gbSA/IFtwYXJzZUludChtWzFdLCAxNikgLyAyNTUsIHBhcnNlSW50KG1bMl0sIDE2KSAvIDI1NSwgcGFyc2VJbnQobVszXSwgMTYpIC8gMjU1XSA6IFsxLCAxLCAxXTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYW55IFJHQiBjaGFubmVsIGlzIHdpbmRvd2VkL2hpZGRlbi9nYW1tYSdkL3JlLXRpbnRlZCBvciB0aGVcbiAgICogIGJhY2tncm91bmQgaXMgaW52ZXJ0ZWQg4oCUIG90aGVyd2lzZSB0aGUgdGlsZSBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuICovXG4gIHJnYk5lZWRzUmVjb2xvcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5ob3N0LmludmVydEJnKCkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gWycjZmYwMDAwJywgJyMwMGZmMDAnLCAnIzAwMDBmZiddO1xuICAgIGNvbnN0IGNoYW5uZWxTdGF0ZXMgPSB0aGlzLmhvc3QuY2hhbm5lbFN0YXRlcygpO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgMzsgaysrKSB7XG4gICAgICBjb25zdCBjID0gY2hhbm5lbFN0YXRlc1trXTtcbiAgICAgIGlmIChcbiAgICAgICAgYyAmJiAoIWMudmlzaWJsZSB8fCBjLm1pbiAhPT0gMCB8fCBjLm1heCAhPT0gMjU1IHx8IGMuZ2FtbWEgIT09IDEgfHxcbiAgICAgICAgICAoYy5jb2xvciB8fCAnJykudG9Mb3dlckNhc2UoKSAhPT0gZGVmYXVsdHNba10pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1waXBlbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL29zZC9kaXNwbGF5LXBpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQW9CdEQsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFBb0IsSUFBeUI7UUFBekIsU0FBSSxHQUFKLElBQUksQ0FBcUI7SUFBRyxDQUFDO0lBRWpEOzs7Ozs7Ozs7O09BVUc7SUFDSCxXQUFXLENBQUMsQ0FBb0I7UUFDOUIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxHQUFHO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM1RCxNQUFNLFFBQVEsR0FBRyxF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ZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IHBhcnNlQ3NzQ29sb3IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3InO1xuXG4vKipcbiAqIFRoZSBPU0QgcGl4ZWwgZGlzcGxheSBwaXBlbGluZSAocmVmYWN0b3JpbmcgcGxhbiwgU3RlcCA0IOKAlCBhIHB1cmUgbW92ZSBvZlxuICogdGhlIHJlY29sb3IgbWF0aCBvdXQgb2YgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSkuIFN0YXRlbGVzczogZXZlcnkgY2FsbCByZWFkc1xuICogdGhlIGN1cnJlbnQgZGlzcGxheSBzdGF0ZSB0aHJvdWdoIHRoZSBob3N0IGNsb3N1cmVzLCBleGFjdGx5IGxpa2UgdGhlIG1vdmVkXG4gKiBjb2RlIHJlYWQgdGhlIHNlcnZpY2UncyBmaWVsZHMuIFNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcsIHRoZSBzZXJ2ZXJsZXNzXG4gKiBtdWx0aWNoYW5uZWwgY29tcG9zaXRvciBhbmQgdGhlIGNvbXBvc2l0ZSBleHBvcnQgc28gdGhleSBzdGF5IGlkZW50aWNhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNwbGF5UGlwZWxpbmVIb3N0IHtcbiAgLyoqIEdyYXlzY2FsZSBpbWFnZSAoY29sb3JtYXAgTFVUIHBhdGgpIHZzIFJHQi9tdWx0aWNoYW5uZWwgKGFkZGl0aXZlIHRpbnQpLiAqL1xuICBpc0dyYXlzY2FsZSgpOiBib29sZWFuO1xuICAvKiogMjU2LWVudHJ5IGNvbG9ybWFwIExVVCAoZ3JheXNjYWxlIHBhdGgpOyBudWxsIHdoaWxlIG9wdGlvbnMgcmVzb2x2ZS4gKi9cbiAgY29sb3JMdXQoKTogUmdiW10gfCBudWxsO1xuICAvKiogTGF0ZXN0IHBlci1jaGFubmVsIGRpc3BsYXkgc3RhdGUgZnJvbSB0aGUgc3RvcmUuICovXG4gIGNoYW5uZWxTdGF0ZXMoKTogSUNoYW5uZWxTdGF0ZVtdO1xuICAvKiogSW52ZXJ0ZWQgYmFja2dyb3VuZCAod2hpdGUgPSB6ZXJvKS4gKi9cbiAgaW52ZXJ0QmcoKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIERpc3BsYXlQaXBlbGluZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogRGlzcGxheVBpcGVsaW5lSG9zdCkge31cblxuICAvKipcbiAgICogQXBwbHkgdGhlIGN1cnJlbnQgZGlzcGxheSBwaXBlbGluZSB0byBhbiBSR0JBIGJ1ZmZlciBpbiBwbGFjZTsgcmV0dXJuc1xuICAgKiB3aGV0aGVyIGFueSBvcGFxdWUgcGl4ZWwgd2FzIHdyaXR0ZW4uXG4gICAqICAtIEdyYXlzY2FsZTogaW50ZW5zaXR5IOKGkiB3aW5kb3cg4oaSIGludmVydCDihpIgZ2FtbWEg4oaSIGNvbG9ybWFwIExVVC5cbiAgICogIC0gUkdCL211bHRpY2hhbm5lbDogYWRkaXRpdmUgcHNldWRvLWNvbG91ciBtZXJnZSDigJQgZWFjaCB2aXNpYmxlIGNoYW5uZWwnc1xuICAgKiAgICBpbnRlbnNpdHkgKHdpbmRvdyDihpIgaW52ZXJ0IOKGkiBnYW1tYSwgc2VlIHtAbGluayBjaGFubmVsSW50ZW5zaXR5fSkgaXNcbiAgICogICAgdGludGVkIGJ5IGl0cyBhc3NpZ25lZCBjb2xvdXIgYW5kIHN1bW1lZCAoRmlqaSBcIk1lcmdlIENoYW5uZWxzXCIpLCB0aGVuXG4gICAqICAgIGNsYW1wZWQuIEludmVydCBpcyBwZXIgY2hhbm5lbCwgYmVmb3JlIHRoZSBtZXJnZSwgYXMgbmFwYXJpLWpzIGludmVydHNcbiAgICogICAgZWFjaCBhZGRpdGl2ZSBsYXllciAoTkFQQVJJLUJPVU5EQVJZLTIpIOKAlCBub3QgdGhlIGNvbXBvc2l0ZS4gRGVmYXVsdHNcbiAgICogICAgKFI9cmVkLCBHPWdyZWVuLCBCPWJsdWUpIGFyZSB0aGUgaWRlbnRpdHkuXG4gICAqL1xuICBhcHBseVRvUmdiYShkOiBVaW50OENsYW1wZWRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgY2hhbm5lbFN0YXRlcyA9IHRoaXMuaG9zdC5jaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgaW52ZXJ0QmcgPSB0aGlzLmhvc3QuaW52ZXJ0QmcoKTtcbiAgICBpZiAodGhpcy5ob3N0LmlzR3JheXNjYWxlKCkpIHtcbiAgICAgIGNvbnN0IGx1dCA9IHRoaXMuaG9zdC5jb2xvckx1dCgpO1xuICAgICAgaWYgKCFsdXQpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGNoID0gY2hhbm5lbFN0YXRlc1swXTtcbiAgICAgIGNvbnN0IHdNaW4gPSBjaCA/IGNoLm1pbiA6IDA7XG4gICAgICBjb25zdCB3U3BhbiA9IGNoICYmIGNoLm1heCA+IGNoLm1pbiA/IGNoLm1heCAtIGNoLm1pbiA6IDI1NTtcbiAgICAgIGNvbnN0IGludkdhbW1hID0gY2ggJiYgY2guZ2FtbWEgPiAwID8gMSAvIGNoLmdhbW1hIDogMTtcbiAgICAgIC8vIFByZWNvbXB1dGUgcmF3KDAuLjI1NSkgLT4gZmluYWwgUkdCIG9uY2UgKDI1NiB3aW5kb3craW52ZXJ0K2dhbW1hK2NvbG9ybWFwXG4gICAgICAvLyBldmFsdWF0aW9ucykgYW5kIG1hcCBlYWNoIHBpeGVsIGJ5IHRhYmxlIGxvb2t1cCDigJQgYSBNYXRoLnBvdyBwZXIgcGl4ZWxcbiAgICAgIC8vICh+MjYyay90aWxlKSBtYWRlIHRoZSB3aW5kb3cvZ2FtbWEgc2xpZGVycyBjcmF3bCBvbiBsYXJnZSBzdGFja3MuXG4gICAgICAvLyBUaGUgb3JkZXIgaXMgbmFwYXJpLWpzJ3MgYHdpbmRvd0dhbW1hYCAod2luZG93IOKGkiBpbnZlcnQg4oaSIGdhbW1hKSwgc28gdGhlXG4gICAgICAvLyBzYW1lIGNoYW5uZWwgc3RhdGUgZHJhd3MgdGhlIHNhbWUgaW1hZ2UgdW5kZXIgYm90aCBiYWNrZW5kczsgb25seSB0aGVcbiAgICAgIC8vIGV4cG9uZW50IGRpZmZlcnMgYnkgY29udmVudGlvbiAoSW1hZ2VKIHReKDEvzrMpIGhlcmUsIGNvbnZlcnRlZCB0b1xuICAgICAgLy8gbmFwYXJpJ3MgdF7OsyBhdCB0aGUgbmFwYXJpIGJvdW5kYXJ5KS5cbiAgICAgIGNvbnN0IHJMID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDI1Nik7XG4gICAgICBjb25zdCBnTCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgyNTYpO1xuICAgICAgY29uc3QgYkwgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMjU2KTtcbiAgICAgIGZvciAobGV0IHJhdyA9IDA7IHJhdyA8IDI1NjsgcmF3KyspIHtcbiAgICAgICAgbGV0IHQgPSAocmF3IC0gd01pbikgLyB3U3BhbjtcbiAgICAgICAgdCA9IHQgPCAwID8gMCA6IHQgPiAxID8gMSA6IHQ7XG4gICAgICAgIGlmIChpbnZlcnRCZykgdCA9IDEgLSB0O1xuICAgICAgICBpZiAoaW52R2FtbWEgIT09IDEpIHQgPSBNYXRoLnBvdyh0LCBpbnZHYW1tYSk7XG4gICAgICAgIGNvbnN0IGMgPSBsdXRbTWF0aC5yb3VuZCh0ICogMjU1KV07XG4gICAgICAgIHJMW3Jhd10gPSBjWzBdO1xuICAgICAgICBnTFtyYXddID0gY1sxXTtcbiAgICAgICAgYkxbcmF3XSA9IGNbMl07XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgaWYgKGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgLy8gbWF4UmdiIChjb250cmFjdHMvaW50ZW5zaXR5KSBpbmxpbmVkIG9uIHB1cnBvc2U6IHRoaXMgbG9vcCBydW5zXG4gICAgICAgIC8vIH4yNjJrIHRpbWVzIHBlciB0aWxlIG9uIGV2ZXJ5IHJlY29sb3IuXG4gICAgICAgIGNvbnN0IHJhdyA9XG4gICAgICAgICAgZFtpXSA+PSBkW2kgKyAxXSA/IChkW2ldID49IGRbaSArIDJdID8gZFtpXSA6IGRbaSArIDJdKSA6IGRbaSArIDFdID49IGRbaSArIDJdID8gZFtpICsgMV0gOiBkW2kgKyAyXTtcbiAgICAgICAgZFtpXSA9IHJMW3Jhd107XG4gICAgICAgIGRbaSArIDFdID0gZ0xbcmF3XTtcbiAgICAgICAgZFtpICsgMl0gPSBiTFtyYXddO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hhbnMgPSBbY2hhbm5lbFN0YXRlc1swXSwgY2hhbm5lbFN0YXRlc1sxXSwgY2hhbm5lbFN0YXRlc1syXV07XG4gICAgICBjb25zdCB0aW50cyA9IGNoYW5zLm1hcCgoYykgPT4gdGhpcy50aW50MDEoYykpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgIGxldCBvUiA9IDAsXG4gICAgICAgICAgb0cgPSAwLFxuICAgICAgICAgIG9CID0gMDtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCAzOyBrKyspIHtcbiAgICAgICAgICBjb25zdCBjID0gY2hhbnNba107XG4gICAgICAgICAgaWYgKGMgJiYgIWMudmlzaWJsZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgdiA9IHRoaXMuY2hhbm5lbEludGVuc2l0eShkW2kgKyBrXSwgYywgaW52ZXJ0QmcpO1xuICAgICAgICAgIGNvbnN0IHRpbnQgPSB0aW50c1trXTtcbiAgICAgICAgICBvUiArPSB2ICogdGludFswXTtcbiAgICAgICAgICBvRyArPSB2ICogdGludFsxXTtcbiAgICAgICAgICBvQiArPSB2ICogdGludFsyXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob1IgPiAyNTUpIG9SID0gMjU1O1xuICAgICAgICBpZiAob0cgPiAyNTUpIG9HID0gMjU1O1xuICAgICAgICBpZiAob0IgPiAyNTUpIG9CID0gMjU1O1xuICAgICAgICBkW2ldID0gb1I7XG4gICAgICAgIGRbaSArIDFdID0gb0c7XG4gICAgICAgIGRbaSArIDJdID0gb0I7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIC8qKiBQcmVjb21wdXRlZCBsdW0oMC4uMjU1KSDihpIgdGludGVkLVJHQiBsb29rdXAgZm9yIGEgY2hhbm5lbCdzIHdpbmRvdy9pbnZlcnQvXG4gICAqICBnYW1tYS9jb2xvdXIuIEJ1aWxkaW5nIGl0IGNvc3RzIDI1NiBjaGFubmVsSW50ZW5zaXR5KCkgY2FsbHM7IHVzaW5nIGl0IG1ha2VzIGFcbiAgICogIGZ1bGwtdGlsZSByZWNvbG9yIH4yNjJrIGFycmF5IGxvb2t1cHMgaW5zdGVhZCBvZiB+MjYyayBNYXRoLnBvdygpIGNhbGxzLiAqL1xuICBjaGFubmVsUmdiTHV0KHN0PzogSUNoYW5uZWxTdGF0ZSk6IHsgcjogVWludDhDbGFtcGVkQXJyYXk7IGc6IFVpbnQ4Q2xhbXBlZEFycmF5OyBiOiBVaW50OENsYW1wZWRBcnJheSB9IHtcbiAgICBjb25zdCByID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDI1Nik7XG4gICAgY29uc3QgZyA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgyNTYpO1xuICAgIGNvbnN0IGIgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMjU2KTtcbiAgICBjb25zdCBbdHIsIHRnLCB0Yl0gPSB0aGlzLnRpbnQwMShzdCk7XG4gICAgY29uc3QgaW52ZXJ0ID0gdGhpcy5ob3N0LmludmVydEJnKCk7XG4gICAgZm9yIChsZXQgbHVtID0gMDsgbHVtIDwgMjU2OyBsdW0rKykge1xuICAgICAgY29uc3QgdiA9IHRoaXMuY2hhbm5lbEludGVuc2l0eShsdW0sIHN0LCBpbnZlcnQpO1xuICAgICAgcltsdW1dID0gdiAqIHRyO1xuICAgICAgZ1tsdW1dID0gdiAqIHRnO1xuICAgICAgYltsdW1dID0gdiAqIHRiO1xuICAgIH1cbiAgICByZXR1cm4geyByLCBnLCBiIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkaXRpdmUgKCdsaWdodGVyJykgbWVyZ2Ugb2Ygc2luZ2xlLWJhbmQgY2hhbm5lbCBwbGFuZXMgaW50byBvbmUgb3BhcXVlXG4gICAqIFJHQkEgaW1hZ2Ug4oCUIHdoYXQgT1NEJ3MgZHJhd2VyIHNob3dzIGZvciBhIHBlci1jaGFubmVsIGltYWdlLCB3aGVyZSBlYWNoXG4gICAqIGNoYW5uZWwgdGlsZSBpcyB0aW50ZWQgYnkge0BsaW5rIGNoYW5uZWxSZ2JMdXR9LiBIaWRkZW4gY2hhbm5lbHMsIG1pc3NpbmdcbiAgICogcGxhbmVzIGFuZCBwbGFuZXMgb2YgYW5vdGhlciBzaXplIGNvbnRyaWJ1dGUgbm90aGluZy4gQSBwbGFuZSBpcyBSR0JBXG4gICAqIChgYmFuZHNgIDQsIFI9Rz1CLCB0cmFuc3BhcmVudCBwaXhlbHMgc2tpcHBlZCkgb3Igb25lIGJ5dGUgcGVyIHBpeGVsXG4gICAqIChgYmFuZHNgIDEpLiBVc2VkIGJ5IHRoZSBzZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbCBjb21wb3NpdG9yLCB0aGVcbiAgICogbXVsdGljaGFubmVsIGNvbXBvc2l0ZSBleHBvcnQgYW5kIHRoZSBQbG90bHkgaW1hZ2UncyBjaGFubmVsIGRpc3BsYXkuXG4gICAqL1xuICBjb21wb3NpdGVDaGFubmVscyhcbiAgICBwbGFuZXM6IFJlYWRvbmx5QXJyYXk8VWludDhDbGFtcGVkQXJyYXkgfCBVaW50OEFycmF5IHwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gICAgc3RhdGVzOiBSZWFkb25seUFycmF5PElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQ+LFxuICAgIGJhbmRzOiAxIHwgNCA9IDQsXG4gICk6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcbiAgICBjb25zdCBsZW4gPSBwbGFuZXMuZmluZCgocCkgPT4gcCAmJiBwLmxlbmd0aCk/Lmxlbmd0aCA/PyAwO1xuICAgIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgobGVuIC8gYmFuZHMpICogNCk7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBwbGFuZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzW2NdO1xuICAgICAgY29uc3QgcGQgPSBwbGFuZXNbY107XG4gICAgICBpZiAoKHN0ICYmIHN0LnZpc2libGUgPT09IGZhbHNlKSB8fCAhcGQgfHwgcGQubGVuZ3RoICE9PSBsZW4pIGNvbnRpbnVlO1xuICAgICAgdGhpcy5hZGRDaGFubmVsKG91dCwgcGQsIHN0LCBiYW5kcyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSA0KSBvdXRbaV0gPSAyNTU7IC8vIG9wYXF1ZVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogQWRkIG9uZSBzaW5nbGUtYmFuZCBwbGFuZSAoUkdCQSBvciBvbmUgYnl0ZSBwZXIgcGl4ZWwsIHNlZVxuICAgKiAge0BsaW5rIGNvbXBvc2l0ZUNoYW5uZWxzfSksIHRpbnRlZCBieSBpdHMgY2hhbm5lbCBzdGF0ZSwgb250byBgb3V0YFxuICAgKiAgKFVpbnQ4Q2xhbXBlZEFycmF5IGNsYW1wcyDihpIgYWRkaXRpdmUgJ2xpZ2h0ZXInKS4gKi9cbiAgYWRkQ2hhbm5lbChcbiAgICBvdXQ6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgIHBsYW5lOiBVaW50OENsYW1wZWRBcnJheSB8IFVpbnQ4QXJyYXksXG4gICAgc3Q/OiBJQ2hhbm5lbFN0YXRlLFxuICAgIGJhbmRzOiAxIHwgNCA9IDQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgciwgZywgYiB9ID0gdGhpcy5jaGFubmVsUmdiTHV0KHN0KTtcbiAgICBmb3IgKGxldCBpID0gMCwgcCA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQsIHAgKz0gYmFuZHMpIHtcbiAgICAgIGlmIChiYW5kcyA9PT0gNCAmJiBwbGFuZVtwICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbHVtID0gcGxhbmVbcF07IC8vIHNpbmdsZS1iYW5kIHBsYW5lIChSPUc9QilcbiAgICAgIG91dFtpXSArPSByW2x1bV07XG4gICAgICBvdXRbaSArIDFdICs9IGdbbHVtXTtcbiAgICAgIG91dFtpICsgMl0gKz0gYltsdW1dO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNoYW5uZWwncyBkaXNwbGF5IGludGVuc2l0eSAoMC4uMjU1LCBiZWZvcmUgaXRzIHRpbnQpOiB3aW5kb3cg4oaSIGludmVydCDihpJcbiAgICogZ2FtbWEsIHRoZSBvcmRlciBvZiBuYXBhcmktanMncyBgd2luZG93R2FtbWFgLCB3aGljaCBldmVyeSBhZGRpdGl2ZSBuYXBhcmlcbiAgICogbGF5ZXIgYXBwbGllcyBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbGF5ZXJzIGFyZSBzdW1tZWQgKE5BUEFSSS1CT1VOREFSWS0yKS5cbiAgICogVGhlIGdhbW1hIGV4cG9uZW50IGlzIHRoZSBJbWFnZUogb25lICh0XigxL86zKSkuIEFuIGVtcHR5IHdpbmRvdyBzcGFuIG1hcHMgdG9cbiAgICogMCBiZWZvcmUgdGhlIGludmVydDsgd2l0aCBubyBjaGFubmVsIHN0YXRlIHRoZSB2YWx1ZSBwYXNzZXMgdGhyb3VnaC5cbiAgICovXG4gIGNoYW5uZWxJbnRlbnNpdHkodmFsOiBudW1iZXIsIGM/OiBJQ2hhbm5lbFN0YXRlLCBpbnZlcnQgPSBmYWxzZSk6IG51bWJlciB7XG4gICAgbGV0IHQ6IG51bWJlcjtcbiAgICBpZiAoIWMpIHtcbiAgICAgIHQgPSB2YWwgLyAyNTU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNwYW4gPSBjLm1heCA+IGMubWluID8gYy5tYXggLSBjLm1pbiA6IDA7XG4gICAgICB0ID0gc3BhbiA/ICh2YWwgLSBjLm1pbikgLyBzcGFuIDogMDtcbiAgICAgIHQgPSB0IDwgMCA/IDAgOiB0ID4gMSA/IDEgOiB0O1xuICAgIH1cbiAgICBpZiAoaW52ZXJ0KSB0ID0gMSAtIHQ7XG4gICAgaWYgKGMgJiYgYy5nYW1tYSA+IDAgJiYgYy5nYW1tYSAhPT0gMSkgdCA9IE1hdGgucG93KHQsIDEgLyBjLmdhbW1hKTtcbiAgICByZXR1cm4gdCAqIDI1NTtcbiAgfVxuXG4gIC8qKiBBIGNoYW5uZWwncyBwc2V1ZG8tY29sb3VyIHRpbnQgYXMgW3IsZyxiXSBpbiAwLi4xIChkZWZhdWx0IHdoaXRlKS4gKi9cbiAgdGludDAxKGM/OiBJQ2hhbm5lbFN0YXRlKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCByZ2IgPSBwYXJzZUNzc0NvbG9yKGM/LmNvbG9yKTtcbiAgICByZXR1cm4gcmdiID8gW3JnYlswXSAvIDI1NSwgcmdiWzFdIC8gMjU1LCByZ2JbMl0gLyAyNTVdIDogWzEsIDEsIDFdO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBhbnkgUkdCIGNoYW5uZWwgaXMgd2luZG93ZWQvaGlkZGVuL2dhbW1hJ2QvcmUtdGludGVkIG9yIHRoZVxuICAgKiAgYmFja2dyb3VuZCBpcyBpbnZlcnRlZCDigJQgb3RoZXJ3aXNlIHRoZSB0aWxlIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZC4gKi9cbiAgcmdiTmVlZHNSZWNvbG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZ2JOZWVkc1JlY29sb3IodGhpcy5ob3N0LmNoYW5uZWxTdGF0ZXMoKSwgdGhpcy5ob3N0LmludmVydEJnKCkpO1xuICB9XG59XG5cbi8qKiBBbiBSR0IgaW1hZ2UncyBjaGFubmVscycgdGludHMgd2hlbiBub3RoaW5nIHJlLXRpbnRlZCB0aGVtOiB0aGUgaWRlbnRpdHkgbWVyZ2UuICovXG5jb25zdCBSR0JfREVGQVVMVF9USU5UUyA9IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnXTtcblxuLyoqXG4gKiBXaGV0aGVyIGFuIFJHQiBpbWFnZSdzIGNoYW5uZWwgc3RhdGVzIChSLCBHLCBCKSBjaGFuZ2UgaG93IGl0IGxvb2tzOiBhbnkgYmFuZCB3aW5kb3dlZCwgaGlkZGVuLFxuICogZ2FtbWEnZCBvciByZS10aW50ZWQsIG9yIHRoZSBpbWFnZSBpbnZlcnRlZC4gRmFsc2UgbWVhbnMgdGhlIFJHQiBwaXhlbHMgcGFzcyB0aHJvdWdoIGFzIHRoZXlcbiAqIGFyZSDigJQgZXZlcnkgYmFja2VuZCdzIGN1ZSB0byBrZWVwIGRyYXdpbmcgdGhlIGltYWdlIGRpcmVjdGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmdiTmVlZHNSZWNvbG9yKFxuICBjaGFubmVsU3RhdGVzOiBSZWFkb25seUFycmF5PElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQ+LFxuICBpbnZlcnQ6IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGludmVydCkgcmV0dXJuIHRydWU7XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgMzsgaysrKSB7XG4gICAgY29uc3QgYyA9IGNoYW5uZWxTdGF0ZXNba107XG4gICAgaWYgKFxuICAgICAgYyAmJlxuICAgICAgKCFjLnZpc2libGUgfHxcbiAgICAgICAgYy5taW4gIT09IDAgfHxcbiAgICAgICAgYy5tYXggIT09IDI1NSB8fFxuICAgICAgICBjLmdhbW1hICE9PSAxIHx8XG4gICAgICAgIChjLmNvbG9yIHx8ICcnKS50b0xvd2VyQ2FzZSgpICE9PSBSR0JfREVGQVVMVF9USU5UU1trXSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { timeout } from 'rxjs/operators';
|
|
1
|
+
import { from, of } from 'rxjs';
|
|
3
2
|
import { buildTileUrl, fetchTileRgba } from './tile-client';
|
|
3
|
+
import { httpFetchJson, nativeHistogram, timeoutSignal } from '../tile-server';
|
|
4
4
|
import { histogram256, maxRgb } from '../../contracts/intensity';
|
|
5
5
|
export class HistogramSampler {
|
|
6
6
|
constructor(http, api, host) {
|
|
@@ -9,22 +9,33 @@ export class HistogramSampler {
|
|
|
9
9
|
this.host = host;
|
|
10
10
|
/** 256-bin intensity histogram per z-slice, from sampled tiles. */
|
|
11
11
|
this.sliceHistograms = new Map();
|
|
12
|
-
/** Native-bit-depth histograms from `/histogram`, keyed
|
|
12
|
+
/** Native-bit-depth histograms from `/histogram`, keyed
|
|
13
|
+
* `${infoB64}|${z}|${channel}|${bins}`. */
|
|
13
14
|
this.nativeHistograms = new Map();
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
this.
|
|
15
|
+
/** Bumped by {@link clear}. Every async sampler captures it before its first
|
|
16
|
+
* `await` and drops its result if it changed: tile sampling and the native
|
|
17
|
+
* fetch can take tens of seconds, and a run for the previous image must not
|
|
18
|
+
* write that image's histogram, auto-window or native histogram into the
|
|
19
|
+
* next one. */
|
|
20
|
+
this.generation = 0;
|
|
21
|
+
/** Slices whose tile sampling is in flight, so a scrub back to one (or a
|
|
22
|
+
* background preload of it) doesn't fetch its tiles again. */
|
|
23
|
+
this.inFlight = new Set();
|
|
20
24
|
}
|
|
21
25
|
/** The sampled histogram for one channel of slice z, or null until the
|
|
22
26
|
* async sampling resolves (or if it was skipped). */
|
|
23
27
|
get(z, channelIndex) {
|
|
24
28
|
return this.sliceHistograms.get(z)?.[channelIndex] ?? null;
|
|
25
29
|
}
|
|
30
|
+
/** Whether slice z is already sampled or being sampled (tile samplers only
|
|
31
|
+
* run once per slice until {@link clear}). */
|
|
32
|
+
sampledOrPending(z) {
|
|
33
|
+
return this.sliceHistograms.has(z) || this.inFlight.has(z);
|
|
34
|
+
}
|
|
26
35
|
/** Drop everything (teardown / image switch). */
|
|
27
36
|
clear() {
|
|
37
|
+
this.generation++;
|
|
38
|
+
this.inFlight.clear();
|
|
28
39
|
this.sliceHistograms.clear();
|
|
29
40
|
this.nativeHistograms.clear();
|
|
30
41
|
}
|
|
@@ -34,6 +45,10 @@ export class HistogramSampler {
|
|
|
34
45
|
* luminance. Fire-and-forget.
|
|
35
46
|
*/
|
|
36
47
|
async computeMultiChannelHistograms(d, infoB64, z) {
|
|
48
|
+
if (this.sampledOrPending(z))
|
|
49
|
+
return;
|
|
50
|
+
const gen = this.generation;
|
|
51
|
+
this.inFlight.add(z);
|
|
37
52
|
try {
|
|
38
53
|
const t = d.tileSize;
|
|
39
54
|
// Sample the COARSEST real level (per-channel tiles exist only at real
|
|
@@ -77,6 +92,8 @@ export class HistogramSampler {
|
|
|
77
92
|
}
|
|
78
93
|
}
|
|
79
94
|
await Promise.all(jobs);
|
|
95
|
+
if (gen !== this.generation)
|
|
96
|
+
return; // cleared meanwhile (image switch)
|
|
80
97
|
this.sliceHistograms.set(z, counts.map((c) => histogram256(c)));
|
|
81
98
|
this.host.onChannelHistogramsSampled();
|
|
82
99
|
}
|
|
@@ -84,6 +101,10 @@ export class HistogramSampler {
|
|
|
84
101
|
// Leave histograms unset (the pane shows empty) — but say why.
|
|
85
102
|
console.warn('[viz:histogram] multichannel histogram sampling failed', err);
|
|
86
103
|
}
|
|
104
|
+
finally {
|
|
105
|
+
if (gen === this.generation)
|
|
106
|
+
this.inFlight.delete(z);
|
|
107
|
+
}
|
|
87
108
|
}
|
|
88
109
|
/**
|
|
89
110
|
* Compute a per-image intensity window [min,max] for grayscale auto-ranging,
|
|
@@ -99,7 +120,11 @@ export class HistogramSampler {
|
|
|
99
120
|
* only). Fire-and-forget; failures leave the window unset (identity 0..255).
|
|
100
121
|
*/
|
|
101
122
|
async computeImageWindow(d, infoB64, z) {
|
|
123
|
+
if (this.sampledOrPending(z))
|
|
124
|
+
return;
|
|
102
125
|
const gray = this.host.isGrayscale();
|
|
126
|
+
const gen = this.generation;
|
|
127
|
+
this.inFlight.add(z);
|
|
103
128
|
try {
|
|
104
129
|
const t = d.tileSize;
|
|
105
130
|
// Sample full-resolution when the grid is small (accurate for the grayscale
|
|
@@ -158,17 +183,23 @@ export class HistogramSampler {
|
|
|
158
183
|
console.warn('[viz:window] tile sample failed, skipping', url, err);
|
|
159
184
|
}
|
|
160
185
|
}));
|
|
186
|
+
if (gen !== this.generation)
|
|
187
|
+
return; // cleared meanwhile (image switch)
|
|
161
188
|
// Cache per-channel histograms: grayscale → [intensity]; RGB → [R, G, B].
|
|
162
189
|
this.sliceHistograms.set(z, gray ? [histogram256(cR)] : [histogram256(cR), histogram256(cG), histogram256(cB)]);
|
|
163
190
|
// Grayscale auto-window — only from full-res samples (coarsest averaging
|
|
164
191
|
// is inaccurate); the host seeds the channel or re-invalidates.
|
|
165
192
|
if (gray && fullRes && max > min && (min > 0 || max < 255)) {
|
|
166
|
-
this.host.onGrayWindowSampled(min, max);
|
|
193
|
+
this.host.onGrayWindowSampled(min, max, z);
|
|
167
194
|
}
|
|
168
195
|
}
|
|
169
196
|
catch (err) {
|
|
170
197
|
console.warn('[viz:window] per-image window compute failed — using identity 0..255', err);
|
|
171
198
|
}
|
|
199
|
+
finally {
|
|
200
|
+
if (gen === this.generation)
|
|
201
|
+
this.inFlight.delete(z);
|
|
202
|
+
}
|
|
172
203
|
}
|
|
173
204
|
/**
|
|
174
205
|
* Client-side histogram for the SIMPLE (`tiled:false`) path: bin an
|
|
@@ -218,45 +249,39 @@ export class HistogramSampler {
|
|
|
218
249
|
/**
|
|
219
250
|
* Native-bit-depth histogram for >8-bit images, from the server `/histogram`
|
|
220
251
|
* endpoint (the 8-bit canvas tiles can't carry 16-bit values). Cached per
|
|
221
|
-
* slice+channel
|
|
252
|
+
* image+slice+channel+bin count until {@link clear}.
|
|
222
253
|
*/
|
|
223
254
|
native$(infoB64, z, channel, bins) {
|
|
224
|
-
const key = `${z}|${channel}`;
|
|
255
|
+
const key = `${infoB64}|${z}|${channel}|${bins}`;
|
|
225
256
|
const cached = this.nativeHistograms.get(key);
|
|
226
257
|
if (cached)
|
|
227
258
|
return of(cached);
|
|
228
259
|
return from(this.fetchNative(infoB64, z, channel, bins, key));
|
|
229
260
|
}
|
|
230
|
-
/** Fetch + cache one channel's native histogram from `GET /histogram
|
|
261
|
+
/** Fetch + cache one channel's native histogram from `GET /histogram`
|
|
262
|
+
* (the shared jit-service client, which adds the per-app-load cache-buster
|
|
263
|
+
* that defeats the server's 24 h cache). */
|
|
231
264
|
async fetchNative(infoB64, z, channel, bins, key) {
|
|
232
|
-
const
|
|
265
|
+
const gen = this.generation;
|
|
233
266
|
try {
|
|
234
267
|
// HttpClient calls get auth via the Angular interceptor (unlike OSD's own
|
|
235
268
|
// ajax tile loader, which needs authHeaders) — mirror the other fetches.
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
269
|
+
const req = timeoutSignal(undefined, 45000);
|
|
270
|
+
const out = await nativeHistogram(httpFetchJson(this.http), this.api, infoB64, { z, channel, bins }, req.signal).finally(req.done);
|
|
271
|
+
if (!out)
|
|
272
|
+
return null; // 202 (still caching) → null; the pane retries
|
|
273
|
+
// Cleared meanwhile (image switch): the histogram belongs to the previous
|
|
274
|
+
// image — don't cache it or hand it to the pane (null → the pane retries).
|
|
275
|
+
if (gen !== this.generation)
|
|
240
276
|
return null;
|
|
241
|
-
const out = {
|
|
242
|
-
// Native bin left-edges: rangeMin + i*binWidth.
|
|
243
|
-
bins: hi.counts.map((_, i) => hi.rangeMin + i * hi.binWidth),
|
|
244
|
-
counts: hi.counts,
|
|
245
|
-
max: hi.counts.reduce((m, c) => (c > m ? c : m), 0),
|
|
246
|
-
bitDepth: hi.bitDepth,
|
|
247
|
-
rangeMin: hi.rangeMin,
|
|
248
|
-
rangeMax: hi.rangeMax,
|
|
249
|
-
observedMin: hi.observedMin,
|
|
250
|
-
observedMax: hi.observedMax,
|
|
251
|
-
};
|
|
252
277
|
this.nativeHistograms.set(key, out);
|
|
253
278
|
return out;
|
|
254
279
|
}
|
|
255
280
|
catch (err) {
|
|
256
|
-
//
|
|
281
|
+
// A transient error → null; the pane retries.
|
|
257
282
|
console.warn('[viz:histogram] native histogram fetch failed', err);
|
|
258
283
|
return null;
|
|
259
284
|
}
|
|
260
285
|
}
|
|
261
286
|
}
|
|
262
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9ncmFtLXNhbXBsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2QvaGlzdG9ncmFtLXNhbXBsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFjLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBbUNqRSxNQUFNLE9BQU8sZ0JBQWdCO0lBWTNCLFlBQ1UsSUFBZ0IsRUFDaEIsR0FBVyxFQUNYLElBQTBCO1FBRjFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLFNBQUksR0FBSixJQUFJLENBQXNCO1FBZHBDLG1FQUFtRTtRQUMzRCxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQzFELDhFQUE4RTtRQUN0RSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUN6RDs7OzsyQ0FJbUM7UUFDbEIsb0JBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFNM0MsQ0FBQztJQUVKOzBEQUNzRDtJQUN0RCxHQUFHLENBQUMsQ0FBUyxFQUFFLFlBQW9CO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDN0QsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMs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QyxXQUFXO2dCQUMzQixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7YUFDNUIsQ0FBQztZQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixxRUFBcUU7WUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZFRpbGVVcmwsIGZldGNoVGlsZVJnYmEgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IGhpc3RvZ3JhbTI1NiwgbWF4UmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5cbi8qKlxuICogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgZm9yIHRoZSBPU0QgYmFja2VuZCAocmVmYWN0b3JpbmcgcGxhbixcbiAqIFN0ZXAgNCDigJQgYSBwdXJlIG1vdmUgb3V0IG9mIHRoZSB2aXN1YWxpemVyIHNlcnZpY2UpLiBPd25zIHRoZSBwZXItc2xpY2VcbiAqIDgtYml0IGhpc3RvZ3JhbXMgKHNhbXBsZWQgZnJvbSBkaXNwbGF5ZWQgdGlsZXMpIGFuZCB0aGUgbmF0aXZlLWJpdC1kZXB0aFxuICogaGlzdG9ncmFtcyAoZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIgYC9oaXN0b2dyYW1gIGVuZHBvaW50KS4gUmVhZC1vbmx5IHdpdGhcbiAqIHJlc3BlY3QgdG8gdGhlIHRpbGUvZGlzcGxheSBwaXBlbGluZS5cbiAqL1xuXG4vKiogVGhlIGRlc2NyaXB0b3IgZmllbGRzIHRoZSBzYW1wbGVycyByZWFkIChzdHJ1Y3R1cmFsbHkgc2F0aXNmaWVkIGJ5IHRoZVxuICogIHNlcnZpY2UncyBUaWxlRGVzY3JpcHRvcikuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbXBsZWREZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIGNoYW5uZWxzPzogbnVtYmVyO1xuICBsZXZlbHM/OiBBcnJheTx7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvZ3JhbVNhbXBsZXJIb3N0IHtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IHRoZXJlKS4gKi9cbiAgcmVhbExldmVscygpOiBudW1iZXI7XG4gIC8qKiBDaGFubmVsIGNvdW50IGZvciB0aGUgbXVsdGljaGFubmVsIHNhbXBsZXIuICovXG4gIGNoYW5uZWxDb3VudChkOiBTYW1wbGVkRGVzY3JpcHRvcik6IG51bWJlcjtcbiAgLyoqIEdyYXlzY2FsZSAoaW50ZW5zaXR5IGhpc3RvZ3JhbSArIGF1dG8td2luZG93KSB2cyBSR0IgKFIvRy9CIGhpc3RvZ3JhbXMpLiAqL1xuICBpc0dyYXlzY2FsZSgpOiBib29sZWFuO1xuICAvKiogSGlzdG9ncmFtcyBsYW5kZWQg4oCUIG51ZGdlIHRoZSBwYW5lIHRvIHJlLXJlYWQgKGl0cyByZXRyeSB3aW5kb3cgbWF5IGhhdmVcbiAgICogIGxhcHNlZCkuICovXG4gIG9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk6IHZvaWQ7XG4gIC8qKiBBIGdyYXlzY2FsZSBhdXRvLXdpbmRvdyB3YXMgbWVhc3VyZWQgZnJvbSBmdWxsLXJlcyB0aWxlcyDigJQgc2VlZCB0aGVcbiAgICogIEludGVuc2l0eSBjaGFubmVsIChvciByZS1pbnZhbGlkYXRlIGlmIHRoZSB1c2VyIGFscmVhZHkgd2luZG93ZWQpLiAqL1xuICBvbkdyYXlXaW5kb3dTYW1wbGVkKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b2dyYW1TYW1wbGVyIHtcbiAgLyoqIDI1Ni1iaW4gaW50ZW5zaXR5IGhpc3RvZ3JhbSBwZXIgei1zbGljZSwgZnJvbSBzYW1wbGVkIHRpbGVzLiAqL1xuICBwcml2YXRlIHNsaWNlSGlzdG9ncmFtcyA9IG5ldyBNYXA8bnVtYmVyLCBJSGlzdG9ncmFtW10+KCk7XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoIGhpc3RvZ3JhbXMgZnJvbSBgL2hpc3RvZ3JhbWAsIGtleWVkIGAke3p9fCR7Y2hhbm5lbH1gLiAqL1xuICBwcml2YXRlIG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcbiAgLyoqIFBlci1hcHAtbG9hZCBjYWNoZS1idXN0ZXIgZm9yIGAvaGlzdG9ncmFtYCDigJQgdGhlIHNlcnZlciBtYXJrcyB0aGVcbiAgICogIHJlc3BvbnNlIGNhY2hlYWJsZSBmb3IgMjRoLCBhbmQgYSBoYXJkIHJlZnJlc2ggY2FuJ3QgYnVzdCBhIHBvc3QtbG9hZFxuICAgKiAgWEhSLiBBIHRva2VuIHN0YWJsZSB3aXRoaW4gYSBzZXNzaW9uIGJ1dCBuZXcgb24gZWFjaCBmdWxsIGxvYWQga2VlcHMgdGhlXG4gICAqICBpbi1zZXNzaW9uIGRlZHVwICh2aWEgYG5hdGl2ZUhpc3RvZ3JhbXNgKSB3aGlsZSBhbHdheXMgcmVmbGVjdGluZyB0aGVcbiAgICogIGxpdmUgYmFja2VuZCBhZnRlciBhIHJlbG9hZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0Q2FjaGVCdXN0ZXIgPSBEYXRlLm5vdygpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGFwaTogc3RyaW5nLFxuICAgIHByaXZhdGUgaG9zdDogSGlzdG9ncmFtU2FtcGxlckhvc3QsXG4gICkge31cblxuICAvKiogVGhlIHNhbXBsZWQgaGlzdG9ncmFtIGZvciBvbmUgY2hhbm5lbCBvZiBzbGljZSB6LCBvciBudWxsIHVudGlsIHRoZVxuICAgKiAgYXN5bmMgc2FtcGxpbmcgcmVzb2x2ZXMgKG9yIGlmIGl0IHdhcyBza2lwcGVkKS4gKi9cbiAgZ2V0KHo6IG51bWJlciwgY2hhbm5lbEluZGV4OiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VIaXN0b2dyYW1zLmdldCh6KT8uW2NoYW5uZWxJbmRleF0gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcm9wIGV2ZXJ5dGhpbmcgKHRlYXJkb3duIC8gaW1hZ2Ugc3dpdGNoKS4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItY2hhbm5lbCBpbnRlbnNpdHkgaGlzdG9ncmFtcyBmb3IgbXVsdGljaGFubmVsIGltYWdlczogc2FtcGxlIGVhY2hcbiAgICogY2hhbm5lbCdzIHNpbmdsZS1iYW5kIHRpbGVzIGF0IHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGFuZCBiaW4gdGhlXG4gICAqIGx1bWluYW5jZS4gRmlyZS1hbmQtZm9yZ2V0LlxuICAgKi9cbiAgYXN5bmMgY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXMoZDogU2FtcGxlZERlc2NyaXB0b3IsIGluZm9CNjQ6IHN0cmluZywgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgICAgLy8gU2FtcGxlIHRoZSBDT0FSU0VTVCByZWFsIGxldmVsIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IGF0IHJlYWxcbiAgICAgIC8vIHJlc29sdXRpb25zOyB0aGUgY29hcnNlc3QgaXMgc21hbGwgZW5vdWdoIHRvIGJpbiBldmVuIGZvciB3aG9sZS1zbGlkZXMpLlxuICAgICAgY29uc3QgcmVzID0gTWF0aC5tYXgoMCwgdGhpcy5ob3N0LnJlYWxMZXZlbHMoKSAtIDEpO1xuICAgICAgY29uc3QgbHZsID0gZC5sZXZlbHM/LltyZXNdO1xuICAgICAgY29uc3QgbHcgPSBsdmw/LndpZHRoID8/IGQud2lkdGg7XG4gICAgICBjb25zdCBsaCA9IGx2bD8uaGVpZ2h0ID8/IGQuaGVpZ2h0O1xuICAgICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsdyAvIHQpKTtcbiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGggLyB0KSk7XG4gICAgICBpZiAoY29scyAqIHJvd3MgPiA2NCkgcmV0dXJuOyAvLyBldmVuIHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGlzIHRvbyBiaWdcbiAgICAgIGNvbnN0IG5DaCA9IHRoaXMuaG9zdC5jaGFubmVsQ291bnQoZCk7XG4gICAgICBpZiAobkNoIDwgMSkgcmV0dXJuO1xuICAgICAgY29uc3QgY291bnRzOiBudW1iZXJbXVtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbkNoIH0sICgpID0+IG5ldyBBcnJheSgyNTYpLmZpbGwoMCkpO1xuICAgICAgY29uc3Qgam9iczogQXJyYXk8UHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuQ2g7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gYnVpbGRUaWxlVXJsKHRoaXMuYXBpLCBpbmZvQjY0LCB7IHJlcywgY29sLCByb3csIHosIHRpbGVTaXplOiB0LCBjaGFubmVsOiBjIH0pO1xuICAgICAgICAgICAgam9icy5wdXNoKFxuICAgICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCBmZXRjaFRpbGVSZ2JhKHRoaXMuaHR0cCwgdXJsLCAyMDAwMCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWltZykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGltZy5kYXRhO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2MgPSBjb3VudHNbY107XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgY2NbbWF4UmdiKGRhdGFbaV0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSldKys7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgdGlsZSDigJQgdGhlIGhpc3RvZ3JhbSBpcyBqdXN0IG1pc3NpbmcgaXRzIGNvdW50cy5cbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignW3ZpejpoaXN0b2dyYW1dIGNoYW5uZWwgdGlsZSBzYW1wbGUgZmFpbGVkLCBza2lwcGluZycsIHVybCwgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoam9icyk7XG4gICAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5zZXQoeiwgY291bnRzLm1hcCgoYykgPT4gaGlzdG9ncmFtMjU2KGMpKSk7XG4gICAgICB0aGlzLmhvc3Qub25DaGFubmVsSGlzdG9ncmFtc1NhbXBsZWQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIExlYXZlIGhpc3RvZ3JhbXMgdW5zZXQgKHRoZSBwYW5lIHNob3dzIGVtcHR5KSDigJQgYnV0IHNheSB3aHkuXG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6aGlzdG9ncmFtXSBtdWx0aWNoYW5uZWwgaGlzdG9ncmFtIHNhbXBsaW5nIGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYSBwZXItaW1hZ2UgaW50ZW5zaXR5IHdpbmRvdyBbbWluLG1heF0gZm9yIGdyYXlzY2FsZSBhdXRvLXJhbmdpbmcsXG4gICAqIG1pcnJvcmluZyB0aGUgaGVhdG1hcCdzIGF1dG8tc3RyZXRjaC4gVHdvIGNvbnN0cmFpbnRzIGZvcmNlIHRoZSBzYW1wbGluZ1xuICAgKiBzdHJhdGVneTpcbiAgICogIC0gVGhlIHdpbmRvdyBNVVNUIGJlIGluIHRoZSBzYW1lIHZhbHVlIHNwYWNlIGFzIHRoZSBkaXNwbGF5ZWQgdGlsZXM6IHRoZVxuICAgKiAgICBgL3ByZXZpZXdgIGVuZHBvaW50IGlzIHNlcnZlci1ub3JtYWxpemVkIHdoaWxlIGAvdGlsZWAgc2VydmVzIHJhd1xuICAgKiAgICB1bi1ub3JtYWxpemVkIDgtYml0IOKAlCBhIHdpbmRvdyBmcm9tIHRoZSBwcmV2aWV3IHdvdWxkbid0IG1hdGNoLlxuICAgKiAgLSBJdCBtdXN0IHJlYWQgRlVMTC1SRVNPTFVUSU9OIHRpbGVzLCBub3QgYSBkb3duc2FtcGxlZCBvdmVydmlldzpcbiAgICogICAgYXZlcmFnaW5nIHNwYXJzZSBsb3cgdmFsdWVzIChsYWJlbCBtYXNrcykgdG93YXJkIDAgd2lwZXMgdGhlIHNpZ25hbC5cbiAgICogU28gd2Ugc2FtcGxlIHRoZSBmdWxsLXJlcyBsZXZlbCBhY3Jvc3MgdGhlIHdob2xlIGltYWdlIOKAlCBib3VuZGVkIHRvIDY0XG4gICAqIHRpbGVzIChhIGh1Z2UgZ3JheXNjYWxlIGltYWdlIHNhbXBsZXMgdGhlIGNvYXJzZXN0IG92ZXJ2aWV3IGZvciBoaXN0b2dyYW1zXG4gICAqIG9ubHkpLiBGaXJlLWFuZC1mb3JnZXQ7IGZhaWx1cmVzIGxlYXZlIHRoZSB3aW5kb3cgdW5zZXQgKGlkZW50aXR5IDAuLjI1NSkuXG4gICAqL1xuICBhc3luYyBjb21wdXRlSW1hZ2VXaW5kb3coZDogU2FtcGxlZERlc2NyaXB0b3IsIGluZm9CNjQ6IHN0cmluZywgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ3JheSA9IHRoaXMuaG9zdC5pc0dyYXlzY2FsZSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICAgIC8vIFNhbXBsZSBmdWxsLXJlc29sdXRpb24gd2hlbiB0aGUgZ3JpZCBpcyBzbWFsbCAoYWNjdXJhdGUgZm9yIHRoZSBncmF5c2NhbGVcbiAgICAgIC8vIGF1dG8td2luZG93KTsgb3RoZXJ3aXNlIHNhbXBsZSB0aGUgY29hcnNlc3Qgb3ZlcnZpZXcganVzdCBmb3IgaGlzdG9ncmFtc1xuICAgICAgLy8gKHdob2xlLXNsaWRlIGltYWdlcykuIFJHQiBvbmx5IG5lZWRzIHRoZSBoaXN0b2dyYW1zLCBub3QgYW4gYXV0by13aW5kb3cuXG4gICAgICBsZXQgcmVzID0gMDtcbiAgICAgIGxldCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGQud2lkdGggLyB0KSk7XG4gICAgICBsZXQgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChkLmhlaWdodCAvIHQpKTtcbiAgICAgIGxldCBmdWxsUmVzID0gdHJ1ZTtcbiAgICAgIGlmIChjb2xzICogcm93cyA+IDY0KSB7XG4gICAgICAgIHJlcyA9IE1hdGgubWF4KDAsIChkLmxldmVscz8ubGVuZ3RoID8/IDEpIC0gMSk7XG4gICAgICAgIGNvbnN0IGx2bCA9IGQubGV2ZWxzPy5bcmVzXTtcbiAgICAgICAgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgobHZsPy53aWR0aCA/PyBkLndpZHRoKSAvIHQpKTtcbiAgICAgICAgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgobHZsPy5oZWlnaHQgPz8gZC5oZWlnaHQpIC8gdCkpO1xuICAgICAgICBmdWxsUmVzID0gZmFsc2U7XG4gICAgICAgIGlmIChjb2xzICogcm93cyA+IDM2KSByZXR1cm47IC8vIGV2ZW4gdGhlIGNvYXJzZXN0IGlzIHRvbyBiaWcg4oCUIGdpdmUgdXBcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvb3JkczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbXTtcbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaChbY29sLCByb3ddKTtcbiAgICAgIH1cbiAgICAgIGxldCBtaW4gPSAyNTU7XG4gICAgICBsZXQgbWF4ID0gMDtcbiAgICAgIGNvbnN0IGNSID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICAgIGNvbnN0IGNHID0gZ3JheSA/IG51bGwgOiBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgICAgY29uc3QgY0IgPSBncmF5ID8gbnVsbCA6IG5ldyBBcnJheSgyNTYpLmZpbGwoMCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29vcmRzLm1hcChhc3luYyAoW2NvbCwgcm93XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IGJ1aWxkVGlsZVVybCh0aGlzLmFwaSwgaW5mb0I2NCwgeyByZXMsIGNvbCwgcm93LCB6LCB0aWxlU2l6ZTogdCB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgZmV0Y2hUaWxlUmdiYSh0aGlzLmh0dHAsIHVybCwgMjAwMDApO1xuICAgICAgICAgICAgaWYgKCFpbWcpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBpbWcuZGF0YTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgM10gPT09IDApIGNvbnRpbnVlOyAvLyBza2lwIHRyYW5zcGFyZW50IHBhZGRpbmdcbiAgICAgICAgICAgICAgaWYgKGdyYXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gbWF4UmdiKGRhdGFbaV0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSk7XG4gICAgICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHY7XG4gICAgICAgICAgICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHY7XG4gICAgICAgICAgICAgICAgY1Jbdl0rKztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjUltkYXRhW2ldXSsrO1xuICAgICAgICAgICAgICAgIGNHIVtkYXRhW2kgKyAxXV0rKztcbiAgICAgICAgICAgICAgICBjQiFbZGF0YVtpICsgMl1dKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyB0aWxlIOKAlCB3aW5kb3cvaGlzdG9ncmFtIGp1c3QgbG9zZSBpdHMgc2FtcGxlcy5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW3Zpejp3aW5kb3ddIHRpbGUgc2FtcGxlIGZhaWxlZCwgc2tpcHBpbmcnLCB1cmwsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICAvLyBDYWNoZSBwZXItY2hhbm5lbCBoaXN0b2dyYW1zOiBncmF5c2NhbGUg4oaSIFtpbnRlbnNpdHldOyBSR0Ig4oaSIFtSLCBHLCBCXS5cbiAgICAgIHRoaXMuc2xpY2VIaXN0b2dyYW1zLnNldChcbiAgICAgICAgeiwgZ3JheSA/IFtoaXN0b2dyYW0yNTYoY1IpXSA6IFtoaXN0b2dyYW0yNTYoY1IpLCBoaXN0b2dyYW0yNTYoY0chKSwgaGlzdG9ncmFtMjU2KGNCISldLFxuICAgICAgKTtcbiAgICAgIC8vIEdyYXlzY2FsZSBhdXRvLXdpbmRvdyDigJQgb25seSBmcm9tIGZ1bGwtcmVzIHNhbXBsZXMgKGNvYXJzZXN0IGF2ZXJhZ2luZ1xuICAgICAgLy8gaXMgaW5hY2N1cmF0ZSk7IHRoZSBob3N0IHNlZWRzIHRoZSBjaGFubmVsIG9yIHJlLWludmFsaWRhdGVzLlxuICAgICAgaWYgKGdyYXkgJiYgZnVsbFJlcyAmJiBtYXggPiBtaW4gJiYgKG1pbiA+IDAgfHwgbWF4IDwgMjU1KSkge1xuICAgICAgICB0aGlzLmhvc3Qub25HcmF5V2luZG93U2FtcGxlZChtaW4sIG1heCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6d2luZG93XSBwZXItaW1hZ2Ugd2luZG93IGNvbXB1dGUgZmFpbGVkIOKAlCB1c2luZyBpZGVudGl0eSAwLi4yNTUnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGllbnQtc2lkZSBoaXN0b2dyYW0gZm9yIHRoZSBTSU1QTEUgKGB0aWxlZDpmYWxzZWApIHBhdGg6IGJpbiBhblxuICAgKiBhbHJlYWR5LWRlY29kZWQgUkdCQSBmcmFtZSdzIE9XTiBwaXhlbHMg4oCUIG5vIHRpbGUgc2VydmVyLCBubyBmZXRjaC4gU2FtZVxuICAgKiBvdXRwdXQgc2hhcGUgYXMge0BsaW5rIGNvbXB1dGVJbWFnZVdpbmRvd306IGdyYXlzY2FsZSDihpIgW2ludGVuc2l0eV07XG4gICAqIFJHQiDihpIgW1IsIEcsIEJdLiBUaGlzIGlzIHdoYXQgbGV0cyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSB3b3JrIGZvclxuICAgKiBzZXJ2ZXJsZXNzIGltYWdlcyAodGhlIHByb2Nlc3NpbmctcGlwZWxpbmUgcHJldmlldywgRElDT00vVElGRiBzdGFja3MpLFxuICAgKiB3aGljaCBuZXZlciBoaXQgdGhlIHRpbGUgLyBgL2hpc3RvZ3JhbWAgZW5kcG9pbnRzLlxuICAgKi9cbiAgY29tcHV0ZVNpbXBsZUhpc3RvZ3JhbSh6OiBudW1iZXIsIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5IHwgVWludDhBcnJheSwgZ3JheTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGNSID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBjb25zdCBjRyA9IGdyYXkgPyBudWxsIDogbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBjb25zdCBjQiA9IGdyYXkgPyBudWxsIDogbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkYXRhW2kgKyAzXSA9PT0gMCkgY29udGludWU7IC8vIHNraXAgdHJhbnNwYXJlbnQgcGFkZGluZ1xuICAgICAgaWYgKGdyYXkpIHtcbiAgICAgICAgY1JbbWF4UmdiKGRhdGFbaV0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSldKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjUltkYXRhW2ldXSsrO1xuICAgICAgICBjRyFbZGF0YVtpICsgMV1dKys7XG4gICAgICAgIGNCIVtkYXRhW2kgKyAyXV0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zbGljZUhpc3RvZ3JhbXMuc2V0KFxuICAgICAgeiwgZ3JheSA/IFtoaXN0b2dyYW0yNTYoY1IpXSA6IFtoaXN0b2dyYW0yNTYoY1IpLCBoaXN0b2dyYW0yNTYoY0chKSwgaGlzdG9ncmFtMjU2KGNCISldLFxuICAgICk7XG4gICAgdGhpcy5ob3N0Lm9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLWNoYW5uZWwgaGlzdG9ncmFtcyBmb3IgYSBTSU1QTEUgKGB0aWxlZDpmYWxzZWApIE1VTFRJQ0hBTk5FTCBpbWFnZTogYmluXG4gICAqIGVhY2ggYWxyZWFkeS1kZWNvZGVkIGNoYW5uZWwgcGxhbmUncyBvd24gcGl4ZWxzIChubyB0aWxlIHNlcnZlcikuIE9uZVxuICAgKiBoaXN0b2dyYW0gcGVyIGNoYW5uZWwsIHNvIHRoZSBwYW5lJ3MgcGVyLWNoYW5uZWwgc2VsZWN0b3Igd29ya3Mgc2VydmVybGVzc2x5LlxuICAgKi9cbiAgY29tcHV0ZVNpbXBsZU11bHRpY2hhbm5lbEhpc3RvZ3JhbXMoXG4gICAgejogbnVtYmVyLCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXkgfCBVaW50OEFycmF5IH0+LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5zZXQoXG4gICAgICB6LFxuICAgICAgcGxhbmVzLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCBjID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgZCA9IHAuZGF0YTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgaWYgKGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICBjW2RbaV1dKys7IC8vIHNpbmdsZS1iYW5kIHBsYW5lOiBSPUc9QiwgYmluIFJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlzdG9ncmFtMjU2KGMpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmhvc3Qub25DaGFubmVsSGlzdG9ncmFtc1NhbXBsZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXRpdmUtYml0LWRlcHRoIGhpc3RvZ3JhbSBmb3IgPjgtYml0IGltYWdlcywgZnJvbSB0aGUgc2VydmVyIGAvaGlzdG9ncmFtYFxuICAgKiBlbmRwb2ludCAodGhlIDgtYml0IGNhbnZhcyB0aWxlcyBjYW4ndCBjYXJyeSAxNi1iaXQgdmFsdWVzKS4gQ2FjaGVkIHBlclxuICAgKiBzbGljZStjaGFubmVsIGZvciB0aGUgc2Vzc2lvbi5cbiAgICovXG4gIG5hdGl2ZSQoaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIsIGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIGNvbnN0IGtleSA9IGAke3p9fCR7Y2hhbm5lbH1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubmF0aXZlSGlzdG9ncmFtcy5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gb2YoY2FjaGVkKTtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlKGluZm9CNjQsIHosIGNoYW5uZWwsIGJpbnMsIGtleSkpO1xuICB9XG5cbiAgLyoqIEZldGNoICsgY2FjaGUgb25lIGNoYW5uZWwncyBuYXRpdmUgaGlzdG9ncmFtIGZyb20gYEdFVCAvaGlzdG9ncmFtYC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE5hdGl2ZShcbiAgICBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbDogbnVtYmVyLCBiaW5zOiBudW1iZXIsIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9aGlzdG9ncmFtP2luZm89JHtpbmZvQjY0fSZjaGFubmVsPSR7Y2hhbm5lbH0mej0ke3p9JmJpbnM9JHtiaW5zfSZfPSR7dGhpcy5oaXN0Q2FjaGVCdXN0ZXJ9YDtcbiAgICB0cnkge1xuICAgICAgLy8gSHR0cENsaWVudCBjYWxscyBnZXQgYXV0aCB2aWEgdGhlIEFuZ3VsYXIgaW50ZXJjZXB0b3IgKHVubGlrZSBPU0QncyBvd25cbiAgICAgIC8vIGFqYXggdGlsZSBsb2FkZXIsIHdoaWNoIG5lZWRzIGF1dGhIZWFkZXJzKSDigJQgbWlycm9yIHRoZSBvdGhlciBmZXRjaGVzLlxuICAgICAgY29uc3QgaGkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLmdldDx7XG4gICAgICAgICAgICBiaXREZXB0aDogbnVtYmVyOyByYW5nZU1pbjogbnVtYmVyOyByYW5nZU1heDogbnVtYmVyO1xuICAgICAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjsgb2JzZXJ2ZWRNYXg6IG51bWJlcjsgYmluV2lkdGg6IG51bWJlcjsgY291bnRzOiBudW1iZXJbXTtcbiAgICAgICAgICB9Pih1cmwpXG4gICAgICAgICAgLnBpcGUodGltZW91dCg0NTAwMCkpLFxuICAgICAgKTtcbiAgICAgIGlmICghaGkgfHwgIWhpLmNvdW50cykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBvdXQ6IElIaXN0b2dyYW0gPSB7XG4gICAgICAgIC8vIE5hdGl2ZSBiaW4gbGVmdC1lZGdlczogcmFuZ2VNaW4gKyBpKmJpbldpZHRoLlxuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgYSB0cmFuc2llbnQgZXJyb3Ig4oaSIG51bGw7IHRoZSBwYW5lIHJldHJpZXMuXG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6aGlzdG9ncmFtXSBuYXRpdmUgaGlzdG9ncmFtIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9ncmFtLXNhbXBsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2QvaGlzdG9ncmFtLXNhbXBsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFjLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQW9DakUsTUFBTSxPQUFPLGdCQUFnQjtJQWdCM0IsWUFDVSxJQUFnQixFQUNoQixHQUFXLEVBQ1gsSUFBMEI7UUFGMUIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQ1gsU0FBSSxHQUFKLElBQUksQ0FBc0I7UUFsQnBDLG1FQUFtRTtRQUMzRCxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQzFEO29EQUM0QztRQUNwQyxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUN6RDs7Ozt3QkFJZ0I7UUFDUixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCO3VFQUMrRDtRQUM5QyxhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQU0zQyxDQUFDO0lBRUo7MERBQ3NEO0lBQ3RELEdBQUcsQ0FBQyxDQUFTLEVBQUUsWUFBb0I7UUFDakMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM3RCxDQUFDO0lBRUQ7bURBQytDO0lBQ3ZDLGdCQUFnQixDQUFDLENBQVM7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O0lBRUQ7O2lEQUU2QztJQUNyQyxLQUFLLENBQUMsV0FBVyxDQUN2QixPQUFlLEVBQ2YsQ0FBUyxFQUNULE9BQWUsRUFDZixJQUFZLEVBQ1osR0FBVztRQUVYLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDNUIsSUFBSSxDQUFDO1lBQ0gsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE1BQU0sR0FBRyxHQUFHLE1BQU0sZUFBZSxDQUMvQixhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUN4QixJQUFJLENBQUMsR0FBRyxFQUNSLE9BQU8sRUFDUCxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQ3BCLEdBQUcsQ0FBQyxNQUFNLENBQ1gsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxHQUFHO2dCQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsK0NBQStDO1lBQ3RFLDBFQUEwRTtZQUMxRSwyRUFBMkU7WUFDM0UsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDhDQUE4QztZQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZFRpbGVVcmwsIGZldGNoVGlsZVJnYmEgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IGh0dHBGZXRjaEpzb24sIG5hdGl2ZUhpc3RvZ3JhbSwgdGltZW91dFNpZ25hbCB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IGhpc3RvZ3JhbTI1NiwgbWF4UmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5cbi8qKlxuICogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgZm9yIHRoZSBPU0QgYmFja2VuZCAocmVmYWN0b3JpbmcgcGxhbixcbiAqIFN0ZXAgNCDigJQgYSBwdXJlIG1vdmUgb3V0IG9mIHRoZSB2aXN1YWxpemVyIHNlcnZpY2UpLiBPd25zIHRoZSBwZXItc2xpY2VcbiAqIDgtYml0IGhpc3RvZ3JhbXMgKHNhbXBsZWQgZnJvbSBkaXNwbGF5ZWQgdGlsZXMpIGFuZCB0aGUgbmF0aXZlLWJpdC1kZXB0aFxuICogaGlzdG9ncmFtcyAoZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIgYC9oaXN0b2dyYW1gIGVuZHBvaW50KS4gUmVhZC1vbmx5IHdpdGhcbiAqIHJlc3BlY3QgdG8gdGhlIHRpbGUvZGlzcGxheSBwaXBlbGluZS5cbiAqL1xuXG4vKiogVGhlIGRlc2NyaXB0b3IgZmllbGRzIHRoZSBzYW1wbGVycyByZWFkIChzdHJ1Y3R1cmFsbHkgc2F0aXNmaWVkIGJ5IHRoZVxuICogIHNlcnZpY2UncyBUaWxlRGVzY3JpcHRvcikuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbXBsZWREZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIGNoYW5uZWxzPzogbnVtYmVyO1xuICBsZXZlbHM/OiBBcnJheTx7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvZ3JhbVNhbXBsZXJIb3N0IHtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IHRoZXJlKS4gKi9cbiAgcmVhbExldmVscygpOiBudW1iZXI7XG4gIC8qKiBDaGFubmVsIGNvdW50IGZvciB0aGUgbXVsdGljaGFubmVsIHNhbXBsZXIuICovXG4gIGNoYW5uZWxDb3VudChkOiBTYW1wbGVkRGVzY3JpcHRvcik6IG51bWJlcjtcbiAgLyoqIEdyYXlzY2FsZSAoaW50ZW5zaXR5IGhpc3RvZ3JhbSArIGF1dG8td2luZG93KSB2cyBSR0IgKFIvRy9CIGhpc3RvZ3JhbXMpLiAqL1xuICBpc0dyYXlzY2FsZSgpOiBib29sZWFuO1xuICAvKiogSGlzdG9ncmFtcyBsYW5kZWQg4oCUIG51ZGdlIHRoZSBwYW5lIHRvIHJlLXJlYWQgKGl0cyByZXRyeSB3aW5kb3cgbWF5IGhhdmVcbiAgICogIGxhcHNlZCkuICovXG4gIG9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk6IHZvaWQ7XG4gIC8qKiBBIGdyYXlzY2FsZSBhdXRvLXdpbmRvdyB3YXMgbWVhc3VyZWQgZnJvbSBzbGljZSBgemAncyBmdWxsLXJlcyB0aWxlcyDigJRcbiAgICogIHNlZWQgdGhlIEludGVuc2l0eSBjaGFubmVsIChvciByZS1pbnZhbGlkYXRlIGlmIHRoZSB1c2VyIGFscmVhZHlcbiAgICogIHdpbmRvd2VkKS4gQmFja2dyb3VuZC1wcmVsb2FkZWQgc2xpY2VzIHJlcG9ydCB0b287IHRoZSBob3N0IGRlY2lkZXMuICovXG4gIG9uR3JheVdpbmRvd1NhbXBsZWQobWluOiBudW1iZXIsIG1heDogbnVtYmVyLCB6OiBudW1iZXIpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgSGlzdG9ncmFtU2FtcGxlciB7XG4gIC8qKiAyNTYtYmluIGludGVuc2l0eSBoaXN0b2dyYW0gcGVyIHotc2xpY2UsIGZyb20gc2FtcGxlZCB0aWxlcy4gKi9cbiAgcHJpdmF0ZSBzbGljZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPG51bWJlciwgSUhpc3RvZ3JhbVtdPigpO1xuICAvKiogTmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW1zIGZyb20gYC9oaXN0b2dyYW1gLCBrZXllZFxuICAgKiAgYCR7aW5mb0I2NH18JHt6fXwke2NoYW5uZWx9fCR7Ymluc31gLiAqL1xuICBwcml2YXRlIG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcbiAgLyoqIEJ1bXBlZCBieSB7QGxpbmsgY2xlYXJ9LiBFdmVyeSBhc3luYyBzYW1wbGVyIGNhcHR1cmVzIGl0IGJlZm9yZSBpdHMgZmlyc3RcbiAgICogIGBhd2FpdGAgYW5kIGRyb3BzIGl0cyByZXN1bHQgaWYgaXQgY2hhbmdlZDogdGlsZSBzYW1wbGluZyBhbmQgdGhlIG5hdGl2ZVxuICAgKiAgZmV0Y2ggY2FuIHRha2UgdGVucyBvZiBzZWNvbmRzLCBhbmQgYSBydW4gZm9yIHRoZSBwcmV2aW91cyBpbWFnZSBtdXN0IG5vdFxuICAgKiAgd3JpdGUgdGhhdCBpbWFnZSdzIGhpc3RvZ3JhbSwgYXV0by13aW5kb3cgb3IgbmF0aXZlIGhpc3RvZ3JhbSBpbnRvIHRoZVxuICAgKiAgbmV4dCBvbmUuICovXG4gIHByaXZhdGUgZ2VuZXJhdGlvbiA9IDA7XG4gIC8qKiBTbGljZXMgd2hvc2UgdGlsZSBzYW1wbGluZyBpcyBpbiBmbGlnaHQsIHNvIGEgc2NydWIgYmFjayB0byBvbmUgKG9yIGFcbiAgICogIGJhY2tncm91bmQgcHJlbG9hZCBvZiBpdCkgZG9lc24ndCBmZXRjaCBpdHMgdGlsZXMgYWdhaW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhcGk6IHN0cmluZyxcbiAgICBwcml2YXRlIGhvc3Q6IEhpc3RvZ3JhbVNhbXBsZXJIb3N0LFxuICApIHt9XG5cbiAgLyoqIFRoZSBzYW1wbGVkIGhpc3RvZ3JhbSBmb3Igb25lIGNoYW5uZWwgb2Ygc2xpY2Ugeiwgb3IgbnVsbCB1bnRpbCB0aGVcbiAgICogIGFzeW5jIHNhbXBsaW5nIHJlc29sdmVzIChvciBpZiBpdCB3YXMgc2tpcHBlZCkuICovXG4gIGdldCh6OiBudW1iZXIsIGNoYW5uZWxJbmRleDogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNsaWNlSGlzdG9ncmFtcy5nZXQoeik/LltjaGFubmVsSW5kZXhdID8/IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciBzbGljZSB6IGlzIGFscmVhZHkgc2FtcGxlZCBvciBiZWluZyBzYW1wbGVkICh0aWxlIHNhbXBsZXJzIG9ubHlcbiAgICogIHJ1biBvbmNlIHBlciBzbGljZSB1bnRpbCB7QGxpbmsgY2xlYXJ9KS4gKi9cbiAgcHJpdmF0ZSBzYW1wbGVkT3JQZW5kaW5nKHo6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNsaWNlSGlzdG9ncmFtcy5oYXMoeikgfHwgdGhpcy5pbkZsaWdodC5oYXMoeik7XG4gIH1cblxuICAvKiogRHJvcCBldmVyeXRoaW5nICh0ZWFyZG93biAvIGltYWdlIHN3aXRjaCkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGlvbisrO1xuICAgIHRoaXMuaW5GbGlnaHQuY2xlYXIoKTtcbiAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5jbGVhcigpO1xuICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlci1jaGFubmVsIGludGVuc2l0eSBoaXN0b2dyYW1zIGZvciBtdWx0aWNoYW5uZWwgaW1hZ2VzOiBzYW1wbGUgZWFjaFxuICAgKiBjaGFubmVsJ3Mgc2luZ2xlLWJhbmQgdGlsZXMgYXQgdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgYW5kIGJpbiB0aGVcbiAgICogbHVtaW5hbmNlLiBGaXJlLWFuZC1mb3JnZXQuXG4gICAqL1xuICBhc3luYyBjb21wdXRlTXVsdGlDaGFubmVsSGlzdG9ncmFtcyhkOiBTYW1wbGVkRGVzY3JpcHRvciwgaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zYW1wbGVkT3JQZW5kaW5nKHopKSByZXR1cm47XG4gICAgY29uc3QgZ2VuID0gdGhpcy5nZW5lcmF0aW9uO1xuICAgIHRoaXMuaW5GbGlnaHQuYWRkKHopO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICAgIC8vIFNhbXBsZSB0aGUgQ09BUlNFU1QgcmVhbCBsZXZlbCAocGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSBhdCByZWFsXG4gICAgICAvLyByZXNvbHV0aW9uczsgdGhlIGNvYXJzZXN0IGlzIHNtYWxsIGVub3VnaCB0byBiaW4gZXZlbiBmb3Igd2hvbGUtc2xpZGVzKS5cbiAgICAgIGNvbnN0IHJlcyA9IE1hdGgubWF4KDAsIHRoaXMuaG9zdC5yZWFsTGV2ZWxzKCkgLSAxKTtcbiAgICAgIGNvbnN0IGx2bCA9IGQubGV2ZWxzPy5bcmVzXTtcbiAgICAgIGNvbnN0IGx3ID0gbHZsPy53aWR0aCA/PyBkLndpZHRoO1xuICAgICAgY29uc3QgbGggPSBsdmw/LmhlaWdodCA/PyBkLmhlaWdodDtcbiAgICAgIGNvbnN0IGNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHcgLyB0KSk7XG4gICAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxoIC8gdCkpO1xuICAgICAgaWYgKGNvbHMgKiByb3dzID4gNjQpIHJldHVybjsgLy8gZXZlbiB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCBpcyB0b28gYmlnXG4gICAgICBjb25zdCBuQ2ggPSB0aGlzLmhvc3QuY2hhbm5lbENvdW50KGQpO1xuICAgICAgaWYgKG5DaCA8IDEpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvdW50czogbnVtYmVyW11bXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG5DaCB9LCAoKSA9PiBuZXcgQXJyYXkoMjU2KS5maWxsKDApKTtcbiAgICAgIGNvbnN0IGpvYnM6IEFycmF5PFByb21pc2U8dm9pZD4+ID0gW107XG4gICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykge1xuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykge1xuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbkNoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGJ1aWxkVGlsZVVybCh0aGlzLmFwaSwgaW5mb0I2NCwgeyByZXMsIGNvbCwgcm93LCB6LCB0aWxlU2l6ZTogdCwgY2hhbm5lbDogYyB9KTtcbiAgICAgICAgICAgIGpvYnMucHVzaChcbiAgICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgZmV0Y2hUaWxlUmdiYSh0aGlzLmh0dHAsIHVybCwgMjAwMDApO1xuICAgICAgICAgICAgICAgICAgaWYgKCFpbWcpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBpbWcuZGF0YTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNjID0gY291bnRzW2NdO1xuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGNjW21heFJnYihkYXRhW2ldLCBkYXRhW2kgKyAxXSwgZGF0YVtpICsgMl0pXSsrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHRpbGUg4oCUIHRoZSBoaXN0b2dyYW0gaXMganVzdCBtaXNzaW5nIGl0cyBjb3VudHMuXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXo6aGlzdG9ncmFtXSBjaGFubmVsIHRpbGUgc2FtcGxlIGZhaWxlZCwgc2tpcHBpbmcnLCB1cmwsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGpvYnMpO1xuICAgICAgaWYgKGdlbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSByZXR1cm47IC8vIGNsZWFyZWQgbWVhbndoaWxlIChpbWFnZSBzd2l0Y2gpXG4gICAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5zZXQoXG4gICAgICAgIHosXG4gICAgICAgIGNvdW50cy5tYXAoKGMpID0+IGhpc3RvZ3JhbTI1NihjKSksXG4gICAgICApO1xuICAgICAgdGhpcy5ob3N0Lm9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBMZWF2ZSBoaXN0b2dyYW1zIHVuc2V0ICh0aGUgcGFuZSBzaG93cyBlbXB0eSkg4oCUIGJ1dCBzYXkgd2h5LlxuICAgICAgY29uc29sZS53YXJuKCdbdml6Omhpc3RvZ3JhbV0gbXVsdGljaGFubmVsIGhpc3RvZ3JhbSBzYW1wbGluZyBmYWlsZWQnLCBlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZ2VuID09PSB0aGlzLmdlbmVyYXRpb24pIHRoaXMuaW5GbGlnaHQuZGVsZXRlKHopO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIGEgcGVyLWltYWdlIGludGVuc2l0eSB3aW5kb3cgW21pbixtYXhdIGZvciBncmF5c2NhbGUgYXV0by1yYW5naW5nLFxuICAgKiBtaXJyb3JpbmcgdGhlIGhlYXRtYXAncyBhdXRvLXN0cmV0Y2guIFR3byBjb25zdHJhaW50cyBmb3JjZSB0aGUgc2FtcGxpbmdcbiAgICogc3RyYXRlZ3k6XG4gICAqICAtIFRoZSB3aW5kb3cgTVVTVCBiZSBpbiB0aGUgc2FtZSB2YWx1ZSBzcGFjZSBhcyB0aGUgZGlzcGxheWVkIHRpbGVzOiB0aGVcbiAgICogICAgYC9wcmV2aWV3YCBlbmRwb2ludCBpcyBzZXJ2ZXItbm9ybWFsaXplZCB3aGlsZSBgL3RpbGVgIHNlcnZlcyByYXdcbiAgICogICAgdW4tbm9ybWFsaXplZCA4LWJpdCDigJQgYSB3aW5kb3cgZnJvbSB0aGUgcHJldmlldyB3b3VsZG4ndCBtYXRjaC5cbiAgICogIC0gSXQgbXVzdCByZWFkIEZVTEwtUkVTT0xVVElPTiB0aWxlcywgbm90IGEgZG93bnNhbXBsZWQgb3ZlcnZpZXc6XG4gICAqICAgIGF2ZXJhZ2luZyBzcGFyc2UgbG93IHZhbHVlcyAobGFiZWwgbWFza3MpIHRvd2FyZCAwIHdpcGVzIHRoZSBzaWduYWwuXG4gICAqIFNvIHdlIHNhbXBsZSB0aGUgZnVsbC1yZXMgbGV2ZWwgYWNyb3NzIHRoZSB3aG9sZSBpbWFnZSDigJQgYm91bmRlZCB0byA2NFxuICAgKiB0aWxlcyAoYSBodWdlIGdyYXlzY2FsZSBpbWFnZSBzYW1wbGVzIHRoZSBjb2Fyc2VzdCBvdmVydmlldyBmb3IgaGlzdG9ncmFtc1xuICAgKiBvbmx5KS4gRmlyZS1hbmQtZm9yZ2V0OyBmYWlsdXJlcyBsZWF2ZSB0aGUgd2luZG93IHVuc2V0IChpZGVudGl0eSAwLi4yNTUpLlxuICAgKi9cbiAgYXN5bmMgY29tcHV0ZUltYWdlV2luZG93KGQ6IFNhbXBsZWREZXNjcmlwdG9yLCBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNhbXBsZWRPclBlbmRpbmcoeikpIHJldHVybjtcbiAgICBjb25zdCBncmF5ID0gdGhpcy5ob3N0LmlzR3JheXNjYWxlKCk7XG4gICAgY29uc3QgZ2VuID0gdGhpcy5nZW5lcmF0aW9uO1xuICAgIHRoaXMuaW5GbGlnaHQuYWRkKHopO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICAgIC8vIFNhbXBsZSBmdWxsLXJlc29sdXRpb24gd2hlbiB0aGUgZ3JpZCBpcyBzbWFsbCAoYWNjdXJhdGUgZm9yIHRoZSBncmF5c2NhbGVcbiAgICAgIC8vIGF1dG8td2luZG93KTsgb3RoZXJ3aXNlIHNhbXBsZSB0aGUgY29hcnNlc3Qgb3ZlcnZpZXcganVzdCBmb3IgaGlzdG9ncmFtc1xuICAgICAgLy8gKHdob2xlLXNsaWRlIGltYWdlcykuIFJHQiBvbmx5IG5lZWRzIHRoZSBoaXN0b2dyYW1zLCBub3QgYW4gYXV0by13aW5kb3cuXG4gICAgICBsZXQgcmVzID0gMDtcbiAgICAgIGxldCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGQud2lkdGggLyB0KSk7XG4gICAgICBsZXQgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChkLmhlaWdodCAvIHQpKTtcbiAgICAgIGxldCBmdWxsUmVzID0gdHJ1ZTtcbiAgICAgIGlmIChjb2xzICogcm93cyA+IDY0KSB7XG4gICAgICAgIHJlcyA9IE1hdGgubWF4KDAsIChkLmxldmVscz8ubGVuZ3RoID8/IDEpIC0gMSk7XG4gICAgICAgIGNvbnN0IGx2bCA9IGQubGV2ZWxzPy5bcmVzXTtcbiAgICAgICAgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgobHZsPy53aWR0aCA/PyBkLndpZHRoKSAvIHQpKTtcbiAgICAgICAgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgobHZsPy5oZWlnaHQgPz8gZC5oZWlnaHQpIC8gdCkpO1xuICAgICAgICBmdWxsUmVzID0gZmFsc2U7XG4gICAgICAgIGlmIChjb2xzICogcm93cyA+IDM2KSByZXR1cm47IC8vIGV2ZW4gdGhlIGNvYXJzZXN0IGlzIHRvbyBiaWcg4oCUIGdpdmUgdXBcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvb3JkczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbXTtcbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaChbY29sLCByb3ddKTtcbiAgICAgIH1cbiAgICAgIGxldCBtaW4gPSAyNTU7XG4gICAgICBsZXQgbWF4ID0gMDtcbiAgICAgIGNvbnN0IGNSID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICAgIGNvbnN0IGNHID0gZ3JheSA/IG51bGwgOiBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgICAgY29uc3QgY0IgPSBncmF5ID8gbnVsbCA6IG5ldyBBcnJheSgyNTYpLmZpbGwoMCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29vcmRzLm1hcChhc3luYyAoW2NvbCwgcm93XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IGJ1aWxkVGlsZVVybCh0aGlzLmFwaSwgaW5mb0I2NCwgeyByZXMsIGNvbCwgcm93LCB6LCB0aWxlU2l6ZTogdCB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgZmV0Y2hUaWxlUmdiYSh0aGlzLmh0dHAsIHVybCwgMjAwMDApO1xuICAgICAgICAgICAgaWYgKCFpbWcpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBpbWcuZGF0YTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgM10gPT09IDApIGNvbnRpbnVlOyAvLyBza2lwIHRyYW5zcGFyZW50IHBhZGRpbmdcbiAgICAgICAgICAgICAgaWYgKGdyYXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gbWF4UmdiKGRhdGFbaV0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSk7XG4gICAgICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHY7XG4gICAgICAgICAgICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHY7XG4gICAgICAgICAgICAgICAgY1Jbdl0rKztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjUltkYXRhW2ldXSsrO1xuICAgICAgICAgICAgICAgIGNHIVtkYXRhW2kgKyAxXV0rKztcbiAgICAgICAgICAgICAgICBjQiFbZGF0YVtpICsgMl1dKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyB0aWxlIOKAlCB3aW5kb3cvaGlzdG9ncmFtIGp1c3QgbG9zZSBpdHMgc2FtcGxlcy5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW3Zpejp3aW5kb3ddIHRpbGUgc2FtcGxlIGZhaWxlZCwgc2tpcHBpbmcnLCB1cmwsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBpZiAoZ2VuICE9PSB0aGlzLmdlbmVyYXRpb24pIHJldHVybjsgLy8gY2xlYXJlZCBtZWFud2hpbGUgKGltYWdlIHN3aXRjaClcbiAgICAgIC8vIENhY2hlIHBlci1jaGFubmVsIGhpc3RvZ3JhbXM6IGdyYXlzY2FsZSDihpIgW2ludGVuc2l0eV07IFJHQiDihpIgW1IsIEcsIEJdLlxuICAgICAgdGhpcy5zbGljZUhpc3RvZ3JhbXMuc2V0KFxuICAgICAgICB6LFxuICAgICAgICBncmF5ID8gW2hpc3RvZ3JhbTI1NihjUildIDogW2hpc3RvZ3JhbTI1NihjUiksIGhpc3RvZ3JhbTI1NihjRyEpLCBoaXN0b2dyYW0yNTYoY0IhKV0sXG4gICAgICApO1xuICAgICAgLy8gR3JheXNjYWxlIGF1dG8td2luZG93IOKAlCBvbmx5IGZyb20gZnVsbC1yZXMgc2FtcGxlcyAoY29hcnNlc3QgYXZlcmFnaW5nXG4gICAgICAvLyBpcyBpbmFjY3VyYXRlKTsgdGhlIGhvc3Qgc2VlZHMgdGhlIGNoYW5uZWwgb3IgcmUtaW52YWxpZGF0ZXMuXG4gICAgICBpZiAoZ3JheSAmJiBmdWxsUmVzICYmIG1heCA+IG1pbiAmJiAobWluID4gMCB8fCBtYXggPCAyNTUpKSB7XG4gICAgICAgIHRoaXMuaG9zdC5vbkdyYXlXaW5kb3dTYW1wbGVkKG1pbiwgbWF4LCB6KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3Zpejp3aW5kb3ddIHBlci1pbWFnZSB3aW5kb3cgY29tcHV0ZSBmYWlsZWQg4oCUIHVzaW5nIGlkZW50aXR5IDAuLjI1NScsIGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChnZW4gPT09IHRoaXMuZ2VuZXJhdGlvbikgdGhpcy5pbkZsaWdodC5kZWxldGUoeik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsaWVudC1zaWRlIGhpc3RvZ3JhbSBmb3IgdGhlIFNJTVBMRSAoYHRpbGVkOmZhbHNlYCkgcGF0aDogYmluIGFuXG4gICAqIGFscmVhZHktZGVjb2RlZCBSR0JBIGZyYW1lJ3MgT1dOIHBpeGVscyDigJQgbm8gdGlsZSBzZXJ2ZXIsIG5vIGZldGNoLiBTYW1lXG4gICAqIG91dHB1dCBzaGFwZSBhcyB7QGxpbmsgY29tcHV0ZUltYWdlV2luZG93fTogZ3JheXNjYWxlIOKGkiBbaW50ZW5zaXR5XTtcbiAgICogUkdCIOKGkiBbUiwgRywgQl0uIFRoaXMgaXMgd2hhdCBsZXRzIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHdvcmsgZm9yXG4gICAqIHNlcnZlcmxlc3MgaW1hZ2VzICh0aGUgcHJvY2Vzc2luZy1waXBlbGluZSBwcmV2aWV3LCBESUNPTS9USUZGIHN0YWNrcyksXG4gICAqIHdoaWNoIG5ldmVyIGhpdCB0aGUgdGlsZSAvIGAvaGlzdG9ncmFtYCBlbmRwb2ludHMuXG4gICAqL1xuICBjb21wdXRlU2ltcGxlSGlzdG9ncmFtKHo6IG51bWJlciwgZGF0YTogVWludDhDbGFtcGVkQXJyYXkgfCBVaW50OEFycmF5LCBncmF5OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY1IgPSBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgIGNvbnN0IGNHID0gZ3JheSA/IG51bGwgOiBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgIGNvbnN0IGNCID0gZ3JheSA/IG51bGwgOiBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBpZiAoZ3JheSkge1xuICAgICAgICBjUlttYXhSZ2IoZGF0YVtpXSwgZGF0YVtpICsgMV0sIGRhdGFbaSArIDJdKV0rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNSW2RhdGFbaV1dKys7XG4gICAgICAgIGNHIVtkYXRhW2kgKyAxXV0rKztcbiAgICAgICAgY0IhW2RhdGFbaSArIDJdXSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5zZXQoXG4gICAgICB6LFxuICAgICAgZ3JheSA/IFtoaXN0b2dyYW0yNTYoY1IpXSA6IFtoaXN0b2dyYW0yNTYoY1IpLCBoaXN0b2dyYW0yNTYoY0chKSwgaGlzdG9ncmFtMjU2KGNCISldLFxuICAgICk7XG4gICAgdGhpcy5ob3N0Lm9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLWNoYW5uZWwgaGlzdG9ncmFtcyBmb3IgYSBTSU1QTEUgKGB0aWxlZDpmYWxzZWApIE1VTFRJQ0hBTk5FTCBpbWFnZTogYmluXG4gICAqIGVhY2ggYWxyZWFkeS1kZWNvZGVkIGNoYW5uZWwgcGxhbmUncyBvd24gcGl4ZWxzIChubyB0aWxlIHNlcnZlcikuIE9uZVxuICAgKiBoaXN0b2dyYW0gcGVyIGNoYW5uZWwsIHNvIHRoZSBwYW5lJ3MgcGVyLWNoYW5uZWwgc2VsZWN0b3Igd29ya3Mgc2VydmVybGVzc2x5LlxuICAgKi9cbiAgY29tcHV0ZVNpbXBsZU11bHRpY2hhbm5lbEhpc3RvZ3JhbXMoejogbnVtYmVyLCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXkgfCBVaW50OEFycmF5IH0+KTogdm9pZCB7XG4gICAgdGhpcy5zbGljZUhpc3RvZ3JhbXMuc2V0KFxuICAgICAgeixcbiAgICAgIHBsYW5lcy5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgYyA9IG5ldyBBcnJheSgyNTYpLmZpbGwoMCk7XG4gICAgICAgIGNvbnN0IGQgPSBwLmRhdGE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgIGlmIChkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgY1tkW2ldXSsrOyAvLyBzaW5nbGUtYmFuZCBwbGFuZTogUj1HPUIsIGJpbiBSXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpc3RvZ3JhbTI1NihjKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5ob3N0Lm9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogTmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZm9yID44LWJpdCBpbWFnZXMsIGZyb20gdGhlIHNlcnZlciBgL2hpc3RvZ3JhbWBcbiAgICogZW5kcG9pbnQgKHRoZSA4LWJpdCBjYW52YXMgdGlsZXMgY2FuJ3QgY2FycnkgMTYtYml0IHZhbHVlcykuIENhY2hlZCBwZXJcbiAgICogaW1hZ2Urc2xpY2UrY2hhbm5lbCtiaW4gY291bnQgdW50aWwge0BsaW5rIGNsZWFyfS5cbiAgICovXG4gIG5hdGl2ZSQoaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIsIGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIGNvbnN0IGtleSA9IGAke2luZm9CNjR9fCR7en18JHtjaGFubmVsfXwke2JpbnN9YDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuZ2V0KGtleSk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgcmV0dXJuIGZyb20odGhpcy5mZXRjaE5hdGl2ZShpbmZvQjY0LCB6LCBjaGFubmVsLCBiaW5zLCBrZXkpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlIGhpc3RvZ3JhbSBmcm9tIGBHRVQgL2hpc3RvZ3JhbWBcbiAgICogICh0aGUgc2hhcmVkIGppdC1zZXJ2aWNlIGNsaWVudCwgd2hpY2ggYWRkcyB0aGUgcGVyLWFwcC1sb2FkIGNhY2hlLWJ1c3RlclxuICAgKiAgdGhhdCBkZWZlYXRzIHRoZSBzZXJ2ZXIncyAyNCBoIGNhY2hlKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE5hdGl2ZShcbiAgICBpbmZvQjY0OiBzdHJpbmcsXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAga2V5OiBzdHJpbmcsXG4gICk6IFByb21pc2U8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICBjb25zdCBnZW4gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgdHJ5IHtcbiAgICAgIC8vIEh0dHBDbGllbnQgY2FsbHMgZ2V0IGF1dGggdmlhIHRoZSBBbmd1bGFyIGludGVyY2VwdG9yICh1bmxpa2UgT1NEJ3Mgb3duXG4gICAgICAvLyBhamF4IHRpbGUgbG9hZGVyLCB3aGljaCBuZWVkcyBhdXRoSGVhZGVycykg4oCUIG1pcnJvciB0aGUgb3RoZXIgZmV0Y2hlcy5cbiAgICAgIGNvbnN0IHJlcSA9IHRpbWVvdXRTaWduYWwodW5kZWZpbmVkLCA0NTAwMCk7XG4gICAgICBjb25zdCBvdXQgPSBhd2FpdCBuYXRpdmVIaXN0b2dyYW0oXG4gICAgICAgIGh0dHBGZXRjaEpzb24odGhpcy5odHRwKSxcbiAgICAgICAgdGhpcy5hcGksXG4gICAgICAgIGluZm9CNjQsXG4gICAgICAgIHsgeiwgY2hhbm5lbCwgYmlucyB9LFxuICAgICAgICByZXEuc2lnbmFsLFxuICAgICAgKS5maW5hbGx5KHJlcS5kb25lKTtcbiAgICAgIGlmICghb3V0KSByZXR1cm4gbnVsbDsgLy8gMjAyIChzdGlsbCBjYWNoaW5nKSDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgLy8gQ2xlYXJlZCBtZWFud2hpbGUgKGltYWdlIHN3aXRjaCk6IHRoZSBoaXN0b2dyYW0gYmVsb25ncyB0byB0aGUgcHJldmlvdXNcbiAgICAgIC8vIGltYWdlIOKAlCBkb24ndCBjYWNoZSBpdCBvciBoYW5kIGl0IHRvIHRoZSBwYW5lIChudWxsIOKGkiB0aGUgcGFuZSByZXRyaWVzKS5cbiAgICAgIGlmIChnZW4gIT09IHRoaXMuZ2VuZXJhdGlvbikgcmV0dXJuIG51bGw7XG4gICAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuc2V0KGtleSwgb3V0KTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBBIHRyYW5zaWVudCBlcnJvciDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllcy5cbiAgICAgIGNvbnNvbGUud2FybignW3ZpejpoaXN0b2dyYW1dIG5hdGl2ZSBoaXN0b2dyYW0gZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19
|