@jax-data-science/sci-image-visualizer 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/esm2022/index.mjs +7 -1
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  4. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  6. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/viz-config.mjs +1 -1
  8. package/esm2022/lib/geometry/loft.mjs +128 -0
  9. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  10. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  11. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  12. package/esm2022/lib/geometry/section.mjs +215 -0
  13. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
  14. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
  15. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  16. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
  17. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
  19. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
  20. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
  21. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  22. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
  23. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  24. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
  25. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
  26. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
  27. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
  28. package/esm2022/lib/models/class-preset.mjs +1 -1
  29. package/esm2022/lib/models/polygon-factory.mjs +17 -1
  30. package/esm2022/lib/models/region-geojson.mjs +44 -6
  31. package/esm2022/lib/models/region.mjs +1 -1
  32. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  33. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  34. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +77 -13
  35. package/esm2022/lib/region-editor/region-editor.component.mjs +527 -42
  36. package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
  37. package/esm2022/lib/region-editor/region-persistence.service.mjs +36 -10
  38. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
  39. package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
  40. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  41. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  42. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  43. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  44. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  45. package/esm2022/lib/region-source/region-source.mjs +67 -0
  46. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  47. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  48. package/esm2022/lib/routing-visualizer.service.mjs +418 -22
  49. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  50. package/esm2022/lib/store/class-color.util.mjs +10 -5
  51. package/esm2022/lib/store/class-signatures.mjs +63 -0
  52. package/esm2022/lib/store/region-scope-cache.mjs +5 -1
  53. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  54. package/esm2022/lib/store/region-store.service.mjs +724 -12
  55. package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
  56. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
  57. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
  58. package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
  59. package/esm2022/lib/visualizer/region-load.mjs +67 -4
  60. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  61. package/esm2022/lib/visualizer.component.mjs +128 -6
  62. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs} +7239 -1153
  63. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  64. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs} +4 -4
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map} +1 -1
  66. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  67. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  68. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -3
  69. package/fesm2022/region-source.worker.js +1067 -0
  70. package/index.d.ts +6 -0
  71. package/lib/contracts/image.contract.d.ts +4 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +84 -0
  73. package/lib/contracts/region-store.contract.d.ts +22 -0
  74. package/lib/contracts/section-view.contract.d.ts +44 -0
  75. package/lib/contracts/visualizer.contract.d.ts +10 -0
  76. package/lib/contracts/viz-config.d.ts +8 -0
  77. package/lib/geometry/loft.d.ts +22 -0
  78. package/lib/geometry/polylabel.d.ts +23 -0
  79. package/lib/geometry/reconstruct.d.ts +54 -0
  80. package/lib/geometry/reslice-image.d.ts +33 -0
  81. package/lib/geometry/section.d.ts +52 -0
  82. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
  83. package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
  84. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  85. package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
  86. package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
  87. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
  88. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
  89. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  90. package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
  91. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  92. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
  93. package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
  94. package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
  95. package/lib/models/class-preset.d.ts +7 -0
  96. package/lib/models/polygon-factory.d.ts +5 -0
  97. package/lib/models/region-geojson.d.ts +40 -0
  98. package/lib/models/region.d.ts +19 -0
  99. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  100. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  101. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +36 -6
  102. package/lib/region-editor/region-editor.component.d.ts +133 -17
  103. package/lib/region-editor/region-metrics.d.ts +8 -0
  104. package/lib/region-editor/region-persistence.service.d.ts +12 -4
  105. package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
  106. package/lib/region-overlay/region-geometry.d.ts +4 -3
  107. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  108. package/lib/region-overlay/region-style.d.ts +52 -0
  109. package/lib/region-source/http-region-source.d.ts +45 -0
  110. package/lib/region-source/region-source-ops.d.ts +89 -0
  111. package/lib/region-source/region-source-worker.d.ts +7 -0
  112. package/lib/region-source/region-source.d.ts +82 -0
  113. package/lib/region-source/region-tiles.d.ts +289 -0
  114. package/lib/region-source/worker-region-source.d.ts +65 -0
  115. package/lib/routing-visualizer.service.d.ts +138 -1
  116. package/lib/section-pane/section-pane.component.d.ts +47 -0
  117. package/lib/store/class-color.util.d.ts +6 -3
  118. package/lib/store/class-signatures.d.ts +11 -0
  119. package/lib/store/region-scope-cache.d.ts +2 -0
  120. package/lib/store/region-source-scope.d.ts +68 -0
  121. package/lib/store/region-store.service.d.ts +206 -2
  122. package/lib/store/visualizer-store.service.d.ts +10 -0
  123. package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
  124. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
  125. package/lib/toolbar/toolbar.component.d.ts +9 -2
  126. package/lib/visualizer/region-load.d.ts +23 -4
  127. package/lib/visualizer/volume-sections.d.ts +64 -0
  128. package/lib/visualizer.component.d.ts +31 -0
  129. package/package.json +2 -2
  130. package/src/lib/assets/slice.svg +23 -0
  131. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
