@jax-data-science/sci-image-visualizer 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +2 -1
  2. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  3. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  4. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +10 -8
  5. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +226 -39
  6. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +269 -0
  7. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  8. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +6 -7
  9. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -1
  10. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +33 -8
  11. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +6 -2
  12. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +10 -6
  13. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +9 -5
  14. package/esm2022/lib/spatial/spatial-controls.facade.mjs +7 -4
  15. package/esm2022/lib/spatial/spatial-encoding.mjs +18 -1
  16. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  17. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +7 -3
  18. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  19. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +67 -19
  20. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +61 -8
  21. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +3 -3
  22. package/esm2022/lib/toolbar/toolbar.component.mjs +13 -4
  23. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +7 -7
  24. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs} +795 -165
  25. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +1 -0
  26. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs} +2 -2
  27. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map} +1 -1
  28. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  29. package/lib/contracts/display-types.d.ts +9 -2
  30. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  31. package/lib/implementations/napari-js/napari-scene.d.ts +2 -0
  32. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +3 -3
  33. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +82 -9
  34. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +62 -0
  35. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  36. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +5 -6
  37. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +16 -3
  38. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +1 -1
  39. package/lib/spatial/spatial-encoding.d.ts +10 -0
  40. package/lib/spatial-controls/spatial-controls.component.d.ts +2 -0
  41. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  42. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +25 -0
  43. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +14 -3
  44. package/lib/toolbar/toolbar.component.d.ts +6 -0
  45. package/lib/toolbar/view-controls/view-controls.component.d.ts +3 -3
  46. package/package.json +2 -2
  47. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs.map +0 -1
@@ -7,8 +7,10 @@ export const REGION_MESH_DIMMED_OPACITY = 0.12;
7
7
  /**
8
8
  * The region reconstructions shown in a volume view: one translucent surface per region, in its
9
9
  * colour, placed in the volume's world box (pixel x, y and slice z mapped onto it the way the
10
- * volume maps its voxels) and re-placed when the volume's Z is stretched. A surface is updated in
11
- * place (`setData`, `color`) rather than added again, and picked by napari-js (`pickSurface`).
10
+ * volume maps its voxels). The box's Z stretch is the surfaces' `scale3d` (a uniform), so a stretch
11
+ * alone changes no geometry; a new box re-places them. A surface is updated in place (`setData`,
12
+ * `color`, `scale3d`) rather than added again, and picked by napari-js (`pickSurface`), which
13
+ * picks it where it is drawn.
12
14
  *
13
15
  * Highlighting is focus + context: the highlighted surfaces turn near opaque and the others fade
14
16
  * to a ghost, so the selection stands out while staying in place among its neighbours.
@@ -28,13 +30,30 @@ export class VolumeRegionMeshes {
28
30
  this.wanted = meshes;
29
31
  this.sync();
30
32
  }
31
- /** Follow the volume's frame (it opened, or its Z was stretched): re-place every surface. */
33
+ /**
34
+ * Follow the volume's frame. A new box (it opened, another volume) re-places every surface; a Z
35
+ * stretch of the same box only sets their `scale3d`, so nothing is re-uploaded while dragging.
36
+ */
32
37
  setFrame(frame) {
38
+ const placed = this.frame ? baseFrame(this.frame) : null;
39
+ 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)));
33
43
  this.frame = frame;
34
- for (const e of this.layers.values())
35
- e.layer.setData(toWorld(e.mesh.vertices, frame), e.mesh.faces);
44
+ const scale = this.scale3d();
45
+ for (const e of this.layers.values()) {
46
+ if (!sameBox)
47
+ e.layer.setData(toWorld(e.mesh.vertices, next), e.mesh.faces);
48
+ e.layer.scale3d = scale;
49
+ }
36
50
  this.sync();
37
51
  }
52
+ /** The surfaces' GPU scale: the frame's Z stretch. */
53
+ scale3d() {
54
+ const s = this.frame?.zScale;
55
+ return [1, 1, s && s > 0 ? s : 1];
56
+ }
38
57
  /** Highlight the surfaces of these keys (none: every surface as usual). */
39
58
  setHighlight(keys) {
40
59
  this.highlighted = new Set(keys);
@@ -86,7 +105,7 @@ export class VolumeRegionMeshes {
86
105
  }
87
106
  // Rebuilt or recoloured: the same surface, updated in place.
88
107
  if (want.vertices !== e.mesh.vertices && this.frame) {
89
- e.layer.setData(toWorld(want.vertices, this.frame), want.faces);
108
+ e.layer.setData(toWorld(want.vertices, baseFrame(this.frame)), want.faces);
90
109
  }
91
110
  if (want.color !== e.mesh.color)
92
111
  e.layer.color = want.color;
@@ -101,8 +120,9 @@ export class VolumeRegionMeshes {
101
120
  }
102
121
  add(mesh) {
103
122
  const frame = this.frame;
104
- const layer = this.viewer.addSurface(toWorld(mesh.vertices, frame), mesh.faces, undefined, {
123
+ const layer = this.viewer.addSurface(toWorld(mesh.vertices, baseFrame(frame)), mesh.faces, undefined, {
105
124
  name: `region ${mesh.key}`,
125
+ scale3d: this.scale3d(),
106
126
  color: mesh.color,
107
127
  opacity: this.opacityOf(mesh.key),
108
128
  blending: 'translucent',
@@ -121,6 +141,11 @@ export class VolumeRegionMeshes {
121
141
  this.layers.delete(key);
122
142
  }
123
143
  }
144
+ /** `frame` without its Z stretch: the box the surfaces' geometry is placed in. */
145
+ function baseFrame(frame) {
146
+ const s = frame.zScale && frame.zScale > 0 ? frame.zScale : 1;
147
+ return s === 1 ? frame : { size: frame.size, world: [frame.world[0], frame.world[1], frame.world[2] / s] };
148
+ }
124
149
  /**
125
150
  * Image px / slice coordinates → the volume's centred world box: pixel x of a `w`-wide image
126
151
  * spans the box's width, slice k sits at the middle of its share of the box's depth.
@@ -136,4 +161,4 @@ export function toWorld(vertices, frame) {
136
161
  }
137
162
  return out;
138
163
  }
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFzQkEsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUN4Qyx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQ2pELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7QUFFL0M7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBUTdCLFlBQTZCLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBUDFCLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBdUQsQ0FBQztRQUNqRixnQkFBVyxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzdDLFdBQU0sR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoRCxtRUFBbUU7UUFDM0QsV0FBTSxHQUE0QixFQUFFLENBQUM7UUFDckMsVUFBSyxHQUF1QixJQUFJLENBQUM7SUFFSyxDQUFDO0lBRS9DLG9FQUFvRTtJQUNwRSxHQUFHLENBQUMsTUFBK0I7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELDZGQUE2RjtJQUM3RixRQUFRLENBQUMsS0FBa0I7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsWUFBWSxDQUFDLElBQXNCO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCx5RkFBeUY7SUFDekYsU0FBUyxDQUFDLElBQXNCO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxxRkFBcUY7SUFDckYsTUFBTSxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEYsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQUksS0FBSztRQUNQLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsS0FBSztRQUNILEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTyxJQUFJO1FBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLFNBQVM7WUFDWCxDQUFDO1lBQ0QsNkRBQTZEO1lBQzdELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUM1RCxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO29CQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLEdBQUcsQ0FBQyxJQUFrQjtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBb0IsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUN6RixJQUFJLEVBQUUsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2pDLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLEdBQUcsRUFBRSxPQUFPO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLFNBQVMsQ0FBQyxHQUFXO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7WUFBRSxPQUFPLG1CQUFtQixDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztJQUNoRyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVcsRUFBRSxLQUFtQjtRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxRQUFzQixFQUFFLEtBQWtCO0lBQ2hFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDN0IsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN1cmZhY2VMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuLyoqIEEgcmVnaW9uJ3MgM0QgcmVjb25zdHJ1Y3Rpb24gdG8gc2hvdyBpbiB0aGUgdm9sdW1lOiBhIG1lc2ggaW4gaW1hZ2UgcHggKHgsIHkpIGFuZCBzbGljZXMgKHopLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpb25NZXNoM0Qge1xuICAvKiogSWRlbnRpdHkgKGEgY2xhc3MgbmFtZSk6IGEgbWVzaCB3aXRoIHRoZSBzYW1lIGtleSBhbmQgYXJyYXlzIGlzIGtlcHQsIG5vdCByZWJ1aWx0LiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIGAjcnJnZ2JiYC4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIFdoYXQgaG92ZXJpbmcgaXQgc2hvd3MgKFwiSFBGIMK3IEhpcHBvY2FtcGFsIGZvcm1hdGlvblwiKTsgZGVmYXVsdDogdGhlIGtleS4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZlcnRpY2VzOiBGbG9hdDMyQXJyYXk7XG4gIGZhY2VzOiBVaW50MzJBcnJheTtcbn1cblxuLyoqIFdoZXJlIHRoZSBzdGFjayBzaXRzIGluIHRoZSB2b2x1bWUncyB3b3JsZDogaXRzIGZ1bGwgc2l6ZSwgYW5kIHRoZSBjZW50cmVkIHdvcmxkIGJveCBpdCBmaWxscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lRnJhbWUge1xuICAvKiogSW1hZ2Ugd2lkdGgsIGhlaWdodCAocHgpIGFuZCBzbGljZSBjb3VudC4gKi9cbiAgc2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKiogVGhlIHdvcmxkIGJveCAoY2VudHJlZCBvbiB0aGUgb3JpZ2luKSwgWiBhcyBjdXJyZW50bHkgc3RyZXRjaGVkLiAqL1xuICB3b3JsZDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG4vKiogT3BhY2l0eSBvZiBhIHJlZ2lvbidzIHN1cmZhY2UgaW4gdGhlIHZvbHVtZS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fTUVTSF9PUEFDSVRZID0gMC41NTtcbi8qKiBXaGlsZSBzb21lIHN1cmZhY2VzIGFyZSBoaWdobGlnaHRlZDogdGhlaXJzIChuZWFyIG9wYXF1ZSwgc28gdGhlaXIgc2hhcGUgcmVhZHMpIOKApiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9NRVNIX0hJR0hMSUdIVF9PUEFDSVRZID0gMC45O1xuLyoqIOKApiBhbmQgdGhlIG90aGVycycgKGdob3N0ZWQ6IHN0aWxsIHRoZXJlIGZvciBjb250ZXh0LCBub3QgaW4gdGhlIHdheSkuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX01FU0hfRElNTUVEX09QQUNJVFkgPSAwLjEyO1xuXG4vKipcbiAqIFRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHNob3duIGluIGEgdm9sdW1lIHZpZXc6IG9uZSB0cmFuc2x1Y2VudCBzdXJmYWNlIHBlciByZWdpb24sIGluIGl0c1xuICogY29sb3VyLCBwbGFjZWQgaW4gdGhlIHZvbHVtZSdzIHdvcmxkIGJveCAocGl4ZWwgeCwgeSBhbmQgc2xpY2UgeiBtYXBwZWQgb250byBpdCB0aGUgd2F5IHRoZVxuICogdm9sdW1lIG1hcHMgaXRzIHZveGVscykgYW5kIHJlLXBsYWNlZCB3aGVuIHRoZSB2b2x1bWUncyBaIGlzIHN0cmV0Y2hlZC4gQSBzdXJmYWNlIGlzIHVwZGF0ZWQgaW5cbiAqIHBsYWNlIChgc2V0RGF0YWAsIGBjb2xvcmApIHJhdGhlciB0aGFuIGFkZGVkIGFnYWluLCBhbmQgcGlja2VkIGJ5IG5hcGFyaS1qcyAoYHBpY2tTdXJmYWNlYCkuXG4gKlxuICogSGlnaGxpZ2h0aW5nIGlzIGZvY3VzICsgY29udGV4dDogdGhlIGhpZ2hsaWdodGVkIHN1cmZhY2VzIHR1cm4gbmVhciBvcGFxdWUgYW5kIHRoZSBvdGhlcnMgZmFkZVxuICogdG8gYSBnaG9zdCwgc28gdGhlIHNlbGVjdGlvbiBzdGFuZHMgb3V0IHdoaWxlIHN0YXlpbmcgaW4gcGxhY2UgYW1vbmcgaXRzIG5laWdoYm91cnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWb2x1bWVSZWdpb25NZXNoZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IGxheWVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IFJlZ2lvbk1lc2gzRDsgbGF5ZXI6IFN1cmZhY2VMYXllciB9PigpO1xuICBwcml2YXRlIGhpZ2hsaWdodGVkOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGhpZGRlbjogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIFRoZSBtZXNoZXMgdG8gc2hvdyAoa2VwdCB3aGlsZSB0aGUgdm9sdW1lIGhhcyBubyBmcmFtZSB5ZXQpLiAqL1xuICBwcml2YXRlIHdhbnRlZDogcmVhZG9ubHkgUmVnaW9uTWVzaDNEW10gPSBbXTtcbiAgcHJpdmF0ZSBmcmFtZTogVm9sdW1lRnJhbWUgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjogVmlld2VyKSB7fVxuXG4gIC8qKiBTaG93IGV4YWN0bHkgYG1lc2hlc2AgKGFkZGluZywga2VlcGluZyBvciByZW1vdmluZyBzdXJmYWNlcykuICovXG4gIHNldChtZXNoZXM6IHJlYWRvbmx5IFJlZ2lvbk1lc2gzRFtdKTogdm9pZCB7XG4gICAgdGhpcy53YW50ZWQgPSBtZXNoZXM7XG4gICAgdGhpcy5zeW5jKCk7XG4gIH1cblxuICAvKiogRm9sbG93IHRoZSB2b2x1bWUncyBmcmFtZSAoaXQgb3BlbmVkLCBvciBpdHMgWiB3YXMgc3RyZXRjaGVkKTogcmUtcGxhY2UgZXZlcnkgc3VyZmFjZS4gKi9cbiAgc2V0RnJhbWUoZnJhbWU6IFZvbHVtZUZyYW1lKTogdm9pZCB7XG4gICAgdGhpcy5mcmFtZSA9IGZyYW1lO1xuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmxheWVycy52YWx1ZXMoKSkgZS5sYXllci5zZXREYXRhKHRvV29ybGQoZS5tZXNoLnZlcnRpY2VzLCBmcmFtZSksIGUubWVzaC5mYWNlcyk7XG4gICAgdGhpcy5zeW5jKCk7XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBrZXlzIChub25lOiBldmVyeSBzdXJmYWNlIGFzIHVzdWFsKS4gKi9cbiAgc2V0SGlnaGxpZ2h0KGtleXM6IEl0ZXJhYmxlPHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIHRoaXMubGF5ZXJzKSBlLmxheWVyLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHlPZihrZXkpO1xuICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBIaWRlIHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBrZXlzICh0aGV5IGFyZSBrZXB0LCBzbyBzaG93aW5nIHRoZW0gYWdhaW4gaXMgaW5zdGFudCkuICovXG4gIHNldEhpZGRlbihrZXlzOiBJdGVyYWJsZTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5oaWRkZW4gPSBuZXcgU2V0KGtleXMpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgdGhpcy5sYXllcnMpIGUubGF5ZXIudmlzaWJsZSA9ICF0aGlzLmhpZGRlbi5oYXMoa2V5KTtcbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogVGhlIGZyb250LW1vc3Qgc3VyZmFjZSB1bmRlciBzY3JlZW4gcG9pbnQgKGB4YCwgYHlgKSAoY2FudmFzIENTUyBweCksIG9yIG51bGwuICovXG4gIHBpY2tBdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IFJlZ2lvbk1lc2gzRCB8IG51bGwge1xuICAgIGlmICghdGhpcy5sYXllcnMuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgb3VycyA9IG5ldyBNYXAoWy4uLnRoaXMubGF5ZXJzLnZhbHVlcygpXS5tYXAoKGUpID0+IFtlLmxheWVyLCBlLm1lc2hdKSk7XG4gICAgY29uc3QgaGl0ID0gdGhpcy52aWV3ZXIucGlja1N1cmZhY2UoeCwgeSwgeyBwaWNrYWJsZTogKGxheWVyKSA9PiBvdXJzLmhhcyhsYXllcikgfSk7XG4gICAgcmV0dXJuIGhpdCA/IChvdXJzLmdldChoaXQubGF5ZXIpID8/IG51bGwpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgbWVzaGVzIHNob3duLiAqL1xuICBnZXQgc2hvd24oKTogUmVnaW9uTWVzaDNEW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5sYXllcnMudmFsdWVzKCldLm1hcCgoZSkgPT4gZS5tZXNoKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgWy4uLnRoaXMubGF5ZXJzXSkgdGhpcy5yZW1vdmUoa2V5LCBlLmxheWVyKTtcbiAgICB0aGlzLndhbnRlZCA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2x1bWUgdGhlIHN1cmZhY2VzIHNhdCBpbiBpcyBnb25lIChvciBubyBsb25nZXIgdGhlaXJzKTogdGFrZSBldmVyeSBzdXJmYWNlIGRvd24sIGtlZXBpbmdcbiAgICogdGhlIG1lc2hlcyB3YW50ZWQsIHNvIHRoZXkgY29tZSBiYWNrIHdoZW4gYSBmcmFtZSBpcyBzZXQgYWdhaW4uXG4gICAqL1xuICBjbGVhckZyYW1lKCk6IHZvaWQge1xuICAgIHRoaXMuZnJhbWUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgWy4uLnRoaXMubGF5ZXJzXSkgdGhpcy5yZW1vdmUoa2V5LCBlLmxheWVyKTtcbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIHN5bmMoKTogdm9pZCB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXAodGhpcy53YW50ZWQubWFwKChtKSA9PiBbbS5rZXksIG1dKSk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlXSBvZiBbLi4udGhpcy5sYXllcnNdKSB7XG4gICAgICBjb25zdCB3YW50ID0ga2VlcC5nZXQoa2V5KTtcbiAgICAgIGlmICghd2FudCB8fCAhd2FudC5mYWNlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoa2V5LCBlLmxheWVyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBSZWJ1aWx0IG9yIHJlY29sb3VyZWQ6IHRoZSBzYW1lIHN1cmZhY2UsIHVwZGF0ZWQgaW4gcGxhY2UuXG4gICAgICBpZiAod2FudC52ZXJ0aWNlcyAhPT0gZS5tZXNoLnZlcnRpY2VzICYmIHRoaXMuZnJhbWUpIHtcbiAgICAgICAgZS5sYXllci5zZXREYXRhKHRvV29ybGQod2FudC52ZXJ0aWNlcywgdGhpcy5mcmFtZSksIHdhbnQuZmFjZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHdhbnQuY29sb3IgIT09IGUubWVzaC5jb2xvcikgZS5sYXllci5jb2xvciA9IHdhbnQuY29sb3I7XG4gICAgICBlLm1lc2ggPSB3YW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmFtZSkge1xuICAgICAgZm9yIChjb25zdCBtZXNoIG9mIHRoaXMud2FudGVkKSBpZiAoIXRoaXMubGF5ZXJzLmhhcyhtZXNoLmtleSkgJiYgbWVzaC5mYWNlcy5sZW5ndGgpIHRoaXMuYWRkKG1lc2gpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZChtZXNoOiBSZWdpb25NZXNoM0QpOiB2b2lkIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUgYXMgVm9sdW1lRnJhbWU7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLnZpZXdlci5hZGRTdXJmYWNlKHRvV29ybGQobWVzaC52ZXJ0aWNlcywgZnJhbWUpLCBtZXNoLmZhY2VzLCB1bmRlZmluZWQsIHtcbiAgICAgIG5hbWU6IGByZWdpb24gJHttZXNoLmtleX1gLFxuICAgICAgY29sb3I6IG1lc2guY29sb3IsXG4gICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHlPZihtZXNoLmtleSksXG4gICAgICBibGVuZGluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgIGZpdDogJ25ldmVyJyxcbiAgICB9KTtcbiAgICBsYXllci52aXNpYmxlID0gIXRoaXMuaGlkZGVuLmhhcyhtZXNoLmtleSk7XG4gICAgdGhpcy5sYXllcnMuc2V0KG1lc2gua2V5LCB7IG1lc2gsIGxheWVyIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGFjaXR5T2Yoa2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5oaWdobGlnaHRlZC5zaXplKSByZXR1cm4gUkVHSU9OX01FU0hfT1BBQ0lUWTtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRlZC5oYXMoa2V5KSA/IFJFR0lPTl9NRVNIX0hJR0hMSUdIVF9PUEFDSVRZIDogUkVHSU9OX01FU0hfRElNTUVEX09QQUNJVFk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZShrZXk6IHN0cmluZywgbGF5ZXI6IFN1cmZhY2VMYXllcik6IHZvaWQge1xuICAgIHRoaXMudmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIHRoaXMubGF5ZXJzLmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbi8qKlxuICogSW1hZ2UgcHggLyBzbGljZSBjb29yZGluYXRlcyDihpIgdGhlIHZvbHVtZSdzIGNlbnRyZWQgd29ybGQgYm94OiBwaXhlbCB4IG9mIGEgYHdgLXdpZGUgaW1hZ2VcbiAqIHNwYW5zIHRoZSBib3gncyB3aWR0aCwgc2xpY2UgayBzaXRzIGF0IHRoZSBtaWRkbGUgb2YgaXRzIHNoYXJlIG9mIHRoZSBib3gncyBkZXB0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvV29ybGQodmVydGljZXM6IEZsb2F0MzJBcnJheSwgZnJhbWU6IFZvbHVtZUZyYW1lKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgW3csIGgsIGRdID0gZnJhbWUuc2l6ZTtcbiAgY29uc3QgW3d3LCB3aCwgd2RdID0gZnJhbWUud29ybGQ7XG4gIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgIG91dFtpXSA9ICh2ZXJ0aWNlc1tpXSAvIHcgLSAwLjUpICogd3c7XG4gICAgb3V0W2kgKyAxXSA9ICh2ZXJ0aWNlc1tpICsgMV0gLyBoIC0gMC41KSAqIHdoO1xuICAgIG91dFtpICsgMl0gPSAoKHZlcnRpY2VzW2kgKyAyXSArIDAuNSkgLyBkIC0gMC41KSAqIHdkO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE0QkEsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUN4Qyx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQ2pELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFRN0IsWUFBNkIsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFQMUIsV0FBTSxHQUFHLElBQUksR0FBRyxFQUF1RCxDQUFDO1FBQ2pGLGdCQUFXLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2hELG1FQUFtRTtRQUMzRCxXQUFNLEdBQTRCLEVBQUUsQ0FBQztRQUNyQyxVQUFLLEdBQXVCLElBQUksQ0FBQztJQUVLLENBQUM7SUFFL0Msb0VBQW9FO0lBQ3BFLEdBQUcsQ0FBQyxNQUErQjtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLEtBQWtCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxT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QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN1cmZhY2VMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuLyoqIEEgcmVnaW9uJ3MgM0QgcmVjb25zdHJ1Y3Rpb24gdG8gc2hvdyBpbiB0aGUgdm9sdW1lOiBhIG1lc2ggaW4gaW1hZ2UgcHggKHgsIHkpIGFuZCBzbGljZXMgKHopLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpb25NZXNoM0Qge1xuICAvKiogSWRlbnRpdHkgKGEgY2xhc3MgbmFtZSk6IGEgbWVzaCB3aXRoIHRoZSBzYW1lIGtleSBhbmQgYXJyYXlzIGlzIGtlcHQsIG5vdCByZWJ1aWx0LiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIGAjcnJnZ2JiYC4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIFdoYXQgaG92ZXJpbmcgaXQgc2hvd3MgKFwiSFBGIMK3IEhpcHBvY2FtcGFsIGZvcm1hdGlvblwiKTsgZGVmYXVsdDogdGhlIGtleS4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZlcnRpY2VzOiBGbG9hdDMyQXJyYXk7XG4gIGZhY2VzOiBVaW50MzJBcnJheTtcbn1cblxuLyoqIFdoZXJlIHRoZSBzdGFjayBzaXRzIGluIHRoZSB2b2x1bWUncyB3b3JsZDogaXRzIGZ1bGwgc2l6ZSwgYW5kIHRoZSBjZW50cmVkIHdvcmxkIGJveCBpdCBmaWxscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lRnJhbWUge1xuICAvKiogSW1hZ2Ugd2lkdGgsIGhlaWdodCAocHgpIGFuZCBzbGljZSBjb3VudC4gKi9cbiAgc2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKiogVGhlIHdvcmxkIGJveCAoY2VudHJlZCBvbiB0aGUgb3JpZ2luKSwgWiBhcyBjdXJyZW50bHkgc3RyZXRjaGVkLiAqL1xuICB3b3JsZDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKipcbiAgICogSG93IG11Y2ggb2Yge0BsaW5rIHdvcmxkfSdzIGRlcHRoIGlzIHRoZSB2aWV3J3MgWiBzdHJldGNoIChkZWZhdWx0IDEpLiBUaGUgcmVnaW9uIHN1cmZhY2VzIGtlZXBcbiAgICogdGhlaXIgZ2VvbWV0cnkgaW4gdGhlIHVuc3RyZXRjaGVkIGJveCBhbmQgdGFrZSB0aGUgc3RyZXRjaCBhcyBhIEdQVSBzY2FsZSAoYHNjYWxlM2RgKSwgc29cbiAgICogZHJhZ2dpbmcgdGhlIFogaGFuZGxlIHJlLXVwbG9hZHMgbm8gbWVzaC5cbiAgICovXG4gIHpTY2FsZT86IG51bWJlcjtcbn1cblxuLyoqIE9wYWNpdHkgb2YgYSByZWdpb24ncyBzdXJmYWNlIGluIHRoZSB2b2x1bWUuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX01FU0hfT1BBQ0lUWSA9IDAuNTU7XG4vKiogV2hpbGUgc29tZSBzdXJmYWNlcyBhcmUgaGlnaGxpZ2h0ZWQ6IHRoZWlycyAobmVhciBvcGFxdWUsIHNvIHRoZWlyIHNoYXBlIHJlYWRzKSDigKYgKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fTUVTSF9ISUdITElHSFRfT1BBQ0lUWSA9IDAuOTtcbi8qKiDigKYgYW5kIHRoZSBvdGhlcnMnIChnaG9zdGVkOiBzdGlsbCB0aGVyZSBmb3IgY29udGV4dCwgbm90IGluIHRoZSB3YXkpLiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9NRVNIX0RJTU1FRF9PUEFDSVRZID0gMC4xMjtcblxuLyoqXG4gKiBUaGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyBzaG93biBpbiBhIHZvbHVtZSB2aWV3OiBvbmUgdHJhbnNsdWNlbnQgc3VyZmFjZSBwZXIgcmVnaW9uLCBpbiBpdHNcbiAqIGNvbG91ciwgcGxhY2VkIGluIHRoZSB2b2x1bWUncyB3b3JsZCBib3ggKHBpeGVsIHgsIHkgYW5kIHNsaWNlIHogbWFwcGVkIG9udG8gaXQgdGhlIHdheSB0aGVcbiAqIHZvbHVtZSBtYXBzIGl0cyB2b3hlbHMpLiBUaGUgYm94J3MgWiBzdHJldGNoIGlzIHRoZSBzdXJmYWNlcycgYHNjYWxlM2RgIChhIHVuaWZvcm0pLCBzbyBhIHN0cmV0Y2hcbiAqIGFsb25lIGNoYW5nZXMgbm8gZ2VvbWV0cnk7IGEgbmV3IGJveCByZS1wbGFjZXMgdGhlbS4gQSBzdXJmYWNlIGlzIHVwZGF0ZWQgaW4gcGxhY2UgKGBzZXREYXRhYCxcbiAqIGBjb2xvcmAsIGBzY2FsZTNkYCkgcmF0aGVyIHRoYW4gYWRkZWQgYWdhaW4sIGFuZCBwaWNrZWQgYnkgbmFwYXJpLWpzIChgcGlja1N1cmZhY2VgKSwgd2hpY2hcbiAqIHBpY2tzIGl0IHdoZXJlIGl0IGlzIGRyYXduLlxuICpcbiAqIEhpZ2hsaWdodGluZyBpcyBmb2N1cyArIGNvbnRleHQ6IHRoZSBoaWdobGlnaHRlZCBzdXJmYWNlcyB0dXJuIG5lYXIgb3BhcXVlIGFuZCB0aGUgb3RoZXJzIGZhZGVcbiAqIHRvIGEgZ2hvc3QsIHNvIHRoZSBzZWxlY3Rpb24gc3RhbmRzIG91dCB3aGlsZSBzdGF5aW5nIGluIHBsYWNlIGFtb25nIGl0cyBuZWlnaGJvdXJzLlxuICovXG5leHBvcnQgY2xhc3MgVm9sdW1lUmVnaW9uTWVzaGVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXllcnMgPSBuZXcgTWFwPHN0cmluZywgeyBtZXNoOiBSZWdpb25NZXNoM0Q7IGxheWVyOiBTdXJmYWNlTGF5ZXIgfT4oKTtcbiAgcHJpdmF0ZSBoaWdobGlnaHRlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBoaWRkZW46IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgbWVzaGVzIHRvIHNob3cgKGtlcHQgd2hpbGUgdGhlIHZvbHVtZSBoYXMgbm8gZnJhbWUgeWV0KS4gKi9cbiAgcHJpdmF0ZSB3YW50ZWQ6IHJlYWRvbmx5IFJlZ2lvbk1lc2gzRFtdID0gW107XG4gIHByaXZhdGUgZnJhbWU6IFZvbHVtZUZyYW1lIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IFZpZXdlcikge31cblxuICAvKiogU2hvdyBleGFjdGx5IGBtZXNoZXNgIChhZGRpbmcsIGtlZXBpbmcgb3IgcmVtb3Zpbmcgc3VyZmFjZXMpLiAqL1xuICBzZXQobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMud2FudGVkID0gbWVzaGVzO1xuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvbGxvdyB0aGUgdm9sdW1lJ3MgZnJhbWUuIEEgbmV3IGJveCAoaXQgb3BlbmVkLCBhbm90aGVyIHZvbHVtZSkgcmUtcGxhY2VzIGV2ZXJ5IHN1cmZhY2U7IGEgWlxuICAgKiBzdHJldGNoIG9mIHRoZSBzYW1lIGJveCBvbmx5IHNldHMgdGhlaXIgYHNjYWxlM2RgLCBzbyBub3RoaW5nIGlzIHJlLXVwbG9hZGVkIHdoaWxlIGRyYWdnaW5nLlxuICAgKi9cbiAgc2V0RnJhbWUoZnJhbWU6IFZvbHVtZUZyYW1lKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VkID0gdGhpcy5mcmFtZSA/IGJhc2VGcmFtZSh0aGlzLmZyYW1lKSA6IG51bGw7XG4gICAgY29uc3QgbmV4dCA9IGJhc2VGcmFtZShmcmFtZSk7XG4gICAgY29uc3Qgc2FtZUJveCA9XG4gICAgICAhIXBsYWNlZCAmJlxuICAgICAgcGxhY2VkLnNpemUuZXZlcnkoKHYsIGkpID0+IHYgPT09IG5leHQuc2l6ZVtpXSkgJiZcbiAgICAgIHBsYWNlZC53b3JsZC5ldmVyeSgodiwgaSkgPT4gTWF0aC5hYnModiAtIG5leHQud29ybGRbaV0pIDw9IDFlLTkgKiBNYXRoLm1heCgxLCBNYXRoLmFicyh2KSkpO1xuICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGUzZCgpO1xuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmxheWVycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFzYW1lQm94KSBlLmxheWVyLnNldERhdGEodG9Xb3JsZChlLm1lc2gudmVydGljZXMsIG5leHQpLCBlLm1lc2guZmFjZXMpO1xuICAgICAgZS5sYXllci5zY2FsZTNkID0gc2NhbGU7XG4gICAgfVxuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqIFRoZSBzdXJmYWNlcycgR1BVIHNjYWxlOiB0aGUgZnJhbWUncyBaIHN0cmV0Y2guICovXG4gIHByaXZhdGUgc2NhbGUzZCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IHMgPSB0aGlzLmZyYW1lPy56U2NhbGU7XG4gICAgcmV0dXJuIFsxLCAxLCBzICYmIHMgPiAwID8gcyA6IDFdO1xuICB9XG5cbiAgLyoqIEhpZ2hsaWdodCB0aGUgc3VyZmFjZXMgb2YgdGhlc2Uga2V5cyAobm9uZTogZXZlcnkgc3VyZmFjZSBhcyB1c3VhbCkuICovXG4gIHNldEhpZ2hsaWdodChrZXlzOiBJdGVyYWJsZTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZCA9IG5ldyBTZXQoa2V5cyk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlXSBvZiB0aGlzLmxheWVycykgZS5sYXllci5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5T2Yoa2V5KTtcbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogSGlkZSB0aGUgc3VyZmFjZXMgb2YgdGhlc2Uga2V5cyAodGhleSBhcmUga2VwdCwgc28gc2hvd2luZyB0aGVtIGFnYWluIGlzIGluc3RhbnQpLiAqL1xuICBzZXRIaWRkZW4oa2V5czogSXRlcmFibGU8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaGlkZGVuID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIHRoaXMubGF5ZXJzKSBlLmxheWVyLnZpc2libGUgPSAhdGhpcy5oaWRkZW4uaGFzKGtleSk7XG4gICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIFRoZSBmcm9udC1tb3N0IHN1cmZhY2UgdW5kZXIgc2NyZWVuIHBvaW50IChgeGAsIGB5YCkgKGNhbnZhcyBDU1MgcHgpLCBvciBudWxsLiAqL1xuICBwaWNrQXQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBSZWdpb25NZXNoM0QgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubGF5ZXJzLnNpemUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG91cnMgPSBuZXcgTWFwKFsuLi50aGlzLmxheWVycy52YWx1ZXMoKV0ubWFwKChlKSA9PiBbZS5sYXllciwgZS5tZXNoXSkpO1xuICAgIGNvbnN0IGhpdCA9IHRoaXMudmlld2VyLnBpY2tTdXJmYWNlKHgsIHksIHsgcGlja2FibGU6IChsYXllcikgPT4gb3Vycy5oYXMobGF5ZXIpIH0pO1xuICAgIHJldHVybiBoaXQgPyAob3Vycy5nZXQoaGl0LmxheWVyKSA/PyBudWxsKSA6IG51bGw7XG4gIH1cblxuICAvKiogVGhlIG1lc2hlcyBzaG93bi4gKi9cbiAgZ2V0IHNob3duKCk6IFJlZ2lvbk1lc2gzRFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMubGF5ZXJzLnZhbHVlcygpXS5tYXAoKGUpID0+IGUubWVzaCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIFsuLi50aGlzLmxheWVyc10pIHRoaXMucmVtb3ZlKGtleSwgZS5sYXllcik7XG4gICAgdGhpcy53YW50ZWQgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9sdW1lIHRoZSBzdXJmYWNlcyBzYXQgaW4gaXMgZ29uZSAob3Igbm8gbG9uZ2VyIHRoZWlycyk6IHRha2UgZXZlcnkgc3VyZmFjZSBkb3duLCBrZWVwaW5nXG4gICAqIHRoZSBtZXNoZXMgd2FudGVkLCBzbyB0aGV5IGNvbWUgYmFjayB3aGVuIGEgZnJhbWUgaXMgc2V0IGFnYWluLlxuICAgKi9cbiAgY2xlYXJGcmFtZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZyYW1lID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIFsuLi50aGlzLmxheWVyc10pIHRoaXMucmVtb3ZlKGtleSwgZS5sYXllcik7XG4gICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jKCk6IHZvaWQge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwKHRoaXMud2FudGVkLm1hcCgobSkgPT4gW20ua2V5LCBtXSkpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZV0gb2YgWy4uLnRoaXMubGF5ZXJzXSkge1xuICAgICAgY29uc3Qgd2FudCA9IGtlZXAuZ2V0KGtleSk7XG4gICAgICBpZiAoIXdhbnQgfHwgIXdhbnQuZmFjZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGtleSwgZS5sYXllcik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gUmVidWlsdCBvciByZWNvbG91cmVkOiB0aGUgc2FtZSBzdXJmYWNlLCB1cGRhdGVkIGluIHBsYWNlLlxuICAgICAgaWYgKHdhbnQudmVydGljZXMgIT09IGUubWVzaC52ZXJ0aWNlcyAmJiB0aGlzLmZyYW1lKSB7XG4gICAgICAgIGUubGF5ZXIuc2V0RGF0YSh0b1dvcmxkKHdhbnQudmVydGljZXMsIGJhc2VGcmFtZSh0aGlzLmZyYW1lKSksIHdhbnQuZmFjZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHdhbnQuY29sb3IgIT09IGUubWVzaC5jb2xvcikgZS5sYXllci5jb2xvciA9IHdhbnQuY29sb3I7XG4gICAgICBlLm1lc2ggPSB3YW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmFtZSkge1xuICAgICAgZm9yIChjb25zdCBtZXNoIG9mIHRoaXMud2FudGVkKSBpZiAoIXRoaXMubGF5ZXJzLmhhcyhtZXNoLmtleSkgJiYgbWVzaC5mYWNlcy5sZW5ndGgpIHRoaXMuYWRkKG1lc2gpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZChtZXNoOiBSZWdpb25NZXNoM0QpOiB2b2lkIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUgYXMgVm9sdW1lRnJhbWU7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLnZpZXdlci5hZGRTdXJmYWNlKHRvV29ybGQobWVzaC52ZXJ0aWNlcywgYmFzZUZyYW1lKGZyYW1lKSksIG1lc2guZmFjZXMsIHVuZGVmaW5lZCwge1xuICAgICAgbmFtZTogYHJlZ2lvbiAke21lc2gua2V5fWAsXG4gICAgICBzY2FsZTNkOiB0aGlzLnNjYWxlM2QoKSxcbiAgICAgIGNvbG9yOiBtZXNoLmNvbG9yLFxuICAgICAgb3BhY2l0eTogdGhpcy5vcGFjaXR5T2YobWVzaC5rZXkpLFxuICAgICAgYmxlbmRpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBmaXQ6ICduZXZlcicsXG4gICAgfSk7XG4gICAgbGF5ZXIudmlzaWJsZSA9ICF0aGlzLmhpZGRlbi5oYXMobWVzaC5rZXkpO1xuICAgIHRoaXMubGF5ZXJzLnNldChtZXNoLmtleSwgeyBtZXNoLCBsYXllciB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BhY2l0eU9mKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0ZWQuc2l6ZSkgcmV0dXJuIFJFR0lPTl9NRVNIX09QQUNJVFk7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWQuaGFzKGtleSkgPyBSRUdJT05fTUVTSF9ISUdITElHSFRfT1BBQ0lUWSA6IFJFR0lPTl9NRVNIX0RJTU1FRF9PUEFDSVRZO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmUoa2V5OiBzdHJpbmcsIGxheWVyOiBTdXJmYWNlTGF5ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB0aGlzLmxheWVycy5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG4vKiogYGZyYW1lYCB3aXRob3V0IGl0cyBaIHN0cmV0Y2g6IHRoZSBib3ggdGhlIHN1cmZhY2VzJyBnZW9tZXRyeSBpcyBwbGFjZWQgaW4uICovXG5mdW5jdGlvbiBiYXNlRnJhbWUoZnJhbWU6IFZvbHVtZUZyYW1lKTogVm9sdW1lRnJhbWUge1xuICBjb25zdCBzID0gZnJhbWUuelNjYWxlICYmIGZyYW1lLnpTY2FsZSA+IDAgPyBmcmFtZS56U2NhbGUgOiAxO1xuICByZXR1cm4gcyA9PT0gMSA/IGZyYW1lIDogeyBzaXplOiBmcmFtZS5zaXplLCB3b3JsZDogW2ZyYW1lLndvcmxkWzBdLCBmcmFtZS53b3JsZFsxXSwgZnJhbWUud29ybGRbMl0gLyBzXSB9O1xufVxuXG4vKipcbiAqIEltYWdlIHB4IC8gc2xpY2UgY29vcmRpbmF0ZXMg4oaSIHRoZSB2b2x1bWUncyBjZW50cmVkIHdvcmxkIGJveDogcGl4ZWwgeCBvZiBhIGB3YC13aWRlIGltYWdlXG4gKiBzcGFucyB0aGUgYm94J3Mgd2lkdGgsIHNsaWNlIGsgc2l0cyBhdCB0aGUgbWlkZGxlIG9mIGl0cyBzaGFyZSBvZiB0aGUgYm94J3MgZGVwdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dvcmxkKHZlcnRpY2VzOiBGbG9hdDMyQXJyYXksIGZyYW1lOiBWb2x1bWVGcmFtZSk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IFt3LCBoLCBkXSA9IGZyYW1lLnNpemU7XG4gIGNvbnN0IFt3dywgd2gsIHdkXSA9IGZyYW1lLndvcmxkO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICBvdXRbaV0gPSAodmVydGljZXNbaV0gLyB3IC0gMC41KSAqIHd3O1xuICAgIG91dFtpICsgMV0gPSAodmVydGljZXNbaSArIDFdIC8gaCAtIDAuNSkgKiB3aDtcbiAgICBvdXRbaSArIDJdID0gKCh2ZXJ0aWNlc1tpICsgMl0gKyAwLjUpIC8gZCAtIDAuNSkgKiB3ZDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
@@ -136,7 +136,11 @@ export class VolumeScene {
136
136
  if (!base || !this.fullSize)
137
137
  return;
138
138
  const depth = base.depth * this.ctx.settings.volumeZScale;
139
- const frame = { size: this.fullSize, world: [base.width, base.height, depth] };
139
+ const frame = {
140
+ size: this.fullSize,
141
+ world: [base.width, base.height, depth],
142
+ zScale: this.ctx.settings.volumeZScale,
143
+ };
140
144
  this.regionMeshes.setFrame(frame);
141
145
  this.slicePlanes.setFrame(frame);
142
146
  }
@@ -547,4 +551,4 @@ export class Scatter3dScene {
547
551
  this.displaySub = null;
548
552
  }
549
553
  }
550
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1zY2VuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdm9sdW1lLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTWxELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxXQUFXLEVBQVEsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLFVBQVUsRUFDVixPQUFPLEVBQ1AsWUFBWSxFQUNaLGFBQWEsRUFDYixtQkFBbUIsR0FDcEIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQTZCLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUYsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFakUscUdBQXFHO0FBQ3JHLFNBQVMsZ0JBQWdCLENBQUMsSUFBNkIsRUFBRSxPQUFlLEVBQUUsSUFBWTtJQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxF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QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDckUsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTXVsdGlDaGFubmVsVm9sdW1lVmlldywgaGlzdG9ncmFtU2NhbGFyIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRzM0RMYXllciwgVm9sdW1lQ2hhbm5lbCB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBmb3JtYXRMZW5ndGggfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuaW1wb3J0IHR5cGUgeyBBeGlzTGFiZWxTcGVjIH0gZnJvbSAnbmFwYXJpLWpzL292ZXJsYXlzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSXNvc3VyZmFjZUNvbnRyb2xzLCBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7IEFzc2VtYmxlZFZvbHVtZSB9IGZyb20gJy4vbmFwYXJpLXRpbGUtY2xpZW50JztcbmltcG9ydCB7IFRpbGVEZXNjcmlwdG9yIH0gZnJvbSAnLi4vdGlsZS1zZXJ2ZXInO1xuaW1wb3J0IHsgQXhlczNkR2l6bW8sIEJveDMsIHN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi9uYXBhcmktYXhlcy1naXptbyc7XG5pbXBvcnQge1xuICBTQ0FUVEVSM0RfTUFYX1BPSU5UUyxcbiAgU0NBVFRFUjNEX01BWF9YWSxcbiAgVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGLFxuICBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwsXG4gIHN0YWNrRGVwdGgsXG4gIHRpbnRGb3IsXG4gIHRvSUhpc3RvZ3JhbSxcbiAgdG9OYXBhcmlHYW1tYSxcbiAgdm9sdW1lUmVzb2x1dGlvbkZvcixcbn0gZnJvbSAnLi9uYXBhcmktaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE5hcGFyaVNjZW5lLCBTY2VuZUNvbnRleHQsIFZvbHVtZVZveGVsc09uU2NyZWVuIH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuaW1wb3J0IHsgUmVnaW9uTWVzaDNELCBWb2x1bWVGcmFtZSwgVm9sdW1lUmVnaW9uTWVzaGVzIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXJlZ2lvbi1tZXNoZXMnO1xuaW1wb3J0IHsgU2xpY2VQbGFuZXMsIFZvbHVtZVNsaWNlUGxhbmVzIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXNsaWNlLXBsYW5lcyc7XG5pbXBvcnQgeyBSZWdpb25NZXNoUG9pbnRlciB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1tZXNoLXBvaW50ZXInO1xuXG4vKiogVGhlIGludGVuc2l0eSBoaXN0b2dyYW0gb2YgYW4gYXNzZW1ibGVkIHVpbnQ4IGNoYW5uZWwgKG9yIHRoZSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSwga2V5IDApLiAqL1xuZnVuY3Rpb24gY2hhbm5lbEhpc3RvZ3JhbShkYXRhOiBNYXA8bnVtYmVyLCBVaW50OEFycmF5PiwgY2hhbm5lbDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gIGlmICghZGF0YS5zaXplKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGxhbmUgPSBkYXRhLmdldChjaGFubmVsKSA/PyBkYXRhLmdldCgwKTtcbiAgcmV0dXJuIHBsYW5lID8gdG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihwbGFuZSwgYmlucywgMCwgMjU1KSkgOiBudWxsO1xufVxuXG4vKiogQXNzZW1ibGUgYGluZm9gJ3Mgc3RhY2sgaW50byBhIHVpbnQ4IHZvbHVtZSB1bmRlciB0aGUgc3RhY2sgcHJvZ3Jlc3MgYmFyOyBudWxsIG9uY2UgYGxvYWRpbmdgXG4gKiAgYWJvcnRzIChhIENhbmNlbCBvciBhIG5ldyBwbG90KS4gVGhlIGNhbGxlciBvd25zIHRoZSBsb2FkaW5nIGZsYWcgYW5kIHRha2VzIGBsb2FkaW5nYCBvbmNlIHBlclxuICogIGxvYWQ6IGEgQ2FuY2VsIHJlcGxhY2VzIGBjdHgubG9hZGluZygpYCwgYW5kIGEgbXVsdGljaGFubmVsIHZvbHVtZSBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybi4gKi9cbmZ1bmN0aW9uIGFzc2VtYmxlKFxuICBjdHg6IFNjZW5lQ29udGV4dCxcbiAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgb3B0czogeyBtYXhTbGljZT86IG51bWJlcjsgc2xpY2VTdGVwPzogbnVtYmVyIH0sXG4gIGxvYWRpbmc6IEFib3J0U2lnbmFsLFxuICBjaGFubmVsPzogbnVtYmVyLFxuKTogUHJvbWlzZTxBc3NlbWJsZWRWb2x1bWUgfCBudWxsPiB7XG4gIHJldHVybiBjdHgudGlsZXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgb3B0cywgY2hhbm5lbCwge1xuICAgIHNpZ25hbDogbG9hZGluZyxcbiAgICBwcm9ncmVzczogKHApID0+IGN0eC5zdGFjay5wcm9ncmVzcyhwKSxcbiAgfSk7XG59XG5cbi8qKlxuICogTkFQQVJJX1ZPTFVNRSAvIE5BUEFSSV9JU09TVVJGQUNFIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBGKTogdGhlIHN0YWNrIGFzc2VtYmxlZCBpbnRvIGFcbiAqIGRlY2ltYXRlZCB2b2x1bWUg4oCUIG9uZSBhZGRpdGl2ZSwgdGludGVkIGBWb2x1bWVMYXllcmAgcGVyIGNoYW5uZWwgZm9yIGEgbXVsdGljaGFubmVsIGltYWdlLCBhXG4gKiBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSBvdGhlcndpc2Ug4oCUIHdpdGggdGhlIGF4ZXMgZ2l6bW8gYW5kIHRoZSBpbi12aWV3IFotaGVpZ2h0IGhhbmRsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvbHVtZVNjZW5lIGltcGxlbWVudHMgTmFwYXJpU2NlbmUge1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIHZvbHVtZSBsYXllcnMuICovXG4gIHZpZXc6IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdm9sdW1lIGlzIGNvbXBvc2l0ZWQgZnJvbSBwZXItY2hhbm5lbCBsYXllcnMgKHZzIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiAqL1xuICBwcml2YXRlIG11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBaLXNjYWxlIDEgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGUgdGhlXG4gICAqICBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB3b3JsZEJhc2U6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzYW1wbGVkRGVwdGggPSAxO1xuICBwcml2YXRlIGRpbXM6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgLyoqIEFzc2VtYmxlZCB1aW50OCB2b2x1bWUgZGF0YSBwZXIgY2hhbm5lbCAoa2V5ID0gY2hhbm5lbCBpbmRleCksIGtlcHQgZm9yIHRoZSB2b2x1bWUgaW50ZW5zaXR5XG4gICAqICBoaXN0b2dyYW0uIEtleSAwIGhvbGRzIHRoZSBncmF5c2NhbGUvY29tcG9zaXRlIHZvbHVtZSBpbiB0aGUgc2luZ2xlLWNoYW5uZWwgY2FzZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFubmVsRGF0YSA9IG5ldyBNYXA8bnVtYmVyLCBVaW50OEFycmF5PigpO1xuICBnaXptbzogQXhlczNkR2l6bW8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB6SGFuZGxlOiBOYXBhcmlWb2x1bWVaSGFuZGxlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSZWdpb25zJyAzRCByZWNvbnN0cnVjdGlvbnMgc2hvd24gaW4gdGhlIHZvbHVtZSAoc2VlIHtAbGluayBzZXRSZWdpb25NZXNoZXN9KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25NZXNoZXM6IFZvbHVtZVJlZ2lvbk1lc2hlcztcbiAgLyoqIFRoZSBwbGFuZXMgb2YgdGhlIHNlY3Rpb25zIHNob3duIGJlc2lkZSB0aGUgdm9sdW1lLCBtYXJrZWQgYW5kIGRyYWdnYWJsZSBpbiBpdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbGljZVBsYW5lczogVm9sdW1lU2xpY2VQbGFuZXM7XG4gIC8qKiBUaGUgaW1hZ2UncyBmdWxsIHNpemUgKHB4LCBweCwgc2xpY2VzKSwgd2hpY2ggcmVjb25zdHJ1Y3Rpb25zIGFyZSBpbi4gKi9cbiAgcHJpdmF0ZSBmdWxsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDbGlja3MgYW5kIGhvdmVyIG9uIHRoZSByZWNvbnN0cnVjdGlvbnMgKHdpdGggdGhlIHNlbGVjdGlvbiB0b29sKS4gKi9cbiAgcHJpdmF0ZSBtZXNoUG9pbnRlcjogUmVnaW9uTWVzaFBvaW50ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0b29sU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3RpbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN0eDogU2NlbmVDb250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmluZzogJ2lzbycgfCAnbWlwJyxcbiAgKSB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMgPSBuZXcgVm9sdW1lUmVnaW9uTWVzaGVzKGN0eC52aWV3ZXIpO1xuICAgIHRoaXMuc2xpY2VQbGFuZXMgPSBuZXcgVm9sdW1lU2xpY2VQbGFuZXMoY3R4LnZpZXdlciwgY3R4Lmhvc3QsIHtcbiAgICAgIG9uTW92ZTogKGF4aXMsIHZhbHVlKSA9PiBjdHguaW5ab25lKCgpID0+IGN0eC5zbGljZVBsYW5lTW92ZWQoYXhpcywgdmFsdWUpKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZXNlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgaW4gdGhlIHZvbHVtZSAocmVwbGFjaW5nIHRoZSBvbmVzIHNob3duKS4gKi9cbiAgc2V0UmVnaW9uTWVzaGVzKG1lc2hlczogcmVhZG9ubHkgUmVnaW9uTWVzaDNEW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXQobWVzaGVzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZ2hsaWdodChrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZ2hsaWdodChrZXlzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZGRlbihrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZGRlbihrZXlzKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgbGV0cyBldmVyeSByZWdpb24gdGhyb3VnaCAoc2VlIHtAbGluayBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZX0pLiAqL1xuICBwcml2YXRlIHJlZ2lvbnNUaHJvdWdoID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSB2b2x1bWUgaGlkZXMgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgYmVoaW5kIHdoYXQgaXQgc2hvd3MgKGl0cyBicmlnaHRlc3Qgc2FtcGxlIGFsb25nXG4gICAqIGVhY2ggcmF5LCBuYXBhcmktanMncyBgJ3RyYW5zbHVjZW50J2AgZGVwdGgpIOKAlCB0aGUgcGVyc3BlY3RpdmUgb2YgYSByZWdpb24gYmVoaW5kIHRoZVxuICAgKiBjZXJlYmVsbHVtIOKAlCBvciwgYHRocm91Z2hgLCBoaWRlcyBub25lIChgJ3RyYW5zbHVjZW50X25vX2RlcHRoJ2ApOiBzdXJmYWNlcyB0cmFjZWQgaW5zaWRlIGl0c1xuICAgKiBicmlnaHQgc3RydWN0dXJlcywgYW4gT0NUJ3MgbGF5ZXIgYm91bmRhcmllcyBpbiBpdHMgYnJpZ2h0IGJhbmRzLCB3aGljaCB0aGF0IGRlcHRoIHNwZWNrbGVzXG4gICAqIG9yIGhpZGVzLiBBIG11bHRpY2hhbm5lbCB2b2x1bWUncyBjaGFubmVscyBhZGQgdXAgYW5kIGhpZGUgbm90aGluZyBlaXRoZXIgd2F5LlxuICAgKi9cbiAgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uc1Rocm91Z2ggPSB0aHJvdWdoO1xuICAgIHRoaXMuYXBwbHlWb2x1bWVEZXB0aCgpO1xuICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Vm9sdW1lRGVwdGgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGljaGFubmVsKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLnZpZXc/LmxheWVycyA/PyBbXSkge1xuICAgICAgbGF5ZXIuYmxlbmRpbmcgPSB0aGlzLnJlZ2lvbnNUaHJvdWdoID8gJ3RyYW5zbHVjZW50X25vX2RlcHRoJyA6ICd0cmFuc2x1Y2VudCc7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNob3cgdGhlIHBsYW5lcyBvZiB0aGUgc2VjdGlvbnMgYmVzaWRlIHRoZSB2b2x1bWUgd2hlcmUgdGhleSBhcmUgKG51bGw6IGhpZGUgb25lKS4gKi9cbiAgc2V0U2xpY2VQbGFuZXMocGxhbmVzOiBTbGljZVBsYW5lcyk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQbGFuZXMuc2V0KHBsYW5lcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFzc2VtYmxlZCB2b2x1bWUncyB2b3hlbHMgcGVyIGNoYW5uZWwgKGtleSAwOiB0aGUgZ3JheXNjYWxlIG9uZSksIGl0cyBmcmFtZSwgYW5kIHdoZXRoZXJcbiAgICogaXQgaXMgYSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIOKAlCB3aGF0IHRoZSBzZWN0aW9ucyBiZXNpZGUgaXQgYXJlIGN1dCBmcm9tLiBOdWxsIGJlZm9yZSBpdCBpc1xuICAgKiBhc3NlbWJsZWQuXG4gICAqL1xuICB2b2x1bWVWb3hlbHMoKTogVm9sdW1lVm94ZWxzT25TY3JlZW4gfCBudWxsIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy53b3JsZEJhc2U7XG4gICAgaWYgKCF0aGlzLmRpbXMgfHwgIWJhc2UgfHwgIXRoaXMuZnVsbFNpemUgfHwgIXRoaXMuY2hhbm5lbERhdGEuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZGVwdGggPSBiYXNlLmRlcHRoICogdGhpcy5jdHguc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmRpbXMsXG4gICAgICBjaGFubmVsczogdGhpcy5jaGFubmVsRGF0YSxcbiAgICAgIG11bHRpY2hhbm5lbDogdGhpcy5tdWx0aWNoYW5uZWwsXG4gICAgICBmcmFtZTogeyBzaXplOiB0aGlzLmZ1bGxTaXplLCB3b3JsZDogW2Jhc2Uud2lkdGgsIGJhc2UuaGVpZ2h0LCBkZXB0aF0gfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tpbmcgdGhlIHJlY29uc3RydWN0aW9uczogd2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wgYXJtZWQsIGEgY2xpY2sgb24gb25lIHNlbGVjdHMgaXRzIGNsYXNzXG4gICAqIChudWxsIGJlc2lkZSB0aGVtKTsgcmVzdGluZyBvdmVyIG9uZSBuYW1lcyBpdCwgd2hhdGV2ZXIgdGhlIHRvb2wuXG4gICAqL1xuICBwcml2YXRlIGxpc3RlblRvUmVnaW9uTWVzaGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGlmICh0aGlzLm1lc2hQb2ludGVyKSByZXR1cm47XG4gICAgdGhpcy50b29sU3ViID0gY3R4LnN0b3JlLmdldEFjdGl2ZVRvb2wkKCkuc3Vic2NyaWJlKCh0b29sKSA9PiAodGhpcy5zZWxlY3RpbmcgPSB0b29sID09PSAnc2VsZWN0JykpO1xuICAgIHRoaXMubWVzaFBvaW50ZXIgPSBjdHgub3V0c2lkZVpvbmUoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgUmVnaW9uTWVzaFBvaW50ZXIoY3R4LmNhbnZhcywgY3R4Lmhvc3QsIHtcbiAgICAgICAgICBwaWNrQXQ6ICh4LCB5KSA9PiB0aGlzLnJlZ2lvbk1lc2hlcy5waWNrQXQoeCwgeSksXG4gICAgICAgICAgYWN0aXZlOiAoKSA9PiB0aGlzLnNlbGVjdGluZyAmJiB0aGlzLnJlZ2lvbk1lc2hlcy5zaG93bi5sZW5ndGggPiAwLFxuICAgICAgICAgIGhvdmVyYWJsZTogKCkgPT4gdGhpcy5yZWdpb25NZXNoZXMuc2hvd24ubGVuZ3RoID4gMCxcbiAgICAgICAgICBvblBpY2s6IChrZXksIGFkZGl0aXZlKSA9PiBjdHguaW5ab25lKCgpID0+IGN0eC5yZWdpb25NZXNoUGlja2VkKGtleSwgYWRkaXRpdmUpKSxcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBJbWFnZSBweCBwZXIgdm94ZWwgb2YgdGhlIGFzc2VtYmxlZCB2b2x1bWUgKGluLXBsYW5lKSwgb3IgbnVsbCBiZWZvcmUgaXQgaXMgYXNzZW1ibGVkLiAqL1xuICB2b3hlbFN0ZXAoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZnVsbFNpemUgJiYgdGhpcy5kaW1zID8gdGhpcy5mdWxsU2l6ZVswXSAvIE1hdGgubWF4KDEsIHRoaXMuZGltcy53aWR0aCkgOiBudWxsO1xuICB9XG5cbiAgLyoqIFBsYWNlIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIGluIHRoZSB2b2x1bWUncyB3b3JsZCBib3ggYXMgaXQgaXMgbm93LiAqL1xuICBwcml2YXRlIGZyYW1lUmVnaW9uTWVzaGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLndvcmxkQmFzZTtcbiAgICBpZiAoIWJhc2UgfHwgIXRoaXMuZnVsbFNpemUpIHJldHVybjtcbiAgICBjb25zdCBkZXB0aCA9IGJhc2UuZGVwdGggKiB0aGlzLmN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGU7XG4gICAgY29uc3QgZnJhbWU6IFZvbHVtZUZyYW1lID0geyBzaXplOiB0aGlzLmZ1bGxTaXplLCB3b3JsZDogW2Jhc2Uud2lkdGgsIGJhc2UuaGVpZ2h0LCBkZXB0aF0gfTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5zbGljZVBsYW5lcy5zZXRGcmFtZShmcmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgYW5kIHJlbmRlciB0aGUgdm9sdW1lLCB0aGVuIGFkZCB0aGUgYXhlcyBnaXptbyArIGxhYmVscyBhbmQgdGhlIFogaGFuZGxlIGFuZCBmb2xsb3dcbiAgICogdGhlIGRpc3BsYXkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCwgaW5mbyB9ID0gdGhpcztcbiAgICBjb25zdCBsb2FkaW5nID0gY3R4LmxvYWRpbmcoKTsgLy8gYmFpbCBiZWZvcmUgcmVuZGVyaW5nIG9uIGEgQ2FuY2VsIC8gbmV3IHBsb3RcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgY3R4LnRpbGVzLmVuc3VyZURlc2NyaXB0b3IoY3R4LmluZm8oKSk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoSW1hZ2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwoY3R4LnRpbGVzLmlzU2ltcGxlKGluZm8pLCBpbmZvKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBzaW1wbGVNYyA/IGluZm8hLmltYWdlTWV0YSFbMF0uY2hhbm5lbENvdW50IDogKGRlc2M/LmNoYW5uZWxzID8/IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxKTtcblxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLm11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcoY3R4LnZpZXdlcik7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICBjb25zdCB7IGRpbXMsIGNoYW5uZWxzIH0gPSBhd2FpdCB0aGlzLmFzc2VtYmxlQ2hhbm5lbHMoZGVzYywgY2hhbm5lbENvdW50LCBsb2FkaW5nKTtcbiAgICBpZiAoIWRpbXMgfHwgIWNoYW5uZWxzLmxlbmd0aCB8fCBsb2FkaW5nLmFib3J0ZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXJcblxuICAgIGNvbnN0IHdvcmxkID0gdGhpcy53b3JsZEJveChkaW1zKTtcbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLndvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMuc2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiBjdHguc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgd29ybGQud2lkdGggLyBkaW1zLndpZHRoLFxuICAgICAgd29ybGQuaGVpZ2h0IC8gZGltcy5oZWlnaHQsXG4gICAgICB3b3JsZFogLyB0aGlzLnNhbXBsZWREZXB0aCxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2ggb2YgY2hhbm5lbHMpIGNoLnZveGVsU2l6ZSA9IHZveGVsU2l6ZTtcblxuICAgIHZpZXcucmVuZGVyKHRoaXMubXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJywgY2hhbm5lbHMsIHsgcmVuZGVyaW5nOiB0aGlzLnJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmFwcGx5Vm9sdW1lRGVwdGgoKTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKGRpbXMud2lkdGgsIGRpbXMuaGVpZ2h0KTtcbiAgICB0aGlzLmRpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIGNvbnN0IGJveCA9IHsgd2lkdGg6IHdvcmxkLndpZHRoLCBoZWlnaHQ6IHdvcmxkLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9O1xuICAgIHRoaXMuZ2l6bW8gPSBuZXcgQXhlczNkR2l6bW8oY3R4LnZpZXdlciwgY3R4Lmhvc3QsIGJveCwgdGhpcy5heGVzTGFiZWxzKGJveCksIHtcbiAgICAgIHZpc2libGU6IGN0eC5zZXR0aW5ncy5heGVzVmlzaWJsZSxcbiAgICB9KTtcbiAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgIC8vIFwiWlwiIGF4aXMgKyBsYWJlbCBsaXZlKSwgc28gaXQgcmVhZHMgYXMgdGhlIFotaGVpZ2h0IGNvbnRyb2wuIEZsb2F0ZWQgYSBsaXR0bGUgcGFzdCB0aGUgYXhpc1xuICAgIC8vIHRpcCAow5cxLjEyKSBzbyB0aGUgZ3JpcCBjbGVhcnMgdGhlIFwiWiDCtyDigKZcIiBsYWJlbC4gRHJhZyDihpUgdG8gcmVzdHJldGNoIFogbGl2ZS5cbiAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZShjdHguaG9zdCwgY3R4LnZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgdG9wQW5jaG9yOiAoKSA9PiBbXG4gICAgICAgIC10aGlzLndvcmxkQmFzZSEud2lkdGggLyAyLFxuICAgICAgICAtdGhpcy53b3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICgodGhpcy53b3JsZEJhc2UhLmRlcHRoICogY3R4LnNldHRpbmdzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICBdLFxuICAgICAgZ2V0U2NhbGU6ICgpID0+IGN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGUsXG4gICAgICBzZXRTY2FsZTogKHMpID0+IHRoaXMuc2V0WlNjYWxlKHMpLFxuICAgIH0pO1xuICAgIHRoaXMuZm9sbG93RGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5mcmFtZVJlZ2lvbk1lc2hlcygpO1xuICAgIHRoaXMubGlzdGVuVG9SZWdpb25NZXNoZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBlYWNoIGNoYW5uZWwncyB2b2x1bWUgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpIHVuZGVyXG4gICAqIHRoZSBzdGFjayBwcm9ncmVzcyBiYXIsIHdpdGggdGhlIGRpc3BsYXkgc2V0dGluZ3MgaXQgaXMgZHJhd24gd2l0aC4gYGRpbXNgIGlzIG51bGwgd2hlblxuICAgKiBub3RoaW5nIHdhcyBhc3NlbWJsZWQgKGEgQ2FuY2VsLCBhIG5ldyBwbG90LCBvciBubyBzbGljZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJsZUNoYW5uZWxzKFxuICAgIGRlc2M6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCxcbiAgICBjaGFubmVsQ291bnQ6IG51bWJlcixcbiAgICBsb2FkaW5nOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IGRpbXM6IEJveDMgfCBudWxsOyBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdIH0+IHtcbiAgICBjb25zdCB7IGN0eCwgaW5mbyB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHN0YXRlcyA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIHRoZSByZXZlcnNlIGZsaXApIGFuZCBpbnZlcnQuXG4gICAgbGV0IGRpbXM6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdID0gW107XG4gICAgY3R4LnN0YWNrLmxvYWRpbmcodHJ1ZSk7XG4gICAgY3R4LnN0YWNrLnByb2dyZXNzKDApO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5tdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nLCBjKTtcbiAgICAgICAgICBpZiAobG9hZGluZy5hYm9ydGVkKSBicmVhazsgLy8gYSBDYW5jZWwgLyBuZXcgcGxvdDogZmV0Y2ggbm8gZnVydGhlciBjaGFubmVsXG4gICAgICAgICAgaWYgKCF2b2wpIGNvbnRpbnVlO1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoYywgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IGN0eC5kaXNwbGF5LmNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3IpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiB0b05hcGFyaUdhbW1hKHN0Py5nYW1tYSksIC8vIEltYWdlSiDOsyDihpIgbmFwYXJpLWpzIM6zXG4gICAgICAgICAgICBpbnZlcnQ6IGN0eC5kaXNwbGF5LmludmVydCxcbiAgICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nKTtcbiAgICAgICAgaWYgKHZvbCkge1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoMCwgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiBjdHguZGlzcGxheS52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3Q/LmdhbW1hKSwgLy8gSW1hZ2VKIM6zIOKGkiBuYXBhcmktanMgzrNcbiAgICAgICAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGltcywgY2hhbm5lbHMgfTtcbiAgfVxuXG4gIC8qKiBUaGUgdm9sdW1lJ3Mgd29ybGQgYm94IGZvciB0aGUgYXNzZW1ibGVkIGBkaW1zYCwgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB3b3JsZEJveChkaW1zOiBCb3gzKTogQm94MyB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgLy8gUmVzb2x1dGlvbi1pbnZhcmlhbnQgd29ybGQgYm94OyB0aGUgcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkXG4gICAgLy8gZ3JpZCBvbnRvIGl0LlxuICAgIC8vXG4gICAgLy8gQSBzdGFjayB0aGF0IGRlY2xhcmVzIGl0cyBwaHlzaWNhbCBzcGFjaW5nIG9uIEFMTCBUSFJFRSBheGVzIGdldHMgaXRzIHRydWVcbiAgICAvLyBleHRlbnQgYXMgdGhlIHdvcmxkIGJveCDigJQgdGhlIG9ubHkgd2F5IGFuaXNvdHJvcHkgc3Vydml2ZXMsIGFuZCB3aGF0IG1ha2VzIGFcbiAgICAvLyByZXNhbXBsZWQgNDAgeCA0MCB4IDIwMCDCtW0gdm9sdW1lIHJlYWQgYXMgYSBicmFpbiBpbnN0ZWFkIG9mIGEgY3ViZS1hc3BlY3RcbiAgICAvLyBicmljay4gSXQgbmVlZHMgbm9uZSBvZiB0aGUgcmVmZXJlbmNlLWJveCBhcml0aG1ldGljOiBhIHBoeXNpY2FsIGJveCBpc1xuICAgIC8vIGFscmVhZHkgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyB0aGF0IGFyaXRobWV0aWMuIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsXG4gICAgLy8gY291bnRzIG1hZGUgaGlnaGVyIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGVcbiAgICAvLyAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi5cbiAgICAvLyBBbmNob3JpbmcgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmQgbGV0dGluZyBaIHNwYW4gdGhlXG4gICAgLy8gZnVsbCBzbGljZSBjb3VudCBtYWtlcyB0aGUgYm94IHNoYXBlIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuXG4gICAgY29uc3QgbWV0YSA9IGN0eC5pbmZvKCk/LmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGltYWdlRGVzYyA9IGN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihjdHguaW5mbygpKTtcbiAgICAvLyBUaGUgc2VydmVyJ3MgZGVzY3JpcHRvciBmaXJzdCAoaXQgcmVwb3J0cyBhIHRpbGVkIHN0YWNrJ3Mgc3BhY2luZywgZS5nLiBhIE5SUkQgdm9sdW1lJ3MpLCBlbHNlXG4gICAgLy8gdGhlIGltYWdlIG1ldGFkYXRhLlxuICAgIGNvbnN0IG14ID0gaW1hZ2VEZXNjPy5tcHBYIHx8IG1ldGE/Lm1wcFg7XG4gICAgY29uc3QgbXkgPSBpbWFnZURlc2M/Lm1wcFkgfHwgbWV0YT8ubXBwWTtcbiAgICBjb25zdCBteiA9IGltYWdlRGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaO1xuICAgIGNvbnN0IG1wcFhZWjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG14ICYmIG15ICYmIG16ID8gW214LCBteSwgbXpdIDogbnVsbDtcbiAgICAvLyBUaGUgaW1hZ2UncyBERUNMQVJFRCBwaXhlbCBkaW1lbnNpb25zLCB3aGljaCBpcyB3aGF0IG1wcCBpcyBwZXI6IHRoZSBzYW1wbGVkXG4gICAgLy8gZGltcyBhcmUgZGVjaW1hdGVkLCBzbyBzaXppbmcgYSBwaHlzaWNhbCBib3ggYnkgdGhlbSB3b3VsZCBtYWtlIHRoZSB3b3JsZFxuICAgIC8vIGJveCBkZXBlbmQgb24gdGhlIHJlc29sdXRpb24gdGhlIHVzZXIgaGFwcGVucyB0byBiZSB2aWV3aW5nIGF0LlxuICAgIGNvbnN0IGZ1bGxXID0gaW1hZ2VEZXNjPy53aWR0aCA/PyBtZXRhPy54ID8/IGRpbXMud2lkdGg7XG4gICAgY29uc3QgZnVsbEggPSBpbWFnZURlc2M/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXMuaGVpZ2h0O1xuICAgIGNvbnN0IGZ1bGxEID0gc3RhY2tEZXB0aChjdHguaW5mbygpKSB8fCBkaW1zLmRlcHRoO1xuICAgIHRoaXMuZnVsbFNpemUgPSBbZnVsbFcsIGZ1bGxILCBmdWxsRF07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IGZ1bGxXICogbXBwWFlaWzBdLFxuICAgICAgICBoZWlnaHQ6IGZ1bGxIICogbXBwWFlaWzFdLFxuICAgICAgICBkZXB0aDogZnVsbEQgKiBtcHBYWVpbMl0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmdWxsTG9uZyA9IE1hdGgubWF4KDEsIGZ1bGxXLCBmdWxsSCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgIGRlcHRoOiBmdWxsRCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB3aG9sZSBzdGFjayBpcyBhbHJlYWR5IG9uIHNjcmVlbjogbm8gcGxhbmUgdG8gc3RlcC4gKFRoaXMgdXNlZCB0byB3cml0ZSBgdmlld2VyLmRpbXMuemAsXG4gICAqIHdoaWNoIG9ubHkgYSB0aWxlZCAyRCBpbWFnZSByZWFkcyDigJQgYSB2b2x1bWUgcmF5bWFyY2hlcyBldmVyeSBzbGljZSDigJQgYW5kIHNjaGVkdWxlIGEgcmVhZGJhY2tcbiAgICogb2YgYSBmcmFtZSB0aGF0IGhhZCBub3QgY2hhbmdlZC4gVGhlIHRvb2xiYXIgc2hvd3Mgbm8gc2xpY2UgY29udHJvbCBpbiB2b2x1bWUgLyBpc29zdXJmYWNlXG4gICAqIG1vZGUsIGFzIFBsb3RseSdzIGlzb3N1cmZhY2UgaWdub3JlcyB0aGUgc2xpY2UgdG9vLilcbiAgICovXG4gIHNldFooKTogdm9pZCB7XG4gICAgLyogbm90aGluZyB0byBzdGVwICovXG4gIH1cblxuICAvKiogVGhlIGludGVuc2l0eSBoaXN0b2dyYW0gb2YgdGhlIGFzc2VtYmxlZCAoZG93bnNhbXBsZWQpIHVpbnQ4IHZvbHVtZSBmb3IgdGhlIHJlcXVlc3RlZFxuICAgKiAgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUuICovXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gY2hhbm5lbEhpc3RvZ3JhbSh0aGlzLmNoYW5uZWxEYXRhLCBjaGFubmVsLCBiaW5zKTtcbiAgfVxuXG4gIGlzb0NvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ID8gc3VyZmFjZTNkQ29udHJvbHModGhpcy5jdHgsICgpID0+IHRoaXMuZ2l6bW8pIDogbnVsbDtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5naXptbz8uZGVzdHJveSgpO1xuICAgIHRoaXMuZ2l6bW8gPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXIoKTtcbiAgICB0aGlzLnNsaWNlUGxhbmVzLmRlc3Ryb3koKTtcbiAgICB0aGlzLm1lc2hQb2ludGVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5tZXNoUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy50b29sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudG9vbFN1YiA9IG51bGw7XG4gICAgdGhpcy53b3JsZEJhc2UgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBzZXRaU2NhbGUoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSB0aGlzLmN0eDtcbiAgICBzZXR0aW5ncy52b2x1bWVaU2NhbGUgPSBNYXRoLm1pbigxMCwgTWF0aC5tYXgoMC4xLCBmYWN0b3IpKTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy53b3JsZEJhc2U7XG4gICAgaWYgKCFiYXNlIHx8ICF0aGlzLnZpZXcpIHJldHVybjtcbiAgICBjb25zdCB3b3JsZFogPSBiYXNlLmRlcHRoICogc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMuc2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICB0aGlzLmdpem1vPy5zZXREZXB0aCh3b3JsZFosIHRoaXMuYXhlc0xhYmVscyh7IHdpZHRoOiBiYXNlLndpZHRoLCBoZWlnaHQ6IGJhc2UuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLmZyYW1lUmVnaW9uTWVzaGVzKCk7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBUaGUgWC9ZL1ogYXhpcy1lbmQgbGFiZWwgc3BlY3MgZm9yIHRoZSBnaXptby4gQW5jaG9ycyBhcmUgaW4gdGhlIHZvbHVtZSdzIGNlbnRyZWQgd29ybGQgYm94XG4gICAqICAobWF0Y2hpbmcgdGhlIEF4ZXNMYXllciBnZW9tZXRyeSk7IHRoZSBzY2FsZSB0ZXh0IHJlZmxlY3RzIHRoZSBGVUxMIGltYWdlIGV4dGVudCDigJQgcGh5c2ljYWwgwrVtXG4gICAqICB3aGVuIMK1bS9waXhlbCBpcyBrbm93biwgZWxzZSBwaXhlbCAoWC9ZKSAvIHNsaWNlIChaKSBjb3VudHMuICovXG4gIGF4ZXNMYWJlbHModm9sOiBCb3gzKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgICBjb25zdCBoeCA9IHZvbC53aWR0aCAvIDI7XG4gICAgY29uc3QgaHkgPSB2b2wuaGVpZ2h0IC8gMjtcbiAgICBjb25zdCBoeiA9IHZvbC5kZXB0aCAvIDI7XG4gICAgLy8gTWVhc3VyZWQgZnJvbSB0aGUgSU1BR0UncyBvd24gZXh0ZW50LCBuZXZlciBmcm9tIHRoZSB3b3JsZCBib3g6IHRoZSBib3ggaXMgYVxuICAgIC8vIHNoYXBlIChhbmQgZm9yIGEgcGh5c2ljYWxseSBzaXplZCB2b2x1bWUgaXQgaXMgYWxyZWFkeSBpbiDCtW0sIHNvIHJlYWRpbmcgYVxuICAgIC8vIHBpeGVsIGNvdW50IG9mZiBpdCBhbmQgbXVsdGlwbHlpbmcgYnkgbXBwIHdvdWxkIHNjYWxlIHRoZSBsYWJlbCB0d2ljZSkuXG4gICAgY29uc3QgeyBweCwgbXBwIH0gPSB0aGlzLmltYWdlRXh0ZW50KCk7XG4gICAgY29uc3QgbGVuID0gKG46IG51bWJlciwgdW06IG51bWJlcik6IHN0cmluZyA9PiAodW0gPiAwID8gZm9ybWF0TGVuZ3RoKG4gKiB1bSwgJ8K1bScpIDogYCR7bn0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihweFswXSwgbXBwWzBdKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKHB4WzFdLCBtcHBbMV0pfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIC8vIFBoeXNpY2FsIHdoZW4gdGhlIHN0YWNrIGRlY2xhcmVzIGl0cyBzbGljZSBzcGFjaW5nIChgbXBwWmApIOKAlCBhIHJlc2FtcGxlZFxuICAgICAgLy8gdm9sdW1lIGtub3dzIGhvdyB0aGljayBpdCBpczsgYSBwbGFpbiB6LXN0YWNrIGNhbiBvbmx5IHNheSBob3cgbWFueSBzbGljZXMuXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKHB4WzJdLCBtcHBbMl0pfWAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSdzIGRlY2xhcmVkIGV4dGVudCBpbiBwaXhlbHMvc2xpY2VzLCBhbmQgaXRzIHBoeXNpY2FsIHNwYWNpbmcgcGVyXG4gICAqIGF4aXMgaW4gwrVtICgwID0gdW5kZWNsYXJlZCwgYW5kIHRoZW4gdGhhdCBheGlzIHJlYWRzIGluIHBpeGVscykuXG4gICAqXG4gICAqIE9uZSBwbGFjZSwgYmVjYXVzZSB0aGUgdm9sdW1lIHdvcmxkIGJveCBhbmQgdGhlIGF4aXMgbGFiZWxzIGhhdmUgdG8gYWdyZWVcbiAgICogYWJvdXQgd2hhdCB0aGUgaW1hZ2UncyByZWFsIGRpbWVuc2lvbnMgYXJlIOKAlCB0aGUgc2FtcGxlZCBncmlkIGlzIGRlY2ltYXRlZCBhbmRcbiAgICogc2F5cyBub3RoaW5nIGFib3V0IGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VFeHRlbnQoKTogeyBweDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtcHA6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5jdHguaW5mbygpO1xuICAgIGNvbnN0IG1ldGEgPSBpbmZvPy5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBkaW1zID0gdGhpcy5kaW1zO1xuICAgIGNvbnN0IGRlc2MgPSB0aGlzLmN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihpbmZvKTtcbiAgICBjb25zdCBtcHBYID0gZGVzYz8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIGRlc2M/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcz8ud2lkdGggPz8gMSxcbiAgICAgICAgZGVzYz8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcz8uaGVpZ2h0ID8/IDEsXG4gICAgICAgIHN0YWNrRGVwdGgoaW5mbykgfHwgZGltcz8uZGVwdGggfHwgMSxcbiAgICAgIF0sXG4gICAgICAvLyBBIGRlc2NyaXB0b3IgdGhhdCByZXBvcnRzIG9ubHkgbXBwWCBpcyBzcXVhcmUtcGl4ZWwgYnkgY29udmVudGlvbiwgd2hpY2ggaXNcbiAgICAgIC8vIHdoYXQgdGhlIDJEIHNjYWxlIGJhciBhbHJlYWR5IGFzc3VtZXMgb2YgaXQuXG4gICAgICBtcHA6IFttcHBYLCBkZXNjPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgZGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaIHx8IDBdLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0b3JlJ3MgY29sb3JtYXAsIHJldmVyc2UsIGludmVydCBhbmQgY2hhbm5lbCB3aW5kb3dzIOKGkiB0aGUgdm9sdW1lJ3MgdHJhbnNmZXIgZnVuY3Rpb246XG4gICAqICBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgd2luZG93IChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cylcbiAgICogIGFuZCBnYW1tYSwgbWlycm9yaW5nIHRoZSBncmF5c2NhbGUgaW1hZ2UncyBkaXNwbGF5IGNvbnRyb2xzIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlXG4gICAqICAzRCByZW5kZXIuICovXG4gIHByaXZhdGUgZm9sbG93RGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGlzcGxheSB9ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXc7XG4gICAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLm11bHRpY2hhbm5lbCkge1xuICAgICAgICAvLyBFYWNoIGNoYW5uZWwncyBsYXllciBpcyB0aW50ZWQgYnkgaXRzIGNvbG91ciBhbmQgZ2V0cyBpdHMgb3duIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5LlxuICAgICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkuY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKSxcbiAgICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3QuZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBOQVBBUklfU0NBVFRFUjNEIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBIKTogdGhlIGRvd25zYW1wbGVkIHZveGVsIGdyaWQgYXMgYSAzRCBwb2ludCBjbG91ZFxuICogY29sb3VyZWQgYnkgaW50ZW5zaXR5ICh0aGUgbmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyB2b3hlbCBzY2F0dGVyM2QpLiBBc3NlbWJsZXMgYSBjb2Fyc2VcbiAqIHZvbHVtZSwgdGhlbiBlbWl0cyBhIGZsYXQtc3RyaWRlZCBzYW1wbGUgb2Ygdm94ZWxzIChjYXBwZWQgYXQgYFNDQVRURVIzRF9NQVhfUE9JTlRTYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2F0dGVyM2RTY2VuZSBpbXBsZW1lbnRzIE5hcGFyaVNjZW5lIHtcbiAgcHJpdmF0ZSBsYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKSwgZm9yIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICkge31cblxuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGN0eC5zdGFjay5sb2FkaW5nKHRydWUpO1xuICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICBsZXQgdm9sOiBBc3NlbWJsZWRWb2x1bWUgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdm9sID0gYXdhaXQgYXNzZW1ibGUoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5pbmZvLFxuICAgICAgICB7IG1heFNsaWNlOiBNYXRoLm1pbihyZXMubWF4U2xpY2UsIFNDQVRURVIzRF9NQVhfWFkpLCBzbGljZVN0ZXA6IHJlcy5zbGljZVN0ZXAgfSxcbiAgICAgICAgY3R4LmxvYWRpbmcoKSxcbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgaWYgKCF2b2wgfHwgY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIHRoaXMubGF5ZXIgPSBjdHgudmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIC8vIEZlZWQgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gZnJvbSB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoa2V5IDApLlxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5uZWxEYXRhLnNldCgwLCBkYXRhKTtcbiAgICAvLyBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIGNsb3VkJ3MgY29sb3JtYXAgKyBjb250cmFzdC5cbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjdHguZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcjtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHMgPSBjaGFubmVsc1swXTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAocyk7XG4gICAgICBsYXllci5pbnZlcnQgPSBjdHguZGlzcGxheS5pbnZlcnQ7XG4gICAgICBpZiAocykgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbcy5taW4sIHMubWF4XTtcbiAgICAgIGN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogVGhlIHdob2xlIHN0YWNrIGlzIGFscmVhZHkgb24gc2NyZWVuOiBubyBwbGFuZSB0byBzdGVwLiAqL1xuICBzZXRaKCk6IHZvaWQge1xuICAgIC8qIG5vdGhpbmcgdG8gc3RlcCAqL1xuICB9XG5cbiAgaGlzdG9ncmFtKGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiBjaGFubmVsSGlzdG9ncmFtKHRoaXMuY2hhbm5lbERhdGEsIGNoYW5uZWwsIGJpbnMpO1xuICB9XG5cbiAgc3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIgPyBzdXJmYWNlM2RDb250cm9scyh0aGlzLmN0eCwgKCkgPT4gbnVsbCkgOiBudWxsO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgfVxufVxuIl19
554
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1zY2VuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdm9sdW1lLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTWxELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxXQUFXLEVBQVEsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLFVBQVUsRUFDVixPQUFPLEVBQ1AsWUFBWSxFQUNaLGFBQWEsRUFDYixtQkFBbUIsR0FDcEIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQTZCLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUYsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFakUscUdBQXFHO0FBQ3JHLFNBQVMsZ0JBQWdCLENBQUMsSUFBNkIsRUFBRSxPQUFlLEVBQUUsSUFBWTtJQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzNFLENBQUM7QUFFRDs7cUdBRXFHO0FBQ3JHLFNBQVMsUUFBUSxDQUNmLEdBQWlCLEVBQ2pCLElBQTRCLEVBQzVCLElBQStDLEVBQy9DLE9BQW9CLEVBQ3BCLE9BQWdCO0lBRWhCLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7UUFDbkQsTUFBTSxFQUFFLE9BQU87UUFDZixRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUN2QyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBMkJ0QixZQUNtQixHQUFpQixFQUNqQixJQUE0QixFQUM1QixTQUF3QjtRQUZ4QixRQUFHLEdBQUgsR0FBRyxDQUFjO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQXdCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWU7UUE3QjNDLDBEQUEwRDtRQUMxRCxTQUFJLEdBQWtDLElBQUksQ0FBQztRQUMzQyxpR0FBaUc7UUFDekYsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDN0I7NkZBQ3FGO1FBQzdFLGNBQVMsR0FBZ0IsSUFBSSxDQUFDO1FBQzlCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQ2pDO2dHQUN3RjtRQUN2RSxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO1FBQzdELFVBQUssR0FBdUIsSUFBSSxDQUFDO1FBQ3pCLFlBQU8sR0FBK0IsSUFBSSxDQUFDO1FBQzNDLGVBQVUsR0FBd0IsSUFBSSxDQUFDO1FBSy9DLDRFQUE0RTtRQUNwRSxhQUFRLEdBQW9DLElBQUksQ0FBQztRQUN6RCx5RUFBeUU7UUFDakUsZ0JBQVcsR0FBNkIsSUFBSSxDQUFDO1FBQzdDLFlBQU8sR0FBd0IsSUFBSSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUEwQjFCLDBGQUEwRjtRQUNsRixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQXBCN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzdELE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDNUUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixlQUFlLENBQUMsTUFBK0I7UUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQXVCO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBdUI7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUtEOzs7Ozs7T0FNRztJQUNILHVCQUF1QixDQUFDLE9BQWdCO1FBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDOUIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDaEYsQ0FBQztJQUNILENBQUM7SUFFRCx5RkFBeUY7SUFDekYsY0FBYyxDQUFDLE1BQW1CO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWTtRQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUQsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDMUIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtTQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLG9CQUFvQjtRQUMxQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNwRyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQ2hDLEdBQUcsRUFBRSxDQUNILElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbEUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNqRixDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCw2RkFBNkY7SUFDN0YsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RixDQUFDO0lBRUQsK0VBQStFO0lBQ3ZFLGlCQUFpQjtRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQWdCO1lBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNuQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1NBQ3ZDLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7UUFDOUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELDhFQUE4RTtRQUM5RSw4RUFBOEU7UUFDOUUscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUFDLFNBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RixNQUFNLFlBQVksR0FBRyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsMkJBQTJCO1FBRXJGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsaUdBQWlHO1FBQ2pHLDRGQUE0RjtRQUM1RixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUE2QjtZQUMxQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQ3hCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDMUIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZO1NBQzNCLENBQUM7UUFDRixLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVE7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUVwRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2RyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLGdHQUFnRztRQUNoRyx3RkFBd0Y7UUFDeEYsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDNUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVztTQUNsQyxDQUFDLENBQUM7UUFDSCw0RkFBNEY7UUFDNUYsOEZBQThGO1FBQzlGLGdGQUFnRjtRQUNoRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNwRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUMxQixDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBVSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUk7YUFDakU7WUFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLElBQTJCLEVBQzNCLFlBQW9CLEVBQ3BCLE9BQW9CO1FBRXBCLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRWhELCtGQUErRjtRQUMvRiw4RkFBOEY7UUFDOUYsNkZBQTZGO1FBQzdGLElBQUksSUFBSSxHQUFnQixJQUFJLENBQUM7UUFDN0IsTUFBTSxRQUFRLEdBQW9CLEVBQUUsQ0FBQztRQUNyQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELElBQUksT0FBTyxDQUFDLE9BQU87d0JBQUUsTUFBTSxDQUFDLGdEQUFnRDtvQkFDNUUsSUFBSSxDQUFDLEdBQUc7d0JBQUUsU0FBUztvQkFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RSxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNaLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTt3QkFDZCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7d0JBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTt3QkFDbEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO3dCQUNoQixRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7d0JBQ2hELGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDO3dCQUM5QyxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSx5QkFBeUI7d0JBQzFELE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU07d0JBQzFCLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFJLElBQUk7cUJBQzdCLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxHQUFHLE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQixRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNaLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTt3QkFDZCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7d0JBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTt3QkFDbEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO3dCQUNoQixRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO3dCQUN4QyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQzt3QkFDOUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUseUJBQXlCO3dCQUMxRCxNQUFNLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNO3FCQUMzQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2dCQUFTLENBQUM7WUFDVCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsMkZBQTJGO0lBQ25GLFFBQVEsQ0FBQyxJQUFVO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDckIsNkZBQTZGO1FBQzdGLGdCQUFnQjtRQUNoQixFQUFFO1FBQ0YsNkVBQTZFO1FBQzdFLCtFQUErRTtRQUMvRSw2RUFBNkU7UUFDN0UsMEVBQTBFO1FBQzFFLDhDQUE4QztRQUM5QyxFQUFFO1FBQ0YsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSx5RUFBeUU7UUFDekUsK0VBQStFO1FBQy9FLDJFQUEyRTtRQUMzRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxpR0FBaUc7UUFDakcsc0JBQXNCO1FBQ3RCLE1BQU0sRUFBRSxHQUFHLFNBQVMsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQztRQUN6QyxNQUFNLEVBQUUsR0FBRyxTQUFTLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFvQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDckYsK0VBQStFO1FBQy9FLDRFQUE0RTtRQUM1RSxrRUFBa0U7UUFDbEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLEtBQUssRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUN6QixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsS0FBSyxFQUFFLENBQUMsS0FBSyxHQUFHLHdCQUF3QixDQUFDLEdBQUcsUUFBUTtZQUNwRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxRQUFRO1lBQ3JELEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUk7UUFDRixxQkFBcUI7SUFDdkIsQ0FBQztJQUVEO2lFQUM2RDtJQUM3RCxTQUFTLENBQUMsT0FBZSxFQUFFLElBQVk7UUFDckMsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVCLE9BQU87WUFDTCxXQUFXLEVBQUUsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFRLEVBQUU7Z0JBQ3BELHlDQUF5QztnQkFDekMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDNUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDeEMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLE1BQWM7UUFDdEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDOUIsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDbEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNqQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOzt1RUFFbUU7SUFDbkUsVUFBVSxDQUFDLEdBQVM7UUFDbEIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDekIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDMUIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDekIsK0VBQStFO1FBQy9FLDZFQUE2RTtRQUM3RSwwRUFBMEU7UUFDMUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakcsT0FBTztZQUNMLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDL0UsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUMvRSw0RUFBNEU7WUFDNUUsOEVBQThFO1lBQzlFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7U0FDaEYsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssV0FBVztRQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7UUFDM0MsT0FBTztZQUNMLEVBQUUsRUFBRTtnQkFDRixJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDO2dCQUMxQyxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDO2dCQUM1QyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDO2FBQ3JDO1lBQ0QsOEVBQThFO1lBQzlFLCtDQUErQztZQUMvQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1NBQzdFLENBQUM7SUFDSixDQUFDO0lBRUQ7OztxQkFHaUI7SUFDVCxrQkFBa0I7UUFDeEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPO1lBQ2xCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0Qix5RkFBeUY7Z0JBQ3pGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMzQixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRTt3QkFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLFNBQVMsQ0FBQzt3QkFDN0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO3dCQUN0QixHQUFHLENBQUMsRUFBRTs0QkFDSixDQUFDLENBQUM7Z0NBQ0UsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFxQjtnQ0FDcEQsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUseUJBQXlCO2dDQUN6RCxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU87NkJBQ3BCOzRCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ1IsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUU7b0JBQ3BCLFFBQVEsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO29CQUN0QixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBcUIsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ3hHLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQU16QixZQUNtQixHQUFpQixFQUNqQixJQUE0QjtRQUQ1QixRQUFHLEdBQUgsR0FBRyxDQUFjO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQXdCO1FBUHZDLFVBQUssR0FBeUIsSUFBSSxDQUFDO1FBQzNDLGlFQUFpRTtRQUNoRCxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO1FBQ3JELGVBQVUsR0FBd0IsSUFBSSxDQUFDO0lBSzVDLENBQUM7SUFFSixLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLEdBQUcsR0FBMkIsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQztZQUNILEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FDbEIsR0FBRyxFQUNILElBQUksQ0FBQyxJQUFJLEVBQ1QsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsRUFDaEYsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUNkLENBQUM7UUFDSixDQUFDO2dCQUFTLENBQUM7WUFDVCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRXZDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7UUFDOUUsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztRQUN6QixNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hGLFFBQVEsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDOUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUMxQixJQUFJLEVBQUUsQ0FBQztTQUNSLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5Qix3RkFBd0Y7UUFDeEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTztZQUNuQixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2xDLElBQUksQ0FBQztnQkFBRSxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0MsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsOERBQThEO0lBQzlELElBQUk7UUFDRixxQkFBcUI7SUFDdkIsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFlLEVBQUUsSUFBWTtRQUNyQyxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3LCBoaXN0b2dyYW1TY2FsYXIgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBQb2ludHMzRExheWVyLCBWb2x1bWVDaGFubmVsIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB7IGZvcm1hdExlbmd0aCB9IGZyb20gJ25hcGFyaS1qcy9vdmVybGF5cyc7XG5pbXBvcnQgdHlwZSB7IEF4aXNMYWJlbFNwZWMgfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElJc29zdXJmYWNlQ29udHJvbHMsIElTdXJmYWNlM2RDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IE5hcGFyaVZvbHVtZVpIYW5kbGUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtei1oYW5kbGUnO1xuaW1wb3J0IHsgQXNzZW1ibGVkVm9sdW1lIH0gZnJvbSAnLi9uYXBhcmktdGlsZS1jbGllbnQnO1xuaW1wb3J0IHsgVGlsZURlc2NyaXB0b3IgfSBmcm9tICcuLi90aWxlLXNlcnZlcic7XG5pbXBvcnQgeyBBeGVzM2RHaXptbywgQm94Mywgc3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuL25hcGFyaS1heGVzLWdpem1vJztcbmltcG9ydCB7XG4gIFNDQVRURVIzRF9NQVhfUE9JTlRTLFxuICBTQ0FUVEVSM0RfTUFYX1hZLFxuICBWT0xVTUVfV09STERfSU5QTEFORV9SRUYsXG4gIGlzU2VydmVybGVzc011bHRpY2hhbm5lbCxcbiAgc3RhY2tEZXB0aCxcbiAgdGludEZvcixcbiAgdG9JSGlzdG9ncmFtLFxuICB0b05hcGFyaUdhbW1hLFxuICB2b2x1bWVSZXNvbHV0aW9uRm9yLFxufSBmcm9tICcuL25hcGFyaS1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgTmFwYXJpU2NlbmUsIFNjZW5lQ29udGV4dCwgVm9sdW1lVm94ZWxzT25TY3JlZW4gfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5pbXBvcnQgeyBSZWdpb25NZXNoM0QsIFZvbHVtZUZyYW1lLCBWb2x1bWVSZWdpb25NZXNoZXMgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcyc7XG5pbXBvcnQgeyBTbGljZVBsYW5lcywgVm9sdW1lU2xpY2VQbGFuZXMgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtc2xpY2UtcGxhbmVzJztcbmltcG9ydCB7IFJlZ2lvbk1lc2hQb2ludGVyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW1lc2gtcG9pbnRlcic7XG5cbi8qKiBUaGUgaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiBhbiBhc3NlbWJsZWQgdWludDggY2hhbm5lbCAob3IgdGhlIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lLCBrZXkgMCkuICovXG5mdW5jdGlvbiBjaGFubmVsSGlzdG9ncmFtKGRhdGE6IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+LCBjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgaWYgKCFkYXRhLnNpemUpIHJldHVybiBudWxsO1xuICBjb25zdCBwbGFuZSA9IGRhdGEuZ2V0KGNoYW5uZWwpID8/IGRhdGEuZ2V0KDApO1xuICByZXR1cm4gcGxhbmUgPyB0b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKHBsYW5lLCBiaW5zLCAwLCAyNTUpKSA6IG51bGw7XG59XG5cbi8qKiBBc3NlbWJsZSBgaW5mb2AncyBzdGFjayBpbnRvIGEgdWludDggdm9sdW1lIHVuZGVyIHRoZSBzdGFjayBwcm9ncmVzcyBiYXI7IG51bGwgb25jZSBgbG9hZGluZ2BcbiAqICBhYm9ydHMgKGEgQ2FuY2VsIG9yIGEgbmV3IHBsb3QpLiBUaGUgY2FsbGVyIG93bnMgdGhlIGxvYWRpbmcgZmxhZyBhbmQgdGFrZXMgYGxvYWRpbmdgIG9uY2UgcGVyXG4gKiAgbG9hZDogYSBDYW5jZWwgcmVwbGFjZXMgYGN0eC5sb2FkaW5nKClgLCBhbmQgYSBtdWx0aWNoYW5uZWwgdm9sdW1lIGFzc2VtYmxlcyBjaGFubmVscyBpbiB0dXJuLiAqL1xuZnVuY3Rpb24gYXNzZW1ibGUoXG4gIGN0eDogU2NlbmVDb250ZXh0LFxuICBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSxcbiAgbG9hZGluZzogQWJvcnRTaWduYWwsXG4gIGNoYW5uZWw/OiBudW1iZXIsXG4pOiBQcm9taXNlPEFzc2VtYmxlZFZvbHVtZSB8IG51bGw+IHtcbiAgcmV0dXJuIGN0eC50aWxlcy5hc3NlbWJsZVZvbHVtZShpbmZvLCBvcHRzLCBjaGFubmVsLCB7XG4gICAgc2lnbmFsOiBsb2FkaW5nLFxuICAgIHByb2dyZXNzOiAocCkgPT4gY3R4LnN0YWNrLnByb2dyZXNzKHApLFxuICB9KTtcbn1cblxuLyoqXG4gKiBOQVBBUklfVk9MVU1FIC8gTkFQQVJJX0lTT1NVUkZBQ0UgKHJldmlldyBBcHBlbmRpeCBCLCBjbHVzdGVyIEYpOiB0aGUgc3RhY2sgYXNzZW1ibGVkIGludG8gYVxuICogZGVjaW1hdGVkIHZvbHVtZSDigJQgb25lIGFkZGl0aXZlLCB0aW50ZWQgYFZvbHVtZUxheWVyYCBwZXIgY2hhbm5lbCBmb3IgYSBtdWx0aWNoYW5uZWwgaW1hZ2UsIGFcbiAqIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lIG90aGVyd2lzZSDigJQgd2l0aCB0aGUgYXhlcyBnaXptbyBhbmQgdGhlIGluLXZpZXcgWi1oZWlnaHQgaGFuZGxlLlxuICovXG5leHBvcnQgY2xhc3MgVm9sdW1lU2NlbmUgaW1wbGVtZW50cyBOYXBhcmlTY2VuZSB7XG4gIC8qKiBuYXBhcmktanMgaGlnaC1sZXZlbCB2aWV3IG93bmluZyB0aGUgdm9sdW1lIGxheWVycy4gKi9cbiAgdmlldzogTXVsdGlDaGFubmVsVm9sdW1lVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2b2x1bWUgaXMgY29tcG9zaXRlZCBmcm9tIHBlci1jaGFubmVsIGxheWVycyAodnMgYSBzaW5nbGUgZ3JheXNjYWxlIHZvbHVtZSkuICovXG4gIHByaXZhdGUgbXVsdGljaGFubmVsID0gZmFsc2U7XG4gIC8qKiBWb2x1bWUgd29ybGQgYm94IGF0IFotc2NhbGUgMSAoYmFzZSkgKyB0aGUgc2FtcGxlZCB2b3hlbCBkZXB0aCDigJQgZW5vdWdoIHRvIHJlY29tcHV0ZSB0aGVcbiAgICogIFotYXhpcyB2b3hlbCBzY2FsZSwgYXhlcyBkZXB0aCwgYW5kIG92ZXJsYXkgYW5jaG9ycyBhcyB0aGUgaGFuZGxlIHN0cmV0Y2hlcyBaLiAqL1xuICBwcml2YXRlIHdvcmxkQmFzZTogQm94MyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNhbXBsZWREZXB0aCA9IDE7XG4gIHByaXZhdGUgZGltczogQm94MyB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIGdpem1vOiBBeGVzM2RHaXptbyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHpIYW5kbGU6IE5hcGFyaVZvbHVtZVpIYW5kbGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIFJlZ2lvbnMnIDNEIHJlY29uc3RydWN0aW9ucyBzaG93biBpbiB0aGUgdm9sdW1lIChzZWUge0BsaW5rIHNldFJlZ2lvbk1lc2hlc30pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbk1lc2hlczogVm9sdW1lUmVnaW9uTWVzaGVzO1xuICAvKiogVGhlIHBsYW5lcyBvZiB0aGUgc2VjdGlvbnMgc2hvd24gYmVzaWRlIHRoZSB2b2x1bWUsIG1hcmtlZCBhbmQgZHJhZ2dhYmxlIGluIGl0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlUGxhbmVzOiBWb2x1bWVTbGljZVBsYW5lcztcbiAgLyoqIFRoZSBpbWFnZSdzIGZ1bGwgc2l6ZSAocHgsIHB4LCBzbGljZXMpLCB3aGljaCByZWNvbnN0cnVjdGlvbnMgYXJlIGluLiAqL1xuICBwcml2YXRlIGZ1bGxTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgLyoqIENsaWNrcyBhbmQgaG92ZXIgb24gdGhlIHJlY29uc3RydWN0aW9ucyAod2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wpLiAqL1xuICBwcml2YXRlIG1lc2hQb2ludGVyOiBSZWdpb25NZXNoUG9pbnRlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRvb2xTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGluZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBTY2VuZUNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyaW5nOiAnaXNvJyB8ICdtaXAnLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcyA9IG5ldyBWb2x1bWVSZWdpb25NZXNoZXMoY3R4LnZpZXdlcik7XG4gICAgdGhpcy5zbGljZVBsYW5lcyA9IG5ldyBWb2x1bWVTbGljZVBsYW5lcyhjdHgudmlld2VyLCBjdHguaG9zdCwge1xuICAgICAgb25Nb3ZlOiAoYXhpcywgdmFsdWUpID0+IGN0eC5pblpvbmUoKCkgPT4gY3R4LnNsaWNlUGxhbmVNb3ZlZChheGlzLCB2YWx1ZSkpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNob3cgdGhlc2UgcmVnaW9uIHJlY29uc3RydWN0aW9ucyBpbiB0aGUgdm9sdW1lIChyZXBsYWNpbmcgdGhlIG9uZXMgc2hvd24pLiAqL1xuICBzZXRSZWdpb25NZXNoZXMobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldChtZXNoZXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlkZGVuKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlkZGVuKGtleXMpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSBsZXRzIGV2ZXJ5IHJlZ2lvbiB0aHJvdWdoIChzZWUge0BsaW5rIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lfSkuICovXG4gIHByaXZhdGUgcmVnaW9uc1Rocm91Z2ggPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHZvbHVtZSBoaWRlcyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyBiZWhpbmQgd2hhdCBpdCBzaG93cyAoaXRzIGJyaWdodGVzdCBzYW1wbGUgYWxvbmdcbiAgICogZWFjaCByYXksIG5hcGFyaS1qcydzIGAndHJhbnNsdWNlbnQnYCBkZXB0aCkg4oCUIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHJlZ2lvbiBiZWhpbmQgdGhlXG4gICAqIGNlcmViZWxsdW0g4oCUIG9yLCBgdGhyb3VnaGAsIGhpZGVzIG5vbmUgKGAndHJhbnNsdWNlbnRfbm9fZGVwdGgnYCk6IHN1cmZhY2VzIHRyYWNlZCBpbnNpZGUgaXRzXG4gICAqIGJyaWdodCBzdHJ1Y3R1cmVzLCBhbiBPQ1QncyBsYXllciBib3VuZGFyaWVzIGluIGl0cyBicmlnaHQgYmFuZHMsIHdoaWNoIHRoYXQgZGVwdGggc3BlY2tsZXNcbiAgICogb3IgaGlkZXMuIEEgbXVsdGljaGFubmVsIHZvbHVtZSdzIGNoYW5uZWxzIGFkZCB1cCBhbmQgaGlkZSBub3RoaW5nIGVpdGhlciB3YXkuXG4gICAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaCA9IHRocm91Z2g7XG4gICAgdGhpcy5hcHBseVZvbHVtZURlcHRoKCk7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlWb2x1bWVEZXB0aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aWNoYW5uZWwpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMudmlldz8ubGF5ZXJzID8/IFtdKSB7XG4gICAgICBsYXllci5ibGVuZGluZyA9IHRoaXMucmVnaW9uc1Rocm91Z2ggPyAndHJhbnNsdWNlbnRfbm9fZGVwdGgnIDogJ3RyYW5zbHVjZW50JztcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgcGxhbmVzIG9mIHRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHZvbHVtZSB3aGVyZSB0aGV5IGFyZSAobnVsbDogaGlkZSBvbmUpLiAqL1xuICBzZXRTbGljZVBsYW5lcyhwbGFuZXM6IFNsaWNlUGxhbmVzKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBsYW5lcy5zZXQocGxhbmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXNzZW1ibGVkIHZvbHVtZSdzIHZveGVscyBwZXIgY2hhbm5lbCAoa2V5IDA6IHRoZSBncmF5c2NhbGUgb25lKSwgaXRzIGZyYW1lLCBhbmQgd2hldGhlclxuICAgKiBpdCBpcyBhIG11bHRpY2hhbm5lbCBjb21wb3NpdGUg4oCUIHdoYXQgdGhlIHNlY3Rpb25zIGJlc2lkZSBpdCBhcmUgY3V0IGZyb20uIE51bGwgYmVmb3JlIGl0IGlzXG4gICAqIGFzc2VtYmxlZC5cbiAgICovXG4gIHZvbHVtZVZveGVscygpOiBWb2x1bWVWb3hlbHNPblNjcmVlbiB8IG51bGwge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLndvcmxkQmFzZTtcbiAgICBpZiAoIXRoaXMuZGltcyB8fCAhYmFzZSB8fCAhdGhpcy5mdWxsU2l6ZSB8fCAhdGhpcy5jaGFubmVsRGF0YS5zaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkZXB0aCA9IGJhc2UuZGVwdGggKiB0aGlzLmN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGU7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZGltcyxcbiAgICAgIGNoYW5uZWxzOiB0aGlzLmNoYW5uZWxEYXRhLFxuICAgICAgbXVsdGljaGFubmVsOiB0aGlzLm11bHRpY2hhbm5lbCxcbiAgICAgIGZyYW1lOiB7IHNpemU6IHRoaXMuZnVsbFNpemUsIHdvcmxkOiBbYmFzZS53aWR0aCwgYmFzZS5oZWlnaHQsIGRlcHRoXSB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGlja2luZyB0aGUgcmVjb25zdHJ1Y3Rpb25zOiB3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCBhcm1lZCwgYSBjbGljayBvbiBvbmUgc2VsZWN0cyBpdHMgY2xhc3NcbiAgICogKG51bGwgYmVzaWRlIHRoZW0pOyByZXN0aW5nIG92ZXIgb25lIG5hbWVzIGl0LCB3aGF0ZXZlciB0aGUgdG9vbC5cbiAgICovXG4gIHByaXZhdGUgbGlzdGVuVG9SZWdpb25NZXNoZXMoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgaWYgKHRoaXMubWVzaFBvaW50ZXIpIHJldHVybjtcbiAgICB0aGlzLnRvb2xTdWIgPSBjdHguc3RvcmUuZ2V0QWN0aXZlVG9vbCQoKS5zdWJzY3JpYmUoKHRvb2wpID0+ICh0aGlzLnNlbGVjdGluZyA9IHRvb2wgPT09ICdzZWxlY3QnKSk7XG4gICAgdGhpcy5tZXNoUG9pbnRlciA9IGN0eC5vdXRzaWRlWm9uZShcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBSZWdpb25NZXNoUG9pbnRlcihjdHguY2FudmFzLCBjdHguaG9zdCwge1xuICAgICAgICAgIHBpY2tBdDogKHgsIHkpID0+IHRoaXMucmVnaW9uTWVzaGVzLnBpY2tBdCh4LCB5KSxcbiAgICAgICAgICBhY3RpdmU6ICgpID0+IHRoaXMuc2VsZWN0aW5nICYmIHRoaXMucmVnaW9uTWVzaGVzLnNob3duLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaG92ZXJhYmxlOiAoKSA9PiB0aGlzLnJlZ2lvbk1lc2hlcy5zaG93bi5sZW5ndGggPiAwLFxuICAgICAgICAgIG9uUGljazogKGtleSwgYWRkaXRpdmUpID0+IGN0eC5pblpvbmUoKCkgPT4gY3R4LnJlZ2lvbk1lc2hQaWNrZWQoa2V5LCBhZGRpdGl2ZSkpLFxuICAgICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoaW4tcGxhbmUpLCBvciBudWxsIGJlZm9yZSBpdCBpcyBhc3NlbWJsZWQuICovXG4gIHZveGVsU3RlcCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5mdWxsU2l6ZSAmJiB0aGlzLmRpbXMgPyB0aGlzLmZ1bGxTaXplWzBdIC8gTWF0aC5tYXgoMSwgdGhpcy5kaW1zLndpZHRoKSA6IG51bGw7XG4gIH1cblxuICAvKiogUGxhY2UgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgaW4gdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBhcyBpdCBpcyBub3cuICovXG4gIHByaXZhdGUgZnJhbWVSZWdpb25NZXNoZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMud29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy5mdWxsU2l6ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGRlcHRoID0gYmFzZS5kZXB0aCAqIHRoaXMuY3R4LnNldHRpbmdzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCBmcmFtZTogVm9sdW1lRnJhbWUgPSB7XG4gICAgICBzaXplOiB0aGlzLmZ1bGxTaXplLFxuICAgICAgd29ybGQ6IFtiYXNlLndpZHRoLCBiYXNlLmhlaWdodCwgZGVwdGhdLFxuICAgICAgelNjYWxlOiB0aGlzLmN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGUsXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5zbGljZVBsYW5lcy5zZXRGcmFtZShmcmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgYW5kIHJlbmRlciB0aGUgdm9sdW1lLCB0aGVuIGFkZCB0aGUgYXhlcyBnaXptbyArIGxhYmVscyBhbmQgdGhlIFogaGFuZGxlIGFuZCBmb2xsb3dcbiAgICogdGhlIGRpc3BsYXkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCwgaW5mbyB9ID0gdGhpcztcbiAgICBjb25zdCBsb2FkaW5nID0gY3R4LmxvYWRpbmcoKTsgLy8gYmFpbCBiZWZvcmUgcmVuZGVyaW5nIG9uIGEgQ2FuY2VsIC8gbmV3IHBsb3RcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgY3R4LnRpbGVzLmVuc3VyZURlc2NyaXB0b3IoY3R4LmluZm8oKSk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoSW1hZ2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwoY3R4LnRpbGVzLmlzU2ltcGxlKGluZm8pLCBpbmZvKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBzaW1wbGVNYyA/IGluZm8hLmltYWdlTWV0YSFbMF0uY2hhbm5lbENvdW50IDogKGRlc2M/LmNoYW5uZWxzID8/IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxKTtcblxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLm11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcoY3R4LnZpZXdlcik7XG4gICAgdGhpcy52aWV3ID0gdmlldztcbiAgICBjb25zdCB7IGRpbXMsIGNoYW5uZWxzIH0gPSBhd2FpdCB0aGlzLmFzc2VtYmxlQ2hhbm5lbHMoZGVzYywgY2hhbm5lbENvdW50LCBsb2FkaW5nKTtcbiAgICBpZiAoIWRpbXMgfHwgIWNoYW5uZWxzLmxlbmd0aCB8fCBsb2FkaW5nLmFib3J0ZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXJcblxuICAgIGNvbnN0IHdvcmxkID0gdGhpcy53b3JsZEJveChkaW1zKTtcbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLndvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMuc2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiBjdHguc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgd29ybGQud2lkdGggLyBkaW1zLndpZHRoLFxuICAgICAgd29ybGQuaGVpZ2h0IC8gZGltcy5oZWlnaHQsXG4gICAgICB3b3JsZFogLyB0aGlzLnNhbXBsZWREZXB0aCxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2ggb2YgY2hhbm5lbHMpIGNoLnZveGVsU2l6ZSA9IHZveGVsU2l6ZTtcblxuICAgIHZpZXcucmVuZGVyKHRoaXMubXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJywgY2hhbm5lbHMsIHsgcmVuZGVyaW5nOiB0aGlzLnJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmFwcGx5Vm9sdW1lRGVwdGgoKTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKGRpbXMud2lkdGgsIGRpbXMuaGVpZ2h0KTtcbiAgICB0aGlzLmRpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIGNvbnN0IGJveCA9IHsgd2lkdGg6IHdvcmxkLndpZHRoLCBoZWlnaHQ6IHdvcmxkLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9O1xuICAgIHRoaXMuZ2l6bW8gPSBuZXcgQXhlczNkR2l6bW8oY3R4LnZpZXdlciwgY3R4Lmhvc3QsIGJveCwgdGhpcy5heGVzTGFiZWxzKGJveCksIHtcbiAgICAgIHZpc2libGU6IGN0eC5zZXR0aW5ncy5heGVzVmlzaWJsZSxcbiAgICB9KTtcbiAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgIC8vIFwiWlwiIGF4aXMgKyBsYWJlbCBsaXZlKSwgc28gaXQgcmVhZHMgYXMgdGhlIFotaGVpZ2h0IGNvbnRyb2wuIEZsb2F0ZWQgYSBsaXR0bGUgcGFzdCB0aGUgYXhpc1xuICAgIC8vIHRpcCAow5cxLjEyKSBzbyB0aGUgZ3JpcCBjbGVhcnMgdGhlIFwiWiDCtyDigKZcIiBsYWJlbC4gRHJhZyDihpUgdG8gcmVzdHJldGNoIFogbGl2ZS5cbiAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZShjdHguaG9zdCwgY3R4LnZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgdG9wQW5jaG9yOiAoKSA9PiBbXG4gICAgICAgIC10aGlzLndvcmxkQmFzZSEud2lkdGggLyAyLFxuICAgICAgICAtdGhpcy53b3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICgodGhpcy53b3JsZEJhc2UhLmRlcHRoICogY3R4LnNldHRpbmdzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICBdLFxuICAgICAgZ2V0U2NhbGU6ICgpID0+IGN0eC5zZXR0aW5ncy52b2x1bWVaU2NhbGUsXG4gICAgICBzZXRTY2FsZTogKHMpID0+IHRoaXMuc2V0WlNjYWxlKHMpLFxuICAgIH0pO1xuICAgIHRoaXMuZm9sbG93RGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5mcmFtZVJlZ2lvbk1lc2hlcygpO1xuICAgIHRoaXMubGlzdGVuVG9SZWdpb25NZXNoZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBlYWNoIGNoYW5uZWwncyB2b2x1bWUgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpIHVuZGVyXG4gICAqIHRoZSBzdGFjayBwcm9ncmVzcyBiYXIsIHdpdGggdGhlIGRpc3BsYXkgc2V0dGluZ3MgaXQgaXMgZHJhd24gd2l0aC4gYGRpbXNgIGlzIG51bGwgd2hlblxuICAgKiBub3RoaW5nIHdhcyBhc3NlbWJsZWQgKGEgQ2FuY2VsLCBhIG5ldyBwbG90LCBvciBubyBzbGljZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJsZUNoYW5uZWxzKFxuICAgIGRlc2M6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCxcbiAgICBjaGFubmVsQ291bnQ6IG51bWJlcixcbiAgICBsb2FkaW5nOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IGRpbXM6IEJveDMgfCBudWxsOyBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdIH0+IHtcbiAgICBjb25zdCB7IGN0eCwgaW5mbyB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHN0YXRlcyA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIHRoZSByZXZlcnNlIGZsaXApIGFuZCBpbnZlcnQuXG4gICAgbGV0IGRpbXM6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdID0gW107XG4gICAgY3R4LnN0YWNrLmxvYWRpbmcodHJ1ZSk7XG4gICAgY3R4LnN0YWNrLnByb2dyZXNzKDApO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5tdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nLCBjKTtcbiAgICAgICAgICBpZiAobG9hZGluZy5hYm9ydGVkKSBicmVhazsgLy8gYSBDYW5jZWwgLyBuZXcgcGxvdDogZmV0Y2ggbm8gZnVydGhlciBjaGFubmVsXG4gICAgICAgICAgaWYgKCF2b2wpIGNvbnRpbnVlO1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoYywgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IGN0eC5kaXNwbGF5LmNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3IpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiB0b05hcGFyaUdhbW1hKHN0Py5nYW1tYSksIC8vIEltYWdlSiDOsyDihpIgbmFwYXJpLWpzIM6zXG4gICAgICAgICAgICBpbnZlcnQ6IGN0eC5kaXNwbGF5LmludmVydCxcbiAgICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IGFzc2VtYmxlKGN0eCwgaW5mbywgcmVzLCBsb2FkaW5nKTtcbiAgICAgICAgaWYgKHZvbCkge1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy5jaGFubmVsRGF0YS5zZXQoMCwgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiBjdHguZGlzcGxheS52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3Q/LmdhbW1hKSwgLy8gSW1hZ2VKIM6zIOKGkiBuYXBhcmktanMgzrNcbiAgICAgICAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGltcywgY2hhbm5lbHMgfTtcbiAgfVxuXG4gIC8qKiBUaGUgdm9sdW1lJ3Mgd29ybGQgYm94IGZvciB0aGUgYXNzZW1ibGVkIGBkaW1zYCwgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci4gKi9cbiAgcHJpdmF0ZSB3b3JsZEJveChkaW1zOiBCb3gzKTogQm94MyB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgLy8gUmVzb2x1dGlvbi1pbnZhcmlhbnQgd29ybGQgYm94OyB0aGUgcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkXG4gICAgLy8gZ3JpZCBvbnRvIGl0LlxuICAgIC8vXG4gICAgLy8gQSBzdGFjayB0aGF0IGRlY2xhcmVzIGl0cyBwaHlzaWNhbCBzcGFjaW5nIG9uIEFMTCBUSFJFRSBheGVzIGdldHMgaXRzIHRydWVcbiAgICAvLyBleHRlbnQgYXMgdGhlIHdvcmxkIGJveCDigJQgdGhlIG9ubHkgd2F5IGFuaXNvdHJvcHkgc3Vydml2ZXMsIGFuZCB3aGF0IG1ha2VzIGFcbiAgICAvLyByZXNhbXBsZWQgNDAgeCA0MCB4IDIwMCDCtW0gdm9sdW1lIHJlYWQgYXMgYSBicmFpbiBpbnN0ZWFkIG9mIGEgY3ViZS1hc3BlY3RcbiAgICAvLyBicmljay4gSXQgbmVlZHMgbm9uZSBvZiB0aGUgcmVmZXJlbmNlLWJveCBhcml0aG1ldGljOiBhIHBoeXNpY2FsIGJveCBpc1xuICAgIC8vIGFscmVhZHkgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyB0aGF0IGFyaXRobWV0aWMuIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsXG4gICAgLy8gY291bnRzIG1hZGUgaGlnaGVyIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGVcbiAgICAvLyAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi5cbiAgICAvLyBBbmNob3JpbmcgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmQgbGV0dGluZyBaIHNwYW4gdGhlXG4gICAgLy8gZnVsbCBzbGljZSBjb3VudCBtYWtlcyB0aGUgYm94IHNoYXBlIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuXG4gICAgY29uc3QgbWV0YSA9IGN0eC5pbmZvKCk/LmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGltYWdlRGVzYyA9IGN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihjdHguaW5mbygpKTtcbiAgICAvLyBUaGUgc2VydmVyJ3MgZGVzY3JpcHRvciBmaXJzdCAoaXQgcmVwb3J0cyBhIHRpbGVkIHN0YWNrJ3Mgc3BhY2luZywgZS5nLiBhIE5SUkQgdm9sdW1lJ3MpLCBlbHNlXG4gICAgLy8gdGhlIGltYWdlIG1ldGFkYXRhLlxuICAgIGNvbnN0IG14ID0gaW1hZ2VEZXNjPy5tcHBYIHx8IG1ldGE/Lm1wcFg7XG4gICAgY29uc3QgbXkgPSBpbWFnZURlc2M/Lm1wcFkgfHwgbWV0YT8ubXBwWTtcbiAgICBjb25zdCBteiA9IGltYWdlRGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaO1xuICAgIGNvbnN0IG1wcFhZWjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG14ICYmIG15ICYmIG16ID8gW214LCBteSwgbXpdIDogbnVsbDtcbiAgICAvLyBUaGUgaW1hZ2UncyBERUNMQVJFRCBwaXhlbCBkaW1lbnNpb25zLCB3aGljaCBpcyB3aGF0IG1wcCBpcyBwZXI6IHRoZSBzYW1wbGVkXG4gICAgLy8gZGltcyBhcmUgZGVjaW1hdGVkLCBzbyBzaXppbmcgYSBwaHlzaWNhbCBib3ggYnkgdGhlbSB3b3VsZCBtYWtlIHRoZSB3b3JsZFxuICAgIC8vIGJveCBkZXBlbmQgb24gdGhlIHJlc29sdXRpb24gdGhlIHVzZXIgaGFwcGVucyB0byBiZSB2aWV3aW5nIGF0LlxuICAgIGNvbnN0IGZ1bGxXID0gaW1hZ2VEZXNjPy53aWR0aCA/PyBtZXRhPy54ID8/IGRpbXMud2lkdGg7XG4gICAgY29uc3QgZnVsbEggPSBpbWFnZURlc2M/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXMuaGVpZ2h0O1xuICAgIGNvbnN0IGZ1bGxEID0gc3RhY2tEZXB0aChjdHguaW5mbygpKSB8fCBkaW1zLmRlcHRoO1xuICAgIHRoaXMuZnVsbFNpemUgPSBbZnVsbFcsIGZ1bGxILCBmdWxsRF07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IGZ1bGxXICogbXBwWFlaWzBdLFxuICAgICAgICBoZWlnaHQ6IGZ1bGxIICogbXBwWFlaWzFdLFxuICAgICAgICBkZXB0aDogZnVsbEQgKiBtcHBYWVpbMl0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmdWxsTG9uZyA9IE1hdGgubWF4KDEsIGZ1bGxXLCBmdWxsSCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgIGRlcHRoOiBmdWxsRCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB3aG9sZSBzdGFjayBpcyBhbHJlYWR5IG9uIHNjcmVlbjogbm8gcGxhbmUgdG8gc3RlcC4gKFRoaXMgdXNlZCB0byB3cml0ZSBgdmlld2VyLmRpbXMuemAsXG4gICAqIHdoaWNoIG9ubHkgYSB0aWxlZCAyRCBpbWFnZSByZWFkcyDigJQgYSB2b2x1bWUgcmF5bWFyY2hlcyBldmVyeSBzbGljZSDigJQgYW5kIHNjaGVkdWxlIGEgcmVhZGJhY2tcbiAgICogb2YgYSBmcmFtZSB0aGF0IGhhZCBub3QgY2hhbmdlZC4gVGhlIHRvb2xiYXIgc2hvd3Mgbm8gc2xpY2UgY29udHJvbCBpbiB2b2x1bWUgLyBpc29zdXJmYWNlXG4gICAqIG1vZGUsIGFzIFBsb3RseSdzIGlzb3N1cmZhY2UgaWdub3JlcyB0aGUgc2xpY2UgdG9vLilcbiAgICovXG4gIHNldFooKTogdm9pZCB7XG4gICAgLyogbm90aGluZyB0byBzdGVwICovXG4gIH1cblxuICAvKiogVGhlIGludGVuc2l0eSBoaXN0b2dyYW0gb2YgdGhlIGFzc2VtYmxlZCAoZG93bnNhbXBsZWQpIHVpbnQ4IHZvbHVtZSBmb3IgdGhlIHJlcXVlc3RlZFxuICAgKiAgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUuICovXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gY2hhbm5lbEhpc3RvZ3JhbSh0aGlzLmNoYW5uZWxEYXRhLCBjaGFubmVsLCBiaW5zKTtcbiAgfVxuXG4gIGlzb0NvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ID8gc3VyZmFjZTNkQ29udHJvbHModGhpcy5jdHgsICgpID0+IHRoaXMuZ2l6bW8pIDogbnVsbDtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5naXptbz8uZGVzdHJveSgpO1xuICAgIHRoaXMuZ2l6bW8gPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXIoKTtcbiAgICB0aGlzLnNsaWNlUGxhbmVzLmRlc3Ryb3koKTtcbiAgICB0aGlzLm1lc2hQb2ludGVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5tZXNoUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy50b29sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudG9vbFN1YiA9IG51bGw7XG4gICAgdGhpcy53b3JsZEJhc2UgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBzZXRaU2NhbGUoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSB0aGlzLmN0eDtcbiAgICBzZXR0aW5ncy52b2x1bWVaU2NhbGUgPSBNYXRoLm1pbigxMCwgTWF0aC5tYXgoMC4xLCBmYWN0b3IpKTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy53b3JsZEJhc2U7XG4gICAgaWYgKCFiYXNlIHx8ICF0aGlzLnZpZXcpIHJldHVybjtcbiAgICBjb25zdCB3b3JsZFogPSBiYXNlLmRlcHRoICogc2V0dGluZ3Mudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMuc2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52aWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICB0aGlzLmdpem1vPy5zZXREZXB0aCh3b3JsZFosIHRoaXMuYXhlc0xhYmVscyh7IHdpZHRoOiBiYXNlLndpZHRoLCBoZWlnaHQ6IGJhc2UuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLmZyYW1lUmVnaW9uTWVzaGVzKCk7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBUaGUgWC9ZL1ogYXhpcy1lbmQgbGFiZWwgc3BlY3MgZm9yIHRoZSBnaXptby4gQW5jaG9ycyBhcmUgaW4gdGhlIHZvbHVtZSdzIGNlbnRyZWQgd29ybGQgYm94XG4gICAqICAobWF0Y2hpbmcgdGhlIEF4ZXNMYXllciBnZW9tZXRyeSk7IHRoZSBzY2FsZSB0ZXh0IHJlZmxlY3RzIHRoZSBGVUxMIGltYWdlIGV4dGVudCDigJQgcGh5c2ljYWwgwrVtXG4gICAqICB3aGVuIMK1bS9waXhlbCBpcyBrbm93biwgZWxzZSBwaXhlbCAoWC9ZKSAvIHNsaWNlIChaKSBjb3VudHMuICovXG4gIGF4ZXNMYWJlbHModm9sOiBCb3gzKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgICBjb25zdCBoeCA9IHZvbC53aWR0aCAvIDI7XG4gICAgY29uc3QgaHkgPSB2b2wuaGVpZ2h0IC8gMjtcbiAgICBjb25zdCBoeiA9IHZvbC5kZXB0aCAvIDI7XG4gICAgLy8gTWVhc3VyZWQgZnJvbSB0aGUgSU1BR0UncyBvd24gZXh0ZW50LCBuZXZlciBmcm9tIHRoZSB3b3JsZCBib3g6IHRoZSBib3ggaXMgYVxuICAgIC8vIHNoYXBlIChhbmQgZm9yIGEgcGh5c2ljYWxseSBzaXplZCB2b2x1bWUgaXQgaXMgYWxyZWFkeSBpbiDCtW0sIHNvIHJlYWRpbmcgYVxuICAgIC8vIHBpeGVsIGNvdW50IG9mZiBpdCBhbmQgbXVsdGlwbHlpbmcgYnkgbXBwIHdvdWxkIHNjYWxlIHRoZSBsYWJlbCB0d2ljZSkuXG4gICAgY29uc3QgeyBweCwgbXBwIH0gPSB0aGlzLmltYWdlRXh0ZW50KCk7XG4gICAgY29uc3QgbGVuID0gKG46IG51bWJlciwgdW06IG51bWJlcik6IHN0cmluZyA9PiAodW0gPiAwID8gZm9ybWF0TGVuZ3RoKG4gKiB1bSwgJ8K1bScpIDogYCR7bn0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihweFswXSwgbXBwWzBdKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKHB4WzFdLCBtcHBbMV0pfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIC8vIFBoeXNpY2FsIHdoZW4gdGhlIHN0YWNrIGRlY2xhcmVzIGl0cyBzbGljZSBzcGFjaW5nIChgbXBwWmApIOKAlCBhIHJlc2FtcGxlZFxuICAgICAgLy8gdm9sdW1lIGtub3dzIGhvdyB0aGljayBpdCBpczsgYSBwbGFpbiB6LXN0YWNrIGNhbiBvbmx5IHNheSBob3cgbWFueSBzbGljZXMuXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKHB4WzJdLCBtcHBbMl0pfWAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSdzIGRlY2xhcmVkIGV4dGVudCBpbiBwaXhlbHMvc2xpY2VzLCBhbmQgaXRzIHBoeXNpY2FsIHNwYWNpbmcgcGVyXG4gICAqIGF4aXMgaW4gwrVtICgwID0gdW5kZWNsYXJlZCwgYW5kIHRoZW4gdGhhdCBheGlzIHJlYWRzIGluIHBpeGVscykuXG4gICAqXG4gICAqIE9uZSBwbGFjZSwgYmVjYXVzZSB0aGUgdm9sdW1lIHdvcmxkIGJveCBhbmQgdGhlIGF4aXMgbGFiZWxzIGhhdmUgdG8gYWdyZWVcbiAgICogYWJvdXQgd2hhdCB0aGUgaW1hZ2UncyByZWFsIGRpbWVuc2lvbnMgYXJlIOKAlCB0aGUgc2FtcGxlZCBncmlkIGlzIGRlY2ltYXRlZCBhbmRcbiAgICogc2F5cyBub3RoaW5nIGFib3V0IGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VFeHRlbnQoKTogeyBweDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtcHA6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9IHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5jdHguaW5mbygpO1xuICAgIGNvbnN0IG1ldGEgPSBpbmZvPy5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBkaW1zID0gdGhpcy5kaW1zO1xuICAgIGNvbnN0IGRlc2MgPSB0aGlzLmN0eC50aWxlcy5jdXJyZW50RGVzY3JpcHRvcihpbmZvKTtcbiAgICBjb25zdCBtcHBYID0gZGVzYz8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIGRlc2M/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcz8ud2lkdGggPz8gMSxcbiAgICAgICAgZGVzYz8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcz8uaGVpZ2h0ID8/IDEsXG4gICAgICAgIHN0YWNrRGVwdGgoaW5mbykgfHwgZGltcz8uZGVwdGggfHwgMSxcbiAgICAgIF0sXG4gICAgICAvLyBBIGRlc2NyaXB0b3IgdGhhdCByZXBvcnRzIG9ubHkgbXBwWCBpcyBzcXVhcmUtcGl4ZWwgYnkgY29udmVudGlvbiwgd2hpY2ggaXNcbiAgICAgIC8vIHdoYXQgdGhlIDJEIHNjYWxlIGJhciBhbHJlYWR5IGFzc3VtZXMgb2YgaXQuXG4gICAgICBtcHA6IFttcHBYLCBkZXNjPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgZGVzYz8ubXBwWiB8fCBtZXRhPy5tcHBaIHx8IDBdLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0b3JlJ3MgY29sb3JtYXAsIHJldmVyc2UsIGludmVydCBhbmQgY2hhbm5lbCB3aW5kb3dzIOKGkiB0aGUgdm9sdW1lJ3MgdHJhbnNmZXIgZnVuY3Rpb246XG4gICAqICBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgd2luZG93IChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cylcbiAgICogIGFuZCBnYW1tYSwgbWlycm9yaW5nIHRoZSBncmF5c2NhbGUgaW1hZ2UncyBkaXNwbGF5IGNvbnRyb2xzIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlXG4gICAqICAzRCByZW5kZXIuICovXG4gIHByaXZhdGUgZm9sbG93RGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGlzcGxheSB9ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXc7XG4gICAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLm11bHRpY2hhbm5lbCkge1xuICAgICAgICAvLyBFYWNoIGNoYW5uZWwncyBsYXllciBpcyB0aW50ZWQgYnkgaXRzIGNvbG91ciBhbmQgZ2V0cyBpdHMgb3duIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5LlxuICAgICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkuY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKSxcbiAgICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgICAuLi4oc3RcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgZ2FtbWE6IHRvTmFwYXJpR2FtbWEoc3QuZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgICAgICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgIGludmVydDogZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBOQVBBUklfU0NBVFRFUjNEIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBIKTogdGhlIGRvd25zYW1wbGVkIHZveGVsIGdyaWQgYXMgYSAzRCBwb2ludCBjbG91ZFxuICogY29sb3VyZWQgYnkgaW50ZW5zaXR5ICh0aGUgbmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyB2b3hlbCBzY2F0dGVyM2QpLiBBc3NlbWJsZXMgYSBjb2Fyc2VcbiAqIHZvbHVtZSwgdGhlbiBlbWl0cyBhIGZsYXQtc3RyaWRlZCBzYW1wbGUgb2Ygdm94ZWxzIChjYXBwZWQgYXQgYFNDQVRURVIzRF9NQVhfUE9JTlRTYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2F0dGVyM2RTY2VuZSBpbXBsZW1lbnRzIE5hcGFyaVNjZW5lIHtcbiAgcHJpdmF0ZSBsYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFzc2VtYmxlZCB2b2x1bWUgKGtleSAwKSwgZm9yIHRoZSBpbnRlbnNpdHkgaGlzdG9ncmFtLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICkge31cblxuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKGN0eC5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGN0eC5zdGFjay5sb2FkaW5nKHRydWUpO1xuICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICBsZXQgdm9sOiBBc3NlbWJsZWRWb2x1bWUgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdm9sID0gYXdhaXQgYXNzZW1ibGUoXG4gICAgICAgIGN0eCxcbiAgICAgICAgdGhpcy5pbmZvLFxuICAgICAgICB7IG1heFNsaWNlOiBNYXRoLm1pbihyZXMubWF4U2xpY2UsIFNDQVRURVIzRF9NQVhfWFkpLCBzbGljZVN0ZXA6IHJlcy5zbGljZVN0ZXAgfSxcbiAgICAgICAgY3R4LmxvYWRpbmcoKSxcbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5zdGFjay5sb2FkaW5nKGZhbHNlKTtcbiAgICAgIGN0eC5zdGFjay5wcm9ncmVzcygwKTtcbiAgICB9XG4gICAgaWYgKCF2b2wgfHwgY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB2b2w7XG4gICAgY29uc3QgelNjYWxlID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgLyBNYXRoLm1heCgxLCBkZXB0aCk7IC8vIOKJiCBjdWJpYyBhc3BlY3RcbiAgICBjb25zdCB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogZGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gU0NBVFRFUjNEX01BWF9QT0lOVFMpKTtcbiAgICBjb25zdCBwb3M6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdmFsOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICBjb25zdCB4ID0gaSAlIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHdpZHRoKSAlIGhlaWdodDtcbiAgICAgIGNvbnN0IHppID0gTWF0aC5mbG9vcihpIC8gKHdpZHRoICogaGVpZ2h0KSk7XG4gICAgICBwb3MucHVzaCh4LCB5LCB6aSAqIHpTY2FsZSk7XG4gICAgICB2YWwucHVzaChkYXRhW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdCA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIHRoaXMubGF5ZXIgPSBjdHgudmlld2VyLmFkZFBvaW50czNEKG5ldyBGbG9hdDMyQXJyYXkocG9zKSwgbmV3IEZsb2F0MzJBcnJheSh2YWwpLCB7XG4gICAgICBjb2xvcm1hcDogY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgIGludmVydDogY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgc2l6ZTogMyxcbiAgICB9KTtcbiAgICBjdHguc2V0SW1hZ2VTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIC8vIEZlZWQgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gZnJvbSB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoa2V5IDApLlxuICAgIHRoaXMuY2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5uZWxEYXRhLnNldCgwLCBkYXRhKTtcbiAgICAvLyBTdG9yZSBjb2xvcm1hcCAvIHJldmVyc2UgLyBpbnZlcnQgLyBjaGFubmVsIHdpbmRvdyDihpIgdGhlIGNsb3VkJ3MgY29sb3JtYXAgKyBjb250cmFzdC5cbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjdHguZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcjtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHMgPSBjaGFubmVsc1swXTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gY3R4LmRpc3BsYXkudm9sdW1lQ29sb3JtYXAocyk7XG4gICAgICBsYXllci5pbnZlcnQgPSBjdHguZGlzcGxheS5pbnZlcnQ7XG4gICAgICBpZiAocykgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbcy5taW4sIHMubWF4XTtcbiAgICAgIGN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogVGhlIHdob2xlIHN0YWNrIGlzIGFscmVhZHkgb24gc2NyZWVuOiBubyBwbGFuZSB0byBzdGVwLiAqL1xuICBzZXRaKCk6IHZvaWQge1xuICAgIC8qIG5vdGhpbmcgdG8gc3RlcCAqL1xuICB9XG5cbiAgaGlzdG9ncmFtKGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiBjaGFubmVsSGlzdG9ncmFtKHRoaXMuY2hhbm5lbERhdGEsIGNoYW5uZWwsIGJpbnMpO1xuICB9XG5cbiAgc3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIgPyBzdXJmYWNlM2RDb250cm9scyh0aGlzLmN0eCwgKCkgPT4gbnVsbCkgOiBudWxsO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgfVxufVxuIl19