@jax-data-science/sci-image-visualizer 0.9.0 → 0.11.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 (149) hide show
  1. package/esm2022/index.mjs +10 -1
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/contracts/viz-config.mjs +1 -1
  9. package/esm2022/lib/geometry/loft.mjs +128 -0
  10. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  11. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  12. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  13. package/esm2022/lib/geometry/section.mjs +215 -0
  14. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
  15. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
  16. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  17. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
  18. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
  20. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
  21. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
  22. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  23. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
  24. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  25. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
  26. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
  27. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
  28. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
  29. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
  30. package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
  31. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
  32. package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
  33. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
  34. package/esm2022/lib/models/class-preset.mjs +1 -1
  35. package/esm2022/lib/models/polygon-factory.mjs +17 -1
  36. package/esm2022/lib/models/region-geojson.mjs +44 -6
  37. package/esm2022/lib/models/region.mjs +1 -1
  38. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  39. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  40. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +77 -13
  41. package/esm2022/lib/region-editor/region-editor.component.mjs +670 -42
  42. package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
  43. package/esm2022/lib/region-editor/region-persistence.service.mjs +44 -10
  44. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
  45. package/esm2022/lib/region-import/label-classes.mjs +149 -0
  46. package/esm2022/lib/region-import/label-volume.mjs +194 -0
  47. package/esm2022/lib/region-import/region-import.mjs +71 -0
  48. package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
  49. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  50. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  51. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  52. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  53. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  54. package/esm2022/lib/region-source/region-source.mjs +67 -0
  55. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  56. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  57. package/esm2022/lib/routing-visualizer.service.mjs +510 -22
  58. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  59. package/esm2022/lib/store/class-color.util.mjs +10 -5
  60. package/esm2022/lib/store/class-signatures.mjs +63 -0
  61. package/esm2022/lib/store/region-scope-cache.mjs +5 -1
  62. package/esm2022/lib/store/region-source-scope.mjs +186 -0
  63. package/esm2022/lib/store/region-store.service.mjs +774 -12
  64. package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
  65. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
  66. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
  67. package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
  68. package/esm2022/lib/visualizer/region-load.mjs +67 -4
  69. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  70. package/esm2022/lib/visualizer.component.mjs +155 -7
  71. 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-BELcx0jv.mjs} +9851 -2904
  72. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
  73. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +4 -4
  74. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
  75. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  76. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  77. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -3
  78. package/fesm2022/region-source.worker.js +1067 -0
  79. package/index.d.ts +12 -0
  80. package/lib/contracts/image.contract.d.ts +4 -0
  81. package/lib/contracts/ports/region-io.port.d.ts +24 -0
  82. package/lib/contracts/region-editor-api.contract.d.ts +102 -0
  83. package/lib/contracts/region-store.contract.d.ts +22 -0
  84. package/lib/contracts/section-view.contract.d.ts +44 -0
  85. package/lib/contracts/visualizer.contract.d.ts +10 -0
  86. package/lib/contracts/viz-config.d.ts +8 -0
  87. package/lib/geometry/loft.d.ts +22 -0
  88. package/lib/geometry/polylabel.d.ts +23 -0
  89. package/lib/geometry/reconstruct.d.ts +54 -0
  90. package/lib/geometry/reslice-image.d.ts +33 -0
  91. package/lib/geometry/section.d.ts +52 -0
  92. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
  93. package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
  94. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  95. package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
  96. package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
  97. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
  98. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
  99. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  100. package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
  101. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  102. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
  103. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
  104. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
  105. package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
  106. package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
  107. package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
  108. package/lib/implementations/osd/slice-cache.d.ts +13 -3
  109. package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
  110. package/lib/models/class-preset.d.ts +7 -0
  111. package/lib/models/polygon-factory.d.ts +5 -0
  112. package/lib/models/region-geojson.d.ts +40 -0
  113. package/lib/models/region.d.ts +19 -0
  114. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  115. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  116. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +36 -6
  117. package/lib/region-editor/region-editor.component.d.ts +159 -17
  118. package/lib/region-editor/region-metrics.d.ts +8 -0
  119. package/lib/region-editor/region-persistence.service.d.ts +17 -5
  120. package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
  121. package/lib/region-import/label-classes.d.ts +39 -0
  122. package/lib/region-import/label-volume.d.ts +31 -0
  123. package/lib/region-import/region-import.d.ts +46 -0
  124. package/lib/region-overlay/region-geometry.d.ts +4 -3
  125. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  126. package/lib/region-overlay/region-style.d.ts +52 -0
  127. package/lib/region-source/http-region-source.d.ts +45 -0
  128. package/lib/region-source/region-source-ops.d.ts +89 -0
  129. package/lib/region-source/region-source-worker.d.ts +7 -0
  130. package/lib/region-source/region-source.d.ts +82 -0
  131. package/lib/region-source/region-tiles.d.ts +289 -0
  132. package/lib/region-source/worker-region-source.d.ts +65 -0
  133. package/lib/routing-visualizer.service.d.ts +168 -1
  134. package/lib/section-pane/section-pane.component.d.ts +47 -0
  135. package/lib/store/class-color.util.d.ts +6 -3
  136. package/lib/store/class-signatures.d.ts +11 -0
  137. package/lib/store/region-scope-cache.d.ts +2 -0
  138. package/lib/store/region-source-scope.d.ts +74 -0
  139. package/lib/store/region-store.service.d.ts +216 -2
  140. package/lib/store/visualizer-store.service.d.ts +10 -0
  141. package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
  142. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
  143. package/lib/toolbar/toolbar.component.d.ts +9 -2
  144. package/lib/visualizer/region-load.d.ts +23 -4
  145. package/lib/visualizer/volume-sections.d.ts +64 -0
  146. package/lib/visualizer.component.d.ts +40 -0
  147. package/package.json +2 -2
  148. package/src/lib/assets/slice.svg +23 -0
  149. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
