@jax-data-science/sci-image-visualizer 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +4 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  21. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
  22. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  23. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
  24. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
  26. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
  27. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  28. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  29. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  30. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  31. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  32. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  33. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  34. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  35. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  36. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  37. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  38. package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
  39. package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
  40. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  41. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  42. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  43. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  44. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  45. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  46. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  47. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  48. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
  49. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  50. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
  51. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
  52. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  53. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  54. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  55. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  56. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  57. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  58. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  59. package/esm2022/lib/store/region-store.service.mjs +33 -2
  60. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  61. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  62. package/esm2022/lib/visualizer.component.mjs +40 -4
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
  64. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  66. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  68. package/fesm2022/region-source.worker.js +84 -2
  69. package/lib/contracts/display-types.d.ts +99 -6
  70. package/lib/contracts/image.contract.d.ts +6 -0
  71. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  73. package/lib/contracts/region-store.contract.d.ts +6 -0
  74. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  75. package/lib/contracts/visualizer.contract.d.ts +43 -1
  76. package/lib/geometry/cell-meshes.d.ts +27 -0
  77. package/lib/geometry/place.d.ts +45 -0
  78. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  79. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  80. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  81. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  82. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  83. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
  84. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
  85. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  86. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  87. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  88. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
  89. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  90. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
  91. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  92. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
  93. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  94. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  95. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  96. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  97. package/lib/region-editor/region-editor.component.d.ts +4 -0
  98. package/lib/region-source/region-source-ops.d.ts +12 -0
  99. package/lib/region-source/region-tiles.d.ts +8 -0
  100. package/lib/region-source/worker-region-source.d.ts +18 -0
  101. package/lib/routing-visualizer.service.d.ts +140 -1
  102. package/lib/spatial/observations-in-selection.d.ts +43 -0
  103. package/lib/spatial/plane-cells.d.ts +37 -0
  104. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  105. package/lib/spatial/spatial-encoding.d.ts +24 -1
  106. package/lib/spatial/spatial-hover.d.ts +23 -0
  107. package/lib/spatial/spatial-planes.d.ts +22 -0
  108. package/lib/spatial/spatial-selection.d.ts +2 -1
  109. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  110. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  111. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  112. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  113. package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
  114. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  115. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
  116. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
  117. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  118. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  119. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  120. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  121. package/lib/store/region-source-scope.d.ts +4 -0
  122. package/lib/store/region-store.service.d.ts +21 -0
  123. package/lib/toolbar/toolbar.component.d.ts +6 -1
  124. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  125. package/lib/visualizer.component.d.ts +14 -0
  126. package/package.json +2 -2
  127. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
1
  import { pointSymbolCode } from 'napari-js';
2
2
  import { ALL_GENES } from '../../../contracts/ports/spatial-data.port';
3
3
  import { NO_CATEGORY, NO_OBSERVATION, } from '../../../contracts/spatial-dataset.contract';
4
- import { DEFAULT_CATEGORICAL_PALETTE, parseHex, resolveCategoryColors } from '../../../spatial/spatial-encoding';
4
+ import { DEFAULT_CATEGORICAL_PALETTE, categoryColorsFor, fadeOutsideSelection, groupColorsKey, parseHex, } from '../../../spatial/spatial-encoding';
5
5
  import { cellTypeColumnFor } from '../../../spatial/lod';
6
6
  import { clusterColorMap } from '../../../spatial/transcript-grouping';
7
7
  import { defaultGlyphFor } from '../../../spatial/glyphs';
8
- import { filterTranscripts, hiddenAllGeneCodes, hiddenGeneSlots, median, } from '../../../spatial/spatial-tile-merge';
8
+ import { filterTranscripts, hiddenAllGeneCodes, hiddenGeneSlots, median, transcriptsInBand, } from '../../../spatial/spatial-tile-merge';
9
9
  import { geneFilterKey, hasGeneFilter } from '../../../spatial/spatial-gene-filter';
10
10
  import { groupSelection } from './transcript-jobs';
11
11
  /** Icons get a dark rim only while there are at most this many, at least this big (px). */
@@ -39,9 +39,11 @@ const GLYPH_SIZE = { square: 0.8 };
39
39
  * What a transcript plan draws, as a key: an unchanged one is a no-op. Marker sizes follow the
40
40
  * zoom, so the zoom is part of it; a pan that keeps the same tiles on screen changes nothing.
41
41
  */
42
- function transcriptPlanKey(dataset, view, job, pxPerUnit) {
42
+ function transcriptPlanKey(dataset, view, job, pxPerUnit, zBand, selectionRev) {
43
43
  return [
44
+ selectionRev,
44
45
  dataset.id,
46
+ zBand ? zBand.join(',') : '',
45
47
  view.transcriptMode,
46
48
  job.key,
47
49
  view.transcriptColorBy,
@@ -56,6 +58,7 @@ function transcriptPlanKey(dataset, view, job, pxPerUnit) {
56
58
  view.transcriptAllGenesHidden.join(','),
57
59
  JSON.stringify(view.transcriptGeneColors),
58
60
  JSON.stringify(view.transcriptGeneGroups),
61
+ groupColorsKey(cellTypeColumnFor(dataset, view), view.groupColors),
59
62
  ].join('|');
60
63
  }
61
64
  /** The view the markers are coloured by, for what was loaded. */
@@ -92,6 +95,9 @@ export class TranscriptLayers {
92
95
  this.hover = hover;
93
96
  /** The loaded per-gene transcripts the in-view counts are taken from. */
94
97
  this.countSource = null;
98
+ /** The selection the last plan faded by, and its revision, bumped each time it changes. */
99
+ this.lastSelection = null;
100
+ this.selectionRevision = 0;
95
101
  }
96
102
  /**
97
103
  * Transcripts of each selected gene inside `rect`: each entry counts for the transcripts it
@@ -118,8 +124,12 @@ export class TranscriptLayers {
118
124
  detached() {
119
125
  this.countSource = null;
120
126
  }
121
- /** Draw the view's transcript markers (or drop them); an unchanged plan key is a no-op. */
122
- async plan(dataset, view, rect, pxPerUnit, ctx) {
127
+ /**
128
+ * Draw the view's transcript markers (or drop them); an unchanged plan key is a no-op. With a
129
+ * `zBand`, the view shows one plane of a 3D assay: only the transcripts at that depth are drawn
130
+ * (summed density grids and aggregates, which mix depths, stay whole).
131
+ */
132
+ async plan(dataset, view, rect, pxPerUnit, ctx, zBand = null, selection = null) {
123
133
  const mode = view.transcriptMode;
124
134
  const job = this.jobs.jobFor(dataset, view, rect, pxPerUnit);
125
135
  if (!job) {
@@ -128,7 +138,7 @@ export class TranscriptLayers {
128
138
  this.countSource = null;
129
139
  return;
130
140
  }
131
- const planKey = transcriptPlanKey(dataset, view, job, pxPerUnit);
141
+ const planKey = transcriptPlanKey(dataset, view, job, pxPerUnit, zBand, this.selectionRev(selection));
132
142
  if (planKey === this.groups.key('transcripts') && this.groups.shown('transcripts')) {
133
143
  return;
134
144
  }
@@ -167,7 +177,7 @@ export class TranscriptLayers {
167
177
  : kind === 'individual'
168
178
  ? hiddenAllGeneCodes(view, allGeneNames)
169
179
  : null);
170
- let { merged, px } = filtered;
180
+ let { merged, px } = loaded.clustered || !zBand ? filtered : transcriptsInBand(filtered.merged, filtered.px, zBand);
171
181
  let selectionBin = loaded.clustered?.bin ?? null;
172
182
  let entryGroup = loaded.clustered?.group ?? null;
173
183
  let groupNames = loaded.clustered?.names ?? null;
@@ -181,6 +191,9 @@ export class TranscriptLayers {
181
191
  const geneCluster = view.transcriptGenes.map((g) => view.transcriptGeneGroups.find((x) => x.genes.includes(g))?.name ?? g);
182
192
  const clusterOf = (i) => entryGroup && groupNames ? (groupNames[entryGroup[i]] ?? null) : (geneCluster[merged.gene[i]] ?? null);
183
193
  const rgba = await this.transcriptColors(dataset, colorView, merged, kind === 'genes' ? clusterOf : undefined);
194
+ // A selected cell or cell type: its transcripts as they are, the others faded, as the cells are.
195
+ // Density-grid markers carry no cells, so they all fade.
196
+ fadeOutsideSelection(rgba, merged.count, (i) => (loaded.clustered ? -1 : merged.observation[i]), selection);
184
197
  const typeColumn = cellTypeColumnFor(dataset, view);
185
198
  const types = typeColumn ? await this.lookup.codes(typeColumn).catch(() => null) : null;
186
199
  // Nothing is recorded before the last await: a superseded plan that had already keyed the
@@ -266,6 +279,14 @@ export class TranscriptLayers {
266
279
  this.groups.replace('transcripts', layer);
267
280
  return layer;
268
281
  }
282
+ selectionRev(selection) {
283
+ const live = selection && selection.count > 0 ? selection : null;
284
+ if (live !== this.lastSelection) {
285
+ this.lastSelection = live;
286
+ this.selectionRevision++;
287
+ }
288
+ return this.selectionRevision;
289
+ }
269
290
  /** Per-entry colours, as packed RGBA. */
270
291
  async transcriptColors(dataset, view, t, clusterOf) {
271
292
  let rgb;
@@ -276,8 +297,8 @@ export class TranscriptLayers {
276
297
  const name = cellTypeColumnFor(dataset, view);
277
298
  const codes = name ? await this.lookup.codes(name).catch(() => null) : null;
278
299
  const cellColor = new Map();
279
- if (codes?.meta.kind === 'categorical') {
280
- const colors = resolveCategoryColors(codes.meta);
300
+ if (name && codes?.meta.kind === 'categorical') {
301
+ const colors = categoryColorsFor(name, codes.meta, view.groupColors);
281
302
  codes.meta.categories.forEach((c, k) => cellColor.set(c, colors[k]));
282
303
  }
283
304
  const colors = clusterColorMap(view.transcriptGenes, view.transcriptGeneGroups, cellColor, DEFAULT_CATEGORICAL_PALETTE);
@@ -312,7 +333,10 @@ export class TranscriptLayers {
312
333
  else {
313
334
  const name = cellTypeColumnFor(dataset, view);
314
335
  const codes = name ? await this.lookup.codes(name) : null;
315
- rgb = codes?.meta.kind === 'categorical' ? resolveCategoryColors(codes.meta).map(parseHex) : [];
336
+ rgb =
337
+ name && codes?.meta.kind === 'categorical'
338
+ ? categoryColorsFor(name, codes.meta, view.groupColors).map(parseHex)
339
+ : [];
316
340
  codeOf = (i) => {
317
341
  const o = t.observation[i];
318
342
  if (!codes || o === NO_OBSERVATION)
@@ -330,4 +354,4 @@ export class TranscriptLayers {
330
354
  return rgba;
331
355
  }
332
356
  }
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1sYXllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvc3BhdGlhbC10aWxlcy90cmFuc2NyaXB0LWxheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FHZixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqSCxPQUFPLEVBQVksaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFtQixlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsTUFBTSxHQUNQLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUtwRixPQUFPLEVBQWlELGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxHLDJGQUEyRjtBQUMzRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUUvQixnQ0FBZ0M7QUFDaEMsTUFBTSxTQUFTLEdBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVoRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFt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LENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG9pbnRTeW1ib2xDb2RlIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRTeW1ib2wsIFBvaW50c0xheWVyLCBSR0JBIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHR5cGUgeyBSZ2IgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IEFMTF9HRU5FUyB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLCBwYXJzZUhleCwgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IERhdGFSZWN0LCBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvbG9kJztcbmltcG9ydCB7IGNsdXN0ZXJDb2xvck1hcCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvdHJhbnNjcmlwdC1ncm91cGluZyc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0R2x5cGgsIGRlZmF1bHRHbHlwaEZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvZ2x5cGhzJztcbmltcG9ydCB7XG4gIGZpbHRlclRyYW5zY3JpcHRzLFxuICBoaWRkZW5BbGxHZW5lQ29kZXMsXG4gIGhpZGRlbkdlbmVTbG90cyxcbiAgbWVkaWFuLFxufSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZSc7XG5pbXBvcnQgeyBnZW5lRmlsdGVyS2V5LCBoYXNHZW5lRmlsdGVyIH0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWdlbmUtZmlsdGVyJztcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcmljYWxMb29rdXAgfSBmcm9tICcuL2NhdGVnb3JpY2FsLWxvb2t1cCc7XG5pbXBvcnQgdHlwZSB7IE9yZGVyZWRMYXllckdyb3VwcywgVGlsZUdyb3VwIH0gZnJvbSAnLi9sYXllci1ncm91cHMnO1xuaW1wb3J0IHR5cGUgeyBQbGFuQ29udGV4dCB9IGZyb20gJy4vcGxhbi1jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgVHJhbnNjcmlwdEhvdmVyLCBUcmFuc2NyaXB0S2luZCB9IGZyb20gJy4vdHJhbnNjcmlwdC1ob3Zlcic7XG5pbXBvcnQgeyB0eXBlIFRyYW5zY3JpcHRKb2IsIHR5cGUgVHJhbnNjcmlwdEpvYlBsYW5uZXIsIGdyb3VwU2VsZWN0aW9uIH0gZnJvbSAnLi90cmFuc2NyaXB0LWpvYnMnO1xuXG4vKiogSWNvbnMgZ2V0IGEgZGFyayByaW0gb25seSB3aGlsZSB0aGVyZSBhcmUgYXQgbW9zdCB0aGlzIG1hbnksIGF0IGxlYXN0IHRoaXMgYmlnIChweCkuICovXG5jb25zdCBHTFlQSF9PVVRMSU5FX01BWCA9IDIwXzAwMDtcbmNvbnN0IEdMWVBIX09VVExJTkVfTUlOX1BYID0gODtcblxuLyoqIFRoZSBkYXJrIHJpbSBvZiBhIG1hcmtlci4gKi9cbmNvbnN0IFJJTV9DT0xPUjogUkdCQSA9IFswLjA0LCAwLjA0LCAwLjA1LCAwLjldO1xuXG4vKipcbiAqIFRoZSBuYXBhcmktanMgcG9pbnQgc3ltYm9sIGVhY2ggdHJhbnNjcmlwdCBpY29uIGlzIGRyYXduIGFzLiBFdmVyeSBpY29uIGhhcyBhIGNvdW50ZXJwYXJ0IG9mXG4gKiB0aGUgc2FtZSBvdXRsaW5lIChgY2lyY2xlYCBpcyBuYXBhcmkncyBgZGlzY2ApOyBzZWUge0BsaW5rIEdMWVBIX1NJWkV9IGZvciB0aGUgb25lIHdob3NlIHNpemVcbiAqIGRpZmZlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBHTFlQSF9TWU1CT0xTOiBSZWFkb25seTxSZWNvcmQ8VHJhbnNjcmlwdEdseXBoLCBQb2ludFN5bWJvbD4+ID0ge1xuICBjaXJjbGU6ICdkaXNjJyxcbiAgc3RhcjogJ3N0YXInLFxuICB0cmlhbmdsZTogJ3RyaWFuZ2xlX3VwJyxcbiAgc3F1YXJlOiAnc3F1YXJlJyxcbiAgZGlhbW9uZDogJ2RpYW1vbmQnLFxuICBjcm9zczogJ2Nyb3NzJyxcbiAgaGV4YWdvbjogJ2hleGFnb24nLFxuICAndHJpYW5nbGUtZG93bic6ICd0cmlhbmdsZV9kb3duJyxcbiAgcGVudGFnb246ICdwZW50YWdvbicsXG4gIHg6ICd4Jyxcbn07XG5cbi8qKlxuICogTWFya2VyIGRpYW1ldGVyIHBlciBpY29uLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBlbnRyeSdzOiBuYXBhcmkncyBgc3F1YXJlYCBmaWxscyB0aGUgbWFya2VyJ3NcbiAqIHdob2xlIGJveCwgd2hlcmUgdGhlIGljb24gaXQgcmVwbGFjZXMgaGFkIGEgMC44IGhhbGYtc2lkZSwgYXMgaGVhdnkgYXMgdGhlIG90aGVyIGljb25zLlxuICovXG5jb25zdCBHTFlQSF9TSVpFOiBSZWFkb25seTxQYXJ0aWFsPFJlY29yZDxUcmFuc2NyaXB0R2x5cGgsIG51bWJlcj4+PiA9IHsgc3F1YXJlOiAwLjggfTtcblxuLyoqXG4gKiBXaGF0IGEgdHJhbnNjcmlwdCBwbGFuIGRyYXdzLCBhcyBhIGtleTogYW4gdW5jaGFuZ2VkIG9uZSBpcyBhIG5vLW9wLiBNYXJrZXIgc2l6ZXMgZm9sbG93IHRoZVxuICogem9vbSwgc28gdGhlIHpvb20gaXMgcGFydCBvZiBpdDsgYSBwYW4gdGhhdCBrZWVwcyB0aGUgc2FtZSB0aWxlcyBvbiBzY3JlZW4gY2hhbmdlcyBub3RoaW5nLlxuICovXG5mdW5jdGlvbiB0cmFuc2NyaXB0UGxhbktleShcbiAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGpvYjogVHJhbnNjcmlwdEpvYixcbiAgcHhQZXJVbml0OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gW1xuICAgIGRhdGFzZXQuaWQsXG4gICAgdmlldy50cmFuc2NyaXB0TW9kZSxcbiAgICBqb2Iua2V5LFxuICAgIHZpZXcudHJhbnNjcmlwdENvbG9yQnksXG4gICAgY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyksXG4gICAgdmlldy50cmFuc2NyaXB0U2NhbGUsXG4gICAgdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHbHlwaHMpLFxuICAgIHB4UGVyVW5pdC50b1ByZWNpc2lvbig0KSxcbiAgICB2aWV3LmhpZGRlbkdyb3Vwcy5qb2luKCdcXHUwMDAxJyksXG4gICAgZ2VuZUZpbHRlcktleSh2aWV3KSxcbiAgICB2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5qb2luKCcsJyksXG4gICAgdmlldy50cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW4uam9pbignLCcpLFxuICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdlbmVDb2xvcnMpLFxuICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMpLFxuICBdLmpvaW4oJ3wnKTtcbn1cblxuLyoqIFRoZSB2aWV3IHRoZSBtYXJrZXJzIGFyZSBjb2xvdXJlZCBieSwgZm9yIHdoYXQgd2FzIGxvYWRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvclZpZXdGb3IoXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGtpbmQ6IFRyYW5zY3JpcHRLaW5kLFxuICBjbHVzdGVyZWQ6IGJvb2xlYW4sXG4gIGhhc0NlbGxUeXBlczogYm9vbGVhbixcbik6IFNwYXRpYWxWaWV3U3RhdGUge1xuICAvLyBBIGJpbiBvZiB0aGUgYWxsLWdlbmUgcHlyYW1pZCBtaXhlcyBnZW5lcyBhbmQgY2FycmllcyBub25lLCBzbyBpdCBjYW5ub3QgYmUgY29sb3VyZWRcbiAgLy8gYnkgZ2VuZTogY29sb3VyIGl0IGJ5IGl0cyBkb21pbmFudCBjZWxsJ3MgdHlwZSB1bnRpbCBpbmRpdmlkdWFsIHRyYW5zY3JpcHRzIHNob3cgKHdpdGhcbiAgLy8gbm8gY2VsbCB0eXBlcywgdGhhdCBsZWF2ZXMgZXZlcnkgYmluIHVuYXNzaWduZWQ6IG9uZSBjb2xvdXIpLlxuICBpZiAoa2luZCA9PT0gJ2JpbnMnICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgIT09ICdjZWxsVHlwZScpIHJldHVybiB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnY2VsbFR5cGUnIH07XG4gIC8vIERlbnNpdHktZ3JpZCBtYXJrZXJzIGhhdmUgbm8gY2VsbCB0byB0YWtlIGEgdHlwZSBmcm9tOiB0aGV5IHRha2UgdGhlaXIgY2x1c3RlcidzIGNvbG91ci5cbiAgaWYgKGNsdXN0ZXJlZCAmJiB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2VsbFR5cGUnKSByZXR1cm4geyAuLi52aWV3LCB0cmFuc2NyaXB0Q29sb3JCeTogJ2NsdXN0ZXInIH07XG4gIC8vIE5vIGNlbGwgdHlwZXMgdG8gY29sb3VyIGJ5ICh0aGUgcGFuZWwgdGhlbiBkb2VzIG5vdCBvZmZlciBpdCk6IGJ5IGdlbmUgaW5zdGVhZC5cbiAgaWYgKCFoYXNDZWxsVHlwZXMgJiYga2luZCAhPT0gJ2JpbnMnICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjZWxsVHlwZScpIHtcbiAgICByZXR1cm4geyAuLi52aWV3LCB0cmFuc2NyaXB0Q29sb3JCeTogJ2dlbmUnIH07XG4gIH1cbiAgcmV0dXJuIHZpZXc7XG59XG5cbi8qKiBXaGVyZSBhIGxheWVyIHNpdHMgaW4gd29ybGQgc3BhY2U6IHRoZSBkYXRhc2V0J3MgYWZmaW5lIG9udG8gaXRzIHRpc3N1ZSBpbWFnZS4gKi9cbmludGVyZmFjZSBQbGFjZW1lbnQge1xuICBzY2FsZTogW251bWJlciwgbnVtYmVyXTtcbiAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG5jb25zdCBVTkFTU0lHTkVEX1JHQkE6IFJHQkEgPSBbMC42MiwgMC42MiwgMC42MiwgMC41NV07XG5cbi8qKlxuICogVGhlIHRyYW5zY3JpcHQgbWFya2VycyBvZiB0aGUgMkQgc3BhdGlhbCB2aWV3OiBydW5zIHRoZSBwbGFubmVyJ3Mgam9iLCBkcm9wcyBoaWRkZW4gZ3JvdXBzXG4gKiBhbmQgZ2VuZXMsIGdyb3VwcyBhIHNlbGVjdGlvbiB1bmRlciB0aGUgbWFya2VyIGJ1ZGdldCwgY29sb3VycyB0aGUgZW50cmllcyBhbmQgZHJhd3MgdGhlbSBhc1xuICogb25lIHBvaW50cyBsYXllcjogc2l6ZWQgY2lyY2xlcywgb3IgZ2VuZSBpY29ucyBhcyBwZXItcG9pbnQgc3ltYm9scyAod2l0aCBhIGRhcmsgcmltIHdoaWxlXG4gKiB0aGVyZSBhcmUgZmV3IGVub3VnaCkuXG4gKlxuICogSGFuZHMgd2hhdCBpdCBkcmV3IHRvIHRoZSBob3ZlciBvbmUgd2F5ICh7QGxpbmsgVHJhbnNjcmlwdEhvdmVyLnNldERyYXdufSksIGFuZCBrZWVwcyB0aGVcbiAqIGxvYWRlZCBwZXItZ2VuZSB0cmFuc2NyaXB0cyB0aGUgaW4tdmlldyBnZW5lIGNvdW50cyBhcmUgdGFrZW4gZnJvbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zY3JpcHRMYXllcnMge1xuICAvKiogVGhlIGxvYWRlZCBwZXItZ2VuZSB0cmFuc2NyaXB0cyB0aGUgaW4tdmlldyBjb3VudHMgYXJlIHRha2VuIGZyb20uICovXG4gIHByaXZhdGUgY291bnRTb3VyY2U6IHsgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdlbmVzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBncm91cHM6IE9yZGVyZWRMYXllckdyb3VwczxUaWxlR3JvdXA+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgam9iczogVHJhbnNjcmlwdEpvYlBsYW5uZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb29rdXA6IENhdGVnb3JpY2FsTG9va3VwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG92ZXI6IFRyYW5zY3JpcHRIb3ZlcixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW5zaWRlIGByZWN0YDogZWFjaCBlbnRyeSBjb3VudHMgZm9yIHRoZSB0cmFuc2NyaXB0cyBpdFxuICAgKiBzdGFuZHMgZm9yIChhbiBhZ2dyZWdhdGUgYXQgYSBjb2Fyc2UgbGV2ZWwgaG9sZHMgc2V2ZXJhbCkuIE51bGwgd2l0aG91dCBwZXItZ2VuZSBkYXRhLlxuICAgKi9cbiAgZ2VuZUNvdW50c0luKHJlY3Q6IERhdGFSZWN0KTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMuY291bnRTb3VyY2U7XG4gICAgaWYgKCFzcmMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZyBvZiBzcmMuZ2VuZXMpIG91dFtnXSA9IDA7XG4gICAgY29uc3QgeyB4LCB5LCB3ZWlnaHQsIGdlbmUgfSA9IHNyYy5tZXJnZWQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmMubWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIGlmICh4W2ldIDwgcmVjdC54MCB8fCB4W2ldID4gcmVjdC54MSB8fCB5W2ldIDwgcmVjdC55MCB8fCB5W2ldID4gcmVjdC55MSkgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lID0gc3JjLmdlbmVzW2dlbmVbaV1dO1xuICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgb3V0W25hbWVdICs9IHdlaWdodFtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBUaGUgdmlld2VyIHdlbnQgYXdheTogbm8gY291bnRzIHVudGlsIHRoZSBuZXh0IHBsYW4uICovXG4gIGRldGFjaGVkKCk6IHZvaWQge1xuICAgIHRoaXMuY291bnRTb3VyY2UgPSBudWxsO1xuICB9XG5cbiAgLyoqIERyYXcgdGhlIHZpZXcncyB0cmFuc2NyaXB0IG1hcmtlcnMgKG9yIGRyb3AgdGhlbSk7IGFuIHVuY2hhbmdlZCBwbGFuIGtleSBpcyBhIG5vLW9wLiAqL1xuICBhc3luYyBwbGFuKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcmVjdDogRGF0YVJlY3QsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICAgY3R4OiBQbGFuQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9kZSA9IHZpZXcudHJhbnNjcmlwdE1vZGU7XG4gICAgY29uc3Qgam9iID0gdGhpcy5qb2JzLmpvYkZvcihkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQpO1xuICAgIGlmICgham9iKSB7XG4gICAgICB0aGlzLmdyb3Vwcy5kcm9wKCd0cmFuc2NyaXB0cycpO1xuICAgICAgdGhpcy5ob3Zlci5jbGVhcigpO1xuICAgICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBsYW5LZXkgPSB0cmFuc2NyaXB0UGxhbktleShkYXRhc2V0LCB2aWV3LCBqb2IsIHB4UGVyVW5pdCk7XG4gICAgaWYgKHBsYW5LZXkgPT09IHRoaXMuZ3JvdXBzLmtleSgndHJhbnNjcmlwdHMnKSAmJiB0aGlzLmdyb3Vwcy5zaG93bigndHJhbnNjcmlwdHMnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBjdHgudHJhY2soJ1RyYW5zY3JpcHRzJywgam9iLmxvYWQoY3R4KSk7XG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG4gICAgLy8gTWFya2VycyBkcmF3biBmcm9tIHN1bW1lZCBkZW5zaXR5IGdyaWRzICh6b29tZWQgb3V0KSBjYXJyeSBubyBjZWxscywgc28gdGhleSBjYW5ub3QgZm9sbG93XG4gICAgLy8gdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyOiBkcmF3biwgdGhleSB3b3VsZCBzaG93IHRoZSB0cmFuc2NyaXB0cyBvZiB0aGUgY2VsbHMgaXQgaGlkZXMuXG4gICAgLy8gTm9uZSB3aGlsZSBpdCBpcyBvbjsgem9vbWVkIGluLCB0aGUgY2VsbC1hc3NpZ25lZCB0cmFuc2NyaXB0cyBhcmUgZmlsdGVyZWQgKGJlbG93KS5cbiAgICBpZiAobG9hZGVkLmNsdXN0ZXJlZCAmJiBoYXNHZW5lRmlsdGVyKHZpZXcpKSB7XG4gICAgICB0aGlzLmdyb3Vwcy5kcm9wKCd0cmFuc2NyaXB0cycpO1xuICAgICAgdGhpcy5ob3Zlci5jbGVhcigpO1xuICAgICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBlci1nZW5lIGNvdW50cyBpbiB2aWV3IGNvbWUgZnJvbSB3aGF0IHdhcyBsb2FkZWQsIGJlZm9yZSBoaWRkZW4gZ2VuZXMgYXJlIGRyb3BwZWQ6XG4gICAgLy8gYSBoaWRkZW4gZ2VuZSBzdGlsbCBoYXMgdHJhbnNjcmlwdHMgdGhlcmUuIFN1bW1lZCBkZW5zaXR5IGdyaWRzIChubyBwZXItZ2VuZSBsZXZlbHMsXG4gICAgLy8gem9vbWVkIG91dCkgaG9sZCBjbHVzdGVycywgbm90IGdlbmVzOiBubyBwZXItZ2VuZSBjb3VudHMgdGhlcmUsIHJhdGhlciB0aGFuIGEgZ3Vlc3MuXG4gICAgLy8gRXZlcnkgZ2VuZSdzIGluZGl2aWR1YWwgdHJhbnNjcmlwdHMgYXJlIGNvdW50ZWQgYnkgdGhlIGRhdGFzZXQncyBnZW5lIGxpc3QsIHdoZW4gaXQgaGFzIG9uZS5cbiAgICBjb25zdCBhbGxHZW5lTmFtZXMgPSBkYXRhc2V0LnRyYW5zY3JpcHRUaWxlcz8uZ2VuZXM7XG4gICAgY29uc3Qga2luZCA9IGxvYWRlZC5raW5kID8/IGpvYi5raW5kO1xuICAgIHRoaXMuY291bnRTb3VyY2UgPVxuICAgICAga2luZCA9PT0gJ2dlbmVzJyAmJiAhbG9hZGVkLmNsdXN0ZXJlZFxuICAgICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBnZW5lczogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSB9XG4gICAgICAgIDoga2luZCA9PT0gJ2luZGl2aWR1YWwnICYmIGFsbEdlbmVOYW1lc1xuICAgICAgICAgID8geyBtZXJnZWQ6IGxvYWRlZC5tZXJnZWQsIGdlbmVzOiBhbGxHZW5lTmFtZXMgfVxuICAgICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBoaWRkZW4gPSBhd2FpdCB0aGlzLmxvb2t1cC5oaWRkZW5Db2RlcyhkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAoY3R4LnN0YWxlKCkpIHJldHVybjtcbiAgICAvLyBEZW5zaXR5LWdyaWQgbWFya2VycyBjYXJyeSBubyBjZWxscyBhbmQgd2VyZSBidWlsdCBmcm9tIHRoZSB2aXNpYmxlIGdlbmVzIG9ubHkuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBsb2FkZWQuY2x1c3RlcmVkXG4gICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBweDogbG9hZGVkLnB4IH1cbiAgICAgIDogZmlsdGVyVHJhbnNjcmlwdHMoXG4gICAgICAgICAgbG9hZGVkLm1lcmdlZCxcbiAgICAgICAgICBsb2FkZWQucHgsXG4gICAgICAgICAgaGlkZGVuLFxuICAgICAgICAgIGtpbmQgPT09ICdnZW5lcydcbiAgICAgICAgICAgID8gaGlkZGVuR2VuZVNsb3RzKHZpZXcpXG4gICAgICAgICAgICA6IGtpbmQgPT09ICdpbmRpdmlkdWFsJ1xuICAgICAgICAgICAgICA/IGhpZGRlbkFsbEdlbmVDb2Rlcyh2aWV3LCBhbGxHZW5lTmFtZXMpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgKTtcbiAgICBsZXQgeyBtZXJnZWQsIHB4IH0gPSBmaWx0ZXJlZDtcbiAgICBsZXQgc2VsZWN0aW9uQmluOiBudW1iZXIgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uYmluID8/IG51bGw7XG4gICAgbGV0IGVudHJ5R3JvdXA6IEludDMyQXJyYXkgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uZ3JvdXAgPz8gbnVsbDtcbiAgICBsZXQgZ3JvdXBOYW1lczogc3RyaW5nW10gfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8ubmFtZXMgPz8gbnVsbDtcbiAgICBpZiAobG9hZGVkLmxhZGRlcikge1xuICAgICAgY29uc3QgZyA9IGdyb3VwU2VsZWN0aW9uKG1lcmdlZCwgdmlldywgbG9hZGVkLmxhZGRlciwgcHhQZXJVbml0KTtcbiAgICAgIGlmIChnKSAoeyBtZXJnZWQsIHB4LCBiaW46IHNlbGVjdGlvbkJpbiwgZ3JvdXA6IGVudHJ5R3JvdXAsIG5hbWVzOiBncm91cE5hbWVzIH0gPSBnKTtcbiAgICB9XG4gICAgY29uc3QgY29sb3JWaWV3ID0gY29sb3JWaWV3Rm9yKHZpZXcsIGtpbmQsICEhbG9hZGVkLmNsdXN0ZXJlZCwgY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldykgIT09IG51bGwpO1xuICAgIC8vIEVhY2ggZW50cnkncyBjbHVzdGVyOiBpdHMgbWFya2VyJ3MgZ3JvdXAsIG9yIHRoZSBnZW5lLXRyZWUgZ3JvdXAgaXRzIGdlbmUgaXMgaW4uXG4gICAgY29uc3QgZ2VuZUNsdXN0ZXIgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcy5tYXAoXG4gICAgICAoZykgPT4gdmlldy50cmFuc2NyaXB0R2VuZUdyb3Vwcy5maW5kKCh4KSA9PiB4LmdlbmVzLmluY2x1ZGVzKGcpKT8ubmFtZSA/PyBnLFxuICAgICk7XG4gICAgY29uc3QgY2x1c3Rlck9mID0gKGk6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT5cbiAgICAgIGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lcyA/IChncm91cE5hbWVzW2VudHJ5R3JvdXBbaV1dID8/IG51bGwpIDogKGdlbmVDbHVzdGVyW21lcmdlZC5nZW5lW2ldXSA/PyBudWxsKTtcbiAgICBjb25zdCByZ2JhID0gYXdhaXQgdGhpcy50cmFuc2NyaXB0Q29sb3JzKGRhdGFzZXQsIGNvbG9yVmlldywgbWVyZ2VkLCBraW5kID09PSAnZ2VuZXMnID8gY2x1c3Rlck9mIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCB0eXBlQ29sdW1uID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgY29uc3QgdHlwZXMgPSB0eXBlQ29sdW1uID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXModHlwZUNvbHVtbikuY2F0Y2goKCkgPT4gbnVsbCkgOiBudWxsO1xuICAgIC8vIE5vdGhpbmcgaXMgcmVjb3JkZWQgYmVmb3JlIHRoZSBsYXN0IGF3YWl0OiBhIHN1cGVyc2VkZWQgcGxhbiB0aGF0IGhhZCBhbHJlYWR5IGtleWVkIHRoZVxuICAgIC8vIGdyb3VwIHdvdWxkIG1ha2UgdGhlIG5ld2VyIHBsYW4gb2YgdGhlIHNhbWUgdmlldyB0YWtlIHRoZSBvbGQgbGF5ZXIgZm9yIGl0cyBvd24uXG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG5cbiAgICBpZiAoY3R4LmluY29tcGxldGUpIHRoaXMuZ3JvdXBzLmZvcmdldEtleSgndHJhbnNjcmlwdHMnKTtcbiAgICBlbHNlIHRoaXMuZ3JvdXBzLnNldEtleSgndHJhbnNjcmlwdHMnLCBwbGFuS2V5KTtcbiAgICBjb25zdCBkaWFtID0gcHgubWFwKChkKSA9PiBkIC8gcHhQZXJVbml0KTtcbiAgICBjb25zdCByZWYgPSBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IHBsYWNlOiBQbGFjZW1lbnQgPSB7IHNjYWxlOiByZWY/LnNjYWxlID8/IFsxLCAxXSwgdHJhbnNsYXRlOiByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF0gfTtcbiAgICBjb25zdCBsYXllciA9XG4gICAgICBtb2RlID09PSAnY2lyY2xlcydcbiAgICAgICAgPyAvLyBBIGRhcmsgcmltOiBhIHRyYW5zY3JpcHQgY29sb3VyZWQgYnkgaXRzIGNlbGwncyB0eXBlIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBjb2xvdXIgYXNcbiAgICAgICAgICAvLyB0aGUgY2VsbCBmaWxsIGl0IHNpdHMgb24sIGFuZCB2YW5pc2hlcyBpbnRvIGl0LlxuICAgICAgICAgIHRoaXMuZHJhd1RyYW5zY3JpcHRzKG1lcmdlZCwgZGlhbSwgcmdiYSwgdmlldywgcGxhY2UsIG51bGwsIDAuMTggKiBtZWRpYW4oZGlhbSkpXG4gICAgICAgIDogdGhpcy5kcmF3VHJhbnNjcmlwdEdseXBocyhtZXJnZWQsIGRpYW0sIHJnYmEsIHZpZXcsIHBsYWNlLCBweFBlclVuaXQpO1xuICAgIHRoaXMuaG92ZXIuc2V0RHJhd24oXG4gICAgICB7XG4gICAgICAgIGtpbmQsXG4gICAgICAgIGJpbjogc2VsZWN0aW9uQmluXG4gICAgICAgICAgPyB7IHNpemU6IHNlbGVjdGlvbkJpbiwgb3JpZ2luOiBsb2FkZWQuY2x1c3RlcmVkPy5vcmlnaW4gPz8gWzAsIDBdIH1cbiAgICAgICAgICA6IGxvYWRlZC5raW5kXG4gICAgICAgICAgICA/IGxvYWRlZC5iaW5cbiAgICAgICAgICAgIDogam9iLmJpbixcbiAgICAgICAgbWVyZ2VkLFxuICAgICAgICBsYXllcixcbiAgICAgICAgZ2VuZXM6IGtpbmQgPT09ICdpbmRpdmlkdWFsJyA/IChhbGxHZW5lTmFtZXMgPz8gW10pIDogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSxcbiAgICAgICAgLi4uKGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lcyA/IHsgZW50cnlHcm91cCwgZ3JvdXBOYW1lcyB9IDoge30pLFxuICAgICAgICAuLi4obG9hZGVkLmNsdXN0ZXJlZCA/IHsgZ3JvdXBHZW5lczogbG9hZGVkLmNsdXN0ZXJlZC5nZW5lcyB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIGRhdGFzZXQubWljcm9uc1BlclVuaXQgPz8gbnVsbCxcbiAgICApO1xuICAgIHRoaXMuaG92ZXIuc2V0VHlwZXModHlwZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmUgaWNvbnM6IGVhY2ggZW50cnkgZHJhd24gYXMgaXRzIGdlbmUncyBuYXBhcmktanMgcG9pbnQgc3ltYm9sLCBpbiB0aGUgc2FtZSBvbmUgcG9pbnRzXG4gICAqIGxheWVyIGFzIHRoZSBjaXJjbGVzLiBXaXRoIGV2ZXJ5IGdlbmUgZHJhd24gdGhlcmUgaXMgb25lIGljb24gZm9yIGFsbCBvZiB0aGVtIOKAlCAxOCwwMDBcbiAgICogc2hhcGVzIHdvdWxkIHNheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VHJhbnNjcmlwdEdseXBocyhcbiAgICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBkaWFtOiBGbG9hdDMyQXJyYXksXG4gICAgcmdiYTogRmxvYXQzMkFycmF5LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgcGxhY2U6IFBsYWNlbWVudCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgKTogUG9pbnRzTGF5ZXIge1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgY29uc3QgZ2x5cGhGb3IgPSAoc2xvdDogbnVtYmVyKTogVHJhbnNjcmlwdEdseXBoID0+XG4gICAgICAodmlldy50cmFuc2NyaXB0R2x5cGhzW2dlbmVzW3Nsb3RdXSBhcyBUcmFuc2NyaXB0R2x5cGggfCB1bmRlZmluZWQpID8/IGRlZmF1bHRHbHlwaEZvcihzbG90KTtcbiAgICBjb25zdCBzaW5nbGUgPSB2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc1xuICAgICAgPyAoKHZpZXcudHJhbnNjcmlwdEdseXBoc1tBTExfR0VORVNdIGFzIFRyYW5zY3JpcHRHbHlwaCB8IHVuZGVmaW5lZCkgPz8gJ2NpcmNsZScpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qgc2xvdHMgPSBzaW5nbGUgPyBbc2luZ2xlXSA6IGdlbmVzLm1hcCgoX2csIHNsb3QpID0+IGdseXBoRm9yKHNsb3QpKTtcbiAgICBjb25zdCBjb2RlcyA9IHNsb3RzLm1hcCgoZykgPT4gcG9pbnRTeW1ib2xDb2RlKEdMWVBIX1NZTUJPTFNbZ10pKTtcbiAgICBjb25zdCBzaXplcyA9IHNsb3RzLm1hcCgoZykgPT4gR0xZUEhfU0laRVtnXSA/PyAxKTtcbiAgICBjb25zdCBzeW1ib2xzID0gbmV3IFVpbnQ4QXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICBjb25zdCBzaXplID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBzaW5nbGUgPyAwIDogbWVyZ2VkLmdlbmVbaV07XG4gICAgICBzeW1ib2xzW2ldID0gY29kZXNbc2xvdF07XG4gICAgICBzaXplW2ldID0gZGlhbVtpXSAqIHNpemVzW3Nsb3RdO1xuICAgIH1cbiAgICAvLyBBIGRhcmsgcmltLCBvbmUgc2NyZWVuIHBpeGVsIHdpZGUsIGtlZXBzIGEgZmV3IGxhcmdlIGljb25zIHJlYWRhYmxlIG92ZXIgdGhlIHRpc3N1ZTsgb25cbiAgICAvLyBtYW55IHNtYWxsIG9uZXMgdGhlIHJpbXMgbWVyZ2UgaW50byBhIHNvbGlkIGRhcmsgc2hlZXQgdGhhdCBoaWRlcyBldmVyeSBjb2xvdXIsIHNvIHRoZXlcbiAgICAvLyBhcmUgbGVmdCBvZmYuXG4gICAgY29uc3QgbWVkaWFuUHggPSBtZWRpYW4oZGlhbSkgKiBweFBlclVuaXQ7XG4gICAgY29uc3QgcmltID0gbWVyZ2VkLmNvdW50ID4gR0xZUEhfT1VUTElORV9NQVggfHwgbWVkaWFuUHggPCBHTFlQSF9PVVRMSU5FX01JTl9QWCA/IDAgOiAxIC8gcHhQZXJVbml0O1xuICAgIHJldHVybiB0aGlzLmRyYXdUcmFuc2NyaXB0cyhtZXJnZWQsIHNpemUsIHJnYmEsIHZpZXcsIHBsYWNlLCBzeW1ib2xzLCByaW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbmUgdHJhbnNjcmlwdHMgbGF5ZXI6IGEgbWFya2VyIHBlciBlbnRyeSwgYHNpemVgIHNheWluZyBob3cgbWFueSB0cmFuc2NyaXB0cyBpdCBzdGFuZHNcbiAgICogZm9yLCBkcmF3biBhcyB0aGUgbGF5ZXIncyBkaXNjIG9yIGFzIGVhY2ggZW50cnkncyBgc3ltYm9sc2AgY29kZS5cbiAgICovXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRzKFxuICAgIG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICAgIHNpemU6IEZsb2F0MzJBcnJheSxcbiAgICByZ2JhOiBGbG9hdDMyQXJyYXksXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICB7IHNjYWxlLCB0cmFuc2xhdGUgfTogUGxhY2VtZW50LFxuICAgIHN5bWJvbHM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuICAgIGJvcmRlcldpZHRoOiBudW1iZXIsXG4gICk6IFBvaW50c0xheWVyIHtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIHBvc2l0aW9uc1syICogaV0gPSBtZXJnZWQueFtpXTtcbiAgICAgIHBvc2l0aW9uc1syICogaSArIDFdID0gbWVyZ2VkLnlbaV07XG4gICAgfVxuICAgIGNvbnN0IGxheWVyID0gdGhpcy5ncm91cHMudmlld2VyIS5hZGRQb2ludHMocG9zaXRpb25zLCB7XG4gICAgICBuYW1lOiAndHJhbnNjcmlwdHMnLFxuICAgICAgc2l6ZSxcbiAgICAgIGZhY2VDb2xvcjogcmdiYSxcbiAgICAgIGJvcmRlckNvbG9yOiBSSU1fQ09MT1IsXG4gICAgICBib3JkZXJXaWR0aCxcbiAgICAgIHN5bWJvbHMsXG4gICAgICBvcGFjaXR5OiB2aWV3LnRyYW5zY3JpcHRPcGFjaXR5LFxuICAgICAgc2NhbGUsXG4gICAgICB0cmFuc2xhdGUsXG4gICAgfSk7XG4gICAgdGhpcy5ncm91cHMucmVwbGFjZSgndHJhbnNjcmlwdHMnLCBsYXllcik7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLyoqIFBlci1lbnRyeSBjb2xvdXJzLCBhcyBwYWNrZWQgUkdCQS4gKi9cbiAgcHJpdmF0ZSBhc3luYyB0cmFuc2NyaXB0Q29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgdDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICAgIGNsdXN0ZXJPZj86IChpOiBudW1iZXIpID0+IHN0cmluZyB8IG51bGwsXG4gICk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgbGV0IHJnYjogUmdiW107XG4gICAgbGV0IGNvZGVPZjogKGk6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIGlmICh2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2x1c3RlcicgJiYgY2x1c3Rlck9mKSB7XG4gICAgICAvLyBBIGNsdXN0ZXIgbmFtZWQgbGlrZSBhIGdyb3VwIG9mIHRoZSBjZWxscycgZ3JvdXBpbmcgdGFrZXMgdGhhdCBncm91cCdzIGNvbG91ciwgc28gYVxuICAgICAgLy8gY2x1c3RlcidzIHRyYW5zY3JpcHRzIGFuZCBpdHMgY2VsbHMgYWdyZWU7IGFueSBvdGhlciBjbHVzdGVyIHRha2VzIGEgcGFsZXR0ZSBjb2xvdXIuXG4gICAgICBjb25zdCBuYW1lID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgICBjb25zdCBjb2RlcyA9IG5hbWUgPyBhd2FpdCB0aGlzLmxvb2t1cC5jb2RlcyhuYW1lKS5jYXRjaCgoKSA9PiBudWxsKSA6IG51bGw7XG4gICAgICBjb25zdCBjZWxsQ29sb3IgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgaWYgKGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvZGVzLm1ldGEpO1xuICAgICAgICBjb2Rlcy5tZXRhLmNhdGVnb3JpZXMuZm9yRWFjaCgoYywgaykgPT4gY2VsbENvbG9yLnNldChjLCBjb2xvcnNba10pKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbG9ycyA9IGNsdXN0ZXJDb2xvck1hcChcbiAgICAgICAgdmlldy50cmFuc2NyaXB0R2VuZXMsXG4gICAgICAgIHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMsXG4gICAgICAgIGNlbGxDb2xvcixcbiAgICAgICAgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGNvbnN0IGhleDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGNvZGVGb3IgPSAoY2x1c3Rlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBrID0gaW5kZXguZ2V0KGNsdXN0ZXIpO1xuICAgICAgICBpZiAoayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgayA9IGhleC5sZW5ndGg7XG4gICAgICAgICAgaW5kZXguc2V0KGNsdXN0ZXIsIGspO1xuICAgICAgICAgIGhleC5wdXNoKGNvbG9ycy5nZXQoY2x1c3RlcikgPz8gY2VsbENvbG9yLmdldChjbHVzdGVyKSA/PyBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEVbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvZGUgPSBuZXcgSW50MzJBcnJheSh0LmNvdW50KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBjbHVzdGVyT2YoaSk7XG4gICAgICAgIGNvZGVbaV0gPSBjID09PSBudWxsID8gLTEgOiBjb2RlRm9yKGMpO1xuICAgICAgfVxuICAgICAgcmdiID0gaGV4Lm1hcChwYXJzZUhleCk7XG4gICAgICBjb2RlT2YgPSAoaSkgPT4gY29kZVtpXTtcbiAgICB9IGVsc2UgaWYgKHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdnZW5lJyB8fCB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnY2x1c3RlcicpIHtcbiAgICAgIC8vIEFsbCBnZW5lczogY29kZXMgYXJlIHRoZSBkYXRhc2V0J3MgZ2VuZSBpbmRpY2VzLCBjb2xvdXJlZCBieSBuYW1lIHdoZW4gdGhlIGRhdGFzZXRcbiAgICAgIC8vIGxpc3RzIHRoZW0gKHNvIGEgZ2VuZSdzIGNob3NlbiBjb2xvdXIgYXBwbGllcyksIGVsc2UgZm9sZGVkIG9udG8gdGhlIHBhbGV0dGUuXG4gICAgICBjb25zdCBuYW1lcyA9IHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzID8gKGRhdGFzZXQudHJhbnNjcmlwdFRpbGVzPy5nZW5lcyA/PyBudWxsKSA6IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgICAgY29uc3QgbiA9IG5hbWVzID8gbmFtZXMubGVuZ3RoIDogREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLmxlbmd0aDtcbiAgICAgIHJnYiA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKF9nLCBpKSA9PlxuICAgICAgICBwYXJzZUhleChcbiAgICAgICAgICAobmFtZXMgJiYgdmlldy50cmFuc2NyaXB0R2VuZUNvbG9yc1tuYW1lc1tpXV0pIHx8XG4gICAgICAgICAgICBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEVbaSAlIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURS5sZW5ndGhdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGNvZGVPZiA9IG5hbWVzID8gKGkpID0+ICh0LmdlbmVbaV0gPCBuID8gdC5nZW5lW2ldIDogLTEpIDogKGkpID0+IHQuZ2VuZVtpXSAlIG47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KTtcbiAgICAgIGNvbnN0IGNvZGVzID0gbmFtZSA/IGF3YWl0IHRoaXMubG9va3VwLmNvZGVzKG5hbWUpIDogbnVsbDtcbiAgICAgIHJnYiA9IGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgPyByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29kZXMubWV0YSkubWFwKHBhcnNlSGV4KSA6IFtdO1xuICAgICAgY29kZU9mID0gKGkpID0+IHtcbiAgICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICAgIGlmICghY29kZXMgfHwgbyA9PT0gTk9fT0JTRVJWQVRJT04pIHJldHVybiAtMTtcbiAgICAgICAgY29uc3QgYyA9IGNvZGVzLmNvZGVzW29dO1xuICAgICAgICByZXR1cm4gYyA9PT0gTk9fQ0FURUdPUlkgPyAtMSA6IGM7XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZ2JhID0gbmV3IEZsb2F0MzJBcnJheSh0LmNvdW50ICogNCk7XG4gICAgY29uc3QgdHVwbGVzOiBSR0JBW10gPSByZ2IubWFwKChbciwgZywgYl0pID0+IFtyIC8gMjU1LCBnIC8gMjU1LCBiIC8gMjU1LCAxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSBjb2RlT2YoaSk7XG4gICAgICByZ2JhLnNldChjIDwgMCA/IFVOQVNTSUdORURfUkdCQSA6IHR1cGxlc1tjXSwgaSAqIDQpO1xuICAgIH1cbiAgICByZXR1cm4gcmdiYTtcbiAgfVxufVxuIl19
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjcmlwdC1sYXllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvc3BhdGlhbC10aWxlcy90cmFuc2NyaXB0LWxheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FHZixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsUUFBUSxHQUNULE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFZLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBbUIsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBS3BGLE9BQU8sRUFBaUQsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEcsMkZBQTJGO0FBQzNGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRS9CLGdDQUFnQztBQUNoQyxNQUFNLFNBQVMsR0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWhEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQW1EO0lBQzNFLE1BQU0sRUFBRSxNQUFNO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixRQUFRLEVBQUUsYUFBYTtJQUN2QixNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztJQUNkLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLGVBQWUsRUFBRSxlQUFlO0lBQ2hDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLENBQUMsRUFBRSxHQUFHO0NBQ1AsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxHQUF1RCxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUV2Rjs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixPQUF1QixFQUN2QixJQUFzQixFQUN0QixHQUFrQixFQUNsQixTQUFpQixFQUNqQixLQUF1QyxFQUN2QyxZQUFvQjtJQUVwQixPQUFPO1FBQ0wsWUFBWTtRQUNaLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzVCLElBQUksQ0FBQyxjQUFjO1FBQ25CLEdBQUcsQ0FBQyxHQUFHO1FBQ1AsSUFBSSxDQUFDLGlCQUFpQjtRQUN0QixpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlO1FBQ3BCLElBQUksQ0FBQyxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDckMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDekMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDO0tBQ25FLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxNQUFNLFVBQVUsWUFBWSxDQUMxQixJQUFzQixFQUN0QixJQUFvQixFQUNwQixTQUFrQixFQUNsQixZQUFxQjtJQUVyQix1RkFBdUY7SUFDdkYseUZBQXlGO0lBQ3pGLGdFQUFnRTtJQUNoRSxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFVBQVU7UUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDaEgsMkZBQTJGO0lBQzNGLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxVQUFVO1FBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3pHLGtGQUFrRjtJQUNsRixJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzlFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBUUQsTUFBTSxlQUFlLEdBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV2RDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFJM0IsWUFDbUIsTUFBcUMsRUFDckMsSUFBMEIsRUFDMUIsTUFBeUIsRUFDekIsS0FBc0I7UUFIdEIsV0FBTSxHQUFOLE1BQU0sQ0FBK0I7UUFDckMsU0FBSSxHQUFKLElBQUksQ0FBc0I7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDekIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFQekMseUVBQXlFO1FBQ2pFLGdCQUFXLEdBQThELElBQUksQ0FBQztRQThOdEYsMkZBQTJGO1FBQ25GLGtCQUFhLEdBQWdDLElBQUksQ0FBQztRQUNsRCxzQkFBaUIsR0FBRyxDQUFDLENBQUM7SUF6TjNCLENBQUM7SUFFSjs7O09BR0c7SUFDSCxZQUFZLENBQUMsSUFBYztRQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQztRQUN2QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLO1lBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRTtnQkFBRSxTQUFTO1lBQ25GLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxJQUFJLEtBQUssU0FBUztnQkFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FDUixPQUF1QixFQUN2QixJQUFzQixFQUN0QixJQUFjLEVBQ2QsU0FBaUIsRUFDakIsR0FBZ0IsRUFDaEIsUUFBMEMsSUFBSSxFQUM5QyxZQUF5QyxJQUFJO1FBRTdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDbkYsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFBRSxPQUFPO1FBQ3hCLDZGQUE2RjtRQUM3Riw2RkFBNkY7UUFDN0Ysc0ZBQXNGO1FBQ3RGLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0Qsc0ZBQXNGO1FBQ3RGLHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsK0ZBQStGO1FBQy9GLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDO1FBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVztZQUNkLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDbkMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQzdELENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLFlBQVk7b0JBQ3JDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUU7b0JBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDYixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFBRSxPQUFPO1FBQ3hCLGtGQUFrRjtRQUNsRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUztZQUMvQixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxDQUFDLENBQUMsaUJBQWlCLENBQ2YsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsRUFBRSxFQUNULE1BQU0sRUFDTixJQUFJLEtBQUssT0FBTztnQkFDZCxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZO29CQUNyQixDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztvQkFDeEMsQ0FBQyxDQUFDLElBQUksQ0FDWCxDQUFDO1FBQ04sSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FDaEIsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakcsSUFBSSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQztRQUNoRSxJQUFJLFVBQVUsR0FBc0IsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ3BFLElBQUksVUFBVSxHQUFvQixNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDbEUsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUM7Z0JBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzFHLG1GQUFtRjtRQUNuRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FDMUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FDN0UsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBUyxFQUFpQixFQUFFLENBQzdDLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDekcsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRyxpR0FBaUc7UUFDakcseURBQXlEO1FBQ3pELG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUcsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RiwwRkFBMEY7UUFDMUYsbUZBQW1GO1FBQ25GLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUFFLE9BQU87UUFFeEIsSUFBSSxHQUFHLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlGLE1BQU0sS0FBSyxHQUNULElBQUksS0FBSyxTQUFTO1lBQ2hCLENBQUMsQ0FBQyx1RkFBdUY7Z0JBQ3ZGLGtEQUFrRDtnQkFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDakI7WUFDRSxJQUFJO1lBQ0osR0FBRyxFQUFFLFlBQVk7Z0JBQ2YsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSTtvQkFDWCxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUc7b0JBQ1osQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHO1lBQ2IsTUFBTTtZQUNOLEtBQUs7WUFDTCxLQUFLLEVBQUUsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQy9FLEdBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9ELEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDcEUsRUFDRCxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUksQ0FDL0IsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssb0JBQW9CLENBQzFCLE1BQTZCLEVBQzdCLElBQWtCLEVBQ2xCLElBQWtCLEVBQ2xCLElBQXNCLEVBQ3RCLEtBQWdCLEVBQ2hCLFNBQWlCO1FBRWpCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFZLEVBQW1CLEVBQUUsQ0FDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBaUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjtZQUNwQyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFpQyxJQUFJLFFBQVEsQ0FBQztZQUNqRixDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsMEZBQTBGO1FBQzFGLGdCQUFnQjtRQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLElBQUksUUFBUSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDcEcsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlLENBQ3JCLE1BQTZCLEVBQzdCLElBQWtCLEVBQ2xCLElBQWtCLEVBQ2xCLElBQXNCLEVBQ3RCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYSxFQUMvQixPQUEwQixFQUMxQixXQUFtQjtRQUVuQixNQUFNLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7WUFDckQsSUFBSSxFQUFFLGFBQWE7WUFDbkIsSUFBSTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsV0FBVyxFQUFFLFNBQVM7WUFDdEIsV0FBVztZQUNYLE9BQU87WUFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUMvQixLQUFLO1lBQ0wsU0FBUztTQUNWLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFNTyxZQUFZLENBQUMsU0FBc0M7UUFDekQsTUFBTSxJQUFJLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRSxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRCx5Q0FBeUM7SUFDakMsS0FBSyxDQUFDLGdCQUFnQixDQUM1QixPQUF1QixFQUN2QixJQUFzQixFQUN0QixDQUF3QixFQUN4QixTQUF3QztRQUV4QyxJQUFJLEdBQVUsQ0FBQztRQUNmLElBQUksTUFBNkIsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLElBQUksU0FBUyxFQUFFLENBQUM7WUFDdEQsc0ZBQXNGO1lBQ3RGLHVGQUF1RjtZQUN2RixNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVFLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBQzVDLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3JFLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FDNUIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixTQUFTLEVBQ1QsMkJBQTJCLENBQzVCLENBQUM7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztZQUN4QyxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7WUFDekIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BCLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUNmLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSwyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RixDQUFDO2dCQUNELE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDO1lBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JGLHFGQUFxRjtZQUNyRixnRkFBZ0Y7WUFDaEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3hHLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDO1lBQ3BFLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3hDLFFBQVEsQ0FDTixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLDJCQUEyQixDQUFDLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FDdEUsQ0FDRixDQUFDO1lBQ0YsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxRCxHQUFHO2dCQUNELElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhO29CQUN4QyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7b0JBQ3JFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDYixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxjQUFjO29CQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcG9pbnRTeW1ib2xDb2RlIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRTeW1ib2wsIFBvaW50c0xheWVyLCBSR0JBIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHR5cGUgeyBSZ2IgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IEFMTF9HRU5FUyB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuICBjYXRlZ29yeUNvbG9yc0ZvcixcbiAgZmFkZU91dHNpZGVTZWxlY3Rpb24sXG4gIGdyb3VwQ29sb3JzS2V5LFxuICBwYXJzZUhleCxcbn0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfSBmcm9tICcuLi8uLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IERhdGFSZWN0LCBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvbG9kJztcbmltcG9ydCB7IGNsdXN0ZXJDb2xvck1hcCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvdHJhbnNjcmlwdC1ncm91cGluZyc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0R2x5cGgsIGRlZmF1bHRHbHlwaEZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvZ2x5cGhzJztcbmltcG9ydCB7XG4gIGZpbHRlclRyYW5zY3JpcHRzLFxuICBoaWRkZW5BbGxHZW5lQ29kZXMsXG4gIGhpZGRlbkdlbmVTbG90cyxcbiAgbWVkaWFuLFxuICB0cmFuc2NyaXB0c0luQmFuZCxcbn0gZnJvbSAnLi4vLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGUtbWVyZ2UnO1xuaW1wb3J0IHsgZ2VuZUZpbHRlcktleSwgaGFzR2VuZUZpbHRlciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1nZW5lLWZpbHRlcic7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3JpY2FsTG9va3VwIH0gZnJvbSAnLi9jYXRlZ29yaWNhbC1sb29rdXAnO1xuaW1wb3J0IHR5cGUgeyBPcmRlcmVkTGF5ZXJHcm91cHMsIFRpbGVHcm91cCB9IGZyb20gJy4vbGF5ZXItZ3JvdXBzJztcbmltcG9ydCB0eXBlIHsgUGxhbkNvbnRleHQgfSBmcm9tICcuL3BsYW4tY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFRyYW5zY3JpcHRIb3ZlciwgVHJhbnNjcmlwdEtpbmQgfSBmcm9tICcuL3RyYW5zY3JpcHQtaG92ZXInO1xuaW1wb3J0IHsgdHlwZSBUcmFuc2NyaXB0Sm9iLCB0eXBlIFRyYW5zY3JpcHRKb2JQbGFubmVyLCBncm91cFNlbGVjdGlvbiB9IGZyb20gJy4vdHJhbnNjcmlwdC1qb2JzJztcblxuLyoqIEljb25zIGdldCBhIGRhcmsgcmltIG9ubHkgd2hpbGUgdGhlcmUgYXJlIGF0IG1vc3QgdGhpcyBtYW55LCBhdCBsZWFzdCB0aGlzIGJpZyAocHgpLiAqL1xuY29uc3QgR0xZUEhfT1VUTElORV9NQVggPSAyMF8wMDA7XG5jb25zdCBHTFlQSF9PVVRMSU5FX01JTl9QWCA9IDg7XG5cbi8qKiBUaGUgZGFyayByaW0gb2YgYSBtYXJrZXIuICovXG5jb25zdCBSSU1fQ09MT1I6IFJHQkEgPSBbMC4wNCwgMC4wNCwgMC4wNSwgMC45XTtcblxuLyoqXG4gKiBUaGUgbmFwYXJpLWpzIHBvaW50IHN5bWJvbCBlYWNoIHRyYW5zY3JpcHQgaWNvbiBpcyBkcmF3biBhcy4gRXZlcnkgaWNvbiBoYXMgYSBjb3VudGVycGFydCBvZlxuICogdGhlIHNhbWUgb3V0bGluZSAoYGNpcmNsZWAgaXMgbmFwYXJpJ3MgYGRpc2NgKTsgc2VlIHtAbGluayBHTFlQSF9TSVpFfSBmb3IgdGhlIG9uZSB3aG9zZSBzaXplXG4gKiBkaWZmZXJzLlxuICovXG5leHBvcnQgY29uc3QgR0xZUEhfU1lNQk9MUzogUmVhZG9ubHk8UmVjb3JkPFRyYW5zY3JpcHRHbHlwaCwgUG9pbnRTeW1ib2w+PiA9IHtcbiAgY2lyY2xlOiAnZGlzYycsXG4gIHN0YXI6ICdzdGFyJyxcbiAgdHJpYW5nbGU6ICd0cmlhbmdsZV91cCcsXG4gIHNxdWFyZTogJ3NxdWFyZScsXG4gIGRpYW1vbmQ6ICdkaWFtb25kJyxcbiAgY3Jvc3M6ICdjcm9zcycsXG4gIGhleGFnb246ICdoZXhhZ29uJyxcbiAgJ3RyaWFuZ2xlLWRvd24nOiAndHJpYW5nbGVfZG93bicsXG4gIHBlbnRhZ29uOiAncGVudGFnb24nLFxuICB4OiAneCcsXG59O1xuXG4vKipcbiAqIE1hcmtlciBkaWFtZXRlciBwZXIgaWNvbiwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgZW50cnknczogbmFwYXJpJ3MgYHNxdWFyZWAgZmlsbHMgdGhlIG1hcmtlcidzXG4gKiB3aG9sZSBib3gsIHdoZXJlIHRoZSBpY29uIGl0IHJlcGxhY2VzIGhhZCBhIDAuOCBoYWxmLXNpZGUsIGFzIGhlYXZ5IGFzIHRoZSBvdGhlciBpY29ucy5cbiAqL1xuY29uc3QgR0xZUEhfU0laRTogUmVhZG9ubHk8UGFydGlhbDxSZWNvcmQ8VHJhbnNjcmlwdEdseXBoLCBudW1iZXI+Pj4gPSB7IHNxdWFyZTogMC44IH07XG5cbi8qKlxuICogV2hhdCBhIHRyYW5zY3JpcHQgcGxhbiBkcmF3cywgYXMgYSBrZXk6IGFuIHVuY2hhbmdlZCBvbmUgaXMgYSBuby1vcC4gTWFya2VyIHNpemVzIGZvbGxvdyB0aGVcbiAqIHpvb20sIHNvIHRoZSB6b29tIGlzIHBhcnQgb2YgaXQ7IGEgcGFuIHRoYXQga2VlcHMgdGhlIHNhbWUgdGlsZXMgb24gc2NyZWVuIGNoYW5nZXMgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gdHJhbnNjcmlwdFBsYW5LZXkoXG4gIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICBqb2I6IFRyYW5zY3JpcHRKb2IsXG4gIHB4UGVyVW5pdDogbnVtYmVyLFxuICB6QmFuZDogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSB8IG51bGwsXG4gIHNlbGVjdGlvblJldjogbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBzZWxlY3Rpb25SZXYsXG4gICAgZGF0YXNldC5pZCxcbiAgICB6QmFuZCA/IHpCYW5kLmpvaW4oJywnKSA6ICcnLFxuICAgIHZpZXcudHJhbnNjcmlwdE1vZGUsXG4gICAgam9iLmtleSxcbiAgICB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5LFxuICAgIGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpLFxuICAgIHZpZXcudHJhbnNjcmlwdFNjYWxlLFxuICAgIHZpZXcudHJhbnNjcmlwdE9wYWNpdHksXG4gICAgSlNPTi5zdHJpbmdpZnkodmlldy50cmFuc2NyaXB0R2x5cGhzKSxcbiAgICBweFBlclVuaXQudG9QcmVjaXNpb24oNCksXG4gICAgdmlldy5oaWRkZW5Hcm91cHMuam9pbignXFx1MDAwMScpLFxuICAgIGdlbmVGaWx0ZXJLZXkodmlldyksXG4gICAgdmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMuam9pbignLCcpLFxuICAgIHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuLmpvaW4oJywnKSxcbiAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHZW5lQ29sb3JzKSxcbiAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzKSxcbiAgICBncm91cENvbG9yc0tleShjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KSwgdmlldy5ncm91cENvbG9ycyksXG4gIF0uam9pbignfCcpO1xufVxuXG4vKiogVGhlIHZpZXcgdGhlIG1hcmtlcnMgYXJlIGNvbG91cmVkIGJ5LCBmb3Igd2hhdCB3YXMgbG9hZGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yVmlld0ZvcihcbiAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAga2luZDogVHJhbnNjcmlwdEtpbmQsXG4gIGNsdXN0ZXJlZDogYm9vbGVhbixcbiAgaGFzQ2VsbFR5cGVzOiBib29sZWFuLFxuKTogU3BhdGlhbFZpZXdTdGF0ZSB7XG4gIC8vIEEgYmluIG9mIHRoZSBhbGwtZ2VuZSBweXJhbWlkIG1peGVzIGdlbmVzIGFuZCBjYXJyaWVzIG5vbmUsIHNvIGl0IGNhbm5vdCBiZSBjb2xvdXJlZFxuICAvLyBieSBnZW5lOiBjb2xvdXIgaXQgYnkgaXRzIGRvbWluYW50IGNlbGwncyB0eXBlIHVudGlsIGluZGl2aWR1YWwgdHJhbnNjcmlwdHMgc2hvdyAod2l0aFxuICAvLyBubyBjZWxsIHR5cGVzLCB0aGF0IGxlYXZlcyBldmVyeSBiaW4gdW5hc3NpZ25lZDogb25lIGNvbG91cikuXG4gIGlmIChraW5kID09PSAnYmlucycgJiYgdmlldy50cmFuc2NyaXB0Q29sb3JCeSAhPT0gJ2NlbGxUeXBlJykgcmV0dXJuIHsgLi4udmlldywgdHJhbnNjcmlwdENvbG9yQnk6ICdjZWxsVHlwZScgfTtcbiAgLy8gRGVuc2l0eS1ncmlkIG1hcmtlcnMgaGF2ZSBubyBjZWxsIHRvIHRha2UgYSB0eXBlIGZyb206IHRoZXkgdGFrZSB0aGVpciBjbHVzdGVyJ3MgY29sb3VyLlxuICBpZiAoY2x1c3RlcmVkICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjZWxsVHlwZScpIHJldHVybiB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnY2x1c3RlcicgfTtcbiAgLy8gTm8gY2VsbCB0eXBlcyB0byBjb2xvdXIgYnkgKHRoZSBwYW5lbCB0aGVuIGRvZXMgbm90IG9mZmVyIGl0KTogYnkgZ2VuZSBpbnN0ZWFkLlxuICBpZiAoIWhhc0NlbGxUeXBlcyAmJiBraW5kICE9PSAnYmlucycgJiYgdmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NlbGxUeXBlJykge1xuICAgIHJldHVybiB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnZ2VuZScgfTtcbiAgfVxuICByZXR1cm4gdmlldztcbn1cblxuLyoqIFdoZXJlIGEgbGF5ZXIgc2l0cyBpbiB3b3JsZCBzcGFjZTogdGhlIGRhdGFzZXQncyBhZmZpbmUgb250byBpdHMgdGlzc3VlIGltYWdlLiAqL1xuaW50ZXJmYWNlIFBsYWNlbWVudCB7XG4gIHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdO1xuICB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmNvbnN0IFVOQVNTSUdORURfUkdCQTogUkdCQSA9IFswLjYyLCAwLjYyLCAwLjYyLCAwLjU1XTtcblxuLyoqXG4gKiBUaGUgdHJhbnNjcmlwdCBtYXJrZXJzIG9mIHRoZSAyRCBzcGF0aWFsIHZpZXc6IHJ1bnMgdGhlIHBsYW5uZXIncyBqb2IsIGRyb3BzIGhpZGRlbiBncm91cHNcbiAqIGFuZCBnZW5lcywgZ3JvdXBzIGEgc2VsZWN0aW9uIHVuZGVyIHRoZSBtYXJrZXIgYnVkZ2V0LCBjb2xvdXJzIHRoZSBlbnRyaWVzIGFuZCBkcmF3cyB0aGVtIGFzXG4gKiBvbmUgcG9pbnRzIGxheWVyOiBzaXplZCBjaXJjbGVzLCBvciBnZW5lIGljb25zIGFzIHBlci1wb2ludCBzeW1ib2xzICh3aXRoIGEgZGFyayByaW0gd2hpbGVcbiAqIHRoZXJlIGFyZSBmZXcgZW5vdWdoKS5cbiAqXG4gKiBIYW5kcyB3aGF0IGl0IGRyZXcgdG8gdGhlIGhvdmVyIG9uZSB3YXkgKHtAbGluayBUcmFuc2NyaXB0SG92ZXIuc2V0RHJhd259KSwgYW5kIGtlZXBzIHRoZVxuICogbG9hZGVkIHBlci1nZW5lIHRyYW5zY3JpcHRzIHRoZSBpbi12aWV3IGdlbmUgY291bnRzIGFyZSB0YWtlbiBmcm9tLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNjcmlwdExheWVycyB7XG4gIC8qKiBUaGUgbG9hZGVkIHBlci1nZW5lIHRyYW5zY3JpcHRzIHRoZSBpbi12aWV3IGNvdW50cyBhcmUgdGFrZW4gZnJvbS4gKi9cbiAgcHJpdmF0ZSBjb3VudFNvdXJjZTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgZ2VuZXM6IHN0cmluZ1tdIH0gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwczogT3JkZXJlZExheWVyR3JvdXBzPFRpbGVHcm91cD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBqb2JzOiBUcmFuc2NyaXB0Sm9iUGxhbm5lcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cDogQ2F0ZWdvcmljYWxMb29rdXAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3ZlcjogVHJhbnNjcmlwdEhvdmVyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFRyYW5zY3JpcHRzIG9mIGVhY2ggc2VsZWN0ZWQgZ2VuZSBpbnNpZGUgYHJlY3RgOiBlYWNoIGVudHJ5IGNvdW50cyBmb3IgdGhlIHRyYW5zY3JpcHRzIGl0XG4gICAqIHN0YW5kcyBmb3IgKGFuIGFnZ3JlZ2F0ZSBhdCBhIGNvYXJzZSBsZXZlbCBob2xkcyBzZXZlcmFsKS4gTnVsbCB3aXRob3V0IHBlci1nZW5lIGRhdGEuXG4gICAqL1xuICBnZW5lQ291bnRzSW4ocmVjdDogRGF0YVJlY3QpOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbCB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5jb3VudFNvdXJjZTtcbiAgICBpZiAoIXNyYykgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBnIG9mIHNyYy5nZW5lcykgb3V0W2ddID0gMDtcbiAgICBjb25zdCB7IHgsIHksIHdlaWdodCwgZ2VuZSB9ID0gc3JjLm1lcmdlZDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5tZXJnZWQuY291bnQ7IGkrKykge1xuICAgICAgaWYgKHhbaV0gPCByZWN0LngwIHx8IHhbaV0gPiByZWN0LngxIHx8IHlbaV0gPCByZWN0LnkwIHx8IHlbaV0gPiByZWN0LnkxKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWUgPSBzcmMuZ2VuZXNbZ2VuZVtpXV07XG4gICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSBvdXRbbmFtZV0gKz0gd2VpZ2h0W2ldO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSB2aWV3ZXIgd2VudCBhd2F5OiBubyBjb3VudHMgdW50aWwgdGhlIG5leHQgcGxhbi4gKi9cbiAgZGV0YWNoZWQoKTogdm9pZCB7XG4gICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgdmlldydzIHRyYW5zY3JpcHQgbWFya2VycyAob3IgZHJvcCB0aGVtKTsgYW4gdW5jaGFuZ2VkIHBsYW4ga2V5IGlzIGEgbm8tb3AuIFdpdGggYVxuICAgKiBgekJhbmRgLCB0aGUgdmlldyBzaG93cyBvbmUgcGxhbmUgb2YgYSAzRCBhc3NheTogb25seSB0aGUgdHJhbnNjcmlwdHMgYXQgdGhhdCBkZXB0aCBhcmUgZHJhd25cbiAgICogKHN1bW1lZCBkZW5zaXR5IGdyaWRzIGFuZCBhZ2dyZWdhdGVzLCB3aGljaCBtaXggZGVwdGhzLCBzdGF5IHdob2xlKS5cbiAgICovXG4gIGFzeW5jIHBsYW4oXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICByZWN0OiBEYXRhUmVjdCxcbiAgICBweFBlclVuaXQ6IG51bWJlcixcbiAgICBjdHg6IFBsYW5Db250ZXh0LFxuICAgIHpCYW5kOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGwsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB8IG51bGwgPSBudWxsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtb2RlID0gdmlldy50cmFuc2NyaXB0TW9kZTtcbiAgICBjb25zdCBqb2IgPSB0aGlzLmpvYnMuam9iRm9yKGRhdGFzZXQsIHZpZXcsIHJlY3QsIHB4UGVyVW5pdCk7XG4gICAgaWYgKCFqb2IpIHtcbiAgICAgIHRoaXMuZ3JvdXBzLmRyb3AoJ3RyYW5zY3JpcHRzJyk7XG4gICAgICB0aGlzLmhvdmVyLmNsZWFyKCk7XG4gICAgICB0aGlzLmNvdW50U291cmNlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGxhbktleSA9IHRyYW5zY3JpcHRQbGFuS2V5KGRhdGFzZXQsIHZpZXcsIGpvYiwgcHhQZXJVbml0LCB6QmFuZCwgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSk7XG4gICAgaWYgKHBsYW5LZXkgPT09IHRoaXMuZ3JvdXBzLmtleSgndHJhbnNjcmlwdHMnKSAmJiB0aGlzLmdyb3Vwcy5zaG93bigndHJhbnNjcmlwdHMnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBjdHgudHJhY2soJ1RyYW5zY3JpcHRzJywgam9iLmxvYWQoY3R4KSk7XG4gICAgaWYgKGN0eC5zdGFsZSgpKSByZXR1cm47XG4gICAgLy8gTWFya2VycyBkcmF3biBmcm9tIHN1bW1lZCBkZW5zaXR5IGdyaWRzICh6b29tZWQgb3V0KSBjYXJyeSBubyBjZWxscywgc28gdGhleSBjYW5ub3QgZm9sbG93XG4gICAgLy8gdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyOiBkcmF3biwgdGhleSB3b3VsZCBzaG93IHRoZSB0cmFuc2NyaXB0cyBvZiB0aGUgY2VsbHMgaXQgaGlkZXMuXG4gICAgLy8gTm9uZSB3aGlsZSBpdCBpcyBvbjsgem9vbWVkIGluLCB0aGUgY2VsbC1hc3NpZ25lZCB0cmFuc2NyaXB0cyBhcmUgZmlsdGVyZWQgKGJlbG93KS5cbiAgICBpZiAobG9hZGVkLmNsdXN0ZXJlZCAmJiBoYXNHZW5lRmlsdGVyKHZpZXcpKSB7XG4gICAgICB0aGlzLmdyb3Vwcy5kcm9wKCd0cmFuc2NyaXB0cycpO1xuICAgICAgdGhpcy5ob3Zlci5jbGVhcigpO1xuICAgICAgdGhpcy5jb3VudFNvdXJjZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBlci1nZW5lIGNvdW50cyBpbiB2aWV3IGNvbWUgZnJvbSB3aGF0IHdhcyBsb2FkZWQsIGJlZm9yZSBoaWRkZW4gZ2VuZXMgYXJlIGRyb3BwZWQ6XG4gICAgLy8gYSBoaWRkZW4gZ2VuZSBzdGlsbCBoYXMgdHJhbnNjcmlwdHMgdGhlcmUuIFN1bW1lZCBkZW5zaXR5IGdyaWRzIChubyBwZXItZ2VuZSBsZXZlbHMsXG4gICAgLy8gem9vbWVkIG91dCkgaG9sZCBjbHVzdGVycywgbm90IGdlbmVzOiBubyBwZXItZ2VuZSBjb3VudHMgdGhlcmUsIHJhdGhlciB0aGFuIGEgZ3Vlc3MuXG4gICAgLy8gRXZlcnkgZ2VuZSdzIGluZGl2aWR1YWwgdHJhbnNjcmlwdHMgYXJlIGNvdW50ZWQgYnkgdGhlIGRhdGFzZXQncyBnZW5lIGxpc3QsIHdoZW4gaXQgaGFzIG9uZS5cbiAgICBjb25zdCBhbGxHZW5lTmFtZXMgPSBkYXRhc2V0LnRyYW5zY3JpcHRUaWxlcz8uZ2VuZXM7XG4gICAgY29uc3Qga2luZCA9IGxvYWRlZC5raW5kID8/IGpvYi5raW5kO1xuICAgIHRoaXMuY291bnRTb3VyY2UgPVxuICAgICAga2luZCA9PT0gJ2dlbmVzJyAmJiAhbG9hZGVkLmNsdXN0ZXJlZFxuICAgICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBnZW5lczogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSB9XG4gICAgICAgIDoga2luZCA9PT0gJ2luZGl2aWR1YWwnICYmIGFsbEdlbmVOYW1lc1xuICAgICAgICAgID8geyBtZXJnZWQ6IGxvYWRlZC5tZXJnZWQsIGdlbmVzOiBhbGxHZW5lTmFtZXMgfVxuICAgICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBoaWRkZW4gPSBhd2FpdCB0aGlzLmxvb2t1cC5oaWRkZW5Db2RlcyhkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAoY3R4LnN0YWxlKCkpIHJldHVybjtcbiAgICAvLyBEZW5zaXR5LWdyaWQgbWFya2VycyBjYXJyeSBubyBjZWxscyBhbmQgd2VyZSBidWlsdCBmcm9tIHRoZSB2aXNpYmxlIGdlbmVzIG9ubHkuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBsb2FkZWQuY2x1c3RlcmVkXG4gICAgICA/IHsgbWVyZ2VkOiBsb2FkZWQubWVyZ2VkLCBweDogbG9hZGVkLnB4IH1cbiAgICAgIDogZmlsdGVyVHJhbnNjcmlwdHMoXG4gICAgICAgICAgbG9hZGVkLm1lcmdlZCxcbiAgICAgICAgICBsb2FkZWQucHgsXG4gICAgICAgICAgaGlkZGVuLFxuICAgICAgICAgIGtpbmQgPT09ICdnZW5lcydcbiAgICAgICAgICAgID8gaGlkZGVuR2VuZVNsb3RzKHZpZXcpXG4gICAgICAgICAgICA6IGtpbmQgPT09ICdpbmRpdmlkdWFsJ1xuICAgICAgICAgICAgICA/IGhpZGRlbkFsbEdlbmVDb2Rlcyh2aWV3LCBhbGxHZW5lTmFtZXMpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgKTtcbiAgICBsZXQgeyBtZXJnZWQsIHB4IH0gPVxuICAgICAgbG9hZGVkLmNsdXN0ZXJlZCB8fCAhekJhbmQgPyBmaWx0ZXJlZCA6IHRyYW5zY3JpcHRzSW5CYW5kKGZpbHRlcmVkLm1lcmdlZCwgZmlsdGVyZWQucHgsIHpCYW5kKTtcbiAgICBsZXQgc2VsZWN0aW9uQmluOiBudW1iZXIgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uYmluID8/IG51bGw7XG4gICAgbGV0IGVudHJ5R3JvdXA6IEludDMyQXJyYXkgfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8uZ3JvdXAgPz8gbnVsbDtcbiAgICBsZXQgZ3JvdXBOYW1lczogc3RyaW5nW10gfCBudWxsID0gbG9hZGVkLmNsdXN0ZXJlZD8ubmFtZXMgPz8gbnVsbDtcbiAgICBpZiAobG9hZGVkLmxhZGRlcikge1xuICAgICAgY29uc3QgZyA9IGdyb3VwU2VsZWN0aW9uKG1lcmdlZCwgdmlldywgbG9hZGVkLmxhZGRlciwgcHhQZXJVbml0KTtcbiAgICAgIGlmIChnKSAoeyBtZXJnZWQsIHB4LCBiaW46IHNlbGVjdGlvbkJpbiwgZ3JvdXA6IGVudHJ5R3JvdXAsIG5hbWVzOiBncm91cE5hbWVzIH0gPSBnKTtcbiAgICB9XG4gICAgY29uc3QgY29sb3JWaWV3ID0gY29sb3JWaWV3Rm9yKHZpZXcsIGtpbmQsICEhbG9hZGVkLmNsdXN0ZXJlZCwgY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldykgIT09IG51bGwpO1xuICAgIC8vIEVhY2ggZW50cnkncyBjbHVzdGVyOiBpdHMgbWFya2VyJ3MgZ3JvdXAsIG9yIHRoZSBnZW5lLXRyZWUgZ3JvdXAgaXRzIGdlbmUgaXMgaW4uXG4gICAgY29uc3QgZ2VuZUNsdXN0ZXIgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcy5tYXAoXG4gICAgICAoZykgPT4gdmlldy50cmFuc2NyaXB0R2VuZUdyb3Vwcy5maW5kKCh4KSA9PiB4LmdlbmVzLmluY2x1ZGVzKGcpKT8ubmFtZSA/PyBnLFxuICAgICk7XG4gICAgY29uc3QgY2x1c3Rlck9mID0gKGk6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT5cbiAgICAgIGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lcyA/IChncm91cE5hbWVzW2VudHJ5R3JvdXBbaV1dID8/IG51bGwpIDogKGdlbmVDbHVzdGVyW21lcmdlZC5nZW5lW2ldXSA/PyBudWxsKTtcbiAgICBjb25zdCByZ2JhID0gYXdhaXQgdGhpcy50cmFuc2NyaXB0Q29sb3JzKGRhdGFzZXQsIGNvbG9yVmlldywgbWVyZ2VkLCBraW5kID09PSAnZ2VuZXMnID8gY2x1c3Rlck9mIDogdW5kZWZpbmVkKTtcbiAgICAvLyBBIHNlbGVjdGVkIGNlbGwgb3IgY2VsbCB0eXBlOiBpdHMgdHJhbnNjcmlwdHMgYXMgdGhleSBhcmUsIHRoZSBvdGhlcnMgZmFkZWQsIGFzIHRoZSBjZWxscyBhcmUuXG4gICAgLy8gRGVuc2l0eS1ncmlkIG1hcmtlcnMgY2Fycnkgbm8gY2VsbHMsIHNvIHRoZXkgYWxsIGZhZGUuXG4gICAgZmFkZU91dHNpZGVTZWxlY3Rpb24ocmdiYSwgbWVyZ2VkLmNvdW50LCAoaSkgPT4gKGxvYWRlZC5jbHVzdGVyZWQgPyAtMSA6IG1lcmdlZC5vYnNlcnZhdGlvbltpXSksIHNlbGVjdGlvbik7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgIGNvbnN0IHR5cGVzID0gdHlwZUNvbHVtbiA/IGF3YWl0IHRoaXMubG9va3VwLmNvZGVzKHR5cGVDb2x1bW4pLmNhdGNoKCgpID0+IG51bGwpIDogbnVsbDtcbiAgICAvLyBOb3RoaW5nIGlzIHJlY29yZGVkIGJlZm9yZSB0aGUgbGFzdCBhd2FpdDogYSBzdXBlcnNlZGVkIHBsYW4gdGhhdCBoYWQgYWxyZWFkeSBrZXllZCB0aGVcbiAgICAvLyBncm91cCB3b3VsZCBtYWtlIHRoZSBuZXdlciBwbGFuIG9mIHRoZSBzYW1lIHZpZXcgdGFrZSB0aGUgb2xkIGxheWVyIGZvciBpdHMgb3duLlxuICAgIGlmIChjdHguc3RhbGUoKSkgcmV0dXJuO1xuXG4gICAgaWYgKGN0eC5pbmNvbXBsZXRlKSB0aGlzLmdyb3Vwcy5mb3JnZXRLZXkoJ3RyYW5zY3JpcHRzJyk7XG4gICAgZWxzZSB0aGlzLmdyb3Vwcy5zZXRLZXkoJ3RyYW5zY3JpcHRzJywgcGxhbktleSk7XG4gICAgY29uc3QgZGlhbSA9IHB4Lm1hcCgoZCkgPT4gZCAvIHB4UGVyVW5pdCk7XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBwbGFjZTogUGxhY2VtZW50ID0geyBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdIH07XG4gICAgY29uc3QgbGF5ZXIgPVxuICAgICAgbW9kZSA9PT0gJ2NpcmNsZXMnXG4gICAgICAgID8gLy8gQSBkYXJrIHJpbTogYSB0cmFuc2NyaXB0IGNvbG91cmVkIGJ5IGl0cyBjZWxsJ3MgdHlwZSBpcyBvdGhlcndpc2UgdGhlIHNhbWUgY29sb3VyIGFzXG4gICAgICAgICAgLy8gdGhlIGNlbGwgZmlsbCBpdCBzaXRzIG9uLCBhbmQgdmFuaXNoZXMgaW50byBpdC5cbiAgICAgICAgICB0aGlzLmRyYXdUcmFuc2NyaXB0cyhtZXJnZWQsIGRpYW0sIHJnYmEsIHZpZXcsIHBsYWNlLCBudWxsLCAwLjE4ICogbWVkaWFuKGRpYW0pKVxuICAgICAgICA6IHRoaXMuZHJhd1RyYW5zY3JpcHRHbHlwaHMobWVyZ2VkLCBkaWFtLCByZ2JhLCB2aWV3LCBwbGFjZSwgcHhQZXJVbml0KTtcbiAgICB0aGlzLmhvdmVyLnNldERyYXduKFxuICAgICAge1xuICAgICAgICBraW5kLFxuICAgICAgICBiaW46IHNlbGVjdGlvbkJpblxuICAgICAgICAgID8geyBzaXplOiBzZWxlY3Rpb25CaW4sIG9yaWdpbjogbG9hZGVkLmNsdXN0ZXJlZD8ub3JpZ2luID8/IFswLCAwXSB9XG4gICAgICAgICAgOiBsb2FkZWQua2luZFxuICAgICAgICAgICAgPyBsb2FkZWQuYmluXG4gICAgICAgICAgICA6IGpvYi5iaW4sXG4gICAgICAgIG1lcmdlZCxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGdlbmVzOiBraW5kID09PSAnaW5kaXZpZHVhbCcgPyAoYWxsR2VuZU5hbWVzID8/IFtdKSA6IFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lc10sXG4gICAgICAgIC4uLihlbnRyeUdyb3VwICYmIGdyb3VwTmFtZXMgPyB7IGVudHJ5R3JvdXAsIGdyb3VwTmFtZXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGxvYWRlZC5jbHVzdGVyZWQgPyB7IGdyb3VwR2VuZXM6IGxvYWRlZC5jbHVzdGVyZWQuZ2VuZXMgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0ID8/IG51bGwsXG4gICAgKTtcbiAgICB0aGlzLmhvdmVyLnNldFR5cGVzKHR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lIGljb25zOiBlYWNoIGVudHJ5IGRyYXduIGFzIGl0cyBnZW5lJ3MgbmFwYXJpLWpzIHBvaW50IHN5bWJvbCwgaW4gdGhlIHNhbWUgb25lIHBvaW50c1xuICAgKiBsYXllciBhcyB0aGUgY2lyY2xlcy4gV2l0aCBldmVyeSBnZW5lIGRyYXduIHRoZXJlIGlzIG9uZSBpY29uIGZvciBhbGwgb2YgdGhlbSDigJQgMTgsMDAwXG4gICAqIHNoYXBlcyB3b3VsZCBzYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRHbHlwaHMoXG4gICAgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gICAgZGlhbTogRmxvYXQzMkFycmF5LFxuICAgIHJnYmE6IEZsb2F0MzJBcnJheSxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHBsYWNlOiBQbGFjZW1lbnQsXG4gICAgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFBvaW50c0xheWVyIHtcbiAgICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgIGNvbnN0IGdseXBoRm9yID0gKHNsb3Q6IG51bWJlcik6IFRyYW5zY3JpcHRHbHlwaCA9PlxuICAgICAgKHZpZXcudHJhbnNjcmlwdEdseXBoc1tnZW5lc1tzbG90XV0gYXMgVHJhbnNjcmlwdEdseXBoIHwgdW5kZWZpbmVkKSA/PyBkZWZhdWx0R2x5cGhGb3Ioc2xvdCk7XG4gICAgY29uc3Qgc2luZ2xlID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXNcbiAgICAgID8gKCh2aWV3LnRyYW5zY3JpcHRHbHlwaHNbQUxMX0dFTkVTXSBhcyBUcmFuc2NyaXB0R2x5cGggfCB1bmRlZmluZWQpID8/ICdjaXJjbGUnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHNsb3RzID0gc2luZ2xlID8gW3NpbmdsZV0gOiBnZW5lcy5tYXAoKF9nLCBzbG90KSA9PiBnbHlwaEZvcihzbG90KSk7XG4gICAgY29uc3QgY29kZXMgPSBzbG90cy5tYXAoKGcpID0+IHBvaW50U3ltYm9sQ29kZShHTFlQSF9TWU1CT0xTW2ddKSk7XG4gICAgY29uc3Qgc2l6ZXMgPSBzbG90cy5tYXAoKGcpID0+IEdMWVBIX1NJWkVbZ10gPz8gMSk7XG4gICAgY29uc3Qgc3ltYm9scyA9IG5ldyBVaW50OEFycmF5KG1lcmdlZC5jb3VudCk7XG4gICAgY29uc3Qgc2l6ZSA9IG5ldyBGbG9hdDMyQXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBzbG90ID0gc2luZ2xlID8gMCA6IG1lcmdlZC5nZW5lW2ldO1xuICAgICAgc3ltYm9sc1tpXSA9IGNvZGVzW3Nsb3RdO1xuICAgICAgc2l6ZVtpXSA9IGRpYW1baV0gKiBzaXplc1tzbG90XTtcbiAgICB9XG4gICAgLy8gQSBkYXJrIHJpbSwgb25lIHNjcmVlbiBwaXhlbCB3aWRlLCBrZWVwcyBhIGZldyBsYXJnZSBpY29ucyByZWFkYWJsZSBvdmVyIHRoZSB0aXNzdWU7IG9uXG4gICAgLy8gbWFueSBzbWFsbCBvbmVzIHRoZSByaW1zIG1lcmdlIGludG8gYSBzb2xpZCBkYXJrIHNoZWV0IHRoYXQgaGlkZXMgZXZlcnkgY29sb3VyLCBzbyB0aGV5XG4gICAgLy8gYXJlIGxlZnQgb2ZmLlxuICAgIGNvbnN0IG1lZGlhblB4ID0gbWVkaWFuKGRpYW0pICogcHhQZXJVbml0O1xuICAgIGNvbnN0IHJpbSA9IG1lcmdlZC5jb3VudCA+IEdMWVBIX09VVExJTkVfTUFYIHx8IG1lZGlhblB4IDwgR0xZUEhfT1VUTElORV9NSU5fUFggPyAwIDogMSAvIHB4UGVyVW5pdDtcbiAgICByZXR1cm4gdGhpcy5kcmF3VHJhbnNjcmlwdHMobWVyZ2VkLCBzaXplLCByZ2JhLCB2aWV3LCBwbGFjZSwgc3ltYm9scywgcmltKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb25lIHRyYW5zY3JpcHRzIGxheWVyOiBhIG1hcmtlciBwZXIgZW50cnksIGBzaXplYCBzYXlpbmcgaG93IG1hbnkgdHJhbnNjcmlwdHMgaXQgc3RhbmRzXG4gICAqIGZvciwgZHJhd24gYXMgdGhlIGxheWVyJ3MgZGlzYyBvciBhcyBlYWNoIGVudHJ5J3MgYHN5bWJvbHNgIGNvZGUuXG4gICAqL1xuICBwcml2YXRlIGRyYXdUcmFuc2NyaXB0cyhcbiAgICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBzaXplOiBGbG9hdDMyQXJyYXksXG4gICAgcmdiYTogRmxvYXQzMkFycmF5LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgeyBzY2FsZSwgdHJhbnNsYXRlIH06IFBsYWNlbWVudCxcbiAgICBzeW1ib2xzOiBVaW50OEFycmF5IHwgbnVsbCxcbiAgICBib3JkZXJXaWR0aDogbnVtYmVyLFxuICApOiBQb2ludHNMYXllciB7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQgKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBwb3NpdGlvbnNbMiAqIGldID0gbWVyZ2VkLnhbaV07XG4gICAgICBwb3NpdGlvbnNbMiAqIGkgKyAxXSA9IG1lcmdlZC55W2ldO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMuZ3JvdXBzLnZpZXdlciEuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ3RyYW5zY3JpcHRzJyxcbiAgICAgIHNpemUsXG4gICAgICBmYWNlQ29sb3I6IHJnYmEsXG4gICAgICBib3JkZXJDb2xvcjogUklNX0NPTE9SLFxuICAgICAgYm9yZGVyV2lkdGgsXG4gICAgICBzeW1ib2xzLFxuICAgICAgb3BhY2l0eTogdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICAgIHNjYWxlLFxuICAgICAgdHJhbnNsYXRlLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JvdXBzLnJlcGxhY2UoJ3RyYW5zY3JpcHRzJywgbGF5ZXIpO1xuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIC8qKiBUaGUgc2VsZWN0aW9uIHRoZSBsYXN0IHBsYW4gZmFkZWQgYnksIGFuZCBpdHMgcmV2aXNpb24sIGJ1bXBlZCBlYWNoIHRpbWUgaXQgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBsYXN0U2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGlvblJldmlzaW9uID0gMDtcblxuICBwcml2YXRlIHNlbGVjdGlvblJldihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCk6IG51bWJlciB7XG4gICAgY29uc3QgbGl2ZSA9IHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uIDogbnVsbDtcbiAgICBpZiAobGl2ZSAhPT0gdGhpcy5sYXN0U2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmxhc3RTZWxlY3Rpb24gPSBsaXZlO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SZXZpc2lvbisrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25SZXZpc2lvbjtcbiAgfVxuXG4gIC8qKiBQZXItZW50cnkgY29sb3VycywgYXMgcGFja2VkIFJHQkEuICovXG4gIHByaXZhdGUgYXN5bmMgdHJhbnNjcmlwdENvbG9ycyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBjbHVzdGVyT2Y/OiAoaTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsLFxuICApOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgIGxldCByZ2I6IFJnYltdO1xuICAgIGxldCBjb2RlT2Y6IChpOiBudW1iZXIpID0+IG51bWJlcjtcbiAgICBpZiAodmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NsdXN0ZXInICYmIGNsdXN0ZXJPZikge1xuICAgICAgLy8gQSBjbHVzdGVyIG5hbWVkIGxpa2UgYSBncm91cCBvZiB0aGUgY2VsbHMnIGdyb3VwaW5nIHRha2VzIHRoYXQgZ3JvdXAncyBjb2xvdXIsIHNvIGFcbiAgICAgIC8vIGNsdXN0ZXIncyB0cmFuc2NyaXB0cyBhbmQgaXRzIGNlbGxzIGFncmVlOyBhbnkgb3RoZXIgY2x1c3RlciB0YWtlcyBhIHBhbGV0dGUgY29sb3VyLlxuICAgICAgY29uc3QgbmFtZSA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXMobmFtZSkuY2F0Y2goKCkgPT4gbnVsbCkgOiBudWxsO1xuICAgICAgY29uc3QgY2VsbENvbG9yID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGlmIChuYW1lICYmIGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgY29uc3QgY29sb3JzID0gY2F0ZWdvcnlDb2xvcnNGb3IobmFtZSwgY29kZXMubWV0YSwgdmlldy5ncm91cENvbG9ycyk7XG4gICAgICAgIGNvZGVzLm1ldGEuY2F0ZWdvcmllcy5mb3JFYWNoKChjLCBrKSA9PiBjZWxsQ29sb3Iuc2V0KGMsIGNvbG9yc1trXSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3JzID0gY2x1c3RlckNvbG9yTWFwKFxuICAgICAgICB2aWV3LnRyYW5zY3JpcHRHZW5lcyxcbiAgICAgICAgdmlldy50cmFuc2NyaXB0R2VuZUdyb3VwcyxcbiAgICAgICAgY2VsbENvbG9yLFxuICAgICAgICBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUsXG4gICAgICApO1xuICAgICAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgY29uc3QgaGV4OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgY29kZUZvciA9IChjbHVzdGVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGsgPSBpbmRleC5nZXQoY2x1c3Rlcik7XG4gICAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBrID0gaGV4Lmxlbmd0aDtcbiAgICAgICAgICBpbmRleC5zZXQoY2x1c3Rlciwgayk7XG4gICAgICAgICAgaGV4LnB1c2goY29sb3JzLmdldChjbHVzdGVyKSA/PyBjZWxsQ29sb3IuZ2V0KGNsdXN0ZXIpID8/IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgICB9O1xuICAgICAgY29uc3QgY29kZSA9IG5ldyBJbnQzMkFycmF5KHQuY291bnQpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGNsdXN0ZXJPZihpKTtcbiAgICAgICAgY29kZVtpXSA9IGMgPT09IG51bGwgPyAtMSA6IGNvZGVGb3IoYyk7XG4gICAgICB9XG4gICAgICByZ2IgPSBoZXgubWFwKHBhcnNlSGV4KTtcbiAgICAgIGNvZGVPZiA9IChpKSA9PiBjb2RlW2ldO1xuICAgIH0gZWxzZSBpZiAodmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2dlbmUnIHx8IHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjbHVzdGVyJykge1xuICAgICAgLy8gQWxsIGdlbmVzOiBjb2RlcyBhcmUgdGhlIGRhdGFzZXQncyBnZW5lIGluZGljZXMsIGNvbG91cmVkIGJ5IG5hbWUgd2hlbiB0aGUgZGF0YXNldFxuICAgICAgLy8gbGlzdHMgdGhlbSAoc28gYSBnZW5lJ3MgY2hvc2VuIGNvbG91ciBhcHBsaWVzKSwgZWxzZSBmb2xkZWQgb250byB0aGUgcGFsZXR0ZS5cbiAgICAgIGNvbnN0IG5hbWVzID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXMgPyAoZGF0YXNldC50cmFuc2NyaXB0VGlsZXM/LmdlbmVzID8/IG51bGwpIDogdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgICBjb25zdCBuID0gbmFtZXMgPyBuYW1lcy5sZW5ndGggOiBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUubGVuZ3RoO1xuICAgICAgcmdiID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoX2csIGkpID0+XG4gICAgICAgIHBhcnNlSGV4KFxuICAgICAgICAgIChuYW1lcyAmJiB2aWV3LnRyYW5zY3JpcHRHZW5lQ29sb3JzW25hbWVzW2ldXSkgfHxcbiAgICAgICAgICAgIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVtpICUgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLmxlbmd0aF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgY29kZU9mID0gbmFtZXMgPyAoaSkgPT4gKHQuZ2VuZVtpXSA8IG4gPyB0LmdlbmVbaV0gOiAtMSkgOiAoaSkgPT4gdC5nZW5lW2ldICUgbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZSA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5sb29rdXAuY29kZXMobmFtZSkgOiBudWxsO1xuICAgICAgcmdiID1cbiAgICAgICAgbmFtZSAmJiBjb2Rlcz8ubWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnXG4gICAgICAgICAgPyBjYXRlZ29yeUNvbG9yc0ZvcihuYW1lLCBjb2Rlcy5tZXRhLCB2aWV3Lmdyb3VwQ29sb3JzKS5tYXAocGFyc2VIZXgpXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGNvZGVPZiA9IChpKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgICBpZiAoIWNvZGVzIHx8IG8gPT09IE5PX09CU0VSVkFUSU9OKSByZXR1cm4gLTE7XG4gICAgICAgIGNvbnN0IGMgPSBjb2Rlcy5jb2Rlc1tvXTtcbiAgICAgICAgcmV0dXJuIGMgPT09IE5PX0NBVEVHT1JZID8gLTEgOiBjO1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmdiYSA9IG5ldyBGbG9hdDMyQXJyYXkodC5jb3VudCAqIDQpO1xuICAgIGNvbnN0IHR1cGxlczogUkdCQVtdID0gcmdiLm1hcCgoW3IsIGcsIGJdKSA9PiBbciAvIDI1NSwgZyAvIDI1NSwgYiAvIDI1NSwgMV0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29kZU9mKGkpO1xuICAgICAgcmdiYS5zZXQoYyA8IDAgPyBVTkFTU0lHTkVEX1JHQkEgOiB0dXBsZXNbY10sIGkgKiA0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJnYmE7XG4gIH1cbn1cbiJdfQ==