@@ -0,0 +1,299 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SLICE_PLANE_COLORS } from '../implementations/napari-js/napari-volume-slice-planes';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /** A press that moves farther than this (px) pans; a shorter one is a click. */
7
+ const CLICK_SLOP_PX = 4;
8
+ /** How much a wheel notch zooms. */
9
+ const WHEEL_ZOOM = 1.0015;
10
+ /** The section's share of the pane when fitted. */
11
+ const FIT_MARGIN = 0.94;
12
+ /** The regions' fill opacity, as the 2D view's default. */
13
+ const FILL_ALPHA = 0.25;
14
+ export class SectionPaneComponent {
15
+ constructor(zone) {
16
+ this.zone = zone;
17
+ this.view = null;
18
+ /** A point clicked, in section coordinates (u across, v down). */
19
+ this.pick = new EventEmitter();
20
+ this.zoom = 1;
21
+ this.pan = { x: 0, y: 0 };
22
+ this.press = null;
23
+ this.image = null;
24
+ this.frame = null;
25
+ }
26
+ get axisColor() {
27
+ return SLICE_PLANE_COLORS[this.axis];
28
+ }
29
+ get label() {
30
+ const at = this.view ? ` · ${Math.round(this.view.at)} px` : '';
31
+ return `${this.axis.toUpperCase()}${at}`;
32
+ }
33
+ ngAfterViewInit() {
34
+ if (typeof ResizeObserver !== 'undefined') {
35
+ this.zone.runOutsideAngular(() => {
36
+ this.resize?.disconnect();
37
+ this.resize = new ResizeObserver(() => this.draw());
38
+ this.resize.observe(this.canvasRef.nativeElement);
39
+ });
40
+ }
41
+ this.draw();
42
+ }
43
+ ngOnChanges() {
44
+ this.draw();
45
+ }
46
+ ngOnDestroy() {
47
+ this.resize?.disconnect();
48
+ if (this.frame !== null)
49
+ cancelAnimationFrame(this.frame);
50
+ }
51
+ /** Back to the whole section, centred. */
52
+ fit() {
53
+ this.zoom = 1;
54
+ this.pan = { x: 0, y: 0 };
55
+ this.draw();
56
+ }
57
+ onWheel(e) {
58
+ if (!this.view)
59
+ return;
60
+ e.preventDefault();
61
+ const [cx, cy] = this.local(e);
62
+ const factor = Math.pow(WHEEL_ZOOM, -e.deltaY);
63
+ const next = Math.min(50, Math.max(0.2, this.zoom * factor));
64
+ const k = next / this.zoom;
65
+ // Keep the point under the pointer still.
66
+ const { width, height } = this.canvasRef.nativeElement.getBoundingClientRect();
67
+ this.pan.x = (cx - width / 2) * (1 - k) + this.pan.x * k;
68
+ this.pan.y = (cy - height / 2) * (1 - k) + this.pan.y * k;
69
+ this.zoom = next;
70
+ this.draw();
71
+ }
72
+ onDown(e) {
73
+ if (e.button !== 0)
74
+ return;
75
+ this.press = {
76
+ x: e.clientX,
77
+ y: e.clientY,
78
+ panX: this.pan.x,
79
+ panY: this.pan.y,
80
+ moved: false,
81
+ pointer: e.pointerId,
82
+ };
83
+ this.canvasRef.nativeElement.setPointerCapture?.(e.pointerId);
84
+ }
85
+ onMove(e) {
86
+ const p = this.press;
87
+ if (!p || e.pointerId !== p.pointer)
88
+ return;
89
+ const dx = e.clientX - p.x;
90
+ const dy = e.clientY - p.y;
91
+ if (!p.moved && Math.hypot(dx, dy) <= CLICK_SLOP_PX)
92
+ return;
93
+ p.moved = true;
94
+ this.pan = { x: p.panX + dx, y: p.panY + dy };
95
+ this.draw();
96
+ }
97
+ onUp(e) {
98
+ const p = this.press;
99
+ if (!p || e.pointerId !== p.pointer)
100
+ return;
101
+ this.press = null;
102
+ const canvas = this.canvasRef.nativeElement;
103
+ if (canvas.hasPointerCapture?.(e.pointerId))
104
+ canvas.releasePointerCapture?.(e.pointerId);
105
+ if (p.moved || !this.view)
106
+ return;
107
+ const at = this.toSection(...this.local(e));
108
+ if (!at)
109
+ return;
110
+ const [U, V] = this.view.size;
111
+ if (at.u < 0 || at.v < 0 || at.u > U || at.v > V)
112
+ return;
113
+ this.pick.emit(at);
114
+ }
115
+ local(e) {
116
+ const r = this.canvasRef.nativeElement.getBoundingClientRect();
117
+ return [e.clientX - r.left, e.clientY - r.top];
118
+ }
119
+ /** Section units → CSS px in the pane: scale per unit across and down, and the origin. */
120
+ transform(width, height) {
121
+ const view = this.view;
122
+ if (!view || width <= 0 || height <= 0)
123
+ return null;
124
+ const [U, V] = view.size;
125
+ const worldW = U * view.scale[0];
126
+ const worldH = V * view.scale[1];
127
+ if (!(worldW > 0 && worldH > 0))
128
+ return null;
129
+ const k = Math.min(width / worldW, height / worldH) * FIT_MARGIN * this.zoom;
130
+ const sx = view.scale[0] * k;
131
+ const sy = view.scale[1] * k;
132
+ return { sx, sy, ox: width / 2 + this.pan.x - (U / 2) * sx, oy: height / 2 + this.pan.y - (V / 2) * sy };
133
+ }
134
+ toSection(x, y) {
135
+ const { width, height } = this.canvasRef.nativeElement.getBoundingClientRect();
136
+ const t = this.transform(width, height);
137
+ return t ? { u: (x - t.ox) / t.sx, v: (y - t.oy) / t.sy } : null;
138
+ }
139
+ /** Redraw on the next frame (outside Angular: a canvas paint needs no change detection). */
140
+ draw() {
141
+ if (this.frame !== null || typeof requestAnimationFrame === 'undefined')
142
+ return;
143
+ this.zone.runOutsideAngular(() => {
144
+ this.frame = requestAnimationFrame(() => {
145
+ this.frame = null;
146
+ this.paint();
147
+ });
148
+ });
149
+ }
150
+ paint() {
151
+ const canvas = this.canvasRef.nativeElement;
152
+ const { width, height } = canvas.getBoundingClientRect();
153
+ const dpr = window.devicePixelRatio || 1;
154
+ canvas.width = Math.max(1, Math.round(width * dpr));
155
+ canvas.height = Math.max(1, Math.round(height * dpr));
156
+ const ctx = canvas.getContext('2d');
157
+ if (!ctx)
158
+ return;
159
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
160
+ ctx.clearRect(0, 0, width, height);
161
+ const view = this.view;
162
+ const t = this.transform(width, height);
163
+ if (!view || !t)
164
+ return;
165
+ const [U, V] = view.size;
166
+ ctx.imageSmoothingEnabled = true;
167
+ ctx.drawImage(this.imageCanvas(view.image), t.ox, t.oy, U * t.sx, V * t.sy);
168
+ const px = (u, v) => [t.ox + u * t.sx, t.oy + v * t.sy];
169
+ this.paintRegions(ctx, view, px);
170
+ this.paintCrosshair(ctx, view, t, px);
171
+ }
172
+ /** Each class's cut: its outlines filled and stroked, its lines drawn (a dot for one point). */
173
+ paintRegions(ctx, view, px) {
174
+ for (const r of view.regions) {
175
+ if (r.rings.length) {
176
+ ctx.beginPath();
177
+ for (const ring of r.rings) {
178
+ for (let i = 0; i + 1 < ring.length; i += 2) {
179
+ const [x, y] = px(ring[i], ring[i + 1]);
180
+ if (i === 0)
181
+ ctx.moveTo(x, y);
182
+ else
183
+ ctx.lineTo(x, y);
184
+ }
185
+ ctx.closePath();
186
+ }
187
+ ctx.globalAlpha = FILL_ALPHA;
188
+ ctx.fillStyle = r.color;
189
+ ctx.fill('evenodd');
190
+ ctx.globalAlpha = 1;
191
+ ctx.strokeStyle = r.color;
192
+ ctx.lineWidth = 1.25;
193
+ ctx.stroke();
194
+ }
195
+ ctx.strokeStyle = r.color;
196
+ ctx.fillStyle = r.color;
197
+ ctx.lineWidth = 2;
198
+ for (const line of r.lines) {
199
+ if (line.length === 2) {
200
+ const [x, y] = px(line[0], line[1]);
201
+ ctx.beginPath();
202
+ ctx.arc(x, y, 2.5, 0, Math.PI * 2);
203
+ ctx.fill();
204
+ continue;
205
+ }
206
+ ctx.beginPath();
207
+ for (let i = 0; i + 1 < line.length; i += 2) {
208
+ const [x, y] = px(line[i], line[i + 1]);
209
+ if (i === 0)
210
+ ctx.moveTo(x, y);
211
+ else
212
+ ctx.lineTo(x, y);
213
+ }
214
+ ctx.stroke();
215
+ }
216
+ }
217
+ }
218
+ /** The other planes: across (u) and down (v), dashed in their axis colours. */
219
+ paintCrosshair(ctx, view, t, px) {
220
+ const [U, V] = view.size;
221
+ const across = this.axis === 'x' ? 'z' : 'x';
222
+ const down = this.axis === 'x' ? 'y' : 'z';
223
+ ctx.setLineDash([6, 4]);
224
+ ctx.lineWidth = 1.25;
225
+ if (view.crosshair.u !== null) {
226
+ const [x] = px(view.crosshair.u, 0);
227
+ ctx.strokeStyle = SLICE_PLANE_COLORS[across];
228
+ ctx.beginPath();
229
+ ctx.moveTo(x, t.oy);
230
+ ctx.lineTo(x, t.oy + V * t.sy);
231
+ ctx.stroke();
232
+ }
233
+ if (view.crosshair.v !== null) {
234
+ const [, y] = px(0, view.crosshair.v);
235
+ ctx.strokeStyle = SLICE_PLANE_COLORS[down];
236
+ ctx.beginPath();
237
+ ctx.moveTo(t.ox, y);
238
+ ctx.lineTo(t.ox + U * t.sx, y);
239
+ ctx.stroke();
240
+ }
241
+ ctx.setLineDash([]);
242
+ }
243
+ /** The section's image on a canvas of its own size (made again only for a new image). */
244
+ imageCanvas(image) {
245
+ if (this.image?.source === image)
246
+ return this.image.canvas;
247
+ const canvas = document.createElement('canvas');
248
+ canvas.width = image.width;
249
+ canvas.height = image.height;
250
+ canvas.getContext('2d')?.putImageData(new ImageData(image.data, image.width, image.height), 0, 0);
251
+ this.image = { source: image, canvas };
252
+ return canvas;
253
+ }
254
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SectionPaneComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
255
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SectionPaneComponent, isStandalone: true, selector: "viz-section-pane", inputs: { axis: "axis", view: "view" }, outputs: { pick: "pick" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
256
+ <canvas
257
+ #canvas
258
+ class="section-canvas"
259
+ [attr.aria-label]="label"
260
+ (wheel)="onWheel($event)"
261
+ (pointerdown)="onDown($event)"
262
+ (pointermove)="onMove($event)"
263
+ (pointerup)="onUp($event)"
264
+ (pointercancel)="onUp($event)"
265
+ (dblclick)="fit()"
266
+ ></canvas>
267
+ <span class="section-badge" [style.background]="axisColor">{{ label }}</span>
268
+ <span *ngIf="!view" class="section-empty">Waiting for the volume…</span>
269
+ `, isInline: true, styles: [":host{position:absolute;inset:0;display:block;overflow:hidden;background:#111}.section-canvas{width:100%;height:100%;display:block;cursor:crosshair;touch-action:none}.section-badge{position:absolute;top:6px;left:6px;padding:1px 8px;border-radius:4px;color:#fff;font:600 12px/1.6 system-ui,sans-serif;pointer-events:none}.section-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#aaa;font:13px system-ui,sans-serif;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
270
+ }
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SectionPaneComponent, decorators: [{
272
+ type: Component,
273
+ args: [{ selector: 'viz-section-pane', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
274
+ <canvas
275
+ #canvas
276
+ class="section-canvas"
277
+ [attr.aria-label]="label"
278
+ (wheel)="onWheel($event)"
279
+ (pointerdown)="onDown($event)"
280
+ (pointermove)="onMove($event)"
281
+ (pointerup)="onUp($event)"
282
+ (pointercancel)="onUp($event)"
283
+ (dblclick)="fit()"
284
+ ></canvas>
285
+ <span class="section-badge" [style.background]="axisColor">{{ label }}</span>
286
+ <span *ngIf="!view" class="section-empty">Waiting for the volume…</span>
287
+ `, styles: [":host{position:absolute;inset:0;display:block;overflow:hidden;background:#111}.section-canvas{width:100%;height:100%;display:block;cursor:crosshair;touch-action:none}.section-badge{position:absolute;top:6px;left:6px;padding:1px 8px;border-radius:4px;color:#fff;font:600 12px/1.6 system-ui,sans-serif;pointer-events:none}.section-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#aaa;font:13px system-ui,sans-serif;pointer-events:none}\n"] }]
288
+ }], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { axis: [{
289
+ type: Input,
290
+ args: [{ required: true }]
291
+ }], view: [{
292
+ type: Input
293
+ }], pick: [{
294
+ type: Output
295
+ }], canvasRef: [{
296
+ type: ViewChild,
297
+ args: ['canvas', { static: true }]
298
+ }] } });
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi1wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VjdGlvbi1wYW5lL3NlY3Rpb24tcGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDOzs7QUFFN0YsZ0ZBQWdGO0FBQ2hGLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUN4QixvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBQzFCLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDeEIsMkRBQTJEO0FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztBQTJFeEIsTUFBTSxPQUFPLG9CQUFvQjtJQWdCL0IsWUFBNkIsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFkaEMsU0FBSSxHQUF1QixJQUFJLENBQUM7UUFDekMsa0VBQWtFO1FBQy9DLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUkvRCxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsUUFBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckIsVUFBSyxHQUNYLElBQUksQ0FBQztRQUNDLFVBQUssR0FBdUUsSUFBSSxDQUFDO1FBRWpGLFVBQUssR0FBa0IsSUFBSSxDQUFDO0lBRVEsQ0FBQztJQUU3QyxJQUFjLFNBQVM7UUFDckIsT0FBTyxrQkFBa0IsQ0FB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QUFJO3NCQUFaLEtBQUs7Z0JBRWEsSUFBSTtzQkFBdEIsTUFBTTtnQkFFd0MsU0FBUztzQkFBdkQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXcgfSBmcm9tICcuLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcbmltcG9ydCB7IFNMSUNFX1BMQU5FX0NPTE9SUyB9IGZyb20gJy4uL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXZvbHVtZS1zbGljZS1wbGFuZXMnO1xuXG4vKiogQSBwcmVzcyB0aGF0IG1vdmVzIGZhcnRoZXIgdGhhbiB0aGlzIChweCkgcGFuczsgYSBzaG9ydGVyIG9uZSBpcyBhIGNsaWNrLiAqL1xuY29uc3QgQ0xJQ0tfU0xPUF9QWCA9IDQ7XG4vKiogSG93IG11Y2ggYSB3aGVlbCBub3RjaCB6b29tcy4gKi9cbmNvbnN0IFdIRUVMX1pPT00gPSAxLjAwMTU7XG4vKiogVGhlIHNlY3Rpb24ncyBzaGFyZSBvZiB0aGUgcGFuZSB3aGVuIGZpdHRlZC4gKi9cbmNvbnN0IEZJVF9NQVJHSU4gPSAwLjk0O1xuLyoqIFRoZSByZWdpb25zJyBmaWxsIG9wYWNpdHksIGFzIHRoZSAyRCB2aWV3J3MgZGVmYXVsdC4gKi9cbmNvbnN0IEZJTExfQUxQSEEgPSAwLjI1O1xuXG4vKipcbiAqIE9uZSBzZWN0aW9uIGJlc2lkZSBhIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmUgeCA9IGNvbnN0IG9yIHkgPSBjb25zdCB0aHJvdWdoIHRoZSBzdGFjayk6XG4gKiBpdHMgaW1hZ2UgaW4gdGhlIHZvbHVtZSdzIHByb3BvcnRpb25zLCB0aGUgcmVnaW9ucyBjdXQgYnkgdGhlIHBsYW5lLCBhbmQgdGhlIG90aGVyIHR3byBwbGFuZXNcbiAqIGFzIGEgY3Jvc3NoYWlyIGluIHRoZWlyIGF4aXMgY29sb3Vycy4gVGhlIHdoZWVsIHpvb21zIGFib3V0IHRoZSBwb2ludGVyLCBhIGRyYWcgcGFucywgYVxuICogZG91YmxlLWNsaWNrIGZpdHM7IGEgY2xpY2sgcGlja3MgdGhhdCBwb2ludCAoYHBpY2tgLCBpbiBzZWN0aW9uIGNvb3JkaW5hdGVzKSDigJQgdGhlIGhvc3QgbW92ZXNcbiAqIHRoZSBvdGhlciBwbGFuZXMgdGhlcmUuXG4gKi9cbi8qKiBTZWN0aW9uIGNvb3JkaW5hdGVzICh1LCB2KSDihpIgY2FudmFzIHB4LiAqL1xudHlwZSBUb0NhbnZhcyA9ICh1OiBudW1iZXIsIHY6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndml6LXNlY3Rpb24tcGFuZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8Y2FudmFzXG4gICAgICAjY2FudmFzXG4gICAgICBjbGFzcz1cInNlY3Rpb24tY2FudmFzXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxcIlxuICAgICAgKHdoZWVsKT1cIm9uV2hlZWwoJGV2ZW50KVwiXG4gICAgICAocG9pbnRlcmRvd24pPVwib25Eb3duKCRldmVudClcIlxuICAgICAgKHBvaW50ZXJtb3ZlKT1cIm9uTW92ZSgkZXZlbnQpXCJcbiAgICAgIChwb2ludGVydXApPVwib25VcCgkZXZlbnQpXCJcbiAgICAgIChwb2ludGVyY2FuY2VsKT1cIm9uVXAoJGV2ZW50KVwiXG4gICAgICAoZGJsY2xpY2spPVwiZml0KClcIlxuICAgID48L2NhbnZhcz5cbiAgICA8c3BhbiBjbGFzcz1cInNlY3Rpb24tYmFkZ2VcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJheGlzQ29sb3JcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cIiF2aWV3XCIgY2xhc3M9XCJzZWN0aW9uLWVtcHR5XCI+V2FpdGluZyBmb3IgdGhlIHZvbHVtZeKApjwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGluc2V0OiAwO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYmFja2dyb3VuZDogIzExMTtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLWNhbnZhcyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBjdXJzb3I6IGNyb3NzaGFpcjtcbiAgICAgICAgdG91Y2gtYWN0aW9uOiBub25lO1xuICAgICAgfVxuICAgICAgLnNlY3Rpb24tYmFkZ2Uge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogNnB4O1xuICAgICAgICBsZWZ0OiA2cHg7XG4gICAgICAgIHBhZGRpbmc6IDFweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICAgIGZvbnQ6XG4gICAgICAgICAgNjAwIDEycHgvMS42IHN5c3RlbS11aSxcbiAgICAgICAgICBzYW5zLXNlcmlmO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLWVtcHR5IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGNvbG9yOiAjYWFhO1xuICAgICAgICBmb250OlxuICAgICAgICAgIDEzcHggc3lzdGVtLXVpLFxuICAgICAgICAgIHNhbnMtc2VyaWY7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlY3Rpb25QYW5lQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBheGlzITogU2VjdGlvbkF4aXM7XG4gIEBJbnB1dCgpIHZpZXc6IFNlY3Rpb25WaWV3IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBBIHBvaW50IGNsaWNrZWQsIGluIHNlY3Rpb24gY29vcmRpbmF0ZXMgKHUgYWNyb3NzLCB2IGRvd24pLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyB1OiBudW1iZXI7IHY6IG51bWJlciB9PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2FudmFzUmVmITogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG5cbiAgcHJpdmF0ZSB6b29tID0gMTtcbiAgcHJpdmF0ZSBwYW4gPSB7IHg6IDAsIHk6IDAgfTtcbiAgcHJpdmF0ZSBwcmVzczogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgcGFuWDogbnVtYmVyOyBwYW5ZOiBudW1iZXI7IG1vdmVkOiBib29sZWFuOyBwb2ludGVyOiBudW1iZXIgfSB8IG51bGwgPVxuICAgIG51bGw7XG4gIHByaXZhdGUgaW1hZ2U6IHsgc291cmNlOiBTZWN0aW9uVmlld1snaW1hZ2UnXTsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVzaXplPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgZnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lKSB7fVxuXG4gIHByb3RlY3RlZCBnZXQgYXhpc0NvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNMSUNFX1BMQU5FX0NPTE9SU1t0aGlzLmF4aXNdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGF0ID0gdGhpcy52aWV3ID8gYCDCtyAke01hdGgucm91bmQodGhpcy52aWV3LmF0KX0gcHhgIDogJyc7XG4gICAgcmV0dXJuIGAke3RoaXMuYXhpcy50b1VwcGVyQ2FzZSgpfSR7YXR9YDtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNpemU/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5yZXNpemUgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5kcmF3KCkpO1xuICAgICAgICB0aGlzLnJlc2l6ZS5vYnNlcnZlKHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZHJhdygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZT8uZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLmZyYW1lICE9PSBudWxsKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lKTtcbiAgfVxuXG4gIC8qKiBCYWNrIHRvIHRoZSB3aG9sZSBzZWN0aW9uLCBjZW50cmVkLiAqL1xuICBmaXQoKTogdm9pZCB7XG4gICAgdGhpcy56b29tID0gMTtcbiAgICB0aGlzLnBhbiA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMuZHJhdygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uV2hlZWwoZTogV2hlZWxFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3KSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IFtjeCwgY3ldID0gdGhpcy5sb2NhbChlKTtcbiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdyhXSEVFTF9aT09NLCAtZS5kZWx0YVkpO1xuICAgIGNvbnN0IG5leHQgPSBNYXRoLm1pbig1MCwgTWF0aC5tYXgoMC4yLCB0aGlzLnpvb20gKiBmYWN0b3IpKTtcbiAgICBjb25zdCBrID0gbmV4dCAvIHRoaXMuem9vbTtcbiAgICAvLyBLZWVwIHRoZSBwb2ludCB1bmRlciB0aGUgcG9pbnRlciBzdGlsbC5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5wYW4ueCA9IChjeCAtIHdpZHRoIC8gMikgKiAoMSAtIGspICsgdGhpcy5wYW4ueCAqIGs7XG4gICAgdGhpcy5wYW4ueSA9IChjeSAtIGhlaWdodCAvIDIpICogKDEgLSBrKSArIHRoaXMucGFuLnkgKiBrO1xuICAgIHRoaXMuem9vbSA9IG5leHQ7XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Eb3duKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucHJlc3MgPSB7XG4gICAgICB4OiBlLmNsaWVudFgsXG4gICAgICB5OiBlLmNsaWVudFksXG4gICAgICBwYW5YOiB0aGlzLnBhbi54LFxuICAgICAgcGFuWTogdGhpcy5wYW4ueSxcbiAgICAgIG1vdmVkOiBmYWxzZSxcbiAgICAgIHBvaW50ZXI6IGUucG9pbnRlcklkLFxuICAgIH07XG4gICAgdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudC5zZXRQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1vdmUoZTogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcCA9IHRoaXMucHJlc3M7XG4gICAgaWYgKCFwIHx8IGUucG9pbnRlcklkICE9PSBwLnBvaW50ZXIpIHJldHVybjtcbiAgICBjb25zdCBkeCA9IGUuY2xpZW50WCAtIHAueDtcbiAgICBjb25zdCBkeSA9IGUuY2xpZW50WSAtIHAueTtcbiAgICBpZiAoIXAubW92ZWQgJiYgTWF0aC5oeXBvdChkeCwgZHkpIDw9IENMSUNLX1NMT1BfUFgpIHJldHVybjtcbiAgICBwLm1vdmVkID0gdHJ1ZTtcbiAgICB0aGlzLnBhbiA9IHsgeDogcC5wYW5YICsgZHgsIHk6IHAucGFuWSArIGR5IH07XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VcChlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwID0gdGhpcy5wcmVzcztcbiAgICBpZiAoIXAgfHwgZS5wb2ludGVySWQgIT09IHAucG9pbnRlcikgcmV0dXJuO1xuICAgIHRoaXMucHJlc3MgPSBudWxsO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNhbnZhcy5oYXNQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKSkgY2FudmFzLnJlbGVhc2VQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKTtcbiAgICBpZiAocC5tb3ZlZCB8fCAhdGhpcy52aWV3KSByZXR1cm47XG4gICAgY29uc3QgYXQgPSB0aGlzLnRvU2VjdGlvbiguLi50aGlzLmxvY2FsKGUpKTtcbiAgICBpZiAoIWF0KSByZXR1cm47XG4gICAgY29uc3QgW1UsIFZdID0gdGhpcy52aWV3LnNpemU7XG4gICAgaWYgKGF0LnUgPCAwIHx8IGF0LnYgPCAwIHx8IGF0LnUgPiBVIHx8IGF0LnYgPiBWKSByZXR1cm47XG4gICAgdGhpcy5waWNrLmVtaXQoYXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NhbChlOiBNb3VzZUV2ZW50KTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgciA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFtlLmNsaWVudFggLSByLmxlZnQsIGUuY2xpZW50WSAtIHIudG9wXTtcbiAgfVxuXG4gIC8qKiBTZWN0aW9uIHVuaXRzIOKGkiBDU1MgcHggaW4gdGhlIHBhbmU6IHNjYWxlIHBlciB1bml0IGFjcm9zcyBhbmQgZG93biwgYW5kIHRoZSBvcmlnaW4uICovXG4gIHByaXZhdGUgdHJhbnNmb3JtKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogeyBzeDogbnVtYmVyOyBzeTogbnVtYmVyOyBveDogbnVtYmVyOyBveTogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3O1xuICAgIGlmICghdmlldyB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBbVSwgVl0gPSB2aWV3LnNpemU7XG4gICAgY29uc3Qgd29ybGRXID0gVSAqIHZpZXcuc2NhbGVbMF07XG4gICAgY29uc3Qgd29ybGRIID0gViAqIHZpZXcuc2NhbGVbMV07XG4gICAgaWYgKCEod29ybGRXID4gMCAmJiB3b3JsZEggPiAwKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgayA9IE1hdGgubWluKHdpZHRoIC8gd29ybGRXLCBoZWlnaHQgLyB3b3JsZEgpICogRklUX01BUkdJTiAqIHRoaXMuem9vbTtcbiAgICBjb25zdCBzeCA9IHZpZXcuc2NhbGVbMF0gKiBrO1xuICAgIGNvbnN0IHN5ID0gdmlldy5zY2FsZVsxXSAqIGs7XG4gICAgcmV0dXJuIHsgc3gsIHN5LCBveDogd2lkdGggLyAyICsgdGhpcy5wYW4ueCAtIChVIC8gMikgKiBzeCwgb3k6IGhlaWdodCAvIDIgKyB0aGlzLnBhbi55IC0gKFYgLyAyKSAqIHN5IH07XG4gIH1cblxuICBwcml2YXRlIHRvU2VjdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHsgdTogbnVtYmVyOyB2OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0ID0gdGhpcy50cmFuc2Zvcm0od2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHQgPyB7IHU6ICh4IC0gdC5veCkgLyB0LnN4LCB2OiAoeSAtIHQub3kpIC8gdC5zeSB9IDogbnVsbDtcbiAgfVxuXG4gIC8qKiBSZWRyYXcgb24gdGhlIG5leHQgZnJhbWUgKG91dHNpZGUgQW5ndWxhcjogYSBjYW52YXMgcGFpbnQgbmVlZHMgbm8gY2hhbmdlIGRldGVjdGlvbikuICovXG4gIHByaXZhdGUgZHJhdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mcmFtZSAhPT0gbnVsbCB8fCB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5mcmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGFpbnQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWludCgpOiB2b2lkIHtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgY2FudmFzLndpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh3aWR0aCAqIGRwcikpO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGhlaWdodCAqIGRwcikpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgY3R4LnNldFRyYW5zZm9ybShkcHIsIDAsIDAsIGRwciwgMCwgMCk7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3O1xuICAgIGNvbnN0IHQgPSB0aGlzLnRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAoIXZpZXcgfHwgIXQpIHJldHVybjtcbiAgICBjb25zdCBbVSwgVl0gPSB2aWV3LnNpemU7XG4gICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IHRydWU7XG4gICAgY3R4LmRyYXdJbWFnZSh0aGlzLmltYWdlQ2FudmFzKHZpZXcuaW1hZ2UpLCB0Lm94LCB0Lm95LCBVICogdC5zeCwgViAqIHQuc3kpO1xuXG4gICAgY29uc3QgcHggPSAodTogbnVtYmVyLCB2OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdID0+IFt0Lm94ICsgdSAqIHQuc3gsIHQub3kgKyB2ICogdC5zeV07XG4gICAgdGhpcy5wYWludFJlZ2lvbnMoY3R4LCB2aWV3LCBweCk7XG4gICAgdGhpcy5wYWludENyb3NzaGFpcihjdHgsIHZpZXcsIHQsIHB4KTtcbiAgfVxuXG4gIC8qKiBFYWNoIGNsYXNzJ3MgY3V0OiBpdHMgb3V0bGluZXMgZmlsbGVkIGFuZCBzdHJva2VkLCBpdHMgbGluZXMgZHJhd24gKGEgZG90IGZvciBvbmUgcG9pbnQpLiAqL1xuICBwcml2YXRlIHBhaW50UmVnaW9ucyhjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgdmlldzogU2VjdGlvblZpZXcsIHB4OiBUb0NhbnZhcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgciBvZiB2aWV3LnJlZ2lvbnMpIHtcbiAgICAgIGlmIChyLnJpbmdzLmxlbmd0aCkge1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiByLnJpbmdzKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgKyAxIDwgcmluZy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgW3gsIHldID0gcHgocmluZ1tpXSwgcmluZ1tpICsgMV0pO1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICBlbHNlIGN0eC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBGSUxMX0FMUEhBO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gci5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGwoJ2V2ZW5vZGQnKTtcbiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gci5jb2xvcjtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDEuMjU7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHIuY29sb3I7XG4gICAgICBjdHguZmlsbFN0eWxlID0gci5jb2xvcjtcbiAgICAgIGN0eC5saW5lV2lkdGggPSAyO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHIubGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgW3gsIHldID0gcHgobGluZVswXSwgbGluZVsxXSk7XG4gICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgIGN0eC5hcmMoeCwgeSwgMi41LCAwLCBNYXRoLlBJICogMik7XG4gICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpICsgMSA8IGxpbmUubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCBbeCwgeV0gPSBweChsaW5lW2ldLCBsaW5lW2kgKyAxXSk7XG4gICAgICAgICAgaWYgKGkgPT09IDApIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgZWxzZSBjdHgubGluZVRvKHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG90aGVyIHBsYW5lczogYWNyb3NzICh1KSBhbmQgZG93biAodiksIGRhc2hlZCBpbiB0aGVpciBheGlzIGNvbG91cnMuICovXG4gIHByaXZhdGUgcGFpbnRDcm9zc2hhaXIoXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgdmlldzogU2VjdGlvblZpZXcsXG4gICAgdDogeyBveDogbnVtYmVyOyBveTogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0sXG4gICAgcHg6IFRvQ2FudmFzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBbVSwgVl0gPSB2aWV3LnNpemU7XG4gICAgY29uc3QgYWNyb3NzOiBrZXlvZiB0eXBlb2YgU0xJQ0VfUExBTkVfQ09MT1JTID0gdGhpcy5heGlzID09PSAneCcgPyAneicgOiAneCc7XG4gICAgY29uc3QgZG93bjoga2V5b2YgdHlwZW9mIFNMSUNFX1BMQU5FX0NPTE9SUyA9IHRoaXMuYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3onO1xuICAgIGN0eC5zZXRMaW5lRGFzaChbNiwgNF0pO1xuICAgIGN0eC5saW5lV2lkdGggPSAxLjI1O1xuICAgIGlmICh2aWV3LmNyb3NzaGFpci51ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBbeF0gPSBweCh2aWV3LmNyb3NzaGFpci51LCAwKTtcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFNMSUNFX1BMQU5FX0NPTE9SU1thY3Jvc3NdO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4Lm1vdmVUbyh4LCB0Lm95KTtcbiAgICAgIGN0eC5saW5lVG8oeCwgdC5veSArIFYgKiB0LnN5KTtcbiAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9XG4gICAgaWYgKHZpZXcuY3Jvc3NoYWlyLnYgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IFssIHldID0gcHgoMCwgdmlldy5jcm9zc2hhaXIudik7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSBTTElDRV9QTEFORV9DT0xPUlNbZG93bl07XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHgubW92ZVRvKHQub3gsIHkpO1xuICAgICAgY3R4LmxpbmVUbyh0Lm94ICsgVSAqIHQuc3gsIHkpO1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH1cbiAgICBjdHguc2V0TGluZURhc2goW10pO1xuICB9XG5cbiAgLyoqIFRoZSBzZWN0aW9uJ3MgaW1hZ2Ugb24gYSBjYW52YXMgb2YgaXRzIG93biBzaXplIChtYWRlIGFnYWluIG9ubHkgZm9yIGEgbmV3IGltYWdlKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZUNhbnZhcyhpbWFnZTogU2VjdGlvblZpZXdbJ2ltYWdlJ10pOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgaWYgKHRoaXMuaW1hZ2U/LnNvdXJjZSA9PT0gaW1hZ2UpIHJldHVybiB0aGlzLmltYWdlLmNhbnZhcztcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpPy5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShpbWFnZS5kYXRhLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KSwgMCwgMCk7XG4gICAgdGhpcy5pbWFnZSA9IHsgc291cmNlOiBpbWFnZSwgY2FudmFzIH07XG4gICAgcmV0dXJuIGNhbnZhcztcbiAgfVxufVxuIl19
@@ -55,16 +55,21 @@ export function fallbackColorFor(label, palette) {
55
55
  const hue = (hashString(key) * 137.508) % 360;
56
56
  return hslToHex(hue, 65, 50);
57
57
  }
