@jax-data-science/sci-image-visualizer 0.16.0 → 0.18.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/display-types.mjs +4 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.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/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
- package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
- 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 +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +99 -6
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +24 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +2 -2
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
|
@@ -34,11 +34,10 @@ const MAX_TILE_RETRIES = 3;
|
|
|
34
34
|
* -----------
|
|
35
35
|
* Cell fill, cell outline, nucleus outline, the transcript density, then transcripts on top
|
|
36
36
|
* ({@link TILE_LAYER_ORDER}); a plan restores the order once, after all its groups are in
|
|
37
|
-
* place. The service's observation markers sit under all of them
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* the order after the service re-adds its markers.
|
|
37
|
+
* place. The service's observation markers sit under all of them, drawn at every zoom: once
|
|
38
|
+
* cells are big enough to outline, their outlines go over their markers. The density goes
|
|
39
|
+
* OVER the markers on purpose: under 10^5 dots it would only show in the gaps between cells.
|
|
40
|
+
* {@link afterObservations} restores the order after the service re-adds its markers.
|
|
42
41
|
*
|
|
43
42
|
* ONE LAYER PER GROUP
|
|
44
43
|
* -------------------
|
|
@@ -55,6 +54,10 @@ export class NapariSpatialTileLayers {
|
|
|
55
54
|
/** Consecutive retries of an incomplete view. */
|
|
56
55
|
this.tileRetries = 0;
|
|
57
56
|
this.token = 0;
|
|
57
|
+
/** The z band of the plane shown, when the view shows one plane of a 3D assay (see setZBand). */
|
|
58
|
+
this.zBand = null;
|
|
59
|
+
/** The plane of a 3D segmentation shown (see setPlane), or null. */
|
|
60
|
+
this.plane = null;
|
|
58
61
|
/** The overlays' layers, one per group, in their fixed order. */
|
|
59
62
|
this.groups = new OrderedLayerGroups(TILE_LAYER_ORDER);
|
|
60
63
|
/** Loads in flight, per layer label, for the loading badge. */
|
|
@@ -90,6 +93,7 @@ export class NapariSpatialTileLayers {
|
|
|
90
93
|
this.loads.clear();
|
|
91
94
|
this.groups.detach();
|
|
92
95
|
this.cells.detached();
|
|
96
|
+
this.cells.dispose();
|
|
93
97
|
this.viewer = null;
|
|
94
98
|
}
|
|
95
99
|
/**
|
|
@@ -110,7 +114,7 @@ export class NapariSpatialTileLayers {
|
|
|
110
114
|
owns(layer) {
|
|
111
115
|
return this.groups.owns(layer);
|
|
112
116
|
}
|
|
113
|
-
/** True while outlines are on screen
|
|
117
|
+
/** True while outlines are on screen. */
|
|
114
118
|
get outlinesShown() {
|
|
115
119
|
return this.cells.outlinesShown;
|
|
116
120
|
}
|
|
@@ -122,6 +126,29 @@ export class NapariSpatialTileLayers {
|
|
|
122
126
|
refresh() {
|
|
123
127
|
this.schedule(0);
|
|
124
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Show one plane of a 3D assay (its z band, `[lo, hi)` in observation units), or every depth
|
|
131
|
+
* (null): the transcripts drawn are those in the band. Re-plans when it changes.
|
|
132
|
+
*/
|
|
133
|
+
setZBand(band) {
|
|
134
|
+
const same = band === this.zBand || (!!band && !!this.zBand && band[0] === this.zBand[0] && band[1] === this.zBand[1]);
|
|
135
|
+
if (same)
|
|
136
|
+
return;
|
|
137
|
+
this.zBand = band;
|
|
138
|
+
this.refresh();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Show plane `plane` of a 3D segmentation (an index into its region set's planes), or none: a
|
|
142
|
+
* boundary set naming its region set draws that plane's cells (see `CellLayers.setPlane`).
|
|
143
|
+
* Re-plans when it changes.
|
|
144
|
+
*/
|
|
145
|
+
setPlane(plane) {
|
|
146
|
+
if (plane === this.plane)
|
|
147
|
+
return;
|
|
148
|
+
this.plane = plane;
|
|
149
|
+
this.cells.setPlane(plane);
|
|
150
|
+
this.refresh();
|
|
151
|
+
}
|
|
125
152
|
/** Called right after the service adds its marker layer: everything goes back on top. */
|
|
126
153
|
afterObservations() {
|
|
127
154
|
this.groups.restoreOrder(true);
|
|
@@ -166,7 +193,7 @@ export class NapariSpatialTileLayers {
|
|
|
166
193
|
await Promise.all([
|
|
167
194
|
settle('density', this.density.plan(dataset, view, ctx)),
|
|
168
195
|
settle('cells', this.cells.plan(dataset, view, selection, rect, pxPerUnit, ctx)),
|
|
169
|
-
settle('transcripts', this.transcripts.plan(dataset, view, rect, pxPerUnit, ctx)),
|
|
196
|
+
settle('transcripts', this.transcripts.plan(dataset, view, rect, pxPerUnit, ctx, this.zBand, selection)),
|
|
170
197
|
]);
|
|
171
198
|
this.groups.restoreOrder(false);
|
|
172
199
|
if (ctx.stale())
|
|
@@ -182,4 +209,4 @@ export class NapariSpatialTileLayers {
|
|
|
182
209
|
}
|
|
183
210
|
}
|
|
184
211
|
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtdGlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtdGlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFZLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsWUFBWSxFQUdaLG1CQUFtQixHQUNwQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBYSxNQUFNLDhCQUE4QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBd0JyRSwyQ0FBMkM7QUFDM0MsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLDJGQUEyRjtBQUMzRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFxQmxDLFlBQ0UsSUFBcUIsRUFDSixJQUFxQjtRQUFyQixTQUFJLEdBQUosSUFBSSxDQUFpQjtRQXRCaEMsV0FBTSxHQUFrQixJQUFJLENBQUM7UUFDN0IsY0FBUyxHQUF3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QUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDbEYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQUUsT0FBTztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRSxvRkFBb0Y7UUFDcEYsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHR5cGUgeyBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbERhdGFzZXQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IERhdGFSZWN0LCBwaXhlbHNQZXJEYXRhVW5pdCwgdmlzaWJsZURhdGFSZWN0IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgQ2F0ZWdvcmljYWxMb29rdXAgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvY2F0ZWdvcmljYWwtbG9va3VwJztcbmltcG9ydCB7IENlbGxMYXllcnMgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvY2VsbC1sYXllcnMnO1xuaW1wb3J0IHtcbiAgRGVuc2l0eUxheWVyLFxuICBEZW5zaXR5U3RhdHMsXG4gIFRyYW5zY3JpcHRFc3RpbWF0ZSxcbiAgVHJhbnNjcmlwdEVzdGltYXRvcixcbn0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL2RlbnNpdHktbGF5ZXInO1xuaW1wb3J0IHsgT3JkZXJlZExheWVyR3JvdXBzLCBUSUxFX0xBWUVSX09SREVSLCBUaWxlR3JvdXAgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvbGF5ZXItZ3JvdXBzJztcbmltcG9ydCB7IExvYWRUcmFja2VyLCBQbGFuQ29udGV4dCB9IGZyb20gJy4vc3BhdGlhbC10aWxlcy9wbGFuLWNvbnRleHQnO1xuaW1wb3J0IHsgVHJhbnNjcmlwdEhvdmVyIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL3RyYW5zY3JpcHQtaG92ZXInO1xuaW1wb3J0IHsgVHJhbnNjcmlwdEpvYlBsYW5uZXIgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvdHJhbnNjcmlwdC1qb2JzJztcbmltcG9ydCB7IFRyYW5zY3JpcHRMYXllcnMgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvdHJhbnNjcmlwdC1sYXllcnMnO1xuXG5leHBvcnQgdHlwZSB7IFRyYW5zY3JpcHRFc3RpbWF0ZSB9IGZyb20gJy4vc3BhdGlhbC10aWxlcy9kZW5zaXR5LWxheWVyJztcblxuLyoqIFdoYXQgdGhlIHRpbGUgbGF5ZXJzIHJlYWQgZnJvbSwgYW5kIHJlcG9ydCB0bywgdGhlIHZpc3VhbGl6ZXIgc2VydmljZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRpbGVIb3N0IHtcbiAgLyoqIExhdGVzdCBkYXRhc2V0L3ZpZXcvc2VsZWN0aW9uLCBhcyB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gc2F3IHRoZW0uICovXG4gIGxhdGVzdCgpOiBbU3BhdGlhbERhdGFzZXQgfCBudWxsLCBTcGF0aWFsVmlld1N0YXRlLCBTcGF0aWFsU2VsZWN0aW9uTWFza10gfCBudWxsO1xuICAvKiogQ2FudmFzIHNpemUgaW4gQ1NTIHBpeGVscy4gKi9cbiAgY2FudmFzU2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogVGhlIGNvbnRpbnVvdXMgTFVUIHRoZSB2aWV3IGlzIHVzaW5nIChzbyBjZWxscyBjb2xvdXJlZCBieSBhIGdlbmUgbWF0Y2ggdGhlIG1hcmtlcnMpLiAqL1xuICBjb250aW51b3VzTHV0KHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBSZ2JbXTtcbiAgLyoqIE91dGxpbmVzIGFwcGVhcmVkIG9yIGRpc2FwcGVhcmVkOiB0aGUgbWFya2VycycgdmlzaWJpbGl0eSBmb2xsb3dzLiAqL1xuICBwb2x5Z29uc1Nob3duQ2hhbmdlZChzaG93bjogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBUaGUgZGVuc2l0eSB3aW5kb3cgY2hhbmdlZCAoYXV0by1kZXJpdmVkIG9yIHNldCkuICovXG4gIGRlbnNpdHlDaGFuZ2VkPyhzdGF0czogRGVuc2l0eVN0YXRzKTogdm9pZDtcbiAgLyoqIEVzdGltYXRlZCB0cmFuc2NyaXB0cyBpbiB2aWV3IGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFnYWluc3QgdGhlIGJ1ZGdldC4gKi9cbiAgZXN0aW1hdGVDaGFuZ2VkPyhlc3RpbWF0ZTogVHJhbnNjcmlwdEVzdGltYXRlIHwgbnVsbCk6IHZvaWQ7XG4gIC8qKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW5zaWRlIHRoZSB2aWV3LCBvciBudWxsIHdoZW4gbm90IGtub3duLiAqL1xuICBnZW5lQ291bnRzQ2hhbmdlZD8oY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbCk6IHZvaWQ7XG4gIC8qKiBUaGUgbGF5ZXJzIHdob3NlIGRhdGEgaXMgaW4gZmxpZ2h0IG5vdyAoXCJUcmFuc2NyaXB0c1wiLCBcIkNlbGxzXCLigKYpOyBlbXB0eSB3aGVuIG5vbmUuICovXG4gIGxvYWRpbmdDaGFuZ2VkPyhsYXllcnM6IHN0cmluZ1tdKTogdm9pZDtcbn1cblxuLyoqIENhbWVyYSBpZGxlIHRpbWUgYmVmb3JlIGEgcGxhbiBydW5zLiAqL1xuY29uc3QgQ0FNRVJBX0lETEVfTVMgPSAxMjA7XG4vKiogRmlyc3QgcmV0cnkgb2YgYSB2aWV3IHdpdGggYSBmYWlsZWQgdGlsZTsgZG91YmxlcyBlYWNoIHRpbWUsIHVwIHRvIE1BWF9USUxFX1JFVFJJRVMuICovXG5jb25zdCBUSUxFX1JFVFJZX01TID0gMTAwMDtcbmNvbnN0IE1BWF9USUxFX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIExldmVsLW9mLWRldGFpbCBjZWxsIG91dGxpbmVzLCB0cmFuc2NyaXB0cyBhbmQgdHJhbnNjcmlwdCBkZW5zaXR5IGZvciB0aGUgMkQgc3BhdGlhbCB2aWV3LlxuICpcbiAqIFdIWSBBIFNFUEFSQVRFIENMQVNTXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRXZlcnl0aGluZyBlbHNlIHRoZSBzcGF0aWFsIHZpZXcgZHJhd3MgaXMgYnVpbHQgb25jZSBwZXIgKGRhdGFzZXQsIHZpZXcpIGFuZCBvbmx5XG4gKiByZXN0eWxlZCBhZnRlcndhcmRzLiBUaGVzZSBsYXllcnMgYWxzbyBkZXBlbmQgb24gdGhlIENBTUVSQTogd2hpY2ggdGlsZXMgYXJlIG9uIHNjcmVlblxuICogYW5kIHdoaWNoIGxldmVsIG9mIGRldGFpbCB0aGUgem9vbSBjYWxscyBmb3IuIEtlZXBpbmcgdGhhdCBsb29wIOKAlCBwbGFuIG9uIGNhbWVyYSBpZGxlLFxuICogZmV0Y2ggdGlsZXMsIG1lcmdlLCBkcmF3IOKAlCBvdXQgb2YgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSBrZWVwcyBib3RoIHJlYWRhYmxlLlxuICpcbiAqIENPTExBQk9SQVRPUlMgKHNwYXRpYWwtdGlsZXMvKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBUaGlzIGNsYXNzIGlzIHRoZSBjb29yZGluYXRvcjogaXQgZGVib3VuY2VzIGNhbWVyYSBtb3ZlcywgcnVucyBvbmUgcGxhbiBwZXIgaWRsZSBjYW1lcmFcbiAqIChhIHtAbGluayBQbGFuQ29udGV4dH0pIGFuZCByZXRyaWVzIGFuIGluY29tcGxldGUgb25lLiBUaGUgd29yayBpcyBkb25lIGJ5XG4gKiB7QGxpbmsgQ2VsbExheWVyc30sIHtAbGluayBUcmFuc2NyaXB0TGF5ZXJzfSAod2l0aCB7QGxpbmsgVHJhbnNjcmlwdEpvYlBsYW5uZXJ9IGRlY2lkaW5nIHdoYXRcbiAqIHRvIGZldGNoKSwge0BsaW5rIERlbnNpdHlMYXllcn0gYW5kIHtAbGluayBUcmFuc2NyaXB0RXN0aW1hdG9yfTsge0BsaW5rIFRyYW5zY3JpcHRIb3Zlcn1cbiAqIG5hbWVzIHRoZSBkcmF3biBtYXJrZXJzLCBhbmQge0BsaW5rIE9yZGVyZWRMYXllckdyb3Vwc30ga2VlcHMgdGhlaXIgbGF5ZXJzIGluIG9yZGVyLlxuICpcbiAqIExBWUVSIE9SREVSXG4gKiAtLS0tLS0tLS0tLVxuICogQ2VsbCBmaWxsLCBjZWxsIG91dGxpbmUsIG51Y2xldXMgb3V0bGluZSwgdGhlIHRyYW5zY3JpcHQgZGVuc2l0eSwgdGhlbiB0cmFuc2NyaXB0cyBvbiB0b3BcbiAqICh7QGxpbmsgVElMRV9MQVlFUl9PUkRFUn0pOyBhIHBsYW4gcmVzdG9yZXMgdGhlIG9yZGVyIG9uY2UsIGFmdGVyIGFsbCBpdHMgZ3JvdXBzIGFyZSBpblxuICogcGxhY2UuIFRoZSBzZXJ2aWNlJ3Mgb2JzZXJ2YXRpb24gbWFya2VycyBzaXQgdW5kZXIgYWxsIG9mIHRoZW07IHdoaWxlIG91dGxpbmVzIGFyZSBkcmF3biB0aGVcbiAqIG1hcmtlcnMgYXJlIGhpZGRlbiAoYSBjZWxsIGlzIGl0cyBvdXRsaW5lIHRoZW4sIG5vdCBhIGRvdCksIHNvIHRoZSBjZWxscyBuZXZlciBoYXZlIHRvXG4gKiBiZSBvcmRlcmVkIGFnYWluc3QgdGhlbS4gVGhlIGRlbnNpdHkgZ29lcyBPVkVSIHRoZSBtYXJrZXJzIG9uIHB1cnBvc2U6IHVuZGVyIDEwXjVcbiAqIGRvdHMgaXQgd291bGQgb25seSBzaG93IGluIHRoZSBnYXBzIGJldHdlZW4gY2VsbHMuIHtAbGluayBhZnRlck9ic2VydmF0aW9uc30gcmVzdG9yZXNcbiAqIHRoZSBvcmRlciBhZnRlciB0aGUgc2VydmljZSByZS1hZGRzIGl0cyBtYXJrZXJzLlxuICpcbiAqIE9ORSBMQVlFUiBQRVIgR1JPVVBcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEVhY2ggZ3JvdXAgaXMgb25lIG1lcmdlZCBsYXllciBvdmVyIGV2ZXJ5IHZpc2libGUgdGlsZSwgcmVidWlsdCB3aGVuIHRoZSB0aWxlIHNldCBvclxuICogbGV2ZWwgY2hhbmdlcy4gUmVjb2xvdXJpbmcgKGEgbmV3IGNlbGwtdHlwZSBjb2x1bW4sIGEgc2VsZWN0aW9uKSBvbmx5IHJld3JpdGVzIHRoZVxuICogcGVyLXNoYXBlIHZhbHVlcyDigJQgdGhlIGdlb21ldHJ5IGlzIG5vdCByZS1leHBhbmRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIHtcbiAgcHJpdmF0ZSB2aWV3ZXI6IFZpZXdlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYU9mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDb25zZWN1dGl2ZSByZXRyaWVzIG9mIGFuIGluY29tcGxldGUgdmlldy4gKi9cbiAgcHJpdmF0ZSB0aWxlUmV0cmllcyA9IDA7XG4gIHByaXZhdGUgdG9rZW4gPSAwO1xuICAvKiogVGhlIG92ZXJsYXlzJyBsYXllcnMsIG9uZSBwZXIgZ3JvdXAsIGluIHRoZWlyIGZpeGVkIG9yZGVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwcyA9IG5ldyBPcmRlcmVkTGF5ZXJHcm91cHM8VGlsZUdyb3VwPihUSUxFX0xBWUVSX09SREVSKTtcblxuICAvKiogTG9hZHMgaW4gZmxpZ2h0LCBwZXIgbGF5ZXIgbGFiZWwsIGZvciB0aGUgbG9hZGluZyBiYWRnZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkcyA9IG5ldyBMb2FkVHJhY2tlcigobGFiZWxzKSA9PiB0aGlzLmhvc3QubG9hZGluZ0NoYW5nZWQ/LihsYWJlbHMpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cDogQ2F0ZWdvcmljYWxMb29rdXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgam9iczogVHJhbnNjcmlwdEpvYlBsYW5uZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVuc2l0eTogRGVuc2l0eUxheWVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNlbGxzOiBDZWxsTGF5ZXJzO1xuICBwcml2YXRlIHJlYWRvbmx5IGVzdGltYXRvcjogVHJhbnNjcmlwdEVzdGltYXRvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBob3ZlcjogVHJhbnNjcmlwdEhvdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zY3JpcHRzOiBUcmFuc2NyaXB0TGF5ZXJzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFNwYXRpYWxUaWxlSG9zdCxcbiAgKSB7XG4gICAgdGhpcy5sb29rdXAgPSBuZXcgQ2F0ZWdvcmljYWxMb29rdXAocG9ydCk7XG4gICAgdGhpcy5qb2JzID0gbmV3IFRyYW5zY3JpcHRKb2JQbGFubmVyKHBvcnQpO1xuICAgIHRoaXMuY2VsbHMgPSBuZXcgQ2VsbExheWVycyhwb3J0LCB0aGlzLmdyb3VwcywgdGhpcy5sb29rdXAsIGhvc3QpO1xuICAgIHRoaXMuZGVuc2l0eSA9IG5ldyBEZW5zaXR5TGF5ZXIocG9ydCwgdGhpcy5ncm91cHMsIChzdGF0cykgPT4gaG9zdC5kZW5zaXR5Q2hhbmdlZD8uKHN0YXRzKSk7XG4gICAgdGhpcy5lc3RpbWF0b3IgPSBuZXcgVHJhbnNjcmlwdEVzdGltYXRvcihwb3J0LCAoZXN0aW1hdGUpID0+IGhvc3QuZXN0aW1hdGVDaGFuZ2VkPy4oZXN0aW1hdGUpKTtcbiAgICB0aGlzLmhvdmVyID0gbmV3IFRyYW5zY3JpcHRIb3Zlcihwb3J0LCAoKSA9PiB0aGlzLmdyb3Vwcy5zaG93bigndHJhbnNjcmlwdHMnKSk7XG4gICAgdGhpcy50cmFuc2NyaXB0cyA9IG5ldyBUcmFuc2NyaXB0TGF5ZXJzKHRoaXMuZ3JvdXBzLCB0aGlzLmpvYnMsIHRoaXMubG9va3VwLCB0aGlzLmhvdmVyKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyID09PSB2aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLmRldGFjaCgpO1xuICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgIHRoaXMuZ3JvdXBzLmF0dGFjaCh2aWV3ZXIpO1xuICAgIHRoaXMuY2FtZXJhT2ZmID0gdmlld2VyLmNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy5zY2hlZHVsZSgpKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGZvbGxvd2luZyB0aGUgY2FtZXJhIGFuZCByZW1vdmUgZXZlcnkgb3ZlcmxheSBsYXllciBmcm9tIHRoZSB2aWV3ZXIuICovXG4gIGRldGFjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmhvdmVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmNhbWVyYU9mZj8uKCk7XG4gICAgdGhpcy5jYW1lcmFPZmYgPSBudWxsO1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgdGhpcy50b2tlbisrO1xuICAgIHRoaXMudGlsZVJldHJpZXMgPSAwO1xuICAgIHRoaXMudHJhbnNjcmlwdHMuZGV0YWNoZWQoKTtcbiAgICB0aGlzLmxvYWRzLmNsZWFyKCk7XG4gICAgdGhpcy5ncm91cHMuZGV0YWNoKCk7XG4gICAgdGhpcy5jZWxscy5kZXRhY2hlZCgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW5zaWRlIGByZWN0YDogZWFjaCBlbnRyeSBjb3VudHMgZm9yIHRoZSB0cmFuc2NyaXB0cyBpdFxuICAgKiBzdGFuZHMgZm9yIChhbiBhZ2dyZWdhdGUgYXQgYSBjb2Fyc2UgbGV2ZWwgaG9sZHMgc2V2ZXJhbCkuIE51bGwgd2l0aG91dCBwZXItZ2VuZSBkYXRhLlxuICAgKi9cbiAgZ2VuZUNvdW50c0luKHJlY3Q6IERhdGFSZWN0KTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRyYW5zY3JpcHRzLmdlbmVDb3VudHNJbihyZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb29sdGlwIGxpbmVzIGZvciB0aGUgdHJhbnNjcmlwdCBtYXJrZXIgdW5kZXIgd29ybGQgcG9pbnQgYCh3eCwgd3kpYCwgb3IgbnVsbDsgdGhlXG4gICAqIHNlcnZlcidzIGRldGFpbHMgYXJyaXZlIHRocm91Z2ggYG9uRGV0YWlsc2Agb25jZSB0aGUgcG9pbnRlciByZXN0cyAoc2VlIFRyYW5zY3JpcHRIb3ZlcikuXG4gICAqL1xuICBob3ZlckF0KHd4OiBudW1iZXIsIHd5OiBudW1iZXIsIHJhZGl1c1dvcmxkOiBudW1iZXIsIG9uRGV0YWlsczogKGxpbmVzOiBzdHJpbmdbXSkgPT4gdm9pZCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaG92ZXIuaG92ZXJBdCh3eCwgd3ksIHJhZGl1c1dvcmxkLCBvbkRldGFpbHMpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGxheWVyYCBpcyBvbmUgb2YgdGhlIG92ZXJsYXlzIGRyYXduIGhlcmUgKGRlbnNpdHksIGNlbGxzLCB0cmFuc2NyaXB0cykuICovXG4gIG93bnMobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBzLm93bnMobGF5ZXIpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hpbGUgb3V0bGluZXMgYXJlIG9uIHNjcmVlbiDigJQgdGhlIHNlcnZpY2UgaGlkZXMgaXRzIGRvdHMgdGhlbi4gKi9cbiAgZ2V0IG91dGxpbmVzU2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMub3V0bGluZXNTaG93bjtcbiAgfVxuXG4gIC8qKiBUaGUgZGVuc2l0eSB3aW5kb3cgaW4gdXNlIGFuZCB0aGUgZGVuc2VzdCBiaW4sIGZvciB0aGUgcGFuZWwncyB0aHJlc2hvbGQgY29udHJvbC4gKi9cbiAgZ2V0IGRlbnNpdHlTdGF0cygpOiBEZW5zaXR5U3RhdHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZW5zaXR5LnN0YXRzO1xuICB9XG5cbiAgLyoqIERhdGFzZXQsIHZpZXcgb3Igc2VsZWN0aW9uIGNoYW5nZWQ6IHJlLXBsYW4gbm93IHJhdGhlciB0aGFuIG9uIGNhbWVyYSBpZGxlLiAqL1xuICByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGUoMCk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBzZXJ2aWNlIGFkZHMgaXRzIG1hcmtlciBsYXllcjogZXZlcnl0aGluZyBnb2VzIGJhY2sgb24gdG9wLiAqL1xuICBhZnRlck9ic2VydmF0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmdyb3Vwcy5yZXN0b3JlT3JkZXIodHJ1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgcGxhbm5pbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBzY2hlZHVsZShkZWxheSA9IENBTUVSQV9JRExFX01TKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMucGxhbigpLmNhdGNoKChlcnIpID0+IGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCB0aWxlIHBsYW4gZmFpbGVkJywgZXJyKSk7XG4gICAgfSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwbGFuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyO1xuICAgIGNvbnN0IGxhdGVzdCA9IHRoaXMuaG9zdC5sYXRlc3QoKTtcbiAgICBpZiAoIXZpZXdlciB8fCAhbGF0ZXN0KSByZXR1cm47XG4gICAgY29uc3QgW2RhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbl0gPSBsYXRlc3Q7XG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMudG9rZW47XG4gICAgY29uc3QgY3R4ID0gbmV3IFBsYW5Db250ZXh0KCgpID0+IHRva2VuICE9PSB0aGlzLnRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIsIHRoaXMubG9hZHMpO1xuXG4gICAgaWYgKCFkYXRhc2V0KSB7XG4gICAgICB0aGlzLmdyb3Vwcy5kcm9wQWxsKCk7XG4gICAgICB0aGlzLmNlbGxzLmRyb3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3csIGhdID0gdGhpcy5ob3N0LmNhbnZhc1NpemUoKTtcbiAgICBjb25zdCByZWYgPSBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IHJlY3QgPSB2aXNpYmxlRGF0YVJlY3Qodmlld2VyLmNhbWVyYS5jZW50ZXIsIHZpZXdlci5jYW1lcmEuem9vbSwgdywgaCwgcmVmKTtcbiAgICBjb25zdCBweFBlclVuaXQgPSBwaXhlbHNQZXJEYXRhVW5pdCh2aWV3ZXIuY2FtZXJhLnpvb20sIHJlZik7XG4gICAgaWYgKCFyZWN0KSByZXR1cm47XG5cbiAgICB0aGlzLmVzdGltYXRvclxuICAgICAgLnBsYW4oZGF0YXNldCwgdmlldywgdmlld2VyLCB3LCBoLCBjdHgpXG4gICAgICAuY2F0Y2goKGVycikgPT4gY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0cmFuc2NyaXB0IGVzdGltYXRlIGZhaWxlZCcsIGVycikpO1xuICAgIC8vIEEgZ3JvdXAgd2hvc2UgcmVxdWVzdCBmYWlsZWQgKGEgY29sdW1uLCBhIGZlYXR1cmUgdmVjdG9yLCBhIGRlbnNpdHkgZ3JpZCkgbGVhdmVzIHRoZVxuICAgIC8vIG90aGVycyBkcmF3biBhbmQgbWFya3MgdGhlIHBsYW4gaW5jb21wbGV0ZSwgc28gaXQgaXMgcmV0cmllZCBsaWtlIGEgZmFpbGVkIHRpbGUuXG4gICAgY29uc3Qgc2V0dGxlID0gKGdyb3VwOiBzdHJpbmcsIHdvcms6IFByb21pc2U8dm9pZD4pID0+XG4gICAgICB3b3JrLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzcGF0aWFsICR7Z3JvdXB9IHBsYW4gZmFpbGVkYCwgZXJyKTtcbiAgICAgICAgY3R4Lm1hcmtJbmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBzZXR0bGUoJ2RlbnNpdHknLCB0aGlzLmRlbnNpdHkucGxhbihkYXRhc2V0LCB2aWV3LCBjdHgpKSxcbiAgICAgIHNldHRsZSgnY2VsbHMnLCB0aGlzLmNlbGxzLnBsYW4oZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCByZWN0LCBweFBlclVuaXQsIGN0eCkpLFxuICAgICAgc2V0dGxlKCd0cmFuc2NyaXB0cycsIHRoaXMudHJhbnNjcmlwdHMucGxhbihkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQsIGN0eCkpLFxuICAgIF0pO1xuICAgIHRoaXMuZ3JvdXBzLnJlc3RvcmVPcmRlcihmYWxzZSk7XG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG4gICAgdGhpcy5ob3N0LmdlbmVDb3VudHNDaGFuZ2VkPy4odGhpcy50cmFuc2NyaXB0cy5nZW5lQ291bnRzSW4ocmVjdCkpO1xuICAgIC8vIEEgdGlsZSB0aGF0IGZhaWxlZCBsZWZ0IGEgaG9sZSB0aGUgY2FjaGUga2V5cyBkbyBub3QgcmVjb3JkLCBzbyB0cnkgdGhlIHNhbWUgdmlld1xuICAgIC8vIGFnYWluLCBiYWNraW5nIG9mZiwgYSBib3VuZGVkIG51bWJlciBvZiB0aW1lcy5cbiAgICBpZiAoIWN0eC5pbmNvbXBsZXRlKSB7XG4gICAgICB0aGlzLnRpbGVSZXRyaWVzID0gMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGlsZVJldHJpZXMgPCBNQVhfVElMRV9SRVRSSUVTKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlKFRJTEVfUkVUUllfTVMgKiAyICoqIHRoaXMudGlsZVJldHJpZXMrKyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtdGlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtdGlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFZLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsWUFBWSxFQUdaLG1CQUFtQixHQUNwQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBYSxNQUFNLDhCQUE4QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBd0JyRSwyQ0FBMkM7QUFDM0MsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLDJGQUEyRjtBQUMzRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBQ0gsTUFBTSxPQUFPLHVCQUF1QjtJQXlCbEMsWUFDRSxJQUFxQixFQUNKLElBQXFCO1FBQXJCLFNBQUksR0FBSixJQUFJLENBQWlCO1FBMUJoQyxXQUFNLEdBQWtCLElBQUksQ0FBQztRQUM3QixjQUFTLEdBQXdC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eEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsb0ZBQW9GO1FBQ3BGLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTGF5ZXIsIFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB0eXBlIHsgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxTZWxlY3Rpb25NYXNrIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBEYXRhUmVjdCwgcGl4ZWxzUGVyRGF0YVVuaXQsIHZpc2libGVEYXRhUmVjdCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvbG9kJztcbmltcG9ydCB7IENhdGVnb3JpY2FsTG9va3VwIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL2NhdGVnb3JpY2FsLWxvb2t1cCc7XG5pbXBvcnQgeyBDZWxsTGF5ZXJzIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL2NlbGwtbGF5ZXJzJztcbmltcG9ydCB7XG4gIERlbnNpdHlMYXllcixcbiAgRGVuc2l0eVN0YXRzLFxuICBUcmFuc2NyaXB0RXN0aW1hdGUsXG4gIFRyYW5zY3JpcHRFc3RpbWF0b3IsXG59IGZyb20gJy4vc3BhdGlhbC10aWxlcy9kZW5zaXR5LWxheWVyJztcbmltcG9ydCB7IE9yZGVyZWRMYXllckdyb3VwcywgVElMRV9MQVlFUl9PUkRFUiwgVGlsZUdyb3VwIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL2xheWVyLWdyb3Vwcyc7XG5pbXBvcnQgeyBMb2FkVHJhY2tlciwgUGxhbkNvbnRleHQgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvcGxhbi1jb250ZXh0JztcbmltcG9ydCB7IFRyYW5zY3JpcHRIb3ZlciB9IGZyb20gJy4vc3BhdGlhbC10aWxlcy90cmFuc2NyaXB0LWhvdmVyJztcbmltcG9ydCB7IFRyYW5zY3JpcHRKb2JQbGFubmVyIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL3RyYW5zY3JpcHQtam9icyc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0TGF5ZXJzIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzL3RyYW5zY3JpcHQtbGF5ZXJzJztcblxuZXhwb3J0IHR5cGUgeyBUcmFuc2NyaXB0RXN0aW1hdGUgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvZGVuc2l0eS1sYXllcic7XG5cbi8qKiBXaGF0IHRoZSB0aWxlIGxheWVycyByZWFkIGZyb20sIGFuZCByZXBvcnQgdG8sIHRoZSB2aXN1YWxpemVyIHNlcnZpY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxUaWxlSG9zdCB7XG4gIC8qKiBMYXRlc3QgZGF0YXNldC92aWV3L3NlbGVjdGlvbiwgYXMgdGhlIHNwYXRpYWwgc3Vic2NyaXB0aW9uIHNhdyB0aGVtLiAqL1xuICBsYXRlc3QoKTogW1NwYXRpYWxEYXRhc2V0IHwgbnVsbCwgU3BhdGlhbFZpZXdTdGF0ZSwgU3BhdGlhbFNlbGVjdGlvbk1hc2tdIHwgbnVsbDtcbiAgLyoqIENhbnZhcyBzaXplIGluIENTUyBwaXhlbHMuICovXG4gIGNhbnZhc1NpemUoKTogW251bWJlciwgbnVtYmVyXTtcbiAgLyoqIFRoZSBjb250aW51b3VzIExVVCB0aGUgdmlldyBpcyB1c2luZyAoc28gY2VsbHMgY29sb3VyZWQgYnkgYSBnZW5lIG1hdGNoIHRoZSBtYXJrZXJzKS4gKi9cbiAgY29udGludW91c0x1dCh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUmdiW107XG4gIC8qKiBPdXRsaW5lcyBhcHBlYXJlZCBvciBkaXNhcHBlYXJlZDogdGhlIG1hcmtlcnMnIHZpc2liaWxpdHkgZm9sbG93cy4gKi9cbiAgcG9seWdvbnNTaG93bkNoYW5nZWQoc2hvd246IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogVGhlIGRlbnNpdHkgd2luZG93IGNoYW5nZWQgKGF1dG8tZGVyaXZlZCBvciBzZXQpLiAqL1xuICBkZW5zaXR5Q2hhbmdlZD8oc3RhdHM6IERlbnNpdHlTdGF0cyk6IHZvaWQ7XG4gIC8qKiBFc3RpbWF0ZWQgdHJhbnNjcmlwdHMgaW4gdmlldyBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBhZ2FpbnN0IHRoZSBidWRnZXQuICovXG4gIGVzdGltYXRlQ2hhbmdlZD8oZXN0aW1hdGU6IFRyYW5zY3JpcHRFc3RpbWF0ZSB8IG51bGwpOiB2b2lkO1xuICAvKiogVHJhbnNjcmlwdHMgb2YgZWFjaCBzZWxlY3RlZCBnZW5lIGluc2lkZSB0aGUgdmlldywgb3IgbnVsbCB3aGVuIG5vdCBrbm93bi4gKi9cbiAgZ2VuZUNvdW50c0NoYW5nZWQ/KGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGwpOiB2b2lkO1xuICAvKiogVGhlIGxheWVycyB3aG9zZSBkYXRhIGlzIGluIGZsaWdodCBub3cgKFwiVHJhbnNjcmlwdHNcIiwgXCJDZWxsc1wi4oCmKTsgZW1wdHkgd2hlbiBub25lLiAqL1xuICBsb2FkaW5nQ2hhbmdlZD8obGF5ZXJzOiBzdHJpbmdbXSk6IHZvaWQ7XG59XG5cbi8qKiBDYW1lcmEgaWRsZSB0aW1lIGJlZm9yZSBhIHBsYW4gcnVucy4gKi9cbmNvbnN0IENBTUVSQV9JRExFX01TID0gMTIwO1xuLyoqIEZpcnN0IHJldHJ5IG9mIGEgdmlldyB3aXRoIGEgZmFpbGVkIHRpbGU7IGRvdWJsZXMgZWFjaCB0aW1lLCB1cCB0byBNQVhfVElMRV9SRVRSSUVTLiAqL1xuY29uc3QgVElMRV9SRVRSWV9NUyA9IDEwMDA7XG5jb25zdCBNQVhfVElMRV9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBMZXZlbC1vZi1kZXRhaWwgY2VsbCBvdXRsaW5lcywgdHJhbnNjcmlwdHMgYW5kIHRyYW5zY3JpcHQgZGVuc2l0eSBmb3IgdGhlIDJEIHNwYXRpYWwgdmlldy5cbiAqXG4gKiBXSFkgQSBTRVBBUkFURSBDTEFTU1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5dGhpbmcgZWxzZSB0aGUgc3BhdGlhbCB2aWV3IGRyYXdzIGlzIGJ1aWx0IG9uY2UgcGVyIChkYXRhc2V0LCB2aWV3KSBhbmQgb25seVxuICogcmVzdHlsZWQgYWZ0ZXJ3YXJkcy4gVGhlc2UgbGF5ZXJzIGFsc28gZGVwZW5kIG9uIHRoZSBDQU1FUkE6IHdoaWNoIHRpbGVzIGFyZSBvbiBzY3JlZW5cbiAqIGFuZCB3aGljaCBsZXZlbCBvZiBkZXRhaWwgdGhlIHpvb20gY2FsbHMgZm9yLiBLZWVwaW5nIHRoYXQgbG9vcCDigJQgcGxhbiBvbiBjYW1lcmEgaWRsZSxcbiAqIGZldGNoIHRpbGVzLCBtZXJnZSwgZHJhdyDigJQgb3V0IG9mIHRoZSB2aXN1YWxpemVyIHNlcnZpY2Uga2VlcHMgYm90aCByZWFkYWJsZS5cbiAqXG4gKiBDT0xMQUJPUkFUT1JTIChzcGF0aWFsLXRpbGVzLylcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhpcyBjbGFzcyBpcyB0aGUgY29vcmRpbmF0b3I6IGl0IGRlYm91bmNlcyBjYW1lcmEgbW92ZXMsIHJ1bnMgb25lIHBsYW4gcGVyIGlkbGUgY2FtZXJhXG4gKiAoYSB7QGxpbmsgUGxhbkNvbnRleHR9KSBhbmQgcmV0cmllcyBhbiBpbmNvbXBsZXRlIG9uZS4gVGhlIHdvcmsgaXMgZG9uZSBieVxuICoge0BsaW5rIENlbGxMYXllcnN9LCB7QGxpbmsgVHJhbnNjcmlwdExheWVyc30gKHdpdGgge0BsaW5rIFRyYW5zY3JpcHRKb2JQbGFubmVyfSBkZWNpZGluZyB3aGF0XG4gKiB0byBmZXRjaCksIHtAbGluayBEZW5zaXR5TGF5ZXJ9IGFuZCB7QGxpbmsgVHJhbnNjcmlwdEVzdGltYXRvcn07IHtAbGluayBUcmFuc2NyaXB0SG92ZXJ9XG4gKiBuYW1lcyB0aGUgZHJhd24gbWFya2VycywgYW5kIHtAbGluayBPcmRlcmVkTGF5ZXJHcm91cHN9IGtlZXBzIHRoZWlyIGxheWVycyBpbiBvcmRlci5cbiAqXG4gKiBMQVlFUiBPUkRFUlxuICogLS0tLS0tLS0tLS1cbiAqIENlbGwgZmlsbCwgY2VsbCBvdXRsaW5lLCBudWNsZXVzIG91dGxpbmUsIHRoZSB0cmFuc2NyaXB0IGRlbnNpdHksIHRoZW4gdHJhbnNjcmlwdHMgb24gdG9wXG4gKiAoe0BsaW5rIFRJTEVfTEFZRVJfT1JERVJ9KTsgYSBwbGFuIHJlc3RvcmVzIHRoZSBvcmRlciBvbmNlLCBhZnRlciBhbGwgaXRzIGdyb3VwcyBhcmUgaW5cbiAqIHBsYWNlLiBUaGUgc2VydmljZSdzIG9ic2VydmF0aW9uIG1hcmtlcnMgc2l0IHVuZGVyIGFsbCBvZiB0aGVtLCBkcmF3biBhdCBldmVyeSB6b29tOiBvbmNlXG4gKiBjZWxscyBhcmUgYmlnIGVub3VnaCB0byBvdXRsaW5lLCB0aGVpciBvdXRsaW5lcyBnbyBvdmVyIHRoZWlyIG1hcmtlcnMuIFRoZSBkZW5zaXR5IGdvZXNcbiAqIE9WRVIgdGhlIG1hcmtlcnMgb24gcHVycG9zZTogdW5kZXIgMTBeNSBkb3RzIGl0IHdvdWxkIG9ubHkgc2hvdyBpbiB0aGUgZ2FwcyBiZXR3ZWVuIGNlbGxzLlxuICoge0BsaW5rIGFmdGVyT2JzZXJ2YXRpb25zfSByZXN0b3JlcyB0aGUgb3JkZXIgYWZ0ZXIgdGhlIHNlcnZpY2UgcmUtYWRkcyBpdHMgbWFya2Vycy5cbiAqXG4gKiBPTkUgTEFZRVIgUEVSIEdST1VQXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFYWNoIGdyb3VwIGlzIG9uZSBtZXJnZWQgbGF5ZXIgb3ZlciBldmVyeSB2aXNpYmxlIHRpbGUsIHJlYnVpbHQgd2hlbiB0aGUgdGlsZSBzZXQgb3JcbiAqIGxldmVsIGNoYW5nZXMuIFJlY29sb3VyaW5nIChhIG5ldyBjZWxsLXR5cGUgY29sdW1uLCBhIHNlbGVjdGlvbikgb25seSByZXdyaXRlcyB0aGVcbiAqIHBlci1zaGFwZSB2YWx1ZXMg4oCUIHRoZSBnZW9tZXRyeSBpcyBub3QgcmUtZXhwYW5kZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB7XG4gIHByaXZhdGUgdmlld2VyOiBWaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYW1lcmFPZmY6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAvKiogQ29uc2VjdXRpdmUgcmV0cmllcyBvZiBhbiBpbmNvbXBsZXRlIHZpZXcuICovXG4gIHByaXZhdGUgdGlsZVJldHJpZXMgPSAwO1xuICBwcml2YXRlIHRva2VuID0gMDtcbiAgLyoqIFRoZSB6IGJhbmQgb2YgdGhlIHBsYW5lIHNob3duLCB3aGVuIHRoZSB2aWV3IHNob3dzIG9uZSBwbGFuZSBvZiBhIDNEIGFzc2F5IChzZWUgc2V0WkJhbmQpLiAqL1xuICBwcml2YXRlIHpCYW5kOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgcGxhbmUgb2YgYSAzRCBzZWdtZW50YXRpb24gc2hvd24gKHNlZSBzZXRQbGFuZSksIG9yIG51bGwuICovXG4gIHByaXZhdGUgcGxhbmU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIG92ZXJsYXlzJyBsYXllcnMsIG9uZSBwZXIgZ3JvdXAsIGluIHRoZWlyIGZpeGVkIG9yZGVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwcyA9IG5ldyBPcmRlcmVkTGF5ZXJHcm91cHM8VGlsZUdyb3VwPihUSUxFX0xBWUVSX09SREVSKTtcblxuICAvKiogTG9hZHMgaW4gZmxpZ2h0LCBwZXIgbGF5ZXIgbGFiZWwsIGZvciB0aGUgbG9hZGluZyBiYWRnZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkcyA9IG5ldyBMb2FkVHJhY2tlcigobGFiZWxzKSA9PiB0aGlzLmhvc3QubG9hZGluZ0NoYW5nZWQ/LihsYWJlbHMpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cDogQ2F0ZWdvcmljYWxMb29rdXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgam9iczogVHJhbnNjcmlwdEpvYlBsYW5uZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVuc2l0eTogRGVuc2l0eUxheWVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNlbGxzOiBDZWxsTGF5ZXJzO1xuICBwcml2YXRlIHJlYWRvbmx5IGVzdGltYXRvcjogVHJhbnNjcmlwdEVzdGltYXRvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBob3ZlcjogVHJhbnNjcmlwdEhvdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zY3JpcHRzOiBUcmFuc2NyaXB0TGF5ZXJzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnQ6IFNwYXRpYWxEYXRhUG9ydCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFNwYXRpYWxUaWxlSG9zdCxcbiAgKSB7XG4gICAgdGhpcy5sb29rdXAgPSBuZXcgQ2F0ZWdvcmljYWxMb29rdXAocG9ydCk7XG4gICAgdGhpcy5qb2JzID0gbmV3IFRyYW5zY3JpcHRKb2JQbGFubmVyKHBvcnQpO1xuICAgIHRoaXMuY2VsbHMgPSBuZXcgQ2VsbExheWVycyhwb3J0LCB0aGlzLmdyb3VwcywgdGhpcy5sb29rdXAsIGhvc3QpO1xuICAgIHRoaXMuZGVuc2l0eSA9IG5ldyBEZW5zaXR5TGF5ZXIocG9ydCwgdGhpcy5ncm91cHMsIChzdGF0cykgPT4gaG9zdC5kZW5zaXR5Q2hhbmdlZD8uKHN0YXRzKSk7XG4gICAgdGhpcy5lc3RpbWF0b3IgPSBuZXcgVHJhbnNjcmlwdEVzdGltYXRvcihwb3J0LCAoZXN0aW1hdGUpID0+IGhvc3QuZXN0aW1hdGVDaGFuZ2VkPy4oZXN0aW1hdGUpKTtcbiAgICB0aGlzLmhvdmVyID0gbmV3IFRyYW5zY3JpcHRIb3Zlcihwb3J0LCAoKSA9PiB0aGlzLmdyb3Vwcy5zaG93bigndHJhbnNjcmlwdHMnKSk7XG4gICAgdGhpcy50cmFuc2NyaXB0cyA9IG5ldyBUcmFuc2NyaXB0TGF5ZXJzKHRoaXMuZ3JvdXBzLCB0aGlzLmpvYnMsIHRoaXMubG9va3VwLCB0aGlzLmhvdmVyKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyID09PSB2aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLmRldGFjaCgpO1xuICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgIHRoaXMuZ3JvdXBzLmF0dGFjaCh2aWV3ZXIpO1xuICAgIHRoaXMuY2FtZXJhT2ZmID0gdmlld2VyLmNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy5zY2hlZHVsZSgpKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGZvbGxvd2luZyB0aGUgY2FtZXJhIGFuZCByZW1vdmUgZXZlcnkgb3ZlcmxheSBsYXllciBmcm9tIHRoZSB2aWV3ZXIuICovXG4gIGRldGFjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmhvdmVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmNhbWVyYU9mZj8uKCk7XG4gICAgdGhpcy5jYW1lcmFPZmYgPSBudWxsO1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgdGhpcy50b2tlbisrO1xuICAgIHRoaXMudGlsZVJldHJpZXMgPSAwO1xuICAgIHRoaXMudHJhbnNjcmlwdHMuZGV0YWNoZWQoKTtcbiAgICB0aGlzLmxvYWRzLmNsZWFyKCk7XG4gICAgdGhpcy5ncm91cHMuZGV0YWNoKCk7XG4gICAgdGhpcy5jZWxscy5kZXRhY2hlZCgpO1xuICAgIHRoaXMuY2VsbHMuZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW5zaWRlIGByZWN0YDogZWFjaCBlbnRyeSBjb3VudHMgZm9yIHRoZSB0cmFuc2NyaXB0cyBpdFxuICAgKiBzdGFuZHMgZm9yIChhbiBhZ2dyZWdhdGUgYXQgYSBjb2Fyc2UgbGV2ZWwgaG9sZHMgc2V2ZXJhbCkuIE51bGwgd2l0aG91dCBwZXItZ2VuZSBkYXRhLlxuICAgKi9cbiAgZ2VuZUNvdW50c0luKHJlY3Q6IERhdGFSZWN0KTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRyYW5zY3JpcHRzLmdlbmVDb3VudHNJbihyZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb29sdGlwIGxpbmVzIGZvciB0aGUgdHJhbnNjcmlwdCBtYXJrZXIgdW5kZXIgd29ybGQgcG9pbnQgYCh3eCwgd3kpYCwgb3IgbnVsbDsgdGhlXG4gICAqIHNlcnZlcidzIGRldGFpbHMgYXJyaXZlIHRocm91Z2ggYG9uRGV0YWlsc2Agb25jZSB0aGUgcG9pbnRlciByZXN0cyAoc2VlIFRyYW5zY3JpcHRIb3ZlcikuXG4gICAqL1xuICBob3ZlckF0KHd4OiBudW1iZXIsIHd5OiBudW1iZXIsIHJhZGl1c1dvcmxkOiBudW1iZXIsIG9uRGV0YWlsczogKGxpbmVzOiBzdHJpbmdbXSkgPT4gdm9pZCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaG92ZXIuaG92ZXJBdCh3eCwgd3ksIHJhZGl1c1dvcmxkLCBvbkRldGFpbHMpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGxheWVyYCBpcyBvbmUgb2YgdGhlIG92ZXJsYXlzIGRyYXduIGhlcmUgKGRlbnNpdHksIGNlbGxzLCB0cmFuc2NyaXB0cykuICovXG4gIG93bnMobGF5ZXI6IExheWVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBzLm93bnMobGF5ZXIpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hpbGUgb3V0bGluZXMgYXJlIG9uIHNjcmVlbi4gKi9cbiAgZ2V0IG91dGxpbmVzU2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMub3V0bGluZXNTaG93bjtcbiAgfVxuXG4gIC8qKiBUaGUgZGVuc2l0eSB3aW5kb3cgaW4gdXNlIGFuZCB0aGUgZGVuc2VzdCBiaW4sIGZvciB0aGUgcGFuZWwncyB0aHJlc2hvbGQgY29udHJvbC4gKi9cbiAgZ2V0IGRlbnNpdHlTdGF0cygpOiBEZW5zaXR5U3RhdHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZW5zaXR5LnN0YXRzO1xuICB9XG5cbiAgLyoqIERhdGFzZXQsIHZpZXcgb3Igc2VsZWN0aW9uIGNoYW5nZWQ6IHJlLXBsYW4gbm93IHJhdGhlciB0aGFuIG9uIGNhbWVyYSBpZGxlLiAqL1xuICByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGUoMCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBvbmUgcGxhbmUgb2YgYSAzRCBhc3NheSAoaXRzIHogYmFuZCwgYFtsbywgaGkpYCBpbiBvYnNlcnZhdGlvbiB1bml0cyksIG9yIGV2ZXJ5IGRlcHRoXG4gICAqIChudWxsKTogdGhlIHRyYW5zY3JpcHRzIGRyYXduIGFyZSB0aG9zZSBpbiB0aGUgYmFuZC4gUmUtcGxhbnMgd2hlbiBpdCBjaGFuZ2VzLlxuICAgKi9cbiAgc2V0WkJhbmQoYmFuZDogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBzYW1lID1cbiAgICAgIGJhbmQgPT09IHRoaXMuekJhbmQgfHwgKCEhYmFuZCAmJiAhIXRoaXMuekJhbmQgJiYgYmFuZFswXSA9PT0gdGhpcy56QmFuZFswXSAmJiBiYW5kWzFdID09PSB0aGlzLnpCYW5kWzFdKTtcbiAgICBpZiAoc2FtZSkgcmV0dXJuO1xuICAgIHRoaXMuekJhbmQgPSBiYW5kO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgcGxhbmUgYHBsYW5lYCBvZiBhIDNEIHNlZ21lbnRhdGlvbiAoYW4gaW5kZXggaW50byBpdHMgcmVnaW9uIHNldCdzIHBsYW5lcyksIG9yIG5vbmU6IGFcbiAgICogYm91bmRhcnkgc2V0IG5hbWluZyBpdHMgcmVnaW9uIHNldCBkcmF3cyB0aGF0IHBsYW5lJ3MgY2VsbHMgKHNlZSBgQ2VsbExheWVycy5zZXRQbGFuZWApLlxuICAgKiBSZS1wbGFucyB3aGVuIGl0IGNoYW5nZXMuXG4gICAqL1xuICBzZXRQbGFuZShwbGFuZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChwbGFuZSA9PT0gdGhpcy5wbGFuZSkgcmV0dXJuO1xuICAgIHRoaXMucGxhbmUgPSBwbGFuZTtcbiAgICB0aGlzLmNlbGxzLnNldFBsYW5lKHBsYW5lKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgcmlnaHQgYWZ0ZXIgdGhlIHNlcnZpY2UgYWRkcyBpdHMgbWFya2VyIGxheWVyOiBldmVyeXRoaW5nIGdvZXMgYmFjayBvbiB0b3AuICovXG4gIGFmdGVyT2JzZXJ2YXRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuZ3JvdXBzLnJlc3RvcmVPcmRlcih0cnVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBwbGFubmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHNjaGVkdWxlKGRlbGF5ID0gQ0FNRVJBX0lETEVfTVMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5wbGFuKCkuY2F0Y2goKGVycikgPT4gY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIHRpbGUgcGxhbiBmYWlsZWQnLCBlcnIpKTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBsYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3QgbGF0ZXN0ID0gdGhpcy5ob3N0LmxhdGVzdCgpO1xuICAgIGlmICghdmlld2VyIHx8ICFsYXRlc3QpIHJldHVybjtcbiAgICBjb25zdCBbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uXSA9IGxhdGVzdDtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy50b2tlbjtcbiAgICBjb25zdCBjdHggPSBuZXcgUGxhbkNvbnRleHQoKCkgPT4gdG9rZW4gIT09IHRoaXMudG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlciwgdGhpcy5sb2Fkcyk7XG5cbiAgICBpZiAoIWRhdGFzZXQpIHtcbiAgICAgIHRoaXMuZ3JvdXBzLmRyb3BBbGwoKTtcbiAgICAgIHRoaXMuY2VsbHMuZHJvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbdywgaF0gPSB0aGlzLmhvc3QuY2FudmFzU2l6ZSgpO1xuICAgIGNvbnN0IHJlZiA9IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3QgcmVjdCA9IHZpc2libGVEYXRhUmVjdCh2aWV3ZXIuY2FtZXJhLmNlbnRlciwgdmlld2VyLmNhbWVyYS56b29tLCB3LCBoLCByZWYpO1xuICAgIGNvbnN0IHB4UGVyVW5pdCA9IHBpeGVsc1BlckRhdGFVbml0KHZpZXdlci5jYW1lcmEuem9vbSwgcmVmKTtcbiAgICBpZiAoIXJlY3QpIHJldHVybjtcblxuICAgIHRoaXMuZXN0aW1hdG9yXG4gICAgICAucGxhbihkYXRhc2V0LCB2aWV3LCB2aWV3ZXIsIHcsIGgsIGN0eClcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRyYW5zY3JpcHQgZXN0aW1hdGUgZmFpbGVkJywgZXJyKSk7XG4gICAgLy8gQSBncm91cCB3aG9zZSByZXF1ZXN0IGZhaWxlZCAoYSBjb2x1bW4sIGEgZmVhdHVyZSB2ZWN0b3IsIGEgZGVuc2l0eSBncmlkKSBsZWF2ZXMgdGhlXG4gICAgLy8gb3RoZXJzIGRyYXduIGFuZCBtYXJrcyB0aGUgcGxhbiBpbmNvbXBsZXRlLCBzbyBpdCBpcyByZXRyaWVkIGxpa2UgYSBmYWlsZWQgdGlsZS5cbiAgICBjb25zdCBzZXR0bGUgPSAoZ3JvdXA6IHN0cmluZywgd29yazogUHJvbWlzZTx2b2lkPikgPT5cbiAgICAgIHdvcmsuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHNwYXRpYWwgJHtncm91cH0gcGxhbiBmYWlsZWRgLCBlcnIpO1xuICAgICAgICBjdHgubWFya0luY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHNldHRsZSgnZGVuc2l0eScsIHRoaXMuZGVuc2l0eS5wbGFuKGRhdGFzZXQsIHZpZXcsIGN0eCkpLFxuICAgICAgc2V0dGxlKCdjZWxscycsIHRoaXMuY2VsbHMucGxhbihkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHJlY3QsIHB4UGVyVW5pdCwgY3R4KSksXG4gICAgICBzZXR0bGUoJ3RyYW5zY3JpcHRzJywgdGhpcy50cmFuc2NyaXB0cy5wbGFuKGRhdGFzZXQsIHZpZXcsIHJlY3QsIHB4UGVyVW5pdCwgY3R4LCB0aGlzLnpCYW5kLCBzZWxlY3Rpb24pKSxcbiAgICBdKTtcbiAgICB0aGlzLmdyb3Vwcy5yZXN0b3JlT3JkZXIoZmFsc2UpO1xuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuICAgIHRoaXMuaG9zdC5nZW5lQ291bnRzQ2hhbmdlZD8uKHRoaXMudHJhbnNjcmlwdHMuZ2VuZUNvdW50c0luKHJlY3QpKTtcbiAgICAvLyBBIHRpbGUgdGhhdCBmYWlsZWQgbGVmdCBhIGhvbGUgdGhlIGNhY2hlIGtleXMgZG8gbm90IHJlY29yZCwgc28gdHJ5IHRoZSBzYW1lIHZpZXdcbiAgICAvLyBhZ2FpbiwgYmFja2luZyBvZmYsIGEgYm91bmRlZCBudW1iZXIgb2YgdGltZXMuXG4gICAgaWYgKCFjdHguaW5jb21wbGV0ZSkge1xuICAgICAgdGhpcy50aWxlUmV0cmllcyA9IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRpbGVSZXRyaWVzIDwgTUFYX1RJTEVfUkVUUklFUykge1xuICAgICAgdGhpcy5zY2hlZHVsZShUSUxFX1JFVFJZX01TICogMiAqKiB0aGlzLnRpbGVSZXRyaWVzKyspO1xuICAgIH1cbiAgfVxufVxuIl19
|