@jax-data-science/sci-image-visualizer 0.8.0 → 0.8.2

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.
@@ -684,7 +684,9 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
684
684
  await this.mountSpatialOmics3d(viewer, host);
685
685
  }
686
686
  else if (isSpatialOmics(plotType)) {
687
- await this.mountSpatialOmics(viewer, host, z);
687
+ // No loaded image: an image-less dataset opened before any image (the visualizer's
688
+ // plotSpatialWithoutImage) — the observations alone.
689
+ await this.mountSpatialOmics(viewer, host, z, imageLoaded == null);
688
690
  }
689
691
  else if (isNapariScatter(plotType)) {
690
692
  await this.mountScatter(viewer, host, z);
@@ -1595,8 +1597,11 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
1595
1597
  * exactly as the plain image view does. That is NOT optional here: this mode's selection is
1596
1598
  * driven by drawn ROIs, so without the overlay there is no way to make a selection at all.
1597
1599
  */
1598
- async mountSpatialOmics(viewer, host, z) {
1599
- await this.renderImage(z);
1600
+ async mountSpatialOmics(viewer, host, z, noImage = false) {
1601
+ // With no image loaded there is nothing to render under the observations; they are
1602
+ // framed on their own extent, as for any dataset that brings no image.
1603
+ if (!noImage)
1604
+ await this.renderImage(z);
1600
1605
  // Only fit to the image when this dataset actually has one. Otherwise there is
1601
1606
  // nothing to fit, `imageW`/`imageH` still hold the LAST image's dimensions, and
1602
1607
  // this fits to those — and because it defers to a frame, it lands AFTER the points
@@ -1605,8 +1610,12 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
1605
1610
  if (this.spatialLatest?.[0]?.imageRef)
1606
1611
  this.fitCameraSoon();
1607
1612
  this.subscribeDisplayState();
1608
- this.installScaleBar();
1609
- this.installNavigator(z);
1613
+ // The scale bar and navigator describe an image; with none loaded, whatever they would
1614
+ // read is left over from the last one.
1615
+ if (!noImage) {
1616
+ this.installScaleBar();
1617
+ this.installNavigator(z);
1618
+ }
1610
1619
  this.install2dInteraction(viewer, host);
1611
1620
  this.installSpatialHover(host);
1612
1621
  this.spatialTiles()?.attach(viewer);
@@ -4400,4 +4409,4 @@ function tintedComposite(images, colors) {
4400
4409
  });
4401
4410
  return out;
4402
4411
  }
4403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ08sZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQzVFLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixzQkFBc0IsR0FDdkIsTUFBTSxXQUFXLENBQUM7QUFnQm5CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFDMkMsY0FBYyxFQUFFLG1CQUFtQixHQUNwRixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFDTCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUNwRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFDbkYseUJBQXlCLEVBQUUsb0JBQW9CLEdBQ2hELE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEw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Q2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLGFBQWEsQ0FBQztRQUMzQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsR0FBRyxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztRQUN6QyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgZnJvbSwgb2YsIGZpcnN0VmFsdWVGcm9tLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQge1xuICBWaWV3ZXIsXG4gIGhpc3RvZ3JhbVNjYWxhcixcbiAgY29sb3JtYXBGcm9tTHV0LFxuICB0aW50Q29sb3JtYXAsXG4gIHJldmVyc2VDb2xvcm1hcCxcbiAgaGVpZ2h0RmllbGQsXG4gIExVVF9TSVpFLFxuICBNdWx0aUNoYW5uZWxJbWFnZVZpZXcsXG4gIE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF4ZXNMYXllcixcbiAgSW1hZ2VMYXllcixcbiAgU3VyZmFjZUxheWVyLFxuICBWb2x1bWVMYXllcixcbiAgUG9pbnRzTGF5ZXIsXG4gIFBvaW50czNETGF5ZXIsXG4gIFRpbGVkU291cmNlLFxuICBUaWxlS2V5LFxuICBQaXhlbENodW5rLFxuICBDaGFubmVsVmlldyxcbiAgVm9sdW1lQ2hhbm5lbCxcbiAgQ29sb3JtYXAsXG4gIFByb2plY3RlZFBvaW50cyxcbn0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB7IG5lYXJlc3RQcm9qZWN0ZWRJbmRleCwgU2NyZWVuSW5kZXgsIFNDUkVFTl9JTkRFWF9NSU5fUE9JTlRTIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IFNQQVRJQUxfREFUQV9QT1JULCBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbENvbHVtbiwgU3BhdGlhbERhdGFzZXQsIFNwYXRpYWxJbWFnZVJlZiwgZmluZENvbHVtbk1ldGEsIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIGNvbnRyYXN0V2luZG93LCBlbmNvZGVDYXRlZ29yaWNhbCwgZW5jb2RlQ29udGludW91cywgbWFya2VyRGlhbWV0ZXJzLFxuICByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMsIHRvUmdiYVR1cGxlcywgcGFyc2VIZXgsIE1JU1NJTkdfQ09MT1IsIERFRkFVTFRfTVVURURfT1BBQ0lUWSxcbiAgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFUywgc3BhdGlhbENvbnRpbnVvdXNMdXQsXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBOT19DQVRFR09SWSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbE9ic2VydmF0aW9ucyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGVtcHR5U2VsZWN0aW9uLCBtYXNrVG9JbmRpY2VzLCBtdXRlZEZyb21TZWxlY3Rpb24sIHNhbWVTZWxlY3Rpb24sXG4gIHNlbGVjdEJ5Q2F0ZWdvcnksXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZnJhbWVQb3NpdGlvbnMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZnJhbWluZyc7XG5pbXBvcnQgeyBQSVhFTF9XT1JMRF9RVUFOVFVNLCB3b3JsZFF1YW50dW1Gb3JFeHRlbnQgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3dvcmxkLWdyaWQnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TbGljZSwgdm9sdW1lSW1hZ2VSZWYgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7IGRlZmF1bHRTaWdtYSwgZGVuc2l0eUdyaWQsIHJhc3Rlcml6ZURlbnNpdHkgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZGVuc2l0eSc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNlY3Rpb24sIHNlY3Rpb25zT2YgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHsgdHlwZSBIb3ZlclNvdXJjZSwgaG92ZXJUZXh0LCBuZWFyZXN0T2JzZXJ2YXRpb24gfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtaG92ZXInO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRvb2x0aXAgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRvb2x0aXAnO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMsIFRyYW5zY3JpcHRFc3RpbWF0ZSB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgTmFwYXJpTmF2aWdhdG9yIH0gZnJvbSAnLi9uYXBhcmktbmF2aWdhdG9yJztcbmltcG9ydCB7IE5hcGFyaUxvYWRpbmdCYWRnZSB9IGZyb20gJy4vbmFwYXJpLWxvYWRpbmctYmFkZ2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQgfSBmcm9tICcuL25hcGFyaS16b29tJztcblxuLyoqXG4gKiBBIHNob3J0LCBzdGFibGUgaWQgZm9yIGEgY29sb3JtYXAgdmFsdWUsIGZvciBjYWNoZSBrZXlzLlxuICpcbiAqIEhhbGYgdGhlIGxpYnJhcnkncyBjb2xvcm1hcHMgYXJlIE5BTUVTIGFuZCBoYWxmIGFyZSBpbmxpbmUgYFtzdG9wLCBjb2xvdXJdYFxuICogYXJyYXlzIG9mIDI1NiBlbnRyaWVzLiBTdHJpbmdpZnlpbmcgdGhlIGFycmF5IGtpbmQgd291bGQgcHV0IDYgS0IgaW4gYSBrZXkgdGhhdFxuICogaXMgcmVidWlsdCBhbmQgY29tcGFyZWQgb24gZXZlcnkgdmlldyBjaGFuZ2U7IGhhc2hpbmcgaXQga2VlcHMgdGhlIGtleSBzbWFsbCxcbiAqIGFuZCBpdCBvbmx5IGhhcyB0byBkaXN0aW5ndWlzaCBvbmUgY29sb3JtYXAgZnJvbSBhbm90aGVyLlxuICovXG5mdW5jdGlvbiBjb2xvcm1hcElkKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICc/JztcbiAgLy8gRk5WLTFhIG92ZXIgdGhlIHN0b3BzLiBBIGNvbGxpc2lvbiB3b3VsZCBsZWF2ZSBhIHN0YWxlIGNvbG91cmluZyBvbiBzY3JlZW4sXG4gIC8vIG5vdCBjb3JydXB0IGFueXRoaW5nLCBhbmQgMzIgYml0cyBvdmVyIGEgZmV3IGh1bmRyZWQgY29sb3JtYXBzIHdpbGwgbm90LlxuICBsZXQgaGFzaCA9IDB4ODExYzlkYzU7XG4gIGNvbnN0IHRleHQgPSB2YWx1ZS5tYXAoKHN0b3ApID0+IFN0cmluZyhzdG9wKSkuam9pbignLCcpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICBoYXNoIF49IHRleHQuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gTWF0aC5pbXVsKGhhc2gsIDB4MDEwMDAxOTMpO1xuICB9XG4gIHJldHVybiBgIyR7KGhhc2ggPj4+IDApLnRvU3RyaW5nKDM2KX1gO1xufVxuXG4vKipcbiAqIEluLXBsYW5lIGNvYXJzZW5pbmcgb2YgdGhlIDNEIGdlbmUgbWFwJ3MgbGF0dGljZSwgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZVxuICogdm9sdW1lLiBUaGUgZmllbGQgaXMgc21vb3RoLCBzbyBpdHMgZGV0YWlsIGlzIHNldCBieSB0aGUga2VybmVsIHJhdGhlciB0aGFuIHRoZVxuICogcmFzdGVyIOKAlCBhbmQgdGhlIGVzdGltYXRlIGlzIGEgcGFpciBvZiBzZXBhcmFibGUgYmx1cnMgb24gdGhlIG1haW4gdGhyZWFkLCB3aGljaFxuICogYXQgdGhlIHRlbXBsYXRlJ3MgZnVsbCByZXNvbHV0aW9uIG1lYW5zIHNlY29uZHMgb2YgZnJvemVuIFVJIHBlciB0b2dnbGUuXG4gKi9cbmNvbnN0IEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUgPSAyO1xuaW1wb3J0IHtcbiAgdHlwZSBFeHByZXNzaW9uRmllbGQsIHR5cGUgRXhwcmVzc2lvblZvbHVtZUZpZWxkLCBjb2xvckV4cHJlc3Npb25GaWVsZCxcbiAgZW5jb2RlRXhwcmVzc2lvblZvbHVtZSwgZXhwcmVzc2lvbkZpZWxkLCBleHByZXNzaW9uVm9sdW1lLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBMT1RfVFlQRV9ERVNDUklQVE9SUyxcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVN1cmZhY2UsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNOYXBhcmlTY2F0dGVyM2QsXG4gIGlzU3BhdGlhbE9taWNzLFxuICBpc1NwYXRpYWxPbWljczNkLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlzdWFsaXplcixcbiAgUGl4ZWxEYXRhLFxuICBJbnRlbnNpdHlQcm9maWxlLFxuICBJSXNvc3VyZmFjZUNvbnRyb2xzLFxuICBJSW50ZW5zaXR5Q29udHJvbHMsXG4gIElTdXJmYWNlM2RDb250cm9scyxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgVmlld2VyQ2FwYWJpbGl0aWVzLFxuICBWaWV3ZXJGZWF0dXJlLFxuICBjYXBhYmlsaXRpZXNPZixcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcE5vZGUsIElXYW5kT3B0aW9ucywgSUJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXotY29uZmlnJztcbmltcG9ydCB7IFRJTEVfQUNDRVNTX1BPUlQsIFRpbGVBY2Nlc3NQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgQmFzZVN0b3JlVmlzdWFsaXplciB9IGZyb20gJy4uL2Jhc2Utc3RvcmUtdmlzdWFsaXplcic7XG5pbXBvcnQgeyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgfSBmcm9tICcuLi9zaW1wbGUtc2xpY2UtYWNjZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmFwYXJpU2NhbGVCYXIsIFNjYWxlQmFyQ2FtZXJhLCBmb3JtYXRVbSB9IGZyb20gJy4vbmFwYXJpLXNjYWxlLWJhcic7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5LCBPdmVybGF5Vmlld2VyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgTmFwYXJpQXhlc0xhYmVscywgQXhpc0xhYmVsU3BlYyB9IGZyb20gJy4vbmFwYXJpLWF4ZXMtbGFiZWxzJztcbmltcG9ydCB7IE5hcGFyaVZvbHVtZVpIYW5kbGUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtei1oYW5kbGUnO1xuaW1wb3J0IHtcbiAgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBXYW5kVG9vbFNlcnZpY2UsIFdhbmRUb29sSG9zdCwgQ2FjaGVkSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFRvb2xTZXJ2aWNlLCBCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgVmVydGV4RXJhc2VyVG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvdmVydGV4LWVyYXNlci92ZXJ0ZXgtZXJhc2VyLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgWm9vbVRvQm94VG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuXG4vKiogSUNvb3JkaW5hdGVUcmFuc2Zvcm0gb3ZlciB0aGUgbmFwYXJpIGNhbWVyYTogcG9pbnRlciBjbGllbnQgY29vcmRzIOKGlCBpbWFnZS93b3JsZCBjb29yZHMuICovXG5jbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBPcGFxdWUgaGFuZGxlIGZyb20ge0BsaW5rIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLmxvYWR9LCBwYXNzZWQgYmFjayB0byBwbG90KCkuICovXG5pbnRlcmZhY2UgTmFwYXJpTG9hZGVkIHtcbiAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvO1xuICB6OiBudW1iZXI7XG4gIC8qKiBNdXN0IG1hdGNoIGBJSW1hZ2VJbmZvLmZpbGVOYW1lYCDigJQgdGhlIHJlbmRlciBvcmNoZXN0cmF0b3IgZHJvcHMgdGhlIHJlc3VsdCBpZiB0aGVcbiAgICogIGhhbmRsZSdzIGBmaWxlbmFtZWAgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGltYWdlIChndWFyZHMgYWdhaW5zdCBzdGFsZSBjbGlja3MpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBWT0xVTUVfTUFYX1NMSUNFID0gMTAyNDsgLy8gXCJGdWxsXCIgaW4tcGxhbmUgY2FwOyB0aGUgZGVmYXVsdCDCvCBsb2FkIHVzZXMgMjU2XG4vKiogUmVmZXJlbmNlIGluLXBsYW5lIHdvcmxkIHNpemUgKGxvbmcgc2lkZSkgZm9yIHRoZSB2b2x1bWUvYXhlcyBib3gsIGluIGFyYml0cmFyeSB3b3JsZCB1bml0cy5cbiAqICBUaGUgYm94IGlzIGFuY2hvcmVkIHRvIHRoaXMgcmVmZXJlbmNlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNob3NlbiBkZWNpbWF0ZSBmYWN0b3IsIHNvIGNoYW5naW5nIHRoZVxuICogIHJlc29sdXRpb24gY2hhbmdlcyBERVRBSUwsIG5vdCB0aGUgdm9sdW1lJ3MgcHJvcG9ydGlvbnMgKFogbm8gbG9uZ2VyIGFwcGVhcnMgdG8gc2hyaW5rIHdoZW4gdGhlXG4gKiAgaW4tcGxhbmUgc2FtcGxpbmcgZ3Jvd3MpLiBTZXQgdG8gdGhlIERFRkFVTFQgZGVjaW1hdGUncyBpbi1wbGFuZSBjYXAgc28gdGhlIGRlZmF1bHQgdmlldyBpc1xuICogIHVuY2hhbmdlZDsgaGlnaGVyL2xvd2VyIHJlc29sdXRpb25zIGtlZXAgdGhhdCBzYW1lIHNoYXBlLiBTZWUge0BsaW5rIG1vdW50Vm9sdW1lfS4gKi9cbmNvbnN0IFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRiA9IFZPTFVNRV9NQVhfU0xJQ0UgLyBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcbi8qKiBNYXggY29uY3VycmVudCBzbGljZSBmZXRjaGVzIHdoZW4gYXNzZW1ibGluZyBhIHZvbHVtZSDigJQga2VlcHMgdGhlIGNvbm5lY3Rpb24gcG9vbCBidXN5XG4gKiAgd2l0aG91dCBmbG9vZGluZyBpdCAoYnJvd3NlcnMgY2FwIH42L2hvc3QpIG9uIGEgZGVlcCBzdGFjay4gKi9cbmNvbnN0IFZPTFVNRV9GRVRDSF9DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBWb2x1bWUvaXNvc3VyZmFjZSBzYW1wbGluZyBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYCAoMSA9IEZ1bGwgMTAyNCwgMiA9IMK9IDUxMiwgNCA9IMK8IDI1NlxuICogIGRlZmF1bHQsIDggPSDihZsgMTI4KTogdGhlIGluLXBsYW5lIGNhcCBoYWx2ZXMgZWFjaCBzdGVwOyBzbGljZXMgc3RheSB1bi1zdWJzYW1wbGVkIHVudGlsIOKFmywgdGhlblxuICogIHN1YnNhbXBsZS4gKi9cbmZ1bmN0aW9uIHZvbHVtZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4U2xpY2U6IG51bWJlcjsgc2xpY2VTdGVwOiBudW1iZXIgfSB7XG4gIGNvbnN0IHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNjYWxlKSk7XG4gIHJldHVybiB7XG4gICAgbWF4U2xpY2U6IE1hdGgubWF4KDgsIE1hdGgucm91bmQoVk9MVU1FX01BWF9TTElDRSAvIHMpKSxcbiAgICBzbGljZVN0ZXA6IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocyAvIDQpKSxcbiAgfTtcbn1cbi8qKiBGdWxseS1ub3JtYWxpemVkIGludGVuc2l0eSBoZWlnaHQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgaW4tcGxhbmUgZXh0ZW50IOKAlCBtYXRjaGVzIHRoZSBQbG90bHlcbiAqICBTVVJGQUNFIHotYXNwZWN0ICh+MC40KSBzbyB0aGUgcmVsaWVmIGlzbid0IGV4YWdnZXJhdGVkLiAqL1xuY29uc3QgU1VSRkFDRV9aX0FTUEVDVCA9IDAuNDtcbi8qKiBcIkZ1bGxcIiBtZXNoIGdyaWQgY2FwOyB0aGUgZGVjaW1hdGUgZmFjdG9yIGRpdmlkZXMgaXQgKGRlZmF1bHQgwrwg4oaSIDIyMCwgwr0g4oaSIDQ0MCwgRnVsbCDihpIgODgwKS4gKi9cbmNvbnN0IFNVUkZBQ0VfTUFYX0dSSUQgPSA4ODA7XG4vKiogQ29lZmZpY2llbnQgc2NhbGluZyB0aGUgcHlyYW1pZCB0aWxlIGJ1ZGdldCB3aXRoIHRoZSB0YXJnZXQgcmVzb2x1dGlvbiDigJQgYSBoaWdoZXIgdGFyZ2V0IHB1bGxzIGFcbiAqICBmaW5lciBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gU2hhcmVkIGJ5IHRoZSBzdXJmYWNlIHBsYW5lIGZldGNoICsgdm9sdW1lIGFzc2VtYmx5LiAqL1xuY29uc3QgU1RJVENIX0JVREdFVF9DT0VGRiA9IDE2O1xuLyoqIFN1cmZhY2UgbWVzaCB0YXJnZXQgZ3JpZCBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYDogdGhlIGdyaWQgY2FwIHNocmlua3MgYnkgYHNjYWxlYCAoZXZlcnlcbiAqICBzbGljZSBpcyBrZXB0IOKAlCB0aGUgei1zbGlkZXIgbmVlZHMgdGhlbSBhbGwpLiBUaGUgc291cmNlIGlzIGZldGNoZWQgYXQgYSBtYXRjaGluZyByZXNvbHV0aW9uLiAqL1xuZnVuY3Rpb24gc3VyZmFjZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4R3JpZDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4geyBtYXhHcmlkOiBNYXRoLm1heCgxNiwgTWF0aC5yb3VuZChTVVJGQUNFX01BWF9HUklEIC8gcykpIH07XG59XG5cbi8qKiAzRCBzY2F0dGVyOiBpbi1wbGFuZSBjYXAgZm9yIHRoZSBhc3NlbWJsZWQgdm94ZWwgZ3JpZCwgYW5kIHRoZSBtYXggbnVtYmVyIG9mIHBvaW50cyBlbWl0dGVkXG4gKiAgKHRoZSBncmlkIGlzIGZsYXQtc3RyaWRlZCBkb3duIHRvIHRoaXMpIOKAlCBrZWVwcyB0aGUgYmlsbGJvYXJkIGNvdW50IGludGVyYWN0aXZlLiAqL1xuY29uc3QgU0NBVFRFUjNEX01BWF9YWSA9IDY0O1xuY29uc3QgU0NBVFRFUjNEX01BWF9QT0lOVFMgPSAxNTAwMDA7XG5cbmNvbnN0IFRJTEVfU0laRSA9IDUxMjsgLy8gc2VydmVyIHRpbGUgZWRnZSAobWF0Y2hlcyB0aGUgT1NEIGJhY2tlbmQpXG4vKiogTWF4IHRpbGVzIHN0aXRjaGVkIGZvciBvbmUgZGlzcGxheWVkIHNsaWNlICg1MTJweCB0aWxlcyDihpIgdXAgdG8gfjYxNDTCsiBhdCBmdWxsIHJlcykuIEJleW9uZFxuICogIHRoaXMgd2Ugc3RlcCB0byBhIGNvYXJzZXIgcHlyYW1pZCBsZXZlbCBzbyBhIGxhcmdlIGltYWdlIHN0YXlzIHRyYWN0YWJsZS4gKi9cbmNvbnN0IE1BWF9TVElUQ0hfVElMRVMgPSAxNDQ7XG4vKiogV2ViR1BVIGRlZmF1bHQgYG1heFRleHR1cmVEaW1lbnNpb24yRGAg4oCUIGEgc3RpdGNoZWQgc2xpY2UncyBsb25nZXN0IHNpZGUgbXVzdCBmaXQgYSB0ZXh0dXJlLiAqL1xuY29uc3QgTUFYX1RFWFRVUkVfRElNID0gODE5Mjtcbi8qKiBDb25jdXJyZW50IHRpbGUgcmVxdWVzdHMgcGVyIHN0aXRjaGVkIHNsaWNlLiBGaXJpbmcgYSB3aG9sZSBncmlkIGF0IG9uY2UgKGh1bmRyZWRzIG9mIHJlcXVlc3RzXG4gKiAgZm9yIGEgbGFyZ2UgbGV2ZWwpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cyk7IGEgc21hbGwgcG9vbCBrZWVwcyB0aGUgcGlwZSBmdWxsIHdpdGhvdXRcbiAqICBmbG9vZGluZyBpdCDigJQgYW5kIHNsaWNlLWxldmVsIHdvcmtlcnMgYWxyZWFkeSBydW4gc2V2ZXJhbCBzdGl0Y2hlcyBpbiBwYXJhbGxlbCBvbiB0b3Agb2YgdGhpcy4gKi9cbmNvbnN0IFRJTEVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA2O1xuLyoqIEhvdyBsb25nIHRvIHBvbGwgYC90aWxlcy9pbmZvYCAoMjAyIHdoaWxlIHRoZSBzZXJ2ZXIgY2FjaGVzIHRoZSBzb3VyY2UpIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG9cbiAqICBhIHNpbmdsZSB0aWxlLiBHZW5lcm91cyBsaWtlIHRoZSBPU0QgYmFja2VuZCDigJQgYSBjb2xkIHdob2xlLXNsaWRlIGNhbiB0YWtlIG1pbnV0ZXMgdG8gY2FjaGUuICovXG5jb25zdCBERVNDUklQVE9SX1RJTUVPVVRfTVMgPSAxMjAwMDA7XG5cbi8qKiBEZWZhdWx0IHBlci1jaGFubmVsIHRpbnRzIChGaWppLXN0eWxlKSB3aGVuIHRoZSBzdG9yZS9kZXNjcmlwdG9yIG9mZmVycyBubyBjb2xvdXIuICovXG5jb25zdCBERUZBVUxUX1RJTlRTID0gWycjZmYwMDAwJywgJyMwMGZmMDAnLCAnIzAwMDBmZicsICcjZmZmZjAwJywgJyNmZjAwZmYnLCAnIzAwZmZmZicsICcjZmZmZmZmJ107XG5cbi8qKiBEZWZhdWx0IHRpbnQgZm9yIGEgY2hhbm5lbCBpbmRleCwgY3ljbGluZyB0aGUgRmlqaSBwYWxldHRlLiAqL1xuZnVuY3Rpb24gdGludEZvcihjaGFubmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gREVGQVVMVF9USU5UU1tjaGFubmVsICUgREVGQVVMVF9USU5UUy5sZW5ndGhdO1xufVxuXG4vKiogT25lIHB5cmFtaWQgbGV2ZWwgZnJvbSBgR0VUIC90aWxlcy9pbmZvYCAocmVzIDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7XG4gIHJlczogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqIFN1YnNldCBvZiB0aGUgYC90aWxlcy9pbmZvYCBkZXNjcmlwdG9yIHRoaXMgYmFja2VuZCByZWFkcyAodGlsZSBncmlkLCBjaGFubmVscywgc2NhbGUpLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgbXVsdGljaGFubmVsPzogYm9vbGVhbjtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgcGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSB0aGVyZS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjb2xvcj86IHN0cmluZztcbiAgICBiaXREZXB0aD86IG51bWJlcjtcbiAgICBtaW5BbGxvd2VkPzogbnVtYmVyO1xuICAgIG1heEFsbG93ZWQ/OiBudW1iZXI7XG4gIH0+IHwgbnVsbDtcbiAgbGV2ZWxzOiBUaWxlTGV2ZWxbXTtcbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFdlYkdQVSBpbWFnZSBiYWNrZW5kIGJ1aWx0IG9uIHRoZSBwdWJsaXNoZWQgYG5hcGFyaS1qc2AgbGlicmFyeSDigJQgdGhlIFBPQyBlbmdpbmUgZm9yXG4gKiBqaXQtdWkjMTAyIChhIGJyb3dzZXItYmFzZWQgbmFwYXJpIHNoaXBwZWQgYXMgYSBKUyBsaWJyYXJ5LCBzd2FwcGluZyBpbWFnZSBwbG90dGluZyB3aXRoXG4gKiBPcGVuU2VhZHJhZ29uIGFuZCAzRCBzbGljaW5nL2lzb3N1cmZhY2VzIHdpdGggUGxvdGx5KS5cbiAqXG4gKiBSZW5kZXIgc3RyYXRlZ3k6IHJhdGhlciB0aGFuIHJlLWltcGxlbWVudCB0aGUgc2VydmVyJ3MgdGlsZS9weXJhbWlkIHByb3RvY29sICh3aGljaCBPU0RcbiAqIGFscmVhZHkgaGFuZGxlcyksIHRoaXMgYmFja2VuZCByZW5kZXJzIHRoZSAqKmNvbXBsZXRlIHBlci1zbGljZSBpbWFnZSBVUkxzIHRoZSBhcHAgYWxyZWFkeVxuICogcHJvZHVjZXMqKiAoYElJbWFnZUluZm8udXJsc2ApIOKAlCBgdXJsc1t6XWAgZm9yIHRoZSAyRCBpbWFnZSwgYW5kIHRoZSBmdWxsIGB1cmxzYCBzdGFja1xuICogYXNzZW1ibGVkIGludG8gYSBkb3duc2FtcGxlZCB2b2x1bWUgZm9yIHRoZSAzRCB0eXBlcy4gUmVnaW9uIHN0YXRlIGFuZCBkaXNwbGF5IG9wdGlvbnNcbiAqIGRlbGVnYXRlIHRvIHRoZSBzaGFyZWQge0BsaW5rIFJlZ2lvblN0b3JlfSAvIHtAbGluayBWaXN1YWxpemVyU3RvcmV9LCBleGFjdGx5IGFzIE9TRCBkb2VzLlxuICpcbiAqIEZvbGxvdy11cHMgKGppdC11aSMxMDIpOiBuYXRpdmUtcmVzb2x1dGlvbiBweXJhbWlkYWwgdGlsaW5nLCBvbi1jYW52YXMgdG9vbHMsIHJlZ2lvblxuICogb3ZlcmxheSByZW5kZXJpbmcsIHBlci1jaGFubmVsIGhpc3RvZ3JhbXMsIFRJRkYgZXhwb3J0LlxuICovXG4vKipcbiAqIFdoYXQgdGhlIDNEIHBvaW50cyBsYXllciBuZWVkcyB0byBjb2xvdXIgYSBjbG91ZDogb25lIHNjYWxhciBwZXIgcG9pbnQsIGEgY29sb3JtYXAsIGFuZCB0aGVcbiAqIHdpbmRvdyB0aGF0IG1hcHMgc2NhbGFycyBvbnRvIGl0LiBDYXRlZ29yaWNhbCBhbmQgY29udGludW91cyBjb2xvdXJpbmdzIGJvdGggcmVkdWNlIHRvIHRoaXMsXG4gKiBiZWNhdXNlIHRoZSBsYXllciBvZmZlcnMgbm8gcGVyLXBvaW50IGNvbG91ciBjaGFubmVsLlxuICovXG5pbnRlcmZhY2UgU3BhdGlhbDNkRW5jb2Rpbmcge1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgY29sb3JtYXA6IENvbG9ybWFwO1xuICBjb250cmFzdExpbWl0czogW251bWJlciwgbnVtYmVyXTtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSBleHRlbmRzIEJhc2VTdG9yZVZpc3VhbGl6ZXIgaW1wbGVtZW50cyBJVmlzdWFsaXplciB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZSxcbiAgXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcblxuICBwcml2YXRlIHZpZXdlcjogVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkOiBOYXBhcmlMb2FkZWQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIDNEIHZvbHVtZSBsYXllcnMgKG9uZSBhZGRpdGl2ZSB0aW50ZWQgbGF5ZXIgcGVyIGNoYW5uZWxcbiAgICogIGZvciBtdWx0aWNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiBOdWxsIGluIDJELiAqL1xuICBwcml2YXRlIHZvbHVtZVZpZXc6IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdm9sdW1lIGlzIGNvbXBvc2l0ZWQgZnJvbSBwZXItY2hhbm5lbCBsYXllcnMgKHZzIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiAqL1xuICBwcml2YXRlIHZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGhlaWdodC1maWVsZCBzdXJmYWNlIG1lc2ggKE5BUEFSSV9TVVJGQUNFIHBsb3QgdHlwZTsgbnVsbCBvdGhlcndpc2UpLiBCdWlsdCBmcm9tIGFcbiAgICogIHNpbmdsZSBncmF5c2NhbGUgc2xpY2UgYnkge0BsaW5rIGJ1aWxkU3VyZmFjZX0gdmlhIG5hcGFyaS1qcydzIGBoZWlnaHRGaWVsZGAgKyBgYWRkU3VyZmFjZWAuICovXG4gIHByaXZhdGUgc3VyZmFjZUxheWVyOiBTdXJmYWNlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoaWNoIGJhbmQgdGhlIHN1cmZhY2Ugc2FtcGxlcyAoYSBjaGFubmVsIGluZGV4IGZvciBtdWx0aWNoYW5uZWwsIGVsc2UgdGhlIGNvbXBvc2l0ZSkuICovXG4gIHByaXZhdGUgc3VyZmFjZUNoYW5uZWw6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgbW91bnRlZCBTdXJmYWNlIGZvbGxvd3Mgb25lIGJhbmQgb2YgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgc3VyZmFjZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogUHJlLWxvYWRlZCBwZXItc2xpY2UgbHVtaW5hbmNlIHBsYW5lcyAoYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIHN1cmZhY2UgZ3JpZCksIGtleWVkIGJ5IHosXG4gICAqICBzbyB0aGUgc3RhY2sgc2xpZGVyIHJlYnVpbGRzIHRoZSBzdXJmYWNlIGluc3RhbnRseS4gRmlsbGVkIGJ5IHtAbGluayBwcmVsb2FkU3VyZmFjZVBsYW5lc30uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VyZmFjZVBsYW5lcyA9IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICA+KCk7XG4gIC8qKiBJbi1wbGFuZSBncmlkIGNhcCBmb3IgdGhlIGFjdGl2ZSBzdXJmYWNlIGxvYWQgKGZ1bGwgZ3JpZCDDtyB0aGUgZGVjaW1hdGUgZmFjdG9yKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTWF4R3JpZCA9IFNVUkZBQ0VfTUFYX0dSSUQ7XG4gIC8qKiBDb250cmFzdCB3aW5kb3cgW21pbixtYXhdIHRoZSBjdXJyZW50IHN1cmZhY2UgbWVzaCB3YXMgYnVpbHQgd2l0aC4gQSBjaGFuZ2UgcmVzaGFwZXMgdGhlXG4gICAqICBtZXNoIChwaXhlbCBoZWlnaHQgPSBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGl0IHRyaWdnZXJzIGEgZ2VvbWV0cnkgcmVidWlsZC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlV2luZG93OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXJzaXN0ZWQgd2lyZWZyYW1lIGNob2ljZSBmb3IgdGhlIHN1cmZhY2UgKHJlLWFwcGxpZWQgd2hlbiBhIG5ldyBzdXJmYWNlIG1vdW50cykuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpcmVmcmFtZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIDJEIHNjYXR0ZXIgcG9pbnRzIChyZWdpb24gY2VudHJvaWRzKSArIGl0cyByZWdpb24tY2hhbmdlIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyMmRQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhdHRlclJlZ2lvblN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBuYXBhcmktanMgM0Qgc2NhdHRlciAodm94ZWwgcG9pbnQgY2xvdWQpLiAqL1xuICBwcml2YXRlIHNjYXR0ZXIzZExheWVyOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTcGF0aWFsLW9taWNzIG9ic2VydmF0aW9uIG1hcmtlcnMgKyB0aGUgZGF0YXNldC92aWV3IHN1YnNjcmlwdGlvbiBkcml2aW5nIHRoZW0uICovXG4gIHByaXZhdGUgc3BhdGlhbFBvaW50czogUG9pbnRzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBwb2ludCBjbG91ZC4gT25lIGxheWVyOiBzZWxlY3Rpb24gaXMgYSBwZXItcG9pbnQgYWxwaGEgb24gaXQsIG5vdCBhIHNlY29uZC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzM2Q6IFBvaW50czNETGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsTGF5ZXJLZXkzZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbnRlcmxlYXZlZCB4LHkseiwgY2FjaGVkIHNvIGEgY29sb3VyIGNoYW5nZSBkb2VzIG5vdCByZS13YWxrIDMuN00gb2JzZXJ2YXRpb25zLiAqL1xuICBwcml2YXRlIHNwYXRpYWxQb3NpdGlvbnMzZDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJZGVudGl0eSBvZiB0aGUgc2NhbGFycyBjdXJyZW50bHkgdXBsb2FkZWQg4oCUIHNlZSB7QGxpbmsgcmVidWlsZFNwYXRpYWxQb2ludHMzZH0uICovXG4gIHByaXZhdGUgc3BhdGlhbFNjYWxhcktleTNkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBhbmF0b21pY2FsIHZvbHVtZSB0aGUgY2xvdWQgc2l0cyBpbnNpZGUsIHdoZW4gdGhlIGRhdGFzZXQgaGFzIG9uZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVm9sdW1lOiBWb2x1bWVMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwYXRpYWxWb2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGFsb25nc2lkZSB0aGUgY2xvdWQsIGFuZCB3aGF0IHRoZXkgd2VyZVxuICAgKiAgYnVpbHQgZnJvbSDigJQgcmFzdGVyaXNpbmcgaXMgc2Vjb25kcyBvZiB3b3JrLCBzbyBpdCBtdXN0IG5vdCByZXBlYXQgZm9yIGFcbiAgICogIGNoYW5nZSB0aGF0IGNhbm5vdCBhZmZlY3QgdGhlIGZpZWxkLiAqL1xuICBwcml2YXRlIGRlbnNpdHlMYXllcnM6IFZvbHVtZUxheWVyW10gPSBbXTtcbiAgcHJpdmF0ZSBkZW5zaXR5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNlbGVjdGlvbiBpZGVudGl0eSwgYXMgYSBudW1iZXIgdGhlIGRlbnNpdHkga2V5IGNhbiBjYXJyeS4gKi9cbiAgcHJpdmF0ZSBsYXN0U2VsZWN0aW9uU2VlbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXZpc2lvbiA9IDA7XG4gIC8qKiBUaGUgZ2VuZSBtYXA6IGl0cyBsYXllciwgdGhlIGZpZWxkIGl0IHdhcyBlc3RpbWF0ZWQgZnJvbSwgYW5kIHRoZSBpbnB1dHMgZWFjaFxuICAgKiAgd2FzIGJ1aWx0IGZvciDigJQgdGhlIGZpZWxkIGlzIHRoZSBleHBlbnNpdmUgaGFsZiBhbmQgc3Vydml2ZXMgYSByZWNvbG91ci4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwTGF5ZXI6IEltYWdlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwRmllbGQ6IEV4cHJlc3Npb25GaWVsZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBGaWVsZEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgM0QgZ2VuZSBtYXA6IGl0cyB2b2x1bWUgbGF5ZXIsIHRoZSBmaWVsZCBiZWhpbmQgaXQsIGFuZCB0aGUgaW5wdXRzIGVhY2hcbiAgICogIHdhcyBidWlsdCBmb3Ig4oCUIHNhbWUgdHdvIGNsb2NrcyBhcyB0aGUgMkQgbWFwLiAqL1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVMYXllcjogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lRmllbGQ6IEV4cHJlc3Npb25Wb2x1bWVGaWVsZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVGaWVsZEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPZmZzZXQgYXBwbGllZCB0byBvYnNlcnZhdGlvbiBjb29yZGluYXRlcyB0byBzaXQgdGhlbSBpbiB0aGUgdm9sdW1lJ3MgYm94LiAqL1xuICBwcml2YXRlIHNwYXRpYWxPcmlnaW4zZDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDBdO1xuICAvKiogQ3Vyc29yIHRvb2x0aXAgZm9yIHRoZSBzcGF0aWFsIHZpZXdzLCBhbmQgZXZlcnl0aGluZyBpdCBuZWVkczogd2hhdCB0aGVcbiAgICogIGNsb3VkIGlzIGNvbG91cmVkIGJ5LCBhbmQgd2hlcmUgZWFjaCBkcmF3biBvYnNlcnZhdGlvbiBpcy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVG9vbHRpcDogTmFwYXJpU3BhdGlhbFRvb2x0aXAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZTogSG92ZXJTb3VyY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZXF1ZW5jZXMgdGhlIGFzeW5jIHJlc29sdXRpb25zLiBUaGUgS0VZIGlzIG9ubHkgY29tbWl0dGVkIG9uY2Ugb25lIGxhbmRzLFxuICAgKiAgc28gYSBzdXBlcnNlZGVkIGZldGNoIGNhbm5vdCBsZWF2ZSB0aGUgY2FjaGUgY2xhaW1pbmcgdG8gaG9sZCBhIHNvdXJjZSBpdFxuICAgKiAgbmV2ZXIgc3RvcmVkLiAqL1xuICBwcml2YXRlIGhvdmVyU291cmNlVG9rZW4gPSAwO1xuICAvKiogRHJhd24gb2JzZXJ2YXRpb25zJyBwb3NpdGlvbnMgZm9yIGhpdC10ZXN0aW5nLCBpbmRleGVkIEJZIE9CU0VSVkFUSU9OIHdpdGhcbiAgICogIE5hTiBmb3IgYW55dGhpbmcgbm90IGRyYXduLiBTY3JlZW4gcGl4ZWxzIGluIDNEICh0aGUgY2FtZXJhIG1vdmVzIHRoZW0sIHNvXG4gICAqICB0aGV5IGFyZSByZWJ1aWx0IHdoZW4gaXQgZG9lcykgYW5kIFdPUkxEIHVuaXRzIGluIDJEICh3aGVyZSB0aGUgY2FtZXJhIG9ubHlcbiAgICogIHNjYWxlcywgc28gdGhlIHBvaW50ZXIgaXMgY29udmVydGVkIGluc3RlYWQgb2YgMzc0ayBwb2ludHMpLiAqL1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uc1JldiA9IC0xO1xuXG4gIC8qKlxuICAgKiBTY3JlZW4tc3BhY2UgYnVja2V0IGluZGV4IG92ZXIgdGhlIDNEIHByb2plY3Rpb24sIGJ1aWx0IG9uIHRoZSBmaXJzdCBob3ZlciBhZnRlciB0aGVcbiAgICogc2NlbmUgbW92ZWQgcmF0aGVyIHRoYW4gd2hlbiBpdCBtb3Zlcy5cbiAgICpcbiAgICogTGF6aWx5LCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgZGVzaWduOiBhbiBvcmJpdCBkcmFnIGNoYW5nZXMgdGhlIGNhbWVyYSBldmVyeSBmcmFtZSwgc29cbiAgICogYnVpbGRpbmcgZWFnZXJseSB3b3VsZCBzcGVuZCB0ZW5zIG9mIG1pbGxpc2Vjb25kcyBhIGZyYW1lIGluZGV4aW5nIGZvciBwaWNrcyBub2JvZHkgaXNcbiAgICogbWFraW5nLiBEZWZlcnJlZCwgaXQgaXMgYnVpbHQgb25jZSB3aGVuIHRoZSBkcmFnIHN0b3BzIGFuZCB0aGUgcG9pbnRlciBuZXh0IG1vdmVzIOKAlFxuICAgKiBtZWFzdXJlZCB1cHN0cmVhbSBhdCAzLjdNIHBvaW50cywgdGhhdCB0dXJucyBhIDEyLjYgbXMgc2NhbiBwZXIgcG9pbnRlcm1vdmUgaW50b1xuICAgKiAwLjA2NiBtcy5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJJbmRleDogU2NyZWVuSW5kZXggfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCB3aGVuZXZlciB0aGUgY2FjaGVkIHBvc2l0aW9ucyBnbyBzdGFsZTogYSBtYXJrZXIgcmVidWlsZCwgb3Ig4oCUIGluIDNEXG4gICAqICBvbmx5LCB3aGVyZSB0aGUgcHJvamVjdGlvbiBkZXBlbmRzIG9uIGl0IOKAlCBhIGNhbWVyYSBtb3ZlLiAqL1xuICBwcml2YXRlIHNwYXRpYWxTY2VuZVJldiA9IDA7XG4gIHByaXZhdGUgaG92ZXJQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJGcmFtZSA9IDA7XG4gIHByaXZhdGUgaG92ZXJPZmY6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIC8qKiBPYnNlcnZhdGlvbiBpbmRpY2VzIHRoZSBjYWNoZWQgM0QgcG9zaXRpb25zIGJlbG9uZyB0bywgaW4gdGhlIHNhbWUgb3JkZXI7XG4gICAqICBudWxsIHdoZW4gZXZlcnkgb2JzZXJ2YXRpb24gaXMgZHJhd24uIFdpdGhvdXQgaXQgYSBwcm9qZWN0aW9uIGJ1aWx0IGZyb20gdGhlXG4gICAqICBwb3NpdGlvbnMgaXMgaW5kZXhlZCBieSBEUkFXTiBvcmRlciBhbmQgc2lsZW50bHkgYXR0cmlidXRlcyBlYWNoIHBvaW50IHRvXG4gICAqICB0aGUgd3Jvbmcgb2JzZXJ2YXRpb24gYXMgc29vbiBhcyBhIHNlY3Rpb24gaXMgaXNvbGF0ZWQuICovXG4gIHByaXZhdGUgc3BhdGlhbERyYXduM2Q6IFVpbnQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFJldXNlZCBwcm9qZWN0aW9uIGJ1ZmZlcnMg4oCUIHNlZSB7QGxpbmsgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb259LiAqL1xuICBwcml2YXRlIHNwYXRpYWxQcm9qZWN0aW9uM2Q6IFByb2plY3RlZFBvaW50cyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogUGVyLW9ic2VydmF0aW9uIGRlcHRoIGZyb20gdGhlIGxhc3QgcHJvamVjdGlvbiwgZm9yIHRoZSBkZXB0aC1hd2FyZSBob3ZlciBwaWNrLiAqL1xuICBwcml2YXRlIHNwYXRpYWxEZXB0aHMzZDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgKHZpZXdlciwgZGF0YXNldCkgd2hvc2UgM0Qgc2NlbmUgaGFzIGFscmVhZHkgaGFkIGl0cyBvcGVuaW5nIGZyYW1pbmcuICovXG4gIC8qKiBXaG9zZSAyRCBvYnNlcnZhdGlvbnMgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVTcGF0aWFsUG9pbnRzT25jZX0uICovXG4gIHByaXZhdGUgc3BhdGlhbDJkRnJhbWVkOiB7IHZpZXdlcjogVmlld2VyOyBkYXRhc2V0SWQ6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEYXRhc2V0IHRoZSAzRCBzY2FsZSBiYXIgd2FzIGJ1aWx0IGZvci4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2NhbGVCYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwYXRpYWxTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogTGV2ZWwtb2YtZGV0YWlsIGNlbGwgb3V0bGluZXMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IG92ZXIgdGhlIDJEIHZpZXcg4oCUIGNyZWF0ZWQgb25cbiAgICogIGZpcnN0IHVzZSwgYW5kIG9ubHkgd2hlbiBhIHNwYXRpYWwgcG9ydCBpcyBib3VuZC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVGlsZXNNZ3I6IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGb3IgdGhlIHBhbmVsOiB0aGUgdHJhbnNjcmlwdHMtaW4tdmlldyBlc3RpbWF0ZSBhbmQgdGhlIGRlbnNpdHkgd2luZG93IGluIHVzZS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNjcmlwdEVzdGltYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJhbnNjcmlwdEVzdGltYXRlIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW4gdmlldyAoc2VlIE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzLmdlbmVDb3VudHNJbikuICovXG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRlbnNpdHlTdGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuICAvKiogTGF0ZXN0IChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiBzYXcsIHNvIGEgc2xpY2VcbiAgICogIGNoYW5nZSBjYW4gcmVidWlsZCB0aGUgbWFya2VycyBmb3IgdGhlIG5ldyBwbGFuZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsTGF0ZXN0OiBbU3BhdGlhbERhdGFzZXQgfCBudWxsLCBTcGF0aWFsVmlld1N0YXRlLCBTcGF0aWFsU2VsZWN0aW9uTWFza10gfCBudWxsID1cbiAgICBudWxsO1xuICAvKiogV2hpY2ggZGF0YXNldCB0aGUgY3VycmVudCBtYXJrZXIgbGF5ZXIgd2FzIGJ1aWx0IGZvciwgc28gYSBkaXNwbGF5LW9ubHlcbiAgICogIGNoYW5nZSAoc2l6ZSwgY29sb3VyLCBvcGFjaXR5LCBzZWxlY3Rpb24pIGNhbiB1cGRhdGUgaXQgaW4gcGxhY2UuICovXG4gIHByaXZhdGUgc3BhdGlhbExheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE1vbm90b25pYyBndWFyZCBmb3IgdGhlIGFzeW5jIGNvbG91ciByZWJ1aWxkOiBmZXRjaGluZyBhIGdlbmUgdmVjdG9yIGlzIGFcbiAgICogIHJvdW5kLXRyaXAsIHNvIGEgZmFzdCBzZXF1ZW5jZSBvZiBjb2xvdXItYnkgY2hhbmdlcyBjYW4gcmVzb2x2ZSBvdXQgb2ZcbiAgICogIG9yZGVyLiBPbmx5IHRoZSBuZXdlc3QgcmVidWlsZCBpcyBhbGxvd2VkIHRvIHRvdWNoIHRoZSBsYXllci4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUmVidWlsZFRva2VuID0gMDtcbiAgLyoqIFwieCByZWxvYWRpbmfigKZcIiBhdCB0aGUgYm90dG9tIG9mIHRoZSBjYW52YXM6IHRoZSB0aWxlIGxheWVycycgbG9hZHMgYW5kIHRoZSBvYnNlcnZhdGlvbnMnLiAqL1xuICBwcml2YXRlIGxvYWRpbmdCYWRnZTogTmFwYXJpTG9hZGluZ0JhZGdlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGlsZUxvYWRpbmc6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgb2JzZXJ2YXRpb25zTG9hZGluZyA9IDA7XG4gIC8qKiBNb25vdG9uaWMgbG9hZCBnZW5lcmF0aW9uLiBCdW1wZWQgYnkge0BsaW5rIHJlc2V0fSBhbmQge0BsaW5rIGNhbmNlbExvYWRpbmd9OyB0aGUgZnJhbWUtbG9hZGluZ1xuICAgKiAgbG9vcHMgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKSBjYXB0dXJlIGl0IGFuZCBiYWlsIHdoZW4gaXQgY2hhbmdlcywgc28gYSBDYW5jZWwgKG9yIGFcbiAgICogIG5ldyBwbG90KSBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgbG9hZFRva2VuID0gMDtcbiAgLyoqIERlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcyAoMSA9IEZ1bGwsIDIgPSDCvSBkZWZhdWx0LCA0ID0gwrwsIDggPSDihZspLiBBcHBsaWVkIHdoZW4gYVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZSAocmUpbG9hZHM7IGNoYW5naW5nIGl0IG5lZWRzIGEgcmUtcGxvdCAoaXQgY2hhbmdlcyBmZXRjaGVkIGRhdGEpLiAqL1xuICBwcml2YXRlIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuICAvKiogM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZSB2aWV3IChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGF5ZXI6IEF4ZXNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogRE9NIFgvWS9aICsgc2NhbGUgbGFiZWxzIHRyYWNraW5nIHRoZSAzRCBheGVzIGdpem1vIChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGFiZWxzOiBOYXBhcmlBeGVzTGFiZWxzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEcmFnZ2FibGUgWi1oZWlnaHQgZ3JpcCBvdmVyIHRoZSB2b2x1bWUgKG51bGwgdW5sZXNzIGEgdm9sdW1lL2lzb3N1cmZhY2UgaXMgbW91bnRlZCkuICovXG4gIHByaXZhdGUgekhhbmRsZTogTmFwYXJpVm9sdW1lWkhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVXNlciBaLWhlaWdodCBmYWN0b3IgZm9yIHRoZSB2b2x1bWUgKDEgPSB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyk7IGRyaXZlbiBieSB0aGVcbiAgICogIGluLXZpZXcgZHJhZyBoYW5kbGUuIFJlc2V0IHBlciBtb3VudC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVaU2NhbGUgPSAxO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBgdm9sdW1lWlNjYWxlID0gMWAgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGVcbiAgICogIHRoZSBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVXb3JsZEJhc2U6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZVNhbXBsZWREZXB0aCA9IDE7XG4gIC8qKiBQZXJzaXN0ZWQgYXhlcyBvbi9vZmYgY2hvaWNlLCByZS1hcHBsaWVkIHdoZW4gYSBuZXcgdm9sdW1lIG1vdW50cy4gRGVmYXVsdHMgb24uICovXG4gIHByaXZhdGUgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIHZvbHVtZURpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogTW9ub3RvbmljIHNsaWNlLXJlcXVlc3QgaWQgc28gYSBzbG93IG91dC1vZi1vcmRlciBzbGljZSBmZXRjaCBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIENhY2hlZCBgL3RpbGVzL2luZm9gIHB5cmFtaWQgZGVzY3JpcHRvciArIHRoZSBpbmZvQjY0IGl0IHdhcyBmZXRjaGVkIGZvci4gKi9cbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgMkQgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIGhpc3RvZ3JhbSArIHN0YXRlIGFwcGxpY2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyB0aGF0IG93bnMgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCAoYnVpbGQgKyBsaXZlIGRpc3BsYXlcbiAgICogIHVwZGF0ZXMpIGZvciB0aGUgY3VycmVudCB7QGxpbmsgaW1hZ2VNb2RlfS4gUmVidWlsdCBvbiBlYWNoIChyZSlyZW5kZXIuICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGl2ZSBzdWJzY3JpcHRpb24gYXBwbHlpbmcgY2hhbm5lbC1zdGF0ZSAvIGNvbG9ybWFwIGNoYW5nZXMgdG8gdGhlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBncmF5c2NhbGUgY29sb3JtYXAgc2VsZWN0aW9uIGZyb20gdGhlIHN0b3JlIChhcHBsaWVkIHRvIHRoZSBzaW5nbGUgZ3JheSBsYXllcikuICovXG4gIHByaXZhdGUgY3VycmVudENvbG9ybWFwOiBDb2xvcm1hcE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UmV2ZXJzZSA9IGZhbHNlO1xuICAvKiogTGF0ZXN0IGludmVydCB0b2dnbGUgZnJvbSB0aGUgc3RvcmUgKGZsaXBzIGludGVuc2l0eSBiZWZvcmUgdGhlIGNvbG9ybWFwLCBsaWtlIE9TRCkuICovXG4gIHByaXZhdGUgaW52ZXJ0RW5hYmxlZCA9IGZhbHNlO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgZm9yIHRoZSAyRCBpbWFnZSAobnVsbCB3aGVuIDNEIG9yIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogTmFwYXJpU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE92ZXJ2aWV3IG1pbmltYXAgKGJvdHRvbS1yaWdodCksIGFzIE9TRCdzIG5hdmlnYXRvci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3I6IE5hcGFyaU5hdmlnYXRvciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hldGhlciB0aGUgbmF2aWdhdG9yIGlzIHNob3duIOKAlCB0aGUgc2FtZSBob3N0IHNldHRpbmcgT1NEJ3MgbmF2aWdhdG9yIGhvbm91cnMuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yVmlzaWJsZSA9IHRydWU7XG4gIC8qKiBCdW1wZWQgcGVyIHRodW1ibmFpbCByZXF1ZXN0LCBzbyBhIHNsb3cgb25lIGNhbm5vdCBvdmVyd3JpdGUgYSBuZXdlciBzbGljZSdzLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclRva2VuID0gMDtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgdW50aWwgYSAyRCBpbWFnZSBpcyBwbG90dGVkKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5OiBOYXBhcmlSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQaXhlbC10b29sIHBsdW1iaW5nOiB0aGUgcGxvdCBkaXYgaWQsIGNvb3JkIHRyYW5zZm9ybSwgYW5kIGJvdW5kIHRvb2wgaG9zdHMuICovXG4gIHByaXZhdGUgcGxvdERpdklkID0gJyc7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3Q6IFdhbmRUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVyYXNlckhvc3Q6IFZlcnRleEVyYXNlclRvb2xIb3N0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWaXNpYmxlIHdvcmxkIHJlY3QgY2FwdHVyZWQgQVQgdGhlIGxhc3QgcmVhZGJhY2sg4oCUIG11c3QgcGFpciB3aXRoIGBsYXN0UGl4ZWxzYCBzbyB0aGUgcGl4ZWxcbiAgICogIHRvb2xzJyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZSBtYXRyaXgncyBjYW1lcmEgKHVzaW5nIHRoZSBsaXZlIHJlY3QgYWZ0ZXIgYSBwYW4vem9vbSB3b3VsZFxuICAgKiAgbWlzLXNjYWxlIHRoZSByZWdpb24pLiAqL1xuICBwcml2YXRlIGxhc3RQaXhlbHNSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKSB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzLCB0aGUgZGVmYXVsdCkuICovXG4gIHByaXZhdGUgaW1hZ2VTbW9vdGhpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hlbiB0aGUgMkQgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgcHJpdmF0ZSB0aWxlZCA9IGZhbHNlO1xuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIHRpbWVyICsgY2FtZXJhLWNoYW5nZSB1bnN1YnNjcmliZSAoa2VlcCBsYXN0UGl4ZWxzIGN1cnJlbnQgZm9yIHRvb2xzKS4gKi9cbiAgcHJpdmF0ZSByZWFkYmFja1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYVJlYWRiYWNrT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscy4gUmVmcmVzaGVkIG9uIHBsb3QgKyBzbGljZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAgKD44LWJpdCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSByZWFkb25seSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBvbmx5IGEgaG9zdCB0aGF0IHNlcnZlcyBzcGF0aWFsLW9taWNzIGRhdGEgcHJvdmlkZXMgaXQsIGFuZFxuICAgIC8vIHdpdGhvdXQgaXQgdGhlIFNQQVRJQUxfT01JQ1MgcGxvdCB0eXBlIGlzIG5ldmVyIG9mZmVyZWQgYW55d2F5LlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCArIGNhY2hlIHRoZSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIChgR0VUIC90aWxlcy9pbmZvYCk6IHRoZSBSRUFMIHBlci1sZXZlbCB0aWxlIGdyaWQsXG4gICAqIHRpbGUgc2l6ZSwgY2hhbm5lbCBtZXRhZGF0YSBhbmQgcGh5c2ljYWwgcGl4ZWwgc2l6ZS4gVGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZVxuICAgKiBpcyBzdGlsbCBjYWNoaW5nLCBzbyB3ZSBwb2xsIGJyaWVmbHkuIENhY2hlZCBwZXIgYGluZm9CNjRgOyByZXR1cm5zIG51bGwgaWYgaXQgbmV2ZXIgYmVjb21lc1xuICAgKiByZWFkeSAoY2FsbGVycyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUtdGlsZSBmZXRjaCkuIFRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgZ3JpZCDigJQgZ3Vlc3NpbmdcbiAgICogbGV2ZWwgZGltcyBmcm9tIGB0cnVlSW1hZ2VTaXplYCBvdmVyc2hvb3RzIHRoZSByZWFsIGdyaWQgYW5kIHRoZSBzZXJ2ZXIgNDAwcyBvdXQtb2YtcmFuZ2UgdGlsZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlc2NyaXB0b3IoKTogUHJvbWlzZTxUaWxlRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAobm8gdGlsZSBzZXJ2ZXIg4oCUIGUuZy4gYSBudW1iZXJlZCBpbWFnZVxuICAgIC8vIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsIGVhY2ggc2xpY2UgYSBkaWZmZXJlbnQgZmlsZSk6IHRoZXJlIGlzIG5vXG4gICAgLy8gc2luZ2xlIHNlcnZlci10aWxlZCBweXJhbWlkIHRvIGRlc2NyaWJlLiBSZXR1cm5pbmcgbnVsbCByb3V0ZXMgZXZlcnlcbiAgICAvLyBjYWxsZXIgKDJEIGltYWdlLCB2b2x1bWUsIHN1cmZhY2UpIHRvIHRoZWlyIHN0aXRjaGVkL3NpbmdsZS1mZXRjaFxuICAgIC8vIGZhbGxiYWNrLCB3aGljaCDigJQgdmlhIGZldGNoU2xpY2UncyBvd24gU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIGJyYW5jaCDigJRcbiAgICAvLyBjb3JyZWN0bHkgZmV0Y2hlcyBlYWNoIHNsaWNlJ3Mgb3duIFVSTCBpbnN0ZWFkIG9mIG9uZSBmaXhlZCBmaWxlJ3MgdGlsZVxuICAgIC8vIHB5cmFtaWQuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUodGhpcy5sb2FkZWQ/LmltYWdlSW5mbykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmRlc2NyaXB0b3JLZXkgPT09IGluZm9CNjQpIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgREVTQ1JJUFRPUl9USU1FT1VUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyBUaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAoYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGJvZHk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JLZXkgPSBpbmZvQjY0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgZW1wdHkgYm9keSDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRpbGVzL2luZm8gbm90IHJlYWR5OyBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlLXRpbGUgZmV0Y2gnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMjAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgQ09NUExFVEUgcmVuZGVyZWQgc2xpY2UgYXMgYW4gYEltYWdlQml0bWFwYCBieSBzdGl0Y2hpbmcgdGhlIHNlcnZlcidzIFJFQUwgdGlsZSBncmlkXG4gICAqIChmcm9tIGAvdGlsZXMvaW5mb2ApIOKAlCBub3QganVzdCB0aGUgdG9wLWxlZnQgdGlsZSwgd2hpY2ggb25seSBldmVyIHNob3dlZCBhIGxhcmdlIGltYWdlJ3NcbiAgICogY29ybmVyLiBQaWNrcyB0aGUgZmluZXN0IHB5cmFtaWQgbGV2ZWwgd2hvc2UgZ3JpZCBmaXRzIGBidWRnZXRUaWxlc2AgYW5kIHdob3NlIGxvbmdlc3Qgc2lkZSBpc1xuICAgKiB3aXRoaW4gdGhlIEdQVSB0ZXh0dXJlIGxpbWl0LCBmZXRjaGVzIHRoYXQgZ3JpZCBjb25jdXJyZW50bHksIGFuZCBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMuXG4gICAqXG4gICAqIGBjaGFubmVsYCBzZWxlY3RzIGEgc2luZ2xlIGJhbmQgYXMgZ3JheXNjYWxlIChyZWFsIGxldmVscyBvbmx5KTsgb21pdCBmb3IgdGhlIHNlcnZlciBjb21wb3NpdGUuXG4gICAqIGBidWRnZXRUaWxlc2AgY2FwcyB0aGUgZ3JpZDogdGhlIDJEIHZpZXcgdXNlcyB0aGUgZnVsbCBidWRnZXQgZm9yIGRldGFpbDsgdGhlIDNEIHZvbHVtZSBwYXNzZXNcbiAgICogMSBmb3IgYSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBzbGljZSAoaXQgZG93bnNhbXBsZXMgdG8ge0BsaW5rIFZPTFVNRV9NQVhfU0xJQ0V9KS4gRmFsbHMgYmFja1xuICAgKiB0byBhIHNpbmdsZSBgY29sPTAscm93PTBgIHRpbGUgd2hlbiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSAoc21hbGwvc2ltcGxlIGltYWdlcywgdm9sdW1lcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU2xpY2UoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM6IG51bWJlciA9IE1BWF9TVElUQ0hfVElMRVMsXG4gICAgLyoqIFdoZW4gYSBzcGVjaWZpYyBjaGFubmVsIGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiBgYnVkZ2V0VGlsZXNgLCBkcm9wIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiAgQ09NUE9TSVRFIG92ZXJ2aWV3IGluc3RlYWQgb2Ygc3RpdGNoaW5nIHRoZSBodWdlIHBlci1jaGFubmVsIGxldmVsLiBPbmx5IHNhZmUgd2hlbiB0aGUgY2FsbGVyXG4gICAgICogIHdhbnRzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSAodGhlIHN1cmZhY2UgaGVpZ2h0KTogZm9yIGEgbXVsdGljaGFubmVsIFZPTFVNRSBldmVyeSBjaGFubmVsXG4gICAgICogIHdvdWxkIHRoZW4gZmV0Y2ggdGhlIHNhbWUgY29tcG9zaXRlIGFuZCB0aGUgY2hhbm5lbHMgd291bGQgY29sbGFwc2UgaW50byBvbmUsIHNvIHZvbHVtZVxuICAgICAqICBhc3NlbWJseSBsZWF2ZXMgdGhpcyBgZmFsc2VgIHRvIGtlZXAgZWFjaCBiYW5kIGRpc3RpbmN0LiAqL1xuICAgIGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxJbWFnZUJpdG1hcD4ge1xuICAgIC8vIFNlbGYtY29udGFpbmVkIG11bHRpLXNsaWNlIHN0YWNrICh0aWxlZDpmYWxzZSk6IGB6YCBpbmRleGVzIGEgY29tcGxldGVseVxuICAgIC8vIGRpZmZlcmVudCBmaWxlJ3Mgb3duIHByZXZpZXcgVVJMLCBub3QgYW4gaW50ZXJuYWwgc2xpY2Ugb2Ygb25lIHNlcnZlci1cbiAgICAvLyB0aWxlZCBmaWxlIOKAlCByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChzaGFyZWRcbiAgICAvLyB3aXRoIE9TRDsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIGJhcmUgZmV0Y2goKSkgaW5zdGVhZCBvZlxuICAgIC8vIGJ1aWxkaW5nIGEgL3RpbGU/aW5mbz0uLi4mej0gcmVxdWVzdCBhZ2FpbnN0IHdoaWNoZXZlciBzaW5nbGUgZmlsZVxuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCgpIHBvaW50cyBhdCAod2hpY2ggd291bGQgNDAwL21pc21hdGNoIGZvciBhbnkgelxuICAgIC8vIGJleW9uZCB0aGF0IG9uZSBmaWxlJ3Mgb3duIGV4dGVudCkuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykpIHtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHZvbHVtZTogZmV0Y2ggdGhlIHJlcXVlc3RlZCBjaGFubmVsJ3MgT1dOIHBsYW5lXG4gICAgICAvLyAoY2hhbm5lbFVybHNbel1bY2hhbm5lbF0pIHNvIGVhY2ggYmFuZCBzdGF5cyBkaXN0aW5jdCDigJQgdGhlIGNsaWVudC1zaWRlXG4gICAgICAvLyBhbmFsb2cgb2YgdGhlIHNlcnZlcidzIHBlci1jaGFubmVsIC90aWxlP2NoYW5uZWw9Yy4gRWxzZSB0aGUgei1hbmNob3IgVVJMLlxuICAgICAgY29uc3QgY2hVcmxzID0gKGluZm8gYXMgSUltYWdlSW5mbykuY2hhbm5lbFVybHM7XG4gICAgICBjb25zdCB1cmwgPSBjaGFubmVsICE9IG51bGwgJiYgY2hVcmxzPy5bel0/LltjaGFubmVsXSAhPSBudWxsXG4gICAgICAgID8gY2hVcmxzW3pdW2NoYW5uZWxdXG4gICAgICAgIDogdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW5mbyBhcyBJSW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIG5vIFVSTCBmb3Igc2xpY2UgJHt6fWApO1xuICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0JpdG1hcCh1cmwpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gbm8gc2VsZWN0ZWQgaW1hZ2UgaW5mbyAoZ2V0U2VsZWN0ZWRJbmZvQjY0IG51bGwpJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG5cbiAgICAvLyBUaGUgcmVxdWVzdGVkIGJhbmQ7IG1heSBiZSBkcm9wcGVkIHRvIHRoZSBjb21wb3NpdGUgKHVuZGVmaW5lZCkgYmVsb3cgd2hlbiB0aGUgY2hhbm5lbCBoYXMgbm9cbiAgICAvLyBweXJhbWlkIGxldmVsIHNtYWxsIGVub3VnaCB0byBzdGl0Y2ggd2l0aGluIGJ1ZGdldC5cbiAgICBsZXQgZWZmZWN0aXZlQ2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgY29uc3QgZmV0Y2hUaWxlID0gYXN5bmMgKFxuICAgICAgcmVzOiBudW1iZXIsXG4gICAgICBjb2w6IG51bWJlcixcbiAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgdDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+ID0+IHtcbiAgICAgIGNvbnN0IGNoID0gZWZmZWN0aXZlQ2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtlZmZlY3RpdmVDaGFubmVsfWA7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2NvbH0mcm93PSR7cm93fSZ6PSR7en0mdGlsZVNpemU9JHt0fSR7Y2h9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHNsaWNlIGZldGNoIGZhaWxlZDogJHtyZXNwLnN0YXR1c30gKCR7Y29sfS8ke3Jvd30gcmVzICR7cmVzfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgfTtcblxuICAgIC8vIE5vIGRlc2NyaXB0b3Ig4oaSIHNpbmdsZSB0b3AtbGVmdCB0aWxlIChsZWdhY3kgZmFsbGJhY2s7IGNvcnJlY3QgZm9yIHNtYWxsL3NpbXBsZSBpbWFnZXMpLlxuICAgIGlmICghZGVzYyB8fCAhZGVzYy5sZXZlbHM/Lmxlbmd0aCkgcmV0dXJuIGZldGNoVGlsZSgwLCAwLCAwLCBUSUxFX1NJWkUpO1xuXG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IE9OTFkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHMgKHRoZSBmcm9udCBvZiBgbGV2ZWxzYCk7IHRoZSBzZXJ2ZXJcbiAgICAvLyBjb21wb3NpdGUgZXhpc3RzIGF0IGV2ZXJ5IGxldmVsLCBpbmNsdWRpbmcgdGhlIHNtYWxsIG92ZXJ2aWV3cy5cbiAgICBjb25zdCBwZXJDaGFubmVsTGV2ZWxzID0gZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsID8gZGVzYy5sZXZlbHMgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBwZXJDaGFubmVsTGV2ZWxzKSk7XG5cbiAgICAvLyBGaW5lc3QgbGV2ZWwgd2hvc2Ugc3RpdGNoZWQgZ3JpZCBmaXRzIEJPVEggdGhlIHRpbGUgYnVkZ2V0IGFuZCB0aGUgR1BVIHRleHR1cmUgbGltaXQ7IGlmIG5vbmVcbiAgICAvLyBmaXRzLCB0aGUgY29hcnNlc3QgYXZhaWxhYmxlIChmaXRzPWZhbHNlKS5cbiAgICBjb25zdCB0aWxlc0ZvciA9IChsdmw6IFRpbGVMZXZlbCk6IG51bWJlciA9PlxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpKSAqIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwuaGVpZ2h0IC8gdCkpO1xuICAgIGNvbnN0IHBpY2sgPSAobGV2ZWxzOiBUaWxlTGV2ZWxbXSk6IHsgbHZsOiBUaWxlTGV2ZWw7IGZpdHM6IGJvb2xlYW4gfSA9PiB7XG4gICAgICBsZXQgYyA9IGxldmVsc1swXTtcbiAgICAgIGZvciAoY29uc3QgbHZsIG9mIGxldmVscykge1xuICAgICAgICBjID0gbHZsO1xuICAgICAgICBpZiAodGlsZXNGb3IobHZsKSA8PSBidWRnZXRUaWxlcyAmJiBNYXRoLm1heChsdmwud2lkdGgsIGx2bC5oZWlnaHQpIDw9IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgICAgIHJldHVybiB7IGx2bCwgZml0czogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsdmw6IGMsIGZpdHM6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCBzZWwgPSBwaWNrKHVzYWJsZSk7XG4gICAgLy8gQSBzcGVjaWZpYyBjaGFubmVsIG9ubHkgaGFzIHRpbGVzIGF0IHRoZSAoZmV3LCBsYXJnZSkgcmVhbCBsZXZlbHMuIFdoZW4gbm9uZSBvZiB0aGVtIGZpdCB0aGVcbiAgICAvLyBidWRnZXQg4oCUIGUuZy4gdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXMgc3RpbGwgMTQ5ODLDlzE4NjcwIOKGkiB+MTEwMCBmdWxsLXJlcyB0aWxlcyDigJQgc3RpdGNoaW5nXG4gICAgLy8gaXQgcGVyIHNsaWNlIGZsb29kcyB0aGUgc2VydmVyICg1MDRzKSBhbmQgc3RhbGxzIHRoZSBsb2FkLiBUaGUgY29tcG9zaXRlIHB5cmFtaWQgaGFzIHNtYWxsXG4gICAgLy8gb3ZlcnZpZXcgbGV2ZWxzLCBzbyBmZXRjaCB0aGUgY29tcG9zaXRlIGluc3RlYWQgYW5kIGRlcml2ZSBsdW1pbmFuY2UgZnJvbSBpdC4gRXZlcnkgY2FsbGVyIGhlcmVcbiAgICAvLyAoc3VyZmFjZSBoZWlnaHQsIHZvbHVtZSBhc3NlbWJseSwgcmVhZGJhY2spIGRvd25zY2FsZXMgdGhlIHBsYW5lIGFueXdheSwgc28gYSBjb21wb3NpdGUtZGVyaXZlZFxuICAgIC8vIHBsYW5lIGlzIHRoZSByaWdodCB0cmFkZSBmb3Igb25lIHRoYXQgYWN0dWFsbHkgbG9hZHMuIE9ubHkga2lja3MgaW4gd2hlbiB0aGUgY2hhbm5lbCBjYW4ndCBmaXQuXG4gICAgaWYgKGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgJiYgIXNlbC5maXRzICYmIGNoYW5uZWwgIT0gbnVsbCAmJiBkZXNjLmxldmVscy5sZW5ndGggPiBwZXJDaGFubmVsTGV2ZWxzKSB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBwaWNrKGRlc2MubGV2ZWxzKTtcbiAgICAgIGlmIChjb21wb3NpdGUuZml0cyB8fCB0aWxlc0Zvcihjb21wb3NpdGUubHZsKSA8IHRpbGVzRm9yKHNlbC5sdmwpKSB7XG4gICAgICAgIGVmZmVjdGl2ZUNoYW5uZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNlbCA9IGNvbXBvc2l0ZTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbbmFwYXJpLWpzXSBjaGFubmVsICR7Y2hhbm5lbH0gaGFzIG5vIHB5cmFtaWQgbGV2ZWwgd2l0aGluIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlIGAgK1xuICAgICAgICAgICAgYGJ1ZGdldDsgdXNpbmcgdGhlIGNvbXBvc2l0ZSBvdmVydmlldyAocmVzICR7c2VsLmx2bC5yZXN9LCAke3NlbC5sdmwud2lkdGh9w5dgICtcbiAgICAgICAgICAgIGAke3NlbC5sdmwuaGVpZ2h0fSkgZm9yIHRoaXMgcGxhbmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hvc2VuID0gc2VsLmx2bDtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi53aWR0aCAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi5oZWlnaHQgLyB0KSk7XG4gICAgaWYgKCFzZWwuZml0cyAmJiBidWRnZXRUaWxlcyA9PT0gTUFYX1NUSVRDSF9USUxFUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gZnVsbCByZXNvbHV0aW9uIGV4Y2VlZHMgdGhlICR7YnVkZ2V0VGlsZXN9LXRpbGUvJHtNQVhfVEVYVFVSRV9ESU19cHggYnVkZ2V0OyBgICtcbiAgICAgICAgICBgZGlzcGxheWluZyBvdmVydmlldyBsZXZlbCByZXMgJHtjaG9zZW4ucmVzfSAoJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9KS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29scyA9PT0gMSAmJiByb3dzID09PSAxKSByZXR1cm4gZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIDAsIDAsIHQpO1xuXG4gICAgLy8gU3RpdGNoIGludG8gb25lIGxldmVsLXNpemVkIGNhbnZhcy4gRmV0Y2ggdGhlIGdyaWQgd2l0aCBCT1VOREVEIGNvbmN1cnJlbmN5OiBmaXJpbmcgZXZlcnkgdGlsZVxuICAgIC8vIGF0IG9uY2UgKGEgYmlnIGdyaWQgPSBodW5kcmVkcyBvZiByZXF1ZXN0cykgb3ZlcndoZWxtZWQgdGhlIHRpbGUgc2VydmVyICg1MDRzKS4gRWRnZSB0aWxlcyBhcmVcbiAgICAvLyBuYXJyb3dlci9zaG9ydGVyOyBkcmF3SW1hZ2UgcGxhY2VzIGVhY2ggYXQgaXRzIGdyaWQgb2Zmc2V0IHNvIHBhcnRpYWwgdGlsZXMgbGluZSB1cC5cbiAgICBjb25zdCBjb29yZHM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaCh7IGNvbCwgcm93IH0pO1xuICAgIH1cbiAgICBjb25zdCB0aWxlczogQXJyYXk8eyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXI7IGJtcDogSW1hZ2VCaXRtYXAgfT4gPSBbXTtcbiAgICBjb25zdCBzdGl0Y2hXb3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGpvYiA9IGNvb3Jkcy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWpvYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGUoY2hvc2VuLnJlcywgam9iLmNvbCwgam9iLnJvdywgdCk7XG4gICAgICAgIHRpbGVzLnB1c2goeyBjb2w6IGpvYi5jb2wsIHJvdzogam9iLnJvdywgYm1wIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihUSUxFX0ZFVENIX0NPTkNVUlJFTkNZLCBjb29yZHMubGVuZ3RoKSB9LCAoKSA9PiBzdGl0Y2hXb3JrZXIoKSksXG4gICAgKTtcblxuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGNob3Nlbi53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjaG9zZW4uaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2Ugc3RpdGNoOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgZm9yIChjb25zdCB7IGNvbCwgcm93LCBibXAgfSBvZiB0aWxlcykge1xuICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBTYWZldHkgbmV0OiBpZiB0aGUgY2hvc2VuIGxldmVsIHN0aWxsIGV4Y2VlZHMgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0IChlLmcuIGEgbXVsdGljaGFubmVsXG4gICAgLy8gaW1hZ2Ugd2hvc2UgY29hcnNlc3QgUkVBTCBsZXZlbCBpcyBodWdlIOKAlCBvdmVydmlldyBsZXZlbHMgYXJlIGNvbXBvc2l0ZS1vbmx5KSwgZG93bnNjYWxlIHRoZVxuICAgIC8vIHN0aXRjaGVkIGNhbnZhcyB0byBmaXQgc28gdGhlIFdlYkdQVSB0ZXh0dXJlIHVwbG9hZCBjYW4ndCBmYWlsLlxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIGlmIChsb25nZXN0ID4gTUFYX1RFWFRVUkVfRElNKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1BWF9URVhUVVJFX0RJTSAvIGxvbmdlc3Q7XG4gICAgICBjb25zdCBvdXRXID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihjaG9zZW4ud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3Qgb3V0SCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSBzdGl0Y2hlZCBsZXZlbCAke2Nob3Nlbi53aWR0aH3DlyR7Y2hvc2VuLmhlaWdodH0gZXhjZWVkcyB0aGUgYCArXG4gICAgICAgICAgYCR7TUFYX1RFWFRVUkVfRElNfXB4IHRleHR1cmUgbGltaXQ7IGRvd25zY2FsaW5nIHRvICR7b3V0V33DlyR7b3V0SH0uYCxcbiAgICAgICk7XG4gICAgICBsZXQgb3V0OiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvdXQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG91dFcsIG91dEgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIG91dC53aWR0aCA9IG91dFc7XG4gICAgICAgIG91dC5oZWlnaHQgPSBvdXRIO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2N0eCA9IG91dC5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghb2N0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBzbGljZSBkb3duc2NhbGU6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAgIG9jdHguZHJhd0ltYWdlKGNhbnZhcyBhcyB1bmtub3duIGFzIENhbnZhc0ltYWdlU291cmNlLCAwLCAwLCBvdXRXLCBvdXRIKTtcbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChvdXQgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChjYW52YXMgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE5hcGFyaUxvYWRlZD4ge1xuICAgIC8vIEtlZXBzIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSdzIGJsb2IgY2FjaGUgaW4gc3luYyBldmVuIHdoZW4gdGhlIHVzZXJcbiAgICAvLyBzd2l0Y2hlcyBiYWNrZW5kcyAoZS5nLiBPU0QgSW1hZ2Ug4oaSIG5hcGFyaSBWb2x1bWUpIG9uIHRoZSBzYW1lIGZpbGUg4oCUXG4gICAgLy8gd2hpY2hldmVyIGJhY2tlbmQgbG9hZHMgYSBnZW51aW5lbHkgZGlmZmVyZW50IGZpbGUgZmlyc3QgZXZpY3RzIGl0LlxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoaW1hZ2VJbmZvLmZpbGVOYW1lKTtcbiAgICB0aGlzLmxvYWRlZCA9IHsgaW1hZ2VJbmZvLCB6OiB6SW5kZXgsIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIF9pblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIHRoaXMucGxvdERpdklkID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0ID8gYCR7c2NyZWVuSGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICBob3N0LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG5cbiAgICBjb25zdCBpbmZvID0gKGltYWdlTG9hZGVkIGFzIE5hcGFyaUxvYWRlZCk/LmltYWdlSW5mbyA/PyBpbWFnZUluZm87XG4gICAgY29uc3QgeiA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy56ID8/IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgdmlld2VyID0gbmV3IFZpZXdlcih7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgYmFja2dyb3VuZDogeyByOiAwLjA3LCBnOiAwLjA3LCBiOiAwLjA5LCBhOiAxIH0sXG4gICAgICAgIC8vIFNldCBoZXJlIHJhdGhlciB0aGFuIGxlZnQgdG8gbmFwYXJpLWpzJ3Mgb3duIGRlZmF1bHQgc28gdGhlIGdlbnRsZXJcbiAgICAgICAgLy8gc3RlcCBhcHBsaWVzIHdpdGggdGhlIHZlcnNpb24gY3VycmVudGx5IGluc3RhbGxlZC4gQ2hvc2VuIHRvIG1hdGNoIHRoZVxuICAgICAgICAvLyBPU0QgYmFja2VuZCdzIHN0ZXAgKHNlZSBPU0RfWk9PTV9QRVJfU0NST0xMKTogdGhlIHdoZWVsIHNob3VsZCBmZWVsIHRoZVxuICAgICAgICAvLyBzYW1lIG9uIGFuIGltYWdlIHdoaWNoZXZlciByZW5kZXJlciBpcyBkcmF3aW5nIGl0LiBUaGUgc3RlcCBhcHBsaWVzIHBlclxuICAgICAgICAvLyBzY3JvbGwgRVZFTlQsIGFuZCBhIHRyYWNrcGFkIHNlbmRzIGEgYnVyc3Qgb2YgdGhlbSBwZXIgc3dpcGUsIHNvIGEgc3RlcFxuICAgICAgICAvLyB0dW5lZCB0byBhIG1vdXNlIG5vdGNoIHJ1bnMgYXdheSB1bmRlciBhIHRyYWNrcGFkLlxuICAgICAgICB3aGVlbFpvb21TcGVlZDogTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQsXG4gICAgICAgIC8vIFRoZSBGSVJTVCAzRCBsYXllciBvZiBhIHNjZW5lIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhOyBldmVyeSBsYXRlciBvbmUgbGVhdmVzIHRoZVxuICAgICAgICAvLyBwb3NlIGFsb25lLiBBIHNwYXRpYWwgc2NlbmUgaXMgYnVpbHQgZnJvbSBzZXZlcmFsIGxheWVycyBhbmQgcmVidWlsdCBjb25zdGFudGx5IOKAlFxuICAgICAgICAvLyByZWNvbG91cmluZyBieSBhIGNsYXNzLCBwaWNraW5nIGEgZ2VuZSwgc3RlcHBpbmcgYSBzZWN0aW9uIOKAlCBhbmQgd2l0aCBuYXBhcmktanMnc1xuICAgICAgICAvLyBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGZyYW1pbmcgZWFjaCBvZiB0aG9zZSB0aHJldyBhd2F5IGFuIG9yYml0IHRoZSB1c2VyIGhhZCBzZXQuXG4gICAgICAgIC8vIFRoZSBwb3NlIGl0IHNuYXBwZWQgYmFjayB0byBkZXBlbmRlZCBvbiBXSElDSCBsYXllciB3YXMgcmVidWlsdCwgc28gaXNvbGF0aW5nIG9uZVxuICAgICAgICAvLyBzZWN0aW9uIHpvb21lZCB0byB0aGF0IHNlY3Rpb24ncyBib3VuZHMuIGByZXNldEZpdDNEKClgIG9uIGEgZGF0YXNldCBjaGFuZ2UgaXMgd2hhdFxuICAgICAgICAvLyBsZXRzIHRoZSBuZXh0IHNjZW5lIGZyYW1lIGl0c2VsZi5cbiAgICAgICAgZml0M2Q6ICdvbmNlJyxcbiAgICAgICAgLy8gSW4gdGhlIHNwYXRpYWwgbW9kZXMgYSBwbGFpbiBjbGljayBTRUxFQ1RTIHRoZSBjbGFzcyB1bmRlciB0aGUgY3Vyc29yLFxuICAgICAgICAvLyBzbyBuYXBhcmkncyBPU0Qtc3R5bGUgY2xpY2stdG8tem9vbSBpcyB0dXJuZWQgb2ZmIHRoZXJlOiBvdGhlcndpc2Ugb25lXG4gICAgICAgIC8vIGNsaWNrIHdvdWxkIGJvdGggc2VsZWN0IGEgY2xhc3MgYW5kIHpvb20gMnggYWJvdXQgdGhlIGN1cnNvciwgYW5kIHRoZVxuICAgICAgICAvLyB6b29tIHdvdWxkIHRoZW4gaGFsdmUgdGhlIHBpeGVsIHJhZGl1cyB0aGUgbmV4dCBjbGljayBoaXQtdGVzdHMgd2l0aC5cbiAgICAgICAgLy8gWm9vbWluZyBpcyBzdGlsbCBvbiB0aGUgd2hlZWwsIHRoZSB6b29tIGJ1dHRvbnMgYW5kIHRoZSB6b29tLWJveCB0b29sLlxuICAgICAgICAuLi4oaXNTcGF0aWFsT21pY3MocGxvdFR5cGUpIHx8IGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpXG4gICAgICAgICAgPyB7IGNsaWNrWm9vbUZhY3RvcjogMCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgICAgYXdhaXQgdmlld2VyLnJlYWR5O1xuXG4gICAgICBpZiAoaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNwYXRpYWxPbWljczNkKHZpZXdlciwgaG9zdCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3BhdGlhbE9taWNzKHZpZXdlciwgaG9zdCwgeik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU2NhdHRlcihwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNjYXR0ZXIodmlld2VyLCBob3N0LCB6KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTY2F0dGVyM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyM2Qodmlld2VyLCBpbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTdXJmYWNlKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3VyZmFjZSh2aWV3ZXIpO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaTNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50Vm9sdW1lKHZpZXdlciwgaW5mbywgcGxvdFR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAgICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbE5hdmlnYXRvcih6KTtcbiAgICAgICAgdGhpcy5pbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgICAgfVxuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHBsb3QgZmFpbGVkOicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzOiBwZXItY2hhbm5lbCBjb21wb3NpdGUsIExVVCwgbmF0aXZlIGhpc3RvZ3JhbXMgKGppdC11aSMxMDIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgZ3JheXNjYWxlIGRpc3BsYXkgY29sb3JtYXAgZnJvbSB0aGUgc3RvcmUgc2VsZWN0aW9uICgrcmV2ZXJzZSksIGRlZmF1bHRpbmcgdG8gZ3JheS5cbiAgICogIE1hcHMgdGhlIGppdC11aSBzdG9yZSBjb2xvcm1hcCBub2RlIHRvIGEgbmFwYXJpIGBDb2xvcm1hcGAgdmlhIHRoZSBsaWJyYXJ5J3MgTFVUIGZhY3Rvcnk7XG4gICAqICB0aGUgbXVsdGljaGFubmVsIHRpbnQgcmFtcHMgYXJlIGJ1aWx0IGluc2lkZSB7QGxpbmsgTXVsdGlDaGFubmVsSW1hZ2VWaWV3fSBmcm9tIGVhY2hcbiAgICogIGNoYW5uZWwncyBoZXggY29sb3VyLiAqL1xuICBwcml2YXRlIGdyYXlzY2FsZUNvbG9ybWFwKCk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsKT8uZGF0YT8udmFsdWU7XG4gICAgY29uc3QgbHV0ID0gdmFsdWUgIT0gbnVsbCA/IGJ1aWxkQ29sb3JtYXBMdXQodmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UpIDogbnVsbDtcbiAgICBpZiAobHV0KSByZXR1cm4gY29sb3JtYXBGcm9tTHV0KCdncmF5LWNtYXAnLCBsdXQpO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRSZXZlcnNlXG4gICAgICA/IGNvbG9ybWFwRnJvbUx1dCgnZ3JheS1yZXYnLCBbWzI1NSwgMjU1LCAyNTVdLCBbMCwgMCwgMF1dIGFzIFJnYltdKVxuICAgICAgOiAnZ3JheSc7XG4gIH1cblxuICAvKiogRmV0Y2ggYSBzdGl0Y2hlZCBzbGljZSBhbmQgcmVhZCBpdCBiYWNrIGFzIGEgc2luZ2xlLWNoYW5uZWwgdWludDggcGxhbmUuIGBjaGFubmVsYCBzZWxlY3RzIGFcbiAgICogIGJhbmQgKG11bHRpY2hhbm5lbCk7IG9taXQgaXQgZm9yIHRoZSBncmF5c2NhbGUgY29tcG9zaXRlIChhbGwgb3ZlcnZpZXcgbGV2ZWxzIGF2YWlsYWJsZSwgc28gYVxuICAgKiAgbGFyZ2UgaW1hZ2UgcGlja3MgYSBmaXR0aW5nIGRvd25zY2FsZWQgbGV2ZWwgcmF0aGVyIHRoYW4gb25seSB0aGUgZnVsbC1yZXMgcmVhbCBsZXZlbCkuICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDaGFubmVsRGF0YShcbiAgICB6OiBudW1iZXIsXG4gICAgY2hhbm5lbD86IG51bWJlcixcbiAgICBidWRnZXRUaWxlcz86IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBibXAgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgY2hhbm5lbCwgYnVkZ2V0VGlsZXMpO1xuICAgIHJldHVybiB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGJtcCk7XG4gIH1cblxuICAvKiogRGVjb2RlIGFuIGBJbWFnZUJpdG1hcGAgKHNlcnZlciBiYW5kcyBhcmUgZ3JheXNjYWxlLCBSPUc9QikgdG8gYSBzaW5nbGUtY2hhbm5lbCB1aW50OCBwbGFuZS5cbiAgICogIGBtYXhTaWRlYCBjYXBzIHRoZSBsb25nZXN0IHNpZGUgKGRvd25zY2FsaW5nIG9uIHRoZSBjYW52YXMgZHJhdykg4oCUIHVzZWQgdG8ga2VlcCBwcmUtbG9hZGVkXG4gICAqICBzdXJmYWNlIHNsaWNlIHBsYW5lcyBzbWFsbC4gKi9cbiAgcHJpdmF0ZSBiaXRtYXBUb0x1bWluYW5jZShcbiAgICBibXA6IEltYWdlQml0bWFwLFxuICAgIG1heFNpZGU/OiBudW1iZXIsXG4gICk6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3Qgc2NhbGUgPSBtYXhTaWRlID8gTWF0aC5taW4oMSwgbWF4U2lkZSAvIE1hdGgubWF4KGJtcC53aWR0aCwgYm1wLmhlaWdodCwgMSkpIDogMTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChibXAud2lkdGggKiBzY2FsZSkpO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJtcC5oZWlnaHQgKiBzY2FsZSkpO1xuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3LCBoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSB3O1xuICAgICAgY2FudmFzLmhlaWdodCA9IGg7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgbnVsbDtcbiAgICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBjaGFubmVsIHJlYWRiYWNrOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgLy8gU2NhbGUgdGhlIFdIT0xFIGJpdG1hcCBpbnRvIHRoZSAocG9zc2libHkgc21hbGxlcikgdGFyZ2V0IGNhbnZhcyDigJQgZHJhd2luZyBhdCBuYXR1cmFsIHNpemVcbiAgICAvLyB3b3VsZCBjcm9wIHRvIHRoZSB0b3AtbGVmdCB3w5doIGNvcm5lciB3aGVuIGRvd25zY2FsaW5nIGEgbGFyZ2Ugc2xpY2UgKG1heFNpZGUgPCBibXAgc2l6ZSkuXG4gICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHcsIGgpO1xuICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgY29uc3QgcmdiYSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTtcbiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkodyAqIGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdyAqIGg7IGkrKykgZGF0YVtpXSA9IHJnYmFbaSAqIDRdO1xuICAgIHJldHVybiB7IGRhdGEsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIDJEIGltYWdlIGZvciBzbGljZSBgemAuIFdpdGggYSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIHdlIHVzZSBhIHB5cmFtaWRhbFxuICAgKiB7QGxpbmsgVGlsZWRTb3VyY2V9IHBlciBsYXllciBzbyB0aGUgdmlldyByZWZpbmVzIHRvIGhpZ2hlciByZXNvbHV0aW9uIG9uIHpvb20gKGxpa2UgT1NEKSBhbmRcbiAgICogc2l0cyBuYXR1cmFsbHkgaW4gZnVsbC1yZXNvbHV0aW9uIGNvb3JkaW5hdGVzOyB3aXRob3V0IG9uZSB3ZSBmYWxsIGJhY2sgdG8gdGhlIHNpbmdsZS1sZXZlbFxuICAgKiBzdGl0Y2guIFRocmVlIGRpc3BsYXkgbW9kZXMgZWl0aGVyIHdheTogbXVsdGljaGFubmVsIGFkZGl0aXZlIHRpbnQsIGdyYXlzY2FsZSBjb2xvcm1hcCwgUkdCLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZSh6OiBudW1iZXIsIHRva2VuPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBpZiAoZGVzYyAmJiBkZXNjLmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICBpZiAodG9rZW4gIT0gbnVsbCAmJiB0b2tlbiAhPT0gdGhpcy5zbGljZVJlcSkgcmV0dXJuO1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZVRpbGVkKHosIGRlc2MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJJbWFnZVN0aXRjaGVkKHosIHRva2VuKTtcbiAgfVxuXG4gIC8qKiBTaW5nbGUtbGV2ZWwgc3RpdGNoIGZhbGxiYWNrIChubyBkZXNjcmlwdG9yKTogdGhlIHByZS10aWxpbmcgcGF0aC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZVN0aXRjaGVkKHo6IG51bWJlciwgdG9rZW4/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBkZXNjPy5jaGFubmVscyA/PyAoc3RhdGVzLmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSAhIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxO1xuXG4gICAgLy8gMSkgRmV0Y2ggYWxsIHBpeGVsIGRhdGEgQkVGT1JFIHRvdWNoaW5nIHRoZSB2aWV3ZXIsIHNvIGEgc3VwZXJzZWRlZCBzY3J1YiBjYW4gYmFpbCB3aXRob3V0XG4gICAgLy8gICAgaGF2aW5nIHRvcm4gZG93biB0aGUgdmlzaWJsZSBsYXllcnMgKGF2b2lkcyBmbGlja2VyIC8gb3V0LW9mLW9yZGVyIGxheWVyIHN0YXRlKS5cbiAgICBsZXQgbW9kZTogJ2dyYXlzY2FsZScgfCAnbXVsdGljaGFubmVsJyB8ICdyZ2InO1xuICAgIGxldCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgYml0bWFwOiBJbWFnZUJpdG1hcCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgIG1vZGUgPSAnbXVsdGljaGFubmVsJztcbiAgICAgIHBsYW5lcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjaGFubmVsQ291bnQgfSwgKF8sIGMpID0+IHRoaXMuZmV0Y2hDaGFubmVsRGF0YSh6LCBjKSksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAxKSB7XG4gICAgICBtb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgICAvLyBDb21wb3NpdGUgZmV0Y2ggKG5vIGNoYW5uZWwpIOKGkiBhbGwgb3ZlcnZpZXcgbGV2ZWxzIHVzYWJsZSwgc28gYSBsYXJnZSBncmF5c2NhbGUgaW1hZ2VcbiAgICAgIC8vIHNlbGVjdHMgYSBmaXR0aW5nIGRvd25zY2FsZWQgbGV2ZWwgaW5zdGVhZCBvZiB0aGUgZnVsbC1yZXMgcmVhbCBsZXZlbCAodGV4dHVyZSBsaW1pdCkuXG4gICAgICBwbGFuZXMgPSBbYXdhaXQgdGhpcy5mZXRjaENoYW5uZWxEYXRhKHopXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZSA9ICdyZ2InO1xuICAgICAgYml0bWFwID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHopO1xuICAgIH1cblxuICAgIC8vIDIpIENvbW1pdCDigJQgdW5sZXNzIGEgbmV3ZXIgc2NydWIgc3VwZXJzZWRlZCB1cyBvciB0aGUgdmlld2VyIHdhcyB0b3JuIGRvd24uXG4gICAgaWYgKCh0b2tlbiAhPSBudWxsICYmIHRva2VuICE9PSB0aGlzLnNsaWNlUmVxKSB8fCB0aGlzLnZpZXdlciAhPT0gdikge1xuICAgICAgYml0bWFwPy5jbG9zZT8uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGRpc3BsYXllZCB0ZXh0dXJlIG1heSBiZSBhIGRvd25zY2FsZWQgcHlyYW1pZCBsZXZlbDsgc2NhbGUgdGhlIGxheWVyIGludG8gRlVMTC1SRVNPTFVUSU9OXG4gICAgLy8gd29ybGQgY29vcmRpbmF0ZXMgKGxldmVsLTAgcGl4ZWxzKSBzbyB0aGUgY2FtZXJhLCByZWFkYmFjayBhbmQg4oCUIGNyaXRpY2FsbHkg4oCUIHByZS1zYXZlZFxuICAgIC8vIHJlZ2lvbnMgKHN0b3JlZCBpbiBmdWxsLXJlcyBjb29yZHMsIGUuZy4gbmRwaSkgYWxsIGxpbmUgdXAgcmVnYXJkbGVzcyBvZiB3aGljaCBsZXZlbCBpcyBzaG93bi5cbiAgICAvLyBUaGlzIG1pcnJvcnMgT1NELCB3aG9zZSBjb29yZGluYXRlIHN5c3RlbSBpcyBhbHdheXMgbGV2ZWwgMC5cbiAgICBjb25zdCB0ZXhXID0gbW9kZSA9PT0gJ3JnYicgPyAoYml0bWFwIGFzIEltYWdlQml0bWFwKS53aWR0aCA6IHBsYW5lc1swXT8ud2lkdGggPz8gMDtcbiAgICBjb25zdCB0ZXhIID0gbW9kZSA9PT0gJ3JnYicgPyAoYml0bWFwIGFzIEltYWdlQml0bWFwKS5oZWlnaHQgOiBwbGFuZXNbMF0/LmhlaWdodCA/PyAwO1xuICAgIGNvbnN0IGZ1bGxXID0gZGVzYz8ud2lkdGggfHwgdGV4VyB8fCAxO1xuICAgIGNvbnN0IGZ1bGxIID0gZGVzYz8uaGVpZ2h0IHx8IHRleEggfHwgMTtcbiAgICBjb25zdCBzY2FsZTogW251bWJlciwgbnVtYmVyXSA9IFt0ZXhXID8gZnVsbFcgLyB0ZXhXIDogMSwgdGV4SCA/IGZ1bGxIIC8gdGV4SCA6IDFdO1xuXG4gICAgdGhpcy5pbWFnZU1vZGUgPSBtb2RlO1xuICAgIGNvbnN0IGludGVycG9sYXRpb246ICdsaW5lYXInIHwgJ25lYXJlc3QnID0gdGhpcy5pbWFnZVNtb290aGluZyA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBuZXcgTXVsdGlDaGFubmVsSW1hZ2VWaWV3KHYpO1xuICAgIGlmIChtb2RlID09PSAnbXVsdGljaGFubmVsJykge1xuICAgICAgY29uc3Qgdmlld3M6IENoYW5uZWxWaWV3W10gPSBwbGFuZXMubWFwKChkLCBjKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICBjb25zdCBjb2xvciA9IHN0Py5jb2xvciA/PyBkZXNjPy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZC53aWR0aCwgaGVpZ2h0OiBkLmhlaWdodCwgY2hhbm5lbHM6IDEsIGR0eXBlOiAndWludDgnLCBkYXRhOiBkLmRhdGEgfSxcbiAgICAgICAgICB0aW50OiBjb2xvcixcbiAgICAgICAgICBuYW1lOiBzdD8ubmFtZSA/PyBgY2gke2N9YCxcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICAgIHNjYWxlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcignbXVsdGljaGFubmVsJywgdmlld3MsIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdncmF5c2NhbGUnKSB7XG4gICAgICBjb25zdCBkID0gcGxhbmVzWzBdO1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcihcbiAgICAgICAgJ2dyYXlzY2FsZScsXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGQud2lkdGgsIGhlaWdodDogZC5oZWlnaHQsIGNoYW5uZWxzOiAxLCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogZC5kYXRhIH0sXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5ncmF5c2NhbGVDb2xvcm1hcCgpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgeyBpbnRlcnBvbGF0aW9uIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcigncmdiJywgW3sgc291cmNlOiBiaXRtYXAgYXMgSW1hZ2VCaXRtYXAsIHNjYWxlIH1dLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfVxuICAgIHRoaXMuaW1hZ2VXID0gZnVsbFc7XG4gICAgdGhpcy5pbWFnZUggPSBmdWxsSDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIDJEIGltYWdlIHdpdGggcHlyYW1pZGFsIHtAbGluayBUaWxlZFNvdXJjZX1zIOKAlCB0aGUgdmlldyByZWZpbmVzIHRvIGhpZ2hlciByZXNvbHV0aW9uXG4gICAqIGFzIHlvdSB6b29tIGluICh0aGUgdmlzdWFsIGZldGNoZXMgdGhlIGxldmVsIHdob3NlIHRleGVscyDiiYggc2NyZWVuIHBpeGVscykgYW5kIHNpdHMgaW4gZnVsbC1yZXNcbiAgICogY29vcmRpbmF0ZXMgc28gcmVnaW9ucyBhbGlnbi4gU2FtZSB0aHJlZSBtb2RlcyBhcyB0aGUgc3RpdGNoIHBhdGguIFBlci1jaGFubmVsIGxheWVycyB1c2UgdGhlXG4gICAqIFJFQUwgcHlyYW1pZCBsZXZlbHMgKHBlci1jaGFubmVsIHRpbGVzIG9ubHkgZXhpc3QgdGhlcmUpOyB0aGUgY29tcG9zaXRlIHVzZXMgYWxsIGxldmVscy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVySW1hZ2VUaWxlZCh6OiBudW1iZXIsIGRlc2M6IFRpbGVEZXNjcmlwdG9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBkZXNjLmNoYW5uZWxzID8/IChzdGF0ZXMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9ICEhZGVzYy5tdWx0aWNoYW5uZWwgJiYgY2hhbm5lbENvdW50ID4gMTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uOiAnbGluZWFyJyB8ICduZWFyZXN0JyA9IHRoaXMuaW1hZ2VTbW9vdGhpbmcgPyAnbGluZWFyJyA6ICduZWFyZXN0JztcblxuICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBuZXcgTXVsdGlDaGFubmVsSW1hZ2VWaWV3KHYpO1xuXG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAnbXVsdGljaGFubmVsJztcbiAgICAgIGNvbnN0IHZpZXdzOiBDaGFubmVsVmlld1tdID0gW107XG4gICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICBjb25zdCBjb2xvciA9IHN0Py5jb2xvciA/PyBkZXNjLmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgIHZpZXdzLnB1c2goe1xuICAgICAgICAgIHNvdXJjZTogdGhpcy5idWlsZFRpbGVkU291cmNlKGRlc2MsIGMsIDEpLFxuICAgICAgICAgIHRpbnQ6IGNvbG9yLFxuICAgICAgICAgIG5hbWU6IHN0Py5uYW1lID8/IGBjaCR7Y31gLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ211bHRpY2hhbm5lbCcsIHZpZXdzLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKFxuICAgICAgICAnZ3JheXNjYWxlJyxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5idWlsZFRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgMSksXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5ncmF5c2NhbGVDb2xvcm1hcCgpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHsgaW50ZXJwb2xhdGlvbiB9LFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAncmdiJztcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IHRoaXMuYnVpbGRUaWxlZFNvdXJjZShkZXNjLCB1bmRlZmluZWQsIDQpIH1dLCB7XG4gICAgICAgIGludGVycG9sYXRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZVcgPSBkZXNjLndpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gZGVzYy5oZWlnaHQ7XG4gICAgLy8gQXdhaXQgb24gdGhlIGluaXRpYWwgcmVuZGVyIHNvIGdldEhpc3RvZ3JhbS9hdXRvQ29udHJhc3QgaGF2ZSBkYXRhIGltbWVkaWF0ZWx5OyBzbGljZSBjaGFuZ2VzXG4gICAgLy8gcmVmcmVzaCBmaXJlLWFuZC1mb3JnZXQgKHRoZSBoaXN0b2dyYW0gcGFuZSByZXRyaWVzKS5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHosIGRlc2MpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGEgcHlyYW1pZGFsIFRpbGVkU291cmNlIGJhY2tlZCBieSB0aGUgc2VydmVyIGAvdGlsZWAgZW5kcG9pbnQuIGBjaGFubmVsYCBzZWxlY3RzIGEgYmFuZFxuICAgKiAgKGdyYXlzY2FsZSBsdW1pbmFuY2UsIHJlYWwgbGV2ZWxzIG9ubHkpOyBvbWl0IGl0IGZvciB0aGUgY29tcG9zaXRlIChSR0JBLCBhbGwgbGV2ZWxzKS4gKi9cbiAgcHJpdmF0ZSBidWlsZFRpbGVkU291cmNlKFxuICAgIGRlc2M6IFRpbGVEZXNjcmlwdG9yLFxuICAgIGNoYW5uZWw6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBjaGFubmVsczogMSB8IDQsXG4gICk6IFRpbGVkU291cmNlIHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKSA/PyAnJztcbiAgICAvLyBQZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IGF0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWxzOyB0aGUgY29tcG9zaXRlIGV4aXN0cyBhdCBhbGwgbGV2ZWxzLlxuICAgIGNvbnN0IHVzYWJsZSA9XG4gICAgICBjaGFubmVsID09IG51bGxcbiAgICAgICAgPyBkZXNjLmxldmVsc1xuICAgICAgICA6IGRlc2MubGV2ZWxzLnNsaWNlKDAsIE1hdGgubWF4KDEsIGRlc2MucmVhbExldmVscyA/PyBkZXNjLmxldmVscy5sZW5ndGgpKTtcbiAgICBjb25zdCBsZXZlbFNjYWxlcyA9IHVzYWJsZS5tYXAoKGwpID0+IGRlc2Mud2lkdGggLyBNYXRoLm1heCgxLCBsLndpZHRoKSk7IC8vIGxldmVsLTAgcHggcGVyIGxldmVsIHB4XG4gICAgY29uc3QgdGlsZVNpemUgPSBkZXNjLnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICBjb25zdCBjaCA9IGNoYW5uZWwgPT0gbnVsbCA/ICcnIDogYCZjaGFubmVsPSR7Y2hhbm5lbH1gO1xuICAgIGNvbnN0IGFwaSA9IHRoaXMuYXBpO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAndGlsZWQnLFxuICAgICAgd2lkdGg6IGRlc2Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IGRlc2MuaGVpZ2h0LFxuICAgICAgdGlsZVNpemUsXG4gICAgICBsZXZlbHM6IHVzYWJsZS5sZW5ndGgsXG4gICAgICBsZXZlbFNjYWxlcyxcbiAgICAgIGRlcHRoOiBNYXRoLm1heCgxLCBkZXNjLnogfHwgMSksXG4gICAgICBjaGFubmVscyxcbiAgICAgIGR0eXBlOiAndWludDgnLFxuICAgICAgZmV0Y2hUaWxlOiBhc3luYyAoa2V5OiBUaWxlS2V5KTogUHJvbWlzZTxQaXhlbENodW5rPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHVzYWJsZVtrZXkubGV2ZWxdPy5yZXMgPz8ga2V5LmxldmVsO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHthcGl9dGlsZT9pbmZvPSR7aW5mb0I2NH0mcmVzPSR7cmVzfSZjb2w9JHtrZXkuY29sfSZyb3c9JHtrZXkucm93fSZ6PSR7a2V5Lnp9JnRpbGVTaXplPSR7dGlsZVNpemV9JHtjaH1gO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKCFyZXNwLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSB0aWxlICR7a2V5LmxldmVsfS8ke2tleS5jb2x9LyR7a2V5LnJvd30g4oaSICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpO1xuICAgICAgICBpZiAoY2hhbm5lbHMgPT09IDQpIHJldHVybiB7IHdpZHRoOiBibXAud2lkdGgsIGhlaWdodDogYm1wLmhlaWdodCwgZGF0YTogYm1wIH07XG4gICAgICAgIHJldHVybiB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGJtcCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogKFJlKWZldGNoIGEgY29hcnNlIHBlci1jaGFubmVsIGx1bWluYW5jZSBzYW1wbGUgZm9yIHRoZSBoaXN0b2dyYW0gKHRpbGVkIG1vZGUgaGFzIG5vIGZ1bGxcbiAgICogIGluLW1lbW9yeSBwaXhlbHMpLiBPbmUgY2hlYXAgb3ZlcnZpZXcgdGlsZSBwZXIgY2hhbm5lbDsgY2FjaGVkIGJ5IGNoYW5uZWwgaW5kZXguICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoejogbnVtYmVyLCBkZXNjOiBUaWxlRGVzY3JpcHRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaGlzdFNhbXBsZXMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm47IC8vIFJHQiB1c2VzIHRoZSBkaXNwbGF5ZWQtcGl4ZWwgcmVhZGJhY2sgKHJnYkhpc3RvZ3JhbSlcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcgPyBkZXNjLmNoYW5uZWxzID8/IDEgOiAxO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnID8gYyA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZCA9IGF3YWl0IHRoaXMuZmV0Y2hDaGFubmVsRGF0YSh6LCBjaCwgMSk7IC8vIGJ1ZGdldCAxIOKGkiBjb2Fyc2VzdCBzaW5nbGUgdGlsZVxuICAgICAgICB0aGlzLmhpc3RTYW1wbGVzLnNldChjLCBkLmRhdGEpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGxlYXZlIHRoaXMgY2hhbm5lbCdzIHNhbXBsZSB1bnNldCAqL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgY2hhbm5lbCBzdGF0ZXMgKyBncmF5c2NhbGUgY29sb3JtYXAg4oaSIGxpdmUtYXBwbHkgdG8gdGhlIHJlbmRlcmVkIGxheWVycyAobm9cbiAgICogIHJlLWZldGNoOyBvbmx5IHogY2hhbmdlcyByZS1mZXRjaCkuIFJlcGxhY2VzIGFueSBwcmlvciBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgXSkuc3Vic2NyaWJlKChbY2hhbm5lbHMsIGNvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnRdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIHRoaXMuYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN1YnNjcmliZSB0aGUgc3RvcmUgY29sb3JtYXAgKCtyZXZlcnNlKSwgaW52ZXJ0LCBhbmQgY2hhbm5lbCBzdGF0ZSDihpIgdGhlIHZvbHVtZS9pc29zdXJmYWNlXG4gICAqICB0cmFuc2ZlciBmdW5jdGlvbjogY29sb3VyIChjaGFubmVsIHRpbnQgb3Igc2VsZWN0ZWQgY29sb3JtYXApLCB0aGUgaW50ZW5zaXR5ICoqd2luZG93XG4gICAqICAobWluL21heCDihpIgY29udHJhc3RMaW1pdHMpKiogYW5kICoqZ2FtbWEqKiwgbWlycm9yaW5nIHRoZSBncmF5c2NhbGUgaW1hZ2UncyBkaXNwbGF5IGNvbnRyb2xzXG4gICAqICBzbyB0aGUgaGlzdG9ncmFtIHBhbmUgZHJpdmVzIHRoZSAzRCByZW5kZXIuIFJlcGxhY2VzIGFueSBwcmlvciBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVm9sdW1lRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHNdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZvbHVtZVZpZXc7XG4gICAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCkge1xuICAgICAgICAvLyBFYWNoIGNoYW5uZWwncyBsYXllciBpcyB0aW50ZWQgYnkgaXRzIGNvbG91ciBhbmQgZ2V0cyBpdHMgb3duIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5LlxuICAgICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKSxcbiAgICAgICAgICAgIC4uLihzdFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICBnYW1tYTogc3QuZ2FtbWEsXG4gICAgICAgICAgICAgICAgICB2aXNpYmxlOiBzdC52aXNpYmxlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVsc1swXTtcbiAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogc3QuZ2FtbWEgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogQSBjaGFubmVsJ3MgdGludCBjb2xvcm1hcCAoYmxhY2vihpJjb2xvdXIpIHdpdGggcmV2ZXJzZS1zY2FsZSAvIGludmVydCBhcHBsaWVkIGJ5IGZsaXBwaW5nLiAqL1xuICBwcml2YXRlIGNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3I6IHN0cmluZyk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBsZXQgY21hcDogQ29sb3JtYXAgfCBzdHJpbmcgPSB0aW50Q29sb3JtYXAoY29sb3IpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRSZXZlcnNlKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIGlmICh0aGlzLmludmVydEVuYWJsZWQpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgcmV0dXJuIGNtYXA7XG4gIH1cblxuICAvKipcbiAgICogQ29sb3VyIG1hcCBmb3IgdGhlIHZvbHVtZS9pc29zdXJmYWNlLiBBIHJlYWwgY29sb3JtYXAgc2VsZWN0aW9uICh2aXJpZGlzL21hZ21hL+KApikgd2lucztcbiAgICogb3RoZXJ3aXNlIHRoZSBjaGFubmVsJ3MgY29sb3VyIHRpbnRzIGl0IChzbyB0aGUgY2hhbm5lbC1kaWFsb2cgY29sb3VyIHN3YXRjaCByZWNvbG9ycyB0aGUgM0RcbiAgICogcmVuZGVyKS4gUmV2ZXJzZS1zY2FsZSBhbmQgaW52ZXJ0IGVhY2ggZmxpcCB0aGUgcmFtcCDigJQgdGhlIGBWb2x1bWVMYXllcmAgaGFzIG5vIHBlci1sYXllclxuICAgKiBpbnZlcnQsIHNvIGJvdGggYXJlIGVtdWxhdGVkIGJ5IHJldmVyc2luZyB0aGUgY29sb3JtYXAuXG4gICAqL1xuICBwcml2YXRlIHZvbHVtZUNvbG9ybWFwKHN0OiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGxhYmVsPzogc3RyaW5nOyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICAvLyBBIGNvbG9yZWQgY29sb3JtYXAgKHZpcmlkaXMvbWFnbWEv4oCmKSBkcml2ZXMgdGhlIHZvbHVtZTsgdGhlIGRlZmF1bHQgZ3JheXNjYWxlIGZhbWlseVxuICAgIC8vIChncmF5IC8gR3JleXMgLyBHcmV5cyBJbnYpIHlpZWxkcyB0byB0aGUgY2hhbm5lbCdzIGNvbG91ciBzbyB0aGUgZGlhbG9nIGNvbG91ciBzd2F0Y2hcbiAgICAvLyByZWNvbG9ycyB0aGUgM0QgcmVuZGVyLlxuICAgIGNvbnN0IGxhYmVsID0gKG5vZGU/LmxhYmVsID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGdyYXlGYW1pbHkgPSBsYWJlbCA9PT0gJycgfHwgbGFiZWwuaW5jbHVkZXMoJ2dyZXknKSB8fCBsYWJlbC5pbmNsdWRlcygnZ3JheScpO1xuICAgIGNvbnN0IHZhbHVlID0gbm9kZT8uZGF0YT8udmFsdWU7XG4gICAgY29uc3QgbHV0ID0gIWdyYXlGYW1pbHkgJiYgdmFsdWUgIT0gbnVsbCA/IGJ1aWxkQ29sb3JtYXBMdXQodmFsdWUsIGZhbHNlKSA6IG51bGw7XG4gICAgbGV0IGNtYXA6IENvbG9ybWFwIHwgc3RyaW5nID0gbHV0XG4gICAgICA/IGNvbG9ybWFwRnJvbUx1dCgndm9sLWNtYXAnLCBsdXQpXG4gICAgICA6IHRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKTtcbiAgICAvLyBSZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wICh0aGUgVm9sdW1lTGF5ZXIgaGFzIG5vIHBlci1sYXllciBpbnZlcnQpLlxuICAgIGlmICh0aGlzLmN1cnJlbnRSZXZlcnNlKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIGlmICh0aGlzLmludmVydEVuYWJsZWQpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgcmV0dXJuIGNtYXA7XG4gIH1cblxuICAvKiogQXBwbHkgdGhlIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgLyBjb2xvcm1hcCB0byB0aGUgbGl2ZSBsYXllcnMgKG5vIHJlLWZldGNoKSwgZGVsZWdhdGluZyB0aGVcbiAgICogIHBlci1jaGFubmVsIGxheWVyIG11dGF0aW9ucyB0byB0aGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30uICovXG4gIHByaXZhdGUgYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHM6IElDaGFubmVsU3RhdGVbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmNoYW5uZWxWaWV3O1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXZpZXcpIHJldHVybjtcbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGlmICghc3QpIHJldHVybjtcbiAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICB0aW50OiBzdC5jb2xvcixcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSxcbiAgICAgICAgICBnYW1tYTogc3QuZ2FtbWEsXG4gICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJykge1xuICAgICAgY29uc3Qgc3QgPSBjaGFubmVsc1swXTtcbiAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICAuLi4oc3QgPyB7IGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sIGdhbW1hOiBzdC5nYW1tYSB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIChSZSlpbnN0YWxsIHRoZSBwaHlzaWNhbCBzY2FsZSBiYXIgb3ZlciB0aGUgMkQgaW1hZ2UsIHNpemVkIGZyb20gdGhlIGltYWdlJ3MgwrVtL3BpeGVsXG4gICAqICAoYC90aWxlcy9pbmZvYCBtcHBYLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhKS4gTm8tb3Agd2l0aG91dCBhIHBoeXNpY2FsIHNpemUuICovXG4gIHByaXZhdGUgaW5zdGFsbFNjYWxlQmFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2NhbGVCYXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbnVsbDtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBpZiAodGhpcy52aWV3ZXIgJiYgdGhpcy5ob3N0ICYmIG1wcFggPiAwKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE5hcGFyaVNjYWxlQmFyKHRoaXMuaG9zdCwgdGhpcy52aWV3ZXIuY2FtZXJhLCBtcHBYKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIG92ZXJ2aWV3IG5hdmlnYXRvciBmb3IgYSAyRCB2aWV3IHdpdGggYW4gaW1hZ2U6IGEgY29hcnNlIHRodW1ibmFpbCBvZiB0aGUgd2hvbGVcbiAgICogaW1hZ2Ugd2l0aCB0aGUgdmlld3BvcnQgb24gaXQ7IGNsaWNrIG9yIGRyYWcgdG8gcGFuIGF0IHRoZSBjdXJyZW50IHpvb20gKGFzIE9TRCkuXG4gICAqL1xuICBwcml2YXRlIHNob3dMb2FkaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0KSByZXR1cm47XG4gICAgdGhpcy5sb2FkaW5nQmFkZ2UgPz89IG5ldyBOYXBhcmlMb2FkaW5nQmFkZ2UodGhpcy5ob3N0KTtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZS5zZXQoWy4uLih0aGlzLm9ic2VydmF0aW9uc0xvYWRpbmcgPiAwID8gWydPYnNlcnZhdGlvbnMnXSA6IFtdKSwgLi4udGhpcy50aWxlTG9hZGluZ10pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnN0YWxsTmF2aWdhdG9yKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdG9yPy5kZXN0cm95KCk7XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBudWxsO1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMuaG9zdCB8fCAhdGhpcy5pbWFnZVcgfHwgIXRoaXMuaW1hZ2VIKSByZXR1cm47XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBuZXcgTmFwYXJpTmF2aWdhdG9yKFxuICAgICAgdGhpcy5ob3N0LCB0aGlzLnZpZXdlci5jYW1lcmEsIHRoaXMuaW1hZ2VXLCB0aGlzLmltYWdlSCwgKCkgPT4gdGhpcy5zcGF0aWFsVG9vbHRpcD8uaGlkZSgpLFxuICAgICk7XG4gICAgdGhpcy5uYXZpZ2F0b3Iuc2V0VmlzaWJsZSh0aGlzLm5hdmlnYXRvclZpc2libGUpO1xuICAgIHZvaWQgdGhpcy5yZWZyZXNoTmF2aWdhdG9ySW1hZ2Uoeik7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgbmF2aWdhdG9yJ3MgdGh1bWJuYWlsIGZyb20gdGhlIGNvYXJzZXN0IHB5cmFtaWQgbGV2ZWwuIEEgbXVsdGljaGFubmVsIGltYWdlXG4gICAqIGlzIGNvbXBvc2l0ZWQgZnJvbSBpdHMgY2hhbm5lbHMgaW4gdGhlaXIgZGlzcGxheSBjb2xvdXJzLCBzbyB0aGUgb3ZlcnZpZXcgbG9va3MgbGlrZVxuICAgKiB0aGUgdmlldyByYXRoZXIgdGhhbiBsaWtlIGNoYW5uZWwgMCBpbiBncmV5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTmF2aWdhdG9ySW1hZ2UoejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0b3I7XG4gICAgaWYgKCFuYXYpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5uYXZpZ2F0b3JUb2tlbjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgICAgY29uc3QgY2hhbm5lbHMgPSBkZXNjPy5tdWx0aWNoYW5uZWwgPyBkZXNjLmNoYW5uZWxJbmZvID8/IFtdIDogW107XG4gICAgICBsZXQgaW1hZ2U6IENhbnZhc0ltYWdlU291cmNlO1xuICAgICAgaWYgKGNoYW5uZWxzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgYml0bWFwcyA9IGF3YWl0IFByb21pc2UuYWxsKGNoYW5uZWxzLm1hcCgoX2MsIGMpID0+IHRoaXMuZmV0Y2hTbGljZSh6LCBjLCAxKSkpO1xuICAgICAgICBpbWFnZSA9IHRpbnRlZENvbXBvc2l0ZShiaXRtYXBzLCBjaGFubmVscy5tYXAoKGMpID0+IGMuY29sb3IgPz8gJyNmZmZmZmYnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbWFnZSA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB1bmRlZmluZWQsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuID09PSB0aGlzLm5hdmlnYXRvclRva2VuICYmIHRoaXMubmF2aWdhdG9yID09PSBuYXYpIG5hdi5zZXRJbWFnZShpbWFnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIG5hdmlnYXRvciB0aHVtYm5haWwgdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAoc2FtZSBzZXR0aW5nIGFzIE9TRCdzKS4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5uYXZpZ2F0b3JWaXNpYmxlID0gdmlzaWJsZTtcbiAgICB0aGlzLm5hdmlnYXRvcj8uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IGEgbmFwYXJpLWpzIGBIaXN0b2dyYW1gIChiaW4gY291bnQgKyBtaW4vbWF4KSB0byB0aGUgcGFuZSdzIGBJSGlzdG9ncmFtYCAoYmluIGVkZ2VzKS4gKi9cbiAgcHJpdmF0ZSB0b0lIaXN0b2dyYW0oaDogeyBjb3VudHM6IFVpbnQzMkFycmF5OyBiaW5zOiBudW1iZXI7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9KTogSUhpc3RvZ3JhbSB7XG4gICAgY29uc3Qgc3BhbiA9IGgubWF4IC0gaC5taW4gfHwgMTtcbiAgICBjb25zdCBiaW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaC5iaW5zIH0sIChfLCBpKSA9PiBoLm1pbiArIChpICogc3BhbikgLyBoLmJpbnMpO1xuICAgIGNvbnN0IGNvdW50cyA9IEFycmF5LmZyb20oaC5jb3VudHMpO1xuICAgIHJldHVybiB7IGJpbnMsIGNvdW50cywgbWF4OiBjb3VudHMucmVkdWNlKChtLCBjKSA9PiAoYyA+IG0gPyBjIDogbSksIDApIH07XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIDNEIHZvbHVtZS9pc29zdXJmYWNlLiBBIG11bHRpY2hhbm5lbCBpbWFnZSBiZWNvbWVzIG9uZSBhZGRpdGl2ZSwgdGludGVkXG4gICAqIHtAbGluayBWb2x1bWVMYXllcn0gcGVyIGNoYW5uZWwgKHNvIGVhY2ggY2hhbm5lbCdzIGNvbG91ciBjb21wb3NpdGVzIGludG8gdGhlIHJlbmRlcik7IGFcbiAgICogZ3JheXNjYWxlL2NvbXBvc2l0ZSBpbWFnZSB1c2VzIGEgc2luZ2xlIHZvbHVtZS4gQWRkcyB0aGUgYXhlcyBnaXptbyArIGxhYmVscyBhbmQgd2lyZXMgdGhlXG4gICAqIGRpc3BsYXktc3RhdGUgc3Vic2NyaXB0aW9uLiBUaGUgY2FsbGVyIG93bnMgYHZpZXdlci5yZWFkeWAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50Vm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGJlZm9yZSByZW5kZXJpbmcgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzXG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsICh0aWxlZDpmYWxzZSArIGNoYW5uZWxVcmxzKTogbm8gdGlsZSBkZXNjcmlwdG9yLCBzb1xuICAgIC8vIGRlcml2ZSB0aGUgY2hhbm5lbCBjb3VudCBmcm9tIGltYWdlTWV0YSBhbmQgYXNzZW1ibGUgZWFjaCBiYW5kIGZyb20gaXRzIG93blxuICAgIC8vIGNoYW5uZWxVcmxzW3pdW2NdIHBsYW5lIChmZXRjaFNsaWNlIGRvZXMgdGhlIHBlci1jaGFubmVsIHJvdXRpbmcpLlxuICAgIGNvbnN0IHNpbXBsZU1jID0gdGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbmZvKSAmJiAhIWluZm8/LmNoYW5uZWxVcmxzPy5sZW5ndGhcbiAgICAgICYmIChpbmZvPy5pbWFnZU1ldGE/LlswXT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBzaW1wbGVNYyA/IGluZm8hLmltYWdlTWV0YSFbMF0uY2hhbm5lbENvdW50IDogKGRlc2M/LmNoYW5uZWxzID8/IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxKTtcbiAgICBjb25zdCByZXMgPSB2b2x1bWVSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICBjb25zdCByZW5kZXJpbmc6ICdpc28nIHwgJ21pcCcgPSBpc05hcGFyaUlzb3N1cmZhY2UocGxvdFR5cGUpID8gJ2lzbycgOiAnbWlwJztcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG5cbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmNsZWFyKCk7XG4gICAgdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPSBtdWx0aWNoYW5uZWw7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZSc7XG4gICAgY29uc3QgdmlldyA9IG5ldyBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3KHZpZXdlcik7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gdmlldztcblxuICAgIC8vIEFzc2VtYmxlIHBlci1jaGFubmVsIHNjYWxhciB2b2x1bWVzIGZyb20gdGhlIHNlcnZlciB0aWxlcyAoaml0LXNwZWNpZmljKTsgdGhlIG5hcGFyaS1qcyB2aWV3XG4gICAgLy8gb3ducyB0aGUgbGF5ZXIgb3JjaGVzdHJhdGlvbiAob25lIGFkZGl0aXZlIHRpbnRlZCB2b2x1bWUgcGVyIGNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZVxuICAgIC8vIHZvbHVtZSkuIFRoZSBhZGFwdGVyIGNvbXB1dGVzIGVhY2ggY2hhbm5lbCdzIGNvbG9ybWFwIChpbmNsLiBpbnZlcnQvcmV2ZXJzZSBmbGlwcykuXG4gICAgbGV0IGRpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNoYW5uZWxzOiBWb2x1bWVDaGFubmVsW10gPSBbXTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgICBjb25zdCB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHJlcywgYyk7XG4gICAgICAgICAgaWYgKCF2b2wpIGNvbnRpbnVlO1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoYywgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuY2hhbm5lbFRpbnRDb2xvcm1hcChjb2xvciksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCByZXMpO1xuICAgICAgICBpZiAodm9sKSB7XG4gICAgICAgICAgZGltcyA9IHZvbDtcbiAgICAgICAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCB2b2wuZGF0YSk7XG4gICAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbMF07XG4gICAgICAgICAgY2hhbm5lbHMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiB2b2wuZGF0YSxcbiAgICAgICAgICAgIHdpZHRoOiB2b2wud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZvbC5oZWlnaHQsXG4gICAgICAgICAgICBkZXB0aDogdm9sLmRlcHRoLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cblxuICAgIGlmICghZGltcyB8fCAhY2hhbm5lbHMubGVuZ3RoIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlclxuXG4gICAgLy8gUmVzb2x1dGlvbi1pbnZhcmlhbnQgd29ybGQgYm94LiBTaXppbmcgdGhlIGJveCBieSB0aGUgc2FtcGxlZCB2b3hlbCBjb3VudHMgbWFkZSBoaWdoZXJcbiAgICAvLyBpbi1wbGFuZSByZXNvbHV0aW9uIGdyb3cgWC9ZIHdoaWxlIHRoZSBkZXB0aCBzdGF5ZWQgdGhlIChjb25zdGFudCkgc2xpY2UgY291bnQg4oCUIHNvIFogYXBwZWFyZWRcbiAgICAvLyB0byBzaHJpbmsgYXQgaGlnaGVyIHJlc29sdXRpb24uIEluc3RlYWQgYW5jaG9yIHRoZSBpbi1wbGFuZSBsb25nIHNpZGUgdG8gYSBmaXhlZCByZWZlcmVuY2UgYW5kXG4gICAgLy8gbGV0IFogc3BhbiB0aGUgZnVsbCBzbGljZSBjb3VudDsgdGhlIGJveCBzaGFwZSBpcyB0aGVuIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuIFRoZVxuICAgIC8vIHBlci1heGlzIGB2b3hlbFNpemVgIChuYXBhcmkgYHNjYWxlYCkgbWFwcyB0aGUgc2FtcGxlZCBncmlkIG9udG8gdGhhdCBmaXhlZCB3b3JsZCBib3guXG4gICAgLy8gQSBzdGFjayB0aGF0IGRlY2xhcmVzIGl0cyBwaHlzaWNhbCBzcGFjaW5nIG9uIEFMTCBUSFJFRSBheGVzIGdldHMgaXRzIHRydWVcbiAgICAvLyBleHRlbnQgYXMgdGhlIHdvcmxkIGJveCDigJQgdGhlIG9ubHkgd2F5IGFuaXNvdHJvcHkgc3Vydml2ZXMsIGFuZCB3aGF0IG1ha2VzIGFcbiAgICAvLyByZXNhbXBsZWQgNDAgeCA0MCB4IDIwMCDCtW0gdm9sdW1lIHJlYWQgYXMgYSBicmFpbiBpbnN0ZWFkIG9mIGEgY3ViZS1hc3BlY3RcbiAgICAvLyBicmljay4gSXQgbmVlZHMgbm9uZSBvZiB0aGUgcmVmZXJlbmNlLWJveCBhcml0aG1ldGljOiBhIHBoeXNpY2FsIGJveCBpc1xuICAgIC8vIGFscmVhZHkgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY2ltYXRlIGZhY3Rvci5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBrZWVwcyB0aGF0IGFyaXRobWV0aWMuIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsXG4gICAgLy8gY291bnRzIG1hZGUgaGlnaGVyIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGVcbiAgICAvLyAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi5cbiAgICAvLyBBbmNob3JpbmcgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmQgbGV0dGluZyBaIHNwYW4gdGhlXG4gICAgLy8gZnVsbCBzbGljZSBjb3VudCBtYWtlcyB0aGUgYm94IHNoYXBlIGlkZW50aWNhbCBhdCBldmVyeSBkZWNpbWF0ZSBmYWN0b3IuXG4gICAgY29uc3QgbWV0YSA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF07XG4gICAgY29uc3QgbXBwWFlaOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsID1cbiAgICAgIG1ldGE/Lm1wcFggJiYgbWV0YT8ubXBwWSAmJiBtZXRhPy5tcHBaID8gW21ldGEubXBwWCwgbWV0YS5tcHBZLCBtZXRhLm1wcFpdIDogbnVsbDtcbiAgICAvLyBUaGUgaW1hZ2UncyBERUNMQVJFRCBwaXhlbCBkaW1lbnNpb25zLCB3aGljaCBpcyB3aGF0IG1wcCBpcyBwZXI6IHRoZSBzYW1wbGVkXG4gICAgLy8gZGltcyBhcmUgZGVjaW1hdGVkLCBzbyBzaXppbmcgYSBwaHlzaWNhbCBib3ggYnkgdGhlbSB3b3VsZCBtYWtlIHRoZSB3b3JsZFxuICAgIC8vIGJveCBkZXBlbmQgb24gdGhlIHJlc29sdXRpb24gdGhlIHVzZXIgaGFwcGVucyB0byBiZSB2aWV3aW5nIGF0LlxuICAgIGNvbnN0IGZ1bGxXID0gdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyBtZXRhPy54ID8/IGRpbXMud2lkdGg7XG4gICAgY29uc3QgZnVsbEggPSB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXMuaGVpZ2h0O1xuICAgIGNvbnN0IGZ1bGxEID0gbWV0YT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCBkaW1zLmRlcHRoO1xuICAgIGxldCB3b3JsZDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9O1xuICAgIGlmIChtcHBYWVopIHtcbiAgICAgIHdvcmxkID0ge1xuICAgICAgICB3aWR0aDogZnVsbFcgKiBtcHBYWVpbMF0sXG4gICAgICAgIGhlaWdodDogZnVsbEggKiBtcHBYWVpbMV0sXG4gICAgICAgIGRlcHRoOiBmdWxsRCAqIG1wcFhZWlsyXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZ1bGxMb25nID0gTWF0aC5tYXgoMSwgZnVsbFcsIGZ1bGxIKTtcbiAgICAgIHdvcmxkID0ge1xuICAgICAgICB3aWR0aDogKGZ1bGxXICogVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGKSAvIGZ1bGxMb25nLFxuICAgICAgICBoZWlnaHQ6IChmdWxsSCAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgICAgZGVwdGg6IGZ1bGxELFxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gQmFzZSBib3ggKFotc2NhbGUgPSAxKSArIHRoZSBzYW1wbGVkIGRlcHRoIGRyaXZlIHRoZSBsaXZlIFotaGVpZ2h0IGhhbmRsZSBiZWxvdzsgdGhlIHBlcnNpc3RlZFxuICAgIC8vIGB2b2x1bWVaU2NhbGVgICh1c2VyIGRyYWcpIGFwcGxpZXMgb24gdG9wIHNvIGNoYW5naW5nIHJlc29sdXRpb24ga2VlcHMgdGhlIGNob3NlbiBoZWlnaHQuXG4gICAgdGhpcy52b2x1bWVXb3JsZEJhc2UgPSB3b3JsZDtcbiAgICB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aCA9IE1hdGgubWF4KDEsIGRpbXMuZGVwdGgpO1xuICAgIGNvbnN0IHdvcmxkWiA9IHdvcmxkLmRlcHRoICogdGhpcy52b2x1bWVaU2NhbGU7XG4gICAgY29uc3Qgdm94ZWxTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICB3b3JsZC53aWR0aCAvIGRpbXMud2lkdGgsXG4gICAgICB3b3JsZC5oZWlnaHQgLyBkaW1zLmhlaWdodCxcbiAgICAgIHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBjaCBvZiBjaGFubmVscykgY2gudm94ZWxTaXplID0gdm94ZWxTaXplO1xuXG4gICAgdmlldy5yZW5kZXIodGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPyAnbXVsdGljaGFubmVsJyA6ICdncmF5c2NhbGUnLCBjaGFubmVscywgeyByZW5kZXJpbmcgfSk7XG4gICAgdGhpcy5pbWFnZVcgPSBkaW1zLndpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gZGltcy5oZWlnaHQ7XG4gICAgdGhpcy52b2x1bWVEaW1zID0gZGltcztcblxuICAgIC8vIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vICsgbGFiZWxzLCBzaGFyaW5nIHRoZSB2b2x1bWUncyB3b3JsZCBib3ggc28gdGhlIGdpem1vIHRyYWNrc1xuICAgIC8vIHRoZSByZW5kZXJlZCBwcm9wb3J0aW9ucy4gUGh5c2ljYWwgc2NhbGUgdGV4dCBzdGlsbCBjb21lcyBmcm9tIHRoZSBGVUxMIGltYWdlIGV4dGVudC5cbiAgICB0aGlzLmF4ZXNMYXllciA9IHZpZXdlci5hZGRBeGVzKHdvcmxkLndpZHRoLCB3b3JsZC5oZWlnaHQsIHdvcmxkWiwgeyB2aXNpYmxlOiB0aGlzLmF4ZXNWaXNpYmxlIH0pO1xuICAgIGlmICh0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMuYXhlc0xhYmVscyA9IG5ldyBOYXBhcmlBeGVzTGFiZWxzKFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIHZpZXdlci5jYW1lcmEzZCxcbiAgICAgICAgdGhpcy5idWlsZEF4ZXNMYWJlbHMoeyB3aWR0aDogd29ybGQud2lkdGgsIGhlaWdodDogd29ybGQuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pLFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXhlc0xhYmVscy5zZXRWaXNpYmxlKHRoaXMuYXhlc1Zpc2libGUpO1xuICAgICAgLy8gSW4tdmlldyBkcmFnIGhhbmRsZSBhdCB0aGUgVE9QIEVORCBPRiBUSEUgWiBBWElTICh0aGUgYm94J3MgbWluLVhZIGNvcm5lciwgd2hlcmUgdGhlIGJsdWVcbiAgICAgIC8vIFwiWlwiIGF4aXMgKyBsYWJlbCBsaXZlKSwgc28gaXQgcmVhZHMgYXMgdGhlIFotaGVpZ2h0IGNvbnRyb2wuIEZsb2F0ZWQgYSBsaXR0bGUgcGFzdCB0aGUgYXhpc1xuICAgICAgLy8gdGlwICjDlzEuMTIpIHNvIHRoZSBncmlwIGNsZWFycyB0aGUgXCJaIMK3IOKAplwiIGxhYmVsLiBEcmFnIOKGlSB0byByZXN0cmV0Y2ggWiBsaXZlLlxuICAgICAgdGhpcy56SGFuZGxlID0gbmV3IE5hcGFyaVZvbHVtZVpIYW5kbGUodGhpcy5ob3N0LCB2aWV3ZXIuY2FtZXJhM2QsIHtcbiAgICAgICAgdG9wQW5jaG9yOiAoKSA9PiBbXG4gICAgICAgICAgLXRoaXMudm9sdW1lV29ybGRCYXNlIS53aWR0aCAvIDIsXG4gICAgICAgICAgLXRoaXMudm9sdW1lV29ybGRCYXNlIS5oZWlnaHQgLyAyLFxuICAgICAgICAgICgodGhpcy52b2x1bWVXb3JsZEJhc2UhLmRlcHRoICogdGhpcy52b2x1bWVaU2NhbGUpIC8gMikgKiAxLjEyLFxuICAgICAgICBdLFxuICAgICAgICBnZXRTY2FsZTogKCkgPT4gdGhpcy52b2x1bWVaU2NhbGUsXG4gICAgICAgIHNldFNjYWxlOiAocykgPT4gdGhpcy5zZXRWb2x1bWVaU2NhbGUocyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpYmVWb2x1bWVEaXNwbGF5U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmV0Y2ggdGhlIHZvbHVtZSdzIFogaGVpZ2h0IGxpdmUgKGRyaXZlbiBieSB0aGUgaW4tdmlldyB7QGxpbmsgTmFwYXJpVm9sdW1lWkhhbmRsZX0pLiBPbmx5XG4gICAqIHRoZSBwZXItYXhpcyBgdm94ZWxTaXplYCAvIGF4ZXMgZGVwdGggY2hhbmdlIOKAlCB0aGUgdm94ZWwgdGV4dHVyZXMgYXJlIHVudG91Y2hlZCDigJQgc28gZHJhZ2dpbmcgaXNcbiAgICogc21vb3RoLiBgZmFjdG9yYCBpcyByZWxhdGl2ZSB0byB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyAoMSkuIFBlcnNpc3RzIGFjcm9zcyByZS1tb3VudHNcbiAgICogKHJlc29sdXRpb24gY2hhbmdlcykgc28gdGhlIGNob3NlbiBoZWlnaHQgc3RpY2tzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRWb2x1bWVaU2NhbGUoZmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZvbHVtZVpTY2FsZSA9IE1hdGgubWluKDEwLCBNYXRoLm1heCgwLjEsIGZhY3RvcikpO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLnZvbHVtZVdvcmxkQmFzZTtcbiAgICBpZiAoIWJhc2UgfHwgIXRoaXMudm9sdW1lVmlldykgcmV0dXJuO1xuICAgIGNvbnN0IHdvcmxkWiA9IGJhc2UuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCB2c1ogPSB3b3JsZFogLyB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aDtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMudm9sdW1lVmlldy5sYXllcnMpIHtcbiAgICAgIGNvbnN0IFtzeCwgc3ldID0gbGF5ZXIudm94ZWxTaXplO1xuICAgICAgbGF5ZXIudm94ZWxTaXplID0gW3N4LCBzeSwgdnNaXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXhlc0xheWVyKSB0aGlzLmF4ZXNMYXllci5kZXB0aCA9IHdvcmxkWjtcbiAgICB0aGlzLmF4ZXNMYWJlbHM/LnVwZGF0ZUFuY2hvcnMoXG4gICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiBiYXNlLndpZHRoLCBoZWlnaHQ6IGJhc2UuaGVpZ2h0LCBkZXB0aDogd29ybGRaIH0pLFxuICAgICk7XG4gICAgdGhpcy56SGFuZGxlPy5yZXBvc2l0aW9uKCk7XG4gICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgWC9ZL1ogYXhpcy1lbmQgbGFiZWwgc3BlY3MgZm9yIHRoZSAzRCBnaXptby4gQW5jaG9ycyBhcmUgaW4gdGhlIHZvbHVtZSdzIGNlbnRyZWRcbiAgICogIHdvcmxkIGJveCAobWF0Y2hpbmcgdGhlIEF4ZXNMYXllciBnZW9tZXRyeSk7IHRoZSBzY2FsZSB0ZXh0IHJlZmxlY3RzIHRoZSBGVUxMIGltYWdlIGV4dGVudCDigJRcbiAgICogIHBoeXNpY2FsIMK1bSB3aGVuIMK1bS9waXhlbCBpcyBrbm93biwgZWxzZSBwaXhlbCAoWC9ZKSAvIHNsaWNlIChaKSBjb3VudHMuICovXG4gIHByaXZhdGUgYnVpbGRBeGVzTGFiZWxzKFxuICAgIHZvbDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9LFxuICApOiBBeGlzTGFiZWxTcGVjW10ge1xuICAgIGNvbnN0IGh4ID0gdm9sLndpZHRoIC8gMjtcbiAgICBjb25zdCBoeSA9IHZvbC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IGh6ID0gdm9sLmRlcHRoIC8gMjtcbiAgICAvLyBNZWFzdXJlZCBmcm9tIHRoZSBJTUFHRSdzIG93biBleHRlbnQsIG5ldmVyIGZyb20gdGhlIHdvcmxkIGJveDogdGhlIGJveCBpcyBhXG4gICAgLy8gc2hhcGUgKGFuZCBmb3IgYSBwaHlzaWNhbGx5IHNpemVkIHZvbHVtZSBpdCBpcyBhbHJlYWR5IGluIMK1bSwgc28gcmVhZGluZyBhXG4gICAgLy8gcGl4ZWwgY291bnQgb2ZmIGl0IGFuZCBtdWx0aXBseWluZyBieSBtcHAgd291bGQgc2NhbGUgdGhlIGxhYmVsIHR3aWNlKS5cbiAgICBjb25zdCB7IHB4LCBtcHAgfSA9IHRoaXMuaW1hZ2VFeHRlbnQoKTtcbiAgICBjb25zdCBsZW4gPSAobjogbnVtYmVyLCB1bTogbnVtYmVyKTogc3RyaW5nID0+ICh1bSA+IDAgPyBmb3JtYXRVbShuICogdW0pIDogYCR7bn0gcHhgKTtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihweFswXSwgbXBwWzBdKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKHB4WzFdLCBtcHBbMV0pfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIC8vIFBoeXNpY2FsIHdoZW4gdGhlIHN0YWNrIGRlY2xhcmVzIGl0cyBzbGljZSBzcGFjaW5nIChgbXBwWmApIOKAlCBhIHJlc2FtcGxlZFxuICAgICAgLy8gdm9sdW1lIGtub3dzIGhvdyB0aGljayBpdCBpczsgYSBwbGFpbiB6LXN0YWNrIGNhbiBvbmx5IHNheSBob3cgbWFueSBzbGljZXMuXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKHB4WzJdLCBtcHBbMl0pfWAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSdzIGRlY2xhcmVkIGV4dGVudCBpbiBwaXhlbHMvc2xpY2VzLCBhbmQgaXRzIHBoeXNpY2FsIHNwYWNpbmcgcGVyXG4gICAqIGF4aXMgaW4gwrVtICgwID0gdW5kZWNsYXJlZCwgYW5kIHRoZW4gdGhhdCBheGlzIHJlYWRzIGluIHBpeGVscykuXG4gICAqXG4gICAqIE9uZSBwbGFjZSwgYmVjYXVzZSB0aGUgdm9sdW1lIHdvcmxkIGJveCBhbmQgdGhlIGF4aXMgbGFiZWxzIGhhdmUgdG8gYWdyZWVcbiAgICogYWJvdXQgd2hhdCB0aGUgaW1hZ2UncyByZWFsIGRpbWVuc2lvbnMgYXJlIOKAlCB0aGUgc2FtcGxlZCBncmlkIGlzIGRlY2ltYXRlZCBhbmRcbiAgICogc2F5cyBub3RoaW5nIGFib3V0IGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VFeHRlbnQoKTogeyBweDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtcHA6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9IHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBkaW1zID0gdGhpcy52b2x1bWVEaW1zO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgbWV0YT8ubXBwWCB8fCAwO1xuICAgIHJldHVybiB7XG4gICAgICBweDogW1xuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcz8ud2lkdGggPz8gMSxcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gbWV0YT8ueSA/PyBkaW1zPy5oZWlnaHQgPz8gMSxcbiAgICAgICAgbWV0YT8ueiB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLnVybHM/Lmxlbmd0aCB8fCBkaW1zPy5kZXB0aCB8fCAxLFxuICAgICAgXSxcbiAgICAgIC8vIEEgZGVzY3JpcHRvciB0aGF0IHJlcG9ydHMgb25seSBtcHBYIGlzIHNxdWFyZS1waXhlbCBieSBjb252ZW50aW9uLCB3aGljaCBpc1xuICAgICAgLy8gd2hhdCB0aGUgMkQgc2NhbGUgYmFyIGFscmVhZHkgYXNzdW1lcyBvZiBpdC5cbiAgICAgIG1wcDogW21wcFgsIHRoaXMuZGVzY3JpcHRvcj8ubXBwWSB8fCBtZXRhPy5tcHBZIHx8IG1wcFgsIG1ldGE/Lm1wcFogfHwgMF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBhIGRvd25zYW1wbGVkIHVpbnQ4IHZvbHVtZSAobHVtaW5hbmNlKSBmcm9tIHRoZSBwZXItc2xpY2UgdGlsZSBlbmRwb2ludC4gU2xpY2VzIGFyZVxuICAgKiBmZXRjaGVkIHdpdGggYm91bmRlZCBjb25jdXJyZW5jeSAoa2VlcHMgdGhlIGNvbm5lY3Rpb24gcG9vbCBmdWxsIHdpdGhvdXQgZmxvb2RpbmcgaXQgb24gYSBkZWVwXG4gICAqIHN0YWNrKSBhbmQgcmVhZCBpbnRvIHRoZSB2b2x1bWUgYXMgZWFjaCBhcnJpdmVzLCBkcml2aW5nIHtAbGluayBzdGFja0xvYWRpbmdQcm9ncmVzcyR9IHNvIHRoZVxuICAgKiBob3N0IHNob3dzIGEgZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyIGluc3RlYWQgb2YgYSBiYXJlIHNwaW5uZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFzc2VtYmxlVm9sdW1lKFxuICAgIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQsXG4gICAgb3B0czogeyBtYXhTbGljZT86IG51bWJlcjsgc2xpY2VTdGVwPzogbnVtYmVyIH0gPSB7fSxcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGlmIGEgQ2FuY2VsIC8gbmV3IHBsb3QgYnVtcHMgdGhpcyB3aGlsZSB3ZSBmZXRjaFxuICAgIGNvbnN0IGZ1bGxEZXB0aCA9IGluZm8/LmltYWdlTWV0YT8uWzBdPy56IHx8IGluZm8/LnVybHM/Lmxlbmd0aCB8fCAxO1xuICAgIGlmIChmdWxsRGVwdGggPCAxKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIG5vIHNsaWNlcyB0byBhc3NlbWJsZSBhIHZvbHVtZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKG9wdHMuc2xpY2VTdGVwID8/IDEpKTtcbiAgICBjb25zdCBtYXhTbGljZSA9IG9wdHMubWF4U2xpY2UgPz8gVk9MVU1FX01BWF9TTElDRTtcbiAgICAvLyBTb3VyY2Utc2xpY2UgaW5kaWNlcyBzYW1wbGVkIGludG8gdGhlIHZvbHVtZSAoZXZlcnkgYHN0ZXBgdGggcGxhbmUg4oaSIGxvdy1yZXMgaXMgZmFzdGVyKS5cbiAgICBjb25zdCB6SW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCB6ID0gMDsgeiA8IGZ1bGxEZXB0aDsgeiArPSBzdGVwKSB6SW5kaWNlcy5wdXNoKHopO1xuICAgIGNvbnN0IGRlcHRoID0gekluZGljZXMubGVuZ3RoO1xuXG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggZWFjaCBzbGljZSBhdCBhIHB5cmFtaWQgbGV2ZWwgbWF0Y2hpbmcgYG1heFNsaWNlYCAoYnVkZ2V0IHNjYWxlcyB3aXRoIHRoZSBkZWNpbWF0ZVxuICAgICAgLy8gZmFjdG9yKSwgc28gYSBoaWdoZXIgZmFjdG9yIHB1bGxzIGEgZmluZXIgbGV2ZWwg4oaSIG1vcmUgcmVhbCBpbi1wbGFuZSBkZXRhaWw7IHRoZW4gZG93bnNhbXBsZVxuICAgICAgLy8gdG8gYG1heFNsaWNlYC4gYGNoYW5uZWxgIHNlbGVjdHMgYSBiYW5kIChtdWx0aWNoYW5uZWwgdm9sdW1lKTsgb21pdCBmb3IgdGhlIGdyYXlzY2FsZVxuICAgICAgLy8gY29tcG9zaXRlLiBUaGUgY2FsbGVyIG93bnMgdGhlIHN0YWNrTG9hZGluZyBmbGFnIChtdWx0aWNoYW5uZWwgYXNzZW1ibGVzIGNoYW5uZWxzIGluIHR1cm4pLlxuICAgICAgY29uc3QgYnVkZ2V0ID0gdGhpcy50aWxlQnVkZ2V0Rm9yKG1heFNsaWNlKTtcbiAgICAgIGNvbnN0IGZpcnN0ID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzWzBdLCBjaGFubmVsLCBidWRnZXQpO1xuICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbigxLCBtYXhTbGljZSAvIE1hdGgubWF4KGZpcnN0LndpZHRoLCBmaXJzdC5oZWlnaHQsIDEpKTtcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChmaXJzdC53aWR0aCAqIHNjYWxlKSk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiBkZXB0aCk7XG5cbiAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgICAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICB9XG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IG51bGw7XG4gICAgICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKCduYXBhcmktanMgdm9sdW1lIGFzc2VtYmx5OiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIFJlYWQgb25lIGZldGNoZWQgc2xpY2UgYml0bWFwIGludG8gdGhlIHZvbHVtZSBwbGFuZSBgemAgKGx1bWluYW5jZSkuIFN5bmNocm9ub3VzIGJldHdlZW5cbiAgICAgIC8vIGF3YWl0cywgc28gdGhlIHNoYXJlZCAyRCBjb250ZXh0IGlzIHNhZmUgdG8gcmV1c2UgYWNyb3NzIHRoZSBjb25jdXJyZW50IGZldGNoIHdvcmtlcnMuXG4gICAgICBsZXQgZG9uZSA9IDA7XG4gICAgICBjb25zdCByZWFkU2xpY2UgPSAoejogbnVtYmVyLCBibXA6IEltYWdlQml0bWFwKTogdm9pZCA9PiB7XG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgcmdiYSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcbiAgICAgICAgY29uc3QgYmFzZSA9IHogKiB3aWR0aCAqIGhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgZGF0YVtiYXNlICsgaV0gPVxuICAgICAgICAgICAgKHJnYmFbaSAqIDRdICogMC4yOTkgKyByZ2JhW2kgKiA0ICsgMV0gKiAwLjU4NyArIHJnYmFbaSAqIDQgKyAyXSAqIDAuMTE0KSB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICAgICAgZG9uZSsrO1xuICAgICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KE1hdGgucm91bmQoKGRvbmUgLyBkZXB0aCkgKiAxMDApKTtcbiAgICAgIH07XG5cbiAgICAgIHJlYWRTbGljZSgwLCBmaXJzdCk7XG5cbiAgICAgIC8vIFJlbWFpbmluZyBwbGFuZXMgdmlhIGEgc21hbGwgcG9vbCBvZiB3b3JrZXJzIGRyYWluaW5nIGEgc2hhcmVkIHF1ZXVlLiBFYWNoIHBsYW5lIGBwYFxuICAgICAgLy8gbWFwcyB0byBzb3VyY2Ugc2xpY2UgYHpJbmRpY2VzW3BdYCAoc3Vic2FtcGxlZCBmb3IgbG93LXJlcykuXG4gICAgICBjb25zdCBwZW5kaW5nOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgcCA9IDE7IHAgPCBkZXB0aDsgcCsrKSBwZW5kaW5nLnB1c2gocCk7XG4gICAgICBjb25zdCB3b3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBjb25zdCBwID0gcGVuZGluZy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChwID09PSB1bmRlZmluZWQgfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgcmVhZFNsaWNlKHAsIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6SW5kaWNlc1twXSwgY2hhbm5lbCwgYnVkZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBwb29sU2l6ZSA9IE1hdGgubWluKFZPTFVNRV9GRVRDSF9DT05DVVJSRU5DWSwgTWF0aC5tYXgoMSwgZGVwdGggLSAxKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiBwb29sU2l6ZSB9LCAoKSA9PiB3b3JrZXIoKSkpO1xuXG4gICAgICBpZiAodGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm4gbnVsbDsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXIgYSBwYXJ0aWFsIHZvbHVtZVxuICAgICAgcmV0dXJuIHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TQ0FUVEVSIDJEIHNjYXR0ZXI6IHRoZSBzbGljZSBpbWFnZSB3aXRoIGEgcG9pbnRzIGxheWVyIGF0IGVhY2ggcmVnaW9uJ3NcbiAgICogY2VudHJvaWQgKG5hcGFyaS1qcyBhbmFsb2cgb2YgUGxvdGx5J3MgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIpLiBSZWJ1aWxkcyB0aGUgcG9pbnRzIGxpdmUgYXNcbiAgICogcmVnaW9ucyBjaGFuZ2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2NhdHRlcih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2Uoeik7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICB0aGlzLmluc3RhbGxTY2FsZUJhcigpO1xuICAgIHRoaXMuaW5zdGFsbE5hdmlnYXRvcih6KTtcbiAgICAvLyBUaGlzIG1vZGUgcGxvdHMgUkVHSU9OIGNlbnRyb2lkcywgc28gd2l0aG91dCB0aGUgcmVnaW9uIHRvb2xzIHRoZXJlIGlzIG5vXG4gICAgLy8gd2F5IHRvIHByb2R1Y2UgYSBwb2ludCDigJQgZHJhd2luZyBhIHJlZ2lvbiBub3cgYWRkcyBvbmUgaW1tZWRpYXRlbHkuXG4gICAgdGhpcy5pbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgIHRoaXMucmVidWlsZFNjYXR0ZXJQb2ludHMoKTtcbiAgICB0aGlzLnNjYXR0ZXJSZWdpb25TdWIgPSB0aGlzLnJlZ2lvblN0b3JlXG4gICAgICAuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCkpO1xuICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgMkQgc2NhdHRlcidzIHBvaW50IGxheWVyIGF0IHRoZSBjdXJyZW50IHJlZ2lvbiBjZW50cm9pZHMuICovXG4gIHByaXZhdGUgcmVidWlsZFNjYXR0ZXJQb2ludHMoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLnNjYXR0ZXIyZFBvaW50cykge1xuICAgICAgdi5sYXllcnMucmVtb3ZlKHRoaXMuc2NhdHRlcjJkUG9pbnRzKTtcbiAgICAgIHRoaXMuc2NhdHRlcjJkUG9pbnRzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdGhpcy5yZWdpb25DZW50cm9pZHMoKTtcbiAgICBpZiAoY2VudHJvaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuc2NhdHRlcjJkUG9pbnRzID0gdi5hZGRQb2ludHMoY2VudHJvaWRzLCB7XG4gICAgICBzaXplOiAxMixcbiAgICAgIGZhY2VDb2xvcjogWzEsIDAuODUsIDAuMiwgMV0sXG4gICAgICBib3JkZXJDb2xvcjogWzAsIDAsIDAsIDFdLFxuICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaW9uIGNlbnRyb2lkcyBhcyBmbGF0IGBbeCwgeSwg4oCmXWAgZGF0YSBjb29yZHMgKHJlY3RhbmdsZSAvIHBvbHlnb24gLyBtdWx0aXBvbHlnb24pLiAqL1xuICBwcml2YXRlIHJlZ2lvbkNlbnRyb2lkcygpOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBwb2x5Q2VudHJvaWQgPSAoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10pOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG4gPSB4cy5sZW5ndGg7XG4gICAgICBpZiAobiA9PT0gMCkgcmV0dXJuO1xuICAgICAgbGV0IGN4ID0gMDtcbiAgICAgIGxldCBjeSA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjeCArPSB4c1tpXTtcbiAgICAgICAgY3kgKz0geXNbaV07XG4gICAgICB9XG4gICAgICBvdXQucHVzaChjeCAvIG4sIGN5IC8gbik7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkpIHtcbiAgICAgIGNvbnN0IGIgPSByLmJvdW5kcyBhc1xuICAgICAgICB8IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cbiAgICAgICAgfCB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXSB9XG4gICAgICAgIHwgeyBwb2x5Z29uczogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVtdIH1cbiAgICAgICAgfCBudWxsXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFiKSBjb250aW51ZTtcbiAgICAgIGlmICgnd2lkdGgnIGluIGIgJiYgJ3gnIGluIGIpIHtcbiAgICAgICAgb3V0LnB1c2goYi54ICsgYi53aWR0aCAvIDIsIGIueSArIGIuaGVpZ2h0IC8gMik7XG4gICAgICB9IGVsc2UgaWYgKCd4cG9pbnRzJyBpbiBiKSB7XG4gICAgICAgIHBvbHlDZW50cm9pZChiLnhwb2ludHMsIGIueXBvaW50cyk7XG4gICAgICB9IGVsc2UgaWYgKCdwb2x5Z29ucycgaW4gYikge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgYi5wb2x5Z29ucykgcG9seUNlbnRyb2lkKHAueHBvaW50cywgcC55cG9pbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkob3V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJhY3Rpb24gc3RhY2sgZXZlcnkgMkQgbW9kZSBuZWVkczogdGhlIHJlZ2lvbiBvdmVybGF5IChkcmF3L3NlbGVjdC9lZGl0KSwgdGhlIHBpeGVsXG4gICAqIHRvb2xzIHRoYXQgcmVhZCBiYWNrIGRpc3BsYXllZCBwaXhlbHMgKHdhbmQsIGJydXNoLCB2ZXJ0ZXggZXJhc2VyLCB6b29tLXRvLWJveCwgU0FNL2NlbGxwb3NlKSxcbiAgICogYW5kIGEgY2FtZXJhIGhvb2sgdGhhdCBrZWVwcyB0aGF0IHJlYWRiYWNrIGN1cnJlbnQgYXMgdGhlIHZpZXcgcGFucy96b29tcyBhbmQgdGlsZWQgbGV2ZWxzXG4gICAqIGxvYWQuXG4gICAqXG4gICAqIEV4dHJhY3RlZCBiZWNhdXNlIGZvcmdldHRpbmcgaXQgaXMgaW52aXNpYmxlOiB0aGUgdG9vbGJhciBnYXRlcyBpdHMgcmVnaW9uIGJ1dHRvbnMgb24gMkQtdnMtM0RcbiAgICogcmF0aGVyIHRoYW4gb24gcGxvdCB0eXBlLCBzbyBhIDJEIG1vZGUgdGhhdCBza2lwcyB0aGlzIHNob3dzIGV2ZXJ5IHRvb2wgYW5kIHNpbGVudGx5IGRvZXNcbiAgICogbm90aGluZy4gVGhhdCBpcyBleGFjdGx5IHdoYXQgaGFwcGVuZWQgdG8gdGhlIHNwYXRpYWwgYW5kIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyIG1vZGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCB2aWV3ZXIsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgIHRoaXMuYnVpbGRUb29sSG9zdHMoKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gdmlld2VyLmNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy5hcm1SZWFkYmFjaygpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTcGF0aWFsIG9taWNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBNYXJrZXIgcmFkaXVzIChpbWFnZSBweCkgZm9yIGEgZGF0YXNldCB0aGF0IGRlY2xhcmVzIG5vbmUg4oCUIHNlZ21lbnRlZCBjZWxscyBvZnRlbiBkb24ndC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9GQUxMQkFDS19SQURJVVMgPSA0O1xuICAvKiogU21hbGxlc3QgbWFya2VyIERJQU1FVEVSLCBpbiBzbGljZSBwaXhlbHMsIG92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQuIEEgY2VsbCdzIHJlYWxcbiAgICogIHNpemUgaXMgaG9ub3VyZWQgd2hlcmV2ZXIgaXQgc3Vydml2ZXMgdGhlIGdyaWQ6IHRoZSBBQkMgYXRsYXMgc2VydmVzIDUgwrVtIHJhZGlpIG9uIGFcbiAgICogIDQwIMK1bS9weCB0ZW1wbGF0ZSwgc28gZHJhd2luZyB0aGVtIHRvIHNjYWxlIHdvdWxkIHB1dCBldmVyeSBjZWxsIGEgZmlmdGggb2YgYSBwaXhlbCB3aWRlXG4gICAqICBhbmQgdGhlIHNlY3Rpb24gd291bGQgY29tZSB1cCBlbXB0eS4gVGhlIHBvaW50LXNpemUgY29udHJvbCBzY2FsZXMgdXAgZnJvbSB0aGlzIGZsb29yLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX1NMSUNFX01JTl9ESUFNRVRFUl9QWCA9IDEuNTtcbiAgLyoqIExvbmdlc3Qgc2lkZSBvZiB0aGUgZ2VuZS1tYXAgcmFzdGVyLCBpbiBmaWVsZCBwaXhlbHMuIEEgZ2VuZSBtYXAgaXMgYSBzbW9vdGhcbiAgICogIGZpZWxkIHJlYWQgYXMgdGVycml0b3J5LCBzbyBpdCBnYWlucyBub3RoaW5nIGZyb20gbWF0Y2hpbmcgYSAyIEdweCBzbGlkZSdzXG4gICAqICByZXNvbHV0aW9uIOKAlCBhbmQgdGhlIGVzdGltYXRlIGNvc3RzIG9uZSBwYXNzIG92ZXIgdGhpcyBtYW55IHBpeGVscy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0VORV9NQVBfTUFYX1NJREUgPSA1MTI7XG4gIC8qKiBLZXJuZWwgz4MgaW4gZmllbGQgcGl4ZWxzIGF0IHNtb290aGluZyAxOiB3aWRlIGVub3VnaCB0byByZWFkIGJldHdlZW4gY2VsbHMsXG4gICAqICB0aWdodCBlbm91Z2ggdG8ga2VlcCBhIG51Y2xldXMtc2NhbGUgc3RydWN0dXJlIGRpc3RpbmN0LiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHRU5FX01BUF9TSUdNQSA9IDIuNTtcbiAgLyoqIENsdXN0ZXJzIGRyYXduIGFzIGRlbnNpdHkgdm9sdW1lcyBhdCBvbmNlLiBQYXN0IGEgaGFuZGZ1bCwgYWRkaXRpdmUgdHJhbnNsdWNlbnRcbiAgICogIGNsb3VkcyBzdG9wIGJlaW5nIHNlcGFyYWJsZSBieSBleWUg4oCUIGFuZCBlYWNoIG9uZSBpcyBhIGZ1bGwgcmFzdGVyaXNhdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVOU0lUWV9NQVhfQ0xVU1RFUlMgPSA2O1xuICAvKiogQ29sb3VyIGZvciBvYnNlcnZhdGlvbnMgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkIHRvIGNvbG91ciBieTogdmlzaWJsZSwgbmV1dHJhbCwgYW5kXG4gICAqICBvYnZpb3VzbHkgbm90IGVuY29kaW5nIGFueXRoaW5nLiAqL1xuICAvKiogSG93IG11Y2ggbGFyZ2VyIGEgc2VsZWN0ZWQgbWFya2VyIGlzIGRyYXduLCBzbyBhIHNtYWxsIHNlbGVjdGlvbiBpcyBmaW5kYWJsZSBpbnNpZGUgYVxuICAgKiAgMy43TS1wb2ludCBjbG91ZCByYXRoZXIgdGhhbiBtZXJlbHkgYnJpZ2h0ZXIuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRSA9IDEuNjtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX05FVVRSQUxfQ09MT1I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICBbMC4zNSwgMC43MiwgMC45NSwgMC45XTtcblxuICAvKipcbiAgICogTW91bnQgdGhlIFNQQVRJQUxfT01JQ1MgdmlldzogdGhlIHRpc3N1ZSBpbWFnZSB3aXRoIG9uZSBtYXJrZXIgcGVyIG9ic2VydmF0aW9uLCBjb2xvdXJlZCBieVxuICAgKiBhbiBhbm5vdGF0aW9uIGNvbHVtbiBvciBhIGdlbmUuIFRoZSBtYXJrZXJzIHJlYnVpbGQgd2hlbmV2ZXIgdGhlIGRhdGFzZXQgb3IgdGhlIHZpZXcgc3RhdGVcbiAgICogY2hhbmdlcywgc28gc3dpdGNoaW5nIHRoZSBjb2xvdXItYnkgY29sdW1uIGRvZXMgbm90IHJlbW91bnQgdGhlIHNjZW5lLlxuICAgKlxuICAgKiBTZXRzIHVwIHRoZSBmdWxsIDJEIGludGVyYWN0aW9uIHN0YWNrIOKAlCByZWdpb24gb3ZlcmxheSwgcGl4ZWwtdG9vbCBob3N0cywgcmVhZGJhY2sgY3VycmVuY3kg4oCUXG4gICAqIGV4YWN0bHkgYXMgdGhlIHBsYWluIGltYWdlIHZpZXcgZG9lcy4gVGhhdCBpcyBOT1Qgb3B0aW9uYWwgaGVyZTogdGhpcyBtb2RlJ3Mgc2VsZWN0aW9uIGlzXG4gICAqIGRyaXZlbiBieSBkcmF3biBST0lzLCBzbyB3aXRob3V0IHRoZSBvdmVybGF5IHRoZXJlIGlzIG5vIHdheSB0byBtYWtlIGEgc2VsZWN0aW9uIGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTcGF0aWFsT21pY3Modmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50LCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgIC8vIE9ubHkgZml0IHRvIHRoZSBpbWFnZSB3aGVuIHRoaXMgZGF0YXNldCBhY3R1YWxseSBoYXMgb25lLiBPdGhlcndpc2UgdGhlcmUgaXNcbiAgICAvLyBub3RoaW5nIHRvIGZpdCwgYGltYWdlV2AvYGltYWdlSGAgc3RpbGwgaG9sZCB0aGUgTEFTVCBpbWFnZSdzIGRpbWVuc2lvbnMsIGFuZFxuICAgIC8vIHRoaXMgZml0cyB0byB0aG9zZSDigJQgYW5kIGJlY2F1c2UgaXQgZGVmZXJzIHRvIGEgZnJhbWUsIGl0IGxhbmRzIEFGVEVSIHRoZSBwb2ludHNcbiAgICAvLyBhcmUgYWRkZWQgYW5kIG92ZXJ3cml0ZXMgdGhlIGZyYW1pbmcgdGhleSBzZXQuIFRoYXQgaXMgd2hhdCBsZWZ0IGFuIGltYWdlLWxlc3NcbiAgICAvLyBkYXRhc2V0IGFzIGEgdGVuLXBpeGVsIHNwZWNrIG9mZiB0byBvbmUgc2lkZS5cbiAgICBpZiAodGhpcy5zcGF0aWFsTGF0ZXN0Py5bMF0/LmltYWdlUmVmKSB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgdGhpcy5pbnN0YWxsTmF2aWdhdG9yKHopO1xuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLmluc3RhbGxTcGF0aWFsSG92ZXIoaG9zdCk7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXMoKT8uYXR0YWNoKHZpZXdlcik7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgMkQgb2JzZXJ2YXRpb24gbWFya2VycyBhcmUgZHJhd246IHdoZW4gdGhlIHVzZXIgd2FudHMgdGhlbSwgYW5kIG5vdCB3aGlsZVxuICAgKiBjZWxsIG91dGxpbmVzIGFyZSBvbiBzY3JlZW4g4oCUIHRoZW4gYSBjZWxsIElTIGl0cyBvdXRsaW5lLCBhbmQgYSBjaXJjbGUgb24gdG9wIG9mIGl0IGlzXG4gICAqIG5vaXNlLiBab29tZWQgb3V0IHBhc3QgdGhlIG91dGxpbmUgdGhyZXNob2xkLCB0aGUgY2lyY2xlcyBzdGFuZCBpbiBmb3IgdGhlIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zcGF0aWFsTGF0ZXN0Py5bMV07XG4gICAgcmV0dXJuICh2aWV3Py5zaG93UG9pbnRzID8/IHRydWUpICYmICF0aGlzLnNwYXRpYWxUaWxlc01ncj8ub3V0bGluZXNTaG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGlsZWQtZ2VvbWV0cnkgbWFuYWdlciwgYnVpbHQgb24gZmlyc3QgdXNlLiBJdHMgaG9zdCBjYWxsYmFja3MgcmVhZCB0aGlzXG4gICAqIHNlcnZpY2UncyBsaXZlIHN0YXRlLCBzbyBpdCBuZXZlciBob2xkcyBhIHN0YWxlIGRhdGFzZXQgb3IgY29sb3JtYXAuXG4gICAqL1xuICBwcml2YXRlIHNwYXRpYWxUaWxlcygpOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGwge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGlmICghcG9ydCkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXNNZ3IgPz89IG5ldyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyhwb3J0LCB7XG4gICAgICBsYXRlc3Q6ICgpID0+IHRoaXMuc3BhdGlhbExhdGVzdCxcbiAgICAgIGNhbnZhc1NpemU6ICgpID0+IFt0aGlzLmNhbnZhcz8uY2xpZW50V2lkdGggPz8gMCwgdGhpcy5jYW52YXM/LmNsaWVudEhlaWdodCA/PyAwXSxcbiAgICAgIGNvbnRpbnVvdXNMdXQ6ICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgICAgICByZXR1cm4gc3BhdGlhbENvbnRpbnVvdXNMdXQobm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwKTtcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZUNoYW5nZWQ6IChlKSA9PiB0aGlzLnRyYW5zY3JpcHRFc3RpbWF0ZSQubmV4dChlKSxcbiAgICAgIGdlbmVDb3VudHNDaGFuZ2VkOiAoYykgPT4gdGhpcy5nZW5lQ291bnRzSW5WaWV3JC5uZXh0KGMpLFxuICAgICAgbG9hZGluZ0NoYW5nZWQ6IChsYXllcnMpID0+IHtcbiAgICAgICAgdGhpcy50aWxlTG9hZGluZyA9IGxheWVycztcbiAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgfSxcbiAgICAgIGRlbnNpdHlDaGFuZ2VkOiAoZCkgPT4gdGhpcy5kZW5zaXR5U3RhdHMkLm5leHQoZCksXG4gICAgICBwb2x5Z29uc1Nob3duQ2hhbmdlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB0aGlzLnNwYXRpYWxQb2ludHMudmlzaWJsZSA9IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKTtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFRpbGVzTWdyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBkcmF3aW5nIGZvciB0aGUgM0QgY2xvdWQuXG4gICAqXG4gICAqIFJldXNlcyB7QGxpbmsgTmFwYXJpUmVnaW9uT3ZlcmxheX0gdmVyYmF0aW0gYnkgaGFuZGluZyBpdCBhIFNDUkVFTi1TUEFDRSB2aWV3ZXI6IHRoZSBkcmF3blxuICAgKiBzaGFwZSBpcyBhIGxhc3NvIGluIGNhbnZhcyBwaXhlbHMsIHNvIFwid29ybGRcIiBpcyB0aGUgY2FudmFzIGFuZCBib3RoIHRyYW5zZm9ybXMgYXJlIGlkZW50aXR5XG4gICAqIChiYXIgdGhlIGNsaWVudOKGkmNhbnZhcyBvZmZzZXQpLiBFdmVyeSBleGlzdGluZyB0b29sIOKAlCByZWN0YW5nbGUsIHBvbHlnb24sIGZyZWVoYW5kIOKAlCB0aGVyZWZvcmVcbiAgICogd29ya3MgaW4gM0Qgd2l0aCBubyBuZXcgZHJhd2luZyBjb2RlLlxuICAgKlxuICAgKiBBIHNjcmVlbi1zcGFjZSBzaGFwZSBzdG9wcyBtZWFuaW5nIGFueXRoaW5nIHRoZSBtb21lbnQgdGhlIGNhbWVyYSBtb3Zlcywgc28gYW4gb3JiaXQgY2xlYXJzXG4gICAqIHRoZSBkcmF3biByZWdpb25zLiBUaGUgU0VMRUNUSU9OIGl0IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXMgdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGVcbiAgICogaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbDNkSW50ZXJhY3Rpb24odmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzUmVjdCA9ICgpID0+IHRoaXMuY2FudmFzPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzY3JlZW5TcGFjZTogT3ZlcmxheVZpZXdlciA9IHtcbiAgICAgIGNhbnZhc1RvV29ybGQ6IChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCByID0gY2FudmFzUmVjdCgpO1xuICAgICAgICByZXR1cm4gciA/IFtjbGllbnRYIC0gci5sZWZ0LCBjbGllbnRZIC0gci50b3BdIDogW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgfSxcbiAgICAgIC8vIEFscmVhZHkgY2FudmFzIHBpeGVscy5cbiAgICAgIHdvcmxkVG9DYW52YXM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW3gsIHldLFxuICAgICAgc2V0Q29udHJvbHNFbmFibGVkOiAoZW5hYmxlZDogYm9vbGVhbikgPT4gdmlld2VyLnNldENvbnRyb2xzRW5hYmxlZChlbmFibGVkKSxcbiAgICAgIGNhbWVyYTogdmlld2VyLmNhbWVyYTNkLFxuICAgIH07XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbmV3IE5hcGFyaVJlZ2lvbk92ZXJsYXkoaG9zdCwgc2NyZWVuU3BhY2UsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgIHRoaXMuYnVpbGRUb29sSG9zdHMoKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gdmlld2VyLmNhbWVyYTNkLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB7XG4gICAgICAvLyBPbmx5IHdoaWxlIG5vdGhpbmcgaXMgYmVpbmcgZHJhd24g4oCUIGNsZWFyaW5nIG1pZC1nZXN0dXJlIHdvdWxkIGRlbGV0ZSB0aGVcbiAgICAgIC8vIHNoYXBlIHVuZGVyIHRoZSB1c2VyJ3MgY3Vyc29yLlxuICAgICAgaWYgKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmxlbmd0aCA+IDApIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhbXSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogTW92ZW1lbnQsIGluIHNjcmVlbiBwaXhlbHMsIHVuZGVyIHdoaWNoIGEgcHJlc3MtcmVsZWFzZSBpcyBhIENMSUNLIGFuZCBub3QgYVxuICAgKiAgZHJhZy4gQW4gb3JiaXQgb3IgYSBwYW4gc3RhcnRzIHRoZSBzYW1lIHdheSwgc28gdGhlIHR3byBoYXZlIHRvIGJlIHRvbGRcbiAgICogIGFwYXJ0IGJ5IGhvdyBmYXIgdGhlIHBvaW50ZXIgdHJhdmVsbGVkLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTElDS19TTE9QX1BYID0gNDtcbiAgLyoqIExvbmdlc3QgcHJlc3MtcmVsZWFzZSBzdGlsbCB0cmVhdGVkIGFzIGEgY2xpY2suIEEgbG9uZyBwcmVzcyB3aXRoIHRoZSBtb3VzZVxuICAgKiAgaGVsZCBzdGlsbCBpcyBtb3JlIGxpa2VseSBhbiBpbnRlcnJ1cHRlZCBkcmFnIHRoYW4gYSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMSUNLX01BWF9NUyA9IDYwMDtcbiAgLyoqIFBvaW50ZXIgZGlzdGFuY2UsIGluIHNjcmVlbiBwaXhlbHMsIHRoYXQgc3RpbGwgY291bnRzIGFzIFwib25cIiBhIG1hcmtlci5cbiAgICogIEdlbmVyb3VzIHJlbGF0aXZlIHRvIGEgMS41cHggZGlzYzogdGhlIGN1cnNvciBpcyBhIGJsdW50IGluc3RydW1lbnQsIGFuZCBhXG4gICAqICB0b29sdGlwIHlvdSBoYXZlIHRvIGh1bnQgZm9yIGlzIHdvcnNlIHRoYW4gbm9uZS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSE9WRVJfUkFESVVTX1BYID0gMTA7XG5cbiAgLyoqXG4gICAqIEN1cnNvciB0b29sdGlwIGZvciB0aGUgc3BhdGlhbCB2aWV3czogaG92ZXIgYSBtYXJrZXIsIHJlYWQgaXRzIGNsYXNzLlxuICAgKlxuICAgKiBBIDM0LWVudHJ5IGxlZ2VuZCBjYW5ub3QgYmUgcmVhZCBiYWNrIGZyb20gYSBkb3Qg4oCUIHNldmVyYWwgY2xhc3NlcyBnZXRcbiAgICogc2ltaWxhciBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgb25lIHRvIGEgc3dhdGNoIGJ5IGV5ZSBpcyBleGFjdGx5IHRoZSB0YXNrIHRoaXNcbiAgICogcmVtb3Zlcy4gSXQgcmVwb3J0cyB3aGF0ZXZlciB0aGUgY2xvdWQgaXMgQ1VSUkVOVExZIGNvbG91cmVkIGJ5LCBzbyBpdCBhbmRcbiAgICogdGhlIGxlZ2VuZCBjYW4gbmV2ZXIgc2F5IGRpZmZlcmVudCB0aGluZ3MuXG4gICAqXG4gICAqIExpc3RlbnMgb24gdGhlIEhPU1QgcmF0aGVyIHRoYW4gdGhlIGNhbnZhcyBzbyBpdCBrZWVwcyB3b3JraW5nIG92ZXIgdGhlIHJlZ2lvblxuICAgKiBvdmVybGF5IChhbiBTVkcgY292ZXJpbmcgdGhlIGNhbnZhcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cgZXZlcnlcbiAgICogbW92ZSksIGFuZCB0aHJvdHRsZXMgdG8gb25lIGhpdC10ZXN0IHBlciBhbmltYXRpb24gZnJhbWU6IGEgcG9pbnRlcm1vdmUgY2FuXG4gICAqIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LCBhbmQgZWFjaCB0ZXN0IGlzIGEgcGFzcyBvdmVyIHRoZSBjbG91ZC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlU3BhdGlhbEhvdmVyKCk7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcCA9IG5ldyBOYXBhcmlTcGF0aWFsVG9vbHRpcChob3N0KTtcblxuICAgIGNvbnN0IG9uTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgICAgaWYgKCFjYW52YXMpIHJldHVybjtcbiAgICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmhvdmVyUG9pbnRlciA9IHtcbiAgICAgICAgeDogZS5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICB5OiBlLmNsaWVudFkgLSByZWN0LnRvcCxcbiAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuaG92ZXJGcmFtZSkgcmV0dXJuO1xuICAgICAgdGhpcy5ob3ZlckZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICAgICAgdGhpcy51cGRhdGVIb3Zlcihob3N0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25MZWF2ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuaG92ZXJQb2ludGVyID0gbnVsbDtcbiAgICAgIHRoaXMuc3BhdGlhbFRvb2x0aXA/LmhpZGUoKTtcbiAgICB9O1xuXG4gICAgLy8gQSBjbGljayBvbiBhIG1hcmtlciBzZWxlY3RzIGl0cyBjbGFzcywgZXhhY3RseSBhcyBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZVxuICAgIC8vIHBhbmVsJ3MgbGVnZW5kIGRvZXMg4oCUIGluY2x1ZGluZyBjbGlja2luZyBhZ2FpbiB0byBjbGVhciwgc28gYSBjbGljayBpc1xuICAgIC8vIGFsd2F5cyByZXZlcnNpYmxlLiBUcmFja2VkIGFzIGRvd24vdXAgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGNsaWNrYCBzbyBhIERSQUdcbiAgICAvLyAoYW4gb3JiaXQgaW4gM0QsIGEgcGFuIGluIDJEKSBjYW4gYmUgdG9sZCBhcGFydCBmcm9tIGEgY2xpY2s6IHRoZSBnZXN0dXJlXG4gICAgLy8gaGFzIHRvIG1vdmUgbGVzcyB0aGFuIGEgZmV3IHBpeGVscyBhbmQgYmUgb3ZlciBxdWlja2x5LlxuICAgIGxldCBkb3duOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IG9uRG93biA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBkb3duID0geyB4OiBlLmNsaWVudFgsIHk6IGUuY2xpZW50WSwgdDogRGF0ZS5ub3coKSB9O1xuICAgIH07XG4gICAgY29uc3Qgb25VcCA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IGRvd247XG4gICAgICBkb3duID0gbnVsbDtcbiAgICAgIGlmICghc3RhcnQpIHJldHVybjtcbiAgICAgIGNvbnN0IG1vdmVkID0gTWF0aC5oeXBvdChlLmNsaWVudFggLSBzdGFydC54LCBlLmNsaWVudFkgLSBzdGFydC55KTtcbiAgICAgIGlmIChtb3ZlZCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX1NMT1BfUFgpIHJldHVybjtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQudCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX01BWF9NUykgcmV0dXJuO1xuICAgICAgLy8gQSByZWdpb24gdG9vbCBvd25zIHRoZSBwb2ludGVyIHdoaWxlIGl0IGlzIGFjdGl2ZSwgYW5kIHBsYWNpbmcgYSBwb2x5Z29uXG4gICAgICAvLyB2ZXJ0ZXggaXMgYWxzbyBhIGNsaWNrIHRoYXQgZG9lcyBub3QgbW92ZS5cbiAgICAgIGlmICh0aGlzLnJlZ2lvbk92ZXJsYXk/LnRvb2xBY3RpdmUpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0Q2xhc3NBdChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgfTtcblxuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvbk1vdmUpO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bik7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSkpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uTGVhdmUpKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bikpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApKTtcblxuICAgIC8vIEluIDNEIHRoZSBjYWNoZWQgcG9zaXRpb25zIGFyZSBzY3JlZW4gcGl4ZWxzLCBzbyBhbiBvcmJpdCBpbnZhbGlkYXRlcyB0aGVtLlxuICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMudmlld2VyPy5jYW1lcmEzZDtcbiAgICBpZiAoY2FtZXJhICYmIGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSB7XG4gICAgICBjb25zdCBvZmYgPSBjYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3Zlck9mZi5wdXNoKG9mZik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGF0aWFsSG92ZXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvZmYgb2YgdGhpcy5ob3Zlck9mZikgb2ZmKCk7XG4gICAgdGhpcy5ob3Zlck9mZiA9IFtdO1xuICAgIGlmICh0aGlzLmhvdmVyRnJhbWUpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaG92ZXJGcmFtZSk7XG4gICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICB0aGlzLmhvdmVyUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcD8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BhdGlhbFRvb2x0aXAgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSAtMTtcbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICB9XG5cbiAgLyoqIEhpdC10ZXN0IHRoZSBsYXN0IHBvaW50ZXIgcG9zaXRpb24gYW5kIHNob3cgb3IgaGlkZSB0aGUgdG9vbHRpcC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRpcCA9IHRoaXMuc3BhdGlhbFRvb2x0aXA7XG4gICAgY29uc3QgcG9pbnRlciA9IHRoaXMuaG92ZXJQb2ludGVyO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIXRpcCB8fCAhcG9pbnRlciB8fCAhZGF0YXNldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIC8vIFRyYW5zY3JpcHQgbWFya2VycyBzaXQgb24gdG9wIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZXkgYXJlIGFza2VkIGZpcnN0LlxuICAgIGlmICghaXMzZCAmJiB0aGlzLnNwYXRpYWxUaWxlc01nciAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZKTtcbiAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTtcbiAgICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gd29ybGQgPyB0aGlzLnNwYXRpYWxUaWxlc01nci5ob3ZlckF0KHdvcmxkWzBdLCB3b3JsZFsxXSwgcmFkaXVzLCAoZGV0YWlscykgPT4ge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5ob3ZlclBvaW50ZXI7XG4gICAgICAgIGlmICghcCB8fCAhdGhpcy5zcGF0aWFsVG9vbHRpcCkgcmV0dXJuO1xuICAgICAgICBjb25zdCByID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsVG9vbHRpcC5zaG93KGRldGFpbHMsIHAuY2xpZW50WCAtIHIubGVmdCwgcC5jbGllbnRZIC0gci50b3ApO1xuICAgICAgfSkgOiBudWxsO1xuICAgICAgaWYgKGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmhvdmVyUG9zaXRpb25zRm9yKGRhdGFzZXQub2JzZXJ2YXRpb25zKTtcbiAgICBpZiAoIXBvc2l0aW9ucykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gM0QgY29tcGFyZXMgc2NyZWVuIHBpeGVscyBkaXJlY3RseTsgMkQgaG9sZHMgd29ybGQgcG9zaXRpb25zLCBzbyB0aGUgcmFkaXVzXG4gICAgLy8gaXMgY29udmVydGVkIG9uY2UgaW5zdGVhZCBvZiBwcm9qZWN0aW5nIHRoZSB3aG9sZSBjbG91ZC5cbiAgICBjb25zdCB6b29tID0gaXMzZCA/IDEgOiAodGhpcy52aWV3ZXI/LmNhbWVyYS56b29tID8/IDEpO1xuICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICBsZXQgeCA9IHBvaW50ZXIueDtcbiAgICBsZXQgeSA9IHBvaW50ZXIueTtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQocG9pbnRlci5jbGllbnRYLCBwb2ludGVyLmNsaWVudFkpO1xuICAgICAgaWYgKCF3b3JsZCkge1xuICAgICAgICB0aXAuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSB0aGlzLnBpY2tPYnNlcnZhdGlvbihwb3NpdGlvbnMsIHgsIHksIHJhZGl1cywgaXMzZCk7XG4gICAgY29uc3QgbGluZXMgPSBob3ZlclRleHQodGhpcy5ob3ZlclNvdXJjZSwgaGl0KTtcbiAgICBpZiAoIWxpbmVzKSB7XG4gICAgICB0aXAuaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBjbGFzcyBvZiB0aGUgbWFya2VyIGF0IGEgY2xpZW50IHBvc2l0aW9uIOKAlCB0aGUgY2FudmFzIGVxdWl2YWxlbnQgb2ZcbiAgICogY2xpY2tpbmcgdGhhdCBjbGFzcyBpbiB0aGUgcGFuZWwncyBsZWdlbmQsIGFuZCB0aGUgc2FtZSBzZWxlY3Rpb24gb2JqZWN0LCBzb1xuICAgKiB0aGUgdHdvIGNvbnRyb2xzIGNhbm5vdCBwcm9kdWNlIGRpZmZlcmVudCByZXN1bHRzLlxuICAgKlxuICAgKiBDbGlja2luZyBhIGNsYXNzIHRoYXQgaXMgYWxyZWFkeSB0aGUgd2hvbGUgc2VsZWN0aW9uIENMRUFSUyBpdCwgd2hpY2ggaXMgd2hhdFxuICAgKiB0aGUgbGVnZW5kIGRvZXMuIENvbXBhcmVkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiBpdHNlbGYgcmF0aGVyIHRoYW4gYWdhaW5zdCBhXG4gICAqIHJlbWVtYmVyZWQgY2xpY2ssIHNvIHNlbGVjdGluZyBmcm9tIHRoZSBsZWdlbmQgYW5kIHRoZW4gY2xpY2tpbmcgdGhlIHNhbWVcbiAgICogY2xhc3Mgb24gdGhlIGNhbnZhcyBzdGlsbCB0b2dnbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3RDbGFzc0F0KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5ob3ZlclNvdXJjZTtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc2VsZWN0aW9uU3RvcmU7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIC8vIE9ubHkgYSBjYXRlZ29yaWNhbCBzb3VyY2UgaGFzIGNsYXNzZXMgdG8gc2VsZWN0LiBBIGdlbmUgaXMgY29udGludW91czpcbiAgICAvLyB0aGVyZSBpcyBubyBzZXQgb2YgY2VsbHMgdGhhdCBcImlzXCIgYSB2YWx1ZS5cbiAgICBpZiAoIXN0b3JlIHx8ICFkYXRhc2V0IHx8IHNvdXJjZT8ua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5ob3ZlclBvc2l0aW9uc0ZvcihkYXRhc2V0Lm9ic2VydmF0aW9ucyk7XG4gICAgaWYgKCFwb3NpdGlvbnMpIHJldHVybjtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IHpvb20gPSBpczNkID8gMSA6ICh0aGlzLnZpZXdlcj8uY2FtZXJhLnpvb20gPz8gMSk7XG4gICAgY29uc3QgcmFkaXVzID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYIC8gKHpvb20gPiAwID8gem9vbSA6IDEpO1xuICAgIGxldCB4ID0gY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBsZXQgeSA9IGNsaWVudFkgLSByZWN0LnRvcDtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBpZiAoIXdvcmxkKSByZXR1cm47XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIGlmIChoaXQgPCAwKSByZXR1cm47XG4gICAgY29uc3QgY29kZSA9IHNvdXJjZS5jb2Rlc1toaXRdO1xuICAgIC8vIEEgY2VsbCB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBjb3ZlciBoYXMgbm8gY2xhc3MgdG8gc2VsZWN0LlxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQgfHwgY29kZSA9PT0gTk9fQ0FURUdPUlkpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHQgPSBzZWxlY3RCeUNhdGVnb3J5KHNvdXJjZS5jb2RlcywgY29kZSk7XG4gICAgY29uc3QgY3VycmVudCA9IHN0b3JlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2FtZVNlbGVjdGlvbihjdXJyZW50LCBuZXh0KSkge1xuICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RvcmUuc2V0KG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9ic2VydmF0aW9uIGlzIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqXG4gICAqIEluIDNEIHRoaXMgZGVmZXJzIHRvIG5hcGFyaS1qcydzIHtAbGluayBuZWFyZXN0UHJvamVjdGVkSW5kZXh9IFdJVEggdGhlIGRlcHRocyB0aGVcbiAgICogcHJvamVjdGlvbiBwcm9kdWNlZCwgc28gdGhlIGZyb250LW1vc3QgY2FuZGlkYXRlIHdpbnMuIFRoYXQgbWF0dGVycyBtb3JlIHRoYW4gaXRcbiAgICogc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhXG4gICAqIGNlbGwgdGhhdCBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLCB3aGljaCByZWFkcyBhcyBhIHdyb25nIHRvb2x0aXAgcmF0aGVyIHRoYW4gYXNcbiAgICogYSBzdWJ0bGV0eSBvZiBwaWNraW5nLlxuICAgKlxuICAgKiBJbiAyRCB0aGUgcG9zaXRpb25zIGFyZSBXT1JMRCBjb29yZGluYXRlcyBvbiBvbmUgcGxhbmUsIHNvIHRoZXJlIGlzIG5vIGRlcHRoIHRvIGJyZWFrXG4gICAqIHRpZXMgd2l0aCBhbmQgdGhlIGV4aXN0aW5nIG5lYXJlc3QtbWFya2VyIHJ1bGUgaXMgdGhlIHJpZ2h0IG9uZS5cbiAgICovXG4gIHByaXZhdGUgcGlja09ic2VydmF0aW9uKFxuICAgIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgaXMzZDogYm9vbGVhbixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIWlzM2QpIHJldHVybiBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIC8vIFRoZSBjbG91ZCBkcmF3cyBhIHNlbGVjdGVkIG1hcmtlciBMQVJHRVIsIHNvIHRoZSBwaWNrIGhhcyB0byB1c2UgdGhlIHNhbWUgcmFkaXVzIHRoZVxuICAgIC8vIHJlbmRlcmVyIHVzZWQg4oCUIG90aGVyd2lzZSB0aGUgaGlnaGxpZ2h0ZWQgY2VsbHMsIHRoZSBvbmVzIGEgcmVhZGVyIGlzIG1vc3QgbGlrZWx5IHRvXG4gICAgLy8gYmUgcG9pbnRpbmcgYXQsIGFyZSB0aGUgaGFyZGVzdCB0byBob3Zlci5cbiAgICBjb25zdCBzY2FsZSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRTtcbiAgICBjb25zdCBtYXNrID0gdGhpcy5zZWxlY3Rpb25TdG9yZT8uY3VycmVudCgpPy5tYXNrO1xuICAgIGNvbnN0IG9wdHMgPSBtYXNrPy5sZW5ndGhcbiAgICAgID8geyByYWRpdXNBdDogKGk6IG51bWJlcikgPT4gKG1hc2tbaV0gPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cykgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgLy8gYHJhZGl1c2Agc3RpbGwgYm91bmRzIHdoaWNoIGJ1Y2tldHMgYXJlIHZpc2l0ZWQsIHNvIGl0IGhhcyB0byBiZSB0aGUgTEFSR0VTVCBhbnlcbiAgICAvLyBwb2ludCBjYW4gY2xhaW0sIG5vdCB0aGUgYmFzZSBvbmUuXG4gICAgY29uc3QgcmVhY2ggPSBtYXNrPy5sZW5ndGggPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cztcbiAgICBpZiAodGhpcy5ob3ZlckluZGV4KSByZXR1cm4gdGhpcy5ob3ZlckluZGV4LnBpY2soeCwgeSwgcmVhY2gsIG9wdHMpO1xuICAgIHJldHVybiBuZWFyZXN0UHJvamVjdGVkSW5kZXgocG9zaXRpb25zLCB4LCB5LCByZWFjaCwgdGhpcy5zcGF0aWFsRGVwdGhzM2QsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ucyB0byBoaXQtdGVzdCBhZ2FpbnN0LCByZWJ1aWx0IG9ubHkgd2hlbiB0aGUgc2NlbmUgb3IgY2FtZXJhIG1vdmVkLlxuICAgKlxuICAgKiBBIHBhc3Mgb3ZlciAzLjdNIG9ic2VydmF0aW9ucyBpcyBub3Qgc29tZXRoaW5nIHRvIGRvIHBlciBwb2ludGVybW92ZSwgYW5kIHRoZVxuICAgKiBjbG91ZCBkb2VzIG5vdCBtb3ZlIGJldHdlZW4gZnJhbWVzIHVubGVzcyBzb21ldGhpbmcgc2F5cyBpdCBkaWQuXG4gICAqL1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zRm9yKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhvdmVyUG9zaXRpb25zICYmIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPT09IHRoaXMuc3BhdGlhbFNjZW5lUmV2KSB7XG4gICAgICByZXR1cm4gdGhpcy5ob3ZlclBvc2l0aW9ucztcbiAgICB9XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IGJ1aWx0ID0gaXMzZFxuICAgICAgPyB0aGlzLmdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9icylcbiAgICAgIDogdGhpcy5ob3ZlcldvcmxkUG9zaXRpb25zKG9icyk7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9ucyA9IGJ1aWx0O1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSB0aGlzLnNwYXRpYWxTY2VuZVJldjtcbiAgICAvLyBCdWlsdCBoZXJlLCBpbiB0aGUgc2FtZSBsYXp5IHNsb3QsIHNvIGl0IGlzIHBhaWQgZm9yIG9uIHRoZSBmaXJzdCBob3ZlciBhZnRlciB0aGVcbiAgICAvLyBzY2VuZSBtb3ZlZCBhbmQgbm90IG9uIGV2ZXJ5IGZyYW1lIG9mIGFuIG9yYml0LiBPbmx5IHdvcnRoIGl0IHBhc3QgdGhlIHBvaW50IHdoZXJlXG4gICAgLy8gdGhlIGxpbmVhciBzY2FuIHN0b3BzIGJlaW5nIGZyZWU7IGJlbG93IHRoYXQgdGhlIGJ1aWxkIGNvc3RzIG1vcmUgdGhhbiBpdCBzYXZlcy5cbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICAgIGlmIChpczNkICYmIGJ1aWx0ICYmIHRoaXMuY2FudmFzICYmIGJ1aWx0Lmxlbmd0aCAvIDIgPj0gU0NSRUVOX0lOREVYX01JTl9QT0lOVFMpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgIGNvbnN0IGggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgICAgaWYgKHcgJiYgaCkge1xuICAgICAgICB0aGlzLmhvdmVySW5kZXggPSBuZXcgU2NyZWVuSW5kZXgoXG4gICAgICAgICAgeyBzY3JlZW46IGJ1aWx0LCBkZXB0aDogdGhpcy5zcGF0aWFsRGVwdGhzM2QgPz8gbmV3IEZsb2F0MzJBcnJheShidWlsdC5sZW5ndGggLyAyKSB9LFxuICAgICAgICAgIHcsXG4gICAgICAgICAgaCxcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYW55IHBpY2sgaGVyZSBjYW4gY2xhaW06IHRoZSBiYXNlIGhvdmVyIHJhZGl1cywgdGltZXMgdGhlXG4gICAgICAgICAgLy8gc2NhbGUgYSBTRUxFQ1RFRCBtYXJrZXIgaXMgZHJhd24gYXQuIFN0YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIHRoZSBkZWZhdWx0LFxuICAgICAgICAgIC8vIGJlY2F1c2UgaXQgaXMgd2hhdCBkZWNpZGVzIHdoZXRoZXIgYSBtYXJrZXIgc3RyYWRkbGluZyB0aGUgY2FudmFzIGVkZ2UgaXNcbiAgICAgICAgICAvLyBmb3VuZCDigJQgaXRzIGNlbnRyZSBpcyBvZmYgc2NyZWVuIHdoaWxlIHBhcnQgb2YgaXQgaXMgbm90LlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heFJlYWNoOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5IT1ZFUl9SQURJVVNfUFhcbiAgICAgICAgICAgICAgKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAyRCBtYXJrZXJzJyBXT1JMRCBwb3NpdGlvbnMsIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIE5hTiBmb3IgYW55IG5vdCBvblxuICAgKiB0aGUgZGlzcGxheWVkIHBsYW5lIOKAlCB0aGUgc2FtZSBhZmZpbmUgYW5kIHRoZSBzYW1lIHN1YnNldCB0aGUgbWFya2VyIGxheWVyIHdhc1xuICAgKiBidWlsdCBmcm9tLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgcG9pbnQgYXQgYSBjZWxsIHRoYXQgaXMgbm90IGRyYXduLlxuICAgKi9cbiAgcHJpdmF0ZSBob3ZlcldvcmxkUG9zaXRpb25zKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIWRhdGFzZXQgfHwgb2JzLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbGFiID0gdGhpcy5zcGF0aWFsU2xhYihkYXRhc2V0KTtcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBbc3gsIHN5XSA9IHJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICAgIGNvbnN0IFt0eCwgdHldID0gcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcyA/PyBudWxsO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50ICogMikuZmlsbChOYU4pO1xuICAgIGNvbnN0IG4gPSBkcmF3biA/IGRyYXduLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IG47IGsrKykge1xuICAgICAgY29uc3QgaSA9IGRyYXduID8gZHJhd25ba10gOiBrO1xuICAgICAgb3V0W2kgKiAyXSA9IG9icy54W2ldICogc3ggKyB0eDtcbiAgICAgIG91dFtpICogMiArIDFdID0gb2JzLnlbaV0gKiBzeSArIHR5O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRvb2x0aXAgc2F5cywgcmVzb2x2ZWQgb25jZSBwZXIgY29sb3VyIHNvdXJjZSByYXRoZXIgdGhhbiBwZXIgaG92ZXIuXG4gICAqXG4gICAqIEZldGNoZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBjb2xvdXJpbmcgb24gcHVycG9zZTogdGhlIHJlZmVyZW5jZSBwb3J0IGNhY2hlc1xuICAgKiBjb2x1bW5zLCBidXQgYSBob3N0J3MgbmVlZCBub3QsIGFuZCByZS1mZXRjaGluZyBhIDMuN00tZWxlbWVudCB2ZWN0b3IgYmVjYXVzZVxuICAgKiB0aGUgcG9pbnRlciBtb3ZlZCB3b3VsZCBiZSBpbmRlZmVuc2libGUgZWl0aGVyIHdheS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUhvdmVyU291cmNlKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICBjb25zdCBrZXkgPSBkYXRhc2V0ICYmIGNvbG9yQnlcbiAgICAgID8gYCR7ZGF0YXNldC5pZH18JHtjb2xvckJ5LmtpbmR9OiR7Y29sb3JCeS5uYW1lfWBcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmhvdmVyU291cmNlS2V5KSByZXR1cm47XG4gICAgLy8gVGhlIGtleSBpcyBjb21taXR0ZWQgb25seSB3aGVyZSBhIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gU2V0dGluZyBpdCB1cFxuICAgIC8vIGZyb250IHdvdWxkIG1lYW4gYSByZXNvbHV0aW9uIHRoYXQgbG9zZXMgdGhlIHJhY2UgbGVhdmVzIHRoZSBrZXkgY2xhaW1pbmcgYVxuICAgIC8vIHNvdXJjZSB0aGF0IHdhcyBuZXZlciBzdG9yZWQg4oCUIGFuZCBzaW5jZSBldmVyeSBsYXRlciBlbWlzc2lvbiBjYXJyaWVzIHRoZVxuICAgIC8vIHNhbWUga2V5LCBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IGhlcmUgZm9yZXZlciBhbmQgdGhlIHRvb2x0aXAgd291bGQgc3RheVxuICAgIC8vIHNpbGVudCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24uXG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMuaG92ZXJTb3VyY2VUb2tlbjtcbiAgICAvLyBObyBjb2xvdXIgc291cmNlIG1lYW5zIG5vdGhpbmcgaXMgYmVpbmcgc2FpZCBhYm91dCB0aGUgY2VsbHMsIHNvIHRoZXJlIGlzIG5vXG4gICAgLy8gY2x1c3RlciB0byBuYW1lIGFuZCB0aGUgdG9vbHRpcCBzdGF5cyBzaWxlbnQuXG4gICAgaWYgKCFrZXkgfHwgIWRhdGFzZXQgfHwgIWNvbG9yQnkgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbilcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCcsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBjb2x1bW4ubWV0YS5jYXRlZ29yaWVzLFxuICAgICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbHVtbi52YWx1ZXMsXG4gICAgICAgICAgICAuLi4oY29sdW1uLm1ldGEudW5pdCA/IHsgdW5pdDogY29sdW1uLm1ldGEudW5pdCB9IDoge30pLFxuICAgICAgICAgIH07XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSB7XG4gICAgICAgIGtpbmQ6ICdjb250aW51b3VzJyxcbiAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIC4uLihkYXRhc2V0LmZlYXR1cmVzPy51bml0ID8geyB1bml0OiBkYXRhc2V0LmZlYXR1cmVzLnVuaXQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIC8vIFRoZSB0b29sdGlwIGlzIGFuIGV4dHJhOyBhIGZhaWxlZCBmZXRjaCBtdXN0IG5vdCBkaXN0dXJiIHRoZSByZW5kZXIuIFRoZVxuICAgICAgLy8ga2V5IGlzIGxlZnQgdW5zZXQgc28gYSBsYXRlciBlbWlzc2lvbiByZXRyaWVzIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgYVxuICAgICAgLy8gcGVybWFuZW50IHNpbGVuY2UuXG4gICAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIHRvIGNhbnZhcyBwaXhlbHMgdW5kZXIgdGhlIGN1cnJlbnQgM0QgY2FtZXJhLlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpdHNlbGYgaXMgdGhlIHJlbmRlcmVyJ3M6IGB2aWV3ZXIucHJvamVjdFBvaW50c2Agb3ducyB0aGUgY2FtZXJhLCB0aGVcbiAgICogdmlld3BvcnQgaW4gQ1NTIHBpeGVscywgdGhlIHBlcnNwZWN0aXZlIGRpdmlkZSBhbmQgdGhlIHktZmxpcC4gVGhpcyB1c2VkIHRvIGJlIGZpZnRlZW5cbiAgICogbGluZXMgb2YgY29sdW1uLW1ham9yIG1hdHJpeCBhcml0aG1ldGljIGhlcmUsIGR1cGxpY2F0aW5nIGEgc2Vjb25kIGNvcHkgaW5cbiAgICogYG5hcGFyaS1heGVzLWxhYmVsc2Ag4oCUIGFuZCB0aGUgdHdvIGhhZCBkcmlmdGVkIG9uIHdoYXQgdG8gZG8gd2l0aCBhIE5hTiB3LlxuICAgKlxuICAgKiBXaGF0IGlzIGxlZnQgaXMgdGhlIHBhcnQgdGhhdCBpcyBnZW51aW5lbHkgdGhpcyBhZGFwdGVyJ3M6IFNDQVRURVJJTkcgdGhlIGRyYXduIHN1YnNldFxuICAgKiBiYWNrIGludG8gb2JzZXJ2YXRpb24gb3JkZXIuIFRoZSBjbG91ZCBob2xkcyBvbmx5IHRoZSBwb2ludHMgb2YgdGhlIGRpc3BsYXllZCBzZWN0aW9uLFxuICAgKiBpbiBpdHMgb3duIHBhY2tpbmc7IGV2ZXJ5IGNvbnN1bWVyIGluZGV4ZXMgYnkgb2JzZXJ2YXRpb24uIE5hTiBzdGFuZHMgZm9yIFwibm90IG9uXG4gICAqIHNjcmVlblwiLCB3aGljaCBpcyBhbHNvIHRoZSByaWdodCBhbnN3ZXIgZm9yIGFuIG9ic2VydmF0aW9uIHdob3NlIHNlY3Rpb24gaXMgaGlkZGVuLlxuICAgKlxuICAgKiBOdWxsIHdoZW4gdGhlIDNEIGNsb3VkIGlzIG5vdCBtb3VudGVkLCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gdGhlIDJEIGFmZmluZSBwYXRoLlxuICAgKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIgfHwgIXRoaXMuc3BhdGlhbFBvc2l0aW9uczNkKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHByb2plY3RlZCA9IHZpZXdlci5wcm9qZWN0UG9pbnRzKHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkLCB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QpO1xuICAgIGlmICghcHJvamVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICAvLyBSZXVzZWQgYWNyb3NzIGNhbWVyYSBjaGFuZ2VzOiBhdCAzLjdNIG9ic2VydmF0aW9ucyB0aGlzIGlzIGEgMzAgTUIgYWxsb2NhdGlvbiB0aGF0XG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIGhhcHBlbiBvbiBldmVyeSBvcmJpdC5cbiAgICB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QgPSBwcm9qZWN0ZWQ7XG5cbiAgICBjb25zdCBkcmF3biA9IHRoaXMuc3BhdGlhbERyYXduM2Q7XG4gICAgY29uc3QgeyBzY3JlZW4sIGRlcHRoIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgY29uc3QgZGVwdGhzID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpLmZpbGwoTmFOKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIGlmIChpID49IG9icy5jb3VudCkgY29udGludWU7XG4gICAgICBvdXRbaSAqIDJdID0gc2NyZWVuW2sgKiAyXTtcbiAgICAgIG91dFtpICogMiArIDFdID0gc2NyZWVuW2sgKiAyICsgMV07XG4gICAgICBkZXB0aHNbaV0gPSBkZXB0aFtrXTtcbiAgICB9XG4gICAgLy8gS2VwdCBiZXNpZGUgdGhlIHNjcmVlbiBwb3NpdGlvbnMgc28gdGhlIGhvdmVyIHBpY2sgY2FuIHByZWZlciB0aGUgRlJPTlQtbW9zdCBwb2ludFxuICAgIC8vIHVuZGVyIHRoZSBjdXJzb3IgcmF0aGVyIHRoYW4gdGhlIG9uZSBuZWFyZXN0IGl0cyBjZW50cmUg4oCUIHdoaWNoIGluIGEgZGVuc2UgY2xvdWQgaXNcbiAgICAvLyByZWd1bGFybHkgc29tZXRoaW5nIHRoZSByZW5kZXJlciBkcmV3IGFub3RoZXIgcG9pbnQgb3Zlci5cbiAgICB0aGlzLnNwYXRpYWxEZXB0aHMzZCA9IGRlcHRocztcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIG1hcmtlcnMgb24gYW55IGRhdGFzZXQgb3Igdmlldy1zdGF0ZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU3BhdGlhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNwYXRpYWxTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgaWYgKCFwb3J0KSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0aW9uJCA9IHRoaXMuc2VsZWN0aW9uU3RvcmU/LmdldFNlbGVjdGlvbiQoKSA/PyBvZihlbXB0eVNlbGVjdGlvbigpKTtcbiAgICAvLyBUaGUgZGlzcGxheSBjb2xvcm1hcCBpcyBhbiBpbnB1dCBoZXJlLCBub3QganVzdCBzb21ldGhpbmcgcmVhZCBhdCBidWlsZFxuICAgIC8vIHRpbWU6IGBjb250aW51b3VzQ29sb3JtYXA6IG51bGxgIG1lYW5zIFwiZm9sbG93IHRoZSBpbWFnZSdzIGNvbG9ybWFwXCIsIGFuZCBhXG4gICAgLy8gc2V0dGluZyB0aGF0IG9ubHkgdGFrZXMgZWZmZWN0IGF0IHRoZSBuZXh0IHVucmVsYXRlZCByZWJ1aWxkIGlzIG5vdCBvbmUuXG4gICAgdGhpcy5zcGF0aWFsU3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICBwb3J0LmdldERhdGFzZXQkKCksIHRoaXMuc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksIHNlbGVjdGlvbiQsXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgXSkuc3Vic2NyaWJlKChbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBjb2xvcm1hcCwgcmV2ZXJzZV0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSAhIXJldmVyc2U7XG4gICAgICAvLyBLZXB0IHNvIGEgc2xpY2UgY2hhbmdlIGNhbiByZWRyYXcgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUsIHdoaWNoXG4gICAgICAvLyBhcnJpdmVzIHRocm91Z2ggc2V0WkluZGV4IHJhdGhlciB0aGFuIHRocm91Z2ggYW55IG9mIHRoZXNlIHN0cmVhbXMuXG4gICAgICB0aGlzLnNwYXRpYWxMYXRlc3QgPSBbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uXTtcbiAgICAgIC8vIFRoZSBtYXJrZXJzIGFyZSBhYm91dCB0byBtb3ZlIG9yIGNoYW5nZSBtZWFuaW5nLCBzbyBib3RoIGhhbHZlcyBvZiB0aGVcbiAgICAgIC8vIHRvb2x0aXAg4oCUIHdoZXJlIHRoZSBwb2ludHMgYXJlLCBhbmQgd2hhdCB0aGV5IGFyZSDigJQgYXJlIHN0YWxlLlxuICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIHZvaWQgdGhpcy5yZXNvbHZlSG92ZXJTb3VyY2UoZGF0YXNldCwgdmlldyk7XG4gICAgICB2b2lkIChpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKVxuICAgICAgICA/IHRoaXMucmVidWlsZFNwYXRpYWxQb2ludHMzZChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50cyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pKTtcbiAgICAgIGlmICghaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXIgbGF5ZXIgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSBjb2xvdXJzIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmU6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZVxuICAgIC8vIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGUgZXhpc3RpbmcgbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGZhY2VDb2xvcjogUmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZysrO1xuICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICB0cnkge1xuICAgICAgZmFjZUNvbG9yID0gZGF0YXNldFxuICAgICAgICA/IGF3YWl0IHRoaXMuc3BhdGlhbEZhY2VDb2xvcnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKVxuICAgICAgICA6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICBmYWNlQ29sb3IgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZy0tO1xuICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgIH1cbiAgICAvLyBBIG5ld2VyIHJlYnVpbGQgKG9yIGEgdGVhcmRvd24pIHN0YXJ0ZWQgd2hpbGUgdGhlIHZlY3RvciB3YXMgaW4gZmxpZ2h0LlxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGlmICghZGF0YXNldCB8fCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cykge1xuICAgICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMpO1xuICAgICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgLy8gQSBkYXRhc2V0IHdob3NlIGltYWdlIElTIGl0cyB2b2x1bWUgc2hvd3MgT05FIFBMQU5FIGF0IGEgdGltZSwgc28gdGhlXG4gICAgLy8gbWFya2VycyBhcmUgdGhlIG9ic2VydmF0aW9ucyBpbiB0aGUgZGlzcGxheWVkIHBsYW5lLCBkcmF3biBpbiB0aGF0IHBsYW5lJ3NcbiAgICAvLyBwaXhlbCBncmlkLiBXaXRob3V0IHRoZSBmaWx0ZXIgdGhlIHNwZWNpbWVuJ3Mgd2hvbGUgZGVwdGggcGlsZXMgb250byBvbmVcbiAgICAvLyBzZWN0aW9uIGFuZCByZWFkcyBhcyBhIHNtZWFyOyB3aXRob3V0IHRoZSBhZmZpbmUgdGhlIGNvb3JkaW5hdGVzIGFyZSByZWFkXG4gICAgLy8gYXMgcGl4ZWxzIGFuZCBsYW5kIG9mZiB0aGUgc2xpY2UgZW50aXJlbHkuXG4gICAgY29uc3Qgc2xhYiA9IHRoaXMuc3BhdGlhbFNsYWIoZGF0YXNldCk7XG4gICAgLy8gVGhlIGdlbmUgbWFwIGdvZXMgVU5ERVIgdGhlIGNlbGxzLCBzbyBpdCBpcyBzZXR0bGVkIGJlZm9yZSB0aGV5IGFyZSBhZGRlZC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHNsYWIpO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBiYXNlID0gbWFya2VyRGlhbWV0ZXJzKG9icywgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9GQUxMQkFDS19SQURJVVMpO1xuICAgIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gICAgY29uc3QgZmxvb3IgPSBzbGFiPy5taW5EaWFtZXRlciA/PyAwO1xuICAgIGNvbnN0IHNpemVPZiA9IChpOiBudW1iZXIpID0+XG4gICAgICBNYXRoLm1heCh0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgPyBiYXNlIDogYmFzZVtpXSwgZmxvb3IpICogc2NhbGU7XG4gICAgY29uc3Qgc2l6ZTogbnVtYmVyIHwgRmxvYXQzMkFycmF5ID1cbiAgICAgIHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyAmJiAhc2xhYlxuICAgICAgICA/IE1hdGgubWF4KGJhc2UsIGZsb29yKSAqIHNjYWxlXG4gICAgICAgIDogRmxvYXQzMkFycmF5LmZyb20oc2xhYj8uaW5kaWNlcyA/PyB7IGxlbmd0aDogb2JzLmNvdW50IH0sIChfdiwgaSkgPT5cbiAgICAgICAgICAgIHNpemVPZihzbGFiID8gc2xhYi5pbmRpY2VzW2ldIDogaSkpO1xuXG4gICAgLy8gbmFwYXJpJ3MgaW1hZ2UgdmlldyBDTEVBUlMgdGhlIHdob2xlIGxheWVyIGxpc3Qgb24gZXZlcnkgcmVuZGVyLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGdvIHdpdGggaXQgd2hlbmV2ZXIgdGhlIGltYWdlIGlzIHJlLXJlbmRlcmVkIOKAlCBhIHNjcnViLCBhIGNvbnRyYXN0XG4gICAgLy8gY2hhbmdlLiBUaGUgY2FjaGVkIGhhbmRsZSBpcyB0aGVuIGRldGFjaGVkLCBhbmQgbXV0YXRpbmcgaXQgZHJhd3Mgbm90aGluZzpcbiAgICAvLyB0cmVhdCBhIGxheWVyIHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBzY2VuZSBhcyBhYnNlbnQgc28gaXQgZ2V0cyByZS1hZGRlZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzICYmICF2aWV3ZXIubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKHRoaXMuc3BhdGlhbFBvaW50cykpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQSBzaXplL2NvbG91ci9vcGFjaXR5L3NlbGVjdGlvbiBjaGFuZ2UgaXMgRElTUExBWS1vbmx5OiBtdXRhdGUgdGhlIGxheWVyXG4gICAgLy8gcmF0aGVyIHRoYW4gZHJvcHBpbmcgYW5kIHJlLWFkZGluZyBpdC4gQm90aCBzZXR0ZXJzIGJ1bXAgdGhlIGxheWVyJ3NcbiAgICAvLyBkYXRhVmVyc2lvbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyBuYXBhcmktanMgcmVidWlsZCB0aGUgaW5zdGFuY2UgYnVmZmVyIGFuZFxuICAgIC8vIHJlZHJhdyDigJQgYW5kIGl0IGF2b2lkcyByZWJ1aWxkaW5nIDg0ayBwb3NpdGlvbnMgdG8gY2hhbmdlIG9uZSBudW1iZXIuXG4gICAgLy8gVGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlIGtleTogYSBzY3J1YiBjaGFuZ2VzIFdISUNIIG9ic2VydmF0aW9ucyBhcmUgZHJhd24sXG4gICAgLy8gd2hpY2ggaXMgZ2VvbWV0cnksIG5vdCBkaXNwbGF5LlxuICAgIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NsYWI/LnNsaWNlID8/ICcnfWA7XG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cyAmJiBrZXkgPT09IHRoaXMuc3BhdGlhbExheWVyS2V5KSB7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMuc2l6ZSA9IHNpemU7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMudmlzaWJsZSA9IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cy5mYWNlQ29sb3IgPSB0aGlzLmdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIHNsYWI/LmluZGljZXMpIGFzIG5ldmVyO1xuICAgICAgdGhpcy5oaWRlRm9yZWlnbkltYWdlKHZpZXdlciwgKCEhcmVmIHx8ICEhZGF0YXNldC52b2x1bWUpICYmIHZpZXcuc2hvd0ltYWdlICE9PSBmYWxzZSk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5zZXRSZWdpb25zVmlzaWJsZSh2aWV3LnNob3dBbm5vdGF0aW9ucyAhPT0gZmFsc2UpO1xuICAgICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMpO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkcmF3biA9IHNsYWI/LmluZGljZXM7XG4gICAgY29uc3QgY291bnQgPSBkcmF3biA/IGRyYXduLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gZHJhd24gPyBkcmF3bltpXSA6IGk7XG4gICAgICBwb3NpdGlvbnNbaSAqIDJdID0gb2JzLnhbb107XG4gICAgICBwb3NpdGlvbnNbaSAqIDIgKyAxXSA9IG9icy55W29dO1xuICAgIH1cbiAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IGtleTtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICBzaXplLFxuICAgICAgZmFjZUNvbG9yOiB0aGlzLmdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIGRyYXduKSxcbiAgICAgIC8vIE5vIGJvcmRlcjogYXQgVmlzaXVtIHNwb3QgZGVuc2l0eSBhbiBvdXRsaW5lIHBlciBtYXJrZXIgcmVhZHMgYXMgbm9pc2UsXG4gICAgICAvLyBhbmQgaXQgY29zdHMgYSBzZWNvbmQgY29sb3VyIGFycmF5LlxuICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgICAvLyBUaGUgZGF0YXNldCdzIGRhdGEtPndvcmxkIGFmZmluZS4gU3BhdGlhbERhdGEgcmVjb3JkcyBvbmUgcGVyIGNvb3JkaW5hdGVcbiAgICAgIC8vIHN5c3RlbSAoVmlzaXVtIHNwb3QgY29vcmRzIGFyZSBpbiB0aGUgRlVMTC1yZXNvbHV0aW9uIGZyYW1lIHdoaWxlIHRoZVxuICAgICAgLy8gc2VydmVkIGltYWdlIG1heSBiZSB0aGUgaGlyZXMgZG93bnNjYWxlKSwgc28gd2l0aG91dCB0aGlzIHRoZSBtYXJrZXJzXG4gICAgICAvLyBsYW5kIGluIHRoZSByaWdodCBzaGFwZSBhdCB0aGUgd3Jvbmcgc2NhbGUuIERlZmF1bHRzIHRvIGlkZW50aXR5IHdoZW5cbiAgICAgIC8vIHRoZSBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSBpbiB0aGUgaW1hZ2UncyBwaXhlbCBzcGFjZS5cbiAgICAgIHNjYWxlOiByZWY/LnNjYWxlID8/IFsxLCAxXSxcbiAgICAgIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdLFxuICAgICAgdmlzaWJsZTogdGhpcy5zcGF0aWFsUG9pbnRzVmlzaWJsZSgpLFxuICAgIH0pO1xuICAgIC8vIE91dGxpbmVzLCBkZW5zaXR5IGFuZCB0cmFuc2NyaXB0cyBnbyBiYWNrIG92ZXIgdGhlIG1hcmtlcnMganVzdCBhZGRlZC5cbiAgICB0aGlzLnNwYXRpYWxUaWxlc01ncj8uYWZ0ZXJPYnNlcnZhdGlvbnMoKTtcbiAgICB0aGlzLmZyYW1lU3BhdGlhbFBvaW50c09uY2Uodmlld2VyLCBkYXRhc2V0LmlkLCBwb3NpdGlvbnMsICEhcmVmKTtcbiAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCAoISFyZWYgfHwgISFkYXRhc2V0LnZvbHVtZSkgJiYgdmlldy5zaG93SW1hZ2UgIT09IGZhbHNlKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMucmVnaW9uT3ZlcmxheTtcbiAgICBpZiAoIW92ZXJsYXk/LnNldFdvcmxkUXVhbnR1bSkgcmV0dXJuO1xuICAgIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8IGRhdGFzZXQudm9sdW1lKSB7XG4gICAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bShQSVhFTF9XT1JMRF9RVUFOVFVNKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTsgbGV0IG1heFggPSAtSW5maW5pdHk7IGxldCBtaW5ZID0gSW5maW5pdHk7IGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCB4ID0gcG9zaXRpb25zW2ldO1xuICAgICAgY29uc3QgeSA9IHBvc2l0aW9uc1tpICsgMV07XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSBjb250aW51ZTtcbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgfVxuICAgIG92ZXJsYXkuc2V0V29ybGRRdWFudHVtKHdvcmxkUXVhbnR1bUZvckV4dGVudChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmFtZSB0aGUgMkQgY2FtZXJhIG9uIHRoZSBvYnNlcnZhdGlvbnMsIGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UuXG4gICAqXG4gICAqIFRoZSAyRCBjYW1lcmEgaXMgbm9ybWFsbHkgZml0dGVkIHRvIHRoZSBJTUFHRSwgYmVjYXVzZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpbiB0aGF0XG4gICAqIGltYWdlJ3MgcGl4ZWwgc3BhY2UgYW5kIGZyYW1pbmcgdGhlIGltYWdlIGZyYW1lcyB0aGVtIHRvby4gQSBkYXRhc2V0IHdpdGggbm9cbiAgICogcmVmZXJlbmNlIGltYWdlIGhhcyBjb29yZGluYXRlcyBpbiBpdHMgb3duIHVuaXRzIGluc3RlYWQg4oCUIHNlcUZJU0gncyBzcGFuIGFib3V0XG4gICAqIDV4NyDigJQgc28gdGhlIGltYWdlIGZyYW1pbmcgbGVmdCBvdmVyIGZyb20gd2hhdGV2ZXIgd2FzIG9uIHNjcmVlbiBiZWZvcmUgcHV0cyB0aGVcbiAgICogd2hvbGUgY2xvdWQgb2Zmc2NyZWVuOiBtZWFzdXJlZCBhdCA5LjcgeCAxMy40IFBJWEVMUywgY2VudHJlZCAyNTZweCBmcm9tIHdoZXJlIHRoZVxuICAgKiBjYW1lcmEgd2FzIGxvb2tpbmcuIFRoZSBwb2ludHMgYXJlIGFsbCB0aGVyZSBhbmQgZHJhd247IHRoZXkgYXJlIGEgc3BlY2suIFdoaWNoXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSB0aGUgZGF0YXNldCBoYXZpbmcgZmFpbGVkIHRvIGxvYWQuXG4gICAqXG4gICAqIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZyxcbiAgICogc2xpY2luZyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmVcbiAgICogdGhlIGNhbWVyYSB1bmRlciB0aGUgdXNlciDigJQgdGhlIGNhbWVyYSB0b29scyBhbmQgdGhlIGNhbnZhcyBkcmFnIGFyZSBtZWFudCB0byBiZVxuICAgKiB0aGUgb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICovXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpbWFnZSBsYXllciBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlIG9mIGl0cyBvd24uXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgdmlld2VyIGtlZXBzIHdoYXRldmVyIGltYWdlIHdhcyBsYXN0IGxvYWRlZCwgYW5kIGZvciBhIGRhdGFzZXQgdGhhdFxuICAgKiByZWdpc3RlcnMgb250byBub25lIHRoYXQgcGljdHVyZSBiZWxvbmdzIHRvIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5IOKAlCB0aGUgZXhhbXBsZSdzXG4gICAqIGRlZmF1bHQgc2xpZGUsIHNheS4gSXQgaXMgbm90IG1lcmVseSBpcnJlbGV2YW50OiB0aGUgdHdvIGxpdmUgaW4gZGlmZmVyZW50IGNvb3JkaW5hdGVcbiAgICogc3BhY2VzIChpbWFnZSBwaXhlbHMgYWdhaW5zdCB0aGUgZW1iZWRkaW5nJ3Mgb3duIHVuaXRzKSwgc28gdGhlIGxlZnRvdmVyIGlzIG1hZ25pZmllZFxuICAgKiByb3VnaGx5IGEgaHVuZHJlZGZvbGQuIEF0IHRoZSBmaXR0ZWQgem9vbSB0aGUgY2FtZXJhIHNpdHMgaW5zaWRlIGl0cyBjb3JuZXIsIHdoZXJlIGl0XG4gICAqIHJlYWRzIGFzIGJsYW5rIGJhY2tncm91bmQsIGFuZCBpdCBhcHBlYXJzIG9ubHkgb25jZSB5b3Ugem9vbSBvdXQgZmFyIGVub3VnaCB0byBmaW5kXG4gICAqIGl0IOKAlCB3aGljaCBpcyBleGFjdGx5IGhvdyBpdCBnZXRzIG5vdGljZWQuXG4gICAqXG4gICAqIEhpZGRlbiByYXRoZXIgdGhhbiByZW1vdmVkLCBhbmQgaGlkZGVuIEhFUkUgcmF0aGVyIHRoYW4gYnkgY2xlYXJpbmcgdGhlIGhvc3QncyBpbWFnZVxuICAgKiBzdGF0ZTogdGhhdCBzdGF0ZSBkcml2ZXMgdGhlIHdob2xlIHJlbmRlciBwaXBlbGluZSwgaW5jbHVkaW5nIGEgUGxvdGx5IGJhY2tlbmQgd2hvc2VcbiAgICogZmllbGRzIGFyZSBkZWNsYXJlZCB3aXRoIGRlZmluaXRlLWFzc2lnbm1lbnQgYXNzZXJ0aW9ucywgc28gZW1wdHlpbmcgaXQgdGhyb3dzIGZyb21cbiAgICogd2hpY2hldmVyIGZpZWxkIHRoZSBuZXh0IHBhdGggaGFwcGVucyB0byByZWFkLiBUaGlzIHRvdWNoZXMgb25lIGxheWVyJ3MgdmlzaWJpbGl0eVxuICAgKiBhbmQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlRm9yZWlnbkltYWdlKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1hZ2Ugb2YgaXRzIG93biDihpIgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdyBlaXRoZXIuXG4gICAgdGhpcy5uYXZpZ2F0b3I/LnNldFZpc2libGUoZGF0YXNldEhhc1BpeGVscyAmJiB0aGlzLm5hdmlnYXRvclZpc2libGUpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygdmlld2VyLmxheWVycy5pdGVtcykge1xuICAgICAgaWYgKGxheWVyLmtpbmQgIT09ICdpbWFnZScpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIHRyYW5zY3JpcHQtZGVuc2l0eSByYXN0ZXIgaXMgYW4gaW1hZ2UgbGF5ZXIgdG9vLCBidXQgaXQgaXMgZGF0YSwgbm90IHRoZVxuICAgICAgLy8gdGlzc3VlOiB0aGUgSW1hZ2VzIHRvZ2dsZSBtdXN0IG5vdCB0YWtlIGl0IGRvd24gd2l0aCB0aGUgc2xpZGUuXG4gICAgICBpZiAodGhpcy5zcGF0aWFsVGlsZXNNZ3I/Lm93bnMobGF5ZXIpKSBjb250aW51ZTtcbiAgICAgIC8vIFJlLXNob3duIHdoZW4gYSBkYXRhc2V0IHRoYXQgb3ducyBhbiBpbWFnZSBjb21lcyBiYWNrLCBzbyBzd2l0Y2hpbmcgYmV0d2VlblxuICAgICAgLy8gZGF0YXNldHMgZG9lcyBub3QgbGVhdmUgdGhlIHRpc3N1ZSBwZXJtYW5lbnRseSBoaWRkZW4uXG4gICAgICBsYXllci52aXNpYmxlID0gZGF0YXNldEhhc1BpeGVscztcbiAgICB9XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZnJhbWVTcGF0aWFsUG9pbnRzT25jZShcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldElkOiBzdHJpbmcsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LCByZWdpc3RlcmVkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICAvLyBHYXRlZCBvbiB3aGV0aGVyIFRISVMgZGF0YXNldCByZWdpc3RlcnMgb250byBhbiBpbWFnZSwgbm90IG9uIGBpbWFnZVdgL2BpbWFnZUhgOlxuICAgIC8vIHRob3NlIGtlZXAgdGhlIGxhc3QgcGxvdHRlZCBpbWFnZSdzIGRpbWVuc2lvbnMgYWZ0ZXIgdGhlIGhvc3QgY2xlYXJzIGl0LCBzbyBhXG4gICAgLy8gc3RhbGUgNTEyeDM4MyByZWFkIGFzIFwidGhlcmUgaXMgYW4gaW1hZ2VcIiBhbmQgc2tpcHBlZCB0aGUgZnJhbWluZyBlbnRpcmVseS5cbiAgICBpZiAocmVnaXN0ZXJlZCkgcmV0dXJuO1xuICAgIC8vIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZywgc2xpY2luZ1xuICAgIC8vIG9yIHBpY2tpbmcgYSBnZW5lIHJlLWFkZHMgdGhpcyBsYXllciwgYW5kIHJlLWZyYW1pbmcgb24gdGhvc2Ugd291bGQgbW92ZSB0aGVcbiAgICAvLyBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmUgdGhlXG4gICAgLy8gb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICBpZiAodGhpcy5zcGF0aWFsMmRGcmFtZWQ/LnZpZXdlciA9PT0gdmlld2VyXG4gICAgICAmJiB0aGlzLnNwYXRpYWwyZEZyYW1lZC5kYXRhc2V0SWQgPT09IGRhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZml0ID0gZnJhbWVQb3NpdGlvbnMoXG4gICAgICBwb3NpdGlvbnMsIHRoaXMuY2FudmFzPy5jbGllbnRXaWR0aCA/PyAwLCB0aGlzLmNhbnZhcz8uY2xpZW50SGVpZ2h0ID8/IDAsXG4gICAgKTtcbiAgICAvLyBOdWxsIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJhbWUgb247IGxlYXZlIHRoZSBjYW1lcmEgd2hlcmUgaXQgaXMgcmF0aGVyXG4gICAgLy8gdGhhbiBtb3ZpbmcgdGhlIHZpZXcgZm9yIGEgZGF0YXNldCB3ZSBjYW5ub3QgZml0LlxuICAgIGlmICghZml0KSByZXR1cm47XG4gICAgdmlld2VyLmNhbWVyYS5zZXQoZml0LmNlbnRlciwgZml0Lnpvb20gPz8gdmlld2VyLmNhbWVyYS56b29tKTtcbiAgICB0aGlzLnNwYXRpYWwyZEZyYW1lZCA9IHsgdmlld2VyLCBkYXRhc2V0SWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKipnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIGFzIGEgY29udGludW91cyBmaWVsZCBkcmF3biB1bmRlclxuICAgKiB0aGUgY2VsbHMuXG4gICAqXG4gICAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgc2F5cyB3aGljaCBjZWxscyBleHByZXNzIGl0OyBpdCBjYW5ub3Qgc2F5IHdoZXJlLFxuICAgKiBiZWNhdXNlIHRoZSBleWUgd2lsbCBub3QgaW50ZWdyYXRlIHRob3VzYW5kcyBvZiBkb3RzIGludG8gYSB0ZXJyaXRvcnkuIFRoZSBmaWVsZFxuICAgKiBpcyBhIGtlcm5lbC13ZWlnaHRlZCBNRUFOIHBlciBjZWxsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApLCBzbyBhIGRlbnNlXG4gICAqIHJlZ2lvbiBkb2VzIG5vdCBnbG93IG1lcmVseSBmb3IgYmVpbmcgZGVuc2UsIGFuZCBpdCBpcyB0cmFuc3BhcmVudCB3aGVyZXZlciBub1xuICAgKiBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW4gdW5zYW1wbGVkIGdhcCBtdXN0IG5vdCByZWFkIGFzIFwibm90IGV4cHJlc3NlZFwiLlxuICAgKlxuICAgKiBJdCBzaGFyZXMgdGhlIHBvaW50cycgTFVULCBwZXJjZW50aWxlIHdpbmRvdyBhbmQgbG9nIGZsYWcsIHNvIHRoZSBsYXllciB1bmRlclxuICAgKiB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyB0aGVtc2VsdmVzIGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIERJU1BMQVlFRCBpbWFnZSdzIHBpeGVsIGdyaWQsIGNvYXJzZW5lZCBzbyB0aGUgbG9uZyBzaWRlIGlzIGF0XG4gICAqIG1vc3Qge0BsaW5rIEdFTkVfTUFQX01BWF9TSURFfTogYSBzbW9vdGggZmllbGQgZ2FpbnMgbm90aGluZyBmcm9tIGEgc2xpZGUncyBmdWxsXG4gICAqIHJlc29sdXRpb24uIEZvciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGF0IGdyaWQgaXMgdGhlIGN1cnJlbnQgc2xpY2UsIGFuZCBvbmx5XG4gICAqIHRoYXQgcGxhbmUncyBvYnNlcnZhdGlvbnMgYXJlIGluY2x1ZGVkIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBtYXJrZXJzIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBzbGFiOiB7IHJlZjogU3BhdGlhbEltYWdlUmVmOyBpbmRpY2VzOiBVaW50MzJBcnJheTsgc2xpY2U6IG51bWJlciB9IHwgbnVsbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2VuZSA9IHZpZXcuZ2VuZU1hcCAmJiB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdmZWF0dXJlJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgPiAwID8gdmlldy5nZW5lTWFwU21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG5cbiAgICAvLyBUd28gY2xvY2tzOiB0aGUgRklFTEQgZGVwZW5kcyBvbiB0aGUgZ2VuZSwgdGhlIHBsYW5lIGFuZCB0aGUgYmFuZHdpZHRoLCB3aGlsZVxuICAgIC8vIHRoZSBjb2xvdXJzIGRlcGVuZCBvbiB0aGUgd2luZG93LCB0aGUgbG9nIGZsYWcgYW5kIHRoZSBvcGFjaXR5LiBSZWNvbG91cmluZyBhXG4gICAgLy8gY2FjaGVkIGZpZWxkIGlzIGEgZnJhY3Rpb24gb2YgZXN0aW1hdGluZyBvbmUuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtkYXRhc2V0LmlkLCBnZW5lLCBzbGFiPy5zbGljZSA/PyAnJywgc21vb3RoaW5nLCB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgIGZpZWxkS2V5LCBjbGlwLmpvaW4oJywnKSwgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsIHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgIHRoaXMuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICAvLyBBTlkgY2hhbmdlIGhlcmUgY2hhbmdlcyB0aGUgb3JkZXIgdGhlIGNlbGxzIGhhdmUgdG8gc2l0IGFib3ZlIOKAlCBpbmNsdWRpbmcgdGhlXG4gICAgLy8gZmlyc3Qgb25lLCB3aGVyZSB0aGVyZSBpcyBubyBwcmV2aW91cyBsYXllciB0byByZW1vdmUg4oCUIGFuZCB0aGUgbGF5ZXIgbGlzdCBpc1xuICAgIC8vIGFwcGVuZC1vbmx5LiBTbyBkcm9wIHRoZSBtYXJrZXJzIHVuY29uZGl0aW9uYWxseSBhbmQgbGV0IHRoZSByZWJ1aWxkIGJlbG93IHB1dFxuICAgIC8vIHRoZW0gYmFjayBvbiB0b3A7IG90aGVyd2lzZSB0aGUgZmllbGQgaXMgYXBwZW5kZWQgb3ZlciB0aGUgbWVhc3VyZW1lbnQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cykge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzKTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcEtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGQgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGRLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSByYXN0ZXIgY292ZXJzIHRoZSBkaXNwbGF5ZWQgaW1hZ2U7IHdpdGhvdXQgb25lIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAvLyBvdmVybGF5IGFuZCB0aGUgY2xvdWQgaXMgdGhlIDNEIG1vZGUncyBidXNpbmVzcywgbm90IHRoaXMgb25lJ3MuXG4gICAgY29uc3QgaW1hZ2VXID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS53aWR0aCA6IHRoaXMuaW1hZ2VXO1xuICAgIGNvbnN0IGltYWdlSCA9IHNsYWIgPyBkYXRhc2V0LnZvbHVtZSEuaGVpZ2h0IDogdGhpcy5pbWFnZUg7XG4gICAgaWYgKCFpbWFnZVcgfHwgIWltYWdlSCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLm1heChcbiAgICAgIDEsXG4gICAgICBNYXRoLmNlaWwoTWF0aC5tYXgoaW1hZ2VXLCBpbWFnZUgpIC8gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfTUFYX1NJREUpLFxuICAgICk7XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IHRoaXMuZ2VuZU1hcEZpZWxkS2V5KSB7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZCA9IGV4cHJlc3Npb25GaWVsZChkYXRhc2V0Lm9ic2VydmF0aW9ucywge1xuICAgICAgICByZWY6IHNsYWI/LnJlZiA/PyBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgICB3aWR0aDogTWF0aC5jZWlsKGltYWdlVyAvIHN0ZXApLFxuICAgICAgICBoZWlnaHQ6IE1hdGguY2VpbChpbWFnZUggLyBzdGVwKSxcbiAgICAgICAgc3RlcCxcbiAgICAgICAgc2lnbWE6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIC8vIEEgcGxhbmUgd2lucyBvdmVyIGEgc2VsZWN0aW9uOiB0aGUgMkQgdmlldyBpcyBzaG93aW5nIG9uZSBzZWN0aW9uLCBzbyBhXG4gICAgICAgIC8vIGZpZWxkIHNwYW5uaW5nIHRoZSBzcGVjaW1lbidzIGRlcHRoIHdvdWxkIG5vdCBiZSB0aGUgdGhpbmcgb24gc2NyZWVuLlxuICAgICAgICBpbmRpY2VzOiBzbGFiPy5pbmRpY2VzID8/IGluU2VsZWN0aW9uLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZEtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2VuZU1hcEZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgY29uc3QgW2xvLCBoaV0gPSBjb250cmFzdFdpbmRvdyhmaWVsZC5tZWFuLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JFeHByZXNzaW9uRmllbGQoZmllbGQsIGx1dCwgW2xvLCBoaV0sIHtcbiAgICAgIGxvZzogdmlldy5sb2dTY2FsZSxcbiAgICAgIC8vIFRoZSBNQVAncyBvd24gb3BhY2l0eTogcmVhZGluZyBhIGZpZWxkIHVuZGVyIHRoZSBjZWxscyBtZWFucyB0dXJuaW5nIHRoZVxuICAgICAgLy8gY2VsbHMgZG93biwgd2hpY2ggbXVzdCBub3QgdGFrZSB0aGUgZmllbGQgd2l0aCB0aGVtLlxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICB9KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGZpZWxkLndpZHRoLCBoZWlnaHQ6IGZpZWxkLmhlaWdodCwgY2hhbm5lbHM6IDQsIGR0eXBlOiAndWludDgnLCBkYXRhOiByZ2JhIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9YCxcbiAgICAgICAgc2NhbGU6IFtzdGVwLCBzdGVwXSxcbiAgICAgICAgdHJhbnNsYXRlOiBbMCwgMF0sXG4gICAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgfSxcbiAgICApO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYW5lIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IGlzIGN1cnJlbnRseSBzaG93aW5nOiBpdHMgcGl4ZWwgYWZmaW5lLCB0aGVcbiAgICogb2JzZXJ2YXRpb25zIHRoYXQgZmFsbCBpbiBpdCwgYW5kIHRoZSBtYXJrZXIgZmxvb3IgdGhhdCBncmlkIG5lZWRzLlxuICAgKlxuICAgKiBOdWxsIGZvciBhIGRhdGFzZXQgd2l0aCBhIHJlYWwgYGltYWdlUmVmYCAoaXRzIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IHRoZVxuICAgKiBpbWFnZSdzIHBpeGVscyBhbmQgZXZlcnkgb2JzZXJ2YXRpb24gYmVsb25ncyB0byB0aGUgb25lIHNlY3Rpb24pIGFuZCBmb3Igb25lXG4gICAqIHdpdGggbm8gdm9sdW1lIGF0IGFsbCDigJQgYm90aCBvZiB3aGljaCBkcmF3IGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2xhYihkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCk6IHtcbiAgICByZWY6IFNwYXRpYWxJbWFnZVJlZjsgaW5kaWNlczogVWludDMyQXJyYXk7IHNsaWNlOiBudW1iZXI7IG1pbkRpYW1ldGVyOiBudW1iZXI7XG4gIH0gfCBudWxsIHtcbiAgICBjb25zdCB2b2x1bWUgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCAhdm9sdW1lKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbGljZSA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZjogdm9sdW1lSW1hZ2VSZWYodm9sdW1lLCBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0KSxcbiAgICAgIGluZGljZXM6IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgc2xpY2UpLFxuICAgICAgc2xpY2UsXG4gICAgICBtaW5EaWFtZXRlcjogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggKiB2b2x1bWUudm94ZWxTaXplWzBdLFxuICAgIH07XG4gIH1cblxuICAvKiogUGVyLXBvaW50IGNvbG91cnMgZm9yIHRoZSBkcmF3biBzdWJzZXQuIEEgYnJvYWRjYXN0IHR1cGxlIHN0YXlzIGJyb2FkY2FzdCDigJRcbiAgICogIGl0IGlzIG9uZSBjb2xvdXIgZm9yIGV2ZXJ5IHBvaW50IGVpdGhlciB3YXkuICovXG4gIHByaXZhdGUgZ2F0aGVyQ29sb3JzPFQ+KGNvbG9yczogVFtdIHwgVCwgaW5kaWNlcz86IFVpbnQzMkFycmF5KTogVFtdIHwgVCB7XG4gICAgaWYgKCFpbmRpY2VzIHx8ICFBcnJheS5pc0FycmF5KGNvbG9ycykpIHJldHVybiBjb2xvcnM7XG4gICAgY29uc3Qgb3V0OiBUW10gPSBuZXcgQXJyYXkoaW5kaWNlcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gY29sb3JzW2luZGljZXNbaV1dO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVkcmF3IHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzIG92ZXIgYSBmcmVzaGx5IHJlbmRlcmVkIGltYWdlLlxuICAgKlxuICAgKiBUd28gcmVhc29ucywgYm90aCBpbnZpc2libGUgZnJvbSB0aGUgc3BhdGlhbCBzdG9yZSDigJQgd2hpY2ggaXMgd2h5IGEgc2NydWIgb3IgYVxuICAgKiByZS1yZW5kZXIgbmV2ZXIgcmVhY2hlZCB0aGUgbWFya2VycyBvbiBpdHMgb3duOlxuICAgKiAgLSB0aGUgaW1hZ2UgcmVuZGVyIENMRUFSUyB0aGUgbGF5ZXIgbGlzdCwgdGFraW5nIHRoZSBtYXJrZXJzIHdpdGggaXQ7XG4gICAqICAtIG92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhlIGRpc3BsYXllZCBwbGFuZSBkZWNpZGVzIHdoaWNoXG4gICAqICAgIG9ic2VydmF0aW9ucyBiZWxvbmcgb24gc2NyZWVuIGF0IGFsbCwgc28gdGhlIGNlbGxzIGhhdmUgdG8gbW92ZSB3aXRoIHRoZVxuICAgKiAgICBzZWN0aW9uIHJhdGhlciB0aGFuIGhhbmcgb3ZlciBhIGRpZmZlcmVudCBvbmUuXG4gICAqXG4gICAqIFVzZXMgdGhlIGxhdGVzdCB2YWx1ZXMgdGhlIG1hcmtlciBzdWJzY3JpcHRpb24gc2F3OyBhIG5vLW9wIHVudGlsIGl0IGhhcyBzZWVuXG4gICAqIGFueSwgaW4gdGhlIDNEIGNsb3VkIChubyBpbWFnZSwgbm8gcGxhbmUpLCBhbmQgd2l0aCBubyBkYXRhc2V0IHRvIGRyYXcuXG4gICAqL1xuICBwcml2YXRlIHJlZHJhd1NwYXRpYWxNYXJrZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhdGVzdCA9IHRoaXMuc3BhdGlhbExhdGVzdDtcbiAgICBpZiAoIWxhdGVzdD8uWzBdIHx8IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLnJlYnVpbGRTcGF0aWFsUG9pbnRzKC4uLmxhdGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIFNQQVRJQUxfT01JQ1NfM0Qgdmlldzogb2JzZXJ2YXRpb25zIGFzIGEgM0QgcG9pbnQgY2xvdWQgdW5kZXIgdGhlIG9yYml0IGNhbWVyYS5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IG11Y2ggdGhpbm5lciB0aGFuIHRoZSAyRCBtb3VudC4gVGhlcmUgaXMgbm8gdGlzc3VlIGltYWdlIHRvIHJlbmRlciAoYSByZWdpc3RlcmVkXG4gICAqIHZvbHVtZSBsaWtlIHRoZSBBbGxlbiBDQ0YgaGFzIG5vIHNpbmdsZSByZWZlcmVuY2UgcGxhbmUpLCBzbyBubyBzY2FsZSBiYXIsIG5vIHJlYWRiYWNrLCBhbmQgbm9cbiAgICogMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHRoZSByZWdpb24gdG9vbHMgZHJhdyBpbiBzY3JlZW4gc3BhY2UgYW5kIGhhdmUgbm8gbWVhbmluZyBhZ2FpbnN0IGFuXG4gICAqIG9yYml0aW5nIGNhbWVyYSwgd2hpY2ggaXMgd2h5IGBTZWxlY3QgZnJvbSBST0lzYCBpcyBoaWRkZW4gaW4gdGhpcyBtb2RlLiBgYWRkUG9pbnRzM0RgIHB1dHNcbiAgICogdGhlIHZpZXdlciBpbiAzRCBhbmQgZnJhbWVzIHRoZSBjYW1lcmEgb24gdGhlIGNsb3VkIGl0c2VsZi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTcGF0aWFsT21pY3MzZCh2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmluc3RhbGwzZEludGVyYWN0aW9uKHZpZXdlciwgaG9zdCk7XG4gICAgdGhpcy5pbnN0YWxsU3BhdGlhbEhvdmVyKGhvc3QpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIGJhciBmb3IgdGhlIDNEIGNsb3VkLCBtZWFzdXJlZCBhdCB0aGUgT1JCSVQgUElWT1QuXG4gICAqXG4gICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGhhcyBubyBzaW5nbGUgc2NhbGUg4oCUIHRoaW5ncyBmYXJ0aGVyIGF3YXkgYXJlIHNtYWxsZXIg4oCUIHNvIGEgYmFyIGNhblxuICAgKiBvbmx5IGJlIHRydWUgYXQgb25lIGRlcHRoLiBUaGUgcGl2b3QgaXMgdGhlIGhvbmVzdCBjaG9pY2U6IGl0IGlzIHdoYXQgdGhlIGNhbWVyYSBpcyBmcmFtaW5nLFxuICAgKiB3aGF0IGEgem9vbSBtb3ZlcyB0b3dhcmRzLCBhbmQgd2hlcmUgdGhlIGV5ZSBpcyBhbnl3YXkuIG5hcGFyaSdzIG93biAzRCBzY2FsZSBiYXIgd29ya3MgdGhlXG4gICAqIHNhbWUgd2F5LlxuICAgKlxuICAgKiBgTmFwYXJpU2NhbGVCYXJgIG5lZWRzIENTUyBweCBwZXIgd29ybGQgdW5pdCwgd2hpY2ggYW4gb3JiaXQgY2FtZXJhIGRvZXMgbm90IGV4cG9zZSwgYnV0IGF0XG4gICAqIHRoZSBwaXZvdCBpdCBpcyBleGFjdGx5IGB2aWV3cG9ydEhlaWdodCAvICgyICogZGlzdGFuY2UgKiB0YW4oZm92IC8gMikpYCDigJQgdGhlIHNhbWVcbiAgICogcmVsYXRpb25zaGlwIGBDYW1lcmEzRC5wYW5gIHVzZXMgdG8gdHJhY2sgdGhlIGN1cnNvci4gVGhlIGJhciB0aGVuIGNvbnZlcnRzIHRocm91Z2hcbiAgICogYG1pY3JvbnNQZXJVbml0YCwgYW5kIGRyYXdzIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIGRhdGFzZXQgZG9lcyBub3QgZGVjbGFyZSBvbmUsIGJlY2F1c2UgYVxuICAgKiBiYXIgbGFiZWxsZWQgaW4gbWljcm9ucyBvdmVyIHVua25vd24gdW5pdHMgd291bGQgcmVhZCBhcyBhIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3BhdGlhbDNkU2NhbGVCYXIodmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2NhbGVCYXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbnVsbDtcbiAgICB0aGlzLm5hdmlnYXRvcj8uZGVzdHJveSgpO1xuICAgIHRoaXMubmF2aWdhdG9yID0gbnVsbDtcbiAgICBjb25zdCBtaWNyb25zUGVyVW5pdCA9IGRhdGFzZXQ/Lm1pY3JvbnNQZXJVbml0O1xuICAgIGlmICghdGhpcy5ob3N0IHx8ICFtaWNyb25zUGVyVW5pdCB8fCBtaWNyb25zUGVyVW5pdCA8PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICBjb25zdCBjYW0gPSB2aWV3ZXIuY2FtZXJhM2Q7XG4gICAgY29uc3Qgc2hpbTogU2NhbGVCYXJDYW1lcmEgPSB7XG4gICAgICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBoID0gY2FudmFzPy5jbGllbnRIZWlnaHQgfHwgY2FudmFzPy5oZWlnaHQgfHwgMDtcbiAgICAgICAgY29uc3Qgd29ybGRQZXJQeCA9ICgyICogY2FtLmRpc3RhbmNlICogTWF0aC50YW4oY2FtLmZvdiAvIDIpKSAvIChoIHx8IDEpO1xuICAgICAgICByZXR1cm4gd29ybGRQZXJQeCA+IDAgPyAxIC8gd29ybGRQZXJQeCA6IDA7XG4gICAgICB9LFxuICAgICAgY2hhbmdlZDogY2FtLmNoYW5nZWQsXG4gICAgfTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE5hcGFyaVNjYWxlQmFyKHRoaXMuaG9zdCwgc2hpbSwgbWljcm9uc1BlclVuaXQpO1xuICB9XG5cbiAgLyoqIEJhc2UgbWFya2VyIGRpYW1ldGVyIGZvciB0aGUgM0QgY2xvdWQsIGluIFNDUkVFTiBwaXhlbHMgKHRoZSBsYXllcidzIHVuaXQpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMXzNEX0JBU0VfU0laRSA9IDM7XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgM0QgcG9pbnQgY2xvdWQgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzM2QoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW47XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2FsYXIgZW5jb2RpbmcgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZSwgZm9yIHRoZSBzYW1lIHJlYXNvblxuICAgIC8vIHRoZSAyRCBwYXRoIGRvZXM6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZSBzdXBlcnNlZGVkLCBhbmQgZHJvcHBpbmcgdGhlXG4gICAgLy8gbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoZGF0YXNldCkge1xuICAgICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nKys7XG4gICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICB0cnkge1xuICAgICAgICBlbmMgPSBhd2FpdCB0aGlzLnNwYXRpYWxTY2FsYXIzZChkYXRhc2V0LCB2aWV3KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHNwYXRpYWwgM0QgY29sb3VyaW5nIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIGEgZmxhdCBjb2xvdXInLCBlcnIpO1xuICAgICAgICBlbmMgPSBudWxsO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nLS07XG4gICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2JzID0gZGF0YXNldD8ub2JzZXJ2YXRpb25zO1xuICAgIC8vIE5vIHogbWVhbnMgbm90aGluZyB0byBkcmF3IGluIDNELiBUaGUgcGxvdCB0eXBlIGlzIGdhdGVkIG9uIGByZXF1aXJlc1NwYXRpYWwzZGBcbiAgICAvLyBzbyB0aGlzIHNob3VsZCBiZSB1bnJlYWNoYWJsZSBmcm9tIHRoZSBVSSwgYnV0IGEgaG9zdCBjYW4gc2V0IHRoZSB0eXBlIGRpcmVjdGx5LlxuICAgIGlmICghZGF0YXNldCB8fCAhb2JzIHx8IG9icy5jb3VudCA9PT0gMCB8fCAhb2JzLnopIHtcbiAgICAgIHRoaXMucmVtb3ZlU3BhdGlhbDNkTGF5ZXJzKHZpZXdlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQW5hdG9teSBmaXJzdDogb24gYSBzY2VuZSdzIEZJUlNUIGxheWVyIG5hcGFyaSBmcmFtZXMgdGhlIG9yYml0IGNhbWVyYSwgYW5kXG4gICAgLy8gdGhlIHJlZmVyZW5jZSB2b2x1bWUgaXMgdGhlIGZyYW1pbmcgd2Ugd2FudCDigJQgdGhlIGJyYWluLCBub3QgdGhlIG91dGVybW9zdFxuICAgIC8vIHN0cmF5IHNlZ21lbnRhdGlvbi4gRXZlcnkgbGF0ZXIgYWRkIGtlZXBzIHRoZSBwb3NlIGluc3RlYWQgKG5hcGFyaS1qcyBgZml0M2Q6ICdvbmNlJ2ApLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3BhdGlhbFZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBjbHVzdGVyIGRlbnNpdHkgdm9sdW1lcywgd2hpY2ggY2FuIHNldCB0aGUgY2VudHJpbmcgb2Zmc2V0IHdoZW5cbiAgICAvLyB0aGVyZSBpcyBubyByZWZlcmVuY2Ugdm9sdW1lIOKAlCBzbyBiZWZvcmUgYW55IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20gaXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEZW5zaXR5Vm9sdW1lcyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIC8vIFRoZW4gdGhlIGdlbmUgbWFwLCB3aGljaCBzaGFyZXMgdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBsYXR0aWNlIOKAlCBzbyBpdCBnb2VzXG4gICAgLy8gYWZ0ZXIgYW55dGhpbmcgdGhhdCBjYW4gc3RpbGwgbW92ZSB0aGUgY2VudHJpbmcgb2Zmc2V0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlR2VuZU1hcFZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIC8vIFNjYWxlIGRlcGVuZHMgb24gdGhlIGRhdGFzZXQncyBkZWNsYXJlZCB1bml0LCBzbyBpdCB3YWl0cyBmb3IgdGhlIGRhdGFzZXRcbiAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBzZXQgdXAgYXQgbW91bnQgdGltZS5cbiAgICBpZiAoZGF0YXNldC5pZCAhPT0gdGhpcy5zcGF0aWFsU2NhbGVCYXJLZXkpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFNjYWxlQmFyS2V5ID0gZGF0YXNldC5pZDtcbiAgICAgIHRoaXMuaW5zdGFsbFNwYXRpYWwzZFNjYWxlQmFyKHZpZXdlciwgZGF0YXNldCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlZmVyZW5jZSB2b2x1bWUgaXMgaGlkZGVuLCBub3QgcmVtb3ZlZDogaXQgYWxzbyBmaXhlcyB0aGUgY2VudHJpbmdcbiAgICAvLyBvZmZzZXQgZXZlcnkgcG9zaXRpb24gaXMgY29tcHV0ZWQgZnJvbSwgYW5kIHJlLWZldGNoaW5nIGEgMTAwIE1CIHRlbXBsYXRlXG4gICAgLy8gdG8gdW4taGlkZSBpdCB3b3VsZCBtYWtlIGEgY2hlY2tib3ggZmVlbCBsaWtlIGEgbG9hZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsVm9sdW1lKSB7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUudmlzaWJsZSA9IHZpZXcuc2hvd1ZvbHVtZTtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZS5vcGFjaXR5ID0gdmlldy52b2x1bWVPcGFjaXR5O1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfM0RfQkFTRV9TSVpFICogc2NhbGU7XG4gICAgY29uc3Qgc2NhbGFycyA9IGVuYz8udmFsdWVzID8/IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50KTtcbiAgICBjb25zdCBjb2xvcm1hcCA9IGVuYz8uY29sb3JtYXAgPz8gdGhpcy5zcGF0aWFsRmxhdENvbG9ybWFwKCk7XG4gICAgY29uc3QgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl0gPSBlbmM/LmNvbnRyYXN0TGltaXRzID8/IFswLCAxXTtcblxuICAgIC8vIE9uZSBpbWFnZWQgc2VjdGlvbiwgb3IgdGhlIHdob2xlIHN0YWNrLiBUaGUgc3Vic2V0IElTIHRoZSBnZW9tZXRyeSwgc28gaXRcbiAgICAvLyBiZWxvbmdzIGluIHRoZSBnZW9tZXRyeSBrZXkgcmF0aGVyIHRoYW4gYmVpbmcgcmUtZGVyaXZlZCBwZXIgZnJhbWUg4oCUIGFuZCBhblxuICAgIC8vIG91dC1vZi1yYW5nZSBpbmRleCBpcyBjbGFtcGVkIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjbG91ZCwgYmVjYXVzZSB0aGVcbiAgICAvLyBzZWN0aW9uIGNvdW50IGNoYW5nZXMgd2l0aCB0aGUgZGF0YXNldCB3aGlsZSB0aGUgdmlldyBzdGF0ZSBwZXJzaXN0cy5cbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgICBjb25zdCBzZWN0aW9uID1cbiAgICAgIHZpZXcucG9pbnRTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcucG9pbnRTZWN0aW9uKSldXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBzaG93biA9IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogbnVsbDtcbiAgICBjb25zdCBzaG93bkNvdW50ID0gc2hvd24gPyBzaG93bi5sZW5ndGggOiBvYnMuY291bnQ7XG5cbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzZWN0aW9uID8/ICdhbGwnfWA7XG4gICAgLy8gYFBvaW50czNETGF5ZXIudmFsdWVzYCBpcyByZWFkb25seSBhbmQgdGhlIGxheWVyIGV4cG9zZXMgbm8gZGF0YVZlcnNpb24gdG9cbiAgICAvLyBidW1wLCBzbyB1bmxpa2UgdGhlIDJEIHBhdGggYSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSBjYW5ub3QgYmUgbXV0YXRlZCBpblxuICAgIC8vIOKAlCB0aGUgbGF5ZXIgaGFzIHRvIGJlIHJlYnVpbHQuIE9ubHkgdGhlIHNpemUvb3BhY2l0eS9jb2xvcm1hcCBrbm9icyBhcmVcbiAgICAvLyBnZW51aW5lbHkgZGlzcGxheS1vbmx5LiBTbyB0cmFjayB0aGUgc2NhbGFycycgaWRlbnRpdHkgc2VwYXJhdGVseSBmcm9tIHRoZVxuICAgIC8vIGdlb21ldHJ5J3M6IGBjb2xvckJ5YCBwbHVzIHRoZSB0cmFuc2Zvcm1zIGZlZWRpbmcgdGhlIGVuY29kaW5nLlxuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBzY2FsYXJLZXkgPSBbXG4gICAgICBrZXksXG4gICAgICB2aWV3LmNvbG9yQnkgPyBgJHt2aWV3LmNvbG9yQnkua2luZH06JHt2aWV3LmNvbG9yQnkubmFtZX1gIDogJ2ZsYXQnLFxuICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICBjbGlwLmpvaW4oJywnKSxcbiAgICBdLmpvaW4oJ3wnKTtcblxuICAgIGlmIChrZXkgIT09IHRoaXMuc3BhdGlhbExheWVyS2V5M2QpIHtcbiAgICAgIC8vIE5ldyBnZW9tZXRyeTogaW50ZXJsZWF2ZSB4LHkseiAodGhlIGxheWVyJ3MgZG9jdW1lbnRlZCBsYXlvdXQsIHgtZmFzdGVzdClcbiAgICAgIC8vIGFuZCBjYWNoZSBpdCwgc28gbGF0ZXIgY29sb3VyIGNoYW5nZXMgcmVidWlsZCB0aGUgbGF5ZXIgd2l0aG91dCB3YWxraW5nXG4gICAgICAvLyB0aGUgb2JzZXJ2YXRpb25zIGFnYWluLlxuICAgICAgY29uc3QgW294LCBveSwgb3pdID0gdGhpcy5zcGF0aWFsT3JpZ2luM2Q7XG4gICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQgKiAzKTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2hvd25Db3VudDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgICAgcG9zaXRpb25zW2sgKiAzXSA9IG9icy54W2ldICsgb3g7XG4gICAgICAgIHBvc2l0aW9uc1trICogMyArIDFdID0gb2JzLnlbaV0gKyBveTtcbiAgICAgICAgcG9zaXRpb25zW2sgKiAzICsgMl0gPSBvYnMueltpXSArIG96O1xuICAgICAgfVxuICAgICAgdGhpcy5zcGF0aWFsUG9zaXRpb25zM2QgPSBwb3NpdGlvbnM7XG4gICAgICB0aGlzLnNwYXRpYWxEcmF3bjNkID0gc2hvd247XG4gICAgfVxuXG4gICAgLy8gVGhlIHNjYWxhcnMgaGF2ZSB0byBmb2xsb3cgdGhlIGdlb21ldHJ5OiBhIHBlci1vYnNlcnZhdGlvbiB2ZWN0b3IgYWdhaW5zdCBvbmVcbiAgICAvLyBzZWN0aW9uJ3MgcG9zaXRpb25zIHdvdWxkIGNvbG91ciBlYWNoIGNlbGwgYnkgYSBzdHJhbmdlcidzIHZhbHVlLlxuICAgIGNvbnN0IHZhbHVlc0ZvciA9ICgpID0+IChzaG93biA/IEZsb2F0MzJBcnJheS5mcm9tKHNob3duLCAoaSkgPT4gc2NhbGFyc1tpXSkgOiBzY2FsYXJzKTtcblxuICAgIGlmICghdGhpcy5zcGF0aWFsUG9pbnRzM2QgfHwga2V5ICE9PSB0aGlzLnNwYXRpYWxMYXllcktleTNkKSB7XG4gICAgICAvLyBOZXcgR0VPTUVUUlkg4oCUIGEgZGlmZmVyZW50IGRhdGFzZXQsIG9yIGEgZGlmZmVyZW50IHNlY3Rpb24g4oCUIHNvIGEgbmV3IGxheWVyLlxuICAgICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50czNkKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMzZCk7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0ga2V5O1xuICAgICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBzY2FsYXJLZXk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IHZpZXdlci5hZGRQb2ludHMzRCh0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCEsIHZhbHVlc0ZvcigpLCB7XG4gICAgICAgIG5hbWU6ICdvYnNlcnZhdGlvbnMnLFxuICAgICAgICBjb2xvcm1hcCxcbiAgICAgICAgY29udHJhc3RMaW1pdHMsXG4gICAgICAgIHNpemUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNjYWxhcktleSAhPT0gdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QpIHtcbiAgICAgICAgLy8gQSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSwgd2hpY2ggdXNlZCB0byBtZWFuIGRpc2NhcmRpbmcgdGhlIGxheWVyIGFuZCBidWlsZGluZ1xuICAgICAgICAvLyBhbm90aGVyIOKAlCBhbmQsIGJlY2F1c2UgYWRkaW5nIGEgM0QgbGF5ZXIgcmVmcmFtZXMsIGEgY2FtZXJhIGp1bXAgdG8gdW5kbyBhcyB3ZWxsLlxuICAgICAgICAvLyBuYXBhcmktanMg4omlIDAuMTQgbGV0cyB0aGUgc2NhbGFycyBiZSByZXBsYWNlZCBpbiBwbGFjZSDigJQgdGhlIHNldHRlciBidW1wcyB0aGVcbiAgICAgICAgLy8gbGF5ZXIncyBkYXRhVmVyc2lvbiBzbyB0aGUgdmlzdWFsIHJlLXVwbG9hZHMg4oCUIGFuZCB0aGUgcG9zaXRpb25zIGhhdmUgbm90IG1vdmVkLFxuICAgICAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIGZvciB0aGUgY2FtZXJhIHRvIHJlZnJhbWUuXG4gICAgICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gc2NhbGFyS2V5O1xuICAgICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC52YWx1ZXMgPSB2YWx1ZXNGb3IoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLmNvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC5jb250cmFzdExpbWl0cyA9IGNvbnRyYXN0TGltaXRzO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2Quc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLy8gU2VsZWN0aW9uIGlzIGEgUEVSLVBPSU5UIGFscGhhLCBpbiB0aGUgb25lIGxheWVyLlxuICAgIC8vXG4gICAgLy8gSXQgdXNlZCB0byBiZSBhIHNlY29uZCBsYXllcjogd2l0aCBhIHNpbmdsZSBvcGFjaXR5IGZvciB0aGUgd2hvbGUgY2xvdWQsIHRoZSBvbmx5IHdheVxuICAgIC8vIHRvIGhpZ2hsaWdodCBhIHN1YnNldCB3YXMgdG8gZHJhdyBpdCBhZ2FpbiBvbiB0b3AgYXQgZnVsbCBvcGFjaXR5IHdoaWxlIHRoZSBwYXJlbnRcbiAgICAvLyBkcm9wcGVkIHRvIHRoZSBtdXRlZCBsZXZlbC4gVGhhdCBzZWNvbmQgbGF5ZXIgaGFkIHRvIGJlIGtlcHQgaW4gc3RlcCB0aHJvdWdoIGV2ZXJ5XG4gICAgLy8gY29sb3JtYXAsIHdpbmRvdyBhbmQgc2l6ZSBjaGFuZ2UsIGFuZCB0aGUgdHdvIHRoZW4gZGVwdGgtc29ydGVkIGFnYWluc3QgZWFjaCBvdGhlciBhc1xuICAgIC8vIHNlcGFyYXRlIGRyYXdzLiBQZXItcG9pbnQgYWxwaGFzIGFuZCBzaXplcyBnaXZlIHRoZSBzYW1lIHJlYWRpbmcg4oCUIG11dGVkIGNsb3VkLCBicmlnaHRcbiAgICAvLyBzZWxlY3Rpb24sIHNsaWdodGx5IGxhcmdlciBzbyBhIHNtYWxsIG9uZSBpcyBmaW5kYWJsZSBpbnNpZGUgMy43TSBwb2ludHMg4oCUIGluIG9uZS5cbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwICYmIHNlbGVjdGlvbi5tYXNrLmxlbmd0aCA9PT0gb2JzLmNvdW50O1xuICAgIGNvbnN0IGNsb3VkID0gdGhpcy5zcGF0aWFsUG9pbnRzM2Q7XG4gICAgaWYgKGNsb3VkKSB7XG4gICAgICBjbG91ZC5vcGFjaXR5ID0gdmlldy5vcGFjaXR5O1xuICAgICAgaWYgKCFoYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgY2xvdWQuYWxwaGFzID0gbnVsbDtcbiAgICAgICAgY2xvdWQuc2l6ZXMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYWxwaGFzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNob3duQ291bnQ7IGsrKykge1xuICAgICAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgICAgICBjb25zdCBwaWNrZWQgPSAhIXNlbGVjdGlvbi5tYXNrW2ldO1xuICAgICAgICAgIGFscGhhc1trXSA9IHBpY2tlZCA/IDEgOiBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gICAgICAgICAgc2l6ZXNba10gPSBwaWNrZWQgPyBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgOiAxO1xuICAgICAgICB9XG4gICAgICAgIGNsb3VkLmFscGhhcyA9IGFscGhhcztcbiAgICAgICAgY2xvdWQuc2l6ZXMgPSBzaXplcztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTGFzdCwgc28gaXQgYWxzbyBjb3ZlcnMgYSBsYXllciB0aGlzIHBhc3MganVzdCBjcmVhdGVkLlxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMzZCkgdGhpcy5zcGF0aWFsUG9pbnRzM2QudmlzaWJsZSA9IHZpZXcuc2hvd1BvaW50cztcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAqKjNEIGdlbmUgbWFwKio6IHRoZSBhY3RpdmUgZ2VuZSdzIGV4cHJlc3Npb24gb3ZlciB0aGUgd2hvbGUgc2VjdGlvbmVkXG4gICAqIHNwZWNpbWVuLCBhcyBvbmUgcmF5bWFyY2hlZCB2b2x1bWUuXG4gICAqXG4gICAqIFR3byB0aGluZ3MgaXQgY2FuIGJlLCBhbmQgdGhlIHBhbmVsJ3MgYFZvbHVtZSByZW5kZXJpbmdgIHRvZ2dsZSBwaWNrcyB3aGljaDpcbiAgICpcbiAgICogIC0gKipzaGVldHMqKiDigJQgZXhhY3RseSB0aGUgcGxhbmVzIHRoYXQgd2VyZSBpbWFnZWQsIGVhY2ggY2FycnlpbmcgdGhhdFxuICAgKiAgICBzbGlkZSdzIG93biAyRCBnZW5lIG1hcCwgd2l0aCB0aGUgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIGVtcHR5LiBBIHN0YWNrIG9mXG4gICAqICAgIG1lYXN1cmVkIGZpZWxkcywgYXQgdGhlaXIgdHJ1ZSB6LlxuICAgKiAgLSAqKnZvbHVtZSoqIOKAlCB0aGUgc2FtZSBmaWVsZHMgc21vb3RoZWQgYWxvbmcgeiwgc28gdGhlIHBsYW5lcyBiZXR3ZWVuIHRoZVxuICAgKiAgICBzZWN0aW9ucyBjYXJyeSBhbiBpbnRlcnBvbGF0ZWQgdmFsdWUuIEFuIGVzdGltYXRlLCBhbmQgZHJhd24gYXMgYVxuICAgKiAgICB0cmFuc2x1Y2VudCBjbG91ZCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBkZW5zaXR5IHZvbHVtZXMgYXJlLlxuICAgKlxuICAgKiBPbmUgYFZvbHVtZUxheWVyYCByYXRoZXIgdGhhbiBhIHRleHR1cmVkIHF1YWQgcGVyIHNlY3Rpb246IGFuIGBJbWFnZUxheWVyYFxuICAgKiByZW5kZXJzIG9ubHkgYXQgYG5kaXNwbGF5ID09PSAyYCwgc28gNTMgc2hlZXRzIGluIHRoZSBvcmJpdCB2aWV3IHdvdWxkIG5lZWQgYVxuICAgKiBuZXcgbGF5ZXIgdHlwZSB1cHN0cmVhbSDigJQgd2hpbGUgYSBzY2FsYXIgdm9sdW1lIHdob3NlIHogc2FtcGxpbmcgYWxyZWFkeSBJU1xuICAgKiB0aGUgc2VjdGlvbiBzcGFjaW5nIGV4cHJlc3NlcyB0aGUgc2hlZXRzIGV4YWN0bHksIGFuZCB0aGUgc2FtZSBsYXR0aWNlIHRoZW5cbiAgICogZ2l2ZXMgdGhlIGludGVycG9sYXRlZCB2ZXJzaW9uIGZvciBmcmVlLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBvd24gbGF0dGljZSAoYGRlbnNpdHlHcmlkYCBhdCBzdHJpZGUgMSksXG4gICAqIHNvIHRoZSBmaWVsZCBsYW5kcyB2b3hlbC1mb3Itdm94ZWwgb24gdGhlIGFuYXRvbXkgYW5kIG5lZWRzIG5vIG9mZnNldCDigJQgYVxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGUsIGFuZCBuYXBhcmkgY2VudHJlcyBib3RoIGJveGVzIG9uIHRoZSB3b3JsZFxuICAgKiBvcmlnaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUdlbmVNYXBWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgdm9sdW1lIGJ1aWx0IGZyb20gT05FIHNlY3Rpb24gd291bGQgc21lYXIgdGhhdCBzbGlkZSB0aHJvdWdoIHRoZSB3aG9sZVxuICAgIC8vIGRlcHRoLCBzbyB0aGUgc2VjdGlvbiByZXN0cmljdGlvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHNoZWV0cy5cbiAgICBjb25zdCBpbnRlcnBvbGF0ZSA9ICEhdmlldy5nZW5lTWFwVm9sdW1lO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICAgIGNvbnN0IHNlY3Rpb24gPVxuICAgICAgIWludGVycG9sYXRlICYmIHZpZXcuZ2VuZU1hcFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5nZW5lTWFwU2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGdlbmVcbiAgICAgID8gW1xuICAgICAgICBkYXRhc2V0LmlkLCBnZW5lLCBzbW9vdGhpbmcsIHNlY3Rpb24gPz8gJ2FsbCcsIGludGVycG9sYXRlID8gJ3ZvbCcgOiAnc2hlZXRzJyxcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICBmaWVsZEtleSwgY2xpcC5qb2luKCcsJyksIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLCB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICB0aGlzLmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwVm9sdW1lS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0ga2V5O1xuICAgIGlmICgha2V5IHx8ICFnZW5lIHx8ICFwb3J0KSB7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZCA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29hcnNlbmVkIGluLXBsYW5lIGJ1dCBOT1QgYWxvbmcgejogdGhlIHNoZWV0cyBuZWVkIG9uZSBwbGFuZSBwZXIgaW1hZ2VkXG4gICAgLy8gc2VjdGlvbiwgd2hpbGUgdGhlIGZpZWxkIHRoZXkgY2FycnkgaXMgc21vb3RoIGJ5IGNvbnN0cnVjdGlvbiBhbmQgZ2FpbnNcbiAgICAvLyBub3RoaW5nIGZyb20gdGhlIHRlbXBsYXRlJ3MgNDAgwrVtIGRldGFpbC4gQXQgZnVsbCByZXNvbHV0aW9uIHRoZSBlc3RpbWF0ZSBpc1xuICAgIC8vIGEgNS43TS12b3hlbCBwYWlyIG9mIGJsdXJzIG9uIHRoZSBtYWluIHRocmVhZCDigJQgc2Vjb25kcyBvZiBmcm96ZW4gVUkgZm9yIGFcbiAgICAvLyBjaGVja2JveDsgYW4gZWlnaHRoIG9mIHRoZSB2b3hlbHMgaXMgYW4gZWlnaHRoIG9mIHRoZSB3b3JrLlxuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0LCBHRU5FX01BUF9WT0xVTUVfU1RSSURFLCAxMjgsIDEpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSkge1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gM0QgZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgLy8gSW4tcGxhbmUgYmFuZHdpZHRoIGlzIHRoZSAyRCBtYXAncywgaW4gdGhpcyBsYXR0aWNlJ3MgdW5pdHMsIHNvIGEgc2hlZXRcbiAgICAgIC8vIGFuZCB0aGUgMkQgdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZC4gQWxvbmcgeiBpdCBpcyB0aGVcbiAgICAgIC8vIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHMg4oCUIHRoZSBzbWFsbGVzdCDPgyB0aGF0IGJyaWRnZXMgb25lIHNlY3Rpb24gZ2FwLlxuICAgICAgLy8gSW4tcGxhbmUgz4MgaXMgYSBQSFlTSUNBTCBiYW5kd2lkdGgsIGFuY2hvcmVkIHRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duXG4gICAgICAvLyB2b3hlbCDigJQgdGhlIHJlc29sdXRpb24gdGhlIDJEIG1hcCBlc3RpbWF0ZXMgYXQg4oCUIHNvIGEgc2hlZXQgYW5kIHRoZSAyRFxuICAgICAgLy8gdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZCB3aGF0ZXZlciBsYXR0aWNlIHRoaXMgaXNcbiAgICAgIC8vIHJhc3RlcmlzZWQgb24uIEFsb25nIHogaXQgaXMgdGhlIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHM6IHRoZSBzbWFsbGVzdCDPg1xuICAgICAgLy8gdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIGNvbnN0IGluUGxhbmUgPSBkYXRhc2V0LnZvbHVtZT8udm94ZWxTaXplID8/IGdyaWQudm94ZWxTaXplO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBleHByZXNzaW9uVm9sdW1lKG9icywgZ3JpZCwge1xuICAgICAgICBzaWdtYTogW1xuICAgICAgICAgIGluUGxhbmVbMF0gKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICBpblBsYW5lWzFdICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgICAgIF0sXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgaW5kaWNlczogc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBpblNlbGVjdGlvbixcbiAgICAgICAgaW50ZXJwb2xhdGUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5ID0gZmllbGRLZXk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQ7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgW2xvLCBoaV0gPSBjb250cmFzdFdpbmRvdyhmaWVsZC5tZWFuLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRXhwcmVzc2lvblZvbHVtZShmaWVsZCwgW2xvLCBoaV0sIHsgbG9nOiB2aWV3LmxvZ1NjYWxlIH0pO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIgPSB2aWV3ZXIuYWRkVm9sdW1lKFxuICAgICAgZGF0YSwgZmllbGQud2lkdGgsIGZpZWxkLmhlaWdodCwgZmllbGQuZGVwdGgsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9JHtpbnRlcnBvbGF0ZSA/ICcgwrcgdm9sdW1lJyA6ICcnfWAsXG4gICAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoYGdlbmUtbWFwLSR7Z2VuZX1gLCBsdXQpLFxuICAgICAgICAvLyBUaGUgZW5jb2RpbmcgYWxyZWFkeSBhcHBsaWVkIHRoZSB3aW5kb3csIHNvIHRoZSBsYXllciBtdXN0IG5vdCBhcHBseSBhXG4gICAgICAgIC8vIHNlY29uZCBvbmU6IDAuLjI1NSBpcyB0aGUgd2hvbGUgb2Ygd2hhdCBpdCB3YXMgZ2l2ZW4uXG4gICAgICAgIGNvbnRyYXN0TGltaXRzOiBbMCwgMjU1XSxcbiAgICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgICAvLyBBZGRpdGl2ZSBsaWtlIHRoZSBkZW5zaXR5IHZvbHVtZXMsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiB0aGUgc2hlZXRzXG4gICAgICAgIC8vIGhhdmUgdG8gcmVhZCBUSFJPVUdIIGVhY2ggb3RoZXIgYW5kIHRocm91Z2ggdGhlIGFuYXRvbXksIHdoaWNoIGFcbiAgICAgICAgLy8gdHJhbnNsdWNlbnQgYmxlbmQgd291bGQgb2NjbHVkZSBvbmUgc2hlZXQgYXQgYSB0aW1lLlxuICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzOiBlYWNoIGNsdXN0ZXIgcmFzdGVyaXNlZCBpbnRvIGEgc21vb3RoIHNjYWxhciBmaWVsZCBhbmRcbiAgICogcmF5bWFyY2hlZCBhbG9uZ3NpZGUgdGhlIGNsb3VkLCB0aW50ZWQgd2l0aCB0aGUgY2x1c3RlcidzIG93biBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgYSBzZXJpYWxseSBzZWN0aW9uZWQgZGF0YXNldCByZWFkYWJsZSBhcyBhbiBhbmF0b21pY2FsXG4gICAqIGRpc3RyaWJ1dGlvbi4gVGhlIGNsb3VkIHNob3dzIG1lYXN1cmVkIGNlbGxzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIGJ1dCBhdCAyMDAgwrVtXG4gICAqIHNlY3Rpb24gc3BhY2luZyB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgYSBzdGFjayBvZiBkaXNjcyBpbnRvIGEgc2hhcGUsIGFuZFxuICAgKiBldmVyeSBnYXAgcmVhZHMgYXMgYWJzZW5jZS4gQSBkZW5zaXR5IGZpZWxkIGlzIGEgZGlmZmVyZW50IG9iamVjdCBmcm9tIGEgY2VsbDpcbiAgICogYW4gZXN0aW1hdGUsIGRlZmluZWQgYmV0d2VlbiB0aGUgaW1hZ2VkIHBsYW5lcywgZHJhd24gYXMgYSB0cmFuc2x1Y2VudCBjbG91ZCBzb1xuICAgKiBpdCBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIG1lYXN1cmVtZW50LiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBuZXZlciBpbnRlcnBvbGF0ZWQg4oCUXG4gICAqIGNvbnNlY3V0aXZlIHNlY3Rpb25zIHNhbXBsZSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGVcbiAgICogYWxvbmcuXG4gICAqXG4gICAqIE9uZSB2b2x1bWUgcGVyIGNsdXN0ZXIgcmF0aGVyIHRoYW4gb25lIGZvciBldmVyeXRoaW5nOiBhZGRpdGl2ZSBibGVuZGluZyBpcyB3aGF0XG4gICAqIG1ha2VzIHR3byBjbHVzdGVycycgdGVycml0b3JpZXMgY29tcGFyYWJsZSwgYW5kIGEgc2luZ2xlIGJsZW5kZWQgZmllbGQgd291bGRcbiAgICogYW5zd2VyIG5vIHF1ZXN0aW9uIGFueW9uZSBhc2tzIG9mIGEgdGF4b25vbXkuIENhcHBlZCBhdFxuICAgKiB7QGxpbmsgREVOU0lUWV9NQVhfQ0xVU1RFUlN9IGJ5IGNlbGwgY291bnQuXG4gICAqXG4gICAqIEtleWVkIHNvIGl0IHJlYnVpbGRzIG9ubHkgd2hlbiB0aGUgZmllbGQgd291bGQgYWN0dWFsbHkgZGlmZmVyIOKAlCB0aGUgZGF0YXNldCxcbiAgICogdGhlIGNvbG91ciBjb2x1bW4sIHRoZSBiYW5kd2lkdGgsIG9yIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlbnNpdHlWb2x1bWVzKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbiA9ICEhdmlldy5kZW5zaXR5Vm9sdW1lICYmICEhZGF0YXNldC5vYnNlcnZhdGlvbnMuejtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmRlbnNpdHlTbW9vdGhpbmcgPiAwID8gdmlldy5kZW5zaXR5U21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjb2x1bW4gPSB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIC8vIFRoZSBzZWxlY3Rpb24gZW50ZXJzIHRoZSBrZXkgYnkgSURFTlRJVFksIG5vdCBieSBjb3VudDogdHdvIGRpZmZlcmVudCBST0lzXG4gICAgLy8gaG9sZGluZyB0aGUgc2FtZSBudW1iZXIgb2YgY2VsbHMgd291bGQgb3RoZXJ3aXNlIGxvb2sgbGlrZSB0aGUgc2FtZSBrZXkgYW5kXG4gICAgLy8gbGVhdmUgdGhlIHByZXZpb3VzIFJPSSdzIGZpZWxkcyBvbiBzY3JlZW4uXG4gICAgY29uc3Qga2V5ID0gb25cbiAgICAgID8gW2RhdGFzZXQuaWQsIGNvbHVtbiA/PyAnYWxsJywgc21vb3RoaW5nLCB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmRlbnNpdHlLZXkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5kZW5zaXR5TGF5ZXJzID0gW107XG4gICAgdGhpcy5kZW5zaXR5S2V5ID0ga2V5O1xuICAgIGlmICgha2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgLy8gV2l0aCBubyByZWZlcmVuY2Ugdm9sdW1lIHRoZXJlIGlzIG5vIG9mZnNldCB5ZXQsIGFuZCBhIFZvbHVtZUxheWVyIGhhcyBub1xuICAgIC8vIHRyYW5zbGF0ZSDigJQgbmFwYXJpIGNlbnRyZXMgaXRzIGJveCBvbiB0aGUgd29ybGQgb3JpZ2luLiBTbyB0aGUgUE9JTlRTIG1vdmUgYnlcbiAgICAvLyBoYWxmIHRoZSBkZW5zaXR5IGJveCwgZXhhY3RseSBhcyB0aGV5IGRvIGZvciBhIHJlZmVyZW5jZSB2b2x1bWUsIGFuZCB0aGVcbiAgICAvLyBjYWNoZWQgZ2VvbWV0cnkgaXMgaW52YWxpZGF0ZWQgYmVjYXVzZSB0aGF0IG9mZnNldCBqdXN0IGNoYW5nZWQuXG4gICAgaWYgKCF0aGlzLnNwYXRpYWxWb2x1bWUpIHtcbiAgICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gW1xuICAgICAgICAtKGdyaWQud2lkdGggKiBncmlkLnZveGVsU2l6ZVswXSkgLyAyLFxuICAgICAgICAtKGdyaWQuaGVpZ2h0ICogZ3JpZC52b3hlbFNpemVbMV0pIC8gMixcbiAgICAgICAgLShncmlkLmRlcHRoICogZ3JpZC52b3hlbFNpemVbMl0pIC8gMixcbiAgICAgIF07XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZ3JvdXBzOiB7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZzsgaW5kaWNlcz86IFVpbnQzMkFycmF5IH1bXTtcbiAgICB0cnkge1xuICAgICAgZ3JvdXBzID0gYXdhaXQgdGhpcy5kZW5zaXR5R3JvdXBzKGRhdGFzZXQsIGNvbHVtbiwgc2VsZWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZGVuc2l0eSB2b2x1bWVzOiBjb2x1bW4gdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IHNpZ21hID0gZGVmYXVsdFNpZ21hKGdyaWQsIHNtb290aGluZyk7XG4gICAgLy8gQWRkaXRpdmUgYmxlbmRpbmcgU1VNUywgc28gYSBmaXhlZCBwZXItbGF5ZXIgb3BhY2l0eSBibG93cyBvdXQgdG8gd2hpdGUgYXNcbiAgICAvLyBzb29uIGFzIHNldmVyYWwgYnJvYWQgY2x1c3RlcnMgb3ZlcmxhcCDigJQgc2l4IHN1YmNsYXNzZXMgYXQgMC41NSBlYWNoIHR1cm5lZFxuICAgIC8vIHRoZSBicmFpbiBpbnRvIG9uZSBjeWFuIG1hc3MuIFNwbGl0dGluZyB0aGUgYnVkZ2V0IGtlZXBzIG4gZnVsbHkgb3ZlcmxhcHBpbmdcbiAgICAvLyBwZWFrcyBpbnNpZGUgdGhlIGRpc3BsYXkncyByYW5nZSwgc28gb3ZlcmxhcCByZWFkcyBhcyBvdmVybGFwOyBhIHNpbmdsZVxuICAgIC8vIGNsdXN0ZXIgc3RpbGwgZ2V0cyB0aGUgZnVsbCAwLjU1LiBJdCBvbmx5IG1pdGlnYXRlczogYSB0cmFuc2x1Y2VudCByYXltYXJjaFxuICAgIC8vIGludGVncmF0ZXMgYWxvbmcgdGhlIHJheSwgc28gY2x1c3RlcnMgdGhhdCBhcmUgdWJpcXVpdG91cyByYXRoZXIgdGhhblxuICAgIC8vIHJlZ2lvbmFsICh0aGUgbGFyZ2VzdCBzdWJjbGFzc2VzIGFyZSBnbGlhLCB3aGljaCBhcmUgZXZlcnl3aGVyZSkgc3RpbGwgcGlsZVxuICAgIC8vIHVwLCBhbmQgb25lIGNsdXN0ZXIgYXQgYSB0aW1lIGlzIHRoZSByZWFkYWJsZSB3YXkgdG8gbG9vayBhdCB0aG9zZS5cbiAgICBjb25zdCBvcGFjaXR5ID0gTWF0aC5taW4oMC41NSwgMC45IC8gTWF0aC5tYXgoMSwgZ3JvdXBzLmxlbmd0aCkpO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmFzdGVyaXplRGVuc2l0eShkYXRhc2V0Lm9ic2VydmF0aW9ucywgZ3JpZCwgeyBzaWdtYSwgaW5kaWNlczogZ3JvdXAuaW5kaWNlcyB9KTtcbiAgICAgIC8vIEEgY2x1c3RlciB3aXRoIG5vdGhpbmcgb24gdGhlIGdyaWQgZHJhd3Mgbm8gbGF5ZXIsIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJveC5cbiAgICAgIGlmICghZGF0YSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmRlbnNpdHlLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgdGhpcy5kZW5zaXR5TGF5ZXJzLnB1c2goXG4gICAgICAgIChcbiAgICAgICAgICB2aWV3ZXIuYWRkVm9sdW1lKGRhdGEsIGdyaWQud2lkdGgsIGdyaWQuaGVpZ2h0LCBncmlkLmRlcHRoLCB7XG4gICAgICAgICAgICBuYW1lOiBgZGVuc2l0eSDCtyAke2dyb3VwLm5hbWV9YCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoZ3JvdXAuY29sb3IpLFxuICAgICAgICAgICAgLy8gVHJhbnNsdWNlbnQsIG5vdCBNSVA6IGEgY2x1c3RlcidzIGludGVyaW9yIGlzIHRoZSByZWFkYWJsZSBwYXJ0LCBhbmQgTUlQXG4gICAgICAgICAgICAvLyB3b3VsZCBmbGF0dGVuIGV2ZXJ5IGNsb3VkIHRvIGl0cyBicmlnaHRlc3Qgc2hlbGwuXG4gICAgICAgICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgICAgLy8gQWRkaXRpdmUsIHNvIHR3byBjbHVzdGVycyBvdmVybGFwcGluZyByZWFkIGFzIGJvdGggYmVpbmcgdGhlcmUgaW5zdGVhZFxuICAgICAgICAgICAgLy8gb2YgdGhlIG5lYXJlciBvbmUgaGlkaW5nIHRoZSBvdGhlci5cbiAgICAgICAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICAgICAgICB9KSksXG4gICAgICApO1xuICAgIH1cbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aXR5IG9mIHRoZSBjb2xvdXIgc2NhbGUgYSBjb250aW51b3VzIHNwYXRpYWwgbGF5ZXIgd2lsbCBkcmF3IHdpdGgsIGZvciBhXG4gICAqIGNhY2hlIGtleTogdGhlIGV4cGxpY2l0IGNob2ljZSwgb3IgZWxzZSB0aGUgZGlzcGxheSBjb2xvcm1hcCBhbmQgaXRzIHJldmVyc2VcbiAgICogZmxhZywgc2luY2UgdGhhdCBpcyB3aGF0IHtAbGluayBzcGF0aWFsQ29udGludW91c0x1dH0gZmFsbHMgYmFjayB0by5cbiAgICpcbiAgICogVGhlIGdlbmUgbWFwcyBjYWNoZSB0aGVpciBjb2xvdXJlZCBvdXRwdXQsIHNvIHdpdGhvdXQgdGhpcyBpbiB0aGUga2V5IGEgY2hhbmdlXG4gICAqIG9mIGNvbG91ciBzY2FsZSBsZWZ0IHRoZSBmaWVsZCBvbiBzY3JlZW4gaW4gdGhlIHByZXZpb3VzIGNvbG91cnMg4oCUIHRoZSBtYXJrZXJzXG4gICAqIHJlY29sb3VyZWQgYW5kIHRoZSBtYXAgdW5kZXIgdGhlbSBkaWQgbm90LlxuICAgKi9cbiAgcHJpdmF0ZSBjb250aW51b3VzQ29sb3JtYXBLZXkodmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNvbG9ybWFwSWQodmlldy5jb250aW51b3VzQ29sb3JtYXApLFxuICAgICAgY29sb3JtYXBJZChub2RlPy5kYXRhPy52YWx1ZSksXG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID8gJ3JldicgOiAnJyxcbiAgICBdLmpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHJldmlzaW9uIG51bWJlciBmb3IgYSBzZWxlY3Rpb24gb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgc3RvcmUgaGFuZHMgb3V0IGEgTkVXIG1hc2sgb2JqZWN0IHBlciBjaGFuZ2UsIHNvIG9iamVjdCBpZGVudGl0eSBpcyB0aGVcbiAgICogY2hlYXAgYW5kIGV4YWN0IHdheSB0byB0ZWxsIHR3byBzZWxlY3Rpb25zIGFwYXJ0IOKAlCBhIGZpbmdlcnByaW50IG92ZXIgMy43TVxuICAgKiBtYXNrIGJ5dGVzIHdvdWxkIGJlIG5laXRoZXIuIENvdW50aW5nIHJldmlzaW9ucyBrZWVwcyB0aGUgY2FjaGUga2V5IGEgc2hvcnRcbiAgICogc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXYoc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IG51bWJlciB7XG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdGhpcy5sYXN0U2VsZWN0aW9uU2Vlbikge1xuICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uU2VlbiA9IHNlbGVjdGlvbjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uUmV2aXNpb24rKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uUmV2aXNpb247XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsdXN0ZXJzIHRvIHJhc3RlcmlzZTogdGhlIGNhdGVnb3JpZXMgb2YgdGhlIGFjdGl2ZSBjYXRlZ29yaWNhbCBjb2xvdXJpbmcsXG4gICAqIGJpZ2dlc3QgZmlyc3QgYW5kIGNhcHBlZCwgZWFjaCB3aXRoIGl0cyBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBSZXN0cmljdGVkIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aGVuIHRoZXJlIGlzIG9uZSwgc28gXCJzZWxlY3QgYSByZWdpb24sXG4gICAqIGNoZWNrIHRoZSBib3hcIiBhbnN3ZXJzIHdoaWNoIGNsdXN0ZXJzIGxpdmUgdGhlcmUuIFdpdGggbm8gY2F0ZWdvcmljYWwgY29sb3VyaW5nXG4gICAqIHRoZXJlIGlzIG9uZSBncm91cCDigJQgdG90YWwgY2VsbCBkZW5zaXR5LCB3aGljaCBpcyBhIHJlYWwgcXVlc3Rpb24gb24gaXRzIG93blxuICAgKiAoXCJ3aGVyZSBpcyB0aGUgdGlzc3VlIGRlbnNlP1wiKSBhbmQgdGhlIGhvbmVzdCB0aGluZyB0byBzaG93IHdoZW4gdGhlIHZpZXcgaXNcbiAgICogbm90IGVuY29kaW5nIGEgdGF4b25vbXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbnNpdHlHcm91cHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIGNvbHVtbjogc3RyaW5nIHwgbnVsbCwgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZzsgaW5kaWNlcz86IFVpbnQzMkFycmF5IH1bXT4ge1xuICAgIGNvbnN0IG4gPSBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudDtcbiAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBzZWxlY3Rpb24ubWFzayA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgbWV0YSA9IGNvbHVtbiA/IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIGNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2x1bW4gfHwgIW1ldGEgfHwgbWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICBjb25zdCBpbmRpY2VzID0gaW5TZWxlY3Rpb24gPyBtYXNrVG9JbmRpY2VzKGluU2VsZWN0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIGNvbnN0IGhleCA9IGAjJHtbciwgZywgYl0ubWFwKChjKSA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKX1gO1xuICAgICAgcmV0dXJuIFt7IG5hbWU6IGluU2VsZWN0aW9uID8gJ3NlbGVjdGVkIGNlbGxzJyA6ICdhbGwgY2VsbHMnLCBjb2xvcjogaGV4LCBpbmRpY2VzIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHJldHVybiBbXTtcbiAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMobG9hZGVkLm1ldGEpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShsb2FkZWQubWV0YS5jYXRlZ29yaWVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY29kZSA9IGxvYWRlZC5jb2Rlc1tpXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBjb2RlIDwgY291bnRzLmxlbmd0aCkgY291bnRzW2NvZGVdKys7XG4gICAgfVxuICAgIGNvbnN0IHJhbmtlZCA9IEFycmF5LmZyb20oY291bnRzLCAoY291bnQsIGNvZGUpID0+ICh7IGNvZGUsIGNvdW50IH0pKVxuICAgICAgLmZpbHRlcigoYykgPT4gYy5jb3VudCA+IDApXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpXG4gICAgICAuc2xpY2UoMCwgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuREVOU0lUWV9NQVhfQ0xVU1RFUlMpO1xuICAgIGlmIChjb3VudHMuZmlsdGVyKChjKSA9PiBjID4gMCkubGVuZ3RoID4gcmFua2VkLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW25hcGFyaS1qc10gJHtjb2x1bW59OiBkcmF3aW5nIHRoZSAke3JhbmtlZC5sZW5ndGh9IGxhcmdlc3QgY2x1c3RlcnMgYXMgZGVuc2l0eSBgICtcbiAgICAgICAgICAndm9sdW1lczsgbW9yZSB0aGFuIHRoYXQgc3RvcCBiZWluZyBzZXBhcmFibGUgYnkgZXllJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByYW5rZWQubWFwKCh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShjb3VudHNbY29kZV0pO1xuICAgICAgbGV0IGsgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaWYgKGluU2VsZWN0aW9uICYmICFpblNlbGVjdGlvbltpXSkgY29udGludWU7XG4gICAgICAgIGlmIChsb2FkZWQuY29kZXNbaV0gPT09IGNvZGUpIGluZGljZXNbaysrXSA9IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBsb2FkZWQubWV0YS5jYXRlZ29yaWVzW2NvZGVdLFxuICAgICAgICBjb2xvcjogY29sb3JzW2NvZGVdID8/ICcjODg4ODg4JyxcbiAgICAgICAgaW5kaWNlczogaW5kaWNlcy5zdWJhcnJheSgwLCBrKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIChvciBrZWVwKSB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWUsIGFuZCBkZXJpdmUgdGhlIG9mZnNldCB0aGF0IHNpdHMgdGhlXG4gICAqIG9ic2VydmF0aW9ucyBpbnNpZGUgaXQuXG4gICAqXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZTogbmFwYXJpLWpzIG1hcHMgdGhlIHZvbHVtZSdzIHVuaXQgY3ViZSB0byBhIHdvcmxkIGJveFxuICAgKiAqKmNlbnRyZWQgb24gdGhlIG9yaWdpbioqLCBzaXplZCBgZGltcyB4IHZveGVsU2l6ZWAuIFRoZSBvYnNlcnZhdGlvbnMsIGJ5IGNvbnRyYWN0LCBhcmUgaW5cbiAgICogdGhlIHZvbHVtZSdzIG93biBmcmFtZSB3aXRoIGl0cyBuZWFyIGNvcm5lciBhdCB0aGUgY29vcmRpbmF0ZSBvcmlnaW4uIFNvIHRoZSB0d28gb25seSBsaW5lXG4gICAqIHVwIGlmIHRoZSBQT0lOVFMgbW92ZSDigJQgYnkgaGFsZiB0aGUgYm94IOKAlCB3aGljaCBpcyB3aGF0IHtAbGluayBzcGF0aWFsT3JpZ2luM2R9IGlzLlxuICAgKlxuICAgKiBBIGZhaWxlZCBvciBhYnNlbnQgdm9sdW1lIGlzIG5vdCBmYXRhbDogdGhlIGNsb3VkIHJlbmRlcnMgb24gaXRzIG93biwgYXQgaXRzIG93blxuICAgKiBjb29yZGluYXRlcywgYW5kIHRoZSBjYW1lcmEgZnJhbWVzIHRoZSBwb2ludHMgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3BhdGlhbFZvbHVtZShcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBrZXkgPSBtZXRhID8gYCR7ZGF0YXNldC5pZH06JHttZXRhLndpZHRofXgke21ldGEuaGVpZ2h0fXgke21ldGEuZGVwdGh9YCA6IG51bGw7XG4gICAgaWYgKGtleSAmJiBrZXkgPT09IHRoaXMuc3BhdGlhbFZvbHVtZUtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFZvbHVtZSkge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsVm9sdW1lKTtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWVLZXkgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICBpZiAoIW1ldGEgfHwgIXBvcnQ/LmdldFZvbHVtZSkgcmV0dXJuO1xuXG4gICAgbGV0IHZveGVsczogVWludDhBcnJheTtcbiAgICB0cnkge1xuICAgICAgdm94ZWxzID0gYXdhaXQgcG9ydC5nZXRWb2x1bWUoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gcmVmZXJlbmNlIHZvbHVtZSB1bmF2YWlsYWJsZSDigJQgZHJhd2luZyB0aGUgY2xvdWQgYWxvbmUnLCBlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gbWV0YS52b3hlbFNpemU7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0ga2V5O1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IChcbiAgICAgIHZpZXdlci5hZGRWb2x1bWUodm94ZWxzLCBtZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aCwge1xuICAgICAgbmFtZTogJ3JlZmVyZW5jZSB2b2x1bWUnLFxuICAgICAgY29sb3JtYXA6ICdncmF5JyxcbiAgICAgIC8vIE1JUCB3b3VsZCBkcmF3IHRoZSBicmlnaHRlc3Qgdm94ZWwgYWxvbmcgZWFjaCByYXksIHdoaWNoIGZvciBhbiBhdmVyYWdlZFxuICAgICAgLy8gdGVtcGxhdGUgbWVhbnMgYSBmbGF0IHdoaXRlIHNoZWxsIHRoYXQgaGlkZXMgdGhlIGNsb3VkLiBUcmFuc2x1Y2VudCBsZXRzXG4gICAgICAvLyB0aGUgcG9pbnRzIHJlYWQgdGhyb3VnaCB0aGUgdGlzc3VlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGRyYXdpbmdcbiAgICAgIC8vIHRoZW0gdG9nZXRoZXIuXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBvcGFjaXR5OiB2aWV3LnZvbHVtZU9wYWNpdHksXG4gICAgICAgIHZveGVsU2l6ZTogW3Z4LCB2eSwgdnpdLFxuICAgICAgfSkpO1xuICAgIC8vIEhhbGYgdGhlIGJveCwgbmVnYXRlZDogdGhlIG9ic2VydmF0aW9ucycgb3JpZ2luIGlzIHRoZSBib3gncyBuZWFyIGNvcm5lcixcbiAgICAvLyBhbmQgdGhlIGJveCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4uXG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbXG4gICAgICAtKG1ldGEud2lkdGggKiB2eCkgLyAyLFxuICAgICAgLShtZXRhLmhlaWdodCAqIHZ5KSAvIDIsXG4gICAgICAtKG1ldGEuZGVwdGggKiB2eikgLyAyLFxuICAgIF07XG4gICAgLy8gRm9yY2UgYSBnZW9tZXRyeSByZWJ1aWxkOiB0aGUgb2Zmc2V0IGNoYW5nZWQsIHNvIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHN0YWxlLlxuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGF0aWFsM2RMYXllcnModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIFtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLCB0aGlzLnNwYXRpYWxWb2x1bWUsXG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciwgLi4udGhpcy5kZW5zaXR5TGF5ZXJzLFxuICAgIF0pIHtcbiAgICAgIGlmIChsYXllcikgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZCA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkgPSBudWxsO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgLy8gVGhlIHNjZW5lIGlzIGdvbmUsIHNvIHRoZSBuZXh0IDNEIGxheWVyIHNob3VsZCBmcmFtZSBpdHNlbGYgYWdhaW4uIFRoYXQgdXNlZCB0byBiZVxuICAgIC8vIGBzcGF0aWFsRnJhbWVkID0gbnVsbGAgbmV4dCB0byBhIGhhbmQtcm9sbGVkIHNhdmUvcmVzdG9yZTsgdGhlIHJlbmRlcmVyIG93bnMgdGhlXG4gICAgLy8gcG9saWN5IG5vdywgYW5kIHRoaXMgaXMgdGhlIHNhbWUgc3RhdGVtZW50IGFkZHJlc3NlZCB0byBpdC5cbiAgICB2aWV3ZXIucmVzZXRGaXQzRCgpO1xuICAgIHRoaXMuc3BhdGlhbDJkRnJhbWVkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbMCwgMCwgMF07XG4gICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsRHJhd24zZCA9IG51bGw7XG4gIH1cblxuICAvKiogQSBvbmUtY29sb3VyIGNvbG9ybWFwLCBmb3IgdGhlIFwibm90aGluZyB0byBjb2xvdXIgYnlcIiBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRmxhdENvbG9ybWFwKCk6IENvbG9ybWFwIHtcbiAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgY29uc3QgcmdiOiBSZ2IgPSBbTWF0aC5yb3VuZChyICogMjU1KSwgTWF0aC5yb3VuZChnICogMjU1KSwgTWF0aC5yb3VuZChiICogMjU1KV07XG4gICAgLy8gVHdvIGlkZW50aWNhbCBzdG9wczogY29sb3JtYXBGcm9tTHV0IG5lZWRzIGF0IGxlYXN0IHR3bywgYW5kIGVxdWFsIGVuZHNcbiAgICAvLyBtYWtlIGV2ZXJ5IHZhbHVlIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sb3VyLlxuICAgIHJldHVybiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtZmxhdCcsIFtyZ2IsIHJnYl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItcG9pbnQgc2NhbGFyICsgY29sb3JtYXAgKyB3aW5kb3cgdGhhdCBjb2xvdXIgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBDb250aW51b3VzIGRhdGEgaXMgdGhlIG5hdHVyYWwgZml0OiB2YWx1ZXMgZ28gc3RyYWlnaHQgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggdGhlXG4gICAqIHNhbWUgcGVyY2VudGlsZSB3aW5kb3cgdGhlIDJEIHBhdGggdXNlcy4gQ2F0ZWdvcmljYWwgZGF0YSBoYXMgdG8gYmUgc211Z2dsZWQgdGhyb3VnaCB0aGUgc2FtZVxuICAgKiBzY2FsYXIgY2hhbm5lbCDigJQgc2VlIHtAbGluayBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfS4gQ29kZXMgbWFwIHRvIExVVCBibG9ja3MsIGFuZFxuICAgKiBgY29udHJhc3RMaW1pdHNgIG9mIGBbLTAuNSwgSyAtIDAuNV1gIHB1dHMgY29kZSBgaWAgYXQgdGhlIGNlbnRyZSBvZiBibG9jayBgaWAsIHdoaWNoIGlzIHdoYXRcbiAgICogbWFrZXMgdGhlIHJvdW5kLXRyaXAgZXhhY3QgaW5zdGVhZCBvZiBhcHByb3hpbWF0ZWx5IHJpZ2h0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzcGF0aWFsU2NhbGFyM2QoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8U3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICBpZiAoIXBvcnQgfHwgIWNvbG9yQnkpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGNvbnN0IGNvbHVtbjogU3BhdGlhbENvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvbHVtbi5jb2RlcywgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgICBjb2x1bW4udmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICAgIHZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSxcbiAgICApO1xuICB9XG5cbiAgLyoqIENhdGVnb3J5IGNvZGVzIOKGkiBhIHN0ZXBwZWQgTFVULCBleGFjdCBmb3IgdXAgdG8ge0BsaW5rIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVN9LiAqL1xuICBwcml2YXRlIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvZGVzOiBVaW50MTZBcnJheSwgY29sb3JzOiBzdHJpbmdbXSk6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCB7XG4gICAgLy8gU2xvdCAwIGlzIHJlc2VydmVkIGZvciBcIm5vIGNhdGVnb3J5XCIsIHNvIHRoZSBwYWxldHRlIG9jY3VwaWVzIDEuLksgYW5kIHRoZVxuICAgIC8vIGJsb2NrIGNvdW50IGlzIG9uZSBtb3JlIHRoYW4gdGhlIGNhdGVnb3J5IGNvdW50IOKAlCB3aGljaCBpcyB3aHkgdGhlIHB1Ymxpc2hlZFxuICAgIC8vIGNlaWxpbmcgaXMgOTUgY2F0ZWdvcmllcyByYXRoZXIgdGhhbiB0aGUgTFVUJ3MgOTYgZGlzdGluZ3Vpc2hhYmxlIGJsb2Nrcy5cbiAgICBpZiAoY29sb3JzLmxlbmd0aCA+IFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtuYXBhcmktanNdICR7Y29sb3JzLmxlbmd0aH0gY2F0ZWdvcmllcyBleGNlZWRzIHRoZSAke1NQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVN9IHRoZSAzRCBgXG4gICAgICAgICsgXCJsYXllcidzIDI1Ni1lbnRyeSBMVVQgY2FuIGhvbGQgZGlzdGluY3RseTsgZHJhd2luZyBmbGF0IGluc3RlYWQgb2Ygd2l0aCB3cm9uZyBjb2xvdXJzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGsgPSBjb2xvcnMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBwYWxldHRlOiBSZ2JbXSA9IFtcbiAgICAgIE1JU1NJTkdfQ09MT1IsXG4gICAgICAuLi5jb2xvcnMubWFwKHBhcnNlSGV4KSxcbiAgICBdO1xuICAgIGNvbnN0IGx1dDogUmdiW10gPSBuZXcgQXJyYXkoTFVUX1NJWkUpO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgTFVUX1NJWkU7IGorKykge1xuICAgICAgbHV0W2pdID0gcGFsZXR0ZVtNYXRoLm1pbihrIC0gMSwgTWF0aC5mbG9vcigoaiAqIGspIC8gTFVUX1NJWkUpKV07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoY29kZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBjb2Rlc1tpXSA9PT0gTk9fQ0FURUdPUlkgPyAwIDogY29kZXNbaV0gKyAxO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWVzLFxuICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dCgnc3BhdGlhbC1jYXRlZ29yaWVzJywgbHV0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbLTAuNSwgayAtIDAuNV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgdGhlIGFjdGl2ZSBjb2xvcm1hcCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgIHNvdXJjZTogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBsb2c6IGJvb2xlYW4sXG4gICk6IFNwYXRpYWwzZEVuY29kaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgbGV0IHZhbHVlcyA9IHNvdXJjZTtcbiAgICBpZiAobG9nKSB7XG4gICAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNvdXJjZS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHZhbHVlc1tpXSA9IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgc291cmNlW2ldKSk7XG4gICAgfVxuICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb250cmFzdFdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtY29udGludW91cycsIGx1dCksXG4gICAgICAvLyBBIGRlZ2VuZXJhdGUgd2luZG93IHdvdWxkIGRpdmlkZSBieSB6ZXJvIGluIHRoZSBzaGFkZXIncyBub3JtYWxpc2F0aW9uLlxuICAgICAgY29udHJhc3RMaW1pdHM6IG1heCA+IG1pbiA/IFttaW4sIG1heF0gOiBbbWluLCBtaW4gKyAxXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlci1vYnNlcnZhdGlvbiBjb2xvdXJzIGZvciB0aGUgY3VycmVudCB2aWV3IHN0YXRlLCBvciBhIHNpbmdsZSBmbGF0IGNvbG91ciB3aGVuIG5vdGhpbmcgaXNcbiAgICogc2VsZWN0ZWQgdG8gY29sb3VyIGJ5LiBDYXRlZ29yaWNhbCBjb2x1bW5zIHVzZSB0aGUgY29sdW1uJ3Mgb3duIHBhbGV0dGU7IGNvbnRpbnVvdXMgY29sdW1uc1xuICAgKiBhbmQgZ2VuZSB2ZWN0b3JzIGdvIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3BhdGlhbEZhY2VDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICAvLyBFdmVyeXRoaW5nIE5PVCBzZWxlY3RlZCBpcyBtdXRlZDsgd2l0aCBub3RoaW5nIHNlbGVjdGVkLCBub3RoaW5nIGlzIG11dGVkXG4gICAgLy8gYW5kIHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkgKHRoZSBDb3NNeCBoaWdobGlnaHQtdnMtbXV0ZSBydWxlKS5cbiAgICBjb25zdCBtdXRlZCA9IG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pO1xuXG4gICAgaWYgKCFwb3J0IHx8ICFjb2xvckJ5KSB7XG4gICAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAvLyBHZW51aW5lbHkgdW5pZm9ybTogb25lIGJyb2FkY2FzdCB0dXBsZSwgc28gYSBmbGF0IDg0ay1vYnNlcnZhdGlvbiB2aWV3XG4gICAgICAvLyBkb2VzIG5vdCBhbGxvY2F0ZSA4NGsgb2YgdGhlbS5cbiAgICAgIGlmICghbXV0ZWQgJiYgdmlldy5vcGFjaXR5ID49IDEpIHJldHVybiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAvLyBOb3QgdW5pZm9ybSDigJQgdGhlIG9wYWNpdHkgY29udHJvbCBvciBhIHNlbGVjdGlvbiB2YXJpZXMgdGhlIGFscGhhLCBzbyBpdFxuICAgICAgLy8gaGFzIHRvIGJlIHBlci1wb2ludC4gUmV0dXJuaW5nIHRoZSBjb25zdGFudCB0dXBsZSBoZXJlIGlzIHdoYXQgbWFkZSB0aGVcbiAgICAgIC8vIE9wYWNpdHkgc2xpZGVyIGRvIG5vdGhpbmcgaW4gdGhlIGRlZmF1bHQgc3RhdGUsIHdoaWNoIGlzIHRoZSBzdGF0ZSBhbnlvbmVcbiAgICAgIC8vIGxhbmRzIGluIGJlZm9yZSBwaWNraW5nIGEgY29sb3VyIHNvdXJjZS5cbiAgICAgIGNvbnN0IGhleCA9IGAjJHtbciwgZywgYl0ubWFwKChjKSA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKX1gO1xuICAgICAgcmV0dXJuIHRvUmdiYVR1cGxlcyhlbmNvZGVDYXRlZ29yaWNhbChuZXcgVWludDE2QXJyYXkoZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQpLCB7XG4gICAgICAgIGNvbG9yczogW2hleF0sXG4gICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgbXV0ZWQsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGNvbnN0IGNvbHVtbjogU3BhdGlhbENvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBlbmNvZGVDYXRlZ29yaWNhbChjb2x1bW4uY29kZXMsIHtcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gR3JvdXBzIHN3aXRjaGVkIG9mZiBpbiB0aGUgQ2VsbHMgcGFuZWwgaGlkZSB0aGVpciBkb3RzIHRvbywgd2hlbiB0aGUgZG90cyBhcmVcbiAgICAgICAgLy8gY29sb3VyZWQgYnkgdGhhdCBzYW1lIGdyb3VwaW5nLlxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgICBpZiAodmlldy5oaWRkZW5Hcm91cHM/Lmxlbmd0aCAmJiBncm91cENvbHVtbiA9PT0gY29sb3JCeS5uYW1lKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LmhpZGRlbkdyb3Vwcyk7XG4gICAgICAgICAgY29uc3QgaGlkZSA9IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMubWFwKChjKSA9PiBvZmYuaGFzKGMpKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbi5jb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbHVtbi5jb2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChjICE9PSBOT19DQVRFR09SWSAmJiBoaWRlW2NdKSByZ2JhWzQgKiBpICsgM10gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKHJnYmEpO1xuICAgICAgfVxuICAgICAgLy8gQSBjb250aW51b3VzIGNvbHVtbiBtYXkgY2FycnkgaXRzIG93biBsb2cgaGludCAoY291bnRzKTsgdGhlIHZpZXcnc1xuICAgICAgLy8gdG9nZ2xlIHdpbnMgb25jZSB0aGUgdXNlciBoYXMgc2V0IGl0LlxuICAgICAgcmV0dXJuIHRvUmdiYVR1cGxlcyh0aGlzLmVuY29kZVNwYXRpYWxDb250aW51b3VzKFxuICAgICAgICBjb2x1bW4udmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLCBtdXRlZCxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0b1JnYmFUdXBsZXModGhpcy5lbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgIHZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSwgbXV0ZWQsXG4gICAgKSk7XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIFJHQkEgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIGFuZCBhIGNsaXBwZWQgd2luZG93LiAqL1xuICBwcml2YXRlIGVuY29kZVNwYXRpYWxDb250aW51b3VzKFxuICAgIHZhbHVlczogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBsb2c6IGJvb2xlYW4sXG4gICAgbXV0ZWQ6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbiAgKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbnRyYXN0V2luZG93KHZhbHVlcywgbG8sIGhpKTtcbiAgICByZXR1cm4gZW5jb2RlQ29udGludW91cyh2YWx1ZXMsIHsgbHV0LCBtaW4sIG1heCwgbG9nLCBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksIG11dGVkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU0NBVFRFUjNEIDNEIHNjYXR0ZXI6IHRoZSBkb3duc2FtcGxlZCB2b3hlbCBncmlkIGFzIGEgM0QgcG9pbnQgY2xvdWQgY29sb3JlZFxuICAgKiBieSBpbnRlbnNpdHkgKG5hcGFyaS1qcyBhbmFsb2cgb2YgUGxvdGx5J3Mgdm94ZWwgc2NhdHRlcjNkKS4gQXNzZW1ibGVzIGEgY29hcnNlIHZvbHVtZSwgdGhlblxuICAgKiBlbWl0cyBhIGZsYXQtc3RyaWRlZCBzYW1wbGUgb2Ygdm94ZWxzIChjYXBwZWQgYXQge0BsaW5rIFNDQVRURVIzRF9NQVhfUE9JTlRTfSkgdmlhIGBhZGRQb2ludHMzRGAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2NhdHRlcjNkKHZpZXdlcjogVmlld2VyLCBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgbGV0IHZvbDogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywge1xuICAgICAgICBtYXhTbGljZTogTWF0aC5taW4ocmVzLm1heFNsaWNlLCBTQ0FUVEVSM0RfTUFYX1hZKSxcbiAgICAgICAgc2xpY2VTdGVwOiByZXMuc2xpY2VTdGVwLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICAgIGlmICghdm9sIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfSA9IHZvbDtcbiAgICBjb25zdCB6U2NhbGUgPSBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSAvIE1hdGgubWF4KDEsIGRlcHRoKTsgLy8g4omIIGN1YmljIGFzcGVjdFxuICAgIGNvbnN0IHRvdGFsID0gd2lkdGggKiBoZWlnaHQgKiBkZXB0aDtcbiAgICBjb25zdCBzdHJpZGUgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG90YWwgLyBTQ0FUVEVSM0RfTUFYX1BPSU5UUykpO1xuICAgIGNvbnN0IHBvczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB2YWw6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIGNvbnN0IHggPSBpICUgd2lkdGg7XG4gICAgICBjb25zdCB5ID0gTWF0aC5mbG9vcihpIC8gd2lkdGgpICUgaGVpZ2h0O1xuICAgICAgY29uc3QgemkgPSBNYXRoLmZsb29yKGkgLyAod2lkdGggKiBoZWlnaHQpKTtcbiAgICAgIHBvcy5wdXNoKHgsIHksIHppICogelNjYWxlKTtcbiAgICAgIHZhbC5wdXNoKGRhdGFbaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIHRoaXMuc2NhdHRlcjNkTGF5ZXIgPSB2aWV3ZXIuYWRkUG9pbnRzM0QobmV3IEZsb2F0MzJBcnJheShwb3MpLCBuZXcgRmxvYXQzMkFycmF5KHZhbCksIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICBzaXplOiAzLFxuICAgIH0pO1xuICAgIHRoaXMuaW1hZ2VXID0gd2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBoZWlnaHQ7XG4gICAgdGhpcy52b2x1bWVEaW1zID0geyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIC8vIEZlZWQgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gZnJvbSB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoa2V5IDApLlxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCBkYXRhKTtcbiAgICB0aGlzLnN1YnNjcmliZVNjYXR0ZXIzZERpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgLyoqIFN0b3JlIGNvbG9ybWFwIC8gcmV2ZXJzZSAvIGludmVydCAvIGNoYW5uZWwgd2luZG93IOKGkiB0aGUgM0Qgc2NhdHRlcidzIGNvbG9ybWFwICsgY29udHJhc3QuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU2NhdHRlcjNkRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHNdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSBsYXllci5jb250cmFzdExpbWl0cyA9IFtzdC5taW4sIHN0Lm1heF07XG4gICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU1VSRkFDRSBoZWlnaHQtZmllbGQgc3VyZmFjZS4gQSBoZWlnaHQgZmllbGQgaXMgc2luZ2xlLXNjYWxhciwgc28gZm9yIGFcbiAgICogbXVsdGljaGFubmVsIGltYWdlIHRoZSBzdXJmYWNlIGZvbGxvd3MgT05FIGJhbmQg4oCUIHRoZSBmaXJzdCB2aXNpYmxlIGNoYW5uZWwgKGZhbGxiYWNrIDApIOKAlFxuICAgKiBjb2xvdXJlZCBieSB0aGF0IGNoYW5uZWwncyB3aW5kb3cvY29sb3JtYXAgKGxpa2UgdGhlIFBsb3RseSBTVVJGQUNFLCB3aGljaCBpcyBncmF5c2NhbGUtb25seSkuXG4gICAqIFByZS1sb2FkcyBldmVyeSBzbGljZSdzIGhlaWdodCBkYXRhIHdpdGggYSBwcm9ncmVzcyBiYXIgKGFzIHRoZSB2b2x1bWUgZG9lcykgc28gdGhlIHN0YWNrXG4gICAqIHNsaWRlciByZS1zbGljZXMgaW5zdGFudGx5LCB0aGVuIGJ1aWxkcyB0aGUgbWVzaCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuIEFsbCBtZXNoICsgR1BVIHdvcmtcbiAgICogbGl2ZXMgaW4gbmFwYXJpLWpzIChgaGVpZ2h0RmllbGRgICsgYFZpZXdlci5hZGRTdXJmYWNlYCk7IHRoaXMgYmFja2VuZCBzdXBwbGllcyBzY2FsYXIgc2xpY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFN1cmZhY2Uodmlld2VyOiBWaWV3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpIGhhcyBubyBkZXNjcmlwdG9yIOKAlCBkZXRlY3RcbiAgICAvLyBpdCBmcm9tIGltYWdlTWV0YSBzbyB0aGUgU3VyZmFjZSBzdGlsbCBmb2xsb3dzIG9uZSBiYW5kLlxuICAgIGNvbnN0IHNpbXBsZU1jID0gdGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbmZvKSAmJiAhIWluZm8/LmNoYW5uZWxVcmxzPy5sZW5ndGhcbiAgICAgICYmIChpbmZvPy5pbWFnZU1ldGE/LlswXT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSBzaW1wbGVNYyB8fCAoISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgKGRlc2M/LmNoYW5uZWxzID8/IDEpID4gMSk7XG4gICAgdGhpcy5zdXJmYWNlTXVsdGljaGFubmVsID0gbXVsdGljaGFubmVsO1xuICAgIC8vIEEgaGVpZ2h0IGZpZWxkIGlzIHNpbmdsZS1zY2FsYXIg4oaSIGZvbGxvdyB0aGUgcGFuZS1TRUxFQ1RFRCBjaGFubmVsLlxuICAgIHRoaXMuc3VyZmFjZUNoYW5uZWwgPSBtdWx0aWNoYW5uZWwgPyB0aGlzLnN0b3JlLmN1cnJlbnRTZWxlY3RlZENoYW5uZWwoKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN1cmZhY2VNYXhHcmlkID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpLm1heEdyaWQ7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIGF3YWl0IHRoaXMucHJlbG9hZFN1cmZhY2VQbGFuZXModmlld2VyKTtcbiAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRTdXJmYWNlKHZpZXdlciwgdGhpcy5sb2FkZWQ/LnogPz8gMCk7XG4gICAgdGhpcy5pbnN0YWxsU3VyZmFjZUF4ZXModmlld2VyKTtcbiAgICAvLyBTdWJzY3JpYmUgYWZ0ZXIgdGhlIGZpcnN0IGJ1aWxkIHNvIGRpc3BsYXktc3RhdGUgZWRpdHMgdGFyZ2V0IGEgbGl2ZSBsYXllci5cbiAgICB0aGlzLnN1YnNjcmliZVN1cmZhY2VEaXNwbGF5U3RhdGUoKTtcbiAgfVxuXG4gIC8qKiBBZGQgdGhlIDNEIGF4ZXMgZ2l6bW8gKyBET00gbGFiZWxzIGFyb3VuZCB0aGUgKG9yaWdpbi1jZW50ZXJlZCkgc3VyZmFjZSBtZXNoLCBtYXRjaGluZyB0aGVcbiAgICogIHZvbHVtZS9pc29zdXJmYWNlLiBJbnN0YWxsZWQgb25jZSBwZXIgbW91bnQ7IHRoZSBib3ggdHJhY2tzIHRoZSBtZXNoIGJvdW5kcywgWC9ZIHNob3cgdGhlXG4gICAqICBwaHlzaWNhbCAob3IgcGl4ZWwpIGV4dGVudCwgYW5kIFogaXMgdGhlIGludGVuc2l0eS9oZWlnaHQgYXhpcy4gKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3VyZmFjZUF4ZXModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3VyZmFjZUxheWVyKSByZXR1cm47XG4gICAgY29uc3QgYiA9IHRoaXMuc3VyZmFjZUxheWVyLmJvdW5kcygpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1heCgxLCBiLm1heFswXSAtIGIubWluWzBdKTtcbiAgICBjb25zdCBib3hIID0gTWF0aC5tYXgoMSwgYi5tYXhbMV0gLSBiLm1pblsxXSk7XG4gICAgY29uc3QgYm94RCA9IE1hdGgubWF4KDEsIGIubWF4WzJdIC0gYi5taW5bMl0pO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIGNvbnN0IHZveGVsID0gbXBwWCA+IDAgPyAobXBwWCAqICh0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IHRoaXMuaW1hZ2VXKSkgLyBNYXRoLm1heCgxLCB0aGlzLmltYWdlVykgOiAxO1xuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMoYm94VywgYm94SCwgYm94RCwge1xuICAgICAgdm94ZWxTaXplOiBbdm94ZWwsIHZveGVsLCAxXSxcbiAgICAgIHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoYm94VywgYm94SCwgYm94RCwgbXBwWCksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFgvWS9aIGVuZC1sYWJlbHMgZm9yIHRoZSBzdXJmYWNlIGdpem1vOiBYL1kgYXJlIHRoZSBwaHlzaWNhbCAowrVtKSBvciBwaXhlbCBleHRlbnQgb2YgdGhlIEZVTExcbiAgICogIGltYWdlOyBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuIEFuY2hvcnMgYXJlIGluIHRoZSBjZW50ZXJlZCBib3ggKG1hdGNoaW5nIEF4ZXNMYXllcikuICovXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlQXhlc0xhYmVscyhcbiAgICBib3hXOiBudW1iZXIsXG4gICAgYm94SDogbnVtYmVyLFxuICAgIGJveEQ6IG51bWJlcixcbiAgICBtcHBYOiBudW1iZXIsXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSBib3hXIC8gMjtcbiAgICBjb25zdCBoeSA9IGJveEggLyAyO1xuICAgIGNvbnN0IGh6ID0gYm94RCAvIDI7XG4gICAgY29uc3QgZGVzY1cgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IHRoaXMuaW1hZ2VXO1xuICAgIGNvbnN0IGRlc2NIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gdGhpcy5pbWFnZUg7XG4gICAgY29uc3QgbGVuID0gKHB4OiBudW1iZXIpOiBzdHJpbmcgPT4gKG1wcFggPiAwID8gZm9ybWF0VW0ocHggKiBtcHBYKSA6IGAke3B4fSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKGRlc2NXKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKGRlc2NIKX1gLCBjb2xvcjogJyM0ZGQ5NTknIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6ICdaIMK3IGludGVuc2l0eScsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1mZXRjaCBldmVyeSBzdGFjayBzbGljZSdzIGx1bWluYW5jZSBwbGFuZSAoZGVjaW1hdGVkIHRvIHRoZSBzdXJmYWNlIGdyaWQpIGludG9cbiAgICoge0BsaW5rIHN1cmZhY2VQbGFuZXN9LCBkcml2aW5nIHtAbGluayBzdGFja0xvYWRpbmdQcm9ncmVzcyR9IOKAlCB0aGUgc2FtZSBsb2FkLXdpdGgtcHJvZ3Jlc3MgVVhcbiAgICogYXMgdGhlIHZvbHVtZSwgYnV0IGtlZXBpbmcgb25lIDJEIHBsYW5lIHBlciBzbGljZSByYXRoZXIgdGhhbiBwYWNraW5nIGEgM0Qgdm9sdW1lLiBCb3VuZGVkXG4gICAqIGNvbmN1cnJlbmN5IGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeSB3aXRob3V0IGZsb29kaW5nIGl0IG9uIGEgZGVlcCBzdGFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlbG9hZFN1cmZhY2VQbGFuZXModmlld2VyOiBWaWV3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGlmIGEgQ2FuY2VsIC8gbmV3IHBsb3QgYnVtcHMgdGhpcyB3aGlsZSB3ZSBmZXRjaFxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGNvbnN0IGRlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgY29uc3QgeyBtYXhHcmlkIH0gPSBzdXJmYWNlUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSk7XG4gICAgdGhpcy5zdXJmYWNlUGxhbmVzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZzogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgZGVwdGg7IHorKykgcGVuZGluZy5wdXNoKHopO1xuICAgICAgbGV0IGRvbmUgPSAwO1xuICAgICAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgeiA9IHBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICBpZiAoeiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5zZXQoeiwgYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCBtYXhHcmlkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2Ugc2xpY2UgJHt6fSBwcmVsb2FkIGZhaWxlZGAsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvbmUrKztcbiAgICAgICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KE1hdGgucm91bmQoKGRvbmUgLyBkZXB0aCkgKiAxMDApKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2wgPSBNYXRoLm1pbihWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1ksIE1hdGgubWF4KDEsIGRlcHRoKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiBwb29sIH0sICgpID0+IHdvcmtlcigpKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHNsaWNlIGB6YCBhcyBhIHNpbmdsZSBXSE9MRS1pbWFnZSBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byBgbWF4R3JpZGApLiBQcmVmZXJzIHRoZVxuICAgKiBhcHAncyBjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgKGBzbWFsbFVybHNgL2B1cmxzYCwgZXhhY3RseSBsaWtlIHRoZSBQbG90bHkgc3VyZmFjZSkgc28gdGhlXG4gICAqIHN1cmZhY2UgYWx3YXlzIGNvdmVycyB0aGUgRlVMTCBzbGljZSDigJQgdGhlIHRpbGUtcHlyYW1pZCBgZmV0Y2hTbGljZWAgcGF0aCB3b3VsZCBmYWxsIGJhY2sgdG8gYVxuICAgKiBzaW5nbGUgdG9wLWxlZnQgdGlsZSAoYSBjb3JuZXIpIGZvciBzZWxmLWNvbnRhaW5lZCAvIG5vbi1gL3RpbGVzL2luZm9gIGltYWdlcy4gRmFsbHMgYmFjayB0b1xuICAgKiBzdGl0Y2hpbmcgdGhlIHRpbGUgZ3JpZCBvbmx5IHdoZW4gbm8gY29tcGxldGUtaW1hZ2UgVVJMIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIC8qKiBUaWxlIGJ1ZGdldCB0byBzdGl0Y2ggYSB3aG9sZSBzbGljZSBhdCB+YHRhcmdldFB4YCByZXNvbHV0aW9uIGZyb20gdGhlIHB5cmFtaWQ6IGEgaGlnaGVyIHRhcmdldFxuICAgKiAgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gU2hhcmVkIGJ5IHRoZSBzdXJmYWNlIHBsYW5lIGZldGNoIGFuZCB0aGUgdm9sdW1lXG4gICAqICBhc3NlbWJseSBzbyBib3RoIHNjYWxlIHRoZWlyIGluLXBsYW5lIHJlc29sdXRpb24gd2l0aCB0aGUgZGVjaW1hdGUgZmFjdG9yLiAqL1xuICBwcml2YXRlIHRpbGVCdWRnZXRGb3IodGFyZ2V0UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLmRlc2NyaXB0b3I/LnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICByZXR1cm4gTWF0aC5taW4oXG4gICAgICBNQVhfU1RJVENIX1RJTEVTLFxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCgodGFyZ2V0UHggLyB0aWxlU2l6ZSkgKiogMiAqIFNUSVRDSF9CVURHRVRfQ09FRkYpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN1cmZhY2VQbGFuZShcbiAgICB6OiBudW1iZXIsXG4gICAgbWF4R3JpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBsZXQgcGxhbmU6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gUHJlZmVycmVkOiBzdGl0Y2ggdGhlIFdIT0xFIHNsaWNlIGZyb20gdGhlIHNlcnZlciBweXJhbWlkIGF0IGEgcmVzb2x1dGlvbiBkcml2ZW4gYnkgdGhlXG4gICAgLy8gZGVjaW1hdGUgZmFjdG9yIOKAlCBhIGhpZ2hlciB0YXJnZXQgZ3JpZCBwdWxscyBhIEZJTkVSIHB5cmFtaWQgbGV2ZWwgKG1vcmUgcmVhbCBkZXRhaWwpLiBXaXRoIGFcbiAgICAvLyBkZXNjcmlwdG9yLCBmZXRjaFNsaWNlIHN0aXRjaGVzIHRoZSB3aG9sZSBjaG9zZW4gbGV2ZWwgKG5ldmVyIGEgY29ybmVyKSwgdGhlbiB3ZSBkb3duc2NhbGUgdG9cbiAgICAvLyB0aGUgZ3JpZC4gVGhpcyBpcyB3aGF0IG1ha2VzIFwiRnVsbFwiIGFjdHVhbGx5IGhpZ2hlci1yZXMgdGhhbiBcIsK9XCIsIG5vdCBqdXN0IGEgZml4ZWQgcHJldmlldy5cbiAgICBpZiAoZGVzYz8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZGdldCA9IHRoaXMudGlsZUJ1ZGdldEZvcihtYXhHcmlkKTtcbiAgICAgIC8vIFRoZSBzdXJmYWNlIGlzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSwgc28gdGhlIGNvbXBvc2l0ZSBmYWxsYmFjayBpcyBhY2NlcHRhYmxlIHdoZW4gdGhlXG4gICAgICAvLyBjaGFubmVsIGhhcyBubyBzbWFsbCBweXJhbWlkIGxldmVsIChrZWVwcyBpdCBmYXN0KTsgYSBtdWx0aWNoYW5uZWwgVk9MVU1FIG11c3Qgbm90IGRvIHRoaXMuXG4gICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB0aGlzLnN1cmZhY2VDaGFubmVsLCBidWRnZXQsIHRydWUpLFxuICAgICAgICBtYXhHcmlkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAobm8gcHlyYW1pZCk6IHRoZSBhcHAncyBDT01QTEVURSBwZXItc2xpY2UgaW1hZ2UgKHVybHNbel0sIG5vdCB0aGUgc21hbGwgYmx1cnJ5XG4gICAgLy8gdGh1bWJuYWlsKSDigJQgd2hvbGUgc2xpY2UsIGF2b2lkcyBhIGNvcm5lciB0aWxlLiBDYXBwZWQgYXQgdGhlIGltYWdlJ3Mgb3duIHJlc29sdXRpb24uXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgY29uc3QgdXJsID0gaW5mbz8udXJscz8uW3pdID8/IGluZm8/LnNtYWxsVXJscz8uW3pdO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICAgICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpLCBtYXhHcmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gc3VyZmFjZSB1cmwgZmV0Y2ggZmFpbGVkIGZvciB6PSR7en1gLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFzdCByZXNvcnQgKG5vIHB5cmFtaWQgYW5kIG5vIGNvbXBsZXRlIGltYWdlKTogYSBzaW5nbGUgdGlsZS5cbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB0aGlzLnN1cmZhY2VDaGFubmVsLCB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCksIHRydWUpLFxuICAgICAgICBtYXhHcmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBsYW5lO1xuICB9XG5cbiAgLyoqIFRoZSBjaGFubmVsIHN0YXRlIGRyaXZpbmcgdGhlIHN1cmZhY2U6IHRoZSBjaG9zZW4gYmFuZCBmb3IgbXVsdGljaGFubmVsIChtYXRjaGVkIGJ5IGluZGV4KSxcbiAgICogIGVsc2UgdGhlIHNpbmdsZSBncmF5c2NhbGUgY2hhbm5lbC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlU3RhdGUoY2hhbm5lbHM6IElDaGFubmVsU3RhdGVbXSk6IElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN1cmZhY2VDaGFubmVsID09IG51bGwpIHJldHVybiBjaGFubmVsc1swXTtcbiAgICByZXR1cm4gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gdGhpcy5zdXJmYWNlQ2hhbm5lbCkgPz8gY2hhbm5lbHNbMF07XG4gIH1cblxuICAvKipcbiAgICogKFJlKWJ1aWxkIHRoZSBzdXJmYWNlIG1lc2ggZm9yIHNsaWNlIGB6YCBmcm9tIHRoZSBwcmUtbG9hZGVkIHBsYW5lIGNhY2hlIChpbnN0YW50IOKAlCB0aGlzIGlzXG4gICAqIHdoYXQgdGhlIHN0YWNrIHNsaWRlciBjYWxscyk7IGEgc2xpY2UgbWlzc2luZyBmcm9tIHRoZSBjYWNoZSBpcyBmZXRjaGVkIG9uIGRlbWFuZC4gbmFwYXJpLWpzJ3NcbiAgICogcHVyZSBgaGVpZ2h0RmllbGRgIGJ1aWxkcyB0aGUgdHJpYW5nbGUgZ3JpZCAoeiA9IG5vcm1hbGl6ZWQgaW50ZW5zaXR5KSwgdGhlbiBgYWRkU3VyZmFjZWBcbiAgICogcmVuZGVycyBpdC4gVGhlIHNsaWNlIHBsYW5lIGFsc28gZmVlZHMgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gKGtleSAwKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRTdXJmYWNlKHZpZXdlcjogVmlld2VyLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcGxhbmUgPSB0aGlzLnN1cmZhY2VQbGFuZXMuZ2V0KHopO1xuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGxhbmUgPSBhd2FpdCB0aGlzLmZldGNoU3VyZmFjZVBsYW5lKHosIHRoaXMuc3VyZmFjZU1heEdyaWQpO1xuICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIHBsYW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlIGZldGNoIGZhaWxlZDonLCBlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXBsYW5lIHx8IHBsYW5lLndpZHRoIDwgMiB8fCBwbGFuZS5oZWlnaHQgPCAyIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHN0ID0gdGhpcy5zdXJmYWNlU3RhdGUodGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpKTtcbiAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgdGhpcy5zdXJmYWNlV2luZG93ID0gd2luO1xuICAgIC8vIEhlaWdodCBBTkQgY29sb3VyIGFyZSBub3JtYWxpemVkIGJ5IHRoZSBzYW1lIGNvbnRyYXN0IHdpbmRvdywgc28gY2hhbmdpbmcgbWluL21heCByZXNoYXBlcyB0aGVcbiAgICAvLyBzdXJmYWNlIChhIHBpeGVsJ3MgaGVpZ2h0ID0gaXRzIGludGVuc2l0eSB3aXRoaW4gW21pbixtYXhdKS4gQ2VudGVyIGl0IGZvciB0aGUgYXhlcyBnaXptby4gVGhlXG4gICAgLy8gcGxhbmUgaXMgYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIGdyaWQgY2FwIOKGkiBzdHJpZGUgMS5cbiAgICBjb25zdCB6U2NhbGUgPSBTVVJGQUNFX1pfQVNQRUNUICogTWF0aC5tYXgocGxhbmUud2lkdGgsIHBsYW5lLmhlaWdodCk7XG4gICAgY29uc3QgeyB2ZXJ0aWNlcywgZmFjZXMsIHZhbHVlcyB9ID0gaGVpZ2h0RmllbGQocGxhbmUuZGF0YSwgcGxhbmUud2lkdGgsIHBsYW5lLmhlaWdodCwge1xuICAgICAgelNjYWxlLFxuICAgICAgekxpbWl0czogd2luLFxuICAgICAgY2VudGVyOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUHJlc2VydmUgdGhlIG9yYml0IGNhbWVyYSBhY3Jvc3MgYSByZS1zbGljZSAvIHdpbmRvdyByZWJ1aWxkIOKAlCBvbmx5IHRoZSBmaXJzdCBtb3VudCBmcmFtZXMsIHNvXG4gICAgLy8gc3RlcHBpbmcgdGhlIHN0YWNrIG9yIGNoYW5naW5nIHRoZSB3aW5kb3cga2VlcHMgdGhlIGN1cnJlbnQgem9vbS9wYW4vb3JpZW50YXRpb24uXG4gICAgY29uc3QgY2FtID0gdmlld2VyLmNhbWVyYTNkO1xuICAgIGNvbnN0IHByZXNlcnZlQ2FtZXJhID0gdGhpcy5zdXJmYWNlTGF5ZXIgIT0gbnVsbDtcbiAgICBjb25zdCBzYXZlZFRhcmdldCA9IGNhbS50YXJnZXQ7XG4gICAgY29uc3Qgc2F2ZWREaXN0YW5jZSA9IGNhbS5kaXN0YW5jZTtcbiAgICBpZiAodGhpcy5zdXJmYWNlTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3VyZmFjZUxheWVyKTtcbiAgICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zdXJmYWNlTGF5ZXIgPSB2aWV3ZXIuYWRkU3VyZmFjZSh2ZXJ0aWNlcywgZmFjZXMsIHZhbHVlcywge1xuICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IHdpbixcbiAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgIHdpcmVmcmFtZTogdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH0pO1xuICAgIGlmIChwcmVzZXJ2ZUNhbWVyYSkge1xuICAgICAgY2FtLnRhcmdldCA9IHNhdmVkVGFyZ2V0O1xuICAgICAgY2FtLmRpc3RhbmNlID0gc2F2ZWREaXN0YW5jZTtcbiAgICB9XG5cbiAgICB0aGlzLmltYWdlVyA9IHBsYW5lLndpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gcGxhbmUuaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IHsgd2lkdGg6IHBsYW5lLndpZHRoLCBoZWlnaHQ6IHBsYW5lLmhlaWdodCwgZGVwdGg6IE1hdGgubWF4KDEsIE1hdGgucm91bmQoelNjYWxlKSkgfTtcbiAgICAvLyBSZXVzZSB0aGUgdm9sdW1lIGludGVuc2l0eS1oaXN0b2dyYW0gcGF0aDogdGhlIHNsaWNlJ3Mgc2NhbGFyIHBsYW5lIGlzIHRoZSBoaXN0b2dyYW0gc291cmNlLlxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCBwbGFuZS5kYXRhKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdGhlIHN0b3JlIGNvbG9ybWFwIC8gcmV2ZXJzZSAvIGludmVydCAvIGNoYW5uZWwgd2luZG93IOKGkiB0aGUgc3VyZmFjZSwgc28gaGlzdG9ncmFtXG4gICAqICAmIGNoYW5uZWwtZGlhbG9nIGVkaXRzIHVwZGF0ZSBpdCBsaXZlIHdpdGhvdXQgYSByZS1mZXRjaC4gKiptaW4vbWF4IHJlc2hhcGVzIHRoZSBzdXJmYWNlJ3NcbiAgICogIGhlaWdodCoqIChhIHBpeGVsJ3MgaGVpZ2h0ID0gaXRzIGludGVuc2l0eSB3aXRoaW4gW21pbixtYXhdKSwgc28gYSB3aW5kb3cgY2hhbmdlIHJlYnVpbGRzIHRoZVxuICAgKiAgbWVzaCBnZW9tZXRyeSAoZnJvbSB0aGUgY2FjaGVkIHNsaWNlKTsgY29sb3VyLW9ubHkgZWRpdHMgKGNvbG9ybWFwL0xVVCwgZ2FtbWEsIHJldmVyc2UsIGludmVydClcbiAgICogIGp1c3QgdXBkYXRlIHRoZSBsYXllcidzIHVuaWZvcm1zLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVN1cmZhY2VEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0U2VsZWN0ZWRDaGFubmVsKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHMsIHNlbGVjdGVkXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMuc3VyZmFjZUxheWVyO1xuICAgICAgaWYgKCFsYXllciB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICAgIC8vIFNlbGVjdGVkIGNoYW5uZWwgY2hhbmdlZCAobXVsdGljaGFubmVsKTogcmUtZmV0Y2ggVEhBVCBiYW5kJ3MgcGxhbmVzIGFuZFxuICAgICAgLy8gcmVidWlsZCB0aGUgaGVpZ2h0LWZpZWxkIGZvciB0aGUgY3VycmVudCBzbGljZS5cbiAgICAgIGlmICh0aGlzLnN1cmZhY2VNdWx0aWNoYW5uZWwgJiYgc2VsZWN0ZWQgIT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zdXJmYWNlQ2hhbm5lbCA9IHNlbGVjdGVkO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcmVsb2FkU3VyZmFjZVBsYW5lcyh0aGlzLnZpZXdlciEpO1xuICAgICAgICAgIGlmICh0aGlzLnZpZXdlcikgYXdhaXQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgICAgICB9KSgpLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHN1cmZhY2UgY2hhbm5lbCBzd2l0Y2ggZmFpbGVkOicsIGVycikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKGNoYW5uZWxzKTtcbiAgICAgIGNvbnN0IHdpbjogW251bWJlciwgbnVtYmVyXSA9IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XTtcbiAgICAgIGNvbnN0IHdpbmRvd0NoYW5nZWQgPVxuICAgICAgICAhdGhpcy5zdXJmYWNlV2luZG93IHx8IHdpblswXSAhPT0gdGhpcy5zdXJmYWNlV2luZG93WzBdIHx8IHdpblsxXSAhPT0gdGhpcy5zdXJmYWNlV2luZG93WzFdO1xuICAgICAgaWYgKHdpbmRvd0NoYW5nZWQpIHtcbiAgICAgICAgLy8gSGVpZ2h0IGZvbGxvd3MgdGhlIGNvbnRyYXN0IHdpbmRvdyDihpIgcmVidWlsZCB0aGUgbWVzaCBmb3IgdGhlIG5ldyBbbWluLG1heF0gKGNhbWVyYSBrZXB0KS5cbiAgICAgICAgdm9pZCB0aGlzLmJ1aWxkU3VyZmFjZSh0aGlzLnZpZXdlciwgdGhpcy5sb2FkZWQ/LnogPz8gMCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIHdpbmRvdyByZWJ1aWxkIGZhaWxlZDonLCBlcnIpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDb2xvdXItb25seSBjaGFuZ2U6IHVwZGF0ZSB1bmlmb3JtcyBpbiBwbGFjZSwgbm8gZ2VvbWV0cnkgcmVidWlsZC5cbiAgICAgIGxheWVyLmNvbG9ybWFwID0gdGhpcy52b2x1bWVDb2xvcm1hcChzdCk7XG4gICAgICBpZiAoc3QpIHtcbiAgICAgICAgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSB3aW47XG4gICAgICAgIGxheWVyLmdhbW1hID0gc3QuZ2FtbWE7XG4gICAgICB9XG4gICAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpdENhbWVyYVNvb24oKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY2FudmFzICYmIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhLmZpdChcbiAgICAgICAgICB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmltYWdlSCxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5pbWFnZUgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJ1bik7XG4gICAgZWxzZSBydW4oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWM7IGhvc3QgcmUtZHJpdmVzIHBsb3QoKSBmcm9tIGl0cyBpbWFnZSBzdHJlYW0uICovXG4gIHJlbG9hZEFuZFBsb3QoKTogdm9pZCB7XG4gICAgLyogbm8tb3AgKi9cbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFRva2VuKys7IC8vIGludmFsaWRhdGUgYW55IGluLWZsaWdodCBmcmFtZSBsb2FkaW5nIGZyb20gdGhlIHByZXZpb3VzIHBsb3RcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRlc3Ryb3koKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgdGhpcy5sb2FkaW5nQmFkZ2U/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZSA9IG51bGw7XG4gICAgdGhpcy50aWxlTG9hZGluZyA9IFtdO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZyA9IDA7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5kZXN0cm95KCk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbnVsbDtcbiAgICB0aGlzLmF4ZXNMYWJlbHM/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmF4ZXNMYWJlbHMgPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVXb3JsZEJhc2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5jbGVhcigpO1xuICAgIHRoaXMudGlsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmY/LigpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSBudWxsO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5kZXRhY2goKTtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3BhdGlhbFN1YiA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IG51bGw7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gbnVsbDtcbiAgICAvLyBJbnZhbGlkYXRlIGFueSBjb2xvdXIgZmV0Y2ggc3RpbGwgaW4gZmxpZ2h0IHNvIGl0IGNhbid0IGF0dGFjaCB0byB0aGUgbmV4dCBzY2VuZS5cbiAgICB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4rKztcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IG51bGw7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lRGltcyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICB9XG5cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF4aXMgcmVzZXQuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWMgYXV0b3NjYWxlLiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5hdXRvc2NhbGVFdmVudCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAqIDEuMztcbiAgfVxuXG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyKSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSA9IHRoaXMudmlld2VyLmNhbWVyYS56b29tIC8gMS4zO1xuICB9XG5cbiAgc2V0RHJhZ01vZGUoX21vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gTm8tb3A6IHBhbiBhbmQgem9vbSBhcmUgYWx3YXlzIHRoZSBuYXBhcmkgY2FtZXJhJ3MgZGVmYXVsdCBnZXN0dXJlcywgYW5kIHBhbi96b29tIGdhdGluZyBmb3JcbiAgICAvLyBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSByZWdpb24gb3ZlcmxheSdzIHNldE1vZGUgKHNldENvbnRyb2xzRW5hYmxlZCkuIFRvZ2dsaW5nIGNvbnRyb2xzIGhlcmVcbiAgICAvLyB3b3VsZCBmaWdodCB0aGF0IOKAlCB0aGUgaG9zdCBjYWxscyBzZXREcmFnTW9kZShmYWxzZSkgYWxvbmdzaWRlIG92ZXJsYXkuc2V0TW9kZSg8dG9vbD4pLlxuICB9XG5cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU21vb3RoaW5nID0gZW5hYmxlZDtcbiAgICAvLyBBcHBseSBsaXZlIHRvIHRoZSByZW5kZXJlZCBpbWFnZSBsYXllcnM7IGJha2VkIGludG8gdGhlIG5leHQgcmVuZGVyIHRvby5cbiAgICB0aGlzLmNoYW5uZWxWaWV3Py5zZXRJbnRlcnBvbGF0aW9uKGVuYWJsZWQgPyAnbGluZWFyJyA6ICduZWFyZXN0Jyk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIHN0YWNrIG5hdmlnYXRlZCB2aWEgc2V0WkluZGV4ICovXG4gIH1cblxuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkZWQpIHRoaXMubG9hZGVkLnogPSB6SW5kZXg7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLm5hdmlnYXRvcikgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6SW5kZXgpO1xuICAgIC8vIFN1cmZhY2U6IG9uZSBzbGljZSDihpIgb25lIG1lc2gsIHNvIHJlLWJ1aWxkIHRoZSBoZWlnaHQgZmllbGQgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2b2lkIHRoaXMuYnVpbGRTdXJmYWNlKHYsIHpJbmRleCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc2V0WkluZGV4IHN1cmZhY2UgZmFpbGVkOicsIGVyciksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBWb2x1bWUgLyBpc29zdXJmYWNlOiBzdGVwIHRoZSB2b2x1bWUncyB6IHBsYW5lIGluIHBsYWNlLlxuICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRpbGVkIDJEIGltYWdlOiBqdXN0IG1vdmUgdGhlIGRpbXMgcGxhbmUg4oCUIHRoZSB0aWxlZCB2aXN1YWwgZmV0Y2hlcyB0aGUgbmV3IHNsaWNlJ3MgdGlsZXNcbiAgICAvLyAoY2FjaGVkIHBlciB6KSwgbm8gbGF5ZXIgcmVidWlsZC4gUmVmcmVzaCB0aGUgY29hcnNlIGhpc3RvZ3JhbSBzYW1wbGUgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMudGlsZWQpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcikgdm9pZCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHpJbmRleCwgdGhpcy5kZXNjcmlwdG9yKTtcbiAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyAyRCBpbWFnZSAoc3RpdGNoIGZhbGxiYWNrKTogcmUtcmVuZGVyIHRoZSBzbGljZSAocmUtZmV0Y2hlcyBwZXItY2hhbm5lbCAvIGNvbXBvc2l0ZSkuIEJyYW5jaFxuICAgIC8vIG9mIGEgdm9sdW1lIGxheWVyIChub3QgY3VycmVudFBsb3RUeXBlLCB3aGljaCBjb3VsZCBiZSBzdGFsZSBhbmQgc2lsZW50bHkgbm8tb3AgdGhlIHN3YXApLlxuICAgIC8vIFRoZSB0b2tlbiBsZXRzIHJlbmRlckltYWdlIGRyb3AgYSBzdXBlcnNlZGVkIHNjcnViIHNvIGEgc2xvdyBvbGRlciBzbGljZSBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLlxuICAgIGNvbnN0IHJlcSA9ICsrdGhpcy5zbGljZVJlcTtcbiAgICB2b2lkIHRoaXMucmVuZGVySW1hZ2UoekluZGV4LCByZXEpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChyZXEgIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgICAgLy8gQUZURVIgdGhlIGltYWdlLCBuZXZlciBiZWZvcmU6IHRoZSByZW5kZXIgY2xlYXJzIHRoZSBsYXllciBsaXN0LCBzb1xuICAgICAgICAvLyBtYXJrZXJzIGRyYXduIGZpcnN0IGFyZSB3aXBlZCBieSB0aGUgdmVyeSBpbWFnZSBtZWFudCB0byBzaXQgdW5kZXIgdGhlbS5cbiAgICAgICAgLy8gT3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGUgcGxhbmUgYWxzbyBkZWNpZGVzIHdoaWNoIG9ic2VydmF0aW9uc1xuICAgICAgICAvLyBhcmUgZHJhd24gYXQgYWxsLCBzbyB0aGlzIGlzIHdoYXQgbW92ZXMgdGhlIGNlbGxzIHdpdGggdGhlIHNlY3Rpb24uXG4gICAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGJ1bXAgdGhlIGxvYWQgZ2VuZXJhdGlvbiBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKztcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCBtID0gbW9kZSA9PT0gJ3BhbicgPyAncGFuJyA6IG1vZGUgPT09ICd6b29tJyA/ICd6b29tJyA6ICdyb3RhdGUnOyAvLyBvcmJpdC90dXJudGFibGUg4oaSIHJvdGF0ZVxuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKG0pO1xuICB9XG5cbiAgLyoqIFJlLWZyYW1lIHRoZSAzRCBjYW1lcmEgb24gdGhlIGN1cnJlbnQgM0QgbGF5ZXIuIEEgc3VyZmFjZSBtZXNoIHNpdHMgaW4gdGhlIHBvc2l0aXZlIG9jdGFudFxuICAgKiAgKG5vdCBjZW50cmVkKSwgc28gZnJhbWUgaXQgYnkgaXRzIG93biBib3VuZHM7IGEgdm9sdW1lL2lzb3N1cmZhY2UgdXNlcyBpdHMgY2VudHJlZCBib3guICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbWVzaExheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXIgPz8gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICBpZiAobWVzaExheWVyKSB7XG4gICAgICBjb25zdCBiID0gbWVzaExheWVyLmJvdW5kcygpO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QudGFyZ2V0ID0gYi5jZW50ZXI7XG4gICAgICB0aGlzLnZpZXdlci5jYW1lcmEzZC5kaXN0YW5jZSA9IE1hdGgubWF4KGIucmFkaXVzICogMi41LCAxZS0zKTtcbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMudm9sdW1lRGltcztcbiAgICBpZiAoZCkgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZnJhbWUoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICAgIC8vIEdhdGVkIGJ5IGByZXF1aXJlc1NwYXRpYWxEYXRhYCwgc28gdGhlIHNlbGVjdG9yIGhpZGVzIGl0IHVudGlsIGEgZGF0YXNldCBpcyBwdWJsaXNoZWQuXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuU1BBVElBTF9PTUlDU10hLFxuICAgIF07XG4gIH1cblxuICAvKiogVGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBmdWxsIOKApiA4ID0g4oWbKS4gUmVhZCBieSB0aGUgdG9vbGJhciB0byBpbml0IHRoZSBjb250cm9sLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uU2NhbGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBkZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMuIFRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCAocmUpbG9hZCDigJQgdGhlIGhvc3RcbiAgICogIHJlLXBsb3RzIGFmdGVyIGNhbGxpbmcgdGhpcywgc2luY2UgZGVjaW1hdGlvbiBjaGFuZ2VzIHRoZSBmZXRjaGVkL2Fzc2VtYmxlZCBkYXRhLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICB9XG5cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KF9kaXZJZDogc3RyaW5nLCBfcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQge1xuICAgIC8qIFBsb3RseSBvd25zIHRoZSBpbnRlbnNpdHkgaW5zZXQgKi9cbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIHByaXZhdGUgYXN5bmMgcnVuUmVhZGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBweCA9IGF3YWl0IHYucmVhZERpc3BsYXllZFBpeGVscygpO1xuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgICBpZiAoc2l6ZSAmJiByZWN0KSB7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoLCByZWN0LngpKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLndpZHRoIC0geCwgcmVjdC53aWR0aCkpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLmhlaWdodCAtIHksIHJlY3QuaGVpZ2h0KSk7XG4gICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcmVhZGJhY2sgdW5hdmFpbGFibGUgKi9cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUmVhZGJhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgIGVsc2Ugc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucnVuUmVhZGJhY2soKSwgMCk7XG4gIH1cblxuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIOKAlCBhcm1lZCBvbiBjYW1lcmEgY2hhbmdlcyBzbyBgbGFzdFBpeGVsc2AgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYVxuICAgKiAgcGFuL3pvb20gc2V0dGxlcyAoYW5kIGFmdGVyIHRpbGVkIGxldmVscyBmaW5pc2ggbG9hZGluZyksIHdoaWNoIHRoZSBvbi1jYW52YXMgcGl4ZWwgdG9vbHNcbiAgICogICh3YW5kL2JydXNoL1NBTSkgcmVhZCBzeW5jaHJvbm91c2x5LiBDb2FsZXNjZXMgcmFwaWQgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBhcm1SZWFkYmFjayhkZWxheU1zID0gMjUwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgICB2b2lkIHRoaXMucnVuUmVhZGJhY2soKTtcbiAgICB9LCBkZWxheU1zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmUgKyBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUgLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBQaXhlbCB0b29sczogcmV1c2UgdGhlIHNoYXJlZCwgYmFja2VuZC1hZ25vc3RpYyB0b29sIHNlcnZpY2VzIHdpdGggYSBuYXBhcmkgaG9zdCDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQnVpbGQgdGhlIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgdG9vbCBob3N0cyBmb3IgdGhlIGN1cnJlbnQgdmlld2VyIChjYWxsZWQgZnJvbSBwbG90KCkpLiBUaGVcbiAgICogIHBpeGVsIHRvb2xzIHJlYWQgZGlzcGxheWVkIHBpeGVscyBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgYW5kIGNvbnZlcnQgcG9pbnRlclxuICAgKiAgY29vcmRzIHZpYSB0aGUgbmFwYXJpIGNhbWVyYSwgZXhhY3RseSBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiAqL1xuICBwcml2YXRlIGJ1aWxkVG9vbEhvc3RzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE5hcGFyaUNvb3JkaW5hdGVUcmFuc2Zvcm0oXG4gICAgICB0aGlzLnZpZXdlcixcbiAgICAgICgpID0+ICEhdGhpcy52aWV3ZXIgJiYgdGhpcy5pbWFnZVcgPiAwLFxuICAgICk7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uU3RvcmU7XG4gICAgdGhpcy53YW5kSG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGdldENhY2hlZEltYWdlRGF0YTogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKSxcbiAgICAgIGdldEFjdGl2ZUZyYW1lSW5kZXg6ICgpID0+IHRoaXMubG9hZGVkPy56ID8/IDAsXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMubG9hZGVkPy5maWxlbmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHJlZ2lvbnMuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9ucy5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocikgPT4gcmVnaW9ucy5zZXRSZWdpb25zKHIpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuaG9zdCxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRDYWNoZWRJbWFnZVJhdGlvOiAoKSA9PiB0aGlzLmNhY2hlZEltYWdlRGF0YSgpPy5yYXRpb3NbMF0gPz8gMSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB6b29tQm94SG9zdCgpOiBab29tVG9Cb3hUb29sSG9zdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFBsb3REaXY6ICgpID0+IHRoaXMucGxvdERpdklkLFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuaG9zdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXJlY3QpIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2IHx8ICF0aGlzLmNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdztcbiAgICBjb25zdCB2aCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCB8fCBoO1xuICAgIHYuY2FtZXJhLmNlbnRlciA9IFsoeDAgKyB4MSkgLyAyLCAoeTAgKyB5MSkgLyAyXTtcbiAgICB2LmNhbWVyYS56b29tID0gTWF0aC5taW4odncgLyB3LCB2aCAvIGgpO1xuICAgIHYucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIENhY2hlZEltYWdlRGF0YSBmcm9tIHRoZSBtb3N0IHJlY2VudCByZWFkYmFjayAoUkdCQSBkZXZpY2UgcGl4ZWxzIOKGkiBbeV1beF09W3IsZyxiXSksXG4gICAqICB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHMg4oaUIHJlYWRiYWNrIHBpeGVscy4gQ2FjaGVkIHVudGlsIHRoZSByZWFkYmFjayBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlRGF0YSgpOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsIHtcbiAgICBjb25zdCBweCA9IHRoaXMubGFzdFBpeGVscztcbiAgICBpZiAoIXB4IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuY2FjaGVkSW1hZ2UgJiYgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9PT0gcHgpIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICAgIGNvbnN0IHcgPSBweC53aWR0aDtcbiAgICBjb25zdCBoID0gcHguaGVpZ2h0O1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXVtdID0gbmV3IEFycmF5KGgpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICBjb25zdCByb3c6IG51bWJlcltdW10gPSBuZXcgQXJyYXkodyk7XG4gICAgICBjb25zdCBiYXNlID0geSAqIHcgKiA0O1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgY29uc3QgbyA9IGJhc2UgKyB4ICogNDtcbiAgICAgICAgcm93W3hdID0gW2RhdGFbb10sIGRhdGFbbyArIDFdLCBkYXRhW28gKyAyXV07XG4gICAgICB9XG4gICAgICBtYXRyaXhbeV0gPSByb3c7XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgcmVjdCBjYXB0dXJlZCBXSVRIIHRoaXMgcmVhZGJhY2sgKG5vdCB0aGUgbGl2ZSBvbmUpIHNvIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlXG4gICAgLy8gbWF0cml4J3MgY2FtZXJhIOKAlCBvdGhlcndpc2UgYSBwYW4vem9vbSBzaW5jZSB0aGUgcmVhZGJhY2sgbWlzLXNjYWxlcyB0aGUgdHJhY2VkIHJlZ2lvbi5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5sYXN0UGl4ZWxzUmVjdCA/PyB0aGlzLnZpZXdlci52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZSA9IHtcbiAgICAgIGZyYW1lczogW21hdHJpeF0sXG4gICAgICB3aWR0aDogdyxcbiAgICAgIGhlaWdodDogaCxcbiAgICAgIHJhdGlvczogW3JlY3Qud2lkdGggLyB3LCByZWN0LmhlaWdodCAvIGhdLFxuICAgICAgaXNHcmF5c2NhbGU6IGZhbHNlLFxuICAgICAgb3JpZ2luWDogcmVjdC54LFxuICAgICAgb3JpZ2luWTogcmVjdC55LFxuICAgIH07XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IHB4O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICB9XG5cbiAgLy8g4pSA4pSAIElUb29sQ29udHJvbGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAvLyBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gIC8vIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmFybVJlYWRiYWNrKDApO1xuICAgIGlmICh0aGlzLndhbmRIb3N0KSB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRPcHRpb25zKChvcHRpb25zID8/IHt9KSBhcyB1bmtub3duIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBCcnVzaE9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zID8/IHt9KTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG5cbi8qKlxuICogQWRkaXRpdmVseSBjb21wb3NpdGUgZ3JheXNjYWxlIGNoYW5uZWwgaW1hZ2VzLCBlYWNoIHRpbnRlZCB3aXRoIGl0cyBkaXNwbGF5IGNvbG91ciDigJRcbiAqIHRoZSBuYXZpZ2F0b3IncyBwaWN0dXJlIG9mIGEgbXVsdGljaGFubmVsIGltYWdlLlxuICovXG5mdW5jdGlvbiB0aW50ZWRDb21wb3NpdGUoaW1hZ2VzOiBJbWFnZUJpdG1hcFtdLCBjb2xvcnM6IHN0cmluZ1tdKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICBjb25zdCB3ID0gaW1hZ2VzWzBdPy53aWR0aCA/PyAxO1xuICBjb25zdCBoID0gaW1hZ2VzWzBdPy5oZWlnaHQgPz8gMTtcbiAgY29uc3Qgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIG91dC53aWR0aCA9IHc7XG4gIG91dC5oZWlnaHQgPSBoO1xuICBjb25zdCBjdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSE7XG4gIGN0eC5maWxsU3R5bGUgPSAnIzAwMCc7XG4gIGN0eC5maWxsUmVjdCgwLCAwLCB3LCBoKTtcbiAgY29uc3QgdG1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIHRtcC53aWR0aCA9IHc7XG4gIHRtcC5oZWlnaHQgPSBoO1xuICBjb25zdCB0ID0gdG1wLmdldENvbnRleHQoJzJkJykhO1xuICBpbWFnZXMuZm9yRWFjaCgoaW1nLCBpKSA9PiB7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICAgIHQuZHJhd0ltYWdlKGltZywgMCwgMCwgdywgaCk7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnbXVsdGlwbHknO1xuICAgIHQuZmlsbFN0eWxlID0gY29sb3JzW2ldO1xuICAgIHQuZmlsbFJlY3QoMCwgMCwgdywgaCk7XG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdsaWdodGVyJztcbiAgICBjdHguZHJhd0ltYWdlKHRtcCwgMCwgMCk7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuIl19
4412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ08sZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQzVFLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixzQkFBc0IsR0FDdkIsTUFBTSxXQUFXLENBQUM7QUFnQm5CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFDMkMsY0FBYyxFQUFFLG1CQUFtQixHQUNwRixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFDTCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUNwRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFDbkYseUJBQXlCLEVBQUUsb0JBQW9CLEdBQ2hELE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEw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TUFBTSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN2RixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtZQUNoRCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1QixPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDMUIsQ0FBQyxD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QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLGFBQWEsQ0FBQztRQUMzQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsR0FBRyxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztRQUN6QyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgZnJvbSwgb2YsIGZpcnN0VmFsdWVGcm9tLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQge1xuICBWaWV3ZXIsXG4gIGhpc3RvZ3JhbVNjYWxhcixcbiAgY29sb3JtYXBGcm9tTHV0LFxuICB0aW50Q29sb3JtYXAsXG4gIHJldmVyc2VDb2xvcm1hcCxcbiAgaGVpZ2h0RmllbGQsXG4gIExVVF9TSVpFLFxuICBNdWx0aUNoYW5uZWxJbWFnZVZpZXcsXG4gIE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF4ZXNMYXllcixcbiAgSW1hZ2VMYXllcixcbiAgU3VyZmFjZUxheWVyLFxuICBWb2x1bWVMYXllcixcbiAgUG9pbnRzTGF5ZXIsXG4gIFBvaW50czNETGF5ZXIsXG4gIFRpbGVkU291cmNlLFxuICBUaWxlS2V5LFxuICBQaXhlbENodW5rLFxuICBDaGFubmVsVmlldyxcbiAgVm9sdW1lQ2hhbm5lbCxcbiAgQ29sb3JtYXAsXG4gIFByb2plY3RlZFBvaW50cyxcbn0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB7IG5lYXJlc3RQcm9qZWN0ZWRJbmRleCwgU2NyZWVuSW5kZXgsIFNDUkVFTl9JTkRFWF9NSU5fUE9JTlRTIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IFNQQVRJQUxfREFUQV9QT1JULCBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbENvbHVtbiwgU3BhdGlhbERhdGFzZXQsIFNwYXRpYWxJbWFnZVJlZiwgZmluZENvbHVtbk1ldGEsIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIGNvbnRyYXN0V2luZG93LCBlbmNvZGVDYXRlZ29yaWNhbCwgZW5jb2RlQ29udGludW91cywgbWFya2VyRGlhbWV0ZXJzLFxuICByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMsIHRvUmdiYVR1cGxlcywgcGFyc2VIZXgsIE1JU1NJTkdfQ09MT1IsIERFRkFVTFRfTVVURURfT1BBQ0lUWSxcbiAgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFUywgc3BhdGlhbENvbnRpbnVvdXNMdXQsXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBOT19DQVRFR09SWSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbE9ic2VydmF0aW9ucyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGVtcHR5U2VsZWN0aW9uLCBtYXNrVG9JbmRpY2VzLCBtdXRlZEZyb21TZWxlY3Rpb24sIHNhbWVTZWxlY3Rpb24sXG4gIHNlbGVjdEJ5Q2F0ZWdvcnksXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZnJhbWVQb3NpdGlvbnMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZnJhbWluZyc7XG5pbXBvcnQgeyBQSVhFTF9XT1JMRF9RVUFOVFVNLCB3b3JsZFF1YW50dW1Gb3JFeHRlbnQgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3dvcmxkLWdyaWQnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TbGljZSwgdm9sdW1lSW1hZ2VSZWYgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7IGRlZmF1bHRTaWdtYSwgZGVuc2l0eUdyaWQsIHJhc3Rlcml6ZURlbnNpdHkgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZGVuc2l0eSc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNlY3Rpb24sIHNlY3Rpb25zT2YgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHsgdHlwZSBIb3ZlclNvdXJjZSwgaG92ZXJUZXh0LCBuZWFyZXN0T2JzZXJ2YXRpb24gfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtaG92ZXInO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRvb2x0aXAgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRvb2x0aXAnO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMsIFRyYW5zY3JpcHRFc3RpbWF0ZSB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgTmFwYXJpTmF2aWdhdG9yIH0gZnJvbSAnLi9uYXBhcmktbmF2aWdhdG9yJztcbmltcG9ydCB7IE5hcGFyaUxvYWRpbmdCYWRnZSB9IGZyb20gJy4vbmFwYXJpLWxvYWRpbmctYmFkZ2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQgfSBmcm9tICcuL25hcGFyaS16b29tJztcblxuLyoqXG4gKiBBIHNob3J0LCBzdGFibGUgaWQgZm9yIGEgY29sb3JtYXAgdmFsdWUsIGZvciBjYWNoZSBrZXlzLlxuICpcbiAqIEhhbGYgdGhlIGxpYnJhcnkncyBjb2xvcm1hcHMgYXJlIE5BTUVTIGFuZCBoYWxmIGFyZSBpbmxpbmUgYFtzdG9wLCBjb2xvdXJdYFxuICogYXJyYXlzIG9mIDI1NiBlbnRyaWVzLiBTdHJpbmdpZnlpbmcgdGhlIGFycmF5IGtpbmQgd291bGQgcHV0IDYgS0IgaW4gYSBrZXkgdGhhdFxuICogaXMgcmVidWlsdCBhbmQgY29tcGFyZWQgb24gZXZlcnkgdmlldyBjaGFuZ2U7IGhhc2hpbmcgaXQga2VlcHMgdGhlIGtleSBzbWFsbCxcbiAqIGFuZCBpdCBvbmx5IGhhcyB0byBkaXN0aW5ndWlzaCBvbmUgY29sb3JtYXAgZnJvbSBhbm90aGVyLlxuICovXG5mdW5jdGlvbiBjb2xvcm1hcElkKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICc/JztcbiAgLy8gRk5WLTFhIG92ZXIgdGhlIHN0b3BzLiBBIGNvbGxpc2lvbiB3b3VsZCBsZWF2ZSBhIHN0YWxlIGNvbG91cmluZyBvbiBzY3JlZW4sXG4gIC8vIG5vdCBjb3JydXB0IGFueXRoaW5nLCBhbmQgMzIgYml0cyBvdmVyIGEgZmV3IGh1bmRyZWQgY29sb3JtYXBzIHdpbGwgbm90LlxuICBsZXQgaGFzaCA9IDB4ODExYzlkYzU7XG4gIGNvbnN0IHRleHQgPSB2YWx1ZS5tYXAoKHN0b3ApID0+IFN0cmluZyhzdG9wKSkuam9pbignLCcpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICBoYXNoIF49IHRleHQuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gTWF0aC5pbXVsKGhhc2gsIDB4MDEwMDAxOTMpO1xuICB9XG4gIHJldHVybiBgIyR7KGhhc2ggPj4+IDApLnRvU3RyaW5nKDM2KX1gO1xufVxuXG4vKipcbiAqIEluLXBsYW5lIGNvYXJzZW5pbmcgb2YgdGhlIDNEIGdlbmUgbWFwJ3MgbGF0dGljZSwgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZVxuICogdm9sdW1lLiBUaGUgZmllbGQgaXMgc21vb3RoLCBzbyBpdHMgZGV0YWlsIGlzIHNldCBieSB0aGUga2VybmVsIHJhdGhlciB0aGFuIHRoZVxuICogcmFzdGVyIOKAlCBhbmQgdGhlIGVzdGltYXRlIGlzIGEgcGFpciBvZiBzZXBhcmFibGUgYmx1cnMgb24gdGhlIG1haW4gdGhyZWFkLCB3aGljaFxuICogYXQgdGhlIHRlbXBsYXRlJ3MgZnVsbCByZXNvbHV0aW9uIG1lYW5zIHNlY29uZHMgb2YgZnJvemVuIFVJIHBlciB0b2dnbGUuXG4gKi9cbmNvbnN0IEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUgPSAyO1xuaW1wb3J0IHtcbiAgdHlwZSBFeHByZXNzaW9uRmllbGQsIHR5cGUgRXhwcmVzc2lvblZvbHVtZUZpZWxkLCBjb2xvckV4cHJlc3Npb25GaWVsZCxcbiAgZW5jb2RlRXhwcmVzc2lvblZvbHVtZSwgZXhwcmVzc2lvbkZpZWxkLCBleHByZXNzaW9uVm9sdW1lLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBMT1RfVFlQRV9ERVNDUklQVE9SUyxcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVN1cmZhY2UsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNOYXBhcmlTY2F0dGVyM2QsXG4gIGlzU3BhdGlhbE9taWNzLFxuICBpc1NwYXRpYWxPbWljczNkLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlzdWFsaXplcixcbiAgUGl4ZWxEYXRhLFxuICBJbnRlbnNpdHlQcm9maWxlLFxuICBJSXNvc3VyZmFjZUNvbnRyb2xzLFxuICBJSW50ZW5zaXR5Q29udHJvbHMsXG4gIElTdXJmYWNlM2RDb250cm9scyxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgVmlld2VyQ2FwYWJpbGl0aWVzLFxuICBWaWV3ZXJGZWF0dXJlLFxuICBjYXBhYmlsaXRpZXNPZixcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcE5vZGUsIElXYW5kT3B0aW9ucywgSUJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXotY29uZmlnJztcbmltcG9ydCB7IFRJTEVfQUNDRVNTX1BPUlQsIFRpbGVBY2Nlc3NQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgQmFzZVN0b3JlVmlzdWFsaXplciB9IGZyb20gJy4uL2Jhc2Utc3RvcmUtdmlzdWFsaXplcic7XG5pbXBvcnQgeyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgfSBmcm9tICcuLi9zaW1wbGUtc2xpY2UtYWNjZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmFwYXJpU2NhbGVCYXIsIFNjYWxlQmFyQ2FtZXJhLCBmb3JtYXRVbSB9IGZyb20gJy4vbmFwYXJpLXNjYWxlLWJhcic7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5LCBPdmVybGF5Vmlld2VyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgTmFwYXJpQXhlc0xhYmVscywgQXhpc0xhYmVsU3BlYyB9IGZyb20gJy4vbmFwYXJpLWF4ZXMtbGFiZWxzJztcbmltcG9ydCB7IE5hcGFyaVZvbHVtZVpIYW5kbGUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtei1oYW5kbGUnO1xuaW1wb3J0IHtcbiAgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBXYW5kVG9vbFNlcnZpY2UsIFdhbmRUb29sSG9zdCwgQ2FjaGVkSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFRvb2xTZXJ2aWNlLCBCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgVmVydGV4RXJhc2VyVG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvdmVydGV4LWVyYXNlci92ZXJ0ZXgtZXJhc2VyLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgWm9vbVRvQm94VG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuXG4vKiogSUNvb3JkaW5hdGVUcmFuc2Zvcm0gb3ZlciB0aGUgbmFwYXJpIGNhbWVyYTogcG9pbnRlciBjbGllbnQgY29vcmRzIOKGlCBpbWFnZS93b3JsZCBjb29yZHMuICovXG5jbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBPcGFxdWUgaGFuZGxlIGZyb20ge0BsaW5rIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLmxvYWR9LCBwYXNzZWQgYmFjayB0byBwbG90KCkuICovXG5pbnRlcmZhY2UgTmFwYXJpTG9hZGVkIHtcbiAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvO1xuICB6OiBudW1iZXI7XG4gIC8qKiBNdXN0IG1hdGNoIGBJSW1hZ2VJbmZvLmZpbGVOYW1lYCDigJQgdGhlIHJlbmRlciBvcmNoZXN0cmF0b3IgZHJvcHMgdGhlIHJlc3VsdCBpZiB0aGVcbiAgICogIGhhbmRsZSdzIGBmaWxlbmFtZWAgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGltYWdlIChndWFyZHMgYWdhaW5zdCBzdGFsZSBjbGlja3MpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBWT0xVTUVfTUFYX1NMSUNFID0gMTAyNDsgLy8gXCJGdWxsXCIgaW4tcGxhbmUgY2FwOyB0aGUgZGVmYXVsdCDCvCBsb2FkIHVzZXMgMjU2XG4vKiogUmVmZXJlbmNlIGluLXBsYW5lIHdvcmxkIHNpemUgKGxvbmcgc2lkZSkgZm9yIHRoZSB2b2x1bWUvYXhlcyBib3gsIGluIGFyYml0cmFyeSB3b3JsZCB1bml0cy5cbiAqICBUaGUgYm94IGlzIGFuY2hvcmVkIHRvIHRoaXMgcmVmZXJlbmNlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNob3NlbiBkZWNpbWF0ZSBmYWN0b3IsIHNvIGNoYW5naW5nIHRoZVxuICogIHJlc29sdXRpb24gY2hhbmdlcyBERVRBSUwsIG5vdCB0aGUgdm9sdW1lJ3MgcHJvcG9ydGlvbnMgKFogbm8gbG9uZ2VyIGFwcGVhcnMgdG8gc2hyaW5rIHdoZW4gdGhlXG4gKiAgaW4tcGxhbmUgc2FtcGxpbmcgZ3Jvd3MpLiBTZXQgdG8gdGhlIERFRkFVTFQgZGVjaW1hdGUncyBpbi1wbGFuZSBjYXAgc28gdGhlIGRlZmF1bHQgdmlldyBpc1xuICogIHVuY2hhbmdlZDsgaGlnaGVyL2xvd2VyIHJlc29sdXRpb25zIGtlZXAgdGhhdCBzYW1lIHNoYXBlLiBTZWUge0BsaW5rIG1vdW50Vm9sdW1lfS4gKi9cbmNvbnN0IFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRiA9IFZPTFVNRV9NQVhfU0xJQ0UgLyBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcbi8qKiBNYXggY29uY3VycmVudCBzbGljZSBmZXRjaGVzIHdoZW4gYXNzZW1ibGluZyBhIHZvbHVtZSDigJQga2VlcHMgdGhlIGNvbm5lY3Rpb24gcG9vbCBidXN5XG4gKiAgd2l0aG91dCBmbG9vZGluZyBpdCAoYnJvd3NlcnMgY2FwIH42L2hvc3QpIG9uIGEgZGVlcCBzdGFjay4gKi9cbmNvbnN0IFZPTFVNRV9GRVRDSF9DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBWb2x1bWUvaXNvc3VyZmFjZSBzYW1wbGluZyBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYCAoMSA9IEZ1bGwgMTAyNCwgMiA9IMK9IDUxMiwgNCA9IMK8IDI1NlxuICogIGRlZmF1bHQsIDggPSDihZsgMTI4KTogdGhlIGluLXBsYW5lIGNhcCBoYWx2ZXMgZWFjaCBzdGVwOyBzbGljZXMgc3RheSB1bi1zdWJzYW1wbGVkIHVudGlsIOKFmywgdGhlblxuICogIHN1YnNhbXBsZS4gKi9cbmZ1bmN0aW9uIHZvbHVtZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4U2xpY2U6IG51bWJlcjsgc2xpY2VTdGVwOiBudW1iZXIgfSB7XG4gIGNvbnN0IHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNjYWxlKSk7XG4gIHJldHVybiB7XG4gICAgbWF4U2xpY2U6IE1hdGgubWF4KDgsIE1hdGgucm91bmQoVk9MVU1FX01BWF9TTElDRSAvIHMpKSxcbiAgICBzbGljZVN0ZXA6IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocyAvIDQpKSxcbiAgfTtcbn1cbi8qKiBGdWxseS1ub3JtYWxpemVkIGludGVuc2l0eSBoZWlnaHQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgaW4tcGxhbmUgZXh0ZW50IOKAlCBtYXRjaGVzIHRoZSBQbG90bHlcbiAqICBTVVJGQUNFIHotYXNwZWN0ICh+MC40KSBzbyB0aGUgcmVsaWVmIGlzbid0IGV4YWdnZXJhdGVkLiAqL1xuY29uc3QgU1VSRkFDRV9aX0FTUEVDVCA9IDAuNDtcbi8qKiBcIkZ1bGxcIiBtZXNoIGdyaWQgY2FwOyB0aGUgZGVjaW1hdGUgZmFjdG9yIGRpdmlkZXMgaXQgKGRlZmF1bHQgwrwg4oaSIDIyMCwgwr0g4oaSIDQ0MCwgRnVsbCDihpIgODgwKS4gKi9cbmNvbnN0IFNVUkZBQ0VfTUFYX0dSSUQgPSA4ODA7XG4vKiogQ29lZmZpY2llbnQgc2NhbGluZyB0aGUgcHlyYW1pZCB0aWxlIGJ1ZGdldCB3aXRoIHRoZSB0YXJnZXQgcmVzb2x1dGlvbiDigJQgYSBoaWdoZXIgdGFyZ2V0IHB1bGxzIGFcbiAqICBmaW5lciBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gU2hhcmVkIGJ5IHRoZSBzdXJmYWNlIHBsYW5lIGZldGNoICsgdm9sdW1lIGFzc2VtYmx5LiAqL1xuY29uc3QgU1RJVENIX0JVREdFVF9DT0VGRiA9IDE2O1xuLyoqIFN1cmZhY2UgbWVzaCB0YXJnZXQgZ3JpZCBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYDogdGhlIGdyaWQgY2FwIHNocmlua3MgYnkgYHNjYWxlYCAoZXZlcnlcbiAqICBzbGljZSBpcyBrZXB0IOKAlCB0aGUgei1zbGlkZXIgbmVlZHMgdGhlbSBhbGwpLiBUaGUgc291cmNlIGlzIGZldGNoZWQgYXQgYSBtYXRjaGluZyByZXNvbHV0aW9uLiAqL1xuZnVuY3Rpb24gc3VyZmFjZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4R3JpZDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4geyBtYXhHcmlkOiBNYXRoLm1heCgxNiwgTWF0aC5yb3VuZChTVVJGQUNFX01BWF9HUklEIC8gcykpIH07XG59XG5cbi8qKiAzRCBzY2F0dGVyOiBpbi1wbGFuZSBjYXAgZm9yIHRoZSBhc3NlbWJsZWQgdm94ZWwgZ3JpZCwgYW5kIHRoZSBtYXggbnVtYmVyIG9mIHBvaW50cyBlbWl0dGVkXG4gKiAgKHRoZSBncmlkIGlzIGZsYXQtc3RyaWRlZCBkb3duIHRvIHRoaXMpIOKAlCBrZWVwcyB0aGUgYmlsbGJvYXJkIGNvdW50IGludGVyYWN0aXZlLiAqL1xuY29uc3QgU0NBVFRFUjNEX01BWF9YWSA9IDY0O1xuY29uc3QgU0NBVFRFUjNEX01BWF9QT0lOVFMgPSAxNTAwMDA7XG5cbmNvbnN0IFRJTEVfU0laRSA9IDUxMjsgLy8gc2VydmVyIHRpbGUgZWRnZSAobWF0Y2hlcyB0aGUgT1NEIGJhY2tlbmQpXG4vKiogTWF4IHRpbGVzIHN0aXRjaGVkIGZvciBvbmUgZGlzcGxheWVkIHNsaWNlICg1MTJweCB0aWxlcyDihpIgdXAgdG8gfjYxNDTCsiBhdCBmdWxsIHJlcykuIEJleW9uZFxuICogIHRoaXMgd2Ugc3RlcCB0byBhIGNvYXJzZXIgcHlyYW1pZCBsZXZlbCBzbyBhIGxhcmdlIGltYWdlIHN0YXlzIHRyYWN0YWJsZS4gKi9cbmNvbnN0IE1BWF9TVElUQ0hfVElMRVMgPSAxNDQ7XG4vKiogV2ViR1BVIGRlZmF1bHQgYG1heFRleHR1cmVEaW1lbnNpb24yRGAg4oCUIGEgc3RpdGNoZWQgc2xpY2UncyBsb25nZXN0IHNpZGUgbXVzdCBmaXQgYSB0ZXh0dXJlLiAqL1xuY29uc3QgTUFYX1RFWFRVUkVfRElNID0gODE5Mjtcbi8qKiBDb25jdXJyZW50IHRpbGUgcmVxdWVzdHMgcGVyIHN0aXRjaGVkIHNsaWNlLiBGaXJpbmcgYSB3aG9sZSBncmlkIGF0IG9uY2UgKGh1bmRyZWRzIG9mIHJlcXVlc3RzXG4gKiAgZm9yIGEgbGFyZ2UgbGV2ZWwpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cyk7IGEgc21hbGwgcG9vbCBrZWVwcyB0aGUgcGlwZSBmdWxsIHdpdGhvdXRcbiAqICBmbG9vZGluZyBpdCDigJQgYW5kIHNsaWNlLWxldmVsIHdvcmtlcnMgYWxyZWFkeSBydW4gc2V2ZXJhbCBzdGl0Y2hlcyBpbiBwYXJhbGxlbCBvbiB0b3Agb2YgdGhpcy4gKi9cbmNvbnN0IFRJTEVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA2O1xuLyoqIEhvdyBsb25nIHRvIHBvbGwgYC90aWxlcy9pbmZvYCAoMjAyIHdoaWxlIHRoZSBzZXJ2ZXIgY2FjaGVzIHRoZSBzb3VyY2UpIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG9cbiAqICBhIHNpbmdsZSB0aWxlLiBHZW5lcm91cyBsaWtlIHRoZSBPU0QgYmFja2VuZCDigJQgYSBjb2xkIHdob2xlLXNsaWRlIGNhbiB0YWtlIG1pbnV0ZXMgdG8gY2FjaGUuICovXG5jb25zdCBERVNDUklQVE9SX1RJTUVPVVRfTVMgPSAxMjAwMDA7XG5cbi8qKiBEZWZhdWx0IHBlci1jaGFubmVsIHRpbnRzIChGaWppLXN0eWxlKSB3aGVuIHRoZSBzdG9yZS9kZXNjcmlwdG9yIG9mZmVycyBubyBjb2xvdXIuICovXG5jb25zdCBERUZBVUxUX1RJTlRTID0gWycjZmYwMDAwJywgJyMwMGZmMDAnLCAnIzAwMDBmZicsICcjZmZmZjAwJywgJyNmZjAwZmYnLCAnIzAwZmZmZicsICcjZmZmZmZmJ107XG5cbi8qKiBEZWZhdWx0IHRpbnQgZm9yIGEgY2hhbm5lbCBpbmRleCwgY3ljbGluZyB0aGUgRmlqaSBwYWxldHRlLiAqL1xuZnVuY3Rpb24gdGludEZvcihjaGFubmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gREVGQVVMVF9USU5UU1tjaGFubmVsICUgREVGQVVMVF9USU5UUy5sZW5ndGhdO1xufVxuXG4vKiogT25lIHB5cmFtaWQgbGV2ZWwgZnJvbSBgR0VUIC90aWxlcy9pbmZvYCAocmVzIDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7XG4gIHJlczogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqIFN1YnNldCBvZiB0aGUgYC90aWxlcy9pbmZvYCBkZXNjcmlwdG9yIHRoaXMgYmFja2VuZCByZWFkcyAodGlsZSBncmlkLCBjaGFubmVscywgc2NhbGUpLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgbXVsdGljaGFubmVsPzogYm9vbGVhbjtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgcGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSB0aGVyZS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjb2xvcj86IHN0cmluZztcbiAgICBiaXREZXB0aD86IG51bWJlcjtcbiAgICBtaW5BbGxvd2VkPzogbnVtYmVyO1xuICAgIG1heEFsbG93ZWQ/OiBudW1iZXI7XG4gIH0+IHwgbnVsbDtcbiAgbGV2ZWxzOiBUaWxlTGV2ZWxbXTtcbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFdlYkdQVSBpbWFnZSBiYWNrZW5kIGJ1aWx0IG9uIHRoZSBwdWJsaXNoZWQgYG5hcGFyaS1qc2AgbGlicmFyeSDigJQgdGhlIFBPQyBlbmdpbmUgZm9yXG4gKiBqaXQtdWkjMTAyIChhIGJyb3dzZXItYmFzZWQgbmFwYXJpIHNoaXBwZWQgYXMgYSBKUyBsaWJyYXJ5LCBzd2FwcGluZyBpbWFnZSBwbG90dGluZyB3aXRoXG4gKiBPcGVuU2VhZHJhZ29uIGFuZCAzRCBzbGljaW5nL2lzb3N1cmZhY2VzIHdpdGggUGxvdGx5KS5cbiAqXG4gKiBSZW5kZXIgc3RyYXRlZ3k6IHJhdGhlciB0aGFuIHJlLWltcGxlbWVudCB0aGUgc2VydmVyJ3MgdGlsZS9weXJhbWlkIHByb3RvY29sICh3aGljaCBPU0RcbiAqIGFscmVhZHkgaGFuZGxlcyksIHRoaXMgYmFja2VuZCByZW5kZXJzIHRoZSAqKmNvbXBsZXRlIHBlci1zbGljZSBpbWFnZSBVUkxzIHRoZSBhcHAgYWxyZWFkeVxuICogcHJvZHVjZXMqKiAoYElJbWFnZUluZm8udXJsc2ApIOKAlCBgdXJsc1t6XWAgZm9yIHRoZSAyRCBpbWFnZSwgYW5kIHRoZSBmdWxsIGB1cmxzYCBzdGFja1xuICogYXNzZW1ibGVkIGludG8gYSBkb3duc2FtcGxlZCB2b2x1bWUgZm9yIHRoZSAzRCB0eXBlcy4gUmVnaW9uIHN0YXRlIGFuZCBkaXNwbGF5IG9wdGlvbnNcbiAqIGRlbGVnYXRlIHRvIHRoZSBzaGFyZWQge0BsaW5rIFJlZ2lvblN0b3JlfSAvIHtAbGluayBWaXN1YWxpemVyU3RvcmV9LCBleGFjdGx5IGFzIE9TRCBkb2VzLlxuICpcbiAqIEZvbGxvdy11cHMgKGppdC11aSMxMDIpOiBuYXRpdmUtcmVzb2x1dGlvbiBweXJhbWlkYWwgdGlsaW5nLCBvbi1jYW52YXMgdG9vbHMsIHJlZ2lvblxuICogb3ZlcmxheSByZW5kZXJpbmcsIHBlci1jaGFubmVsIGhpc3RvZ3JhbXMsIFRJRkYgZXhwb3J0LlxuICovXG4vKipcbiAqIFdoYXQgdGhlIDNEIHBvaW50cyBsYXllciBuZWVkcyB0byBjb2xvdXIgYSBjbG91ZDogb25lIHNjYWxhciBwZXIgcG9pbnQsIGEgY29sb3JtYXAsIGFuZCB0aGVcbiAqIHdpbmRvdyB0aGF0IG1hcHMgc2NhbGFycyBvbnRvIGl0LiBDYXRlZ29yaWNhbCBhbmQgY29udGludW91cyBjb2xvdXJpbmdzIGJvdGggcmVkdWNlIHRvIHRoaXMsXG4gKiBiZWNhdXNlIHRoZSBsYXllciBvZmZlcnMgbm8gcGVyLXBvaW50IGNvbG91ciBjaGFubmVsLlxuICovXG5pbnRlcmZhY2UgU3BhdGlhbDNkRW5jb2Rpbmcge1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgY29sb3JtYXA6IENvbG9ybWFwO1xuICBjb250cmFzdExpbWl0czogW251bWJlciwgbnVtYmVyXTtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSBleHRlbmRzIEJhc2VTdG9yZVZpc3VhbGl6ZXIgaW1wbGVtZW50cyBJVmlzdWFsaXplciB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZSxcbiAgXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcblxuICBwcml2YXRlIHZpZXdlcjogVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkOiBOYXBhcmlMb2FkZWQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIDNEIHZvbHVtZSBsYXllcnMgKG9uZSBhZGRpdGl2ZSB0aW50ZWQgbGF5ZXIgcGVyIGNoYW5uZWxcbiAgICogIGZvciBtdWx0aWNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiBOdWxsIGluIDJELiAqL1xuICBwcml2YXRlIHZvbHVtZVZpZXc6IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdm9sdW1lIGlzIGNvbXBvc2l0ZWQgZnJvbSBwZXItY2hhbm5lbCBsYXllcnMgKHZzIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiAqL1xuICBwcml2YXRlIHZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGhlaWdodC1maWVsZCBzdXJmYWNlIG1lc2ggKE5BUEFSSV9TVVJGQUNFIHBsb3QgdHlwZTsgbnVsbCBvdGhlcndpc2UpLiBCdWlsdCBmcm9tIGFcbiAgICogIHNpbmdsZSBncmF5c2NhbGUgc2xpY2UgYnkge0BsaW5rIGJ1aWxkU3VyZmFjZX0gdmlhIG5hcGFyaS1qcydzIGBoZWlnaHRGaWVsZGAgKyBgYWRkU3VyZmFjZWAuICovXG4gIHByaXZhdGUgc3VyZmFjZUxheWVyOiBTdXJmYWNlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoaWNoIGJhbmQgdGhlIHN1cmZhY2Ugc2FtcGxlcyAoYSBjaGFubmVsIGluZGV4IGZvciBtdWx0aWNoYW5uZWwsIGVsc2UgdGhlIGNvbXBvc2l0ZSkuICovXG4gIHByaXZhdGUgc3VyZmFjZUNoYW5uZWw6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgbW91bnRlZCBTdXJmYWNlIGZvbGxvd3Mgb25lIGJhbmQgb2YgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgc3VyZmFjZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogUHJlLWxvYWRlZCBwZXItc2xpY2UgbHVtaW5hbmNlIHBsYW5lcyAoYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIHN1cmZhY2UgZ3JpZCksIGtleWVkIGJ5IHosXG4gICAqICBzbyB0aGUgc3RhY2sgc2xpZGVyIHJlYnVpbGRzIHRoZSBzdXJmYWNlIGluc3RhbnRseS4gRmlsbGVkIGJ5IHtAbGluayBwcmVsb2FkU3VyZmFjZVBsYW5lc30uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VyZmFjZVBsYW5lcyA9IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICA+KCk7XG4gIC8qKiBJbi1wbGFuZSBncmlkIGNhcCBmb3IgdGhlIGFjdGl2ZSBzdXJmYWNlIGxvYWQgKGZ1bGwgZ3JpZCDDtyB0aGUgZGVjaW1hdGUgZmFjdG9yKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTWF4R3JpZCA9IFNVUkZBQ0VfTUFYX0dSSUQ7XG4gIC8qKiBDb250cmFzdCB3aW5kb3cgW21pbixtYXhdIHRoZSBjdXJyZW50IHN1cmZhY2UgbWVzaCB3YXMgYnVpbHQgd2l0aC4gQSBjaGFuZ2UgcmVzaGFwZXMgdGhlXG4gICAqICBtZXNoIChwaXhlbCBoZWlnaHQgPSBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGl0IHRyaWdnZXJzIGEgZ2VvbWV0cnkgcmVidWlsZC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlV2luZG93OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXJzaXN0ZWQgd2lyZWZyYW1lIGNob2ljZSBmb3IgdGhlIHN1cmZhY2UgKHJlLWFwcGxpZWQgd2hlbiBhIG5ldyBzdXJmYWNlIG1vdW50cykuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpcmVmcmFtZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIDJEIHNjYXR0ZXIgcG9pbnRzIChyZWdpb24gY2VudHJvaWRzKSArIGl0cyByZWdpb24tY2hhbmdlIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyMmRQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhdHRlclJlZ2lvblN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBuYXBhcmktanMgM0Qgc2NhdHRlciAodm94ZWwgcG9pbnQgY2xvdWQpLiAqL1xuICBwcml2YXRlIHNjYXR0ZXIzZExheWVyOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTcGF0aWFsLW9taWNzIG9ic2VydmF0aW9uIG1hcmtlcnMgKyB0aGUgZGF0YXNldC92aWV3IHN1YnNjcmlwdGlvbiBkcml2aW5nIHRoZW0uICovXG4gIHByaXZhdGUgc3BhdGlhbFBvaW50czogUG9pbnRzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBwb2ludCBjbG91ZC4gT25lIGxheWVyOiBzZWxlY3Rpb24gaXMgYSBwZXItcG9pbnQgYWxwaGEgb24gaXQsIG5vdCBhIHNlY29uZC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzM2Q6IFBvaW50czNETGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsTGF5ZXJLZXkzZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbnRlcmxlYXZlZCB4LHkseiwgY2FjaGVkIHNvIGEgY29sb3VyIGNoYW5nZSBkb2VzIG5vdCByZS13YWxrIDMuN00gb2JzZXJ2YXRpb25zLiAqL1xuICBwcml2YXRlIHNwYXRpYWxQb3NpdGlvbnMzZDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJZGVudGl0eSBvZiB0aGUgc2NhbGFycyBjdXJyZW50bHkgdXBsb2FkZWQg4oCUIHNlZSB7QGxpbmsgcmVidWlsZFNwYXRpYWxQb2ludHMzZH0uICovXG4gIHByaXZhdGUgc3BhdGlhbFNjYWxhcktleTNkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBhbmF0b21pY2FsIHZvbHVtZSB0aGUgY2xvdWQgc2l0cyBpbnNpZGUsIHdoZW4gdGhlIGRhdGFzZXQgaGFzIG9uZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVm9sdW1lOiBWb2x1bWVMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwYXRpYWxWb2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGFsb25nc2lkZSB0aGUgY2xvdWQsIGFuZCB3aGF0IHRoZXkgd2VyZVxuICAgKiAgYnVpbHQgZnJvbSDigJQgcmFzdGVyaXNpbmcgaXMgc2Vjb25kcyBvZiB3b3JrLCBzbyBpdCBtdXN0IG5vdCByZXBlYXQgZm9yIGFcbiAgICogIGNoYW5nZSB0aGF0IGNhbm5vdCBhZmZlY3QgdGhlIGZpZWxkLiAqL1xuICBwcml2YXRlIGRlbnNpdHlMYXllcnM6IFZvbHVtZUxheWVyW10gPSBbXTtcbiAgcHJpdmF0ZSBkZW5zaXR5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNlbGVjdGlvbiBpZGVudGl0eSwgYXMgYSBudW1iZXIgdGhlIGRlbnNpdHkga2V5IGNhbiBjYXJyeS4gKi9cbiAgcHJpdmF0ZSBsYXN0U2VsZWN0aW9uU2VlbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXZpc2lvbiA9IDA7XG4gIC8qKiBUaGUgZ2VuZSBtYXA6IGl0cyBsYXllciwgdGhlIGZpZWxkIGl0IHdhcyBlc3RpbWF0ZWQgZnJvbSwgYW5kIHRoZSBpbnB1dHMgZWFjaFxuICAgKiAgd2FzIGJ1aWx0IGZvciDigJQgdGhlIGZpZWxkIGlzIHRoZSBleHBlbnNpdmUgaGFsZiBhbmQgc3Vydml2ZXMgYSByZWNvbG91ci4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwTGF5ZXI6IEltYWdlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwRmllbGQ6IEV4cHJlc3Npb25GaWVsZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBGaWVsZEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgM0QgZ2VuZSBtYXA6IGl0cyB2b2x1bWUgbGF5ZXIsIHRoZSBmaWVsZCBiZWhpbmQgaXQsIGFuZCB0aGUgaW5wdXRzIGVhY2hcbiAgICogIHdhcyBidWlsdCBmb3Ig4oCUIHNhbWUgdHdvIGNsb2NrcyBhcyB0aGUgMkQgbWFwLiAqL1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVMYXllcjogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lRmllbGQ6IEV4cHJlc3Npb25Wb2x1bWVGaWVsZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVGaWVsZEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPZmZzZXQgYXBwbGllZCB0byBvYnNlcnZhdGlvbiBjb29yZGluYXRlcyB0byBzaXQgdGhlbSBpbiB0aGUgdm9sdW1lJ3MgYm94LiAqL1xuICBwcml2YXRlIHNwYXRpYWxPcmlnaW4zZDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDBdO1xuICAvKiogQ3Vyc29yIHRvb2x0aXAgZm9yIHRoZSBzcGF0aWFsIHZpZXdzLCBhbmQgZXZlcnl0aGluZyBpdCBuZWVkczogd2hhdCB0aGVcbiAgICogIGNsb3VkIGlzIGNvbG91cmVkIGJ5LCBhbmQgd2hlcmUgZWFjaCBkcmF3biBvYnNlcnZhdGlvbiBpcy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVG9vbHRpcDogTmFwYXJpU3BhdGlhbFRvb2x0aXAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZTogSG92ZXJTb3VyY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZXF1ZW5jZXMgdGhlIGFzeW5jIHJlc29sdXRpb25zLiBUaGUgS0VZIGlzIG9ubHkgY29tbWl0dGVkIG9uY2Ugb25lIGxhbmRzLFxuICAgKiAgc28gYSBzdXBlcnNlZGVkIGZldGNoIGNhbm5vdCBsZWF2ZSB0aGUgY2FjaGUgY2xhaW1pbmcgdG8gaG9sZCBhIHNvdXJjZSBpdFxuICAgKiAgbmV2ZXIgc3RvcmVkLiAqL1xuICBwcml2YXRlIGhvdmVyU291cmNlVG9rZW4gPSAwO1xuICAvKiogRHJhd24gb2JzZXJ2YXRpb25zJyBwb3NpdGlvbnMgZm9yIGhpdC10ZXN0aW5nLCBpbmRleGVkIEJZIE9CU0VSVkFUSU9OIHdpdGhcbiAgICogIE5hTiBmb3IgYW55dGhpbmcgbm90IGRyYXduLiBTY3JlZW4gcGl4ZWxzIGluIDNEICh0aGUgY2FtZXJhIG1vdmVzIHRoZW0sIHNvXG4gICAqICB0aGV5IGFyZSByZWJ1aWx0IHdoZW4gaXQgZG9lcykgYW5kIFdPUkxEIHVuaXRzIGluIDJEICh3aGVyZSB0aGUgY2FtZXJhIG9ubHlcbiAgICogIHNjYWxlcywgc28gdGhlIHBvaW50ZXIgaXMgY29udmVydGVkIGluc3RlYWQgb2YgMzc0ayBwb2ludHMpLiAqL1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uc1JldiA9IC0xO1xuXG4gIC8qKlxuICAgKiBTY3JlZW4tc3BhY2UgYnVja2V0IGluZGV4IG92ZXIgdGhlIDNEIHByb2plY3Rpb24sIGJ1aWx0IG9uIHRoZSBmaXJzdCBob3ZlciBhZnRlciB0aGVcbiAgICogc2NlbmUgbW92ZWQgcmF0aGVyIHRoYW4gd2hlbiBpdCBtb3Zlcy5cbiAgICpcbiAgICogTGF6aWx5LCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgZGVzaWduOiBhbiBvcmJpdCBkcmFnIGNoYW5nZXMgdGhlIGNhbWVyYSBldmVyeSBmcmFtZSwgc29cbiAgICogYnVpbGRpbmcgZWFnZXJseSB3b3VsZCBzcGVuZCB0ZW5zIG9mIG1pbGxpc2Vjb25kcyBhIGZyYW1lIGluZGV4aW5nIGZvciBwaWNrcyBub2JvZHkgaXNcbiAgICogbWFraW5nLiBEZWZlcnJlZCwgaXQgaXMgYnVpbHQgb25jZSB3aGVuIHRoZSBkcmFnIHN0b3BzIGFuZCB0aGUgcG9pbnRlciBuZXh0IG1vdmVzIOKAlFxuICAgKiBtZWFzdXJlZCB1cHN0cmVhbSBhdCAzLjdNIHBvaW50cywgdGhhdCB0dXJucyBhIDEyLjYgbXMgc2NhbiBwZXIgcG9pbnRlcm1vdmUgaW50b1xuICAgKiAwLjA2NiBtcy5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJJbmRleDogU2NyZWVuSW5kZXggfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCB3aGVuZXZlciB0aGUgY2FjaGVkIHBvc2l0aW9ucyBnbyBzdGFsZTogYSBtYXJrZXIgcmVidWlsZCwgb3Ig4oCUIGluIDNEXG4gICAqICBvbmx5LCB3aGVyZSB0aGUgcHJvamVjdGlvbiBkZXBlbmRzIG9uIGl0IOKAlCBhIGNhbWVyYSBtb3ZlLiAqL1xuICBwcml2YXRlIHNwYXRpYWxTY2VuZVJldiA9IDA7XG4gIHByaXZhdGUgaG92ZXJQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJGcmFtZSA9IDA7XG4gIHByaXZhdGUgaG92ZXJPZmY6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIC8qKiBPYnNlcnZhdGlvbiBpbmRpY2VzIHRoZSBjYWNoZWQgM0QgcG9zaXRpb25zIGJlbG9uZyB0bywgaW4gdGhlIHNhbWUgb3JkZXI7XG4gICAqICBudWxsIHdoZW4gZXZlcnkgb2JzZXJ2YXRpb24gaXMgZHJhd24uIFdpdGhvdXQgaXQgYSBwcm9qZWN0aW9uIGJ1aWx0IGZyb20gdGhlXG4gICAqICBwb3NpdGlvbnMgaXMgaW5kZXhlZCBieSBEUkFXTiBvcmRlciBhbmQgc2lsZW50bHkgYXR0cmlidXRlcyBlYWNoIHBvaW50IHRvXG4gICAqICB0aGUgd3Jvbmcgb2JzZXJ2YXRpb24gYXMgc29vbiBhcyBhIHNlY3Rpb24gaXMgaXNvbGF0ZWQuICovXG4gIHByaXZhdGUgc3BhdGlhbERyYXduM2Q6IFVpbnQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFJldXNlZCBwcm9qZWN0aW9uIGJ1ZmZlcnMg4oCUIHNlZSB7QGxpbmsgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb259LiAqL1xuICBwcml2YXRlIHNwYXRpYWxQcm9qZWN0aW9uM2Q6IFByb2plY3RlZFBvaW50cyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogUGVyLW9ic2VydmF0aW9uIGRlcHRoIGZyb20gdGhlIGxhc3QgcHJvamVjdGlvbiwgZm9yIHRoZSBkZXB0aC1hd2FyZSBob3ZlciBwaWNrLiAqL1xuICBwcml2YXRlIHNwYXRpYWxEZXB0aHMzZDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgKHZpZXdlciwgZGF0YXNldCkgd2hvc2UgM0Qgc2NlbmUgaGFzIGFscmVhZHkgaGFkIGl0cyBvcGVuaW5nIGZyYW1pbmcuICovXG4gIC8qKiBXaG9zZSAyRCBvYnNlcnZhdGlvbnMgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVTcGF0aWFsUG9pbnRzT25jZX0uICovXG4gIHByaXZhdGUgc3BhdGlhbDJkRnJhbWVkOiB7IHZpZXdlcjogVmlld2VyOyBkYXRhc2V0SWQ6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEYXRhc2V0IHRoZSAzRCBzY2FsZSBiYXIgd2FzIGJ1aWx0IGZvci4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2NhbGVCYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwYXRpYWxTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogTGV2ZWwtb2YtZGV0YWlsIGNlbGwgb3V0bGluZXMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IG92ZXIgdGhlIDJEIHZpZXcg4oCUIGNyZWF0ZWQgb25cbiAgICogIGZpcnN0IHVzZSwgYW5kIG9ubHkgd2hlbiBhIHNwYXRpYWwgcG9ydCBpcyBib3VuZC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVGlsZXNNZ3I6IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGb3IgdGhlIHBhbmVsOiB0aGUgdHJhbnNjcmlwdHMtaW4tdmlldyBlc3RpbWF0ZSBhbmQgdGhlIGRlbnNpdHkgd2luZG93IGluIHVzZS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNjcmlwdEVzdGltYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJhbnNjcmlwdEVzdGltYXRlIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW4gdmlldyAoc2VlIE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzLmdlbmVDb3VudHNJbikuICovXG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRlbnNpdHlTdGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuICAvKiogTGF0ZXN0IChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiBzYXcsIHNvIGEgc2xpY2VcbiAgICogIGNoYW5nZSBjYW4gcmVidWlsZCB0aGUgbWFya2VycyBmb3IgdGhlIG5ldyBwbGFuZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsTGF0ZXN0OiBbU3BhdGlhbERhdGFzZXQgfCBudWxsLCBTcGF0aWFsVmlld1N0YXRlLCBTcGF0aWFsU2VsZWN0aW9uTWFza10gfCBudWxsID1cbiAgICBudWxsO1xuICAvKiogV2hpY2ggZGF0YXNldCB0aGUgY3VycmVudCBtYXJrZXIgbGF5ZXIgd2FzIGJ1aWx0IGZvciwgc28gYSBkaXNwbGF5LW9ubHlcbiAgICogIGNoYW5nZSAoc2l6ZSwgY29sb3VyLCBvcGFjaXR5LCBzZWxlY3Rpb24pIGNhbiB1cGRhdGUgaXQgaW4gcGxhY2UuICovXG4gIHByaXZhdGUgc3BhdGlhbExheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE1vbm90b25pYyBndWFyZCBmb3IgdGhlIGFzeW5jIGNvbG91ciByZWJ1aWxkOiBmZXRjaGluZyBhIGdlbmUgdmVjdG9yIGlzIGFcbiAgICogIHJvdW5kLXRyaXAsIHNvIGEgZmFzdCBzZXF1ZW5jZSBvZiBjb2xvdXItYnkgY2hhbmdlcyBjYW4gcmVzb2x2ZSBvdXQgb2ZcbiAgICogIG9yZGVyLiBPbmx5IHRoZSBuZXdlc3QgcmVidWlsZCBpcyBhbGxvd2VkIHRvIHRvdWNoIHRoZSBsYXllci4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUmVidWlsZFRva2VuID0gMDtcbiAgLyoqIFwieCByZWxvYWRpbmfigKZcIiBhdCB0aGUgYm90dG9tIG9mIHRoZSBjYW52YXM6IHRoZSB0aWxlIGxheWVycycgbG9hZHMgYW5kIHRoZSBvYnNlcnZhdGlvbnMnLiAqL1xuICBwcml2YXRlIGxvYWRpbmdCYWRnZTogTmFwYXJpTG9hZGluZ0JhZGdlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGlsZUxvYWRpbmc6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgb2JzZXJ2YXRpb25zTG9hZGluZyA9IDA7XG4gIC8qKiBNb25vdG9uaWMgbG9hZCBnZW5lcmF0aW9uLiBCdW1wZWQgYnkge0BsaW5rIHJlc2V0fSBhbmQge0BsaW5rIGNhbmNlbExvYWRpbmd9OyB0aGUgZnJhbWUtbG9hZGluZ1xuICAgKiAgbG9vcHMgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKSBjYXB0dXJlIGl0IGFuZCBiYWlsIHdoZW4gaXQgY2hhbmdlcywgc28gYSBDYW5jZWwgKG9yIGFcbiAgICogIG5ldyBwbG90KSBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgbG9hZFRva2VuID0gMDtcbiAgLyoqIERlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcyAoMSA9IEZ1bGwsIDIgPSDCvSBkZWZhdWx0LCA0ID0gwrwsIDggPSDihZspLiBBcHBsaWVkIHdoZW4gYVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZSAocmUpbG9hZHM7IGNoYW5naW5nIGl0IG5lZWRzIGEgcmUtcGxvdCAoaXQgY2hhbmdlcyBmZXRjaGVkIGRhdGEpLiAqL1xuICBwcml2YXRlIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuICAvKiogM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZSB2aWV3IChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGF5ZXI6IEF4ZXNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogRE9NIFgvWS9aICsgc2NhbGUgbGFiZWxzIHRyYWNraW5nIHRoZSAzRCBheGVzIGdpem1vIChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGFiZWxzOiBOYXBhcmlBeGVzTGFiZWxzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEcmFnZ2FibGUgWi1oZWlnaHQgZ3JpcCBvdmVyIHRoZSB2b2x1bWUgKG51bGwgdW5sZXNzIGEgdm9sdW1lL2lzb3N1cmZhY2UgaXMgbW91bnRlZCkuICovXG4gIHByaXZhdGUgekhhbmRsZTogTmFwYXJpVm9sdW1lWkhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVXNlciBaLWhlaWdodCBmYWN0b3IgZm9yIHRoZSB2b2x1bWUgKDEgPSB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyk7IGRyaXZlbiBieSB0aGVcbiAgICogIGluLXZpZXcgZHJhZyBoYW5kbGUuIFJlc2V0IHBlciBtb3VudC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVaU2NhbGUgPSAxO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBgdm9sdW1lWlNjYWxlID0gMWAgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGVcbiAgICogIHRoZSBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVXb3JsZEJhc2U6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZVNhbXBsZWREZXB0aCA9IDE7XG4gIC8qKiBQZXJzaXN0ZWQgYXhlcyBvbi9vZmYgY2hvaWNlLCByZS1hcHBsaWVkIHdoZW4gYSBuZXcgdm9sdW1lIG1vdW50cy4gRGVmYXVsdHMgb24uICovXG4gIHByaXZhdGUgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIHZvbHVtZURpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogTW9ub3RvbmljIHNsaWNlLXJlcXVlc3QgaWQgc28gYSBzbG93IG91dC1vZi1vcmRlciBzbGljZSBmZXRjaCBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIENhY2hlZCBgL3RpbGVzL2luZm9gIHB5cmFtaWQgZGVzY3JpcHRvciArIHRoZSBpbmZvQjY0IGl0IHdhcyBmZXRjaGVkIGZvci4gKi9cbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgMkQgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIGhpc3RvZ3JhbSArIHN0YXRlIGFwcGxpY2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyB0aGF0IG93bnMgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCAoYnVpbGQgKyBsaXZlIGRpc3BsYXlcbiAgICogIHVwZGF0ZXMpIGZvciB0aGUgY3VycmVudCB7QGxpbmsgaW1hZ2VNb2RlfS4gUmVidWlsdCBvbiBlYWNoIChyZSlyZW5kZXIuICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGl2ZSBzdWJzY3JpcHRpb24gYXBwbHlpbmcgY2hhbm5lbC1zdGF0ZSAvIGNvbG9ybWFwIGNoYW5nZXMgdG8gdGhlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBncmF5c2NhbGUgY29sb3JtYXAgc2VsZWN0aW9uIGZyb20gdGhlIHN0b3JlIChhcHBsaWVkIHRvIHRoZSBzaW5nbGUgZ3JheSBsYXllcikuICovXG4gIHByaXZhdGUgY3VycmVudENvbG9ybWFwOiBDb2xvcm1hcE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UmV2ZXJzZSA9IGZhbHNlO1xuICAvKiogTGF0ZXN0IGludmVydCB0b2dnbGUgZnJvbSB0aGUgc3RvcmUgKGZsaXBzIGludGVuc2l0eSBiZWZvcmUgdGhlIGNvbG9ybWFwLCBsaWtlIE9TRCkuICovXG4gIHByaXZhdGUgaW52ZXJ0RW5hYmxlZCA9IGZhbHNlO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgZm9yIHRoZSAyRCBpbWFnZSAobnVsbCB3aGVuIDNEIG9yIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogTmFwYXJpU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE92ZXJ2aWV3IG1pbmltYXAgKGJvdHRvbS1yaWdodCksIGFzIE9TRCdzIG5hdmlnYXRvci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3I6IE5hcGFyaU5hdmlnYXRvciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hldGhlciB0aGUgbmF2aWdhdG9yIGlzIHNob3duIOKAlCB0aGUgc2FtZSBob3N0IHNldHRpbmcgT1NEJ3MgbmF2aWdhdG9yIGhvbm91cnMuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yVmlzaWJsZSA9IHRydWU7XG4gIC8qKiBCdW1wZWQgcGVyIHRodW1ibmFpbCByZXF1ZXN0LCBzbyBhIHNsb3cgb25lIGNhbm5vdCBvdmVyd3JpdGUgYSBuZXdlciBzbGljZSdzLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclRva2VuID0gMDtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgdW50aWwgYSAyRCBpbWFnZSBpcyBwbG90dGVkKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5OiBOYXBhcmlSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQaXhlbC10b29sIHBsdW1iaW5nOiB0aGUgcGxvdCBkaXYgaWQsIGNvb3JkIHRyYW5zZm9ybSwgYW5kIGJvdW5kIHRvb2wgaG9zdHMuICovXG4gIHByaXZhdGUgcGxvdERpdklkID0gJyc7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3Q6IFdhbmRUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVyYXNlckhvc3Q6IFZlcnRleEVyYXNlclRvb2xIb3N0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWaXNpYmxlIHdvcmxkIHJlY3QgY2FwdHVyZWQgQVQgdGhlIGxhc3QgcmVhZGJhY2sg4oCUIG11c3QgcGFpciB3aXRoIGBsYXN0UGl4ZWxzYCBzbyB0aGUgcGl4ZWxcbiAgICogIHRvb2xzJyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZSBtYXRyaXgncyBjYW1lcmEgKHVzaW5nIHRoZSBsaXZlIHJlY3QgYWZ0ZXIgYSBwYW4vem9vbSB3b3VsZFxuICAgKiAgbWlzLXNjYWxlIHRoZSByZWdpb24pLiAqL1xuICBwcml2YXRlIGxhc3RQaXhlbHNSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKSB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzLCB0aGUgZGVmYXVsdCkuICovXG4gIHByaXZhdGUgaW1hZ2VTbW9vdGhpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hlbiB0aGUgMkQgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgcHJpdmF0ZSB0aWxlZCA9IGZhbHNlO1xuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIHRpbWVyICsgY2FtZXJhLWNoYW5nZSB1bnN1YnNjcmliZSAoa2VlcCBsYXN0UGl4ZWxzIGN1cnJlbnQgZm9yIHRvb2xzKS4gKi9cbiAgcHJpdmF0ZSByZWFkYmFja1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYVJlYWRiYWNrT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscy4gUmVmcmVzaGVkIG9uIHBsb3QgKyBzbGljZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAgKD44LWJpdCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSByZWFkb25seSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBvbmx5IGEgaG9zdCB0aGF0IHNlcnZlcyBzcGF0aWFsLW9taWNzIGRhdGEgcHJvdmlkZXMgaXQsIGFuZFxuICAgIC8vIHdpdGhvdXQgaXQgdGhlIFNQQVRJQUxfT01JQ1MgcGxvdCB0eXBlIGlzIG5ldmVyIG9mZmVyZWQgYW55d2F5LlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCArIGNhY2hlIHRoZSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIChgR0VUIC90aWxlcy9pbmZvYCk6IHRoZSBSRUFMIHBlci1sZXZlbCB0aWxlIGdyaWQsXG4gICAqIHRpbGUgc2l6ZSwgY2hhbm5lbCBtZXRhZGF0YSBhbmQgcGh5c2ljYWwgcGl4ZWwgc2l6ZS4gVGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZVxuICAgKiBpcyBzdGlsbCBjYWNoaW5nLCBzbyB3ZSBwb2xsIGJyaWVmbHkuIENhY2hlZCBwZXIgYGluZm9CNjRgOyByZXR1cm5zIG51bGwgaWYgaXQgbmV2ZXIgYmVjb21lc1xuICAgKiByZWFkeSAoY2FsbGVycyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUtdGlsZSBmZXRjaCkuIFRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgZ3JpZCDigJQgZ3Vlc3NpbmdcbiAgICogbGV2ZWwgZGltcyBmcm9tIGB0cnVlSW1hZ2VTaXplYCBvdmVyc2hvb3RzIHRoZSByZWFsIGdyaWQgYW5kIHRoZSBzZXJ2ZXIgNDAwcyBvdXQtb2YtcmFuZ2UgdGlsZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlc2NyaXB0b3IoKTogUHJvbWlzZTxUaWxlRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAobm8gdGlsZSBzZXJ2ZXIg4oCUIGUuZy4gYSBudW1iZXJlZCBpbWFnZVxuICAgIC8vIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsIGVhY2ggc2xpY2UgYSBkaWZmZXJlbnQgZmlsZSk6IHRoZXJlIGlzIG5vXG4gICAgLy8gc2luZ2xlIHNlcnZlci10aWxlZCBweXJhbWlkIHRvIGRlc2NyaWJlLiBSZXR1cm5pbmcgbnVsbCByb3V0ZXMgZXZlcnlcbiAgICAvLyBjYWxsZXIgKDJEIGltYWdlLCB2b2x1bWUsIHN1cmZhY2UpIHRvIHRoZWlyIHN0aXRjaGVkL3NpbmdsZS1mZXRjaFxuICAgIC8vIGZhbGxiYWNrLCB3aGljaCDigJQgdmlhIGZldGNoU2xpY2UncyBvd24gU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIGJyYW5jaCDigJRcbiAgICAvLyBjb3JyZWN0bHkgZmV0Y2hlcyBlYWNoIHNsaWNlJ3Mgb3duIFVSTCBpbnN0ZWFkIG9mIG9uZSBmaXhlZCBmaWxlJ3MgdGlsZVxuICAgIC8vIHB5cmFtaWQuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUodGhpcy5sb2FkZWQ/LmltYWdlSW5mbykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmRlc2NyaXB0b3JLZXkgPT09IGluZm9CNjQpIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgREVTQ1JJUFRPUl9USU1FT1VUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyBUaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAoYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGJvZHk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JLZXkgPSBpbmZvQjY0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgZW1wdHkgYm9keSDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRpbGVzL2luZm8gbm90IHJlYWR5OyBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlLXRpbGUgZmV0Y2gnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMjAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgQ09NUExFVEUgcmVuZGVyZWQgc2xpY2UgYXMgYW4gYEltYWdlQml0bWFwYCBieSBzdGl0Y2hpbmcgdGhlIHNlcnZlcidzIFJFQUwgdGlsZSBncmlkXG4gICAqIChmcm9tIGAvdGlsZXMvaW5mb2ApIOKAlCBub3QganVzdCB0aGUgdG9wLWxlZnQgdGlsZSwgd2hpY2ggb25seSBldmVyIHNob3dlZCBhIGxhcmdlIGltYWdlJ3NcbiAgICogY29ybmVyLiBQaWNrcyB0aGUgZmluZXN0IHB5cmFtaWQgbGV2ZWwgd2hvc2UgZ3JpZCBmaXRzIGBidWRnZXRUaWxlc2AgYW5kIHdob3NlIGxvbmdlc3Qgc2lkZSBpc1xuICAgKiB3aXRoaW4gdGhlIEdQVSB0ZXh0dXJlIGxpbWl0LCBmZXRjaGVzIHRoYXQgZ3JpZCBjb25jdXJyZW50bHksIGFuZCBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMuXG4gICAqXG4gICAqIGBjaGFubmVsYCBzZWxlY3RzIGEgc2luZ2xlIGJhbmQgYXMgZ3JheXNjYWxlIChyZWFsIGxldmVscyBvbmx5KTsgb21pdCBmb3IgdGhlIHNlcnZlciBjb21wb3NpdGUuXG4gICAqIGBidWRnZXRUaWxlc2AgY2FwcyB0aGUgZ3JpZDogdGhlIDJEIHZpZXcgdXNlcyB0aGUgZnVsbCBidWRnZXQgZm9yIGRldGFpbDsgdGhlIDNEIHZvbHVtZSBwYXNzZXNcbiAgICogMSBmb3IgYSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBzbGljZSAoaXQgZG93bnNhbXBsZXMgdG8ge0BsaW5rIFZPTFVNRV9NQVhfU0xJQ0V9KS4gRmFsbHMgYmFja1xuICAgKiB0byBhIHNpbmdsZSBgY29sPTAscm93PTBgIHRpbGUgd2hlbiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSAoc21hbGwvc2ltcGxlIGltYWdlcywgdm9sdW1lcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU2xpY2UoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM6IG51bWJlciA9IE1BWF9TVElUQ0hfVElMRVMsXG4gICAgLyoqIFdoZW4gYSBzcGVjaWZpYyBjaGFubmVsIGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiBgYnVkZ2V0VGlsZXNgLCBkcm9wIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiAgQ09NUE9TSVRFIG92ZXJ2aWV3IGluc3RlYWQgb2Ygc3RpdGNoaW5nIHRoZSBodWdlIHBlci1jaGFubmVsIGxldmVsLiBPbmx5IHNhZmUgd2hlbiB0aGUgY2FsbGVyXG4gICAgICogIHdhbnRzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSAodGhlIHN1cmZhY2UgaGVpZ2h0KTogZm9yIGEgbXVsdGljaGFubmVsIFZPTFVNRSBldmVyeSBjaGFubmVsXG4gICAgICogIHdvdWxkIHRoZW4gZmV0Y2ggdGhlIHNhbWUgY29tcG9zaXRlIGFuZCB0aGUgY2hhbm5lbHMgd291bGQgY29sbGFwc2UgaW50byBvbmUsIHNvIHZvbHVtZVxuICAgICAqICBhc3NlbWJseSBsZWF2ZXMgdGhpcyBgZmFsc2VgIHRvIGtlZXAgZWFjaCBiYW5kIGRpc3RpbmN0LiAqL1xuICAgIGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxJbWFnZUJpdG1hcD4ge1xuICAgIC8vIFNlbGYtY29udGFpbmVkIG11bHRpLXNsaWNlIHN0YWNrICh0aWxlZDpmYWxzZSk6IGB6YCBpbmRleGVzIGEgY29tcGxldGVseVxuICAgIC8vIGRpZmZlcmVudCBmaWxlJ3Mgb3duIHByZXZpZXcgVVJMLCBub3QgYW4gaW50ZXJuYWwgc2xpY2Ugb2Ygb25lIHNlcnZlci1cbiAgICAvLyB0aWxlZCBmaWxlIOKAlCByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChzaGFyZWRcbiAgICAvLyB3aXRoIE9TRDsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIGJhcmUgZmV0Y2goKSkgaW5zdGVhZCBvZlxuICAgIC8vIGJ1aWxkaW5nIGEgL3RpbGU/aW5mbz0uLi4mej0gcmVxdWVzdCBhZ2FpbnN0IHdoaWNoZXZlciBzaW5nbGUgZmlsZVxuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCgpIHBvaW50cyBhdCAod2hpY2ggd291bGQgNDAwL21pc21hdGNoIGZvciBhbnkgelxuICAgIC8vIGJleW9uZCB0aGF0IG9uZSBmaWxlJ3Mgb3duIGV4dGVudCkuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykpIHtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHZvbHVtZTogZmV0Y2ggdGhlIHJlcXVlc3RlZCBjaGFubmVsJ3MgT1dOIHBsYW5lXG4gICAgICAvLyAoY2hhbm5lbFVybHNbel1bY2hhbm5lbF0pIHNvIGVhY2ggYmFuZCBzdGF5cyBkaXN0aW5jdCDigJQgdGhlIGNsaWVudC1zaWRlXG4gICAgICAvLyBhbmFsb2cgb2YgdGhlIHNlcnZlcidzIHBlci1jaGFubmVsIC90aWxlP2NoYW5uZWw9Yy4gRWxzZSB0aGUgei1hbmNob3IgVVJMLlxuICAgICAgY29uc3QgY2hVcmxzID0gKGluZm8gYXMgSUltYWdlSW5mbykuY2hhbm5lbFVybHM7XG4gICAgICBjb25zdCB1cmwgPSBjaGFubmVsICE9IG51bGwgJiYgY2hVcmxzPy5bel0/LltjaGFubmVsXSAhPSBudWxsXG4gICAgICAgID8gY2hVcmxzW3pdW2NoYW5uZWxdXG4gICAgICAgIDogdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW5mbyBhcyBJSW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIG5vIFVSTCBmb3Igc2xpY2UgJHt6fWApO1xuICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0JpdG1hcCh1cmwpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gbm8gc2VsZWN0ZWQgaW1hZ2UgaW5mbyAoZ2V0U2VsZWN0ZWRJbmZvQjY0IG51bGwpJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG5cbiAgICAvLyBUaGUgcmVxdWVzdGVkIGJhbmQ7IG1heSBiZSBkcm9wcGVkIHRvIHRoZSBjb21wb3NpdGUgKHVuZGVmaW5lZCkgYmVsb3cgd2hlbiB0aGUgY2hhbm5lbCBoYXMgbm9cbiAgICAvLyBweXJhbWlkIGxldmVsIHNtYWxsIGVub3VnaCB0byBzdGl0Y2ggd2l0aGluIGJ1ZGdldC5cbiAgICBsZXQgZWZmZWN0aXZlQ2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgY29uc3QgZmV0Y2hUaWxlID0gYXN5bmMgKFxuICAgICAgcmVzOiBudW1iZXIsXG4gICAgICBjb2w6IG51bWJlcixcbiAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgdDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+ID0+IHtcbiAgICAgIGNvbnN0IGNoID0gZWZmZWN0aXZlQ2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtlZmZlY3RpdmVDaGFubmVsfWA7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2NvbH0mcm93PSR7cm93fSZ6PSR7en0mdGlsZVNpemU9JHt0fSR7Y2h9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHNsaWNlIGZldGNoIGZhaWxlZDogJHtyZXNwLnN0YXR1c30gKCR7Y29sfS8ke3Jvd30gcmVzICR7cmVzfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgfTtcblxuICAgIC8vIE5vIGRlc2NyaXB0b3Ig4oaSIHNpbmdsZSB0b3AtbGVmdCB0aWxlIChsZWdhY3kgZmFsbGJhY2s7IGNvcnJlY3QgZm9yIHNtYWxsL3NpbXBsZSBpbWFnZXMpLlxuICAgIGlmICghZGVzYyB8fCAhZGVzYy5sZXZlbHM/Lmxlbmd0aCkgcmV0dXJuIGZldGNoVGlsZSgwLCAwLCAwLCBUSUxFX1NJWkUpO1xuXG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IE9OTFkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHMgKHRoZSBmcm9udCBvZiBgbGV2ZWxzYCk7IHRoZSBzZXJ2ZXJcbiAgICAvLyBjb21wb3NpdGUgZXhpc3RzIGF0IGV2ZXJ5IGxldmVsLCBpbmNsdWRpbmcgdGhlIHNtYWxsIG92ZXJ2aWV3cy5cbiAgICBjb25zdCBwZXJDaGFubmVsTGV2ZWxzID0gZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsID8gZGVzYy5sZXZlbHMgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBwZXJDaGFubmVsTGV2ZWxzKSk7XG5cbiAgICAvLyBGaW5lc3QgbGV2ZWwgd2hvc2Ugc3RpdGNoZWQgZ3JpZCBmaXRzIEJPVEggdGhlIHRpbGUgYnVkZ2V0IGFuZCB0aGUgR1BVIHRleHR1cmUgbGltaXQ7IGlmIG5vbmVcbiAgICAvLyBmaXRzLCB0aGUgY29hcnNlc3QgYXZhaWxhYmxlIChmaXRzPWZhbHNlKS5cbiAgICBjb25zdCB0aWxlc0ZvciA9IChsdmw6IFRpbGVMZXZlbCk6IG51bWJlciA9PlxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpKSAqIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwuaGVpZ2h0IC8gdCkpO1xuICAgIGNvbnN0IHBpY2sgPSAobGV2ZWxzOiBUaWxlTGV2ZWxbXSk6IHsgbHZsOiBUaWxlTGV2ZWw7IGZpdHM6IGJvb2xlYW4gfSA9PiB7XG4gICAgICBsZXQgYyA9IGxldmVsc1swXTtcbiAgICAgIGZvciAoY29uc3QgbHZsIG9mIGxldmVscykge1xuICAgICAgICBjID0gbHZsO1xuICAgICAgICBpZiAodGlsZXNGb3IobHZsKSA8PSBidWRnZXRUaWxlcyAmJiBNYXRoLm1heChsdmwud2lkdGgsIGx2bC5oZWlnaHQpIDw9IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgICAgIHJldHVybiB7IGx2bCwgZml0czogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsdmw6IGMsIGZpdHM6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCBzZWwgPSBwaWNrKHVzYWJsZSk7XG4gICAgLy8gQSBzcGVjaWZpYyBjaGFubmVsIG9ubHkgaGFzIHRpbGVzIGF0IHRoZSAoZmV3LCBsYXJnZSkgcmVhbCBsZXZlbHMuIFdoZW4gbm9uZSBvZiB0aGVtIGZpdCB0aGVcbiAgICAvLyBidWRnZXQg4oCUIGUuZy4gdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXMgc3RpbGwgMTQ5ODLDlzE4NjcwIOKGkiB+MTEwMCBmdWxsLXJlcyB0aWxlcyDigJQgc3RpdGNoaW5nXG4gICAgLy8gaXQgcGVyIHNsaWNlIGZsb29kcyB0aGUgc2VydmVyICg1MDRzKSBhbmQgc3RhbGxzIHRoZSBsb2FkLiBUaGUgY29tcG9zaXRlIHB5cmFtaWQgaGFzIHNtYWxsXG4gICAgLy8gb3ZlcnZpZXcgbGV2ZWxzLCBzbyBmZXRjaCB0aGUgY29tcG9zaXRlIGluc3RlYWQgYW5kIGRlcml2ZSBsdW1pbmFuY2UgZnJvbSBpdC4gRXZlcnkgY2FsbGVyIGhlcmVcbiAgICAvLyAoc3VyZmFjZSBoZWlnaHQsIHZvbHVtZSBhc3NlbWJseSwgcmVhZGJhY2spIGRvd25zY2FsZXMgdGhlIHBsYW5lIGFueXdheSwgc28gYSBjb21wb3NpdGUtZGVyaXZlZFxuICAgIC8vIHBsYW5lIGlzIHRoZSByaWdodCB0cmFkZSBmb3Igb25lIHRoYXQgYWN0dWFsbHkgbG9hZHMuIE9ubHkga2lja3MgaW4gd2hlbiB0aGUgY2hhbm5lbCBjYW4ndCBmaXQuXG4gICAgaWYgKGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgJiYgIXNlbC5maXRzICYmIGNoYW5uZWwgIT0gbnVsbCAmJiBkZXNjLmxldmVscy5sZW5ndGggPiBwZXJDaGFubmVsTGV2ZWxzKSB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBwaWNrKGRlc2MubGV2ZWxzKTtcbiAgICAgIGlmIChjb21wb3NpdGUuZml0cyB8fCB0aWxlc0Zvcihjb21wb3NpdGUubHZsKSA8IHRpbGVzRm9yKHNlbC5sdmwpKSB7XG4gICAgICAgIGVmZmVjdGl2ZUNoYW5uZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNlbCA9IGNvbXBvc2l0ZTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbbmFwYXJpLWpzXSBjaGFubmVsICR7Y2hhbm5lbH0gaGFzIG5vIHB5cmFtaWQgbGV2ZWwgd2l0aGluIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlIGAgK1xuICAgICAgICAgICAgYGJ1ZGdldDsgdXNpbmcgdGhlIGNvbXBvc2l0ZSBvdmVydmlldyAocmVzICR7c2VsLmx2bC5yZXN9LCAke3NlbC5sdmwud2lkdGh9w5dgICtcbiAgICAgICAgICAgIGAke3NlbC5sdmwuaGVpZ2h0fSkgZm9yIHRoaXMgcGxhbmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hvc2VuID0gc2VsLmx2bDtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi53aWR0aCAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi5oZWlnaHQgLyB0KSk7XG4gICAgaWYgKCFzZWwuZml0cyAmJiBidWRnZXRUaWxlcyA9PT0gTUFYX1NUSVRDSF9USUxFUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gZnVsbCByZXNvbHV0aW9uIGV4Y2VlZHMgdGhlICR7YnVkZ2V0VGlsZXN9LXRpbGUvJHtNQVhfVEVYVFVSRV9ESU19cHggYnVkZ2V0OyBgICtcbiAgICAgICAgICBgZGlzcGxheWluZyBvdmVydmlldyBsZXZlbCByZXMgJHtjaG9zZW4ucmVzfSAoJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9KS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29scyA9PT0gMSAmJiByb3dzID09PSAxKSByZXR1cm4gZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIDAsIDAsIHQpO1xuXG4gICAgLy8gU3RpdGNoIGludG8gb25lIGxldmVsLXNpemVkIGNhbnZhcy4gRmV0Y2ggdGhlIGdyaWQgd2l0aCBCT1VOREVEIGNvbmN1cnJlbmN5OiBmaXJpbmcgZXZlcnkgdGlsZVxuICAgIC8vIGF0IG9uY2UgKGEgYmlnIGdyaWQgPSBodW5kcmVkcyBvZiByZXF1ZXN0cykgb3ZlcndoZWxtZWQgdGhlIHRpbGUgc2VydmVyICg1MDRzKS4gRWRnZSB0aWxlcyBhcmVcbiAgICAvLyBuYXJyb3dlci9zaG9ydGVyOyBkcmF3SW1hZ2UgcGxhY2VzIGVhY2ggYXQgaXRzIGdyaWQgb2Zmc2V0IHNvIHBhcnRpYWwgdGlsZXMgbGluZSB1cC5cbiAgICBjb25zdCBjb29yZHM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaCh7IGNvbCwgcm93IH0pO1xuICAgIH1cbiAgICBjb25zdCB0aWxlczogQXJyYXk8eyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXI7IGJtcDogSW1hZ2VCaXRtYXAgfT4gPSBbXTtcbiAgICBjb25zdCBzdGl0Y2hXb3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGpvYiA9IGNvb3Jkcy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWpvYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGUoY2hvc2VuLnJlcywgam9iLmNvbCwgam9iLnJvdywgdCk7XG4gICAgICAgIHRpbGVzLnB1c2goeyBjb2w6IGpvYi5jb2wsIHJvdzogam9iLnJvdywgYm1wIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihUSUxFX0ZFVENIX0NPTkNVUlJFTkNZLCBjb29yZHMubGVuZ3RoKSB9LCAoKSA9PiBzdGl0Y2hXb3JrZXIoKSksXG4gICAgKTtcblxuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGNob3Nlbi53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjaG9zZW4uaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2Ugc3RpdGNoOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgZm9yIChjb25zdCB7IGNvbCwgcm93LCBibXAgfSBvZiB0aWxlcykge1xuICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBTYWZldHkgbmV0OiBpZiB0aGUgY2hvc2VuIGxldmVsIHN0aWxsIGV4Y2VlZHMgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0IChlLmcuIGEgbXVsdGljaGFubmVsXG4gICAgLy8gaW1hZ2Ugd2hvc2UgY29hcnNlc3QgUkVBTCBsZXZlbCBpcyBodWdlIOKAlCBvdmVydmlldyBsZXZlbHMgYXJlIGNvbXBvc2l0ZS1vbmx5KSwgZG93bnNjYWxlIHRoZVxuICAgIC8vIHN0aXRjaGVkIGNhbnZhcyB0byBmaXQgc28gdGhlIFdlYkdQVSB0ZXh0dXJlIHVwbG9hZCBjYW4ndCBmYWlsLlxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIGlmIChsb25nZXN0ID4gTUFYX1RFWFRVUkVfRElNKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1BWF9URVhUVVJFX0RJTSAvIGxvbmdlc3Q7XG4gICAgICBjb25zdCBvdXRXID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihjaG9zZW4ud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3Qgb3V0SCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSBzdGl0Y2hlZCBsZXZlbCAke2Nob3Nlbi53aWR0aH3DlyR7Y2hvc2VuLmhlaWdodH0gZXhjZWVkcyB0aGUgYCArXG4gICAgICAgICAgYCR7TUFYX1RFWFRVUkVfRElNfXB4IHRleHR1cmUgbGltaXQ7IGRvd25zY2FsaW5nIHRvICR7b3V0V33DlyR7b3V0SH0uYCxcbiAgICAgICk7XG4gICAgICBsZXQgb3V0OiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvdXQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG91dFcsIG91dEgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIG91dC53aWR0aCA9IG91dFc7XG4gICAgICAgIG91dC5oZWlnaHQgPSBvdXRIO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2N0eCA9IG91dC5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghb2N0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBzbGljZSBkb3duc2NhbGU6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAgIG9jdHguZHJhd0ltYWdlKGNhbnZhcyBhcyB1bmtub3duIGFzIENhbnZhc0ltYWdlU291cmNlLCAwLCAwLCBvdXRXLCBvdXRIKTtcbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChvdXQgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChjYW52YXMgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE5hcGFyaUxvYWRlZD4ge1xuICAgIC8vIEtlZXBzIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSdzIGJsb2IgY2FjaGUgaW4gc3luYyBldmVuIHdoZW4gdGhlIHVzZXJcbiAgICAvLyBzd2l0Y2hlcyBiYWNrZW5kcyAoZS5nLiBPU0QgSW1hZ2Ug4oaSIG5hcGFyaSBWb2x1bWUpIG9uIHRoZSBzYW1lIGZpbGUg4oCUXG4gICAgLy8gd2hpY2hldmVyIGJhY2tlbmQgbG9hZHMgYSBnZW51aW5lbHkgZGlmZmVyZW50IGZpbGUgZmlyc3QgZXZpY3RzIGl0LlxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoaW1hZ2VJbmZvLmZpbGVOYW1lKTtcbiAgICB0aGlzLmxvYWRlZCA9IHsgaW1hZ2VJbmZvLCB6OiB6SW5kZXgsIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIF9pblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIHRoaXMucGxvdERpdklkID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0ID8gYCR7c2NyZWVuSGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICBob3N0LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG5cbiAgICBjb25zdCBpbmZvID0gKGltYWdlTG9hZGVkIGFzIE5hcGFyaUxvYWRlZCk/LmltYWdlSW5mbyA/PyBpbWFnZUluZm87XG4gICAgY29uc3QgeiA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy56ID8/IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgdmlld2VyID0gbmV3IFZpZXdlcih7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgYmFja2dyb3VuZDogeyByOiAwLjA3LCBnOiAwLjA3LCBiOiAwLjA5LCBhOiAxIH0sXG4gICAgICAgIC8vIFNldCBoZXJlIHJhdGhlciB0aGFuIGxlZnQgdG8gbmFwYXJpLWpzJ3Mgb3duIGRlZmF1bHQgc28gdGhlIGdlbnRsZXJcbiAgICAgICAgLy8gc3RlcCBhcHBsaWVzIHdpdGggdGhlIHZlcnNpb24gY3VycmVudGx5IGluc3RhbGxlZC4gQ2hvc2VuIHRvIG1hdGNoIHRoZVxuICAgICAgICAvLyBPU0QgYmFja2VuZCdzIHN0ZXAgKHNlZSBPU0RfWk9PTV9QRVJfU0NST0xMKTogdGhlIHdoZWVsIHNob3VsZCBmZWVsIHRoZVxuICAgICAgICAvLyBzYW1lIG9uIGFuIGltYWdlIHdoaWNoZXZlciByZW5kZXJlciBpcyBkcmF3aW5nIGl0LiBUaGUgc3RlcCBhcHBsaWVzIHBlclxuICAgICAgICAvLyBzY3JvbGwgRVZFTlQsIGFuZCBhIHRyYWNrcGFkIHNlbmRzIGEgYnVyc3Qgb2YgdGhlbSBwZXIgc3dpcGUsIHNvIGEgc3RlcFxuICAgICAgICAvLyB0dW5lZCB0byBhIG1vdXNlIG5vdGNoIHJ1bnMgYXdheSB1bmRlciBhIHRyYWNrcGFkLlxuICAgICAgICB3aGVlbFpvb21TcGVlZDogTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQsXG4gICAgICAgIC8vIFRoZSBGSVJTVCAzRCBsYXllciBvZiBhIHNjZW5lIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhOyBldmVyeSBsYXRlciBvbmUgbGVhdmVzIHRoZVxuICAgICAgICAvLyBwb3NlIGFsb25lLiBBIHNwYXRpYWwgc2NlbmUgaXMgYnVpbHQgZnJvbSBzZXZlcmFsIGxheWVycyBhbmQgcmVidWlsdCBjb25zdGFudGx5IOKAlFxuICAgICAgICAvLyByZWNvbG91cmluZyBieSBhIGNsYXNzLCBwaWNraW5nIGEgZ2VuZSwgc3RlcHBpbmcgYSBzZWN0aW9uIOKAlCBhbmQgd2l0aCBuYXBhcmktanMnc1xuICAgICAgICAvLyBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGZyYW1pbmcgZWFjaCBvZiB0aG9zZSB0aHJldyBhd2F5IGFuIG9yYml0IHRoZSB1c2VyIGhhZCBzZXQuXG4gICAgICAgIC8vIFRoZSBwb3NlIGl0IHNuYXBwZWQgYmFjayB0byBkZXBlbmRlZCBvbiBXSElDSCBsYXllciB3YXMgcmVidWlsdCwgc28gaXNvbGF0aW5nIG9uZVxuICAgICAgICAvLyBzZWN0aW9uIHpvb21lZCB0byB0aGF0IHNlY3Rpb24ncyBib3VuZHMuIGByZXNldEZpdDNEKClgIG9uIGEgZGF0YXNldCBjaGFuZ2UgaXMgd2hhdFxuICAgICAgICAvLyBsZXRzIHRoZSBuZXh0IHNjZW5lIGZyYW1lIGl0c2VsZi5cbiAgICAgICAgZml0M2Q6ICdvbmNlJyxcbiAgICAgICAgLy8gSW4gdGhlIHNwYXRpYWwgbW9kZXMgYSBwbGFpbiBjbGljayBTRUxFQ1RTIHRoZSBjbGFzcyB1bmRlciB0aGUgY3Vyc29yLFxuICAgICAgICAvLyBzbyBuYXBhcmkncyBPU0Qtc3R5bGUgY2xpY2stdG8tem9vbSBpcyB0dXJuZWQgb2ZmIHRoZXJlOiBvdGhlcndpc2Ugb25lXG4gICAgICAgIC8vIGNsaWNrIHdvdWxkIGJvdGggc2VsZWN0IGEgY2xhc3MgYW5kIHpvb20gMnggYWJvdXQgdGhlIGN1cnNvciwgYW5kIHRoZVxuICAgICAgICAvLyB6b29tIHdvdWxkIHRoZW4gaGFsdmUgdGhlIHBpeGVsIHJhZGl1cyB0aGUgbmV4dCBjbGljayBoaXQtdGVzdHMgd2l0aC5cbiAgICAgICAgLy8gWm9vbWluZyBpcyBzdGlsbCBvbiB0aGUgd2hlZWwsIHRoZSB6b29tIGJ1dHRvbnMgYW5kIHRoZSB6b29tLWJveCB0b29sLlxuICAgICAgICAuLi4oaXNTcGF0aWFsT21pY3MocGxvdFR5cGUpIHx8IGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpXG4gICAgICAgICAgPyB7IGNsaWNrWm9vbUZhY3RvcjogMCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgICAgYXdhaXQgdmlld2VyLnJlYWR5O1xuXG4gICAgICBpZiAoaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNwYXRpYWxPbWljczNkKHZpZXdlciwgaG9zdCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSkge1xuICAgICAgICAvLyBObyBsb2FkZWQgaW1hZ2U6IGFuIGltYWdlLWxlc3MgZGF0YXNldCBvcGVuZWQgYmVmb3JlIGFueSBpbWFnZSAodGhlIHZpc3VhbGl6ZXInc1xuICAgICAgICAvLyBwbG90U3BhdGlhbFdpdGhvdXRJbWFnZSkg4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuXG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTcGF0aWFsT21pY3Modmlld2VyLCBob3N0LCB6LCBpbWFnZUxvYWRlZCA9PSBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTY2F0dGVyKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U2NhdHRlcih2aWV3ZXIsIGhvc3QsIHopO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaVNjYXR0ZXIzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNjYXR0ZXIzZCh2aWV3ZXIsIGluZm8pO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaVN1cmZhY2UocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTdXJmYWNlKHZpZXdlcik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRWb2x1bWUodmlld2VyLCBpbmZvLCBwbG90VHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgICAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICAgICAgdGhpcy5pbnN0YWxsU2NhbGVCYXIoKTtcbiAgICAgICAgdGhpcy5pbnN0YWxsTmF2aWdhdG9yKHopO1xuICAgICAgICB0aGlzLmluc3RhbGwyZEludGVyYWN0aW9uKHZpZXdlciwgaG9zdCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gcGxvdCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ2hhbm5lbHM6IHBlci1jaGFubmVsIGNvbXBvc2l0ZSwgTFVULCBuYXRpdmUgaGlzdG9ncmFtcyAoaml0LXVpIzEwMikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoZSBncmF5c2NhbGUgZGlzcGxheSBjb2xvcm1hcCBmcm9tIHRoZSBzdG9yZSBzZWxlY3Rpb24gKCtyZXZlcnNlKSwgZGVmYXVsdGluZyB0byBncmF5LlxuICAgKiAgTWFwcyB0aGUgaml0LXVpIHN0b3JlIGNvbG9ybWFwIG5vZGUgdG8gYSBuYXBhcmkgYENvbG9ybWFwYCB2aWEgdGhlIGxpYnJhcnkncyBMVVQgZmFjdG9yeTtcbiAgICogIHRoZSBtdWx0aWNoYW5uZWwgdGludCByYW1wcyBhcmUgYnVpbHQgaW5zaWRlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9IGZyb20gZWFjaFxuICAgKiAgY2hhbm5lbCdzIGhleCBjb2xvdXIuICovXG4gIHByaXZhdGUgZ3JheXNjYWxlQ29sb3JtYXAoKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGwpPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSkgOiBudWxsO1xuICAgIGlmIChsdXQpIHJldHVybiBjb2xvcm1hcEZyb21MdXQoJ2dyYXktY21hcCcsIGx1dCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJldmVyc2VcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCdncmF5LXJldicsIFtbMjU1LCAyNTUsIDI1NV0sIFswLCAwLCAwXV0gYXMgUmdiW10pXG4gICAgICA6ICdncmF5JztcbiAgfVxuXG4gIC8qKiBGZXRjaCBhIHN0aXRjaGVkIHNsaWNlIGFuZCByZWFkIGl0IGJhY2sgYXMgYSBzaW5nbGUtY2hhbm5lbCB1aW50OCBwbGFuZS4gYGNoYW5uZWxgIHNlbGVjdHMgYVxuICAgKiAgYmFuZCAobXVsdGljaGFubmVsKTsgb21pdCBpdCBmb3IgdGhlIGdyYXlzY2FsZSBjb21wb3NpdGUgKGFsbCBvdmVydmlldyBsZXZlbHMgYXZhaWxhYmxlLCBzbyBhXG4gICAqICBsYXJnZSBpbWFnZSBwaWNrcyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCByYXRoZXIgdGhhbiBvbmx5IHRoZSBmdWxsLXJlcyByZWFsIGxldmVsKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYW5uZWxEYXRhKFxuICAgIHo6IG51bWJlcixcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICAgIGJ1ZGdldFRpbGVzPzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJtcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCBjaGFubmVsLCBidWRnZXRUaWxlcyk7XG4gICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgfVxuXG4gIC8qKiBEZWNvZGUgYW4gYEltYWdlQml0bWFwYCAoc2VydmVyIGJhbmRzIGFyZSBncmF5c2NhbGUsIFI9Rz1CKSB0byBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLlxuICAgKiAgYG1heFNpZGVgIGNhcHMgdGhlIGxvbmdlc3Qgc2lkZSAoZG93bnNjYWxpbmcgb24gdGhlIGNhbnZhcyBkcmF3KSDigJQgdXNlZCB0byBrZWVwIHByZS1sb2FkZWRcbiAgICogIHN1cmZhY2Ugc2xpY2UgcGxhbmVzIHNtYWxsLiAqL1xuICBwcml2YXRlIGJpdG1hcFRvTHVtaW5hbmNlKFxuICAgIGJtcDogSW1hZ2VCaXRtYXAsXG4gICAgbWF4U2lkZT86IG51bWJlcixcbiAgKTogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBzY2FsZSA9IG1heFNpZGUgPyBNYXRoLm1pbigxLCBtYXhTaWRlIC8gTWF0aC5tYXgoYm1wLndpZHRoLCBibXAuaGVpZ2h0LCAxKSkgOiAxO1xuICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJtcC53aWR0aCAqIHNjYWxlKSk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHcsIGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHc7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIGNoYW5uZWwgcmVhZGJhY2s6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAvLyBTY2FsZSB0aGUgV0hPTEUgYml0bWFwIGludG8gdGhlIChwb3NzaWJseSBzbWFsbGVyKSB0YXJnZXQgY2FudmFzIOKAlCBkcmF3aW5nIGF0IG5hdHVyYWwgc2l6ZVxuICAgIC8vIHdvdWxkIGNyb3AgdG8gdGhlIHRvcC1sZWZ0IHfDl2ggY29ybmVyIHdoZW4gZG93bnNjYWxpbmcgYSBsYXJnZSBzbGljZSAobWF4U2lkZSA8IGJtcCBzaXplKS5cbiAgICBjdHguZHJhd0ltYWdlKGJtcCwgMCwgMCwgdywgaCk7XG4gICAgYm1wLmNsb3NlPy4oKTtcbiAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3ICogaCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3ICogaDsgaSsrKSBkYXRhW2ldID0gcmdiYVtpICogNF07XG4gICAgcmV0dXJuIHsgZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2UgZm9yIHNsaWNlIGB6YC4gV2l0aCBhIHNlcnZlciBweXJhbWlkIGRlc2NyaXB0b3Igd2UgdXNlIGEgcHlyYW1pZGFsXG4gICAqIHtAbGluayBUaWxlZFNvdXJjZX0gcGVyIGxheWVyIHNvIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb24gb24gem9vbSAobGlrZSBPU0QpIGFuZFxuICAgKiBzaXRzIG5hdHVyYWxseSBpbiBmdWxsLXJlc29sdXRpb24gY29vcmRpbmF0ZXM7IHdpdGhvdXQgb25lIHdlIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlLWxldmVsXG4gICAqIHN0aXRjaC4gVGhyZWUgZGlzcGxheSBtb2RlcyBlaXRoZXIgd2F5OiBtdWx0aWNoYW5uZWwgYWRkaXRpdmUgdGludCwgZ3JheXNjYWxlIGNvbG9ybWFwLCBSR0IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlKHo6IG51bWJlciwgdG9rZW4/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGlmIChkZXNjICYmIGRlc2MubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmIHRva2VuICE9PSB0aGlzLnNsaWNlUmVxKSByZXR1cm47XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlVGlsZWQoeiwgZGVzYyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlckltYWdlU3RpdGNoZWQoeiwgdG9rZW4pO1xuICB9XG5cbiAgLyoqIFNpbmdsZS1sZXZlbCBzdGl0Y2ggZmFsbGJhY2sgKG5vIGRlc2NyaXB0b3IpOiB0aGUgcHJlLXRpbGluZyBwYXRoLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlU3RpdGNoZWQoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2M/LmNoYW5uZWxzID8/IChzdGF0ZXMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9ICEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG5cbiAgICAvLyAxKSBGZXRjaCBhbGwgcGl4ZWwgZGF0YSBCRUZPUkUgdG91Y2hpbmcgdGhlIHZpZXdlciwgc28gYSBzdXBlcnNlZGVkIHNjcnViIGNhbiBiYWlsIHdpdGhvdXRcbiAgICAvLyAgICBoYXZpbmcgdG9ybiBkb3duIHRoZSB2aXNpYmxlIGxheWVycyAoYXZvaWRzIGZsaWNrZXIgLyBvdXQtb2Ytb3JkZXIgbGF5ZXIgc3RhdGUpLlxuICAgIGxldCBtb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYic7XG4gICAgbGV0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgbW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgcGxhbmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGNoYW5uZWxDb3VudCB9LCAoXywgYykgPT4gdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGMpKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIG1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIC8vIENvbXBvc2l0ZSBmZXRjaCAobm8gY2hhbm5lbCkg4oaSIGFsbCBvdmVydmlldyBsZXZlbHMgdXNhYmxlLCBzbyBhIGxhcmdlIGdyYXlzY2FsZSBpbWFnZVxuICAgICAgLy8gc2VsZWN0cyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCBpbnN0ZWFkIG9mIHRoZSBmdWxsLXJlcyByZWFsIGxldmVsICh0ZXh0dXJlIGxpbWl0KS5cbiAgICAgIHBsYW5lcyA9IFthd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeildO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlID0gJ3JnYic7XG4gICAgICBiaXRtYXAgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2Uoeik7XG4gICAgfVxuXG4gICAgLy8gMikgQ29tbWl0IOKAlCB1bmxlc3MgYSBuZXdlciBzY3J1YiBzdXBlcnNlZGVkIHVzIG9yIHRoZSB2aWV3ZXIgd2FzIHRvcm4gZG93bi5cbiAgICBpZiAoKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHx8IHRoaXMudmlld2VyICE9PSB2KSB7XG4gICAgICBiaXRtYXA/LmNsb3NlPy4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgZGlzcGxheWVkIHRleHR1cmUgbWF5IGJlIGEgZG93bnNjYWxlZCBweXJhbWlkIGxldmVsOyBzY2FsZSB0aGUgbGF5ZXIgaW50byBGVUxMLVJFU09MVVRJT05cbiAgICAvLyB3b3JsZCBjb29yZGluYXRlcyAobGV2ZWwtMCBwaXhlbHMpIHNvIHRoZSBjYW1lcmEsIHJlYWRiYWNrIGFuZCDigJQgY3JpdGljYWxseSDigJQgcHJlLXNhdmVkXG4gICAgLy8gcmVnaW9ucyAoc3RvcmVkIGluIGZ1bGwtcmVzIGNvb3JkcywgZS5nLiBuZHBpKSBhbGwgbGluZSB1cCByZWdhcmRsZXNzIG9mIHdoaWNoIGxldmVsIGlzIHNob3duLlxuICAgIC8vIFRoaXMgbWlycm9ycyBPU0QsIHdob3NlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGFsd2F5cyBsZXZlbCAwLlxuICAgIGNvbnN0IHRleFcgPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLndpZHRoIDogcGxhbmVzWzBdPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IHRleEggPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLmhlaWdodCA6IHBsYW5lc1swXT8uaGVpZ2h0ID8/IDA7XG4gICAgY29uc3QgZnVsbFcgPSBkZXNjPy53aWR0aCB8fCB0ZXhXIHx8IDE7XG4gICAgY29uc3QgZnVsbEggPSBkZXNjPy5oZWlnaHQgfHwgdGV4SCB8fCAxO1xuICAgIGNvbnN0IHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdID0gW3RleFcgPyBmdWxsVyAvIHRleFcgOiAxLCB0ZXhIID8gZnVsbEggLyB0ZXhIIDogMV07XG5cbiAgICB0aGlzLmltYWdlTW9kZSA9IG1vZGU7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IHBsYW5lcy5tYXAoKGQsIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgIHRpbnQ6IGNvbG9yLFxuICAgICAgICAgIG5hbWU6IHN0Py5uYW1lID8/IGBjaCR7Y31gLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IGQgPSBwbGFuZXNbMF07XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKFxuICAgICAgICAnZ3JheXNjYWxlJyxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZC53aWR0aCwgaGVpZ2h0OiBkLmhlaWdodCwgY2hhbm5lbHM6IDEsIGR0eXBlOiAndWludDgnLCBkYXRhOiBkLmRhdGEgfSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IGJpdG1hcCBhcyBJbWFnZUJpdG1hcCwgc2NhbGUgfV0sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZVcgPSBmdWxsVztcbiAgICB0aGlzLmltYWdlSCA9IGZ1bGxIO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2Ugd2l0aCBweXJhbWlkYWwge0BsaW5rIFRpbGVkU291cmNlfXMg4oCUIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb25cbiAgICogYXMgeW91IHpvb20gaW4gKHRoZSB2aXN1YWwgZmV0Y2hlcyB0aGUgbGV2ZWwgd2hvc2UgdGV4ZWxzIOKJiCBzY3JlZW4gcGl4ZWxzKSBhbmQgc2l0cyBpbiBmdWxsLXJlc1xuICAgKiBjb29yZGluYXRlcyBzbyByZWdpb25zIGFsaWduLiBTYW1lIHRocmVlIG1vZGVzIGFzIHRoZSBzdGl0Y2ggcGF0aC4gUGVyLWNoYW5uZWwgbGF5ZXJzIHVzZSB0aGVcbiAgICogUkVBTCBweXJhbWlkIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgb25seSBleGlzdCB0aGVyZSk7IHRoZSBjb21wb3NpdGUgdXNlcyBhbGwgbGV2ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZVRpbGVkKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2MuY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjLm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxO1xuICAgIGNvbnN0IGludGVycG9sYXRpb246ICdsaW5lYXInIHwgJ25lYXJlc3QnID0gdGhpcy5pbWFnZVNtb290aGluZyA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuXG4gICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG5cbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgY29uc3Qgdmlld3M6IENoYW5uZWxWaWV3W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2MuY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgdmlld3MucHVzaCh7XG4gICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgYywgMSksXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcignbXVsdGljaGFubmVsJywgdmlld3MsIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCAxKSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgeyBpbnRlcnBvbGF0aW9uIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdyZ2InO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogdGhpcy5idWlsZFRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgNCkgfV0sIHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGRlc2Mud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkZXNjLmhlaWdodDtcbiAgICAvLyBBd2FpdCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgc28gZ2V0SGlzdG9ncmFtL2F1dG9Db250cmFzdCBoYXZlIGRhdGEgaW1tZWRpYXRlbHk7IHNsaWNlIGNoYW5nZXNcbiAgICAvLyByZWZyZXNoIGZpcmUtYW5kLWZvcmdldCAodGhlIGhpc3RvZ3JhbSBwYW5lIHJldHJpZXMpLlxuICAgIGF3YWl0IHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoeiwgZGVzYyk7XG4gIH1cblxuICAvKiogQnVpbGQgYSBweXJhbWlkYWwgVGlsZWRTb3VyY2UgYmFja2VkIGJ5IHRoZSBzZXJ2ZXIgYC90aWxlYCBlbmRwb2ludC4gYGNoYW5uZWxgIHNlbGVjdHMgYSBiYW5kXG4gICAqICAoZ3JheXNjYWxlIGx1bWluYW5jZSwgcmVhbCBsZXZlbHMgb25seSk7IG9taXQgaXQgZm9yIHRoZSBjb21wb3NpdGUgKFJHQkEsIGFsbCBsZXZlbHMpLiAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZWRTb3VyY2UoXG4gICAgZGVzYzogVGlsZURlc2NyaXB0b3IsXG4gICAgY2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYW5uZWxzOiAxIHwgNCxcbiAgKTogVGlsZWRTb3VyY2Uge1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpID8/ICcnO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHM7IHRoZSBjb21wb3NpdGUgZXhpc3RzIGF0IGFsbCBsZXZlbHMuXG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbFxuICAgICAgICA/IGRlc2MubGV2ZWxzXG4gICAgICAgIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aCkpO1xuICAgIGNvbnN0IGxldmVsU2NhbGVzID0gdXNhYmxlLm1hcCgobCkgPT4gZGVzYy53aWR0aCAvIE1hdGgubWF4KDEsIGwud2lkdGgpKTsgLy8gbGV2ZWwtMCBweCBwZXIgbGV2ZWwgcHhcbiAgICBjb25zdCB0aWxlU2l6ZSA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIGNvbnN0IGNoID0gY2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtjaGFubmVsfWA7XG4gICAgY29uc3QgYXBpID0gdGhpcy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd0aWxlZCcsXG4gICAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICAgIGhlaWdodDogZGVzYy5oZWlnaHQsXG4gICAgICB0aWxlU2l6ZSxcbiAgICAgIGxldmVsczogdXNhYmxlLmxlbmd0aCxcbiAgICAgIGxldmVsU2NhbGVzLFxuICAgICAgZGVwdGg6IE1hdGgubWF4KDEsIGRlc2MueiB8fCAxKSxcbiAgICAgIGNoYW5uZWxzLFxuICAgICAgZHR5cGU6ICd1aW50OCcsXG4gICAgICBmZXRjaFRpbGU6IGFzeW5jIChrZXk6IFRpbGVLZXkpOiBQcm9taXNlPFBpeGVsQ2h1bms+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdXNhYmxlW2tleS5sZXZlbF0/LnJlcyA/PyBrZXkubGV2ZWw7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke2FwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2tleS5jb2x9JnJvdz0ke2tleS5yb3d9Jno9JHtrZXkuen0mdGlsZVNpemU9JHt0aWxlU2l6ZX0ke2NofWA7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHRpbGUgJHtrZXkubGV2ZWx9LyR7a2V5LmNvbH0vJHtrZXkucm93fSDihpIgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgICAgIGlmIChjaGFubmVscyA9PT0gNCkgcmV0dXJuIHsgd2lkdGg6IGJtcC53aWR0aCwgaGVpZ2h0OiBibXAuaGVpZ2h0LCBkYXRhOiBibXAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiAoUmUpZmV0Y2ggYSBjb2Fyc2UgcGVyLWNoYW5uZWwgbHVtaW5hbmNlIHNhbXBsZSBmb3IgdGhlIGhpc3RvZ3JhbSAodGlsZWQgbW9kZSBoYXMgbm8gZnVsbFxuICAgKiAgaW4tbWVtb3J5IHBpeGVscykuIE9uZSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBjaGFubmVsOyBjYWNoZWQgYnkgY2hhbm5lbCBpbmRleC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6OiBudW1iZXIsIGRlc2M6IFRpbGVEZXNjcmlwdG9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ3JnYicpIHJldHVybjsgLy8gUkdCIHVzZXMgdGhlIGRpc3BsYXllZC1waXhlbCByZWFkYmFjayAocmdiSGlzdG9ncmFtKVxuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGRlc2MuY2hhbm5lbHMgPz8gMSA6IDE7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcgPyBjIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGNoLCAxKTsgLy8gYnVkZ2V0IDEg4oaSIGNvYXJzZXN0IHNpbmdsZSB0aWxlXG4gICAgICAgIHRoaXMuaGlzdFNhbXBsZXMuc2V0KGMsIGQuZGF0YSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbGVhdmUgdGhpcyBjaGFubmVsJ3Mgc2FtcGxlIHVuc2V0ICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN1YnNjcmliZSBjaGFubmVsIHN0YXRlcyArIGdyYXlzY2FsZSBjb2xvcm1hcCDihpIgbGl2ZS1hcHBseSB0byB0aGUgcmVuZGVyZWQgbGF5ZXJzIChub1xuICAgKiAgcmUtZmV0Y2g7IG9ubHkgeiBjaGFuZ2VzIHJlLWZldGNoKS4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjaGFubmVscywgY29sb3JtYXAsIHJldmVyc2UsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgdGhpcy5hcHBseURpc3BsYXlTdGF0ZShjaGFubmVscyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAoK3JldmVyc2UpLCBpbnZlcnQsIGFuZCBjaGFubmVsIHN0YXRlIOKGkiB0aGUgdm9sdW1lL2lzb3N1cmZhY2VcbiAgICogIHRyYW5zZmVyIGZ1bmN0aW9uOiBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgKip3aW5kb3dcbiAgICogIChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cykqKiBhbmQgKipnYW1tYSoqLCBtaXJyb3JpbmcgdGhlIGdyYXlzY2FsZSBpbWFnZSdzIGRpc3BsYXkgY29udHJvbHNcbiAgICogIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlIDNEIHJlbmRlci4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVWb2x1bWVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVsc10pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudm9sdW1lVmlldztcbiAgICAgIGlmICghdmlldykgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMudm9sdW1lTXVsdGljaGFubmVsKSB7XG4gICAgICAgIC8vIEVhY2ggY2hhbm5lbCdzIGxheWVyIGlzIHRpbnRlZCBieSBpdHMgY29sb3VyIGFuZCBnZXRzIGl0cyBvd24gd2luZG93L2dhbW1hL3Zpc2liaWxpdHkuXG4gICAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpLFxuICAgICAgICAgICAgLi4uKHN0XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgICAgICAuLi4oc3QgPyB7IGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sIGdhbW1hOiBzdC5nYW1tYSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBBIGNoYW5uZWwncyB0aW50IGNvbG9ybWFwIChibGFja+KGkmNvbG91cikgd2l0aCByZXZlcnNlLXNjYWxlIC8gaW52ZXJ0IGFwcGxpZWQgYnkgZmxpcHBpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFRpbnRDb2xvcm1hcChjb2xvcjogc3RyaW5nKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IHRpbnRDb2xvcm1hcChjb2xvcik7XG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xvdXIgbWFwIGZvciB0aGUgdm9sdW1lL2lzb3N1cmZhY2UuIEEgcmVhbCBjb2xvcm1hcCBzZWxlY3Rpb24gKHZpcmlkaXMvbWFnbWEv4oCmKSB3aW5zO1xuICAgKiBvdGhlcndpc2UgdGhlIGNoYW5uZWwncyBjb2xvdXIgdGludHMgaXQgKHNvIHRoZSBjaGFubmVsLWRpYWxvZyBjb2xvdXIgc3dhdGNoIHJlY29sb3JzIHRoZSAzRFxuICAgKiByZW5kZXIpLiBSZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wIOKAlCB0aGUgYFZvbHVtZUxheWVyYCBoYXMgbm8gcGVyLWxheWVyXG4gICAqIGludmVydCwgc28gYm90aCBhcmUgZW11bGF0ZWQgYnkgcmV2ZXJzaW5nIHRoZSBjb2xvcm1hcC5cbiAgICovXG4gIHByaXZhdGUgdm9sdW1lQ29sb3JtYXAoc3Q6IElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgbGFiZWw/OiBzdHJpbmc7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIC8vIEEgY29sb3JlZCBjb2xvcm1hcCAodmlyaWRpcy9tYWdtYS/igKYpIGRyaXZlcyB0aGUgdm9sdW1lOyB0aGUgZGVmYXVsdCBncmF5c2NhbGUgZmFtaWx5XG4gICAgLy8gKGdyYXkgLyBHcmV5cyAvIEdyZXlzIEludikgeWllbGRzIHRvIHRoZSBjaGFubmVsJ3MgY29sb3VyIHNvIHRoZSBkaWFsb2cgY29sb3VyIHN3YXRjaFxuICAgIC8vIHJlY29sb3JzIHRoZSAzRCByZW5kZXIuXG4gICAgY29uc3QgbGFiZWwgPSAobm9kZT8ubGFiZWwgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZ3JheUZhbWlseSA9IGxhYmVsID09PSAnJyB8fCBsYWJlbC5pbmNsdWRlcygnZ3JleScpIHx8IGxhYmVsLmluY2x1ZGVzKCdncmF5Jyk7XG4gICAgY29uc3QgdmFsdWUgPSBub2RlPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSAhZ3JheUZhbWlseSAmJiB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgZmFsc2UpIDogbnVsbDtcbiAgICBsZXQgY21hcDogQ29sb3JtYXAgfCBzdHJpbmcgPSBsdXRcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCd2b2wtY21hcCcsIGx1dClcbiAgICAgIDogdGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpO1xuICAgIC8vIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAgKHRoZSBWb2x1bWVMYXllciBoYXMgbm8gcGVyLWxheWVyIGludmVydCkuXG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKiBBcHBseSB0aGUgY3VycmVudCBjaGFubmVsIHN0YXRlcyAvIGNvbG9ybWFwIHRvIHRoZSBsaXZlIGxheWVycyAobm8gcmUtZmV0Y2gpLCBkZWxlZ2F0aW5nIHRoZVxuICAgKiAgcGVyLWNoYW5uZWwgbGF5ZXIgbXV0YXRpb25zIHRvIHRoZSB7QGxpbmsgTXVsdGlDaGFubmVsSW1hZ2VWaWV3fS4gKi9cbiAgcHJpdmF0ZSBhcHBseURpc3BsYXlTdGF0ZShjaGFubmVsczogSUNoYW5uZWxTdGF0ZVtdKTogdm9pZCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuY2hhbm5lbFZpZXc7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdmlldykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgaWYgKCFzdCkgcmV0dXJuO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgIHRpbnQ6IHN0LmNvbG9yLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdLFxuICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICB2aXNpYmxlOiBzdC52aXNpYmxlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnKSB7XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogKFJlKWluc3RhbGwgdGhlIHBoeXNpY2FsIHNjYWxlIGJhciBvdmVyIHRoZSAyRCBpbWFnZSwgc2l6ZWQgZnJvbSB0aGUgaW1hZ2UncyDCtW0vcGl4ZWxcbiAgICogIChgL3RpbGVzL2luZm9gIG1wcFgsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEpLiBOby1vcCB3aXRob3V0IGEgcGh5c2ljYWwgc2l6ZS4gKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmhvc3QgJiYgbXBwWCA+IDApIHtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBuZXcgTmFwYXJpU2NhbGVCYXIodGhpcy5ob3N0LCB0aGlzLnZpZXdlci5jYW1lcmEsIG1wcFgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3ZlcnZpZXcgbmF2aWdhdG9yIGZvciBhIDJEIHZpZXcgd2l0aCBhbiBpbWFnZTogYSBjb2Fyc2UgdGh1bWJuYWlsIG9mIHRoZSB3aG9sZVxuICAgKiBpbWFnZSB3aXRoIHRoZSB2aWV3cG9ydCBvbiBpdDsgY2xpY2sgb3IgZHJhZyB0byBwYW4gYXQgdGhlIGN1cnJlbnQgem9vbSAoYXMgT1NEKS5cbiAgICovXG4gIHByaXZhdGUgc2hvd0xvYWRpbmcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhvc3QpIHJldHVybjtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZSA/Pz0gbmV3IE5hcGFyaUxvYWRpbmdCYWRnZSh0aGlzLmhvc3QpO1xuICAgIHRoaXMubG9hZGluZ0JhZGdlLnNldChbLi4uKHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZyA+IDAgPyBbJ09ic2VydmF0aW9ucyddIDogW10pLCAuLi50aGlzLnRpbGVMb2FkaW5nXSk7XG4gIH1cblxuICBwcml2YXRlIGluc3RhbGxOYXZpZ2F0b3IoejogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRlc3Ryb3koKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy5ob3N0IHx8ICF0aGlzLmltYWdlVyB8fCAhdGhpcy5pbWFnZUgpIHJldHVybjtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG5ldyBOYXBhcmlOYXZpZ2F0b3IoXG4gICAgICB0aGlzLmhvc3QsIHRoaXMudmlld2VyLmNhbWVyYSwgdGhpcy5pbWFnZVcsIHRoaXMuaW1hZ2VILCAoKSA9PiB0aGlzLnNwYXRpYWxUb29sdGlwPy5oaWRlKCksXG4gICAgKTtcbiAgICB0aGlzLm5hdmlnYXRvci5zZXRWaXNpYmxlKHRoaXMubmF2aWdhdG9yVmlzaWJsZSk7XG4gICAgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBuYXZpZ2F0b3IncyB0aHVtYm5haWwgZnJvbSB0aGUgY29hcnNlc3QgcHlyYW1pZCBsZXZlbC4gQSBtdWx0aWNoYW5uZWwgaW1hZ2VcbiAgICogaXMgY29tcG9zaXRlZCBmcm9tIGl0cyBjaGFubmVscyBpbiB0aGVpciBkaXNwbGF5IGNvbG91cnMsIHNvIHRoZSBvdmVydmlldyBsb29rcyBsaWtlXG4gICAqIHRoZSB2aWV3IHJhdGhlciB0aGFuIGxpa2UgY2hhbm5lbCAwIGluIGdyZXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuYXYgPSB0aGlzLm5hdmlnYXRvcjtcbiAgICBpZiAoIW5hdikgcmV0dXJuO1xuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLm5hdmlnYXRvclRva2VuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgICBjb25zdCBjaGFubmVscyA9IGRlc2M/Lm11bHRpY2hhbm5lbCA/IGRlc2MuY2hhbm5lbEluZm8gPz8gW10gOiBbXTtcbiAgICAgIGxldCBpbWFnZTogQ2FudmFzSW1hZ2VTb3VyY2U7XG4gICAgICBpZiAoY2hhbm5lbHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBiaXRtYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2hhbm5lbHMubWFwKChfYywgYykgPT4gdGhpcy5mZXRjaFNsaWNlKHosIGMsIDEpKSk7XG4gICAgICAgIGltYWdlID0gdGludGVkQ29tcG9zaXRlKGJpdG1hcHMsIGNoYW5uZWxzLm1hcCgoYykgPT4gYy5jb2xvciA/PyAnI2ZmZmZmZicpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIHVuZGVmaW5lZCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4gPT09IHRoaXMubmF2aWdhdG9yVG9rZW4gJiYgdGhpcy5uYXZpZ2F0b3IgPT09IG5hdikgbmF2LnNldEltYWdlKGltYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF2aWdhdG9yIHRodW1ibmFpbCB1bmF2YWlsYWJsZScsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNob3cvaGlkZSB0aGUgb3ZlcnZpZXcgbmF2aWdhdG9yIChzYW1lIHNldHRpbmcgYXMgT1NEJ3MpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIHRoaXMubmF2aWdhdG9yPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgYSBuYXBhcmktanMgYEhpc3RvZ3JhbWAgKGJpbiBjb3VudCArIG1pbi9tYXgpIHRvIHRoZSBwYW5lJ3MgYElIaXN0b2dyYW1gIChiaW4gZWRnZXMpLiAqL1xuICBwcml2YXRlIHRvSUhpc3RvZ3JhbShoOiB7IGNvdW50czogVWludDMyQXJyYXk7IGJpbnM6IG51bWJlcjsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0pOiBJSGlzdG9ncmFtIHtcbiAgICBjb25zdCBzcGFuID0gaC5tYXggLSBoLm1pbiB8fCAxO1xuICAgIGNvbnN0IGJpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBoLmJpbnMgfSwgKF8sIGkpID0+IGgubWluICsgKGkgKiBzcGFuKSAvIGguYmlucyk7XG4gICAgY29uc3QgY291bnRzID0gQXJyYXkuZnJvbShoLmNvdW50cyk7XG4gICAgcmV0dXJuIHsgYmlucywgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgM0Qgdm9sdW1lL2lzb3N1cmZhY2UuIEEgbXVsdGljaGFubmVsIGltYWdlIGJlY29tZXMgb25lIGFkZGl0aXZlLCB0aW50ZWRcbiAgICoge0BsaW5rIFZvbHVtZUxheWVyfSBwZXIgY2hhbm5lbCAoc28gZWFjaCBjaGFubmVsJ3MgY29sb3VyIGNvbXBvc2l0ZXMgaW50byB0aGUgcmVuZGVyKTsgYVxuICAgKiBncmF5c2NhbGUvY29tcG9zaXRlIGltYWdlIHVzZXMgYSBzaW5nbGUgdm9sdW1lLiBBZGRzIHRoZSBheGVzIGdpem1vICsgbGFiZWxzIGFuZCB3aXJlcyB0aGVcbiAgICogZGlzcGxheS1zdGF0ZSBzdWJzY3JpcHRpb24uIFRoZSBjYWxsZXIgb3ducyBgdmlld2VyLnJlYWR5YC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgYmVmb3JlIHJlbmRlcmluZyBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXNcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoU2xpY2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSB0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pICYmICEhaW5mbz8uY2hhbm5lbFVybHM/Lmxlbmd0aFxuICAgICAgJiYgKGluZm8/LmltYWdlTWV0YT8uWzBdPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHNpbXBsZU1jID8gaW5mbyEuaW1hZ2VNZXRhIVswXS5jaGFubmVsQ291bnQgOiAoZGVzYz8uY2hhbm5lbHMgPz8gMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDEpO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHJlbmRlcmluZzogJ2lzbycgfCAnbWlwJyA9IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSkgPyAnaXNvJyA6ICdtaXAnO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcblxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICB0aGlzLmltYWdlTW9kZSA9IHRoaXMudm9sdW1lTXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJztcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcodmlld2VyKTtcbiAgICB0aGlzLnZvbHVtZVZpZXcgPSB2aWV3O1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIGludmVydC9yZXZlcnNlIGZsaXBzKS5cbiAgICBsZXQgZGltczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY2hhbm5lbHM6IFZvbHVtZUNoYW5uZWxbXSA9IFtdO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgcmVzLCBjKTtcbiAgICAgICAgICBpZiAoIXZvbCkgY29udGludWU7XG4gICAgICAgICAgZGltcyA9IHZvbDtcbiAgICAgICAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldChjLCB2b2wuZGF0YSk7XG4gICAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKGNvbG9yKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHJlcyk7XG4gICAgICAgIGlmICh2b2wpIHtcbiAgICAgICAgICBkaW1zID0gdm9sO1xuICAgICAgICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIHZvbC5kYXRhKTtcbiAgICAgICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuXG4gICAgaWYgKCFkaW1zIHx8ICFjaGFubmVscy5sZW5ndGggfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47IC8vIGNhbmNlbGxlZCDihpIgZG9uJ3QgcmVuZGVyXG5cbiAgICAvLyBSZXNvbHV0aW9uLWludmFyaWFudCB3b3JsZCBib3guIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsIGNvdW50cyBtYWRlIGhpZ2hlclxuICAgIC8vIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGUgKGNvbnN0YW50KSBzbGljZSBjb3VudCDigJQgc28gWiBhcHBlYXJlZFxuICAgIC8vIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi4gSW5zdGVhZCBhbmNob3IgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmRcbiAgICAvLyBsZXQgWiBzcGFuIHRoZSBmdWxsIHNsaWNlIGNvdW50OyB0aGUgYm94IHNoYXBlIGlzIHRoZW4gaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci4gVGhlXG4gICAgLy8gcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkIGdyaWQgb250byB0aGF0IGZpeGVkIHdvcmxkIGJveC5cbiAgICAvLyBBIHN0YWNrIHRoYXQgZGVjbGFyZXMgaXRzIHBoeXNpY2FsIHNwYWNpbmcgb24gQUxMIFRIUkVFIGF4ZXMgZ2V0cyBpdHMgdHJ1ZVxuICAgIC8vIGV4dGVudCBhcyB0aGUgd29ybGQgYm94IOKAlCB0aGUgb25seSB3YXkgYW5pc290cm9weSBzdXJ2aXZlcywgYW5kIHdoYXQgbWFrZXMgYVxuICAgIC8vIHJlc2FtcGxlZCA0MCB4IDQwIHggMjAwIMK1bSB2b2x1bWUgcmVhZCBhcyBhIGJyYWluIGluc3RlYWQgb2YgYSBjdWJlLWFzcGVjdFxuICAgIC8vIGJyaWNrLiBJdCBuZWVkcyBub25lIG9mIHRoZSByZWZlcmVuY2UtYm94IGFyaXRobWV0aWM6IGEgcGh5c2ljYWwgYm94IGlzXG4gICAgLy8gYWxyZWFkeSBpbmRlcGVuZGVudCBvZiB0aGUgZGVjaW1hdGUgZmFjdG9yLlxuICAgIC8vXG4gICAgLy8gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoYXQgYXJpdGhtZXRpYy4gU2l6aW5nIHRoZSBib3ggYnkgdGhlIHNhbXBsZWQgdm94ZWxcbiAgICAvLyBjb3VudHMgbWFkZSBoaWdoZXIgaW4tcGxhbmUgcmVzb2x1dGlvbiBncm93IFgvWSB3aGlsZSB0aGUgZGVwdGggc3RheWVkIHRoZVxuICAgIC8vIChjb25zdGFudCkgc2xpY2UgY291bnQg4oCUIHNvIFogYXBwZWFyZWQgdG8gc2hyaW5rIGF0IGhpZ2hlciByZXNvbHV0aW9uLlxuICAgIC8vIEFuY2hvcmluZyB0aGUgaW4tcGxhbmUgbG9uZyBzaWRlIHRvIGEgZml4ZWQgcmVmZXJlbmNlIGFuZCBsZXR0aW5nIFogc3BhbiB0aGVcbiAgICAvLyBmdWxsIHNsaWNlIGNvdW50IG1ha2VzIHRoZSBib3ggc2hhcGUgaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci5cbiAgICBjb25zdCBtZXRhID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBtcHBYWVo6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bGwgPVxuICAgICAgbWV0YT8ubXBwWCAmJiBtZXRhPy5tcHBZICYmIG1ldGE/Lm1wcFogPyBbbWV0YS5tcHBYLCBtZXRhLm1wcFksIG1ldGEubXBwWl0gOiBudWxsO1xuICAgIC8vIFRoZSBpbWFnZSdzIERFQ0xBUkVEIHBpeGVsIGRpbWVuc2lvbnMsIHdoaWNoIGlzIHdoYXQgbXBwIGlzIHBlcjogdGhlIHNhbXBsZWRcbiAgICAvLyBkaW1zIGFyZSBkZWNpbWF0ZWQsIHNvIHNpemluZyBhIHBoeXNpY2FsIGJveCBieSB0aGVtIHdvdWxkIG1ha2UgdGhlIHdvcmxkXG4gICAgLy8gYm94IGRlcGVuZCBvbiB0aGUgcmVzb2x1dGlvbiB0aGUgdXNlciBoYXBwZW5zIHRvIGJlIHZpZXdpbmcgYXQuXG4gICAgY29uc3QgZnVsbFcgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcy53aWR0aDtcbiAgICBjb25zdCBmdWxsSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcy5oZWlnaHQ7XG4gICAgY29uc3QgZnVsbEQgPSBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXMuZGVwdGg7XG4gICAgbGV0IHdvcmxkOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiBmdWxsVyAqIG1wcFhZWlswXSxcbiAgICAgICAgaGVpZ2h0OiBmdWxsSCAqIG1wcFhZWlsxXSxcbiAgICAgICAgZGVwdGg6IGZ1bGxEICogbXBwWFlaWzJdLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZnVsbExvbmcgPSBNYXRoLm1heCgxLCBmdWxsVywgZnVsbEgpO1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICAgIGhlaWdodDogKGZ1bGxIICogVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGKSAvIGZ1bGxMb25nLFxuICAgICAgICBkZXB0aDogZnVsbEQsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLnZvbHVtZVdvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCB2b3hlbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFtcbiAgICAgIHdvcmxkLndpZHRoIC8gZGltcy53aWR0aCxcbiAgICAgIHdvcmxkLmhlaWdodCAvIGRpbXMuaGVpZ2h0LFxuICAgICAgd29ybGRaIC8gdGhpcy52b2x1bWVTYW1wbGVkRGVwdGgsXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNoYW5uZWxzKSBjaC52b3hlbFNpemUgPSB2b3hlbFNpemU7XG5cbiAgICB2aWV3LnJlbmRlcih0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZScsIGNoYW5uZWxzLCB7IHJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmltYWdlVyA9IGRpbXMud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkaW1zLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMod29ybGQud2lkdGgsIHdvcmxkLmhlaWdodCwgd29ybGRaLCB7IHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiB3b3JsZC53aWR0aCwgaGVpZ2h0OiB3b3JsZC5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgICAgLy8gXCJaXCIgYXhpcyArIGxhYmVsIGxpdmUpLCBzbyBpdCByZWFkcyBhcyB0aGUgWi1oZWlnaHQgY29udHJvbC4gRmxvYXRlZCBhIGxpdHRsZSBwYXN0IHRoZSBheGlzXG4gICAgICAvLyB0aXAgKMOXMS4xMikgc28gdGhlIGdyaXAgY2xlYXJzIHRoZSBcIlogwrcg4oCmXCIgbGFiZWwuIERyYWcg4oaVIHRvIHJlc3RyZXRjaCBaIGxpdmUuXG4gICAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZSh0aGlzLmhvc3QsIHZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgICB0b3BBbmNob3I6ICgpID0+IFtcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLndpZHRoIC8gMixcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICAgKCh0aGlzLnZvbHVtZVdvcmxkQmFzZSEuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNjYWxlOiAoKSA9PiB0aGlzLnZvbHVtZVpTY2FsZSxcbiAgICAgICAgc2V0U2NhbGU6IChzKSA9PiB0aGlzLnNldFZvbHVtZVpTY2FsZShzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBwcml2YXRlIHNldFZvbHVtZVpTY2FsZShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lWlNjYWxlID0gTWF0aC5taW4oMTAsIE1hdGgubWF4KDAuMSwgZmFjdG9yKSk7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMudm9sdW1lV29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy52b2x1bWVWaWV3KSByZXR1cm47XG4gICAgY29uc3Qgd29ybGRaID0gYmFzZS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHRoaXMuYXhlc0xheWVyLmRlcHRoID0gd29ybGRaO1xuICAgIHRoaXMuYXhlc0xhYmVscz8udXBkYXRlQW5jaG9ycyhcbiAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IGJhc2Uud2lkdGgsIGhlaWdodDogYmFzZS5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbCBzcGVjcyBmb3IgdGhlIDNEIGdpem1vLiBBbmNob3JzIGFyZSBpbiB0aGUgdm9sdW1lJ3MgY2VudHJlZFxuICAgKiAgd29ybGQgYm94IChtYXRjaGluZyB0aGUgQXhlc0xheWVyIGdlb21ldHJ5KTsgdGhlIHNjYWxlIHRleHQgcmVmbGVjdHMgdGhlIEZVTEwgaW1hZ2UgZXh0ZW50IOKAlFxuICAgKiAgcGh5c2ljYWwgwrVtIHdoZW4gwrVtL3BpeGVsIGlzIGtub3duLCBlbHNlIHBpeGVsIChYL1kpIC8gc2xpY2UgKFopIGNvdW50cy4gKi9cbiAgcHJpdmF0ZSBidWlsZEF4ZXNMYWJlbHMoXG4gICAgdm9sOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0sXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSB2b2wud2lkdGggLyAyO1xuICAgIGNvbnN0IGh5ID0gdm9sLmhlaWdodCAvIDI7XG4gICAgY29uc3QgaHogPSB2b2wuZGVwdGggLyAyO1xuICAgIC8vIE1lYXN1cmVkIGZyb20gdGhlIElNQUdFJ3Mgb3duIGV4dGVudCwgbmV2ZXIgZnJvbSB0aGUgd29ybGQgYm94OiB0aGUgYm94IGlzIGFcbiAgICAvLyBzaGFwZSAoYW5kIGZvciBhIHBoeXNpY2FsbHkgc2l6ZWQgdm9sdW1lIGl0IGlzIGFscmVhZHkgaW4gwrVtLCBzbyByZWFkaW5nIGFcbiAgICAvLyBwaXhlbCBjb3VudCBvZmYgaXQgYW5kIG11bHRpcGx5aW5nIGJ5IG1wcCB3b3VsZCBzY2FsZSB0aGUgbGFiZWwgdHdpY2UpLlxuICAgIGNvbnN0IHsgcHgsIG1wcCB9ID0gdGhpcy5pbWFnZUV4dGVudCgpO1xuICAgIGNvbnN0IGxlbiA9IChuOiBudW1iZXIsIHVtOiBudW1iZXIpOiBzdHJpbmcgPT4gKHVtID4gMCA/IGZvcm1hdFVtKG4gKiB1bSkgOiBgJHtufSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKHB4WzBdLCBtcHBbMF0pfWAsIGNvbG9yOiAnI2VkNDU0NScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCBoeSwgLWh6XSwgdGV4dDogYFkgwrcgJHtsZW4ocHhbMV0sIG1wcFsxXSl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgLy8gUGh5c2ljYWwgd2hlbiB0aGUgc3RhY2sgZGVjbGFyZXMgaXRzIHNsaWNlIHNwYWNpbmcgKGBtcHBaYCkg4oCUIGEgcmVzYW1wbGVkXG4gICAgICAvLyB2b2x1bWUga25vd3MgaG93IHRoaWNrIGl0IGlzOyBhIHBsYWluIHotc3RhY2sgY2FuIG9ubHkgc2F5IGhvdyBtYW55IHNsaWNlcy5cbiAgICAgIHsgYW5jaG9yOiBbLWh4LCAtaHksIGh6XSwgdGV4dDogYFogwrcgJHtsZW4ocHhbMl0sIG1wcFsyXSl9YCwgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGltYWdlJ3MgZGVjbGFyZWQgZXh0ZW50IGluIHBpeGVscy9zbGljZXMsIGFuZCBpdHMgcGh5c2ljYWwgc3BhY2luZyBwZXJcbiAgICogYXhpcyBpbiDCtW0gKDAgPSB1bmRlY2xhcmVkLCBhbmQgdGhlbiB0aGF0IGF4aXMgcmVhZHMgaW4gcGl4ZWxzKS5cbiAgICpcbiAgICogT25lIHBsYWNlLCBiZWNhdXNlIHRoZSB2b2x1bWUgd29ybGQgYm94IGFuZCB0aGUgYXhpcyBsYWJlbHMgaGF2ZSB0byBhZ3JlZVxuICAgKiBhYm91dCB3aGF0IHRoZSBpbWFnZSdzIHJlYWwgZGltZW5zaW9ucyBhcmUg4oCUIHRoZSBzYW1wbGVkIGdyaWQgaXMgZGVjaW1hdGVkIGFuZFxuICAgKiBzYXlzIG5vdGhpbmcgYWJvdXQgZWl0aGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUV4dGVudCgpOiB7IHB4OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IG1wcDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnZvbHVtZURpbXM7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gbWV0YT8ueCA/PyBkaW1zPy53aWR0aCA/PyAxLFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXM/LmhlaWdodCA/PyAxLFxuICAgICAgICBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXM/LmRlcHRoIHx8IDEsXG4gICAgICBdLFxuICAgICAgLy8gQSBkZXNjcmlwdG9yIHRoYXQgcmVwb3J0cyBvbmx5IG1wcFggaXMgc3F1YXJlLXBpeGVsIGJ5IGNvbnZlbnRpb24sIHdoaWNoIGlzXG4gICAgICAvLyB3aGF0IHRoZSAyRCBzY2FsZSBiYXIgYWxyZWFkeSBhc3N1bWVzIG9mIGl0LlxuICAgICAgbXBwOiBbbXBwWCwgdGhpcy5kZXNjcmlwdG9yPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgbWV0YT8ubXBwWiB8fCAwXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGEgZG93bnNhbXBsZWQgdWludDggdm9sdW1lIChsdW1pbmFuY2UpIGZyb20gdGhlIHBlci1zbGljZSB0aWxlIGVuZHBvaW50LiBTbGljZXMgYXJlXG4gICAqIGZldGNoZWQgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IChrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGZ1bGwgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXBcbiAgICogc3RhY2spIGFuZCByZWFkIGludG8gdGhlIHZvbHVtZSBhcyBlYWNoIGFycml2ZXMsIGRyaXZpbmcge0BsaW5rIHN0YWNrTG9hZGluZ1Byb2dyZXNzJH0gc28gdGhlXG4gICAqIGhvc3Qgc2hvd3MgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgaW5zdGVhZCBvZiBhIGJhcmUgc3Bpbm5lci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZW1ibGVWb2x1bWUoXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSA9IHt9LFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzIHdoaWxlIHdlIGZldGNoXG4gICAgY29uc3QgZnVsbERlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgaWYgKGZ1bGxEZXB0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbm8gc2xpY2VzIHRvIGFzc2VtYmxlIGEgdm9sdW1lJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iob3B0cy5zbGljZVN0ZXAgPz8gMSkpO1xuICAgIGNvbnN0IG1heFNsaWNlID0gb3B0cy5tYXhTbGljZSA/PyBWT0xVTUVfTUFYX1NMSUNFO1xuICAgIC8vIFNvdXJjZS1zbGljZSBpbmRpY2VzIHNhbXBsZWQgaW50byB0aGUgdm9sdW1lIChldmVyeSBgc3RlcGB0aCBwbGFuZSDihpIgbG93LXJlcyBpcyBmYXN0ZXIpLlxuICAgIGNvbnN0IHpJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHogPSAwOyB6IDwgZnVsbERlcHRoOyB6ICs9IHN0ZXApIHpJbmRpY2VzLnB1c2goeik7XG4gICAgY29uc3QgZGVwdGggPSB6SW5kaWNlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBlYWNoIHNsaWNlIGF0IGEgcHlyYW1pZCBsZXZlbCBtYXRjaGluZyBgbWF4U2xpY2VgIChidWRnZXQgc2NhbGVzIHdpdGggdGhlIGRlY2ltYXRlXG4gICAgICAvLyBmYWN0b3IpLCBzbyBhIGhpZ2hlciBmYWN0b3IgcHVsbHMgYSBmaW5lciBsZXZlbCDihpIgbW9yZSByZWFsIGluLXBsYW5lIGRldGFpbDsgdGhlbiBkb3duc2FtcGxlXG4gICAgICAvLyB0byBgbWF4U2xpY2VgLiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmQgKG11bHRpY2hhbm5lbCB2b2x1bWUpOyBvbWl0IGZvciB0aGUgZ3JheXNjYWxlXG4gICAgICAvLyBjb21wb3NpdGUuIFRoZSBjYWxsZXIgb3ducyB0aGUgc3RhY2tMb2FkaW5nIGZsYWcgKG11bHRpY2hhbm5lbCBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybikuXG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4U2xpY2UpO1xuICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbMF0sIGNoYW5uZWwsIGJ1ZGdldCk7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIG1heFNsaWNlIC8gTWF0aC5tYXgoZmlyc3Qud2lkdGgsIGZpcnN0LmhlaWdodCwgMSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3QuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIGRlcHRoKTtcblxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ25hcGFyaS1qcyB2b2x1bWUgYXNzZW1ibHk6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcblxuICAgICAgLy8gUmVhZCBvbmUgZmV0Y2hlZCBzbGljZSBiaXRtYXAgaW50byB0aGUgdm9sdW1lIHBsYW5lIGB6YCAobHVtaW5hbmNlKS4gU3luY2hyb25vdXMgYmV0d2VlblxuICAgICAgLy8gYXdhaXRzLCBzbyB0aGUgc2hhcmVkIDJEIGNvbnRleHQgaXMgc2FmZSB0byByZXVzZSBhY3Jvc3MgdGhlIGNvbmN1cnJlbnQgZmV0Y2ggd29ya2Vycy5cbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHJlYWRTbGljZSA9ICh6OiBudW1iZXIsIGJtcDogSW1hZ2VCaXRtYXApOiB2b2lkID0+IHtcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgICAgICBjb25zdCBiYXNlID0geiAqIHdpZHRoICogaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICBkYXRhW2Jhc2UgKyBpXSA9XG4gICAgICAgICAgICAocmdiYVtpICogNF0gKiAwLjI5OSArIHJnYmFbaSAqIDQgKyAxXSAqIDAuNTg3ICsgcmdiYVtpICogNCArIDJdICogMC4xMTQpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICBkb25lKys7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoTWF0aC5yb3VuZCgoZG9uZSAvIGRlcHRoKSAqIDEwMCkpO1xuICAgICAgfTtcblxuICAgICAgcmVhZFNsaWNlKDAsIGZpcnN0KTtcblxuICAgICAgLy8gUmVtYWluaW5nIHBsYW5lcyB2aWEgYSBzbWFsbCBwb29sIG9mIHdvcmtlcnMgZHJhaW5pbmcgYSBzaGFyZWQgcXVldWUuIEVhY2ggcGxhbmUgYHBgXG4gICAgICAvLyBtYXBzIHRvIHNvdXJjZSBzbGljZSBgekluZGljZXNbcF1gIChzdWJzYW1wbGVkIGZvciBsb3ctcmVzKS5cbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBwID0gMTsgcCA8IGRlcHRoOyBwKyspIHBlbmRpbmcucHVzaChwKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHAgPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjtcbiAgICAgICAgICByZWFkU2xpY2UocCwgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzW3BdLCBjaGFubmVsLCBidWRnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2xTaXplID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCAtIDEpKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHBvb2xTaXplIH0sICgpID0+IHdvcmtlcigpKSk7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybiBudWxsOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlciBhIHBhcnRpYWwgdm9sdW1lXG4gICAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIgMkQgc2NhdHRlcjogdGhlIHNsaWNlIGltYWdlIHdpdGggYSBwb2ludHMgbGF5ZXIgYXQgZWFjaCByZWdpb24nc1xuICAgKiBjZW50cm9pZCAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyByZWdpb24tY2VudHJvaWQgc2NhdHRlcikuIFJlYnVpbGRzIHRoZSBwb2ludHMgbGl2ZSBhc1xuICAgKiByZWdpb25zIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgdGhpcy5pbnN0YWxsTmF2aWdhdG9yKHopO1xuICAgIC8vIFRoaXMgbW9kZSBwbG90cyBSRUdJT04gY2VudHJvaWRzLCBzbyB3aXRob3V0IHRoZSByZWdpb24gdG9vbHMgdGhlcmUgaXMgbm9cbiAgICAvLyB3YXkgdG8gcHJvZHVjZSBhIHBvaW50IOKAlCBkcmF3aW5nIGEgcmVnaW9uIG5vdyBhZGRzIG9uZSBpbW1lZGlhdGVseS5cbiAgICB0aGlzLmluc3RhbGwyZEludGVyYWN0aW9uKHZpZXdlciwgaG9zdCk7XG4gICAgdGhpcy5yZWJ1aWxkU2NhdHRlclBvaW50cygpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IHRoaXMucmVnaW9uU3RvcmVcbiAgICAgIC5nZXRSZWdpb25VcGRhdGVFdmVudCgpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVidWlsZFNjYXR0ZXJQb2ludHMoKSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSAyRCBzY2F0dGVyJ3MgcG9pbnQgbGF5ZXIgYXQgdGhlIGN1cnJlbnQgcmVnaW9uIGNlbnRyb2lkcy4gKi9cbiAgcHJpdmF0ZSByZWJ1aWxkU2NhdHRlclBvaW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2NhdHRlcjJkUG9pbnRzKSB7XG4gICAgICB2LmxheWVycy5yZW1vdmUodGhpcy5zY2F0dGVyMmRQb2ludHMpO1xuICAgICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjZW50cm9pZHMgPSB0aGlzLnJlZ2lvbkNlbnRyb2lkcygpO1xuICAgIGlmIChjZW50cm9pZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSB2LmFkZFBvaW50cyhjZW50cm9pZHMsIHtcbiAgICAgIHNpemU6IDEyLFxuICAgICAgZmFjZUNvbG9yOiBbMSwgMC44NSwgMC4yLCAxXSxcbiAgICAgIGJvcmRlckNvbG9yOiBbMCwgMCwgMCwgMV0sXG4gICAgICBib3JkZXJXaWR0aDogMixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpb24gY2VudHJvaWRzIGFzIGZsYXQgYFt4LCB5LCDigKZdYCBkYXRhIGNvb3JkcyAocmVjdGFuZ2xlIC8gcG9seWdvbiAvIG11bHRpcG9seWdvbikuICovXG4gIHByaXZhdGUgcmVnaW9uQ2VudHJvaWRzKCk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3Qgb3V0OiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHBvbHlDZW50cm9pZCA9ICh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbiA9IHhzLmxlbmd0aDtcbiAgICAgIGlmIChuID09PSAwKSByZXR1cm47XG4gICAgICBsZXQgY3ggPSAwO1xuICAgICAgbGV0IGN5ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGN4ICs9IHhzW2ldO1xuICAgICAgICBjeSArPSB5c1tpXTtcbiAgICAgIH1cbiAgICAgIG91dC5wdXNoKGN4IC8gbiwgY3kgLyBuKTtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSkge1xuICAgICAgY29uc3QgYiA9IHIuYm91bmRzIGFzXG4gICAgICAgIHwgeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICAgICAgICB8IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1cbiAgICAgICAgfCB7IHBvbHlnb25zOiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXSB9W10gfVxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCd3aWR0aCcgaW4gYiAmJiAneCcgaW4gYikge1xuICAgICAgICBvdXQucHVzaChiLnggKyBiLndpZHRoIC8gMiwgYi55ICsgYi5oZWlnaHQgLyAyKTtcbiAgICAgIH0gZWxzZSBpZiAoJ3hwb2ludHMnIGluIGIpIHtcbiAgICAgICAgcG9seUNlbnRyb2lkKGIueHBvaW50cywgYi55cG9pbnRzKTtcbiAgICAgIH0gZWxzZSBpZiAoJ3BvbHlnb25zJyBpbiBiKSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBiLnBvbHlnb25zKSBwb2x5Q2VudHJvaWQocC54cG9pbnRzLCBwLnlwb2ludHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcmFjdGlvbiBzdGFjayBldmVyeSAyRCBtb2RlIG5lZWRzOiB0aGUgcmVnaW9uIG92ZXJsYXkgKGRyYXcvc2VsZWN0L2VkaXQpLCB0aGUgcGl4ZWxcbiAgICogdG9vbHMgdGhhdCByZWFkIGJhY2sgZGlzcGxheWVkIHBpeGVscyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0vY2VsbHBvc2UpLFxuICAgKiBhbmQgYSBjYW1lcmEgaG9vayB0aGF0IGtlZXBzIHRoYXQgcmVhZGJhY2sgY3VycmVudCBhcyB0aGUgdmlldyBwYW5zL3pvb21zIGFuZCB0aWxlZCBsZXZlbHNcbiAgICogbG9hZC5cbiAgICpcbiAgICogRXh0cmFjdGVkIGJlY2F1c2UgZm9yZ2V0dGluZyBpdCBpcyBpbnZpc2libGU6IHRoZSB0b29sYmFyIGdhdGVzIGl0cyByZWdpb24gYnV0dG9ucyBvbiAyRC12cy0zRFxuICAgKiByYXRoZXIgdGhhbiBvbiBwbG90IHR5cGUsIHNvIGEgMkQgbW9kZSB0aGF0IHNraXBzIHRoaXMgc2hvd3MgZXZlcnkgdG9vbCBhbmQgc2lsZW50bHkgZG9lc1xuICAgKiBub3RoaW5nLiBUaGF0IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB0byB0aGUgc3BhdGlhbCBhbmQgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIgbW9kZXMuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGwyZEludGVyYWN0aW9uKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG5ldyBOYXBhcmlSZWdpb25PdmVybGF5KGhvc3QsIHZpZXdlciwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSB2aWV3ZXIuY2FtZXJhLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB0aGlzLmFybVJlYWRiYWNrKCkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXRpYWwgb21pY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIE1hcmtlciByYWRpdXMgKGltYWdlIHB4KSBmb3IgYSBkYXRhc2V0IHRoYXQgZGVjbGFyZXMgbm9uZSDigJQgc2VnbWVudGVkIGNlbGxzIG9mdGVuIGRvbid0LiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX0ZBTExCQUNLX1JBRElVUyA9IDQ7XG4gIC8qKiBTbWFsbGVzdCBtYXJrZXIgRElBTUVURVIsIGluIHNsaWNlIHBpeGVscywgb3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldC4gQSBjZWxsJ3MgcmVhbFxuICAgKiAgc2l6ZSBpcyBob25vdXJlZCB3aGVyZXZlciBpdCBzdXJ2aXZlcyB0aGUgZ3JpZDogdGhlIEFCQyBhdGxhcyBzZXJ2ZXMgNSDCtW0gcmFkaWkgb24gYVxuICAgKiAgNDAgwrVtL3B4IHRlbXBsYXRlLCBzbyBkcmF3aW5nIHRoZW0gdG8gc2NhbGUgd291bGQgcHV0IGV2ZXJ5IGNlbGwgYSBmaWZ0aCBvZiBhIHBpeGVsIHdpZGVcbiAgICogIGFuZCB0aGUgc2VjdGlvbiB3b3VsZCBjb21lIHVwIGVtcHR5LiBUaGUgcG9pbnQtc2l6ZSBjb250cm9sIHNjYWxlcyB1cCBmcm9tIHRoaXMgZmxvb3IuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfU0xJQ0VfTUlOX0RJQU1FVEVSX1BYID0gMS41O1xuICAvKiogTG9uZ2VzdCBzaWRlIG9mIHRoZSBnZW5lLW1hcCByYXN0ZXIsIGluIGZpZWxkIHBpeGVscy4gQSBnZW5lIG1hcCBpcyBhIHNtb290aFxuICAgKiAgZmllbGQgcmVhZCBhcyB0ZXJyaXRvcnksIHNvIGl0IGdhaW5zIG5vdGhpbmcgZnJvbSBtYXRjaGluZyBhIDIgR3B4IHNsaWRlJ3NcbiAgICogIHJlc29sdXRpb24g4oCUIGFuZCB0aGUgZXN0aW1hdGUgY29zdHMgb25lIHBhc3Mgb3ZlciB0aGlzIG1hbnkgcGl4ZWxzLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHRU5FX01BUF9NQVhfU0lERSA9IDUxMjtcbiAgLyoqIEtlcm5lbCDPgyBpbiBmaWVsZCBwaXhlbHMgYXQgc21vb3RoaW5nIDE6IHdpZGUgZW5vdWdoIHRvIHJlYWQgYmV0d2VlbiBjZWxscyxcbiAgICogIHRpZ2h0IGVub3VnaCB0byBrZWVwIGEgbnVjbGV1cy1zY2FsZSBzdHJ1Y3R1cmUgZGlzdGluY3QuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdFTkVfTUFQX1NJR01BID0gMi41O1xuICAvKiogQ2x1c3RlcnMgZHJhd24gYXMgZGVuc2l0eSB2b2x1bWVzIGF0IG9uY2UuIFBhc3QgYSBoYW5kZnVsLCBhZGRpdGl2ZSB0cmFuc2x1Y2VudFxuICAgKiAgY2xvdWRzIHN0b3AgYmVpbmcgc2VwYXJhYmxlIGJ5IGV5ZSDigJQgYW5kIGVhY2ggb25lIGlzIGEgZnVsbCByYXN0ZXJpc2F0aW9uLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERU5TSVRZX01BWF9DTFVTVEVSUyA9IDY7XG4gIC8qKiBDb2xvdXIgZm9yIG9ic2VydmF0aW9ucyB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQgdG8gY29sb3VyIGJ5OiB2aXNpYmxlLCBuZXV0cmFsLCBhbmRcbiAgICogIG9idmlvdXNseSBub3QgZW5jb2RpbmcgYW55dGhpbmcuICovXG4gIC8qKiBIb3cgbXVjaCBsYXJnZXIgYSBzZWxlY3RlZCBtYXJrZXIgaXMgZHJhd24sIHNvIGEgc21hbGwgc2VsZWN0aW9uIGlzIGZpbmRhYmxlIGluc2lkZSBhXG4gICAqICAzLjdNLXBvaW50IGNsb3VkIHJhdGhlciB0aGFuIG1lcmVseSBicmlnaHRlci4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFID0gMS42O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfTkVVVFJBTF9DT0xPUjogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgIFswLjM1LCAwLjcyLCAwLjk1LCAwLjldO1xuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgU1BBVElBTF9PTUlDUyB2aWV3OiB0aGUgdGlzc3VlIGltYWdlIHdpdGggb25lIG1hcmtlciBwZXIgb2JzZXJ2YXRpb24sIGNvbG91cmVkIGJ5XG4gICAqIGFuIGFubm90YXRpb24gY29sdW1uIG9yIGEgZ2VuZS4gVGhlIG1hcmtlcnMgcmVidWlsZCB3aGVuZXZlciB0aGUgZGF0YXNldCBvciB0aGUgdmlldyBzdGF0ZVxuICAgKiBjaGFuZ2VzLCBzbyBzd2l0Y2hpbmcgdGhlIGNvbG91ci1ieSBjb2x1bW4gZG9lcyBub3QgcmVtb3VudCB0aGUgc2NlbmUuXG4gICAqXG4gICAqIFNldHMgdXAgdGhlIGZ1bGwgMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHJlZ2lvbiBvdmVybGF5LCBwaXhlbC10b29sIGhvc3RzLCByZWFkYmFjayBjdXJyZW5jeSDigJRcbiAgICogZXhhY3RseSBhcyB0aGUgcGxhaW4gaW1hZ2UgdmlldyBkb2VzLiBUaGF0IGlzIE5PVCBvcHRpb25hbCBoZXJlOiB0aGlzIG1vZGUncyBzZWxlY3Rpb24gaXNcbiAgICogZHJpdmVuIGJ5IGRyYXduIFJPSXMsIHNvIHdpdGhvdXQgdGhlIG92ZXJsYXkgdGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgYSBzZWxlY3Rpb24gYXQgYWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNwYXRpYWxPbWljcyh2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQsIHo6IG51bWJlciwgbm9JbWFnZSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gV2l0aCBubyBpbWFnZSBsb2FkZWQgdGhlcmUgaXMgbm90aGluZyB0byByZW5kZXIgdW5kZXIgdGhlIG9ic2VydmF0aW9uczsgdGhleSBhcmVcbiAgICAvLyBmcmFtZWQgb24gdGhlaXIgb3duIGV4dGVudCwgYXMgZm9yIGFueSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLlxuICAgIGlmICghbm9JbWFnZSkgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzXG4gICAgLy8gbm90aGluZyB0byBmaXQsIGBpbWFnZVdgL2BpbWFnZUhgIHN0aWxsIGhvbGQgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmRcbiAgICAvLyB0aGlzIGZpdHMgdG8gdGhvc2Ug4oCUIGFuZCBiZWNhdXNlIGl0IGRlZmVycyB0byBhIGZyYW1lLCBpdCBsYW5kcyBBRlRFUiB0aGUgcG9pbnRzXG4gICAgLy8gYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZSBmcmFtaW5nIHRoZXkgc2V0LiBUaGF0IGlzIHdoYXQgbGVmdCBhbiBpbWFnZS1sZXNzXG4gICAgLy8gZGF0YXNldCBhcyBhIHRlbi1waXhlbCBzcGVjayBvZmYgdG8gb25lIHNpZGUuXG4gICAgaWYgKHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdPy5pbWFnZVJlZikgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICAvLyBUaGUgc2NhbGUgYmFyIGFuZCBuYXZpZ2F0b3IgZGVzY3JpYmUgYW4gaW1hZ2U7IHdpdGggbm9uZSBsb2FkZWQsIHdoYXRldmVyIHRoZXkgd291bGRcbiAgICAvLyByZWFkIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBsYXN0IG9uZS5cbiAgICBpZiAoIW5vSW1hZ2UpIHtcbiAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICB0aGlzLmluc3RhbGxOYXZpZ2F0b3Ioeik7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLmluc3RhbGxTcGF0aWFsSG92ZXIoaG9zdCk7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXMoKT8uYXR0YWNoKHZpZXdlcik7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgMkQgb2JzZXJ2YXRpb24gbWFya2VycyBhcmUgZHJhd246IHdoZW4gdGhlIHVzZXIgd2FudHMgdGhlbSwgYW5kIG5vdCB3aGlsZVxuICAgKiBjZWxsIG91dGxpbmVzIGFyZSBvbiBzY3JlZW4g4oCUIHRoZW4gYSBjZWxsIElTIGl0cyBvdXRsaW5lLCBhbmQgYSBjaXJjbGUgb24gdG9wIG9mIGl0IGlzXG4gICAqIG5vaXNlLiBab29tZWQgb3V0IHBhc3QgdGhlIG91dGxpbmUgdGhyZXNob2xkLCB0aGUgY2lyY2xlcyBzdGFuZCBpbiBmb3IgdGhlIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zcGF0aWFsTGF0ZXN0Py5bMV07XG4gICAgcmV0dXJuICh2aWV3Py5zaG93UG9pbnRzID8/IHRydWUpICYmICF0aGlzLnNwYXRpYWxUaWxlc01ncj8ub3V0bGluZXNTaG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGlsZWQtZ2VvbWV0cnkgbWFuYWdlciwgYnVpbHQgb24gZmlyc3QgdXNlLiBJdHMgaG9zdCBjYWxsYmFja3MgcmVhZCB0aGlzXG4gICAqIHNlcnZpY2UncyBsaXZlIHN0YXRlLCBzbyBpdCBuZXZlciBob2xkcyBhIHN0YWxlIGRhdGFzZXQgb3IgY29sb3JtYXAuXG4gICAqL1xuICBwcml2YXRlIHNwYXRpYWxUaWxlcygpOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGwge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGlmICghcG9ydCkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXNNZ3IgPz89IG5ldyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyhwb3J0LCB7XG4gICAgICBsYXRlc3Q6ICgpID0+IHRoaXMuc3BhdGlhbExhdGVzdCxcbiAgICAgIGNhbnZhc1NpemU6ICgpID0+IFt0aGlzLmNhbnZhcz8uY2xpZW50V2lkdGggPz8gMCwgdGhpcy5jYW52YXM/LmNsaWVudEhlaWdodCA/PyAwXSxcbiAgICAgIGNvbnRpbnVvdXNMdXQ6ICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgICAgICByZXR1cm4gc3BhdGlhbENvbnRpbnVvdXNMdXQobm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwKTtcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZUNoYW5nZWQ6IChlKSA9PiB0aGlzLnRyYW5zY3JpcHRFc3RpbWF0ZSQubmV4dChlKSxcbiAgICAgIGdlbmVDb3VudHNDaGFuZ2VkOiAoYykgPT4gdGhpcy5nZW5lQ291bnRzSW5WaWV3JC5uZXh0KGMpLFxuICAgICAgbG9hZGluZ0NoYW5nZWQ6IChsYXllcnMpID0+IHtcbiAgICAgICAgdGhpcy50aWxlTG9hZGluZyA9IGxheWVycztcbiAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgfSxcbiAgICAgIGRlbnNpdHlDaGFuZ2VkOiAoZCkgPT4gdGhpcy5kZW5zaXR5U3RhdHMkLm5leHQoZCksXG4gICAgICBwb2x5Z29uc1Nob3duQ2hhbmdlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB0aGlzLnNwYXRpYWxQb2ludHMudmlzaWJsZSA9IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKTtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFRpbGVzTWdyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBkcmF3aW5nIGZvciB0aGUgM0QgY2xvdWQuXG4gICAqXG4gICAqIFJldXNlcyB7QGxpbmsgTmFwYXJpUmVnaW9uT3ZlcmxheX0gdmVyYmF0aW0gYnkgaGFuZGluZyBpdCBhIFNDUkVFTi1TUEFDRSB2aWV3ZXI6IHRoZSBkcmF3blxuICAgKiBzaGFwZSBpcyBhIGxhc3NvIGluIGNhbnZhcyBwaXhlbHMsIHNvIFwid29ybGRcIiBpcyB0aGUgY2FudmFzIGFuZCBib3RoIHRyYW5zZm9ybXMgYXJlIGlkZW50aXR5XG4gICAqIChiYXIgdGhlIGNsaWVudOKGkmNhbnZhcyBvZmZzZXQpLiBFdmVyeSBleGlzdGluZyB0b29sIOKAlCByZWN0YW5nbGUsIHBvbHlnb24sIGZyZWVoYW5kIOKAlCB0aGVyZWZvcmVcbiAgICogd29ya3MgaW4gM0Qgd2l0aCBubyBuZXcgZHJhd2luZyBjb2RlLlxuICAgKlxuICAgKiBBIHNjcmVlbi1zcGFjZSBzaGFwZSBzdG9wcyBtZWFuaW5nIGFueXRoaW5nIHRoZSBtb21lbnQgdGhlIGNhbWVyYSBtb3Zlcywgc28gYW4gb3JiaXQgY2xlYXJzXG4gICAqIHRoZSBkcmF3biByZWdpb25zLiBUaGUgU0VMRUNUSU9OIGl0IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXMgdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGVcbiAgICogaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbDNkSW50ZXJhY3Rpb24odmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzUmVjdCA9ICgpID0+IHRoaXMuY2FudmFzPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzY3JlZW5TcGFjZTogT3ZlcmxheVZpZXdlciA9IHtcbiAgICAgIGNhbnZhc1RvV29ybGQ6IChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCByID0gY2FudmFzUmVjdCgpO1xuICAgICAgICByZXR1cm4gciA/IFtjbGllbnRYIC0gci5sZWZ0LCBjbGllbnRZIC0gci50b3BdIDogW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgfSxcbiAgICAgIC8vIEFscmVhZHkgY2FudmFzIHBpeGVscy5cbiAgICAgIHdvcmxkVG9DYW52YXM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW3gsIHldLFxuICAgICAgc2V0Q29udHJvbHNFbmFibGVkOiAoZW5hYmxlZDogYm9vbGVhbikgPT4gdmlld2VyLnNldENvbnRyb2xzRW5hYmxlZChlbmFibGVkKSxcbiAgICAgIGNhbWVyYTogdmlld2VyLmNhbWVyYTNkLFxuICAgIH07XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbmV3IE5hcGFyaVJlZ2lvbk92ZXJsYXkoaG9zdCwgc2NyZWVuU3BhY2UsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgIHRoaXMuYnVpbGRUb29sSG9zdHMoKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gdmlld2VyLmNhbWVyYTNkLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB7XG4gICAgICAvLyBPbmx5IHdoaWxlIG5vdGhpbmcgaXMgYmVpbmcgZHJhd24g4oCUIGNsZWFyaW5nIG1pZC1nZXN0dXJlIHdvdWxkIGRlbGV0ZSB0aGVcbiAgICAgIC8vIHNoYXBlIHVuZGVyIHRoZSB1c2VyJ3MgY3Vyc29yLlxuICAgICAgaWYgKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmxlbmd0aCA+IDApIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhbXSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogTW92ZW1lbnQsIGluIHNjcmVlbiBwaXhlbHMsIHVuZGVyIHdoaWNoIGEgcHJlc3MtcmVsZWFzZSBpcyBhIENMSUNLIGFuZCBub3QgYVxuICAgKiAgZHJhZy4gQW4gb3JiaXQgb3IgYSBwYW4gc3RhcnRzIHRoZSBzYW1lIHdheSwgc28gdGhlIHR3byBoYXZlIHRvIGJlIHRvbGRcbiAgICogIGFwYXJ0IGJ5IGhvdyBmYXIgdGhlIHBvaW50ZXIgdHJhdmVsbGVkLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTElDS19TTE9QX1BYID0gNDtcbiAgLyoqIExvbmdlc3QgcHJlc3MtcmVsZWFzZSBzdGlsbCB0cmVhdGVkIGFzIGEgY2xpY2suIEEgbG9uZyBwcmVzcyB3aXRoIHRoZSBtb3VzZVxuICAgKiAgaGVsZCBzdGlsbCBpcyBtb3JlIGxpa2VseSBhbiBpbnRlcnJ1cHRlZCBkcmFnIHRoYW4gYSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMSUNLX01BWF9NUyA9IDYwMDtcbiAgLyoqIFBvaW50ZXIgZGlzdGFuY2UsIGluIHNjcmVlbiBwaXhlbHMsIHRoYXQgc3RpbGwgY291bnRzIGFzIFwib25cIiBhIG1hcmtlci5cbiAgICogIEdlbmVyb3VzIHJlbGF0aXZlIHRvIGEgMS41cHggZGlzYzogdGhlIGN1cnNvciBpcyBhIGJsdW50IGluc3RydW1lbnQsIGFuZCBhXG4gICAqICB0b29sdGlwIHlvdSBoYXZlIHRvIGh1bnQgZm9yIGlzIHdvcnNlIHRoYW4gbm9uZS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSE9WRVJfUkFESVVTX1BYID0gMTA7XG5cbiAgLyoqXG4gICAqIEN1cnNvciB0b29sdGlwIGZvciB0aGUgc3BhdGlhbCB2aWV3czogaG92ZXIgYSBtYXJrZXIsIHJlYWQgaXRzIGNsYXNzLlxuICAgKlxuICAgKiBBIDM0LWVudHJ5IGxlZ2VuZCBjYW5ub3QgYmUgcmVhZCBiYWNrIGZyb20gYSBkb3Qg4oCUIHNldmVyYWwgY2xhc3NlcyBnZXRcbiAgICogc2ltaWxhciBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgb25lIHRvIGEgc3dhdGNoIGJ5IGV5ZSBpcyBleGFjdGx5IHRoZSB0YXNrIHRoaXNcbiAgICogcmVtb3Zlcy4gSXQgcmVwb3J0cyB3aGF0ZXZlciB0aGUgY2xvdWQgaXMgQ1VSUkVOVExZIGNvbG91cmVkIGJ5LCBzbyBpdCBhbmRcbiAgICogdGhlIGxlZ2VuZCBjYW4gbmV2ZXIgc2F5IGRpZmZlcmVudCB0aGluZ3MuXG4gICAqXG4gICAqIExpc3RlbnMgb24gdGhlIEhPU1QgcmF0aGVyIHRoYW4gdGhlIGNhbnZhcyBzbyBpdCBrZWVwcyB3b3JraW5nIG92ZXIgdGhlIHJlZ2lvblxuICAgKiBvdmVybGF5IChhbiBTVkcgY292ZXJpbmcgdGhlIGNhbnZhcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cgZXZlcnlcbiAgICogbW92ZSksIGFuZCB0aHJvdHRsZXMgdG8gb25lIGhpdC10ZXN0IHBlciBhbmltYXRpb24gZnJhbWU6IGEgcG9pbnRlcm1vdmUgY2FuXG4gICAqIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LCBhbmQgZWFjaCB0ZXN0IGlzIGEgcGFzcyBvdmVyIHRoZSBjbG91ZC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlU3BhdGlhbEhvdmVyKCk7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcCA9IG5ldyBOYXBhcmlTcGF0aWFsVG9vbHRpcChob3N0KTtcblxuICAgIGNvbnN0IG9uTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgICAgaWYgKCFjYW52YXMpIHJldHVybjtcbiAgICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmhvdmVyUG9pbnRlciA9IHtcbiAgICAgICAgeDogZS5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICB5OiBlLmNsaWVudFkgLSByZWN0LnRvcCxcbiAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuaG92ZXJGcmFtZSkgcmV0dXJuO1xuICAgICAgdGhpcy5ob3ZlckZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICAgICAgdGhpcy51cGRhdGVIb3Zlcihob3N0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25MZWF2ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuaG92ZXJQb2ludGVyID0gbnVsbDtcbiAgICAgIHRoaXMuc3BhdGlhbFRvb2x0aXA/LmhpZGUoKTtcbiAgICB9O1xuXG4gICAgLy8gQSBjbGljayBvbiBhIG1hcmtlciBzZWxlY3RzIGl0cyBjbGFzcywgZXhhY3RseSBhcyBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZVxuICAgIC8vIHBhbmVsJ3MgbGVnZW5kIGRvZXMg4oCUIGluY2x1ZGluZyBjbGlja2luZyBhZ2FpbiB0byBjbGVhciwgc28gYSBjbGljayBpc1xuICAgIC8vIGFsd2F5cyByZXZlcnNpYmxlLiBUcmFja2VkIGFzIGRvd24vdXAgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGNsaWNrYCBzbyBhIERSQUdcbiAgICAvLyAoYW4gb3JiaXQgaW4gM0QsIGEgcGFuIGluIDJEKSBjYW4gYmUgdG9sZCBhcGFydCBmcm9tIGEgY2xpY2s6IHRoZSBnZXN0dXJlXG4gICAgLy8gaGFzIHRvIG1vdmUgbGVzcyB0aGFuIGEgZmV3IHBpeGVscyBhbmQgYmUgb3ZlciBxdWlja2x5LlxuICAgIGxldCBkb3duOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IG9uRG93biA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBkb3duID0geyB4OiBlLmNsaWVudFgsIHk6IGUuY2xpZW50WSwgdDogRGF0ZS5ub3coKSB9O1xuICAgIH07XG4gICAgY29uc3Qgb25VcCA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IGRvd247XG4gICAgICBkb3duID0gbnVsbDtcbiAgICAgIGlmICghc3RhcnQpIHJldHVybjtcbiAgICAgIGNvbnN0IG1vdmVkID0gTWF0aC5oeXBvdChlLmNsaWVudFggLSBzdGFydC54LCBlLmNsaWVudFkgLSBzdGFydC55KTtcbiAgICAgIGlmIChtb3ZlZCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX1NMT1BfUFgpIHJldHVybjtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQudCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX01BWF9NUykgcmV0dXJuO1xuICAgICAgLy8gQSByZWdpb24gdG9vbCBvd25zIHRoZSBwb2ludGVyIHdoaWxlIGl0IGlzIGFjdGl2ZSwgYW5kIHBsYWNpbmcgYSBwb2x5Z29uXG4gICAgICAvLyB2ZXJ0ZXggaXMgYWxzbyBhIGNsaWNrIHRoYXQgZG9lcyBub3QgbW92ZS5cbiAgICAgIGlmICh0aGlzLnJlZ2lvbk92ZXJsYXk/LnRvb2xBY3RpdmUpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0Q2xhc3NBdChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgfTtcblxuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvbk1vdmUpO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bik7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSkpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uTGVhdmUpKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bikpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApKTtcblxuICAgIC8vIEluIDNEIHRoZSBjYWNoZWQgcG9zaXRpb25zIGFyZSBzY3JlZW4gcGl4ZWxzLCBzbyBhbiBvcmJpdCBpbnZhbGlkYXRlcyB0aGVtLlxuICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMudmlld2VyPy5jYW1lcmEzZDtcbiAgICBpZiAoY2FtZXJhICYmIGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSB7XG4gICAgICBjb25zdCBvZmYgPSBjYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3Zlck9mZi5wdXNoKG9mZik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGF0aWFsSG92ZXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvZmYgb2YgdGhpcy5ob3Zlck9mZikgb2ZmKCk7XG4gICAgdGhpcy5ob3Zlck9mZiA9IFtdO1xuICAgIGlmICh0aGlzLmhvdmVyRnJhbWUpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaG92ZXJGcmFtZSk7XG4gICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICB0aGlzLmhvdmVyUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcD8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BhdGlhbFRvb2x0aXAgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSAtMTtcbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICB9XG5cbiAgLyoqIEhpdC10ZXN0IHRoZSBsYXN0IHBvaW50ZXIgcG9zaXRpb24gYW5kIHNob3cgb3IgaGlkZSB0aGUgdG9vbHRpcC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRpcCA9IHRoaXMuc3BhdGlhbFRvb2x0aXA7XG4gICAgY29uc3QgcG9pbnRlciA9IHRoaXMuaG92ZXJQb2ludGVyO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIXRpcCB8fCAhcG9pbnRlciB8fCAhZGF0YXNldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIC8vIFRyYW5zY3JpcHQgbWFya2VycyBzaXQgb24gdG9wIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZXkgYXJlIGFza2VkIGZpcnN0LlxuICAgIGlmICghaXMzZCAmJiB0aGlzLnNwYXRpYWxUaWxlc01nciAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZKTtcbiAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTtcbiAgICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gd29ybGQgPyB0aGlzLnNwYXRpYWxUaWxlc01nci5ob3ZlckF0KHdvcmxkWzBdLCB3b3JsZFsxXSwgcmFkaXVzLCAoZGV0YWlscykgPT4ge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5ob3ZlclBvaW50ZXI7XG4gICAgICAgIGlmICghcCB8fCAhdGhpcy5zcGF0aWFsVG9vbHRpcCkgcmV0dXJuO1xuICAgICAgICBjb25zdCByID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsVG9vbHRpcC5zaG93KGRldGFpbHMsIHAuY2xpZW50WCAtIHIubGVmdCwgcC5jbGllbnRZIC0gci50b3ApO1xuICAgICAgfSkgOiBudWxsO1xuICAgICAgaWYgKGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmhvdmVyUG9zaXRpb25zRm9yKGRhdGFzZXQub2JzZXJ2YXRpb25zKTtcbiAgICBpZiAoIXBvc2l0aW9ucykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gM0QgY29tcGFyZXMgc2NyZWVuIHBpeGVscyBkaXJlY3RseTsgMkQgaG9sZHMgd29ybGQgcG9zaXRpb25zLCBzbyB0aGUgcmFkaXVzXG4gICAgLy8gaXMgY29udmVydGVkIG9uY2UgaW5zdGVhZCBvZiBwcm9qZWN0aW5nIHRoZSB3aG9sZSBjbG91ZC5cbiAgICBjb25zdCB6b29tID0gaXMzZCA/IDEgOiAodGhpcy52aWV3ZXI/LmNhbWVyYS56b29tID8/IDEpO1xuICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICBsZXQgeCA9IHBvaW50ZXIueDtcbiAgICBsZXQgeSA9IHBvaW50ZXIueTtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQocG9pbnRlci5jbGllbnRYLCBwb2ludGVyLmNsaWVudFkpO1xuICAgICAgaWYgKCF3b3JsZCkge1xuICAgICAgICB0aXAuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSB0aGlzLnBpY2tPYnNlcnZhdGlvbihwb3NpdGlvbnMsIHgsIHksIHJhZGl1cywgaXMzZCk7XG4gICAgY29uc3QgbGluZXMgPSBob3ZlclRleHQodGhpcy5ob3ZlclNvdXJjZSwgaGl0KTtcbiAgICBpZiAoIWxpbmVzKSB7XG4gICAgICB0aXAuaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBjbGFzcyBvZiB0aGUgbWFya2VyIGF0IGEgY2xpZW50IHBvc2l0aW9uIOKAlCB0aGUgY2FudmFzIGVxdWl2YWxlbnQgb2ZcbiAgICogY2xpY2tpbmcgdGhhdCBjbGFzcyBpbiB0aGUgcGFuZWwncyBsZWdlbmQsIGFuZCB0aGUgc2FtZSBzZWxlY3Rpb24gb2JqZWN0LCBzb1xuICAgKiB0aGUgdHdvIGNvbnRyb2xzIGNhbm5vdCBwcm9kdWNlIGRpZmZlcmVudCByZXN1bHRzLlxuICAgKlxuICAgKiBDbGlja2luZyBhIGNsYXNzIHRoYXQgaXMgYWxyZWFkeSB0aGUgd2hvbGUgc2VsZWN0aW9uIENMRUFSUyBpdCwgd2hpY2ggaXMgd2hhdFxuICAgKiB0aGUgbGVnZW5kIGRvZXMuIENvbXBhcmVkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiBpdHNlbGYgcmF0aGVyIHRoYW4gYWdhaW5zdCBhXG4gICAqIHJlbWVtYmVyZWQgY2xpY2ssIHNvIHNlbGVjdGluZyBmcm9tIHRoZSBsZWdlbmQgYW5kIHRoZW4gY2xpY2tpbmcgdGhlIHNhbWVcbiAgICogY2xhc3Mgb24gdGhlIGNhbnZhcyBzdGlsbCB0b2dnbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3RDbGFzc0F0KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5ob3ZlclNvdXJjZTtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc2VsZWN0aW9uU3RvcmU7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIC8vIE9ubHkgYSBjYXRlZ29yaWNhbCBzb3VyY2UgaGFzIGNsYXNzZXMgdG8gc2VsZWN0LiBBIGdlbmUgaXMgY29udGludW91czpcbiAgICAvLyB0aGVyZSBpcyBubyBzZXQgb2YgY2VsbHMgdGhhdCBcImlzXCIgYSB2YWx1ZS5cbiAgICBpZiAoIXN0b3JlIHx8ICFkYXRhc2V0IHx8IHNvdXJjZT8ua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5ob3ZlclBvc2l0aW9uc0ZvcihkYXRhc2V0Lm9ic2VydmF0aW9ucyk7XG4gICAgaWYgKCFwb3NpdGlvbnMpIHJldHVybjtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IHpvb20gPSBpczNkID8gMSA6ICh0aGlzLnZpZXdlcj8uY2FtZXJhLnpvb20gPz8gMSk7XG4gICAgY29uc3QgcmFkaXVzID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYIC8gKHpvb20gPiAwID8gem9vbSA6IDEpO1xuICAgIGxldCB4ID0gY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBsZXQgeSA9IGNsaWVudFkgLSByZWN0LnRvcDtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBpZiAoIXdvcmxkKSByZXR1cm47XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIGlmIChoaXQgPCAwKSByZXR1cm47XG4gICAgY29uc3QgY29kZSA9IHNvdXJjZS5jb2Rlc1toaXRdO1xuICAgIC8vIEEgY2VsbCB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBjb3ZlciBoYXMgbm8gY2xhc3MgdG8gc2VsZWN0LlxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQgfHwgY29kZSA9PT0gTk9fQ0FURUdPUlkpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHQgPSBzZWxlY3RCeUNhdGVnb3J5KHNvdXJjZS5jb2RlcywgY29kZSk7XG4gICAgY29uc3QgY3VycmVudCA9IHN0b3JlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2FtZVNlbGVjdGlvbihjdXJyZW50LCBuZXh0KSkge1xuICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RvcmUuc2V0KG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9ic2VydmF0aW9uIGlzIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqXG4gICAqIEluIDNEIHRoaXMgZGVmZXJzIHRvIG5hcGFyaS1qcydzIHtAbGluayBuZWFyZXN0UHJvamVjdGVkSW5kZXh9IFdJVEggdGhlIGRlcHRocyB0aGVcbiAgICogcHJvamVjdGlvbiBwcm9kdWNlZCwgc28gdGhlIGZyb250LW1vc3QgY2FuZGlkYXRlIHdpbnMuIFRoYXQgbWF0dGVycyBtb3JlIHRoYW4gaXRcbiAgICogc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhXG4gICAqIGNlbGwgdGhhdCBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLCB3aGljaCByZWFkcyBhcyBhIHdyb25nIHRvb2x0aXAgcmF0aGVyIHRoYW4gYXNcbiAgICogYSBzdWJ0bGV0eSBvZiBwaWNraW5nLlxuICAgKlxuICAgKiBJbiAyRCB0aGUgcG9zaXRpb25zIGFyZSBXT1JMRCBjb29yZGluYXRlcyBvbiBvbmUgcGxhbmUsIHNvIHRoZXJlIGlzIG5vIGRlcHRoIHRvIGJyZWFrXG4gICAqIHRpZXMgd2l0aCBhbmQgdGhlIGV4aXN0aW5nIG5lYXJlc3QtbWFya2VyIHJ1bGUgaXMgdGhlIHJpZ2h0IG9uZS5cbiAgICovXG4gIHByaXZhdGUgcGlja09ic2VydmF0aW9uKFxuICAgIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgaXMzZDogYm9vbGVhbixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIWlzM2QpIHJldHVybiBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIC8vIFRoZSBjbG91ZCBkcmF3cyBhIHNlbGVjdGVkIG1hcmtlciBMQVJHRVIsIHNvIHRoZSBwaWNrIGhhcyB0byB1c2UgdGhlIHNhbWUgcmFkaXVzIHRoZVxuICAgIC8vIHJlbmRlcmVyIHVzZWQg4oCUIG90aGVyd2lzZSB0aGUgaGlnaGxpZ2h0ZWQgY2VsbHMsIHRoZSBvbmVzIGEgcmVhZGVyIGlzIG1vc3QgbGlrZWx5IHRvXG4gICAgLy8gYmUgcG9pbnRpbmcgYXQsIGFyZSB0aGUgaGFyZGVzdCB0byBob3Zlci5cbiAgICBjb25zdCBzY2FsZSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRTtcbiAgICBjb25zdCBtYXNrID0gdGhpcy5zZWxlY3Rpb25TdG9yZT8uY3VycmVudCgpPy5tYXNrO1xuICAgIGNvbnN0IG9wdHMgPSBtYXNrPy5sZW5ndGhcbiAgICAgID8geyByYWRpdXNBdDogKGk6IG51bWJlcikgPT4gKG1hc2tbaV0gPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cykgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgLy8gYHJhZGl1c2Agc3RpbGwgYm91bmRzIHdoaWNoIGJ1Y2tldHMgYXJlIHZpc2l0ZWQsIHNvIGl0IGhhcyB0byBiZSB0aGUgTEFSR0VTVCBhbnlcbiAgICAvLyBwb2ludCBjYW4gY2xhaW0sIG5vdCB0aGUgYmFzZSBvbmUuXG4gICAgY29uc3QgcmVhY2ggPSBtYXNrPy5sZW5ndGggPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cztcbiAgICBpZiAodGhpcy5ob3ZlckluZGV4KSByZXR1cm4gdGhpcy5ob3ZlckluZGV4LnBpY2soeCwgeSwgcmVhY2gsIG9wdHMpO1xuICAgIHJldHVybiBuZWFyZXN0UHJvamVjdGVkSW5kZXgocG9zaXRpb25zLCB4LCB5LCByZWFjaCwgdGhpcy5zcGF0aWFsRGVwdGhzM2QsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ucyB0byBoaXQtdGVzdCBhZ2FpbnN0LCByZWJ1aWx0IG9ubHkgd2hlbiB0aGUgc2NlbmUgb3IgY2FtZXJhIG1vdmVkLlxuICAgKlxuICAgKiBBIHBhc3Mgb3ZlciAzLjdNIG9ic2VydmF0aW9ucyBpcyBub3Qgc29tZXRoaW5nIHRvIGRvIHBlciBwb2ludGVybW92ZSwgYW5kIHRoZVxuICAgKiBjbG91ZCBkb2VzIG5vdCBtb3ZlIGJldHdlZW4gZnJhbWVzIHVubGVzcyBzb21ldGhpbmcgc2F5cyBpdCBkaWQuXG4gICAqL1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zRm9yKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhvdmVyUG9zaXRpb25zICYmIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPT09IHRoaXMuc3BhdGlhbFNjZW5lUmV2KSB7XG4gICAgICByZXR1cm4gdGhpcy5ob3ZlclBvc2l0aW9ucztcbiAgICB9XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IGJ1aWx0ID0gaXMzZFxuICAgICAgPyB0aGlzLmdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9icylcbiAgICAgIDogdGhpcy5ob3ZlcldvcmxkUG9zaXRpb25zKG9icyk7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9ucyA9IGJ1aWx0O1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSB0aGlzLnNwYXRpYWxTY2VuZVJldjtcbiAgICAvLyBCdWlsdCBoZXJlLCBpbiB0aGUgc2FtZSBsYXp5IHNsb3QsIHNvIGl0IGlzIHBhaWQgZm9yIG9uIHRoZSBmaXJzdCBob3ZlciBhZnRlciB0aGVcbiAgICAvLyBzY2VuZSBtb3ZlZCBhbmQgbm90IG9uIGV2ZXJ5IGZyYW1lIG9mIGFuIG9yYml0LiBPbmx5IHdvcnRoIGl0IHBhc3QgdGhlIHBvaW50IHdoZXJlXG4gICAgLy8gdGhlIGxpbmVhciBzY2FuIHN0b3BzIGJlaW5nIGZyZWU7IGJlbG93IHRoYXQgdGhlIGJ1aWxkIGNvc3RzIG1vcmUgdGhhbiBpdCBzYXZlcy5cbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICAgIGlmIChpczNkICYmIGJ1aWx0ICYmIHRoaXMuY2FudmFzICYmIGJ1aWx0Lmxlbmd0aCAvIDIgPj0gU0NSRUVOX0lOREVYX01JTl9QT0lOVFMpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgIGNvbnN0IGggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgICAgaWYgKHcgJiYgaCkge1xuICAgICAgICB0aGlzLmhvdmVySW5kZXggPSBuZXcgU2NyZWVuSW5kZXgoXG4gICAgICAgICAgeyBzY3JlZW46IGJ1aWx0LCBkZXB0aDogdGhpcy5zcGF0aWFsRGVwdGhzM2QgPz8gbmV3IEZsb2F0MzJBcnJheShidWlsdC5sZW5ndGggLyAyKSB9LFxuICAgICAgICAgIHcsXG4gICAgICAgICAgaCxcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYW55IHBpY2sgaGVyZSBjYW4gY2xhaW06IHRoZSBiYXNlIGhvdmVyIHJhZGl1cywgdGltZXMgdGhlXG4gICAgICAgICAgLy8gc2NhbGUgYSBTRUxFQ1RFRCBtYXJrZXIgaXMgZHJhd24gYXQuIFN0YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIHRoZSBkZWZhdWx0LFxuICAgICAgICAgIC8vIGJlY2F1c2UgaXQgaXMgd2hhdCBkZWNpZGVzIHdoZXRoZXIgYSBtYXJrZXIgc3RyYWRkbGluZyB0aGUgY2FudmFzIGVkZ2UgaXNcbiAgICAgICAgICAvLyBmb3VuZCDigJQgaXRzIGNlbnRyZSBpcyBvZmYgc2NyZWVuIHdoaWxlIHBhcnQgb2YgaXQgaXMgbm90LlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heFJlYWNoOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5IT1ZFUl9SQURJVVNfUFhcbiAgICAgICAgICAgICAgKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAyRCBtYXJrZXJzJyBXT1JMRCBwb3NpdGlvbnMsIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIE5hTiBmb3IgYW55IG5vdCBvblxuICAgKiB0aGUgZGlzcGxheWVkIHBsYW5lIOKAlCB0aGUgc2FtZSBhZmZpbmUgYW5kIHRoZSBzYW1lIHN1YnNldCB0aGUgbWFya2VyIGxheWVyIHdhc1xuICAgKiBidWlsdCBmcm9tLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgcG9pbnQgYXQgYSBjZWxsIHRoYXQgaXMgbm90IGRyYXduLlxuICAgKi9cbiAgcHJpdmF0ZSBob3ZlcldvcmxkUG9zaXRpb25zKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIWRhdGFzZXQgfHwgb2JzLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbGFiID0gdGhpcy5zcGF0aWFsU2xhYihkYXRhc2V0KTtcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBbc3gsIHN5XSA9IHJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICAgIGNvbnN0IFt0eCwgdHldID0gcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcyA/PyBudWxsO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50ICogMikuZmlsbChOYU4pO1xuICAgIGNvbnN0IG4gPSBkcmF3biA/IGRyYXduLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IG47IGsrKykge1xuICAgICAgY29uc3QgaSA9IGRyYXduID8gZHJhd25ba10gOiBrO1xuICAgICAgb3V0W2kgKiAyXSA9IG9icy54W2ldICogc3ggKyB0eDtcbiAgICAgIG91dFtpICogMiArIDFdID0gb2JzLnlbaV0gKiBzeSArIHR5O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRvb2x0aXAgc2F5cywgcmVzb2x2ZWQgb25jZSBwZXIgY29sb3VyIHNvdXJjZSByYXRoZXIgdGhhbiBwZXIgaG92ZXIuXG4gICAqXG4gICAqIEZldGNoZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBjb2xvdXJpbmcgb24gcHVycG9zZTogdGhlIHJlZmVyZW5jZSBwb3J0IGNhY2hlc1xuICAgKiBjb2x1bW5zLCBidXQgYSBob3N0J3MgbmVlZCBub3QsIGFuZCByZS1mZXRjaGluZyBhIDMuN00tZWxlbWVudCB2ZWN0b3IgYmVjYXVzZVxuICAgKiB0aGUgcG9pbnRlciBtb3ZlZCB3b3VsZCBiZSBpbmRlZmVuc2libGUgZWl0aGVyIHdheS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUhvdmVyU291cmNlKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICBjb25zdCBrZXkgPSBkYXRhc2V0ICYmIGNvbG9yQnlcbiAgICAgID8gYCR7ZGF0YXNldC5pZH18JHtjb2xvckJ5LmtpbmR9OiR7Y29sb3JCeS5uYW1lfWBcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmhvdmVyU291cmNlS2V5KSByZXR1cm47XG4gICAgLy8gVGhlIGtleSBpcyBjb21taXR0ZWQgb25seSB3aGVyZSBhIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gU2V0dGluZyBpdCB1cFxuICAgIC8vIGZyb250IHdvdWxkIG1lYW4gYSByZXNvbHV0aW9uIHRoYXQgbG9zZXMgdGhlIHJhY2UgbGVhdmVzIHRoZSBrZXkgY2xhaW1pbmcgYVxuICAgIC8vIHNvdXJjZSB0aGF0IHdhcyBuZXZlciBzdG9yZWQg4oCUIGFuZCBzaW5jZSBldmVyeSBsYXRlciBlbWlzc2lvbiBjYXJyaWVzIHRoZVxuICAgIC8vIHNhbWUga2V5LCBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IGhlcmUgZm9yZXZlciBhbmQgdGhlIHRvb2x0aXAgd291bGQgc3RheVxuICAgIC8vIHNpbGVudCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24uXG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMuaG92ZXJTb3VyY2VUb2tlbjtcbiAgICAvLyBObyBjb2xvdXIgc291cmNlIG1lYW5zIG5vdGhpbmcgaXMgYmVpbmcgc2FpZCBhYm91dCB0aGUgY2VsbHMsIHNvIHRoZXJlIGlzIG5vXG4gICAgLy8gY2x1c3RlciB0byBuYW1lIGFuZCB0aGUgdG9vbHRpcCBzdGF5cyBzaWxlbnQuXG4gICAgaWYgKCFrZXkgfHwgIWRhdGFzZXQgfHwgIWNvbG9yQnkgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbilcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCcsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBjb2x1bW4ubWV0YS5jYXRlZ29yaWVzLFxuICAgICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbHVtbi52YWx1ZXMsXG4gICAgICAgICAgICAuLi4oY29sdW1uLm1ldGEudW5pdCA/IHsgdW5pdDogY29sdW1uLm1ldGEudW5pdCB9IDoge30pLFxuICAgICAgICAgIH07XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSB7XG4gICAgICAgIGtpbmQ6ICdjb250aW51b3VzJyxcbiAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIC4uLihkYXRhc2V0LmZlYXR1cmVzPy51bml0ID8geyB1bml0OiBkYXRhc2V0LmZlYXR1cmVzLnVuaXQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIC8vIFRoZSB0b29sdGlwIGlzIGFuIGV4dHJhOyBhIGZhaWxlZCBmZXRjaCBtdXN0IG5vdCBkaXN0dXJiIHRoZSByZW5kZXIuIFRoZVxuICAgICAgLy8ga2V5IGlzIGxlZnQgdW5zZXQgc28gYSBsYXRlciBlbWlzc2lvbiByZXRyaWVzIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgYVxuICAgICAgLy8gcGVybWFuZW50IHNpbGVuY2UuXG4gICAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIHRvIGNhbnZhcyBwaXhlbHMgdW5kZXIgdGhlIGN1cnJlbnQgM0QgY2FtZXJhLlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpdHNlbGYgaXMgdGhlIHJlbmRlcmVyJ3M6IGB2aWV3ZXIucHJvamVjdFBvaW50c2Agb3ducyB0aGUgY2FtZXJhLCB0aGVcbiAgICogdmlld3BvcnQgaW4gQ1NTIHBpeGVscywgdGhlIHBlcnNwZWN0aXZlIGRpdmlkZSBhbmQgdGhlIHktZmxpcC4gVGhpcyB1c2VkIHRvIGJlIGZpZnRlZW5cbiAgICogbGluZXMgb2YgY29sdW1uLW1ham9yIG1hdHJpeCBhcml0aG1ldGljIGhlcmUsIGR1cGxpY2F0aW5nIGEgc2Vjb25kIGNvcHkgaW5cbiAgICogYG5hcGFyaS1heGVzLWxhYmVsc2Ag4oCUIGFuZCB0aGUgdHdvIGhhZCBkcmlmdGVkIG9uIHdoYXQgdG8gZG8gd2l0aCBhIE5hTiB3LlxuICAgKlxuICAgKiBXaGF0IGlzIGxlZnQgaXMgdGhlIHBhcnQgdGhhdCBpcyBnZW51aW5lbHkgdGhpcyBhZGFwdGVyJ3M6IFNDQVRURVJJTkcgdGhlIGRyYXduIHN1YnNldFxuICAgKiBiYWNrIGludG8gb2JzZXJ2YXRpb24gb3JkZXIuIFRoZSBjbG91ZCBob2xkcyBvbmx5IHRoZSBwb2ludHMgb2YgdGhlIGRpc3BsYXllZCBzZWN0aW9uLFxuICAgKiBpbiBpdHMgb3duIHBhY2tpbmc7IGV2ZXJ5IGNvbnN1bWVyIGluZGV4ZXMgYnkgb2JzZXJ2YXRpb24uIE5hTiBzdGFuZHMgZm9yIFwibm90IG9uXG4gICAqIHNjcmVlblwiLCB3aGljaCBpcyBhbHNvIHRoZSByaWdodCBhbnN3ZXIgZm9yIGFuIG9ic2VydmF0aW9uIHdob3NlIHNlY3Rpb24gaXMgaGlkZGVuLlxuICAgKlxuICAgKiBOdWxsIHdoZW4gdGhlIDNEIGNsb3VkIGlzIG5vdCBtb3VudGVkLCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gdGhlIDJEIGFmZmluZSBwYXRoLlxuICAgKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIgfHwgIXRoaXMuc3BhdGlhbFBvc2l0aW9uczNkKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHByb2plY3RlZCA9IHZpZXdlci5wcm9qZWN0UG9pbnRzKHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkLCB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QpO1xuICAgIGlmICghcHJvamVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICAvLyBSZXVzZWQgYWNyb3NzIGNhbWVyYSBjaGFuZ2VzOiBhdCAzLjdNIG9ic2VydmF0aW9ucyB0aGlzIGlzIGEgMzAgTUIgYWxsb2NhdGlvbiB0aGF0XG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIGhhcHBlbiBvbiBldmVyeSBvcmJpdC5cbiAgICB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QgPSBwcm9qZWN0ZWQ7XG5cbiAgICBjb25zdCBkcmF3biA9IHRoaXMuc3BhdGlhbERyYXduM2Q7XG4gICAgY29uc3QgeyBzY3JlZW4sIGRlcHRoIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgY29uc3QgZGVwdGhzID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpLmZpbGwoTmFOKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIGlmIChpID49IG9icy5jb3VudCkgY29udGludWU7XG4gICAgICBvdXRbaSAqIDJdID0gc2NyZWVuW2sgKiAyXTtcbiAgICAgIG91dFtpICogMiArIDFdID0gc2NyZWVuW2sgKiAyICsgMV07XG4gICAgICBkZXB0aHNbaV0gPSBkZXB0aFtrXTtcbiAgICB9XG4gICAgLy8gS2VwdCBiZXNpZGUgdGhlIHNjcmVlbiBwb3NpdGlvbnMgc28gdGhlIGhvdmVyIHBpY2sgY2FuIHByZWZlciB0aGUgRlJPTlQtbW9zdCBwb2ludFxuICAgIC8vIHVuZGVyIHRoZSBjdXJzb3IgcmF0aGVyIHRoYW4gdGhlIG9uZSBuZWFyZXN0IGl0cyBjZW50cmUg4oCUIHdoaWNoIGluIGEgZGVuc2UgY2xvdWQgaXNcbiAgICAvLyByZWd1bGFybHkgc29tZXRoaW5nIHRoZSByZW5kZXJlciBkcmV3IGFub3RoZXIgcG9pbnQgb3Zlci5cbiAgICB0aGlzLnNwYXRpYWxEZXB0aHMzZCA9IGRlcHRocztcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIG1hcmtlcnMgb24gYW55IGRhdGFzZXQgb3Igdmlldy1zdGF0ZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU3BhdGlhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNwYXRpYWxTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgaWYgKCFwb3J0KSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0aW9uJCA9IHRoaXMuc2VsZWN0aW9uU3RvcmU/LmdldFNlbGVjdGlvbiQoKSA/PyBvZihlbXB0eVNlbGVjdGlvbigpKTtcbiAgICAvLyBUaGUgZGlzcGxheSBjb2xvcm1hcCBpcyBhbiBpbnB1dCBoZXJlLCBub3QganVzdCBzb21ldGhpbmcgcmVhZCBhdCBidWlsZFxuICAgIC8vIHRpbWU6IGBjb250aW51b3VzQ29sb3JtYXA6IG51bGxgIG1lYW5zIFwiZm9sbG93IHRoZSBpbWFnZSdzIGNvbG9ybWFwXCIsIGFuZCBhXG4gICAgLy8gc2V0dGluZyB0aGF0IG9ubHkgdGFrZXMgZWZmZWN0IGF0IHRoZSBuZXh0IHVucmVsYXRlZCByZWJ1aWxkIGlzIG5vdCBvbmUuXG4gICAgdGhpcy5zcGF0aWFsU3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICBwb3J0LmdldERhdGFzZXQkKCksIHRoaXMuc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksIHNlbGVjdGlvbiQsXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgXSkuc3Vic2NyaWJlKChbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBjb2xvcm1hcCwgcmV2ZXJzZV0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSAhIXJldmVyc2U7XG4gICAgICAvLyBLZXB0IHNvIGEgc2xpY2UgY2hhbmdlIGNhbiByZWRyYXcgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUsIHdoaWNoXG4gICAgICAvLyBhcnJpdmVzIHRocm91Z2ggc2V0WkluZGV4IHJhdGhlciB0aGFuIHRocm91Z2ggYW55IG9mIHRoZXNlIHN0cmVhbXMuXG4gICAgICB0aGlzLnNwYXRpYWxMYXRlc3QgPSBbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uXTtcbiAgICAgIC8vIFRoZSBtYXJrZXJzIGFyZSBhYm91dCB0byBtb3ZlIG9yIGNoYW5nZSBtZWFuaW5nLCBzbyBib3RoIGhhbHZlcyBvZiB0aGVcbiAgICAgIC8vIHRvb2x0aXAg4oCUIHdoZXJlIHRoZSBwb2ludHMgYXJlLCBhbmQgd2hhdCB0aGV5IGFyZSDigJQgYXJlIHN0YWxlLlxuICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIHZvaWQgdGhpcy5yZXNvbHZlSG92ZXJTb3VyY2UoZGF0YXNldCwgdmlldyk7XG4gICAgICB2b2lkIChpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKVxuICAgICAgICA/IHRoaXMucmVidWlsZFNwYXRpYWxQb2ludHMzZChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50cyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pKTtcbiAgICAgIGlmICghaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXIgbGF5ZXIgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSBjb2xvdXJzIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmU6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZVxuICAgIC8vIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGUgZXhpc3RpbmcgbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGZhY2VDb2xvcjogUmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZysrO1xuICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICB0cnkge1xuICAgICAgZmFjZUNvbG9yID0gZGF0YXNldFxuICAgICAgICA/IGF3YWl0IHRoaXMuc3BhdGlhbEZhY2VDb2xvcnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKVxuICAgICAgICA6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICBmYWNlQ29sb3IgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZy0tO1xuICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgIH1cbiAgICAvLyBBIG5ld2VyIHJlYnVpbGQgKG9yIGEgdGVhcmRvd24pIHN0YXJ0ZWQgd2hpbGUgdGhlIHZlY3RvciB3YXMgaW4gZmxpZ2h0LlxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGlmICghZGF0YXNldCB8fCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cykge1xuICAgICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMpO1xuICAgICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgLy8gQSBkYXRhc2V0IHdob3NlIGltYWdlIElTIGl0cyB2b2x1bWUgc2hvd3MgT05FIFBMQU5FIGF0IGEgdGltZSwgc28gdGhlXG4gICAgLy8gbWFya2VycyBhcmUgdGhlIG9ic2VydmF0aW9ucyBpbiB0aGUgZGlzcGxheWVkIHBsYW5lLCBkcmF3biBpbiB0aGF0IHBsYW5lJ3NcbiAgICAvLyBwaXhlbCBncmlkLiBXaXRob3V0IHRoZSBmaWx0ZXIgdGhlIHNwZWNpbWVuJ3Mgd2hvbGUgZGVwdGggcGlsZXMgb250byBvbmVcbiAgICAvLyBzZWN0aW9uIGFuZCByZWFkcyBhcyBhIHNtZWFyOyB3aXRob3V0IHRoZSBhZmZpbmUgdGhlIGNvb3JkaW5hdGVzIGFyZSByZWFkXG4gICAgLy8gYXMgcGl4ZWxzIGFuZCBsYW5kIG9mZiB0aGUgc2xpY2UgZW50aXJlbHkuXG4gICAgY29uc3Qgc2xhYiA9IHRoaXMuc3BhdGlhbFNsYWIoZGF0YXNldCk7XG4gICAgLy8gVGhlIGdlbmUgbWFwIGdvZXMgVU5ERVIgdGhlIGNlbGxzLCBzbyBpdCBpcyBzZXR0bGVkIGJlZm9yZSB0aGV5IGFyZSBhZGRlZC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHNsYWIpO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBiYXNlID0gbWFya2VyRGlhbWV0ZXJzKG9icywgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9GQUxMQkFDS19SQURJVVMpO1xuICAgIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gICAgY29uc3QgZmxvb3IgPSBzbGFiPy5taW5EaWFtZXRlciA/PyAwO1xuICAgIGNvbnN0IHNpemVPZiA9IChpOiBudW1iZXIpID0+XG4gICAgICBNYXRoLm1heCh0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgPyBiYXNlIDogYmFzZVtpXSwgZmxvb3IpICogc2NhbGU7XG4gICAgY29uc3Qgc2l6ZTogbnVtYmVyIHwgRmxvYXQzMkFycmF5ID1cbiAgICAgIHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyAmJiAhc2xhYlxuICAgICAgICA/IE1hdGgubWF4KGJhc2UsIGZsb29yKSAqIHNjYWxlXG4gICAgICAgIDogRmxvYXQzMkFycmF5LmZyb20oc2xhYj8uaW5kaWNlcyA/PyB7IGxlbmd0aDogb2JzLmNvdW50IH0sIChfdiwgaSkgPT5cbiAgICAgICAgICAgIHNpemVPZihzbGFiID8gc2xhYi5pbmRpY2VzW2ldIDogaSkpO1xuXG4gICAgLy8gbmFwYXJpJ3MgaW1hZ2UgdmlldyBDTEVBUlMgdGhlIHdob2xlIGxheWVyIGxpc3Qgb24gZXZlcnkgcmVuZGVyLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGdvIHdpdGggaXQgd2hlbmV2ZXIgdGhlIGltYWdlIGlzIHJlLXJlbmRlcmVkIOKAlCBhIHNjcnViLCBhIGNvbnRyYXN0XG4gICAgLy8gY2hhbmdlLiBUaGUgY2FjaGVkIGhhbmRsZSBpcyB0aGVuIGRldGFjaGVkLCBhbmQgbXV0YXRpbmcgaXQgZHJhd3Mgbm90aGluZzpcbiAgICAvLyB0cmVhdCBhIGxheWVyIHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBzY2VuZSBhcyBhYnNlbnQgc28gaXQgZ2V0cyByZS1hZGRlZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzICYmICF2aWV3ZXIubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKHRoaXMuc3BhdGlhbFBvaW50cykpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQSBzaXplL2NvbG91ci9vcGFjaXR5L3NlbGVjdGlvbiBjaGFuZ2UgaXMgRElTUExBWS1vbmx5OiBtdXRhdGUgdGhlIGxheWVyXG4gICAgLy8gcmF0aGVyIHRoYW4gZHJvcHBpbmcgYW5kIHJlLWFkZGluZyBpdC4gQm90aCBzZXR0ZXJzIGJ1bXAgdGhlIGxheWVyJ3NcbiAgICAvLyBkYXRhVmVyc2lvbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyBuYXBhcmktanMgcmVidWlsZCB0aGUgaW5zdGFuY2UgYnVmZmVyIGFuZFxuICAgIC8vIHJlZHJhdyDigJQgYW5kIGl0IGF2b2lkcyByZWJ1aWxkaW5nIDg0ayBwb3NpdGlvbnMgdG8gY2hhbmdlIG9uZSBudW1iZXIuXG4gICAgLy8gVGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlIGtleTogYSBzY3J1YiBjaGFuZ2VzIFdISUNIIG9ic2VydmF0aW9ucyBhcmUgZHJhd24sXG4gICAgLy8gd2hpY2ggaXMgZ2VvbWV0cnksIG5vdCBkaXNwbGF5LlxuICAgIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NsYWI/LnNsaWNlID8/ICcnfWA7XG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cyAmJiBrZXkgPT09IHRoaXMuc3BhdGlhbExheWVyS2V5KSB7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMuc2l6ZSA9IHNpemU7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMudmlzaWJsZSA9IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cy5mYWNlQ29sb3IgPSB0aGlzLmdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIHNsYWI/LmluZGljZXMpIGFzIG5ldmVyO1xuICAgICAgdGhpcy5oaWRlRm9yZWlnbkltYWdlKHZpZXdlciwgKCEhcmVmIHx8ICEhZGF0YXNldC52b2x1bWUpICYmIHZpZXcuc2hvd0ltYWdlICE9PSBmYWxzZSk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5zZXRSZWdpb25zVmlzaWJsZSh2aWV3LnNob3dBbm5vdGF0aW9ucyAhPT0gZmFsc2UpO1xuICAgICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMpO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkcmF3biA9IHNsYWI/LmluZGljZXM7XG4gICAgY29uc3QgY291bnQgPSBkcmF3biA/IGRyYXduLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gZHJhd24gPyBkcmF3bltpXSA6IGk7XG4gICAgICBwb3NpdGlvbnNbaSAqIDJdID0gb2JzLnhbb107XG4gICAgICBwb3NpdGlvbnNbaSAqIDIgKyAxXSA9IG9icy55W29dO1xuICAgIH1cbiAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IGtleTtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICBzaXplLFxuICAgICAgZmFjZUNvbG9yOiB0aGlzLmdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIGRyYXduKSxcbiAgICAgIC8vIE5vIGJvcmRlcjogYXQgVmlzaXVtIHNwb3QgZGVuc2l0eSBhbiBvdXRsaW5lIHBlciBtYXJrZXIgcmVhZHMgYXMgbm9pc2UsXG4gICAgICAvLyBhbmQgaXQgY29zdHMgYSBzZWNvbmQgY29sb3VyIGFycmF5LlxuICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgICAvLyBUaGUgZGF0YXNldCdzIGRhdGEtPndvcmxkIGFmZmluZS4gU3BhdGlhbERhdGEgcmVjb3JkcyBvbmUgcGVyIGNvb3JkaW5hdGVcbiAgICAgIC8vIHN5c3RlbSAoVmlzaXVtIHNwb3QgY29vcmRzIGFyZSBpbiB0aGUgRlVMTC1yZXNvbHV0aW9uIGZyYW1lIHdoaWxlIHRoZVxuICAgICAgLy8gc2VydmVkIGltYWdlIG1heSBiZSB0aGUgaGlyZXMgZG93bnNjYWxlKSwgc28gd2l0aG91dCB0aGlzIHRoZSBtYXJrZXJzXG4gICAgICAvLyBsYW5kIGluIHRoZSByaWdodCBzaGFwZSBhdCB0aGUgd3Jvbmcgc2NhbGUuIERlZmF1bHRzIHRvIGlkZW50aXR5IHdoZW5cbiAgICAgIC8vIHRoZSBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSBpbiB0aGUgaW1hZ2UncyBwaXhlbCBzcGFjZS5cbiAgICAgIHNjYWxlOiByZWY/LnNjYWxlID8/IFsxLCAxXSxcbiAgICAgIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdLFxuICAgICAgdmlzaWJsZTogdGhpcy5zcGF0aWFsUG9pbnRzVmlzaWJsZSgpLFxuICAgIH0pO1xuICAgIC8vIE91dGxpbmVzLCBkZW5zaXR5IGFuZCB0cmFuc2NyaXB0cyBnbyBiYWNrIG92ZXIgdGhlIG1hcmtlcnMganVzdCBhZGRlZC5cbiAgICB0aGlzLnNwYXRpYWxUaWxlc01ncj8uYWZ0ZXJPYnNlcnZhdGlvbnMoKTtcbiAgICB0aGlzLmZyYW1lU3BhdGlhbFBvaW50c09uY2Uodmlld2VyLCBkYXRhc2V0LmlkLCBwb3NpdGlvbnMsICEhcmVmKTtcbiAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCAoISFyZWYgfHwgISFkYXRhc2V0LnZvbHVtZSkgJiYgdmlldy5zaG93SW1hZ2UgIT09IGZhbHNlKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMucmVnaW9uT3ZlcmxheTtcbiAgICBpZiAoIW92ZXJsYXk/LnNldFdvcmxkUXVhbnR1bSkgcmV0dXJuO1xuICAgIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8IGRhdGFzZXQudm9sdW1lKSB7XG4gICAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bShQSVhFTF9XT1JMRF9RVUFOVFVNKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTsgbGV0IG1heFggPSAtSW5maW5pdHk7IGxldCBtaW5ZID0gSW5maW5pdHk7IGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCB4ID0gcG9zaXRpb25zW2ldO1xuICAgICAgY29uc3QgeSA9IHBvc2l0aW9uc1tpICsgMV07XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSBjb250aW51ZTtcbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgfVxuICAgIG92ZXJsYXkuc2V0V29ybGRRdWFudHVtKHdvcmxkUXVhbnR1bUZvckV4dGVudChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmFtZSB0aGUgMkQgY2FtZXJhIG9uIHRoZSBvYnNlcnZhdGlvbnMsIGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UuXG4gICAqXG4gICAqIFRoZSAyRCBjYW1lcmEgaXMgbm9ybWFsbHkgZml0dGVkIHRvIHRoZSBJTUFHRSwgYmVjYXVzZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpbiB0aGF0XG4gICAqIGltYWdlJ3MgcGl4ZWwgc3BhY2UgYW5kIGZyYW1pbmcgdGhlIGltYWdlIGZyYW1lcyB0aGVtIHRvby4gQSBkYXRhc2V0IHdpdGggbm9cbiAgICogcmVmZXJlbmNlIGltYWdlIGhhcyBjb29yZGluYXRlcyBpbiBpdHMgb3duIHVuaXRzIGluc3RlYWQg4oCUIHNlcUZJU0gncyBzcGFuIGFib3V0XG4gICAqIDV4NyDigJQgc28gdGhlIGltYWdlIGZyYW1pbmcgbGVmdCBvdmVyIGZyb20gd2hhdGV2ZXIgd2FzIG9uIHNjcmVlbiBiZWZvcmUgcHV0cyB0aGVcbiAgICogd2hvbGUgY2xvdWQgb2Zmc2NyZWVuOiBtZWFzdXJlZCBhdCA5LjcgeCAxMy40IFBJWEVMUywgY2VudHJlZCAyNTZweCBmcm9tIHdoZXJlIHRoZVxuICAgKiBjYW1lcmEgd2FzIGxvb2tpbmcuIFRoZSBwb2ludHMgYXJlIGFsbCB0aGVyZSBhbmQgZHJhd247IHRoZXkgYXJlIGEgc3BlY2suIFdoaWNoXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSB0aGUgZGF0YXNldCBoYXZpbmcgZmFpbGVkIHRvIGxvYWQuXG4gICAqXG4gICAqIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZyxcbiAgICogc2xpY2luZyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmVcbiAgICogdGhlIGNhbWVyYSB1bmRlciB0aGUgdXNlciDigJQgdGhlIGNhbWVyYSB0b29scyBhbmQgdGhlIGNhbnZhcyBkcmFnIGFyZSBtZWFudCB0byBiZVxuICAgKiB0aGUgb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICovXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpbWFnZSBsYXllciBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlIG9mIGl0cyBvd24uXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgdmlld2VyIGtlZXBzIHdoYXRldmVyIGltYWdlIHdhcyBsYXN0IGxvYWRlZCwgYW5kIGZvciBhIGRhdGFzZXQgdGhhdFxuICAgKiByZWdpc3RlcnMgb250byBub25lIHRoYXQgcGljdHVyZSBiZWxvbmdzIHRvIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5IOKAlCB0aGUgZXhhbXBsZSdzXG4gICAqIGRlZmF1bHQgc2xpZGUsIHNheS4gSXQgaXMgbm90IG1lcmVseSBpcnJlbGV2YW50OiB0aGUgdHdvIGxpdmUgaW4gZGlmZmVyZW50IGNvb3JkaW5hdGVcbiAgICogc3BhY2VzIChpbWFnZSBwaXhlbHMgYWdhaW5zdCB0aGUgZW1iZWRkaW5nJ3Mgb3duIHVuaXRzKSwgc28gdGhlIGxlZnRvdmVyIGlzIG1hZ25pZmllZFxuICAgKiByb3VnaGx5IGEgaHVuZHJlZGZvbGQuIEF0IHRoZSBmaXR0ZWQgem9vbSB0aGUgY2FtZXJhIHNpdHMgaW5zaWRlIGl0cyBjb3JuZXIsIHdoZXJlIGl0XG4gICAqIHJlYWRzIGFzIGJsYW5rIGJhY2tncm91bmQsIGFuZCBpdCBhcHBlYXJzIG9ubHkgb25jZSB5b3Ugem9vbSBvdXQgZmFyIGVub3VnaCB0byBmaW5kXG4gICAqIGl0IOKAlCB3aGljaCBpcyBleGFjdGx5IGhvdyBpdCBnZXRzIG5vdGljZWQuXG4gICAqXG4gICAqIEhpZGRlbiByYXRoZXIgdGhhbiByZW1vdmVkLCBhbmQgaGlkZGVuIEhFUkUgcmF0aGVyIHRoYW4gYnkgY2xlYXJpbmcgdGhlIGhvc3QncyBpbWFnZVxuICAgKiBzdGF0ZTogdGhhdCBzdGF0ZSBkcml2ZXMgdGhlIHdob2xlIHJlbmRlciBwaXBlbGluZSwgaW5jbHVkaW5nIGEgUGxvdGx5IGJhY2tlbmQgd2hvc2VcbiAgICogZmllbGRzIGFyZSBkZWNsYXJlZCB3aXRoIGRlZmluaXRlLWFzc2lnbm1lbnQgYXNzZXJ0aW9ucywgc28gZW1wdHlpbmcgaXQgdGhyb3dzIGZyb21cbiAgICogd2hpY2hldmVyIGZpZWxkIHRoZSBuZXh0IHBhdGggaGFwcGVucyB0byByZWFkLiBUaGlzIHRvdWNoZXMgb25lIGxheWVyJ3MgdmlzaWJpbGl0eVxuICAgKiBhbmQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlRm9yZWlnbkltYWdlKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1hZ2Ugb2YgaXRzIG93biDihpIgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdyBlaXRoZXIuXG4gICAgdGhpcy5uYXZpZ2F0b3I/LnNldFZpc2libGUoZGF0YXNldEhhc1BpeGVscyAmJiB0aGlzLm5hdmlnYXRvclZpc2libGUpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygdmlld2VyLmxheWVycy5pdGVtcykge1xuICAgICAgaWYgKGxheWVyLmtpbmQgIT09ICdpbWFnZScpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIHRyYW5zY3JpcHQtZGVuc2l0eSByYXN0ZXIgaXMgYW4gaW1hZ2UgbGF5ZXIgdG9vLCBidXQgaXQgaXMgZGF0YSwgbm90IHRoZVxuICAgICAgLy8gdGlzc3VlOiB0aGUgSW1hZ2VzIHRvZ2dsZSBtdXN0IG5vdCB0YWtlIGl0IGRvd24gd2l0aCB0aGUgc2xpZGUuXG4gICAgICBpZiAodGhpcy5zcGF0aWFsVGlsZXNNZ3I/Lm93bnMobGF5ZXIpKSBjb250aW51ZTtcbiAgICAgIC8vIFJlLXNob3duIHdoZW4gYSBkYXRhc2V0IHRoYXQgb3ducyBhbiBpbWFnZSBjb21lcyBiYWNrLCBzbyBzd2l0Y2hpbmcgYmV0d2VlblxuICAgICAgLy8gZGF0YXNldHMgZG9lcyBub3QgbGVhdmUgdGhlIHRpc3N1ZSBwZXJtYW5lbnRseSBoaWRkZW4uXG4gICAgICBsYXllci52aXNpYmxlID0gZGF0YXNldEhhc1BpeGVscztcbiAgICB9XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZnJhbWVTcGF0aWFsUG9pbnRzT25jZShcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldElkOiBzdHJpbmcsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LCByZWdpc3RlcmVkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICAvLyBHYXRlZCBvbiB3aGV0aGVyIFRISVMgZGF0YXNldCByZWdpc3RlcnMgb250byBhbiBpbWFnZSwgbm90IG9uIGBpbWFnZVdgL2BpbWFnZUhgOlxuICAgIC8vIHRob3NlIGtlZXAgdGhlIGxhc3QgcGxvdHRlZCBpbWFnZSdzIGRpbWVuc2lvbnMgYWZ0ZXIgdGhlIGhvc3QgY2xlYXJzIGl0LCBzbyBhXG4gICAgLy8gc3RhbGUgNTEyeDM4MyByZWFkIGFzIFwidGhlcmUgaXMgYW4gaW1hZ2VcIiBhbmQgc2tpcHBlZCB0aGUgZnJhbWluZyBlbnRpcmVseS5cbiAgICBpZiAocmVnaXN0ZXJlZCkgcmV0dXJuO1xuICAgIC8vIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZywgc2xpY2luZ1xuICAgIC8vIG9yIHBpY2tpbmcgYSBnZW5lIHJlLWFkZHMgdGhpcyBsYXllciwgYW5kIHJlLWZyYW1pbmcgb24gdGhvc2Ugd291bGQgbW92ZSB0aGVcbiAgICAvLyBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmUgdGhlXG4gICAgLy8gb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICBpZiAodGhpcy5zcGF0aWFsMmRGcmFtZWQ/LnZpZXdlciA9PT0gdmlld2VyXG4gICAgICAmJiB0aGlzLnNwYXRpYWwyZEZyYW1lZC5kYXRhc2V0SWQgPT09IGRhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZml0ID0gZnJhbWVQb3NpdGlvbnMoXG4gICAgICBwb3NpdGlvbnMsIHRoaXMuY2FudmFzPy5jbGllbnRXaWR0aCA/PyAwLCB0aGlzLmNhbnZhcz8uY2xpZW50SGVpZ2h0ID8/IDAsXG4gICAgKTtcbiAgICAvLyBOdWxsIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJhbWUgb247IGxlYXZlIHRoZSBjYW1lcmEgd2hlcmUgaXQgaXMgcmF0aGVyXG4gICAgLy8gdGhhbiBtb3ZpbmcgdGhlIHZpZXcgZm9yIGEgZGF0YXNldCB3ZSBjYW5ub3QgZml0LlxuICAgIGlmICghZml0KSByZXR1cm47XG4gICAgdmlld2VyLmNhbWVyYS5zZXQoZml0LmNlbnRlciwgZml0Lnpvb20gPz8gdmlld2VyLmNhbWVyYS56b29tKTtcbiAgICB0aGlzLnNwYXRpYWwyZEZyYW1lZCA9IHsgdmlld2VyLCBkYXRhc2V0SWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKipnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIGFzIGEgY29udGludW91cyBmaWVsZCBkcmF3biB1bmRlclxuICAgKiB0aGUgY2VsbHMuXG4gICAqXG4gICAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgc2F5cyB3aGljaCBjZWxscyBleHByZXNzIGl0OyBpdCBjYW5ub3Qgc2F5IHdoZXJlLFxuICAgKiBiZWNhdXNlIHRoZSBleWUgd2lsbCBub3QgaW50ZWdyYXRlIHRob3VzYW5kcyBvZiBkb3RzIGludG8gYSB0ZXJyaXRvcnkuIFRoZSBmaWVsZFxuICAgKiBpcyBhIGtlcm5lbC13ZWlnaHRlZCBNRUFOIHBlciBjZWxsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApLCBzbyBhIGRlbnNlXG4gICAqIHJlZ2lvbiBkb2VzIG5vdCBnbG93IG1lcmVseSBmb3IgYmVpbmcgZGVuc2UsIGFuZCBpdCBpcyB0cmFuc3BhcmVudCB3aGVyZXZlciBub1xuICAgKiBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW4gdW5zYW1wbGVkIGdhcCBtdXN0IG5vdCByZWFkIGFzIFwibm90IGV4cHJlc3NlZFwiLlxuICAgKlxuICAgKiBJdCBzaGFyZXMgdGhlIHBvaW50cycgTFVULCBwZXJjZW50aWxlIHdpbmRvdyBhbmQgbG9nIGZsYWcsIHNvIHRoZSBsYXllciB1bmRlclxuICAgKiB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyB0aGVtc2VsdmVzIGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIERJU1BMQVlFRCBpbWFnZSdzIHBpeGVsIGdyaWQsIGNvYXJzZW5lZCBzbyB0aGUgbG9uZyBzaWRlIGlzIGF0XG4gICAqIG1vc3Qge0BsaW5rIEdFTkVfTUFQX01BWF9TSURFfTogYSBzbW9vdGggZmllbGQgZ2FpbnMgbm90aGluZyBmcm9tIGEgc2xpZGUncyBmdWxsXG4gICAqIHJlc29sdXRpb24uIEZvciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGF0IGdyaWQgaXMgdGhlIGN1cnJlbnQgc2xpY2UsIGFuZCBvbmx5XG4gICAqIHRoYXQgcGxhbmUncyBvYnNlcnZhdGlvbnMgYXJlIGluY2x1ZGVkIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBtYXJrZXJzIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBzbGFiOiB7IHJlZjogU3BhdGlhbEltYWdlUmVmOyBpbmRpY2VzOiBVaW50MzJBcnJheTsgc2xpY2U6IG51bWJlciB9IHwgbnVsbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2VuZSA9IHZpZXcuZ2VuZU1hcCAmJiB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdmZWF0dXJlJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgPiAwID8gdmlldy5nZW5lTWFwU21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG5cbiAgICAvLyBUd28gY2xvY2tzOiB0aGUgRklFTEQgZGVwZW5kcyBvbiB0aGUgZ2VuZSwgdGhlIHBsYW5lIGFuZCB0aGUgYmFuZHdpZHRoLCB3aGlsZVxuICAgIC8vIHRoZSBjb2xvdXJzIGRlcGVuZCBvbiB0aGUgd2luZG93LCB0aGUgbG9nIGZsYWcgYW5kIHRoZSBvcGFjaXR5LiBSZWNvbG91cmluZyBhXG4gICAgLy8gY2FjaGVkIGZpZWxkIGlzIGEgZnJhY3Rpb24gb2YgZXN0aW1hdGluZyBvbmUuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtkYXRhc2V0LmlkLCBnZW5lLCBzbGFiPy5zbGljZSA/PyAnJywgc21vb3RoaW5nLCB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgIGZpZWxkS2V5LCBjbGlwLmpvaW4oJywnKSwgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsIHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgIHRoaXMuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICAvLyBBTlkgY2hhbmdlIGhlcmUgY2hhbmdlcyB0aGUgb3JkZXIgdGhlIGNlbGxzIGhhdmUgdG8gc2l0IGFib3ZlIOKAlCBpbmNsdWRpbmcgdGhlXG4gICAgLy8gZmlyc3Qgb25lLCB3aGVyZSB0aGVyZSBpcyBubyBwcmV2aW91cyBsYXllciB0byByZW1vdmUg4oCUIGFuZCB0aGUgbGF5ZXIgbGlzdCBpc1xuICAgIC8vIGFwcGVuZC1vbmx5LiBTbyBkcm9wIHRoZSBtYXJrZXJzIHVuY29uZGl0aW9uYWxseSBhbmQgbGV0IHRoZSByZWJ1aWxkIGJlbG93IHB1dFxuICAgIC8vIHRoZW0gYmFjayBvbiB0b3A7IG90aGVyd2lzZSB0aGUgZmllbGQgaXMgYXBwZW5kZWQgb3ZlciB0aGUgbWVhc3VyZW1lbnQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cykge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzKTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcEtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGQgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGRLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSByYXN0ZXIgY292ZXJzIHRoZSBkaXNwbGF5ZWQgaW1hZ2U7IHdpdGhvdXQgb25lIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAvLyBvdmVybGF5IGFuZCB0aGUgY2xvdWQgaXMgdGhlIDNEIG1vZGUncyBidXNpbmVzcywgbm90IHRoaXMgb25lJ3MuXG4gICAgY29uc3QgaW1hZ2VXID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS53aWR0aCA6IHRoaXMuaW1hZ2VXO1xuICAgIGNvbnN0IGltYWdlSCA9IHNsYWIgPyBkYXRhc2V0LnZvbHVtZSEuaGVpZ2h0IDogdGhpcy5pbWFnZUg7XG4gICAgaWYgKCFpbWFnZVcgfHwgIWltYWdlSCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLm1heChcbiAgICAgIDEsXG4gICAgICBNYXRoLmNlaWwoTWF0aC5tYXgoaW1hZ2VXLCBpbWFnZUgpIC8gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfTUFYX1NJREUpLFxuICAgICk7XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IHRoaXMuZ2VuZU1hcEZpZWxkS2V5KSB7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZCA9IGV4cHJlc3Npb25GaWVsZChkYXRhc2V0Lm9ic2VydmF0aW9ucywge1xuICAgICAgICByZWY6IHNsYWI/LnJlZiA/PyBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgICB3aWR0aDogTWF0aC5jZWlsKGltYWdlVyAvIHN0ZXApLFxuICAgICAgICBoZWlnaHQ6IE1hdGguY2VpbChpbWFnZUggLyBzdGVwKSxcbiAgICAgICAgc3RlcCxcbiAgICAgICAgc2lnbWE6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIC8vIEEgcGxhbmUgd2lucyBvdmVyIGEgc2VsZWN0aW9uOiB0aGUgMkQgdmlldyBpcyBzaG93aW5nIG9uZSBzZWN0aW9uLCBzbyBhXG4gICAgICAgIC8vIGZpZWxkIHNwYW5uaW5nIHRoZSBzcGVjaW1lbidzIGRlcHRoIHdvdWxkIG5vdCBiZSB0aGUgdGhpbmcgb24gc2NyZWVuLlxuICAgICAgICBpbmRpY2VzOiBzbGFiPy5pbmRpY2VzID8/IGluU2VsZWN0aW9uLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZEtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2VuZU1hcEZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgY29uc3QgW2xvLCBoaV0gPSBjb250cmFzdFdpbmRvdyhmaWVsZC5tZWFuLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JFeHByZXNzaW9uRmllbGQoZmllbGQsIGx1dCwgW2xvLCBoaV0sIHtcbiAgICAgIGxvZzogdmlldy5sb2dTY2FsZSxcbiAgICAgIC8vIFRoZSBNQVAncyBvd24gb3BhY2l0eTogcmVhZGluZyBhIGZpZWxkIHVuZGVyIHRoZSBjZWxscyBtZWFucyB0dXJuaW5nIHRoZVxuICAgICAgLy8gY2VsbHMgZG93biwgd2hpY2ggbXVzdCBub3QgdGFrZSB0aGUgZmllbGQgd2l0aCB0aGVtLlxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICB9KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGZpZWxkLndpZHRoLCBoZWlnaHQ6IGZpZWxkLmhlaWdodCwgY2hhbm5lbHM6IDQsIGR0eXBlOiAndWludDgnLCBkYXRhOiByZ2JhIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9YCxcbiAgICAgICAgc2NhbGU6IFtzdGVwLCBzdGVwXSxcbiAgICAgICAgdHJhbnNsYXRlOiBbMCwgMF0sXG4gICAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgfSxcbiAgICApO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYW5lIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IGlzIGN1cnJlbnRseSBzaG93aW5nOiBpdHMgcGl4ZWwgYWZmaW5lLCB0aGVcbiAgICogb2JzZXJ2YXRpb25zIHRoYXQgZmFsbCBpbiBpdCwgYW5kIHRoZSBtYXJrZXIgZmxvb3IgdGhhdCBncmlkIG5lZWRzLlxuICAgKlxuICAgKiBOdWxsIGZvciBhIGRhdGFzZXQgd2l0aCBhIHJlYWwgYGltYWdlUmVmYCAoaXRzIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IHRoZVxuICAgKiBpbWFnZSdzIHBpeGVscyBhbmQgZXZlcnkgb2JzZXJ2YXRpb24gYmVsb25ncyB0byB0aGUgb25lIHNlY3Rpb24pIGFuZCBmb3Igb25lXG4gICAqIHdpdGggbm8gdm9sdW1lIGF0IGFsbCDigJQgYm90aCBvZiB3aGljaCBkcmF3IGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2xhYihkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCk6IHtcbiAgICByZWY6IFNwYXRpYWxJbWFnZVJlZjsgaW5kaWNlczogVWludDMyQXJyYXk7IHNsaWNlOiBudW1iZXI7IG1pbkRpYW1ldGVyOiBudW1iZXI7XG4gIH0gfCBudWxsIHtcbiAgICBjb25zdCB2b2x1bWUgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCAhdm9sdW1lKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbGljZSA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZjogdm9sdW1lSW1hZ2VSZWYodm9sdW1lLCBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0KSxcbiAgICAgIGluZGljZXM6IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgc2xpY2UpLFxuICAgICAgc2xpY2UsXG4gICAgICBtaW5EaWFtZXRlcjogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggKiB2b2x1bWUudm94ZWxTaXplWzBdLFxuICAgIH07XG4gIH1cblxuICAvKiogUGVyLXBvaW50IGNvbG91cnMgZm9yIHRoZSBkcmF3biBzdWJzZXQuIEEgYnJvYWRjYXN0IHR1cGxlIHN0YXlzIGJyb2FkY2FzdCDigJRcbiAgICogIGl0IGlzIG9uZSBjb2xvdXIgZm9yIGV2ZXJ5IHBvaW50IGVpdGhlciB3YXkuICovXG4gIHByaXZhdGUgZ2F0aGVyQ29sb3JzPFQ+KGNvbG9yczogVFtdIHwgVCwgaW5kaWNlcz86IFVpbnQzMkFycmF5KTogVFtdIHwgVCB7XG4gICAgaWYgKCFpbmRpY2VzIHx8ICFBcnJheS5pc0FycmF5KGNvbG9ycykpIHJldHVybiBjb2xvcnM7XG4gICAgY29uc3Qgb3V0OiBUW10gPSBuZXcgQXJyYXkoaW5kaWNlcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gY29sb3JzW2luZGljZXNbaV1dO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVkcmF3IHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzIG92ZXIgYSBmcmVzaGx5IHJlbmRlcmVkIGltYWdlLlxuICAgKlxuICAgKiBUd28gcmVhc29ucywgYm90aCBpbnZpc2libGUgZnJvbSB0aGUgc3BhdGlhbCBzdG9yZSDigJQgd2hpY2ggaXMgd2h5IGEgc2NydWIgb3IgYVxuICAgKiByZS1yZW5kZXIgbmV2ZXIgcmVhY2hlZCB0aGUgbWFya2VycyBvbiBpdHMgb3duOlxuICAgKiAgLSB0aGUgaW1hZ2UgcmVuZGVyIENMRUFSUyB0aGUgbGF5ZXIgbGlzdCwgdGFraW5nIHRoZSBtYXJrZXJzIHdpdGggaXQ7XG4gICAqICAtIG92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhlIGRpc3BsYXllZCBwbGFuZSBkZWNpZGVzIHdoaWNoXG4gICAqICAgIG9ic2VydmF0aW9ucyBiZWxvbmcgb24gc2NyZWVuIGF0IGFsbCwgc28gdGhlIGNlbGxzIGhhdmUgdG8gbW92ZSB3aXRoIHRoZVxuICAgKiAgICBzZWN0aW9uIHJhdGhlciB0aGFuIGhhbmcgb3ZlciBhIGRpZmZlcmVudCBvbmUuXG4gICAqXG4gICAqIFVzZXMgdGhlIGxhdGVzdCB2YWx1ZXMgdGhlIG1hcmtlciBzdWJzY3JpcHRpb24gc2F3OyBhIG5vLW9wIHVudGlsIGl0IGhhcyBzZWVuXG4gICAqIGFueSwgaW4gdGhlIDNEIGNsb3VkIChubyBpbWFnZSwgbm8gcGxhbmUpLCBhbmQgd2l0aCBubyBkYXRhc2V0IHRvIGRyYXcuXG4gICAqL1xuICBwcml2YXRlIHJlZHJhd1NwYXRpYWxNYXJrZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhdGVzdCA9IHRoaXMuc3BhdGlhbExhdGVzdDtcbiAgICBpZiAoIWxhdGVzdD8uWzBdIHx8IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLnJlYnVpbGRTcGF0aWFsUG9pbnRzKC4uLmxhdGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIFNQQVRJQUxfT01JQ1NfM0Qgdmlldzogb2JzZXJ2YXRpb25zIGFzIGEgM0QgcG9pbnQgY2xvdWQgdW5kZXIgdGhlIG9yYml0IGNhbWVyYS5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IG11Y2ggdGhpbm5lciB0aGFuIHRoZSAyRCBtb3VudC4gVGhlcmUgaXMgbm8gdGlzc3VlIGltYWdlIHRvIHJlbmRlciAoYSByZWdpc3RlcmVkXG4gICAqIHZvbHVtZSBsaWtlIHRoZSBBbGxlbiBDQ0YgaGFzIG5vIHNpbmdsZSByZWZlcmVuY2UgcGxhbmUpLCBzbyBubyBzY2FsZSBiYXIsIG5vIHJlYWRiYWNrLCBhbmQgbm9cbiAgICogMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHRoZSByZWdpb24gdG9vbHMgZHJhdyBpbiBzY3JlZW4gc3BhY2UgYW5kIGhhdmUgbm8gbWVhbmluZyBhZ2FpbnN0IGFuXG4gICAqIG9yYml0aW5nIGNhbWVyYSwgd2hpY2ggaXMgd2h5IGBTZWxlY3QgZnJvbSBST0lzYCBpcyBoaWRkZW4gaW4gdGhpcyBtb2RlLiBgYWRkUG9pbnRzM0RgIHB1dHNcbiAgICogdGhlIHZpZXdlciBpbiAzRCBhbmQgZnJhbWVzIHRoZSBjYW1lcmEgb24gdGhlIGNsb3VkIGl0c2VsZi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTcGF0aWFsT21pY3MzZCh2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmluc3RhbGwzZEludGVyYWN0aW9uKHZpZXdlciwgaG9zdCk7XG4gICAgdGhpcy5pbnN0YWxsU3BhdGlhbEhvdmVyKGhvc3QpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIGJhciBmb3IgdGhlIDNEIGNsb3VkLCBtZWFzdXJlZCBhdCB0aGUgT1JCSVQgUElWT1QuXG4gICAqXG4gICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGhhcyBubyBzaW5nbGUgc2NhbGUg4oCUIHRoaW5ncyBmYXJ0aGVyIGF3YXkgYXJlIHNtYWxsZXIg4oCUIHNvIGEgYmFyIGNhblxuICAgKiBvbmx5IGJlIHRydWUgYXQgb25lIGRlcHRoLiBUaGUgcGl2b3QgaXMgdGhlIGhvbmVzdCBjaG9pY2U6IGl0IGlzIHdoYXQgdGhlIGNhbWVyYSBpcyBmcmFtaW5nLFxuICAgKiB3aGF0IGEgem9vbSBtb3ZlcyB0b3dhcmRzLCBhbmQgd2hlcmUgdGhlIGV5ZSBpcyBhbnl3YXkuIG5hcGFyaSdzIG93biAzRCBzY2FsZSBiYXIgd29ya3MgdGhlXG4gICAqIHNhbWUgd2F5LlxuICAgKlxuICAgKiBgTmFwYXJpU2NhbGVCYXJgIG5lZWRzIENTUyBweCBwZXIgd29ybGQgdW5pdCwgd2hpY2ggYW4gb3JiaXQgY2FtZXJhIGRvZXMgbm90IGV4cG9zZSwgYnV0IGF0XG4gICAqIHRoZSBwaXZvdCBpdCBpcyBleGFjdGx5IGB2aWV3cG9ydEhlaWdodCAvICgyICogZGlzdGFuY2UgKiB0YW4oZm92IC8gMikpYCDigJQgdGhlIHNhbWVcbiAgICogcmVsYXRpb25zaGlwIGBDYW1lcmEzRC5wYW5gIHVzZXMgdG8gdHJhY2sgdGhlIGN1cnNvci4gVGhlIGJhciB0aGVuIGNvbnZlcnRzIHRocm91Z2hcbiAgICogYG1pY3JvbnNQZXJVbml0YCwgYW5kIGRyYXdzIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIGRhdGFzZXQgZG9lcyBub3QgZGVjbGFyZSBvbmUsIGJlY2F1c2UgYVxuICAgKiBiYXIgbGFiZWxsZWQgaW4gbWljcm9ucyBvdmVyIHVua25vd24gdW5pdHMgd291bGQgcmVhZCBhcyBhIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3BhdGlhbDNkU2NhbGVCYXIodmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2NhbGVCYXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbnVsbDtcbiAgICB0aGlzLm5hdmlnYXRvcj8uZGVzdHJveSgpO1xuICAgIHRoaXMubmF2aWdhdG9yID0gbnVsbDtcbiAgICBjb25zdCBtaWNyb25zUGVyVW5pdCA9IGRhdGFzZXQ/Lm1pY3JvbnNQZXJVbml0O1xuICAgIGlmICghdGhpcy5ob3N0IHx8ICFtaWNyb25zUGVyVW5pdCB8fCBtaWNyb25zUGVyVW5pdCA8PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICBjb25zdCBjYW0gPSB2aWV3ZXIuY2FtZXJhM2Q7XG4gICAgY29uc3Qgc2hpbTogU2NhbGVCYXJDYW1lcmEgPSB7XG4gICAgICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBoID0gY2FudmFzPy5jbGllbnRIZWlnaHQgfHwgY2FudmFzPy5oZWlnaHQgfHwgMDtcbiAgICAgICAgY29uc3Qgd29ybGRQZXJQeCA9ICgyICogY2FtLmRpc3RhbmNlICogTWF0aC50YW4oY2FtLmZvdiAvIDIpKSAvIChoIHx8IDEpO1xuICAgICAgICByZXR1cm4gd29ybGRQZXJQeCA+IDAgPyAxIC8gd29ybGRQZXJQeCA6IDA7XG4gICAgICB9LFxuICAgICAgY2hhbmdlZDogY2FtLmNoYW5nZWQsXG4gICAgfTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE5hcGFyaVNjYWxlQmFyKHRoaXMuaG9zdCwgc2hpbSwgbWljcm9uc1BlclVuaXQpO1xuICB9XG5cbiAgLyoqIEJhc2UgbWFya2VyIGRpYW1ldGVyIGZvciB0aGUgM0QgY2xvdWQsIGluIFNDUkVFTiBwaXhlbHMgKHRoZSBsYXllcidzIHVuaXQpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMXzNEX0JBU0VfU0laRSA9IDM7XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgM0QgcG9pbnQgY2xvdWQgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzM2QoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW47XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2FsYXIgZW5jb2RpbmcgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZSwgZm9yIHRoZSBzYW1lIHJlYXNvblxuICAgIC8vIHRoZSAyRCBwYXRoIGRvZXM6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZSBzdXBlcnNlZGVkLCBhbmQgZHJvcHBpbmcgdGhlXG4gICAgLy8gbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoZGF0YXNldCkge1xuICAgICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nKys7XG4gICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICB0cnkge1xuICAgICAgICBlbmMgPSBhd2FpdCB0aGlzLnNwYXRpYWxTY2FsYXIzZChkYXRhc2V0LCB2aWV3KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHNwYXRpYWwgM0QgY29sb3VyaW5nIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIGEgZmxhdCBjb2xvdXInLCBlcnIpO1xuICAgICAgICBlbmMgPSBudWxsO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nLS07XG4gICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2JzID0gZGF0YXNldD8ub2JzZXJ2YXRpb25zO1xuICAgIC8vIE5vIHogbWVhbnMgbm90aGluZyB0byBkcmF3IGluIDNELiBUaGUgcGxvdCB0eXBlIGlzIGdhdGVkIG9uIGByZXF1aXJlc1NwYXRpYWwzZGBcbiAgICAvLyBzbyB0aGlzIHNob3VsZCBiZSB1bnJlYWNoYWJsZSBmcm9tIHRoZSBVSSwgYnV0IGEgaG9zdCBjYW4gc2V0IHRoZSB0eXBlIGRpcmVjdGx5LlxuICAgIGlmICghZGF0YXNldCB8fCAhb2JzIHx8IG9icy5jb3VudCA9PT0gMCB8fCAhb2JzLnopIHtcbiAgICAgIHRoaXMucmVtb3ZlU3BhdGlhbDNkTGF5ZXJzKHZpZXdlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQW5hdG9teSBmaXJzdDogb24gYSBzY2VuZSdzIEZJUlNUIGxheWVyIG5hcGFyaSBmcmFtZXMgdGhlIG9yYml0IGNhbWVyYSwgYW5kXG4gICAgLy8gdGhlIHJlZmVyZW5jZSB2b2x1bWUgaXMgdGhlIGZyYW1pbmcgd2Ugd2FudCDigJQgdGhlIGJyYWluLCBub3QgdGhlIG91dGVybW9zdFxuICAgIC8vIHN0cmF5IHNlZ21lbnRhdGlvbi4gRXZlcnkgbGF0ZXIgYWRkIGtlZXBzIHRoZSBwb3NlIGluc3RlYWQgKG5hcGFyaS1qcyBgZml0M2Q6ICdvbmNlJ2ApLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3BhdGlhbFZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBjbHVzdGVyIGRlbnNpdHkgdm9sdW1lcywgd2hpY2ggY2FuIHNldCB0aGUgY2VudHJpbmcgb2Zmc2V0IHdoZW5cbiAgICAvLyB0aGVyZSBpcyBubyByZWZlcmVuY2Ugdm9sdW1lIOKAlCBzbyBiZWZvcmUgYW55IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20gaXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEZW5zaXR5Vm9sdW1lcyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIC8vIFRoZW4gdGhlIGdlbmUgbWFwLCB3aGljaCBzaGFyZXMgdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBsYXR0aWNlIOKAlCBzbyBpdCBnb2VzXG4gICAgLy8gYWZ0ZXIgYW55dGhpbmcgdGhhdCBjYW4gc3RpbGwgbW92ZSB0aGUgY2VudHJpbmcgb2Zmc2V0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlR2VuZU1hcFZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIC8vIFNjYWxlIGRlcGVuZHMgb24gdGhlIGRhdGFzZXQncyBkZWNsYXJlZCB1bml0LCBzbyBpdCB3YWl0cyBmb3IgdGhlIGRhdGFzZXRcbiAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBzZXQgdXAgYXQgbW91bnQgdGltZS5cbiAgICBpZiAoZGF0YXNldC5pZCAhPT0gdGhpcy5zcGF0aWFsU2NhbGVCYXJLZXkpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFNjYWxlQmFyS2V5ID0gZGF0YXNldC5pZDtcbiAgICAgIHRoaXMuaW5zdGFsbFNwYXRpYWwzZFNjYWxlQmFyKHZpZXdlciwgZGF0YXNldCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlZmVyZW5jZSB2b2x1bWUgaXMgaGlkZGVuLCBub3QgcmVtb3ZlZDogaXQgYWxzbyBmaXhlcyB0aGUgY2VudHJpbmdcbiAgICAvLyBvZmZzZXQgZXZlcnkgcG9zaXRpb24gaXMgY29tcHV0ZWQgZnJvbSwgYW5kIHJlLWZldGNoaW5nIGEgMTAwIE1CIHRlbXBsYXRlXG4gICAgLy8gdG8gdW4taGlkZSBpdCB3b3VsZCBtYWtlIGEgY2hlY2tib3ggZmVlbCBsaWtlIGEgbG9hZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsVm9sdW1lKSB7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUudmlzaWJsZSA9IHZpZXcuc2hvd1ZvbHVtZTtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZS5vcGFjaXR5ID0gdmlldy52b2x1bWVPcGFjaXR5O1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfM0RfQkFTRV9TSVpFICogc2NhbGU7XG4gICAgY29uc3Qgc2NhbGFycyA9IGVuYz8udmFsdWVzID8/IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50KTtcbiAgICBjb25zdCBjb2xvcm1hcCA9IGVuYz8uY29sb3JtYXAgPz8gdGhpcy5zcGF0aWFsRmxhdENvbG9ybWFwKCk7XG4gICAgY29uc3QgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl0gPSBlbmM/LmNvbnRyYXN0TGltaXRzID8/IFswLCAxXTtcblxuICAgIC8vIE9uZSBpbWFnZWQgc2VjdGlvbiwgb3IgdGhlIHdob2xlIHN0YWNrLiBUaGUgc3Vic2V0IElTIHRoZSBnZW9tZXRyeSwgc28gaXRcbiAgICAvLyBiZWxvbmdzIGluIHRoZSBnZW9tZXRyeSBrZXkgcmF0aGVyIHRoYW4gYmVpbmcgcmUtZGVyaXZlZCBwZXIgZnJhbWUg4oCUIGFuZCBhblxuICAgIC8vIG91dC1vZi1yYW5nZSBpbmRleCBpcyBjbGFtcGVkIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjbG91ZCwgYmVjYXVzZSB0aGVcbiAgICAvLyBzZWN0aW9uIGNvdW50IGNoYW5nZXMgd2l0aCB0aGUgZGF0YXNldCB3aGlsZSB0aGUgdmlldyBzdGF0ZSBwZXJzaXN0cy5cbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgICBjb25zdCBzZWN0aW9uID1cbiAgICAgIHZpZXcucG9pbnRTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcucG9pbnRTZWN0aW9uKSldXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBzaG93biA9IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogbnVsbDtcbiAgICBjb25zdCBzaG93bkNvdW50ID0gc2hvd24gPyBzaG93bi5sZW5ndGggOiBvYnMuY291bnQ7XG5cbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzZWN0aW9uID8/ICdhbGwnfWA7XG4gICAgLy8gYFBvaW50czNETGF5ZXIudmFsdWVzYCBpcyByZWFkb25seSBhbmQgdGhlIGxheWVyIGV4cG9zZXMgbm8gZGF0YVZlcnNpb24gdG9cbiAgICAvLyBidW1wLCBzbyB1bmxpa2UgdGhlIDJEIHBhdGggYSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSBjYW5ub3QgYmUgbXV0YXRlZCBpblxuICAgIC8vIOKAlCB0aGUgbGF5ZXIgaGFzIHRvIGJlIHJlYnVpbHQuIE9ubHkgdGhlIHNpemUvb3BhY2l0eS9jb2xvcm1hcCBrbm9icyBhcmVcbiAgICAvLyBnZW51aW5lbHkgZGlzcGxheS1vbmx5LiBTbyB0cmFjayB0aGUgc2NhbGFycycgaWRlbnRpdHkgc2VwYXJhdGVseSBmcm9tIHRoZVxuICAgIC8vIGdlb21ldHJ5J3M6IGBjb2xvckJ5YCBwbHVzIHRoZSB0cmFuc2Zvcm1zIGZlZWRpbmcgdGhlIGVuY29kaW5nLlxuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBzY2FsYXJLZXkgPSBbXG4gICAgICBrZXksXG4gICAgICB2aWV3LmNvbG9yQnkgPyBgJHt2aWV3LmNvbG9yQnkua2luZH06JHt2aWV3LmNvbG9yQnkubmFtZX1gIDogJ2ZsYXQnLFxuICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICBjbGlwLmpvaW4oJywnKSxcbiAgICBdLmpvaW4oJ3wnKTtcblxuICAgIGlmIChrZXkgIT09IHRoaXMuc3BhdGlhbExheWVyS2V5M2QpIHtcbiAgICAgIC8vIE5ldyBnZW9tZXRyeTogaW50ZXJsZWF2ZSB4LHkseiAodGhlIGxheWVyJ3MgZG9jdW1lbnRlZCBsYXlvdXQsIHgtZmFzdGVzdClcbiAgICAgIC8vIGFuZCBjYWNoZSBpdCwgc28gbGF0ZXIgY29sb3VyIGNoYW5nZXMgcmVidWlsZCB0aGUgbGF5ZXIgd2l0aG91dCB3YWxraW5nXG4gICAgICAvLyB0aGUgb2JzZXJ2YXRpb25zIGFnYWluLlxuICAgICAgY29uc3QgW294LCBveSwgb3pdID0gdGhpcy5zcGF0aWFsT3JpZ2luM2Q7XG4gICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQgKiAzKTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2hvd25Db3VudDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgICAgcG9zaXRpb25zW2sgKiAzXSA9IG9icy54W2ldICsgb3g7XG4gICAgICAgIHBvc2l0aW9uc1trICogMyArIDFdID0gb2JzLnlbaV0gKyBveTtcbiAgICAgICAgcG9zaXRpb25zW2sgKiAzICsgMl0gPSBvYnMueltpXSArIG96O1xuICAgICAgfVxuICAgICAgdGhpcy5zcGF0aWFsUG9zaXRpb25zM2QgPSBwb3NpdGlvbnM7XG4gICAgICB0aGlzLnNwYXRpYWxEcmF3bjNkID0gc2hvd247XG4gICAgfVxuXG4gICAgLy8gVGhlIHNjYWxhcnMgaGF2ZSB0byBmb2xsb3cgdGhlIGdlb21ldHJ5OiBhIHBlci1vYnNlcnZhdGlvbiB2ZWN0b3IgYWdhaW5zdCBvbmVcbiAgICAvLyBzZWN0aW9uJ3MgcG9zaXRpb25zIHdvdWxkIGNvbG91ciBlYWNoIGNlbGwgYnkgYSBzdHJhbmdlcidzIHZhbHVlLlxuICAgIGNvbnN0IHZhbHVlc0ZvciA9ICgpID0+IChzaG93biA/IEZsb2F0MzJBcnJheS5mcm9tKHNob3duLCAoaSkgPT4gc2NhbGFyc1tpXSkgOiBzY2FsYXJzKTtcblxuICAgIGlmICghdGhpcy5zcGF0aWFsUG9pbnRzM2QgfHwga2V5ICE9PSB0aGlzLnNwYXRpYWxMYXllcktleTNkKSB7XG4gICAgICAvLyBOZXcgR0VPTUVUUlkg4oCUIGEgZGlmZmVyZW50IGRhdGFzZXQsIG9yIGEgZGlmZmVyZW50IHNlY3Rpb24g4oCUIHNvIGEgbmV3IGxheWVyLlxuICAgICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50czNkKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMzZCk7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0ga2V5O1xuICAgICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBzY2FsYXJLZXk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IHZpZXdlci5hZGRQb2ludHMzRCh0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCEsIHZhbHVlc0ZvcigpLCB7XG4gICAgICAgIG5hbWU6ICdvYnNlcnZhdGlvbnMnLFxuICAgICAgICBjb2xvcm1hcCxcbiAgICAgICAgY29udHJhc3RMaW1pdHMsXG4gICAgICAgIHNpemUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNjYWxhcktleSAhPT0gdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QpIHtcbiAgICAgICAgLy8gQSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSwgd2hpY2ggdXNlZCB0byBtZWFuIGRpc2NhcmRpbmcgdGhlIGxheWVyIGFuZCBidWlsZGluZ1xuICAgICAgICAvLyBhbm90aGVyIOKAlCBhbmQsIGJlY2F1c2UgYWRkaW5nIGEgM0QgbGF5ZXIgcmVmcmFtZXMsIGEgY2FtZXJhIGp1bXAgdG8gdW5kbyBhcyB3ZWxsLlxuICAgICAgICAvLyBuYXBhcmktanMg4omlIDAuMTQgbGV0cyB0aGUgc2NhbGFycyBiZSByZXBsYWNlZCBpbiBwbGFjZSDigJQgdGhlIHNldHRlciBidW1wcyB0aGVcbiAgICAgICAgLy8gbGF5ZXIncyBkYXRhVmVyc2lvbiBzbyB0aGUgdmlzdWFsIHJlLXVwbG9hZHMg4oCUIGFuZCB0aGUgcG9zaXRpb25zIGhhdmUgbm90IG1vdmVkLFxuICAgICAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIGZvciB0aGUgY2FtZXJhIHRvIHJlZnJhbWUuXG4gICAgICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gc2NhbGFyS2V5O1xuICAgICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC52YWx1ZXMgPSB2YWx1ZXNGb3IoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLmNvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC5jb250cmFzdExpbWl0cyA9IGNvbnRyYXN0TGltaXRzO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2Quc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLy8gU2VsZWN0aW9uIGlzIGEgUEVSLVBPSU5UIGFscGhhLCBpbiB0aGUgb25lIGxheWVyLlxuICAgIC8vXG4gICAgLy8gSXQgdXNlZCB0byBiZSBhIHNlY29uZCBsYXllcjogd2l0aCBhIHNpbmdsZSBvcGFjaXR5IGZvciB0aGUgd2hvbGUgY2xvdWQsIHRoZSBvbmx5IHdheVxuICAgIC8vIHRvIGhpZ2hsaWdodCBhIHN1YnNldCB3YXMgdG8gZHJhdyBpdCBhZ2FpbiBvbiB0b3AgYXQgZnVsbCBvcGFjaXR5IHdoaWxlIHRoZSBwYXJlbnRcbiAgICAvLyBkcm9wcGVkIHRvIHRoZSBtdXRlZCBsZXZlbC4gVGhhdCBzZWNvbmQgbGF5ZXIgaGFkIHRvIGJlIGtlcHQgaW4gc3RlcCB0aHJvdWdoIGV2ZXJ5XG4gICAgLy8gY29sb3JtYXAsIHdpbmRvdyBhbmQgc2l6ZSBjaGFuZ2UsIGFuZCB0aGUgdHdvIHRoZW4gZGVwdGgtc29ydGVkIGFnYWluc3QgZWFjaCBvdGhlciBhc1xuICAgIC8vIHNlcGFyYXRlIGRyYXdzLiBQZXItcG9pbnQgYWxwaGFzIGFuZCBzaXplcyBnaXZlIHRoZSBzYW1lIHJlYWRpbmcg4oCUIG11dGVkIGNsb3VkLCBicmlnaHRcbiAgICAvLyBzZWxlY3Rpb24sIHNsaWdodGx5IGxhcmdlciBzbyBhIHNtYWxsIG9uZSBpcyBmaW5kYWJsZSBpbnNpZGUgMy43TSBwb2ludHMg4oCUIGluIG9uZS5cbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwICYmIHNlbGVjdGlvbi5tYXNrLmxlbmd0aCA9PT0gb2JzLmNvdW50O1xuICAgIGNvbnN0IGNsb3VkID0gdGhpcy5zcGF0aWFsUG9pbnRzM2Q7XG4gICAgaWYgKGNsb3VkKSB7XG4gICAgICBjbG91ZC5vcGFjaXR5ID0gdmlldy5vcGFjaXR5O1xuICAgICAgaWYgKCFoYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgY2xvdWQuYWxwaGFzID0gbnVsbDtcbiAgICAgICAgY2xvdWQuc2l6ZXMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYWxwaGFzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNob3duQ291bnQ7IGsrKykge1xuICAgICAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgICAgICBjb25zdCBwaWNrZWQgPSAhIXNlbGVjdGlvbi5tYXNrW2ldO1xuICAgICAgICAgIGFscGhhc1trXSA9IHBpY2tlZCA/IDEgOiBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gICAgICAgICAgc2l6ZXNba10gPSBwaWNrZWQgPyBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgOiAxO1xuICAgICAgICB9XG4gICAgICAgIGNsb3VkLmFscGhhcyA9IGFscGhhcztcbiAgICAgICAgY2xvdWQuc2l6ZXMgPSBzaXplcztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTGFzdCwgc28gaXQgYWxzbyBjb3ZlcnMgYSBsYXllciB0aGlzIHBhc3MganVzdCBjcmVhdGVkLlxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMzZCkgdGhpcy5zcGF0aWFsUG9pbnRzM2QudmlzaWJsZSA9IHZpZXcuc2hvd1BvaW50cztcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAqKjNEIGdlbmUgbWFwKio6IHRoZSBhY3RpdmUgZ2VuZSdzIGV4cHJlc3Npb24gb3ZlciB0aGUgd2hvbGUgc2VjdGlvbmVkXG4gICAqIHNwZWNpbWVuLCBhcyBvbmUgcmF5bWFyY2hlZCB2b2x1bWUuXG4gICAqXG4gICAqIFR3byB0aGluZ3MgaXQgY2FuIGJlLCBhbmQgdGhlIHBhbmVsJ3MgYFZvbHVtZSByZW5kZXJpbmdgIHRvZ2dsZSBwaWNrcyB3aGljaDpcbiAgICpcbiAgICogIC0gKipzaGVldHMqKiDigJQgZXhhY3RseSB0aGUgcGxhbmVzIHRoYXQgd2VyZSBpbWFnZWQsIGVhY2ggY2FycnlpbmcgdGhhdFxuICAgKiAgICBzbGlkZSdzIG93biAyRCBnZW5lIG1hcCwgd2l0aCB0aGUgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIGVtcHR5LiBBIHN0YWNrIG9mXG4gICAqICAgIG1lYXN1cmVkIGZpZWxkcywgYXQgdGhlaXIgdHJ1ZSB6LlxuICAgKiAgLSAqKnZvbHVtZSoqIOKAlCB0aGUgc2FtZSBmaWVsZHMgc21vb3RoZWQgYWxvbmcgeiwgc28gdGhlIHBsYW5lcyBiZXR3ZWVuIHRoZVxuICAgKiAgICBzZWN0aW9ucyBjYXJyeSBhbiBpbnRlcnBvbGF0ZWQgdmFsdWUuIEFuIGVzdGltYXRlLCBhbmQgZHJhd24gYXMgYVxuICAgKiAgICB0cmFuc2x1Y2VudCBjbG91ZCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBkZW5zaXR5IHZvbHVtZXMgYXJlLlxuICAgKlxuICAgKiBPbmUgYFZvbHVtZUxheWVyYCByYXRoZXIgdGhhbiBhIHRleHR1cmVkIHF1YWQgcGVyIHNlY3Rpb246IGFuIGBJbWFnZUxheWVyYFxuICAgKiByZW5kZXJzIG9ubHkgYXQgYG5kaXNwbGF5ID09PSAyYCwgc28gNTMgc2hlZXRzIGluIHRoZSBvcmJpdCB2aWV3IHdvdWxkIG5lZWQgYVxuICAgKiBuZXcgbGF5ZXIgdHlwZSB1cHN0cmVhbSDigJQgd2hpbGUgYSBzY2FsYXIgdm9sdW1lIHdob3NlIHogc2FtcGxpbmcgYWxyZWFkeSBJU1xuICAgKiB0aGUgc2VjdGlvbiBzcGFjaW5nIGV4cHJlc3NlcyB0aGUgc2hlZXRzIGV4YWN0bHksIGFuZCB0aGUgc2FtZSBsYXR0aWNlIHRoZW5cbiAgICogZ2l2ZXMgdGhlIGludGVycG9sYXRlZCB2ZXJzaW9uIGZvciBmcmVlLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBvd24gbGF0dGljZSAoYGRlbnNpdHlHcmlkYCBhdCBzdHJpZGUgMSksXG4gICAqIHNvIHRoZSBmaWVsZCBsYW5kcyB2b3hlbC1mb3Itdm94ZWwgb24gdGhlIGFuYXRvbXkgYW5kIG5lZWRzIG5vIG9mZnNldCDigJQgYVxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGUsIGFuZCBuYXBhcmkgY2VudHJlcyBib3RoIGJveGVzIG9uIHRoZSB3b3JsZFxuICAgKiBvcmlnaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUdlbmVNYXBWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgdm9sdW1lIGJ1aWx0IGZyb20gT05FIHNlY3Rpb24gd291bGQgc21lYXIgdGhhdCBzbGlkZSB0aHJvdWdoIHRoZSB3aG9sZVxuICAgIC8vIGRlcHRoLCBzbyB0aGUgc2VjdGlvbiByZXN0cmljdGlvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHNoZWV0cy5cbiAgICBjb25zdCBpbnRlcnBvbGF0ZSA9ICEhdmlldy5nZW5lTWFwVm9sdW1lO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICAgIGNvbnN0IHNlY3Rpb24gPVxuICAgICAgIWludGVycG9sYXRlICYmIHZpZXcuZ2VuZU1hcFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5nZW5lTWFwU2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGdlbmVcbiAgICAgID8gW1xuICAgICAgICBkYXRhc2V0LmlkLCBnZW5lLCBzbW9vdGhpbmcsIHNlY3Rpb24gPz8gJ2FsbCcsIGludGVycG9sYXRlID8gJ3ZvbCcgOiAnc2hlZXRzJyxcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICBmaWVsZEtleSwgY2xpcC5qb2luKCcsJyksIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLCB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICB0aGlzLmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwVm9sdW1lS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0ga2V5O1xuICAgIGlmICgha2V5IHx8ICFnZW5lIHx8ICFwb3J0KSB7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZCA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29hcnNlbmVkIGluLXBsYW5lIGJ1dCBOT1QgYWxvbmcgejogdGhlIHNoZWV0cyBuZWVkIG9uZSBwbGFuZSBwZXIgaW1hZ2VkXG4gICAgLy8gc2VjdGlvbiwgd2hpbGUgdGhlIGZpZWxkIHRoZXkgY2FycnkgaXMgc21vb3RoIGJ5IGNvbnN0cnVjdGlvbiBhbmQgZ2FpbnNcbiAgICAvLyBub3RoaW5nIGZyb20gdGhlIHRlbXBsYXRlJ3MgNDAgwrVtIGRldGFpbC4gQXQgZnVsbCByZXNvbHV0aW9uIHRoZSBlc3RpbWF0ZSBpc1xuICAgIC8vIGEgNS43TS12b3hlbCBwYWlyIG9mIGJsdXJzIG9uIHRoZSBtYWluIHRocmVhZCDigJQgc2Vjb25kcyBvZiBmcm96ZW4gVUkgZm9yIGFcbiAgICAvLyBjaGVja2JveDsgYW4gZWlnaHRoIG9mIHRoZSB2b3hlbHMgaXMgYW4gZWlnaHRoIG9mIHRoZSB3b3JrLlxuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0LCBHRU5FX01BUF9WT0xVTUVfU1RSSURFLCAxMjgsIDEpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSkge1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gM0QgZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgLy8gSW4tcGxhbmUgYmFuZHdpZHRoIGlzIHRoZSAyRCBtYXAncywgaW4gdGhpcyBsYXR0aWNlJ3MgdW5pdHMsIHNvIGEgc2hlZXRcbiAgICAgIC8vIGFuZCB0aGUgMkQgdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZC4gQWxvbmcgeiBpdCBpcyB0aGVcbiAgICAgIC8vIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHMg4oCUIHRoZSBzbWFsbGVzdCDPgyB0aGF0IGJyaWRnZXMgb25lIHNlY3Rpb24gZ2FwLlxuICAgICAgLy8gSW4tcGxhbmUgz4MgaXMgYSBQSFlTSUNBTCBiYW5kd2lkdGgsIGFuY2hvcmVkIHRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duXG4gICAgICAvLyB2b3hlbCDigJQgdGhlIHJlc29sdXRpb24gdGhlIDJEIG1hcCBlc3RpbWF0ZXMgYXQg4oCUIHNvIGEgc2hlZXQgYW5kIHRoZSAyRFxuICAgICAgLy8gdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZCB3aGF0ZXZlciBsYXR0aWNlIHRoaXMgaXNcbiAgICAgIC8vIHJhc3RlcmlzZWQgb24uIEFsb25nIHogaXQgaXMgdGhlIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHM6IHRoZSBzbWFsbGVzdCDPg1xuICAgICAgLy8gdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIGNvbnN0IGluUGxhbmUgPSBkYXRhc2V0LnZvbHVtZT8udm94ZWxTaXplID8/IGdyaWQudm94ZWxTaXplO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBleHByZXNzaW9uVm9sdW1lKG9icywgZ3JpZCwge1xuICAgICAgICBzaWdtYTogW1xuICAgICAgICAgIGluUGxhbmVbMF0gKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICBpblBsYW5lWzFdICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgICAgIF0sXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgaW5kaWNlczogc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBpblNlbGVjdGlvbixcbiAgICAgICAgaW50ZXJwb2xhdGUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5ID0gZmllbGRLZXk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQ7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgW2xvLCBoaV0gPSBjb250cmFzdFdpbmRvdyhmaWVsZC5tZWFuLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRXhwcmVzc2lvblZvbHVtZShmaWVsZCwgW2xvLCBoaV0sIHsgbG9nOiB2aWV3LmxvZ1NjYWxlIH0pO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIgPSB2aWV3ZXIuYWRkVm9sdW1lKFxuICAgICAgZGF0YSwgZmllbGQud2lkdGgsIGZpZWxkLmhlaWdodCwgZmllbGQuZGVwdGgsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9JHtpbnRlcnBvbGF0ZSA/ICcgwrcgdm9sdW1lJyA6ICcnfWAsXG4gICAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoYGdlbmUtbWFwLSR7Z2VuZX1gLCBsdXQpLFxuICAgICAgICAvLyBUaGUgZW5jb2RpbmcgYWxyZWFkeSBhcHBsaWVkIHRoZSB3aW5kb3csIHNvIHRoZSBsYXllciBtdXN0IG5vdCBhcHBseSBhXG4gICAgICAgIC8vIHNlY29uZCBvbmU6IDAuLjI1NSBpcyB0aGUgd2hvbGUgb2Ygd2hhdCBpdCB3YXMgZ2l2ZW4uXG4gICAgICAgIGNvbnRyYXN0TGltaXRzOiBbMCwgMjU1XSxcbiAgICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgICAvLyBBZGRpdGl2ZSBsaWtlIHRoZSBkZW5zaXR5IHZvbHVtZXMsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiB0aGUgc2hlZXRzXG4gICAgICAgIC8vIGhhdmUgdG8gcmVhZCBUSFJPVUdIIGVhY2ggb3RoZXIgYW5kIHRocm91Z2ggdGhlIGFuYXRvbXksIHdoaWNoIGFcbiAgICAgICAgLy8gdHJhbnNsdWNlbnQgYmxlbmQgd291bGQgb2NjbHVkZSBvbmUgc2hlZXQgYXQgYSB0aW1lLlxuICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzOiBlYWNoIGNsdXN0ZXIgcmFzdGVyaXNlZCBpbnRvIGEgc21vb3RoIHNjYWxhciBmaWVsZCBhbmRcbiAgICogcmF5bWFyY2hlZCBhbG9uZ3NpZGUgdGhlIGNsb3VkLCB0aW50ZWQgd2l0aCB0aGUgY2x1c3RlcidzIG93biBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgYSBzZXJpYWxseSBzZWN0aW9uZWQgZGF0YXNldCByZWFkYWJsZSBhcyBhbiBhbmF0b21pY2FsXG4gICAqIGRpc3RyaWJ1dGlvbi4gVGhlIGNsb3VkIHNob3dzIG1lYXN1cmVkIGNlbGxzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIGJ1dCBhdCAyMDAgwrVtXG4gICAqIHNlY3Rpb24gc3BhY2luZyB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgYSBzdGFjayBvZiBkaXNjcyBpbnRvIGEgc2hhcGUsIGFuZFxuICAgKiBldmVyeSBnYXAgcmVhZHMgYXMgYWJzZW5jZS4gQSBkZW5zaXR5IGZpZWxkIGlzIGEgZGlmZmVyZW50IG9iamVjdCBmcm9tIGEgY2VsbDpcbiAgICogYW4gZXN0aW1hdGUsIGRlZmluZWQgYmV0d2VlbiB0aGUgaW1hZ2VkIHBsYW5lcywgZHJhd24gYXMgYSB0cmFuc2x1Y2VudCBjbG91ZCBzb1xuICAgKiBpdCBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIG1lYXN1cmVtZW50LiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBuZXZlciBpbnRlcnBvbGF0ZWQg4oCUXG4gICAqIGNvbnNlY3V0aXZlIHNlY3Rpb25zIHNhbXBsZSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGVcbiAgICogYWxvbmcuXG4gICAqXG4gICAqIE9uZSB2b2x1bWUgcGVyIGNsdXN0ZXIgcmF0aGVyIHRoYW4gb25lIGZvciBldmVyeXRoaW5nOiBhZGRpdGl2ZSBibGVuZGluZyBpcyB3aGF0XG4gICAqIG1ha2VzIHR3byBjbHVzdGVycycgdGVycml0b3JpZXMgY29tcGFyYWJsZSwgYW5kIGEgc2luZ2xlIGJsZW5kZWQgZmllbGQgd291bGRcbiAgICogYW5zd2VyIG5vIHF1ZXN0aW9uIGFueW9uZSBhc2tzIG9mIGEgdGF4b25vbXkuIENhcHBlZCBhdFxuICAgKiB7QGxpbmsgREVOU0lUWV9NQVhfQ0xVU1RFUlN9IGJ5IGNlbGwgY291bnQuXG4gICAqXG4gICAqIEtleWVkIHNvIGl0IHJlYnVpbGRzIG9ubHkgd2hlbiB0aGUgZmllbGQgd291bGQgYWN0dWFsbHkgZGlmZmVyIOKAlCB0aGUgZGF0YXNldCxcbiAgICogdGhlIGNvbG91ciBjb2x1bW4sIHRoZSBiYW5kd2lkdGgsIG9yIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlbnNpdHlWb2x1bWVzKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbiA9ICEhdmlldy5kZW5zaXR5Vm9sdW1lICYmICEhZGF0YXNldC5vYnNlcnZhdGlvbnMuejtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmRlbnNpdHlTbW9vdGhpbmcgPiAwID8gdmlldy5kZW5zaXR5U21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjb2x1bW4gPSB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIC8vIFRoZSBzZWxlY3Rpb24gZW50ZXJzIHRoZSBrZXkgYnkgSURFTlRJVFksIG5vdCBieSBjb3VudDogdHdvIGRpZmZlcmVudCBST0lzXG4gICAgLy8gaG9sZGluZyB0aGUgc2FtZSBudW1iZXIgb2YgY2VsbHMgd291bGQgb3RoZXJ3aXNlIGxvb2sgbGlrZSB0aGUgc2FtZSBrZXkgYW5kXG4gICAgLy8gbGVhdmUgdGhlIHByZXZpb3VzIFJPSSdzIGZpZWxkcyBvbiBzY3JlZW4uXG4gICAgY29uc3Qga2V5ID0gb25cbiAgICAgID8gW2RhdGFzZXQuaWQsIGNvbHVtbiA/PyAnYWxsJywgc21vb3RoaW5nLCB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmRlbnNpdHlLZXkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5kZW5zaXR5TGF5ZXJzID0gW107XG4gICAgdGhpcy5kZW5zaXR5S2V5ID0ga2V5O1xuICAgIGlmICgha2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgLy8gV2l0aCBubyByZWZlcmVuY2Ugdm9sdW1lIHRoZXJlIGlzIG5vIG9mZnNldCB5ZXQsIGFuZCBhIFZvbHVtZUxheWVyIGhhcyBub1xuICAgIC8vIHRyYW5zbGF0ZSDigJQgbmFwYXJpIGNlbnRyZXMgaXRzIGJveCBvbiB0aGUgd29ybGQgb3JpZ2luLiBTbyB0aGUgUE9JTlRTIG1vdmUgYnlcbiAgICAvLyBoYWxmIHRoZSBkZW5zaXR5IGJveCwgZXhhY3RseSBhcyB0aGV5IGRvIGZvciBhIHJlZmVyZW5jZSB2b2x1bWUsIGFuZCB0aGVcbiAgICAvLyBjYWNoZWQgZ2VvbWV0cnkgaXMgaW52YWxpZGF0ZWQgYmVjYXVzZSB0aGF0IG9mZnNldCBqdXN0IGNoYW5nZWQuXG4gICAgaWYgKCF0aGlzLnNwYXRpYWxWb2x1bWUpIHtcbiAgICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gW1xuICAgICAgICAtKGdyaWQud2lkdGggKiBncmlkLnZveGVsU2l6ZVswXSkgLyAyLFxuICAgICAgICAtKGdyaWQuaGVpZ2h0ICogZ3JpZC52b3hlbFNpemVbMV0pIC8gMixcbiAgICAgICAgLShncmlkLmRlcHRoICogZ3JpZC52b3hlbFNpemVbMl0pIC8gMixcbiAgICAgIF07XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZ3JvdXBzOiB7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZzsgaW5kaWNlcz86IFVpbnQzMkFycmF5IH1bXTtcbiAgICB0cnkge1xuICAgICAgZ3JvdXBzID0gYXdhaXQgdGhpcy5kZW5zaXR5R3JvdXBzKGRhdGFzZXQsIGNvbHVtbiwgc2VsZWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZGVuc2l0eSB2b2x1bWVzOiBjb2x1bW4gdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IHNpZ21hID0gZGVmYXVsdFNpZ21hKGdyaWQsIHNtb290aGluZyk7XG4gICAgLy8gQWRkaXRpdmUgYmxlbmRpbmcgU1VNUywgc28gYSBmaXhlZCBwZXItbGF5ZXIgb3BhY2l0eSBibG93cyBvdXQgdG8gd2hpdGUgYXNcbiAgICAvLyBzb29uIGFzIHNldmVyYWwgYnJvYWQgY2x1c3RlcnMgb3ZlcmxhcCDigJQgc2l4IHN1YmNsYXNzZXMgYXQgMC41NSBlYWNoIHR1cm5lZFxuICAgIC8vIHRoZSBicmFpbiBpbnRvIG9uZSBjeWFuIG1hc3MuIFNwbGl0dGluZyB0aGUgYnVkZ2V0IGtlZXBzIG4gZnVsbHkgb3ZlcmxhcHBpbmdcbiAgICAvLyBwZWFrcyBpbnNpZGUgdGhlIGRpc3BsYXkncyByYW5nZSwgc28gb3ZlcmxhcCByZWFkcyBhcyBvdmVybGFwOyBhIHNpbmdsZVxuICAgIC8vIGNsdXN0ZXIgc3RpbGwgZ2V0cyB0aGUgZnVsbCAwLjU1LiBJdCBvbmx5IG1pdGlnYXRlczogYSB0cmFuc2x1Y2VudCByYXltYXJjaFxuICAgIC8vIGludGVncmF0ZXMgYWxvbmcgdGhlIHJheSwgc28gY2x1c3RlcnMgdGhhdCBhcmUgdWJpcXVpdG91cyByYXRoZXIgdGhhblxuICAgIC8vIHJlZ2lvbmFsICh0aGUgbGFyZ2VzdCBzdWJjbGFzc2VzIGFyZSBnbGlhLCB3aGljaCBhcmUgZXZlcnl3aGVyZSkgc3RpbGwgcGlsZVxuICAgIC8vIHVwLCBhbmQgb25lIGNsdXN0ZXIgYXQgYSB0aW1lIGlzIHRoZSByZWFkYWJsZSB3YXkgdG8gbG9vayBhdCB0aG9zZS5cbiAgICBjb25zdCBvcGFjaXR5ID0gTWF0aC5taW4oMC41NSwgMC45IC8gTWF0aC5tYXgoMSwgZ3JvdXBzLmxlbmd0aCkpO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmFzdGVyaXplRGVuc2l0eShkYXRhc2V0Lm9ic2VydmF0aW9ucywgZ3JpZCwgeyBzaWdtYSwgaW5kaWNlczogZ3JvdXAuaW5kaWNlcyB9KTtcbiAgICAgIC8vIEEgY2x1c3RlciB3aXRoIG5vdGhpbmcgb24gdGhlIGdyaWQgZHJhd3Mgbm8gbGF5ZXIsIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJveC5cbiAgICAgIGlmICghZGF0YSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmRlbnNpdHlLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgdGhpcy5kZW5zaXR5TGF5ZXJzLnB1c2goXG4gICAgICAgIChcbiAgICAgICAgICB2aWV3ZXIuYWRkVm9sdW1lKGRhdGEsIGdyaWQud2lkdGgsIGdyaWQuaGVpZ2h0LCBncmlkLmRlcHRoLCB7XG4gICAgICAgICAgICBuYW1lOiBgZGVuc2l0eSDCtyAke2dyb3VwLm5hbWV9YCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoZ3JvdXAuY29sb3IpLFxuICAgICAgICAgICAgLy8gVHJhbnNsdWNlbnQsIG5vdCBNSVA6IGEgY2x1c3RlcidzIGludGVyaW9yIGlzIHRoZSByZWFkYWJsZSBwYXJ0LCBhbmQgTUlQXG4gICAgICAgICAgICAvLyB3b3VsZCBmbGF0dGVuIGV2ZXJ5IGNsb3VkIHRvIGl0cyBicmlnaHRlc3Qgc2hlbGwuXG4gICAgICAgICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgICAgLy8gQWRkaXRpdmUsIHNvIHR3byBjbHVzdGVycyBvdmVybGFwcGluZyByZWFkIGFzIGJvdGggYmVpbmcgdGhlcmUgaW5zdGVhZFxuICAgICAgICAgICAgLy8gb2YgdGhlIG5lYXJlciBvbmUgaGlkaW5nIHRoZSBvdGhlci5cbiAgICAgICAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICAgICAgICB9KSksXG4gICAgICApO1xuICAgIH1cbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aXR5IG9mIHRoZSBjb2xvdXIgc2NhbGUgYSBjb250aW51b3VzIHNwYXRpYWwgbGF5ZXIgd2lsbCBkcmF3IHdpdGgsIGZvciBhXG4gICAqIGNhY2hlIGtleTogdGhlIGV4cGxpY2l0IGNob2ljZSwgb3IgZWxzZSB0aGUgZGlzcGxheSBjb2xvcm1hcCBhbmQgaXRzIHJldmVyc2VcbiAgICogZmxhZywgc2luY2UgdGhhdCBpcyB3aGF0IHtAbGluayBzcGF0aWFsQ29udGludW91c0x1dH0gZmFsbHMgYmFjayB0by5cbiAgICpcbiAgICogVGhlIGdlbmUgbWFwcyBjYWNoZSB0aGVpciBjb2xvdXJlZCBvdXRwdXQsIHNvIHdpdGhvdXQgdGhpcyBpbiB0aGUga2V5IGEgY2hhbmdlXG4gICAqIG9mIGNvbG91ciBzY2FsZSBsZWZ0IHRoZSBmaWVsZCBvbiBzY3JlZW4gaW4gdGhlIHByZXZpb3VzIGNvbG91cnMg4oCUIHRoZSBtYXJrZXJzXG4gICAqIHJlY29sb3VyZWQgYW5kIHRoZSBtYXAgdW5kZXIgdGhlbSBkaWQgbm90LlxuICAgKi9cbiAgcHJpdmF0ZSBjb250aW51b3VzQ29sb3JtYXBLZXkodmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNvbG9ybWFwSWQodmlldy5jb250aW51b3VzQ29sb3JtYXApLFxuICAgICAgY29sb3JtYXBJZChub2RlPy5kYXRhPy52YWx1ZSksXG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID8gJ3JldicgOiAnJyxcbiAgICBdLmpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHJldmlzaW9uIG51bWJlciBmb3IgYSBzZWxlY3Rpb24gb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgc3RvcmUgaGFuZHMgb3V0IGEgTkVXIG1hc2sgb2JqZWN0IHBlciBjaGFuZ2UsIHNvIG9iamVjdCBpZGVudGl0eSBpcyB0aGVcbiAgICogY2hlYXAgYW5kIGV4YWN0IHdheSB0byB0ZWxsIHR3byBzZWxlY3Rpb25zIGFwYXJ0IOKAlCBhIGZpbmdlcnByaW50IG92ZXIgMy43TVxuICAgKiBtYXNrIGJ5dGVzIHdvdWxkIGJlIG5laXRoZXIuIENvdW50aW5nIHJldmlzaW9ucyBrZWVwcyB0aGUgY2FjaGUga2V5IGEgc2hvcnRcbiAgICogc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXYoc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IG51bWJlciB7XG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdGhpcy5sYXN0U2VsZWN0aW9uU2Vlbikge1xuICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uU2VlbiA9IHNlbGVjdGlvbjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uUmV2aXNpb24rKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uUmV2aXNpb247XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsdXN0ZXJzIHRvIHJhc3RlcmlzZTogdGhlIGNhdGVnb3JpZXMgb2YgdGhlIGFjdGl2ZSBjYXRlZ29yaWNhbCBjb2xvdXJpbmcsXG4gICAqIGJpZ2dlc3QgZmlyc3QgYW5kIGNhcHBlZCwgZWFjaCB3aXRoIGl0cyBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBSZXN0cmljdGVkIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aGVuIHRoZXJlIGlzIG9uZSwgc28gXCJzZWxlY3QgYSByZWdpb24sXG4gICAqIGNoZWNrIHRoZSBib3hcIiBhbnN3ZXJzIHdoaWNoIGNsdXN0ZXJzIGxpdmUgdGhlcmUuIFdpdGggbm8gY2F0ZWdvcmljYWwgY29sb3VyaW5nXG4gICAqIHRoZXJlIGlzIG9uZSBncm91cCDigJQgdG90YWwgY2VsbCBkZW5zaXR5LCB3aGljaCBpcyBhIHJlYWwgcXVlc3Rpb24gb24gaXRzIG93blxuICAgKiAoXCJ3aGVyZSBpcyB0aGUgdGlzc3VlIGRlbnNlP1wiKSBhbmQgdGhlIGhvbmVzdCB0aGluZyB0byBzaG93IHdoZW4gdGhlIHZpZXcgaXNcbiAgICogbm90IGVuY29kaW5nIGEgdGF4b25vbXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbnNpdHlHcm91cHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIGNvbHVtbjogc3RyaW5nIHwgbnVsbCwgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZzsgaW5kaWNlcz86IFVpbnQzMkFycmF5IH1bXT4ge1xuICAgIGNvbnN0IG4gPSBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudDtcbiAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBzZWxlY3Rpb24ubWFzayA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgbWV0YSA9IGNvbHVtbiA/IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIGNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2x1bW4gfHwgIW1ldGEgfHwgbWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICBjb25zdCBpbmRpY2VzID0gaW5TZWxlY3Rpb24gPyBtYXNrVG9JbmRpY2VzKGluU2VsZWN0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIGNvbnN0IGhleCA9IGAjJHtbciwgZywgYl0ubWFwKChjKSA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKX1gO1xuICAgICAgcmV0dXJuIFt7IG5hbWU6IGluU2VsZWN0aW9uID8gJ3NlbGVjdGVkIGNlbGxzJyA6ICdhbGwgY2VsbHMnLCBjb2xvcjogaGV4LCBpbmRpY2VzIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHJldHVybiBbXTtcbiAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMobG9hZGVkLm1ldGEpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShsb2FkZWQubWV0YS5jYXRlZ29yaWVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY29kZSA9IGxvYWRlZC5jb2Rlc1tpXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBjb2RlIDwgY291bnRzLmxlbmd0aCkgY291bnRzW2NvZGVdKys7XG4gICAgfVxuICAgIGNvbnN0IHJhbmtlZCA9IEFycmF5LmZyb20oY291bnRzLCAoY291bnQsIGNvZGUpID0+ICh7IGNvZGUsIGNvdW50IH0pKVxuICAgICAgLmZpbHRlcigoYykgPT4gYy5jb3VudCA+IDApXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpXG4gICAgICAuc2xpY2UoMCwgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuREVOU0lUWV9NQVhfQ0xVU1RFUlMpO1xuICAgIGlmIChjb3VudHMuZmlsdGVyKChjKSA9PiBjID4gMCkubGVuZ3RoID4gcmFua2VkLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW25hcGFyaS1qc10gJHtjb2x1bW59OiBkcmF3aW5nIHRoZSAke3JhbmtlZC5sZW5ndGh9IGxhcmdlc3QgY2x1c3RlcnMgYXMgZGVuc2l0eSBgICtcbiAgICAgICAgICAndm9sdW1lczsgbW9yZSB0aGFuIHRoYXQgc3RvcCBiZWluZyBzZXBhcmFibGUgYnkgZXllJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByYW5rZWQubWFwKCh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShjb3VudHNbY29kZV0pO1xuICAgICAgbGV0IGsgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaWYgKGluU2VsZWN0aW9uICYmICFpblNlbGVjdGlvbltpXSkgY29udGludWU7XG4gICAgICAgIGlmIChsb2FkZWQuY29kZXNbaV0gPT09IGNvZGUpIGluZGljZXNbaysrXSA9IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBsb2FkZWQubWV0YS5jYXRlZ29yaWVzW2NvZGVdLFxuICAgICAgICBjb2xvcjogY29sb3JzW2NvZGVdID8/ICcjODg4ODg4JyxcbiAgICAgICAgaW5kaWNlczogaW5kaWNlcy5zdWJhcnJheSgwLCBrKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIChvciBrZWVwKSB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWUsIGFuZCBkZXJpdmUgdGhlIG9mZnNldCB0aGF0IHNpdHMgdGhlXG4gICAqIG9ic2VydmF0aW9ucyBpbnNpZGUgaXQuXG4gICAqXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZTogbmFwYXJpLWpzIG1hcHMgdGhlIHZvbHVtZSdzIHVuaXQgY3ViZSB0byBhIHdvcmxkIGJveFxuICAgKiAqKmNlbnRyZWQgb24gdGhlIG9yaWdpbioqLCBzaXplZCBgZGltcyB4IHZveGVsU2l6ZWAuIFRoZSBvYnNlcnZhdGlvbnMsIGJ5IGNvbnRyYWN0LCBhcmUgaW5cbiAgICogdGhlIHZvbHVtZSdzIG93biBmcmFtZSB3aXRoIGl0cyBuZWFyIGNvcm5lciBhdCB0aGUgY29vcmRpbmF0ZSBvcmlnaW4uIFNvIHRoZSB0d28gb25seSBsaW5lXG4gICAqIHVwIGlmIHRoZSBQT0lOVFMgbW92ZSDigJQgYnkgaGFsZiB0aGUgYm94IOKAlCB3aGljaCBpcyB3aGF0IHtAbGluayBzcGF0aWFsT3JpZ2luM2R9IGlzLlxuICAgKlxuICAgKiBBIGZhaWxlZCBvciBhYnNlbnQgdm9sdW1lIGlzIG5vdCBmYXRhbDogdGhlIGNsb3VkIHJlbmRlcnMgb24gaXRzIG93biwgYXQgaXRzIG93blxuICAgKiBjb29yZGluYXRlcywgYW5kIHRoZSBjYW1lcmEgZnJhbWVzIHRoZSBwb2ludHMgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3BhdGlhbFZvbHVtZShcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBrZXkgPSBtZXRhID8gYCR7ZGF0YXNldC5pZH06JHttZXRhLndpZHRofXgke21ldGEuaGVpZ2h0fXgke21ldGEuZGVwdGh9YCA6IG51bGw7XG4gICAgaWYgKGtleSAmJiBrZXkgPT09IHRoaXMuc3BhdGlhbFZvbHVtZUtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFZvbHVtZSkge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsVm9sdW1lKTtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWVLZXkgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICBpZiAoIW1ldGEgfHwgIXBvcnQ/LmdldFZvbHVtZSkgcmV0dXJuO1xuXG4gICAgbGV0IHZveGVsczogVWludDhBcnJheTtcbiAgICB0cnkge1xuICAgICAgdm94ZWxzID0gYXdhaXQgcG9ydC5nZXRWb2x1bWUoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gcmVmZXJlbmNlIHZvbHVtZSB1bmF2YWlsYWJsZSDigJQgZHJhd2luZyB0aGUgY2xvdWQgYWxvbmUnLCBlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gbWV0YS52b3hlbFNpemU7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0ga2V5O1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IChcbiAgICAgIHZpZXdlci5hZGRWb2x1bWUodm94ZWxzLCBtZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aCwge1xuICAgICAgbmFtZTogJ3JlZmVyZW5jZSB2b2x1bWUnLFxuICAgICAgY29sb3JtYXA6ICdncmF5JyxcbiAgICAgIC8vIE1JUCB3b3VsZCBkcmF3IHRoZSBicmlnaHRlc3Qgdm94ZWwgYWxvbmcgZWFjaCByYXksIHdoaWNoIGZvciBhbiBhdmVyYWdlZFxuICAgICAgLy8gdGVtcGxhdGUgbWVhbnMgYSBmbGF0IHdoaXRlIHNoZWxsIHRoYXQgaGlkZXMgdGhlIGNsb3VkLiBUcmFuc2x1Y2VudCBsZXRzXG4gICAgICAvLyB0aGUgcG9pbnRzIHJlYWQgdGhyb3VnaCB0aGUgdGlzc3VlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGRyYXdpbmdcbiAgICAgIC8vIHRoZW0gdG9nZXRoZXIuXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBvcGFjaXR5OiB2aWV3LnZvbHVtZU9wYWNpdHksXG4gICAgICAgIHZveGVsU2l6ZTogW3Z4LCB2eSwgdnpdLFxuICAgICAgfSkpO1xuICAgIC8vIEhhbGYgdGhlIGJveCwgbmVnYXRlZDogdGhlIG9ic2VydmF0aW9ucycgb3JpZ2luIGlzIHRoZSBib3gncyBuZWFyIGNvcm5lcixcbiAgICAvLyBhbmQgdGhlIGJveCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4uXG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbXG4gICAgICAtKG1ldGEud2lkdGggKiB2eCkgLyAyLFxuICAgICAgLShtZXRhLmhlaWdodCAqIHZ5KSAvIDIsXG4gICAgICAtKG1ldGEuZGVwdGggKiB2eikgLyAyLFxuICAgIF07XG4gICAgLy8gRm9yY2UgYSBnZW9tZXRyeSByZWJ1aWxkOiB0aGUgb2Zmc2V0IGNoYW5nZWQsIHNvIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHN0YWxlLlxuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGF0aWFsM2RMYXllcnModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIFtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLCB0aGlzLnNwYXRpYWxWb2x1bWUsXG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciwgLi4udGhpcy5kZW5zaXR5TGF5ZXJzLFxuICAgIF0pIHtcbiAgICAgIGlmIChsYXllcikgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZCA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkgPSBudWxsO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgLy8gVGhlIHNjZW5lIGlzIGdvbmUsIHNvIHRoZSBuZXh0IDNEIGxheWVyIHNob3VsZCBmcmFtZSBpdHNlbGYgYWdhaW4uIFRoYXQgdXNlZCB0byBiZVxuICAgIC8vIGBzcGF0aWFsRnJhbWVkID0gbnVsbGAgbmV4dCB0byBhIGhhbmQtcm9sbGVkIHNhdmUvcmVzdG9yZTsgdGhlIHJlbmRlcmVyIG93bnMgdGhlXG4gICAgLy8gcG9saWN5IG5vdywgYW5kIHRoaXMgaXMgdGhlIHNhbWUgc3RhdGVtZW50IGFkZHJlc3NlZCB0byBpdC5cbiAgICB2aWV3ZXIucmVzZXRGaXQzRCgpO1xuICAgIHRoaXMuc3BhdGlhbDJkRnJhbWVkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbMCwgMCwgMF07XG4gICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsRHJhd24zZCA9IG51bGw7XG4gIH1cblxuICAvKiogQSBvbmUtY29sb3VyIGNvbG9ybWFwLCBmb3IgdGhlIFwibm90aGluZyB0byBjb2xvdXIgYnlcIiBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRmxhdENvbG9ybWFwKCk6IENvbG9ybWFwIHtcbiAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgY29uc3QgcmdiOiBSZ2IgPSBbTWF0aC5yb3VuZChyICogMjU1KSwgTWF0aC5yb3VuZChnICogMjU1KSwgTWF0aC5yb3VuZChiICogMjU1KV07XG4gICAgLy8gVHdvIGlkZW50aWNhbCBzdG9wczogY29sb3JtYXBGcm9tTHV0IG5lZWRzIGF0IGxlYXN0IHR3bywgYW5kIGVxdWFsIGVuZHNcbiAgICAvLyBtYWtlIGV2ZXJ5IHZhbHVlIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sb3VyLlxuICAgIHJldHVybiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtZmxhdCcsIFtyZ2IsIHJnYl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItcG9pbnQgc2NhbGFyICsgY29sb3JtYXAgKyB3aW5kb3cgdGhhdCBjb2xvdXIgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBDb250aW51b3VzIGRhdGEgaXMgdGhlIG5hdHVyYWwgZml0OiB2YWx1ZXMgZ28gc3RyYWlnaHQgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggdGhlXG4gICAqIHNhbWUgcGVyY2VudGlsZSB3aW5kb3cgdGhlIDJEIHBhdGggdXNlcy4gQ2F0ZWdvcmljYWwgZGF0YSBoYXMgdG8gYmUgc211Z2dsZWQgdGhyb3VnaCB0aGUgc2FtZVxuICAgKiBzY2FsYXIgY2hhbm5lbCDigJQgc2VlIHtAbGluayBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfS4gQ29kZXMgbWFwIHRvIExVVCBibG9ja3MsIGFuZFxuICAgKiBgY29udHJhc3RMaW1pdHNgIG9mIGBbLTAuNSwgSyAtIDAuNV1gIHB1dHMgY29kZSBgaWAgYXQgdGhlIGNlbnRyZSBvZiBibG9jayBgaWAsIHdoaWNoIGlzIHdoYXRcbiAgICogbWFrZXMgdGhlIHJvdW5kLXRyaXAgZXhhY3QgaW5zdGVhZCBvZiBhcHByb3hpbWF0ZWx5IHJpZ2h0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzcGF0aWFsU2NhbGFyM2QoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8U3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICBpZiAoIXBvcnQgfHwgIWNvbG9yQnkpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGNvbnN0IGNvbHVtbjogU3BhdGlhbENvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvbHVtbi5jb2RlcywgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgICBjb2x1bW4udmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICAgIHZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSxcbiAgICApO1xuICB9XG5cbiAgLyoqIENhdGVnb3J5IGNvZGVzIOKGkiBhIHN0ZXBwZWQgTFVULCBleGFjdCBmb3IgdXAgdG8ge0BsaW5rIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVN9LiAqL1xuICBwcml2YXRlIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvZGVzOiBVaW50MTZBcnJheSwgY29sb3JzOiBzdHJpbmdbXSk6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCB7XG4gICAgLy8gU2xvdCAwIGlzIHJlc2VydmVkIGZvciBcIm5vIGNhdGVnb3J5XCIsIHNvIHRoZSBwYWxldHRlIG9jY3VwaWVzIDEuLksgYW5kIHRoZVxuICAgIC8vIGJsb2NrIGNvdW50IGlzIG9uZSBtb3JlIHRoYW4gdGhlIGNhdGVnb3J5IGNvdW50IOKAlCB3aGljaCBpcyB3aHkgdGhlIHB1Ymxpc2hlZFxuICAgIC8vIGNlaWxpbmcgaXMgOTUgY2F0ZWdvcmllcyByYXRoZXIgdGhhbiB0aGUgTFVUJ3MgOTYgZGlzdGluZ3Vpc2hhYmxlIGJsb2Nrcy5cbiAgICBpZiAoY29sb3JzLmxlbmd0aCA+IFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtuYXBhcmktanNdICR7Y29sb3JzLmxlbmd0aH0gY2F0ZWdvcmllcyBleGNlZWRzIHRoZSAke1NQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVN9IHRoZSAzRCBgXG4gICAgICAgICsgXCJsYXllcidzIDI1Ni1lbnRyeSBMVVQgY2FuIGhvbGQgZGlzdGluY3RseTsgZHJhd2luZyBmbGF0IGluc3RlYWQgb2Ygd2l0aCB3cm9uZyBjb2xvdXJzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGsgPSBjb2xvcnMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBwYWxldHRlOiBSZ2JbXSA9IFtcbiAgICAgIE1JU1NJTkdfQ09MT1IsXG4gICAgICAuLi5jb2xvcnMubWFwKHBhcnNlSGV4KSxcbiAgICBdO1xuICAgIGNvbnN0IGx1dDogUmdiW10gPSBuZXcgQXJyYXkoTFVUX1NJWkUpO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgTFVUX1NJWkU7IGorKykge1xuICAgICAgbHV0W2pdID0gcGFsZXR0ZVtNYXRoLm1pbihrIC0gMSwgTWF0aC5mbG9vcigoaiAqIGspIC8gTFVUX1NJWkUpKV07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoY29kZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBjb2Rlc1tpXSA9PT0gTk9fQ0FURUdPUlkgPyAwIDogY29kZXNbaV0gKyAxO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWVzLFxuICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dCgnc3BhdGlhbC1jYXRlZ29yaWVzJywgbHV0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbLTAuNSwgayAtIDAuNV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgdGhlIGFjdGl2ZSBjb2xvcm1hcCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgIHNvdXJjZTogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBsb2c6IGJvb2xlYW4sXG4gICk6IFNwYXRpYWwzZEVuY29kaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgbGV0IHZhbHVlcyA9IHNvdXJjZTtcbiAgICBpZiAobG9nKSB7XG4gICAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNvdXJjZS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHZhbHVlc1tpXSA9IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgc291cmNlW2ldKSk7XG4gICAgfVxuICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb250cmFzdFdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtY29udGludW91cycsIGx1dCksXG4gICAgICAvLyBBIGRlZ2VuZXJhdGUgd2luZG93IHdvdWxkIGRpdmlkZSBieSB6ZXJvIGluIHRoZSBzaGFkZXIncyBub3JtYWxpc2F0aW9uLlxuICAgICAgY29udHJhc3RMaW1pdHM6IG1heCA+IG1pbiA/IFttaW4sIG1heF0gOiBbbWluLCBtaW4gKyAxXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlci1vYnNlcnZhdGlvbiBjb2xvdXJzIGZvciB0aGUgY3VycmVudCB2aWV3IHN0YXRlLCBvciBhIHNpbmdsZSBmbGF0IGNvbG91ciB3aGVuIG5vdGhpbmcgaXNcbiAgICogc2VsZWN0ZWQgdG8gY29sb3VyIGJ5LiBDYXRlZ29yaWNhbCBjb2x1bW5zIHVzZSB0aGUgY29sdW1uJ3Mgb3duIHBhbGV0dGU7IGNvbnRpbnVvdXMgY29sdW1uc1xuICAgKiBhbmQgZ2VuZSB2ZWN0b3JzIGdvIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3BhdGlhbEZhY2VDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICAvLyBFdmVyeXRoaW5nIE5PVCBzZWxlY3RlZCBpcyBtdXRlZDsgd2l0aCBub3RoaW5nIHNlbGVjdGVkLCBub3RoaW5nIGlzIG11dGVkXG4gICAgLy8gYW5kIHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkgKHRoZSBDb3NNeCBoaWdobGlnaHQtdnMtbXV0ZSBydWxlKS5cbiAgICBjb25zdCBtdXRlZCA9IG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pO1xuXG4gICAgaWYgKCFwb3J0IHx8ICFjb2xvckJ5KSB7XG4gICAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAvLyBHZW51aW5lbHkgdW5pZm9ybTogb25lIGJyb2FkY2FzdCB0dXBsZSwgc28gYSBmbGF0IDg0ay1vYnNlcnZhdGlvbiB2aWV3XG4gICAgICAvLyBkb2VzIG5vdCBhbGxvY2F0ZSA4NGsgb2YgdGhlbS5cbiAgICAgIGlmICghbXV0ZWQgJiYgdmlldy5vcGFjaXR5ID49IDEpIHJldHVybiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAvLyBOb3QgdW5pZm9ybSDigJQgdGhlIG9wYWNpdHkgY29udHJvbCBvciBhIHNlbGVjdGlvbiB2YXJpZXMgdGhlIGFscGhhLCBzbyBpdFxuICAgICAgLy8gaGFzIHRvIGJlIHBlci1wb2ludC4gUmV0dXJuaW5nIHRoZSBjb25zdGFudCB0dXBsZSBoZXJlIGlzIHdoYXQgbWFkZSB0aGVcbiAgICAgIC8vIE9wYWNpdHkgc2xpZGVyIGRvIG5vdGhpbmcgaW4gdGhlIGRlZmF1bHQgc3RhdGUsIHdoaWNoIGlzIHRoZSBzdGF0ZSBhbnlvbmVcbiAgICAgIC8vIGxhbmRzIGluIGJlZm9yZSBwaWNraW5nIGEgY29sb3VyIHNvdXJjZS5cbiAgICAgIGNvbnN0IGhleCA9IGAjJHtbciwgZywgYl0ubWFwKChjKSA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKX1gO1xuICAgICAgcmV0dXJuIHRvUmdiYVR1cGxlcyhlbmNvZGVDYXRlZ29yaWNhbChuZXcgVWludDE2QXJyYXkoZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQpLCB7XG4gICAgICAgIGNvbG9yczogW2hleF0sXG4gICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgbXV0ZWQsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGNvbnN0IGNvbHVtbjogU3BhdGlhbENvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBlbmNvZGVDYXRlZ29yaWNhbChjb2x1bW4uY29kZXMsIHtcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gR3JvdXBzIHN3aXRjaGVkIG9mZiBpbiB0aGUgQ2VsbHMgcGFuZWwgaGlkZSB0aGVpciBkb3RzIHRvbywgd2hlbiB0aGUgZG90cyBhcmVcbiAgICAgICAgLy8gY29sb3VyZWQgYnkgdGhhdCBzYW1lIGdyb3VwaW5nLlxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgICBpZiAodmlldy5oaWRkZW5Hcm91cHM/Lmxlbmd0aCAmJiBncm91cENvbHVtbiA9PT0gY29sb3JCeS5uYW1lKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LmhpZGRlbkdyb3Vwcyk7XG4gICAgICAgICAgY29uc3QgaGlkZSA9IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMubWFwKChjKSA9PiBvZmYuaGFzKGMpKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbi5jb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbHVtbi5jb2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChjICE9PSBOT19DQVRFR09SWSAmJiBoaWRlW2NdKSByZ2JhWzQgKiBpICsgM10gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKHJnYmEpO1xuICAgICAgfVxuICAgICAgLy8gQSBjb250aW51b3VzIGNvbHVtbiBtYXkgY2FycnkgaXRzIG93biBsb2cgaGludCAoY291bnRzKTsgdGhlIHZpZXcnc1xuICAgICAgLy8gdG9nZ2xlIHdpbnMgb25jZSB0aGUgdXNlciBoYXMgc2V0IGl0LlxuICAgICAgcmV0dXJuIHRvUmdiYVR1cGxlcyh0aGlzLmVuY29kZVNwYXRpYWxDb250aW51b3VzKFxuICAgICAgICBjb2x1bW4udmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLCBtdXRlZCxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0b1JnYmFUdXBsZXModGhpcy5lbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgIHZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSwgbXV0ZWQsXG4gICAgKSk7XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIFJHQkEgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIGFuZCBhIGNsaXBwZWQgd2luZG93LiAqL1xuICBwcml2YXRlIGVuY29kZVNwYXRpYWxDb250aW51b3VzKFxuICAgIHZhbHVlczogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBsb2c6IGJvb2xlYW4sXG4gICAgbXV0ZWQ6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbiAgKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbnRyYXN0V2luZG93KHZhbHVlcywgbG8sIGhpKTtcbiAgICByZXR1cm4gZW5jb2RlQ29udGludW91cyh2YWx1ZXMsIHsgbHV0LCBtaW4sIG1heCwgbG9nLCBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksIG11dGVkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU0NBVFRFUjNEIDNEIHNjYXR0ZXI6IHRoZSBkb3duc2FtcGxlZCB2b3hlbCBncmlkIGFzIGEgM0QgcG9pbnQgY2xvdWQgY29sb3JlZFxuICAgKiBieSBpbnRlbnNpdHkgKG5hcGFyaS1qcyBhbmFsb2cgb2YgUGxvdGx5J3Mgdm94ZWwgc2NhdHRlcjNkKS4gQXNzZW1ibGVzIGEgY29hcnNlIHZvbHVtZSwgdGhlblxuICAgKiBlbWl0cyBhIGZsYXQtc3RyaWRlZCBzYW1wbGUgb2Ygdm94ZWxzIChjYXBwZWQgYXQge0BsaW5rIFNDQVRURVIzRF9NQVhfUE9JTlRTfSkgdmlhIGBhZGRQb2ludHMzRGAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2NhdHRlcjNkKHZpZXdlcjogVmlld2VyLCBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgbGV0IHZvbDogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywge1xuICAgICAgICBtYXhTbGljZTogTWF0aC5taW4ocmVzLm1heFNsaWNlLCBTQ0FUVEVSM0RfTUFYX1hZKSxcbiAgICAgICAgc2xpY2VTdGVwOiByZXMuc2xpY2VTdGVwLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICAgIGlmICghdm9sIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfSA9IHZvbDtcbiAgICBjb25zdCB6U2NhbGUgPSBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSAvIE1hdGgubWF4KDEsIGRlcHRoKTsgLy8g4omIIGN1YmljIGFzcGVjdFxuICAgIGNvbnN0IHRvdGFsID0gd2lkdGggKiBoZWlnaHQgKiBkZXB0aDtcbiAgICBjb25zdCBzdHJpZGUgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG90YWwgLyBTQ0FUVEVSM0RfTUFYX1BPSU5UUykpO1xuICAgIGNvbnN0IHBvczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB2YWw6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIGNvbnN0IHggPSBpICUgd2lkdGg7XG4gICAgICBjb25zdCB5ID0gTWF0aC5mbG9vcihpIC8gd2lkdGgpICUgaGVpZ2h0O1xuICAgICAgY29uc3QgemkgPSBNYXRoLmZsb29yKGkgLyAod2lkdGggKiBoZWlnaHQpKTtcbiAgICAgIHBvcy5wdXNoKHgsIHksIHppICogelNjYWxlKTtcbiAgICAgIHZhbC5wdXNoKGRhdGFbaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIHRoaXMuc2NhdHRlcjNkTGF5ZXIgPSB2aWV3ZXIuYWRkUG9pbnRzM0QobmV3IEZsb2F0MzJBcnJheShwb3MpLCBuZXcgRmxvYXQzMkFycmF5KHZhbCksIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICBzaXplOiAzLFxuICAgIH0pO1xuICAgIHRoaXMuaW1hZ2VXID0gd2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBoZWlnaHQ7XG4gICAgdGhpcy52b2x1bWVEaW1zID0geyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIC8vIEZlZWQgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gZnJvbSB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoa2V5IDApLlxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCBkYXRhKTtcbiAgICB0aGlzLnN1YnNjcmliZVNjYXR0ZXIzZERpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgLyoqIFN0b3JlIGNvbG9ybWFwIC8gcmV2ZXJzZSAvIGludmVydCAvIGNoYW5uZWwgd2luZG93IOKGkiB0aGUgM0Qgc2NhdHRlcidzIGNvbG9ybWFwICsgY29udHJhc3QuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU2NhdHRlcjNkRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHNdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSBsYXllci5jb250cmFzdExpbWl0cyA9IFtzdC5taW4sIHN0Lm1heF07XG4gICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU1VSRkFDRSBoZWlnaHQtZmllbGQgc3VyZmFjZS4gQSBoZWlnaHQgZmllbGQgaXMgc2luZ2xlLXNjYWxhciwgc28gZm9yIGFcbiAgICogbXVsdGljaGFubmVsIGltYWdlIHRoZSBzdXJmYWNlIGZvbGxvd3MgT05FIGJhbmQg4oCUIHRoZSBmaXJzdCB2aXNpYmxlIGNoYW5uZWwgKGZhbGxiYWNrIDApIOKAlFxuICAgKiBjb2xvdXJlZCBieSB0aGF0IGNoYW5uZWwncyB3aW5kb3cvY29sb3JtYXAgKGxpa2UgdGhlIFBsb3RseSBTVVJGQUNFLCB3aGljaCBpcyBncmF5c2NhbGUtb25seSkuXG4gICAqIFByZS1sb2FkcyBldmVyeSBzbGljZSdzIGhlaWdodCBkYXRhIHdpdGggYSBwcm9ncmVzcyBiYXIgKGFzIHRoZSB2b2x1bWUgZG9lcykgc28gdGhlIHN0YWNrXG4gICAqIHNsaWRlciByZS1zbGljZXMgaW5zdGFudGx5LCB0aGVuIGJ1aWxkcyB0aGUgbWVzaCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuIEFsbCBtZXNoICsgR1BVIHdvcmtcbiAgICogbGl2ZXMgaW4gbmFwYXJpLWpzIChgaGVpZ2h0RmllbGRgICsgYFZpZXdlci5hZGRTdXJmYWNlYCk7IHRoaXMgYmFja2VuZCBzdXBwbGllcyBzY2FsYXIgc2xpY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFN1cmZhY2Uodmlld2VyOiBWaWV3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpIGhhcyBubyBkZXNjcmlwdG9yIOKAlCBkZXRlY3RcbiAgICAvLyBpdCBmcm9tIGltYWdlTWV0YSBzbyB0aGUgU3VyZmFjZSBzdGlsbCBmb2xsb3dzIG9uZSBiYW5kLlxuICAgIGNvbnN0IHNpbXBsZU1jID0gdGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbmZvKSAmJiAhIWluZm8/LmNoYW5uZWxVcmxzPy5sZW5ndGhcbiAgICAgICYmIChpbmZvPy5pbWFnZU1ldGE/LlswXT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSBzaW1wbGVNYyB8fCAoISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgKGRlc2M/LmNoYW5uZWxzID8/IDEpID4gMSk7XG4gICAgdGhpcy5zdXJmYWNlTXVsdGljaGFubmVsID0gbXVsdGljaGFubmVsO1xuICAgIC8vIEEgaGVpZ2h0IGZpZWxkIGlzIHNpbmdsZS1zY2FsYXIg4oaSIGZvbGxvdyB0aGUgcGFuZS1TRUxFQ1RFRCBjaGFubmVsLlxuICAgIHRoaXMuc3VyZmFjZUNoYW5uZWwgPSBtdWx0aWNoYW5uZWwgPyB0aGlzLnN0b3JlLmN1cnJlbnRTZWxlY3RlZENoYW5uZWwoKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN1cmZhY2VNYXhHcmlkID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpLm1heEdyaWQ7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIGF3YWl0IHRoaXMucHJlbG9hZFN1cmZhY2VQbGFuZXModmlld2VyKTtcbiAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRTdXJmYWNlKHZpZXdlciwgdGhpcy5sb2FkZWQ/LnogPz8gMCk7XG4gICAgdGhpcy5pbnN0YWxsU3VyZmFjZUF4ZXModmlld2VyKTtcbiAgICAvLyBTdWJzY3JpYmUgYWZ0ZXIgdGhlIGZpcnN0IGJ1aWxkIHNvIGRpc3BsYXktc3RhdGUgZWRpdHMgdGFyZ2V0IGEgbGl2ZSBsYXllci5cbiAgICB0aGlzLnN1YnNjcmliZVN1cmZhY2VEaXNwbGF5U3RhdGUoKTtcbiAgfVxuXG4gIC8qKiBBZGQgdGhlIDNEIGF4ZXMgZ2l6bW8gKyBET00gbGFiZWxzIGFyb3VuZCB0aGUgKG9yaWdpbi1jZW50ZXJlZCkgc3VyZmFjZSBtZXNoLCBtYXRjaGluZyB0aGVcbiAgICogIHZvbHVtZS9pc29zdXJmYWNlLiBJbnN0YWxsZWQgb25jZSBwZXIgbW91bnQ7IHRoZSBib3ggdHJhY2tzIHRoZSBtZXNoIGJvdW5kcywgWC9ZIHNob3cgdGhlXG4gICAqICBwaHlzaWNhbCAob3IgcGl4ZWwpIGV4dGVudCwgYW5kIFogaXMgdGhlIGludGVuc2l0eS9oZWlnaHQgYXhpcy4gKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3VyZmFjZUF4ZXModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3VyZmFjZUxheWVyKSByZXR1cm47XG4gICAgY29uc3QgYiA9IHRoaXMuc3VyZmFjZUxheWVyLmJvdW5kcygpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1heCgxLCBiLm1heFswXSAtIGIubWluWzBdKTtcbiAgICBjb25zdCBib3hIID0gTWF0aC5tYXgoMSwgYi5tYXhbMV0gLSBiLm1pblsxXSk7XG4gICAgY29uc3QgYm94RCA9IE1hdGgubWF4KDEsIGIubWF4WzJdIC0gYi5taW5bMl0pO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIGNvbnN0IHZveGVsID0gbXBwWCA+IDAgPyAobXBwWCAqICh0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IHRoaXMuaW1hZ2VXKSkgLyBNYXRoLm1heCgxLCB0aGlzLmltYWdlVykgOiAxO1xuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMoYm94VywgYm94SCwgYm94RCwge1xuICAgICAgdm94ZWxTaXplOiBbdm94ZWwsIHZveGVsLCAxXSxcbiAgICAgIHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoYm94VywgYm94SCwgYm94RCwgbXBwWCksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFgvWS9aIGVuZC1sYWJlbHMgZm9yIHRoZSBzdXJmYWNlIGdpem1vOiBYL1kgYXJlIHRoZSBwaHlzaWNhbCAowrVtKSBvciBwaXhlbCBleHRlbnQgb2YgdGhlIEZVTExcbiAgICogIGltYWdlOyBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuIEFuY2hvcnMgYXJlIGluIHRoZSBjZW50ZXJlZCBib3ggKG1hdGNoaW5nIEF4ZXNMYXllcikuICovXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlQXhlc0xhYmVscyhcbiAgICBib3hXOiBudW1iZXIsXG4gICAgYm94SDogbnVtYmVyLFxuICAgIGJveEQ6IG51bWJlcixcbiAgICBtcHBYOiBudW1iZXIsXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSBib3hXIC8gMjtcbiAgICBjb25zdCBoeSA9IGJveEggLyAyO1xuICAgIGNvbnN0IGh6ID0gYm94RCAvIDI7XG4gICAgY29uc3QgZGVzY1cgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IHRoaXMuaW1hZ2VXO1xuICAgIGNvbnN0IGRlc2NIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gdGhpcy5pbWFnZUg7XG4gICAgY29uc3QgbGVuID0gKHB4OiBudW1iZXIpOiBzdHJpbmcgPT4gKG1wcFggPiAwID8gZm9ybWF0VW0ocHggKiBtcHBYKSA6IGAke3B4fSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKGRlc2NXKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKGRlc2NIKX1gLCBjb2xvcjogJyM0ZGQ5NTknIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6ICdaIMK3IGludGVuc2l0eScsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1mZXRjaCBldmVyeSBzdGFjayBzbGljZSdzIGx1bWluYW5jZSBwbGFuZSAoZGVjaW1hdGVkIHRvIHRoZSBzdXJmYWNlIGdyaWQpIGludG9cbiAgICoge0BsaW5rIHN1cmZhY2VQbGFuZXN9LCBkcml2aW5nIHtAbGluayBzdGFja0xvYWRpbmdQcm9ncmVzcyR9IOKAlCB0aGUgc2FtZSBsb2FkLXdpdGgtcHJvZ3Jlc3MgVVhcbiAgICogYXMgdGhlIHZvbHVtZSwgYnV0IGtlZXBpbmcgb25lIDJEIHBsYW5lIHBlciBzbGljZSByYXRoZXIgdGhhbiBwYWNraW5nIGEgM0Qgdm9sdW1lLiBCb3VuZGVkXG4gICAqIGNvbmN1cnJlbmN5IGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeSB3aXRob3V0IGZsb29kaW5nIGl0IG9uIGEgZGVlcCBzdGFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlbG9hZFN1cmZhY2VQbGFuZXModmlld2VyOiBWaWV3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGlmIGEgQ2FuY2VsIC8gbmV3IHBsb3QgYnVtcHMgdGhpcyB3aGlsZSB3ZSBmZXRjaFxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGNvbnN0IGRlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgY29uc3QgeyBtYXhHcmlkIH0gPSBzdXJmYWNlUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSk7XG4gICAgdGhpcy5zdXJmYWNlUGxhbmVzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZzogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgZGVwdGg7IHorKykgcGVuZGluZy5wdXNoKHopO1xuICAgICAgbGV0IGRvbmUgPSAwO1xuICAgICAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgeiA9IHBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICBpZiAoeiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5zZXQoeiwgYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCBtYXhHcmlkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2Ugc2xpY2UgJHt6fSBwcmVsb2FkIGZhaWxlZGAsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvbmUrKztcbiAgICAgICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KE1hdGgucm91bmQoKGRvbmUgLyBkZXB0aCkgKiAxMDApKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2wgPSBNYXRoLm1pbihWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1ksIE1hdGgubWF4KDEsIGRlcHRoKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiBwb29sIH0sICgpID0+IHdvcmtlcigpKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHNsaWNlIGB6YCBhcyBhIHNpbmdsZSBXSE9MRS1pbWFnZSBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byBgbWF4R3JpZGApLiBQcmVmZXJzIHRoZVxuICAgKiBhcHAncyBjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgKGBzbWFsbFVybHNgL2B1cmxzYCwgZXhhY3RseSBsaWtlIHRoZSBQbG90bHkgc3VyZmFjZSkgc28gdGhlXG4gICAqIHN1cmZhY2UgYWx3YXlzIGNvdmVycyB0aGUgRlVMTCBzbGljZSDigJQgdGhlIHRpbGUtcHlyYW1pZCBgZmV0Y2hTbGljZWAgcGF0aCB3b3VsZCBmYWxsIGJhY2sgdG8gYVxuICAgKiBzaW5nbGUgdG9wLWxlZnQgdGlsZSAoYSBjb3JuZXIpIGZvciBzZWxmLWNvbnRhaW5lZCAvIG5vbi1gL3RpbGVzL2luZm9gIGltYWdlcy4gRmFsbHMgYmFjayB0b1xuICAgKiBzdGl0Y2hpbmcgdGhlIHRpbGUgZ3JpZCBvbmx5IHdoZW4gbm8gY29tcGxldGUtaW1hZ2UgVVJMIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIC8qKiBUaWxlIGJ1ZGdldCB0byBzdGl0Y2ggYSB3aG9sZSBzbGljZSBhdCB+YHRhcmdldFB4YCByZXNvbHV0aW9uIGZyb20gdGhlIHB5cmFtaWQ6IGEgaGlnaGVyIHRhcmdldFxuICAgKiAgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gU2hhcmVkIGJ5IHRoZSBzdXJmYWNlIHBsYW5lIGZldGNoIGFuZCB0aGUgdm9sdW1lXG4gICAqICBhc3NlbWJseSBzbyBib3RoIHNjYWxlIHRoZWlyIGluLXBsYW5lIHJlc29sdXRpb24gd2l0aCB0aGUgZGVjaW1hdGUgZmFjdG9yLiAqL1xuICBwcml2YXRlIHRpbGVCdWRnZXRGb3IodGFyZ2V0UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLmRlc2NyaXB0b3I/LnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICByZXR1cm4gTWF0aC5taW4oXG4gICAgICBNQVhfU1RJVENIX1RJTEVTLFxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCgodGFyZ2V0UHggLyB0aWxlU2l6ZSkgKiogMiAqIFNUSVRDSF9CVURHRVRfQ09FRkYpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN1cmZhY2VQbGFuZShcbiAgICB6OiBudW1iZXIsXG4gICAgbWF4R3JpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBsZXQgcGxhbmU6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gUHJlZmVycmVkOiBzdGl0Y2ggdGhlIFdIT0xFIHNsaWNlIGZyb20gdGhlIHNlcnZlciBweXJhbWlkIGF0IGEgcmVzb2x1dGlvbiBkcml2ZW4gYnkgdGhlXG4gICAgLy8gZGVjaW1hdGUgZmFjdG9yIOKAlCBhIGhpZ2hlciB0YXJnZXQgZ3JpZCBwdWxscyBhIEZJTkVSIHB5cmFtaWQgbGV2ZWwgKG1vcmUgcmVhbCBkZXRhaWwpLiBXaXRoIGFcbiAgICAvLyBkZXNjcmlwdG9yLCBmZXRjaFNsaWNlIHN0aXRjaGVzIHRoZSB3aG9sZSBjaG9zZW4gbGV2ZWwgKG5ldmVyIGEgY29ybmVyKSwgdGhlbiB3ZSBkb3duc2NhbGUgdG9cbiAgICAvLyB0aGUgZ3JpZC4gVGhpcyBpcyB3aGF0IG1ha2VzIFwiRnVsbFwiIGFjdHVhbGx5IGhpZ2hlci1yZXMgdGhhbiBcIsK9XCIsIG5vdCBqdXN0IGEgZml4ZWQgcHJldmlldy5cbiAgICBpZiAoZGVzYz8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZGdldCA9IHRoaXMudGlsZUJ1ZGdldEZvcihtYXhHcmlkKTtcbiAgICAgIC8vIFRoZSBzdXJmYWNlIGlzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSwgc28gdGhlIGNvbXBvc2l0ZSBmYWxsYmFjayBpcyBhY2NlcHRhYmxlIHdoZW4gdGhlXG4gICAgICAvLyBjaGFubmVsIGhhcyBubyBzbWFsbCBweXJhbWlkIGxldmVsIChrZWVwcyBpdCBmYXN0KTsgYSBtdWx0aWNoYW5uZWwgVk9MVU1FIG11c3Qgbm90IGRvIHRoaXMuXG4gICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB0aGlzLnN1cmZhY2VDaGFubmVsLCBidWRnZXQsIHRydWUpLFxuICAgICAgICBtYXhHcmlkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAobm8gcHlyYW1pZCk6IHRoZSBhcHAncyBDT01QTEVURSBwZXItc2xpY2UgaW1hZ2UgKHVybHNbel0sIG5vdCB0aGUgc21hbGwgYmx1cnJ5XG4gICAgLy8gdGh1bWJuYWlsKSDigJQgd2hvbGUgc2xpY2UsIGF2b2lkcyBhIGNvcm5lciB0aWxlLiBDYXBwZWQgYXQgdGhlIGltYWdlJ3Mgb3duIHJlc29sdXRpb24uXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgY29uc3QgdXJsID0gaW5mbz8udXJscz8uW3pdID8/IGluZm8/LnNtYWxsVXJscz8uW3pdO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICAgICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpLCBtYXhHcmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gc3VyZmFjZSB1cmwgZmV0Y2ggZmFpbGVkIGZvciB6PSR7en1gLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFzdCByZXNvcnQgKG5vIHB5cmFtaWQgYW5kIG5vIGNvbXBsZXRlIGltYWdlKTogYSBzaW5nbGUgdGlsZS5cbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB0aGlzLnN1cmZhY2VDaGFubmVsLCB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCksIHRydWUpLFxuICAgICAgICBtYXhHcmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBsYW5lO1xuICB9XG5cbiAgLyoqIFRoZSBjaGFubmVsIHN0YXRlIGRyaXZpbmcgdGhlIHN1cmZhY2U6IHRoZSBjaG9zZW4gYmFuZCBmb3IgbXVsdGljaGFubmVsIChtYXRjaGVkIGJ5IGluZGV4KSxcbiAgICogIGVsc2UgdGhlIHNpbmdsZSBncmF5c2NhbGUgY2hhbm5lbC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlU3RhdGUoY2hhbm5lbHM6IElDaGFubmVsU3RhdGVbXSk6IElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN1cmZhY2VDaGFubmVsID09IG51bGwpIHJldHVybiBjaGFubmVsc1swXTtcbiAgICByZXR1cm4gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gdGhpcy5zdXJmYWNlQ2hhbm5lbCkgPz8gY2hhbm5lbHNbMF07XG4gIH1cblxuICAvKipcbiAgICogKFJlKWJ1aWxkIHRoZSBzdXJmYWNlIG1lc2ggZm9yIHNsaWNlIGB6YCBmcm9tIHRoZSBwcmUtbG9hZGVkIHBsYW5lIGNhY2hlIChpbnN0YW50IOKAlCB0aGlzIGlzXG4gICAqIHdoYXQgdGhlIHN0YWNrIHNsaWRlciBjYWxscyk7IGEgc2xpY2UgbWlzc2luZyBmcm9tIHRoZSBjYWNoZSBpcyBmZXRjaGVkIG9uIGRlbWFuZC4gbmFwYXJpLWpzJ3NcbiAgICogcHVyZSBgaGVpZ2h0RmllbGRgIGJ1aWxkcyB0aGUgdHJpYW5nbGUgZ3JpZCAoeiA9IG5vcm1hbGl6ZWQgaW50ZW5zaXR5KSwgdGhlbiBgYWRkU3VyZmFjZWBcbiAgICogcmVuZGVycyBpdC4gVGhlIHNsaWNlIHBsYW5lIGFsc28gZmVlZHMgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gKGtleSAwKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRTdXJmYWNlKHZpZXdlcjogVmlld2VyLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcGxhbmUgPSB0aGlzLnN1cmZhY2VQbGFuZXMuZ2V0KHopO1xuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGxhbmUgPSBhd2FpdCB0aGlzLmZldGNoU3VyZmFjZVBsYW5lKHosIHRoaXMuc3VyZmFjZU1heEdyaWQpO1xuICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIHBsYW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlIGZldGNoIGZhaWxlZDonLCBlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXBsYW5lIHx8IHBsYW5lLndpZHRoIDwgMiB8fCBwbGFuZS5oZWlnaHQgPCAyIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHN0ID0gdGhpcy5zdXJmYWNlU3RhdGUodGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpKTtcbiAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgdGhpcy5zdXJmYWNlV2luZG93ID0gd2luO1xuICAgIC8vIEhlaWdodCBBTkQgY29sb3VyIGFyZSBub3JtYWxpemVkIGJ5IHRoZSBzYW1lIGNvbnRyYXN0IHdpbmRvdywgc28gY2hhbmdpbmcgbWluL21heCByZXNoYXBlcyB0aGVcbiAgICAvLyBzdXJmYWNlIChhIHBpeGVsJ3MgaGVpZ2h0ID0gaXRzIGludGVuc2l0eSB3aXRoaW4gW21pbixtYXhdKS4gQ2VudGVyIGl0IGZvciB0aGUgYXhlcyBnaXptby4gVGhlXG4gICAgLy8gcGxhbmUgaXMgYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIGdyaWQgY2FwIOKGkiBzdHJpZGUgMS5cbiAgICBjb25zdCB6U2NhbGUgPSBTVVJGQUNFX1pfQVNQRUNUICogTWF0aC5tYXgocGxhbmUud2lkdGgsIHBsYW5lLmhlaWdodCk7XG4gICAgY29uc3QgeyB2ZXJ0aWNlcywgZmFjZXMsIHZhbHVlcyB9ID0gaGVpZ2h0RmllbGQocGxhbmUuZGF0YSwgcGxhbmUud2lkdGgsIHBsYW5lLmhlaWdodCwge1xuICAgICAgelNjYWxlLFxuICAgICAgekxpbWl0czogd2luLFxuICAgICAgY2VudGVyOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUHJlc2VydmUgdGhlIG9yYml0IGNhbWVyYSBhY3Jvc3MgYSByZS1zbGljZSAvIHdpbmRvdyByZWJ1aWxkIOKAlCBvbmx5IHRoZSBmaXJzdCBtb3VudCBmcmFtZXMsIHNvXG4gICAgLy8gc3RlcHBpbmcgdGhlIHN0YWNrIG9yIGNoYW5naW5nIHRoZSB3aW5kb3cga2VlcHMgdGhlIGN1cnJlbnQgem9vbS9wYW4vb3JpZW50YXRpb24uXG4gICAgY29uc3QgY2FtID0gdmlld2VyLmNhbWVyYTNkO1xuICAgIGNvbnN0IHByZXNlcnZlQ2FtZXJhID0gdGhpcy5zdXJmYWNlTGF5ZXIgIT0gbnVsbDtcbiAgICBjb25zdCBzYXZlZFRhcmdldCA9IGNhbS50YXJnZXQ7XG4gICAgY29uc3Qgc2F2ZWREaXN0YW5jZSA9IGNhbS5kaXN0YW5jZTtcbiAgICBpZiAodGhpcy5zdXJmYWNlTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3VyZmFjZUxheWVyKTtcbiAgICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zdXJmYWNlTGF5ZXIgPSB2aWV3ZXIuYWRkU3VyZmFjZSh2ZXJ0aWNlcywgZmFjZXMsIHZhbHVlcywge1xuICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IHdpbixcbiAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgIHdpcmVmcmFtZTogdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH0pO1xuICAgIGlmIChwcmVzZXJ2ZUNhbWVyYSkge1xuICAgICAgY2FtLnRhcmdldCA9IHNhdmVkVGFyZ2V0O1xuICAgICAgY2FtLmRpc3RhbmNlID0gc2F2ZWREaXN0YW5jZTtcbiAgICB9XG5cbiAgICB0aGlzLmltYWdlVyA9IHBsYW5lLndpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gcGxhbmUuaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IHsgd2lkdGg6IHBsYW5lLndpZHRoLCBoZWlnaHQ6IHBsYW5lLmhlaWdodCwgZGVwdGg6IE1hdGgubWF4KDEsIE1hdGgucm91bmQoelNjYWxlKSkgfTtcbiAgICAvLyBSZXVzZSB0aGUgdm9sdW1lIGludGVuc2l0eS1oaXN0b2dyYW0gcGF0aDogdGhlIHNsaWNlJ3Mgc2NhbGFyIHBsYW5lIGlzIHRoZSBoaXN0b2dyYW0gc291cmNlLlxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCBwbGFuZS5kYXRhKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdGhlIHN0b3JlIGNvbG9ybWFwIC8gcmV2ZXJzZSAvIGludmVydCAvIGNoYW5uZWwgd2luZG93IOKGkiB0aGUgc3VyZmFjZSwgc28gaGlzdG9ncmFtXG4gICAqICAmIGNoYW5uZWwtZGlhbG9nIGVkaXRzIHVwZGF0ZSBpdCBsaXZlIHdpdGhvdXQgYSByZS1mZXRjaC4gKiptaW4vbWF4IHJlc2hhcGVzIHRoZSBzdXJmYWNlJ3NcbiAgICogIGhlaWdodCoqIChhIHBpeGVsJ3MgaGVpZ2h0ID0gaXRzIGludGVuc2l0eSB3aXRoaW4gW21pbixtYXhdKSwgc28gYSB3aW5kb3cgY2hhbmdlIHJlYnVpbGRzIHRoZVxuICAgKiAgbWVzaCBnZW9tZXRyeSAoZnJvbSB0aGUgY2FjaGVkIHNsaWNlKTsgY29sb3VyLW9ubHkgZWRpdHMgKGNvbG9ybWFwL0xVVCwgZ2FtbWEsIHJldmVyc2UsIGludmVydClcbiAgICogIGp1c3QgdXBkYXRlIHRoZSBsYXllcidzIHVuaWZvcm1zLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVN1cmZhY2VEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0U2VsZWN0ZWRDaGFubmVsKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHMsIHNlbGVjdGVkXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMuc3VyZmFjZUxheWVyO1xuICAgICAgaWYgKCFsYXllciB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICAgIC8vIFNlbGVjdGVkIGNoYW5uZWwgY2hhbmdlZCAobXVsdGljaGFubmVsKTogcmUtZmV0Y2ggVEhBVCBiYW5kJ3MgcGxhbmVzIGFuZFxuICAgICAgLy8gcmVidWlsZCB0aGUgaGVpZ2h0LWZpZWxkIGZvciB0aGUgY3VycmVudCBzbGljZS5cbiAgICAgIGlmICh0aGlzLnN1cmZhY2VNdWx0aWNoYW5uZWwgJiYgc2VsZWN0ZWQgIT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zdXJmYWNlQ2hhbm5lbCA9IHNlbGVjdGVkO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcmVsb2FkU3VyZmFjZVBsYW5lcyh0aGlzLnZpZXdlciEpO1xuICAgICAgICAgIGlmICh0aGlzLnZpZXdlcikgYXdhaXQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgICAgICB9KSgpLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHN1cmZhY2UgY2hhbm5lbCBzd2l0Y2ggZmFpbGVkOicsIGVycikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKGNoYW5uZWxzKTtcbiAgICAgIGNvbnN0IHdpbjogW251bWJlciwgbnVtYmVyXSA9IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XTtcbiAgICAgIGNvbnN0IHdpbmRvd0NoYW5nZWQgPVxuICAgICAgICAhdGhpcy5zdXJmYWNlV2luZG93IHx8IHdpblswXSAhPT0gdGhpcy5zdXJmYWNlV2luZG93WzBdIHx8IHdpblsxXSAhPT0gdGhpcy5zdXJmYWNlV2luZG93WzFdO1xuICAgICAgaWYgKHdpbmRvd0NoYW5nZWQpIHtcbiAgICAgICAgLy8gSGVpZ2h0IGZvbGxvd3MgdGhlIGNvbnRyYXN0IHdpbmRvdyDihpIgcmVidWlsZCB0aGUgbWVzaCBmb3IgdGhlIG5ldyBbbWluLG1heF0gKGNhbWVyYSBrZXB0KS5cbiAgICAgICAgdm9pZCB0aGlzLmJ1aWxkU3VyZmFjZSh0aGlzLnZpZXdlciwgdGhpcy5sb2FkZWQ/LnogPz8gMCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIHdpbmRvdyByZWJ1aWxkIGZhaWxlZDonLCBlcnIpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDb2xvdXItb25seSBjaGFuZ2U6IHVwZGF0ZSB1bmlmb3JtcyBpbiBwbGFjZSwgbm8gZ2VvbWV0cnkgcmVidWlsZC5cbiAgICAgIGxheWVyLmNvbG9ybWFwID0gdGhpcy52b2x1bWVDb2xvcm1hcChzdCk7XG4gICAgICBpZiAoc3QpIHtcbiAgICAgICAgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSB3aW47XG4gICAgICAgIGxheWVyLmdhbW1hID0gc3QuZ2FtbWE7XG4gICAgICB9XG4gICAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpdENhbWVyYVNvb24oKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY2FudmFzICYmIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhLmZpdChcbiAgICAgICAgICB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmltYWdlSCxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5pbWFnZUgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJ1bik7XG4gICAgZWxzZSBydW4oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWM7IGhvc3QgcmUtZHJpdmVzIHBsb3QoKSBmcm9tIGl0cyBpbWFnZSBzdHJlYW0uICovXG4gIHJlbG9hZEFuZFBsb3QoKTogdm9pZCB7XG4gICAgLyogbm8tb3AgKi9cbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFRva2VuKys7IC8vIGludmFsaWRhdGUgYW55IGluLWZsaWdodCBmcmFtZSBsb2FkaW5nIGZyb20gdGhlIHByZXZpb3VzIHBsb3RcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRlc3Ryb3koKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgdGhpcy5sb2FkaW5nQmFkZ2U/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZSA9IG51bGw7XG4gICAgdGhpcy50aWxlTG9hZGluZyA9IFtdO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZyA9IDA7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5kZXN0cm95KCk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbnVsbDtcbiAgICB0aGlzLmF4ZXNMYWJlbHM/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmF4ZXNMYWJlbHMgPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVXb3JsZEJhc2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5jbGVhcigpO1xuICAgIHRoaXMudGlsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmY/LigpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSBudWxsO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5kZXRhY2goKTtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3BhdGlhbFN1YiA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IG51bGw7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gbnVsbDtcbiAgICAvLyBJbnZhbGlkYXRlIGFueSBjb2xvdXIgZmV0Y2ggc3RpbGwgaW4gZmxpZ2h0IHNvIGl0IGNhbid0IGF0dGFjaCB0byB0aGUgbmV4dCBzY2VuZS5cbiAgICB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4rKztcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IG51bGw7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lRGltcyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICB9XG5cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF4aXMgcmVzZXQuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWMgYXV0b3NjYWxlLiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5hdXRvc2NhbGVFdmVudCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAqIDEuMztcbiAgfVxuXG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyKSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSA9IHRoaXMudmlld2VyLmNhbWVyYS56b29tIC8gMS4zO1xuICB9XG5cbiAgc2V0RHJhZ01vZGUoX21vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gTm8tb3A6IHBhbiBhbmQgem9vbSBhcmUgYWx3YXlzIHRoZSBuYXBhcmkgY2FtZXJhJ3MgZGVmYXVsdCBnZXN0dXJlcywgYW5kIHBhbi96b29tIGdhdGluZyBmb3JcbiAgICAvLyBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSByZWdpb24gb3ZlcmxheSdzIHNldE1vZGUgKHNldENvbnRyb2xzRW5hYmxlZCkuIFRvZ2dsaW5nIGNvbnRyb2xzIGhlcmVcbiAgICAvLyB3b3VsZCBmaWdodCB0aGF0IOKAlCB0aGUgaG9zdCBjYWxscyBzZXREcmFnTW9kZShmYWxzZSkgYWxvbmdzaWRlIG92ZXJsYXkuc2V0TW9kZSg8dG9vbD4pLlxuICB9XG5cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU21vb3RoaW5nID0gZW5hYmxlZDtcbiAgICAvLyBBcHBseSBsaXZlIHRvIHRoZSByZW5kZXJlZCBpbWFnZSBsYXllcnM7IGJha2VkIGludG8gdGhlIG5leHQgcmVuZGVyIHRvby5cbiAgICB0aGlzLmNoYW5uZWxWaWV3Py5zZXRJbnRlcnBvbGF0aW9uKGVuYWJsZWQgPyAnbGluZWFyJyA6ICduZWFyZXN0Jyk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIHN0YWNrIG5hdmlnYXRlZCB2aWEgc2V0WkluZGV4ICovXG4gIH1cblxuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkZWQpIHRoaXMubG9hZGVkLnogPSB6SW5kZXg7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLm5hdmlnYXRvcikgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6SW5kZXgpO1xuICAgIC8vIFN1cmZhY2U6IG9uZSBzbGljZSDihpIgb25lIG1lc2gsIHNvIHJlLWJ1aWxkIHRoZSBoZWlnaHQgZmllbGQgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2b2lkIHRoaXMuYnVpbGRTdXJmYWNlKHYsIHpJbmRleCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc2V0WkluZGV4IHN1cmZhY2UgZmFpbGVkOicsIGVyciksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBWb2x1bWUgLyBpc29zdXJmYWNlOiBzdGVwIHRoZSB2b2x1bWUncyB6IHBsYW5lIGluIHBsYWNlLlxuICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRpbGVkIDJEIGltYWdlOiBqdXN0IG1vdmUgdGhlIGRpbXMgcGxhbmUg4oCUIHRoZSB0aWxlZCB2aXN1YWwgZmV0Y2hlcyB0aGUgbmV3IHNsaWNlJ3MgdGlsZXNcbiAgICAvLyAoY2FjaGVkIHBlciB6KSwgbm8gbGF5ZXIgcmVidWlsZC4gUmVmcmVzaCB0aGUgY29hcnNlIGhpc3RvZ3JhbSBzYW1wbGUgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMudGlsZWQpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcikgdm9pZCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHpJbmRleCwgdGhpcy5kZXNjcmlwdG9yKTtcbiAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyAyRCBpbWFnZSAoc3RpdGNoIGZhbGxiYWNrKTogcmUtcmVuZGVyIHRoZSBzbGljZSAocmUtZmV0Y2hlcyBwZXItY2hhbm5lbCAvIGNvbXBvc2l0ZSkuIEJyYW5jaFxuICAgIC8vIG9mIGEgdm9sdW1lIGxheWVyIChub3QgY3VycmVudFBsb3RUeXBlLCB3aGljaCBjb3VsZCBiZSBzdGFsZSBhbmQgc2lsZW50bHkgbm8tb3AgdGhlIHN3YXApLlxuICAgIC8vIFRoZSB0b2tlbiBsZXRzIHJlbmRlckltYWdlIGRyb3AgYSBzdXBlcnNlZGVkIHNjcnViIHNvIGEgc2xvdyBvbGRlciBzbGljZSBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLlxuICAgIGNvbnN0IHJlcSA9ICsrdGhpcy5zbGljZVJlcTtcbiAgICB2b2lkIHRoaXMucmVuZGVySW1hZ2UoekluZGV4LCByZXEpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChyZXEgIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgICAgLy8gQUZURVIgdGhlIGltYWdlLCBuZXZlciBiZWZvcmU6IHRoZSByZW5kZXIgY2xlYXJzIHRoZSBsYXllciBsaXN0LCBzb1xuICAgICAgICAvLyBtYXJrZXJzIGRyYXduIGZpcnN0IGFyZSB3aXBlZCBieSB0aGUgdmVyeSBpbWFnZSBtZWFudCB0byBzaXQgdW5kZXIgdGhlbS5cbiAgICAgICAgLy8gT3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGUgcGxhbmUgYWxzbyBkZWNpZGVzIHdoaWNoIG9ic2VydmF0aW9uc1xuICAgICAgICAvLyBhcmUgZHJhd24gYXQgYWxsLCBzbyB0aGlzIGlzIHdoYXQgbW92ZXMgdGhlIGNlbGxzIHdpdGggdGhlIHNlY3Rpb24uXG4gICAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGJ1bXAgdGhlIGxvYWQgZ2VuZXJhdGlvbiBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKztcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCBtID0gbW9kZSA9PT0gJ3BhbicgPyAncGFuJyA6IG1vZGUgPT09ICd6b29tJyA/ICd6b29tJyA6ICdyb3RhdGUnOyAvLyBvcmJpdC90dXJudGFibGUg4oaSIHJvdGF0ZVxuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKG0pO1xuICB9XG5cbiAgLyoqIFJlLWZyYW1lIHRoZSAzRCBjYW1lcmEgb24gdGhlIGN1cnJlbnQgM0QgbGF5ZXIuIEEgc3VyZmFjZSBtZXNoIHNpdHMgaW4gdGhlIHBvc2l0aXZlIG9jdGFudFxuICAgKiAgKG5vdCBjZW50cmVkKSwgc28gZnJhbWUgaXQgYnkgaXRzIG93biBib3VuZHM7IGEgdm9sdW1lL2lzb3N1cmZhY2UgdXNlcyBpdHMgY2VudHJlZCBib3guICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbWVzaExheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXIgPz8gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICBpZiAobWVzaExheWVyKSB7XG4gICAgICBjb25zdCBiID0gbWVzaExheWVyLmJvdW5kcygpO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QudGFyZ2V0ID0gYi5jZW50ZXI7XG4gICAgICB0aGlzLnZpZXdlci5jYW1lcmEzZC5kaXN0YW5jZSA9IE1hdGgubWF4KGIucmFkaXVzICogMi41LCAxZS0zKTtcbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMudm9sdW1lRGltcztcbiAgICBpZiAoZCkgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZnJhbWUoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICAgIC8vIEdhdGVkIGJ5IGByZXF1aXJlc1NwYXRpYWxEYXRhYCwgc28gdGhlIHNlbGVjdG9yIGhpZGVzIGl0IHVudGlsIGEgZGF0YXNldCBpcyBwdWJsaXNoZWQuXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuU1BBVElBTF9PTUlDU10hLFxuICAgIF07XG4gIH1cblxuICAvKiogVGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBmdWxsIOKApiA4ID0g4oWbKS4gUmVhZCBieSB0aGUgdG9vbGJhciB0byBpbml0IHRoZSBjb250cm9sLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uU2NhbGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBkZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMuIFRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCAocmUpbG9hZCDigJQgdGhlIGhvc3RcbiAgICogIHJlLXBsb3RzIGFmdGVyIGNhbGxpbmcgdGhpcywgc2luY2UgZGVjaW1hdGlvbiBjaGFuZ2VzIHRoZSBmZXRjaGVkL2Fzc2VtYmxlZCBkYXRhLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICB9XG5cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KF9kaXZJZDogc3RyaW5nLCBfcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQge1xuICAgIC8qIFBsb3RseSBvd25zIHRoZSBpbnRlbnNpdHkgaW5zZXQgKi9cbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIHByaXZhdGUgYXN5bmMgcnVuUmVhZGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBweCA9IGF3YWl0IHYucmVhZERpc3BsYXllZFBpeGVscygpO1xuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgICBpZiAoc2l6ZSAmJiByZWN0KSB7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoLCByZWN0LngpKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLndpZHRoIC0geCwgcmVjdC53aWR0aCkpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLmhlaWdodCAtIHksIHJlY3QuaGVpZ2h0KSk7XG4gICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcmVhZGJhY2sgdW5hdmFpbGFibGUgKi9cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUmVhZGJhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgIGVsc2Ugc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucnVuUmVhZGJhY2soKSwgMCk7XG4gIH1cblxuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIOKAlCBhcm1lZCBvbiBjYW1lcmEgY2hhbmdlcyBzbyBgbGFzdFBpeGVsc2AgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYVxuICAgKiAgcGFuL3pvb20gc2V0dGxlcyAoYW5kIGFmdGVyIHRpbGVkIGxldmVscyBmaW5pc2ggbG9hZGluZyksIHdoaWNoIHRoZSBvbi1jYW52YXMgcGl4ZWwgdG9vbHNcbiAgICogICh3YW5kL2JydXNoL1NBTSkgcmVhZCBzeW5jaHJvbm91c2x5LiBDb2FsZXNjZXMgcmFwaWQgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBhcm1SZWFkYmFjayhkZWxheU1zID0gMjUwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgICB2b2lkIHRoaXMucnVuUmVhZGJhY2soKTtcbiAgICB9LCBkZWxheU1zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmUgKyBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUgLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBQaXhlbCB0b29sczogcmV1c2UgdGhlIHNoYXJlZCwgYmFja2VuZC1hZ25vc3RpYyB0b29sIHNlcnZpY2VzIHdpdGggYSBuYXBhcmkgaG9zdCDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQnVpbGQgdGhlIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgdG9vbCBob3N0cyBmb3IgdGhlIGN1cnJlbnQgdmlld2VyIChjYWxsZWQgZnJvbSBwbG90KCkpLiBUaGVcbiAgICogIHBpeGVsIHRvb2xzIHJlYWQgZGlzcGxheWVkIHBpeGVscyBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgYW5kIGNvbnZlcnQgcG9pbnRlclxuICAgKiAgY29vcmRzIHZpYSB0aGUgbmFwYXJpIGNhbWVyYSwgZXhhY3RseSBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiAqL1xuICBwcml2YXRlIGJ1aWxkVG9vbEhvc3RzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE5hcGFyaUNvb3JkaW5hdGVUcmFuc2Zvcm0oXG4gICAgICB0aGlzLnZpZXdlcixcbiAgICAgICgpID0+ICEhdGhpcy52aWV3ZXIgJiYgdGhpcy5pbWFnZVcgPiAwLFxuICAgICk7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uU3RvcmU7XG4gICAgdGhpcy53YW5kSG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGdldENhY2hlZEltYWdlRGF0YTogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKSxcbiAgICAgIGdldEFjdGl2ZUZyYW1lSW5kZXg6ICgpID0+IHRoaXMubG9hZGVkPy56ID8/IDAsXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMubG9hZGVkPy5maWxlbmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHJlZ2lvbnMuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9ucy5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocikgPT4gcmVnaW9ucy5zZXRSZWdpb25zKHIpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuaG9zdCxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRDYWNoZWRJbWFnZVJhdGlvOiAoKSA9PiB0aGlzLmNhY2hlZEltYWdlRGF0YSgpPy5yYXRpb3NbMF0gPz8gMSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB6b29tQm94SG9zdCgpOiBab29tVG9Cb3hUb29sSG9zdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFBsb3REaXY6ICgpID0+IHRoaXMucGxvdERpdklkLFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuaG9zdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXJlY3QpIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2IHx8ICF0aGlzLmNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdztcbiAgICBjb25zdCB2aCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCB8fCBoO1xuICAgIHYuY2FtZXJhLmNlbnRlciA9IFsoeDAgKyB4MSkgLyAyLCAoeTAgKyB5MSkgLyAyXTtcbiAgICB2LmNhbWVyYS56b29tID0gTWF0aC5taW4odncgLyB3LCB2aCAvIGgpO1xuICAgIHYucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIENhY2hlZEltYWdlRGF0YSBmcm9tIHRoZSBtb3N0IHJlY2VudCByZWFkYmFjayAoUkdCQSBkZXZpY2UgcGl4ZWxzIOKGkiBbeV1beF09W3IsZyxiXSksXG4gICAqICB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHMg4oaUIHJlYWRiYWNrIHBpeGVscy4gQ2FjaGVkIHVudGlsIHRoZSByZWFkYmFjayBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlRGF0YSgpOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsIHtcbiAgICBjb25zdCBweCA9IHRoaXMubGFzdFBpeGVscztcbiAgICBpZiAoIXB4IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuY2FjaGVkSW1hZ2UgJiYgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9PT0gcHgpIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICAgIGNvbnN0IHcgPSBweC53aWR0aDtcbiAgICBjb25zdCBoID0gcHguaGVpZ2h0O1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXVtdID0gbmV3IEFycmF5KGgpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICBjb25zdCByb3c6IG51bWJlcltdW10gPSBuZXcgQXJyYXkodyk7XG4gICAgICBjb25zdCBiYXNlID0geSAqIHcgKiA0O1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgY29uc3QgbyA9IGJhc2UgKyB4ICogNDtcbiAgICAgICAgcm93W3hdID0gW2RhdGFbb10sIGRhdGFbbyArIDFdLCBkYXRhW28gKyAyXV07XG4gICAgICB9XG4gICAgICBtYXRyaXhbeV0gPSByb3c7XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgcmVjdCBjYXB0dXJlZCBXSVRIIHRoaXMgcmVhZGJhY2sgKG5vdCB0aGUgbGl2ZSBvbmUpIHNvIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlXG4gICAgLy8gbWF0cml4J3MgY2FtZXJhIOKAlCBvdGhlcndpc2UgYSBwYW4vem9vbSBzaW5jZSB0aGUgcmVhZGJhY2sgbWlzLXNjYWxlcyB0aGUgdHJhY2VkIHJlZ2lvbi5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5sYXN0UGl4ZWxzUmVjdCA/PyB0aGlzLnZpZXdlci52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZSA9IHtcbiAgICAgIGZyYW1lczogW21hdHJpeF0sXG4gICAgICB3aWR0aDogdyxcbiAgICAgIGhlaWdodDogaCxcbiAgICAgIHJhdGlvczogW3JlY3Qud2lkdGggLyB3LCByZWN0LmhlaWdodCAvIGhdLFxuICAgICAgaXNHcmF5c2NhbGU6IGZhbHNlLFxuICAgICAgb3JpZ2luWDogcmVjdC54LFxuICAgICAgb3JpZ2luWTogcmVjdC55LFxuICAgIH07XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IHB4O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICB9XG5cbiAgLy8g4pSA4pSAIElUb29sQ29udHJvbGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAvLyBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gIC8vIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmFybVJlYWRiYWNrKDApO1xuICAgIGlmICh0aGlzLndhbmRIb3N0KSB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRPcHRpb25zKChvcHRpb25zID8/IHt9KSBhcyB1bmtub3duIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBCcnVzaE9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zID8/IHt9KTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG5cbi8qKlxuICogQWRkaXRpdmVseSBjb21wb3NpdGUgZ3JheXNjYWxlIGNoYW5uZWwgaW1hZ2VzLCBlYWNoIHRpbnRlZCB3aXRoIGl0cyBkaXNwbGF5IGNvbG91ciDigJRcbiAqIHRoZSBuYXZpZ2F0b3IncyBwaWN0dXJlIG9mIGEgbXVsdGljaGFubmVsIGltYWdlLlxuICovXG5mdW5jdGlvbiB0aW50ZWRDb21wb3NpdGUoaW1hZ2VzOiBJbWFnZUJpdG1hcFtdLCBjb2xvcnM6IHN0cmluZ1tdKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICBjb25zdCB3ID0gaW1hZ2VzWzBdPy53aWR0aCA/PyAxO1xuICBjb25zdCBoID0gaW1hZ2VzWzBdPy5oZWlnaHQgPz8gMTtcbiAgY29uc3Qgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIG91dC53aWR0aCA9IHc7XG4gIG91dC5oZWlnaHQgPSBoO1xuICBjb25zdCBjdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSE7XG4gIGN0eC5maWxsU3R5bGUgPSAnIzAwMCc7XG4gIGN0eC5maWxsUmVjdCgwLCAwLCB3LCBoKTtcbiAgY29uc3QgdG1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIHRtcC53aWR0aCA9IHc7XG4gIHRtcC5oZWlnaHQgPSBoO1xuICBjb25zdCB0ID0gdG1wLmdldENvbnRleHQoJzJkJykhO1xuICBpbWFnZXMuZm9yRWFjaCgoaW1nLCBpKSA9PiB7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICAgIHQuZHJhd0ltYWdlKGltZywgMCwgMCwgdywgaCk7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnbXVsdGlwbHknO1xuICAgIHQuZmlsbFN0eWxlID0gY29sb3JzW2ldO1xuICAgIHQuZmlsbFJlY3QoMCwgMCwgdywgaCk7XG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdsaWdodGVyJztcbiAgICBjdHguZHJhd0ltYWdlKHRtcCwgMCwgMCk7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuIl19