@jax-data-science/sci-image-visualizer 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
  2. package/esm2022/lib/contracts/display-types.mjs +7 -1
  3. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  4. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  6. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
  7. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
  8. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
  9. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
  10. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
  11. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +4 -1
  12. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
  13. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
  14. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
  15. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
  16. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
  17. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
  18. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
  19. package/esm2022/lib/spatial/lod.mjs +6 -3
  20. package/esm2022/lib/spatial/spatial-controls.facade.mjs +8 -3
  21. package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
  22. package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
  23. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
  24. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +4 -3
  25. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
  26. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
  27. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
  28. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  29. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  30. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
  31. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
  32. package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
  33. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1064 -318
  34. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
  35. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
  36. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
  37. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  38. package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
  39. package/lib/contracts/display-types.d.ts +27 -0
  40. package/lib/contracts/image.contract.d.ts +2 -0
  41. package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
  42. package/lib/contracts/visualizer.contract.d.ts +3 -0
  43. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
  44. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
  45. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
  46. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
  47. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +2 -0
  48. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
  49. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
  50. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
  51. package/lib/spatial/lod.d.ts +3 -1
  52. package/lib/spatial/spatial-controls.facade.d.ts +3 -0
  53. package/lib/spatial/spatial-gene-filter.d.ts +44 -0
  54. package/lib/spatial/spatial-tile-merge.d.ts +17 -0
  55. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
  56. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
  57. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
  58. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
  59. package/lib/store/visualizer-store.service.d.ts +13 -0
  60. package/package.json +1 -1
  61. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +0 -1
@@ -5,6 +5,7 @@ import { DEFAULT_MUTED_OPACITY, resolveCategoryColors } from '../../spatial/spat
5
5
  import { emptySelection, maskToIndices } from '../../spatial/spatial-selection';
6
6
  import { defaultSigma, densityGrid } from '../../spatial/spatial-density';
7
7
  import { observationsInSection, sectionsOf } from '../../spatial/spatial-sections';
8
+ import { geneFilterKey, observationGeneMask, observationGeneStyle, observationGeneStyleKey, } from '../../spatial/spatial-gene-filter';
8
9
  import { encodeExpressionVolume, fieldContrastWindow, } from '../../spatial/spatial-expression';
9
10
  import { computeExpressionVolumeAsync, rasterizeDensityAsync } from '../../workers/spatial-math';
10
11
  import { Supersede } from '../../util/supersede';
@@ -256,14 +257,30 @@ export class Spatial3dScene extends SpatialSceneBase {
256
257
  // the 2D path does: a gene fetch can fail or be superseded, and dropping the
257
258
  // layer first would blank the view.
258
259
  let enc = null;
260
+ let geneShown = null;
259
261
  if (dataset) {
260
262
  const endLoading = this.ctx.badge.begin('Observations');
263
+ const port = this.session.port;
261
264
  try {
262
- enc = await this.scalarEncoding(view);
263
- }
264
- catch (err) {
265
- console.warn('[napari-js] spatial 3D colouring failed — falling back to a flat colour', err);
266
- enc = null;
265
+ // Which observations the gene filter keeps, settled apart from their colours: a colour
266
+ // can fall back to a flat one, the filter cannot. Drawn without it, every observation
267
+ // would show as if it expressed the picked genes. So a failed read keeps the cloud as it
268
+ // was drawn, and the panel says the filter could not be applied.
269
+ try {
270
+ geneShown = port
271
+ ? await observationGeneMask(view, dataset.observations.count, (g) => port.getFeatureVector(g))
272
+ : null;
273
+ }
274
+ catch (err) {
275
+ console.warn('[napari-js] spatial 3D gene filter could not be applied — keeping the cloud as drawn', err);
276
+ if (task())
277
+ this.session.reportGeneFilter(true);
278
+ return;
279
+ }
280
+ enc = await this.scalarEncoding(view, dataset.observations.count).catch((err) => {
281
+ console.warn('[napari-js] spatial 3D colouring failed — falling back to a flat colour', err);
282
+ return null;
283
+ });
267
284
  }
268
285
  finally {
269
286
  endLoading();
@@ -271,6 +288,7 @@ export class Spatial3dScene extends SpatialSceneBase {
271
288
  }
272
289
  if (!task())
273
290
  return;
291
+ this.session.reportGeneFilter(false);
274
292
  const obs = dataset?.observations;
275
293
  // No z means nothing to draw in 3D. The plot type is gated on `requiresSpatial3d`
276
294
  // so this should be unreachable from the UI, but a host can set the type directly.
@@ -307,13 +325,13 @@ export class Spatial3dScene extends SpatialSceneBase {
307
325
  this.volume.visible = view.showVolume;
308
326
  this.volume.opacity = view.volumeOpacity;
309
327
  }
310
- this.drawCloud(viewer, dataset, view, selection, enc);
328
+ this.drawCloud(viewer, dataset, view, selection, enc, geneShown);
311
329
  }
312
330
  /**
313
331
  * Draw the point cloud: a new layer for new geometry (a dataset or a section), the colour
314
332
  * source swapped in place otherwise; then the selection and the visibility.
315
333
  */
316
- drawCloud(viewer, dataset, view, selection, enc) {
334
+ drawCloud(viewer, dataset, view, selection, enc, geneShown = null) {
317
335
  const obs = dataset.observations;
318
336
  const scale = view.pointScale > 0 ? view.pointScale : 1;
319
337
  const size = SPATIAL_3D_BASE_SIZE * scale;
@@ -324,7 +342,7 @@ export class Spatial3dScene extends SpatialSceneBase {
324
342
  const scalars = scalar?.values ?? new Float32Array(obs.count);
325
343
  const colormap = scalar?.colormap ?? spatialFlatColormap();
326
344
  const contrastLimits = scalar?.contrastLimits ?? [0, 1];
327
- const { shown, key, scalarKey } = cloudSubset(dataset, view);
345
+ const { shown, key, scalarKey } = cloudSubset(dataset, view, geneShown);
328
346
  if (key !== this.layerKey) {
329
347
  // New geometry: interleave x,y,z (the layer's documented layout, x-fastest)
330
348
  // and cache it, so later colour changes rebuild the layer without walking
@@ -788,8 +806,18 @@ export class Spatial3dScene extends SpatialSceneBase {
788
806
  * uses. Categorical data is one RGBA per point from the column's palette, so any number of
789
807
  * categories keeps its own colour — see `encodeSpatial3dCategorical`.
790
808
  */
791
- async scalarEncoding(view) {
809
+ async scalarEncoding(view, count) {
792
810
  const port = this.session.port;
811
+ // Coloured by the gene filter: each observation in its gene's colour.
812
+ // A colour like any other: a failed read falls back to the view's colour source.
813
+ const byGene = port && count
814
+ ? await observationGeneStyle(view, count, (g) => port.getFeatureVector(g)).catch((err) => {
815
+ console.warn('[napari-js] spatial 3D colouring by gene failed — falling back to the colour source', err);
816
+ return null;
817
+ })
818
+ : null;
819
+ if (byGene)
820
+ return encodeSpatial3dCategorical(byGene.codes, byGene.colors);
793
821
  const colorBy = view.colorBy;
794
822
  if (!port || !colorBy)
795
823
  return null;
@@ -817,21 +845,42 @@ export class Spatial3dScene extends SpatialSceneBase {
817
845
  * geometry's (`colorBy` plus the transforms feeding the encoding): a new colour source swaps
818
846
  * `values` in place (napari-js ≥ 0.14), while a new geometry needs a new layer.
819
847
  */
820
- function cloudSubset(dataset, view) {
848
+ function cloudSubset(dataset, view, geneShown = null) {
821
849
  const obs = dataset.observations;
822
850
  const sections = sectionsOf(obs);
823
851
  const section = view.pointSection != null && sections && sections.length > 0
824
852
  ? sections[Math.max(0, Math.min(sections.length - 1, view.pointSection))]
825
853
  : null;
826
- const shown = section != null ? observationsInSection(obs, section) : null;
827
- const key = `${dataset.id}:${obs.count}:${section ?? 'all'}`;
854
+ let shown = section != null ? observationsInSection(obs, section) : null;
855
+ // The gene filter leaves its unmatched observations out of the geometry, so they are neither
856
+ // drawn nor picked.
857
+ if (geneShown)
858
+ shown = keepShown(shown, geneShown, obs.count);
859
+ const key = `${dataset.id}:${obs.count}:${section ?? 'all'}:${geneShown ? geneFilterKey(view) : ''}`;
828
860
  const clip = view.percentileClip ?? [0.01, 0.99];
829
861
  const scalarKey = [
830
862
  key,
831
863
  view.colorBy ? `${view.colorBy.kind}:${view.colorBy.name}` : 'flat',
864
+ observationGeneStyleKey(view),
832
865
  view.logScale ? 'log' : 'lin',
833
866
  clip.join(','),
834
867
  ].join('|');
835
868
  return { shown, key, scalarKey };
836
869
  }
837
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3JELE9BQU8sRUFJTCxjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0sMENBQTBDLENBQUM7QUFFbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUYsT0FBTyxFQUF3QixjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkYsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixtQkFBbUIsR0FDcEIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBRUwsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBRzNCLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLGlCQUFp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LE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTTtRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDZixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBvaW50UGlja2VyLCBjb2xvcm1hcEZyb21MdXQgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBQb2ludHMzRExheWVyLCBWaWV3ZXIsIFZvbHVtZUxheWVyIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB7IFNjYWxlQmFyT3ZlcmxheSB9IGZyb20gJ25hcGFyaS1qcy9vdmVybGF5cyc7XG5cbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxDb2x1bW4sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBmaW5kQ29sdW1uTWV0YSxcbiAgaXNDYXRlZ29yaWNhbENvbHVtbixcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9NVVRFRF9PUEFDSVRZLCByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGVtcHR5U2VsZWN0aW9uLCBtYXNrVG9JbmRpY2VzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQgeyBkZWZhdWx0U2lnbWEsIGRlbnNpdHlHcmlkIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWRlbnNpdHknO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TZWN0aW9uLCBzZWN0aW9uc09mIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zJztcbmltcG9ydCB7XG4gIEV4cHJlc3Npb25Wb2x1bWVGaWVsZCxcbiAgZW5jb2RlRXhwcmVzc2lvblZvbHVtZSxcbiAgZmllbGRDb250cmFzdFdpbmRvdyxcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgY29tcHV0ZUV4cHJlc3Npb25Wb2x1bWVBc3luYywgcmFzdGVyaXplRGVuc2l0eUFzeW5jIH0gZnJvbSAnLi4vLi4vd29ya2Vycy9zcGF0aWFsLW1hdGgnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuaW1wb3J0IHR5cGUgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbk1lc2gzRCwgVm9sdW1lUmVnaW9uTWVzaGVzIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXJlZ2lvbi1tZXNoZXMnO1xuaW1wb3J0IHsgaXNBYm9ydEVycm9yIH0gZnJvbSAnLi4vdGlsZS1zZXJ2ZXInO1xuaW1wb3J0IHtcbiAgRGVuc2l0eUdyb3VwLFxuICBHRU5FX01BUF9TSUdNQSxcbiAgR0VORV9NQVBfVk9MVU1FX1NUUklERSxcbiAgU1BBVElBTF8zRF9CQVNFX1NJWkUsXG4gIFNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRSxcbiAgU3BhdGlhbDNkRW5jb2RpbmcsXG4gIFNwYXRpYWwzZFNjYWxhcnMsXG4gIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsLFxuICBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzLFxuICBnYXRoZXJDb2xvcnMsXG4gIHJhbmtEZW5zaXR5R3JvdXBzLFxuICBzcGF0aWFsRmxhdENvbG9ybWFwLFxuICB0b3RhbERlbnNpdHlHcm91cCxcbn0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBIT1ZFUl9SQURJVVNfUFggfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLWhvdmVyJztcbmltcG9ydCB7IFNwYXRpYWxTY2VuZUJhc2UsIFNwYXRpYWxTZXNzaW9uIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1zY2VuZSc7XG5pbXBvcnQgdHlwZSB7IE5hcGFyaVNjZW5lLCBTY2VuZUNvbnRleHQgfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5cbi8qKlxuICogU1BBVElBTF9PTUlDU18zRCAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgSyk6IG9ic2VydmF0aW9ucyBhcyBhIDNEIHBvaW50IGNsb3VkIHVuZGVyIHRoZVxuICogb3JiaXQgY2FtZXJhLCB3aXRoIHRoZSBkYXRhc2V0J3MgcmVmZXJlbmNlIHZvbHVtZSBhcm91bmQgaXQsIHBlci1jbHVzdGVyIGRlbnNpdHkgdm9sdW1lcyBhbmQgdGhlXG4gKiAzRCBnZW5lIG1hcC5cbiAqXG4gKiBUaGlubmVyIHRoYW4gdGhlIDJEIHNjZW5lOiB0aGVyZSBpcyBubyB0aXNzdWUgaW1hZ2UgdG8gcmVuZGVyIChhIHJlZ2lzdGVyZWQgdm9sdW1lIGxpa2UgdGhlXG4gKiBBbGxlbiBDQ0YgaGFzIG5vIHNpbmdsZSByZWZlcmVuY2UgcGxhbmUpLCBzbyBubyByZWFkYmFjayBhbmQgbm8gbmF2aWdhdG9yOyB0aGUgM0Qgc2NhbGUgYmFyXG4gKiBmb2xsb3dzIHRoZSBkYXRhc2V0IChzZWUge0BsaW5rIGluc3RhbGxTY2FsZUJhcn0pLiBUaGUgcmVnaW9uIHRvb2xzIHdvcmsgaW4gU0NSRUVOIHNwYWNlIHRocm91Z2hcbiAqIHRoZSB0b29sIGJyaWRnZSdzIDNEIGludGVyYWN0aW9uIOKAlCBhIGxhc3NvIHNlbGVjdHMgdGhlIGNlbGxzIHVuZGVyIGl0LCBhbmQgYW4gb3JiaXQgY2xlYXJzIHRoZVxuICogc2hhcGUgd2hpbGUga2VlcGluZyB0aGUgc2VsZWN0aW9uLiBUaGUgZmlyc3QgM0QgbGF5ZXIgYWRkZWQgZnJhbWVzIHRoZSBjYW1lcmEgKGBmaXQzZDogJ29uY2UnYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGF0aWFsM2RTY2VuZSBleHRlbmRzIFNwYXRpYWxTY2VuZUJhc2UgaW1wbGVtZW50cyBOYXBhcmlTY2VuZSB7XG4gIC8qKiBUaGUgM0QgcG9pbnQgY2xvdWQuIE9uZSBsYXllcjogc2VsZWN0aW9uIGlzIGEgcGVyLXBvaW50IGFscGhhIG9uIGl0LCBub3QgYSBzZWNvbmQuICovXG4gIHByaXZhdGUgcG9pbnRzOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGF5ZXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogSW50ZXJsZWF2ZWQgeCx5LHosIGNhY2hlZCBzbyBhIGNvbG91ciBjaGFuZ2UgZG9lcyBub3QgcmUtd2FsayAzLjdNIG9ic2VydmF0aW9ucy4gKi9cbiAgcHJpdmF0ZSBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogSWRlbnRpdHkgb2YgdGhlIHNjYWxhcnMgY3VycmVudGx5IHVwbG9hZGVkIOKAlCBzZWUge0BsaW5rIHJlYnVpbGR9LiAqL1xuICBwcml2YXRlIHNjYWxhcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPYnNlcnZhdGlvbiBpbmRpY2VzIHRoZSBjYWNoZWQgcG9zaXRpb25zIGJlbG9uZyB0bywgaW4gdGhlIHNhbWUgb3JkZXI7IG51bGwgd2hlbiBldmVyeVxuICAgKiAgb2JzZXJ2YXRpb24gaXMgZHJhd24uIFdpdGhvdXQgaXQgYSBwcm9qZWN0aW9uIGJ1aWx0IGZyb20gdGhlIHBvc2l0aW9ucyBpcyBpbmRleGVkIGJ5IERSQVdOXG4gICAqICBvcmRlciBhbmQgc2lsZW50bHkgYXR0cmlidXRlcyBlYWNoIHBvaW50IHRvIHRoZSB3cm9uZyBvYnNlcnZhdGlvbiBhcyBzb29uIGFzIGEgc2VjdGlvbiBpc1xuICAgKiAgaXNvbGF0ZWQuICovXG4gIHByaXZhdGUgZHJhd246IFVpbnQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgYW5hdG9taWNhbCB2b2x1bWUgdGhlIGNsb3VkIHNpdHMgaW5zaWRlLCB3aGVuIHRoZSBkYXRhc2V0IGhhcyBvbmUuICovXG4gIHByaXZhdGUgdm9sdW1lOiBWb2x1bWVMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXItY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgZHJhd24gYWxvbmdzaWRlIHRoZSBjbG91ZCwgYW5kIHdoYXQgdGhleSB3ZXJlXG4gICAqICBidWlsdCBmcm9tIOKAlCByYXN0ZXJpc2luZyBpcyBzZWNvbmRzIG9mIHdvcmssIHNvIGl0IG11c3Qgbm90IHJlcGVhdCBmb3IgYVxuICAgKiAgY2hhbmdlIHRoYXQgY2Fubm90IGFmZmVjdCB0aGUgZmllbGQuICovXG4gIHByaXZhdGUgZGVuc2l0eUxheWVyczogVm9sdW1lTGF5ZXJbXSA9IFtdO1xuICBwcml2YXRlIGRlbnNpdHlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIDNEIGdlbmUgbWFwJ3Mgdm9sdW1lIGxheWVyIGFuZCB0aGUgaW5wdXRzIGl0IHdhcyBjb2xvdXJlZCBmb3IgKGl0cyBmaWVsZCBpcyBjYWNoZWQgaW5cbiAgICogIHRoZSBzZXNzaW9uLCBvbiBhIGNsb2NrIG9mIGl0cyBvd24pLiAqL1xuICBwcml2YXRlIGdlbmVNYXBMYXllcjogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9mZnNldCBhcHBsaWVkIHRvIG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzIHRvIHNpdCB0aGVtIGluIHRoZSB2b2x1bWUncyBib3guICovXG4gIHByaXZhdGUgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMF07XG4gIC8qKlxuICAgKiBuYXBhcmktanMncyBkZXB0aC1hd2FyZSBwaWNrIG92ZXIgdGhlIGNsb3VkLCBhbmQgdGhlIHByb2plY3Rpb24gdGhlIFJPSSBzZWxlY3Rpb24gcmVhZHMuIEl0XG4gICAqIG93bnMgdGhlIGNhY2hpbmcgcG9saWN5OiByZS1wcm9qZWN0IGxhemlseSwgb24gdGhlIGZpcnN0IHBpY2sgYWZ0ZXIgdGhlIGNhbWVyYSwgdGhlIGNhbnZhcyBvclxuICAgKiB0aGUgY2xvdWQncyBkYXRhIG1vdmVkIChuZXZlciBvbiB0aGUgY2FtZXJhIGV2ZW50LCBzbyBhbiBvcmJpdCBkcmFnIHBheXMgbm90aGluZyksIGludG9cbiAgICogcmV1c2VkIGJ1ZmZlcnMsIHdpdGggYSBzY3JlZW4gaW5kZXggb25jZSB0aGUgY2xvdWQgaXMgbGFyZ2UgZW5vdWdoLlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrZXI6IFBvaW50UGlja2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGVCYXI6IFNjYWxlQmFyT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogRGF0YXNldCB0aGUgc2NhbGUgYmFyIHdhcyBidWlsdCBmb3IuICovXG4gIHByaXZhdGUgc2NhbGVCYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRlbnNpdHkgcmFzdGVyaXNhdGlvbiBhbmQgdGhlIDNEIGdlbmUtbWFwIGVzdGltYXRlIGluIGZsaWdodCAob2ZmIHRoZSBtYWluIHRocmVhZFxuICAgKiAgcGFzdCB0aGUgd29ya2VyIHRocmVzaG9sZCwgU1BBVElBTC0xOSk6IGEgbmV3IGtleSBzdXBlcnNlZGVzIOKAlCBhbmQgYWJvcnRzIOKAlCB0aGUgcHJldmlvdXNcbiAgICogIG9uZTsgYSByZWJ1aWxkIHRoYXQgbGVhdmVzIHRoZSBrZXkgYWxvbmUgbGV0cyBpdCBmaW5pc2guICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVuc2l0eUxvYWRzID0gbmV3IFN1cGVyc2VkZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVNYXBMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIChhbiBhdGxhcydzIHN0cnVjdHVyZXMsIGltcG9ydGVkIG9udG8gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBpbWFnZVxuICAgKiBzdGFjayksIGRyYXduIGJ5IHRoZSBzYW1lIHtAbGluayBWb2x1bWVSZWdpb25NZXNoZXN9IGFzIHRoZSBWb2x1bWUgdmlldydzLCBzbyBhIHN0cnVjdHVyZSBpcyB0aGVcbiAgICogc2FtZSBzdXJmYWNlIGluIGJvdGguIFBsYWNlZCBpbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGJveCwgb25jZSBpdCBpcyB0aGVyZSBhbmQgdGhlIGltYWdlIHRoZVxuICAgKiByZWdpb25zIHdlcmUgZHJhd24gb24gaXMgdGhhdCB2b2x1bWUncyBzdGFjayAoc2VlIHtAbGluayBwbGFjZVJlZ2lvbk1lc2hlc30pLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25NZXNoZXM6IFZvbHVtZVJlZ2lvbk1lc2hlcztcbiAgLyoqIFdoZXRoZXIgdGhlIHJlZmVyZW5jZSB2b2x1bWUgbGV0cyBldmVyeSByZWdpb24gc3VyZmFjZSB0aHJvdWdoIChzZWUgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUpLiAqL1xuICBwcml2YXRlIHJlZ2lvbnNUaHJvdWdoID0gZmFsc2U7XG4gIC8qKiBUaGUgc3RvcmUncyBpbnZlcnQgc2V0dGluZywgd2hpY2ggdGhlIGRlbnNpdHkgdm9sdW1lcyBmb2xsb3cgKG5vIG90aGVyIHN1YnNjcmlwdGlvbiBvZlxuICAgKiAgdGhpcyBzY2VuZSBjYXJyaWVzIGl0KS4gKi9cbiAgcHJpdmF0ZSBpbnZlcnRTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gaW5mbyB0aGUgaW1hZ2UgcGxvdHRlZCB3aXRoIHRoZSBjbG91ZDogdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBzdGFjayAodGhlIDJEIHZpZXcnc1xuICAgKiAgICAgICAgaW1hZ2UsIHNlZSBzaG93Vm9sdW1lQXNJbWFnZSkgd2hlbiB0aGUgZGF0YXNldCBoYXMgYSB2b2x1bWUsIHdoaWNoIHRoZSByZWdpb25zIGFyZSBvblxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgY3R4OiBTY2VuZUNvbnRleHQsXG4gICAgc2Vzc2lvbjogU3BhdGlhbFNlc3Npb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmZvPzogSUltYWdlSW5mbyxcbiAgKSB7XG4gICAgc3VwZXIoY3R4LCBzZXNzaW9uLCB0cnVlKTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcyA9IG5ldyBWb2x1bWVSZWdpb25NZXNoZXMoY3R4LnZpZXdlcik7XG4gIH1cblxuICAvKiogU2hvdyB0aGVzZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHdpdGggdGhlIGNsb3VkIChyZXBsYWNpbmcgdGhlIG9uZXMgc2hvd24pLiAqL1xuICBzZXRSZWdpb25NZXNoZXMobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldChtZXNoZXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlkZGVuKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlkZGVuKGtleXMpO1xuICB9XG5cbiAgLyoqIEFzIHRoZSBWb2x1bWUgdmlldzogdGhlIHJlZmVyZW5jZSB2b2x1bWUgaGlkZXMgdGhlIHN1cmZhY2VzIGJlaGluZCB3aGF0IGl0IHNob3dzLCBvciBub25lLiAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaCA9IHRocm91Z2g7XG4gICAgaWYgKHRoaXMudm9sdW1lKSB0aGlzLnZvbHVtZS5ibGVuZGluZyA9IHRocm91Z2ggPyAndHJhbnNsdWNlbnRfbm9fZGVwdGgnIDogJ3RyYW5zbHVjZW50JztcbiAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYWNlIHRoZSByZWdpb24gc3VyZmFjZXMgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBib3gsIGFzIHRoZSBWb2x1bWUgdmlldyBwbGFjZXMgdGhlbSBpbiBpdHNcbiAgICogb3duOiBpbWFnZSBwaXhlbCAoeCwgeSkgaXMgdm94ZWwgKHgsIHkpLCBzbGljZSBrIGlzIHZveGVsIHBsYW5lIGssIGFuZCB0aGUgYm94IGlzIHRoZSB2b2x1bWUnc1xuICAgKiB2b3hlbHMgdGltZXMgaXRzIHZveGVsIHNpemUsIGNlbnRyZWQgb24gdGhlIG9yaWdpbiBhcyBuYXBhcmkgY2VudHJlcyB0aGUgdm9sdW1lIChhbmQgdGhlIGNsb3VkXG4gICAqIGlzIG9mZnNldCB0byBzaXQgaW4gaXQpLiBPbmx5IHdoZW4gdGhlIHBsb3R0ZWQgaW1hZ2UgSVMgdGhhdCB2b2x1bWUncyBzdGFjazogcmVnaW9ucyBkcmF3biBvblxuICAgKiBhbm90aGVyIGltYWdlIChhIHRpc3N1ZSBpbWFnZSkgaGF2ZSBubyBwbGFjZSBpbiBpdCwgYW5kIGFyZSBub3Qgc2hvd24gLSBub3IgYXJlIHN1cmZhY2VzXG4gICAqIHBsYWNlZCBpbiBhIHZvbHVtZSB0aGlzIG9uZSByZXBsYWNlZC5cbiAgICovXG4gIHByaXZhdGUgcGxhY2VSZWdpb25NZXNoZXMoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgaWYgKCFtZXRhIHx8ICF0aGlzLmlzVm9sdW1lU3RhY2sobWV0YSkpIHtcbiAgICAgIHRoaXMucmVnaW9uTWVzaGVzLmNsZWFyRnJhbWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gbWV0YS52b3hlbFNpemU7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0RnJhbWUoe1xuICAgICAgc2l6ZTogW21ldGEud2lkdGgsIG1ldGEuaGVpZ2h0LCBtZXRhLmRlcHRoXSxcbiAgICAgIHdvcmxkOiBbbWV0YS53aWR0aCAqIHZ4LCBtZXRhLmhlaWdodCAqIHZ5LCBtZXRhLmRlcHRoICogdnpdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIHRoZSBzdXJmYWNlcyBzaXQgaW46IDEsIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGJlaW5nIHRoZSBzdGFjaydzXG4gICAqIG93biB2b3hlbHMsIGFzIHRoZSBWb2x1bWUgdmlldydzIGlzIGF0IGZ1bGwgcmVzb2x1dGlvbiwgc28gYm90aCByZWNvbnN0cnVjdCBhIGNsYXNzIGFsaWtlIChhbmRcbiAgICogc2hhcmUgaXRzIGNhY2hlZCBzdXJmYWNlKS4gTnVsbCB3aGlsZSB0aGVyZSBpcyBubyB2b2x1bWUgc3RhY2sgdG8gcGxhY2UgdGhlbSBpbi5cbiAgICovXG4gIHZveGVsU3RlcCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzBdPy52b2x1bWU7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lICYmIG1ldGEgJiYgdGhpcy5pc1ZvbHVtZVN0YWNrKG1ldGEpID8gMSA6IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgcGxvdHRlZCBpbWFnZSBpcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIHN0YWNrOiBpdHMgc2l6ZSBhbmQgc2xpY2UgY291bnQuICovXG4gIHByaXZhdGUgaXNWb2x1bWVTdGFjayhtZXRhOiBOb25OdWxsYWJsZTxTcGF0aWFsRGF0YXNldFsndm9sdW1lJ10+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuaW5mbztcbiAgICBjb25zdCBbdywgaF0gPSBpbmZvPy50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICByZXR1cm4gISFpbmZvPy5pc1N0YWNrICYmIHcgPT09IG1ldGEud2lkdGggJiYgaCA9PT0gbWV0YS5oZWlnaHQgJiYgKGluZm8udXJscz8ubGVuZ3RoID8/IDApID09PSBtZXRhLmRlcHRoO1xuICB9XG5cbiAgYXN5bmMgbW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmVmb3JlIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiwgc28gdGhlIGZpcnN0IGJ1aWxkIGFscmVhZHkgcmVhZHMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgdGhpcy5pbnZlcnRTdWIgPSB0aGlzLmN0eC5kaXNwbGF5LndhdGNoSW52ZXJ0KChpbnZlcnQpID0+IHtcbiAgICAgIC8vIEEgbGl2ZSBzZXR0ZXI6IHRoZSB2b2x1bWVzIHJlc3R5bGUsIG5vdGhpbmcgaXMgcmFzdGVyaXNlZCBhZ2Fpbi5cbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSBsYXllci5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICAgIHRoaXMuY3R4LnRvb2xzLmluc3RhbGwzZEludGVyYWN0aW9uKHRoaXMuY3R4LnZpZXdlciwgdGhpcy5jdHguaG9zdCk7XG4gICAgdGhpcy5ob3Zlci5pbnN0YWxsKHRoaXMuY3R4Lmhvc3QpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICB9XG5cbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMnIG93biB6IGlzIG9uIHNjcmVlbjogdGhlcmUgaXMgbm8gcGxhbmUgdG8gc3RlcC4gKi9cbiAgc2V0WigpOiB2b2lkIHtcbiAgICAvKiBub3RoaW5nIHRvIHN0ZXAgKi9cbiAgfVxuXG4gIC8qKiBBIGNsb3VkIGhhcyBubyBpbnRlbnNpdHkgZGlzdHJpYnV0aW9uIGZvciB0aGUgaGlzdG9ncmFtIHBhbmUuICovXG4gIGhpc3RvZ3JhbSgpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgb2JzZXJ2YXRpb24ncyBwb3NpdGlvbiBvbiB0aGUgY2FudmFzIHVuZGVyIHRoZSBjdXJyZW50IDNEIGNhbWVyYSAoZm9yIHRoZSBST0lcbiAgICogc2VsZWN0aW9uKSwgaW5kZXhlZCBieSBvYnNlcnZhdGlvbiB3aXRoIE5hTiBmb3IgYW55dGhpbmcgbm90IGRyYXduLiBOdWxsIGJlZm9yZSB0aGUgY2xvdWRcbiAgICogaXMgYnVpbHQuXG4gICAqXG4gICAqIFRoZSBwcm9qZWN0aW9uIGlzIHRoZSBwaWNrZXIncyAoc2VlIHtAbGluayBwaWNrZXJ9KTsgd2hhdCBpcyBsZWZ0IGlzIHRoZSBwYXJ0IHRoYXQgaXNcbiAgICogZ2VudWluZWx5IHRoaXMgYWRhcHRlcidzOiBTQ0FUVEVSSU5HIHRoZSBkcmF3biBzdWJzZXQgYmFjayBpbnRvIG9ic2VydmF0aW9uIG9yZGVyLiBUaGUgY2xvdWRcbiAgICogaG9sZHMgb25seSB0aGUgcG9pbnRzIG9mIHRoZSBkaXNwbGF5ZWQgc2VjdGlvbiwgaW4gaXRzIG93biBwYWNraW5nOyBldmVyeSBjb25zdW1lciBpbmRleGVzIGJ5XG4gICAqIG9ic2VydmF0aW9uLiBOYU4gc3RhbmRzIGZvciBcIm5vdCBvbiBzY3JlZW5cIiwgd2hpY2ggaXMgYWxzbyB0aGUgcmlnaHQgYW5zd2VyIGZvciBhblxuICAgKiBvYnNlcnZhdGlvbiB3aG9zZSBzZWN0aW9uIGlzIGhpZGRlbi5cbiAgICovXG4gIHNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3QgcHJvamVjdGVkID0gdGhpcy5waWNrZXI/LnByb2plY3RlZCgpO1xuICAgIGlmICghcHJvamVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkcmF3biA9IHRoaXMuZHJhd247XG4gICAgY29uc3QgeyBzY3JlZW4gfSA9IHByb2plY3RlZDtcbiAgICBjb25zdCBjb3VudCA9IHNjcmVlbi5sZW5ndGggPj4gMTtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCAqIDIpLmZpbGwoTmFOKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIGlmIChpID49IG9icy5jb3VudCkgY29udGludWU7XG4gICAgICBvdXRbaSAqIDJdID0gc2NyZWVuW2sgKiAyXTtcbiAgICAgIG91dFtpICogMiArIDFdID0gc2NyZWVuW2sgKiAyICsgMV07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLmNsZWFyKCk7XG4gICAgdGhpcy5kaXNwb3NlU3BhdGlhbCgpO1xuICAgIHRoaXMuaW52ZXJ0U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW52ZXJ0U3ViID0gbnVsbDtcbiAgICB0aGlzLmRlbnNpdHlMb2Fkcy5jYW5jZWwoKTtcbiAgICB0aGlzLmdlbmVNYXBMb2Fkcy5jYW5jZWwoKTtcbiAgICB0aGlzLnNjYWxlQmFyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMucG9zaXRpb25zID0gbnVsbDtcbiAgICB0aGlzLnNldFBpY2tlcihudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YXRpb24gdW5kZXIgYSBjbGllbnQgcG9zaXRpb246IHRoZSBGUk9OVC1tb3N0IG1hcmtlciB3aXRoaW4gYHNsYWNrUHhgIG9mIHRoZVxuICAgKiBwb2ludGVyICh0aWVzIGJ5IGRpc3RhbmNlKSwgYXMgbmFwYXJpLWpzJ3Mge0BsaW5rIFBvaW50UGlja2VyfSBwaWNrcyBpdC4gVGhhdCBtYXR0ZXJzIG1vcmVcbiAgICogdGhhbiBpdCBzb3VuZHM6IHRoZSByZW5kZXJlciBkZXB0aC10ZXN0cyB0aGUgYmlsbGJvYXJkcywgYW5kIGluIGEgMy43TS1wb2ludCBjbG91ZCB0aGUgY3Vyc29yXG4gICAqIGNvdmVycyBtYW55IG9mIHRoZW0g4oCUIHBpY2tpbmcgdGhlIG9uZSBuZWFyZXN0IHRoZSBjdXJzb3IncyBjZW50cmUgcmVndWxhcmx5IG5hbWVzIGEgY2VsbCB0aGF0XG4gICAqIHNvbWV0aGluZyBlbHNlIGlzIGRyYXduIG92ZXIuIFRoZSBwaWNrZXIgYWxzbyB0YWtlcyBlYWNoIHBvaW50J3MgcmFkaXVzIGZyb20gdGhlIGxheWVyJ3NcbiAgICogcGVyLXBvaW50IGBzaXplc2AsIHNvIGEgc2VsZWN0ZWQgbWFya2VyLCBkcmF3biBsYXJnZXIsIGlzIGFzIGxhcmdlIHRvIHRoZSBwb2ludGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBpY2tPYnNlcnZhdGlvbihjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlciwgc2xhY2tQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBwaWNrZXIgPSB0aGlzLnBpY2tlcjtcbiAgICBpZiAoIXBpY2tlcikgcmV0dXJuIC0xO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmN0eC5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgayA9IHBpY2tlci5waWNrKGNsaWVudFggLSByZWN0LmxlZnQsIGNsaWVudFkgLSByZWN0LnRvcCwgc2xhY2tQeCk7XG4gICAgaWYgKGsgPCAwKSByZXR1cm4gLTE7XG4gICAgcmV0dXJuIHRoaXMuZHJhd24gPyB0aGlzLmRyYXduW2tdIDogaztcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBjbG91ZCdzIHBpY2tlciAobnVsbDogbm8gY2xvdWQpLCByZWxlYXNpbmcgdGhlIG9sZCBvbmUncyBjYW1lcmEgbGlzdGVuZXIuICovXG4gIHByaXZhdGUgc2V0UGlja2VyKHBvaW50czogUG9pbnRzM0RMYXllciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnBpY2tlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMucGlja2VyID0gcG9pbnRzXG4gICAgICA/IG5ldyBQb2ludFBpY2tlcih0aGlzLmN0eC52aWV3ZXIsIHBvaW50cywge1xuICAgICAgICAgIC8vIFRoZSBsYXJnZXN0IHJhZGl1cyBhIHBpY2sgaGVyZSBjYW4gY2xhaW06IHRoZSBob3ZlciBzbGFjayB0aW1lcyB0aGUgc2NhbGUgYSBTRUxFQ1RFRFxuICAgICAgICAgIC8vIG1hcmtlciBpcyBkcmF3biBhdC4gSXQgZGVjaWRlcyB3aGV0aGVyIGEgbWFya2VyIHN0cmFkZGxpbmcgdGhlIGNhbnZhcyBlZGdlIGlzIGZvdW5kLlxuICAgICAgICAgIG1heFJlYWNoOiBIT1ZFUl9SQURJVVNfUFggKiBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gICAgICAgIH0pXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2NhbGUgYmFyIGZvciB0aGUgY2xvdWQsIG1lYXN1cmVkIGF0IHRoZSBPUkJJVCBQSVZPVC5cbiAgICpcbiAgICogQSBwZXJzcGVjdGl2ZSBjYW1lcmEgaGFzIG5vIHNpbmdsZSBzY2FsZSDigJQgdGhpbmdzIGZhcnRoZXIgYXdheSBhcmUgc21hbGxlciDigJQgc28gYSBiYXIgY2FuXG4gICAqIG9ubHkgYmUgdHJ1ZSBhdCBvbmUgZGVwdGguIFRoZSBwaXZvdCBpcyB0aGUgaG9uZXN0IGNob2ljZTogaXQgaXMgd2hhdCB0aGUgY2FtZXJhIGlzIGZyYW1pbmcsXG4gICAqIHdoYXQgYSB6b29tIG1vdmVzIHRvd2FyZHMsIGFuZCB3aGVyZSB0aGUgZXllIGlzIGFueXdheS4gbmFwYXJpJ3Mgb3duIDNEIHNjYWxlIGJhciB3b3JrcyB0aGVcbiAgICogc2FtZSB3YXkuXG4gICAqXG4gICAqIG5hcGFyaS1qcydzIGBTY2FsZUJhck92ZXJsYXlgIGluIGAnM2QnYCBtb2RlIG1lYXN1cmVzIHRoZXJlOiBDU1MgcHggcGVyIHdvcmxkIHVuaXQgaXMgdGhlXG4gICAqIHJlY2lwcm9jYWwgb2YgYENhbWVyYTNELndvcmxkUGVyUGl4ZWxgIOKAlCB0aGUgc2NhbGUgYENhbWVyYTNELnBhbmAgdXNlcyB0byB0cmFjayB0aGUgY3Vyc29yLlxuICAgKiBUaGUgYmFyIHRoZW4gY29udmVydHMgdGhyb3VnaCBgbWljcm9uc1BlclVuaXRgLCBhbmQgZHJhd3Mgbm90aGluZyBhdCBhbGwgd2hlbiB0aGUgZGF0YXNldCBkb2VzXG4gICAqIG5vdCBkZWNsYXJlIG9uZSwgYmVjYXVzZSBhIGJhciBsYWJlbGxlZCBpbiBtaWNyb25zIG92ZXIgdW5rbm93biB1bml0cyB3b3VsZCByZWFkIGFzIGFcbiAgICogbWVhc3VyZW1lbnQuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxTY2FsZUJhcihkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNjYWxlQmFyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbWljcm9uc1BlclVuaXQgPSBkYXRhc2V0Py5taWNyb25zUGVyVW5pdDtcbiAgICBpZiAoIW1pY3JvbnNQZXJVbml0IHx8IG1pY3JvbnNQZXJVbml0IDw9IDApIHJldHVybjtcbiAgICB0aGlzLnNjYWxlQmFyID0gbmV3IFNjYWxlQmFyT3ZlcmxheSh0aGlzLmN0eC5ob3N0LCB0aGlzLmN0eC52aWV3ZXIsIHtcbiAgICAgIHVuaXRQZXJXb3JsZDogbWljcm9uc1BlclVuaXQsXG4gICAgICBtb2RlOiAnM2QnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgM0QgcG9pbnQgY2xvdWQgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVidWlsZChcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5jdHgudmlld2VyO1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnJlYnVpbGRzLm5leHQoKTtcblxuICAgIC8vIFJlc29sdmUgdGhlIHNjYWxhciBlbmNvZGluZyBCRUZPUkUgdG91Y2hpbmcgdGhlIHNjZW5lLCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gICAgLy8gdGhlIDJEIHBhdGggZG9lczogYSBnZW5lIGZldGNoIGNhbiBmYWlsIG9yIGJlIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGVcbiAgICAvLyBsYXllciBmaXJzdCB3b3VsZCBibGFuayB0aGUgdmlldy5cbiAgICBsZXQgZW5jOiBTcGF0aWFsM2RFbmNvZGluZyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChkYXRhc2V0KSB7XG4gICAgICBjb25zdCBlbmRMb2FkaW5nID0gdGhpcy5jdHguYmFkZ2UuYmVnaW4oJ09ic2VydmF0aW9ucycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5jID0gYXdhaXQgdGhpcy5zY2FsYXJFbmNvZGluZyh2aWV3KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHNwYXRpYWwgM0QgY29sb3VyaW5nIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIGEgZmxhdCBjb2xvdXInLCBlcnIpO1xuICAgICAgICBlbmMgPSBudWxsO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5kTG9hZGluZygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2JzID0gZGF0YXNldD8ub2JzZXJ2YXRpb25zO1xuICAgIC8vIE5vIHogbWVhbnMgbm90aGluZyB0byBkcmF3IGluIDNELiBUaGUgcGxvdCB0eXBlIGlzIGdhdGVkIG9uIGByZXF1aXJlc1NwYXRpYWwzZGBcbiAgICAvLyBzbyB0aGlzIHNob3VsZCBiZSB1bnJlYWNoYWJsZSBmcm9tIHRoZSBVSSwgYnV0IGEgaG9zdCBjYW4gc2V0IHRoZSB0eXBlIGRpcmVjdGx5LlxuICAgIGlmICghZGF0YXNldCB8fCAhb2JzIHx8IG9icy5jb3VudCA9PT0gMCB8fCAhb2JzLnopIHtcbiAgICAgIHRoaXMucmVtb3ZlTGF5ZXJzKHZpZXdlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQW5hdG9teSBmaXJzdDogb24gYSBzY2VuZSdzIEZJUlNUIGxheWVyIG5hcGFyaSBmcmFtZXMgdGhlIG9yYml0IGNhbWVyYSwgYW5kXG4gICAgLy8gdGhlIHJlZmVyZW5jZSB2b2x1bWUgaXMgdGhlIGZyYW1pbmcgd2Ugd2FudCDigJQgdGhlIGJyYWluLCBub3QgdGhlIG91dGVybW9zdFxuICAgIC8vIHN0cmF5IHNlZ21lbnRhdGlvbi4gRXZlcnkgbGF0ZXIgYWRkIGtlZXBzIHRoZSBwb3NlIGluc3RlYWQgKG5hcGFyaS1qcyBgZml0M2Q6ICdvbmNlJ2ApLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlVm9sdW1lKHZpZXdlciwgZGF0YXNldCwgdmlldyk7XG4gICAgaWYgKCF0YXNrKCkpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBjbHVzdGVyIGRlbnNpdHkgdm9sdW1lcywgd2hpY2ggY2FuIHNldCB0aGUgY2VudHJpbmcgb2Zmc2V0IHdoZW5cbiAgICAvLyB0aGVyZSBpcyBubyByZWZlcmVuY2Ugdm9sdW1lIOKAlCBzbyBiZWZvcmUgYW55IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20gaXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEZW5zaXR5Vm9sdW1lcyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKCF0YXNrKCkpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBnZW5lIG1hcCwgd2hpY2ggc2hhcmVzIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgbGF0dGljZSDigJQgc28gaXQgZ29lc1xuICAgIC8vIGFmdGVyIGFueXRoaW5nIHRoYXQgY2FuIHN0aWxsIG1vdmUgdGhlIGNlbnRyaW5nIG9mZnNldC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gU2NhbGUgZGVwZW5kcyBvbiB0aGUgZGF0YXNldCdzIGRlY2xhcmVkIHVuaXQsIHNvIGl0IHdhaXRzIGZvciB0aGUgZGF0YXNldFxuICAgIC8vIHJhdGhlciB0aGFuIGJlaW5nIHNldCB1cCBhdCBtb3VudCB0aW1lLlxuICAgIGlmIChkYXRhc2V0LmlkICE9PSB0aGlzLnNjYWxlQmFyS2V5KSB7XG4gICAgICB0aGlzLnNjYWxlQmFyS2V5ID0gZGF0YXNldC5pZDtcbiAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKGRhdGFzZXQpO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIGhpZGRlbiwgbm90IHJlbW92ZWQ6IGl0IGFsc28gZml4ZXMgdGhlIGNlbnRyaW5nXG4gICAgLy8gb2Zmc2V0IGV2ZXJ5IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20sIGFuZCByZS1mZXRjaGluZyBhIDEwMCBNQiB0ZW1wbGF0ZVxuICAgIC8vIHRvIHVuLWhpZGUgaXQgd291bGQgbWFrZSBhIGNoZWNrYm94IGZlZWwgbGlrZSBhIGxvYWQuXG4gICAgaWYgKHRoaXMudm9sdW1lKSB7XG4gICAgICB0aGlzLnZvbHVtZS52aXNpYmxlID0gdmlldy5zaG93Vm9sdW1lO1xuICAgICAgdGhpcy52b2x1bWUub3BhY2l0eSA9IHZpZXcudm9sdW1lT3BhY2l0eTtcbiAgICB9XG4gICAgdGhpcy5kcmF3Q2xvdWQodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIGVuYyk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcG9pbnQgY2xvdWQ6IGEgbmV3IGxheWVyIGZvciBuZXcgZ2VvbWV0cnkgKGEgZGF0YXNldCBvciBhIHNlY3Rpb24pLCB0aGUgY29sb3VyXG4gICAqIHNvdXJjZSBzd2FwcGVkIGluIHBsYWNlIG90aGVyd2lzZTsgdGhlbiB0aGUgc2VsZWN0aW9uIGFuZCB0aGUgdmlzaWJpbGl0eS5cbiAgICovXG4gIHByaXZhdGUgZHJhd0Nsb3VkKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgICBjb25zdCBzaXplID0gU1BBVElBTF8zRF9CQVNFX1NJWkUgKiBzY2FsZTtcbiAgICAvLyBBIGNhdGVnb3JpY2FsIGNvbG91cmluZyBpcyBwZXItcG9pbnQgUkdCQSwgd2hpY2ggd2lucyBvdmVyIHRoZSBzY2FsYXJzOyB0aGUgZmxhdCBjb2xvcm1hcFxuICAgIC8vIGFuZCB6ZXJvIHNjYWxhcnMgc3RhbmQgYmVoaW5kIGl0LCBhcyB0aGV5IGRvIGZvciBcIm5vdGhpbmcgdG8gY29sb3VyIGJ5XCIuXG4gICAgY29uc3Qgc2NhbGFyID0gZW5jPy5raW5kID09PSAnc2NhbGFycycgPyBlbmMgOiBudWxsO1xuICAgIGNvbnN0IGNvbG9ycyA9IGVuYz8ua2luZCA9PT0gJ2NvbG9ycycgPyBlbmMuY29sb3JzIDogbnVsbDtcbiAgICBjb25zdCBzY2FsYXJzID0gc2NhbGFyPy52YWx1ZXMgPz8gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpO1xuICAgIGNvbnN0IGNvbG9ybWFwID0gc2NhbGFyPy5jb2xvcm1hcCA/PyBzcGF0aWFsRmxhdENvbG9ybWFwKCk7XG4gICAgY29uc3QgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl0gPSBzY2FsYXI/LmNvbnRyYXN0TGltaXRzID8/IFswLCAxXTtcbiAgICBjb25zdCB7IHNob3duLCBrZXksIHNjYWxhcktleSB9ID0gY2xvdWRTdWJzZXQoZGF0YXNldCwgdmlldyk7XG5cbiAgICBpZiAoa2V5ICE9PSB0aGlzLmxheWVyS2V5KSB7XG4gICAgICAvLyBOZXcgZ2VvbWV0cnk6IGludGVybGVhdmUgeCx5LHogKHRoZSBsYXllcidzIGRvY3VtZW50ZWQgbGF5b3V0LCB4LWZhc3Rlc3QpXG4gICAgICAvLyBhbmQgY2FjaGUgaXQsIHNvIGxhdGVyIGNvbG91ciBjaGFuZ2VzIHJlYnVpbGQgdGhlIGxheWVyIHdpdGhvdXQgd2Fsa2luZ1xuICAgICAgLy8gdGhlIG9ic2VydmF0aW9ucyBhZ2Fpbi5cbiAgICAgIHRoaXMucG9zaXRpb25zID0gdGhpcy5jbG91ZFBvc2l0aW9ucyhvYnMsIHNob3duKTtcbiAgICAgIHRoaXMuZHJhd24gPSBzaG93bjtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2NhbGFycyBoYXZlIHRvIGZvbGxvdyB0aGUgZ2VvbWV0cnk6IGEgcGVyLW9ic2VydmF0aW9uIHZlY3RvciBhZ2FpbnN0IG9uZVxuICAgIC8vIHNlY3Rpb24ncyBwb3NpdGlvbnMgd291bGQgY29sb3VyIGVhY2ggY2VsbCBieSBhIHN0cmFuZ2VyJ3MgdmFsdWUuIFNvIGRvIHRoZSBjb2xvdXJzLlxuICAgIGNvbnN0IHZhbHVlc0ZvciA9ICgpID0+IChzaG93biA/IEZsb2F0MzJBcnJheS5mcm9tKHNob3duLCAoaSkgPT4gc2NhbGFyc1tpXSkgOiBzY2FsYXJzKTtcbiAgICBjb25zdCBjb2xvcnNGb3IgPSAoKSA9PiAoY29sb3JzID8gKGdhdGhlckNvbG9ycyhjb2xvcnMsIHNob3duID8/IHVuZGVmaW5lZCkgYXMgRmxvYXQzMkFycmF5KSA6IG51bGwpO1xuXG4gICAgaWYgKCF0aGlzLnBvaW50cyB8fCBrZXkgIT09IHRoaXMubGF5ZXJLZXkpIHtcbiAgICAgIC8vIE5ldyBHRU9NRVRSWSDigJQgYSBkaWZmZXJlbnQgZGF0YXNldCwgb3IgYSBkaWZmZXJlbnQgc2VjdGlvbiDigJQgc28gYSBuZXcgbGF5ZXIuXG4gICAgICBpZiAodGhpcy5wb2ludHMpIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMucG9pbnRzKTtcbiAgICAgIHRoaXMubGF5ZXJLZXkgPSBrZXk7XG4gICAgICB0aGlzLnNjYWxhcktleSA9IHNjYWxhcktleTtcbiAgICAgIHRoaXMucG9pbnRzID0gdmlld2VyLmFkZFBvaW50czNEKHRoaXMucG9zaXRpb25zISwgdmFsdWVzRm9yKCksIHtcbiAgICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICAgIGNvbG9ybWFwLFxuICAgICAgICBjb250cmFzdExpbWl0cyxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgY29sb3JzOiBjb2xvcnNGb3IoKSA/PyB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0UGlja2VyKHRoaXMucG9pbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNjYWxhcktleSAhPT0gdGhpcy5zY2FsYXJLZXkpIHtcbiAgICAgICAgLy8gQSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSwgd2hpY2ggdXNlZCB0byBtZWFuIGRpc2NhcmRpbmcgdGhlIGxheWVyIGFuZCBidWlsZGluZ1xuICAgICAgICAvLyBhbm90aGVyIOKAlCBhbmQsIGJlY2F1c2UgYWRkaW5nIGEgM0QgbGF5ZXIgcmVmcmFtZXMsIGEgY2FtZXJhIGp1bXAgdG8gdW5kbyBhcyB3ZWxsLlxuICAgICAgICAvLyBuYXBhcmktanMg4omlIDAuMTQgbGV0cyB0aGUgc2NhbGFycyBiZSByZXBsYWNlZCBpbiBwbGFjZSDigJQgdGhlIHNldHRlciBidW1wcyB0aGVcbiAgICAgICAgLy8gbGF5ZXIncyBkYXRhVmVyc2lvbiBzbyB0aGUgdmlzdWFsIHJlLXVwbG9hZHMg4oCUIGFuZCB0aGUgcG9zaXRpb25zIGhhdmUgbm90IG1vdmVkLFxuICAgICAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIGZvciB0aGUgY2FtZXJhIHRvIHJlZnJhbWUuXG4gICAgICAgIHRoaXMuc2NhbGFyS2V5ID0gc2NhbGFyS2V5O1xuICAgICAgICB0aGlzLnBvaW50cy52YWx1ZXMgPSB2YWx1ZXNGb3IoKTtcbiAgICAgICAgdGhpcy5wb2ludHMuY29sb3JzID0gY29sb3JzRm9yKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBvaW50cy5jb2xvcm1hcCA9IGNvbG9ybWFwO1xuICAgICAgdGhpcy5wb2ludHMuY29udHJhc3RMaW1pdHMgPSBjb250cmFzdExpbWl0cztcbiAgICAgIHRoaXMucG9pbnRzLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIGNvbnN0IGNsb3VkID0gdGhpcy5wb2ludHM7XG4gICAgaWYgKGNsb3VkKSB7XG4gICAgICBjbG91ZC5vcGFjaXR5ID0gdmlldy5vcGFjaXR5O1xuICAgICAgdGhpcy5hcHBseVNlbGVjdGlvbihjbG91ZCwgc2VsZWN0aW9uLCBzaG93biwgb2JzLmNvdW50KTtcbiAgICB9XG4gICAgLy8gTGFzdCwgc28gaXQgYWxzbyBjb3ZlcnMgYSBsYXllciB0aGlzIHBhc3MganVzdCBjcmVhdGVkLlxuICAgIGlmICh0aGlzLnBvaW50cykgdGhpcy5wb2ludHMudmlzaWJsZSA9IHZpZXcuc2hvd1BvaW50cztcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEludGVybGVhdmVkIHgseSx6IG9mIHRoZSBgc2hvd25gIG9ic2VydmF0aW9ucyAobnVsbDogYWxsIG9mIHRoZW0pLCBvZmZzZXQgYnkge0BsaW5rIG9yaWdpbn0uICovXG4gIHByaXZhdGUgY2xvdWRQb3NpdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBzaG93bjogVWludDMyQXJyYXkgfCBudWxsKTogRmxvYXQzMkFycmF5IHtcbiAgICAvLyByZWJ1aWxkKCkgZHJhd3Mgb25seSBhIGRhdGFzZXQgd2hvc2Ugb2JzZXJ2YXRpb25zIGhhdmUgYSB6LlxuICAgIGNvbnN0IHogPSBvYnMueiE7XG4gICAgY29uc3QgW294LCBveSwgb3pdID0gdGhpcy5vcmlnaW47XG4gICAgY29uc3QgY291bnQgPSBzaG93biA/IHNob3duLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMyk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICBwb3NpdGlvbnNbayAqIDNdID0gb2JzLnhbaV0gKyBveDtcbiAgICAgIHBvc2l0aW9uc1trICogMyArIDFdID0gb2JzLnlbaV0gKyBveTtcbiAgICAgIHBvc2l0aW9uc1trICogMyArIDJdID0geltpXSArIG96O1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdGlvbiBpcyBhIFBFUi1QT0lOVCBhbHBoYSwgaW4gdGhlIG9uZSBsYXllci5cbiAgICpcbiAgICogSXQgdXNlZCB0byBiZSBhIHNlY29uZCBsYXllcjogd2l0aCBhIHNpbmdsZSBvcGFjaXR5IGZvciB0aGUgd2hvbGUgY2xvdWQsIHRoZSBvbmx5IHdheVxuICAgKiB0byBoaWdobGlnaHQgYSBzdWJzZXQgd2FzIHRvIGRyYXcgaXQgYWdhaW4gb24gdG9wIGF0IGZ1bGwgb3BhY2l0eSB3aGlsZSB0aGUgcGFyZW50XG4gICAqIGRyb3BwZWQgdG8gdGhlIG11dGVkIGxldmVsLiBUaGF0IHNlY29uZCBsYXllciBoYWQgdG8gYmUga2VwdCBpbiBzdGVwIHRocm91Z2ggZXZlcnlcbiAgICogY29sb3JtYXAsIHdpbmRvdyBhbmQgc2l6ZSBjaGFuZ2UsIGFuZCB0aGUgdHdvIHRoZW4gZGVwdGgtc29ydGVkIGFnYWluc3QgZWFjaCBvdGhlciBhc1xuICAgKiBzZXBhcmF0ZSBkcmF3cy4gUGVyLXBvaW50IGFscGhhcyBhbmQgc2l6ZXMgZ2l2ZSB0aGUgc2FtZSByZWFkaW5nIOKAlCBtdXRlZCBjbG91ZCwgYnJpZ2h0XG4gICAqIHNlbGVjdGlvbiwgc2xpZ2h0bHkgbGFyZ2VyIHNvIGEgc21hbGwgb25lIGlzIGZpbmRhYmxlIGluc2lkZSAzLjdNIHBvaW50cyDigJQgaW4gb25lLlxuICAgKlxuICAgKiBgc2hvd25gIGlzIHRoZSBkcmF3biBzdWJzZXQgKG51bGw6IGV2ZXJ5IG9uZSBvZiB0aGUgYHRvdGFsYCBvYnNlcnZhdGlvbnMpLCBzbyB0aGUgYWxwaGFzXG4gICAqIGZvbGxvdyB0aGUgZHJhd24gb3JkZXIuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5U2VsZWN0aW9uKFxuICAgIGNsb3VkOiBQb2ludHMzRExheWVyLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2hvd246IFVpbnQzMkFycmF5IHwgbnVsbCxcbiAgICB0b3RhbDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwIHx8IHNlbGVjdGlvbi5tYXNrLmxlbmd0aCAhPT0gdG90YWwpIHtcbiAgICAgIGNsb3VkLmFscGhhcyA9IG51bGw7XG4gICAgICBjbG91ZC5zaXplcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3duQ291bnQgPSBzaG93biA/IHNob3duLmxlbmd0aCA6IHRvdGFsO1xuICAgIGNvbnN0IGFscGhhcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgY29uc3Qgc2l6ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2hvd25Db3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICBjb25zdCBwaWNrZWQgPSAhIXNlbGVjdGlvbi5tYXNrW2ldO1xuICAgICAgYWxwaGFzW2tdID0gcGlja2VkID8gMSA6IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgICAgIHNpemVzW2tdID0gcGlja2VkID8gU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFIDogMTtcbiAgICB9XG4gICAgY2xvdWQuYWxwaGFzID0gYWxwaGFzO1xuICAgIGNsb3VkLnNpemVzID0gc2l6ZXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlICoqM0QgZ2VuZSBtYXAqKjogdGhlIGFjdGl2ZSBnZW5lJ3MgZXhwcmVzc2lvbiBvdmVyIHRoZSB3aG9sZSBzZWN0aW9uZWRcbiAgICogc3BlY2ltZW4sIGFzIG9uZSByYXltYXJjaGVkIHZvbHVtZS5cbiAgICpcbiAgICogVHdvIHRoaW5ncyBpdCBjYW4gYmUsIGFuZCB0aGUgcGFuZWwncyBgVm9sdW1lIHJlbmRlcmluZ2AgdG9nZ2xlIHBpY2tzIHdoaWNoOlxuICAgKlxuICAgKiAgLSAqKnNoZWV0cyoqIOKAlCBleGFjdGx5IHRoZSBwbGFuZXMgdGhhdCB3ZXJlIGltYWdlZCwgZWFjaCBjYXJyeWluZyB0aGF0XG4gICAqICAgIHNsaWRlJ3Mgb3duIDJEIGdlbmUgbWFwLCB3aXRoIHRoZSBnYXBzIGJldHdlZW4gc2VjdGlvbnMgZW1wdHkuIEEgc3RhY2sgb2ZcbiAgICogICAgbWVhc3VyZWQgZmllbGRzLCBhdCB0aGVpciB0cnVlIHouXG4gICAqICAtICoqdm9sdW1lKiog4oCUIHRoZSBzYW1lIGZpZWxkcyBzbW9vdGhlZCBhbG9uZyB6LCBzbyB0aGUgcGxhbmVzIGJldHdlZW4gdGhlXG4gICAqICAgIHNlY3Rpb25zIGNhcnJ5IGFuIGludGVycG9sYXRlZCB2YWx1ZS4gQW4gZXN0aW1hdGUsIGFuZCBkcmF3biBhcyBhXG4gICAqICAgIHRyYW5zbHVjZW50IGNsb3VkIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGRlbnNpdHkgdm9sdW1lcyBhcmUuXG4gICAqXG4gICAqIE9uZSBgVm9sdW1lTGF5ZXJgIHJhdGhlciB0aGFuIGEgdGV4dHVyZWQgcXVhZCBwZXIgc2VjdGlvbjogYW4gYEltYWdlTGF5ZXJgXG4gICAqIHJlbmRlcnMgb25seSBhdCBgbmRpc3BsYXkgPT09IDJgLCBzbyA1MyBzaGVldHMgaW4gdGhlIG9yYml0IHZpZXcgd291bGQgbmVlZCBhXG4gICAqIG5ldyBsYXllciB0eXBlIHVwc3RyZWFtIOKAlCB3aGlsZSBhIHNjYWxhciB2b2x1bWUgd2hvc2UgeiBzYW1wbGluZyBhbHJlYWR5IElTXG4gICAqIHRoZSBzZWN0aW9uIHNwYWNpbmcgZXhwcmVzc2VzIHRoZSBzaGVldHMgZXhhY3RseSwgYW5kIHRoZSBzYW1lIGxhdHRpY2UgdGhlblxuICAgKiBnaXZlcyB0aGUgaW50ZXJwb2xhdGVkIHZlcnNpb24gZm9yIGZyZWUuXG4gICAqXG4gICAqIEVzdGltYXRlZCBvbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93biBsYXR0aWNlIChgZGVuc2l0eUdyaWRgIGF0IHN0cmlkZSAxKSxcbiAgICogc28gdGhlIGZpZWxkIGxhbmRzIHZveGVsLWZvci12b3hlbCBvbiB0aGUgYW5hdG9teSBhbmQgbmVlZHMgbm8gb2Zmc2V0IOKAlCBhXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZSwgYW5kIG5hcGFyaSBjZW50cmVzIGJvdGggYm94ZXMgb24gdGhlIHdvcmxkXG4gICAqIG9yaWdpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zZXNzaW9uLmdlbmVNYXBWb2x1bWU7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgdm9sdW1lIGJ1aWx0IGZyb20gT05FIHNlY3Rpb24gd291bGQgc21lYXIgdGhhdCBzbGlkZSB0aHJvdWdoIHRoZSB3aG9sZVxuICAgIC8vIGRlcHRoLCBzbyB0aGUgc2VjdGlvbiByZXN0cmljdGlvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHNoZWV0cy5cbiAgICBjb25zdCBpbnRlcnBvbGF0ZSA9ICEhdmlldy5nZW5lTWFwVm9sdW1lO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICAgIGNvbnN0IHNlY3Rpb24gPVxuICAgICAgIWludGVycG9sYXRlICYmIHZpZXcuZ2VuZU1hcFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5nZW5lTWFwU2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGdlbmVcbiAgICAgID8gW1xuICAgICAgICAgIGRhdGFzZXQuaWQsXG4gICAgICAgICAgZ2VuZSxcbiAgICAgICAgICBzbW9vdGhpbmcsXG4gICAgICAgICAgc2VjdGlvbiA/PyAnYWxsJyxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA/ICd2b2wnIDogJ3NoZWV0cycsXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgICBmaWVsZEtleSxcbiAgICAgICAgICBjbGlwLmpvaW4oJywnKSxcbiAgICAgICAgICB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJyxcbiAgICAgICAgICB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICAgIHRoaXMuY3R4LmRpc3BsYXkuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcEtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcEtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgY2FjaGUuZmllbGQgPSBudWxsO1xuICAgICAgY2FjaGUua2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb2Fyc2VuZWQgaW4tcGxhbmUgYnV0IE5PVCBhbG9uZyB6OiB0aGUgc2hlZXRzIG5lZWQgb25lIHBsYW5lIHBlciBpbWFnZWRcbiAgICAvLyBzZWN0aW9uLCB3aGlsZSB0aGUgZmllbGQgdGhleSBjYXJyeSBpcyBzbW9vdGggYnkgY29uc3RydWN0aW9uIGFuZCBnYWluc1xuICAgIC8vIG5vdGhpbmcgZnJvbSB0aGUgdGVtcGxhdGUncyA0MCDCtW0gZGV0YWlsLiBBdCBmdWxsIHJlc29sdXRpb24gdGhlIGVzdGltYXRlIGlzXG4gICAgLy8gYSA1LjdNLXZveGVsIHBhaXIgb2YgYmx1cnMg4oCUIHNlY29uZHMgb2Ygd29yayBmb3IgYSBjaGVja2JveDsgYW4gZWlnaHRoIG9mIHRoZVxuICAgIC8vIHZveGVscyBpcyBhbiBlaWdodGggb2YgdGhlIHdvcmsuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQsIEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUsIDEyOCwgMSk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IGNhY2hlLmtleSkge1xuICAgICAgY29uc3QgbG9hZCA9IHRoaXMuZ2VuZU1hcExvYWRzLm5leHQoKTtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIDNEIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEluLXBsYW5lIM+DIGlzIGEgUEhZU0lDQUwgYmFuZHdpZHRoLCBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93blxuICAgICAgLy8gdm94ZWwg4oCUIHRoZSByZXNvbHV0aW9uIHRoZSAyRCBtYXAgZXN0aW1hdGVzIGF0IOKAlCBzbyBhIHNoZWV0IGFuZCB0aGUgMkRcbiAgICAgIC8vIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQgd2hhdGV2ZXIgbGF0dGljZSB0aGlzIGlzXG4gICAgICAvLyByYXN0ZXJpc2VkIG9uLiBBbG9uZyB6IGl0IGlzIHRoZSBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzOiB0aGUgc21hbGxlc3Qgz4NcbiAgICAgIC8vIHRoYXQgYnJpZGdlcyBvbmUgc2VjdGlvbiBnYXAuXG4gICAgICBjb25zdCBpblBsYW5lID0gZGF0YXNldC52b2x1bWU/LnZveGVsU2l6ZSA/PyBncmlkLnZveGVsU2l6ZTtcbiAgICAgIGxldCBmaWVsZDogRXhwcmVzc2lvblZvbHVtZUZpZWxkIHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpZWxkID0gYXdhaXQgY29tcHV0ZUV4cHJlc3Npb25Wb2x1bWVBc3luYyhcbiAgICAgICAgICBvYnMsXG4gICAgICAgICAgZ3JpZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzaWdtYTogW1xuICAgICAgICAgICAgICBpblBsYW5lWzBdICogR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICAgIGluUGxhbmVbMV0gKiBHRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICAgICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgaW5kaWNlczogc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBpblNlbGVjdGlvbixcbiAgICAgICAgICAgIGludGVycG9sYXRlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzaWduYWw6IGxvYWQuc2lnbmFsIH0sXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzQWJvcnRFcnJvcihlcnIpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBtYXAsIG9yIHRoZSBzY2VuZSB3ZW50IGF3YXlcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNhY2hlLmZpZWxkID0gZmllbGQ7XG4gICAgICBjYWNoZS5rZXkgPSBmaWVsZEtleTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSBjYWNoZS5maWVsZDtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICAvLyBUaGUgaGlnaCBlbmQgb3ZlciB0aGUgTUVBU1VSRUQgdm94ZWxzIG9ubHkgKHRoZSB1bm1lYXN1cmVkIHplcm9zIHdvdWxkIHB1bGwgaXQgZG93biBhbmRcbiAgICAvLyBzYXR1cmF0ZSB0aGUgbWFwKSwgYnV0IHRoZSBsb3cgZW5kIHN0YXlzIDA6IGluIGEgdm9sdW1lIHRoZSB2YWx1ZSBpcyBhbHNvIHRoZSBvcGFjaXR5IGFuZFxuICAgIC8vIDAgcmVhZHMgYXMgXCJub3RoaW5nIGhlcmVcIiwgc28gc3RhcnRpbmcgYXQgdGhlIGxvd2VzdCBtZWFzdXJlZCB2YWx1ZSB3b3VsZCBlcmFzZSBpdC5cbiAgICBjb25zdCBbLCBoaV0gPSBmaWVsZENvbnRyYXN0V2luZG93KGZpZWxkLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCBsbyA9IDA7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZUV4cHJlc3Npb25Wb2x1bWUoZmllbGQsIFtsbywgaGldLCB7IGxvZzogdmlldy5sb2dTY2FsZSB9KTtcbiAgICBjb25zdCBsdXQgPSB0aGlzLmN0eC5kaXNwbGF5LnNwYXRpYWxMdXQodmlldyk7XG4gICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSB2aWV3ZXIuYWRkVm9sdW1lKGRhdGEsIGZpZWxkLndpZHRoLCBmaWVsZC5oZWlnaHQsIGZpZWxkLmRlcHRoLCB7XG4gICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfSR7aW50ZXJwb2xhdGUgPyAnIMK3IHZvbHVtZScgOiAnJ31gLFxuICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dChgZ2VuZS1tYXAtJHtnZW5lfWAsIGx1dCksXG4gICAgICAvLyBUaGUgZW5jb2RpbmcgYWxyZWFkeSBhcHBsaWVkIHRoZSB3aW5kb3csIHNvIHRoZSBsYXllciBtdXN0IG5vdCBhcHBseSBhXG4gICAgICAvLyBzZWNvbmQgb25lOiAwLi4yNTUgaXMgdGhlIHdob2xlIG9mIHdoYXQgaXQgd2FzIGdpdmVuLlxuICAgICAgY29udHJhc3RMaW1pdHM6IFswLCAyNTVdLFxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgLy8gQWRkaXRpdmUgbGlrZSB0aGUgZGVuc2l0eSB2b2x1bWVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlIHNoZWV0c1xuICAgICAgLy8gaGF2ZSB0byByZWFkIFRIUk9VR0ggZWFjaCBvdGhlciBhbmQgdGhyb3VnaCB0aGUgYW5hdG9teSwgd2hpY2ggYVxuICAgICAgLy8gdHJhbnNsdWNlbnQgYmxlbmQgd291bGQgb2NjbHVkZSBvbmUgc2hlZXQgYXQgYSB0aW1lLlxuICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICBvcGFjaXR5OiB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICB9KTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzOiBlYWNoIGNsdXN0ZXIgcmFzdGVyaXNlZCBpbnRvIGEgc21vb3RoIHNjYWxhciBmaWVsZCBhbmRcbiAgICogcmF5bWFyY2hlZCBhbG9uZ3NpZGUgdGhlIGNsb3VkLCB0aW50ZWQgd2l0aCB0aGUgY2x1c3RlcidzIG93biBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgYSBzZXJpYWxseSBzZWN0aW9uZWQgZGF0YXNldCByZWFkYWJsZSBhcyBhbiBhbmF0b21pY2FsXG4gICAqIGRpc3RyaWJ1dGlvbi4gVGhlIGNsb3VkIHNob3dzIG1lYXN1cmVkIGNlbGxzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIGJ1dCBhdCAyMDAgwrVtXG4gICAqIHNlY3Rpb24gc3BhY2luZyB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgYSBzdGFjayBvZiBkaXNjcyBpbnRvIGEgc2hhcGUsIGFuZFxuICAgKiBldmVyeSBnYXAgcmVhZHMgYXMgYWJzZW5jZS4gQSBkZW5zaXR5IGZpZWxkIGlzIGEgZGlmZmVyZW50IG9iamVjdCBmcm9tIGEgY2VsbDpcbiAgICogYW4gZXN0aW1hdGUsIGRlZmluZWQgYmV0d2VlbiB0aGUgaW1hZ2VkIHBsYW5lcywgZHJhd24gYXMgYSB0cmFuc2x1Y2VudCBjbG91ZCBzb1xuICAgKiBpdCBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIG1lYXN1cmVtZW50LiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBuZXZlciBpbnRlcnBvbGF0ZWQg4oCUXG4gICAqIGNvbnNlY3V0aXZlIHNlY3Rpb25zIHNhbXBsZSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGVcbiAgICogYWxvbmcuXG4gICAqXG4gICAqIE9uZSB2b2x1bWUgcGVyIGNsdXN0ZXIgcmF0aGVyIHRoYW4gb25lIGZvciBldmVyeXRoaW5nOiBhZGRpdGl2ZSBibGVuZGluZyBpcyB3aGF0XG4gICAqIG1ha2VzIHR3byBjbHVzdGVycycgdGVycml0b3JpZXMgY29tcGFyYWJsZSwgYW5kIGEgc2luZ2xlIGJsZW5kZWQgZmllbGQgd291bGRcbiAgICogYW5zd2VyIG5vIHF1ZXN0aW9uIGFueW9uZSBhc2tzIG9mIGEgdGF4b25vbXkuIENhcHBlZCBhdCBgREVOU0lUWV9NQVhfQ0xVU1RFUlNgIGJ5IGNlbGxcbiAgICogY291bnQuXG4gICAqXG4gICAqIEtleWVkIHNvIGl0IHJlYnVpbGRzIG9ubHkgd2hlbiB0aGUgZmllbGQgd291bGQgYWN0dWFsbHkgZGlmZmVyIOKAlCB0aGUgZGF0YXNldCxcbiAgICogdGhlIGNvbG91ciBjb2x1bW4sIHRoZSBiYW5kd2lkdGgsIG9yIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlbnNpdHlWb2x1bWVzKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb24gPSAhIXZpZXcuZGVuc2l0eVZvbHVtZSAmJiAhIWRhdGFzZXQub2JzZXJ2YXRpb25zLno7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5kZW5zaXR5U21vb3RoaW5nID4gMCA/IHZpZXcuZGVuc2l0eVNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY29sdW1uID0gdmlldy5jb2xvckJ5Py5raW5kID09PSAnY29sdW1uJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICAvLyBUaGUgc2VsZWN0aW9uIGVudGVycyB0aGUga2V5IGJ5IElERU5USVRZLCBub3QgYnkgY291bnQ6IHR3byBkaWZmZXJlbnQgUk9Jc1xuICAgIC8vIGhvbGRpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGNlbGxzIHdvdWxkIG90aGVyd2lzZSBsb29rIGxpa2UgdGhlIHNhbWUga2V5IGFuZFxuICAgIC8vIGxlYXZlIHRoZSBwcmV2aW91cyBST0kncyBmaWVsZHMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGtleSA9IG9uXG4gICAgICA/IFtkYXRhc2V0LmlkLCBjb2x1bW4gPz8gJ2FsbCcsIHNtb290aGluZywgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmRlbnNpdHlLZXkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5kZW5zaXR5TGF5ZXJzID0gW107XG4gICAgdGhpcy5kZW5zaXR5S2V5ID0ga2V5O1xuICAgIGNvbnN0IGxvYWQgPSB0aGlzLmRlbnNpdHlMb2Fkcy5uZXh0KCk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0KTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcbiAgICAvLyBXaXRoIG5vIHJlZmVyZW5jZSB2b2x1bWUgdGhlcmUgaXMgbm8gb2Zmc2V0IHlldCwgYW5kIGEgVm9sdW1lTGF5ZXIgaGFzIG5vXG4gICAgLy8gdHJhbnNsYXRlIOKAlCBuYXBhcmkgY2VudHJlcyBpdHMgYm94IG9uIHRoZSB3b3JsZCBvcmlnaW4uIFNvIHRoZSBQT0lOVFMgbW92ZSBieVxuICAgIC8vIGhhbGYgdGhlIGRlbnNpdHkgYm94LCBleGFjdGx5IGFzIHRoZXkgZG8gZm9yIGEgcmVmZXJlbmNlIHZvbHVtZSwgYW5kIHRoZVxuICAgIC8vIGNhY2hlZCBnZW9tZXRyeSBpcyBpbnZhbGlkYXRlZCBiZWNhdXNlIHRoYXQgb2Zmc2V0IGp1c3QgY2hhbmdlZC5cbiAgICBpZiAoIXRoaXMudm9sdW1lKSB7XG4gICAgICB0aGlzLm9yaWdpbiA9IFtcbiAgICAgICAgLShncmlkLndpZHRoICogZ3JpZC52b3hlbFNpemVbMF0pIC8gMixcbiAgICAgICAgLShncmlkLmhlaWdodCAqIGdyaWQudm94ZWxTaXplWzFdKSAvIDIsXG4gICAgICAgIC0oZ3JpZC5kZXB0aCAqIGdyaWQudm94ZWxTaXplWzJdKSAvIDIsXG4gICAgICBdO1xuICAgICAgdGhpcy5sYXllcktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGdyb3VwczogRGVuc2l0eUdyb3VwW107XG4gICAgdHJ5IHtcbiAgICAgIGdyb3VwcyA9IGF3YWl0IHRoaXMuZGVuc2l0eUdyb3VwcyhkYXRhc2V0LCBjb2x1bW4sIHNlbGVjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIGRlbnNpdHkgdm9sdW1lczogY29sdW1uIHVuYXZhaWxhYmxlJywgZXJyKTtcbiAgICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBzaWdtYSA9IGRlZmF1bHRTaWdtYShncmlkLCBzbW9vdGhpbmcpO1xuICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nIFNVTVMsIHNvIGEgZml4ZWQgcGVyLWxheWVyIG9wYWNpdHkgYmxvd3Mgb3V0IHRvIHdoaXRlIGFzXG4gICAgLy8gc29vbiBhcyBzZXZlcmFsIGJyb2FkIGNsdXN0ZXJzIG92ZXJsYXAg4oCUIHNpeCBzdWJjbGFzc2VzIGF0IDAuNTUgZWFjaCB0dXJuZWRcbiAgICAvLyB0aGUgYnJhaW4gaW50byBvbmUgY3lhbiBtYXNzLiBTcGxpdHRpbmcgdGhlIGJ1ZGdldCBrZWVwcyBuIGZ1bGx5IG92ZXJsYXBwaW5nXG4gICAgLy8gcGVha3MgaW5zaWRlIHRoZSBkaXNwbGF5J3MgcmFuZ2UsIHNvIG92ZXJsYXAgcmVhZHMgYXMgb3ZlcmxhcDsgYSBzaW5nbGVcbiAgICAvLyBjbHVzdGVyIHN0aWxsIGdldHMgdGhlIGZ1bGwgMC41NS4gSXQgb25seSBtaXRpZ2F0ZXM6IGEgdHJhbnNsdWNlbnQgcmF5bWFyY2hcbiAgICAvLyBpbnRlZ3JhdGVzIGFsb25nIHRoZSByYXksIHNvIGNsdXN0ZXJzIHRoYXQgYXJlIHViaXF1aXRvdXMgcmF0aGVyIHRoYW5cbiAgICAvLyByZWdpb25hbCAodGhlIGxhcmdlc3Qgc3ViY2xhc3NlcyBhcmUgZ2xpYSwgd2hpY2ggYXJlIGV2ZXJ5d2hlcmUpIHN0aWxsIHBpbGVcbiAgICAvLyB1cCwgYW5kIG9uZSBjbHVzdGVyIGF0IGEgdGltZSBpcyB0aGUgcmVhZGFibGUgd2F5IHRvIGxvb2sgYXQgdGhvc2UuXG4gICAgY29uc3Qgb3BhY2l0eSA9IE1hdGgubWluKDAuNTUsIDAuOSAvIE1hdGgubWF4KDEsIGdyb3Vwcy5sZW5ndGgpKTtcbiAgICBsZXQgZmllbGRzOiAoVWludDhBcnJheSB8IG51bGwpW107XG4gICAgdHJ5IHtcbiAgICAgIC8vIE9mZiB0aGUgbWFpbiB0aHJlYWQgcGFzdCB0aGUgd29ya2VyIHRocmVzaG9sZDsgdGhlIGNsdXN0ZXJzIHF1ZXVlIG9uIG9uZSB3b3JrZXIuXG4gICAgICBmaWVsZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZ3JvdXBzLm1hcCgoZ3JvdXApID0+XG4gICAgICAgICAgcmFzdGVyaXplRGVuc2l0eUFzeW5jKFxuICAgICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAgICBncmlkLFxuICAgICAgICAgICAgeyBzaWdtYSwgaW5kaWNlczogZ3JvdXAuaW5kaWNlcyB9LFxuICAgICAgICAgICAgeyBzaWduYWw6IGxvYWQuc2lnbmFsIH0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNBYm9ydEVycm9yKGVycikpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIGtleSwgb3IgdGhlIHNjZW5lIHdlbnQgYXdheVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmRlbnNpdHlLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgIGdyb3Vwcy5mb3JFYWNoKChncm91cCwgaSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGZpZWxkc1tpXTtcbiAgICAgIC8vIEEgY2x1c3RlciB3aXRoIG5vdGhpbmcgb24gdGhlIGdyaWQgZHJhd3Mgbm8gbGF5ZXIsIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJveC5cbiAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgICAgdGhpcy5kZW5zaXR5TGF5ZXJzLnB1c2goXG4gICAgICAgIHZpZXdlci5hZGRWb2x1bWUoZGF0YSwgZ3JpZC53aWR0aCwgZ3JpZC5oZWlnaHQsIGdyaWQuZGVwdGgsIHtcbiAgICAgICAgICBuYW1lOiBgZGVuc2l0eSDCtyAke2dyb3VwLm5hbWV9YCxcbiAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jdHguZGlzcGxheS5jaGFubmVsVGludENvbG9ybWFwKGdyb3VwLmNvbG9yKSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICAgIC8vIFRyYW5zbHVjZW50LCBub3QgTUlQOiBhIGNsdXN0ZXIncyBpbnRlcmlvciBpcyB0aGUgcmVhZGFibGUgcGFydCwgYW5kIE1JUFxuICAgICAgICAgIC8vIHdvdWxkIGZsYXR0ZW4gZXZlcnkgY2xvdWQgdG8gaXRzIGJyaWdodGVzdCBzaGVsbC5cbiAgICAgICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgICAvLyBBZGRpdGl2ZSwgc28gdHdvIGNsdXN0ZXJzIG92ZXJsYXBwaW5nIHJlYWQgYXMgYm90aCBiZWluZyB0aGVyZSBpbnN0ZWFkXG4gICAgICAgICAgLy8gb2YgdGhlIG5lYXJlciBvbmUgaGlkaW5nIHRoZSBvdGhlci5cbiAgICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgICB2b3hlbFNpemU6IGdyaWQudm94ZWxTaXplLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlcnMgdG8gcmFzdGVyaXNlOiB0aGUgY2F0ZWdvcmllcyBvZiB0aGUgYWN0aXZlIGNhdGVnb3JpY2FsIGNvbG91cmluZyxcbiAgICogYmlnZ2VzdCBmaXJzdCBhbmQgY2FwcGVkLCBlYWNoIHdpdGggaXRzIGxlZ2VuZCBjb2xvdXIsIHJlc3RyaWN0ZWQgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAqIHdoZW4gdGhlcmUgaXMgb25lLiBXaXRoIG5vIGNhdGVnb3JpY2FsIGNvbG91cmluZyB0aGVyZSBpcyBvbmUgZ3JvdXAg4oCUIHRvdGFsIGNlbGwgZGVuc2l0eSxcbiAgICogd2hpY2ggaXMgYSByZWFsIHF1ZXN0aW9uIG9uIGl0cyBvd24gKFwid2hlcmUgaXMgdGhlIHRpc3N1ZSBkZW5zZT9cIikgYW5kIHRoZSBob25lc3QgdGhpbmcgdG9cbiAgICogc2hvdyB3aGVuIHRoZSB2aWV3IGlzIG5vdCBlbmNvZGluZyBhIHRheG9ub215LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZW5zaXR5R3JvdXBzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIGNvbHVtbjogc3RyaW5nIHwgbnVsbCxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPERlbnNpdHlHcm91cFtdPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IG1ldGEgPSBjb2x1bW4gPyBmaW5kQ29sdW1uTWV0YShkYXRhc2V0LCBjb2x1bW4pIDogdW5kZWZpbmVkO1xuICAgIGlmICghcG9ydCB8fCAhY29sdW1uIHx8ICFtZXRhIHx8IG1ldGEua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuIFt0b3RhbERlbnNpdHlHcm91cChzZWxlY3Rpb24pXTtcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihsb2FkZWQpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHJhbmtEZW5zaXR5R3JvdXBzKGNvbHVtbiwgbG9hZGVkLCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCwgc2VsZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgKG9yIGtlZXApIHRoZSBkYXRhc2V0J3MgcmVmZXJlbmNlIHZvbHVtZSwgYW5kIGRlcml2ZSB0aGUgb2Zmc2V0IHRoYXQgc2l0cyB0aGVcbiAgICogb2JzZXJ2YXRpb25zIGluc2lkZSBpdC5cbiAgICpcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlOiBuYXBhcmktanMgbWFwcyB0aGUgdm9sdW1lJ3MgdW5pdCBjdWJlIHRvIGEgd29ybGQgYm94XG4gICAqICoqY2VudHJlZCBvbiB0aGUgb3JpZ2luKiosIHNpemVkIGBkaW1zIHggdm94ZWxTaXplYC4gVGhlIG9ic2VydmF0aW9ucywgYnkgY29udHJhY3QsIGFyZSBpblxuICAgKiB0aGUgdm9sdW1lJ3Mgb3duIGZyYW1lIHdpdGggaXRzIG5lYXIgY29ybmVyIGF0IHRoZSBjb29yZGluYXRlIG9yaWdpbi4gU28gdGhlIHR3byBvbmx5IGxpbmVcbiAgICogdXAgaWYgdGhlIFBPSU5UUyBtb3ZlIOKAlCBieSBoYWxmIHRoZSBib3gg4oCUIHdoaWNoIGlzIHdoYXQge0BsaW5rIG9yaWdpbn0gaXMuXG4gICAqXG4gICAqIEEgZmFpbGVkIG9yIGFic2VudCB2b2x1bWUgaXMgbm90IGZhdGFsOiB0aGUgY2xvdWQgcmVuZGVycyBvbiBpdHMgb3duLCBhdCBpdHMgb3duXG4gICAqIGNvb3JkaW5hdGVzLCBhbmQgdGhlIGNhbWVyYSBmcmFtZXMgdGhlIHBvaW50cyBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVWb2x1bWUodmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudm9sdW1lO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBrZXkgPSBtZXRhID8gYCR7ZGF0YXNldC5pZH06JHttZXRhLndpZHRofXgke21ldGEuaGVpZ2h0fXgke21ldGEuZGVwdGh9YCA6IG51bGw7XG4gICAgaWYgKGtleSAmJiBrZXkgPT09IHRoaXMudm9sdW1lS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy52b2x1bWUpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMudm9sdW1lKTtcbiAgICAgIHRoaXMudm9sdW1lID0gbnVsbDtcbiAgICAgIHRoaXMudm9sdW1lS2V5ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlIHN1cmZhY2VzIHNhdCBpbiB0aGUgdm9sdW1lIGp1c3QgcmVtb3ZlZCAob3IgdGhlcmUgd2FzIG5vbmUpOiBkb3duIHVudGlsIG9uZSBpcyBwbGFjZWQuXG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgIHRoaXMub3JpZ2luID0gWzAsIDAsIDBdO1xuICAgIGlmICghbWV0YSB8fCAhcG9ydD8uZ2V0Vm9sdW1lKSByZXR1cm47XG5cbiAgICBsZXQgdm94ZWxzOiBVaW50OEFycmF5O1xuICAgIHRyeSB7XG4gICAgICB2b3hlbHMgPSBhd2FpdCBwb3J0LmdldFZvbHVtZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSByZWZlcmVuY2Ugdm9sdW1lIHVuYXZhaWxhYmxlIOKAlCBkcmF3aW5nIHRoZSBjbG91ZCBhbG9uZScsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmN0eC5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gbWV0YS52b3hlbFNpemU7XG4gICAgdGhpcy52b2x1bWVLZXkgPSBrZXk7XG4gICAgdGhpcy52b2x1bWUgPSB2aWV3ZXIuYWRkVm9sdW1lKHZveGVscywgbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGgsIHtcbiAgICAgIG5hbWU6ICdyZWZlcmVuY2Ugdm9sdW1lJyxcbiAgICAgIGNvbG9ybWFwOiAnZ3JheScsXG4gICAgICAvLyBNSVAgd291bGQgZHJhdyB0aGUgYnJpZ2h0ZXN0IHZveGVsIGFsb25nIGVhY2ggcmF5LCB3aGljaCBmb3IgYW4gYXZlcmFnZWRcbiAgICAgIC8vIHRlbXBsYXRlIG1lYW5zIGEgZmxhdCB3aGl0ZSBzaGVsbCB0aGF0IGhpZGVzIHRoZSBjbG91ZC4gVHJhbnNsdWNlbnQgbGV0c1xuICAgICAgLy8gdGhlIHBvaW50cyByZWFkIHRocm91Z2ggdGhlIHRpc3N1ZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBkcmF3aW5nXG4gICAgICAvLyB0aGVtIHRvZ2V0aGVyLlxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgb3BhY2l0eTogdmlldy52b2x1bWVPcGFjaXR5LFxuICAgICAgdm94ZWxTaXplOiBbdngsIHZ5LCB2el0sXG4gICAgfSk7XG4gICAgaWYgKHRoaXMucmVnaW9uc1Rocm91Z2gpIHRoaXMudm9sdW1lLmJsZW5kaW5nID0gJ3RyYW5zbHVjZW50X25vX2RlcHRoJztcbiAgICAvLyBIYWxmIHRoZSBib3gsIG5lZ2F0ZWQ6IHRoZSBvYnNlcnZhdGlvbnMnIG9yaWdpbiBpcyB0aGUgYm94J3MgbmVhciBjb3JuZXIsXG4gICAgLy8gYW5kIHRoZSBib3ggaXMgY2VudHJlZCBvbiB0aGUgd29ybGQgb3JpZ2luLlxuICAgIHRoaXMub3JpZ2luID0gWy0obWV0YS53aWR0aCAqIHZ4KSAvIDIsIC0obWV0YS5oZWlnaHQgKiB2eSkgLyAyLCAtKG1ldGEuZGVwdGggKiB2eikgLyAyXTtcbiAgICB0aGlzLnBsYWNlUmVnaW9uTWVzaGVzKGRhdGFzZXQpO1xuICAgIC8vIEZvcmNlIGEgZ2VvbWV0cnkgcmVidWlsZDogdGhlIG9mZnNldCBjaGFuZ2VkLCBzbyBjYWNoZWQgcG9zaXRpb25zIGFyZSBzdGFsZS5cbiAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcm9wIGV2ZXJ5IGxheWVyIG9mIHRoZSBjbG91ZCAodGhlIGRhdGFzZXQgd2VudCBhd2F5LCBvciBoYXMgbm8geikuICovXG4gIHByaXZhdGUgcmVtb3ZlTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgW3RoaXMucG9pbnRzLCB0aGlzLnZvbHVtZSwgdGhpcy5nZW5lTWFwTGF5ZXIsIC4uLnRoaXMuZGVuc2l0eUxheWVyc10pIHtcbiAgICAgIGlmIChsYXllcikgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uZ2VuZU1hcFZvbHVtZS5maWVsZCA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uLmdlbmVNYXBWb2x1bWUua2V5ID0gbnVsbDtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBudWxsO1xuICAgIC8vIFRoZSBzY2VuZSBpcyBnb25lLCBzbyB0aGUgbmV4dCAzRCBsYXllciBzaG91bGQgZnJhbWUgaXRzZWxmIGFnYWluLiBUaGF0IHVzZWQgdG8gYmVcbiAgICAvLyBgc3BhdGlhbEZyYW1lZCA9IG51bGxgIG5leHQgdG8gYSBoYW5kLXJvbGxlZCBzYXZlL3Jlc3RvcmU7IHRoZSByZW5kZXJlciBvd25zIHRoZVxuICAgIC8vIHBvbGljeSBub3csIGFuZCB0aGlzIGlzIHRoZSBzYW1lIHN0YXRlbWVudCBhZGRyZXNzZWQgdG8gaXQuXG4gICAgdmlld2VyLnJlc2V0Rml0M0QoKTtcbiAgICB0aGlzLnZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVLZXkgPSBudWxsO1xuICAgIHRoaXMub3JpZ2luID0gWzAsIDAsIDBdO1xuICAgIHRoaXMucG9pbnRzID0gbnVsbDtcbiAgICB0aGlzLnNldFBpY2tlcihudWxsKTtcbiAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNjYWxhcktleSA9IG51bGw7XG4gICAgdGhpcy5wb3NpdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuZHJhd24gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgY29sb3VycyB0aGUgY2xvdWQuXG4gICAqXG4gICAqIENvbnRpbnVvdXMgZGF0YSBnb2VzIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIHRoZSBzYW1lIHBlcmNlbnRpbGUgd2luZG93IHRoZSAyRCBwYXRoXG4gICAqIHVzZXMuIENhdGVnb3JpY2FsIGRhdGEgaXMgb25lIFJHQkEgcGVyIHBvaW50IGZyb20gdGhlIGNvbHVtbidzIHBhbGV0dGUsIHNvIGFueSBudW1iZXIgb2ZcbiAgICogY2F0ZWdvcmllcyBrZWVwcyBpdHMgb3duIGNvbG91ciDigJQgc2VlIGBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbGAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNjYWxhckVuY29kaW5nKHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvbHVtbi5jb2RlcywgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGNvbHVtbi52YWx1ZXMsIHZpZXcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpLCB2aWV3KTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgdGhlIGFjdGl2ZSBjb2xvcm1hcCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy4gKi9cbiAgZW5jb2RlQ29udGludW91cyhzb3VyY2U6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFNwYXRpYWwzZFNjYWxhcnMge1xuICAgIHJldHVybiBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgc291cmNlLFxuICAgICAgdmlldyxcbiAgICAgIHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KSxcbiAgICAgIHRoaXMuc2Vzc2lvbi5jb250cmFzdFdpbmRvd3MsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBvYnNlcnZhdGlvbnMgdGhlIGNsb3VkIGRyYXdzLCBhbmQgdGhlIGtleXMgb2YgaXRzIGdlb21ldHJ5IGFuZCBvZiBpdHMgY29sb3VyIHNvdXJjZS5cbiAqXG4gKiBPbmUgaW1hZ2VkIHNlY3Rpb24sIG9yIHRoZSB3aG9sZSBzdGFjayAoYHNob3duYCBudWxsKS4gVGhlIHN1YnNldCBJUyB0aGUgZ2VvbWV0cnksIHNvIGl0XG4gKiBiZWxvbmdzIGluIHRoZSBnZW9tZXRyeSBrZXkgcmF0aGVyIHRoYW4gYmVpbmcgcmUtZGVyaXZlZCBwZXIgZnJhbWUg4oCUIGFuZCBhbiBvdXQtb2YtcmFuZ2VcbiAqIGluZGV4IGlzIGNsYW1wZWQgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlIGNsb3VkLCBiZWNhdXNlIHRoZSBzZWN0aW9uIGNvdW50IGNoYW5nZXMgd2l0aCB0aGVcbiAqIGRhdGFzZXQgd2hpbGUgdGhlIHZpZXcgc3RhdGUgcGVyc2lzdHMuIFRoZSBzY2FsYXJzJyBpZGVudGl0eSBpcyB0cmFja2VkIHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAqIGdlb21ldHJ5J3MgKGBjb2xvckJ5YCBwbHVzIHRoZSB0cmFuc2Zvcm1zIGZlZWRpbmcgdGhlIGVuY29kaW5nKTogYSBuZXcgY29sb3VyIHNvdXJjZSBzd2Fwc1xuICogYHZhbHVlc2AgaW4gcGxhY2UgKG5hcGFyaS1qcyDiiaUgMC4xNCksIHdoaWxlIGEgbmV3IGdlb21ldHJ5IG5lZWRzIGEgbmV3IGxheWVyLlxuICovXG5mdW5jdGlvbiBjbG91ZFN1YnNldChcbiAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4pOiB7IHNob3duOiBVaW50MzJBcnJheSB8IG51bGw7IGtleTogc3RyaW5nOyBzY2FsYXJLZXk6IHN0cmluZyB9IHtcbiAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICBjb25zdCBzZWN0aW9uID1cbiAgICB2aWV3LnBvaW50U2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5wb2ludFNlY3Rpb24pKV1cbiAgICAgIDogbnVsbDtcbiAgY29uc3Qgc2hvd24gPSBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IG51bGw7XG4gIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NlY3Rpb24gPz8gJ2FsbCd9YDtcbiAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICBjb25zdCBzY2FsYXJLZXkgPSBbXG4gICAga2V5LFxuICAgIHZpZXcuY29sb3JCeSA/IGAke3ZpZXcuY29sb3JCeS5raW5kfToke3ZpZXcuY29sb3JCeS5uYW1lfWAgOiAnZmxhdCcsXG4gICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgY2xpcC5qb2luKCcsJyksXG4gIF0uam9pbignfCcpO1xuICByZXR1cm4geyBzaG93biwga2V5LCBzY2FsYXJLZXkgfTtcbn1cbiJdfQ==
870
+ /** The observations of `indices` (every one when null) that `shown` keeps. */
871
+ function keepShown(indices, shown, count) {
872
+ const out = new Uint32Array(indices ? indices.length : count);
873
+ let n = 0;
874
+ if (indices) {
875
+ for (const i of indices)
876
+ if (shown[i])
877
+ out[n++] = i;
878
+ }
879
+ else {
880
+ for (let i = 0; i < count; i++)
881
+ if (shown[i])
882
+ out[n++] = i;
883
+ }
884
+ return out.subarray(0, n);
885
+ }
886
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3JELE9BQU8sRUFJTCxjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0sMENBQTBDLENBQUM7QUFFbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUYsT0FBTyxFQUF3QixjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkYsT0FBTyxFQUNMLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHVCQUF1QixHQUN4QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFFTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUVMLGNBQWMsRUFD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Q0FBQztJQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPO1lBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb2ludFBpY2tlciwgY29sb3JtYXBGcm9tTHV0IH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRzM0RMYXllciwgVmlld2VyLCBWb2x1bWVMYXllciB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBTY2FsZUJhck92ZXJsYXkgfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuXG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQge1xuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgZmluZENvbHVtbk1ldGEsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfTVVURURfT1BBQ0lUWSwgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZGVmYXVsdFNpZ21hLCBkZW5zaXR5R3JpZCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1kZW5zaXR5JztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2VjdGlvbiwgc2VjdGlvbnNPZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWN0aW9ucyc7XG5pbXBvcnQge1xuICBnZW5lRmlsdGVyS2V5LFxuICBvYnNlcnZhdGlvbkdlbmVNYXNrLFxuICBvYnNlcnZhdGlvbkdlbmVTdHlsZSxcbiAgb2JzZXJ2YXRpb25HZW5lU3R5bGVLZXksXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1nZW5lLWZpbHRlcic7XG5pbXBvcnQge1xuICBFeHByZXNzaW9uVm9sdW1lRmllbGQsXG4gIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUsXG4gIGZpZWxkQ29udHJhc3RXaW5kb3csXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uVm9sdW1lQXN5bmMsIHJhc3Rlcml6ZURlbnNpdHlBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB0eXBlIHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb25NZXNoM0QsIFZvbHVtZVJlZ2lvbk1lc2hlcyB9IGZyb20gJy4vbmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzJztcbmltcG9ydCB7IGlzQWJvcnRFcnJvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7XG4gIERlbnNpdHlHcm91cCxcbiAgR0VORV9NQVBfU0lHTUEsXG4gIEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUsXG4gIFNQQVRJQUxfM0RfQkFTRV9TSVpFLFxuICBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gIFNwYXRpYWwzZEVuY29kaW5nLFxuICBTcGF0aWFsM2RTY2FsYXJzLFxuICBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbCxcbiAgZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyxcbiAgZ2F0aGVyQ29sb3JzLFxuICByYW5rRGVuc2l0eUdyb3VwcyxcbiAgc3BhdGlhbEZsYXRDb2xvcm1hcCxcbiAgdG90YWxEZW5zaXR5R3JvdXAsXG59IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgSE9WRVJfUkFESVVTX1BYIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1ob3Zlcic7XG5pbXBvcnQgeyBTcGF0aWFsU2NlbmVCYXNlLCBTcGF0aWFsU2Vzc2lvbiB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHR5cGUgeyBOYXBhcmlTY2VuZSwgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKipcbiAqIFNQQVRJQUxfT01JQ1NfM0QgKHJldmlldyBBcHBlbmRpeCBCLCBjbHVzdGVyIEspOiBvYnNlcnZhdGlvbnMgYXMgYSAzRCBwb2ludCBjbG91ZCB1bmRlciB0aGVcbiAqIG9yYml0IGNhbWVyYSwgd2l0aCB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWUgYXJvdW5kIGl0LCBwZXItY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgYW5kIHRoZVxuICogM0QgZ2VuZSBtYXAuXG4gKlxuICogVGhpbm5lciB0aGFuIHRoZSAyRCBzY2VuZTogdGhlcmUgaXMgbm8gdGlzc3VlIGltYWdlIHRvIHJlbmRlciAoYSByZWdpc3RlcmVkIHZvbHVtZSBsaWtlIHRoZVxuICogQWxsZW4gQ0NGIGhhcyBubyBzaW5nbGUgcmVmZXJlbmNlIHBsYW5lKSwgc28gbm8gcmVhZGJhY2sgYW5kIG5vIG5hdmlnYXRvcjsgdGhlIDNEIHNjYWxlIGJhclxuICogZm9sbG93cyB0aGUgZGF0YXNldCAoc2VlIHtAbGluayBpbnN0YWxsU2NhbGVCYXJ9KS4gVGhlIHJlZ2lvbiB0b29scyB3b3JrIGluIFNDUkVFTiBzcGFjZSB0aHJvdWdoXG4gKiB0aGUgdG9vbCBicmlkZ2UncyAzRCBpbnRlcmFjdGlvbiDigJQgYSBsYXNzbyBzZWxlY3RzIHRoZSBjZWxscyB1bmRlciBpdCwgYW5kIGFuIG9yYml0IGNsZWFycyB0aGVcbiAqIHNoYXBlIHdoaWxlIGtlZXBpbmcgdGhlIHNlbGVjdGlvbi4gVGhlIGZpcnN0IDNEIGxheWVyIGFkZGVkIGZyYW1lcyB0aGUgY2FtZXJhIChgZml0M2Q6ICdvbmNlJ2ApLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDNkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUge1xuICAvKiogVGhlIDNEIHBvaW50IGNsb3VkLiBPbmUgbGF5ZXI6IHNlbGVjdGlvbiBpcyBhIHBlci1wb2ludCBhbHBoYSBvbiBpdCwgbm90IGEgc2Vjb25kLiAqL1xuICBwcml2YXRlIHBvaW50czogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIEludGVybGVhdmVkIHgseSx6LCBjYWNoZWQgc28gYSBjb2xvdXIgY2hhbmdlIGRvZXMgbm90IHJlLXdhbGsgMy43TSBvYnNlcnZhdGlvbnMuICovXG4gIHByaXZhdGUgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIElkZW50aXR5IG9mIHRoZSBzY2FsYXJzIGN1cnJlbnRseSB1cGxvYWRlZCDigJQgc2VlIHtAbGluayByZWJ1aWxkfS4gKi9cbiAgcHJpdmF0ZSBzY2FsYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogT2JzZXJ2YXRpb24gaW5kaWNlcyB0aGUgY2FjaGVkIHBvc2l0aW9ucyBiZWxvbmcgdG8sIGluIHRoZSBzYW1lIG9yZGVyOyBudWxsIHdoZW4gZXZlcnlcbiAgICogIG9ic2VydmF0aW9uIGlzIGRyYXduLiBXaXRob3V0IGl0IGEgcHJvamVjdGlvbiBidWlsdCBmcm9tIHRoZSBwb3NpdGlvbnMgaXMgaW5kZXhlZCBieSBEUkFXTlxuICAgKiAgb3JkZXIgYW5kIHNpbGVudGx5IGF0dHJpYnV0ZXMgZWFjaCBwb2ludCB0byB0aGUgd3Jvbmcgb2JzZXJ2YXRpb24gYXMgc29vbiBhcyBhIHNlY3Rpb24gaXNcbiAgICogIGlzb2xhdGVkLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFuYXRvbWljYWwgdm9sdW1lIHRoZSBjbG91ZCBzaXRzIGluc2lkZSwgd2hlbiB0aGUgZGF0YXNldCBoYXMgb25lLiAqL1xuICBwcml2YXRlIHZvbHVtZTogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2b2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGFsb25nc2lkZSB0aGUgY2xvdWQsIGFuZCB3aGF0IHRoZXkgd2VyZVxuICAgKiAgYnVpbHQgZnJvbSDigJQgcmFzdGVyaXNpbmcgaXMgc2Vjb25kcyBvZiB3b3JrLCBzbyBpdCBtdXN0IG5vdCByZXBlYXQgZm9yIGFcbiAgICogIGNoYW5nZSB0aGF0IGNhbm5vdCBhZmZlY3QgdGhlIGZpZWxkLiAqL1xuICBwcml2YXRlIGRlbnNpdHlMYXllcnM6IFZvbHVtZUxheWVyW10gPSBbXTtcbiAgcHJpdmF0ZSBkZW5zaXR5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBnZW5lIG1hcCdzIHZvbHVtZSBsYXllciBhbmQgdGhlIGlucHV0cyBpdCB3YXMgY29sb3VyZWQgZm9yIChpdHMgZmllbGQgaXMgY2FjaGVkIGluXG4gICAqICB0aGUgc2Vzc2lvbiwgb24gYSBjbG9jayBvZiBpdHMgb3duKS4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwTGF5ZXI6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPZmZzZXQgYXBwbGllZCB0byBvYnNlcnZhdGlvbiBjb29yZGluYXRlcyB0byBzaXQgdGhlbSBpbiB0aGUgdm9sdW1lJ3MgYm94LiAqL1xuICBwcml2YXRlIG9yaWdpbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDBdO1xuICAvKipcbiAgICogbmFwYXJpLWpzJ3MgZGVwdGgtYXdhcmUgcGljayBvdmVyIHRoZSBjbG91ZCwgYW5kIHRoZSBwcm9qZWN0aW9uIHRoZSBST0kgc2VsZWN0aW9uIHJlYWRzLiBJdFxuICAgKiBvd25zIHRoZSBjYWNoaW5nIHBvbGljeTogcmUtcHJvamVjdCBsYXppbHksIG9uIHRoZSBmaXJzdCBwaWNrIGFmdGVyIHRoZSBjYW1lcmEsIHRoZSBjYW52YXMgb3JcbiAgICogdGhlIGNsb3VkJ3MgZGF0YSBtb3ZlZCAobmV2ZXIgb24gdGhlIGNhbWVyYSBldmVudCwgc28gYW4gb3JiaXQgZHJhZyBwYXlzIG5vdGhpbmcpLCBpbnRvXG4gICAqIHJldXNlZCBidWZmZXJzLCB3aXRoIGEgc2NyZWVuIGluZGV4IG9uY2UgdGhlIGNsb3VkIGlzIGxhcmdlIGVub3VnaC5cbiAgICovXG4gIHByaXZhdGUgcGlja2VyOiBQb2ludFBpY2tlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYWxlQmFyOiBTY2FsZUJhck92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIERhdGFzZXQgdGhlIHNjYWxlIGJhciB3YXMgYnVpbHQgZm9yLiAqL1xuICBwcml2YXRlIHNjYWxlQmFyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBkZW5zaXR5IHJhc3RlcmlzYXRpb24gYW5kIHRoZSAzRCBnZW5lLW1hcCBlc3RpbWF0ZSBpbiBmbGlnaHQgKG9mZiB0aGUgbWFpbiB0aHJlYWRcbiAgICogIHBhc3QgdGhlIHdvcmtlciB0aHJlc2hvbGQsIFNQQVRJQUwtMTkpOiBhIG5ldyBrZXkgc3VwZXJzZWRlcyDigJQgYW5kIGFib3J0cyDigJQgdGhlIHByZXZpb3VzXG4gICAqICBvbmU7IGEgcmVidWlsZCB0aGF0IGxlYXZlcyB0aGUga2V5IGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbnNpdHlMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBnZW5lTWFwTG9hZHMgPSBuZXcgU3VwZXJzZWRlKCk7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyAoYW4gYXRsYXMncyBzdHJ1Y3R1cmVzLCBpbXBvcnRlZCBvbnRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgaW1hZ2VcbiAgICogc3RhY2spLCBkcmF3biBieSB0aGUgc2FtZSB7QGxpbmsgVm9sdW1lUmVnaW9uTWVzaGVzfSBhcyB0aGUgVm9sdW1lIHZpZXcncywgc28gYSBzdHJ1Y3R1cmUgaXMgdGhlXG4gICAqIHNhbWUgc3VyZmFjZSBpbiBib3RoLiBQbGFjZWQgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBib3gsIG9uY2UgaXQgaXMgdGhlcmUgYW5kIHRoZSBpbWFnZSB0aGVcbiAgICogcmVnaW9ucyB3ZXJlIGRyYXduIG9uIGlzIHRoYXQgdm9sdW1lJ3Mgc3RhY2sgKHNlZSB7QGxpbmsgcGxhY2VSZWdpb25NZXNoZXN9KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uTWVzaGVzOiBWb2x1bWVSZWdpb25NZXNoZXM7XG4gIC8qKiBXaGV0aGVyIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGxldHMgZXZlcnkgcmVnaW9uIHN1cmZhY2UgdGhyb3VnaCAoc2VlIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zVGhyb3VnaCA9IGZhbHNlO1xuICAvKiogVGhlIHN0b3JlJ3MgaW52ZXJ0IHNldHRpbmcsIHdoaWNoIHRoZSBkZW5zaXR5IHZvbHVtZXMgZm9sbG93IChubyBvdGhlciBzdWJzY3JpcHRpb24gb2ZcbiAgICogIHRoaXMgc2NlbmUgY2FycmllcyBpdCkuICovXG4gIHByaXZhdGUgaW52ZXJ0U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQHBhcmFtIGluZm8gdGhlIGltYWdlIHBsb3R0ZWQgd2l0aCB0aGUgY2xvdWQ6IHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgc3RhY2sgKHRoZSAyRCB2aWV3J3NcbiAgICogICAgICAgIGltYWdlLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGEgdm9sdW1lLCB3aGljaCB0aGUgcmVnaW9ucyBhcmUgb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGN0eDogU2NlbmVDb250ZXh0LFxuICAgIHNlc3Npb246IFNwYXRpYWxTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5mbz86IElJbWFnZUluZm8sXG4gICkge1xuICAgIHN1cGVyKGN0eCwgc2Vzc2lvbiwgdHJ1ZSk7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMgPSBuZXcgVm9sdW1lUmVnaW9uTWVzaGVzKGN0eC52aWV3ZXIpO1xuICB9XG5cbiAgLyoqIFNob3cgdGhlc2UgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB3aXRoIHRoZSBjbG91ZCAocmVwbGFjaW5nIHRoZSBvbmVzIHNob3duKS4gKi9cbiAgc2V0UmVnaW9uTWVzaGVzKG1lc2hlczogcmVhZG9ubHkgUmVnaW9uTWVzaDNEW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXQobWVzaGVzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZ2hsaWdodChrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZ2hsaWdodChrZXlzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZGRlbihrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZGRlbihrZXlzKTtcbiAgfVxuXG4gIC8qKiBBcyB0aGUgVm9sdW1lIHZpZXc6IHRoZSByZWZlcmVuY2Ugdm9sdW1lIGhpZGVzIHRoZSBzdXJmYWNlcyBiZWhpbmQgd2hhdCBpdCBzaG93cywgb3Igbm9uZS4gKi9cbiAgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uc1Rocm91Z2ggPSB0aHJvdWdoO1xuICAgIGlmICh0aGlzLnZvbHVtZSkgdGhpcy52b2x1bWUuYmxlbmRpbmcgPSB0aHJvdWdoID8gJ3RyYW5zbHVjZW50X25vX2RlcHRoJyA6ICd0cmFuc2x1Y2VudCc7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGFjZSB0aGUgcmVnaW9uIHN1cmZhY2VzIGluIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgYm94LCBhcyB0aGUgVm9sdW1lIHZpZXcgcGxhY2VzIHRoZW0gaW4gaXRzXG4gICAqIG93bjogaW1hZ2UgcGl4ZWwgKHgsIHkpIGlzIHZveGVsICh4LCB5KSwgc2xpY2UgayBpcyB2b3hlbCBwbGFuZSBrLCBhbmQgdGhlIGJveCBpcyB0aGUgdm9sdW1lJ3NcbiAgICogdm94ZWxzIHRpbWVzIGl0cyB2b3hlbCBzaXplLCBjZW50cmVkIG9uIHRoZSBvcmlnaW4gYXMgbmFwYXJpIGNlbnRyZXMgdGhlIHZvbHVtZSAoYW5kIHRoZSBjbG91ZFxuICAgKiBpcyBvZmZzZXQgdG8gc2l0IGluIGl0KS4gT25seSB3aGVuIHRoZSBwbG90dGVkIGltYWdlIElTIHRoYXQgdm9sdW1lJ3Mgc3RhY2s6IHJlZ2lvbnMgZHJhd24gb25cbiAgICogYW5vdGhlciBpbWFnZSAoYSB0aXNzdWUgaW1hZ2UpIGhhdmUgbm8gcGxhY2UgaW4gaXQsIGFuZCBhcmUgbm90IHNob3duIC0gbm9yIGFyZSBzdXJmYWNlc1xuICAgKiBwbGFjZWQgaW4gYSB2b2x1bWUgdGhpcyBvbmUgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIHBsYWNlUmVnaW9uTWVzaGVzKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0KTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudm9sdW1lO1xuICAgIGlmICghbWV0YSB8fCAhdGhpcy5pc1ZvbHVtZVN0YWNrKG1ldGEpKSB7XG4gICAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFt2eCwgdnksIHZ6XSA9IG1ldGEudm94ZWxTaXplO1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEZyYW1lKHtcbiAgICAgIHNpemU6IFttZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aF0sXG4gICAgICB3b3JsZDogW21ldGEud2lkdGggKiB2eCwgbWV0YS5oZWlnaHQgKiB2eSwgbWV0YS5kZXB0aCAqIHZ6XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbWFnZSBweCBwZXIgdm94ZWwgb2YgdGhlIHZvbHVtZSB0aGUgc3VyZmFjZXMgc2l0IGluOiAxLCB0aGUgcmVmZXJlbmNlIHZvbHVtZSBiZWluZyB0aGUgc3RhY2snc1xuICAgKiBvd24gdm94ZWxzLCBhcyB0aGUgVm9sdW1lIHZpZXcncyBpcyBhdCBmdWxsIHJlc29sdXRpb24sIHNvIGJvdGggcmVjb25zdHJ1Y3QgYSBjbGFzcyBhbGlrZSAoYW5kXG4gICAqIHNoYXJlIGl0cyBjYWNoZWQgc3VyZmFjZSkuIE51bGwgd2hpbGUgdGhlcmUgaXMgbm8gdm9sdW1lIHN0YWNrIHRvIHBsYWNlIHRoZW0gaW4uXG4gICAqL1xuICB2b3hlbFN0ZXAoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuc2Vzc2lvbi5sYXRlc3Q/LlswXT8udm9sdW1lO1xuICAgIHJldHVybiB0aGlzLnZvbHVtZSAmJiBtZXRhICYmIHRoaXMuaXNWb2x1bWVTdGFjayhtZXRhKSA/IDEgOiBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHBsb3R0ZWQgaW1hZ2UgaXMgdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBzdGFjazogaXRzIHNpemUgYW5kIHNsaWNlIGNvdW50LiAqL1xuICBwcml2YXRlIGlzVm9sdW1lU3RhY2sobWV0YTogTm9uTnVsbGFibGU8U3BhdGlhbERhdGFzZXRbJ3ZvbHVtZSddPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmluZm87XG4gICAgY29uc3QgW3csIGhdID0gaW5mbz8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgcmV0dXJuICEhaW5mbz8uaXNTdGFjayAmJiB3ID09PSBtZXRhLndpZHRoICYmIGggPT09IG1ldGEuaGVpZ2h0ICYmIChpbmZvLnVybHM/Lmxlbmd0aCA/PyAwKSA9PT0gbWV0YS5kZXB0aDtcbiAgfVxuXG4gIGFzeW5jIG1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24sIHNvIHRoZSBmaXJzdCBidWlsZCBhbHJlYWR5IHJlYWRzIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgIHRoaXMuaW52ZXJ0U3ViID0gdGhpcy5jdHguZGlzcGxheS53YXRjaEludmVydCgoaW52ZXJ0KSA9PiB7XG4gICAgICAvLyBBIGxpdmUgc2V0dGVyOiB0aGUgdm9sdW1lcyByZXN0eWxlLCBub3RoaW5nIGlzIHJhc3RlcmlzZWQgYWdhaW4uXG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuZGVuc2l0eUxheWVycykgbGF5ZXIuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9KTtcbiAgICB0aGlzLmN0eC50b29scy5pbnN0YWxsM2RJbnRlcmFjdGlvbih0aGlzLmN0eC52aWV3ZXIsIHRoaXMuY3R4Lmhvc3QpO1xuICAgIHRoaXMuaG92ZXIuaW5zdGFsbCh0aGlzLmN0eC5ob3N0KTtcbiAgICB0aGlzLnN1YnNjcmliZVNwYXRpYWwoKTtcbiAgfVxuXG4gIC8qKiBUaGUgb2JzZXJ2YXRpb25zJyBvd24geiBpcyBvbiBzY3JlZW46IHRoZXJlIGlzIG5vIHBsYW5lIHRvIHN0ZXAuICovXG4gIHNldFooKTogdm9pZCB7XG4gICAgLyogbm90aGluZyB0byBzdGVwICovXG4gIH1cblxuICAvKiogQSBjbG91ZCBoYXMgbm8gaW50ZW5zaXR5IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGhpc3RvZ3JhbSBwYW5lLiAqL1xuICBoaXN0b2dyYW0oKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IG9ic2VydmF0aW9uJ3MgcG9zaXRpb24gb24gdGhlIGNhbnZhcyB1bmRlciB0aGUgY3VycmVudCAzRCBjYW1lcmEgKGZvciB0aGUgUk9JXG4gICAqIHNlbGVjdGlvbiksIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24gd2l0aCBOYU4gZm9yIGFueXRoaW5nIG5vdCBkcmF3bi4gTnVsbCBiZWZvcmUgdGhlIGNsb3VkXG4gICAqIGlzIGJ1aWx0LlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpcyB0aGUgcGlja2VyJ3MgKHNlZSB7QGxpbmsgcGlja2VyfSk7IHdoYXQgaXMgbGVmdCBpcyB0aGUgcGFydCB0aGF0IGlzXG4gICAqIGdlbnVpbmVseSB0aGlzIGFkYXB0ZXInczogU0NBVFRFUklORyB0aGUgZHJhd24gc3Vic2V0IGJhY2sgaW50byBvYnNlcnZhdGlvbiBvcmRlci4gVGhlIGNsb3VkXG4gICAqIGhvbGRzIG9ubHkgdGhlIHBvaW50cyBvZiB0aGUgZGlzcGxheWVkIHNlY3Rpb24sIGluIGl0cyBvd24gcGFja2luZzsgZXZlcnkgY29uc3VtZXIgaW5kZXhlcyBieVxuICAgKiBvYnNlcnZhdGlvbi4gTmFOIHN0YW5kcyBmb3IgXCJub3Qgb24gc2NyZWVuXCIsIHdoaWNoIGlzIGFsc28gdGhlIHJpZ2h0IGFuc3dlciBmb3IgYW5cbiAgICogb2JzZXJ2YXRpb24gd2hvc2Ugc2VjdGlvbiBpcyBoaWRkZW4uXG4gICAqL1xuICBzY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHByb2plY3RlZCA9IHRoaXMucGlja2VyPy5wcm9qZWN0ZWQoKTtcbiAgICBpZiAoIXByb2plY3RlZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZHJhd24gPSB0aGlzLmRyYXduO1xuICAgIGNvbnN0IHsgc2NyZWVuIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gZHJhd24gPyBkcmF3bltrXSA6IGs7XG4gICAgICBpZiAoaSA+PSBvYnMuY291bnQpIGNvbnRpbnVlO1xuICAgICAgb3V0W2kgKiAyXSA9IHNjcmVlbltrICogMl07XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IHNjcmVlbltrICogMiArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhcigpO1xuICAgIHRoaXMuZGlzcG9zZVNwYXRpYWwoKTtcbiAgICB0aGlzLmludmVydFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmludmVydFN1YiA9IG51bGw7XG4gICAgdGhpcy5kZW5zaXR5TG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5nZW5lTWFwTG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIC8vIERyb3AgdGhlIGNhY2hlZCBpbnRlcmxlYXZlZCBjb29yZGluYXRlcyB0b286IGhvbGRpbmcgMy43TSB4IDMgZmxvYXRzIGFmdGVyXG4gICAgLy8gYSB0ZWFyZG93biBpcyB+NDVNQiBvZiByZXRhaW5lZCBoZWFwIGZvciBhIHNjZW5lIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5zZXRQaWNrZXIobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9ic2VydmF0aW9uIHVuZGVyIGEgY2xpZW50IHBvc2l0aW9uOiB0aGUgRlJPTlQtbW9zdCBtYXJrZXIgd2l0aGluIGBzbGFja1B4YCBvZiB0aGVcbiAgICogcG9pbnRlciAodGllcyBieSBkaXN0YW5jZSksIGFzIG5hcGFyaS1qcydzIHtAbGluayBQb2ludFBpY2tlcn0gcGlja3MgaXQuIFRoYXQgbWF0dGVycyBtb3JlXG4gICAqIHRoYW4gaXQgc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhIGNlbGwgdGhhdFxuICAgKiBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLiBUaGUgcGlja2VyIGFsc28gdGFrZXMgZWFjaCBwb2ludCdzIHJhZGl1cyBmcm9tIHRoZSBsYXllcidzXG4gICAqIHBlci1wb2ludCBgc2l6ZXNgLCBzbyBhIHNlbGVjdGVkIG1hcmtlciwgZHJhd24gbGFyZ2VyLCBpcyBhcyBsYXJnZSB0byB0aGUgcG9pbnRlci5cbiAgICovXG4gIHByb3RlY3RlZCBwaWNrT2JzZXJ2YXRpb24oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIsIHNsYWNrUHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGlja2VyID0gdGhpcy5waWNrZXI7XG4gICAgaWYgKCFwaWNrZXIpIHJldHVybiAtMTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jdHguY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGsgPSBwaWNrZXIucGljayhjbGllbnRYIC0gcmVjdC5sZWZ0LCBjbGllbnRZIC0gcmVjdC50b3AsIHNsYWNrUHgpO1xuICAgIGlmIChrIDwgMCkgcmV0dXJuIC0xO1xuICAgIHJldHVybiB0aGlzLmRyYXduID8gdGhpcy5kcmF3bltrXSA6IGs7XG4gIH1cblxuICAvKiogUmVwbGFjZSB0aGUgY2xvdWQncyBwaWNrZXIgKG51bGw6IG5vIGNsb3VkKSwgcmVsZWFzaW5nIHRoZSBvbGQgb25lJ3MgY2FtZXJhIGxpc3RlbmVyLiAqL1xuICBwcml2YXRlIHNldFBpY2tlcihwb2ludHM6IFBvaW50czNETGF5ZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZXI/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBpY2tlciA9IHBvaW50c1xuICAgICAgPyBuZXcgUG9pbnRQaWNrZXIodGhpcy5jdHgudmlld2VyLCBwb2ludHMsIHtcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYSBwaWNrIGhlcmUgY2FuIGNsYWltOiB0aGUgaG92ZXIgc2xhY2sgdGltZXMgdGhlIHNjYWxlIGEgU0VMRUNURURcbiAgICAgICAgICAvLyBtYXJrZXIgaXMgZHJhd24gYXQuIEl0IGRlY2lkZXMgd2hldGhlciBhIG1hcmtlciBzdHJhZGRsaW5nIHRoZSBjYW52YXMgZWRnZSBpcyBmb3VuZC5cbiAgICAgICAgICBtYXhSZWFjaDogSE9WRVJfUkFESVVTX1BYICogU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIGJhciBmb3IgdGhlIGNsb3VkLCBtZWFzdXJlZCBhdCB0aGUgT1JCSVQgUElWT1QuXG4gICAqXG4gICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGhhcyBubyBzaW5nbGUgc2NhbGUg4oCUIHRoaW5ncyBmYXJ0aGVyIGF3YXkgYXJlIHNtYWxsZXIg4oCUIHNvIGEgYmFyIGNhblxuICAgKiBvbmx5IGJlIHRydWUgYXQgb25lIGRlcHRoLiBUaGUgcGl2b3QgaXMgdGhlIGhvbmVzdCBjaG9pY2U6IGl0IGlzIHdoYXQgdGhlIGNhbWVyYSBpcyBmcmFtaW5nLFxuICAgKiB3aGF0IGEgem9vbSBtb3ZlcyB0b3dhcmRzLCBhbmQgd2hlcmUgdGhlIGV5ZSBpcyBhbnl3YXkuIG5hcGFyaSdzIG93biAzRCBzY2FsZSBiYXIgd29ya3MgdGhlXG4gICAqIHNhbWUgd2F5LlxuICAgKlxuICAgKiBuYXBhcmktanMncyBgU2NhbGVCYXJPdmVybGF5YCBpbiBgJzNkJ2AgbW9kZSBtZWFzdXJlcyB0aGVyZTogQ1NTIHB4IHBlciB3b3JsZCB1bml0IGlzIHRoZVxuICAgKiByZWNpcHJvY2FsIG9mIGBDYW1lcmEzRC53b3JsZFBlclBpeGVsYCDigJQgdGhlIHNjYWxlIGBDYW1lcmEzRC5wYW5gIHVzZXMgdG8gdHJhY2sgdGhlIGN1cnNvci5cbiAgICogVGhlIGJhciB0aGVuIGNvbnZlcnRzIHRocm91Z2ggYG1pY3JvbnNQZXJVbml0YCwgYW5kIGRyYXdzIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIGRhdGFzZXQgZG9lc1xuICAgKiBub3QgZGVjbGFyZSBvbmUsIGJlY2F1c2UgYSBiYXIgbGFiZWxsZWQgaW4gbWljcm9ucyBvdmVyIHVua25vd24gdW5pdHMgd291bGQgcmVhZCBhcyBhXG4gICAqIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1pY3JvbnNQZXJVbml0ID0gZGF0YXNldD8ubWljcm9uc1BlclVuaXQ7XG4gICAgaWYgKCFtaWNyb25zUGVyVW5pdCB8fCBtaWNyb25zUGVyVW5pdCA8PSAwKSByZXR1cm47XG4gICAgdGhpcy5zY2FsZUJhciA9IG5ldyBTY2FsZUJhck92ZXJsYXkodGhpcy5jdHguaG9zdCwgdGhpcy5jdHgudmlld2VyLCB7XG4gICAgICB1bml0UGVyV29ybGQ6IG1pY3JvbnNQZXJVbml0LFxuICAgICAgbW9kZTogJzNkJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDNEIHBvaW50IGNsb3VkIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2FsYXIgZW5jb2RpbmcgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZSwgZm9yIHRoZSBzYW1lIHJlYXNvblxuICAgIC8vIHRoZSAyRCBwYXRoIGRvZXM6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZSBzdXBlcnNlZGVkLCBhbmQgZHJvcHBpbmcgdGhlXG4gICAgLy8gbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZ2VuZVNob3duOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGRhdGFzZXQpIHtcbiAgICAgIGNvbnN0IGVuZExvYWRpbmcgPSB0aGlzLmN0eC5iYWRnZS5iZWdpbignT2JzZXJ2YXRpb25zJyk7XG4gICAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGljaCBvYnNlcnZhdGlvbnMgdGhlIGdlbmUgZmlsdGVyIGtlZXBzLCBzZXR0bGVkIGFwYXJ0IGZyb20gdGhlaXIgY29sb3VyczogYSBjb2xvdXJcbiAgICAgICAgLy8gY2FuIGZhbGwgYmFjayB0byBhIGZsYXQgb25lLCB0aGUgZmlsdGVyIGNhbm5vdC4gRHJhd24gd2l0aG91dCBpdCwgZXZlcnkgb2JzZXJ2YXRpb25cbiAgICAgICAgLy8gd291bGQgc2hvdyBhcyBpZiBpdCBleHByZXNzZWQgdGhlIHBpY2tlZCBnZW5lcy4gU28gYSBmYWlsZWQgcmVhZCBrZWVwcyB0aGUgY2xvdWQgYXMgaXRcbiAgICAgICAgLy8gd2FzIGRyYXduLCBhbmQgdGhlIHBhbmVsIHNheXMgdGhlIGZpbHRlciBjb3VsZCBub3QgYmUgYXBwbGllZC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBnZW5lU2hvd24gPSBwb3J0XG4gICAgICAgICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZU1hc2sodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbbmFwYXJpLWpzXSBzcGF0aWFsIDNEIGdlbmUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkIOKAlCBrZWVwaW5nIHRoZSBjbG91ZCBhcyBkcmF3bicsXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGFzaygpKSB0aGlzLnNlc3Npb24ucmVwb3J0R2VuZUZpbHRlcih0cnVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5jID0gYXdhaXQgdGhpcy5zY2FsYXJFbmNvZGluZyh2aWV3LCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5kTG9hZGluZygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKGZhbHNlKTtcblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAvLyBObyB6IG1lYW5zIG5vdGhpbmcgdG8gZHJhdyBpbiAzRC4gVGhlIHBsb3QgdHlwZSBpcyBnYXRlZCBvbiBgcmVxdWlyZXNTcGF0aWFsM2RgXG4gICAgLy8gc28gdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUksIGJ1dCBhIGhvc3QgY2FuIHNldCB0aGUgdHlwZSBkaXJlY3RseS5cbiAgICBpZiAoIWRhdGFzZXQgfHwgIW9icyB8fCBvYnMuY291bnQgPT09IDAgfHwgIW9icy56KSB7XG4gICAgICB0aGlzLnJlbW92ZUxheWVycyh2aWV3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFuYXRvbXkgZmlyc3Q6IG9uIGEgc2NlbmUncyBGSVJTVCBsYXllciBuYXBhcmkgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmEsIGFuZFxuICAgIC8vIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIHRoZSBmcmFtaW5nIHdlIHdhbnQg4oCUIHRoZSBicmFpbiwgbm90IHRoZSBvdXRlcm1vc3RcbiAgICAvLyBzdHJheSBzZWdtZW50YXRpb24uIEV2ZXJ5IGxhdGVyIGFkZCBrZWVwcyB0aGUgcG9zZSBpbnN0ZWFkIChuYXBhcmktanMgYGZpdDNkOiAnb25jZSdgKS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMsIHdoaWNoIGNhbiBzZXQgdGhlIGNlbnRyaW5nIG9mZnNldCB3aGVuXG4gICAgLy8gdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHZvbHVtZSDigJQgc28gYmVmb3JlIGFueSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tIGl0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGVuc2l0eVZvbHVtZXModmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgZ2VuZSBtYXAsIHdoaWNoIHNoYXJlcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGxhdHRpY2Ug4oCUIHNvIGl0IGdvZXNcbiAgICAvLyBhZnRlciBhbnl0aGluZyB0aGF0IGNhbiBzdGlsbCBtb3ZlIHRoZSBjZW50cmluZyBvZmZzZXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIC8vIFNjYWxlIGRlcGVuZHMgb24gdGhlIGRhdGFzZXQncyBkZWNsYXJlZCB1bml0LCBzbyBpdCB3YWl0cyBmb3IgdGhlIGRhdGFzZXRcbiAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBzZXQgdXAgYXQgbW91bnQgdGltZS5cbiAgICBpZiAoZGF0YXNldC5pZCAhPT0gdGhpcy5zY2FsZUJhcktleSkge1xuICAgICAgdGhpcy5zY2FsZUJhcktleSA9IGRhdGFzZXQuaWQ7XG4gICAgICB0aGlzLmluc3RhbGxTY2FsZUJhcihkYXRhc2V0KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVmZXJlbmNlIHZvbHVtZSBpcyBoaWRkZW4sIG5vdCByZW1vdmVkOiBpdCBhbHNvIGZpeGVzIHRoZSBjZW50cmluZ1xuICAgIC8vIG9mZnNldCBldmVyeSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tLCBhbmQgcmUtZmV0Y2hpbmcgYSAxMDAgTUIgdGVtcGxhdGVcbiAgICAvLyB0byB1bi1oaWRlIGl0IHdvdWxkIG1ha2UgYSBjaGVja2JveCBmZWVsIGxpa2UgYSBsb2FkLlxuICAgIGlmICh0aGlzLnZvbHVtZSkge1xuICAgICAgdGhpcy52b2x1bWUudmlzaWJsZSA9IHZpZXcuc2hvd1ZvbHVtZTtcbiAgICAgIHRoaXMudm9sdW1lLm9wYWNpdHkgPSB2aWV3LnZvbHVtZU9wYWNpdHk7XG4gICAgfVxuICAgIHRoaXMuZHJhd0Nsb3VkKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBlbmMsIGdlbmVTaG93bik7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcG9pbnQgY2xvdWQ6IGEgbmV3IGxheWVyIGZvciBuZXcgZ2VvbWV0cnkgKGEgZGF0YXNldCBvciBhIHNlY3Rpb24pLCB0aGUgY29sb3VyXG4gICAqIHNvdXJjZSBzd2FwcGVkIGluIHBsYWNlIG90aGVyd2lzZTsgdGhlbiB0aGUgc2VsZWN0aW9uIGFuZCB0aGUgdmlzaWJpbGl0eS5cbiAgICovXG4gIHByaXZhdGUgZHJhd0Nsb3VkKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCxcbiAgICBnZW5lU2hvd246IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgICBjb25zdCBzaXplID0gU1BBVElBTF8zRF9CQVNFX1NJWkUgKiBzY2FsZTtcbiAgICAvLyBBIGNhdGVnb3JpY2FsIGNvbG91cmluZyBpcyBwZXItcG9pbnQgUkdCQSwgd2hpY2ggd2lucyBvdmVyIHRoZSBzY2FsYXJzOyB0aGUgZmxhdCBjb2xvcm1hcFxuICAgIC8vIGFuZCB6ZXJvIHNjYWxhcnMgc3RhbmQgYmVoaW5kIGl0LCBhcyB0aGV5IGRvIGZvciBcIm5vdGhpbmcgdG8gY29sb3VyIGJ5XCIuXG4gICAgY29uc3Qgc2NhbGFyID0gZW5jPy5raW5kID09PSAnc2NhbGFycycgPyBlbmMgOiBudWxsO1xuICAgIGNvbnN0IGNvbG9ycyA9IGVuYz8ua2luZCA9PT0gJ2NvbG9ycycgPyBlbmMuY29sb3JzIDogbnVsbDtcbiAgICBjb25zdCBzY2FsYXJzID0gc2NhbGFyPy52YWx1ZXMgPz8gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpO1xuICAgIGNvbnN0IGNvbG9ybWFwID0gc2NhbGFyPy5jb2xvcm1hcCA/PyBzcGF0aWFsRmxhdENvbG9ybWFwKCk7XG4gICAgY29uc3QgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl0gPSBzY2FsYXI/LmNvbnRyYXN0TGltaXRzID8/IFswLCAxXTtcbiAgICBjb25zdCB7IHNob3duLCBrZXksIHNjYWxhcktleSB9ID0gY2xvdWRTdWJzZXQoZGF0YXNldCwgdmlldywgZ2VuZVNob3duKTtcblxuICAgIGlmIChrZXkgIT09IHRoaXMubGF5ZXJLZXkpIHtcbiAgICAgIC8vIE5ldyBnZW9tZXRyeTogaW50ZXJsZWF2ZSB4LHkseiAodGhlIGxheWVyJ3MgZG9jdW1lbnRlZCBsYXlvdXQsIHgtZmFzdGVzdClcbiAgICAgIC8vIGFuZCBjYWNoZSBpdCwgc28gbGF0ZXIgY29sb3VyIGNoYW5nZXMgcmVidWlsZCB0aGUgbGF5ZXIgd2l0aG91dCB3YWxraW5nXG4gICAgICAvLyB0aGUgb2JzZXJ2YXRpb25zIGFnYWluLlxuICAgICAgdGhpcy5wb3NpdGlvbnMgPSB0aGlzLmNsb3VkUG9zaXRpb25zKG9icywgc2hvd24pO1xuICAgICAgdGhpcy5kcmF3biA9IHNob3duO1xuICAgIH1cblxuICAgIC8vIFRoZSBzY2FsYXJzIGhhdmUgdG8gZm9sbG93IHRoZSBnZW9tZXRyeTogYSBwZXItb2JzZXJ2YXRpb24gdmVjdG9yIGFnYWluc3Qgb25lXG4gICAgLy8gc2VjdGlvbidzIHBvc2l0aW9ucyB3b3VsZCBjb2xvdXIgZWFjaCBjZWxsIGJ5IGEgc3RyYW5nZXIncyB2YWx1ZS4gU28gZG8gdGhlIGNvbG91cnMuXG4gICAgY29uc3QgdmFsdWVzRm9yID0gKCkgPT4gKHNob3duID8gRmxvYXQzMkFycmF5LmZyb20oc2hvd24sIChpKSA9PiBzY2FsYXJzW2ldKSA6IHNjYWxhcnMpO1xuICAgIGNvbnN0IGNvbG9yc0ZvciA9ICgpID0+IChjb2xvcnMgPyAoZ2F0aGVyQ29sb3JzKGNvbG9ycywgc2hvd24gPz8gdW5kZWZpbmVkKSBhcyBGbG9hdDMyQXJyYXkpIDogbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMucG9pbnRzIHx8IGtleSAhPT0gdGhpcy5sYXllcktleSkge1xuICAgICAgLy8gTmV3IEdFT01FVFJZIOKAlCBhIGRpZmZlcmVudCBkYXRhc2V0LCBvciBhIGRpZmZlcmVudCBzZWN0aW9uIOKAlCBzbyBhIG5ldyBsYXllci5cbiAgICAgIGlmICh0aGlzLnBvaW50cykgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5wb2ludHMpO1xuICAgICAgdGhpcy5sYXllcktleSA9IGtleTtcbiAgICAgIHRoaXMuc2NhbGFyS2V5ID0gc2NhbGFyS2V5O1xuICAgICAgdGhpcy5wb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzM0QodGhpcy5wb3NpdGlvbnMhLCB2YWx1ZXNGb3IoKSwge1xuICAgICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgICAgY29sb3JtYXAsXG4gICAgICAgIGNvbnRyYXN0TGltaXRzLFxuICAgICAgICBzaXplLFxuICAgICAgICBjb2xvcnM6IGNvbG9yc0ZvcigpID8/IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRQaWNrZXIodGhpcy5wb2ludHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2NhbGFyS2V5ICE9PSB0aGlzLnNjYWxhcktleSkge1xuICAgICAgICAvLyBBIGNoYW5nZSBvZiBjb2xvdXIgU09VUkNFLCB3aGljaCB1c2VkIHRvIG1lYW4gZGlzY2FyZGluZyB0aGUgbGF5ZXIgYW5kIGJ1aWxkaW5nXG4gICAgICAgIC8vIGFub3RoZXIg4oCUIGFuZCwgYmVjYXVzZSBhZGRpbmcgYSAzRCBsYXllciByZWZyYW1lcywgYSBjYW1lcmEganVtcCB0byB1bmRvIGFzIHdlbGwuXG4gICAgICAgIC8vIG5hcGFyaS1qcyDiiaUgMC4xNCBsZXRzIHRoZSBzY2FsYXJzIGJlIHJlcGxhY2VkIGluIHBsYWNlIOKAlCB0aGUgc2V0dGVyIGJ1bXBzIHRoZVxuICAgICAgICAvLyBsYXllcidzIGRhdGFWZXJzaW9uIHNvIHRoZSB2aXN1YWwgcmUtdXBsb2FkcyDigJQgYW5kIHRoZSBwb3NpdGlvbnMgaGF2ZSBub3QgbW92ZWQsXG4gICAgICAgIC8vIHNvIHRoZXJlIGlzIG5vdGhpbmcgZm9yIHRoZSBjYW1lcmEgdG8gcmVmcmFtZS5cbiAgICAgICAgdGhpcy5zY2FsYXJLZXkgPSBzY2FsYXJLZXk7XG4gICAgICAgIHRoaXMucG9pbnRzLnZhbHVlcyA9IHZhbHVlc0ZvcigpO1xuICAgICAgICB0aGlzLnBvaW50cy5jb2xvcnMgPSBjb2xvcnNGb3IoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9pbnRzLmNvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgICB0aGlzLnBvaW50cy5jb250cmFzdExpbWl0cyA9IGNvbnRyYXN0TGltaXRzO1xuICAgICAgdGhpcy5wb2ludHMuc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvdWQgPSB0aGlzLnBvaW50cztcbiAgICBpZiAoY2xvdWQpIHtcbiAgICAgIGNsb3VkLm9wYWNpdHkgPSB2aWV3Lm9wYWNpdHk7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0aW9uKGNsb3VkLCBzZWxlY3Rpb24sIHNob3duLCBvYnMuY291bnQpO1xuICAgIH1cbiAgICAvLyBMYXN0LCBzbyBpdCBhbHNvIGNvdmVycyBhIGxheWVyIHRoaXMgcGFzcyBqdXN0IGNyZWF0ZWQuXG4gICAgaWYgKHRoaXMucG9pbnRzKSB0aGlzLnBvaW50cy52aXNpYmxlID0gdmlldy5zaG93UG9pbnRzO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogSW50ZXJsZWF2ZWQgeCx5LHogb2YgdGhlIGBzaG93bmAgb2JzZXJ2YXRpb25zIChudWxsOiBhbGwgb2YgdGhlbSksIG9mZnNldCBieSB7QGxpbmsgb3JpZ2lufS4gKi9cbiAgcHJpdmF0ZSBjbG91ZFBvc2l0aW9ucyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIHNob3duOiBVaW50MzJBcnJheSB8IG51bGwpOiBGbG9hdDMyQXJyYXkge1xuICAgIC8vIHJlYnVpbGQoKSBkcmF3cyBvbmx5IGEgZGF0YXNldCB3aG9zZSBvYnNlcnZhdGlvbnMgaGF2ZSBhIHouXG4gICAgY29uc3QgeiA9IG9icy56ITtcbiAgICBjb25zdCBbb3gsIG95LCBvel0gPSB0aGlzLm9yaWdpbjtcbiAgICBjb25zdCBjb3VudCA9IHNob3duID8gc2hvd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAzKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgIHBvc2l0aW9uc1trICogM10gPSBvYnMueFtpXSArIG94O1xuICAgICAgcG9zaXRpb25zW2sgKiAzICsgMV0gPSBvYnMueVtpXSArIG95O1xuICAgICAgcG9zaXRpb25zW2sgKiAzICsgMl0gPSB6W2ldICsgb3o7XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0aW9uIGlzIGEgUEVSLVBPSU5UIGFscGhhLCBpbiB0aGUgb25lIGxheWVyLlxuICAgKlxuICAgKiBJdCB1c2VkIHRvIGJlIGEgc2Vjb25kIGxheWVyOiB3aXRoIGEgc2luZ2xlIG9wYWNpdHkgZm9yIHRoZSB3aG9sZSBjbG91ZCwgdGhlIG9ubHkgd2F5XG4gICAqIHRvIGhpZ2hsaWdodCBhIHN1YnNldCB3YXMgdG8gZHJhdyBpdCBhZ2FpbiBvbiB0b3AgYXQgZnVsbCBvcGFjaXR5IHdoaWxlIHRoZSBwYXJlbnRcbiAgICogZHJvcHBlZCB0byB0aGUgbXV0ZWQgbGV2ZWwuIFRoYXQgc2Vjb25kIGxheWVyIGhhZCB0byBiZSBrZXB0IGluIHN0ZXAgdGhyb3VnaCBldmVyeVxuICAgKiBjb2xvcm1hcCwgd2luZG93IGFuZCBzaXplIGNoYW5nZSwgYW5kIHRoZSB0d28gdGhlbiBkZXB0aC1zb3J0ZWQgYWdhaW5zdCBlYWNoIG90aGVyIGFzXG4gICAqIHNlcGFyYXRlIGRyYXdzLiBQZXItcG9pbnQgYWxwaGFzIGFuZCBzaXplcyBnaXZlIHRoZSBzYW1lIHJlYWRpbmcg4oCUIG11dGVkIGNsb3VkLCBicmlnaHRcbiAgICogc2VsZWN0aW9uLCBzbGlnaHRseSBsYXJnZXIgc28gYSBzbWFsbCBvbmUgaXMgZmluZGFibGUgaW5zaWRlIDMuN00gcG9pbnRzIOKAlCBpbiBvbmUuXG4gICAqXG4gICAqIGBzaG93bmAgaXMgdGhlIGRyYXduIHN1YnNldCAobnVsbDogZXZlcnkgb25lIG9mIHRoZSBgdG90YWxgIG9ic2VydmF0aW9ucyksIHNvIHRoZSBhbHBoYXNcbiAgICogZm9sbG93IHRoZSBkcmF3biBvcmRlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlTZWxlY3Rpb24oXG4gICAgY2xvdWQ6IFBvaW50czNETGF5ZXIsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBzaG93bjogVWludDMyQXJyYXkgfCBudWxsLFxuICAgIHRvdGFsOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmIChzZWxlY3Rpb24uY291bnQgPT09IDAgfHwgc2VsZWN0aW9uLm1hc2subGVuZ3RoICE9PSB0b3RhbCkge1xuICAgICAgY2xvdWQuYWxwaGFzID0gbnVsbDtcbiAgICAgIGNsb3VkLnNpemVzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvd25Db3VudCA9IHNob3duID8gc2hvd24ubGVuZ3RoIDogdG90YWw7XG4gICAgY29uc3QgYWxwaGFzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICBjb25zdCBzaXplcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaG93bkNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgIGNvbnN0IHBpY2tlZCA9ICEhc2VsZWN0aW9uLm1hc2tbaV07XG4gICAgICBhbHBoYXNba10gPSBwaWNrZWQgPyAxIDogREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgc2l6ZXNba10gPSBwaWNrZWQgPyBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgOiAxO1xuICAgIH1cbiAgICBjbG91ZC5hbHBoYXMgPSBhbHBoYXM7XG4gICAgY2xvdWQuc2l6ZXMgPSBzaXplcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKiozRCBnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIG92ZXIgdGhlIHdob2xlIHNlY3Rpb25lZFxuICAgKiBzcGVjaW1lbiwgYXMgb25lIHJheW1hcmNoZWQgdm9sdW1lLlxuICAgKlxuICAgKiBUd28gdGhpbmdzIGl0IGNhbiBiZSwgYW5kIHRoZSBwYW5lbCdzIGBWb2x1bWUgcmVuZGVyaW5nYCB0b2dnbGUgcGlja3Mgd2hpY2g6XG4gICAqXG4gICAqICAtICoqc2hlZXRzKiog4oCUIGV4YWN0bHkgdGhlIHBsYW5lcyB0aGF0IHdlcmUgaW1hZ2VkLCBlYWNoIGNhcnJ5aW5nIHRoYXRcbiAgICogICAgc2xpZGUncyBvd24gMkQgZ2VuZSBtYXAsIHdpdGggdGhlIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyBlbXB0eS4gQSBzdGFjayBvZlxuICAgKiAgICBtZWFzdXJlZCBmaWVsZHMsIGF0IHRoZWlyIHRydWUgei5cbiAgICogIC0gKip2b2x1bWUqKiDigJQgdGhlIHNhbWUgZmllbGRzIHNtb290aGVkIGFsb25nIHosIHNvIHRoZSBwbGFuZXMgYmV0d2VlbiB0aGVcbiAgICogICAgc2VjdGlvbnMgY2FycnkgYW4gaW50ZXJwb2xhdGVkIHZhbHVlLiBBbiBlc3RpbWF0ZSwgYW5kIGRyYXduIGFzIGFcbiAgICogICAgdHJhbnNsdWNlbnQgY2xvdWQgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgZGVuc2l0eSB2b2x1bWVzIGFyZS5cbiAgICpcbiAgICogT25lIGBWb2x1bWVMYXllcmAgcmF0aGVyIHRoYW4gYSB0ZXh0dXJlZCBxdWFkIHBlciBzZWN0aW9uOiBhbiBgSW1hZ2VMYXllcmBcbiAgICogcmVuZGVycyBvbmx5IGF0IGBuZGlzcGxheSA9PT0gMmAsIHNvIDUzIHNoZWV0cyBpbiB0aGUgb3JiaXQgdmlldyB3b3VsZCBuZWVkIGFcbiAgICogbmV3IGxheWVyIHR5cGUgdXBzdHJlYW0g4oCUIHdoaWxlIGEgc2NhbGFyIHZvbHVtZSB3aG9zZSB6IHNhbXBsaW5nIGFscmVhZHkgSVNcbiAgICogdGhlIHNlY3Rpb24gc3BhY2luZyBleHByZXNzZXMgdGhlIHNoZWV0cyBleGFjdGx5LCBhbmQgdGhlIHNhbWUgbGF0dGljZSB0aGVuXG4gICAqIGdpdmVzIHRoZSBpbnRlcnBvbGF0ZWQgdmVyc2lvbiBmb3IgZnJlZS5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duIGxhdHRpY2UgKGBkZW5zaXR5R3JpZGAgYXQgc3RyaWRlIDEpLFxuICAgKiBzbyB0aGUgZmllbGQgbGFuZHMgdm94ZWwtZm9yLXZveGVsIG9uIHRoZSBhbmF0b215IGFuZCBuZWVkcyBubyBvZmZzZXQg4oCUIGFcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlLCBhbmQgbmFwYXJpIGNlbnRyZXMgYm90aCBib3hlcyBvbiB0aGUgd29ybGRcbiAgICogb3JpZ2luLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVHZW5lTWFwKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2VuZSA9IHZpZXcuZ2VuZU1hcCAmJiB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdmZWF0dXJlJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLnNlc3Npb24uZ2VuZU1hcFZvbHVtZTtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgPiAwID8gdmlldy5nZW5lTWFwU21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgLy8gQSB2b2x1bWUgYnVpbHQgZnJvbSBPTkUgc2VjdGlvbiB3b3VsZCBzbWVhciB0aGF0IHNsaWRlIHRocm91Z2ggdGhlIHdob2xlXG4gICAgLy8gZGVwdGgsIHNvIHRoZSBzZWN0aW9uIHJlc3RyaWN0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgc2hlZXRzLlxuICAgIGNvbnN0IGludGVycG9sYXRlID0gISF2aWV3LmdlbmVNYXBWb2x1bWU7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc09mKG9icyk7XG4gICAgY29uc3Qgc2VjdGlvbiA9XG4gICAgICAhaW50ZXJwb2xhdGUgJiYgdmlldy5nZW5lTWFwU2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzZWN0aW9uc1tNYXRoLm1heCgwLCBNYXRoLm1pbihzZWN0aW9ucy5sZW5ndGggLSAxLCB2aWV3LmdlbmVNYXBTZWN0aW9uKSldXG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbXG4gICAgICAgICAgZGF0YXNldC5pZCxcbiAgICAgICAgICBnZW5lLFxuICAgICAgICAgIHNtb290aGluZyxcbiAgICAgICAgICBzZWN0aW9uID8/ICdhbGwnLFxuICAgICAgICAgIGludGVycG9sYXRlID8gJ3ZvbCcgOiAnc2hlZXRzJyxcbiAgICAgICAgICB0aGlzLnNlc3Npb24uc2VsZWN0aW9uUmV2KHNlbGVjdGlvbiksXG4gICAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICAgIGZpZWxkS2V5LFxuICAgICAgICAgIGNsaXAuam9pbignLCcpLFxuICAgICAgICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgICAgICAgIHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgICAgdGhpcy5jdHguZGlzcGxheS5jb250aW51b3VzQ29sb3JtYXBLZXkodmlldyksXG4gICAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwS2V5ID0ga2V5O1xuICAgIGlmICgha2V5IHx8ICFnZW5lIHx8ICFwb3J0KSB7XG4gICAgICBjYWNoZS5maWVsZCA9IG51bGw7XG4gICAgICBjYWNoZS5rZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvYXJzZW5lZCBpbi1wbGFuZSBidXQgTk9UIGFsb25nIHo6IHRoZSBzaGVldHMgbmVlZCBvbmUgcGxhbmUgcGVyIGltYWdlZFxuICAgIC8vIHNlY3Rpb24sIHdoaWxlIHRoZSBmaWVsZCB0aGV5IGNhcnJ5IGlzIHNtb290aCBieSBjb25zdHJ1Y3Rpb24gYW5kIGdhaW5zXG4gICAgLy8gbm90aGluZyBmcm9tIHRoZSB0ZW1wbGF0ZSdzIDQwIMK1bSBkZXRhaWwuIEF0IGZ1bGwgcmVzb2x1dGlvbiB0aGUgZXN0aW1hdGUgaXNcbiAgICAvLyBhIDUuN00tdm94ZWwgcGFpciBvZiBibHVycyDigJQgc2Vjb25kcyBvZiB3b3JrIGZvciBhIGNoZWNrYm94OyBhbiBlaWdodGggb2YgdGhlXG4gICAgLy8gdm94ZWxzIGlzIGFuIGVpZ2h0aCBvZiB0aGUgd29yay5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCwgR0VORV9NQVBfVk9MVU1FX1NUUklERSwgMTI4LCAxKTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcblxuICAgIGlmIChmaWVsZEtleSAhPT0gY2FjaGUua2V5KSB7XG4gICAgICBjb25zdCBsb2FkID0gdGhpcy5nZW5lTWFwTG9hZHMubmV4dCgpO1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gM0QgZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgLy8gSW4tcGxhbmUgz4MgaXMgYSBQSFlTSUNBTCBiYW5kd2lkdGgsIGFuY2hvcmVkIHRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duXG4gICAgICAvLyB2b3hlbCDigJQgdGhlIHJlc29sdXRpb24gdGhlIDJEIG1hcCBlc3RpbWF0ZXMgYXQg4oCUIHNvIGEgc2hlZXQgYW5kIHRoZSAyRFxuICAgICAgLy8gdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZCB3aGF0ZXZlciBsYXR0aWNlIHRoaXMgaXNcbiAgICAgIC8vIHJhc3RlcmlzZWQgb24uIEFsb25nIHogaXQgaXMgdGhlIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHM6IHRoZSBzbWFsbGVzdCDPg1xuICAgICAgLy8gdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIGNvbnN0IGluUGxhbmUgPSBkYXRhc2V0LnZvbHVtZT8udm94ZWxTaXplID8/IGdyaWQudm94ZWxTaXplO1xuICAgICAgbGV0IGZpZWxkOiBFeHByZXNzaW9uVm9sdW1lRmllbGQgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmllbGQgPSBhd2FpdCBjb21wdXRlRXhwcmVzc2lvblZvbHVtZUFzeW5jKFxuICAgICAgICAgIG9icyxcbiAgICAgICAgICBncmlkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNpZ21hOiBbXG4gICAgICAgICAgICAgIGluUGxhbmVbMF0gKiBHRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICAgICAgaW5QbGFuZVsxXSAqIEdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgICAgICBncmlkLnZveGVsU2l6ZVsyXSAqIDEuNSAqIHNtb290aGluZyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICBpbmRpY2VzOiBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IGluU2VsZWN0aW9uLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHNpZ25hbDogbG9hZC5zaWduYWwgfSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNBYm9ydEVycm9yKGVycikpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIG1hcCwgb3IgdGhlIHNjZW5lIHdlbnQgYXdheVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY2FjaGUuZmllbGQgPSBmaWVsZDtcbiAgICAgIGNhY2hlLmtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGNhY2hlLmZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIC8vIFRoZSBoaWdoIGVuZCBvdmVyIHRoZSBNRUFTVVJFRCB2b3hlbHMgb25seSAodGhlIHVubWVhc3VyZWQgemVyb3Mgd291bGQgcHVsbCBpdCBkb3duIGFuZFxuICAgIC8vIHNhdHVyYXRlIHRoZSBtYXApLCBidXQgdGhlIGxvdyBlbmQgc3RheXMgMDogaW4gYSB2b2x1bWUgdGhlIHZhbHVlIGlzIGFsc28gdGhlIG9wYWNpdHkgYW5kXG4gICAgLy8gMCByZWFkcyBhcyBcIm5vdGhpbmcgaGVyZVwiLCBzbyBzdGFydGluZyBhdCB0aGUgbG93ZXN0IG1lYXN1cmVkIHZhbHVlIHdvdWxkIGVyYXNlIGl0LlxuICAgIGNvbnN0IFssIGhpXSA9IGZpZWxkQ29udHJhc3RXaW5kb3coZmllbGQsIGNsaXBbMF0sIGNsaXBbMV0pO1xuICAgIGNvbnN0IGxvID0gMDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRXhwcmVzc2lvblZvbHVtZShmaWVsZCwgW2xvLCBoaV0sIHsgbG9nOiB2aWV3LmxvZ1NjYWxlIH0pO1xuICAgIGNvbnN0IGx1dCA9IHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRWb2x1bWUoZGF0YSwgZmllbGQud2lkdGgsIGZpZWxkLmhlaWdodCwgZmllbGQuZGVwdGgsIHtcbiAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9JHtpbnRlcnBvbGF0ZSA/ICcgwrcgdm9sdW1lJyA6ICcnfWAsXG4gICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KGBnZW5lLW1hcC0ke2dlbmV9YCwgbHV0KSxcbiAgICAgIC8vIFRoZSBlbmNvZGluZyBhbHJlYWR5IGFwcGxpZWQgdGhlIHdpbmRvdywgc28gdGhlIGxheWVyIG11c3Qgbm90IGFwcGx5IGFcbiAgICAgIC8vIHNlY29uZCBvbmU6IDAuLjI1NSBpcyB0aGUgd2hvbGUgb2Ygd2hhdCBpdCB3YXMgZ2l2ZW4uXG4gICAgICBjb250cmFzdExpbWl0czogWzAsIDI1NV0sXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAvLyBBZGRpdGl2ZSBsaWtlIHRoZSBkZW5zaXR5IHZvbHVtZXMsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiB0aGUgc2hlZXRzXG4gICAgICAvLyBoYXZlIHRvIHJlYWQgVEhST1VHSCBlYWNoIG90aGVyIGFuZCB0aHJvdWdoIHRoZSBhbmF0b215LCB3aGljaCBhXG4gICAgICAvLyB0cmFuc2x1Y2VudCBibGVuZCB3b3VsZCBvY2NsdWRlIG9uZSBzaGVldCBhdCBhIHRpbWUuXG4gICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICB2b3hlbFNpemU6IGdyaWQudm94ZWxTaXplLFxuICAgIH0pO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2x1c3RlciBkZW5zaXR5IHZvbHVtZXM6IGVhY2ggY2x1c3RlciByYXN0ZXJpc2VkIGludG8gYSBzbW9vdGggc2NhbGFyIGZpZWxkIGFuZFxuICAgKiByYXltYXJjaGVkIGFsb25nc2lkZSB0aGUgY2xvdWQsIHRpbnRlZCB3aXRoIHRoZSBjbHVzdGVyJ3Mgb3duIGxlZ2VuZCBjb2xvdXIuXG4gICAqXG4gICAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIHNlcmlhbGx5IHNlY3Rpb25lZCBkYXRhc2V0IHJlYWRhYmxlIGFzIGFuIGFuYXRvbWljYWxcbiAgICogZGlzdHJpYnV0aW9uLiBUaGUgY2xvdWQgc2hvd3MgbWVhc3VyZWQgY2VsbHMgYW5kIG5vdGhpbmcgZWxzZSDigJQgYnV0IGF0IDIwMCDCtW1cbiAgICogc2VjdGlvbiBzcGFjaW5nIHRoZSBleWUgY2Fubm90IGludGVncmF0ZSBhIHN0YWNrIG9mIGRpc2NzIGludG8gYSBzaGFwZSwgYW5kXG4gICAqIGV2ZXJ5IGdhcCByZWFkcyBhcyBhYnNlbmNlLiBBIGRlbnNpdHkgZmllbGQgaXMgYSBkaWZmZXJlbnQgb2JqZWN0IGZyb20gYSBjZWxsOlxuICAgKiBhbiBlc3RpbWF0ZSwgZGVmaW5lZCBiZXR3ZWVuIHRoZSBpbWFnZWQgcGxhbmVzLCBkcmF3biBhcyBhIHRyYW5zbHVjZW50IGNsb3VkIHNvXG4gICAqIGl0IGNhbm5vdCBiZSBtaXN0YWtlbiBmb3IgbWVhc3VyZW1lbnQuIEluZGl2aWR1YWwgY2VsbHMgYXJlIG5ldmVyIGludGVycG9sYXRlZCDigJRcbiAgICogY29uc2VjdXRpdmUgc2VjdGlvbnMgc2FtcGxlIGRpZmZlcmVudCBjZWxscywgc28gdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcnBvbGF0ZVxuICAgKiBhbG9uZy5cbiAgICpcbiAgICogT25lIHZvbHVtZSBwZXIgY2x1c3RlciByYXRoZXIgdGhhbiBvbmUgZm9yIGV2ZXJ5dGhpbmc6IGFkZGl0aXZlIGJsZW5kaW5nIGlzIHdoYXRcbiAgICogbWFrZXMgdHdvIGNsdXN0ZXJzJyB0ZXJyaXRvcmllcyBjb21wYXJhYmxlLCBhbmQgYSBzaW5nbGUgYmxlbmRlZCBmaWVsZCB3b3VsZFxuICAgKiBhbnN3ZXIgbm8gcXVlc3Rpb24gYW55b25lIGFza3Mgb2YgYSB0YXhvbm9teS4gQ2FwcGVkIGF0IGBERU5TSVRZX01BWF9DTFVTVEVSU2AgYnkgY2VsbFxuICAgKiBjb3VudC5cbiAgICpcbiAgICogS2V5ZWQgc28gaXQgcmVidWlsZHMgb25seSB3aGVuIHRoZSBmaWVsZCB3b3VsZCBhY3R1YWxseSBkaWZmZXIg4oCUIHRoZSBkYXRhc2V0LFxuICAgKiB0aGUgY29sb3VyIGNvbHVtbiwgdGhlIGJhbmR3aWR0aCwgb3IgdGhlIHNlbGVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGVuc2l0eVZvbHVtZXMoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbiA9ICEhdmlldy5kZW5zaXR5Vm9sdW1lICYmICEhZGF0YXNldC5vYnNlcnZhdGlvbnMuejtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmRlbnNpdHlTbW9vdGhpbmcgPiAwID8gdmlldy5kZW5zaXR5U21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjb2x1bW4gPSB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIC8vIFRoZSBzZWxlY3Rpb24gZW50ZXJzIHRoZSBrZXkgYnkgSURFTlRJVFksIG5vdCBieSBjb3VudDogdHdvIGRpZmZlcmVudCBST0lzXG4gICAgLy8gaG9sZGluZyB0aGUgc2FtZSBudW1iZXIgb2YgY2VsbHMgd291bGQgb3RoZXJ3aXNlIGxvb2sgbGlrZSB0aGUgc2FtZSBrZXkgYW5kXG4gICAgLy8gbGVhdmUgdGhlIHByZXZpb3VzIFJPSSdzIGZpZWxkcyBvbiBzY3JlZW4uXG4gICAgY29uc3Qga2V5ID0gb25cbiAgICAgID8gW2RhdGFzZXQuaWQsIGNvbHVtbiA/PyAnYWxsJywgc21vb3RoaW5nLCB0aGlzLnNlc3Npb24uc2VsZWN0aW9uUmV2KHNlbGVjdGlvbildLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZGVuc2l0eUtleSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmRlbnNpdHlMYXllcnMpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBrZXk7XG4gICAgY29uc3QgbG9hZCA9IHRoaXMuZGVuc2l0eUxvYWRzLm5leHQoKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIC8vIFdpdGggbm8gcmVmZXJlbmNlIHZvbHVtZSB0aGVyZSBpcyBubyBvZmZzZXQgeWV0LCBhbmQgYSBWb2x1bWVMYXllciBoYXMgbm9cbiAgICAvLyB0cmFuc2xhdGUg4oCUIG5hcGFyaSBjZW50cmVzIGl0cyBib3ggb24gdGhlIHdvcmxkIG9yaWdpbi4gU28gdGhlIFBPSU5UUyBtb3ZlIGJ5XG4gICAgLy8gaGFsZiB0aGUgZGVuc2l0eSBib3gsIGV4YWN0bHkgYXMgdGhleSBkbyBmb3IgYSByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgdGhlXG4gICAgLy8gY2FjaGVkIGdlb21ldHJ5IGlzIGludmFsaWRhdGVkIGJlY2F1c2UgdGhhdCBvZmZzZXQganVzdCBjaGFuZ2VkLlxuICAgIGlmICghdGhpcy52b2x1bWUpIHtcbiAgICAgIHRoaXMub3JpZ2luID0gW1xuICAgICAgICAtKGdyaWQud2lkdGggKiBncmlkLnZveGVsU2l6ZVswXSkgLyAyLFxuICAgICAgICAtKGdyaWQuaGVpZ2h0ICogZ3JpZC52b3hlbFNpemVbMV0pIC8gMixcbiAgICAgICAgLShncmlkLmRlcHRoICogZ3JpZC52b3hlbFNpemVbMl0pIC8gMixcbiAgICAgIF07XG4gICAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZ3JvdXBzOiBEZW5zaXR5R3JvdXBbXTtcbiAgICB0cnkge1xuICAgICAgZ3JvdXBzID0gYXdhaXQgdGhpcy5kZW5zaXR5R3JvdXBzKGRhdGFzZXQsIGNvbHVtbiwgc2VsZWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZGVuc2l0eSB2b2x1bWVzOiBjb2x1bW4gdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IHNpZ21hID0gZGVmYXVsdFNpZ21hKGdyaWQsIHNtb290aGluZyk7XG4gICAgLy8gQWRkaXRpdmUgYmxlbmRpbmcgU1VNUywgc28gYSBmaXhlZCBwZXItbGF5ZXIgb3BhY2l0eSBibG93cyBvdXQgdG8gd2hpdGUgYXNcbiAgICAvLyBzb29uIGFzIHNldmVyYWwgYnJvYWQgY2x1c3RlcnMgb3ZlcmxhcCDigJQgc2l4IHN1YmNsYXNzZXMgYXQgMC41NSBlYWNoIHR1cm5lZFxuICAgIC8vIHRoZSBicmFpbiBpbnRvIG9uZSBjeWFuIG1hc3MuIFNwbGl0dGluZyB0aGUgYnVkZ2V0IGtlZXBzIG4gZnVsbHkgb3ZlcmxhcHBpbmdcbiAgICAvLyBwZWFrcyBpbnNpZGUgdGhlIGRpc3BsYXkncyByYW5nZSwgc28gb3ZlcmxhcCByZWFkcyBhcyBvdmVybGFwOyBhIHNpbmdsZVxuICAgIC8vIGNsdXN0ZXIgc3RpbGwgZ2V0cyB0aGUgZnVsbCAwLjU1LiBJdCBvbmx5IG1pdGlnYXRlczogYSB0cmFuc2x1Y2VudCByYXltYXJjaFxuICAgIC8vIGludGVncmF0ZXMgYWxvbmcgdGhlIHJheSwgc28gY2x1c3RlcnMgdGhhdCBhcmUgdWJpcXVpdG91cyByYXRoZXIgdGhhblxuICAgIC8vIHJlZ2lvbmFsICh0aGUgbGFyZ2VzdCBzdWJjbGFzc2VzIGFyZSBnbGlhLCB3aGljaCBhcmUgZXZlcnl3aGVyZSkgc3RpbGwgcGlsZVxuICAgIC8vIHVwLCBhbmQgb25lIGNsdXN0ZXIgYXQgYSB0aW1lIGlzIHRoZSByZWFkYWJsZSB3YXkgdG8gbG9vayBhdCB0aG9zZS5cbiAgICBjb25zdCBvcGFjaXR5ID0gTWF0aC5taW4oMC41NSwgMC45IC8gTWF0aC5tYXgoMSwgZ3JvdXBzLmxlbmd0aCkpO1xuICAgIGxldCBmaWVsZHM6IChVaW50OEFycmF5IHwgbnVsbClbXTtcbiAgICB0cnkge1xuICAgICAgLy8gT2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkOyB0aGUgY2x1c3RlcnMgcXVldWUgb24gb25lIHdvcmtlci5cbiAgICAgIGZpZWxkcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBncm91cHMubWFwKChncm91cCkgPT5cbiAgICAgICAgICByYXN0ZXJpemVEZW5zaXR5QXN5bmMoXG4gICAgICAgICAgICBkYXRhc2V0Lm9ic2VydmF0aW9ucyxcbiAgICAgICAgICAgIGdyaWQsXG4gICAgICAgICAgICB7IHNpZ21hLCBpbmRpY2VzOiBncm91cC5pbmRpY2VzIH0sXG4gICAgICAgICAgICB7IHNpZ25hbDogbG9hZC5zaWduYWwgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIga2V5LCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBpKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZmllbGRzW2ldO1xuICAgICAgLy8gQSBjbHVzdGVyIHdpdGggbm90aGluZyBvbiB0aGUgZ3JpZCBkcmF3cyBubyBsYXllciwgcmF0aGVyIHRoYW4gYW4gZW1wdHkgYm94LlxuICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICB0aGlzLmRlbnNpdHlMYXllcnMucHVzaChcbiAgICAgICAgdmlld2VyLmFkZFZvbHVtZShkYXRhLCBncmlkLndpZHRoLCBncmlkLmhlaWdodCwgZ3JpZC5kZXB0aCwge1xuICAgICAgICAgIG5hbWU6IGBkZW5zaXR5IMK3ICR7Z3JvdXAubmFtZX1gLFxuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmN0eC5kaXNwbGF5LmNoYW5uZWxUaW50Q29sb3JtYXAoZ3JvdXAuY29sb3IpLFxuICAgICAgICAgIGludmVydDogdGhpcy5jdHguZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgLy8gVHJhbnNsdWNlbnQsIG5vdCBNSVA6IGEgY2x1c3RlcidzIGludGVyaW9yIGlzIHRoZSByZWFkYWJsZSBwYXJ0LCBhbmQgTUlQXG4gICAgICAgICAgLy8gd291bGQgZmxhdHRlbiBldmVyeSBjbG91ZCB0byBpdHMgYnJpZ2h0ZXN0IHNoZWxsLlxuICAgICAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgIC8vIEFkZGl0aXZlLCBzbyB0d28gY2x1c3RlcnMgb3ZlcmxhcHBpbmcgcmVhZCBhcyBib3RoIGJlaW5nIHRoZXJlIGluc3RlYWRcbiAgICAgICAgICAvLyBvZiB0aGUgbmVhcmVyIG9uZSBoaWRpbmcgdGhlIG90aGVyLlxuICAgICAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVycyB0byByYXN0ZXJpc2U6IHRoZSBjYXRlZ29yaWVzIG9mIHRoZSBhY3RpdmUgY2F0ZWdvcmljYWwgY29sb3VyaW5nLFxuICAgKiBiaWdnZXN0IGZpcnN0IGFuZCBjYXBwZWQsIGVhY2ggd2l0aCBpdHMgbGVnZW5kIGNvbG91ciwgcmVzdHJpY3RlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICogd2hlbiB0aGVyZSBpcyBvbmUuIFdpdGggbm8gY2F0ZWdvcmljYWwgY29sb3VyaW5nIHRoZXJlIGlzIG9uZSBncm91cCDigJQgdG90YWwgY2VsbCBkZW5zaXR5LFxuICAgKiB3aGljaCBpcyBhIHJlYWwgcXVlc3Rpb24gb24gaXRzIG93biAoXCJ3aGVyZSBpcyB0aGUgdGlzc3VlIGRlbnNlP1wiKSBhbmQgdGhlIGhvbmVzdCB0aGluZyB0b1xuICAgKiBzaG93IHdoZW4gdGhlIHZpZXcgaXMgbm90IGVuY29kaW5nIGEgdGF4b25vbXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbnNpdHlHcm91cHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBudWxsLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8RGVuc2l0eUdyb3VwW10+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgbWV0YSA9IGNvbHVtbiA/IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIGNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2x1bW4gfHwgIW1ldGEgfHwgbWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSByZXR1cm4gW3RvdGFsRGVuc2l0eUdyb3VwKHNlbGVjdGlvbildO1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gcmFua0RlbnNpdHlHcm91cHMoY29sdW1uLCBsb2FkZWQsIGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50LCBzZWxlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCAob3Iga2VlcCkgdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgZGVyaXZlIHRoZSBvZmZzZXQgdGhhdCBzaXRzIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgaW5zaWRlIGl0LlxuICAgKlxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGU6IG5hcGFyaS1qcyBtYXBzIHRoZSB2b2x1bWUncyB1bml0IGN1YmUgdG8gYSB3b3JsZCBib3hcbiAgICogKipjZW50cmVkIG9uIHRoZSBvcmlnaW4qKiwgc2l6ZWQgYGRpbXMgeCB2b3hlbFNpemVgLiBUaGUgb2JzZXJ2YXRpb25zLCBieSBjb250cmFjdCwgYXJlIGluXG4gICAqIHRoZSB2b2x1bWUncyBvd24gZnJhbWUgd2l0aCBpdHMgbmVhciBjb3JuZXIgYXQgdGhlIGNvb3JkaW5hdGUgb3JpZ2luLiBTbyB0aGUgdHdvIG9ubHkgbGluZVxuICAgKiB1cCBpZiB0aGUgUE9JTlRTIG1vdmUg4oCUIGJ5IGhhbGYgdGhlIGJveCDigJQgd2hpY2ggaXMgd2hhdCB7QGxpbmsgb3JpZ2lufSBpcy5cbiAgICpcbiAgICogQSBmYWlsZWQgb3IgYWJzZW50IHZvbHVtZSBpcyBub3QgZmF0YWw6IHRoZSBjbG91ZCByZW5kZXJzIG9uIGl0cyBvd24sIGF0IGl0cyBvd25cbiAgICogY29vcmRpbmF0ZXMsIGFuZCB0aGUgY2FtZXJhIGZyYW1lcyB0aGUgcG9pbnRzIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVZvbHVtZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGtleSA9IG1ldGEgPyBgJHtkYXRhc2V0LmlkfToke21ldGEud2lkdGh9eCR7bWV0YS5oZWlnaHR9eCR7bWV0YS5kZXB0aH1gIDogbnVsbDtcbiAgICBpZiAoa2V5ICYmIGtleSA9PT0gdGhpcy52b2x1bWVLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnZvbHVtZSkge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy52b2x1bWUpO1xuICAgICAgdGhpcy52b2x1bWUgPSBudWxsO1xuICAgICAgdGhpcy52b2x1bWVLZXkgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUaGUgc3VyZmFjZXMgc2F0IGluIHRoZSB2b2x1bWUganVzdCByZW1vdmVkIChvciB0aGVyZSB3YXMgbm9uZSk6IGRvd24gdW50aWwgb25lIGlzIHBsYWNlZC5cbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgdGhpcy5vcmlnaW4gPSBbMCwgMCwgMF07XG4gICAgaWYgKCFtZXRhIHx8ICFwb3J0Py5nZXRWb2x1bWUpIHJldHVybjtcblxuICAgIGxldCB2b3hlbHM6IFVpbnQ4QXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgIHZveGVscyA9IGF3YWl0IHBvcnQuZ2V0Vm9sdW1lKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHJlZmVyZW5jZSB2b2x1bWUgdW5hdmFpbGFibGUg4oCUIGRyYXdpbmcgdGhlIGNsb3VkIGFsb25lJywgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnZvbHVtZUtleSA9IGtleTtcbiAgICB0aGlzLnZvbHVtZSA9IHZpZXdlci5hZGRWb2x1bWUodm94ZWxzLCBtZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aCwge1xuICAgICAgbmFtZTogJ3JlZmVyZW5jZSB2b2x1bWUnLFxuICAgICAgY29sb3JtYXA6ICdncmF5JyxcbiAgICAgIC8vIE1JUCB3b3VsZCBkcmF3IHRoZSBicmlnaHRlc3Qgdm94ZWwgYWxvbmcgZWFjaCByYXksIHdoaWNoIGZvciBhbiBhdmVyYWdlZFxuICAgICAgLy8gdGVtcGxhdGUgbWVhbnMgYSBmbGF0IHdoaXRlIHNoZWxsIHRoYXQgaGlkZXMgdGhlIGNsb3VkLiBUcmFuc2x1Y2VudCBsZXRzXG4gICAgICAvLyB0aGUgcG9pbnRzIHJlYWQgdGhyb3VnaCB0aGUgdGlzc3VlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGRyYXdpbmdcbiAgICAgIC8vIHRoZW0gdG9nZXRoZXIuXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBvcGFjaXR5OiB2aWV3LnZvbHVtZU9wYWNpdHksXG4gICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6XSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5yZWdpb25zVGhyb3VnaCkgdGhpcy52b2x1bWUuYmxlbmRpbmcgPSAndHJhbnNsdWNlbnRfbm9fZGVwdGgnO1xuICAgIC8vIEhhbGYgdGhlIGJveCwgbmVnYXRlZDogdGhlIG9ic2VydmF0aW9ucycgb3JpZ2luIGlzIHRoZSBib3gncyBuZWFyIGNvcm5lcixcbiAgICAvLyBhbmQgdGhlIGJveCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4uXG4gICAgdGhpcy5vcmlnaW4gPSBbLShtZXRhLndpZHRoICogdngpIC8gMiwgLShtZXRhLmhlaWdodCAqIHZ5KSAvIDIsIC0obWV0YS5kZXB0aCAqIHZ6KSAvIDJdO1xuICAgIHRoaXMucGxhY2VSZWdpb25NZXNoZXMoZGF0YXNldCk7XG4gICAgLy8gRm9yY2UgYSBnZW9tZXRyeSByZWJ1aWxkOiB0aGUgb2Zmc2V0IGNoYW5nZWQsIHNvIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHN0YWxlLlxuICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICB9XG5cbiAgLyoqIERyb3AgZXZlcnkgbGF5ZXIgb2YgdGhlIGNsb3VkICh0aGUgZGF0YXNldCB3ZW50IGF3YXksIG9yIGhhcyBubyB6KS4gKi9cbiAgcHJpdmF0ZSByZW1vdmVMYXllcnModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBbdGhpcy5wb2ludHMsIHRoaXMudm9sdW1lLCB0aGlzLmdlbmVNYXBMYXllciwgLi4udGhpcy5kZW5zaXR5TGF5ZXJzXSkge1xuICAgICAgaWYgKGxheWVyKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbi5nZW5lTWFwVm9sdW1lLmZpZWxkID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uZ2VuZU1hcFZvbHVtZS5rZXkgPSBudWxsO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgLy8gVGhlIHNjZW5lIGlzIGdvbmUsIHNvIHRoZSBuZXh0IDNEIGxheWVyIHNob3VsZCBmcmFtZSBpdHNlbGYgYWdhaW4uIFRoYXQgdXNlZCB0byBiZVxuICAgIC8vIGBzcGF0aWFsRnJhbWVkID0gbnVsbGAgbmV4dCB0byBhIGhhbmQtcm9sbGVkIHNhdmUvcmVzdG9yZTsgdGhlIHJlbmRlcmVyIG93bnMgdGhlXG4gICAgLy8gcG9saWN5IG5vdywgYW5kIHRoaXMgaXMgdGhlIHNhbWUgc3RhdGVtZW50IGFkZHJlc3NlZCB0byBpdC5cbiAgICB2aWV3ZXIucmVzZXRGaXQzRCgpO1xuICAgIHRoaXMudm9sdW1lID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW4gPSBbMCwgMCwgMF07XG4gICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2V0UGlja2VyKG51bGwpO1xuICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICAgIHRoaXMuc2NhbGFyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5kcmF3biA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBjb2xvdXJzIHRoZSBjbG91ZC5cbiAgICpcbiAgICogQ29udGludW91cyBkYXRhIGdvZXMgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggdGhlIHNhbWUgcGVyY2VudGlsZSB3aW5kb3cgdGhlIDJEIHBhdGhcbiAgICogdXNlcy4gQ2F0ZWdvcmljYWwgZGF0YSBpcyBvbmUgUkdCQSBwZXIgcG9pbnQgZnJvbSB0aGUgY29sdW1uJ3MgcGFsZXR0ZSwgc28gYW55IG51bWJlciBvZlxuICAgKiBjYXRlZ29yaWVzIGtlZXBzIGl0cyBvd24gY29sb3VyIOKAlCBzZWUgYGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2NhbGFyRW5jb2RpbmcodmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgY291bnQ6IG51bWJlcik6IFByb21pc2U8U3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIC8vIENvbG91cmVkIGJ5IHRoZSBnZW5lIGZpbHRlcjogZWFjaCBvYnNlcnZhdGlvbiBpbiBpdHMgZ2VuZSdzIGNvbG91ci5cbiAgICAvLyBBIGNvbG91ciBsaWtlIGFueSBvdGhlcjogYSBmYWlsZWQgcmVhZCBmYWxscyBiYWNrIHRvIHRoZSB2aWV3J3MgY29sb3VyIHNvdXJjZS5cbiAgICBjb25zdCBieUdlbmUgPVxuICAgICAgcG9ydCAmJiBjb3VudFxuICAgICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZVN0eWxlKHZpZXcsIGNvdW50LCAoZykgPT4gcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGcpKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdbbmFwYXJpLWpzXSBzcGF0aWFsIDNEIGNvbG91cmluZyBieSBnZW5lIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIHRoZSBjb2xvdXIgc291cmNlJyxcbiAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0pXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoYnlHZW5lKSByZXR1cm4gZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwoYnlHZW5lLmNvZGVzLCBieUdlbmUuY29sb3JzKTtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvbHVtbi5jb2RlcywgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGNvbHVtbi52YWx1ZXMsIHZpZXcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpLCB2aWV3KTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgdGhlIGFjdGl2ZSBjb2xvcm1hcCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy4gKi9cbiAgZW5jb2RlQ29udGludW91cyhzb3VyY2U6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFNwYXRpYWwzZFNjYWxhcnMge1xuICAgIHJldHVybiBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgc291cmNlLFxuICAgICAgdmlldyxcbiAgICAgIHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KSxcbiAgICAgIHRoaXMuc2Vzc2lvbi5jb250cmFzdFdpbmRvd3MsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBvYnNlcnZhdGlvbnMgdGhlIGNsb3VkIGRyYXdzLCBhbmQgdGhlIGtleXMgb2YgaXRzIGdlb21ldHJ5IGFuZCBvZiBpdHMgY29sb3VyIHNvdXJjZS5cbiAqXG4gKiBPbmUgaW1hZ2VkIHNlY3Rpb24sIG9yIHRoZSB3aG9sZSBzdGFjayAoYHNob3duYCBudWxsKS4gVGhlIHN1YnNldCBJUyB0aGUgZ2VvbWV0cnksIHNvIGl0XG4gKiBiZWxvbmdzIGluIHRoZSBnZW9tZXRyeSBrZXkgcmF0aGVyIHRoYW4gYmVpbmcgcmUtZGVyaXZlZCBwZXIgZnJhbWUg4oCUIGFuZCBhbiBvdXQtb2YtcmFuZ2VcbiAqIGluZGV4IGlzIGNsYW1wZWQgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlIGNsb3VkLCBiZWNhdXNlIHRoZSBzZWN0aW9uIGNvdW50IGNoYW5nZXMgd2l0aCB0aGVcbiAqIGRhdGFzZXQgd2hpbGUgdGhlIHZpZXcgc3RhdGUgcGVyc2lzdHMuIFRoZSBzY2FsYXJzJyBpZGVudGl0eSBpcyB0cmFja2VkIHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAqIGdlb21ldHJ5J3MgKGBjb2xvckJ5YCBwbHVzIHRoZSB0cmFuc2Zvcm1zIGZlZWRpbmcgdGhlIGVuY29kaW5nKTogYSBuZXcgY29sb3VyIHNvdXJjZSBzd2Fwc1xuICogYHZhbHVlc2AgaW4gcGxhY2UgKG5hcGFyaS1qcyDiiaUgMC4xNCksIHdoaWxlIGEgbmV3IGdlb21ldHJ5IG5lZWRzIGEgbmV3IGxheWVyLlxuICovXG5mdW5jdGlvbiBjbG91ZFN1YnNldChcbiAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGdlbmVTaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuKTogeyBzaG93bjogVWludDMyQXJyYXkgfCBudWxsOyBrZXk6IHN0cmluZzsgc2NhbGFyS2V5OiBzdHJpbmcgfSB7XG4gIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgY29uc3Qgc2VjdGlvbiA9XG4gICAgdmlldy5wb2ludFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcucG9pbnRTZWN0aW9uKSldXG4gICAgICA6IG51bGw7XG4gIGxldCBzaG93biA9IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogbnVsbDtcbiAgLy8gVGhlIGdlbmUgZmlsdGVyIGxlYXZlcyBpdHMgdW5tYXRjaGVkIG9ic2VydmF0aW9ucyBvdXQgb2YgdGhlIGdlb21ldHJ5LCBzbyB0aGV5IGFyZSBuZWl0aGVyXG4gIC8vIGRyYXduIG5vciBwaWNrZWQuXG4gIGlmIChnZW5lU2hvd24pIHNob3duID0ga2VlcFNob3duKHNob3duLCBnZW5lU2hvd24sIG9icy5jb3VudCk7XG4gIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NlY3Rpb24gPz8gJ2FsbCd9OiR7Z2VuZVNob3duID8gZ2VuZUZpbHRlcktleSh2aWV3KSA6ICcnfWA7XG4gIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgY29uc3Qgc2NhbGFyS2V5ID0gW1xuICAgIGtleSxcbiAgICB2aWV3LmNvbG9yQnkgPyBgJHt2aWV3LmNvbG9yQnkua2luZH06JHt2aWV3LmNvbG9yQnkubmFtZX1gIDogJ2ZsYXQnLFxuICAgIG9ic2VydmF0aW9uR2VuZVN0eWxlS2V5KHZpZXcpLFxuICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgIGNsaXAuam9pbignLCcpLFxuICBdLmpvaW4oJ3wnKTtcbiAgcmV0dXJuIHsgc2hvd24sIGtleSwgc2NhbGFyS2V5IH07XG59XG5cbi8qKiBUaGUgb2JzZXJ2YXRpb25zIG9mIGBpbmRpY2VzYCAoZXZlcnkgb25lIHdoZW4gbnVsbCkgdGhhdCBgc2hvd25gIGtlZXBzLiAqL1xuZnVuY3Rpb24ga2VlcFNob3duKGluZGljZXM6IFVpbnQzMkFycmF5IHwgbnVsbCwgc2hvd246IFVpbnQ4QXJyYXksIGNvdW50OiBudW1iZXIpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50MzJBcnJheShpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiBjb3VudCk7XG4gIGxldCBuID0gMDtcbiAgaWYgKGluZGljZXMpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgaWYgKHNob3duW2ldKSBvdXRbbisrXSA9IGk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBpZiAoc2hvd25baV0pIG91dFtuKytdID0gaTtcbiAgfVxuICByZXR1cm4gb3V0LnN1YmFycmF5KDAsIG4pO1xufVxuIl19