@jax-data-science/sci-image-visualizer 0.12.1 → 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 (78) 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/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  7. package/esm2022/lib/geometry/reconstruct.mjs +11 -1
  8. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
  9. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
  10. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
  11. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
  12. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
  13. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +9 -1
  14. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
  15. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
  16. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
  17. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
  18. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
  19. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
  20. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
  21. package/esm2022/lib/region-editor/region-editor.component.mjs +13 -1
  22. package/esm2022/lib/routing-visualizer.service.mjs +4 -1
  23. package/esm2022/lib/spatial/lod.mjs +6 -3
  24. package/esm2022/lib/spatial/spatial-controls.facade.mjs +78 -23
  25. package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
  26. package/esm2022/lib/spatial/spatial-selection.mjs +70 -1
  27. package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
  28. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
  29. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +54 -11
  30. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
  31. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
  32. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
  33. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  34. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  35. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
  36. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
  37. package/esm2022/lib/store/region-selection.mjs +21 -4
  38. package/esm2022/lib/store/region-store.service.mjs +22 -3
  39. package/esm2022/lib/store/spatial-selection.service.mjs +13 -1
  40. package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
  41. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +3 -3
  42. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1777 -793
  43. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
  44. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
  45. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
  46. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -2
  47. package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
  48. package/lib/contracts/display-types.d.ts +27 -0
  49. package/lib/contracts/image.contract.d.ts +2 -0
  50. package/lib/contracts/region-editor-api.contract.d.ts +3 -0
  51. package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
  52. package/lib/contracts/visualizer.contract.d.ts +28 -2
  53. package/lib/geometry/reconstruct.d.ts +6 -0
  54. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
  55. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
  56. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
  57. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
  58. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +5 -0
  59. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
  60. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
  61. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
  62. package/lib/routing-visualizer.service.d.ts +1 -0
  63. package/lib/spatial/lod.d.ts +3 -1
  64. package/lib/spatial/spatial-controls.facade.d.ts +19 -2
  65. package/lib/spatial/spatial-gene-filter.d.ts +44 -0
  66. package/lib/spatial/spatial-selection.d.ts +16 -1
  67. package/lib/spatial/spatial-tile-merge.d.ts +17 -0
  68. package/lib/spatial-controls/spatial-controls.component.d.ts +14 -3
  69. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
  70. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
  71. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
  72. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
  73. package/lib/store/region-selection.d.ts +14 -3
  74. package/lib/store/region-store.service.d.ts +14 -1
  75. package/lib/store/spatial-selection.service.d.ts +8 -0
  76. package/lib/store/visualizer-store.service.d.ts +13 -0
  77. package/package.json +1 -1
  78. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs.map +0 -1
@@ -249,6 +249,8 @@ export class Image2dScene {
249
249
  */
250
250
  async renderTiled(z, desc, scene) {
251
251
  const { ctx } = this;
252
+ // The descriptor's channel names and tints, which a host's image meta may not carry.
253
+ ctx.store.adoptChannelInfo(desc.channelInfo);
252
254
  const states = ctx.store.currentChannelStates();
253
255
  const channelCount = desc.channels ?? (states.length || 1);
254
256
  const multichannel = !!desc.multichannel && channelCount > 1;
@@ -348,6 +350,17 @@ export class Image2dScene {
348
350
  this.recolorNavigator();
349
351
  });
350
352
  }
353
+ /**
354
+ * Put the current channel states back on the rendered layers: each channel's visibility, window,
355
+ * gamma and tint, and which of an RGB image's layers draw it. For a caller that changed the
356
+ * layers' visibility wholesale (the spatial view showing its tissue again), so the channels
357
+ * the user or the defaults switched off stay off. Nothing to do before the image is drawn.
358
+ */
359
+ reapplyDisplayState() {
360
+ if (!this.channelView)
361
+ return;
362
+ this.applyDisplayState(this.ctx.store.currentChannelStates());
363
+ }
351
364
  /** Apply the current channel states / colormap to the live layers (no re-fetch), delegating the
352
365
  * per-channel layer mutations to the {@link MultiChannelImageView}. */
353
366
  applyDisplayState(channels) {
@@ -417,8 +430,10 @@ export class Image2dScene {
417
430
  viewer.layers.move(layer, at + 1 + c);
418
431
  return layer;
419
432
  });
420
- rgb.visible = false;
421
433
  }
434
+ // The bands draw the image now; hidden on every pass, not only when the bands are made, so
435
+ // a caller that showed every image layer (the spatial view) does not draw it twice.
436
+ rgb.visible = false;
422
437
  this.bandLayers.forEach((layer, c) => {
423
438
  const st = states.find((s) => s.index === c);
424
439
  layer.colormap = tintColormap(st?.color ?? tintFor(c));
@@ -599,4 +614,4 @@ export class ScatterRegionsScene {
599
614
  });
600
615
  }
601
616
  }