58
- /** Resolve a colour for `label`: a matching preset's colour, else the deterministic fallback. */
58
+ /**
59
+ * Resolve a colour for `label`: a matching preset's colour, else the colour an imported file
60
+ * gave the class, else the deterministic fallback.
61
+ */
59
62
  export function colorForLabel(label, set) {
60
63
  const preset = findPreset(label, set);
61
- return preset ? preset.color : fallbackColorFor(label, set.fallbackPalette);
64
+ if (preset)
65
+ return preset.color;
66
+ return set.importedColors?.[presetKey(set, label)] ?? fallbackColorFor(label, set.fallbackPalette);
62
67
  }
63
68
  /**
64
69
  * Resolve each labelled region's colour from the preset set (jit-ui#70). The
65
70
  * presets are the source of truth: a matching preset gives the class colour,
66
- * an unknown class its deterministic fallback, **overriding any colour already
67
- * on the region** (e.g. embedded in imported GeoJSON). Unlabelled regions and
71
+ * an unknown class the colour an imported file gave it (`importedColors`) or else
72
+ * its deterministic fallback, **overriding any colour already on the region**. Unlabelled regions and
68
73
  * ones the user recoloured (`colorOverridden`) are left untouched. Unknown
69
74
  * classes are reported through `onPromote` when `autoPromote` is on.
70
75
  *
@@ -92,4 +97,4 @@ export function applyPresetColors(regions, set, opts = {}) {
92
97
  return region;
93
98
  });
94
99
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtY29sb3IudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvY2xhc3MtY29sb3IudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFTO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsVUFBVSxDQUFDLENBQVM7SUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCx1RUFBdUU7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQWlDLEVBQUUsS0FBYTtJQUN4RSxPQUFPLEdBQUcsRUFBRSxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN6RSxDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxJ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QUFPLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXRlcm1pbmlzdGljIGNvbG91ciBlbmdpbmUgZm9yIHByZXNldCBhbm5vdGF0aW9uIGNsYXNzZXMgKGppdC11aSM3MCkuXG4gKlxuICogUmVzb2x1dGlvbiBvcmRlciBmb3IgYSByZWdpb24gYGxhYmVsYDpcbiAqICAgMS4gYSBtYXRjaGluZyBwcmVzZXQgKGV4YWN0IGJ5IGRlZmF1bHQsIG9yIG5vcm1hbGl6ZWQgaWYgdGhlIHNldCdzIG1hdGNoTW9kZSBzYXlzIHNvKVxuICogICAgICAtPiB0aGUgcHJlc2V0J3MgY29sb3VyO1xuICogICAyLiBvdGhlcndpc2UgYSBkZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBkZXJpdmVkIGZyb20gYSBzdGFibGUgaGFzaCBvZiB0aGUgbmFtZSxcbiAqICAgICAgc28gdGhlIHNhbWUgdW5rbm93biBjbGFzcyBhbHdheXMgZ2V0cyB0aGUgc2FtZSBjb2xvdXIgd2l0aCBubyBzdG9yZWQgc3RhdGUuXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwdXJlIChubyBtdXRhdGlvbik7IG9wdC1pbiBwcm9tb3Rpb24gb2YgdW5rbm93biBjbGFzc2VzIGludG8gdGhlXG4gKiBzZXQgaXMgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlciAoc2VlIHtAbGluayBhcHBseVByZXNldENvbG9yc30pLCB3aGljaCBvd25zIHBlcnNpc3RlbmNlLlxuICovXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IHdpdGhSZWdpb25QYXRjaCB9IGZyb20gJy4uL21vZGVscy9yZWdpb24tY2xvbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTGFiZWwoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChzID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqIFN0YWJsZSwgbm9uLW5lZ2F0aXZlIDMyLWJpdCBzdHJpbmcgaGFzaCAoaWRlbnRpY2FsIGFjcm9zcyBydW5zIGFuZCBtYWNoaW5lcykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFN0cmluZyhzOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuICAgIGggPSAoTWF0aC5pbXVsKDMxLCBoKSArIHMuY2hhckNvZGVBdChpKSkgfCAwO1xuICB9XG4gIC8vIEZvbGQgdG8gbm9uLW5lZ2F0aXZlIHdpdGhvdXQgdGhlIE1hdGguYWJzKElOVF9NSU4pIG92ZXJmbG93IHBpdGZhbGwuXG4gIHJldHVybiBoIDwgMCA/IH5oIDogaDtcbn1cblxuLyoqXG4gKiBUaGUga2V5IHR3byBjbGFzcyBuYW1lcyBhcmUgY29tcGFyZWQgYnkgdW5kZXIgdGhlIHNldCdzIG1hdGNoIG1vZGU6IHRoZSBuYW1lXG4gKiBpdHNlbGYgZm9yIGBleGFjdGAsIHRyaW1tZWQgYW5kIGxvd2VyLWNhc2VkIGZvciBgbm9ybWFsaXplZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVzZXRLZXkoc2V0OiBQaWNrPFByZXNldFNldCwgJ21hdGNoTW9kZSc+LCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNldD8ubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyBub3JtYWxpemVMYWJlbChsYWJlbCkgOiBsYWJlbDtcbn1cblxuLyoqIGAjUlJHR0JCYCAodXBwZXItY2FzZSkgZm9yIGFuIEhTTCBjb2xvdXI6IGh1ZSBpbiBkZWdyZWVzLCBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgaW4gJS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb0hleChoRGVnOiBudW1iZXIsIHNQY3Q6IG51bWJlciwgbFBjdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IHNQY3QgLyAxMDA7XG4gIGNvbnN0IGwgPSBsUGN0IC8gMTAwO1xuICBjb25zdCBrID0gKG46IG51bWJlcikgPT4gKG4gKyBoRGVnIC8gMzApICUgMTI7XG4gIGNvbnN0IGEgPSBzICogTWF0aC5taW4obCwgMSAtIGwpO1xuICBjb25zdCBjaGFubmVsID0gKG46IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHYgPSBsIC0gYSAqIE1hdGgubWF4KC0xLCBNYXRoLm1pbihrKG4pIC0gMywgOSAtIGsobiksIDEpKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgyNTUgKiB2KVxuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH07XG4gIHJldHVybiBgIyR7Y2hhbm5lbCgwKX0ke2NoYW5uZWwoOCl9JHtjaGFubmVsKDQpfWAudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqIEZpbmQgdGhlIHByZXNldCBtYXRjaGluZyBgbGFiZWxgIHVuZGVyIHRoZSBzZXQncyBtYXRjaCBtb2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQcmVzZXQobGFiZWw6IHN0cmluZywgc2V0OiBQcmVzZXRTZXQpOiBDbGFzc1ByZXNldCB8IHVuZGVmaW5lZCB7XG4gIGlmICghbGFiZWwgfHwgIXNldD8uY2xhc3NlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJykge1xuICAgIGNvbnN0IG4gPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gICAgcmV0dXJuIHNldC5jbGFzc2VzLmZpbmQoKGMpID0+IG5vcm1hbGl6ZUxhYmVsKGMubmFtZSkgPT09IG4pO1xuICB9XG4gIHJldHVybiBzZXQuY2xhc3Nlcy5maW5kKChjKSA9PiBjLm5hbWUgPT09IGxhYmVsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBmb3IgYW4gdW5rbm93biBjbGFzcyBuYW1lOiBpbmRleCBpbnRvIHRoZSBwYWxldHRlIGJ5IGFcbiAqIHN0YWJsZSBoYXNoIG9mIHRoZSAobm9ybWFsaXplZCkgbmFtZTsgaWYgdGhlIHBhbGV0dGUgaXMgZW1wdHksIGdlbmVyYXRlIGEgZ29sZGVuLWFuZ2xlXG4gKiBIU0wgaHVlLiBTYW1lIG5hbWUgLT4gc2FtZSBjb2xvdXIsIGV2ZXJ5IHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhbGxiYWNrQ29sb3JGb3IobGFiZWw6IHN0cmluZywgcGFsZXR0ZTogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gIGlmIChwYWxldHRlICYmIHBhbGV0dGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYWxldHRlW2hhc2hTdHJpbmcoa2V5KSAlIHBhbGV0dGUubGVuZ3RoXTtcbiAgfVxuICBjb25zdCBodWUgPSAoaGFzaFN0cmluZyhrZXkpICogMTM3LjUwOCkgJSAzNjA7XG4gIHJldHVybiBoc2xUb0hleChodWUsIDY1LCA1MCk7XG59XG5cbi8qKiBSZXNvbHZlIGEgY29sb3VyIGZvciBgbGFiZWxgOiBhIG1hdGNoaW5nIHByZXNldCdzIGNvbG91ciwgZWxzZSB0aGUgZGV0ZXJtaW5pc3RpYyBmYWxsYmFjay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckZvckxhYmVsKGxhYmVsOiBzdHJpbmcsIHNldDogUHJlc2V0U2V0KTogc3RyaW5nIHtcbiAgY29uc3QgcHJlc2V0ID0gZmluZFByZXNldChsYWJlbCwgc2V0KTtcbiAgcmV0dXJuIHByZXNldCA/IHByZXNldC5jb2xvciA6IGZhbGxiYWNrQ29sb3JGb3IobGFiZWwsIHNldC5mYWxsYmFja1BhbGV0dGUpO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGFwcGx5UHJlc2V0Q29sb3JzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlQcmVzZXRDb2xvcnNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGEgcmVnaW9uIHRoZSBjYWxsZXIgb3ducyBvdXRyaWdodCAoZnJlc2gsIG5vdCB5ZXQgc3RvcmVkLCBzbyBpbiBub1xuICAgKiB1bmRvIHNuYXBzaG90KTogaXRzIGNvbG91ciBpcyBzZXQgaW4gcGxhY2UuIEV2ZXJ5IG90aGVyIHJlZ2lvbiB3aG9zZVxuICAgKiBjb2xvdXIgY2hhbmdlcyBpcyBjb3BpZWQuIERlZmF1bHQ6IG5ldmVyIGluIHBsYWNlLlxuICAgKi9cbiAgaW5QbGFjZT86IChyOiBSZWdpb24pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBwZXIgdW5rbm93biBjbGFzcyB3aGVuIGBzZXQuYXV0b1Byb21vdGVgIGlzIG9uLCB3aXRoIHRoZVxuICAgKiBwcmVzZXQgdG8gYWRkIChuYW1lIHRyaW1tZWQgaW4gYG5vcm1hbGl6ZWRgIG1hdGNoIG1vZGUsIGBzb3VyY2U6ICdhdXRvJ2ApLlxuICAgKi9cbiAgb25Qcm9tb3RlPzogKHByZXNldDogQ2xhc3NQcmVzZXQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBlYWNoIGxhYmVsbGVkIHJlZ2lvbidzIGNvbG91ciBmcm9tIHRoZSBwcmVzZXQgc2V0IChqaXQtdWkjNzApLiBUaGVcbiAqIHByZXNldHMgYXJlIHRoZSBzb3VyY2Ugb2YgdHJ1dGg6IGEgbWF0Y2hpbmcgcHJlc2V0IGdpdmVzIHRoZSBjbGFzcyBjb2xvdXIsXG4gKiBhbiB1bmtub3duIGNsYXNzIGl0cyBkZXRlcm1pbmlzdGljIGZhbGxiYWNrLCAqKm92ZXJyaWRpbmcgYW55IGNvbG91ciBhbHJlYWR5XG4gKiBvbiB0aGUgcmVnaW9uKiogKGUuZy4gZW1iZWRkZWQgaW4gaW1wb3J0ZWQgR2VvSlNPTikuIFVubGFiZWxsZWQgcmVnaW9ucyBhbmRcbiAqIG9uZXMgdGhlIHVzZXIgcmVjb2xvdXJlZCAoYGNvbG9yT3ZlcnJpZGRlbmApIGFyZSBsZWZ0IHVudG91Y2hlZC4gVW5rbm93blxuICogY2xhc3NlcyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCBgb25Qcm9tb3RlYCB3aGVuIGBhdXRvUHJvbW90ZWAgaXMgb24uXG4gKlxuICogUmV0dXJucyBhIG5ldyBhcnJheTsgcmVnaW9ucyB3aG9zZSBjb2xvdXIgaXMgYWxyZWFkeSByaWdodCBhcmUgdGhlIHNhbWVcbiAqIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UHJlc2V0Q29sb3JzKFxuICByZWdpb25zOiBSZWdpb25bXSxcbiAgc2V0OiBQcmVzZXRTZXQsXG4gIG9wdHM6IEFwcGx5UHJlc2V0Q29sb3JzT3B0aW9ucyA9IHt9LFxuKTogUmVnaW9uW10ge1xuICBjb25zdCBrbm93biA9IG5ldyBTZXQoc2V0LmNsYXNzZXMubWFwKChjKSA9PiBwcmVzZXRLZXkoc2V0LCBjLm5hbWUpKSk7XG4gIHJldHVybiByZWdpb25zLm1hcCgocmVnaW9uKSA9PiB7XG4gICAgaWYgKCFyZWdpb24ubGFiZWwgfHwgcmVnaW9uLmNvbG9yT3ZlcnJpZGRlbikgcmV0dXJuIHJlZ2lvbjtcbiAgICBjb25zdCBjb2xvciA9IGNvbG9yRm9yTGFiZWwocmVnaW9uLmxhYmVsLCBzZXQpO1xuICAgIGlmIChzZXQuYXV0b1Byb21vdGUgJiYgIWtub3duLmhhcyhwcmVzZXRLZXkoc2V0LCByZWdpb24ubGFiZWwpKSkge1xuICAgICAga25vd24uYWRkKHByZXNldEtleShzZXQsIHJlZ2lvbi5sYWJlbCkpO1xuICAgICAgLy8gSW4gbm9ybWFsaXplZCBtb2RlLCB0cmltIHRoZSBwcm9tb3RlZCBuYW1lIHNvIGxlYWRpbmcvdHJhaWxpbmdcbiAgICAgIC8vIHdoaXRlc3BhY2UgZG9lc24ndCBjcmVhdGUgaW52aXNpYmxlIGR1cGxpY2F0ZXMgb3Igb2RkIGRpc3BsYXkgbmFtZXMuXG4gICAgICBjb25zdCBuYW1lID0gc2V0Lm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gcmVnaW9uLmxhYmVsLnRyaW0oKSA6IHJlZ2lvbi5sYWJlbDtcbiAgICAgIG9wdHMub25Qcm9tb3RlPy4oeyBuYW1lLCBjb2xvciwgc291cmNlOiAnYXV0bycgfSk7XG4gICAgfVxuICAgIGlmIChyZWdpb24uY29sb3IgPT09IGNvbG9yKSByZXR1cm4gcmVnaW9uO1xuICAgIGlmICghb3B0cy5pblBsYWNlPy4ocmVnaW9uKSkgcmV0dXJuIHdpdGhSZWdpb25QYXRjaChyZWdpb24sIHsgY29sb3IgfSk7XG4gICAgcmVnaW9uLmNvbG9yID0gY29sb3I7XG4gICAgcmV0dXJuIHJlZ2lvbjtcbiAgfSk7XG59XG4iXX0=
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtY29sb3IudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvY2xhc3MtY29sb3IudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFTO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsVUFBVSxDQUFDLENBQVM7SUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCx1RUFBdUU7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQWlDLEVBQUUsS0FBYTtJQUN4RSxPQUFPLEdBQUcsRUFBRSxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN6RSxDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxJ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QUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUs7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXRlcm1pbmlzdGljIGNvbG91ciBlbmdpbmUgZm9yIHByZXNldCBhbm5vdGF0aW9uIGNsYXNzZXMgKGppdC11aSM3MCkuXG4gKlxuICogUmVzb2x1dGlvbiBvcmRlciBmb3IgYSByZWdpb24gYGxhYmVsYDpcbiAqICAgMS4gYSBtYXRjaGluZyBwcmVzZXQgKGV4YWN0IGJ5IGRlZmF1bHQsIG9yIG5vcm1hbGl6ZWQgaWYgdGhlIHNldCdzIG1hdGNoTW9kZSBzYXlzIHNvKVxuICogICAgICAtPiB0aGUgcHJlc2V0J3MgY29sb3VyO1xuICogICAyLiBvdGhlcndpc2UgYSBkZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBkZXJpdmVkIGZyb20gYSBzdGFibGUgaGFzaCBvZiB0aGUgbmFtZSxcbiAqICAgICAgc28gdGhlIHNhbWUgdW5rbm93biBjbGFzcyBhbHdheXMgZ2V0cyB0aGUgc2FtZSBjb2xvdXIgd2l0aCBubyBzdG9yZWQgc3RhdGUuXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwdXJlIChubyBtdXRhdGlvbik7IG9wdC1pbiBwcm9tb3Rpb24gb2YgdW5rbm93biBjbGFzc2VzIGludG8gdGhlXG4gKiBzZXQgaXMgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlciAoc2VlIHtAbGluayBhcHBseVByZXNldENvbG9yc30pLCB3aGljaCBvd25zIHBlcnNpc3RlbmNlLlxuICovXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IHdpdGhSZWdpb25QYXRjaCB9IGZyb20gJy4uL21vZGVscy9yZWdpb24tY2xvbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTGFiZWwoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChzID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqIFN0YWJsZSwgbm9uLW5lZ2F0aXZlIDMyLWJpdCBzdHJpbmcgaGFzaCAoaWRlbnRpY2FsIGFjcm9zcyBydW5zIGFuZCBtYWNoaW5lcykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFN0cmluZyhzOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuICAgIGggPSAoTWF0aC5pbXVsKDMxLCBoKSArIHMuY2hhckNvZGVBdChpKSkgfCAwO1xuICB9XG4gIC8vIEZvbGQgdG8gbm9uLW5lZ2F0aXZlIHdpdGhvdXQgdGhlIE1hdGguYWJzKElOVF9NSU4pIG92ZXJmbG93IHBpdGZhbGwuXG4gIHJldHVybiBoIDwgMCA/IH5oIDogaDtcbn1cblxuLyoqXG4gKiBUaGUga2V5IHR3byBjbGFzcyBuYW1lcyBhcmUgY29tcGFyZWQgYnkgdW5kZXIgdGhlIHNldCdzIG1hdGNoIG1vZGU6IHRoZSBuYW1lXG4gKiBpdHNlbGYgZm9yIGBleGFjdGAsIHRyaW1tZWQgYW5kIGxvd2VyLWNhc2VkIGZvciBgbm9ybWFsaXplZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVzZXRLZXkoc2V0OiBQaWNrPFByZXNldFNldCwgJ21hdGNoTW9kZSc+LCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNldD8ubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyBub3JtYWxpemVMYWJlbChsYWJlbCkgOiBsYWJlbDtcbn1cblxuLyoqIGAjUlJHR0JCYCAodXBwZXItY2FzZSkgZm9yIGFuIEhTTCBjb2xvdXI6IGh1ZSBpbiBkZWdyZWVzLCBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgaW4gJS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb0hleChoRGVnOiBudW1iZXIsIHNQY3Q6IG51bWJlciwgbFBjdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IHNQY3QgLyAxMDA7XG4gIGNvbnN0IGwgPSBsUGN0IC8gMTAwO1xuICBjb25zdCBrID0gKG46IG51bWJlcikgPT4gKG4gKyBoRGVnIC8gMzApICUgMTI7XG4gIGNvbnN0IGEgPSBzICogTWF0aC5taW4obCwgMSAtIGwpO1xuICBjb25zdCBjaGFubmVsID0gKG46IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHYgPSBsIC0gYSAqIE1hdGgubWF4KC0xLCBNYXRoLm1pbihrKG4pIC0gMywgOSAtIGsobiksIDEpKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgyNTUgKiB2KVxuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH07XG4gIHJldHVybiBgIyR7Y2hhbm5lbCgwKX0ke2NoYW5uZWwoOCl9JHtjaGFubmVsKDQpfWAudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqIEZpbmQgdGhlIHByZXNldCBtYXRjaGluZyBgbGFiZWxgIHVuZGVyIHRoZSBzZXQncyBtYXRjaCBtb2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQcmVzZXQobGFiZWw6IHN0cmluZywgc2V0OiBQcmVzZXRTZXQpOiBDbGFzc1ByZXNldCB8IHVuZGVmaW5lZCB7XG4gIGlmICghbGFiZWwgfHwgIXNldD8uY2xhc3NlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJykge1xuICAgIGNvbnN0IG4gPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gICAgcmV0dXJuIHNldC5jbGFzc2VzLmZpbmQoKGMpID0+IG5vcm1hbGl6ZUxhYmVsKGMubmFtZSkgPT09IG4pO1xuICB9XG4gIHJldHVybiBzZXQuY2xhc3Nlcy5maW5kKChjKSA9PiBjLm5hbWUgPT09IGxhYmVsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBmb3IgYW4gdW5rbm93biBjbGFzcyBuYW1lOiBpbmRleCBpbnRvIHRoZSBwYWxldHRlIGJ5IGFcbiAqIHN0YWJsZSBoYXNoIG9mIHRoZSAobm9ybWFsaXplZCkgbmFtZTsgaWYgdGhlIHBhbGV0dGUgaXMgZW1wdHksIGdlbmVyYXRlIGEgZ29sZGVuLWFuZ2xlXG4gKiBIU0wgaHVlLiBTYW1lIG5hbWUgLT4gc2FtZSBjb2xvdXIsIGV2ZXJ5IHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhbGxiYWNrQ29sb3JGb3IobGFiZWw6IHN0cmluZywgcGFsZXR0ZTogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gIGlmIChwYWxldHRlICYmIHBhbGV0dGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYWxldHRlW2hhc2hTdHJpbmcoa2V5KSAlIHBhbGV0dGUubGVuZ3RoXTtcbiAgfVxuICBjb25zdCBodWUgPSAoaGFzaFN0cmluZyhrZXkpICogMTM3LjUwOCkgJSAzNjA7XG4gIHJldHVybiBoc2xUb0hleChodWUsIDY1LCA1MCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNvbG91ciBmb3IgYGxhYmVsYDogYSBtYXRjaGluZyBwcmVzZXQncyBjb2xvdXIsIGVsc2UgdGhlIGNvbG91ciBhbiBpbXBvcnRlZCBmaWxlXG4gKiBnYXZlIHRoZSBjbGFzcywgZWxzZSB0aGUgZGV0ZXJtaW5pc3RpYyBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yRm9yTGFiZWwobGFiZWw6IHN0cmluZywgc2V0OiBQcmVzZXRTZXQpOiBzdHJpbmcge1xuICBjb25zdCBwcmVzZXQgPSBmaW5kUHJlc2V0KGxhYmVsLCBzZXQpO1xuICBpZiAocHJlc2V0KSByZXR1cm4gcHJlc2V0LmNvbG9yO1xuICByZXR1cm4gc2V0LmltcG9ydGVkQ29sb3JzPy5bcHJlc2V0S2V5KHNldCwgbGFiZWwpXSA/PyBmYWxsYmFja0NvbG9yRm9yKGxhYmVsLCBzZXQuZmFsbGJhY2tQYWxldHRlKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBhcHBseVByZXNldENvbG9yc30uICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5UHJlc2V0Q29sb3JzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUcnVlIGZvciBhIHJlZ2lvbiB0aGUgY2FsbGVyIG93bnMgb3V0cmlnaHQgKGZyZXNoLCBub3QgeWV0IHN0b3JlZCwgc28gaW4gbm9cbiAgICogdW5kbyBzbmFwc2hvdCk6IGl0cyBjb2xvdXIgaXMgc2V0IGluIHBsYWNlLiBFdmVyeSBvdGhlciByZWdpb24gd2hvc2VcbiAgICogY29sb3VyIGNoYW5nZXMgaXMgY29waWVkLiBEZWZhdWx0OiBuZXZlciBpbiBwbGFjZS5cbiAgICovXG4gIGluUGxhY2U/OiAocjogUmVnaW9uKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHVua25vd24gY2xhc3Mgd2hlbiBgc2V0LmF1dG9Qcm9tb3RlYCBpcyBvbiwgd2l0aCB0aGVcbiAgICogcHJlc2V0IHRvIGFkZCAobmFtZSB0cmltbWVkIGluIGBub3JtYWxpemVkYCBtYXRjaCBtb2RlLCBgc291cmNlOiAnYXV0bydgKS5cbiAgICovXG4gIG9uUHJvbW90ZT86IChwcmVzZXQ6IENsYXNzUHJlc2V0KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZWFjaCBsYWJlbGxlZCByZWdpb24ncyBjb2xvdXIgZnJvbSB0aGUgcHJlc2V0IHNldCAoaml0LXVpIzcwKS4gVGhlXG4gKiBwcmVzZXRzIGFyZSB0aGUgc291cmNlIG9mIHRydXRoOiBhIG1hdGNoaW5nIHByZXNldCBnaXZlcyB0aGUgY2xhc3MgY29sb3VyLFxuICogYW4gdW5rbm93biBjbGFzcyB0aGUgY29sb3VyIGFuIGltcG9ydGVkIGZpbGUgZ2F2ZSBpdCAoYGltcG9ydGVkQ29sb3JzYCkgb3IgZWxzZVxuICogaXRzIGRldGVybWluaXN0aWMgZmFsbGJhY2ssICoqb3ZlcnJpZGluZyBhbnkgY29sb3VyIGFscmVhZHkgb24gdGhlIHJlZ2lvbioqLiBVbmxhYmVsbGVkIHJlZ2lvbnMgYW5kXG4gKiBvbmVzIHRoZSB1c2VyIHJlY29sb3VyZWQgKGBjb2xvck92ZXJyaWRkZW5gKSBhcmUgbGVmdCB1bnRvdWNoZWQuIFVua25vd25cbiAqIGNsYXNzZXMgYXJlIHJlcG9ydGVkIHRocm91Z2ggYG9uUHJvbW90ZWAgd2hlbiBgYXV0b1Byb21vdGVgIGlzIG9uLlxuICpcbiAqIFJldHVybnMgYSBuZXcgYXJyYXk7IHJlZ2lvbnMgd2hvc2UgY29sb3VyIGlzIGFscmVhZHkgcmlnaHQgYXJlIHRoZSBzYW1lXG4gKiBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVByZXNldENvbG9ycyhcbiAgcmVnaW9uczogUmVnaW9uW10sXG4gIHNldDogUHJlc2V0U2V0LFxuICBvcHRzOiBBcHBseVByZXNldENvbG9yc09wdGlvbnMgPSB7fSxcbik6IFJlZ2lvbltdIHtcbiAgY29uc3Qga25vd24gPSBuZXcgU2V0KHNldC5jbGFzc2VzLm1hcCgoYykgPT4gcHJlc2V0S2V5KHNldCwgYy5uYW1lKSkpO1xuICByZXR1cm4gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT4ge1xuICAgIGlmICghcmVnaW9uLmxhYmVsIHx8IHJlZ2lvbi5jb2xvck92ZXJyaWRkZW4pIHJldHVybiByZWdpb247XG4gICAgY29uc3QgY29sb3IgPSBjb2xvckZvckxhYmVsKHJlZ2lvbi5sYWJlbCwgc2V0KTtcbiAgICBpZiAoc2V0LmF1dG9Qcm9tb3RlICYmICFrbm93bi5oYXMocHJlc2V0S2V5KHNldCwgcmVnaW9uLmxhYmVsKSkpIHtcbiAgICAgIGtub3duLmFkZChwcmVzZXRLZXkoc2V0LCByZWdpb24ubGFiZWwpKTtcbiAgICAgIC8vIEluIG5vcm1hbGl6ZWQgbW9kZSwgdHJpbSB0aGUgcHJvbW90ZWQgbmFtZSBzbyBsZWFkaW5nL3RyYWlsaW5nXG4gICAgICAvLyB3aGl0ZXNwYWNlIGRvZXNuJ3QgY3JlYXRlIGludmlzaWJsZSBkdXBsaWNhdGVzIG9yIG9kZCBkaXNwbGF5IG5hbWVzLlxuICAgICAgY29uc3QgbmFtZSA9IHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJyA/IHJlZ2lvbi5sYWJlbC50cmltKCkgOiByZWdpb24ubGFiZWw7XG4gICAgICBvcHRzLm9uUHJvbW90ZT8uKHsgbmFtZSwgY29sb3IsIHNvdXJjZTogJ2F1dG8nIH0pO1xuICAgIH1cbiAgICBpZiAocmVnaW9uLmNvbG9yID09PSBjb2xvcikgcmV0dXJuIHJlZ2lvbjtcbiAgICBpZiAoIW9wdHMuaW5QbGFjZT8uKHJlZ2lvbikpIHJldHVybiB3aXRoUmVnaW9uUGF0Y2gocmVnaW9uLCB7IGNvbG9yIH0pO1xuICAgIHJlZ2lvbi5jb2xvciA9IGNvbG9yO1xuICAgIHJldHVybiByZWdpb247XG4gIH0pO1xufVxuIl19
@@ -0,0 +1,63 @@
1
+ import { MultiPolygon, Polygon, Rectangle } from '../models/region';
2
+ /**
3
+ * A fingerprint of each class's regions (by label): their ids and geometry folded into one number
4
+ * per class. Two sets give the same fingerprint for a class when its regions did not change, so
5
+ * comparing a slice's fingerprints before and after an edit names the classes the edit touched
6
+ * (a recoloured or relabelled region touches its old class and its new one). Profile lines and
7
+ * unlabelled regions are left out: they are in no class.
8
+ */
9
+ export function classSignatures(regions) {
10
+ const out = new Map();
11
+ for (const r of regions) {
12
+ if (!r.label || r.isProfile?.())
13
+ continue;
14
+ out.set(r.label, mix(out.get(r.label) ?? 0, regionHash(r)));
15
+ }
16
+ return out;
17
+ }
18
+ /** The classes whose fingerprints differ between `before` and `after` (added and removed included). */
19
+ export function changedClasses(before, after) {
20
+ const out = new Set();
21
+ for (const [label, sig] of after)
22
+ if (before.get(label) !== sig)
23
+ out.add(label);
24
+ for (const label of before.keys())
25
+ if (!after.has(label))
26
+ out.add(label);
27
+ return out;
28
+ }
29
+ /** Order-independent within a class (summed), so reordering regions changes nothing. */
30
+ function mix(acc, h) {
31
+ return (acc + h) % 4294967296;
32
+ }
33
+ function regionHash(r) {
34
+ let h = hashString(String(r.id ?? ''));
35
+ const b = r.bounds;
36
+ if (b instanceof Rectangle)
37
+ return fold(fold(fold(fold(h, b.x), b.y), b.width), b.height);
38
+ const polygons = b instanceof MultiPolygon ? b.polygons : b instanceof Polygon ? [b] : [];
39
+ for (const p of polygons) {
40
+ h = fold(h, p.closed === false ? 1 : 2);
41
+ for (let i = 0; i < p.xpoints.length; i++)
42
+ h = fold(fold(h, p.xpoints[i]), p.ypoints[i]);
43
+ for (const hole of p.holes ?? [])
44
+ for (const [x, y] of hole)
45
+ h = fold(fold(h, x), y);
46
+ // A bézier region's curve moves with its handles, not only its anchors.
47
+ if (p.bezier)
48
+ for (const [dx, dy] of [...(p.handlesIn ?? []), ...(p.handlesOut ?? [])])
49
+ h = fold(fold(h, dx), dy);
50
+ }
51
+ return h;
52
+ }
53
+ /** FNV-style step over a coordinate (kept to 1/1000 px, which no edit is finer than). */
54
+ function fold(h, v) {
55
+ return Math.imul(h ^ (Math.round(v * 1000) | 0), 16777619) >>> 0;
56
+ }
57
+ function hashString(s) {
58
+ let h = 2166136261;
59
+ for (let i = 0; i < s.length; i++)
60
+ h = Math.imul(h ^ s.charCodeAt(i), 16777619) >>> 0;
61
+ return h;
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Mtc2lnbmF0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQTBCO0lBQ3hELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQUUsU0FBUztRQUMxQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCx1R0FBdUc7QUFDdkcsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBbUMsRUFDbkMsS0FBa0M7SUFFbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSztRQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFBRSxJQUFJLENBQUMsS0FBSyxDQUFD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QUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdWx0aVBvbHlnb24sIFBvbHlnb24sIFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5cbi8qKlxuICogQSBmaW5nZXJwcmludCBvZiBlYWNoIGNsYXNzJ3MgcmVnaW9ucyAoYnkgbGFiZWwpOiB0aGVpciBpZHMgYW5kIGdlb21ldHJ5IGZvbGRlZCBpbnRvIG9uZSBudW1iZXJcbiAqIHBlciBjbGFzcy4gVHdvIHNldHMgZ2l2ZSB0aGUgc2FtZSBmaW5nZXJwcmludCBmb3IgYSBjbGFzcyB3aGVuIGl0cyByZWdpb25zIGRpZCBub3QgY2hhbmdlLCBzb1xuICogY29tcGFyaW5nIGEgc2xpY2UncyBmaW5nZXJwcmludHMgYmVmb3JlIGFuZCBhZnRlciBhbiBlZGl0IG5hbWVzIHRoZSBjbGFzc2VzIHRoZSBlZGl0IHRvdWNoZWRcbiAqIChhIHJlY29sb3VyZWQgb3IgcmVsYWJlbGxlZCByZWdpb24gdG91Y2hlcyBpdHMgb2xkIGNsYXNzIGFuZCBpdHMgbmV3IG9uZSkuIFByb2ZpbGUgbGluZXMgYW5kXG4gKiB1bmxhYmVsbGVkIHJlZ2lvbnMgYXJlIGxlZnQgb3V0OiB0aGV5IGFyZSBpbiBubyBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzU2lnbmF0dXJlcyhyZWdpb25zOiByZWFkb25seSBSZWdpb25bXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBvdXQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGlmICghci5sYWJlbCB8fCByLmlzUHJvZmlsZT8uKCkpIGNvbnRpbnVlO1xuICAgIG91dC5zZXQoci5sYWJlbCwgbWl4KG91dC5nZXQoci5sYWJlbCkgPz8gMCwgcmVnaW9uSGFzaChyKSkpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgY2xhc3NlcyB3aG9zZSBmaW5nZXJwcmludHMgZGlmZmVyIGJldHdlZW4gYGJlZm9yZWAgYW5kIGBhZnRlcmAgKGFkZGVkIGFuZCByZW1vdmVkIGluY2x1ZGVkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VkQ2xhc3NlcyhcbiAgYmVmb3JlOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4sXG4gIGFmdGVyOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4sXG4pOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFtsYWJlbCwgc2lnXSBvZiBhZnRlcikgaWYgKGJlZm9yZS5nZXQobGFiZWwpICE9PSBzaWcpIG91dC5hZGQobGFiZWwpO1xuICBmb3IgKGNvbnN0IGxhYmVsIG9mIGJlZm9yZS5rZXlzKCkpIGlmICghYWZ0ZXIuaGFzKGxhYmVsKSkgb3V0LmFkZChsYWJlbCk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBPcmRlci1pbmRlcGVuZGVudCB3aXRoaW4gYSBjbGFzcyAoc3VtbWVkKSwgc28gcmVvcmRlcmluZyByZWdpb25zIGNoYW5nZXMgbm90aGluZy4gKi9cbmZ1bmN0aW9uIG1peChhY2M6IG51bWJlciwgaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChhY2MgKyBoKSAlIDQyOTQ5NjcyOTY7XG59XG5cbmZ1bmN0aW9uIHJlZ2lvbkhhc2gocjogUmVnaW9uKTogbnVtYmVyIHtcbiAgbGV0IGggPSBoYXNoU3RyaW5nKFN0cmluZyhyLmlkID8/ICcnKSk7XG4gIGNvbnN0IGIgPSByLmJvdW5kcztcbiAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHJldHVybiBmb2xkKGZvbGQoZm9sZChmb2xkKGgsIGIueCksIGIueSksIGIud2lkdGgpLCBiLmhlaWdodCk7XG4gIGNvbnN0IHBvbHlnb25zID0gYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbiA/IGIucG9seWdvbnMgOiBiIGluc3RhbmNlb2YgUG9seWdvbiA/IFtiXSA6IFtdO1xuICBmb3IgKGNvbnN0IHAgb2YgcG9seWdvbnMpIHtcbiAgICBoID0gZm9sZChoLCBwLmNsb3NlZCA9PT0gZmFsc2UgPyAxIDogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwLnhwb2ludHMubGVuZ3RoOyBpKyspIGggPSBmb2xkKGZvbGQoaCwgcC54cG9pbnRzW2ldKSwgcC55cG9pbnRzW2ldKTtcbiAgICBmb3IgKGNvbnN0IGhvbGUgb2YgcC5ob2xlcyA/PyBbXSkgZm9yIChjb25zdCBbeCwgeV0gb2YgaG9sZSkgaCA9IGZvbGQoZm9sZChoLCB4KSwgeSk7XG4gICAgLy8gQSBiw6l6aWVyIHJlZ2lvbidzIGN1cnZlIG1vdmVzIHdpdGggaXRzIGhhbmRsZXMsIG5vdCBvbmx5IGl0cyBhbmNob3JzLlxuICAgIGlmIChwLmJlemllcilcbiAgICAgIGZvciAoY29uc3QgW2R4LCBkeV0gb2YgWy4uLihwLmhhbmRsZXNJbiA/PyBbXSksIC4uLihwLmhhbmRsZXNPdXQgPz8gW10pXSkgaCA9IGZvbGQoZm9sZChoLCBkeCksIGR5KTtcbiAgfVxuICByZXR1cm4gaDtcbn1cblxuLyoqIEZOVi1zdHlsZSBzdGVwIG92ZXIgYSBjb29yZGluYXRlIChrZXB0IHRvIDEvMTAwMCBweCwgd2hpY2ggbm8gZWRpdCBpcyBmaW5lciB0aGFuKS4gKi9cbmZ1bmN0aW9uIGZvbGQoaDogbnVtYmVyLCB2OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5pbXVsKGggXiAoTWF0aC5yb3VuZCh2ICogMTAwMCkgfCAwKSwgMTY3Nzc2MTkpID4+PiAwO1xufVxuXG5mdW5jdGlvbiBoYXNoU3RyaW5nKHM6IHN0cmluZyk6IG51bWJlciB7XG4gIGxldCBoID0gMjE2NjEzNjI2MTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBoID0gTWF0aC5pbXVsKGggXiBzLmNoYXJDb2RlQXQoaSksIDE2Nzc3NjE5KSA+Pj4gMDtcbiAgcmV0dXJuIGg7XG59XG4iXX0=
@@ -29,6 +29,10 @@ export class RegionScopeCache {
29
29
  }
30
30
  return imageInfo.fileName || undefined;
31
31
  }
32
+ /** The active image's cache key (see {@link imageKey}). */
33
+ get activeImage() {
34
+ return this.imageKey;
35
+ }
32
36
  /** True while a z-stack is loaded and regions are held per slice. */
33
37
  get stackMode() {
34
38
  return this.stack;
@@ -137,4 +141,4 @@ export class RegionScopeCache {
137
141
  return out;
138
142
  }
139
143
  }
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNjb3BlLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS9yZWdpb24tc2NvcGUtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBT3JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFDVSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFHdEMsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ3RDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFvQixVQUFVLENBQUM7UUFDN0M7NkVBQ3FFO1FBQzdELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQXVIOUMsQ0FBQztJQXJIQyxxRUFBcUU7SUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFpQztRQUMvQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2pDLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztJQUN6QyxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsc0VBQXNF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QztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFTLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxHQUFHLENBQ0wsQ0FBQyxFQUNELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgd2l0aFJlZ2lvblogfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcblxuLyoqIEhvdyBhIHN0YWNrJ3MgcmVnaW9ucyByb3VuZC10cmlwIHRvIGRpc2sgKGppdC11aSM5Myk6IGBjb21iaW5lZGAgd3JpdGVzIG9uZVxuICogIHotaW5kZXhlZCBnZW9qc29uIChzaW5nbGUtZmlsZSB6LXN0YWNrLCBRdVBhdGggc2NoZW1hKTsgYHBlci1zbGljZS1maWxlYFxuICogIHdyaXRlcyBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSAoYSBmb2xkZXIgb2YgbnVtYmVyZWQgaW1hZ2VzKS4gKi9cbmV4cG9ydCB0eXBlIFN0YWNrU2F2ZUxheW91dCA9ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnO1xuXG4vKipcbiAqIFdoZXJlIHRoZSByZWdpb24gc3RvcmUncyAqbGl2ZSogc2V0IGNvbWVzIGZyb20gYW5kIGdvZXMgYmFjayB0bzogYSBwZXItaW1hZ2VcbiAqIGNhY2hlIChrZXllZCBieSB0aGUgaW1hZ2UncyBmaXJzdCBVUkwsIGVsc2UgaXRzIGZpbGUgbmFtZSkgYW5kLCB3aGlsZSBhXG4gKiB6LXN0YWNrIGlzIGxvYWRlZCwgYSBwZXItc2xpY2UgbWFwIGZvciB0aGUgY3VycmVudCBpbWFnZSAoaml0LXVpIzkzKS5cbiAqXG4gKiBUaGUgb3duZXIgaG9sZHMgdGhlIGxpdmUgYXJyYXk7IGV2ZXJ5IG1ldGhvZCB0aGF0IGNhbiBjaGFuZ2Ugc2NvcGUgdGFrZXNcbiAqIHRoZSBjdXJyZW50IGxpdmUgYXJyYXkgKHRvIGNhcHR1cmUgaXRzIGVkaXRzKSBhbmQgcmV0dXJucyB0aGUgaW5jb21pbmdcbiAqIGxpdmUgc2V0LCBvciBudWxsIHdoZW4gbm90aGluZyBjaGFuZ2VzLiBJdCBuZXZlciBjaGFuZ2VzIGEgcmVnaW9uOiBzbGljZVxuICogdGFncyBhcmUgYXBwbGllZCB0byBjb3BpZXMgKHtAbGluayB3aXRoUmVnaW9uWn0pLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uU2NvcGVDYWNoZSB7XG4gIHByaXZhdGUgYnlJbWFnZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBpbWFnZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBzdGFjayA9IGZhbHNlO1xuICBwcml2YXRlIHNsaWNlWiA9IDA7XG4gIHByaXZhdGUgbGF5b3V0OiBTdGFja1NhdmVMYXlvdXQgPSAnY29tYmluZWQnO1xuICAvKiogU2xpY2VzIGxvYWRlZCB3aXRoIHJlZ2lvbnM6IGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSByZS13cml0ZXMgdGhlbSBldmVuIHdoZW5cbiAgICogIG5vdyBlbXB0eSwgc28gY2xlYXJpbmcgYSBzbGljZSBhbmQgc2F2aW5nIHJlbW92ZXMgaXRzIGdlb2pzb24uICovXG4gIHByaXZhdGUgaW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLyoqIFRoZSBjYWNoZSBrZXkgZm9yIGFuIGltYWdlOiBpdHMgZmlyc3QgVVJMLCBlbHNlIGl0cyBmaWxlIG5hbWUuICovXG4gIHN0YXRpYyBpbWFnZUtleShpbWFnZUluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghaW1hZ2VJbmZvKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChpbWFnZUluZm8udXJscyAmJiBpbWFnZUluZm8udXJscy5sZW5ndGggPiAwICYmIGltYWdlSW5mby51cmxzWzBdKSB7XG4gICAgICByZXR1cm4gaW1hZ2VJbmZvLnVybHNbMF07XG4gICAgfVxuICAgIHJldHVybiBpbWFnZUluZm8uZmlsZU5hbWUgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRydWUgd2hpbGUgYSB6LXN0YWNrIGlzIGxvYWRlZCBhbmQgcmVnaW9ucyBhcmUgaGVsZCBwZXIgc2xpY2UuICovXG4gIGdldCBzdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2s7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgZGlzcGxheSBzbGljZSAoemVyby1iYXNlZDsgMCBvdXRzaWRlIHN0YWNrIG1vZGUgdW5sZXNzIHNldCkuICovXG4gIGdldCBkaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZVo7XG4gIH1cblxuICAvKiogSG93IHRoZSBjdXJyZW50IHN0YWNrIHBlcnNpc3RzOyBtZWFuaW5nbGVzcyBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIGdldCBzYXZlTGF5b3V0KCk6IFN0YWNrU2F2ZUxheW91dCB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0O1xuICB9XG5cbiAgLyoqIFJlY29yZCBgbGl2ZWAgYXMgdGhlIGN1cnJlbnQgaW1hZ2UncyByZWdpb25zLiAqL1xuICBzeW5jKGxpdmU6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW1hZ2VLZXkpIHRoaXMuYnlJbWFnZS5zZXQodGhpcy5pbWFnZUtleSwgbGl2ZS5zbGljZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGBrZXlgIHRoZSBhY3RpdmUgaW1hZ2U6IGVuZHMgc3RhY2sgbW9kZSwgY2FjaGVzIGBsaXZlYCB1bmRlciB0aGVcbiAgICogb3V0Z29pbmcgaW1hZ2UsIGFuZCByZXR1cm5zIHRoZSBpbmNvbWluZyBpbWFnZSdzIHJlZ2lvbnMgKG9yIFtdKS4gTnVsbCB3aGVuXG4gICAqIGBrZXlgIGFscmVhZHkgaXMgdGhlIGFjdGl2ZSBpbWFnZSAocmVwZWF0ZWQgcmVwbG90cyBrZWVwIHRoZWlyIHJlZ2lvbnMpLlxuICAgKi9cbiAgc3dpdGNoSW1hZ2Uoa2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsIGxpdmU6IFJlZ2lvbltdKTogUmVnaW9uW10gfCBudWxsIHtcbiAgICBpZiAodGhpcy5pbWFnZUtleSA9PT0ga2V5KSByZXR1cm4gbnVsbDtcbiAgICAvLyBUaGUgbG9hZGVyIHJlLWVudGVycyBzdGFjayBtb2RlIGFmdGVyd2FyZHMgaWYgdGhlIG5ldyBpbWFnZSBpcyBhIHotc3RhY2suXG4gICAgdGhpcy5leGl0U3RhY2soKTtcbiAgICBpZiAodGhpcy5pbWFnZUtleSkgdGhpcy5ieUltYWdlLnNldCh0aGlzLmltYWdlS2V5LCBsaXZlLnNsaWNlKCkpO1xuICAgIHRoaXMuaW1hZ2VLZXkgPSBrZXk7XG4gICAgY29uc3QgY2FjaGVkID0ga2V5ID8gdGhpcy5ieUltYWdlLmdldChrZXkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBjYWNoZWQgPyBjYWNoZWQuc2xpY2UoKSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVyIHBlci1zbGljZSBtb2RlIHdpdGggYHNsaWNlc2AgKGFscmVhZHkgYWRtaXR0ZWQgYnkgdGhlIHN0b3JlLCBlYWNoXG4gICAqIHJlZ2lvbiB0YWdnZWQgd2l0aCBpdHMgc2xpY2UpIGFuZCByZXR1cm4gYGluaXRpYWxaYCdzIHNsaWNlIGFzIHRoZSBsaXZlIHNldC5cbiAgICovXG4gIGVudGVyU3RhY2soc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaOiBudW1iZXIsIGxheW91dDogU3RhY2tTYXZlTGF5b3V0KTogUmVnaW9uW10ge1xuICAgIHRoaXMuc3RhY2sgPSB0cnVlO1xuICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgIHRoaXMuc2xpY2VaID0gaW5pdGlhbFogfHwgMDtcbiAgICB0aGlzLmJ5U2xpY2UgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgdGhpcy5pbml0aWFsTm9uRW1wdHkgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IFt6LCByZWdzXSBvZiBzbGljZXMpIHtcbiAgICAgIHRoaXMuYnlTbGljZS5zZXQoeiwgcmVncyk7XG4gICAgICBpZiAocmVncy5sZW5ndGgpIHRoaXMuaW5pdGlhbE5vbkVtcHR5LmFkZCh6KTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLmJ5U2xpY2UuZ2V0KHRoaXMuc2xpY2VaKSA/PyBbXSkuc2xpY2UoKTtcbiAgfVxuXG4gIC8qKiBMZWF2ZSBzdGFjayBtb2RlOyBhIG5vLW9wIG91dHNpZGUgaXQuICovXG4gIGV4aXRTdGFjaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhY2spIHJldHVybjtcbiAgICB0aGlzLnN0YWNrID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZVogPSAwO1xuICAgIHRoaXMuYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICB0aGlzLmluaXRpYWxOb25FbXB0eSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgc2xpY2UgYHpgOiBjYXB0dXJlIGBsaXZlYCBpbnRvIHRoZSBjdXJyZW50IHNsaWNlIGFuZCByZXR1cm4gc2xpY2VcbiAgICogYHpgJ3MgcmVnaW9ucy4gTnVsbCB3aGVuIG5vdGhpbmcgc3dhcHMg4oCUIHRoZSBzYW1lIHNsaWNlLCBvciBvdXRzaWRlIHN0YWNrXG4gICAqIG1vZGUgKHdoZXJlIHRoZSBpbmRleCBpcyBvbmx5IHJlY29yZGVkKS5cbiAgICovXG4gIHNob3dTbGljZSh6OiBudW1iZXIsIGxpdmU6IFJlZ2lvbltdKTogUmVnaW9uW10gfCBudWxsIHtcbiAgICBjb25zdCBuZXh0ID0geiB8fCAwO1xuICAgIGlmICghdGhpcy5zdGFjaykge1xuICAgICAgdGhpcy5zbGljZVogPSBuZXh0O1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNsaWNlWiA9PT0gbmV4dCkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5ieVNsaWNlLnNldCh0aGlzLnNsaWNlWiwgbGl2ZS5zbGljZSgpKTtcbiAgICB0aGlzLnNsaWNlWiA9IG5leHQ7XG4gICAgcmV0dXJuICh0aGlzLmJ5U2xpY2UuZ2V0KG5leHQpID8/IFtdKS5zbGljZSgpO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IHNsaWNlJ3MgcmVnaW9ucyAoY3VycmVudCBvbmUgZnJvbSBgbGl2ZWApLCBlYWNoIHRhZ2dlZCB3aXRoIGl0cyB6LFxuICAgKiAgaW4gc2xpY2Ugb3JkZXI7IGBsaXZlYCBpdHNlbGYgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBzbGljZVJlZ2lvbnMobGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrKSByZXR1cm4gbGl2ZS5zbGljZSgpO1xuICAgIHRoaXMuYnlTbGljZS5zZXQodGhpcy5zbGljZVosIGxpdmUuc2xpY2UoKSk7XG4gICAgY29uc3Qgb3V0OiBSZWdpb25bXSA9IFtdO1xuICAgIGNvbnN0IHpzID0gQXJyYXkuZnJvbSh0aGlzLmJ5U2xpY2Uua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgZm9yIChjb25zdCB6IG9mIHpzKSB7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5ieVNsaWNlLmdldCh6KSBhcyBSZWdpb25bXSkgb3V0LnB1c2god2l0aFJlZ2lvbloociwgeikpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFNsaWNlcyB0byB3cml0ZSBvbiBhIHBlci1zbGljZS1maWxlIHNhdmU6IGV2ZXJ5IHNsaWNlIHdpdGggcmVnaW9ucyBwbHVzXG4gICAqICBldmVyeSBzbGljZSBsb2FkZWQgbm9uLWVtcHR5IChyZS13cml0dGVuIGVtcHR5IHdoZW4gY2xlYXJlZCkuIEVtcHR5XG4gICAqICBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIHN0YWNrU2F2ZVNsaWNlcyhsaXZlOiBSZWdpb25bXSk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGlmICghdGhpcy5zdGFjaykgcmV0dXJuIG91dDtcbiAgICB0aGlzLmJ5U2xpY2Uuc2V0KHRoaXMuc2xpY2VaLCBsaXZlLnNsaWNlKCkpO1xuICAgIGNvbnN0IHpzID0gbmV3IFNldDxudW1iZXI+KHRoaXMuaW5pdGlhbE5vbkVtcHR5KTtcbiAgICBmb3IgKGNvbnN0IFt6LCByZWdzXSBvZiB0aGlzLmJ5U2xpY2UpIGlmIChyZWdzLmxlbmd0aCkgenMuYWRkKHopO1xuICAgIGZvciAoY29uc3QgeiBvZiBBcnJheS5mcm9tKHpzKS5zb3J0KChhLCBiKSA9PiBhIC0gYikpIHtcbiAgICAgIG91dC5zZXQoXG4gICAgICAgIHosXG4gICAgICAgICh0aGlzLmJ5U2xpY2UuZ2V0KHopID8/IFtdKS5tYXAoKHIpID0+IHdpdGhSZWdpb25aKHIsIHopKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn1cbiJdfQ==
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNjb3BlLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS9yZWdpb24tc2NvcGUtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBT3JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFDVSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFHdEMsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ3RDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFvQixVQUFVLENBQUM7UUFDN0M7NkVBQ3FFO1FBQzdELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQTRIOUMsQ0FBQztJQTFIQyxxRUFBcUU7SUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFpQztRQUMvQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2pDLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsMkRBQTJEO0lBQzNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsK0VBQStF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QUFJLEdBQUcsRUFBb0IsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFTLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxHQUFHLENBQ0wsQ0FBQyxFQUNELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgd2l0aFJlZ2lvblogfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcblxuLyoqIEhvdyBhIHN0YWNrJ3MgcmVnaW9ucyByb3VuZC10cmlwIHRvIGRpc2sgKGppdC11aSM5Myk6IGBjb21iaW5lZGAgd3JpdGVzIG9uZVxuICogIHotaW5kZXhlZCBnZW9qc29uIChzaW5nbGUtZmlsZSB6LXN0YWNrLCBRdVBhdGggc2NoZW1hKTsgYHBlci1zbGljZS1maWxlYFxuICogIHdyaXRlcyBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSAoYSBmb2xkZXIgb2YgbnVtYmVyZWQgaW1hZ2VzKS4gKi9cbmV4cG9ydCB0eXBlIFN0YWNrU2F2ZUxheW91dCA9ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnO1xuXG4vKipcbiAqIFdoZXJlIHRoZSByZWdpb24gc3RvcmUncyAqbGl2ZSogc2V0IGNvbWVzIGZyb20gYW5kIGdvZXMgYmFjayB0bzogYSBwZXItaW1hZ2VcbiAqIGNhY2hlIChrZXllZCBieSB0aGUgaW1hZ2UncyBmaXJzdCBVUkwsIGVsc2UgaXRzIGZpbGUgbmFtZSkgYW5kLCB3aGlsZSBhXG4gKiB6LXN0YWNrIGlzIGxvYWRlZCwgYSBwZXItc2xpY2UgbWFwIGZvciB0aGUgY3VycmVudCBpbWFnZSAoaml0LXVpIzkzKS5cbiAqXG4gKiBUaGUgb3duZXIgaG9sZHMgdGhlIGxpdmUgYXJyYXk7IGV2ZXJ5IG1ldGhvZCB0aGF0IGNhbiBjaGFuZ2Ugc2NvcGUgdGFrZXNcbiAqIHRoZSBjdXJyZW50IGxpdmUgYXJyYXkgKHRvIGNhcHR1cmUgaXRzIGVkaXRzKSBhbmQgcmV0dXJucyB0aGUgaW5jb21pbmdcbiAqIGxpdmUgc2V0LCBvciBudWxsIHdoZW4gbm90aGluZyBjaGFuZ2VzLiBJdCBuZXZlciBjaGFuZ2VzIGEgcmVnaW9uOiBzbGljZVxuICogdGFncyBhcmUgYXBwbGllZCB0byBjb3BpZXMgKHtAbGluayB3aXRoUmVnaW9uWn0pLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uU2NvcGVDYWNoZSB7XG4gIHByaXZhdGUgYnlJbWFnZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBpbWFnZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBzdGFjayA9IGZhbHNlO1xuICBwcml2YXRlIHNsaWNlWiA9IDA7XG4gIHByaXZhdGUgbGF5b3V0OiBTdGFja1NhdmVMYXlvdXQgPSAnY29tYmluZWQnO1xuICAvKiogU2xpY2VzIGxvYWRlZCB3aXRoIHJlZ2lvbnM6IGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSByZS13cml0ZXMgdGhlbSBldmVuIHdoZW5cbiAgICogIG5vdyBlbXB0eSwgc28gY2xlYXJpbmcgYSBzbGljZSBhbmQgc2F2aW5nIHJlbW92ZXMgaXRzIGdlb2pzb24uICovXG4gIHByaXZhdGUgaW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLyoqIFRoZSBjYWNoZSBrZXkgZm9yIGFuIGltYWdlOiBpdHMgZmlyc3QgVVJMLCBlbHNlIGl0cyBmaWxlIG5hbWUuICovXG4gIHN0YXRpYyBpbWFnZUtleShpbWFnZUluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghaW1hZ2VJbmZvKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChpbWFnZUluZm8udXJscyAmJiBpbWFnZUluZm8udXJscy5sZW5ndGggPiAwICYmIGltYWdlSW5mby51cmxzWzBdKSB7XG4gICAgICByZXR1cm4gaW1hZ2VJbmZvLnVybHNbMF07XG4gICAgfVxuICAgIHJldHVybiBpbWFnZUluZm8uZmlsZU5hbWUgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBhY3RpdmUgaW1hZ2UncyBjYWNoZSBrZXkgKHNlZSB7QGxpbmsgaW1hZ2VLZXl9KS4gKi9cbiAgZ2V0IGFjdGl2ZUltYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VLZXk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGlsZSBhIHotc3RhY2sgaXMgbG9hZGVkIGFuZCByZWdpb25zIGFyZSBoZWxkIHBlciBzbGljZS4gKi9cbiAgZ2V0IHN0YWNrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGFjaztcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudCBkaXNwbGF5IHNsaWNlICh6ZXJvLWJhc2VkOyAwIG91dHNpZGUgc3RhY2sgbW9kZSB1bmxlc3Mgc2V0KS4gKi9cbiAgZ2V0IGRpc3BsYXlTbGljZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNsaWNlWjtcbiAgfVxuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgc3RhY2sgcGVyc2lzdHM7IG1lYW5pbmdsZXNzIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0IHNhdmVMYXlvdXQoKTogU3RhY2tTYXZlTGF5b3V0IHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQ7XG4gIH1cblxuICAvKiogUmVjb3JkIGBsaXZlYCBhcyB0aGUgY3VycmVudCBpbWFnZSdzIHJlZ2lvbnMuICovXG4gIHN5bmMobGl2ZTogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbWFnZUtleSkgdGhpcy5ieUltYWdlLnNldCh0aGlzLmltYWdlS2V5LCBsaXZlLnNsaWNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYGtleWAgdGhlIGFjdGl2ZSBpbWFnZTogZW5kcyBzdGFjayBtb2RlLCBjYWNoZXMgYGxpdmVgIHVuZGVyIHRoZVxuICAgKiBvdXRnb2luZyBpbWFnZSwgYW5kIHJldHVybnMgdGhlIGluY29taW5nIGltYWdlJ3MgcmVnaW9ucyAob3IgW10pLiBOdWxsIHdoZW5cbiAgICogYGtleWAgYWxyZWFkeSBpcyB0aGUgYWN0aXZlIGltYWdlIChyZXBlYXRlZCByZXBsb3RzIGtlZXAgdGhlaXIgcmVnaW9ucykuXG4gICAqL1xuICBzd2l0Y2hJbWFnZShrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB8IG51bGwge1xuICAgIGlmICh0aGlzLmltYWdlS2V5ID09PSBrZXkpIHJldHVybiBudWxsO1xuICAgIC8vIFRoZSBsb2FkZXIgcmUtZW50ZXJzIHN0YWNrIG1vZGUgYWZ0ZXJ3YXJkcyBpZiB0aGUgbmV3IGltYWdlIGlzIGEgei1zdGFjay5cbiAgICB0aGlzLmV4aXRTdGFjaygpO1xuICAgIGlmICh0aGlzLmltYWdlS2V5KSB0aGlzLmJ5SW1hZ2Uuc2V0KHRoaXMuaW1hZ2VLZXksIGxpdmUuc2xpY2UoKSk7XG4gICAgdGhpcy5pbWFnZUtleSA9IGtleTtcbiAgICBjb25zdCBjYWNoZWQgPSBrZXkgPyB0aGlzLmJ5SW1hZ2UuZ2V0KGtleSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNhY2hlZCA/IGNhY2hlZC5zbGljZSgpIDogW107XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgcGVyLXNsaWNlIG1vZGUgd2l0aCBgc2xpY2VzYCAoYWxyZWFkeSBhZG1pdHRlZCBieSB0aGUgc3RvcmUsIGVhY2hcbiAgICogcmVnaW9uIHRhZ2dlZCB3aXRoIGl0cyBzbGljZSkgYW5kIHJldHVybiBgaW5pdGlhbFpgJ3Mgc2xpY2UgYXMgdGhlIGxpdmUgc2V0LlxuICAgKi9cbiAgZW50ZXJTdGFjayhzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiwgaW5pdGlhbFo6IG51bWJlciwgbGF5b3V0OiBTdGFja1NhdmVMYXlvdXQpOiBSZWdpb25bXSB7XG4gICAgdGhpcy5zdGFjayA9IHRydWU7XG4gICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgdGhpcy5zbGljZVogPSBpbml0aWFsWiB8fCAwO1xuICAgIHRoaXMuYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICB0aGlzLmluaXRpYWxOb25FbXB0eSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHNsaWNlcykge1xuICAgICAgdGhpcy5ieVNsaWNlLnNldCh6LCByZWdzKTtcbiAgICAgIGlmIChyZWdzLmxlbmd0aCkgdGhpcy5pbml0aWFsTm9uRW1wdHkuYWRkKHopO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMuYnlTbGljZS5nZXQodGhpcy5zbGljZVopID8/IFtdKS5zbGljZSgpO1xuICB9XG5cbiAgLyoqIExlYXZlIHN0YWNrIG1vZGU7IGEgbm8tb3Agb3V0c2lkZSBpdC4gKi9cbiAgZXhpdFN0YWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGFjaykgcmV0dXJuO1xuICAgIHRoaXMuc3RhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlWiA9IDA7XG4gICAgdGhpcy5ieVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIHRoaXMuaW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBzbGljZSBgemA6IGNhcHR1cmUgYGxpdmVgIGludG8gdGhlIGN1cnJlbnQgc2xpY2UgYW5kIHJldHVybiBzbGljZVxuICAgKiBgemAncyByZWdpb25zLiBOdWxsIHdoZW4gbm90aGluZyBzd2FwcyDigJQgdGhlIHNhbWUgc2xpY2UsIG9yIG91dHNpZGUgc3RhY2tcbiAgICogbW9kZSAod2hlcmUgdGhlIGluZGV4IGlzIG9ubHkgcmVjb3JkZWQpLlxuICAgKi9cbiAgc2hvd1NsaWNlKHo6IG51bWJlciwgbGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB8IG51bGwge1xuICAgIGNvbnN0IG5leHQgPSB6IHx8IDA7XG4gICAgaWYgKCF0aGlzLnN0YWNrKSB7XG4gICAgICB0aGlzLnNsaWNlWiA9IG5leHQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2xpY2VaID09PSBuZXh0KSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLmJ5U2xpY2Uuc2V0KHRoaXMuc2xpY2VaLCBsaXZlLnNsaWNlKCkpO1xuICAgIHRoaXMuc2xpY2VaID0gbmV4dDtcbiAgICByZXR1cm4gKHRoaXMuYnlTbGljZS5nZXQobmV4dCkgPz8gW10pLnNsaWNlKCk7XG4gIH1cblxuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIChjdXJyZW50IG9uZSBmcm9tIGBsaXZlYCksIGVhY2ggdGFnZ2VkIHdpdGggaXRzIHosXG4gICAqICBpbiBzbGljZSBvcmRlcjsgYGxpdmVgIGl0c2VsZiBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIHNsaWNlUmVnaW9ucyhsaXZlOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgICBpZiAoIXRoaXMuc3RhY2spIHJldHVybiBsaXZlLnNsaWNlKCk7XG4gICAgdGhpcy5ieVNsaWNlLnNldCh0aGlzLnNsaWNlWiwgbGl2ZS5zbGljZSgpKTtcbiAgICBjb25zdCBvdXQ6IFJlZ2lvbltdID0gW107XG4gICAgY29uc3QgenMgPSBBcnJheS5mcm9tKHRoaXMuYnlTbGljZS5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBmb3IgKGNvbnN0IHogb2YgenMpIHtcbiAgICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmJ5U2xpY2UuZ2V0KHopIGFzIFJlZ2lvbltdKSBvdXQucHVzaCh3aXRoUmVnaW9uWihyLCB6KSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZTogZXZlcnkgc2xpY2Ugd2l0aCByZWdpb25zIHBsdXNcbiAgICogIGV2ZXJ5IHNsaWNlIGxvYWRlZCBub24tZW1wdHkgKHJlLXdyaXR0ZW4gZW1wdHkgd2hlbiBjbGVhcmVkKS4gRW1wdHlcbiAgICogIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgc3RhY2tTYXZlU2xpY2VzKGxpdmU6IFJlZ2lvbltdKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgaWYgKCF0aGlzLnN0YWNrKSByZXR1cm4gb3V0O1xuICAgIHRoaXMuYnlTbGljZS5zZXQodGhpcy5zbGljZVosIGxpdmUuc2xpY2UoKSk7XG4gICAgY29uc3QgenMgPSBuZXcgU2V0PG51bWJlcj4odGhpcy5pbml0aWFsTm9uRW1wdHkpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMuYnlTbGljZSkgaWYgKHJlZ3MubGVuZ3RoKSB6cy5hZGQoeik7XG4gICAgZm9yIChjb25zdCB6IG9mIEFycmF5LmZyb20oenMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSkge1xuICAgICAgb3V0LnNldChcbiAgICAgICAgeixcbiAgICAgICAgKHRoaXMuYnlTbGljZS5nZXQoeikgPz8gW10pLm1hcCgocikgPT4gd2l0aFJlZ2lvbloociwgeikpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuIl19