@jax-data-science/sci-image-visualizer 0.12.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
- package/esm2022/lib/contracts/display-types.mjs +7 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/reconstruct.mjs +11 -1
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
- package/esm2022/lib/region-editor/region-editor.component.mjs +13 -1
- package/esm2022/lib/routing-visualizer.service.mjs +4 -1
- package/esm2022/lib/spatial/lod.mjs +6 -3
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +78 -23
- package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +70 -1
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +54 -11
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
- package/esm2022/lib/store/region-selection.mjs +21 -4
- package/esm2022/lib/store/region-store.service.mjs +22 -3
- package/esm2022/lib/store/spatial-selection.service.mjs +13 -1
- package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +3 -3
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1777 -793
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -2
- package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
- package/lib/contracts/display-types.d.ts +27 -0
- package/lib/contracts/image.contract.d.ts +2 -0
- package/lib/contracts/region-editor-api.contract.d.ts +3 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
- package/lib/contracts/visualizer.contract.d.ts +28 -2
- package/lib/geometry/reconstruct.d.ts +6 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +5 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
- package/lib/routing-visualizer.service.d.ts +1 -0
- package/lib/spatial/lod.d.ts +3 -1
- package/lib/spatial/spatial-controls.facade.d.ts +19 -2
- package/lib/spatial/spatial-gene-filter.d.ts +44 -0
- package/lib/spatial/spatial-selection.d.ts +16 -1
- package/lib/spatial/spatial-tile-merge.d.ts +17 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +14 -3
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
- package/lib/store/region-selection.d.ts +14 -3
- package/lib/store/region-store.service.d.ts +14 -1
- package/lib/store/spatial-selection.service.d.ts +8 -0
- package/lib/store/visualizer-store.service.d.ts +13 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs.map +0 -1
|
@@ -6,13 +6,26 @@ import { BehaviorSubject } from 'rxjs';
|
|
|
6
6
|
* owner calls {@link sync} once the region array it projects onto is final,
|
|
7
7
|
* which prunes ids that no longer exist and emits {@link indices$} only when
|
|
8
8
|
* the index set changed.
|
|
9
|
+
*
|
|
10
|
+
* A selection made by picking classes (the class tree, a surface in 3D) also
|
|
11
|
+
* holds those classes: a class is a volume through the whole stack, whether or
|
|
12
|
+
* not it has a region on the slice. Any other selection drops them; an edit
|
|
13
|
+
* ({@link retain}, {@link sync}) keeps them.
|
|
9
14
|
*/
|
|
10
15
|
export class RegionSelection {
|
|
11
16
|
constructor() {
|
|
12
17
|
this.selected = [];
|
|
18
|
+
this.picked = [];
|
|
13
19
|
this.indicesSubject = new BehaviorSubject([]);
|
|
20
|
+
this.classesSubject = new BehaviorSubject([]);
|
|
14
21
|
/** The selected regions' current array indices (emits on change only). */
|
|
15
22
|
this.indices$ = this.indicesSubject.asObservable();
|
|
23
|
+
/** The classes the selection was picked as ([] for any other selection; emits on change only). */
|
|
24
|
+
this.classes$ = this.classesSubject.asObservable();
|
|
25
|
+
}
|
|
26
|
+
/** The classes the selection was picked as, as last emitted by {@link sync}. */
|
|
27
|
+
get classes() {
|
|
28
|
+
return this.classesSubject.value;
|
|
16
29
|
}
|
|
17
30
|
/** The selected indices as last projected by {@link sync}. */
|
|
18
31
|
get indices() {
|
|
@@ -22,9 +35,10 @@ export class RegionSelection {
|
|
|
22
35
|
get ids() {
|
|
23
36
|
return this.selected;
|
|
24
37
|
}
|
|
25
|
-
/** Replace the selected ids (no emit until {@link sync}). */
|
|
26
|
-
replace(ids) {
|
|
38
|
+
/** Replace the selected ids, picked as `classes` if they were (no emit until {@link sync}). */
|
|
39
|
+
replace(ids, classes = []) {
|
|
27
40
|
this.selected = ids.slice();
|
|
41
|
+
this.picked = classes.slice();
|
|
28
42
|
}
|
|
29
43
|
/** Keep only the ids `keep` accepts (no emit until {@link sync}). */
|
|
30
44
|
retain(keep) {
|
|
@@ -47,10 +61,11 @@ export class RegionSelection {
|
|
|
47
61
|
}
|
|
48
62
|
}
|
|
49
63
|
this.selected = ids;
|
|
64
|
+
this.picked = [];
|
|
50
65
|
this.sync(regions);
|
|
51
66
|
}
|
|
52
67
|
/** Project the selected ids onto `regions`, pruning ids it no longer holds,
|
|
53
|
-
* and emit if the index set changed. */
|
|
68
|
+
* and emit if the index set (or the picked classes) changed. */
|
|
54
69
|
sync(regions) {
|
|
55
70
|
const indexOf = new Map();
|
|
56
71
|
regions.forEach((r, i) => {
|
|
@@ -69,6 +84,8 @@ export class RegionSelection {
|
|
|
69
84
|
this.selected = live;
|
|
70
85
|
if (!sameIndices(this.indicesSubject.value, indices))
|
|
71
86
|
this.indicesSubject.next(indices);
|
|
87
|
+
if (!sameIndices(this.classesSubject.value, this.picked))
|
|
88
|
+
this.classesSubject.next(this.picked);
|
|
72
89
|
}
|
|
73
90
|
}
|
|
74
91
|
function sameIndices(a, b) {
|
|
@@ -79,4 +96,4 @@ function sameIndices(a, b) {
|
|
|
79
96
|
return false;
|
|
80
97
|
return true;
|
|
81
98
|
}
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNlbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvcmVnaW9uLXNlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBT25EOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQTVCO1FBQ1UsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUN4QixXQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUN0QixtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBRTdFLDBFQUEwRTtRQUNqRSxhQUFRLEdBQXlCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFN0Usa0dBQWtHO1FBQ3pGLGFBQVEsR0FBa0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQW9FeEYsQ0FBQztJQWxFQyxnRkFBZ0Y7SUFDaEYsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBRUQsOERBQThEO0lBQzlELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELCtGQUErRjtJQUMvRixPQUFPLENBQUMsR0FBYSxFQUFFLFVBQTZCLEVBQUU7UUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFD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SUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ25FLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKiogVGhlIHBhcnQgb2YgYSByZWdpb24gdGhlIHNlbGVjdGlvbiByZWFkczogaXRzIHN0YWJsZSBpZC4gKi9cbmludGVyZmFjZSBIYXNJZCB7XG4gIGlkOiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVnaW9uIHNlbGVjdGlvbiwgaGVsZCBieSByZWdpb24gKmlkKiAoc3RhYmxlIGFjcm9zcyBlZGl0cywgcmVvcmRlcnMgYW5kXG4gKiBkZWxldGUvYWRkIGN5Y2xlcykgYW5kIHByb2plY3RlZCB0byBhcnJheSBpbmRpY2VzIGZvciB0aGUgSVJlZ2lvblN0b3JlXG4gKiBib3VuZGFyeS4gQ2hhbmdpbmcgdGhlIGlkcyAoe0BsaW5rIHJlcGxhY2V9LCB7QGxpbmsgcmV0YWlufSkgaXMgc2lsZW50OyB0aGVcbiAqIG93bmVyIGNhbGxzIHtAbGluayBzeW5jfSBvbmNlIHRoZSByZWdpb24gYXJyYXkgaXQgcHJvamVjdHMgb250byBpcyBmaW5hbCxcbiAqIHdoaWNoIHBydW5lcyBpZHMgdGhhdCBubyBsb25nZXIgZXhpc3QgYW5kIGVtaXRzIHtAbGluayBpbmRpY2VzJH0gb25seSB3aGVuXG4gKiB0aGUgaW5kZXggc2V0IGNoYW5nZWQuXG4gKlxuICogQSBzZWxlY3Rpb24gbWFkZSBieSBwaWNraW5nIGNsYXNzZXMgKHRoZSBjbGFzcyB0cmVlLCBhIHN1cmZhY2UgaW4gM0QpIGFsc29cbiAqIGhvbGRzIHRob3NlIGNsYXNzZXM6IGEgY2xhc3MgaXMgYSB2b2x1bWUgdGhyb3VnaCB0aGUgd2hvbGUgc3RhY2ssIHdoZXRoZXIgb3JcbiAqIG5vdCBpdCBoYXMgYSByZWdpb24gb24gdGhlIHNsaWNlLiBBbnkgb3RoZXIgc2VsZWN0aW9uIGRyb3BzIHRoZW07IGFuIGVkaXRcbiAqICh7QGxpbmsgcmV0YWlufSwge0BsaW5rIHN5bmN9KSBrZWVwcyB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uU2VsZWN0aW9uIHtcbiAgcHJpdmF0ZSBzZWxlY3RlZDogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBwaWNrZWQ6IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhc3Nlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHJlYWRvbmx5IHN0cmluZ1tdPihbXSk7XG5cbiAgLyoqIFRoZSBzZWxlY3RlZCByZWdpb25zJyBjdXJyZW50IGFycmF5IGluZGljZXMgKGVtaXRzIG9uIGNoYW5nZSBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgaW5kaWNlcyQ6IE9ic2VydmFibGU8bnVtYmVyW10+ID0gdGhpcy5pbmRpY2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogVGhlIGNsYXNzZXMgdGhlIHNlbGVjdGlvbiB3YXMgcGlja2VkIGFzIChbXSBmb3IgYW55IG90aGVyIHNlbGVjdGlvbjsgZW1pdHMgb24gY2hhbmdlIG9ubHkpLiAqL1xuICByZWFkb25seSBjbGFzc2VzJDogT2JzZXJ2YWJsZTxyZWFkb25seSBzdHJpbmdbXT4gPSB0aGlzLmNsYXNzZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBUaGUgY2xhc3NlcyB0aGUgc2VsZWN0aW9uIHdhcyBwaWNrZWQgYXMsIGFzIGxhc3QgZW1pdHRlZCBieSB7QGxpbmsgc3luY30uICovXG4gIGdldCBjbGFzc2VzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc2VzU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgaW5kaWNlcyBhcyBsYXN0IHByb2plY3RlZCBieSB7QGxpbmsgc3luY30uICovXG4gIGdldCBpbmRpY2VzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5pbmRpY2VzU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgaWRzLCBpbiBzZWxlY3Rpb24gb3JkZXIuICovXG4gIGdldCBpZHMoKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIHNlbGVjdGVkIGlkcywgcGlja2VkIGFzIGBjbGFzc2VzYCBpZiB0aGV5IHdlcmUgKG5vIGVtaXQgdW50aWwge0BsaW5rIHN5bmN9KS4gKi9cbiAgcmVwbGFjZShpZHM6IG51bWJlcltdLCBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IGlkcy5zbGljZSgpO1xuICAgIHRoaXMucGlja2VkID0gY2xhc3Nlcy5zbGljZSgpO1xuICB9XG5cbiAgLyoqIEtlZXAgb25seSB0aGUgaWRzIGBrZWVwYCBhY2NlcHRzIChubyBlbWl0IHVudGlsIHtAbGluayBzeW5jfSkuICovXG4gIHJldGFpbihrZWVwOiAoaWQ6IG51bWJlcikgPT4gYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkLmZpbHRlcihrZWVwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYnkgYXJyYXkgaW5kZXggaW50byBgcmVnaW9uc2A6IGludmFsaWQgYW5kIGR1cGxpY2F0ZSBpbmRpY2VzIGFyZVxuICAgKiBkcm9wcGVkLCB0aGUgZ2l2ZW4gb3JkZXIgaXMga2VwdC4gUHJvamVjdHMgYW5kIGVtaXRzLlxuICAgKi9cbiAgc2VsZWN0SW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSwgcmVnaW9uczogcmVhZG9ubHkgSGFzSWRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMgfHwgW10pIHtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGkpIHx8IGkgPCAwIHx8IGkgPj0gcmVnaW9ucy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaWQgPSByZWdpb25zW2ldLmlkO1xuICAgICAgaWYgKCFzZWVuLmhhcyhpZCkpIHtcbiAgICAgICAgc2Vlbi5hZGQoaWQpO1xuICAgICAgICBpZHMucHVzaChpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWQgPSBpZHM7XG4gICAgdGhpcy5waWNrZWQgPSBbXTtcbiAgICB0aGlzLnN5bmMocmVnaW9ucyk7XG4gIH1cblxuICAvKiogUHJvamVjdCB0aGUgc2VsZWN0ZWQgaWRzIG9udG8gYHJlZ2lvbnNgLCBwcnVuaW5nIGlkcyBpdCBubyBsb25nZXIgaG9sZHMsXG4gICAqICBhbmQgZW1pdCBpZiB0aGUgaW5kZXggc2V0IChvciB0aGUgcGlja2VkIGNsYXNzZXMpIGNoYW5nZWQuICovXG4gIHN5bmMocmVnaW9uczogcmVhZG9ubHkgSGFzSWRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4T2YgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgIHJlZ2lvbnMuZm9yRWFjaCgociwgaSkgPT4ge1xuICAgICAgaWYgKCFpbmRleE9mLmhhcyhyLmlkKSkgaW5kZXhPZi5zZXQoci5pZCwgaSk7XG4gICAgfSk7XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBsaXZlOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy5zZWxlY3RlZCkge1xuICAgICAgY29uc3QgaWR4ID0gaW5kZXhPZi5nZXQoaWQpO1xuICAgICAgaWYgKGlkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGljZXMucHVzaChpZHgpO1xuICAgICAgICBsaXZlLnB1c2goaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkID0gbGl2ZTtcbiAgICBpZiAoIXNhbWVJbmRpY2VzKHRoaXMuaW5kaWNlc1N1YmplY3QudmFsdWUsIGluZGljZXMpKSB0aGlzLmluZGljZXNTdWJqZWN0Lm5leHQoaW5kaWNlcyk7XG4gICAgaWYgKCFzYW1lSW5kaWNlcyh0aGlzLmNsYXNzZXNTdWJqZWN0LnZhbHVlLCB0aGlzLnBpY2tlZCkpIHRoaXMuY2xhc3Nlc1N1YmplY3QubmV4dCh0aGlzLnBpY2tlZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FtZUluZGljZXM8VD4oYTogcmVhZG9ubHkgVFtdLCBiOiByZWFkb25seSBUW10pOiBib29sZWFuIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuIl19
|