@jax-data-science/sci-image-visualizer 0.17.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 +3 -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 +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- 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 +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- 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 +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -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-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- 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-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4521 -759
- 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-CKEUwNta.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-CKEUwNta.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 +90 -4
- 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 +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- 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 +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- 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 +14 -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 +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- 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 +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
import { sliceZ, toWorld } from '../../geometry/place';
|
|
2
|
+
export { sliceZ, toWorld };
|
|
1
3
|
/** Opacity of a region's surface in the volume. */
|
|
2
4
|
export const REGION_MESH_OPACITY = 0.55;
|
|
3
5
|
/** While some surfaces are highlighted: theirs (near opaque, so their shape reads) … */
|
|
4
6
|
export const REGION_MESH_HIGHLIGHT_OPACITY = 0.9;
|
|
5
7
|
/** … and the others' (ghosted: still there for context, not in the way). */
|
|
6
8
|
export const REGION_MESH_DIMMED_OPACITY = 0.12;
|
|
9
|
+
/**
|
|
10
|
+
* A selection's surfaces while the others are ghosted: opaque, so they are drawn first and write
|
|
11
|
+
* depth, and the ghosted surfaces in front of them are blended over them rather than hiding them
|
|
12
|
+
* (a translucent surface draws only its own nearest faces, and is drawn after the opaque ones).
|
|
13
|
+
*/
|
|
14
|
+
export const REGION_MESH_SELECTED_OPACITY = 1;
|
|
7
15
|
/**
|
|
8
16
|
* The region reconstructions shown in a volume view: one translucent surface per region, in its
|
|
9
17
|
* colour, placed in the volume's world box (pixel x, y and slice z mapped onto it the way the
|
|
@@ -16,14 +24,26 @@ export const REGION_MESH_DIMMED_OPACITY = 0.12;
|
|
|
16
24
|
* to a ghost, so the selection stands out while staying in place among its neighbours.
|
|
17
25
|
*/
|
|
18
26
|
export class VolumeRegionMeshes {
|
|
19
|
-
|
|
27
|
+
/**
|
|
28
|
+
* `placer`, when given, places a mesh's vertices in the world off the main thread (a worker, see
|
|
29
|
+
* `placeInWorker`): a class's surface has hundreds of thousands of vertices, and placing every
|
|
30
|
+
* one in a loop here held the UI for seconds. Each surface then comes up as its placement lands,
|
|
31
|
+
* the one it replaces kept until then. Without one, they are placed at once (the tests).
|
|
32
|
+
*/
|
|
33
|
+
constructor(viewer, placer) {
|
|
20
34
|
this.viewer = viewer;
|
|
35
|
+
this.placer = placer;
|
|
21
36
|
this.layers = new Map();
|
|
22
37
|
this.highlighted = new Set();
|
|
23
38
|
this.hidden = new Set();
|
|
39
|
+
/** Surfaces faded: none of what is selected is in them. */
|
|
40
|
+
this.muted = new Set();
|
|
24
41
|
/** The meshes to show (kept while the volume has no frame yet). */
|
|
25
42
|
this.wanted = [];
|
|
26
43
|
this.frame = null;
|
|
44
|
+
/** The placements in flight, by key: the mesh and box each is for. */
|
|
45
|
+
this.placing = new Map();
|
|
46
|
+
this.token = 0;
|
|
27
47
|
}
|
|
28
48
|
/** Show exactly `meshes` (adding, keeping or removing surfaces). */
|
|
29
49
|
set(meshes) {
|
|
@@ -37,14 +57,12 @@ export class VolumeRegionMeshes {
|
|
|
37
57
|
setFrame(frame) {
|
|
38
58
|
const placed = this.frame ? baseFrame(this.frame) : null;
|
|
39
59
|
const next = baseFrame(frame);
|
|
40
|
-
const sameBox = !!placed &&
|
|
41
|
-
placed.size.every((v, i) => v === next.size[i]) &&
|
|
42
|
-
placed.world.every((v, i) => Math.abs(v - next.world[i]) <= 1e-9 * Math.max(1, Math.abs(v)));
|
|
60
|
+
const sameBox = !!placed && sameFrame(placed, next);
|
|
43
61
|
this.frame = frame;
|
|
44
62
|
const scale = this.scale3d();
|
|
45
63
|
for (const e of this.layers.values()) {
|
|
46
64
|
if (!sameBox)
|
|
47
|
-
|
|
65
|
+
this.place(e.mesh);
|
|
48
66
|
e.layer.scale3d = scale;
|
|
49
67
|
}
|
|
50
68
|
this.sync();
|
|
@@ -61,6 +79,20 @@ export class VolumeRegionMeshes {
|
|
|
61
79
|
e.layer.opacity = this.opacityOf(key);
|
|
62
80
|
this.viewer.requestRender();
|
|
63
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Fade the surfaces of these keys, as a picked region fades the others (none: each as usual):
|
|
84
|
+
* with a selection, the regions none of it is in fade and those it is in come forward, each
|
|
85
|
+
* keeping its colour.
|
|
86
|
+
*/
|
|
87
|
+
setMuted(keys) {
|
|
88
|
+
const next = new Set(keys);
|
|
89
|
+
if (next.size === this.muted.size && [...next].every((k) => this.muted.has(k)))
|
|
90
|
+
return;
|
|
91
|
+
this.muted = next;
|
|
92
|
+
for (const [key, e] of this.layers)
|
|
93
|
+
e.layer.opacity = this.opacityOf(key);
|
|
94
|
+
this.viewer.requestRender();
|
|
95
|
+
}
|
|
64
96
|
/** Hide the surfaces of these keys (they are kept, so showing them again is instant). */
|
|
65
97
|
setHidden(keys) {
|
|
66
98
|
this.hidden = new Set(keys);
|
|
@@ -104,23 +136,65 @@ export class VolumeRegionMeshes {
|
|
|
104
136
|
continue;
|
|
105
137
|
}
|
|
106
138
|
// Rebuilt or recoloured: the same surface, updated in place.
|
|
107
|
-
|
|
108
|
-
e.layer.setData(toWorld(want.vertices, baseFrame(this.frame)), want.faces);
|
|
109
|
-
}
|
|
139
|
+
const rebuilt = want.vertices !== e.mesh.vertices;
|
|
110
140
|
if (want.color !== e.mesh.color)
|
|
111
141
|
e.layer.color = want.color;
|
|
112
142
|
e.mesh = want;
|
|
143
|
+
if (rebuilt && this.frame)
|
|
144
|
+
this.place(want);
|
|
113
145
|
}
|
|
114
146
|
if (this.frame) {
|
|
115
147
|
for (const mesh of this.wanted)
|
|
116
148
|
if (!this.layers.has(mesh.key) && mesh.faces.length)
|
|
117
|
-
this.
|
|
149
|
+
this.place(mesh);
|
|
118
150
|
}
|
|
119
151
|
this.viewer.requestRender();
|
|
120
152
|
}
|
|
121
|
-
|
|
153
|
+
/**
|
|
154
|
+
* Place `mesh` in the current box, adding its surface or updating it: at once, or through the
|
|
155
|
+
* placer, its result kept only if the mesh and the box are still the ones wanted. A placement
|
|
156
|
+
* already in flight for the same mesh and box is not asked again.
|
|
157
|
+
*/
|
|
158
|
+
place(mesh) {
|
|
122
159
|
const frame = this.frame;
|
|
123
|
-
|
|
160
|
+
if (!frame)
|
|
161
|
+
return;
|
|
162
|
+
const base = baseFrame(frame);
|
|
163
|
+
if (!this.placer) {
|
|
164
|
+
this.apply(mesh, toWorld(mesh.vertices, base));
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const pending = this.placing.get(mesh.key);
|
|
168
|
+
if (pending && pending.mesh === mesh && sameFrame(pending.frame, base))
|
|
169
|
+
return;
|
|
170
|
+
const token = ++this.token;
|
|
171
|
+
this.placing.set(mesh.key, { mesh, frame: base, token });
|
|
172
|
+
this.placer(mesh.vertices, base).then((world) => {
|
|
173
|
+
if (this.placing.get(mesh.key)?.token !== token)
|
|
174
|
+
return;
|
|
175
|
+
this.placing.delete(mesh.key);
|
|
176
|
+
const wanted = this.wanted.find((m) => m.key === mesh.key);
|
|
177
|
+
if (wanted !== mesh || !this.frame || !sameFrame(baseFrame(this.frame), base))
|
|
178
|
+
return;
|
|
179
|
+
this.apply(mesh, world);
|
|
180
|
+
this.viewer.requestRender();
|
|
181
|
+
}, (err) => {
|
|
182
|
+
if (this.placing.get(mesh.key)?.token === token)
|
|
183
|
+
this.placing.delete(mesh.key);
|
|
184
|
+
console.warn(`[napari-js] region ${mesh.key} could not be placed in 3D`, err);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/** `mesh`'s surface with its vertices placed at `world`: updated in place, or added. */
|
|
188
|
+
apply(mesh, world) {
|
|
189
|
+
const e = this.layers.get(mesh.key);
|
|
190
|
+
if (e) {
|
|
191
|
+
e.layer.setData(world, mesh.faces);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
this.add(mesh, world);
|
|
195
|
+
}
|
|
196
|
+
add(mesh, world) {
|
|
197
|
+
const layer = this.viewer.addSurface(world, mesh.faces, undefined, {
|
|
124
198
|
name: `region ${mesh.key}`,
|
|
125
199
|
scale3d: this.scale3d(),
|
|
126
200
|
color: mesh.color,
|
|
@@ -132,33 +206,42 @@ export class VolumeRegionMeshes {
|
|
|
132
206
|
this.layers.set(mesh.key, { mesh, layer });
|
|
133
207
|
}
|
|
134
208
|
opacityOf(key) {
|
|
209
|
+
if (this.muted.size)
|
|
210
|
+
return this.muted.has(key) ? REGION_MESH_DIMMED_OPACITY : REGION_MESH_SELECTED_OPACITY;
|
|
135
211
|
if (!this.highlighted.size)
|
|
136
212
|
return REGION_MESH_OPACITY;
|
|
137
|
-
return this.highlighted.has(key) ?
|
|
213
|
+
return this.highlighted.has(key) ? REGION_MESH_SELECTED_OPACITY : REGION_MESH_DIMMED_OPACITY;
|
|
138
214
|
}
|
|
139
215
|
remove(key, layer) {
|
|
140
216
|
this.viewer.layers.remove(layer);
|
|
141
217
|
this.layers.delete(key);
|
|
218
|
+
this.placing.delete(key);
|
|
142
219
|
}
|
|
143
220
|
}
|
|
144
221
|
/** `frame` without its Z stretch: the box the surfaces' geometry is placed in. */
|
|
145
222
|
function baseFrame(frame) {
|
|
146
223
|
const s = frame.zScale && frame.zScale > 0 ? frame.zScale : 1;
|
|
147
|
-
|
|
224
|
+
if (s === 1)
|
|
225
|
+
return frame;
|
|
226
|
+
return {
|
|
227
|
+
size: frame.size,
|
|
228
|
+
world: [frame.world[0], frame.world[1], frame.world[2] / s],
|
|
229
|
+
...(frame.planes ? { planes: frame.planes } : {}),
|
|
230
|
+
};
|
|
148
231
|
}
|
|
149
|
-
/**
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
return
|
|
232
|
+
/** Whether two unstretched frames place a surface alike. */
|
|
233
|
+
function sameFrame(a, b) {
|
|
234
|
+
const near = (x, y) => Math.abs(x - y) <= 1e-9 * Math.max(1, Math.abs(x));
|
|
235
|
+
if (a.planes || b.planes) {
|
|
236
|
+
const p = a.planes;
|
|
237
|
+
const q = b.planes;
|
|
238
|
+
return (!!p &&
|
|
239
|
+
!!q &&
|
|
240
|
+
p.z.length === q.z.length &&
|
|
241
|
+
p.z.every((v, i) => near(v, q.z[i])) &&
|
|
242
|
+
p.scale.every((v, i) => near(v, q.scale[i])) &&
|
|
243
|
+
p.offset.every((v, i) => near(v, q.offset[i])));
|
|
244
|
+
}
|
|
245
|
+
return a.size.every((v, i) => v === b.size[i]) && a.world.every((v, i) => near(v, b.world[i]));
|
|
163
246
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE0QkEsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUN4Qyx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQ2pELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFRN0IsWUFBNkIsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFQMUIsV0FBTSxHQUFHLElBQUksR0FBRyxFQUF1RCxDQUFDO1FBQ2pGLGdCQUFXLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2hELG1FQUFtRTtRQUMzRCxXQUFNLEdBQTRCLEVBQUUsQ0FBQztRQUNyQyxVQUFLLEdBQXVCLElBQUksQ0FBQztJQUVLLENBQUM7SUFFL0Msb0VBQW9FO0lBQ3BFLEdBQUcsQ0FBQyxNQUErQjtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLEtBQWtCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxT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QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN1cmZhY2VMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuLyoqIEEgcmVnaW9uJ3MgM0QgcmVjb25zdHJ1Y3Rpb24gdG8gc2hvdyBpbiB0aGUgdm9sdW1lOiBhIG1lc2ggaW4gaW1hZ2UgcHggKHgsIHkpIGFuZCBzbGljZXMgKHopLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpb25NZXNoM0Qge1xuICAvKiogSWRlbnRpdHkgKGEgY2xhc3MgbmFtZSk6IGEgbWVzaCB3aXRoIHRoZSBzYW1lIGtleSBhbmQgYXJyYXlzIGlzIGtlcHQsIG5vdCByZWJ1aWx0LiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIGAjcnJnZ2JiYC4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIFdoYXQgaG92ZXJpbmcgaXQgc2hvd3MgKFwiSFBGIMK3IEhpcHBvY2FtcGFsIGZvcm1hdGlvblwiKTsgZGVmYXVsdDogdGhlIGtleS4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZlcnRpY2VzOiBGbG9hdDMyQXJyYXk7XG4gIGZhY2VzOiBVaW50MzJBcnJheTtcbn1cblxuLyoqIFdoZXJlIHRoZSBzdGFjayBzaXRzIGluIHRoZSB2b2x1bWUncyB3b3JsZDogaXRzIGZ1bGwgc2l6ZSwgYW5kIHRoZSBjZW50cmVkIHdvcmxkIGJveCBpdCBmaWxscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lRnJhbWUge1xuICAvKiogSW1hZ2Ugd2lkdGgsIGhlaWdodCAocHgpIGFuZCBzbGljZSBjb3VudC4gKi9cbiAgc2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKiogVGhlIHdvcmxkIGJveCAoY2VudHJlZCBvbiB0aGUgb3JpZ2luKSwgWiBhcyBjdXJyZW50bHkgc3RyZXRjaGVkLiAqL1xuICB3b3JsZDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKipcbiAgICogSG93IG11Y2ggb2Yge0BsaW5rIHdvcmxkfSdzIGRlcHRoIGlzIHRoZSB2aWV3J3MgWiBzdHJldGNoIChkZWZhdWx0IDEpLiBUaGUgcmVnaW9uIHN1cmZhY2VzIGtlZXBcbiAgICogdGhlaXIgZ2VvbWV0cnkgaW4gdGhlIHVuc3RyZXRjaGVkIGJveCBhbmQgdGFrZSB0aGUgc3RyZXRjaCBhcyBhIEdQVSBzY2FsZSAoYHNjYWxlM2RgKSwgc29cbiAgICogZHJhZ2dpbmcgdGhlIFogaGFuZGxlIHJlLXVwbG9hZHMgbm8gbWVzaC5cbiAgICovXG4gIHpTY2FsZT86IG51bWJlcjtcbn1cblxuLyoqIE9wYWNpdHkgb2YgYSByZWdpb24ncyBzdXJmYWNlIGluIHRoZSB2b2x1bWUuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX01FU0hfT1BBQ0lUWSA9IDAuNTU7XG4vKiogV2hpbGUgc29tZSBzdXJmYWNlcyBhcmUgaGlnaGxpZ2h0ZWQ6IHRoZWlycyAobmVhciBvcGFxdWUsIHNvIHRoZWlyIHNoYXBlIHJlYWRzKSDigKYgKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fTUVTSF9ISUdITElHSFRfT1BBQ0lUWSA9IDAuOTtcbi8qKiDigKYgYW5kIHRoZSBvdGhlcnMnIChnaG9zdGVkOiBzdGlsbCB0aGVyZSBmb3IgY29udGV4dCwgbm90IGluIHRoZSB3YXkpLiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9NRVNIX0RJTU1FRF9PUEFDSVRZID0gMC4xMjtcblxuLyoqXG4gKiBUaGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyBzaG93biBpbiBhIHZvbHVtZSB2aWV3OiBvbmUgdHJhbnNsdWNlbnQgc3VyZmFjZSBwZXIgcmVnaW9uLCBpbiBpdHNcbiAqIGNvbG91ciwgcGxhY2VkIGluIHRoZSB2b2x1bWUncyB3b3JsZCBib3ggKHBpeGVsIHgsIHkgYW5kIHNsaWNlIHogbWFwcGVkIG9udG8gaXQgdGhlIHdheSB0aGVcbiAqIHZvbHVtZSBtYXBzIGl0cyB2b3hlbHMpLiBUaGUgYm94J3MgWiBzdHJldGNoIGlzIHRoZSBzdXJmYWNlcycgYHNjYWxlM2RgIChhIHVuaWZvcm0pLCBzbyBhIHN0cmV0Y2hcbiAqIGFsb25lIGNoYW5nZXMgbm8gZ2VvbWV0cnk7IGEgbmV3IGJveCByZS1wbGFjZXMgdGhlbS4gQSBzdXJmYWNlIGlzIHVwZGF0ZWQgaW4gcGxhY2UgKGBzZXREYXRhYCxcbiAqIGBjb2xvcmAsIGBzY2FsZTNkYCkgcmF0aGVyIHRoYW4gYWRkZWQgYWdhaW4sIGFuZCBwaWNrZWQgYnkgbmFwYXJpLWpzIChgcGlja1N1cmZhY2VgKSwgd2hpY2hcbiAqIHBpY2tzIGl0IHdoZXJlIGl0IGlzIGRyYXduLlxuICpcbiAqIEhpZ2hsaWdodGluZyBpcyBmb2N1cyArIGNvbnRleHQ6IHRoZSBoaWdobGlnaHRlZCBzdXJmYWNlcyB0dXJuIG5lYXIgb3BhcXVlIGFuZCB0aGUgb3RoZXJzIGZhZGVcbiAqIHRvIGEgZ2hvc3QsIHNvIHRoZSBzZWxlY3Rpb24gc3RhbmRzIG91dCB3aGlsZSBzdGF5aW5nIGluIHBsYWNlIGFtb25nIGl0cyBuZWlnaGJvdXJzLlxuICovXG5leHBvcnQgY2xhc3MgVm9sdW1lUmVnaW9uTWVzaGVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXllcnMgPSBuZXcgTWFwPHN0cmluZywgeyBtZXNoOiBSZWdpb25NZXNoM0Q7IGxheWVyOiBTdXJmYWNlTGF5ZXIgfT4oKTtcbiAgcHJpdmF0ZSBoaWdobGlnaHRlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBoaWRkZW46IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgbWVzaGVzIHRvIHNob3cgKGtlcHQgd2hpbGUgdGhlIHZvbHVtZSBoYXMgbm8gZnJhbWUgeWV0KS4gKi9cbiAgcHJpdmF0ZSB3YW50ZWQ6IHJlYWRvbmx5IFJlZ2lvbk1lc2gzRFtdID0gW107XG4gIHByaXZhdGUgZnJhbWU6IFZvbHVtZUZyYW1lIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IFZpZXdlcikge31cblxuICAvKiogU2hvdyBleGFjdGx5IGBtZXNoZXNgIChhZGRpbmcsIGtlZXBpbmcgb3IgcmVtb3Zpbmcgc3VyZmFjZXMpLiAqL1xuICBzZXQobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMud2FudGVkID0gbWVzaGVzO1xuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvbGxvdyB0aGUgdm9sdW1lJ3MgZnJhbWUuIEEgbmV3IGJveCAoaXQgb3BlbmVkLCBhbm90aGVyIHZvbHVtZSkgcmUtcGxhY2VzIGV2ZXJ5IHN1cmZhY2U7IGEgWlxuICAgKiBzdHJldGNoIG9mIHRoZSBzYW1lIGJveCBvbmx5IHNldHMgdGhlaXIgYHNjYWxlM2RgLCBzbyBub3RoaW5nIGlzIHJlLXVwbG9hZGVkIHdoaWxlIGRyYWdnaW5nLlxuICAgKi9cbiAgc2V0RnJhbWUoZnJhbWU6IFZvbHVtZUZyYW1lKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VkID0gdGhpcy5mcmFtZSA/IGJhc2VGcmFtZSh0aGlzLmZyYW1lKSA6IG51bGw7XG4gICAgY29uc3QgbmV4dCA9IGJhc2VGcmFtZShmcmFtZSk7XG4gICAgY29uc3Qgc2FtZUJveCA9XG4gICAgICAhIXBsYWNlZCAmJlxuICAgICAgcGxhY2VkLnNpemUuZXZlcnkoKHYsIGkpID0+IHYgPT09IG5leHQuc2l6ZVtpXSkgJiZcbiAgICAgIHBsYWNlZC53b3JsZC5ldmVyeSgodiwgaSkgPT4gTWF0aC5hYnModiAtIG5leHQud29ybGRbaV0pIDw9IDFlLTkgKiBNYXRoLm1heCgxLCBNYXRoLmFicyh2KSkpO1xuICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGUzZCgpO1xuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmxheWVycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFzYW1lQm94KSBlLmxheWVyLnNldERhdGEodG9Xb3JsZChlLm1lc2gudmVydGljZXMsIG5leHQpLCBlLm1lc2guZmFjZXMpO1xuICAgICAgZS5sYXllci5zY2FsZTNkID0gc2NhbGU7XG4gICAgfVxuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqIFRoZSBzdXJmYWNlcycgR1BVIHNjYWxlOiB0aGUgZnJhbWUncyBaIHN0cmV0Y2guICovXG4gIHByaXZhdGUgc2NhbGUzZCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IHMgPSB0aGlzLmZyYW1lPy56U2NhbGU7XG4gICAgcmV0dXJuIFsxLCAxLCBzICYmIHMgPiAwID8gcyA6IDFdO1xuICB9XG5cbiAgLyoqIEhpZ2hsaWdodCB0aGUgc3VyZmFjZXMgb2YgdGhlc2Uga2V5cyAobm9uZTogZXZlcnkgc3VyZmFjZSBhcyB1c3VhbCkuICovXG4gIHNldEhpZ2hsaWdodChrZXlzOiBJdGVyYWJsZTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZCA9IG5ldyBTZXQoa2V5cyk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlXSBvZiB0aGlzLmxheWVycykgZS5sYXllci5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5T2Yoa2V5KTtcbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogSGlkZSB0aGUgc3VyZmFjZXMgb2YgdGhlc2Uga2V5cyAodGhleSBhcmUga2VwdCwgc28gc2hvd2luZyB0aGVtIGFnYWluIGlzIGluc3RhbnQpLiAqL1xuICBzZXRIaWRkZW4oa2V5czogSXRlcmFibGU8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaGlkZGVuID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIHRoaXMubGF5ZXJzKSBlLmxheWVyLnZpc2libGUgPSAhdGhpcy5oaWRkZW4uaGFzKGtleSk7XG4gICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIFRoZSBmcm9udC1tb3N0IHN1cmZhY2UgdW5kZXIgc2NyZWVuIHBvaW50IChgeGAsIGB5YCkgKGNhbnZhcyBDU1MgcHgpLCBvciBudWxsLiAqL1xuICBwaWNrQXQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBSZWdpb25NZXNoM0QgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubGF5ZXJzLnNpemUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG91cnMgPSBuZXcgTWFwKFsuLi50aGlzLmxheWVycy52YWx1ZXMoKV0ubWFwKChlKSA9PiBbZS5sYXllciwgZS5tZXNoXSkpO1xuICAgIGNvbnN0IGhpdCA9IHRoaXMudmlld2VyLnBpY2tTdXJmYWNlKHgsIHksIHsgcGlja2FibGU6IChsYXllcikgPT4gb3Vycy5oYXMobGF5ZXIpIH0pO1xuICAgIHJldHVybiBoaXQgPyAob3Vycy5nZXQoaGl0LmxheWVyKSA/PyBudWxsKSA6IG51bGw7XG4gIH1cblxuICAvKiogVGhlIG1lc2hlcyBzaG93bi4gKi9cbiAgZ2V0IHNob3duKCk6IFJlZ2lvbk1lc2gzRFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMubGF5ZXJzLnZhbHVlcygpXS5tYXAoKGUpID0+IGUubWVzaCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIFsuLi50aGlzLmxheWVyc10pIHRoaXMucmVtb3ZlKGtleSwgZS5sYXllcik7XG4gICAgdGhpcy53YW50ZWQgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9sdW1lIHRoZSBzdXJmYWNlcyBzYXQgaW4gaXMgZ29uZSAob3Igbm8gbG9uZ2VyIHRoZWlycyk6IHRha2UgZXZlcnkgc3VyZmFjZSBkb3duLCBrZWVwaW5nXG4gICAqIHRoZSBtZXNoZXMgd2FudGVkLCBzbyB0aGV5IGNvbWUgYmFjayB3aGVuIGEgZnJhbWUgaXMgc2V0IGFnYWluLlxuICAgKi9cbiAgY2xlYXJGcmFtZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZyYW1lID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIFsuLi50aGlzLmxheWVyc10pIHRoaXMucmVtb3ZlKGtleSwgZS5sYXllcik7XG4gICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jKCk6IHZvaWQge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwKHRoaXMud2FudGVkLm1hcCgobSkgPT4gW20ua2V5LCBtXSkpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgWy4uLnRoaXMubGF5ZXJzXSkge1xuICAgICAgY29uc3Qgd2FudCA9IGtlZXAuZ2V0KGtleSk7XG4gICAgICBpZiAoIXdhbnQgfHwgIXdhbnQuZmFjZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGtleSwgZS5sYXllcik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gUmVidWlsdCBvciByZWNvbG91cmVkOiB0aGUgc2FtZSBzdXJmYWNlLCB1cGRhdGVkIGluIHBsYWNlLlxuICAgICAgaWYgKHdhbnQudmVydGljZXMgIT09IGUubWVzaC52ZXJ0aWNlcyAmJiB0aGlzLmZyYW1lKSB7XG4gICAgICAgIGUubGF5ZXIuc2V0RGF0YSh0b1dvcmxkKHdhbnQudmVydGljZXMsIGJhc2VGcmFtZSh0aGlzLmZyYW1lKSksIHdhbnQuZmFjZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHdhbnQuY29sb3IgIT09IGUubWVzaC5jb2xvcikgZS5sYXllci5jb2xvciA9IHdhbnQuY29sb3I7XG4gICAgICBlLm1lc2ggPSB3YW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmFtZSkge1xuICAgICAgZm9yIChjb25zdCBtZXNoIG9mIHRoaXMud2FudGVkKSBpZiAoIXRoaXMubGF5ZXJzLmhhcyhtZXNoLmtleSkgJiYgbWVzaC5mYWNlcy5sZW5ndGgpIHRoaXMuYWRkKG1lc2gpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZChtZXNoOiBSZWdpb25NZXNoM0QpOiB2b2lkIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUgYXMgVm9sdW1lRnJhbWU7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLnZpZXdlci5hZGRTdXJmYWNlKHRvV29ybGQobWVzaC52ZXJ0aWNlcywgYmFzZUZyYW1lKGZyYW1lKSksIG1lc2guZmFjZXMsIHVuZGVmaW5lZCwge1xuICAgICAgbmFtZTogYHJlZ2lvbiAke21lc2gua2V5fWAsXG4gICAgICBzY2FsZTNkOiB0aGlzLnNjYWxlM2QoKSxcbiAgICAgIGNvbG9yOiBtZXNoLmNvbG9yLFxuICAgICAgb3BhY2l0eTogdGhpcy5vcGFjaXR5T2YobWVzaC5rZXkpLFxuICAgICAgYmxlbmRpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBmaXQ6ICduZXZlcicsXG4gICAgfSk7XG4gICAgbGF5ZXIudmlzaWJsZSA9ICF0aGlzLmhpZGRlbi5oYXMobWVzaC5rZXkpO1xuICAgIHRoaXMubGF5ZXJzLnNldChtZXNoLmtleSwgeyBtZXNoLCBsYXllciB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BhY2l0eU9mKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0ZWQuc2l6ZSkgcmV0dXJuIFJFR0lPTl9NRVNIX09QQUNJVFk7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWQuaGFzKGtleSkgPyBSRUdJT05fTUVTSF9ISUdITElHSFRfT1BBQ0lUWSA6IFJFR0lPTl9NRVNIX0RJTU1FRF9PUEFDSVRZO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmUoa2V5OiBzdHJpbmcsIGxheWVyOiBTdXJmYWNlTGF5ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB0aGlzLmxheWVycy5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG4vKiogYGZyYW1lYCB3aXRob3V0IGl0cyBaIHN0cmV0Y2g6IHRoZSBib3ggdGhlIHN1cmZhY2VzJyBnZW9tZXRyeSBpcyBwbGFjZWQgaW4uICovXG5mdW5jdGlvbiBiYXNlRnJhbWUoZnJhbWU6IFZvbHVtZUZyYW1lKTogVm9sdW1lRnJhbWUge1xuICBjb25zdCBzID0gZnJhbWUuelNjYWxlICYmIGZyYW1lLnpTY2FsZSA+IDAgPyBmcmFtZS56U2NhbGUgOiAxO1xuICByZXR1cm4gcyA9PT0gMSA/IGZyYW1lIDogeyBzaXplOiBmcmFtZS5zaXplLCB3b3JsZDogW2ZyYW1lLndvcmxkWzBdLCBmcmFtZS53b3JsZFsxXSwgZnJhbWUud29ybGRbMl0gLyBzXSB9O1xufVxuXG4vKipcbiAqIEltYWdlIHB4IC8gc2xpY2UgY29vcmRpbmF0ZXMg4oaSIHRoZSB2b2x1bWUncyBjZW50cmVkIHdvcmxkIGJveDogcGl4ZWwgeCBvZiBhIGB3YC13aWRlIGltYWdlXG4gKiBzcGFucyB0aGUgYm94J3Mgd2lkdGgsIHNsaWNlIGsgc2l0cyBhdCB0aGUgbWlkZGxlIG9mIGl0cyBzaGFyZSBvZiB0aGUgYm94J3MgZGVwdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dvcmxkKHZlcnRpY2VzOiBGbG9hdDMyQXJyYXksIGZyYW1lOiBWb2x1bWVGcmFtZSk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IFt3LCBoLCBkXSA9IGZyYW1lLnNpemU7XG4gIGNvbnN0IFt3dywgd2gsIHdkXSA9IGZyYW1lLndvcmxkO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICBvdXRbaV0gPSAodmVydGljZXNbaV0gLyB3IC0gMC41KSAqIHd3O1xuICAgIG91dFtpICsgMV0gPSAodmVydGljZXNbaSArIDFdIC8gaCAtIDAuNSkgKiB3aDtcbiAgICBvdXRbaSArIDJdID0gKCh2ZXJ0aWNlc1tpICsgMl0gKyAwLjUpIC8gZCAtIDAuNSkgKiB3ZDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQStCLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUdwRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBaUIzQixtREFBbUQ7QUFDbkQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLHdGQUF3RjtBQUN4RixNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxHQUFHLENBQUM7QUFDakQsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQztBQUMvQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxDQUFDO0FBRTlDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBYzdCOzs7OztPQUtHO0lBQ0gsWUFDbUIsTUFBYyxFQUNkLE1BQXFCO1FBRHJCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBckJ2QixXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXVELENBQUM7UUFDakYsZ0JBQVcsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM3QyxXQUFNLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEQsMkRBQTJEO1FBQ25ELFVBQUssR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMvQyxtRUFBbUU7UUFDM0QsV0FBTSxHQUE0QixFQUFFLENBQUM7UUFDckMsVUFBSyxHQUF1QixJQUFJLENBQUM7UUFFekMsc0VBQXNFO1FBQ3JELFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBcUUsQ0FBQztRQUNoRyxVQUFLLEdBQUcsQ0FBQyxDQUFDO0lBV2YsQ0FBQztJQUVKLG9FQUFvRTtJQUNwRSxHQUFHLENBQUMsTUFBK0I7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxLQUFrQjtRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsc0RBQXNEO0lBQzlDLE9BQU87UUFDYixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUM3QixPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLFlBQVksQ0FBQyxJQUFzQjtRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxJQUFzQjtRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ3ZGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQseUZBQXlGO0lBQ3pGLFNBQVMsQ0FBQyxJQUFzQjtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQscUZBQXFGO0lBQ3JGLE1BQU0sQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEQsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFJLEtBQUs7UUFDUCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELEtBQUs7UUFDSCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sSUFBSTtRQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixTQUFTO1lBQ1gsQ0FBQztZQUNELDZEQUE2RDtZQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2xELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM1RCxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNkLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLElBQWtCO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ25CLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDL0MsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUMvRSxNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDbkMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssS0FBSyxLQUFLO2dCQUFFLE9BQU87WUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzRCxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUFFLE9BQU87WUFDdEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM5QixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssS0FBSyxLQUFLO2dCQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvRSxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsR0FBRyw0QkFBNEIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx3RkFBd0Y7SUFDaEYsS0FBSyxDQUFDLElBQWtCLEVBQUUsS0FBbUI7UUFDbkQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDTixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVPLEdBQUcsQ0FBQyxJQUFrQixFQUFFLEtBQW1CO1FBQ2pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUNqRSxJQUFJLEVBQUUsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2pDLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLEdBQUcsRUFBRSxPQUFPO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLFNBQVMsQ0FBQyxHQUFXO1FBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDO1FBQzVHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7WUFBRSxPQUFPLG1CQUFtQixDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztJQUMvRixDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVcsRUFBRSxLQUFtQjtRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQsa0ZBQWtGO0FBQ2xGLFNBQVMsU0FBUyxDQUFDLEtBQWtCO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDMUIsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtRQUNoQixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2xELENBQUM7QUFDSixDQUFDO0FBRUQsNERBQTREO0FBQzVELFNBQVMsU0FBUyxDQUFDLENBQWMsRUFBRSxDQUFjO0lBQy9DLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNuQixPQUFPLENBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdXJmYWNlTGF5ZXIsIFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IFBsYW5lUGxhY2VtZW50LCBWb2x1bWVGcmFtZSwgc2xpY2VaLCB0b1dvcmxkIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvcGxhY2UnO1xuXG5leHBvcnQgdHlwZSB7IFBsYW5lUGxhY2VtZW50LCBWb2x1bWVGcmFtZSB9O1xuZXhwb3J0IHsgc2xpY2VaLCB0b1dvcmxkIH07XG5cbi8qKiBBIHJlZ2lvbidzIDNEIHJlY29uc3RydWN0aW9uIHRvIHNob3cgaW4gdGhlIHZvbHVtZTogYSBtZXNoIGluIGltYWdlIHB4ICh4LCB5KSBhbmQgc2xpY2VzICh6KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uTWVzaDNEIHtcbiAgLyoqIElkZW50aXR5IChhIGNsYXNzIG5hbWUpOiBhIG1lc2ggd2l0aCB0aGUgc2FtZSBrZXkgYW5kIGFycmF5cyBpcyBrZXB0LCBub3QgcmVidWlsdC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBgI3JyZ2diYmAuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKiBXaGF0IGhvdmVyaW5nIGl0IHNob3dzIChcIkhQRiDCtyBIaXBwb2NhbXBhbCBmb3JtYXRpb25cIik7IGRlZmF1bHQ6IHRoZSBrZXkuICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICB2ZXJ0aWNlczogRmxvYXQzMkFycmF5O1xuICBmYWNlczogVWludDMyQXJyYXk7XG59XG5cbi8qKiBQbGFjZXMgYSBtZXNoJ3MgdmVydGljZXMgKGltYWdlIHB4LCBzbGljZXMpIGluIGEgM0QgdmlldydzIHdvcmxkLCBvZmYgdGhlIG1haW4gdGhyZWFkLiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uUGxhY2VyID0gKHZlcnRpY2VzOiBGbG9hdDMyQXJyYXksIGZyYW1lOiBWb2x1bWVGcmFtZSkgPT4gUHJvbWlzZTxGbG9hdDMyQXJyYXk+O1xuXG4vKiogT3BhY2l0eSBvZiBhIHJlZ2lvbidzIHN1cmZhY2UgaW4gdGhlIHZvbHVtZS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fTUVTSF9PUEFDSVRZID0gMC41NTtcbi8qKiBXaGlsZSBzb21lIHN1cmZhY2VzIGFyZSBoaWdobGlnaHRlZDogdGhlaXJzIChuZWFyIG9wYXF1ZSwgc28gdGhlaXIgc2hhcGUgcmVhZHMpIOKApiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9NRVNIX0hJR0hMSUdIVF9PUEFDSVRZID0gMC45O1xuLyoqIOKApiBhbmQgdGhlIG90aGVycycgKGdob3N0ZWQ6IHN0aWxsIHRoZXJlIGZvciBjb250ZXh0LCBub3QgaW4gdGhlIHdheSkuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX01FU0hfRElNTUVEX09QQUNJVFkgPSAwLjEyO1xuLyoqXG4gKiBBIHNlbGVjdGlvbidzIHN1cmZhY2VzIHdoaWxlIHRoZSBvdGhlcnMgYXJlIGdob3N0ZWQ6IG9wYXF1ZSwgc28gdGhleSBhcmUgZHJhd24gZmlyc3QgYW5kIHdyaXRlXG4gKiBkZXB0aCwgYW5kIHRoZSBnaG9zdGVkIHN1cmZhY2VzIGluIGZyb250IG9mIHRoZW0gYXJlIGJsZW5kZWQgb3ZlciB0aGVtIHJhdGhlciB0aGFuIGhpZGluZyB0aGVtXG4gKiAoYSB0cmFuc2x1Y2VudCBzdXJmYWNlIGRyYXdzIG9ubHkgaXRzIG93biBuZWFyZXN0IGZhY2VzLCBhbmQgaXMgZHJhd24gYWZ0ZXIgdGhlIG9wYXF1ZSBvbmVzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9NRVNIX1NFTEVDVEVEX09QQUNJVFkgPSAxO1xuXG4vKipcbiAqIFRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHNob3duIGluIGEgdm9sdW1lIHZpZXc6IG9uZSB0cmFuc2x1Y2VudCBzdXJmYWNlIHBlciByZWdpb24sIGluIGl0c1xuICogY29sb3VyLCBwbGFjZWQgaW4gdGhlIHZvbHVtZSdzIHdvcmxkIGJveCAocGl4ZWwgeCwgeSBhbmQgc2xpY2UgeiBtYXBwZWQgb250byBpdCB0aGUgd2F5IHRoZVxuICogdm9sdW1lIG1hcHMgaXRzIHZveGVscykuIFRoZSBib3gncyBaIHN0cmV0Y2ggaXMgdGhlIHN1cmZhY2VzJyBgc2NhbGUzZGAgKGEgdW5pZm9ybSksIHNvIGEgc3RyZXRjaFxuICogYWxvbmUgY2hhbmdlcyBubyBnZW9tZXRyeTsgYSBuZXcgYm94IHJlLXBsYWNlcyB0aGVtLiBBIHN1cmZhY2UgaXMgdXBkYXRlZCBpbiBwbGFjZSAoYHNldERhdGFgLFxuICogYGNvbG9yYCwgYHNjYWxlM2RgKSByYXRoZXIgdGhhbiBhZGRlZCBhZ2FpbiwgYW5kIHBpY2tlZCBieSBuYXBhcmktanMgKGBwaWNrU3VyZmFjZWApLCB3aGljaFxuICogcGlja3MgaXQgd2hlcmUgaXQgaXMgZHJhd24uXG4gKlxuICogSGlnaGxpZ2h0aW5nIGlzIGZvY3VzICsgY29udGV4dDogdGhlIGhpZ2hsaWdodGVkIHN1cmZhY2VzIHR1cm4gbmVhciBvcGFxdWUgYW5kIHRoZSBvdGhlcnMgZmFkZVxuICogdG8gYSBnaG9zdCwgc28gdGhlIHNlbGVjdGlvbiBzdGFuZHMgb3V0IHdoaWxlIHN0YXlpbmcgaW4gcGxhY2UgYW1vbmcgaXRzIG5laWdoYm91cnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWb2x1bWVSZWdpb25NZXNoZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IGxheWVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IFJlZ2lvbk1lc2gzRDsgbGF5ZXI6IFN1cmZhY2VMYXllciB9PigpO1xuICBwcml2YXRlIGhpZ2hsaWdodGVkOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGhpZGRlbjogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIFN1cmZhY2VzIGZhZGVkOiBub25lIG9mIHdoYXQgaXMgc2VsZWN0ZWQgaXMgaW4gdGhlbS4gKi9cbiAgcHJpdmF0ZSBtdXRlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIFRoZSBtZXNoZXMgdG8gc2hvdyAoa2VwdCB3aGlsZSB0aGUgdm9sdW1lIGhhcyBubyBmcmFtZSB5ZXQpLiAqL1xuICBwcml2YXRlIHdhbnRlZDogcmVhZG9ubHkgUmVnaW9uTWVzaDNEW10gPSBbXTtcbiAgcHJpdmF0ZSBmcmFtZTogVm9sdW1lRnJhbWUgfCBudWxsID0gbnVsbDtcblxuICAvKiogVGhlIHBsYWNlbWVudHMgaW4gZmxpZ2h0LCBieSBrZXk6IHRoZSBtZXNoIGFuZCBib3ggZWFjaCBpcyBmb3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhY2luZyA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IFJlZ2lvbk1lc2gzRDsgZnJhbWU6IFZvbHVtZUZyYW1lOyB0b2tlbjogbnVtYmVyIH0+KCk7XG4gIHByaXZhdGUgdG9rZW4gPSAwO1xuXG4gIC8qKlxuICAgKiBgcGxhY2VyYCwgd2hlbiBnaXZlbiwgcGxhY2VzIGEgbWVzaCdzIHZlcnRpY2VzIGluIHRoZSB3b3JsZCBvZmYgdGhlIG1haW4gdGhyZWFkIChhIHdvcmtlciwgc2VlXG4gICAqIGBwbGFjZUluV29ya2VyYCk6IGEgY2xhc3MncyBzdXJmYWNlIGhhcyBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2YgdmVydGljZXMsIGFuZCBwbGFjaW5nIGV2ZXJ5XG4gICAqIG9uZSBpbiBhIGxvb3AgaGVyZSBoZWxkIHRoZSBVSSBmb3Igc2Vjb25kcy4gRWFjaCBzdXJmYWNlIHRoZW4gY29tZXMgdXAgYXMgaXRzIHBsYWNlbWVudCBsYW5kcyxcbiAgICogdGhlIG9uZSBpdCByZXBsYWNlcyBrZXB0IHVudGlsIHRoZW4uIFdpdGhvdXQgb25lLCB0aGV5IGFyZSBwbGFjZWQgYXQgb25jZSAodGhlIHRlc3RzKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld2VyOiBWaWV3ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwbGFjZXI/OiBSZWdpb25QbGFjZXIsXG4gICkge31cblxuICAvKiogU2hvdyBleGFjdGx5IGBtZXNoZXNgIChhZGRpbmcsIGtlZXBpbmcgb3IgcmVtb3Zpbmcgc3VyZmFjZXMpLiAqL1xuICBzZXQobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMud2FudGVkID0gbWVzaGVzO1xuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvbGxvdyB0aGUgdm9sdW1lJ3MgZnJhbWUuIEEgbmV3IGJveCAoaXQgb3BlbmVkLCBhbm90aGVyIHZvbHVtZSkgcmUtcGxhY2VzIGV2ZXJ5IHN1cmZhY2U7IGEgWlxuICAgKiBzdHJldGNoIG9mIHRoZSBzYW1lIGJveCBvbmx5IHNldHMgdGhlaXIgYHNjYWxlM2RgLCBzbyBub3RoaW5nIGlzIHJlLXVwbG9hZGVkIHdoaWxlIGRyYWdnaW5nLlxuICAgKi9cbiAgc2V0RnJhbWUoZnJhbWU6IFZvbHVtZUZyYW1lKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VkID0gdGhpcy5mcmFtZSA/IGJhc2VGcmFtZSh0aGlzLmZyYW1lKSA6IG51bGw7XG4gICAgY29uc3QgbmV4dCA9IGJhc2VGcmFtZShmcmFtZSk7XG4gICAgY29uc3Qgc2FtZUJveCA9ICEhcGxhY2VkICYmIHNhbWVGcmFtZShwbGFjZWQsIG5leHQpO1xuICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGUzZCgpO1xuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmxheWVycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFzYW1lQm94KSB0aGlzLnBsYWNlKGUubWVzaCk7XG4gICAgICBlLmxheWVyLnNjYWxlM2QgPSBzY2FsZTtcbiAgICB9XG4gICAgdGhpcy5zeW5jKCk7XG4gIH1cblxuICAvKiogVGhlIHN1cmZhY2VzJyBHUFUgc2NhbGU6IHRoZSBmcmFtZSdzIFogc3RyZXRjaC4gKi9cbiAgcHJpdmF0ZSBzY2FsZTNkKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgcyA9IHRoaXMuZnJhbWU/LnpTY2FsZTtcbiAgICByZXR1cm4gWzEsIDEsIHMgJiYgcyA+IDAgPyBzIDogMV07XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBrZXlzIChub25lOiBldmVyeSBzdXJmYWNlIGFzIHVzdWFsKS4gKi9cbiAgc2V0SGlnaGxpZ2h0KGtleXM6IEl0ZXJhYmxlPHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIHRoaXMubGF5ZXJzKSBlLmxheWVyLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHlPZihrZXkpO1xuICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWRlIHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBrZXlzLCBhcyBhIHBpY2tlZCByZWdpb24gZmFkZXMgdGhlIG90aGVycyAobm9uZTogZWFjaCBhcyB1c3VhbCk6XG4gICAqIHdpdGggYSBzZWxlY3Rpb24sIHRoZSByZWdpb25zIG5vbmUgb2YgaXQgaXMgaW4gZmFkZSBhbmQgdGhvc2UgaXQgaXMgaW4gY29tZSBmb3J3YXJkLCBlYWNoXG4gICAqIGtlZXBpbmcgaXRzIGNvbG91ci5cbiAgICovXG4gIHNldE11dGVkKGtleXM6IEl0ZXJhYmxlPHN0cmluZz4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChrZXlzKTtcbiAgICBpZiAobmV4dC5zaXplID09PSB0aGlzLm11dGVkLnNpemUgJiYgWy4uLm5leHRdLmV2ZXJ5KChrKSA9PiB0aGlzLm11dGVkLmhhcyhrKSkpIHJldHVybjtcbiAgICB0aGlzLm11dGVkID0gbmV4dDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIHRoaXMubGF5ZXJzKSBlLmxheWVyLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHlPZihrZXkpO1xuICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBIaWRlIHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBrZXlzICh0aGV5IGFyZSBrZXB0LCBzbyBzaG93aW5nIHRoZW0gYWdhaW4gaXMgaW5zdGFudCkuICovXG4gIHNldEhpZGRlbihrZXlzOiBJdGVyYWJsZTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5oaWRkZW4gPSBuZXcgU2V0KGtleXMpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgdGhpcy5sYXllcnMpIGUubGF5ZXIudmlzaWJsZSA9ICF0aGlzLmhpZGRlbi5oYXMoa2V5KTtcbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogVGhlIGZyb250LW1vc3Qgc3VyZmFjZSB1bmRlciBzY3JlZW4gcG9pbnQgKGB4YCwgYHlgKSAoY2FudmFzIENTUyBweCksIG9yIG51bGwuICovXG4gIHBpY2tBdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IFJlZ2lvbk1lc2gzRCB8IG51bGwge1xuICAgIGlmICghdGhpcy5sYXllcnMuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgb3VycyA9IG5ldyBNYXAoWy4uLnRoaXMubGF5ZXJzLnZhbHVlcygpXS5tYXAoKGUpID0+IFtlLmxheWVyLCBlLm1lc2hdKSk7XG4gICAgY29uc3QgaGl0ID0gdGhpcy52aWV3ZXIucGlja1N1cmZhY2UoeCwgeSwgeyBwaWNrYWJsZTogKGxheWVyKSA9PiBvdXJzLmhhcyhsYXllcikgfSk7XG4gICAgcmV0dXJuIGhpdCA/IChvdXJzLmdldChoaXQubGF5ZXIpID8/IG51bGwpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgbWVzaGVzIHNob3duLiAqL1xuICBnZXQgc2hvd24oKTogUmVnaW9uTWVzaDNEW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5sYXllcnMudmFsdWVzKCldLm1hcCgoZSkgPT4gZS5tZXNoKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgWy4uLnRoaXMubGF5ZXJzXSkgdGhpcy5yZW1vdmUoa2V5LCBlLmxheWVyKTtcbiAgICB0aGlzLndhbnRlZCA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2x1bWUgdGhlIHN1cmZhY2VzIHNhdCBpbiBpcyBnb25lIChvciBubyBsb25nZXIgdGhlaXJzKTogdGFrZSBldmVyeSBzdXJmYWNlIGRvd24sIGtlZXBpbmdcbiAgICogdGhlIG1lc2hlcyB3YW50ZWQsIHNvIHRoZXkgY29tZSBiYWNrIHdoZW4gYSBmcmFtZSBpcyBzZXQgYWdhaW4uXG4gICAqL1xuICBjbGVhckZyYW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZnJhbWUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgWy4uLnRoaXMubGF5ZXJzXSkgdGhpcy5yZW1vdmUoa2V5LCBlLmxheWVyKTtcbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIHN5bmMoKTogdm9pZCB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXAodGhpcy53YW50ZWQubWFwKChtKSA9PiBbbS5rZXksIG1dKSk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlXSBvZiBbLi4udGhpcy5sYXllcnNdKSB7XG4gICAgICBjb25zdCB3YW50ID0ga2VlcC5nZXQoa2V5KTtcbiAgICAgIGlmICghd2FudCB8fCAhd2FudC5mYWNlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoa2V5LCBlLmxheWVyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBSZWJ1aWx0IG9yIHJlY29sb3VyZWQ6IHRoZSBzYW1lIHN1cmZhY2UsIHVwZGF0ZWQgaW4gcGxhY2UuXG4gICAgICBjb25zdCByZWJ1aWx0ID0gd2FudC52ZXJ0aWNlcyAhPT0gZS5tZXNoLnZlcnRpY2VzO1xuICAgICAgaWYgKHdhbnQuY29sb3IgIT09IGUubWVzaC5jb2xvcikgZS5sYXllci5jb2xvciA9IHdhbnQuY29sb3I7XG4gICAgICBlLm1lc2ggPSB3YW50O1xuICAgICAgaWYgKHJlYnVpbHQgJiYgdGhpcy5mcmFtZSkgdGhpcy5wbGFjZSh3YW50KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJhbWUpIHtcbiAgICAgIGZvciAoY29uc3QgbWVzaCBvZiB0aGlzLndhbnRlZCkgaWYgKCF0aGlzLmxheWVycy5oYXMobWVzaC5rZXkpICYmIG1lc2guZmFjZXMubGVuZ3RoKSB0aGlzLnBsYWNlKG1lc2gpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxhY2UgYG1lc2hgIGluIHRoZSBjdXJyZW50IGJveCwgYWRkaW5nIGl0cyBzdXJmYWNlIG9yIHVwZGF0aW5nIGl0OiBhdCBvbmNlLCBvciB0aHJvdWdoIHRoZVxuICAgKiBwbGFjZXIsIGl0cyByZXN1bHQga2VwdCBvbmx5IGlmIHRoZSBtZXNoIGFuZCB0aGUgYm94IGFyZSBzdGlsbCB0aGUgb25lcyB3YW50ZWQuIEEgcGxhY2VtZW50XG4gICAqIGFscmVhZHkgaW4gZmxpZ2h0IGZvciB0aGUgc2FtZSBtZXNoIGFuZCBib3ggaXMgbm90IGFza2VkIGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGFjZShtZXNoOiBSZWdpb25NZXNoM0QpOiB2b2lkIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWU7XG4gICAgaWYgKCFmcmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlRnJhbWUoZnJhbWUpO1xuICAgIGlmICghdGhpcy5wbGFjZXIpIHtcbiAgICAgIHRoaXMuYXBwbHkobWVzaCwgdG9Xb3JsZChtZXNoLnZlcnRpY2VzLCBiYXNlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBsYWNpbmcuZ2V0KG1lc2gua2V5KTtcbiAgICBpZiAocGVuZGluZyAmJiBwZW5kaW5nLm1lc2ggPT09IG1lc2ggJiYgc2FtZUZyYW1lKHBlbmRpbmcuZnJhbWUsIGJhc2UpKSByZXR1cm47XG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMudG9rZW47XG4gICAgdGhpcy5wbGFjaW5nLnNldChtZXNoLmtleSwgeyBtZXNoLCBmcmFtZTogYmFzZSwgdG9rZW4gfSk7XG4gICAgdGhpcy5wbGFjZXIobWVzaC52ZXJ0aWNlcywgYmFzZSkudGhlbihcbiAgICAgICh3b3JsZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wbGFjaW5nLmdldChtZXNoLmtleSk/LnRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICB0aGlzLnBsYWNpbmcuZGVsZXRlKG1lc2gua2V5KTtcbiAgICAgICAgY29uc3Qgd2FudGVkID0gdGhpcy53YW50ZWQuZmluZCgobSkgPT4gbS5rZXkgPT09IG1lc2gua2V5KTtcbiAgICAgICAgaWYgKHdhbnRlZCAhPT0gbWVzaCB8fCAhdGhpcy5mcmFtZSB8fCAhc2FtZUZyYW1lKGJhc2VGcmFtZSh0aGlzLmZyYW1lKSwgYmFzZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5hcHBseShtZXNoLCB3b3JsZCk7XG4gICAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBsYWNpbmcuZ2V0KG1lc2gua2V5KT8udG9rZW4gPT09IHRva2VuKSB0aGlzLnBsYWNpbmcuZGVsZXRlKG1lc2gua2V5KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSByZWdpb24gJHttZXNoLmtleX0gY291bGQgbm90IGJlIHBsYWNlZCBpbiAzRGAsIGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKiogYG1lc2hgJ3Mgc3VyZmFjZSB3aXRoIGl0cyB2ZXJ0aWNlcyBwbGFjZWQgYXQgYHdvcmxkYDogdXBkYXRlZCBpbiBwbGFjZSwgb3IgYWRkZWQuICovXG4gIHByaXZhdGUgYXBwbHkobWVzaDogUmVnaW9uTWVzaDNELCB3b3JsZDogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3QgZSA9IHRoaXMubGF5ZXJzLmdldChtZXNoLmtleSk7XG4gICAgaWYgKGUpIHtcbiAgICAgIGUubGF5ZXIuc2V0RGF0YSh3b3JsZCwgbWVzaC5mYWNlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWRkKG1lc2gsIHdvcmxkKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkKG1lc2g6IFJlZ2lvbk1lc2gzRCwgd29ybGQ6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy52aWV3ZXIuYWRkU3VyZmFjZSh3b3JsZCwgbWVzaC5mYWNlcywgdW5kZWZpbmVkLCB7XG4gICAgICBuYW1lOiBgcmVnaW9uICR7bWVzaC5rZXl9YCxcbiAgICAgIHNjYWxlM2Q6IHRoaXMuc2NhbGUzZCgpLFxuICAgICAgY29sb3I6IG1lc2guY29sb3IsXG4gICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHlPZihtZXNoLmtleSksXG4gICAgICBibGVuZGluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgIGZpdDogJ25ldmVyJyxcbiAgICB9KTtcbiAgICBsYXllci52aXNpYmxlID0gIXRoaXMuaGlkZGVuLmhhcyhtZXNoLmtleSk7XG4gICAgdGhpcy5sYXllcnMuc2V0KG1lc2gua2V5LCB7IG1lc2gsIGxheWVyIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGFjaXR5T2Yoa2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm11dGVkLnNpemUpIHJldHVybiB0aGlzLm11dGVkLmhhcyhrZXkpID8gUkVHSU9OX01FU0hfRElNTUVEX09QQUNJVFkgOiBSRUdJT05fTUVTSF9TRUxFQ1RFRF9PUEFDSVRZO1xuICAgIGlmICghdGhpcy5oaWdobGlnaHRlZC5zaXplKSByZXR1cm4gUkVHSU9OX01FU0hfT1BBQ0lUWTtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRlZC5oYXMoa2V5KSA/IFJFR0lPTl9NRVNIX1NFTEVDVEVEX09QQUNJVFkgOiBSRUdJT05fTUVTSF9ESU1NRURfT1BBQ0lUWTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlKGtleTogc3RyaW5nLCBsYXllcjogU3VyZmFjZUxheWVyKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5sYXllcnMuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5wbGFjaW5nLmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbi8qKiBgZnJhbWVgIHdpdGhvdXQgaXRzIFogc3RyZXRjaDogdGhlIGJveCB0aGUgc3VyZmFjZXMnIGdlb21ldHJ5IGlzIHBsYWNlZCBpbi4gKi9cbmZ1bmN0aW9uIGJhc2VGcmFtZShmcmFtZTogVm9sdW1lRnJhbWUpOiBWb2x1bWVGcmFtZSB7XG4gIGNvbnN0IHMgPSBmcmFtZS56U2NhbGUgJiYgZnJhbWUuelNjYWxlID4gMCA/IGZyYW1lLnpTY2FsZSA6IDE7XG4gIGlmIChzID09PSAxKSByZXR1cm4gZnJhbWU7XG4gIHJldHVybiB7XG4gICAgc2l6ZTogZnJhbWUuc2l6ZSxcbiAgICB3b3JsZDogW2ZyYW1lLndvcmxkWzBdLCBmcmFtZS53b3JsZFsxXSwgZnJhbWUud29ybGRbMl0gLyBzXSxcbiAgICAuLi4oZnJhbWUucGxhbmVzID8geyBwbGFuZXM6IGZyYW1lLnBsYW5lcyB9IDoge30pLFxuICB9O1xufVxuXG4vKiogV2hldGhlciB0d28gdW5zdHJldGNoZWQgZnJhbWVzIHBsYWNlIGEgc3VyZmFjZSBhbGlrZS4gKi9cbmZ1bmN0aW9uIHNhbWVGcmFtZShhOiBWb2x1bWVGcmFtZSwgYjogVm9sdW1lRnJhbWUpOiBib29sZWFuIHtcbiAgY29uc3QgbmVhciA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gTWF0aC5hYnMoeCAtIHkpIDw9IDFlLTkgKiBNYXRoLm1heCgxLCBNYXRoLmFicyh4KSk7XG4gIGlmIChhLnBsYW5lcyB8fCBiLnBsYW5lcykge1xuICAgIGNvbnN0IHAgPSBhLnBsYW5lcztcbiAgICBjb25zdCBxID0gYi5wbGFuZXM7XG4gICAgcmV0dXJuIChcbiAgICAgICEhcCAmJlxuICAgICAgISFxICYmXG4gICAgICBwLnoubGVuZ3RoID09PSBxLnoubGVuZ3RoICYmXG4gICAgICBwLnouZXZlcnkoKHYsIGkpID0+IG5lYXIodiwgcS56W2ldKSkgJiZcbiAgICAgIHAuc2NhbGUuZXZlcnkoKHYsIGkpID0+IG5lYXIodiwgcS5zY2FsZVtpXSkpICYmXG4gICAgICBwLm9mZnNldC5ldmVyeSgodiwgaSkgPT4gbmVhcih2LCBxLm9mZnNldFtpXSkpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYS5zaXplLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBiLnNpemVbaV0pICYmIGEud29ybGQuZXZlcnkoKHYsIGkpID0+IG5lYXIodiwgYi53b3JsZFtpXSkpO1xufVxuIl19
|