602
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLWltYWdlLTJkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS1pbWFnZS0yZC1zY2VuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSXZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUVMLHdCQUF3QixFQUN4QixhQUFhLEVBQ2IsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBQ1osYUFBYSxFQUNiLFVBQVUsR0FDWCxNQUFNLGtCQUFrQixDQUFDO0FBZ0IxQjs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBNkI7SUFDbkQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTTtRQUFFLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDM0YsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFrQ3ZCLFlBQ21CLEdBQWlCLEVBQ2pCLE9BQXVCLEVBQUU7UUFEekIsUUFBRyxHQUFILEdBQUcsQ0FBYztRQUNqQixTQUFJLEdBQUosSUFBSSxDQUFxQjtRQW5DNUMsd0ZBQXdGO1FBQ3hGLGNB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TCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE11bHRpQ2hhbm5lbEltYWdlVmlldywgZGVjb2RlSW1hZ2VSR0JBLCBoaXN0b2dyYW1TY2FsYXIsIHRpbnRDb2xvcm1hcCB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7IENoYW5uZWxWaWV3LCBJbWFnZUxheWVyLCBQb2ludHNMYXllciwgVGlsZWRTb3VyY2UgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHsgTmF2aWdhdG9yT3ZlcmxheSwgU2NhbGVCYXJPdmVybGF5IH0gZnJvbSAnbmFwYXJpLWpzL292ZXJsYXlzJztcblxuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZURlc2NyaXB0b3IgfSBmcm9tICcuLi90aWxlLXNlcnZlcic7XG5pbXBvcnQgeyByZ2JOZWVkc1JlY29sb3IgfSBmcm9tICcuLi9vc2QvZGlzcGxheS1waXBlbGluZSc7XG5pbXBvcnQgdHlwZSB7IE92ZXJ2aWV3SW1hZ2UgfSBmcm9tICcuL25hcGFyaS10aWxlLWNsaWVudCc7XG5pbXBvcnQgeyByZWdpb25DZW50cm9pZHMgfSBmcm9tICcuLi9yZWdpb24tY2VudHJvaWRzJztcbmltcG9ydCB7XG4gIEx1bWFQbGFuZSxcbiAgaXNTZXJ2ZXJsZXNzTXVsdGljaGFubmVsLFxuICBzcGxpdFJnYkJhbmRzLFxuICB0aW50Rm9yLFxuICB0aW50ZWRDb21wb3NpdGUsXG4gIHRvSUhpc3RvZ3JhbSxcbiAgdG9OYXBhcmlHYW1tYSxcbiAgdHlwZWRQbGFuZSxcbn0gZnJvbSAnLi9uYXBhcmktaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE5hcGFyaVNjZW5lLCBTY2VuZUNvbnRleHQgfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5cbi8qKiBXaGF0IHRoZSBzY2VuZXMgYnVpbHQgb3ZlciB0aGUgMkQgaW1hZ2UgYWRkIHRvIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZTJkT3B0aW9ucyB7XG4gIC8qKiBEcmF3IHRoZSBsb2FkZWQgaW1hZ2UgKGZhbHNlOiBhbiBpbWFnZS1sZXNzIHNwYXRpYWwgZGF0YXNldCwgdGhlIG9ic2VydmF0aW9ucyBhbG9uZSkuICovXG4gIGltYWdlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gZml0IHRoZSBjYW1lcmEgdG8gdGhlIGltYWdlIG9uY2UgaXQgaXMgZHJhd24gKGRlZmF1bHQ6IHdoZW4gdGhlcmUgaXMgb25lKS4gKi9cbiAgZml0PzogKCkgPT4gYm9vbGVhbjtcbiAgLyoqIEFmdGVyIGEgc2xpY2UgY2hhbmdlLiBgcmVyZW5kZXJlZGAgd2hlbiB0aGUgc3RpdGNoZWQgcGF0aCByZS1yZW5kZXJlZCB0aGUgaW1hZ2Ug4oCUIHdoaWNoXG4gICAqICBDTEVBUlMgdGhlIGxheWVyIGxpc3QsIHRha2luZyBldmVyeSBvdGhlciBsYXllciB3aXRoIGl0LiAqL1xuICBvblNsaWNlPzogKHJlcmVuZGVyZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIC8qKiBUaGUgcG9pbnRlciBlbnRlcmVkIHRoZSBuYXZpZ2F0b3IgKGUuZy4gdG8gaGlkZSBhIGhvdmVyIHRvb2x0aXAgb3ZlciB0aGUgY2FudmFzKS4gKi9cbiAgb25OYXZpZ2F0b3JJbnRlcmFjdD86ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQ29tcG9zaXRlIGFkZGl0aXZlIGNoYW5uZWwgbGF5ZXJzIG9udG8gYmxhY2ssIGFzIE9TRCBhbmQgUGxvdGx5IG1lcmdlIHRoZW06IHRoZSBib3R0b20tbW9zdFxuICogU0hPV04gbGF5ZXIgcmVwbGFjZXMgd2hhdCBpcyB1bmRlciBpdCwgdGhlIG90aGVycyBhZGQgb250byBpdC4gQWxsLWFkZGl0aXZlIGxheWVycyBhZGRlZCBvbnRvXG4gKiB0aGUgdmlld2VyJ3MgZGFyay1ncmV5IGJhY2tncm91bmQgaW5zdGVhZCwgbGlmdGluZyBldmVyeSBibGFjayBwaXhlbCB0byB0aGF0IGdyZXkuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT250b0JsYWNrKGxheWVyczogcmVhZG9ubHkgSW1hZ2VMYXllcltdKTogdm9pZCB7XG4gIGNvbnN0IGJhc2UgPSBsYXllcnMuZmluZCgobGF5ZXIpID0+IGxheWVyLnZpc2libGUpO1xuICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykgbGF5ZXIuYmxlbmRpbmcgPSBsYXllciA9PT0gYmFzZSA/ICd0cmFuc2x1Y2VudCcgOiAnYWRkaXRpdmUnO1xufVxuXG4vKipcbiAqIFRoZSAyRCBpbWFnZSAocmV2aWV3IEFwcGVuZGl4IEIsIGNsdXN0ZXIgRSk6IHB5cmFtaWRhbCBgVGlsZWRTb3VyY2VgcyBhZ2FpbnN0IHRoZSBgL3RpbGVgXG4gKiBlbmRwb2ludCB3aGVuIGAvdGlsZXMvaW5mb2AgZGVzY3JpYmVzIHRoZSBpbWFnZSwgZWxzZSBhIHNpbmdsZSBzdGl0Y2hlZCBsZXZlbCAoYHRpbGVkOmZhbHNlYFxuICogc3RhY2tzIGZldGNoIGVhY2ggc2xpY2UncyBvd24gVVJMLCBhIHNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHN0YWNrIGVhY2ggY2hhbm5lbCdzIG93biBwbGFuZSk7XG4gKiBtdWx0aWNoYW5uZWwgYWRkaXRpdmUgdGludHMsIGdyYXlzY2FsZSBjb2xvcm1hcCBvciBSR0IgKHJlY29sb3VyZWQgcGVyIGJhbmQsIHNlZVxuICoge0BsaW5rIHN5bmNSZ2JCYW5kc30pOyB0aGUgY29hcnNlIGhpc3RvZ3JhbSBzYW1wbGVzIG9mIHRoZSB0aWxlZCBwYXRoLCB0aGUgc2NhbGUgYmFyLCB0aGVcbiAqIG92ZXJ2aWV3IG5hdmlnYXRvciBhbmQgdGhlIDJEIGludGVyYWN0aW9uIHN0YWNrIChyZWdpb24gb3ZlcmxheSArIHBpeGVsIHRvb2xzKS4gVGhlXG4gKiByZWdpb24tY2VudHJvaWQgc2NhdHRlciBhbmQgdGhlIHNwYXRpYWwgMkQgc2NlbmUgYXJlIGJ1aWx0IG92ZXIgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbWFnZTJkU2NlbmUgaW1wbGVtZW50cyBOYXBhcmlTY2VuZSB7XG4gIC8qKiBIb3cgdGhlIGltYWdlIGlzIGNvbXBvc2l0ZWQgKGRyaXZlcyB0aGUgaGlzdG9ncmFtIGFuZCB0aGUgZGlzcGxheS1zdGF0ZSB1cGRhdGVzKS4gKi9cbiAgaW1hZ2VNb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYicgPSAncmdiJztcbiAgLyoqIFRydWUgd2hlbiB0aGUgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgdGlsZWQgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyBoaWdoLWxldmVsIHZpZXcgb3duaW5nIHRoZSBwZXItY2hhbm5lbCBsYXllciBzZXQgZm9yIHtAbGluayBpbWFnZU1vZGV9LiAqL1xuICBwcml2YXRlIGNoYW5uZWxWaWV3OiBNdWx0aUNoYW5uZWxJbWFnZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCB3aW5zIGZvciBhIHN0aXRjaGVkIHNsaWNlOiBhIHNsb3cgb2xkZXIgc2xpY2UgY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS4gKi9cbiAgcHJpdmF0ZSBzbGljZVJlcSA9IDA7XG4gIC8qKiBSR0I6IHRoZSBSLCBHIGFuZCBCIGJhbmRzIGFzIGxheWVyIHNvdXJjZXMgKHR5cGVkIHBsYW5lcywgb3IgYmFuZCBgVGlsZWRTb3VyY2VgcyB0aGF0IHNoYXJlXG4gICAqICBvbmUgcmVxdWVzdCBwZXIgdGlsZSkgYW5kIHRoZSBzdGl0Y2hlZCBsZXZlbCdzIHNjYWxlIOKAlCB3aGF0IHtAbGluayBzeW5jUmdiQmFuZHN9IGRyYXdzLiAqL1xuICBwcml2YXRlIHJnYkJhbmRzOiB7IHNvdXJjZXM6IENoYW5uZWxWaWV3Wydzb3VyY2UnXVtdOyBzY2FsZT86IFtudW1iZXIsIG51bWJlcl0gfSB8IG51bGwgPSBudWxsO1xuICAvKiogUkdCOiB0aGUgdGhyZWUgYWRkaXRpdmUgYmFuZCBsYXllcnMgd2hpbGUgdGhlIGNoYW5uZWwgc3RhdGVzIHJlY29sb3VyIHRoZSBpbWFnZTsgbnVsbCB3aGlsZVxuICAgKiAgdGhlIFJHQiBsYXllciBkcmF3cyBpdCBhcyBpdCBpcy4gKi9cbiAgcHJpdmF0ZSBiYW5kTGF5ZXJzOiBJbWFnZUxheWVyW10gfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscyDigJQgYW5kIGFuIFJHQiBpbWFnZSdzIHJhdyBiYW5kcyBpbiBlaXRoZXIgbW9kZS5cbiAgICogIFJlZnJlc2hlZCBvbiBtb3VudCArIHNsaWNlIGNoYW5nZS4gKi9cbiAgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIExhdGVzdC13aW5zIHRva2VuIGZvciB7QGxpbmsgcmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXN9LiAqL1xuICBwcml2YXRlIGhpc3RHZW4gPSAwO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgKG51bGwgd2hlbiB0aGUgaW1hZ2UgaGFzIG5vIMK1bS9waXhlbCkuICovXG4gIHByaXZhdGUgc2NhbGVCYXI6IFNjYWxlQmFyT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogT3ZlcnZpZXcgbWluaW1hcCAoYm90dG9tLXJpZ2h0KSwgYXMgT1NEJ3MgbmF2aWdhdG9yLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvcjogTmF2aWdhdG9yT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogQnVtcGVkIHBlciB0aHVtYm5haWwgcmVxdWVzdCwgc28gYSBzbG93IG9uZSBjYW5ub3Qgb3ZlcndyaXRlIGEgbmV3ZXIgc2xpY2Uncy4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JUb2tlbiA9IDA7XG4gIC8qKiBUaGUgY3VycmVudCBzbGljZSdzIHBlci1jaGFubmVsIHRodW1ibmFpbCBiaXRtYXBzIChtdWx0aWNoYW5uZWwgb25seSksIGtlcHQgc28gYSB0aW50IG9yXG4gICAqICB2aXNpYmlsaXR5IGNoYW5nZSByZWNvbG91cnMgdGhlIHRodW1ibmFpbCB3aXRob3V0IHJlLWZldGNoaW5nIGl0LiAqL1xuICBwcml2YXRlIG5hdmlnYXRvckNoYW5uZWxzOiBPdmVydmlld0ltYWdlW10gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSB0aW50cy92aXNpYmlsaXR5IHRoZSB0aHVtYm5haWwgd2FzIGxhc3QgY29tcG9zaXRlZCB3aXRoIOKAlCBzZWUge0BsaW5rIHJlY29sb3JOYXZpZ2F0b3J9LiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclRpbnRLZXkgPSAnJztcbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN0eDogU2NlbmVDb250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogSW1hZ2UyZE9wdGlvbnMgPSB7fSxcbiAgKSB7fVxuXG4gIHByaXZhdGUgZ2V0IGhhc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wdHMuaW1hZ2UgIT09IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgbW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgY29uc3QgeiA9IGN0eC56KCk7XG4gICAgaWYgKHRoaXMuaGFzSW1hZ2UpIGF3YWl0IHRoaXMucmVuZGVyKHopO1xuICAgIC8vIFJlc2V0IGludG8gYSBuZXdlciBzY2VuZSB3aGlsZSB0aGUgaW1hZ2UgbG9hZGVkOiB0aGlzIHNjZW5lIGlzIGFscmVhZHkgZGlzcG9zZWQsIGFuZCB0aGVcbiAgICAvLyB0b29sIGJyaWRnZSBpcyB0aGUgbmV4dCBzY2VuZSdzIOKAlCBpbnN0YWxsIG5vdGhpbmcgbW9yZS5cbiAgICBpZiAoY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMub3B0cy5maXQgPyB0aGlzLm9wdHMuZml0KCkgOiB0aGlzLmhhc0ltYWdlKSBjdHguZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuZm9sbG93RGlzcGxheVN0YXRlKCk7XG4gICAgLy8gVGhlIHNjYWxlIGJhciBhbmQgbmF2aWdhdG9yIGRlc2NyaWJlIGFuIGltYWdlOyB3aXRoIG5vbmUgbG9hZGVkLCB3aGF0ZXZlciB0aGV5IHdvdWxkXG4gICAgLy8gcmVhZCBpcyBsZWZ0IG92ZXIgZnJvbSB0aGUgbGFzdCBvbmUuXG4gICAgaWYgKHRoaXMuaGFzSW1hZ2UpIHtcbiAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICB0aGlzLmluc3RhbGxOYXZpZ2F0b3Ioeik7XG4gICAgfVxuICAgIGN0eC50b29scy5pbnN0YWxsMmRJbnRlcmFjdGlvbihjdHgudmlld2VyLCBjdHguaG9zdCk7XG4gIH1cblxuICBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGlmICh0aGlzLm5hdmlnYXRvcikgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6KTtcbiAgICAvLyBUaWxlZDoganVzdCBtb3ZlIHRoZSBkaW1zIHBsYW5lIOKAlCB0aGUgdGlsZWQgdmlzdWFsIGZldGNoZXMgdGhlIG5ldyBzbGljZSdzIHRpbGVzIChjYWNoZWQgcGVyXG4gICAgLy8geiksIG5vIGxheWVyIHJlYnVpbGQuIFJlZnJlc2ggdGhlIGNvYXJzZSBoaXN0b2dyYW0gc2FtcGxlIGZvciB0aGUgbmV3IHNsaWNlLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBjdHgudmlld2VyLmRpbXMueiA9IHo7XG4gICAgICBjb25zdCBkZXNjID0gY3R4LnRpbGVzLmN1cnJlbnREZXNjcmlwdG9yKGN0eC5pbmZvKCkpO1xuICAgICAgaWYgKGRlc2MpIHZvaWQgdGhpcy5yZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6LCBkZXNjKTtcbiAgICAgIHRoaXMub3B0cy5vblNsaWNlPy4oZmFsc2UpO1xuICAgICAgY3R4LnRvb2xzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3RpdGNoIGZhbGxiYWNrOiByZS1yZW5kZXIgdGhlIHNsaWNlIChyZS1mZXRjaGVzIHBlci1jaGFubmVsIC8gY29tcG9zaXRlKS4gVGhlIHRva2VuIGxldHNcbiAgICAvLyByZW5kZXIgZHJvcCBhIHN1cGVyc2VkZWQgc2NydWIgc28gYSBzbG93IG9sZGVyIHNsaWNlIGNhbid0IGNsb2JiZXIgYSBuZXdlciBvbmUuXG4gICAgY29uc3QgcmVxID0gKyt0aGlzLnNsaWNlUmVxO1xuICAgIHZvaWQgdGhpcy5yZW5kZXIoeiwgcmVxKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAocmVxICE9PSB0aGlzLnNsaWNlUmVxIHx8IGN0eC5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICAvLyBBRlRFUiB0aGUgaW1hZ2UsIG5ldmVyIGJlZm9yZTogdGhlIHJlbmRlciBjbGVhcnMgdGhlIGxheWVyIGxpc3QsIHNvIHdoYXRldmVyIHNpdHMgb3ZlclxuICAgICAgICAvLyB0aGUgaW1hZ2UgaXMgd2lwZWQgYnkgdGhlIHZlcnkgaW1hZ2UgbWVhbnQgdG8gc2l0IHVuZGVyIGl0LlxuICAgICAgICB0aGlzLm9wdHMub25TbGljZT8uKHRydWUpO1xuICAgICAgICBjdHgudG9vbHMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzZXRaSW5kZXggc2xpY2UgZmFpbGVkOicsIGVycikpO1xuICB9XG5cbiAgaGlzdG9ncmFtKGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIC8vIFRpbGVkIG1vZGUgaGFzIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscyDihpIgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUuIFJHQjogaXRzIHJhdyBiYW5kXG4gICAgLy8gKGVpdGhlciBtb2RlKSDigJQgbmV2ZXIgdGhlIGRpc3BsYXllZCBwaXhlbHMsIHdoaWNoIHRoZSBjaGFubmVsIHN0YXRlcyBoYXZlIHJlY29sb3VyZWQuXG4gICAgaWYgKHRoaXMudGlsZWQgfHwgdGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSB7XG4gICAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmhpc3RTYW1wbGVzLmdldCh0aGlzLmltYWdlTW9kZSA9PT0gJ2dyYXlzY2FsZScgPyAwIDogY2hhbm5lbCk7XG4gICAgICByZXR1cm4gc2FtcGxlID8gdG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxdO1xuICAgIGNvbnN0IGggPSBsYXllciA/IHRoaXMuY3R4LnZpZXdlci5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucykgOiBudWxsO1xuICAgIHJldHVybiBoID8gdG9JSGlzdG9ncmFtKGgpIDogbnVsbDtcbiAgfVxuXG4gIHNldEltYWdlU21vb3RoaW5nKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBBcHBseSBsaXZlIHRvIHRoZSByZW5kZXJlZCBpbWFnZSBsYXllcnM7IGJha2VkIGludG8gdGhlIG5leHQgcmVuZGVyIHRvby5cbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uID0gZW5hYmxlZCA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuICAgIHRoaXMuY2hhbm5lbFZpZXc/LnNldEludGVycG9sYXRpb24oaW50ZXJwb2xhdGlvbik7XG4gICAgdGhpcy5iYW5kTGF5ZXJzPy5mb3JFYWNoKChsYXllcikgPT4gKGxheWVyLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uKSk7XG4gIH1cblxuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvcj8uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBuYXZpZ2F0b3Igb25seSBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIHBpeGVscyBvZiBpdHMgb3duIChhbmQgd2hlbiB0aGUgdXNlclxuICAgKiAgd2FudHMgaXQpOiB3aXRoIG5vIGltYWdlIG9mIGl0cyBvd24gdGhlcmUgaXMgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdy4gKi9cbiAgc2hvd05hdmlnYXRvckZvcihkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LnNldFZpc2libGUoZGF0YXNldEhhc1BpeGVscyAmJiB0aGlzLmN0eC5zZXR0aW5ncy5uYXZpZ2F0b3JWaXNpYmxlKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IG51bGw7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMubmF2aWdhdG9yPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBudWxsO1xuICAgIHRoaXMuc2V0TmF2aWdhdG9yQ2hhbm5lbHMobnVsbCk7XG4gICAgdGhpcy5oaXN0R2VuKys7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBudWxsO1xuICAgIHRoaXMucmdiQmFuZHMgPSBudWxsO1xuICAgIHRoaXMuYmFuZExheWVycyA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHNsaWNlIGB6YC4gV2l0aCBhIHNlcnZlciBweXJhbWlkIGRlc2NyaXB0b3IgZWFjaCBsYXllciBpcyBhIHB5cmFtaWRhbFxuICAgKiB7QGxpbmsgVGlsZWRTb3VyY2V9LCBzbyB0aGUgdmlldyByZWZpbmVzIHRvIGhpZ2hlciByZXNvbHV0aW9uIG9uIHpvb20gKGxpa2UgT1NEKSBhbmQgc2l0c1xuICAgKiBuYXR1cmFsbHkgaW4gZnVsbC1yZXNvbHV0aW9uIGNvb3JkaW5hdGVzOyB3aXRob3V0IG9uZSwgdGhlIHNpbmdsZS1sZXZlbCBzdGl0Y2guIFRocmVlIGRpc3BsYXlcbiAgICogbW9kZXMgZWl0aGVyIHdheTogbXVsdGljaGFubmVsIGFkZGl0aXZlIHRpbnQsIGdyYXlzY2FsZSBjb2xvcm1hcCwgUkdCLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyKHo6IG51bWJlciwgdG9rZW4/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICBjb25zdCBzY2VuZSA9IGN0eC5zaWduYWw7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IGN0eC50aWxlcy5lbnN1cmVEZXNjcmlwdG9yKGN0eC5pbmZvKCkpO1xuICAgIC8vIFJlc2V0IGludG8gYSBuZXdlciBzY2VuZSB3aGlsZSB0aGUgZGVzY3JpcHRvciB3YXMgaW4gZmxpZ2h0OiB0aGlzIHJlbmRlciBpcyBzdXBlcnNlZGVkLlxuICAgIGlmIChzY2VuZS5hYm9ydGVkKSByZXR1cm47XG4gICAgaWYgKGRlc2MgJiYgZGVzYy5sZXZlbHM/Lmxlbmd0aCkge1xuICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyVGlsZWQoeiwgZGVzYywgc2NlbmUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJTdGl0Y2hlZCh6LCB0b2tlbik7XG4gIH1cblxuICAvKiogU2luZ2xlLWxldmVsIHN0aXRjaCBmYWxsYmFjayAobm8gZGVzY3JpcHRvcik6IHRoZSBwcmUtdGlsaW5nIHBhdGguICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyU3RpdGNoZWQoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGNvbnN0IGluZm8gPSBjdHguaW5mbygpO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCBjdHgudGlsZXMuZW5zdXJlRGVzY3JpcHRvcihpbmZvKTtcbiAgICBjb25zdCBzdGF0ZXMgPSBjdHguc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICAvLyBBIHNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHN0YWNrIGhhcyBubyBkZXNjcmlwdG9yOiBpdHMgY2hhbm5lbHMgYXJlIGl0cyBvd24gcGxhbmUgVVJMc1xuICAgIC8vIChgY2hhbm5lbFVybHNbel1bY11gLCB3aGljaCBmZXRjaENoYW5uZWxEYXRhIHJlYWRzKSwgYW5kIGB1cmxzW3pdYCBvbmx5IGEgY29tcG9zaXRlLlxuICAgIGNvbnN0IHNlcnZlcmxlc3NNYyA9IGlzU2VydmVybGVzc011bHRpY2hhbm5lbChjdHgudGlsZXMuaXNTaW1wbGUoaW5mbyksIGluZm8pO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9XG4gICAgICBkZXNjPy5jaGFubmVscyA/PyAoc2VydmVybGVzc01jID8gKGluZm8/LmltYWdlTWV0YT8uWzBdPy5jaGFubmVsQ291bnQgPz8gMSkgOiBzdGF0ZXMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9ICghIWRlc2M/Lm11bHRpY2hhbm5lbCB8fCBzZXJ2ZXJsZXNzTWMpICYmIGNoYW5uZWxDb3VudCA+IDE7XG5cbiAgICAvLyAxKSBGZXRjaCBhbGwgcGl4ZWwgZGF0YSBCRUZPUkUgdG91Y2hpbmcgdGhlIHZpZXdlciwgc28gYSBzdXBlcnNlZGVkIHNjcnViIGNhbiBiYWlsIHdpdGhvdXRcbiAgICAvLyAgICBoYXZpbmcgdG9ybiBkb3duIHRoZSB2aXNpYmxlIGxheWVycyAoYXZvaWRzIGZsaWNrZXIgLyBvdXQtb2Ytb3JkZXIgbGF5ZXIgc3RhdGUpLlxuICAgIGxldCBtb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYic7XG4gICAgbGV0IHBsYW5lczogTHVtYVBsYW5lW10gPSBbXTtcbiAgICBsZXQgYml0bWFwOiBJbWFnZUJpdG1hcCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgIG1vZGUgPSAnbXVsdGljaGFubmVsJztcbiAgICAgIHBsYW5lcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjaGFubmVsQ291bnQgfSwgKF8sIGMpID0+IGN0eC50aWxlcy5mZXRjaENoYW5uZWxEYXRhKGluZm8sIHosIGMpKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIG1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIC8vIENvbXBvc2l0ZSBmZXRjaCAobm8gY2hhbm5lbCkg4oaSIGFsbCBvdmVydmlldyBsZXZlbHMgdXNhYmxlLCBzbyBhIGxhcmdlIGdyYXlzY2FsZSBpbWFnZVxuICAgICAgLy8gc2VsZWN0cyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCBpbnN0ZWFkIG9mIHRoZSBmdWxsLXJlcyByZWFsIGxldmVsICh0ZXh0dXJlIGxpbWl0KS5cbiAgICAgIHBsYW5lcyA9IFthd2FpdCBjdHgudGlsZXMuZmV0Y2hDaGFubmVsRGF0YShpbmZvLCB6KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGUgPSAncmdiJztcbiAgICAgIC8vIFRoZSBiaXRtYXAgZHJhd3MgdGhlIGltYWdlIGFzIGl0IGlzOyBpdHMgcmF3IGJhbmRzLCB0aGUgcGVyLWJhbmQgbGF5ZXJzIGFuZCBoaXN0b2dyYW1zLlxuICAgICAgYml0bWFwID0gYXdhaXQgY3R4LnRpbGVzLmZldGNoSW1hZ2UoaW5mbywgeik7XG4gICAgICBwbGFuZXMgPSBzcGxpdFJnYkJhbmRzKGRlY29kZUltYWdlUkdCQShiaXRtYXApKTtcbiAgICB9XG5cbiAgICAvLyAyKSBDb21taXQg4oCUIHVubGVzcyBhIG5ld2VyIHNjcnViIHN1cGVyc2VkZWQgdXMgb3IgdGhlIHNjZW5lIHdhcyB0b3JuIGRvd24uXG4gICAgaWYgKCh0b2tlbiAhPSBudWxsICYmIHRva2VuICE9PSB0aGlzLnNsaWNlUmVxKSB8fCBjdHguc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGJpdG1hcD8uY2xvc2U/LigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBkaXNwbGF5ZWQgdGV4dHVyZSBtYXkgYmUgYSBkb3duc2NhbGVkIHB5cmFtaWQgbGV2ZWw7IHNjYWxlIHRoZSBsYXllciBpbnRvIEZVTEwtUkVTT0xVVElPTlxuICAgIC8vIHdvcmxkIGNvb3JkaW5hdGVzIChsZXZlbC0wIHBpeGVscykgc28gdGhlIGNhbWVyYSwgcmVhZGJhY2sgYW5kIOKAlCBjcml0aWNhbGx5IOKAlCBwcmUtc2F2ZWRcbiAgICAvLyByZWdpb25zIChzdG9yZWQgaW4gZnVsbC1yZXMgY29vcmRzLCBlLmcuIG5kcGkpIGFsbCBsaW5lIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGV2ZWwgaXMgc2hvd24uXG4gICAgLy8gVGhpcyBtaXJyb3JzIE9TRCwgd2hvc2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgYWx3YXlzIGxldmVsIDAuXG4gICAgY29uc3QgdGV4VyA9IHBsYW5lc1swXT8ud2lkdGggPz8gMDtcbiAgICBjb25zdCB0ZXhIID0gcGxhbmVzWzBdPy5oZWlnaHQgPz8gMDtcbiAgICBjb25zdCBmdWxsVyA9IGRlc2M/LndpZHRoIHx8IHRleFcgfHwgMTtcbiAgICBjb25zdCBmdWxsSCA9IGRlc2M/LmhlaWdodCB8fCB0ZXhIIHx8IDE7XG4gICAgY29uc3Qgc2NhbGU6IFtudW1iZXIsIG51bWJlcl0gPSBbdGV4VyA/IGZ1bGxXIC8gdGV4VyA6IDEsIHRleEggPyBmdWxsSCAvIHRleEggOiAxXTtcblxuICAgIHRoaXMuaW1hZ2VNb2RlID0gbW9kZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uOiAnbGluZWFyJyB8ICduZWFyZXN0JyA9IGN0eC5zZXR0aW5ncy5pbWFnZVNtb290aGluZyA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBuZXcgTXVsdGlDaGFubmVsSW1hZ2VWaWV3KGN0eC52aWV3ZXIpO1xuICAgIHRoaXMuYmFuZExheWVycyA9IG51bGw7IC8vIHRoZSByZW5kZXIgY2xlYXJzIHRoZSBsYXllciBsaXN0LCBiYW5kIGxheWVycyBpbmNsdWRlZFxuICAgIGlmIChtb2RlID09PSAnbXVsdGljaGFubmVsJykge1xuICAgICAgY29uc3Qgdmlld3MgPSBwbGFuZXMubWFwKChkLCBjKSA9PiB0aGlzLnRpbnRlZENoYW5uZWxWaWV3KGMsIHN0YXRlcywgZGVzYywgdHlwZWRQbGFuZShkKSwgc2NhbGUpKTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgICAgbWVyZ2VPbnRvQmxhY2sodGhpcy5jaGFubmVsVmlldy5sYXllcnMpO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmdyYXlzY2FsZUNoYW5uZWxWaWV3KHN0YXRlc1swXSwgdHlwZWRQbGFuZShwbGFuZXNbMF0pLCBzY2FsZSk7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcignZ3JheXNjYWxlJywgW3ZpZXddLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IGJpdG1hcCBhcyBJbWFnZUJpdG1hcCwgc2NhbGUgfV0sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICAgIHRoaXMucmdiQmFuZHMgPSB7IHNvdXJjZXM6IHBsYW5lcy5tYXAodHlwZWRQbGFuZSksIHNjYWxlIH07XG4gICAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgICBwbGFuZXMuZm9yRWFjaCgoYmFuZCwgYykgPT4gdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgYmFuZC5kYXRhKSk7XG4gICAgICB0aGlzLnN5bmNSZ2JCYW5kcyhzdGF0ZXMpO1xuICAgIH1cbiAgICBjdHguc2V0SW1hZ2VTaXplKGZ1bGxXLCBmdWxsSCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHdpdGggcHlyYW1pZGFsIHtAbGluayBUaWxlZFNvdXJjZX1zIOKAlCB0aGUgdmlldyByZWZpbmVzIHRvIGhpZ2hlciByZXNvbHV0aW9uIGFzIHlvdVxuICAgKiB6b29tIGluICh0aGUgdmlzdWFsIGZldGNoZXMgdGhlIGxldmVsIHdob3NlIHRleGVscyDiiYggc2NyZWVuIHBpeGVscykgYW5kIHNpdHMgaW4gZnVsbC1yZXNcbiAgICogY29vcmRpbmF0ZXMgc28gcmVnaW9ucyBhbGlnbi4gU2FtZSB0aHJlZSBtb2RlcyBhcyB0aGUgc3RpdGNoIHBhdGguIFBlci1jaGFubmVsIGxheWVycyB1c2UgdGhlXG4gICAqIFJFQUwgcHlyYW1pZCBsZXZlbHMgKHBlci1jaGFubmVsIHRpbGVzIG9ubHkgZXhpc3QgdGhlcmUpOyB0aGUgY29tcG9zaXRlIHVzZXMgYWxsIGxldmVscy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyVGlsZWQoejogbnVtYmVyLCBkZXNjOiBUaWxlRGVzY3JpcHRvciwgc2NlbmU6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgY29uc3Qgc3RhdGVzID0gY3R4LnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYy5jaGFubmVscyA/PyAoc3RhdGVzLmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2MubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSBjdHguc2V0dGluZ3MuaW1hZ2VTbW9vdGhpbmcgPyAnbGluZWFyJyA6ICduZWFyZXN0JztcblxuICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBuZXcgTXVsdGlDaGFubmVsSW1hZ2VWaWV3KGN0eC52aWV3ZXIpO1xuXG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAnbXVsdGljaGFubmVsJztcbiAgICAgIGNvbnN0IHZpZXdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PlxuICAgICAgICB0aGlzLnRpbnRlZENoYW5uZWxWaWV3KGMsIHN0YXRlcywgZGVzYywgdGhpcy50aWxlZFNvdXJjZShkZXNjLCBjLCAxLCBzY2VuZSkpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgICAgbWVyZ2VPbnRvQmxhY2sodGhpcy5jaGFubmVsVmlldy5sYXllcnMpO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ3JheXNjYWxlQ2hhbm5lbFZpZXcoc3RhdGVzWzBdLCB0aGlzLnRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgMSwgc2NlbmUpKTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdncmF5c2NhbGUnLCBbdmlld10sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAncmdiJztcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IHRoaXMudGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCA0LCBzY2VuZSkgfV0sIHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZ2JCYW5kcyA9IHtcbiAgICAgICAgc291cmNlczogY3R4LnRpbGVzLnJnYkJhbmRTb3VyY2VzKGRlc2MsIHNjZW5lLCAoKSA9PiB0aGlzLmN0eC5iYWRnZS5iZWdpbignSW1hZ2UnKSksXG4gICAgICB9O1xuICAgICAgdGhpcy5zeW5jUmdiQmFuZHMoc3RhdGVzKTtcbiAgICB9XG4gICAgY3R4LnNldEltYWdlU2l6ZShkZXNjLndpZHRoLCBkZXNjLmhlaWdodCk7XG4gICAgLy8gQXdhaXQgb24gdGhlIGluaXRpYWwgcmVuZGVyIHNvIGdldEhpc3RvZ3JhbS9hdXRvQ29udHJhc3QgaGF2ZSBkYXRhIGltbWVkaWF0ZWx5OyBzbGljZSBjaGFuZ2VzXG4gICAgLy8gcmVmcmVzaCBmaXJlLWFuZC1mb3JnZXQgKHRoZSBoaXN0b2dyYW0gcGFuZSByZXRyaWVzKS5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHosIGRlc2MpO1xuICB9XG5cbiAgLyoqIEEgcHlyYW1pZGFsIFRpbGVkU291cmNlIHdob3NlIHRpbGVzIGNvdW50IG9uIHRoZSBsb2FkaW5nIGJhZGdlIHdoaWxlIGBzY2VuZWAgKHRoZSByZW5kZXIgdGhhdFxuICAgKiAgYXNrZWQgZm9yIGl0LCB0YWtlbiBiZWZvcmUgaXRzIGF3YWl0cykgaXMgY3VycmVudC4gKi9cbiAgdGlsZWRTb3VyY2UoXG4gICAgZGVzYzogVGlsZURlc2NyaXB0b3IsXG4gICAgY2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYW5uZWxzOiAxIHwgNCxcbiAgICBzY2VuZTogQWJvcnRTaWduYWwsXG4gICk6IFRpbGVkU291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5jdHgudGlsZXMudGlsZWRTb3VyY2UoZGVzYywgY2hhbm5lbCwgY2hhbm5lbHMsIHNjZW5lLCAoKSA9PiB0aGlzLmN0eC5iYWRnZS5iZWdpbignSW1hZ2UnKSk7XG4gIH1cblxuICAvKiogQ2hhbm5lbCBgY2AncyBsYXllciBpbiB0aGUgYWRkaXRpdmUgbXVsdGljaGFubmVsIGNvbXBvc2l0ZTogdGludGVkIGJ5IGl0cyBkaXNwbGF5IGNvbG91clxuICAgKiAgKHN0b3JlLCBlbHNlIGRlc2NyaXB0b3IsIGVsc2UgdGhlIEZpamkgcGFsZXR0ZSksIHdpdGggaXRzIHdpbmRvdywgZ2FtbWEgYW5kIHZpc2liaWxpdHkuICovXG4gIHByaXZhdGUgdGludGVkQ2hhbm5lbFZpZXcoXG4gICAgYzogbnVtYmVyLFxuICAgIHN0YXRlczogSUNoYW5uZWxTdGF0ZVtdLFxuICAgIGRlc2M6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCxcbiAgICBzb3VyY2U6IENoYW5uZWxWaWV3Wydzb3VyY2UnXSxcbiAgICBzY2FsZT86IFtudW1iZXIsIG51bWJlcl0sXG4gICk6IENoYW5uZWxWaWV3IHtcbiAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlLFxuICAgICAgdGludDogc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyksXG4gICAgICBuYW1lOiBzdD8ubmFtZSA/PyBgY2gke2N9YCxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICBnYW1tYTogdG9OYXBhcmlHYW1tYShzdD8uZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgIGludmVydDogdGhpcy5jdHguZGlzcGxheS5pbnZlcnQsXG4gICAgICAuLi4oc2NhbGUgPyB7IHNjYWxlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlIGdyYXlzY2FsZSBsYXllcjogdGhlIHNlbGVjdGVkIGNvbG9ybWFwLCB3aXRoIHRoZSBjaGFubmVsJ3Mgd2luZG93IGFuZCBnYW1tYS4gKi9cbiAgcHJpdmF0ZSBncmF5c2NhbGVDaGFubmVsVmlldyhcbiAgICBzdDogSUNoYW5uZWxTdGF0ZSB8IHVuZGVmaW5lZCxcbiAgICBzb3VyY2U6IENoYW5uZWxWaWV3Wydzb3VyY2UnXSxcbiAgICBzY2FsZT86IFtudW1iZXIsIG51bWJlcl0sXG4gICk6IENoYW5uZWxWaWV3IHtcbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlLFxuICAgICAgY29sb3JtYXA6IHRoaXMuY3R4LmRpc3BsYXkuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICBnYW1tYTogdG9OYXBhcmlHYW1tYShzdD8uZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgaW52ZXJ0OiB0aGlzLmN0eC5kaXNwbGF5LmludmVydCxcbiAgICAgIC4uLihzY2FsZSA/IHsgc2NhbGUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIChSZSlmZXRjaCBhIGNvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIGZvciB0aGUgaGlzdG9ncmFtICh0aWxlZCBtb2RlIGhhcyBubyBmdWxsXG4gICAqICBpbi1tZW1vcnkgcGl4ZWxzKS4gT25lIGNoZWFwIG92ZXJ2aWV3IHRpbGUgcGVyIGNoYW5uZWwsIGZldGNoZWQgdG9nZXRoZXI7IGNhY2hlZCBieSBjaGFubmVsXG4gICAqICBpbmRleC4gTGF0ZXN0IHdpbnM6IGEgc2NydWIgZmlyZXMgb25lIHJlZnJlc2ggcGVyIHNsaWNlLCBhbmQgYW4gb2xkZXIgc2xpY2UncyBzYW1wbGVzIHRoYXRcbiAgICogIGxhbmQgYWZ0ZXIgYSBuZXdlciBvbmUncyBhcmUgZHJvcHBlZCByYXRoZXIgdGhhbiBzaG93biBhcyB0aGUgY3VycmVudCBkaXN0cmlidXRpb24uICovXG4gIGFzeW5jIHJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHo6IG51bWJlciwgZGVzYzogUGljazxUaWxlRGVzY3JpcHRvciwgJ2NoYW5uZWxzJz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnZW4gPSArK3RoaXMuaGlzdEdlbjtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuY3R4LmluZm8oKTtcbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSB7XG4gICAgICAvLyBPbmUgY29hcnNlIGNvbXBvc2l0ZSB0aWxlLCBzcGxpdCBpbnRvIGl0cyByYXcgUiwgRyBhbmQgQiBiYW5kcy5cbiAgICAgIGNvbnN0IGJhbmRzID0gYXdhaXQgdGhpcy5jdHgudGlsZXMucmVhZFJnYkJhbmRzKGluZm8sIHosIDEpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgaWYgKGdlbiAhPT0gdGhpcy5oaXN0R2VuIHx8ICFiYW5kcykgcmV0dXJuO1xuICAgICAgYmFuZHMuZm9yRWFjaCgoYmFuZCwgYykgPT4gdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgYmFuZC5kYXRhKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJztcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBtdWx0aWNoYW5uZWwgPyAoZGVzYy5jaGFubmVscyA/PyAxKSA6IDE7XG4gICAgY29uc3Qgc2FtcGxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PlxuICAgICAgICAvLyBidWRnZXQgMSDihpIgY29hcnNlc3Qgc2luZ2xlIHRpbGU7IGEgZmFpbGVkIGNoYW5uZWwgbGVhdmVzIGl0cyBzYW1wbGUgdW5zZXQuXG4gICAgICAgIHRoaXMuY3R4LnRpbGVzLmZldGNoQ2hhbm5lbERhdGEoaW5mbywgeiwgbXVsdGljaGFubmVsID8gYyA6IHVuZGVmaW5lZCwgMSkudGhlbihcbiAgICAgICAgICAoZCkgPT4gZC5kYXRhLFxuICAgICAgICAgICgpID0+IG51bGwsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG4gICAgaWYgKGdlbiAhPT0gdGhpcy5oaXN0R2VuKSByZXR1cm47XG4gICAgc2FtcGxlcy5mb3JFYWNoKChkYXRhLCBjKSA9PiB7XG4gICAgICBpZiAoZGF0YSkgdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2hhbm5lbCBzdGF0ZXMgKyBncmF5c2NhbGUgY29sb3JtYXAg4oaSIGxpdmUtYXBwbHkgdG8gdGhlIHJlbmRlcmVkIGxheWVycyAobm8gcmUtZmV0Y2g7IG9ubHkgelxuICAgKiAgY2hhbmdlcyByZS1mZXRjaCksIGFuZCByZWNvbG91ciB0aGUgbmF2aWdhdG9yIHRodW1ibmFpbC4gKi9cbiAgcHJpdmF0ZSBmb2xsb3dEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gdGhpcy5jdHguZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHMpO1xuICAgICAgdGhpcy5yZWNvbG9yTmF2aWdhdG9yKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQXBwbHkgdGhlIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgLyBjb2xvcm1hcCB0byB0aGUgbGl2ZSBsYXllcnMgKG5vIHJlLWZldGNoKSwgZGVsZWdhdGluZyB0aGVcbiAgICogIHBlci1jaGFubmVsIGxheWVyIG11dGF0aW9ucyB0byB0aGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30uICovXG4gIHByaXZhdGUgYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHM6IElDaGFubmVsU3RhdGVbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmNoYW5uZWxWaWV3O1xuICAgIGNvbnN0IHsgZGlzcGxheSB9ID0gdGhpcy5jdHg7XG4gICAgaWYgKCF2aWV3KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykge1xuICAgICAgdGhpcy5zeW5jUmdiQmFuZHMoY2hhbm5lbHMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGlmICghc3QpIHJldHVybjtcbiAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICB0aW50OiBzdC5jb2xvcixcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSxcbiAgICAgICAgICBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSksIC8vIEltYWdlSiDOsyDihpIgbmFwYXJpLWpzIM6zXG4gICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICBpbnZlcnQ6IGRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgbWVyZ2VPbnRvQmxhY2sodmlldy5sYXllcnMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnKSB7XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgaW52ZXJ0OiBkaXNwbGF5LmludmVydCxcbiAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSkgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSR0I6IGRyYXcgdGhlIGltYWdlIGFzIGl0IGlzIHdoaWxlIGl0cyBjaGFubmVsIHN0YXRlcyBsZWF2ZSBpdCBzbyAoZGVmYXVsdCBSL0cvQiB0aW50cywgZnVsbFxuICAgKiB3aW5kb3csIM6zIDEsIGFsbCBzaG93biwgbm8gaW52ZXJ0OiB7QGxpbmsgcmdiTmVlZHNSZWNvbG9yfSkg4oCUIHRoZSBSR0IgbGF5ZXIsIHVuY2hhbmdlZCwgd2l0aFxuICAgKiB0aGUgY29hcnNlIHVuZGVybGF5IGEgdGlsZWQgb25lIGtlZXBzIHdoaWxlIGl0IHBhbnMuIE90aGVyd2lzZSBkcmF3IGl0cyBSLCBHIGFuZCBCIGJhbmRzIGFzXG4gICAqIHRocmVlIGFkZGl0aXZlIGxheWVycywgZWFjaCB3aXRoIGl0cyBjaGFubmVsJ3Mgd2luZG93LCBpbnZlcnQsIGdhbW1hLCB0aW50IGFuZCB2aXNpYmlsaXR5IOKAlFxuICAgKiB3aGF0IE9TRCdzIFJHQiByZWNvbG91ciBjb21wdXRlcyBwZXIgcGl4ZWwgKHRoZSBtZXJnZSBvcmRlciBvZiBgb3NkL2Rpc3BsYXktcGlwZWxpbmVgKS4gVGhlXG4gICAqIGJhbmQgbGF5ZXJzIHNpdCBqdXN0IGFib3ZlIHRoZSBoaWRkZW4gUkdCIGxheWVyLCBzbyB3aGF0ZXZlciBpcyBkcmF3biBvdmVyIHRoZSBpbWFnZSBzdGF5c1xuICAgKiBvdmVyIGl0LiBBIGhvc3Qgd2l0aCBubyBSL0cvQiBjaGFubmVsIG1vZGVsIChmZXdlciB0aGFuIHRocmVlIHN0YXRlcykgZ2V0cyBvbmx5IHRoZSBpbnZlcnQuXG4gICAqL1xuICBwcml2YXRlIHN5bmNSZ2JCYW5kcyhjaGFubmVsczogSUNoYW5uZWxTdGF0ZVtdKTogdm9pZCB7XG4gICAgY29uc3QgeyB2aWV3ZXIsIGRpc3BsYXkgfSA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuY2hhbm5lbFZpZXc/LmxheWVyc1swXTtcbiAgICBjb25zdCBiYW5kcyA9IHRoaXMucmdiQmFuZHM7XG4gICAgaWYgKCFyZ2IgfHwgIWJhbmRzKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gY2hhbm5lbHMubGVuZ3RoID49IDMgPyBjaGFubmVscyA6IFtdO1xuICAgIGlmICghcmdiTmVlZHNSZWNvbG9yKHN0YXRlcywgZGlzcGxheS5pbnZlcnQpKSB7XG4gICAgICB0aGlzLmJhbmRMYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcikpO1xuICAgICAgdGhpcy5iYW5kTGF5ZXJzID0gbnVsbDtcbiAgICAgIHJnYi52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5iYW5kTGF5ZXJzKSB7XG4gICAgICBjb25zdCBhdCA9IHZpZXdlci5sYXllcnMuaXRlbXMuaW5kZXhPZihyZ2IpO1xuICAgICAgdGhpcy5iYW5kTGF5ZXJzID0gYmFuZHMuc291cmNlcy5tYXAoKHNvdXJjZSwgYykgPT4ge1xuICAgICAgICBjb25zdCBsYXllciA9IHZpZXdlci5hZGRJbWFnZShzb3VyY2UsIHtcbiAgICAgICAgICBuYW1lOiBgcmdiJHtjfWAsXG4gICAgICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICAgICAgaW50ZXJwb2xhdGlvbjogcmdiLmludGVycG9sYXRpb24sXG4gICAgICAgICAgLi4uKGJhbmRzLnNjYWxlID8geyBzY2FsZTogYmFuZHMuc2NhbGUgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZpZXdlci5sYXllcnMubW92ZShsYXllciwgYXQgKyAxICsgYyk7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH0pO1xuICAgICAgcmdiLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5iYW5kTGF5ZXJzLmZvckVhY2goKGxheWVyLCBjKSA9PiB7XG4gICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gdGludENvbG9ybWFwKHN0Py5jb2xvciA/PyB0aW50Rm9yKGMpKTtcbiAgICAgIGxheWVyLmNvbnRyYXN0TGltaXRzID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgICAgbGF5ZXIuZ2FtbWEgPSB0b05hcGFyaUdhbW1hKHN0Py5nYW1tYSk7IC8vIEltYWdlSiDOsyDihpIgbmFwYXJpLWpzIM6zXG4gICAgICBsYXllci52aXNpYmxlID0gc3Q/LnZpc2libGUgPz8gdHJ1ZTtcbiAgICAgIGxheWVyLmludmVydCA9IGRpc3BsYXkuaW52ZXJ0O1xuICAgIH0pO1xuICAgIG1lcmdlT250b0JsYWNrKHRoaXMuYmFuZExheWVycyk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiAoUmUpaW5zdGFsbCB0aGUgcGh5c2ljYWwgc2NhbGUgYmFyIChuYXBhcmktanMncyBgU2NhbGVCYXJPdmVybGF5YCBvbiB0aGUgMkQgY2FtZXJhJ3Mgem9vbSksXG4gICAqICBzaXplZCBmcm9tIHRoZSBpbWFnZSdzIMK1bS9waXhlbCAoYC90aWxlcy9pbmZvYCBtcHBYLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhKS5cbiAgICogIE5vLW9wIHdpdGhvdXQgYSBwaHlzaWNhbCBzaXplLiAqL1xuICBpbnN0YWxsU2NhbGVCYXIoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1wcFggPSBjdHgudGlsZXMubXBwWChjdHguaW5mbygpKTtcbiAgICBpZiAobXBwWCA+IDApIHRoaXMuc2NhbGVCYXIgPSBuZXcgU2NhbGVCYXJPdmVybGF5KGN0eC5ob3N0LCBjdHgudmlld2VyLCB7IHVuaXRQZXJXb3JsZDogbXBwWCwgbW9kZTogJzJkJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3ZlcnZpZXcgbmF2aWdhdG9yIChuYXBhcmktanMncyBgTmF2aWdhdG9yT3ZlcmxheWApOiBhIGNvYXJzZSB0aHVtYm5haWwgb2YgdGhlIHdob2xlXG4gICAqIGltYWdlIHdpdGggdGhlIHZpZXdwb3J0IG9uIGl0OyBjbGljayBvciBkcmFnIHRvIHBhbiBhdCB0aGUgY3VycmVudCB6b29tIChhcyBPU0QpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsTmF2aWdhdG9yKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIHRoaXMubmF2aWdhdG9yPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBudWxsO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY3R4LmltYWdlU2l6ZSgpO1xuICAgIGlmICghd2lkdGggfHwgIWhlaWdodCkgcmV0dXJuO1xuICAgIHRoaXMubmF2aWdhdG9yID0gbmV3IE5hdmlnYXRvck92ZXJsYXkoY3R4Lmhvc3QsIGN0eC52aWV3ZXIsIHtcbiAgICAgIHdvcmxkV2lkdGg6IHdpZHRoLFxuICAgICAgd29ybGRIZWlnaHQ6IGhlaWdodCxcbiAgICAgIG9uRW50ZXI6ICgpID0+IHRoaXMub3B0cy5vbk5hdmlnYXRvckludGVyYWN0Py4oKSxcbiAgICAgIHZpc2libGU6IGN0eC5zZXR0aW5ncy5uYXZpZ2F0b3JWaXNpYmxlLFxuICAgIH0pO1xuICAgIHZvaWQgdGhpcy5yZWZyZXNoTmF2aWdhdG9ySW1hZ2Uoeik7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgbmF2aWdhdG9yJ3MgdGh1bWJuYWlsIGZyb20gdGhlIGNvYXJzZXN0IHB5cmFtaWQgbGV2ZWwuIEEgbXVsdGljaGFubmVsIGltYWdlXG4gICAqIGlzIGNvbXBvc2l0ZWQgZnJvbSBpdHMgY2hhbm5lbHMgaW4gdGhlaXIgZGlzcGxheSBjb2xvdXJzIChzZWUge0BsaW5rIHJlY29sb3JOYXZpZ2F0b3J9KSxcbiAgICogc28gdGhlIG92ZXJ2aWV3IGxvb2tzIGxpa2UgdGhlIHZpZXcgcmF0aGVyIHRoYW4gbGlrZSBjaGFubmVsIDAgaW4gZ3JleS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaE5hdmlnYXRvckltYWdlKHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5hdiA9IHRoaXMubmF2aWdhdG9yO1xuICAgIGlmICghbmF2KSByZXR1cm47XG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMubmF2aWdhdG9yVG9rZW47XG4gICAgY29uc3QgeyB0aWxlcyB9ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuY3R4LmluZm8oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzYyA9IGF3YWl0IHRpbGVzLmVuc3VyZURlc2NyaXB0b3IoaW5mbyk7XG4gICAgICAvLyBTdXBlcnNlZGVkIChhIG5ld2VyIHNsaWNlLCBvciB0aGUgc2NlbmUgd2FzIHRvcm4gZG93bik6IGZldGNoIG5vdGhpbmcuXG4gICAgICBpZiAodG9rZW4gIT09IHRoaXMubmF2aWdhdG9yVG9rZW4gfHwgdGhpcy5uYXZpZ2F0b3IgIT09IG5hdikgcmV0dXJuO1xuICAgICAgLy8gQSBzZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbCBzdGFjaydzIHRodW1ibmFpbHMgYXJlIGl0cyBvd24gY2hhbm5lbCBwbGFuZXMuXG4gICAgICBjb25zdCBjb3VudCA9IGRlc2M/Lm11bHRpY2hhbm5lbFxuICAgICAgICA/IChkZXNjLmNoYW5uZWxJbmZvPy5sZW5ndGggPz8gMClcbiAgICAgICAgOiBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwodGlsZXMuaXNTaW1wbGUoaW5mbyksIGluZm8pXG4gICAgICAgICAgPyAoaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LmNoYW5uZWxDb3VudCA/PyAwKVxuICAgICAgICAgIDogMDtcbiAgICAgIGlmIChjb3VudCA+IDEpIHtcbiAgICAgICAgY29uc3QgYml0bWFwcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfYywgYykgPT4gdGlsZXMub3ZlcnZpZXdJbWFnZShpbmZvLCB6LCBjKSksXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5uYXZpZ2F0b3JUb2tlbiB8fCB0aGlzLm5hdmlnYXRvciAhPT0gbmF2KSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0TmF2aWdhdG9yQ2hhbm5lbHMoYml0bWFwcyk7XG4gICAgICAgIHRoaXMucmVjb2xvck5hdmlnYXRvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aWxlcy5vdmVydmlld0ltYWdlKGluZm8sIHopO1xuICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMubmF2aWdhdG9yVG9rZW4gfHwgdGhpcy5uYXZpZ2F0b3IgIT09IG5hdikgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldE5hdmlnYXRvckNoYW5uZWxzKG51bGwpO1xuICAgICAgICBuYXYuc2V0SW1hZ2UoaW1hZ2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBuYXZpZ2F0b3IgdGh1bWJuYWlsIHVuYXZhaWxhYmxlJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVwbGFjZSB0aGUgcGVyLWNoYW5uZWwgdGh1bWJuYWlsIGJpdG1hcHMgKGNsb3NpbmcgdGhlIHByZXZpb3VzIG9uZXMpLiAqL1xuICBwcml2YXRlIHNldE5hdmlnYXRvckNoYW5uZWxzKGJpdG1hcHM6IE92ZXJ2aWV3SW1hZ2VbXSB8IG51bGwpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGJtcCBvZiB0aGlzLm5hdmlnYXRvckNoYW5uZWxzID8/IFtdKSBpZiAoJ2Nsb3NlJyBpbiBibXApIGJtcC5jbG9zZT8uKCk7XG4gICAgdGhpcy5uYXZpZ2F0b3JDaGFubmVscyA9IGJpdG1hcHM7XG4gICAgdGhpcy5uYXZpZ2F0b3JUaW50S2V5ID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ29tcG9zaXRlIHRoZSBtdWx0aWNoYW5uZWwgdGh1bWJuYWlsIGluIHRoZSBjaGFubmVscycgQ1VSUkVOVCBkaXNwbGF5IHRpbnRzLCBza2lwcGluZyBoaWRkZW5cbiAgICogY2hhbm5lbHMg4oCUIHRoZSBzdG9yZSdzIGNoYW5uZWwgc3RhdGVzLCBhcyB0aGUgMkQgbGF5ZXJzIHVzZSwgbm90IHRoZSBzZXJ2ZXIncyBkZWZhdWx0cy5cbiAgICogUmUtcnVuIG9uIGV2ZXJ5IGRpc3BsYXktc3RhdGUgY2hhbmdlOyBpdCBvbmx5IHJlZHJhd3MgKG5ldmVyIHJlLWZldGNoZXMpLCBhbmQgb25seSB3aGVuIGFcbiAgICogdGludCBvciBhIHZpc2liaWxpdHkgYWN0dWFsbHkgY2hhbmdlZCwgc28gYSB3aW5kb3cvZ2FtbWEgZHJhZyBjb3N0cyBhIHN0cmluZyBjb21wYXJlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvbG9yTmF2aWdhdG9yKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hdiA9IHRoaXMubmF2aWdhdG9yO1xuICAgIGNvbnN0IGJpdG1hcHMgPSB0aGlzLm5hdmlnYXRvckNoYW5uZWxzO1xuICAgIGlmICghbmF2IHx8ICFiaXRtYXBzKSByZXR1cm47XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuY3R4LnRpbGVzLmN1cnJlbnREZXNjcmlwdG9yKHRoaXMuY3R4LmluZm8oKSk/LmNoYW5uZWxJbmZvO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuY3R4LnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3Qgc2hvd24gPSBiaXRtYXBzXG4gICAgICAubWFwKChibXAsIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIHJldHVybiB7IGJtcCwgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSwgY29sb3I6IHN0Py5jb2xvciA/PyBpbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYykgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChjaCkgPT4gY2gudmlzaWJsZSk7XG4gICAgY29uc3Qga2V5ID0gc2hvd24ubWFwKChjaCkgPT4gYCR7Yml0bWFwcy5pbmRleE9mKGNoLmJtcCl9OiR7Y2guY29sb3J9YCkuam9pbignfCcpO1xuICAgIGlmIChrZXkgPT09IHRoaXMubmF2aWdhdG9yVGludEtleSkgcmV0dXJuO1xuICAgIHRoaXMubmF2aWdhdG9yVGludEtleSA9IGtleTtcbiAgICBuYXYuc2V0SW1hZ2UoXG4gICAgICB0aW50ZWRDb21wb3NpdGUoXG4gICAgICAgIHNob3duLm1hcCgoY2gpID0+IGNoLmJtcCksXG4gICAgICAgIHNob3duLm1hcCgoY2gpID0+IGNoLmNvbG9yKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE5BUEFSSV9TQ0FUVEVSIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBIKTogdGhlIHNsaWNlIGltYWdlIHdpdGggYSBwb2ludHMgbGF5ZXIgYXQgZWFjaFxuICogcmVnaW9uJ3MgY2VudHJvaWQgKHRoZSBuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSdzIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyKSwgcmVidWlsdCBsaXZlIGFzXG4gKiByZWdpb25zIGNoYW5nZS4gVGhpcyBtb2RlIHBsb3RzIFJFR0lPTiBjZW50cm9pZHMsIHNvIHRoZSBpbWFnZSdzIHJlZ2lvbiB0b29scyBjb21lIHdpdGggaXQg4oCUXG4gKiBkcmF3aW5nIGEgcmVnaW9uIGFkZHMgYSBwb2ludCBhdCBvbmNlLlxuICovXG5leHBvcnQgY2xhc3MgU2NhdHRlclJlZ2lvbnNTY2VuZSBpbXBsZW1lbnRzIE5hcGFyaVNjZW5lIHtcbiAgcmVhZG9ubHkgaW1hZ2U6IEltYWdlMmRTY2VuZTtcbiAgcHJpdmF0ZSBwb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVnaW9uU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGN0eDogU2NlbmVDb250ZXh0KSB7XG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZTJkU2NlbmUoY3R4LCB7XG4gICAgICAvLyBUaGUgcmVnaW9uLWNlbnRyb2lkIHBvaW50cyB3ZW50IHdpdGggdGhlIHJlLXJlbmRlcidzIGxheWVyIGNsZWFyLlxuICAgICAgb25TbGljZTogKHJlcmVuZGVyZWQpID0+IHtcbiAgICAgICAgaWYgKHJlcmVuZGVyZWQgJiYgdGhpcy5wb2ludHMpIHRoaXMucmVidWlsZFBvaW50cygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW1hZ2UubW91bnQoKTtcbiAgICAvLyBEaXNwb3NlZCB3aGlsZSB0aGUgaW1hZ2UgbG9hZGVkOiBhIHN1YnNjcmlwdGlvbiBub3cgd291bGQgb3V0bGl2ZSB0aGUgc2NlbmUuXG4gICAgaWYgKHRoaXMuY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5yZWJ1aWxkUG9pbnRzKCk7XG4gICAgdGhpcy5yZWdpb25TdWIgPSB0aGlzLmN0eC5yZWdpb25TdG9yZS5nZXRSZWdpb25VcGRhdGVFdmVudCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlYnVpbGRQb2ludHMoKSk7XG4gICAgdGhpcy5jdHgudG9vbHMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgc2V0Wih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlLnNldFooeik7XG4gIH1cblxuICBoaXN0b2dyYW0oY2hhbm5lbDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2UuaGlzdG9ncmFtKGNoYW5uZWwsIGJpbnMpO1xuICB9XG5cbiAgc2V0SW1hZ2VTbW9vdGhpbmcoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0SW1hZ2VTbW9vdGhpbmcoZW5hYmxlZCk7XG4gIH1cblxuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlLnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucmVnaW9uU3ViID0gbnVsbDtcbiAgICB0aGlzLmltYWdlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIHBvaW50IGxheWVyIGF0IHRoZSBjdXJyZW50IHJlZ2lvbiBjZW50cm9pZHMuICovXG4gIHByaXZhdGUgcmVidWlsZFBvaW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5jdHgudmlld2VyO1xuICAgIGlmICh0aGlzLnBvaW50cykge1xuICAgICAgdi5sYXllcnMucmVtb3ZlKHRoaXMucG9pbnRzKTtcbiAgICAgIHRoaXMucG9pbnRzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gcmVnaW9uQ2VudHJvaWRzKHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSk7XG4gICAgaWYgKGNlbnRyb2lkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnBvaW50cyA9IHYuYWRkUG9pbnRzKGNlbnRyb2lkcywge1xuICAgICAgc2l6ZTogMTIsXG4gICAgICBmYWNlQ29sb3I6IFsxLCAwLjg1LCAwLjIsIDFdLFxuICAgICAgYm9yZGVyQ29sb3I6IFswLCAwLCAwLCAxXSxcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
617
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLWltYWdlLTJkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS1pbWFnZS0yZC1zY2VuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSXZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUVMLHdCQUF3QixFQUN4QixhQUFhLEVBQ2IsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBQ1osYUFBYSxFQUNiLFVBQVUsR0FDWCxNQUFNLGtCQUFrQixDQUFDO0FBZ0IxQjs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBNkI7SUFDbkQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTTtRQUFFLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDM0YsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFrQ3ZCLFlBQ21CLEdBQWlCLEVBQ2pCLE9BQXVCLEVBQUU7UUFEekIsUUFBRyxHQUFILEdBQUcsQ0FBYztRQUNqQixTQUFJLEdBQUosSUFBSSxDQUFxQjtRQW5DNUMsd0ZBQXdGO1FBQ3hGLGNB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QU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1lBQ25DLElBQUksRUFBRSxFQUFFO1lBQ1IsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixXQUFXLEVBQUUsQ0FBQztTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTXVsdGlDaGFubmVsSW1hZ2VWaWV3LCBkZWNvZGVJbWFnZVJHQkEsIGhpc3RvZ3JhbVNjYWxhciwgdGludENvbG9ybWFwIH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbFZpZXcsIEltYWdlTGF5ZXIsIFBvaW50c0xheWVyLCBUaWxlZFNvdXJjZSB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBOYXZpZ2F0b3JPdmVybGF5LCBTY2FsZUJhck92ZXJsYXkgfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuXG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBUaWxlRGVzY3JpcHRvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IHJnYk5lZWRzUmVjb2xvciB9IGZyb20gJy4uL29zZC9kaXNwbGF5LXBpcGVsaW5lJztcbmltcG9ydCB0eXBlIHsgT3ZlcnZpZXdJbWFnZSB9IGZyb20gJy4vbmFwYXJpLXRpbGUtY2xpZW50JztcbmltcG9ydCB7IHJlZ2lvbkNlbnRyb2lkcyB9IGZyb20gJy4uL3JlZ2lvbi1jZW50cm9pZHMnO1xuaW1wb3J0IHtcbiAgTHVtYVBsYW5lLFxuICBpc1NlcnZlcmxlc3NNdWx0aWNoYW5uZWwsXG4gIHNwbGl0UmdiQmFuZHMsXG4gIHRpbnRGb3IsXG4gIHRpbnRlZENvbXBvc2l0ZSxcbiAgdG9JSGlzdG9ncmFtLFxuICB0b05hcGFyaUdhbW1hLFxuICB0eXBlZFBsYW5lLFxufSBmcm9tICcuL25hcGFyaS1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgTmFwYXJpU2NlbmUsIFNjZW5lQ29udGV4dCB9IGZyb20gJy4vbmFwYXJpLXNjZW5lJztcblxuLyoqIFdoYXQgdGhlIHNjZW5lcyBidWlsdCBvdmVyIHRoZSAyRCBpbWFnZSBhZGQgdG8gaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlMmRPcHRpb25zIHtcbiAgLyoqIERyYXcgdGhlIGxvYWRlZCBpbWFnZSAoZmFsc2U6IGFuIGltYWdlLWxlc3Mgc3BhdGlhbCBkYXRhc2V0LCB0aGUgb2JzZXJ2YXRpb25zIGFsb25lKS4gKi9cbiAgaW1hZ2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byBmaXQgdGhlIGNhbWVyYSB0byB0aGUgaW1hZ2Ugb25jZSBpdCBpcyBkcmF3biAoZGVmYXVsdDogd2hlbiB0aGVyZSBpcyBvbmUpLiAqL1xuICBmaXQ/OiAoKSA9PiBib29sZWFuO1xuICAvKiogQWZ0ZXIgYSBzbGljZSBjaGFuZ2UuIGByZXJlbmRlcmVkYCB3aGVuIHRoZSBzdGl0Y2hlZCBwYXRoIHJlLXJlbmRlcmVkIHRoZSBpbWFnZSDigJQgd2hpY2hcbiAgICogIENMRUFSUyB0aGUgbGF5ZXIgbGlzdCwgdGFraW5nIGV2ZXJ5IG90aGVyIGxheWVyIHdpdGggaXQuICovXG4gIG9uU2xpY2U/OiAocmVyZW5kZXJlZDogYm9vbGVhbikgPT4gdm9pZDtcbiAgLyoqIFRoZSBwb2ludGVyIGVudGVyZWQgdGhlIG5hdmlnYXRvciAoZS5nLiB0byBoaWRlIGEgaG92ZXIgdG9vbHRpcCBvdmVyIHRoZSBjYW52YXMpLiAqL1xuICBvbk5hdmlnYXRvckludGVyYWN0PzogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBDb21wb3NpdGUgYWRkaXRpdmUgY2hhbm5lbCBsYXllcnMgb250byBibGFjaywgYXMgT1NEIGFuZCBQbG90bHkgbWVyZ2UgdGhlbTogdGhlIGJvdHRvbS1tb3N0XG4gKiBTSE9XTiBsYXllciByZXBsYWNlcyB3aGF0IGlzIHVuZGVyIGl0LCB0aGUgb3RoZXJzIGFkZCBvbnRvIGl0LiBBbGwtYWRkaXRpdmUgbGF5ZXJzIGFkZGVkIG9udG9cbiAqIHRoZSB2aWV3ZXIncyBkYXJrLWdyZXkgYmFja2dyb3VuZCBpbnN0ZWFkLCBsaWZ0aW5nIGV2ZXJ5IGJsYWNrIHBpeGVsIHRvIHRoYXQgZ3JleS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPbnRvQmxhY2sobGF5ZXJzOiByZWFkb25seSBJbWFnZUxheWVyW10pOiB2b2lkIHtcbiAgY29uc3QgYmFzZSA9IGxheWVycy5maW5kKChsYXllcikgPT4gbGF5ZXIudmlzaWJsZSk7XG4gIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSBsYXllci5ibGVuZGluZyA9IGxheWVyID09PSBiYXNlID8gJ3RyYW5zbHVjZW50JyA6ICdhZGRpdGl2ZSc7XG59XG5cbi8qKlxuICogVGhlIDJEIGltYWdlIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBFKTogcHlyYW1pZGFsIGBUaWxlZFNvdXJjZWBzIGFnYWluc3QgdGhlIGAvdGlsZWBcbiAqIGVuZHBvaW50IHdoZW4gYC90aWxlcy9pbmZvYCBkZXNjcmliZXMgdGhlIGltYWdlLCBlbHNlIGEgc2luZ2xlIHN0aXRjaGVkIGxldmVsIChgdGlsZWQ6ZmFsc2VgXG4gKiBzdGFja3MgZmV0Y2ggZWFjaCBzbGljZSdzIG93biBVUkwsIGEgc2VydmVybGVzcyBtdWx0aWNoYW5uZWwgc3RhY2sgZWFjaCBjaGFubmVsJ3Mgb3duIHBsYW5lKTtcbiAqIG11bHRpY2hhbm5lbCBhZGRpdGl2ZSB0aW50cywgZ3JheXNjYWxlIGNvbG9ybWFwIG9yIFJHQiAocmVjb2xvdXJlZCBwZXIgYmFuZCwgc2VlXG4gKiB7QGxpbmsgc3luY1JnYkJhbmRzfSk7IHRoZSBjb2Fyc2UgaGlzdG9ncmFtIHNhbXBsZXMgb2YgdGhlIHRpbGVkIHBhdGgsIHRoZSBzY2FsZSBiYXIsIHRoZVxuICogb3ZlcnZpZXcgbmF2aWdhdG9yIGFuZCB0aGUgMkQgaW50ZXJhY3Rpb24gc3RhY2sgKHJlZ2lvbiBvdmVybGF5ICsgcGl4ZWwgdG9vbHMpLiBUaGVcbiAqIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyIGFuZCB0aGUgc3BhdGlhbCAyRCBzY2VuZSBhcmUgYnVpbHQgb3ZlciBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlMmRTY2VuZSBpbXBsZW1lbnRzIE5hcGFyaVNjZW5lIHtcbiAgLyoqIEhvdyB0aGUgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIHRoZSBoaXN0b2dyYW0gYW5kIHRoZSBkaXNwbGF5LXN0YXRlIHVwZGF0ZXMpLiAqL1xuICBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBpbWFnZSBpcyByZW5kZXJlZCB2aWEgcHlyYW1pZGFsIFRpbGVkU291cmNlcyAoZGVzY3JpcHRvciBhdmFpbGFibGUpLiAqL1xuICB0aWxlZCA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCBmb3Ige0BsaW5rIGltYWdlTW9kZX0uICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGF0ZXN0IHdpbnMgZm9yIGEgc3RpdGNoZWQgc2xpY2U6IGEgc2xvdyBvbGRlciBzbGljZSBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIFJHQjogdGhlIFIsIEcgYW5kIEIgYmFuZHMgYXMgbGF5ZXIgc291cmNlcyAodHlwZWQgcGxhbmVzLCBvciBiYW5kIGBUaWxlZFNvdXJjZWBzIHRoYXQgc2hhcmVcbiAgICogIG9uZSByZXF1ZXN0IHBlciB0aWxlKSBhbmQgdGhlIHN0aXRjaGVkIGxldmVsJ3Mgc2NhbGUg4oCUIHdoYXQge0BsaW5rIHN5bmNSZ2JCYW5kc30gZHJhd3MuICovXG4gIHByaXZhdGUgcmdiQmFuZHM6IHsgc291cmNlczogQ2hhbm5lbFZpZXdbJ3NvdXJjZSddW107IHNjYWxlPzogW251bWJlciwgbnVtYmVyXSB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSR0I6IHRoZSB0aHJlZSBhZGRpdGl2ZSBiYW5kIGxheWVycyB3aGlsZSB0aGUgY2hhbm5lbCBzdGF0ZXMgcmVjb2xvdXIgdGhlIGltYWdlOyBudWxsIHdoaWxlXG4gICAqICB0aGUgUkdCIGxheWVyIGRyYXdzIGl0IGFzIGl0IGlzLiAqL1xuICBwcml2YXRlIGJhbmRMYXllcnM6IEltYWdlTGF5ZXJbXSB8IG51bGwgPSBudWxsO1xuICAvKiogQ29hcnNlIHBlci1jaGFubmVsIGx1bWluYW5jZSBzYW1wbGUgKGtleWVkIGJ5IGNoYW5uZWwgaW5kZXgpIGZvciB0aGUgaGlzdG9ncmFtIGluIHRpbGVkIG1vZGUsXG4gICAqICB3aGVyZSB0aGUgbGF5ZXJzIGhhdmUgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKAlCBhbmQgYW4gUkdCIGltYWdlJ3MgcmF3IGJhbmRzIGluIGVpdGhlciBtb2RlLlxuICAgKiAgUmVmcmVzaGVkIG9uIG1vdW50ICsgc2xpY2UgY2hhbmdlLiAqL1xuICByZWFkb25seSBoaXN0U2FtcGxlcyA9IG5ldyBNYXA8bnVtYmVyLCBVaW50OEFycmF5PigpO1xuICAvKiogTGF0ZXN0LXdpbnMgdG9rZW4gZm9yIHtAbGluayByZWZyZXNoSGlzdG9ncmFtU2FtcGxlc30uICovXG4gIHByaXZhdGUgaGlzdEdlbiA9IDA7XG4gIC8qKiBQaHlzaWNhbCBzY2FsZSBiYXIgb3ZlcmxheSAobnVsbCB3aGVuIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogU2NhbGVCYXJPdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPdmVydmlldyBtaW5pbWFwIChib3R0b20tcmlnaHQpLCBhcyBPU0QncyBuYXZpZ2F0b3IuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yOiBOYXZpZ2F0b3JPdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgcGVyIHRodW1ibmFpbCByZXF1ZXN0LCBzbyBhIHNsb3cgb25lIGNhbm5vdCBvdmVyd3JpdGUgYSBuZXdlciBzbGljZSdzLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclRva2VuID0gMDtcbiAgLyoqIFRoZSBjdXJyZW50IHNsaWNlJ3MgcGVyLWNoYW5uZWwgdGh1bWJuYWlsIGJpdG1hcHMgKG11bHRpY2hhbm5lbCBvbmx5KSwga2VwdCBzbyBhIHRpbnQgb3JcbiAgICogIHZpc2liaWxpdHkgY2hhbmdlIHJlY29sb3VycyB0aGUgdGh1bWJuYWlsIHdpdGhvdXQgcmUtZmV0Y2hpbmcgaXQuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yQ2hhbm5lbHM6IE92ZXJ2aWV3SW1hZ2VbXSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHRpbnRzL3Zpc2liaWxpdHkgdGhlIHRodW1ibmFpbCB3YXMgbGFzdCBjb21wb3NpdGVkIHdpdGgg4oCUIHNlZSB7QGxpbmsgcmVjb2xvck5hdmlnYXRvcn0uICovXG4gIHByaXZhdGUgbmF2aWdhdG9yVGludEtleSA9ICcnO1xuICBwcml2YXRlIGRpc3BsYXlTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBTY2VuZUNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRzOiBJbWFnZTJkT3B0aW9ucyA9IHt9LFxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZXQgaGFzSW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3B0cy5pbWFnZSAhPT0gZmFsc2U7XG4gIH1cblxuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICBjb25zdCB6ID0gY3R4LnooKTtcbiAgICBpZiAodGhpcy5oYXNJbWFnZSkgYXdhaXQgdGhpcy5yZW5kZXIoeik7XG4gICAgLy8gUmVzZXQgaW50byBhIG5ld2VyIHNjZW5lIHdoaWxlIHRoZSBpbWFnZSBsb2FkZWQ6IHRoaXMgc2NlbmUgaXMgYWxyZWFkeSBkaXNwb3NlZCwgYW5kIHRoZVxuICAgIC8vIHRvb2wgYnJpZGdlIGlzIHRoZSBuZXh0IHNjZW5lJ3Mg4oCUIGluc3RhbGwgbm90aGluZyBtb3JlLlxuICAgIGlmIChjdHguc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5vcHRzLmZpdCA/IHRoaXMub3B0cy5maXQoKSA6IHRoaXMuaGFzSW1hZ2UpIGN0eC5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5mb2xsb3dEaXNwbGF5U3RhdGUoKTtcbiAgICAvLyBUaGUgc2NhbGUgYmFyIGFuZCBuYXZpZ2F0b3IgZGVzY3JpYmUgYW4gaW1hZ2U7IHdpdGggbm9uZSBsb2FkZWQsIHdoYXRldmVyIHRoZXkgd291bGRcbiAgICAvLyByZWFkIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBsYXN0IG9uZS5cbiAgICBpZiAodGhpcy5oYXNJbWFnZSkge1xuICAgICAgdGhpcy5pbnN0YWxsU2NhbGVCYXIoKTtcbiAgICAgIHRoaXMuaW5zdGFsbE5hdmlnYXRvcih6KTtcbiAgICB9XG4gICAgY3R4LnRvb2xzLmluc3RhbGwyZEludGVyYWN0aW9uKGN0eC52aWV3ZXIsIGN0eC5ob3N0KTtcbiAgfVxuXG4gIHNldFooejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgaWYgKHRoaXMubmF2aWdhdG9yKSB2b2lkIHRoaXMucmVmcmVzaE5hdmlnYXRvckltYWdlKHopO1xuICAgIC8vIFRpbGVkOiBqdXN0IG1vdmUgdGhlIGRpbXMgcGxhbmUg4oCUIHRoZSB0aWxlZCB2aXN1YWwgZmV0Y2hlcyB0aGUgbmV3IHNsaWNlJ3MgdGlsZXMgKGNhY2hlZCBwZXJcbiAgICAvLyB6KSwgbm8gbGF5ZXIgcmVidWlsZC4gUmVmcmVzaCB0aGUgY29hcnNlIGhpc3RvZ3JhbSBzYW1wbGUgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMudGlsZWQpIHtcbiAgICAgIGN0eC52aWV3ZXIuZGltcy56ID0gejtcbiAgICAgIGNvbnN0IGRlc2MgPSBjdHgudGlsZXMuY3VycmVudERlc2NyaXB0b3IoY3R4LmluZm8oKSk7XG4gICAgICBpZiAoZGVzYykgdm9pZCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHosIGRlc2MpO1xuICAgICAgdGhpcy5vcHRzLm9uU2xpY2U/LihmYWxzZSk7XG4gICAgICBjdHgudG9vbHMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdGl0Y2ggZmFsbGJhY2s6IHJlLXJlbmRlciB0aGUgc2xpY2UgKHJlLWZldGNoZXMgcGVyLWNoYW5uZWwgLyBjb21wb3NpdGUpLiBUaGUgdG9rZW4gbGV0c1xuICAgIC8vIHJlbmRlciBkcm9wIGEgc3VwZXJzZWRlZCBzY3J1YiBzbyBhIHNsb3cgb2xkZXIgc2xpY2UgY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS5cbiAgICBjb25zdCByZXEgPSArK3RoaXMuc2xpY2VSZXE7XG4gICAgdm9pZCB0aGlzLnJlbmRlcih6LCByZXEpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChyZXEgIT09IHRoaXMuc2xpY2VSZXEgfHwgY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgIC8vIEFGVEVSIHRoZSBpbWFnZSwgbmV2ZXIgYmVmb3JlOiB0aGUgcmVuZGVyIGNsZWFycyB0aGUgbGF5ZXIgbGlzdCwgc28gd2hhdGV2ZXIgc2l0cyBvdmVyXG4gICAgICAgIC8vIHRoZSBpbWFnZSBpcyB3aXBlZCBieSB0aGUgdmVyeSBpbWFnZSBtZWFudCB0byBzaXQgdW5kZXIgaXQuXG4gICAgICAgIHRoaXMub3B0cy5vblNsaWNlPy4odHJ1ZSk7XG4gICAgICAgIGN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBoaXN0b2dyYW0oY2hhbm5lbDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB0aGUgY29hcnNlIHBlci1jaGFubmVsIHNhbXBsZS4gUkdCOiBpdHMgcmF3IGJhbmRcbiAgICAvLyAoZWl0aGVyIG1vZGUpIOKAlCBuZXZlciB0aGUgZGlzcGxheWVkIHBpeGVscywgd2hpY2ggdGhlIGNoYW5uZWwgc3RhdGVzIGhhdmUgcmVjb2xvdXJlZC5cbiAgICBpZiAodGhpcy50aWxlZCB8fCB0aGlzLmltYWdlTW9kZSA9PT0gJ3JnYicpIHtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsKTtcbiAgICAgIHJldHVybiBzYW1wbGUgPyB0b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKHNhbXBsZSwgYmlucywgMCwgMjU1KSkgOiBudWxsO1xuICAgIH1cbiAgICAvLyBHcmF5c2NhbGUvbXVsdGljaGFubmVsIChzdGl0Y2gpOiBuYXRpdmUgcGVyLWNoYW5uZWwgaGlzdG9ncmFtIHN0cmFpZ2h0IGZyb20gdGhlIGluLW1lbW9yeVxuICAgIC8vIHNjYWxhciBsYXllciAobm8gR1BVIHJlYWRiYWNrKS5cbiAgICBjb25zdCBsYXllciA9IHRoaXMuY2hhbm5lbFZpZXc/LmxheWVyc1t0aGlzLmltYWdlTW9kZSA9PT0gJ2dyYXlzY2FsZScgPyAwIDogY2hhbm5lbF07XG4gICAgY29uc3QgaCA9IGxheWVyID8gdGhpcy5jdHgudmlld2VyLmxheWVySGlzdG9ncmFtKGxheWVyLCBiaW5zKSA6IG51bGw7XG4gICAgcmV0dXJuIGggPyB0b0lIaXN0b2dyYW0oaCkgOiBudWxsO1xuICB9XG5cbiAgc2V0SW1hZ2VTbW9vdGhpbmcoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEFwcGx5IGxpdmUgdG8gdGhlIHJlbmRlcmVkIGltYWdlIGxheWVyczsgYmFrZWQgaW50byB0aGUgbmV4dCByZW5kZXIgdG9vLlxuICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBlbmFibGVkID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG4gICAgdGhpcy5jaGFubmVsVmlldz8uc2V0SW50ZXJwb2xhdGlvbihpbnRlcnBvbGF0aW9uKTtcbiAgICB0aGlzLmJhbmRMYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiAobGF5ZXIuaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb24pKTtcbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdG9yPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICB9XG5cbiAgLyoqIFNob3cgdGhlIG5hdmlnYXRvciBvbmx5IGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3MgcGl4ZWxzIG9mIGl0cyBvd24gKGFuZCB3aGVuIHRoZSB1c2VyXG4gICAqICB3YW50cyBpdCk6IHdpdGggbm8gaW1hZ2Ugb2YgaXRzIG93biB0aGVyZSBpcyBub3RoaW5nIGZvciBhbiBvdmVydmlldyB0byBzaG93LiAqL1xuICBzaG93TmF2aWdhdG9yRm9yKGRhdGFzZXRIYXNQaXhlbHM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvcj8uc2V0VmlzaWJsZShkYXRhc2V0SGFzUGl4ZWxzICYmIHRoaXMuY3R4LnNldHRpbmdzLm5hdmlnYXRvclZpc2libGUpO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgICB0aGlzLnNjYWxlQmFyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgdGhpcy5zZXROYXZpZ2F0b3JDaGFubmVscyhudWxsKTtcbiAgICB0aGlzLmhpc3RHZW4rKztcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG51bGw7XG4gICAgdGhpcy5yZ2JCYW5kcyA9IG51bGw7XG4gICAgdGhpcy5iYW5kTGF5ZXJzID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgc2xpY2UgYHpgLiBXaXRoIGEgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciBlYWNoIGxheWVyIGlzIGEgcHlyYW1pZGFsXG4gICAqIHtAbGluayBUaWxlZFNvdXJjZX0sIHNvIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb24gb24gem9vbSAobGlrZSBPU0QpIGFuZCBzaXRzXG4gICAqIG5hdHVyYWxseSBpbiBmdWxsLXJlc29sdXRpb24gY29vcmRpbmF0ZXM7IHdpdGhvdXQgb25lLCB0aGUgc2luZ2xlLWxldmVsIHN0aXRjaC4gVGhyZWUgZGlzcGxheVxuICAgKiBtb2RlcyBlaXRoZXIgd2F5OiBtdWx0aWNoYW5uZWwgYWRkaXRpdmUgdGludCwgZ3JheXNjYWxlIGNvbG9ybWFwLCBSR0IuXG4gICAqL1xuICBhc3luYyByZW5kZXIoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGNvbnN0IHNjZW5lID0gY3R4LnNpZ25hbDtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgY3R4LnRpbGVzLmVuc3VyZURlc2NyaXB0b3IoY3R4LmluZm8oKSk7XG4gICAgLy8gUmVzZXQgaW50byBhIG5ld2VyIHNjZW5lIHdoaWxlIHRoZSBkZXNjcmlwdG9yIHdhcyBpbiBmbGlnaHQ6IHRoaXMgcmVuZGVyIGlzIHN1cGVyc2VkZWQuXG4gICAgaWYgKHNjZW5lLmFib3J0ZWQpIHJldHVybjtcbiAgICBpZiAoZGVzYyAmJiBkZXNjLmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBpZiAodG9rZW4gIT0gbnVsbCAmJiB0b2tlbiAhPT0gdGhpcy5zbGljZVJlcSkgcmV0dXJuO1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJUaWxlZCh6LCBkZXNjLCBzY2VuZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlclN0aXRjaGVkKHosIHRva2VuKTtcbiAgfVxuXG4gIC8qKiBTaW5nbGUtbGV2ZWwgc3RpdGNoIGZhbGxiYWNrIChubyBkZXNjcmlwdG9yKTogdGhlIHByZS10aWxpbmcgcGF0aC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJTdGl0Y2hlZCh6OiBudW1iZXIsIHRva2VuPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgY29uc3QgaW5mbyA9IGN0eC5pbmZvKCk7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IGN0eC50aWxlcy5lbnN1cmVEZXNjcmlwdG9yKGluZm8pO1xuICAgIGNvbnN0IHN0YXRlcyA9IGN0eC5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIC8vIEEgc2VydmVybGVzcyBtdWx0aWNoYW5uZWwgc3RhY2sgaGFzIG5vIGRlc2NyaXB0b3I6IGl0cyBjaGFubmVscyBhcmUgaXRzIG93biBwbGFuZSBVUkxzXG4gICAgLy8gKGBjaGFubmVsVXJsc1t6XVtjXWAsIHdoaWNoIGZldGNoQ2hhbm5lbERhdGEgcmVhZHMpLCBhbmQgYHVybHNbel1gIG9ubHkgYSBjb21wb3NpdGUuXG4gICAgY29uc3Qgc2VydmVybGVzc01jID0gaXNTZXJ2ZXJsZXNzTXVsdGljaGFubmVsKGN0eC50aWxlcy5pc1NpbXBsZShpbmZvKSwgaW5mbyk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID1cbiAgICAgIGRlc2M/LmNoYW5uZWxzID8/IChzZXJ2ZXJsZXNzTWMgPyAoaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LmNoYW5uZWxDb3VudCA/PyAxKSA6IHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gKCEhZGVzYz8ubXVsdGljaGFubmVsIHx8IHNlcnZlcmxlc3NNYykgJiYgY2hhbm5lbENvdW50ID4gMTtcblxuICAgIC8vIDEpIEZldGNoIGFsbCBwaXhlbCBkYXRhIEJFRk9SRSB0b3VjaGluZyB0aGUgdmlld2VyLCBzbyBhIHN1cGVyc2VkZWQgc2NydWIgY2FuIGJhaWwgd2l0aG91dFxuICAgIC8vICAgIGhhdmluZyB0b3JuIGRvd24gdGhlIHZpc2libGUgbGF5ZXJzIChhdm9pZHMgZmxpY2tlciAvIG91dC1vZi1vcmRlciBsYXllciBzdGF0ZSkuXG4gICAgbGV0IG1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJztcbiAgICBsZXQgcGxhbmVzOiBMdW1hUGxhbmVbXSA9IFtdO1xuICAgIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgbW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgcGxhbmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGNoYW5uZWxDb3VudCB9LCAoXywgYykgPT4gY3R4LnRpbGVzLmZldGNoQ2hhbm5lbERhdGEoaW5mbywgeiwgYykpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgbW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgLy8gQ29tcG9zaXRlIGZldGNoIChubyBjaGFubmVsKSDihpIgYWxsIG92ZXJ2aWV3IGxldmVscyB1c2FibGUsIHNvIGEgbGFyZ2UgZ3JheXNjYWxlIGltYWdlXG4gICAgICAvLyBzZWxlY3RzIGEgZml0dGluZyBkb3duc2NhbGVkIGxldmVsIGluc3RlYWQgb2YgdGhlIGZ1bGwtcmVzIHJlYWwgbGV2ZWwgKHRleHR1cmUgbGltaXQpLlxuICAgICAgcGxhbmVzID0gW2F3YWl0IGN0eC50aWxlcy5mZXRjaENoYW5uZWxEYXRhKGluZm8sIHopXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZSA9ICdyZ2InO1xuICAgICAgLy8gVGhlIGJpdG1hcCBkcmF3cyB0aGUgaW1hZ2UgYXMgaXQgaXM7IGl0cyByYXcgYmFuZHMsIHRoZSBwZXItYmFuZCBsYXllcnMgYW5kIGhpc3RvZ3JhbXMuXG4gICAgICBiaXRtYXAgPSBhd2FpdCBjdHgudGlsZXMuZmV0Y2hJbWFnZShpbmZvLCB6KTtcbiAgICAgIHBsYW5lcyA9IHNwbGl0UmdiQmFuZHMoZGVjb2RlSW1hZ2VSR0JBKGJpdG1hcCkpO1xuICAgIH1cblxuICAgIC8vIDIpIENvbW1pdCDigJQgdW5sZXNzIGEgbmV3ZXIgc2NydWIgc3VwZXJzZWRlZCB1cyBvciB0aGUgc2NlbmUgd2FzIHRvcm4gZG93bi5cbiAgICBpZiAoKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHx8IGN0eC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgYml0bWFwPy5jbG9zZT8uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGRpc3BsYXllZCB0ZXh0dXJlIG1heSBiZSBhIGRvd25zY2FsZWQgcHlyYW1pZCBsZXZlbDsgc2NhbGUgdGhlIGxheWVyIGludG8gRlVMTC1SRVNPTFVUSU9OXG4gICAgLy8gd29ybGQgY29vcmRpbmF0ZXMgKGxldmVsLTAgcGl4ZWxzKSBzbyB0aGUgY2FtZXJhLCByZWFkYmFjayBhbmQg4oCUIGNyaXRpY2FsbHkg4oCUIHByZS1zYXZlZFxuICAgIC8vIHJlZ2lvbnMgKHN0b3JlZCBpbiBmdWxsLXJlcyBjb29yZHMsIGUuZy4gbmRwaSkgYWxsIGxpbmUgdXAgcmVnYXJkbGVzcyBvZiB3aGljaCBsZXZlbCBpcyBzaG93bi5cbiAgICAvLyBUaGlzIG1pcnJvcnMgT1NELCB3aG9zZSBjb29yZGluYXRlIHN5c3RlbSBpcyBhbHdheXMgbGV2ZWwgMC5cbiAgICBjb25zdCB0ZXhXID0gcGxhbmVzWzBdPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IHRleEggPSBwbGFuZXNbMF0/LmhlaWdodCA/PyAwO1xuICAgIGNvbnN0IGZ1bGxXID0gZGVzYz8ud2lkdGggfHwgdGV4VyB8fCAxO1xuICAgIGNvbnN0IGZ1bGxIID0gZGVzYz8uaGVpZ2h0IHx8IHRleEggfHwgMTtcbiAgICBjb25zdCBzY2FsZTogW251bWJlciwgbnVtYmVyXSA9IFt0ZXhXID8gZnVsbFcgLyB0ZXhXIDogMSwgdGV4SCA/IGZ1bGxIIC8gdGV4SCA6IDFdO1xuXG4gICAgdGhpcy5pbWFnZU1vZGUgPSBtb2RlO1xuICAgIGNvbnN0IGludGVycG9sYXRpb246ICdsaW5lYXInIHwgJ25lYXJlc3QnID0gY3R4LnNldHRpbmdzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcoY3R4LnZpZXdlcik7XG4gICAgdGhpcy5iYW5kTGF5ZXJzID0gbnVsbDsgLy8gdGhlIHJlbmRlciBjbGVhcnMgdGhlIGxheWVyIGxpc3QsIGJhbmQgbGF5ZXJzIGluY2x1ZGVkXG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICBjb25zdCB2aWV3cyA9IHBsYW5lcy5tYXAoKGQsIGMpID0+IHRoaXMudGludGVkQ2hhbm5lbFZpZXcoYywgc3RhdGVzLCBkZXNjLCB0eXBlZFBsYW5lKGQpLCBzY2FsZSkpO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ211bHRpY2hhbm5lbCcsIHZpZXdzLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgICBtZXJnZU9udG9CbGFjayh0aGlzLmNoYW5uZWxWaWV3LmxheWVycyk7XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSAnZ3JheXNjYWxlJykge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ3JheXNjYWxlQ2hhbm5lbFZpZXcoc3RhdGVzWzBdLCB0eXBlZFBsYW5lKHBsYW5lc1swXSksIHNjYWxlKTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdncmF5c2NhbGUnLCBbdmlld10sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogYml0bWFwIGFzIEltYWdlQml0bWFwLCBzY2FsZSB9XSwgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgICAgdGhpcy5yZ2JCYW5kcyA9IHsgc291cmNlczogcGxhbmVzLm1hcCh0eXBlZFBsYW5lKSwgc2NhbGUgfTtcbiAgICAgIHRoaXMuaGlzdFNhbXBsZXMuY2xlYXIoKTtcbiAgICAgIHBsYW5lcy5mb3JFYWNoKChiYW5kLCBjKSA9PiB0aGlzLmhpc3RTYW1wbGVzLnNldChjLCBiYW5kLmRhdGEpKTtcbiAgICAgIHRoaXMuc3luY1JnYkJhbmRzKHN0YXRlcyk7XG4gICAgfVxuICAgIGN0eC5zZXRJbWFnZVNpemUoZnVsbFcsIGZ1bGxIKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgd2l0aCBweXJhbWlkYWwge0BsaW5rIFRpbGVkU291cmNlfXMg4oCUIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb24gYXMgeW91XG4gICAqIHpvb20gaW4gKHRoZSB2aXN1YWwgZmV0Y2hlcyB0aGUgbGV2ZWwgd2hvc2UgdGV4ZWxzIOKJiCBzY3JlZW4gcGl4ZWxzKSBhbmQgc2l0cyBpbiBmdWxsLXJlc1xuICAgKiBjb29yZGluYXRlcyBzbyByZWdpb25zIGFsaWduLiBTYW1lIHRocmVlIG1vZGVzIGFzIHRoZSBzdGl0Y2ggcGF0aC4gUGVyLWNoYW5uZWwgbGF5ZXJzIHVzZSB0aGVcbiAgICogUkVBTCBweXJhbWlkIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgb25seSBleGlzdCB0aGVyZSk7IHRoZSBjb21wb3NpdGUgdXNlcyBhbGwgbGV2ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJUaWxlZCh6OiBudW1iZXIsIGRlc2M6IFRpbGVEZXNjcmlwdG9yLCBzY2VuZTogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICAvLyBUaGUgZGVzY3JpcHRvcidzIGNoYW5uZWwgbmFtZXMgYW5kIHRpbnRzLCB3aGljaCBhIGhvc3QncyBpbWFnZSBtZXRhIG1heSBub3QgY2FycnkuXG4gICAgY3R4LnN0b3JlLmFkb3B0Q2hhbm5lbEluZm8oZGVzYy5jaGFubmVsSW5mbyk7XG4gICAgY29uc3Qgc3RhdGVzID0gY3R4LnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gZGVzYy5jaGFubmVscyA/PyAoc3RhdGVzLmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2MubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSBjdHguc2V0dGluZ3MuaW1hZ2VTbW9vdGhpbmcgPyAnbGluZWFyJyA6ICduZWFyZXN0JztcblxuICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBuZXcgTXVsdGlDaGFubmVsSW1hZ2VWaWV3KGN0eC52aWV3ZXIpO1xuXG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAnbXVsdGljaGFubmVsJztcbiAgICAgIGNvbnN0IHZpZXdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PlxuICAgICAgICB0aGlzLnRpbnRlZENoYW5uZWxWaWV3KGMsIHN0YXRlcywgZGVzYywgdGhpcy50aWxlZFNvdXJjZShkZXNjLCBjLCAxLCBzY2VuZSkpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgICAgbWVyZ2VPbnRvQmxhY2sodGhpcy5jaGFubmVsVmlldy5sYXllcnMpO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ3JheXNjYWxlQ2hhbm5lbFZpZXcoc3RhdGVzWzBdLCB0aGlzLnRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgMSwgc2NlbmUpKTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdncmF5c2NhbGUnLCBbdmlld10sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAncmdiJztcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IHRoaXMudGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCA0LCBzY2VuZSkgfV0sIHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZ2JCYW5kcyA9IHtcbiAgICAgICAgc291cmNlczogY3R4LnRpbGVzLnJnYkJhbmRTb3VyY2VzKGRlc2MsIHNjZW5lLCAoKSA9PiB0aGlzLmN0eC5iYWRnZS5iZWdpbignSW1hZ2UnKSksXG4gICAgICB9O1xuICAgICAgdGhpcy5zeW5jUmdiQmFuZHMoc3RhdGVzKTtcbiAgICB9XG4gICAgY3R4LnNldEltYWdlU2l6ZShkZXNjLndpZHRoLCBkZXNjLmhlaWdodCk7XG4gICAgLy8gQXdhaXQgb24gdGhlIGluaXRpYWwgcmVuZGVyIHNvIGdldEhpc3RvZ3JhbS9hdXRvQ29udHJhc3QgaGF2ZSBkYXRhIGltbWVkaWF0ZWx5OyBzbGljZSBjaGFuZ2VzXG4gICAgLy8gcmVmcmVzaCBmaXJlLWFuZC1mb3JnZXQgKHRoZSBoaXN0b2dyYW0gcGFuZSByZXRyaWVzKS5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHosIGRlc2MpO1xuICB9XG5cbiAgLyoqIEEgcHlyYW1pZGFsIFRpbGVkU291cmNlIHdob3NlIHRpbGVzIGNvdW50IG9uIHRoZSBsb2FkaW5nIGJhZGdlIHdoaWxlIGBzY2VuZWAgKHRoZSByZW5kZXIgdGhhdFxuICAgKiAgYXNrZWQgZm9yIGl0LCB0YWtlbiBiZWZvcmUgaXRzIGF3YWl0cykgaXMgY3VycmVudC4gKi9cbiAgdGlsZWRTb3VyY2UoXG4gICAgZGVzYzogVGlsZURlc2NyaXB0b3IsXG4gICAgY2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYW5uZWxzOiAxIHwgNCxcbiAgICBzY2VuZTogQWJvcnRTaWduYWwsXG4gICk6IFRpbGVkU291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5jdHgudGlsZXMudGlsZWRTb3VyY2UoZGVzYywgY2hhbm5lbCwgY2hhbm5lbHMsIHNjZW5lLCAoKSA9PiB0aGlzLmN0eC5iYWRnZS5iZWdpbignSW1hZ2UnKSk7XG4gIH1cblxuICAvKiogQ2hhbm5lbCBgY2AncyBsYXllciBpbiB0aGUgYWRkaXRpdmUgbXVsdGljaGFubmVsIGNvbXBvc2l0ZTogdGludGVkIGJ5IGl0cyBkaXNwbGF5IGNvbG91clxuICAgKiAgKHN0b3JlLCBlbHNlIGRlc2NyaXB0b3IsIGVsc2UgdGhlIEZpamkgcGFsZXR0ZSksIHdpdGggaXRzIHdpbmRvdywgZ2FtbWEgYW5kIHZpc2liaWxpdHkuICovXG4gIHByaXZhdGUgdGludGVkQ2hhbm5lbFZpZXcoXG4gICAgYzogbnVtYmVyLFxuICAgIHN0YXRlczogSUNoYW5uZWxTdGF0ZVtdLFxuICAgIGRlc2M6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCxcbiAgICBzb3VyY2U6IENoYW5uZWxWaWV3Wydzb3VyY2UnXSxcbiAgICBzY2FsZT86IFtudW1iZXIsIG51bWJlcl0sXG4gICk6IENoYW5uZWxWaWV3IHtcbiAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlLFxuICAgICAgdGludDogc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyksXG4gICAgICBuYW1lOiBzdD8ubmFtZSA/PyBgY2gke2N9YCxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICBnYW1tYTogdG9OYXBhcmlHYW1tYShzdD8uZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgIGludmVydDogdGhpcy5jdHguZGlzcGxheS5pbnZlcnQsXG4gICAgICAuLi4oc2NhbGUgPyB7IHNjYWxlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlIGdyYXlzY2FsZSBsYXllcjogdGhlIHNlbGVjdGVkIGNvbG9ybWFwLCB3aXRoIHRoZSBjaGFubmVsJ3Mgd2luZG93IGFuZCBnYW1tYS4gKi9cbiAgcHJpdmF0ZSBncmF5c2NhbGVDaGFubmVsVmlldyhcbiAgICBzdDogSUNoYW5uZWxTdGF0ZSB8IHVuZGVmaW5lZCxcbiAgICBzb3VyY2U6IENoYW5uZWxWaWV3Wydzb3VyY2UnXSxcbiAgICBzY2FsZT86IFtudW1iZXIsIG51bWJlcl0sXG4gICk6IENoYW5uZWxWaWV3IHtcbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlLFxuICAgICAgY29sb3JtYXA6IHRoaXMuY3R4LmRpc3BsYXkuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICBnYW1tYTogdG9OYXBhcmlHYW1tYShzdD8uZ2FtbWEpLCAvLyBJbWFnZUogzrMg4oaSIG5hcGFyaS1qcyDOs1xuICAgICAgaW52ZXJ0OiB0aGlzLmN0eC5kaXNwbGF5LmludmVydCxcbiAgICAgIC4uLihzY2FsZSA/IHsgc2NhbGUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIChSZSlmZXRjaCBhIGNvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIGZvciB0aGUgaGlzdG9ncmFtICh0aWxlZCBtb2RlIGhhcyBubyBmdWxsXG4gICAqICBpbi1tZW1vcnkgcGl4ZWxzKS4gT25lIGNoZWFwIG92ZXJ2aWV3IHRpbGUgcGVyIGNoYW5uZWwsIGZldGNoZWQgdG9nZXRoZXI7IGNhY2hlZCBieSBjaGFubmVsXG4gICAqICBpbmRleC4gTGF0ZXN0IHdpbnM6IGEgc2NydWIgZmlyZXMgb25lIHJlZnJlc2ggcGVyIHNsaWNlLCBhbmQgYW4gb2xkZXIgc2xpY2UncyBzYW1wbGVzIHRoYXRcbiAgICogIGxhbmQgYWZ0ZXIgYSBuZXdlciBvbmUncyBhcmUgZHJvcHBlZCByYXRoZXIgdGhhbiBzaG93biBhcyB0aGUgY3VycmVudCBkaXN0cmlidXRpb24uICovXG4gIGFzeW5jIHJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHo6IG51bWJlciwgZGVzYzogUGljazxUaWxlRGVzY3JpcHRvciwgJ2NoYW5uZWxzJz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnZW4gPSArK3RoaXMuaGlzdEdlbjtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuY3R4LmluZm8oKTtcbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSB7XG4gICAgICAvLyBPbmUgY29hcnNlIGNvbXBvc2l0ZSB0aWxlLCBzcGxpdCBpbnRvIGl0cyByYXcgUiwgRyBhbmQgQiBiYW5kcy5cbiAgICAgIGNvbnN0IGJhbmRzID0gYXdhaXQgdGhpcy5jdHgudGlsZXMucmVhZFJnYkJhbmRzKGluZm8sIHosIDEpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgaWYgKGdlbiAhPT0gdGhpcy5oaXN0R2VuIHx8ICFiYW5kcykgcmV0dXJuO1xuICAgICAgYmFuZHMuZm9yRWFjaCgoYmFuZCwgYykgPT4gdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgYmFuZC5kYXRhKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJztcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBtdWx0aWNoYW5uZWwgPyAoZGVzYy5jaGFubmVscyA/PyAxKSA6IDE7XG4gICAgY29uc3Qgc2FtcGxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY2hhbm5lbENvdW50IH0sIChfLCBjKSA9PlxuICAgICAgICAvLyBidWRnZXQgMSDihpIgY29hcnNlc3Qgc2luZ2xlIHRpbGU7IGEgZmFpbGVkIGNoYW5uZWwgbGVhdmVzIGl0cyBzYW1wbGUgdW5zZXQuXG4gICAgICAgIHRoaXMuY3R4LnRpbGVzLmZldGNoQ2hhbm5lbERhdGEoaW5mbywgeiwgbXVsdGljaGFubmVsID8gYyA6IHVuZGVmaW5lZCwgMSkudGhlbihcbiAgICAgICAgICAoZCkgPT4gZC5kYXRhLFxuICAgICAgICAgICgpID0+IG51bGwsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG4gICAgaWYgKGdlbiAhPT0gdGhpcy5oaXN0R2VuKSByZXR1cm47XG4gICAgc2FtcGxlcy5mb3JFYWNoKChkYXRhLCBjKSA9PiB7XG4gICAgICBpZiAoZGF0YSkgdGhpcy5oaXN0U2FtcGxlcy5zZXQoYywgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2hhbm5lbCBzdGF0ZXMgKyBncmF5c2NhbGUgY29sb3JtYXAg4oaSIGxpdmUtYXBwbHkgdG8gdGhlIHJlbmRlcmVkIGxheWVycyAobm8gcmUtZmV0Y2g7IG9ubHkgelxuICAgKiAgY2hhbmdlcyByZS1mZXRjaCksIGFuZCByZWNvbG91ciB0aGUgbmF2aWdhdG9yIHRodW1ibmFpbC4gKi9cbiAgcHJpdmF0ZSBmb2xsb3dEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gdGhpcy5jdHguZGlzcGxheS53YXRjaCgoY2hhbm5lbHMpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHMpO1xuICAgICAgdGhpcy5yZWNvbG9yTmF2aWdhdG9yKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IHRoZSBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIGJhY2sgb24gdGhlIHJlbmRlcmVkIGxheWVyczogZWFjaCBjaGFubmVsJ3MgdmlzaWJpbGl0eSwgd2luZG93LFxuICAgKiBnYW1tYSBhbmQgdGludCwgYW5kIHdoaWNoIG9mIGFuIFJHQiBpbWFnZSdzIGxheWVycyBkcmF3IGl0LiBGb3IgYSBjYWxsZXIgdGhhdCBjaGFuZ2VkIHRoZVxuICAgKiBsYXllcnMnIHZpc2liaWxpdHkgd2hvbGVzYWxlICh0aGUgc3BhdGlhbCB2aWV3IHNob3dpbmcgaXRzIHRpc3N1ZSBhZ2FpbiksIHNvIHRoZSBjaGFubmVsc1xuICAgKiB0aGUgdXNlciBvciB0aGUgZGVmYXVsdHMgc3dpdGNoZWQgb2ZmIHN0YXkgb2ZmLiBOb3RoaW5nIHRvIGRvIGJlZm9yZSB0aGUgaW1hZ2UgaXMgZHJhd24uXG4gICAqL1xuICByZWFwcGx5RGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFubmVsVmlldykgcmV0dXJuO1xuICAgIHRoaXMuYXBwbHlEaXNwbGF5U3RhdGUodGhpcy5jdHguc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSk7XG4gIH1cblxuICAvKiogQXBwbHkgdGhlIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgLyBjb2xvcm1hcCB0byB0aGUgbGl2ZSBsYXllcnMgKG5vIHJlLWZldGNoKSwgZGVsZWdhdGluZyB0aGVcbiAgICogIHBlci1jaGFubmVsIGxheWVyIG11dGF0aW9ucyB0byB0aGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30uICovXG4gIHByaXZhdGUgYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHM6IElDaGFubmVsU3RhdGVbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmNoYW5uZWxWaWV3O1xuICAgIGNvbnN0IHsgZGlzcGxheSB9ID0gdGhpcy5jdHg7XG4gICAgaWYgKCF2aWV3KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAncmdiJykge1xuICAgICAgdGhpcy5zeW5jUmdiQmFuZHMoY2hhbm5lbHMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGlmICghc3QpIHJldHVybjtcbiAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICB0aW50OiBzdC5jb2xvcixcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSxcbiAgICAgICAgICBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSksIC8vIEltYWdlSiDOsyDihpIgbmFwYXJpLWpzIM6zXG4gICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICBpbnZlcnQ6IGRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgbWVyZ2VPbnRvQmxhY2sodmlldy5sYXllcnMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnKSB7XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgY29sb3JtYXA6IGRpc3BsYXkuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgaW52ZXJ0OiBkaXNwbGF5LmludmVydCxcbiAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogdG9OYXBhcmlHYW1tYShzdC5nYW1tYSkgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSR0I6IGRyYXcgdGhlIGltYWdlIGFzIGl0IGlzIHdoaWxlIGl0cyBjaGFubmVsIHN0YXRlcyBsZWF2ZSBpdCBzbyAoZGVmYXVsdCBSL0cvQiB0aW50cywgZnVsbFxuICAgKiB3aW5kb3csIM6zIDEsIGFsbCBzaG93biwgbm8gaW52ZXJ0OiB7QGxpbmsgcmdiTmVlZHNSZWNvbG9yfSkg4oCUIHRoZSBSR0IgbGF5ZXIsIHVuY2hhbmdlZCwgd2l0aFxuICAgKiB0aGUgY29hcnNlIHVuZGVybGF5IGEgdGlsZWQgb25lIGtlZXBzIHdoaWxlIGl0IHBhbnMuIE90aGVyd2lzZSBkcmF3IGl0cyBSLCBHIGFuZCBCIGJhbmRzIGFzXG4gICAqIHRocmVlIGFkZGl0aXZlIGxheWVycywgZWFjaCB3aXRoIGl0cyBjaGFubmVsJ3Mgd2luZG93LCBpbnZlcnQsIGdhbW1hLCB0aW50IGFuZCB2aXNpYmlsaXR5IOKAlFxuICAgKiB3aGF0IE9TRCdzIFJHQiByZWNvbG91ciBjb21wdXRlcyBwZXIgcGl4ZWwgKHRoZSBtZXJnZSBvcmRlciBvZiBgb3NkL2Rpc3BsYXktcGlwZWxpbmVgKS4gVGhlXG4gICAqIGJhbmQgbGF5ZXJzIHNpdCBqdXN0IGFib3ZlIHRoZSBoaWRkZW4gUkdCIGxheWVyLCBzbyB3aGF0ZXZlciBpcyBkcmF3biBvdmVyIHRoZSBpbWFnZSBzdGF5c1xuICAgKiBvdmVyIGl0LiBBIGhvc3Qgd2l0aCBubyBSL0cvQiBjaGFubmVsIG1vZGVsIChmZXdlciB0aGFuIHRocmVlIHN0YXRlcykgZ2V0cyBvbmx5IHRoZSBpbnZlcnQuXG4gICAqL1xuICBwcml2YXRlIHN5bmNSZ2JCYW5kcyhjaGFubmVsczogSUNoYW5uZWxTdGF0ZVtdKTogdm9pZCB7XG4gICAgY29uc3QgeyB2aWV3ZXIsIGRpc3BsYXkgfSA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuY2hhbm5lbFZpZXc/LmxheWVyc1swXTtcbiAgICBjb25zdCBiYW5kcyA9IHRoaXMucmdiQmFuZHM7XG4gICAgaWYgKCFyZ2IgfHwgIWJhbmRzKSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gY2hhbm5lbHMubGVuZ3RoID49IDMgPyBjaGFubmVscyA6IFtdO1xuICAgIGlmICghcmdiTmVlZHNSZWNvbG9yKHN0YXRlcywgZGlzcGxheS5pbnZlcnQpKSB7XG4gICAgICB0aGlzLmJhbmRMYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcikpO1xuICAgICAgdGhpcy5iYW5kTGF5ZXJzID0gbnVsbDtcbiAgICAgIHJnYi52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5iYW5kTGF5ZXJzKSB7XG4gICAgICBjb25zdCBhdCA9IHZpZXdlci5sYXllcnMuaXRlbXMuaW5kZXhPZihyZ2IpO1xuICAgICAgdGhpcy5iYW5kTGF5ZXJzID0gYmFuZHMuc291cmNlcy5tYXAoKHNvdXJjZSwgYykgPT4ge1xuICAgICAgICBjb25zdCBsYXllciA9IHZpZXdlci5hZGRJbWFnZShzb3VyY2UsIHtcbiAgICAgICAgICBuYW1lOiBgcmdiJHtjfWAsXG4gICAgICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICAgICAgaW50ZXJwb2xhdGlvbjogcmdiLmludGVycG9sYXRpb24sXG4gICAgICAgICAgLi4uKGJhbmRzLnNjYWxlID8geyBzY2FsZTogYmFuZHMuc2NhbGUgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZpZXdlci5sYXllcnMubW92ZShsYXllciwgYXQgKyAxICsgYyk7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUaGUgYmFuZHMgZHJhdyB0aGUgaW1hZ2Ugbm93OyBoaWRkZW4gb24gZXZlcnkgcGFzcywgbm90IG9ubHkgd2hlbiB0aGUgYmFuZHMgYXJlIG1hZGUsIHNvXG4gICAgLy8gYSBjYWxsZXIgdGhhdCBzaG93ZWQgZXZlcnkgaW1hZ2UgbGF5ZXIgKHRoZSBzcGF0aWFsIHZpZXcpIGRvZXMgbm90IGRyYXcgaXQgdHdpY2UuXG4gICAgcmdiLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmJhbmRMYXllcnMuZm9yRWFjaCgobGF5ZXIsIGMpID0+IHtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgbGF5ZXIuY29sb3JtYXAgPSB0aW50Q29sb3JtYXAoc3Q/LmNvbG9yID8/IHRpbnRGb3IoYykpO1xuICAgICAgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgICBsYXllci5nYW1tYSA9IHRvTmFwYXJpR2FtbWEoc3Q/LmdhbW1hKTsgLy8gSW1hZ2VKIM6zIOKGkiBuYXBhcmktanMgzrNcbiAgICAgIGxheWVyLnZpc2libGUgPSBzdD8udmlzaWJsZSA/PyB0cnVlO1xuICAgICAgbGF5ZXIuaW52ZXJ0ID0gZGlzcGxheS5pbnZlcnQ7XG4gICAgfSk7XG4gICAgbWVyZ2VPbnRvQmxhY2sodGhpcy5iYW5kTGF5ZXJzKTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIChSZSlpbnN0YWxsIHRoZSBwaHlzaWNhbCBzY2FsZSBiYXIgKG5hcGFyaS1qcydzIGBTY2FsZUJhck92ZXJsYXlgIG9uIHRoZSAyRCBjYW1lcmEncyB6b29tKSxcbiAgICogIHNpemVkIGZyb20gdGhlIGltYWdlJ3MgwrVtL3BpeGVsIChgL3RpbGVzL2luZm9gIG1wcFgsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEpLlxuICAgKiAgTm8tb3Agd2l0aG91dCBhIHBoeXNpY2FsIHNpemUuICovXG4gIGluc3RhbGxTY2FsZUJhcigpOiB2b2lkIHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcztcbiAgICB0aGlzLnNjYWxlQmFyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgY29uc3QgbXBwWCA9IGN0eC50aWxlcy5tcHBYKGN0eC5pbmZvKCkpO1xuICAgIGlmIChtcHBYID4gMCkgdGhpcy5zY2FsZUJhciA9IG5ldyBTY2FsZUJhck92ZXJsYXkoY3R4Lmhvc3QsIGN0eC52aWV3ZXIsIHsgdW5pdFBlcldvcmxkOiBtcHBYLCBtb2RlOiAnMmQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG5hcGFyaS1qcydzIGBOYXZpZ2F0b3JPdmVybGF5YCk6IGEgY29hcnNlIHRodW1ibmFpbCBvZiB0aGUgd2hvbGVcbiAgICogaW1hZ2Ugd2l0aCB0aGUgdmlld3BvcnQgb24gaXQ7IGNsaWNrIG9yIGRyYWcgdG8gcGFuIGF0IHRoZSBjdXJyZW50IHpvb20gKGFzIE9TRCkuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxOYXZpZ2F0b3IoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgeyBjdHggfSA9IHRoaXM7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjdHguaW1hZ2VTaXplKCk7XG4gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSByZXR1cm47XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBuZXcgTmF2aWdhdG9yT3ZlcmxheShjdHguaG9zdCwgY3R4LnZpZXdlciwge1xuICAgICAgd29ybGRXaWR0aDogd2lkdGgsXG4gICAgICB3b3JsZEhlaWdodDogaGVpZ2h0LFxuICAgICAgb25FbnRlcjogKCkgPT4gdGhpcy5vcHRzLm9uTmF2aWdhdG9ySW50ZXJhY3Q/LigpLFxuICAgICAgdmlzaWJsZTogY3R4LnNldHRpbmdzLm5hdmlnYXRvclZpc2libGUsXG4gICAgfSk7XG4gICAgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBuYXZpZ2F0b3IncyB0aHVtYm5haWwgZnJvbSB0aGUgY29hcnNlc3QgcHlyYW1pZCBsZXZlbC4gQSBtdWx0aWNoYW5uZWwgaW1hZ2VcbiAgICogaXMgY29tcG9zaXRlZCBmcm9tIGl0cyBjaGFubmVscyBpbiB0aGVpciBkaXNwbGF5IGNvbG91cnMgKHNlZSB7QGxpbmsgcmVjb2xvck5hdmlnYXRvcn0pLFxuICAgKiBzbyB0aGUgb3ZlcnZpZXcgbG9va3MgbGlrZSB0aGUgdmlldyByYXRoZXIgdGhhbiBsaWtlIGNoYW5uZWwgMCBpbiBncmV5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTmF2aWdhdG9ySW1hZ2UoejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0b3I7XG4gICAgaWYgKCFuYXYpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5uYXZpZ2F0b3JUb2tlbjtcbiAgICBjb25zdCB7IHRpbGVzIH0gPSB0aGlzLmN0eDtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5jdHguaW5mbygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjID0gYXdhaXQgdGlsZXMuZW5zdXJlRGVzY3JpcHRvcihpbmZvKTtcbiAgICAgIC8vIFN1cGVyc2VkZWQgKGEgbmV3ZXIgc2xpY2UsIG9yIHRoZSBzY2VuZSB3YXMgdG9ybiBkb3duKTogZmV0Y2ggbm90aGluZy5cbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5uYXZpZ2F0b3JUb2tlbiB8fCB0aGlzLm5hdmlnYXRvciAhPT0gbmF2KSByZXR1cm47XG4gICAgICAvLyBBIHNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHN0YWNrJ3MgdGh1bWJuYWlscyBhcmUgaXRzIG93biBjaGFubmVsIHBsYW5lcy5cbiAgICAgIGNvbnN0IGNvdW50ID0gZGVzYz8ubXVsdGljaGFubmVsXG4gICAgICAgID8gKGRlc2MuY2hhbm5lbEluZm8/Lmxlbmd0aCA/PyAwKVxuICAgICAgICA6IGlzU2VydmVybGVzc011bHRpY2hhbm5lbCh0aWxlcy5pc1NpbXBsZShpbmZvKSwgaW5mbylcbiAgICAgICAgICA/IChpbmZvPy5pbWFnZU1ldGE/LlswXT8uY2hhbm5lbENvdW50ID8/IDApXG4gICAgICAgICAgOiAwO1xuICAgICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgICBjb25zdCBiaXRtYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF9jLCBjKSA9PiB0aWxlcy5vdmVydmlld0ltYWdlKGluZm8sIHosIGMpKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRva2VuICE9PSB0aGlzLm5hdmlnYXRvclRva2VuIHx8IHRoaXMubmF2aWdhdG9yICE9PSBuYXYpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXROYXZpZ2F0b3JDaGFubmVscyhiaXRtYXBzKTtcbiAgICAgICAgdGhpcy5yZWNvbG9yTmF2aWdhdG9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRpbGVzLm92ZXJ2aWV3SW1hZ2UoaW5mbywgeik7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5uYXZpZ2F0b3JUb2tlbiB8fCB0aGlzLm5hdmlnYXRvciAhPT0gbmF2KSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0TmF2aWdhdG9yQ2hhbm5lbHMobnVsbCk7XG4gICAgICAgIG5hdi5zZXRJbWFnZShpbWFnZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIG5hdmlnYXRvciB0aHVtYm5haWwgdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBwZXItY2hhbm5lbCB0aHVtYm5haWwgYml0bWFwcyAoY2xvc2luZyB0aGUgcHJldmlvdXMgb25lcykuICovXG4gIHByaXZhdGUgc2V0TmF2aWdhdG9yQ2hhbm5lbHMoYml0bWFwczogT3ZlcnZpZXdJbWFnZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYm1wIG9mIHRoaXMubmF2aWdhdG9yQ2hhbm5lbHMgPz8gW10pIGlmICgnY2xvc2UnIGluIGJtcCkgYm1wLmNsb3NlPy4oKTtcbiAgICB0aGlzLm5hdmlnYXRvckNoYW5uZWxzID0gYml0bWFwcztcbiAgICB0aGlzLm5hdmlnYXRvclRpbnRLZXkgPSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wb3NpdGUgdGhlIG11bHRpY2hhbm5lbCB0aHVtYm5haWwgaW4gdGhlIGNoYW5uZWxzJyBDVVJSRU5UIGRpc3BsYXkgdGludHMsIHNraXBwaW5nIGhpZGRlblxuICAgKiBjaGFubmVscyDigJQgdGhlIHN0b3JlJ3MgY2hhbm5lbCBzdGF0ZXMsIGFzIHRoZSAyRCBsYXllcnMgdXNlLCBub3QgdGhlIHNlcnZlcidzIGRlZmF1bHRzLlxuICAgKiBSZS1ydW4gb24gZXZlcnkgZGlzcGxheS1zdGF0ZSBjaGFuZ2U7IGl0IG9ubHkgcmVkcmF3cyAobmV2ZXIgcmUtZmV0Y2hlcyksIGFuZCBvbmx5IHdoZW4gYVxuICAgKiB0aW50IG9yIGEgdmlzaWJpbGl0eSBhY3R1YWxseSBjaGFuZ2VkLCBzbyBhIHdpbmRvdy9nYW1tYSBkcmFnIGNvc3RzIGEgc3RyaW5nIGNvbXBhcmUuXG4gICAqL1xuICBwcml2YXRlIHJlY29sb3JOYXZpZ2F0b3IoKTogdm9pZCB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0b3I7XG4gICAgY29uc3QgYml0bWFwcyA9IHRoaXMubmF2aWdhdG9yQ2hhbm5lbHM7XG4gICAgaWYgKCFuYXYgfHwgIWJpdG1hcHMpIHJldHVybjtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5jdHgudGlsZXMuY3VycmVudERlc2NyaXB0b3IodGhpcy5jdHguaW5mbygpKT8uY2hhbm5lbEluZm87XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5jdHguc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBzaG93biA9IGJpdG1hcHNcbiAgICAgIC5tYXAoKGJtcCwgYykgPT4ge1xuICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgcmV0dXJuIHsgYm1wLCB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLCBjb2xvcjogc3Q/LmNvbG9yID8/IGluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGNoKSA9PiBjaC52aXNpYmxlKTtcbiAgICBjb25zdCBrZXkgPSBzaG93bi5tYXAoKGNoKSA9PiBgJHtiaXRtYXBzLmluZGV4T2YoY2guYm1wKX06JHtjaC5jb2xvcn1gKS5qb2luKCd8Jyk7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5uYXZpZ2F0b3JUaW50S2V5KSByZXR1cm47XG4gICAgdGhpcy5uYXZpZ2F0b3JUaW50S2V5ID0ga2V5O1xuICAgIG5hdi5zZXRJbWFnZShcbiAgICAgIHRpbnRlZENvbXBvc2l0ZShcbiAgICAgICAgc2hvd24ubWFwKChjaCkgPT4gY2guYm1wKSxcbiAgICAgICAgc2hvd24ubWFwKChjaCkgPT4gY2guY29sb3IpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTkFQQVJJX1NDQVRURVIgKHJldmlldyBBcHBlbmRpeCBCLCBjbHVzdGVyIEgpOiB0aGUgc2xpY2UgaW1hZ2Ugd2l0aCBhIHBvaW50cyBsYXllciBhdCBlYWNoXG4gKiByZWdpb24ncyBjZW50cm9pZCAodGhlIG5hcGFyaS1qcyBhbmFsb2cgb2YgUGxvdGx5J3MgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIpLCByZWJ1aWx0IGxpdmUgYXNcbiAqIHJlZ2lvbnMgY2hhbmdlLiBUaGlzIG1vZGUgcGxvdHMgUkVHSU9OIGNlbnRyb2lkcywgc28gdGhlIGltYWdlJ3MgcmVnaW9uIHRvb2xzIGNvbWUgd2l0aCBpdCDigJRcbiAqIGRyYXdpbmcgYSByZWdpb24gYWRkcyBhIHBvaW50IGF0IG9uY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2F0dGVyUmVnaW9uc1NjZW5lIGltcGxlbWVudHMgTmFwYXJpU2NlbmUge1xuICByZWFkb25seSBpbWFnZTogSW1hZ2UyZFNjZW5lO1xuICBwcml2YXRlIHBvaW50czogUG9pbnRzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWdpb25TdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY3R4OiBTY2VuZUNvbnRleHQpIHtcbiAgICB0aGlzLmltYWdlID0gbmV3IEltYWdlMmRTY2VuZShjdHgsIHtcbiAgICAgIC8vIFRoZSByZWdpb24tY2VudHJvaWQgcG9pbnRzIHdlbnQgd2l0aCB0aGUgcmUtcmVuZGVyJ3MgbGF5ZXIgY2xlYXIuXG4gICAgICBvblNsaWNlOiAocmVyZW5kZXJlZCkgPT4ge1xuICAgICAgICBpZiAocmVyZW5kZXJlZCAmJiB0aGlzLnBvaW50cykgdGhpcy5yZWJ1aWxkUG9pbnRzKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbWFnZS5tb3VudCgpO1xuICAgIC8vIERpc3Bvc2VkIHdoaWxlIHRoZSBpbWFnZSBsb2FkZWQ6IGEgc3Vic2NyaXB0aW9uIG5vdyB3b3VsZCBvdXRsaXZlIHRoZSBzY2VuZS5cbiAgICBpZiAodGhpcy5jdHguc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICB0aGlzLnJlYnVpbGRQb2ludHMoKTtcbiAgICB0aGlzLnJlZ2lvblN1YiA9IHRoaXMuY3R4LnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVidWlsZFBvaW50cygpKTtcbiAgICB0aGlzLmN0eC50b29scy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICBzZXRaKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0Wih6KTtcbiAgfVxuXG4gIGhpc3RvZ3JhbShjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZS5oaXN0b2dyYW0oY2hhbm5lbCwgYmlucyk7XG4gIH1cblxuICBzZXRJbWFnZVNtb290aGluZyhlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZS5zZXRJbWFnZVNtb290aGluZyhlbmFibGVkKTtcbiAgfVxuXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2Uuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yZWdpb25TdWIgPSBudWxsO1xuICAgIHRoaXMuaW1hZ2UuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgcG9pbnQgbGF5ZXIgYXQgdGhlIGN1cnJlbnQgcmVnaW9uIGNlbnRyb2lkcy4gKi9cbiAgcHJpdmF0ZSByZWJ1aWxkUG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN0eC52aWV3ZXI7XG4gICAgaWYgKHRoaXMucG9pbnRzKSB7XG4gICAgICB2LmxheWVycy5yZW1vdmUodGhpcy5wb2ludHMpO1xuICAgICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjZW50cm9pZHMgPSByZWdpb25DZW50cm9pZHModGhpcy5jdHgucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKTtcbiAgICBpZiAoY2VudHJvaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucG9pbnRzID0gdi5hZGRQb2ludHMoY2VudHJvaWRzLCB7XG4gICAgICBzaXplOiAxMixcbiAgICAgIGZhY2VDb2xvcjogWzEsIDAuODUsIDAuMiwgMV0sXG4gICAgICBib3JkZXJDb2xvcjogWzAsIDAsIDAsIDFdLFxuICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==