@@ -0,0 +1,104 @@
1
+ import { firstValueFrom } from 'rxjs';
2
+ import { RegionTileCache, abortable } from './region-source';
3
+ /** Open the region source at `baseUrl` (its `info` is fetched first). */
4
+ export async function openHttpRegionSource(baseUrl, options = {}) {
5
+ const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
6
+ const http = new Http(base, options);
7
+ const info = await http.json('info');
8
+ return new HttpRegionSource(http, info);
9
+ }
10
+ class Http {
11
+ constructor(base, options) {
12
+ this.base = base;
13
+ this.options = options;
14
+ this.fetchFn = options.fetch ?? ((input, init) => fetch(input, init));
15
+ }
16
+ async json(path, body) {
17
+ return JSON.parse(await this.text(path, body));
18
+ }
19
+ async text(path, body) {
20
+ const http = this.options.http;
21
+ if (http) {
22
+ const url = this.base + path;
23
+ try {
24
+ return await firstValueFrom(body === undefined
25
+ ? http.get(url, { responseType: 'text' })
26
+ : http.post(url, body, { responseType: 'text' }));
27
+ }
28
+ catch (err) {
29
+ const status = err?.status;
30
+ throw new Error(`Region source ${path}: HTTP ${status ?? 'error'}`);
31
+ }
32
+ }
33
+ const init = { ...this.options.init };
34
+ if (body !== undefined) {
35
+ init.method = 'POST';
36
+ init.body = JSON.stringify(body);
37
+ init.headers = {
38
+ ...this.options.init?.headers,
39
+ 'Content-Type': 'application/json',
40
+ };
41
+ }
42
+ const res = await this.fetchFn(this.base + path, init);
43
+ if (!res.ok)
44
+ throw new Error(`Region source ${path}: HTTP ${res.status}`);
45
+ return res.text();
46
+ }
47
+ }
48
+ class HttpRegionSource {
49
+ constructor(http, info) {
50
+ this.http = http;
51
+ this.info = info;
52
+ this.cache = new RegionTileCache();
53
+ }
54
+ getTile(z, key, signal) {
55
+ // The fetch itself is not aborted: another view (the other backend) may be waiting on the
56
+ // same cached tile, and a tile is small. Only this caller stops waiting.
57
+ const tile = this.cache.get(z, key, async () => {
58
+ const wire = await this.http.json(`tile/${z}/${key.level}/${key.gx}/${key.gy}`);
59
+ return { z, ...key, features: wire.features.map(fromWire) };
60
+ });
61
+ return abortable(tile, signal);
62
+ }
63
+ async getFeatures(ids) {
64
+ if (!ids.length)
65
+ return [];
66
+ return (await this.http.json('features', { ids })).features;
67
+ }
68
+ getIndex(z, query) {
69
+ return this.http.json('index', { z, ...query });
70
+ }
71
+ async getClassOutlines(classes, level, exclude = []) {
72
+ const wire = await this.http.json('outlines', { classes, level, exclude });
73
+ return wire.slices.map((s) => ({
74
+ z: s.z,
75
+ rings: s.rings.map((r) => Float32Array.from(r)),
76
+ ...(s.lines?.length ? { lines: s.lines.map((l) => Float32Array.from(l)) } : {}),
77
+ ...(s.ringGroups ? { ringGroups: s.ringGroups } : {}),
78
+ ...(s.ringLabels ? { ringLabels: s.ringLabels } : {}),
79
+ ...(s.lineLabels ? { lineLabels: s.lineLabels } : {}),
80
+ }));
81
+ }
82
+ getClassCounts(z, exclude = []) {
83
+ // Every plane is `all` (a plane must be a number: a server that predates it answers 400).
84
+ return this.http.json('classes', z === null ? { all: true, exclude } : { z, exclude });
85
+ }
86
+ exportGeoJson(exclude, extra) {
87
+ return this.http.text('export', { exclude, extra });
88
+ }
89
+ dispose() {
90
+ this.cache.clear();
91
+ }
92
+ }
93
+ function fromWire(f) {
94
+ return {
95
+ id: f.id,
96
+ label: f.label ?? null,
97
+ color: f.color ?? null,
98
+ bbox: f.bbox,
99
+ rings: f.rings.map((r) => Float32Array.from(r)),
100
+ open: !!f.open,
101
+ ...(f.labels?.length ? { labels: Float32Array.from(f.labels) } : {}),
102
+ };
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZWdpb24tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tc291cmNlL2h0dHAtcmVnaW9uLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQkEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQWdCLGVBQWUsRUFBaUIsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFvQzFGLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxPQUFlLEVBQ2YsVUFBbUMsRUFBRTtJQUVyQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBbUIsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsTUFBTSxJQUFJO0lBR1IsWUFDbUIsSUFBWSxFQUNaLE9BQWdDO1FBRGhDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUVqRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBSSxJQUFZLEVBQUUsSUFBYztRQUN4QyxPQUFPLElB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LEtBQUssSUFBSSxJQUFJO1FBQ3RCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUk7UUFDdEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNyRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB7QGxpbmsgUmVnaW9uU291cmNlfSBzZXJ2ZWQgb3ZlciBIVFRQLCBieSBhIHNlcnZlciB0aGF0IHRpbGVzIGEgcmVnaW9uIHNldCBhcyBgcmVnaW9uLXRpbGVzYFxuICogZG9lcyAodGhlIGV4YW1wbGUgdGlsZSBzZXJ2ZXIncyBgL3JlZ2lvbnMv4oCmYCByb3V0ZXMpLiBSZWxhdGl2ZSB0byB0aGUgc291cmNlJ3MgYmFzZSBVUkw6XG4gKlxuICogIC0gYEdFVCAgaW5mb2AgICAgICAgICAgICAgICAgICAgICAgIOKGkiB7QGxpbmsgUmVnaW9uU291cmNlSW5mb31cbiAqICAtIGBHRVQgIHRpbGUve3p9L3tsZXZlbH0ve2d4fS97Z3l9YCDihpIgYHsgZmVhdHVyZXM6IFdpcmVUaWxlRmVhdHVyZVtdIH1gXG4gKiAgLSBgUE9TVCBmZWF0dXJlc2AgYHsgaWRzIH1gICAgICAgICAg4oaSIGB7IGZlYXR1cmVzOiBTb3VyY2VGZWF0dXJlW10gfWBcbiAqICAtIGBQT1NUIGluZGV4YCBgeyB6LCAuLi5xdWVyeSB9YCAgICDihpIge0BsaW5rIFJlZ2lvbkluZGV4UGFnZX1cbiAqICAtIGBQT1NUIGNsYXNzZXNgIGB7IHosIGV4Y2x1ZGUgfWAgICAg4oaSIGZlYXR1cmVzIHBlciBjbGFzcyBvbiBwbGFuZSB6XG4gKiAgLSBgUE9TVCBvdXRsaW5lc2AgYHsgY2xhc3NlcywgbGV2ZWwsIGV4Y2x1ZGUgfWAg4oaSIGB7IHNsaWNlczogW3sgeiwgcmluZ3MgfV0gfWBcbiAqICAtIGBQT1NUIGV4cG9ydGAgYHsgZXhjbHVkZSwgZXh0cmEgfWDihpIgYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uXG4gKlxuICogVGlsZSByaW5ncyB0cmF2ZWwgYXMgZmxhdCBgW3gsIHksIHgsIHksIOKApl1gIGFycmF5cywgbGFiZWwgcG9pbnRzIGFzIGZsYXQgYFt4LCB5LCByb29tLCDigKZdYC5cbiAqXG4gKiBHaXZlbiB0aGUgaG9zdCdzIEFuZ3VsYXIgYEh0dHBDbGllbnRgIChhcyB0aGUgdmlzdWFsaXplciBwYXNzZXMgaXQpLCBldmVyeSByZXF1ZXN0IGdvZXMgdGhyb3VnaFxuICogaXQsIHNvIHRoZSBob3N0J3MgaW50ZXJjZXB0b3JzIGFwcGx5IOKAlCBpdHMgYXV0aCBoZWFkZXIgYWJvdmUgYWxsIOKAlCBhcyBmb3IgdGhlIGltYWdlIHRpbGVzIGFuZFxuICogdGhlIHNwYXRpYWwgZGF0YS4gVGhlIGxpYnJhcnkgaXRzZWxmIGtub3dzIG5vdGhpbmcgb2YgYXV0aGVudGljYXRpb24uXG4gKi9cbmltcG9ydCB0eXBlIHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSZWdpb25Tb3VyY2UsIFJlZ2lvblRpbGVDYWNoZSwgU291cmNlRmVhdHVyZSwgYWJvcnRhYmxlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHtcbiAgQmJveCxcbiAgQ2xhc3NPdXRsaW5lcyxcbiAgUmVnaW9uSW5kZXhQYWdlLFxuICBSZWdpb25JbmRleFF1ZXJ5LFxuICBSZWdpb25Tb3VyY2VJbmZvLFxuICBSZWdpb25UaWxlLFxuICBSZWdpb25UaWxlS2V5LFxuICBUaWxlRmVhdHVyZSxcbn0gZnJvbSAnLi9yZWdpb24tdGlsZXMnO1xuXG4vKiogQSB0aWxlIGZlYXR1cmUgb24gdGhlIHdpcmU6IHJpbmdzIGFzIHBsYWluIGFycmF5cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lyZVRpbGVGZWF0dXJlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG4gIGNvbG9yOiBzdHJpbmcgfCBudWxsO1xuICBiYm94OiBCYm94O1xuICByaW5nczogbnVtYmVyW11bXTtcbiAgb3Blbj86IGJvb2xlYW47XG4gIGxhYmVscz86IG51bWJlcltdO1xufVxuXG4vKiogT3B0aW9ucyBvZiB7QGxpbmsgb3Blbkh0dHBSZWdpb25Tb3VyY2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVnaW9uU291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgaG9zdCdzIGBIdHRwQ2xpZW50YDogcmVxdWVzdHMgdGhlbiBnbyB0aHJvdWdoIGl0IGFuZCBpdHMgaW50ZXJjZXB0b3JzICh0aGUgaG9zdCdzIGF1dGgpLFxuICAgKiBub3QgYGZldGNoYCwgYW5kIGBpbml0YCBhbmQgYGZldGNoYCBhcmUgbm90IHVzZWQuXG4gICAqL1xuICBodHRwPzogSHR0cENsaWVudDtcbiAgLyoqIEV4dHJhIHJlcXVlc3Qgb3B0aW9ucyAoY3JlZGVudGlhbHMsIGhlYWRlcnMpIGZvciBldmVyeSBgZmV0Y2hgIHJlcXVlc3QuICovXG4gIGluaXQ/OiBSZXF1ZXN0SW5pdDtcbiAgLyoqIFRoZSBmZXRjaCB0byB1c2UgKGRlZmF1bHQgdGhlIGdsb2JhbCBvbmUpLiAqL1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbn1cblxuLyoqIE9wZW4gdGhlIHJlZ2lvbiBzb3VyY2UgYXQgYGJhc2VVcmxgIChpdHMgYGluZm9gIGlzIGZldGNoZWQgZmlyc3QpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5IdHRwUmVnaW9uU291cmNlKFxuICBiYXNlVXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEh0dHBSZWdpb25Tb3VyY2VPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlZ2lvblNvdXJjZT4ge1xuICBjb25zdCBiYXNlID0gYmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybCA6IGAke2Jhc2VVcmx9L2A7XG4gIGNvbnN0IGh0dHAgPSBuZXcgSHR0cChiYXNlLCBvcHRpb25zKTtcbiAgY29uc3QgaW5mbyA9IGF3YWl0IGh0dHAuanNvbjxSZWdpb25Tb3VyY2VJbmZvPignaW5mbycpO1xuICByZXR1cm4gbmV3IEh0dHBSZWdpb25Tb3VyY2UoaHR0cCwgaW5mbyk7XG59XG5cbmNsYXNzIEh0dHAge1xuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoRm46IHR5cGVvZiBmZXRjaDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhc2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEh0dHBSZWdpb25Tb3VyY2VPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLmZldGNoRm4gPSBvcHRpb25zLmZldGNoID8/ICgoaW5wdXQsIGluaXQpID0+IGZldGNoKGlucHV0LCBpbml0KSk7XG4gIH1cblxuICBhc3luYyBqc29uPFQ+KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCB0aGlzLnRleHQocGF0aCwgYm9keSkpIGFzIFQ7XG4gIH1cblxuICBhc3luYyB0ZXh0KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGh0dHAgPSB0aGlzLm9wdGlvbnMuaHR0cDtcbiAgICBpZiAoaHR0cCkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlICsgcGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICBib2R5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXG4gICAgICAgICAgICA6IGh0dHAucG9zdCh1cmwsIGJvZHksIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gKGVyciBhcyB7IHN0YXR1cz86IG51bWJlciB9IHwgbnVsbCk/LnN0YXR1cztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpb24gc291cmNlICR7cGF0aH06IEhUVFAgJHtzdGF0dXMgPz8gJ2Vycm9yJ31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7IC4uLnRoaXMub3B0aW9ucy5pbml0IH07XG4gICAgaWYgKGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5pdC5tZXRob2QgPSAnUE9TVCc7XG4gICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICAgIGluaXQuaGVhZGVycyA9IHtcbiAgICAgICAgLi4uKHRoaXMub3B0aW9ucy5pbml0Py5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaEZuKHRoaXMuYmFzZSArIHBhdGgsIGluaXQpO1xuICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lvbiBzb3VyY2UgJHtwYXRofTogSFRUUCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cbn1cblxuY2xhc3MgSHR0cFJlZ2lvblNvdXJjZSBpbXBsZW1lbnRzIFJlZ2lvblNvdXJjZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgUmVnaW9uVGlsZUNhY2hlKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwLFxuICAgIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm8sXG4gICkge31cblxuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT4ge1xuICAgIC8vIFRoZSBmZXRjaCBpdHNlbGYgaXMgbm90IGFib3J0ZWQ6IGFub3RoZXIgdmlldyAodGhlIG90aGVyIGJhY2tlbmQpIG1heSBiZSB3YWl0aW5nIG9uIHRoZVxuICAgIC8vIHNhbWUgY2FjaGVkIHRpbGUsIGFuZCBhIHRpbGUgaXMgc21hbGwuIE9ubHkgdGhpcyBjYWxsZXIgc3RvcHMgd2FpdGluZy5cbiAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZS5nZXQoeiwga2V5LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB3aXJlID0gYXdhaXQgdGhpcy5odHRwLmpzb248eyBmZWF0dXJlczogV2lyZVRpbGVGZWF0dXJlW10gfT4oXG4gICAgICAgIGB0aWxlLyR7en0vJHtrZXkubGV2ZWx9LyR7a2V5Lmd4fS8ke2tleS5neX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHosIC4uLmtleSwgZmVhdHVyZXM6IHdpcmUuZmVhdHVyZXMubWFwKGZyb21XaXJlKSB9O1xuICAgIH0pO1xuICAgIHJldHVybiBhYm9ydGFibGUodGlsZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFNvdXJjZUZlYXR1cmVbXT4ge1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5odHRwLmpzb248eyBmZWF0dXJlczogU291cmNlRmVhdHVyZVtdIH0+KCdmZWF0dXJlcycsIHsgaWRzIH0pKS5mZWF0dXJlcztcbiAgfVxuXG4gIGdldEluZGV4KHo6IG51bWJlciwgcXVlcnk6IFJlZ2lvbkluZGV4UXVlcnkpOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuanNvbjxSZWdpb25JbmRleFBhZ2U+KCdpbmRleCcsIHsgeiwgLi4ucXVlcnkgfSk7XG4gIH1cblxuICBhc3luYyBnZXRDbGFzc091dGxpbmVzKFxuICAgIGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gICk6IFByb21pc2U8Q2xhc3NPdXRsaW5lc1tdPiB7XG4gICAgY29uc3Qgd2lyZSA9IGF3YWl0IHRoaXMuaHR0cC5qc29uPHtcbiAgICAgIHNsaWNlczogQXJyYXk8e1xuICAgICAgICB6OiBudW1iZXI7XG4gICAgICAgIHJpbmdzOiBudW1iZXJbXVtdO1xuICAgICAgICBsaW5lcz86IG51bWJlcltdW107XG4gICAgICAgIHJpbmdHcm91cHM/OiBudW1iZXJbXTtcbiAgICAgICAgcmluZ0xhYmVscz86IHN0cmluZ1tdO1xuICAgICAgICBsaW5lTGFiZWxzPzogc3RyaW5nW107XG4gICAgICB9PjtcbiAgICB9Pignb3V0bGluZXMnLCB7IGNsYXNzZXMsIGxldmVsLCBleGNsdWRlIH0pO1xuICAgIHJldHVybiB3aXJlLnNsaWNlcy5tYXAoKHMpID0+ICh7XG4gICAgICB6OiBzLnosXG4gICAgICByaW5nczogcy5yaW5ncy5tYXAoKHIpID0+IEZsb2F0MzJBcnJheS5mcm9tKHIpKSxcbiAgICAgIC4uLihzLmxpbmVzPy5sZW5ndGggPyB7IGxpbmVzOiBzLmxpbmVzLm1hcCgobCkgPT4gRmxvYXQzMkFycmF5LmZyb20obCkpIH0gOiB7fSksXG4gICAgICAuLi4ocy5yaW5nR3JvdXBzID8geyByaW5nR3JvdXBzOiBzLnJpbmdHcm91cHMgfSA6IHt9KSxcbiAgICAgIC4uLihzLnJpbmdMYWJlbHMgPyB7IHJpbmdMYWJlbHM6IHMucmluZ0xhYmVscyB9IDoge30pLFxuICAgICAgLi4uKHMubGluZUxhYmVscyA/IHsgbGluZUxhYmVsczogcy5saW5lTGFiZWxzIH0gOiB7fSksXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0Q2xhc3NDb3VudHMoejogbnVtYmVyIHwgbnVsbCwgZXhjbHVkZTogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIC8vIEV2ZXJ5IHBsYW5lIGlzIGBhbGxgIChhIHBsYW5lIG11c3QgYmUgYSBudW1iZXI6IGEgc2VydmVyIHRoYXQgcHJlZGF0ZXMgaXQgYW5zd2VycyA0MDApLlxuICAgIHJldHVybiB0aGlzLmh0dHAuanNvbjxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PignY2xhc3NlcycsIHogPT09IG51bGwgPyB7IGFsbDogdHJ1ZSwgZXhjbHVkZSB9IDogeyB6LCBleGNsdWRlIH0pO1xuICB9XG5cbiAgZXhwb3J0R2VvSnNvbihleGNsdWRlOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE6IHJlYWRvbmx5IG9iamVjdFtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnRleHQoJ2V4cG9ydCcsIHsgZXhjbHVkZSwgZXh0cmEgfSk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmcm9tV2lyZShmOiBXaXJlVGlsZUZlYXR1cmUpOiBUaWxlRmVhdHVyZSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGYuaWQsXG4gICAgbGFiZWw6IGYubGFiZWwgPz8gbnVsbCxcbiAgICBjb2xvcjogZi5jb2xvciA/PyBudWxsLFxuICAgIGJib3g6IGYuYmJveCxcbiAgICByaW5nczogZi5yaW5ncy5tYXAoKHIpID0+IEZsb2F0MzJBcnJheS5mcm9tKHIpKSxcbiAgICBvcGVuOiAhIWYub3BlbixcbiAgICAuLi4oZi5sYWJlbHM/Lmxlbmd0aCA/IHsgbGFiZWxzOiBGbG9hdDMyQXJyYXkuZnJvbShmLmxhYmVscykgfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ /**
2
+ * The region-source worker's protocol and the tables it holds, shared by the worker and the
3
+ * main-thread fallback (which runs the very same {@link RegionSourceTables} where no worker can
4
+ * start).
5
+ *
6
+ * Protocol: `{ id, op, ...args }` → `{ id, ok: true, result }` | `{ id, ok: false, error }`.
7
+ */
8
+ import { reconstruct } from '../geometry/reconstruct';
9
+ import { RegionFeatureTable, } from './region-tiles';
10
+ /** The open tables, by handle. */
11
+ export class RegionSourceTables {
12
+ constructor() {
13
+ this.tables = new Map();
14
+ this.nextHandle = 1;
15
+ }
16
+ run(request) {
17
+ return this.dispatch(request);
18
+ }
19
+ dispatch(r) {
20
+ switch (r.op) {
21
+ case 'open': {
22
+ const table = RegionFeatureTable.fromGeoJson(r.text, r.tileSize);
23
+ const handle = this.nextHandle++;
24
+ this.tables.set(handle, table);
25
+ return { handle, info: table.info() };
26
+ }
27
+ case 'tile':
28
+ return this.table(r.handle).tile(r.z, r.level, r.gx, r.gy);
29
+ case 'features':
30
+ return this.table(r.handle).features(r.ids);
31
+ case 'index':
32
+ return this.table(r.handle).index(r.z, r.query);
33
+ case 'classes':
34
+ return this.table(r.handle).classCounts(r.z, r.exclude);
35
+ case 'outlines':
36
+ return this.table(r.handle).classOutlines(r.classes, r.level, r.exclude);
37
+ case 'mesh':
38
+ return reconstruct(r.slices, r.options);
39
+ case 'export':
40
+ return this.table(r.handle).exportGeoJson(r.exclude, r.extra);
41
+ case 'close':
42
+ this.tables.delete(r.handle);
43
+ return null;
44
+ }
45
+ }
46
+ table(handle) {
47
+ const table = this.tables.get(handle);
48
+ if (!table)
49
+ throw new Error(`No open region source ${handle}.`);
50
+ return table;
51
+ }
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS1vcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZS1vcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFxQyxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV6RixPQUFPLEVBRUwsa0JBQWtCLEdBS25CLE1BQU0sZ0JBQWdCLENBQUM7QUFxQ3hCLGtDQUFrQztBQUNsQyxNQUFNLE9BQU8sa0JBQWtCO0lBQS9CO1FBQ21CLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztRQUN4RCxlQUFVLEdBQUcsQ0FBQyxDQUFDO0lBdUN6QixDQUFDO0lBckNDLEdBQUcsQ0FBZ0MsT0FBVTtRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFpQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxRQUFRLENBQUMsQ0FBc0I7UUFDckMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDeEMsQ0FBQztZQUNELEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNFLEtBQUssTUFBTTtnQkFDVCxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsTUFBYztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSByZWdpb24tc291cmNlIHdvcmtlcidzIHByb3RvY29sIGFuZCB0aGUgdGFibGVzIGl0IGhvbGRzLCBzaGFyZWQgYnkgdGhlIHdvcmtlciBhbmQgdGhlXG4gKiBtYWluLXRocmVhZCBmYWxsYmFjayAod2hpY2ggcnVucyB0aGUgdmVyeSBzYW1lIHtAbGluayBSZWdpb25Tb3VyY2VUYWJsZXN9IHdoZXJlIG5vIHdvcmtlciBjYW5cbiAqIHN0YXJ0KS5cbiAqXG4gKiBQcm90b2NvbDogYHsgaWQsIG9wLCAuLi5hcmdzIH1gIOKGkiBgeyBpZCwgb2s6IHRydWUsIHJlc3VsdCB9YCB8IGB7IGlkLCBvazogZmFsc2UsIGVycm9yIH1gLlxuICovXG5pbXBvcnQgeyBSZWNvbnN0cnVjdE9wdGlvbnMsIFNsaWNlT3V0bGluZXMsIHJlY29uc3RydWN0IH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmVjb25zdHJ1Y3QnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIENsYXNzT3V0bGluZXMsXG4gIFJlZ2lvbkZlYXR1cmVUYWJsZSxcbiAgUmVnaW9uSW5kZXhQYWdlLFxuICBSZWdpb25JbmRleFF1ZXJ5LFxuICBSZWdpb25Tb3VyY2VJbmZvLFxuICBSZWdpb25UaWxlLFxufSBmcm9tICcuL3JlZ2lvbi10aWxlcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZlYXR1cmUgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UnO1xuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VSZXF1ZXN0ID1cbiAgfCB7IG9wOiAnb3Blbic7IHRleHQ6IHN0cmluZzsgdGlsZVNpemU/OiBudW1iZXIgfVxuICB8IHsgb3A6ICd0aWxlJzsgaGFuZGxlOiBudW1iZXI7IHo6IG51bWJlcjsgbGV2ZWw6IG51bWJlcjsgZ3g6IG51bWJlcjsgZ3k6IG51bWJlciB9XG4gIHwgeyBvcDogJ2ZlYXR1cmVzJzsgaGFuZGxlOiBudW1iZXI7IGlkczogcmVhZG9ubHkgc3RyaW5nW10gfVxuICB8IHsgb3A6ICdpbmRleCc7IGhhbmRsZTogbnVtYmVyOyB6OiBudW1iZXI7IHF1ZXJ5OiBSZWdpb25JbmRleFF1ZXJ5IH1cbiAgfCB7IG9wOiAnY2xhc3Nlcyc7IGhhbmRsZTogbnVtYmVyOyB6OiBudW1iZXIgfCBudWxsOyBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10gfVxuICB8IHtcbiAgICAgIG9wOiAnb3V0bGluZXMnO1xuICAgICAgaGFuZGxlOiBudW1iZXI7XG4gICAgICBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgICBsZXZlbDogbnVtYmVyO1xuICAgICAgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIH1cbiAgfCB7IG9wOiAnbWVzaCc7IHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdOyBvcHRpb25zPzogUmVjb25zdHJ1Y3RPcHRpb25zIH1cbiAgfCB7IG9wOiAnZXhwb3J0JzsgaGFuZGxlOiBudW1iZXI7IGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdOyBleHRyYTogcmVhZG9ubHkgb2JqZWN0W10gfVxuICB8IHsgb3A6ICdjbG9zZSc7IGhhbmRsZTogbnVtYmVyIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uU291cmNlUmVzdWx0cyB7XG4gIG9wZW46IHsgaGFuZGxlOiBudW1iZXI7IGluZm86IFJlZ2lvblNvdXJjZUluZm8gfTtcbiAgdGlsZTogUmVnaW9uVGlsZTtcbiAgZmVhdHVyZXM6IFNvdXJjZUZlYXR1cmVbXTtcbiAgaW5kZXg6IFJlZ2lvbkluZGV4UGFnZTtcbiAgY2xhc3NlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgb3V0bGluZXM6IENsYXNzT3V0bGluZXNbXTtcbiAgbWVzaDogTWVzaDtcbiAgZXhwb3J0OiBzdHJpbmc7XG4gIGNsb3NlOiBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VNZXNzYWdlID0gUmVnaW9uU291cmNlUmVxdWVzdCAmIHsgaWQ6IG51bWJlciB9O1xuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VSZXBseSA9XG4gIHsgaWQ6IG51bWJlcjsgb2s6IHRydWU7IHJlc3VsdDogdW5rbm93biB9IHwgeyBpZDogbnVtYmVyOyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfTtcblxuLyoqIFRoZSBvcGVuIHRhYmxlcywgYnkgaGFuZGxlLiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblNvdXJjZVRhYmxlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFibGVzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbkZlYXR1cmVUYWJsZT4oKTtcbiAgcHJpdmF0ZSBuZXh0SGFuZGxlID0gMTtcblxuICBydW48UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KHJlcXVlc3Q6IFIpOiBSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChyZXF1ZXN0KSBhcyBSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaChyOiBSZWdpb25Tb3VyY2VSZXF1ZXN0KTogUmVnaW9uU291cmNlUmVzdWx0c1trZXlvZiBSZWdpb25Tb3VyY2VSZXN1bHRzXSB7XG4gICAgc3dpdGNoIChyLm9wKSB7XG4gICAgICBjYXNlICdvcGVuJzoge1xuICAgICAgICBjb25zdCB0YWJsZSA9IFJlZ2lvbkZlYXR1cmVUYWJsZS5mcm9tR2VvSnNvbihyLnRleHQsIHIudGlsZVNpemUpO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLm5leHRIYW5kbGUrKztcbiAgICAgICAgdGhpcy50YWJsZXMuc2V0KGhhbmRsZSwgdGFibGUpO1xuICAgICAgICByZXR1cm4geyBoYW5kbGUsIGluZm86IHRhYmxlLmluZm8oKSB9O1xuICAgICAgfVxuICAgICAgY2FzZSAndGlsZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS50aWxlKHIueiwgci5sZXZlbCwgci5neCwgci5neSk7XG4gICAgICBjYXNlICdmZWF0dXJlcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5mZWF0dXJlcyhyLmlkcyk7XG4gICAgICBjYXNlICdpbmRleCc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5pbmRleChyLnosIHIucXVlcnkpO1xuICAgICAgY2FzZSAnY2xhc3Nlcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5jbGFzc0NvdW50cyhyLnosIHIuZXhjbHVkZSk7XG4gICAgICBjYXNlICdvdXRsaW5lcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5jbGFzc091dGxpbmVzKHIuY2xhc3Nlcywgci5sZXZlbCwgci5leGNsdWRlKTtcbiAgICAgIGNhc2UgJ21lc2gnOlxuICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3Qoci5zbGljZXMsIHIub3B0aW9ucyk7XG4gICAgICBjYXNlICdleHBvcnQnOlxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZShyLmhhbmRsZSkuZXhwb3J0R2VvSnNvbihyLmV4Y2x1ZGUsIHIuZXh0cmEpO1xuICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICB0aGlzLnRhYmxlcy5kZWxldGUoci5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRhYmxlKGhhbmRsZTogbnVtYmVyKTogUmVnaW9uRmVhdHVyZVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldChoYW5kbGUpO1xuICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgTm8gb3BlbiByZWdpb24gc291cmNlICR7aGFuZGxlfS5gKTtcbiAgICByZXR1cm4gdGFibGU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Factory for the region-source Web Worker, isolated in its own module so the `import.meta.url`
3
+ * reference — which the bundler needs in order to locate the worker — is never pulled into the
4
+ * ts-jest CommonJS compile of anything that uses it. Same arrangement as
5
+ * `workers/spatial-math-worker.ts`.
6
+ */
7
+ export function createRegionSourceWorker() {
8
+ return new Worker(new URL('./region-source.worker', import.meta.url), { type: 'module' });
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZS13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZhY3RvcnkgZm9yIHRoZSByZWdpb24tc291cmNlIFdlYiBXb3JrZXIsIGlzb2xhdGVkIGluIGl0cyBvd24gbW9kdWxlIHNvIHRoZSBgaW1wb3J0Lm1ldGEudXJsYFxuICogcmVmZXJlbmNlIOKAlCB3aGljaCB0aGUgYnVuZGxlciBuZWVkcyBpbiBvcmRlciB0byBsb2NhdGUgdGhlIHdvcmtlciDigJQgaXMgbmV2ZXIgcHVsbGVkIGludG8gdGhlXG4gKiB0cy1qZXN0IENvbW1vbkpTIGNvbXBpbGUgb2YgYW55dGhpbmcgdGhhdCB1c2VzIGl0LiBTYW1lIGFycmFuZ2VtZW50IGFzXG4gKiBgd29ya2Vycy9zcGF0aWFsLW1hdGgtd29ya2VyLnRzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZ2lvblNvdXJjZVdvcmtlcigpOiBXb3JrZXIge1xuICByZXR1cm4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3JlZ2lvbi1zb3VyY2Uud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSwgeyB0eXBlOiAnbW9kdWxlJyB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ /**
2
+ * ROI GeoJSON at least this many characters long loads as a tiled region source rather than as
3
+ * regions (see `VizConfig.regionSourceMinChars`).
4
+ */
5
+ export const REGION_SOURCE_MIN_CHARS = 1_000_000;
6
+ /** Tiles a source keeps, most recently used last. */
7
+ export const REGION_TILE_CACHE_SIZE = 384;
8
+ /** A least-recently-used cache of tile requests. A request that fails is forgotten. */
9
+ export class RegionTileCache {
10
+ constructor(limit = REGION_TILE_CACHE_SIZE) {
11
+ this.limit = limit;
12
+ this.tiles = new Map();
13
+ }
14
+ /** The cached tile, else `load()`'s, cached. */
15
+ get(z, key, load) {
16
+ const id = `${z}/${key.level}/${key.gx}/${key.gy}`;
17
+ const hit = this.tiles.get(id);
18
+ if (hit) {
19
+ this.tiles.delete(id);
20
+ this.tiles.set(id, hit);
21
+ return hit;
22
+ }
23
+ const tile = load();
24
+ this.tiles.set(id, tile);
25
+ tile.catch(() => {
26
+ if (this.tiles.get(id) === tile)
27
+ this.tiles.delete(id);
28
+ });
29
+ while (this.tiles.size > this.limit)
30
+ this.tiles.delete(this.tiles.keys().next().value);
31
+ return tile;
32
+ }
33
+ clear() {
34
+ this.tiles.clear();
35
+ }
36
+ }
37
+ /** An `AbortError`, as `fetch` and the workers reject with. */
38
+ export function abortError() {
39
+ if (typeof DOMException !== 'undefined')
40
+ return new DOMException('The request was aborted.', 'AbortError');
41
+ const err = new Error('The request was aborted.');
42
+ err.name = 'AbortError';
43
+ return err;
44
+ }
45
+ /** True for the rejection of an aborted request. */
46
+ export function isAbortError(err) {
47
+ return err?.name === 'AbortError';
48
+ }
49
+ /** `promise`, rejected with an `AbortError` as soon as `signal` fires (the work goes on). */
50
+ export function abortable(promise, signal) {
51
+ if (!signal)
52
+ return promise;
53
+ if (signal.aborted)
54
+ return Promise.reject(abortError());
55
+ return new Promise((resolve, reject) => {
56
+ const onAbort = () => reject(abortError());
57
+ signal.addEventListener('abort', onAbort, { once: true });
58
+ promise.then((v) => {
59
+ signal.removeEventListener('abort', onAbort);
60
+ resolve(v);
61
+ }, (e) => {
62
+ signal.removeEventListener('abort', onAbort);
63
+ reject(e);
64
+ });
65
+ });
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTZFQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxTQUFTLENBQUM7QUFFakQscURBQXFEO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUUxQyx1RkFBdUY7QUFDdkYsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBNkIsUUFBUSxzQkFBc0I7UUFBOUIsVUFBSyxHQUFMLEtBQUssQ0FBeUI7UUFGMUMsVUFBSyxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBRUYsQ0FBQztJQUUvRCxnREFBZ0Q7SUFDaEQsR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFrQixFQUFFLElBQStCO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUk7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFlLENBQUMsQ0FBQztRQUNqRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQ0Y7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXO1FBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQywwQkFBMEIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMzRyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVk7SUFDdkMsT0FBUSxHQUFnQyxFQUFFLElBQUksS0FBSyxZQUFZLENBQUM7QUFDbEUsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsU0FBUyxDQUFJLE9BQW1CLEVBQUUsTUFBb0I7SUFDcEUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixJQUFJLE1BQU0sQ0FBQyxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDeEQsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN4QyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQ1YsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNKLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxFQUNELENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHRpbGVkIHJlZ2lvbiBzb3VyY2U6IG9uZSBpbWFnZSdzIGxhcmdlIHJlZ2lvbiBzZXQsIHNlcnZlZCBhcyBsZXZlbC1vZi1kZXRhaWwgdGlsZXMgc28gYSB2aWV3XG4gKiBuZXZlciBob2xkcyBvciBkcmF3cyB0aGUgd2hvbGUgc2V0IChzZWUgYHJlZ2lvbi10aWxlc2AgZm9yIHRoZSBsZXZlbHMgYW5kIHRpbGVzKS5cbiAqXG4gKiBUd28gaW1wbGVtZW50YXRpb25zIGJlaGluZCB7QGxpbmsgUmVnaW9uU291cmNlfTogYSBHZW9KU09OIHNvdXJjZSBwYXJzZWQgYW5kIHRpbGVkIGluIGEgV2ViXG4gKiBXb3JrZXIgKGBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZWAsIHRoZSBtYWluIHRocmVhZCBvbmx5IGV2ZXIgc2VlcyB0aWxlcyksIGFuZCBhbiBIVFRQIHNvdXJjZVxuICogZm9yIGEgc2VydmVyIHRoYXQgc2VydmVzIHRoZSBzYW1lIHRpbGVzIChgb3Blbkh0dHBSZWdpb25Tb3VyY2VgKS5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBDbGFzc091dGxpbmVzLFxuICBHZW9Kc29uRmVhdHVyZUxpa2UsXG4gIFJlZ2lvbkluZGV4UGFnZSxcbiAgUmVnaW9uSW5kZXhRdWVyeSxcbiAgUmVnaW9uU291cmNlSW5mbyxcbiAgUmVnaW9uVGlsZSxcbiAgUmVnaW9uVGlsZUtleSxcbiAgVGlsZUZlYXR1cmUsXG59IGZyb20gJy4vcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3R5bGUnO1xuXG4vKiogQSBmZWF0dXJlJ3MgZXhhY3QgR2VvSlNPTiB3aXRoIHRoZSBzb3VyY2UncyBpZCBmb3IgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUZlYXR1cmUge1xuICBpZDogc3RyaW5nO1xuICBmZWF0dXJlOiBHZW9Kc29uRmVhdHVyZUxpa2U7XG59XG5cbi8qKiBPbmUgaW1hZ2UncyB0aWxlZCByZWdpb24gc2V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpb25Tb3VyY2Uge1xuICAvKiogV2hhdCB0aGUgc291cmNlIGhvbGRzOyBrbm93biBvbmNlIGl0IGlzIG9wZW4uICovXG4gIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm87XG4gIC8qKiBPbmUgdGlsZSBvZiBwbGFuZSBgemAuIENhY2hlZDogYXNraW5nIGFnYWluIGZvciBhIHRpbGUgaW4gdmlldyBjb3N0cyBub3RoaW5nLiAqL1xuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT47XG4gIC8qKiBUaGUgZXhhY3QgZmVhdHVyZXMgd2l0aCB0aGVzZSBpZHMgKHVua25vd24gaWRzIGFyZSBza2lwcGVkKS4gKi9cbiAgZ2V0RmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8U291cmNlRmVhdHVyZVtdPjtcbiAgLyoqIEEgcGFnZSBvZiBwbGFuZSBgemAncyBmZWF0dXJlIGluZGV4LiAqL1xuICBnZXRJbmRleCh6OiBudW1iZXIsIHF1ZXJ5OiBSZWdpb25JbmRleFF1ZXJ5KTogUHJvbWlzZTxSZWdpb25JbmRleFBhZ2U+O1xuICAvKipcbiAgICogRXZlcnkgcGxhbmUncyBvdXRsaW5lcyBvZiB0aGUgZmVhdHVyZXMgb2YgdGhlc2UgY2xhc3Nlcywgc2ltcGxpZmllZCBmb3IgYGxldmVsYCwgd2l0aG91dCB0aGVcbiAgICogYGV4Y2x1ZGVgZCBpZHM6IHdoYXQgYSAzRCByZWNvbnN0cnVjdGlvbiBvZiB0aGUgY2xhc3NlcyBzdGFja3MuIGBjbGFzc2VzYCBudWxsIHJlYWRzIGV2ZXJ5XG4gICAqIGNsYXNzLCBlYWNoIG91dGxpbmUgbGFiZWxsZWQgd2l0aCBpdHMgb3duICh3aGF0IGEgc2VjdGlvbiB0aHJvdWdoIHRoZSBzdGFjayBkcmF3cykuXG4gICAqL1xuICBnZXRDbGFzc091dGxpbmVzKFxuICAgIGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGV4Y2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxDbGFzc091dGxpbmVzW10+O1xuICAvKipcbiAgICogSG93IG1hbnkgZmVhdHVyZXMgb2YgZWFjaCBjbGFzcyBwbGFuZSBgemAgaGFzIChudWxsOiBldmVyeSBwbGFuZSwgdGhlIHdob2xlIHN0YWNrKSwgd2l0aG91dFxuICAgKiB0aGUgYGV4Y2x1ZGVgZCBpZHMuXG4gICAqL1xuICBnZXRDbGFzc0NvdW50cyh6OiBudW1iZXIgfCBudWxsLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuICAvKipcbiAgICogVGhlIHdob2xlIHNldCBhcyBhIEdlb0pTT04gRmVhdHVyZUNvbGxlY3Rpb24gc3RyaW5nLCB0aHJvdWdoIHRoZSB3b3JraW5nIHNldDogYGV4Y2x1ZGVgZFxuICAgKiBmZWF0dXJlcyAodGFrZW4gZm9yIGVkaXRpbmcsIG9yIGRlbGV0ZWQpIGxlZnQgb3V0LCBgZXh0cmFgIGZlYXR1cmVzIGFwcGVuZGVkLlxuICAgKi9cbiAgZXhwb3J0R2VvSnNvbihleGNsdWRlOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE6IHJlYWRvbmx5IG9iamVjdFtdKTogUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogUmVsZWFzZSB0aGUgc291cmNlIChpdHMgd29ya2VyIHRhYmxlLCBpdHMgY2FjaGUpLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKiBXaGF0IHRoZSBzdG9yZSBzaG93cyBvZiB0aGUgY3VycmVudCBzbGljZSdzIHJlZ2lvbiBzb3VyY2U6IHdoYXQgYSBzb3VyY2UgbGF5ZXIgZHJhd3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lvblNvdXJjZVZpZXcge1xuICBzb3VyY2U6IFJlZ2lvblNvdXJjZTtcbiAgLyoqIFRoZSBzb3VyY2UgcGxhbmUgdGhlIHNsaWNlIHNob3dzLiAqL1xuICBwbGFuZTogbnVtYmVyO1xuICAvKiogSWRzIHRoZSBzb3VyY2Ugbm8gbG9uZ2VyIGRyYXdzOiB0YWtlbiBpbnRvIHRoZSB3b3JraW5nIHNldCwgb3IgZGVsZXRlZC4gKi9cbiAgdGFrZW46IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIC8qKiBUaGUgY29sb3VyIGEgZmVhdHVyZSBpcyBkcmF3biBpbiAoaXRzIGNsYXNzIGNvbG91ciwgYXMgYSByZWdpb24gb2YgdGhhdCBjbGFzcyBnZXRzKS4gKi9cbiAgY29sb3JPZihmZWF0dXJlOiBQaWNrPFRpbGVGZWF0dXJlLCAnbGFiZWwnIHwgJ2NvbG9yJz4pOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVnaW9uIGxvb2ssIHRoZSByZWdpb25zJyBvd24gKHNvIGEgZmVhdHVyZSBsb29rcyB0aGUgc2FtZSBvbmNlIHRha2VuKS4gKi9cbiAgc3R5bGU6IFJlZ2lvblN0eWxlO1xuICAvKiogV2hldGhlciBjbGFzcyBsYWJlbHMgYXJlIHNob3duLiAqL1xuICBsYWJlbHM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgY2xhc3MncyBmZWF0dXJlcyBhcmUgaGlkZGVuIChzZWUgYFJlZ2lvblN0b3JlLnNldENsYXNzZXNIaWRkZW5gKTsgZGVmYXVsdDogbm9uZSBpcy4gKi9cbiAgaXNIaWRkZW4/KGxhYmVsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBST0kgR2VvSlNPTiBhdCBsZWFzdCB0aGlzIG1hbnkgY2hhcmFjdGVycyBsb25nIGxvYWRzIGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSByYXRoZXIgdGhhbiBhc1xuICogcmVnaW9ucyAoc2VlIGBWaXpDb25maWcucmVnaW9uU291cmNlTWluQ2hhcnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTID0gMV8wMDBfMDAwO1xuXG4vKiogVGlsZXMgYSBzb3VyY2Uga2VlcHMsIG1vc3QgcmVjZW50bHkgdXNlZCBsYXN0LiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9USUxFX0NBQ0hFX1NJWkUgPSAzODQ7XG5cbi8qKiBBIGxlYXN0LXJlY2VudGx5LXVzZWQgY2FjaGUgb2YgdGlsZSByZXF1ZXN0cy4gQSByZXF1ZXN0IHRoYXQgZmFpbHMgaXMgZm9yZ290dGVuLiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblRpbGVDYWNoZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxSZWdpb25UaWxlPj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxpbWl0ID0gUkVHSU9OX1RJTEVfQ0FDSEVfU0laRSkge31cblxuICAvKiogVGhlIGNhY2hlZCB0aWxlLCBlbHNlIGBsb2FkKClgJ3MsIGNhY2hlZC4gKi9cbiAgZ2V0KHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBsb2FkOiAoKSA9PiBQcm9taXNlPFJlZ2lvblRpbGU+KTogUHJvbWlzZTxSZWdpb25UaWxlPiB7XG4gICAgY29uc3QgaWQgPSBgJHt6fS8ke2tleS5sZXZlbH0vJHtrZXkuZ3h9LyR7a2V5Lmd5fWA7XG4gICAgY29uc3QgaGl0ID0gdGhpcy50aWxlcy5nZXQoaWQpO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHRoaXMudGlsZXMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMudGlsZXMuc2V0KGlkLCBoaXQpO1xuICAgICAgcmV0dXJuIGhpdDtcbiAgICB9XG4gICAgY29uc3QgdGlsZSA9IGxvYWQoKTtcbiAgICB0aGlzLnRpbGVzLnNldChpZCwgdGlsZSk7XG4gICAgdGlsZS5jYXRjaCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50aWxlcy5nZXQoaWQpID09PSB0aWxlKSB0aGlzLnRpbGVzLmRlbGV0ZShpZCk7XG4gICAgfSk7XG4gICAgd2hpbGUgKHRoaXMudGlsZXMuc2l6ZSA+IHRoaXMubGltaXQpIHRoaXMudGlsZXMuZGVsZXRlKHRoaXMudGlsZXMua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgIHJldHVybiB0aWxlO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy50aWxlcy5jbGVhcigpO1xuICB9XG59XG5cbi8qKiBBbiBgQWJvcnRFcnJvcmAsIGFzIGBmZXRjaGAgYW5kIHRoZSB3b3JrZXJzIHJlamVjdCB3aXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFib3J0RXJyb3IoKTogRXJyb3Ige1xuICBpZiAodHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpO1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ1RoZSByZXF1ZXN0IHdhcyBhYm9ydGVkLicpO1xuICBlcnIubmFtZSA9ICdBYm9ydEVycm9yJztcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqIFRydWUgZm9yIHRoZSByZWplY3Rpb24gb2YgYW4gYWJvcnRlZCByZXF1ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRFcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0gfCBudWxsKT8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xufVxuXG4vKiogYHByb21pc2VgLCByZWplY3RlZCB3aXRoIGFuIGBBYm9ydEVycm9yYCBhcyBzb29uIGFzIGBzaWduYWxgIGZpcmVzICh0aGUgd29yayBnb2VzIG9uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYm9ydGFibGU8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKCFzaWduYWwpIHJldHVybiBwcm9taXNlO1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydEVycm9yKCkpO1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiByZWplY3QoYWJvcnRFcnJvcigpKTtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgcHJvbWlzZS50aGVuKFxuICAgICAgKHYpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlc29sdmUodik7XG4gICAgICB9LFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG4iXX0=