@jax-data-science/sci-image-visualizer 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm2022/index.mjs +4 -1
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +70 -2
  4. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -2
  5. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +11 -1
  6. package/esm2022/lib/region-editor/region-editor.component.mjs +46 -41
  7. package/esm2022/lib/region-import/label-volume.mjs +35 -4
  8. package/esm2022/lib/region-import/ome-zarr-labels.mjs +253 -0
  9. package/esm2022/lib/region-import/open-annotations.mjs +289 -0
  10. package/esm2022/lib/region-import/zarr-codecs.mjs +167 -0
  11. package/esm2022/lib/region-import/zip.mjs +157 -0
  12. package/esm2022/lib/routing-visualizer.service.mjs +20 -7
  13. package/esm2022/lib/visualizer/region-load.mjs +16 -1
  14. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs} +1050 -50
  15. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs.map +1 -0
  16. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs} +4 -2
  17. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs.map} +1 -1
  18. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -1
  19. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  20. package/index.d.ts +6 -0
  21. package/lib/contracts/image.contract.d.ts +7 -0
  22. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +40 -1
  23. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +5 -0
  24. package/lib/region-editor/region-editor.component.d.ts +5 -4
  25. package/lib/region-import/label-volume.d.ts +4 -0
  26. package/lib/region-import/ome-zarr-labels.d.ts +36 -0
  27. package/lib/region-import/open-annotations.d.ts +73 -0
  28. package/lib/region-import/zarr-codecs.d.ts +14 -0
  29. package/lib/region-import/zip.d.ts +31 -0
  30. package/lib/routing-visualizer.service.d.ts +9 -1
  31. package/package.json +2 -1
  32. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +0 -1
@@ -84,8 +84,14 @@ export class RoutingVisualizerService {
84
84
  this.napariFellBack = false;
85
85
  /** The div the backends render into (every backend shares it); '' before the first plot. */
86
86
  this.plotDiv = '';
87
- /** Whether a napari volume view is the current plot type. */
87
+ /**
88
+ * Whether regions can be shown in 3D on screen: a napari volume (or isosurface) view, or the 3D
89
+ * spatial cloud over a stack image (its reference volume's, see showVolumeAsImage). Both draw the
90
+ * region reconstructions the same way (VolumeRegionMeshes), in the volume's box.
91
+ */
88
92
  this.volumeView$ = new BehaviorSubject(false);
93
+ /** Whether a napari volume (or isosurface) view is the current plot type: the slice pane's. */
94
+ this.imageVolumeView = false;
89
95
  /** Whether the volume view's slice pane is wanted (see {@link setSliceEditor}). */
90
96
  this.sliceEditor$ = new BehaviorSubject(false);
91
97
  /** Whether the volume view draws the region reconstructions through the volume. */
@@ -311,13 +317,13 @@ export class RoutingVisualizerService {
311
317
  }
312
318
  plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace) {
313
319
  this.currentPlotType = plotType;
314
- this.volumeView$.next(isNapariVolume(plotType) || isNapariIsosurface(plotType));
315
320
  this.plottedFileName = imageInfo?.fileName;
316
321
  this.plottedInfo = imageInfo ?? null;
317
322
  this.plottedHeight = screenHeight;
323
+ this.updateVolumeView(plotType);
318
324
  // The slice pane belongs to the volume view: another plot type takes it down (OSD may be
319
325
  // about to draw the main view, which must not find the pane's viewer still mounted).
320
- if (!this.volumeView$.value)
326
+ if (!this.imageVolumeView)
321
327
  this.unmountSlice();
322
328
  // Region surfaces belong to the image they were built from: another image drops them.
323
329
  if (this.classes3d$.value.length && this.plottedFileName !== this.classes3dImage)
@@ -340,7 +346,7 @@ export class RoutingVisualizerService {
340
346
  }
341
347
  this.lastRendered = next;
342
348
  const plotted = next.plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace);
343
- if (!this.sliceDiv || !this.volumeView$.value)
349
+ if (!this.sliceDiv || !this.imageVolumeView)
344
350
  return plotted;
345
351
  // The split volume view: the slice pane follows the image (a new one, or its sharper pass).
346
352
  return plotted.then((ok) => {
@@ -372,7 +378,7 @@ export class RoutingVisualizerService {
372
378
  async mountSlice(inPlace) {
373
379
  const div = this.sliceDiv;
374
380
  const info = this.plottedInfo;
375
- if (!div || !info?.urls?.length || !this.volumeView$.value)
381
+ if (!div || !info?.urls?.length || !this.imageVolumeView)
376
382
  return false;
377
383
  const request = ++this.sliceRequest;
378
384
  try {
@@ -494,7 +500,7 @@ export class RoutingVisualizerService {
494
500
  }
495
501
  setPlotType(plotType) {
496
502
  this.currentPlotType = plotType;
497
- this.volumeView$.next(isNapariVolume(plotType) || isNapariIsosurface(plotType));
503
+ this.updateVolumeView(plotType);
498
504
  this.plotly.setPlotType(plotType);
499
505
  }
500
506
  /** @deprecated Use `getSurface3dControls()`. */
@@ -797,6 +803,13 @@ export class RoutingVisualizerService {
797
803
  this.regionStore.setRegionStyle(patch);
798
804
  }
799
805
  // ── Regions in 3D: their reconstructions shown in the volume view ─────
806
+ /** Recompute which 3D view is on screen for `plotType` (see {@link volumeView$}). */
807
+ updateVolumeView(plotType) {
808
+ this.imageVolumeView = isNapariVolume(plotType) || isNapariIsosurface(plotType);
809
+ const regions3d = this.imageVolumeView || (isSpatialOmics3d(plotType) && !!this.plottedInfo?.isStack);
810
+ // Every plot, as before: the Region Editor drops its per-class volumes on each (a new image).
811
+ this.volumeView$.next(regions3d);
812
+ }
800
813
  /** Whether a napari volume (or isosurface) view is on screen: regions can be shown in 3D. */
801
814
  getVolumeView$() {
802
815
  return this.volumeView$.asObservable();
@@ -1296,4 +1309,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1296
1309
  type: Inject,
1297
1310
  args: [SPATIAL_DATA_PORT]
1298
1311
  }] }] });
1299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUl4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztB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QUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7OEdBOXhDVSx3QkFBd0IsbUtBb0V6QixVQUFVLG9IQU9WLGlCQUFpQjtrSEEzRWhCLHdCQUF3QixjQURYLE1BQU07OzJGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxRTdCLE1BQU07MkJBQUMsVUFBVTs7MEJBTWpCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHJlc29sdmVDb2xvcm1hcCB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUG9seWdvbiwgUmVnaW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IENsYXNzUHJlc2V0LCBQcmVzZXRTZXQgfSBmcm9tICcuL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgUGxvdGx5U2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL3Bsb3RseS9wbG90bHkuc2VydmljZSc7XG5pbXBvcnQgeyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVZvbHVtZSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaWV3ZXJCYWNrZW5kLFxuICBJVmlzdWFsaXplcixcbiAgTG9hZGVkSW1hZ2UsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG4gIElTcGF0aWFsQ29udHJvbHMsXG4gIElJbnRlbnNpdHlTYW1wbGluZyxcbiAgSU9zZFZpZXdPcHRpb25zLFxuICBJVm9sdW1lUmVzb2x1dGlvbixcbn0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgQ2FudmFzVG9vbE9wdGlvbnMsIENvbG9ybWFwTm9kZSwgSUJydXNoT3B0aW9ucywgSVdhbmRPcHRpb25zIH0gZnJvbSAnLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblNjb3BlQ2FjaGUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zY29wZS1jYWNoZSc7XG5pbXBvcnQgeyBSRUdJT05fU09VUkNFX01JTl9DSEFSUywgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25JbmRleFBhZ2UsIFJlZ2lvbkluZGV4UXVlcnkgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsSGlzdG9ncmFtQXBpLCBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbFRpbnRDb2xvcm1hcCwgdm9sdW1lQ29sb3JtYXAgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlU2VydmljZSB9IGZyb20gJy4vaW50ZW5zaXR5L2ludGVuc2l0eS1wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbmdlZENsYXNzZXMsIGNsYXNzU2lnbmF0dXJlcyB9IGZyb20gJy4vc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcyc7XG5pbXBvcnQgeyBWb2x1bWVTZWN0aW9ucyB9IGZyb20gJy4vdmlzdWFsaXplci92b2x1bWUtc2VjdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcblxuLyoqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGVkaXQgdGhlIHN1cmZhY2VzIG9mIHRoZSBjbGFzc2VzIGl0IHRvdWNoZWQgYXJlIHJlYnVpbHQgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TID0gNjAwO1xuXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiB7IGtpbmQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqXG4gKiBUaGUgdmlzdWFsaXplciBjaGFpbidzIGZyb250IGRvb3I6IGltcGxlbWVudHMgYElWaXN1YWxpemVyYCwgYElSZWdpb25FZGl0b3JBcGlgXG4gKiBhbmQgYElDaGFubmVsSGlzdG9ncmFtQXBpYCAoYm91bmQgdG8gdGhlIGBWSVNVQUxJWkVSYCAvIGBSRUdJT05fRURJVE9SX0FQSWAgL1xuICogYENIQU5ORUxfSElTVE9HUkFNX0FQSWAgdG9rZW5zKSBvdmVyIHRocmVlIHJlbmRlcmluZyBiYWNrZW5kcywgY2hvc2VuIHBlciBwbG90IHR5cGU6XG4gKiAgLSAqKkltYWdlKiogcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24gKG5hdGl2ZWx5IHRpbGVkLCByZWdpb24gdG9vbHMsXG4gKiAgICBjbGllbnQtc2lkZSBjb2xvcm1hcCksIG9yIHRocm91Z2ggbmFwYXJpLWpzIHdoZW4gYFZpekNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcmBcbiAqICAgIG9wdHMgaW47IHRoZSBuYXBhcmkgaW1hZ2UgdHlwZXMgYW5kIHRoZSAyRCBzcGF0aWFsLW9taWNzIG1vZGUgcmVuZGVyIHRocm91Z2hcbiAqICAgIG5hcGFyaS1qcy4gQSBmYWlsZWQgbG9hZCBmYWxscyBiYWNrIG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seVxuICogICAgKHNlZSBgbmFwYXJpRmVsbEJhY2tgIC8gYG9zZEZlbGxCYWNrYCwgY2xlYXJlZCBieSBgcmVzZXQoKWApLlxuICogIC0gdGhlIG5hcGFyaSAzRCB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlLCBzdXJmYWNlLCAzRCBzY2F0dGVyLCB0aGUgM0Qgc3BhdGlhbFxuICogICAgY2xvdWQpIHJlbmRlciB0aHJvdWdoIG5hcGFyaS1qcywgZmFsbGluZyBiYWNrIHRvIFBsb3RseS5cbiAqICAtIGV2ZXJ5IG90aGVyIHBsb3QgdHlwZSAoaGVhdG1hcCwgY29udG91ciwgc3VyZmFjZSwgc2NhdHRlciwgbGluZSwg4oCmKSByZW5kZXJzXG4gKiAgICB0aHJvdWdoIFBsb3RseS5cbiAqXG4gKiBPbmx5IHJlbmRlcmluZyBhbmQgdGhlIHZpZXdwb3J0IGFyZSByb3V0ZWQgdG8gdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBSZWdpb24gc3RhdGVcbiAqIGxpdmVzIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCBhbmQgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIGNoYW5uZWxzLCBwcmVzZXRzLFxuICogc3BhdGlhbCB2aWV3KSBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgLCBzbyBldmVyeSBiYWNrZW5kIHNlZXMgdGhlIHNhbWVcbiAqIHZhbHVlczsgdGhlIGJhY2tlbmRzIHN1YnNjcmliZSB0byB0aGVtIHRvIHJlZHJhdy5cbiAqXG4gKiBQYWNrYWdlLWludGVybmFsOiBob3N0cyBkZXBlbmQgb24gdGhlIHRva2Vucywgbm90IG9uIHRoaXMgY2xhc3MuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaWV3ZXJCYWNrZW5kIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIGxhc3QgcGxvdHRlZCAobmFtZXMgYSBHZW9KU09OIGV4cG9ydCkuICovXG4gIHByaXZhdGUgcGxvdHRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZGl2IHRoZSBiYWNrZW5kcyByZW5kZXIgaW50byAoZXZlcnkgYmFja2VuZCBzaGFyZXMgaXQpOyAnJyBiZWZvcmUgdGhlIGZpcnN0IHBsb3QuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgdmlldyBpcyB0aGUgY3VycmVudCBwbG90IHR5cGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdm9sdW1lVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKHNlZSB7QGxpbmsgc2V0U2xpY2VFZGl0b3J9KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbGljZUVkaXRvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3IGRyYXdzIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25zVGhyb3VnaFZvbHVtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgYnVpbHQgc28gZmFyLCBieSBpbWFnZSwgcmVzb2x1dGlvbiBhbmQgY2xhc3NlcyAod2l0aCB0aG9zZSBjbGFzc2VzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNoQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBtZXNoOiBNZXNoOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9PigpO1xuICAvKiogQnVtcGVkIHBlciB7QGxpbmsgc2hvd1JlZ2lvbkNsYXNzZXMzZH0gKGFuZCBwZXIgbmV3IGltYWdlKSwgc28gb25seSB0aGUgbGF0ZXN0IG9uZSBzaG93cy4gKi9cbiAgcHJpdmF0ZSBtZXNoUmVxdWVzdCA9IDA7XG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNELCBhbmQgdGhlIGltYWdlIHRoZXkgYmVsb25nIHRvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsYXNzZXMzZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfT4+KFxuICAgIFtdLFxuICApO1xuICBwcml2YXRlIGNsYXNzZXMzZEltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZ3JvdXBzIGxhc3QgYXNrZWQgZm9yIGluIDNELCB3aXRoIHRoZWlyIGNvbG91cnM6IHdoYXQgYW4gZWRpdCdzIHJlYnVpbGQgc2hvd3MgYWdhaW4uICovXG4gIHByaXZhdGUgc2hvd24zZDogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4gPSBbXTtcbiAgLyoqXG4gICAqIEVhY2ggY2xhc3MncyBmaW5nZXJwcmludCBvbiB0aGUgbGl2ZSBzbGljZSAoc2VlIGNsYXNzU2lnbmF0dXJlcyksIHdoaWNoIGltYWdlIGFuZCBzbGljZSwgYW5kXG4gICAqIHdoYXQgdGhlIHJlZ2lvbiBzb3VyY2VzIGhvbGQgKHNlZSBSZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSkuIE51bGwgd2hpbGUgbm90aGluZyBmb2xsb3dzXG4gICAqIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCwgbm8gc2VjdGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXZlQ2xhc3NlczogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBlbmRpbmcgcmVidWlsZCBvZiB0aGUgc3VyZmFjZXMgYW4gZWRpdCB0b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYnVpbGRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25VcGRhdGVzOiBTdWJzY3JpcHRpb247XG5cbiAgLy8g4pSA4pSAIFRoZSBzbGljZSBwYW5lICh0aGUgdm9sdW1lIHZpZXcncyBzcGxpdCk6IE9TRCBlZGl0aW5nIG9uZSBzbGljZSBiZXNpZGUgdGhlIDNEIHZpZXcg4pSA4pSAXG4gIC8qKiBUaGUgZGl2IHRoZSBzbGljZSBwYW5lIHJlbmRlcnMgaW50byB3aGlsZSBpdCBpcyB3YW50ZWQgKG51bGw6IG5vIHNwbGl0KS4gKi9cbiAgcHJpdmF0ZSBzbGljZURpdjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIE9TRCBpcyBtb3VudGVkIGluIHRoZSBzbGljZSBwYW5lOiByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgZ28gdG8gaXQuICovXG4gIHByaXZhdGUgc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIHNsaWNlIHBhbmUgc2hvd3MuICovXG4gIHByaXZhdGUgc2xpY2VGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBCdW1wZWQgcGVyIHNsaWNlLXBhbmUgbW91bnQgb3IgdGVhcmRvd24sIHNvIG9ubHkgdGhlIGxhdGVzdCBvbmUgbGFuZHMuICovXG4gIHByaXZhdGUgc2xpY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmVzIHggYW5kIHkgdGhyb3VnaCB0aGUgc3RhY2spLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zOiBWb2x1bWVTZWN0aW9ucztcbiAgLyoqIFRoZSB6IHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHNsaWNlIHRvIHNob3cgKHNlZSB7QGxpbmsgZ2V0U2xpY2VEcmFnJH0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRHJhZyQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvblN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUaGUgaW1hZ2UgaW5mbyBhbmQgc2NyZWVuIGhlaWdodCBvZiB0aGUgbGFzdCBwbG90ICh3aGF0IHRoZSBzbGljZSBwYW5lIG1vdW50cykuICovXG4gIHByaXZhdGUgcGxvdHRlZEluZm86IElJbWFnZUluZm8gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHJlZ2lvbiBpbXBvcnQgKHNlZSByZWdpb25JbXBvcnRUaWNrZXQpOiBpdHMgaWQgYW5kIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldDogeyBpZDogbnVtYmVyOyBpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7IGlkOiAwLCBpbWFnZTogdW5kZWZpbmVkIH07XG4gIHByaXZhdGUgcGxvdHRlZEhlaWdodCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbG90bHk6IFBsb3RseVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvc2Q6IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIG5hcGFyaTogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogYSBob3N0IHRoYXQgc2VydmVzIG5vIHNwYXRpYWwtb21pY3MgZGF0YSBiaW5kcyBub3RoaW5nLFxuICAgIC8vIGFuZCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHRoZW4gcmV0dXJucyBudWxsLlxuICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBwcml2YXRlIGludGVuc2l0eTogSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKVxuICAgIHByaXZhdGUgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25SZWdpb25zQ2hhbmdlZCgpKTtcbiAgICB0aGlzLnNlY3Rpb25zID0gbmV3IFZvbHVtZVNlY3Rpb25zKHtcbiAgICAgIHZvbHVtZTogKCkgPT4gdGhpcy5uYXBhcmkudm9sdW1lVm94ZWxzKCksXG4gICAgICBpbWFnZTogKCkgPT4gdGhpcy5wbG90dGVkRmlsZU5hbWUsXG4gICAgICBzaG93UGxhbmVzOiAocGxhbmVzKSA9PiB0aGlzLm5hcGFyaS5zZXRTbGljZVBsYW5lcyhwbGFuZXMpLFxuICAgICAgb3V0bGluZXNCeUNsYXNzOiAobGV2ZWwpID0+IHRoaXMucmVnaW9uU3RvcmUub3V0bGluZXNCeUNsYXNzKGxldmVsKSxcbiAgICAgIGlzQ2xhc3NIaWRkZW46IChsYWJlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5pc0NsYXNzSGlkZGVuKGxhYmVsKSxcbiAgICAgIGNvbG9yT2Y6IChsYWJlbCkgPT4gdGhpcy5jbGFzc0NvbG9yKGxhYmVsKSxcbiAgICAgIGNoYW5uZWxTdGF0ZXM6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIGNvbG9ybWFwOiAoc3QsIG11bHRpY2hhbm5lbCkgPT4ge1xuICAgICAgICAvLyBBcyB0aGUgdm9sdW1lIHNjZW5lIGNvbG91cnMgdGhlIGNoYW5uZWwgKGludmVydCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUgY29sb3JtYXApLlxuICAgICAgICBjb25zdCBkaXNwbGF5ID0ge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpLFxuICAgICAgICAgIHJldmVyc2U6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICAgIGludmVydDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29sb3JtYXAoXG4gICAgICAgICAgbXVsdGljaGFubmVsID8gY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnLCBkaXNwbGF5KSA6IHZvbHVtZUNvbG9ybWFwKHN0LCBkaXNwbGF5KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBpbnZlcnQ6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudEludmVydCgpLFxuICAgICAgc2xpY2U6ICgpID0+IHRoaXMuY3VycmVudFpJbmRleCxcbiAgICB9KTtcbiAgICAvLyBBIHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHogcGxhbmUgcGlja3MgdGhlIHNsaWNlICh0aHJvdWdoIHRoZSBob3N0J3Mgc2xpZGVyLCBzb1xuICAgIC8vIHRoZSBzdG9yZSBhbmQgdGhlIHNsaWNlIHBhbmUgZm9sbG93KSwgdGhlIG90aGVycyBtb3ZlIHRoZWlyIHNlY3Rpb24uXG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQoXG4gICAgICB0aGlzLm5hcGFyaS5nZXRTbGljZVBsYW5lTW92ZSQoKS5zdWJzY3JpYmUoKHsgYXhpcywgdmFsdWUgfSkgPT4ge1xuICAgICAgICBpZiAoYXhpcyA9PT0gJ3onKSB0aGlzLnNsaWNlRHJhZyQubmV4dChNYXRoLnJvdW5kKHZhbHVlKSk7XG4gICAgICAgIGVsc2UgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCB2YWx1ZSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldEludmVydCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldENvbG9ybWFwKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICB9XG5cbiAgLyoqIEEgY2xhc3MncyBjb2xvdXI6IGl0cyBjbGFzc2lmaWNhdGlvbiBjb2xvdXIsIGVsc2UgaXRzIHJlZ2lvbiBzb3VyY2UncywgZWxzZSBhIGRlZmF1bHQuICovXG4gIHByaXZhdGUgY2xhc3NDb2xvcihsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdG9yZS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpLmdldChsYWJlbCkgPz9cbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldygpPy5jb2xvck9mKHsgbGFiZWwsIGNvbG9yOiBudWxsIH0pID8/XG4gICAgICAnI2ZmY2MwMCdcbiAgICApO1xuICB9XG5cbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3IChudWxscyB3aGlsZSBpdCBpcyBub3Qgc3BsaXQpLiAqL1xuICBnZXRTZWN0aW9uVmlld3MkKCk6IE9ic2VydmFibGU8U2VjdGlvblZpZXdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbnMuZ2V0Vmlld3MkKCk7XG4gIH1cblxuICAvKiogTW92ZSBhIHNlY3Rpb24ncyBwbGFuZSB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZShheGlzOiBTZWN0aW9uQXhpcywgYXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VjdGlvbnMuc2V0UGxhbmUoYXhpcywgYXQpO1xuICB9XG5cbiAgLyoqIFRoZSBzbGljZSBwaWNrZWQgYnkgZHJhZ2dpbmcgdGhlIHogcGxhbmUgaW4gdGhlIHZvbHVtZTogdGhlIGhvc3Qgc2hvd3MgaXQgKGl0cyBzbGlkZXIpLiAqL1xuICBnZXRTbGljZURyYWckKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VEcmFnJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbWFnZVR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdCA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogVGhlIDJEIG5hcGFyaSB0eXBlcyAoaW1hZ2UsIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyLCBzcGF0aWFsIG9taWNzKSDigJQgYSAyRCBmYWxsYmFjayBjaGFpblxuICAgKiAgKE9TRCwgdGhlbiBQbG90bHkpLlxuICAgKlxuICAgKiAgTk9URSBmb3IgU1BBVElBTF9PTUlDUzogb25seSBuYXBhcmktanMgZHJhd3MgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMuIElmIGl0IGZhaWxzIChubyBXZWJHUFUsXG4gICAqICBkZXZpY2UgbG9zcykgdGhlIGZhbGxiYWNrIHJlbmRlcnMgdGhlIHRpc3N1ZSBpbWFnZSBBTE9ORSDigJQgdGhlIHNwYXRpYWwgbGF5ZXIgaXMgYWJzZW50LCBub3RcbiAgICogIGRlZ3JhZGVkLiBUaGF0IGlzIGRlbGliZXJhdGUgZm9yIG5vdzogc2hvd2luZyB0aGUgc2xpZGUgYmVhdHMgc2hvd2luZyBub3RoaW5nLCBhbmQgYSBQbG90bHlcbiAgICogIGBzY2F0dGVyZ2xgIHNwYXRpYWwgbW9kZSBpcyB0aGUgcGxhbm5lZCByZWFsIGZhbGxiYWNrIChzZWUgdGhlIHBsb3QtbW9kZSBkZXNpZ24gZG9jKS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaUltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmlTY2F0dGVyKHQpIHx8IGlzU3BhdGlhbE9taWNzKHQpO1xuICB9XG5cbiAgLyoqIFRoZSAzRCBuYXBhcmkgdHlwZXMgKHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2Uvc2NhdHRlciwgcGx1cyB0aGUgM0Qgc3BhdGlhbCBjbG91ZCkg4oCUIG5vIDJEXG4gICAqICBmYWxsYmFjayBleGlzdHMgKE9TRCBpcyBpbWFnZS1vbmx5KSwgc28gdGhleSBmYWxsIHN0cmFpZ2h0IHRvIFBsb3RseS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaTNkVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05hcGFyaTNkKHQpIHx8IGlzU3BhdGlhbE9taWNzM2QodCk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCB0byBhdHRlbXB0IGZvciB0aGUgY3VycmVudCBwbG90IHR5cGUgdGhpcyByZW5kZXIuIFRoZSBmYWxsYmFjayBjaGFpbnMgYmVsb3cgYXJlXG4gICAqIG1pcnJvcmVkIGV4YWN0bHkgYnkge0BsaW5rIGxvYWR9IHNvIHRoZSBoYW5kbGUgYHBsb3QoKWAgcmVjZWl2ZXMgYWx3YXlzIGNvbWVzIGZyb20gdGhlXG4gICAqIGJhY2tlbmQgYHBsb3QoKWAgc2VsZWN0cyAobm8gbG9hZC9wbG90IGJhY2tlbmQgbWlzbWF0Y2gpOlxuICAgKiAgLSAyRCBpbWFnZSAoZXhwbGljaXQgYE5BUEFSSV9JTUFHRWAsIG9yIGBJTUFHRWAgd2l0aCB0aGUgV2ViR1BVIG9wdC1pbik6IG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIHBsYWluIGBJTUFHRWAgKG5vIG9wdC1pbik6IE9TRCDihpIgUGxvdGx5LlxuICAgKiAgLSAzRCBuYXBhcmkgKGBOQVBBUklfVk9MVU1FYC9gTkFQQVJJX0lTT1NVUkZBQ0VgKTogbmFwYXJpLWpzIOKGkiBQbG90bHkgKE9TRCBjYW4ndCByZW5kZXIgM0QpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQbG90VHlwZTtcbiAgICAvLyAyRCBpbWFnZSB3aXRoIGEgbmFwYXJpLWpzIGF0dGVtcHQgKGV4cGxpY2l0IG5hcGFyaSBpbWFnZSwgb3Igb3B0LWluIG9uIHRoZSBJbWFnZSB0eXBlKS5cbiAgICBpZiAodGhpcy5pc05hcGFyaUltYWdlVHlwZSh0KSB8fCAodGhpcy5pc0ltYWdlVHlwZSh0KSAmJiB0aGlzLmNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcikpIHtcbiAgICAgIGlmICghdGhpcy5uYXBhcmlGZWxsQmFjaykgcmV0dXJuIHRoaXMubmFwYXJpO1xuICAgICAgaWYgKCF0aGlzLm9zZEZlbGxCYWNrKSByZXR1cm4gdGhpcy5vc2Q7XG4gICAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gICAgfVxuICAgIC8vIFBsYWluIEltYWdlIHR5cGUgKG5vIG5hcGFyaSBvcHQtaW4pOiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgIGlmICh0aGlzLmlzSW1hZ2VUeXBlKHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2RGZWxsQmFjayA/IHRoaXMucGxvdGx5IDogdGhpcy5vc2Q7XG4gICAgfVxuICAgIC8vIDNEIG5hcGFyaSB0eXBlczogbmFwYXJpLWpzLCB3aXRoIFBsb3RseSBhcyB0aGUgb25seSB2aWFibGUgZmFsbGJhY2suXG4gICAgaWYgKHRoaXMuaXNOYXBhcmkzZFR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hcGFyaUZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm5hcGFyaTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqIEJhY2tlbmQgY3VycmVudGx5IG9uIHNjcmVlbiDigJQgd2hhdCBvbmdvaW5nIHpvb20vdG9vbC9yZWdpb24gb3BzIGFjdCBvbi4gKi9cbiAgcHJpdmF0ZSByZW5kZXJlcigpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlbmRlcmVkID8/IHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2tlbmQgcmVnaW9uLCB0b29sIGFuZCBvdmVybGF5IGNhbGxzIGFjdCBvbjogdGhlIHNsaWNlIHBhbmUncyBPU0Qgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzXG4gICAqIHNwbGl0IChyZWdpb25zIGFyZSBlZGl0ZWQgdGhlcmUpLCBlbHNlIHRoZSBiYWNrZW5kIG9uIHNjcmVlbi4gVmlldyBjYWxscyAoem9vbSwgZml0LCBjb2xvdXIsXG4gICAqIGV4cG9ydCkgc3RheSB3aXRoIHtAbGluayByZW5kZXJlcn0uXG4gICAqL1xuICBwcml2YXRlIHJlZ2lvbkJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlTW91bnRlZCA/IHRoaXMub3NkIDogdGhpcy5yZW5kZXJlcigpO1xuICB9XG5cbiAgLy8gU3lzdGVtIGNhcGFiaWxpdGllcyBhcmUgUGxvdGx5J3MgKHRoZSBmdWxsLWZlYXR1cmVkIGJhY2tlbmQpIHNvIHRoZSBVSVxuICAvLyBrZWVwcyBvZmZlcmluZyBldmVyeSBwbG90IHR5cGUgcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgaXMgb24gc2NyZWVuLlxuICBnZXQgY2FwYWJpbGl0aWVzKCk6IFZpZXdlckNhcGFiaWxpdGllcyB7XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmNhcGFiaWxpdGllcztcbiAgfVxuXG4gIC8vIOKUgOKUgCByZW5kZXIgLyB2aWV3cG9ydCDihpIgYWN0aXZlIHJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIC8vIEEgc3RhY2sgY2FuIG9wZW4gYXdheSBmcm9tIHNsaWNlIDAgKGBpbml0aWFsWkluZGV4YCDigJQgYSB2b2x1bWUgb3BlbnNcbiAgICAvLyBtaWQtc3BlY2ltZW4pLCBhbmQgdGhhdCBhcnJpdmVzIGhlcmUgcmF0aGVyIHRoYW4gdGhyb3VnaCBzZXRaSW5kZXguXG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIGNvbnN0IGJhY2tlbmQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubmFwYXJpLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWJvcnRlZDogbm9ib2R5IHdhbnRzIHRoaXMgaW1hZ2UgYW55IG1vcmUsIHNvIGRvbid0IGdvIG9uIHRvIGxvYWQgaXQgZWxzZXdoZXJlLlxuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgICAvLyBNaXJyb3IgaW1hZ2VCYWNrZW5kKCkncyBmYWxsYmFjayBzbyBsb2FkICsgcGxvdCBwaWNrIHRoZSBzYW1lIGJhY2tlbmQ6XG4gICAgICAgIC8vICAtIDNEIG5hcGFyaSB0eXBlcyBoYXZlIG5vIDJEIGZhbGxiYWNrIOKGkiBzdHJhaWdodCB0byBQbG90bHkuXG4gICAgICAgIC8vICAtIDJEIGltYWdlIOKGkiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgICAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkuJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBPcGVuU2VhZHJhZ29uLicsIGVycik7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcnkgT1NEOyBvbiBmYWlsdXJlIGZhbGwgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UgKG5vdCBwZXJtYW5lbnQg4oCUIHNlZSByZXNldCgpKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlhT3NkVGhlblBsb3RseShcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub3NkLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBPcGVuU2VhZHJhZ29uIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlLicsIGVycik7XG4gICAgICB0aGlzLm9zZEZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgfVxuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMudm9sdW1lVmlldyQubmV4dChpc05hcGFyaVZvbHVtZShwbG90VHlwZSkgfHwgaXNOYXBhcmlJc29zdXJmYWNlKHBsb3RUeXBlKSk7XG4gICAgdGhpcy5wbG90dGVkRmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMucGxvdHRlZEluZm8gPSBpbWFnZUluZm8gPz8gbnVsbDtcbiAgICB0aGlzLnBsb3R0ZWRIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgLy8gVGhlIHNsaWNlIHBhbmUgYmVsb25ncyB0byB0aGUgdm9sdW1lIHZpZXc6IGFub3RoZXIgcGxvdCB0eXBlIHRha2VzIGl0IGRvd24gKE9TRCBtYXkgYmVcbiAgICAvLyBhYm91dCB0byBkcmF3IHRoZSBtYWluIHZpZXcsIHdoaWNoIG11c3Qgbm90IGZpbmQgdGhlIHBhbmUncyB2aWV3ZXIgc3RpbGwgbW91bnRlZCkuXG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXckLnZhbHVlKSB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgIC8vIFJlZ2lvbiBzdXJmYWNlcyBiZWxvbmcgdG8gdGhlIGltYWdlIHRoZXkgd2VyZSBidWlsdCBmcm9tOiBhbm90aGVyIGltYWdlIGRyb3BzIHRoZW0uXG4gICAgaWYgKHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGggJiYgdGhpcy5wbG90dGVkRmlsZU5hbWUgIT09IHRoaXMuY2xhc3NlczNkSW1hZ2UpIHRoaXMuY2xlYXJSZWdpb25DbGFzc2VzM2QoKTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIGNvbnN0IHBsb3R0ZWQgPSBuZXh0LnBsb3QocGxvdERpdiwgaW1hZ2VMb2FkZWQsIGltYWdlSW5mbywgc2NyZWVuSGVpZ2h0LCBwbG90VHlwZSwgaW5QbGFjZSk7XG4gICAgaWYgKCF0aGlzLnNsaWNlRGl2IHx8ICF0aGlzLnZvbHVtZVZpZXckLnZhbHVlKSByZXR1cm4gcGxvdHRlZDtcbiAgICAvLyBUaGUgc3BsaXQgdm9sdW1lIHZpZXc6IHRoZSBzbGljZSBwYW5lIGZvbGxvd3MgdGhlIGltYWdlIChhIG5ldyBvbmUsIG9yIGl0cyBzaGFycGVyIHBhc3MpLlxuICAgIHJldHVybiBwbG90dGVkLnRoZW4oKG9rKSA9PiB7XG4gICAgICBpZiAob2sgJiYgKCF0aGlzLnNsaWNlTW91bnRlZCB8fCB0aGlzLnNsaWNlRmlsZSAhPT0gaW1hZ2VJbmZvPy5maWxlTmFtZSB8fCBpblBsYWNlKSkge1xuICAgICAgICB2b2lkIHRoaXMubW91bnRTbGljZSghIWluUGxhY2UgJiYgdGhpcy5zbGljZU1vdW50ZWQgJiYgdGhpcy5zbGljZUZpbGUgPT09IGltYWdlSW5mbz8uZmlsZU5hbWUpO1xuICAgICAgfVxuICAgICAgLy8gVGhlIHZvbHVtZSB3YXMgYXNzZW1ibGVkIGFnYWluIChhbm90aGVyIGltYWdlLCBvciByZXNvbHV0aW9uKTogY3V0IHRoZSBzZWN0aW9ucyBmcm9tIGl0LlxuICAgICAgaWYgKG9rKSB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCk7XG4gICAgICByZXR1cm4gb2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgdGhlIHZvbHVtZSB2aWV3OiBzaG93IHRoZSBzbGljZSBiZWluZyBlZGl0ZWQgaW4gYGRpdmAgKE9wZW5TZWFkcmFnb24sIHdpdGggZXZlcnkgcmVnaW9uXG4gICAqIHRvb2wpIGJlc2lkZSB0aGUgM0Qgdmlldywgb3Igc3RvcCAobnVsbCkuIEtlcHQgYWNyb3NzIHJlLXBsb3RzIG9mIGEgdm9sdW1lIHZpZXc7IGFub3RoZXIgcGxvdFxuICAgKiB0eXBlIHRha2VzIHRoZSBwYW5lIGRvd24gYW5kIGEgdm9sdW1lIHZpZXcgYnJpbmdzIGl0IGJhY2suIFJlc29sdmVzIHdoZXRoZXIgdGhlIHBhbmUgc2hvd3MuXG4gICAqL1xuICBhc3luYyBzZXRTbGljZUVkaXRvcihkaXY6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLnNsaWNlRGl2ID0gZGl2O1xuICAgIGlmICh0aGlzLnNsaWNlRWRpdG9yJC52YWx1ZSAhPT0gISFkaXYpIHRoaXMuc2xpY2VFZGl0b3IkLm5leHQoISFkaXYpO1xuICAgIGlmICghZGl2KSB7XG4gICAgICB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb3VudFNsaWNlKGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBNb3VudCAob3IgcmVmcmVzaCBpbiBwbGFjZSkgT1NEIGluIHRoZSBzbGljZSBwYW5lIG9uIHRoZSBkaXNwbGF5ZWQgc2xpY2UuICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTbGljZShpblBsYWNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGl2ID0gdGhpcy5zbGljZURpdjtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICBpZiAoIWRpdiB8fCAhaW5mbz8udXJscz8ubGVuZ3RoIHx8ICF0aGlzLnZvbHVtZVZpZXckLnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zbGljZVJlcXVlc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHRoaXMub3NkLmxvYWQoaW5mbywgdGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLm9zZC5wbG90KGRpdiwgbG9hZGVkLCBpbmZvLCB0aGlzLnBsb3R0ZWRIZWlnaHQsIFBsb3RUeXBlLklNQUdFLCBpblBsYWNlKTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zbGljZU1vdW50ZWQgPSBvaztcbiAgICAgIHRoaXMuc2xpY2VGaWxlID0gaW5mby5maWxlTmFtZTtcbiAgICAgIGlmIChvaykge1xuICAgICAgICAvLyBUaGUgc2xpY2UgbWF5IGhhdmUgbW92ZWQgd2hpbGUgdGhlIHBhbmUgbG9hZGVkLlxuICAgICAgICB0aGlzLm9zZC5zZXRaSW5kZXgodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMuc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLnNsaWNlUmVxdWVzdClcbiAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gVGhlIHNsaWNlIHBhbmUgY291bGQgbm90IHNob3cgdGhlIGltYWdlLicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRha2UgdGhlIHNsaWNlIHBhbmUncyB2aWV3ZXIgZG93biAodGhlIHNwbGl0IHN0YXlzIHdhbnRlZCB3aGlsZSB7QGxpbmsgc2xpY2VEaXZ9IGlzIHNldCkuICovXG4gIHByaXZhdGUgdW5tb3VudFNsaWNlKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5yZXNldCgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgfVxuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZUZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZWxvYWRBbmRQbG90KCk7XG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgb2YgYSByZW5kZXIgY3ljbGU6IHJlLWVuYWJsZSBuYXBhcmktanMvT1NEIGF0dGVtcHRzIChjbGVhciBhbnkgcHJpb3JcbiAgICAvLyBwZXItaW1hZ2UgZmFsbGJhY2spIGFuZCB0ZWFyIGRvd24gd2hhdGV2ZXIncyBvbiBzY3JlZW4uXG4gICAgdGhpcy5vc2RGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXQoKTtcbiAgfVxuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVsYXlvdXQodHJ1ZUltYWdlU2l6ZSk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldEF4ZXMoKTtcbiAgfVxuICBmaXRUb1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmZpdFRvVmlldygpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30uICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpdFRvVmlldygpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbUluKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbU91dCgpO1xuICB9XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldERyYWdNb2RlKG1vZGUpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5vc2Quc2V0RHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEV2ZXJ5IGJhY2tlbmQsIG9uIHNjcmVlbiBvciBub3QuICovXG4gIHByaXZhdGUgYmFja2VuZHMoKTogSVZpZXdlckJhY2tlbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmF2aWdhdG9yIC8gc21vb3RoaW5nIG9wdGlvbnMsIGFwcGxpZWQgdG8gRVZFUlkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChub3RcbiAgICoganVzdCB0aGUgYWN0aXZlIHJlbmRlcmVyKTogY29uc3VtZXJzIHNldCB0aGVtIGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLCB3aGVuXG4gICAqIGByZW5kZXJlcigpYCBpcyBzdGlsbCB0aGUgUGxvdGx5IGRlZmF1bHQsIGFuZCBPU0QvbmFwYXJpLWpzIG11c3QgcmVjZWl2ZSB0aGVtXG4gICAqIHRvIGhvbm91ciB0aGVtIGF0IHZpZXdlciBjcmVhdGlvbi5cbiAgICovXG4gIGdldE9zZFZpZXdPcHRpb25zKCk6IElPc2RWaWV3T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMudmlld09wdGlvbnM7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3T3B0aW9uczogSU9zZFZpZXdPcHRpb25zID0ge1xuICAgIHNldE5hdmlnYXRvclZpc2libGU6ICh2aXNpYmxlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gICAgfSxcbiAgICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQ6IChlbmFibGVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICB9LFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldE5hdmlnYXRvclZpc2libGUoKWAuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYC4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgfVxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0WkluZGV4KHpJbmRleCk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5zZXRaSW5kZXgoekluZGV4KTtcbiAgICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICB9XG4gIH1cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFRydWVJbWFnZVNpemUoKTtcbiAgfVxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEN1cnJlbnRJbWFnZSgpO1xuICB9XG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFBpeGVsRGF0YSgpO1xuICB9XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpO1xuICB9XG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgICB0aGlzLnZvbHVtZVZpZXckLm5leHQoaXNOYXBhcmlWb2x1bWUocGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSkpO1xuICAgIHRoaXMucGxvdGx5LnNldFBsb3RUeXBlKHBsb3RUeXBlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRTdXJmYWNlM2RDb250cm9scygpYC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKG1vZGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4gKG5hcGFyaS1qcyksIGVsc2UgbnVsbC4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uc2V0KClgLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoc2NhbGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KClgLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LmdldCgpID8/IDE7XG4gIH1cbiAgLyoqIFRoZSB2aWV3cG9ydCBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIGZvciBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZS4gTnVsbFxuICAgKiAgd2hlbiB0aGF0IGJhY2tlbmQgY2Fubm90IHByb3ZpZGUgb25lIChlLmcuIE9TRCBmZWxsIGJhY2sgdG8gUGxvdGx5KS4gKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRQbG90TW9kZVZpZXdwb3J0Py4oKSA/PyBudWxsO1xuICB9XG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFBsb3RseSBlbnVtZXJhdGVzIHRoZSBmdWxsIFBMT1RfVFlQRV9ERVNDUklQVE9SUyBtYXAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgdGhlXG4gICAgLy8gbmFwYXJpLWpzIFdlYkdQVSB0eXBlcyAoaml0LXVpIzEwMikg4oCUIHNvIHRoaXMgc2luZ2xlIHNvdXJjZSBjb3ZlcnMgdGhlbSAobm8gZHVwbGljYXRlcykuXG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsb25nLWxpdmVkIG9ic2VydmFibGVzICsgc3RhY2sgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFN0YWNrTG9hZGluZyhiOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0U3RhY2tMb2FkaW5nKGIpO1xuICB9XG4gIC8vIENhbmNlbCBpbi1mbGlnaHQgbG9hZGluZyBvbiBldmVyeSBiYWNrZW5kIOKAlCB0aGUgdXNlcidzIENhbmNlbCBzaG91bGRuJ3QgZGVwZW5kIG9uIHdoaWNoIG9uZSBpc1xuICAvLyBhY3RpdmUuIE9ubHkgYmFja2VuZHMgdGhhdCBzdHJlYW0gZnJhbWVzIChuYXBhcmktanMpIGRvIHJlYWwgd29yazsgdGhlIHJlc3Qgbm8tb3AuIFRoZSBjb25jcmV0ZVxuICAvLyBiYWNrZW5kIGNsYXNzZXMgZG9uJ3QgYWxsIGRlY2xhcmUgdGhlIG9wdGlvbmFsIGNvbnRyYWN0IG1ldGhvZCwgc28gY2FsbCBpdCB2aWEgSVZpZXdlckJhY2tlbmQuXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBiYWNrZW5kIG9mIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXSBhcyBJVmlld2VyQmFja2VuZFtdKSB7XG4gICAgICBiYWNrZW5kLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIH1cbiAgfVxuICAvLyBMb2FkaW5nIHN0YXRlIGlzIHN1cmZhY2VkIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgZG9pbmcgdGhlIHdvcms6IE9TRCBhbmQgbmFwYXJpLWpzICh2b2x1bWVcbiAgLy8gYXNzZW1ibHkpIGRyaXZlIHRoZWlyIG93biBzdWJqZWN0cywgc28gbWVyZ2UgYWxsIHRocmVlIGludG8gb25lIHN0YWJsZSBzdHJlYW0gdGhlIGhvc3RcbiAgLy8gc3Vic2NyaWJlcyB0byBvbmNlLiAoUHJldmlvdXNseSBoYXJkY29kZWQgdG8gUGxvdGx5LCBzbyBuYXBhcmkvT1NEIHByb2dyZXNzIG5ldmVyIHNob3dlZC4pXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucGxvdGx5LmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm9zZC5pc1N0YWNrTG9hZGluZygpLFxuICAgICAgdGhpcy5uYXBhcmkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICBdKS5waXBlKG1hcCgoZmxhZ3MpID0+IGZsYWdzLnNvbWUoQm9vbGVhbikpKTtcbiAgfVxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIC8vIFJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb2Ygd2hpY2hldmVyIGJhY2tlbmQgaXMgQUNUSVZFTFkgbG9hZGluZyAobWF4IGFjcm9zcyBhY3RpdmUgb25lcykuIEEgcGxhaW5cbiAgICAvLyBtZXJnZSBsZXQgYW4gaWRsZSBiYWNrZW5kJ3Mgc3RhbGUgdmFsdWUgd2luIHRoZSBzdHJlYW0gb24gYSByZS1sb2FkIOKAlCBsZWF2aW5nIHRoZSBiYXIgYmVsb3cgdGhlXG4gICAgLy8gYWN0aXZlIGJhY2tlbmQncyByZWFsIHByb2dyZXNzIChlLmcuIHN0dWNrIH7ihZMgd2hpbGUgdGhlICUgcmVhZCAxMDApLiBHYXRpbmcgYnkgdGhlIGxvYWRpbmcgZmxhZ1xuICAgIC8vIGlnbm9yZXMgaWRsZSBiYWNrZW5kcywgc28gdGhlIGJhciB0cmFja3MgdGhlIG9uZSBkb2luZyB0aGUgd29yayBhbmQgcmVhY2hlcyAxMDAlLlxuICAgIGNvbnN0IHRyYWNrID0gKHY6IElWaWV3ZXJCYWNrZW5kKTogT2JzZXJ2YWJsZTxbbnVtYmVyLCBib29sZWFuXT4gPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW3YuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSwgdi5pc1N0YWNrTG9hZGluZygpXSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RyYWNrKHRoaXMucGxvdGx5KSwgdHJhY2sodGhpcy5vc2QpLCB0cmFjayh0aGlzLm5hcGFyaSldKS5waXBlKFxuICAgICAgbWFwKChwYWlycykgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBwYWlycy5maWx0ZXIoKFssIGxvYWRpbmddKSA9PiBsb2FkaW5nKS5tYXAoKFtwXSkgPT4gcCk7XG4gICAgICAgIHJldHVybiBhY3RpdmUubGVuZ3RoID8gTWF0aC5tYXgoLi4uYWN0aXZlKSA6IDA7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIC8vIEV2ZXJ5IGJhY2tlbmQgZml0cyB0byB2aWV3IG9uIGl0cyBvd24gKFBsb3RseSdzIGF1dG9zY2FsZSwgT1NEJ3MgZ29Ib21lLCBuYXBhcmkncyBjYW1lcmFcbiAgLy8gZml0KSBhbmQgZWFjaCBlbWl0cyBmcm9tIGl0cyBvd24gc3ViamVjdCwgc28gbWVyZ2UgYWxsIHRocmVlOiBsaXN0ZW5pbmcgdG8gUGxvdGx5IGFsb25lXG4gIC8vIG1pc3NlZCB0aGUgY29udGV4dC1tZW51IEF1dG9zY2FsZSBvbiB0aGUgSW1hZ2UgYW5kIG5hcGFyaSB2aWV3cy5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5wbG90bHkuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMub3NkLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgICB0aGlzLm5hcGFyaS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cbiAgLyoqIFRoZSBsaW5lLVJPSSBwcm9maWxlczogc2FtcGxlZCBieSB0aGUgYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpO1xuICB9XG4gIC8vIFRoZSBpbnRlbnNpdHkgaW5zZXQgaXMgYSBQbG90bHkgTElORSBjaGFydCDigJQgcmVuZGVyIGl0IHRocm91Z2ggUGxvdGx5IHdoaWNoZXZlclxuICAvLyBiYWNrZW5kIGRyYXdzIHRoZSBtYWluIGltYWdlLlxuICByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQsIHByb2ZpbGVzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCByZWdpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBSZWdpb24gc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSwgc28gZXZlcnkgcmVhZCBhbmQgd3JpdGUgZ29lc1xuICAvLyBzdHJhaWdodCB0byBpdC4gRXZlcnkgYmFja2VuZCBkcmF3cyBmcm9tIHRoZSBzdG9yZSdzIGV2ZW50czogdGhlIE9TRCBhbmRcbiAgLy8gbmFwYXJpLWpzIG92ZXJsYXlzIGFuZCBQbG90bHkncyBzaGFwZSBwcm9qZWN0aW9uIHJlZHJhdyBvbiBpdHMgcmVnaW9uLXVwZGF0ZVxuICAvLyBhbmQgc2VsZWN0aW9uIHN0cmVhbXMsIGFuZCB0aGUgY2FudmFzIHRvb2xzIHJlc2V0IG9uIGdldFJlZ2lvblNldFJlcGxhY2VkJFxuICAvLyAodW5kbywgcmVkbywgYSBzbGljZSBzd2l0Y2gpLlxuICBzZXRSZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgICBhcHBlbmQ/OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucywgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBhcHBlbmQpO1xuICB9XG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTtcbiAgfVxuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICB9XG4gIGdldEZpbGxDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpO1xuICB9XG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gIH1cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsLCBjb2xvcik7XG4gIH1cbiAgLy8gQW5ub3RhdGlvbi1jbGFzcyBwcmVzZXRzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgKGJhY2tlbmQtbmV1dHJhbFxuICAvLyBzZXNzaW9uIHN0YXRlKSwgc28gcm91dGUgc3RyYWlnaHQgdG8gaXQgcmF0aGVyIHRoYW4gdGhyb3VnaCByZW5kZXJlcigpLiAoaml0LXVpIzcwKVxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTtcbiAgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0JCgpO1xuICB9XG4gIHNldFByZXNldFNldChzZXQ6IFByZXNldFNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0UHJlc2V0U2V0KHNldCk7XG4gIH1cbiAgdXBzZXJ0Q2xhc3MocHJlc2V0OiBDbGFzc1ByZXNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KTtcbiAgfVxuICByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlbW92ZUNsYXNzKG5hbWUpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlc2V0UHJlc2V0cygpO1xuICB9XG4gIHVuZG8oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7XG4gIH1cbiAgcmVkbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlZG8oKTtcbiAgfVxuICBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblVuZG8oKTtcbiAgfVxuICBjYW5SZWRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTtcbiAgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5VbmRvJCgpO1xuICB9XG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblJlZG8kKCk7XG4gIH1cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pbXBvcnRSZWdpb25zKGdlb0pzb25TdHIpO1xuICB9XG4gIC8qKiBEb3dubG9hZCBgcmVnaW9uc2AgYXMgR2VvSlNPTiwgbmFtZWQgYWZ0ZXIgdGhlIGltYWdlIGxhc3QgcGxvdHRlZC4gKi9cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZXhwb3J0UmVnaW9ucyhyZWdpb25zLCB0aGlzLnBsb3R0ZWRGaWxlTmFtZSk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTtcbiAgfVxuXG4gIC8qKiBIb2xkIGEgbGFyZ2UgcmVnaW9uIHNldCBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UgKHNlZSBSZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UpLiAqL1xuICBhdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlOiBSZWdpb25Tb3VyY2UgfCBSZWdpb25Tb3VyY2VPcGVuZXIsIHNsaWNlcz86IFJlZ2lvblNvdXJjZVNsaWNlcyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHNvdXJjZSwgc2xpY2VzKTtcbiAgfVxuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2UoZ2VvSnNvblN0cjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGdlb0pzb25TdHIubGVuZ3RoIDwgKHRoaXMuY29uZmlnPy5yZWdpb25Tb3VyY2VNaW5DaGFycyA/PyBSRUdJT05fU09VUkNFX01JTl9DSEFSUykpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb3BlbmVkOiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgLy8gVGhlIGZpcnN0IG9wZW4gaXMgdGhlIG9uZSBqdXN0IG1hZGU7IGEgc291cmNlIGNsb3NlZCB0byBzYXZlIG1lbW9yeSBwYXJzZXMgYWdhaW4uXG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UoKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gb3BlbmVkO1xuICAgICAgb3BlbmVkID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlKGdlb0pzb25TdHIpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRyb3BSZWdpb25Tb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZHJvcFNsaWNlUmVnaW9uU291cmNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQSB0aWNrZXQgZm9yIGEgcmVnaW9uIGltcG9ydCB0aGF0IGlzIGFib3V0IHRvIHJlYWQgb3IgZGVjb2RlIGl0cyBmaWxlczogdGhlIGltcG9ydCBtZXRob2RzXG4gICAqIGdpdmVuIGl0IGNoYW5nZSBub3RoaW5nIG9uY2UgaXQgaXMgc3RhbGUg4oCUIGFub3RoZXIgaW1wb3J0IHRvb2sgYSB0aWNrZXQgc2luY2UsIGFub3RoZXIgaW1hZ2VcbiAgICogd2FzIHBsb3R0ZWQsIG9yIHRoZSBzZXJ2aWNlIHdhcyBkZXN0cm95ZWQg4oCUIHNvIGFuIGltcG9ydCB0aGF0IGZpbmlzaGVzIGxhdGUgbmV2ZXIgbGFuZHMgb24gYW5cbiAgICogaW1hZ2UgaXQgd2FzIG5vdCBzdGFydGVkIGZvci5cbiAgICovXG4gIHJlZ2lvbkltcG9ydFRpY2tldCgpOiBudW1iZXIge1xuICAgIHRoaXMuaW1wb3J0VGlja2V0ID0geyBpZDogdGhpcy5pbXBvcnRUaWNrZXQuaWQgKyAxLCBpbWFnZTogdGhpcy5pbXBvcnRJbWFnZUtleSgpIH07XG4gICAgcmV0dXJuIHRoaXMuaW1wb3J0VGlja2V0LmlkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHRpY2tldGAgaXMgc3RpbGwgdGhlIGN1cnJlbnQgaW1wb3J0J3MsIG9uIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldFZhbGlkKHRpY2tldDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRpY2tldCA9PT0gdGhpcy5pbXBvcnRUaWNrZXQuaWQgJiYgdGhpcy5pbXBvcnRUaWNrZXQuaW1hZ2UgPT09IHRoaXMuaW1wb3J0SW1hZ2VLZXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW1wb3J0SW1hZ2VLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gUmVnaW9uU2NvcGVDYWNoZS5pbWFnZUtleSh0aGlzLnBsb3R0ZWRJbmZvID8/IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBzb3VyY2UgcGVyIHNsaWNlLCBhcyBhbiBpbXBvcnRlZCBsYWJlbFxuICAgKiB2b2x1bWUgb3IgZm9sZGVyIG9mIHBlci1zbGljZSByZWdpb24gZmlsZXMgZ2l2ZXMgdGhlbTogYG9wZW5lcnNgIGJ5IHNsaWNlIGluZGV4LCBlYWNoIG9wZW5lZFxuICAgKiB0aGUgZmlyc3QgdGltZSBpdHMgc2xpY2UgaXMgc2hvd24uIEEgc2luZ2xlIGltYWdlIHRha2VzIHNsaWNlIDAncy4gUmV0dXJucyBob3cgbWFueSBzbGljZXNcbiAgICogaGF2ZSBhIHNvdXJjZSwgb3IgbnVsbCAoY2hhbmdpbmcgbm90aGluZykgd2hlbiBgdGlja2V0YCBpcyBzdGFsZSAoc2VlXG4gICAqIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9KS4gVGhlIHNvdXJjZXMgYXJlIG1hcmtlZCBpbXBvcnRlZCwgc28gYSBzYXZlIHdyaXRlcyBldmVyeSBzbGljZS5cbiAgICovXG4gIGltcG9ydFNsaWNlUmVnaW9uU291cmNlcyhvcGVuZXJzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlZ2lvblNvdXJjZU9wZW5lcj4sIHRpY2tldD86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh0aWNrZXQgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pbXBvcnRUaWNrZXRWYWxpZCh0aWNrZXQpKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnJlZ2lvbkltcG9ydFRpY2tldCgpOyAvLyBzdXBlcnNlZGVzIGFueSBpbXBvcnQgc3RpbGwgaW4gZmxpZ2h0XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucGxvdHRlZEluZm87XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKCFpbmZvPy5pc1N0YWNrKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IG9wZW5lcnMuZ2V0KDApID8/IG9wZW5lcnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgICAgaWYgKCFmaXJzdCkgcmV0dXJuIDA7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShmaXJzdCwgeyBzbGljZTogMCB9LCB0cnVlKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvKTtcbiAgICBmb3IgKGNvbnN0IFt6LCBvcGVuXSBvZiBvcGVuZXJzKSB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShvcGVuLCB7IHNsaWNlOiB6IH0sIHRydWUpO1xuICAgIHJldHVybiBvcGVuZXJzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBpbXBvcnRlZCBzb3VyY2UgKGEgcmVnaW9uIHNldCB0aGVcbiAgICogaG9zdCdzIHNlcnZlciBzZXJ2ZXMpOiBvdmVyIGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgd2hlbiBpdCBpcyB6LWluZGV4ZWQsIGVsc2Ugb24gdGhlIHNsaWNlXG4gICAqIHNob3duLCBhcyB7QGxpbmsgYXBwbHlJbWFnZVJvaXN9IGxheXMgb3V0IGFuIGltYWdlJ3Mgb3duLiBSZXNvbHZlcyBmYWxzZSwgY2hhbmdpbmcgbm90aGluZ1xuICAgKiAoYW5kIGRpc3Bvc2luZyB0aGUgc291cmNlKSwgd2hlbiB0aGUgaW1wb3J0IHdlbnQgc3RhbGUgd2hpbGUgaXQgb3BlbmVkOiBhbm90aGVyIGltcG9ydCwgb3JcbiAgICogYW5vdGhlciBpbWFnZSAoc2VlIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9OyBvbmUgaXMgdGFrZW4gaGVyZSB3aGVuIGB0aWNrZXRgIGlzIG5vdCBnaXZlbikuXG4gICAqL1xuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2VPcGVuZXIob3BlbjogUmVnaW9uU291cmNlT3BlbmVyLCB0aWNrZXQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBtaW5lID0gdGlja2V0ID8/IHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGZpcnN0OiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3BlbigpO1xuICAgIGlmICghdGhpcy5pbXBvcnRUaWNrZXRWYWxpZChtaW5lKSkge1xuICAgICAgZmlyc3QuZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXVzZTogUmVnaW9uU291cmNlT3BlbmVyID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gZmlyc3Q7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICByZXR1cm4gc291cmNlID8gUHJvbWlzZS5yZXNvbHZlKHNvdXJjZSkgOiBvcGVuKCk7XG4gICAgfTtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICBjb25zdCBwbGFuZXMgPSBmaXJzdC5pbmZvLnBsYW5lcztcbiAgICBjb25zdCB6SW5kZXhlZCA9ICEhaW5mbz8uaXNTdGFjayAmJiBwbGFuZXMuc29tZSgocCkgPT4gcCAhPT0gMCk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKHpJbmRleGVkKSB7XG4gICAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvIGFzIElJbWFnZUluZm8pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UocmV1c2UsICdwbGFuZXMnLCBbLi4ucGxhbmVzXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgeyBzbGljZTogdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSB9LCB0cnVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBFbXB0eSBldmVyeSBzbGljZSBvZiBhIHN0YWNrIChpdHMgcmVnaW9ucyBhbmQgdW5kbyBoaXN0b3J5KSBmb3IgcmVnaW9ucyBpbXBvcnRlZCBvdmVyIGl0LiAqL1xuICBwcml2YXRlIGVudGVySW1wb3J0ZWRTdGFjayhpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpXG4gICAgICA/IHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KClcbiAgICAgIDogaW5mby50aWxlZCA9PT0gZmFsc2VcbiAgICAgICAgPyAncGVyLXNsaWNlLWZpbGUnXG4gICAgICAgIDogJ2NvbWJpbmVkJztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoKSwgdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSwgbGF5b3V0KTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VWaWV3JCgpOiBPYnNlcnZhYmxlPFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyQoKTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeTogT21pdDxSZWdpb25JbmRleFF1ZXJ5LCAnZXhjbHVkZSc+KTogUHJvbWlzZTxSZWdpb25JbmRleFBhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeSk7XG4gIH1cbiAgc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmU/OiBib29sZWFuKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKGlkcywgYWRkaXRpdmUpO1xuICB9XG4gIGRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkcyk7XG4gIH1cbiAgZ2V0UmVnaW9uU3R5bGUkKCk6IE9ic2VydmFibGU8UmVnaW9uU3R5bGU+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25TdHlsZSQoKTtcbiAgfVxuICBzZXRSZWdpb25TdHlsZShwYXRjaDogUGFydGlhbDxSZWdpb25TdHlsZT4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvblN0eWxlKHBhdGNoKTtcbiAgfVxuICAvLyDilIDilIAgUmVnaW9ucyBpbiAzRDogdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIHNob3duIGluIHRoZSB2b2x1bWUgdmlldyDilIDilIDilIDilIDilIBcblxuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcgaXMgb24gc2NyZWVuOiByZWdpb25zIGNhbiBiZSBzaG93biBpbiAzRC4gKi9cbiAgZ2V0Vm9sdW1lVmlldyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lVmlldyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAoaXQgc2hvd3Mgd2hpbGUgYSB2b2x1bWUgdmlldyBpcyBvbiBzY3JlZW4pLiAqL1xuICBnZXRTbGljZUVkaXRvciQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VFZGl0b3IkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3IGRyYXdzIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZS4gKi9cbiAgZ2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZSAoaXQgaGlkZXMgbm9uZSBvZiB0aGVtOiBzdXJmYWNlcyBpbnNpZGUgaXRzXG4gICAqIGJyaWdodCBzdHJ1Y3R1cmVzLCBhbiBPQ1QncyBsYXllciBib3VuZGFyaWVzKSBvciBoaWRkZW4gYmVoaW5kIHdoYXQgaXQgc2hvd3MgKHRoZSBkZWZhdWx0KS5cbiAgICovXG4gIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKHRocm91Z2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQudmFsdWUgPT09IHRocm91Z2gpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lJC5uZXh0KHRocm91Z2gpO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKHRocm91Z2gpO1xuICB9XG5cbiAgLyoqIFRoZSBjbGFzcyBncm91cHMgc2hvd24gaW4gM0Qgb24gdGhpcyBpbWFnZSAoW10gYWZ0ZXIgYSBzd2l0Y2ggdG8gYW5vdGhlciBpbWFnZSkuICovXG4gIGdldFJlZ2lvbkNsYXNzZXMzZCQoKTogT2JzZXJ2YWJsZTxSZWFkb25seUFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NlczNkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBIaWRlIGV2ZXJ5IHJlZ2lvbiBzdXJmYWNlIGFuZCBmb3JnZXQgdGhlbSAoYSBidWlsZCBzdGlsbCBydW5uaW5nIGlzIGRyb3BwZWQpLiAqL1xuICBwcml2YXRlIGNsZWFyUmVnaW9uQ2xhc3NlczNkKCk6IHZvaWQge1xuICAgIHRoaXMubWVzaFJlcXVlc3QrKztcbiAgICB0aGlzLnNob3duM2QgPSBbXTtcbiAgICB0aGlzLmNsYXNzZXMzZCQubmV4dChbXSk7XG4gICAgdGhpcy5jbGFzc2VzM2RJbWFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25NZXNoZXMoW10sIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlnaGxpZ2h0KFtdKTtcbiAgfVxuXG4gIC8qKiBIaWdobGlnaHQgdGhlIHN1cmZhY2VzIG9mIHRoZXNlIGdyb3VwIGtleXMgaW4gdGhlIHZvbHVtZSB2aWV3IChub25lOiBhbGwgYXMgdXN1YWwpLiAqL1xuICBoaWdobGlnaHRSZWdpb25DbGFzc2VzM2Qoa2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWdobGlnaHQoa2V5cyk7XG4gIH1cblxuICAvKiogQSBzdXJmYWNlIGNsaWNrZWQgaW4gdGhlIHZvbHVtZSB2aWV3IHdpdGggdGhlIHNlbGVjdGlvbiB0b29sIChpdHMgZ3JvdXAga2V5KSwgb3Igbm9uZSAobnVsbCkuICovXG4gIGdldFJlZ2lvblBpY2tlZDNkJCgpOiBPYnNlcnZhYmxlPHsga2V5OiBzdHJpbmcgfCBudWxsOyBhZGRpdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMubmFwYXJpLmdldFJlZ2lvbk1lc2hQaWNrJCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlc2UgZ3JvdXBzIG9mIGNsYXNzZXMgaW4gdGhlIHZvbHVtZSB2aWV3IGFzIDNEIHJlY29uc3RydWN0aW9ucyAoZWFjaCBncm91cCBvbmUgc3VyZmFjZVxuICAgKiBpbiBpdHMgY29sb3VyOiBhbiBhdGxhcyBzdHJ1Y3R1cmUgd2l0aCBpdHMgc3Vic3RydWN0dXJlcyksIGFuZCBvbmx5IHRoZXNlOyBbXSBoaWRlcyB0aGVtLlxuICAgKiBSZWNvbnN0cnVjdGVkIGZyb20gZXZlcnkgc2xpY2UncyBvdXRsaW5lcyBhdCB0aGUgdm9sdW1lJ3MgcmVzb2x1dGlvbiwgY2FjaGVkIHBlciBpbWFnZS5cbiAgICovXG4gIGFzeW5jIHNob3dSZWdpb25DbGFzc2VzM2QoXG4gICAgZ3JvdXBzOiBSZWFkb25seUFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdOyBjb2xvcjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5tZXNoUmVxdWVzdDtcbiAgICB0aGlzLmNsYXNzZXMzZEltYWdlID0gdGhpcy5wbG90dGVkRmlsZU5hbWU7XG4gICAgdGhpcy5zaG93bjNkID0gZ3JvdXBzO1xuICAgIC8vIFdoYXQgYW4gZWRpdCBmcm9tIG5vdyBvbiBpcyBjb21wYXJlZCB3aXRoICh0aGUgbGl2ZSBzbGljZSBtYXkgbm90IGhhdmUgY2hhbmdlZCB5ZXQpLlxuICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgIHRoaXMudHJhY2tMaXZlQ2xhc3NlcygpO1xuICAgIHRoaXMuY2xhc3NlczNkJC5uZXh0KGdyb3Vwcy5tYXAoKGcpID0+ICh7IGtleTogZy5rZXksIGNsYXNzZXM6IGcuY2xhc3NlcyB9KSkpO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk/LndpZHRoID8/IDEwMjQ7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMubmFwYXJpLnJlZ2lvblZveGVsU3RlcCgpID8/IE1hdGgubWF4KDEsIHdpZHRoIC8gMjU2KTtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMucGxvdHRlZEZpbGVOYW1lID8/ICcnO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gKGc6IHsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfSkgPT4gYCR7aW1hZ2V9fCR7c3RlcC50b0ZpeGVkKDMpfXwke2cuY2xhc3Nlcy5qb2luKCcsJyl9YDtcbiAgICBjb25zdCBtaXNzaW5nID0gZ3JvdXBzLmZpbHRlcigoZykgPT4gIXRoaXMubWVzaENhY2hlLmhhcyhjYWNoZUtleShnKSkpO1xuICAgIGlmIChtaXNzaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmFtZXMgPSBtaXNzaW5nLm1hcCgoZykgPT4gZy5rZXkpO1xuICAgICAgY29uc3Qgd2hhdCA9IG5hbWVzLmxlbmd0aCA+IDMgPyBgJHtuYW1lcy5sZW5ndGh9IHJlZ2lvbnNgIDogbmFtZXMuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IGRvbmUgPSB0aGlzLm5hcGFyaS5iZWdpblRhc2soYEJ1aWxkaW5nICR7d2hhdH0gaW4gM0TigKZgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1aWx0ID0gYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5yZWNvbnN0cnVjdENsYXNzZXMoXG4gICAgICAgICAgbWlzc2luZy5tYXAoKGcpID0+ICh7IGtleTogY2FjaGVLZXkoZyksIGNsYXNzZXM6IGcuY2xhc3NlcyB9KSksXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY2xhc3Nlc09mID0gbmV3IE1hcChtaXNzaW5nLm1hcCgoZykgPT4gW2NhY2hlS2V5KGcpLCBnLmNsYXNzZXNdKSk7XG4gICAgICAgIGZvciAoY29uc3QgYiBvZiBidWlsdCkgdGhpcy5tZXNoQ2FjaGUuc2V0KGIua2V5LCB7IG1lc2g6IGIubWVzaCwgY2xhc3NlczogY2xhc3Nlc09mLmdldChiLmtleSkgPz8gW10gfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLm1lc2hSZXF1ZXN0KSByZXR1cm47XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uTWVzaGVzKFxuICAgICAgZ3JvdXBzLm1hcCgoZykgPT4ge1xuICAgICAgICBjb25zdCBtZXNoID0gdGhpcy5tZXNoQ2FjaGUuZ2V0KGNhY2hlS2V5KGcpKSEubWVzaDtcbiAgICAgICAgcmV0dXJuIHsga2V5OiBnLmtleSwgY29sb3I6IGcuY29sb3IsIGxhYmVsOiBnLmxhYmVsLCB2ZXJ0aWNlczogbWVzaC52ZXJ0aWNlcywgZmFjZXM6IG1lc2guZmFjZXMgfTtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5wbG90dGVkRmlsZU5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9ucyBjaGFuZ2VkOiB3aGVuIHRoZSBsaXZlIHNsaWNlJ3MgcmVnaW9ucyBvZiBzb21lIGNsYXNzZXMgZGlkIChhbiBlZGl0LCBhbiB1bmRvLCBub3RcbiAgICogYSBzbGljZSBvciBpbWFnZSBzd2l0Y2gpLCB0aGVpciByZWNvbnN0cnVjdGlvbnMgYXJlIHN0YWxlLiBUaGV5IGFyZSBkcm9wcGVkLCBhbmQgdGhvc2Ugc2hvd25cbiAgICogaW4gM0QgYXJlIHJlYnVpbHQgb25jZSB0aGUgZWRpdHMgcGF1c2UuXG4gICAqL1xuICBwcml2YXRlIG9uUmVnaW9uc0NoYW5nZWQoKTogdm9pZCB7XG4gICAgLy8gTm90aGluZyBmb2xsb3dzIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCBvciBzaG93biwgbm8gc2VjdGlvbnMpOiBza2lwIHRoZSBmaW5nZXJwcmludHMuXG4gICAgaWYgKCF0aGlzLnNsaWNlTW91bnRlZCAmJiAhdGhpcy5zaG93bjNkLmxlbmd0aCAmJiAhdGhpcy5tZXNoQ2FjaGUuc2l6ZSkge1xuICAgICAgdGhpcy5saXZlQ2xhc3NlcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMubGl2ZUNsYXNzZXM7XG4gICAgdGhpcy5saXZlQ2xhc3NlcyA9IG51bGw7XG4gICAgY29uc3Qgbm93ID0gdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgLy8gQW5vdGhlciBzbGljZSBvciBpbWFnZSBjYW1lIHVwOiBubyByZWdpb24gY2hhbmdlZCAodGhlIHNlY3Rpb25zIHJlY3V0IGZvciB0aGUgc2xpY2UpLlxuICAgIGlmICghYmVmb3JlIHx8IGJlZm9yZS5hdCAhPT0gbm93LmF0KSByZXR1cm47XG4gICAgY29uc3QgY2hhbmdlZCA9IGNoYW5nZWRDbGFzc2VzKGJlZm9yZS5zaWduYXR1cmVzLCBub3cuc2lnbmF0dXJlcyk7XG4gICAgLy8gU291cmNlIGZlYXR1cmVzIGRlbGV0ZWQgKG9yIHRoYXQgdW5kb25lKSBjaGFuZ2Ugbm8gbGl2ZSByZWdpb24sIGFuZCB3aGljaCBjbGFzc2VzIHRoZXkgd2VyZVxuICAgIC8vIGlzIG5vdCBrbm93biBoZXJlOiBldmVyeSBjbGFzcyBpcyBzdGFsZS4gQSBmZWF0dXJlIHRha2VuIHNob3dzIGFzIGl0cyBjbGFzcydzIGNoYW5nZS5cbiAgICBjb25zdCBldmVyeUNsYXNzID0gIWNoYW5nZWQuc2l6ZSAmJiBiZWZvcmUuc291cmNlcyAhPT0gbm93LnNvdXJjZXM7XG4gICAgaWYgKCFjaGFuZ2VkLnNpemUgJiYgIWV2ZXJ5Q2xhc3MpIHJldHVybjtcbiAgICBjb25zdCB0b3VjaGVkID0gKGM6IHN0cmluZykgPT4gZXZlcnlDbGFzcyB8fCBjaGFuZ2VkLmhhcyhjKTtcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHRoaXMuc2VjdGlvbnMucmVnaW9uc0NoYW5nZWQoKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBbLi4udGhpcy5tZXNoQ2FjaGVdKSB7XG4gICAgICBpZiAoZW50cnkuY2xhc3Nlcy5zb21lKHRvdWNoZWQpKSB0aGlzLm1lc2hDYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNob3duM2Quc29tZSgoZykgPT4gZy5jbGFzc2VzLnNvbWUodG91Y2hlZCkpKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVidWlsZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWJ1aWxkVGltZXIpO1xuICAgIHRoaXMucmVidWlsZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlYnVpbGRUaW1lciA9IG51bGw7XG4gICAgICBpZiAodGhpcy5zaG93bjNkLmxlbmd0aCAmJiB0aGlzLmNsYXNzZXMzZEltYWdlID09PSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSkge1xuICAgICAgICB2b2lkIHRoaXMuc2hvd1JlZ2lvbkNsYXNzZXMzZCh0aGlzLnNob3duM2QpO1xuICAgICAgfVxuICAgIH0sIFJFR0lPTl9TVVJGQUNFX1JFQlVJTERfTVMpO1xuICB9XG5cbiAgLyoqIEZpbmdlcnByaW50IHRoZSBsaXZlIHNsaWNlJ3MgY2xhc3NlcywgdW5sZXNzIGFscmVhZHk6IHdoYXQgdGhlIG5leHQgZWRpdCBpcyBjb21wYXJlZCB3aXRoLiAqL1xuICBwcml2YXRlIHRyYWNrTGl2ZUNsYXNzZXMoKTogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB7XG4gICAgdGhpcy5saXZlQ2xhc3NlcyA/Pz0ge1xuICAgICAgYXQ6IHRoaXMubGl2ZVNsaWNlS2V5KCksXG4gICAgICBzaWduYXR1cmVzOiBjbGFzc1NpZ25hdHVyZXModGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkpLFxuICAgICAgc291cmNlczogdGhpcy5yZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSgpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGl2ZUNsYXNzZXM7XG4gIH1cblxuICAvKiogV2hpY2ggc2xpY2Ugb2Ygd2hpY2ggaW1hZ2UgdGhlIGxpdmUgcmVnaW9ucyBhcmUuICovXG4gIHByaXZhdGUgbGl2ZVNsaWNlS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucmVnaW9uU3RvcmUuZ2V0RGlzcGxheVNsaWNlKCl9XFxuJHt0aGlzLnBsb3R0ZWRGaWxlTmFtZSA/PyAnJ31gO1xuICB9XG5cbiAgLyoqIEVhY2ggY2xhc3MncyB2b2x1bWUgb3ZlciB0aGUgd2hvbGUgc3RhY2ssIGluIHB4wrIgw5cgc2xpY2VzIChzZWUgUmVnaW9uU3RvcmUuY2xhc3NWb2x1bWVzKS4gKi9cbiAgYXN5bmMgZ2V0Q2xhc3NWb2x1bWVzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhhd2FpdCB0aGlzLnJlZ2lvblN0b3JlLmNsYXNzVm9sdW1lcyhjbGFzc2VzKSk7XG4gIH1cblxuICBnZXRSZWdpb25Tb3VyY2VDbGFzc0NvdW50cyhzdGFjaz86IGJvb2xlYW4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VDbGFzc0NvdW50cyhzdGFjayk7XG4gIH1cbiAgZ2V0SGlkZGVuQ2xhc3NlcyQoKTogT2JzZXJ2YWJsZTxSZWFkb25seVNldDxzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0SGlkZGVuQ2xhc3NlcyQoKTtcbiAgfVxuICBzZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldENsYXNzZXNIaWRkZW4oY2xhc3NlcywgaGlkZGVuKTtcbiAgICAvLyBBIHN1cmZhY2UgaXMgaXRzIGNsYXNzJ3MgKGl0cyBncm91cCBrZXkgaXMgdGhlIGNsYXNzIG5hbWUpLlxuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZGRlbihbLi4udGhpcy5yZWdpb25TdG9yZS5nZXRIaWRkZW5DbGFzc2VzKCldKTtcbiAgICB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCk7XG4gIH1cbiAgYXN5bmMgc2VsZWN0UmVnaW9uQ2xhc3NlcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmU/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RDbGFzc2VzKGNsYXNzZXMsIGFkZGl0aXZlKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nV2l0aFNvdXJjZShyZWdpb25zOiBSZWdpb25bXSwgc2xpY2U/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEdlb0pzb25XaXRoU291cmNlKHJlZ2lvbnMsIHNsaWNlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIChqaXQtdWkjOTMpLCBmcm9tIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUuIOKUgOKUgFxuICBlbnRlclN0YWNrTW9kZShcbiAgICBzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPixcbiAgICBpbml0aWFsWj86IG51bWJlcixcbiAgICBzYXZlTGF5b3V0PzogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScsXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUoc2xpY2VzLCBpbml0aWFsWiwgc2F2ZUxheW91dCk7XG4gIH1cbiAgZXhpdFN0YWNrTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmV4aXRTdGFja01vZGUoKTtcbiAgfVxuICBpc1N0YWNrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpO1xuICB9XG4gIC8qKiBUaGUgc2xpY2UgdGhlIHJlZ2lvbnMgYXJlIHNob3duIGZvciAocmVjb3JkZWQgb3V0c2lkZSBzdGFjayBtb2RlIHRvbykuICovXG4gIGdldERpc3BsYXlTbGljZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpO1xuICB9XG4gIGdldFN0YWNrU2F2ZUxheW91dCgpOiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KCk7XG4gIH1cbiAgc2V0RGlzcGxheVNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0RGlzcGxheVNsaWNlKHopO1xuICB9XG4gIGdldFNsaWNlUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCk7XG4gIH1cbiAgZ2V0U3RhY2tTYXZlU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCk7XG4gIH1cbiAgLyoqIEFsbCBzbGljZXMnIEFOTk9UQVRJT04gcmVnaW9ucyBmb3IgYSB6LXN0YWNrIHNhdmUgKGppdC11aSM5MyksIGVhY2ggdGFnZ2VkXG4gICAqICB3aXRoIGl0cyB6ZXJvLWJhc2VkIFJlZ2lvbi56OyBwcm9maWxlIGxpbmVzIGV4Y2x1ZGVkLiBGbGF0IGFubm90YXRpb24gc2V0XG4gICAqICBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIGdldFNsaWNlQW5ub3RhdGlvblJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gIH1cbiAgLyoqIFBlci1zbGljZSBhbm5vdGF0aW9uIHJlZ2lvbnMgdG8gd3JpdGUgb24gYSBmb2xkZXItc3RhY2sgc2F2ZSAoaml0LXVpIzkzKTpcbiAgICogIHNsaWNlIGluZGV4IOKGkiB0aGF0IHNsaWNlJ3MgYW5ub3RhdGlvbiByZWdpb25zIChwcm9maWxlIGxpbmVzIGV4Y2x1ZGVkKSxcbiAgICogIGluY2x1ZGluZyBub3ctZW1wdHkgc2xpY2VzIHRoYXQgd2VyZSBsb2FkZWQgbm9uLWVtcHR5IChzbyB0aGV5IG92ZXJ3cml0ZSkuICovXG4gIGdldFN0YWNrU2F2ZUFubm90YXRpb25TbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgZm9yIChjb25zdCBbeiwgcmVnc10gb2YgdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVTbGljZXMoKSkge1xuICAgICAgb3V0LnNldChcbiAgICAgICAgeixcbiAgICAgICAgcmVncy5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBBdXRob3JpdGF0aXZlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBzaXplIGZvciBtYXNrIGV4cG9ydC4gUHJlZmVycyB0aGVcbiAgICogIGFjdGl2ZSByZW5kZXJlcidzIHJlcG9ydGVkIHNpemUsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEgKHgveVxuICAgKiAgYXJlIHRoZSBmdWxsLXJlcyBwaXhlbCBkaW1lbnNpb25zIHVzZWQgYWNyb3NzIHRoZSBhcHApLiBSZWplY3RzIG5vbi1maW5pdGVcbiAgICogIG9yIG5vbi1wb3NpdGl2ZSBzaXplcyDigJQgdGhlIFBsb3RseSBib3VuZHMgY2FuIHlpZWxkIE5hTiBiZWZvcmUgYSBwbG90IGlzXG4gICAqICBmdWxseSBsYWlkIG91dCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNyYXNoIG1hc2sgY3JlYXRpb24uICovXG4gIGdldE1hc2tJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdmFsaWQgPSAoczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB8IHVuZGVmaW5lZCkgPT5cbiAgICAgIHMgJiYgTnVtYmVyLmlzRmluaXRlKHMud2lkdGgpICYmIE51bWJlci5pc0Zpbml0ZShzLmhlaWdodCkgJiYgcy53aWR0aCA+PSAxICYmIHMuaGVpZ2h0ID49IDFcbiAgICAgICAgPyB7IHdpZHRoOiBNYXRoLnJvdW5kKHMud2lkdGgpLCBoZWlnaHQ6IE1hdGgucm91bmQocy5oZWlnaHQpIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZnJvbVJlbmRlcmVyID0gdmFsaWQodGhpcy5nZXRUcnVlSW1hZ2VTaXplKCkpO1xuICAgIGlmIChmcm9tUmVuZGVyZXIpIHJldHVybiBmcm9tUmVuZGVyZXI7XG5cbiAgICBsZXQgbWV0YTogSUltYWdlTWV0YWRhdGFbXSA9IFtdO1xuICAgIHRoaXMuZ2V0SW1hZ2VNZXRhKClcbiAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXRhID0gbSkpXG4gICAgICAudW5zdWJzY3JpYmUoKTtcbiAgICBjb25zdCBtMCA9IG1ldGE/LlswXTtcbiAgICByZXR1cm4gbTAgPyB2YWxpZCh7IHdpZHRoOiBtMC54LCBoZWlnaHQ6IG0wLnkgfSkgOiBudWxsO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25FZGl0b3JBcGk6IGFubm90YXRpb24tb25seSBzdXJmYWNlIGZvciB0aGUgUmVnaW9uIEVkaXRvciDilIDilIDilIBcbiAgLy8gSW50ZW5zaXR5LXByb2ZpbGUgbGluZXMgKGtpbmQ9J3Byb2ZpbGUnKSBiZWxvbmcgdG8gdGhlIGludGVuc2l0eSB0b29sLCBub3RcbiAgLy8gdGhlIGVkaXRvci4gVGhlc2UgbWV0aG9kcyBnaXZlIGV4dGVybmFsIGNvbnN1bWVycyBhbiBhbm5vdGF0aW9uLW9ubHkgdmlld1xuICAvLyBhbmQgZ3VhcmFudGVlIHByb2ZpbGUgbGluZXMgYXJlIHByZXNlcnZlZC4gVGhlIHdyaXRlcyBsYW5kIGluIHRoZSBzdG9yZSBsaWtlXG4gIC8vIGFueSBvdGhlciwgYW5kIGV2ZXJ5IGJhY2tlbmQgcmVkcmF3cyBmcm9tIGl0cyBldmVudHMuXG5cbiAgZ2V0QW5ub3RhdGlvblJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIHNldEFubm90YXRpb25SZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gUmUtYXBwZW5kIHRoZSBzdG9yZSdzIHByb2ZpbGUgbGluZXMgc28gYW4gZWRpdG9yIHNhdmUvZGVsZXRlIGNhbid0IGRyb3AgdGhlbS5cbiAgICBjb25zdCBwcm9maWxlcyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IChyZWdpb25zIHx8IFtdKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgIHRoaXMuc2V0UmVnaW9ucyhbLi4uYW5ub3RhdGlvbnMsIC4uLnByb2ZpbGVzXSwgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBmYWxzZSk7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRSZWdpb25zJCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgLy8gTWFwIHRoZSBpbnRlcm5hbCBpbmRleC1iYXNlZCBzZWxlY3Rpb24gdG8gdGhlIHNlbGVjdGVkIGFubm90YXRpb24gcmVnaW9ucy5cbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKS5waXBlKFxuICAgICAgbWFwKChpZHhzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICAgICAgcmV0dXJuIGlkeHMubWFwKChpKSA9PiByZWdzW2ldKS5maWx0ZXIoKHIpOiByIGlzIFJlZ2lvbiA9PiAhIXIgJiYgIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIHNldFNlbGVjdGVkUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGNvbnN0IHJlZ3MgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBjb25zdCBpbmRpY2VzID0gKHJlZ2lvbnMgfHwgW10pLm1hcCgocikgPT4gcmVncy5maW5kSW5kZXgoKHgpID0+IHguaWQgPT09IHIuaWQpKS5maWx0ZXIoKGkpID0+IGkgPj0gMCk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0b29scyDihpIgYWN0aXZlIHJlbmRlcmVyIChydW4gb24gZWl0aGVyIGJhY2tlbmQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBUaGUgd2FuZCwgdmVydGV4IGVyYXNlciBhbmQgem9vbS10by1ib3ggYXJlIGltcGxlbWVudGVkIG9uIGJvdGggYmFja2VuZHNcbiAgLy8gdmlhIElDb29yZGluYXRlVHJhbnNmb3JtICgrIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2sgZm9yIHRoZSB3YW5kKSwgc28gdGhleVxuICAvLyBmb2xsb3cgdGhlIGFjdGl2ZSByZW5kZXJlciDigJQgdGhlIHNsaWNlIHBhbmUncyB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXMgc3BsaXQuXG4gIHNldEFjdGl2ZVRvb2woaWQ6IHN0cmluZyB8IG51bGwsIG9wdGlvbnM/OiBDYW52YXNUb29sT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldEFjdGl2ZVRvb2woaWQsIG9wdGlvbnMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRXYW5kTW9kZShhY3RpdmUsIG9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFdhbmRPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gIGNsZWFyQWN0aXZlV2FuZFJlZ2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5jbGVhckFjdGl2ZVdhbmRSZWdpb24oKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRCcnVzaE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldEJydXNoT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1cyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0Wm9vbVRvQm94TW9kZShhY3RpdmUpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uQmFja2VuZCgpLnNlZ21lbnRSZWN0YW5nbGVzKCk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk7XG4gIH1cbiAgc2V0U2FtTW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFNhbU1vZGVsKGlkKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFNhbVBvaW50TW9kZShhY3RpdmUpO1xuICB9XG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5jb21taXRTYW1Qb2ludHMoKTtcbiAgfVxuICBjbGVhclNhbVBvaW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5jbGVhclNhbVBvaW50cygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGRpc3BsYXkgb3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gU3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUg4oCUIHJlYWRzIGdvIHN0cmFpZ2h0IHRvIGl0LlxuICAvLyBUaGUgdHdvIFNFVFRFUlMgc3RpbGwgcm91dGUgdGhyb3VnaCBQbG90bHkgYmVjYXVzZSBpdHMgaW1wbGVtZW50YXRpb25zXG4gIC8vIGNhcnJ5IHJlbmRlciBnbHVlIGJleW9uZCB0aGUgc3RvcmUgd3JpdGUgKGEgbGl2ZSBQbG90bHkucmVzdHlsZSBvZlxuICAvLyBjb2xvcnNjYWxlL3JldmVyc2VzY2FsZSBvbiB0aGUgbW91bnRlZCBoZWF0bWFwKTsgT1NEIHJlY29sb3JzIHZpYSBpdHMgb3duXG4gIC8vIHN0b3JlIHN1YnNjcmlwdGlvbiBlaXRoZXIgd2F5LlxuICBnZXRDb2xvcm1hcCgpOiBPYnNlcnZhYmxlPENvbG9ybWFwTm9kZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpO1xuICB9XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRDb2xvcm1hcChjb2xvcm1hcCk7XG4gIH1cbiAgZ2V0Q29sb3JtYXBPcHRpb25zKCk6IENvbG9ybWFwTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcE9wdGlvbnMoKTtcbiAgfVxuICBnZXRSZXZlcnNlU2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCk7XG4gIH1cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRSZXZlcnNlU2NhbGUocmV2ZXJzZSk7XG4gIH1cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEltYWdlTWV0YShpbWFnZU1ldGEsIGltYWdlS2V5KTtcbiAgfVxuICBnZXRJbWFnZU1ldGEoKTogT2JzZXJ2YWJsZTxJSW1hZ2VNZXRhZGF0YVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW1hZ2VNZXRhKCk7XG4gIH1cblxuICAvLyDilIDilIAgSUNoYW5uZWxIaXN0b2dyYW1BcGk6IENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgc3VyZmFjZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ2hhbm5lbC9ncmF5c2NhbGUvaW52ZXJ0IHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlOyBib3RoXG4gIC8vIGJhY2tlbmRzIHN1YnNjcmliZSBhbmQgcmVjb2xvciBsaXZlLCBzbyBzZXR0ZXJzIGp1c3Qgd3JpdGUgdGhlIHN0b3JlLiBUaGVcbiAgLy8gaGlzdG9ncmFtIGNvbWVzIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuIChpdHMgbmF0aXZlIHBpeGVscykuXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgZGF0YSAoMTYtYml0IG11bHRpLWJhbmQgVElGRikgdmlhIHRoZSBhY3RpdmUgYmFja2VuZC4gKi9cbiAgZXhwb3J0RGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZXhwb3J0RGF0YSgpO1xuICB9XG4gIGdldENoYW5uZWxzJCgpOiBPYnNlcnZhYmxlPElDaGFubmVsU3RhdGVbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKTtcbiAgfVxuICBzZXRTZWxlY3RlZENoYW5uZWwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4KTtcbiAgfVxuICBzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlciwgcGFydGlhbDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGluZGV4LCBwYXJ0aWFsKTtcbiAgfVxuICByZXNldENvbnRyYXN0KGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgLy8gRnVsbCByZXNldDogd2luZG93ICgwLi4yNTUpLCBnYW1tYSAoMSkgQU5EIHRoZSBjaGFubmVsJ3MgZGVmYXVsdCB0aW50LlxuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB0aGlzLnN0b3JlLnJlc2V0Q2hhbm5lbFN0YXRlKGkpO1xuICB9XG4gIC8qKiBBdXRvLXdpbmRvdyBlYWNoIGNoYW5uZWwgYnkgc2F0dXJhdGluZyBgc2F0dXJhdGlvbmAgKDAuLjEpIG9mIHBpeGVscyBhdCBlYWNoXG4gICAqICBlbmQgb2YgaXRzIGhpc3RvZ3JhbSAoc2tpcHBpbmcgb3V0bGllciBmaXJzdC9sYXN0IGJpbnMpLiAqL1xuICBhdXRvQ29udHJhc3QoaW5kaWNlczogbnVtYmVyW10sIHNhdHVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShpLCAyNTYpO1xuICAgICAgaWYgKCFoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbShoLCBzYXR1cmF0aW9uLCBbMCwgMjU1XSk7XG4gICAgICBpZiAobWF4ID4gbWluKSB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZShpLCB7IG1pbiwgbWF4IH0pO1xuICAgIH1cbiAgfVxuICBnZXRHcmF5c2NhbGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEdyYXlzY2FsZSgpO1xuICB9XG4gIHNldEdyYXlzY2FsZShvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0R3JheXNjYWxlKG9uKTtcbiAgfVxuICBnZXRJbnZlcnQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEludmVydCgpO1xuICB9XG4gIHNldEludmVydChvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0SW52ZXJ0KG9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIGJhY2tlbmQncyByZWdpb24gb3ZlcmxheSAodGhlIHNsaWNlIHBhbmUncyB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXMgc3BsaXQpLiBGYWxsc1xuICAgKiBiYWNrIHRvIFBsb3RseSdzIHdoZW4gdGhlIGFjdGl2ZSBiYWNrZW5kXG4gICAqIChPU0Qgb3IgbmFwYXJpLWpzKSBpcyBzZWxlY3RlZCBidXQgYSBwbG90IGlzbid0IG1vdW50ZWQgeWV0LCBzbyBjYWxsZXJzIGFsd2F5cyBnZXQgYVxuICAgKiB1c2FibGUgb3ZlcmxheS5cbiAgICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnJlZ2lvbkJhY2tlbmQoKTtcbiAgICBpZiAociA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLm9zZC5nZXRSZWdpb25PdmVybGF5KCkgPz8gdGhpcy5wbG90bHkuZ2V0UmVnaW9uT3ZlcmxheSgpO1xuICAgIH1cbiAgICBpZiAociA9PT0gdGhpcy5uYXBhcmkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hcGFyaS5nZXRSZWdpb25PdmVybGF5KCkgPz8gdGhpcy5wbG90bHkuZ2V0UmVnaW9uT3ZlcmxheSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZ2V0UmVnaW9uT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqIElzb3N1cmZhY2UgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuLCB3aGVuIGl0IHJlbmRlcnMgaXNvc3VyZmFjZXMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRJc29zdXJmYWNlQ29udHJvbHMoKTtcbiAgfVxuXG4gIC8qKiAzRCBzY2VuZSBjb250cm9scyBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4gKFBsb3RseSBvciBuYXBhcmktanMpLCBvciBudWxsIG9uIGFcbiAgICogIDJELW9ubHkgb25lLiAqL1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFN1cmZhY2UzZENvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogSW50ZW5zaXR5IChsaW5lLVJPSSkgY29udHJvbHMsIHdoaWNoZXZlciBiYWNrZW5kIGRyYXdzIHRoZSBpbWFnZTogdGhlXG4gICAqICBJbnRlbnNpdHlQcm9maWxlU2VydmljZSBhZGRzIHRoZSBsaW5lIHRvIHRoZSBzdG9yZSwgYW5kIGV2ZXJ5IGJhY2tlbmRcbiAgICogIChQbG90bHkgaW5jbHVkZWQpIGRyYXdzIGl0IGZyb20gdGhlIHN0b3JlJ3MgdXBkYXRlIGV2ZW50LiAqL1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHk7XG4gIH1cblxuICAvKipcbiAgICogU3BhdGlhbC1vbWljcyBjb250cm9scywgb3IgbnVsbCB3aGVuIG5vIGBTUEFUSUFMX0RBVEFfUE9SVGAgaXMgYm91bmQuIFNlcnZlZCBieSBhXG4gICAqIGJhY2tlbmQtbmV1dHJhbCB7QGxpbmsgU3BhdGlhbENvbnRyb2xzRmFjYWRlfSAoc3RhdGUgaW4gdGhlIHNoYXJlZCBzdG9yZXMpLCBzbyB0aGVcbiAgICogY29udHJvbHMgd29yayBhY3Jvc3MgYSBwbG90LXR5cGUgc3dpdGNoIGFuZCBiZWZvcmUgYW55IGJhY2tlbmQgaGFzIG1vdW50ZWQuXG4gICAqL1xuICBnZXRTcGF0aWFsQ29udHJvbHMoKTogSVNwYXRpYWxDb250cm9scyB8IG51bGwge1xuICAgIGlmICghdGhpcy5zcGF0aWFsRGF0YSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5zcGF0aWFsRmFjYWRlID8/PSBuZXcgU3BhdGlhbENvbnRyb2xzRmFjYWRlKHRoaXMuc3BhdGlhbERhdGEsIHtcbiAgICAgIHN0b3JlOiB0aGlzLnN0b3JlLFxuICAgICAgcmVnaW9uU3RvcmU6IHRoaXMucmVnaW9uU3RvcmUsXG4gICAgICBzZWxlY3Rpb25TdG9yZTogdGhpcy5zZWxlY3Rpb25TdG9yZSxcbiAgICAgIG5hcGFyaTogdGhpcy5uYXBhcmksXG4gICAgICBwbG90VHlwZTogKCkgPT4gdGhpcy5jdXJyZW50UGxvdFR5cGUsXG4gICAgICB6SW5kZXg6ICgpID0+IHRoaXMuY3VycmVudFpJbmRleCxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zcGF0aWFsRmFjYWRlLmNvbnRyb2xzO1xuICB9XG5cbiAgLyoqIENyZWF0ZWQgb24gZmlyc3QgdXNlOyBvd25zIHRoZSBkYXRhc2V0IHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRmFjYWRlOiBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIERpc3BsYXllZCBzbGljZS4gT25seSBhIHZvbHVtZS1iYWNrZWQgc3BhdGlhbCBkYXRhc2V0IHJlYWRzIGl0LCB0byBrZWVwIGFcbiAgICogIHJlZ2lvbiBkcmF3biBvdmVyIG9uZSBzZWN0aW9uIGZyb20gc2VsZWN0aW5nIHRoZSB3aG9sZSBkZXB0aCBiZWhpbmQgaXQuICovXG4gIHByaXZhdGUgY3VycmVudFpJbmRleCA9IDA7XG5cbiAgLyoqIEFuZ3VsYXIgY2FsbHMgdGhpcyB3aGVuIHRoZSBpbmplY3RvciBwcm92aWRpbmcgdGhlIHJvdXRlciBpcyBkZXN0cm95ZWQg4oCUIHRoZSBob3N0XG4gICAqICBjb21wb25lbnQgZm9yIGEgYHByb3ZpZGVWaXN1YWxpemF0aW9uKClgIGNoYWluLiBUaGUgZGF0YXNldCBzdWJzY3JpcHRpb24gd291bGRcbiAgICogIG90aGVyd2lzZSBrZWVwIHRoZSB3aG9sZSBpc29sYXRlZCBjaGFpbiByZWFjaGFibGUgZnJvbSB0aGUgcm9vdCBkYXRhIHBvcnQuICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0VGlja2V0ID0geyBpZDogdGhpcy5pbXBvcnRUaWNrZXQuaWQgKyAxLCBpbWFnZTogdW5kZWZpbmVkIH07IC8vIGEgbGF0ZSBpbXBvcnQgY2hhbmdlcyBub3RoaW5nXG4gICAgdGhpcy5zcGF0aWFsRmFjYWRlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zcGF0aWFsRmFjYWRlID0gbnVsbDtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgaWYgKHRoaXMucmVidWlsZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWJ1aWxkVGltZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuc2l0eS1wcm9maWxlIHNhbXBsaW5nLCB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW46IHRoZSBzYW1wbGluZyBpcyB0aGVcbiAgICogYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlJ3M7IHRoZSB2aWV3cG9ydCBjaGFuZ2VzIGNvbWUgZnJvbSBldmVyeVxuICAgKiBiYWNrZW5kIHRoYXQgcmVwb3J0cyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBtZXJnZWQgaW50byBvbmUgc3RhYmxlXG4gICAqIHN0cmVhbSB0aGUgaW5zZXQgc3Vic2NyaWJlcyB0byBvbmNlLlxuICAgKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVNhbXBsaW5nOiBJSW50ZW5zaXR5U2FtcGxpbmcgPSB7XG4gICAgLy8gTG9hZCB0aGUgZGlzcGxheWVkIHNsaWNlJ3MgcGl4ZWxzIGZvciBhIGJhY2tlbmQgdGhhdCBoYXMgbm8gZnJhbWVzIG9mIGl0cyBvd25cbiAgICAvLyAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzOyBQbG90bHkgZmVlZHMgaXRzIGZyYW1lcyB0byB0aGUgc2VydmljZSB3aGVuIGl0IHBsb3RzKS5cbiAgICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZzogKGltYWdlSW5mbywgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfSxcbiAgICAvLyBSZS1zYW1wbGUgZnJvbSBhIGZyZXNoIGNyb3Agb2YgdGhlIGltYWdlLXBpeGVsIFJPSSBhdCBkaXNwbGF5IHJlc29sdXRpb24uXG4gICAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pOiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHRoaXMuaW50ZW5zaXR5LnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICAgIH0sXG4gICAgZ2V0Vmlld3BvcnRDaGFuZ2UkOiAoKSA9PlxuICAgICAgbWVyZ2UoLi4udGhpcy5iYWNrZW5kcygpLm1hcCgoYikgPT4gYi5nZXRJbnRlbnNpdHlTYW1wbGluZygpPy5nZXRWaWV3cG9ydENoYW5nZSQoKSA/PyBFTVBUWSkpLFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIENyb3BzIGZvciBzYW1wbGluZyBhcmUgc2l6ZWQgZnJvbSB0aGUgcGxvdCBkaXYgKHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMgaW50byBpdCkuICovXG4gIHByaXZhdGUgcG9pbnRTYW1wbGluZ0F0UGxvdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB0aGlzLmludGVuc2l0eS5zZXRTYW1wbGluZ0VsZW1lbnQodGhpcy5wbG90RGl2KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZ2V0Vmlld3BvcnRDaGFuZ2UkKClgLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZ2V0Vmlld3BvcnRDaGFuZ2UkKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSgpYC4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmludGVuc2l0eVNhbXBsaW5nLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXN1YWxpemVyIHZpZXcgaXMgZ29pbmcgYXdheTogZGV0YWNoIGV2ZXJ5IGJhY2tlbmQg4oCUIGRyb3BwaW5nIHRoZWlyIHZpZXctYm91bmRcbiAgICogIHN1YnNjcmlwdGlvbnMgYW5kIGRpc3Bvc2luZyB0aGUgbmFwYXJpLWpzIHZpZXdlciwgd2hvc2UgY2FudmFzLCByZW5kZXIgbG9vcCBhbmQgR1BVXG4gICAqICBidWZmZXJzIHdvdWxkIG90aGVyd2lzZSBvdXRsaXZlIHRoZSB2aWV3IChmb3IgYSBjb21wb25lbnQtc2NvcGVkIGNoYWluLCBmb3JldmVyKS5cbiAgICogIE5vdGhpbmcgaXMgb24gc2NyZWVuIGFmdGVyd2FyZHMsIHNvIHRoZSBuZXh0IHBsb3Qgc3RhcnRzIGZyb20gdGhlIGRlZmF1bHQgYmFja2VuZC4gKi9cbiAgZGV0YWNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgdGhpcy5zbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlRGl2ID0gbnVsbDtcbiAgICB0aGlzLnBsb3RseS5kZXRhY2goKTtcbiAgICB0aGlzLm9zZC5kZXRhY2goKTtcbiAgICB0aGlzLm5hcGFyaS5kZXRhY2goKTtcbiAgICB0aGlzLmxhc3RSZW5kZXJlZCA9IG51bGw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LiAqL1xuICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaCgpO1xuICB9XG59XG4iXX0=
1312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUl4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUsxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDaEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7O0FBRzlELDRGQUE0RjtBQUM1RixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFFN0M7O2dDQUVnQztBQUNoQyxTQUFTLGVBQWUsQ0FBQyxDQUF1QztJQUM5RCxPQUFPLENBQUMsRUFBRSxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBcUVuQyxZQUNVLE1BQXFCLEVBQ3JCLEdBQW1DLEVBQ25DLE1BQStCLEVBQy9CLEtBQXNCLEVBQ0YsTUFBaUI7SUFDN0Msb0VBQW9FO0lBQ3BFLGdEQUFnRDtJQUN4QyxXQUF3QixFQUN4QixjQUFxQyxFQUNyQyxTQUFrQyxFQUdsQyxjQUFzQyxJQUFJO1FBWjFDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsUUFBRyxHQUFILEdBQUcsQ0FBZ0M7UUFDbkMsV0FBTSxHQUFOLE1BQU0sQ0FBeUI7UUFDL0IsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDRixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBR3JDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxjQUFTLEdBQVQsU0FBUyxDQUF5QjtRQUdsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBK0I7UUFqRjVDLG9CQUFlLEdBQWEsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzQyxpQkFBWSxHQUEwQixJQUFJLENBQUM7UUFDbkQ7Ozs7aUZBSXlFO1FBQ2pFLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzVCO3NGQUM4RTtRQUN0RSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUcvQiw0RkFBNEY7UUFDcEYsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNyQjs7OztXQUlHO1FBQ2MsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNuRSwrRkFBK0Y7UUFDdkYsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDaEMsbUZBQW1GO1FBQ2xFLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDcEUsbUZBQW1GO1FBQ2xFLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzdFLGtHQUFrRztRQUNqRixjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXNELENBQUM7UUFDM0YsZ0dBQWdHO1FBQ3hGLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLGtFQUFrRTtRQUNqRCxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQy9DLEVBQUUsQ0FDSCxDQUFDO1FBRUYsK0ZBQStGO1FBQ3ZGLFlBQU8sR0FBOEYsRUFBRSxDQUFDO1FBQ2hIOzs7O1dBSUc7UUFDSyxnQkFBVyxHQUE0RSxJQUFJLENBQUM7UUFDcEcsMkRBQTJEO1FBQ25ELGlCQUFZLEdBQXlDLElBQUksQ0FBQztRQUdsRSwyRkFBMkY7UUFDM0YsK0VBQStFO1FBQ3ZFLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLHlGQUF5RjtRQUNqRixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUc3Qiw2RUFBNkU7UUFDckUsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFHekIsd0ZBQXdGO1FBQ3ZFLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ25DLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsRCxzRkFBc0Y7UUFDOUUsZ0JBQVcsR0FBc0IsSUFBSSxDQUFDO1FBQzlDLGlHQUFpRztRQUN6RixpQkFBWSxHQUE4QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3RGLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBZ1ZULGdCQUFXLEdBQW9CO1lBQzlDLG1CQUFtQixFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQy9CLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFBRSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2RixDQUFDO1lBQ0Qsd0JBQXdCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUFFLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVGLENBQUM7U0FDRixDQUFDO1FBaTBCRiwyREFBMkQ7UUFDbkQsa0JBQWEsR0FBaUMsSUFBSSxDQUFDO1FBQzNEO3NGQUM4RTtRQUN0RSxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQXdCVCxzQkFBaUIsR0FBdUI7WUFDdkQsZ0ZBQWdGO1lBQ2hGLG9GQUFvRjtZQUNwRix1QkFBdUIsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDN0MsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELDRFQUE0RTtZQUM1RSw4QkFBOEIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDOUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FDdkIsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQztTQUNoRyxDQUFDO1FBanJDQSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUN4QyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDakMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7WUFDMUQsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbkUsYUFBYSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDL0QsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUMxQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTtZQUN0RCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUU7Z0JBQzdCLG1GQUFtRjtnQkFDbkYsTUFBTSxPQUFPLEdBQUc7b0JBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO29CQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtvQkFDekMsTUFBTSxFQUFFLEtBQUs7aUJBQ2QsQ0FBQztnQkFDRixPQUFPLGVBQWUsQ0FDcEIsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FDbEcsQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDeEMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhO1NBQ2hDLENBQUMsQ0FBQztRQUNILDRGQUE0RjtRQUM1Rix1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzdELElBQUksSUFBSSxLQUFLLEdBQUc7Z0JBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDOztnQkFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCw2RkFBNkY7SUFDckYsVUFBVSxDQUFDLEtBQWE7UUFDOUIsT0FBTyxDQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3ZFLFNBQVMsQ0FDVixDQUFDO0lBQ0osQ0FBQztJQUVELCtFQUErRTtJQUMvRSxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxlQUFlLENBQUMsSUFBaUIsRUFBRSxFQUFVO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsOEZBQThGO0lBQzlGLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVPLFdBQVcsQ0FBQyxDQUFXO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7Z0dBTTRGO0lBQ3BGLGlCQUFpQixDQUFDLENBQVc7UUFDbkMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRDtnRkFDNEU7SUFDcEUsY0FBYyxDQUFDLENBQVc7UUFDaEMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxZQUFZO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDL0IsMEZBQTBGO1FBQzFGLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUN4RixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztnQkFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFDRCx5REFBeUQ7UUFDekQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25ELENBQUM7UUFDRCx1RUFBdUU7UUFDdkUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELDhFQUE4RTtJQUN0RSxRQUFRO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxhQUFhO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRCx5RUFBeUU7SUFDekUsdUVBQXVFO0lBQ3ZFLElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDbEMsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQXFCLEVBQUUsTUFBYyxFQUFFLE1BQW9CO1FBQ3BFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BDLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2Isa0ZBQWtGO2dCQUNsRixJQUFJLE1BQU0sRUFBRSxPQUFPO29CQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IseUVBQXlFO2dCQUN6RSwrREFBK0Q7Z0JBQy9ELGtDQUFrQztnQkFDbEMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNsRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxxRUFBcUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDekYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELDRGQUE0RjtJQUNwRixLQUFLLENBQUMsb0JBQW9CLENBQ2hDLFNBQXFCLEVBQ3JCLE1BQWMsRUFDZCxNQUFvQjtRQUVwQixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksTUFBTSxFQUFFLE9BQU87Z0JBQUUsTUFBTSxHQUFHLENBQUM7WUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxpRkFBaUYsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQ0YsT0FBZSxFQUNmLFdBQW9CLEVBQ3BCLFNBQXFCLEVBQ3JCLFlBQW9CLEVBQ3BCLFFBQWtCLEVBQ2xCLE9BQWlCO1FBRWpCLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxFQUFFLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLHlGQUF5RjtRQUN6RixxRkFBcUY7UUFDckYsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9DLHNGQUFzRjtRQUN0RixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxjQUFjO1lBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw0RUFBNEU7UUFDNUUsOERBQThEO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqQywyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwRCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLE1BQU07Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Z0JBQzFELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDNUQsNEZBQTRGO1FBQzVGLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLFFBQVEsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNwRixLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2pHLENBQUM7WUFDRCwyRkFBMkY7WUFDM0YsSUFBSSxFQUFFO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFrQjtRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxHQUFHO1lBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdGQUFnRjtJQUN4RSxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQWdCO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNwQyxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0QsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDaEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0YsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQy9CLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ1Asa0RBQWtEO2dCQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hCLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsdURBQXVELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0UsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELGdHQUFnRztJQUN4RixZQUFZO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsS0FBSztRQUNILDZFQUE2RTtRQUM3RSwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxRQUFRLENBQUMsYUFBd0I7UUFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsU0FBUztRQUNQLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsU0FBUztRQUNQLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QseUNBQXlDO0lBQ3pDLFNBQVM7UUFDUCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU07UUFDSixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQU87UUFDTCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELFdBQVcsQ0FBQyxJQUFvQjtRQUM5QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsdUNBQXVDO0lBQy9CLFFBQVE7UUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQVNELG1FQUFtRTtJQUNuRSxtQkFBbUIsQ0FBQyxPQUFnQjtRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCx3RUFBd0U7SUFDeEUsd0JBQXdCLENBQUMsT0FBZ0I7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsWUFBWSxDQUFDLFNBQWtCO1FBQzdCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUNELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUNELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUNELHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBa0I7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxnREFBZ0Q7SUFDaEQsa0JBQWtCLENBQUMsSUFBWTtRQUM3QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsZ0RBQWdEO0lBQ2hELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFDRCw4RUFBOEU7SUFDOUUsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELHNEQUFzRDtJQUN0RCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0Qsc0RBQXNEO0lBQ3RELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0Q7K0VBQzJFO0lBQzNFLG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsbUZBQW1GO1FBQ25GLDJGQUEyRjtRQUMzRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLGVBQWUsQ0FBQyxDQUFVO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxpR0FBaUc7SUFDakcsa0dBQWtHO0lBQ2xHLGlHQUFpRztJQUNqRyxhQUFhO1FBQ1gsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFxQixFQUFFLENBQUM7WUFDL0UsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFDRCxnR0FBZ0c7SUFDaEcseUZBQXlGO0lBQ3pGLDZGQUE2RjtJQUM3RixjQUFjO1FBQ1osT0FBTyxhQUFhLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUU7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7U0FDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCx1QkFBdUI7UUFDckIsaUdBQWlHO1FBQ2pHLGtHQUFrRztRQUNsRyxrR0FBa0c7UUFDbEcsb0ZBQW9GO1FBQ3BGLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBaUIsRUFBaUMsRUFBRSxDQUNqRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbEYsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQ0QsMkZBQTJGO0lBQzNGLDBGQUEwRjtJQUMxRixtRUFBbUU7SUFDbkUsaUJBQWlCO1FBQ2YsT0FBTyxLQUFLLENBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxFQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEVBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FDaEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELHFGQUFxRjtJQUNyRixvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELGtGQUFrRjtJQUNsRixnQ0FBZ0M7SUFDaEMsb0JBQW9CLENBQUMsS0FBYSxFQUFFLFFBQTRCO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsNkVBQTZFO0lBQzdFLDJFQUEyRTtJQUMzRSwrRUFBK0U7SUFDL0UsNkVBQTZFO0lBQzdFLGdDQUFnQztJQUNoQyxVQUFVLENBQ1IsT0FBaUIsRUFDakIsZUFBeUIsRUFDekIsY0FBd0IsRUFDeEIsU0FBa0IsRUFDbEIsTUFBZ0I7UUFFaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFDRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBQ0Qsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFDRCx1QkFBdUIsQ0FBQyxPQUFpQjtRQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxZQUFZLENBQUMsTUFBYztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0Qsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUNELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFDRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFDRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELHNCQUFzQixDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCwrRUFBK0U7SUFDL0Usc0ZBQXNGO0lBQ3RGLFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUNELFlBQVksQ0FBQyxHQUFjO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDRCxXQUFXLENBQUMsTUFBbUI7UUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUk7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUNELGFBQWEsQ0FBQyxVQUFrQjtRQUM5QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCx5RUFBeUU7SUFDekUsYUFBYSxDQUFDLE9BQWlCO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNELGdCQUFnQixDQUFDLE9BQWlCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNkZBQTZGO0lBQzdGLGtCQUFrQixDQUFDLE1BQXlDLEVBQUUsTUFBMkI7UUFDdkYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFrQjtRQUN6QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixJQUFJLHVCQUF1QixDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckcsSUFBSSxNQUFNLEdBQXdCLE1BQU0sdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUUsb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFO1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUN0QixNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxxRkFBcUY7SUFDN0UsaUJBQWlCLENBQUMsTUFBYztRQUN0QyxPQUFPLE1BQU0sS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDOUYsQ0FBQztJQUVPLGNBQWM7UUFDcEIsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsd0JBQXdCLENBQUMsT0FBZ0QsRUFBRSxNQUFlO1FBQ3hGLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztRQUNuRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ25CLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0YsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQUMsSUFBd0IsRUFBRSxNQUFlO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hELElBQUksS0FBSyxHQUF3QixNQUFNLElBQUksRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQXVCLEdBQUcsRUFBRTtZQUNyQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDckIsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNiLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuRCxDQUFDLENBQUM7UUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFrQixDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEcsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0dBQWdHO0lBQ3hGLGtCQUFrQixDQUFDLElBQWdCO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFO1lBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUs7Z0JBQ3BCLENBQUMsQ0FBQyxnQkFBZ0I7Z0JBQ2xCLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFDRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUNELG9CQUFvQixDQUFDLEtBQXdDO1FBQzNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0Qsb0JBQW9CLENBQUMsR0FBc0IsRUFBRSxRQUFrQjtRQUM3RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxHQUFzQjtRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFDRCxjQUFjLENBQUMsS0FBMkI7UUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELHlFQUF5RTtJQUV6RSxxRkFBcUY7SUFDN0UsZ0JBQWdCLENBQUMsUUFBa0I7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RHLDhGQUE4RjtRQUM5RixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsNkZBQTZGO0lBQzdGLGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUIsQ0FBQyxPQUFnQjtRQUN0QyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEtBQUssT0FBTztZQUFFLE9BQU87UUFDekQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsb0ZBQW9GO0lBQzVFLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELDBGQUEwRjtJQUMxRix3QkFBd0IsQ0FBQyxJQUF1QjtRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxvR0FBb0c7SUFDcEcsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUN2QixNQUFpRztRQUVqRyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLHVGQUF1RjtRQUN2RixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBaUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzdHLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFDOUQsSUFBSSxDQUNMLENBQUM7Z0JBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLO29CQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRyxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLENBQUM7WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBSSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BHLENBQUMsQ0FBQyxFQUNGLElBQUksQ0FBQyxlQUFlLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQjtRQUN0Qiw2RkFBNkY7UUFDN0YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BDLHdGQUF3RjtRQUN4RixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQzVDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRSw4RkFBOEY7UUFDOUYsd0ZBQXdGO1FBQ3hGLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUN6QyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDL0QsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hFLEtBQUssSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGlHQUFpRztJQUN6RixnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLFdBQVcsS0FBSztZQUNuQixFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN2QixVQUFVLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUQsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUU7U0FDOUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsdURBQXVEO0lBQy9DLFlBQVk7UUFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEtBQUssSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBMEI7UUFDOUMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsMEJBQTBCLENBQUMsS0FBZTtRQUN4QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxPQUEwQixFQUFFLE1BQWU7UUFDMUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsOERBQThEO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUEwQixFQUFFLFFBQWtCO1FBQ3RFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCwwQkFBMEIsQ0FBQyxPQUFpQixFQUFFLEtBQWM7UUFDMUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLGNBQWMsQ0FDWixNQUE2QixFQUM3QixRQUFpQixFQUNqQixVQUEwQztRQUUxQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsNkVBQTZFO0lBQzdFLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsZUFBZSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ0Q7OzhCQUUwQjtJQUMxQix5QkFBeUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0Q7O3FGQUVpRjtJQUNqRiw0QkFBNEI7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDeEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQzlELEdBQUcsQ0FBQyxHQUFHLENBQ0wsQ0FBQyxFQUNELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3hDLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7cUVBSWlFO0lBQ2pFLGdCQUFnQjtRQUNkLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBdUQsRUFBRSxFQUFFLENBQ3hFLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDekYsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5RCxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRVgsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxZQUFZO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFFdEMsSUFBSSxJQUFJLEdBQXFCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFO2FBQ2hCLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDNUIsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFELENBQUM7SUFFRCx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSwrRUFBK0U7SUFDL0Usd0RBQXdEO0lBRXhELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxvQkFBb0IsQ0FDbEIsT0FBaUIsRUFDakIsZUFBeUIsRUFDekIsY0FBd0IsRUFDeEIsU0FBa0I7UUFFbEIsZ0ZBQWdGO1FBQ2hGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxFQUFFLEdBQUcsUUFBUSxDQUFDLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUNELG1CQUFtQjtRQUNqQiw2RUFBNkU7UUFDN0UsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxJQUFJLENBQ3pDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsT0FBaUI7UUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLCtFQUErRTtJQUMvRSxnRkFBZ0Y7SUFDaEYsYUFBYSxDQUFDLEVBQWlCLEVBQUUsT0FBMkI7UUFDMUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELDZDQUE2QztJQUM3QyxXQUFXLENBQUMsTUFBZSxFQUFFLE9BQXNCO1FBQ2pELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxjQUFjLENBQUMsT0FBcUI7UUFDbEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFDRCw2Q0FBNkM7SUFDN0MsWUFBWSxDQUFDLE1BQWUsRUFBRSxPQUF1QjtRQUNuRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsZUFBZSxDQUFDLE9BQXNCO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELDZDQUE2QztJQUM3QyxtQkFBbUIsQ0FBQyxNQUFlO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QscUJBQXFCLENBQUMsTUFBYztRQUNsQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELDZDQUE2QztJQUM3QyxnQkFBZ0IsQ0FBQyxNQUFlO1FBQzlCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBQ0QseUJBQXlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUNELFdBQVcsQ0FBQyxFQUFVO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELDZDQUE2QztJQUM3QyxlQUFlLENBQUMsTUFBZTtRQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsdUVBQXVFO0lBQ3ZFLHlFQUF5RTtJQUN6RSxxRUFBcUU7SUFDckUsNEVBQTRFO0lBQzVFLGlDQUFpQztJQUNqQyxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxXQUFXLENBQUMsUUFBc0I7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsZUFBZSxDQUFDLE9BQWdCO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxZQUFZLENBQUMsU0FBMkIsRUFBRSxRQUFpQjtRQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSxZQUFZLENBQUMsWUFBb0IsRUFBRSxJQUFZO1FBQzdDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELGFBQWEsQ0FBQyxZQUFvQixFQUFFLElBQVk7UUFDOUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0Qsa0ZBQWtGO0lBQ2xGLFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsS0FBYTtRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxlQUFlLENBQUMsS0FBYSxFQUFFLE9BQStCO1FBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsYUFBYSxDQUFDLE9BQWlCO1FBQzdCLHlFQUF5RTtRQUN6RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU87WUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRDttRUFDK0Q7SUFDL0QsWUFBWSxDQUFDLE9BQWlCLEVBQUUsVUFBa0I7UUFDaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN4QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxTQUFTO1lBQ2pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksR0FBRyxHQUFHLEdBQUc7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCxZQUFZLENBQUMsRUFBVztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsU0FBUyxDQUFDLEVBQVc7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZ0JBQWdCO1FBQ2QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkUsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxpRkFBaUY7SUFDakYscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEO3VCQUNtQjtJQUNuQixvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O29FQUVnRTtJQUNoRSxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2pFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDcEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhO1NBQ2pDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQVFEOztxRkFFaUY7SUFDakYsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLGdDQUFnQztRQUN4RyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBZ0JELDBFQUEwRTtJQUMxRSx1QkFBdUIsQ0FBQyxTQUFxQixFQUFFLE1BQWM7UUFDM0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCwwRkFBMEY7SUFDbEYsbUJBQW1CO1FBQ3pCLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxpRkFBaUY7SUFDakYsOEJBQThCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLE1BQWM7UUFDaEcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDhCQUE4QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs2RkFHeUY7SUFDekYsTUFBTTtRQUNKLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDOzhHQTV5Q1Usd0JBQXdCLG1LQTBFekIsVUFBVSxvSEFPVixpQkFBaUI7a0hBakZoQix3QkFBd0IsY0FEWCxNQUFNOzsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBMkU3QixNQUFNOzJCQUFDLFVBQVU7OzBCQU1qQixRQUFROzswQkFDUixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgbWVyZ2UsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICdpbWFnZS1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQ29sb3JtYXAgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvLCBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IFBsb3RseVNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvb3NkL29wZW5zZWFkcmFnb24tdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNTcGF0aWFsT21pY3MsXG4gIGlzU3BhdGlhbE9taWNzM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlWb2x1bWUsXG59IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlld2VyQmFja2VuZCxcbiAgSVZpc3VhbGl6ZXIsXG4gIExvYWRlZEltYWdlLFxuICBQaXhlbERhdGEsXG4gIEludGVuc2l0eVByb2ZpbGUsXG4gIElJc29zdXJmYWNlQ29udHJvbHMsXG4gIElJbnRlbnNpdHlDb250cm9scyxcbiAgSVN1cmZhY2UzZENvbnRyb2xzLFxuICBJU3BhdGlhbENvbnRyb2xzLFxuICBJSW50ZW5zaXR5U2FtcGxpbmcsXG4gIElPc2RWaWV3T3B0aW9ucyxcbiAgSVZvbHVtZVJlc29sdXRpb24sXG59IGZyb20gJy4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgU1BBVElBTF9EQVRBX1BPUlQsIFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IENhbnZhc1Rvb2xPcHRpb25zLCBDb2xvcm1hcE5vZGUsIElCcnVzaE9wdGlvbnMsIElXYW5kT3B0aW9ucyB9IGZyb20gJy4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgU3BhdGlhbENvbnRyb2xzRmFjYWRlIH0gZnJvbSAnLi9zcGF0aWFsL3NwYXRpYWwtY29udHJvbHMuZmFjYWRlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TY29wZUNhY2hlIH0gZnJvbSAnLi9zdG9yZS9yZWdpb24tc2NvcGUtY2FjaGUnO1xuaW1wb3J0IHsgUkVHSU9OX1NPVVJDRV9NSU5fQ0hBUlMsIFJlZ2lvblNvdXJjZSwgUmVnaW9uU291cmNlVmlldyB9IGZyb20gJy4vcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uSW5kZXhQYWdlLCBSZWdpb25JbmRleFF1ZXJ5IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi10aWxlcyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lvblN0eWxlIH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3R5bGUnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcbmltcG9ydCB7IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3dvcmtlci1yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU291cmNlT3BlbmVyLCBSZWdpb25Tb3VyY2VTbGljZXMgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zb3VyY2Utc2NvcGUnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25FZGl0b3JBcGkgfSBmcm9tICcuL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSwgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBhdXRvV2luZG93RnJvbUhpc3RvZ3JhbSB9IGZyb20gJy4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IGNoYW5uZWxUaW50Q29sb3JtYXAsIHZvbHVtZUNvbG9ybWFwIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgUGxvdE1vZGVWaWV3cG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgfSBmcm9tICcuL2ludGVuc2l0eS9pbnRlbnNpdHktcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IGNoYW5nZWRDbGFzc2VzLCBjbGFzc1NpZ25hdHVyZXMgfSBmcm9tICcuL3N0b3JlL2NsYXNzLXNpZ25hdHVyZXMnO1xuaW1wb3J0IHsgVm9sdW1lU2VjdGlvbnMgfSBmcm9tICcuL3Zpc3VhbGl6ZXIvdm9sdW1lLXNlY3Rpb25zJztcbmltcG9ydCB0eXBlIHsgU2VjdGlvbkF4aXMsIFNlY3Rpb25WaWV3cyB9IGZyb20gJy4vY29udHJhY3RzL3NlY3Rpb24tdmlldy5jb250cmFjdCc7XG5cbi8qKiBIb3cgbG9uZyBhZnRlciB0aGUgbGFzdCBlZGl0IHRoZSBzdXJmYWNlcyBvZiB0aGUgY2xhc3NlcyBpdCB0b3VjaGVkIGFyZSByZWJ1aWx0IChtcykuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1NVUkZBQ0VfUkVCVUlMRF9NUyA9IDYwMDtcblxuLyoqIEludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JcyBhcmUgb3duZWQgYnkgdGhlIGludGVuc2l0eSB0b29sLCBub3QgdGhlIGVkaXRvci5cbiAqICBQYWNrYWdlLWludGVybmFsIHByZWRpY2F0ZSAocHJvcGVydHktYmFzZWQgc28gaXQgYWxzbyBtYXRjaGVzIHBsYWluIG9iamVjdHNcbiAqICBhZnRlciBhIGRyYWcgcm91bmQtdHJpcCkuICovXG5mdW5jdGlvbiBpc1Byb2ZpbGVSZWdpb24ocjogeyBraW5kPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiByPy5raW5kID09PSAncHJvZmlsZSc7XG59XG5cbi8qKlxuICogVGhlIHZpc3VhbGl6ZXIgY2hhaW4ncyBmcm9udCBkb29yOiBpbXBsZW1lbnRzIGBJVmlzdWFsaXplcmAsIGBJUmVnaW9uRWRpdG9yQXBpYFxuICogYW5kIGBJQ2hhbm5lbEhpc3RvZ3JhbUFwaWAgKGJvdW5kIHRvIHRoZSBgVklTVUFMSVpFUmAgLyBgUkVHSU9OX0VESVRPUl9BUElgIC9cbiAqIGBDSEFOTkVMX0hJU1RPR1JBTV9BUElgIHRva2Vucykgb3ZlciB0aHJlZSByZW5kZXJpbmcgYmFja2VuZHMsIGNob3NlbiBwZXIgcGxvdCB0eXBlOlxuICogIC0gKipJbWFnZSoqIHJlbmRlcnMgdGhyb3VnaCBPcGVuU2VhZHJhZ29uIChuYXRpdmVseSB0aWxlZCwgcmVnaW9uIHRvb2xzLFxuICogICAgY2xpZW50LXNpZGUgY29sb3JtYXApLCBvciB0aHJvdWdoIG5hcGFyaS1qcyB3aGVuIGBWaXpDb25maWcudXNlTmFwYXJpUmVuZGVyZXJgXG4gKiAgICBvcHRzIGluOyB0aGUgbmFwYXJpIGltYWdlIHR5cGVzIGFuZCB0aGUgMkQgc3BhdGlhbC1vbWljcyBtb2RlIHJlbmRlciB0aHJvdWdoXG4gKiAgICBuYXBhcmktanMuIEEgZmFpbGVkIGxvYWQgZmFsbHMgYmFjayBuYXBhcmktanMg4oaSIE9TRCDihpIgUGxvdGx5IGZvciB0aGF0IGltYWdlIG9ubHlcbiAqICAgIChzZWUgYG5hcGFyaUZlbGxCYWNrYCAvIGBvc2RGZWxsQmFja2AsIGNsZWFyZWQgYnkgYHJlc2V0KClgKS5cbiAqICAtIHRoZSBuYXBhcmkgM0QgdHlwZXMgKHZvbHVtZSwgaXNvc3VyZmFjZSwgc3VyZmFjZSwgM0Qgc2NhdHRlciwgdGhlIDNEIHNwYXRpYWxcbiAqICAgIGNsb3VkKSByZW5kZXIgdGhyb3VnaCBuYXBhcmktanMsIGZhbGxpbmcgYmFjayB0byBQbG90bHkuXG4gKiAgLSBldmVyeSBvdGhlciBwbG90IHR5cGUgKGhlYXRtYXAsIGNvbnRvdXIsIHN1cmZhY2UsIHNjYXR0ZXIsIGxpbmUsIOKApikgcmVuZGVyc1xuICogICAgdGhyb3VnaCBQbG90bHkuXG4gKlxuICogT25seSByZW5kZXJpbmcgYW5kIHRoZSB2aWV3cG9ydCBhcmUgcm91dGVkIHRvIHRoZSBiYWNrZW5kIG9uIHNjcmVlbi4gUmVnaW9uIHN0YXRlXG4gKiBsaXZlcyBpbiB0aGUgc2hhcmVkIGBSZWdpb25TdG9yZWAgYW5kIGRpc3BsYXkgc3RhdGUgKGNvbG9ybWFwLCBjaGFubmVscywgcHJlc2V0cyxcbiAqIHNwYXRpYWwgdmlldykgaW4gdGhlIHNoYXJlZCBgVmlzdWFsaXplclN0b3JlYCwgc28gZXZlcnkgYmFja2VuZCBzZWVzIHRoZSBzYW1lXG4gKiB2YWx1ZXM7IHRoZSBiYWNrZW5kcyBzdWJzY3JpYmUgdG8gdGhlbSB0byByZWRyYXcuXG4gKlxuICogUGFja2FnZS1pbnRlcm5hbDogaG9zdHMgZGVwZW5kIG9uIHRoZSB0b2tlbnMsIG5vdCBvbiB0aGlzIGNsYXNzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSBpbXBsZW1lbnRzIElWaXN1YWxpemVyLCBJUmVnaW9uRWRpdG9yQXBpLCBJQ2hhbm5lbEhpc3RvZ3JhbUFwaSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuSU1BR0U7XG4gIHByaXZhdGUgbGFzdFJlbmRlcmVkOiBJVmlld2VyQmFja2VuZCB8IG51bGwgPSBudWxsO1xuICAvKiogT1NEIGZhaWxlZCBmb3IgdGhlICpjdXJyZW50KiByZW5kZXIgY3ljbGUgKGUuZy4gYSBmcmVzaCBmaWxlIHN0aWxsIGNhY2hpbmdcbiAgICogIHBhc3QgdGhlIGRlYWRsaW5lKSDihpIgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSBvbmx5LiBSZXNldCBieVxuICAgKiAgcmVzZXQoKSBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgcmVuZGVyIGN5Y2xlLCBzbyB0aGUgbmV4dCBmaWxlIOKAlCBvciBhXG4gICAqICByZS1zZWxlY3Qgb25jZSB0aGUgZmlsZSBpcyBjYWNoZWQg4oCUIHJldHJpZXMgT1NELiAoV2FzIGEgcGVybWFuZW50IGZsYWcsXG4gICAqICB3aGljaCBsZWZ0IHRoZSB3aG9sZSBzZXNzaW9uIHN0dWNrIG9uIFBsb3RseSBhZnRlciBvbmUgc2xvdyBsb2FkLikgKi9cbiAgcHJpdmF0ZSBvc2RGZWxsQmFjayA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGZhaWxlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyIGN5Y2xlIOKGkiBmYWxsIGJhY2sgdG8gT1NEICh0aGVuIFBsb3RseSkuXG4gICAqICBSZXNldCBieSByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSBjeWNsZSwgbGlrZSB7QGxpbmsgb3NkRmVsbEJhY2t9LiAqL1xuICBwcml2YXRlIG5hcGFyaUZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBUaGUgZmlsZSBuYW1lIG9mIHRoZSBpbWFnZSBsYXN0IHBsb3R0ZWQgKG5hbWVzIGEgR2VvSlNPTiBleHBvcnQpLiAqL1xuICBwcml2YXRlIHBsb3R0ZWRGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIGRpdiB0aGUgYmFja2VuZHMgcmVuZGVyIGludG8gKGV2ZXJ5IGJhY2tlbmQgc2hhcmVzIGl0KTsgJycgYmVmb3JlIHRoZSBmaXJzdCBwbG90LiAqL1xuICBwcml2YXRlIHBsb3REaXYgPSAnJztcbiAgLyoqXG4gICAqIFdoZXRoZXIgcmVnaW9ucyBjYW4gYmUgc2hvd24gaW4gM0Qgb24gc2NyZWVuOiBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcsIG9yIHRoZSAzRFxuICAgKiBzcGF0aWFsIGNsb3VkIG92ZXIgYSBzdGFjayBpbWFnZSAoaXRzIHJlZmVyZW5jZSB2b2x1bWUncywgc2VlIHNob3dWb2x1bWVBc0ltYWdlKS4gQm90aCBkcmF3IHRoZVxuICAgKiByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRoZSBzYW1lIHdheSAoVm9sdW1lUmVnaW9uTWVzaGVzKSwgaW4gdGhlIHZvbHVtZSdzIGJveC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdm9sdW1lVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgYSBuYXBhcmkgdm9sdW1lIChvciBpc29zdXJmYWNlKSB2aWV3IGlzIHRoZSBjdXJyZW50IHBsb3QgdHlwZTogdGhlIHNsaWNlIHBhbmUncy4gKi9cbiAgcHJpdmF0ZSBpbWFnZVZvbHVtZVZpZXcgPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKHNlZSB7QGxpbmsgc2V0U2xpY2VFZGl0b3J9KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbGljZUVkaXRvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3IGRyYXdzIHRoZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlIHZvbHVtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25zVGhyb3VnaFZvbHVtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgYnVpbHQgc28gZmFyLCBieSBpbWFnZSwgcmVzb2x1dGlvbiBhbmQgY2xhc3NlcyAod2l0aCB0aG9zZSBjbGFzc2VzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNoQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBtZXNoOiBNZXNoOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9PigpO1xuICAvKiogQnVtcGVkIHBlciB7QGxpbmsgc2hvd1JlZ2lvbkNsYXNzZXMzZH0gKGFuZCBwZXIgbmV3IGltYWdlKSwgc28gb25seSB0aGUgbGF0ZXN0IG9uZSBzaG93cy4gKi9cbiAgcHJpdmF0ZSBtZXNoUmVxdWVzdCA9IDA7XG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNELCBhbmQgdGhlIGltYWdlIHRoZXkgYmVsb25nIHRvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsYXNzZXMzZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfT4+KFxuICAgIFtdLFxuICApO1xuICBwcml2YXRlIGNsYXNzZXMzZEltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZ3JvdXBzIGxhc3QgYXNrZWQgZm9yIGluIDNELCB3aXRoIHRoZWlyIGNvbG91cnM6IHdoYXQgYW4gZWRpdCdzIHJlYnVpbGQgc2hvd3MgYWdhaW4uICovXG4gIHByaXZhdGUgc2hvd24zZDogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4gPSBbXTtcbiAgLyoqXG4gICAqIEVhY2ggY2xhc3MncyBmaW5nZXJwcmludCBvbiB0aGUgbGl2ZSBzbGljZSAoc2VlIGNsYXNzU2lnbmF0dXJlcyksIHdoaWNoIGltYWdlIGFuZCBzbGljZSwgYW5kXG4gICAqIHdoYXQgdGhlIHJlZ2lvbiBzb3VyY2VzIGhvbGQgKHNlZSBSZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSkuIE51bGwgd2hpbGUgbm90aGluZyBmb2xsb3dzXG4gICAqIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCwgbm8gc2VjdGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXZlQ2xhc3NlczogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBlbmRpbmcgcmVidWlsZCBvZiB0aGUgc3VyZmFjZXMgYW4gZWRpdCB0b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYnVpbGRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25VcGRhdGVzOiBTdWJzY3JpcHRpb247XG5cbiAgLy8g4pSA4pSAIFRoZSBzbGljZSBwYW5lICh0aGUgdm9sdW1lIHZpZXcncyBzcGxpdCk6IE9TRCBlZGl0aW5nIG9uZSBzbGljZSBiZXNpZGUgdGhlIDNEIHZpZXcg4pSA4pSAXG4gIC8qKiBUaGUgZGl2IHRoZSBzbGljZSBwYW5lIHJlbmRlcnMgaW50byB3aGlsZSBpdCBpcyB3YW50ZWQgKG51bGw6IG5vIHNwbGl0KS4gKi9cbiAgcHJpdmF0ZSBzbGljZURpdjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIE9TRCBpcyBtb3VudGVkIGluIHRoZSBzbGljZSBwYW5lOiByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgZ28gdG8gaXQuICovXG4gIHByaXZhdGUgc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIHNsaWNlIHBhbmUgc2hvd3MuICovXG4gIHByaXZhdGUgc2xpY2VGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBCdW1wZWQgcGVyIHNsaWNlLXBhbmUgbW91bnQgb3IgdGVhcmRvd24sIHNvIG9ubHkgdGhlIGxhdGVzdCBvbmUgbGFuZHMuICovXG4gIHByaXZhdGUgc2xpY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmVzIHggYW5kIHkgdGhyb3VnaCB0aGUgc3RhY2spLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zOiBWb2x1bWVTZWN0aW9ucztcbiAgLyoqIFRoZSB6IHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHNsaWNlIHRvIHNob3cgKHNlZSB7QGxpbmsgZ2V0U2xpY2VEcmFnJH0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRHJhZyQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvblN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUaGUgaW1hZ2UgaW5mbyBhbmQgc2NyZWVuIGhlaWdodCBvZiB0aGUgbGFzdCBwbG90ICh3aGF0IHRoZSBzbGljZSBwYW5lIG1vdW50cykuICovXG4gIHByaXZhdGUgcGxvdHRlZEluZm86IElJbWFnZUluZm8gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHJlZ2lvbiBpbXBvcnQgKHNlZSByZWdpb25JbXBvcnRUaWNrZXQpOiBpdHMgaWQgYW5kIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldDogeyBpZDogbnVtYmVyOyBpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7IGlkOiAwLCBpbWFnZTogdW5kZWZpbmVkIH07XG4gIHByaXZhdGUgcGxvdHRlZEhlaWdodCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbG90bHk6IFBsb3RseVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvc2Q6IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIG5hcGFyaTogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogYSBob3N0IHRoYXQgc2VydmVzIG5vIHNwYXRpYWwtb21pY3MgZGF0YSBiaW5kcyBub3RoaW5nLFxuICAgIC8vIGFuZCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHRoZW4gcmV0dXJucyBudWxsLlxuICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBwcml2YXRlIGludGVuc2l0eTogSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKVxuICAgIHByaXZhdGUgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25SZWdpb25zQ2hhbmdlZCgpKTtcbiAgICB0aGlzLnNlY3Rpb25zID0gbmV3IFZvbHVtZVNlY3Rpb25zKHtcbiAgICAgIHZvbHVtZTogKCkgPT4gdGhpcy5uYXBhcmkudm9sdW1lVm94ZWxzKCksXG4gICAgICBpbWFnZTogKCkgPT4gdGhpcy5wbG90dGVkRmlsZU5hbWUsXG4gICAgICBzaG93UGxhbmVzOiAocGxhbmVzKSA9PiB0aGlzLm5hcGFyaS5zZXRTbGljZVBsYW5lcyhwbGFuZXMpLFxuICAgICAgb3V0bGluZXNCeUNsYXNzOiAobGV2ZWwpID0+IHRoaXMucmVnaW9uU3RvcmUub3V0bGluZXNCeUNsYXNzKGxldmVsKSxcbiAgICAgIGlzQ2xhc3NIaWRkZW46IChsYWJlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5pc0NsYXNzSGlkZGVuKGxhYmVsKSxcbiAgICAgIGNvbG9yT2Y6IChsYWJlbCkgPT4gdGhpcy5jbGFzc0NvbG9yKGxhYmVsKSxcbiAgICAgIGNoYW5uZWxTdGF0ZXM6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIGNvbG9ybWFwOiAoc3QsIG11bHRpY2hhbm5lbCkgPT4ge1xuICAgICAgICAvLyBBcyB0aGUgdm9sdW1lIHNjZW5lIGNvbG91cnMgdGhlIGNoYW5uZWwgKGludmVydCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUgY29sb3JtYXApLlxuICAgICAgICBjb25zdCBkaXNwbGF5ID0ge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpLFxuICAgICAgICAgIHJldmVyc2U6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICAgIGludmVydDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXNvbHZlQ29sb3JtYXAoXG4gICAgICAgICAgbXVsdGljaGFubmVsID8gY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnLCBkaXNwbGF5KSA6IHZvbHVtZUNvbG9ybWFwKHN0LCBkaXNwbGF5KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBpbnZlcnQ6ICgpID0+IHRoaXMuc3RvcmUuY3VycmVudEludmVydCgpLFxuICAgICAgc2xpY2U6ICgpID0+IHRoaXMuY3VycmVudFpJbmRleCxcbiAgICB9KTtcbiAgICAvLyBBIHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHogcGxhbmUgcGlja3MgdGhlIHNsaWNlICh0aHJvdWdoIHRoZSBob3N0J3Mgc2xpZGVyLCBzb1xuICAgIC8vIHRoZSBzdG9yZSBhbmQgdGhlIHNsaWNlIHBhbmUgZm9sbG93KSwgdGhlIG90aGVycyBtb3ZlIHRoZWlyIHNlY3Rpb24uXG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQoXG4gICAgICB0aGlzLm5hcGFyaS5nZXRTbGljZVBsYW5lTW92ZSQoKS5zdWJzY3JpYmUoKHsgYXhpcywgdmFsdWUgfSkgPT4ge1xuICAgICAgICBpZiAoYXhpcyA9PT0gJ3onKSB0aGlzLnNsaWNlRHJhZyQubmV4dChNYXRoLnJvdW5kKHZhbHVlKSk7XG4gICAgICAgIGVsc2UgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCB2YWx1ZSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldEludmVydCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNlY3Rpb25zLnNjaGVkdWxlKCkpKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZCh0aGlzLnN0b3JlLmdldENvbG9ybWFwKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICB9XG5cbiAgLyoqIEEgY2xhc3MncyBjb2xvdXI6IGl0cyBjbGFzc2lmaWNhdGlvbiBjb2xvdXIsIGVsc2UgaXRzIHJlZ2lvbiBzb3VyY2UncywgZWxzZSBhIGRlZmF1bHQuICovXG4gIHByaXZhdGUgY2xhc3NDb2xvcihsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdG9yZS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpLmdldChsYWJlbCkgPz9cbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldygpPy5jb2xvck9mKHsgbGFiZWwsIGNvbG9yOiBudWxsIH0pID8/XG4gICAgICAnI2ZmY2MwMCdcbiAgICApO1xuICB9XG5cbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3IChudWxscyB3aGlsZSBpdCBpcyBub3Qgc3BsaXQpLiAqL1xuICBnZXRTZWN0aW9uVmlld3MkKCk6IE9ic2VydmFibGU8U2VjdGlvblZpZXdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbnMuZ2V0Vmlld3MkKCk7XG4gIH1cblxuICAvKiogTW92ZSBhIHNlY3Rpb24ncyBwbGFuZSB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZShheGlzOiBTZWN0aW9uQXhpcywgYXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VjdGlvbnMuc2V0UGxhbmUoYXhpcywgYXQpO1xuICB9XG5cbiAgLyoqIFRoZSBzbGljZSBwaWNrZWQgYnkgZHJhZ2dpbmcgdGhlIHogcGxhbmUgaW4gdGhlIHZvbHVtZTogdGhlIGhvc3Qgc2hvd3MgaXQgKGl0cyBzbGlkZXIpLiAqL1xuICBnZXRTbGljZURyYWckKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VEcmFnJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbWFnZVR5cGUodDogUGxvdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdCA9PT0gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogVGhlIDJEIG5hcGFyaSB0eXBlcyAoaW1hZ2UsIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyLCBzcGF0aWFsIG9taWNzKSDigJQgYSAyRCBmYWxsYmFjayBjaGFpblxuICAgKiAgKE9TRCwgdGhlbiBQbG90bHkpLlxuICAgKlxuICAgKiAgTk9URSBmb3IgU1BBVElBTF9PTUlDUzogb25seSBuYXBhcmktanMgZHJhd3MgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMuIElmIGl0IGZhaWxzIChubyBXZWJHUFUsXG4gICAqICBkZXZpY2UgbG9zcykgdGhlIGZhbGxiYWNrIHJlbmRlcnMgdGhlIHRpc3N1ZSBpbWFnZSBBTE9ORSDigJQgdGhlIHNwYXRpYWwgbGF5ZXIgaXMgYWJzZW50LCBub3RcbiAgICogIGRlZ3JhZGVkLiBUaGF0IGlzIGRlbGliZXJhdGUgZm9yIG5vdzogc2hvd2luZyB0aGUgc2xpZGUgYmVhdHMgc2hvd2luZyBub3RoaW5nLCBhbmQgYSBQbG90bHlcbiAgICogIGBzY2F0dGVyZ2xgIHNwYXRpYWwgbW9kZSBpcyB0aGUgcGxhbm5lZCByZWFsIGZhbGxiYWNrIChzZWUgdGhlIHBsb3QtbW9kZSBkZXNpZ24gZG9jKS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaUltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5OQVBBUklfSU1BR0UgfHwgaXNOYXBhcmlTY2F0dGVyKHQpIHx8IGlzU3BhdGlhbE9taWNzKHQpO1xuICB9XG5cbiAgLyoqIFRoZSAzRCBuYXBhcmkgdHlwZXMgKHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2Uvc2NhdHRlciwgcGx1cyB0aGUgM0Qgc3BhdGlhbCBjbG91ZCkg4oCUIG5vIDJEXG4gICAqICBmYWxsYmFjayBleGlzdHMgKE9TRCBpcyBpbWFnZS1vbmx5KSwgc28gdGhleSBmYWxsIHN0cmFpZ2h0IHRvIFBsb3RseS4gKi9cbiAgcHJpdmF0ZSBpc05hcGFyaTNkVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05hcGFyaTNkKHQpIHx8IGlzU3BhdGlhbE9taWNzM2QodCk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCB0byBhdHRlbXB0IGZvciB0aGUgY3VycmVudCBwbG90IHR5cGUgdGhpcyByZW5kZXIuIFRoZSBmYWxsYmFjayBjaGFpbnMgYmVsb3cgYXJlXG4gICAqIG1pcnJvcmVkIGV4YWN0bHkgYnkge0BsaW5rIGxvYWR9IHNvIHRoZSBoYW5kbGUgYHBsb3QoKWAgcmVjZWl2ZXMgYWx3YXlzIGNvbWVzIGZyb20gdGhlXG4gICAqIGJhY2tlbmQgYHBsb3QoKWAgc2VsZWN0cyAobm8gbG9hZC9wbG90IGJhY2tlbmQgbWlzbWF0Y2gpOlxuICAgKiAgLSAyRCBpbWFnZSAoZXhwbGljaXQgYE5BUEFSSV9JTUFHRWAsIG9yIGBJTUFHRWAgd2l0aCB0aGUgV2ViR1BVIG9wdC1pbik6IG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIHBsYWluIGBJTUFHRWAgKG5vIG9wdC1pbik6IE9TRCDihpIgUGxvdGx5LlxuICAgKiAgLSAzRCBuYXBhcmkgKGBOQVBBUklfVk9MVU1FYC9gTkFQQVJJX0lTT1NVUkZBQ0VgKTogbmFwYXJpLWpzIOKGkiBQbG90bHkgKE9TRCBjYW4ndCByZW5kZXIgM0QpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQbG90VHlwZTtcbiAgICAvLyAyRCBpbWFnZSB3aXRoIGEgbmFwYXJpLWpzIGF0dGVtcHQgKGV4cGxpY2l0IG5hcGFyaSBpbWFnZSwgb3Igb3B0LWluIG9uIHRoZSBJbWFnZSB0eXBlKS5cbiAgICBpZiAodGhpcy5pc05hcGFyaUltYWdlVHlwZSh0KSB8fCAodGhpcy5pc0ltYWdlVHlwZSh0KSAmJiB0aGlzLmNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcikpIHtcbiAgICAgIGlmICghdGhpcy5uYXBhcmlGZWxsQmFjaykgcmV0dXJuIHRoaXMubmFwYXJpO1xuICAgICAgaWYgKCF0aGlzLm9zZEZlbGxCYWNrKSByZXR1cm4gdGhpcy5vc2Q7XG4gICAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gICAgfVxuICAgIC8vIFBsYWluIEltYWdlIHR5cGUgKG5vIG5hcGFyaSBvcHQtaW4pOiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgIGlmICh0aGlzLmlzSW1hZ2VUeXBlKHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2RGZWxsQmFjayA/IHRoaXMucGxvdGx5IDogdGhpcy5vc2Q7XG4gICAgfVxuICAgIC8vIDNEIG5hcGFyaSB0eXBlczogbmFwYXJpLWpzLCB3aXRoIFBsb3RseSBhcyB0aGUgb25seSB2aWFibGUgZmFsbGJhY2suXG4gICAgaWYgKHRoaXMuaXNOYXBhcmkzZFR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hcGFyaUZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm5hcGFyaTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqIEJhY2tlbmQgY3VycmVudGx5IG9uIHNjcmVlbiDigJQgd2hhdCBvbmdvaW5nIHpvb20vdG9vbC9yZWdpb24gb3BzIGFjdCBvbi4gKi9cbiAgcHJpdmF0ZSByZW5kZXJlcigpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlbmRlcmVkID8/IHRoaXMucGxvdGx5O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2tlbmQgcmVnaW9uLCB0b29sIGFuZCBvdmVybGF5IGNhbGxzIGFjdCBvbjogdGhlIHNsaWNlIHBhbmUncyBPU0Qgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzXG4gICAqIHNwbGl0IChyZWdpb25zIGFyZSBlZGl0ZWQgdGhlcmUpLCBlbHNlIHRoZSBiYWNrZW5kIG9uIHNjcmVlbi4gVmlldyBjYWxscyAoem9vbSwgZml0LCBjb2xvdXIsXG4gICAqIGV4cG9ydCkgc3RheSB3aXRoIHtAbGluayByZW5kZXJlcn0uXG4gICAqL1xuICBwcml2YXRlIHJlZ2lvbkJhY2tlbmQoKTogSVZpZXdlckJhY2tlbmQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlTW91bnRlZCA/IHRoaXMub3NkIDogdGhpcy5yZW5kZXJlcigpO1xuICB9XG5cbiAgLy8gU3lzdGVtIGNhcGFiaWxpdGllcyBhcmUgUGxvdGx5J3MgKHRoZSBmdWxsLWZlYXR1cmVkIGJhY2tlbmQpIHNvIHRoZSBVSVxuICAvLyBrZWVwcyBvZmZlcmluZyBldmVyeSBwbG90IHR5cGUgcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgaXMgb24gc2NyZWVuLlxuICBnZXQgY2FwYWJpbGl0aWVzKCk6IFZpZXdlckNhcGFiaWxpdGllcyB7XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmNhcGFiaWxpdGllcztcbiAgfVxuXG4gIC8vIOKUgOKUgCByZW5kZXIgLyB2aWV3cG9ydCDihpIgYWN0aXZlIHJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIC8vIEEgc3RhY2sgY2FuIG9wZW4gYXdheSBmcm9tIHNsaWNlIDAgKGBpbml0aWFsWkluZGV4YCDigJQgYSB2b2x1bWUgb3BlbnNcbiAgICAvLyBtaWQtc3BlY2ltZW4pLCBhbmQgdGhhdCBhcnJpdmVzIGhlcmUgcmF0aGVyIHRoYW4gdGhyb3VnaCBzZXRaSW5kZXguXG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIGNvbnN0IGJhY2tlbmQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubmFwYXJpLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWJvcnRlZDogbm9ib2R5IHdhbnRzIHRoaXMgaW1hZ2UgYW55IG1vcmUsIHNvIGRvbid0IGdvIG9uIHRvIGxvYWQgaXQgZWxzZXdoZXJlLlxuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgICAvLyBNaXJyb3IgaW1hZ2VCYWNrZW5kKCkncyBmYWxsYmFjayBzbyBsb2FkICsgcGxvdCBwaWNrIHRoZSBzYW1lIGJhY2tlbmQ6XG4gICAgICAgIC8vICAtIDNEIG5hcGFyaSB0eXBlcyBoYXZlIG5vIDJEIGZhbGxiYWNrIOKGkiBzdHJhaWdodCB0byBQbG90bHkuXG4gICAgICAgIC8vICAtIDJEIGltYWdlIOKGkiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgICAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkuJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBPcGVuU2VhZHJhZ29uLicsIGVycik7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcnkgT1NEOyBvbiBmYWlsdXJlIGZhbGwgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UgKG5vdCBwZXJtYW5lbnQg4oCUIHNlZSByZXNldCgpKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlhT3NkVGhlblBsb3RseShcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub3NkLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBPcGVuU2VhZHJhZ29uIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlLicsIGVycik7XG4gICAgICB0aGlzLm9zZEZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgfVxuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMucGxvdHRlZEZpbGVOYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLnBsb3R0ZWRJbmZvID0gaW1hZ2VJbmZvID8/IG51bGw7XG4gICAgdGhpcy5wbG90dGVkSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZSk7XG4gICAgLy8gVGhlIHNsaWNlIHBhbmUgYmVsb25ncyB0byB0aGUgdm9sdW1lIHZpZXc6IGFub3RoZXIgcGxvdCB0eXBlIHRha2VzIGl0IGRvd24gKE9TRCBtYXkgYmVcbiAgICAvLyBhYm91dCB0byBkcmF3IHRoZSBtYWluIHZpZXcsIHdoaWNoIG11c3Qgbm90IGZpbmQgdGhlIHBhbmUncyB2aWV3ZXIgc3RpbGwgbW91bnRlZCkuXG4gICAgaWYgKCF0aGlzLmltYWdlVm9sdW1lVmlldykgdGhpcy51bm1vdW50U2xpY2UoKTtcbiAgICAvLyBSZWdpb24gc3VyZmFjZXMgYmVsb25nIHRvIHRoZSBpbWFnZSB0aGV5IHdlcmUgYnVpbHQgZnJvbTogYW5vdGhlciBpbWFnZSBkcm9wcyB0aGVtLlxuICAgIGlmICh0aGlzLmNsYXNzZXMzZCQudmFsdWUubGVuZ3RoICYmIHRoaXMucGxvdHRlZEZpbGVOYW1lICE9PSB0aGlzLmNsYXNzZXMzZEltYWdlKSB0aGlzLmNsZWFyUmVnaW9uQ2xhc3NlczNkKCk7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICAvLyBBcHBseSB0aGUgcGVyLWltYWdlIHJlZ2lvbiBjYWNoZSAoc25hcHNob3Qgb2xkIHJlZ2lvbnMsIHJlc3RvcmUgdGhlIG5ld1xuICAgIC8vIGltYWdlJ3MsIGNsZWFyIHNlbGVjdGlvbikgZm9yIHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMg4oCUIFBsb3RseSBkb2VzXG4gICAgLy8gdGhpcyBpbnNpZGUgaXRzIG93biBwbG90KCksIGJ1dCBPU0QgZG9lc24ndCwgc28gZHJpdmUgaXQgaGVyZS4gSWRlbXBvdGVudFxuICAgIC8vIGZvciB0aGUgc2FtZSBpbWFnZSwgc28gaXQncyBzYWZlIHRvIGNhbGwgb24gZXZlcnkgKHJlKXBsb3QuXG4gICAgdGhpcy5wbG90bHkuc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvKTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pbWFnZUJhY2tlbmQoKTtcbiAgICAvLyBCb3RoIGJhY2tlbmRzIHNoYXJlIHRoZSBzYW1lIGRpdiDigJQgdGVhciBkb3duIHRoZSBvdXRnb2luZyBvbmUgb24gc3dpdGNoLlxuICAgIC8vIFBsb3RseSBtdXN0IGJlICpwdXJnZWQqIChub3QgcmVzZXQsIHdoaWNoIHJlLWRyYXdzIGVtcHR5IGF4ZXMpIGJlZm9yZSBPU0RcbiAgICAvLyB0YWtlcyB0aGUgZGl2LlxuICAgIGlmICh0aGlzLmxhc3RSZW5kZXJlZCAmJiB0aGlzLmxhc3RSZW5kZXJlZCAhPT0gbmV4dCkge1xuICAgICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkID09PSB0aGlzLnBsb3RseSkgdGhpcy5wbG90bHkucHVyZ2VQbG90KCk7XG4gICAgICBlbHNlIHRoaXMubGFzdFJlbmRlcmVkLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMubGFzdFJlbmRlcmVkID0gbmV4dDtcbiAgICBjb25zdCBwbG90dGVkID0gbmV4dC5wbG90KHBsb3REaXYsIGltYWdlTG9hZGVkLCBpbWFnZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UpO1xuICAgIGlmICghdGhpcy5zbGljZURpdiB8fCAhdGhpcy5pbWFnZVZvbHVtZVZpZXcpIHJldHVybiBwbG90dGVkO1xuICAgIC8vIFRoZSBzcGxpdCB2b2x1bWUgdmlldzogdGhlIHNsaWNlIHBhbmUgZm9sbG93cyB0aGUgaW1hZ2UgKGEgbmV3IG9uZSwgb3IgaXRzIHNoYXJwZXIgcGFzcykuXG4gICAgcmV0dXJuIHBsb3R0ZWQudGhlbigob2spID0+IHtcbiAgICAgIGlmIChvayAmJiAoIXRoaXMuc2xpY2VNb3VudGVkIHx8IHRoaXMuc2xpY2VGaWxlICE9PSBpbWFnZUluZm8/LmZpbGVOYW1lIHx8IGluUGxhY2UpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5tb3VudFNsaWNlKCEhaW5QbGFjZSAmJiB0aGlzLnNsaWNlTW91bnRlZCAmJiB0aGlzLnNsaWNlRmlsZSA9PT0gaW1hZ2VJbmZvPy5maWxlTmFtZSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdm9sdW1lIHdhcyBhc3NlbWJsZWQgYWdhaW4gKGFub3RoZXIgaW1hZ2UsIG9yIHJlc29sdXRpb24pOiBjdXQgdGhlIHNlY3Rpb25zIGZyb20gaXQuXG4gICAgICBpZiAob2spIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICAgIHJldHVybiBvaztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGUgdm9sdW1lIHZpZXc6IHNob3cgdGhlIHNsaWNlIGJlaW5nIGVkaXRlZCBpbiBgZGl2YCAoT3BlblNlYWRyYWdvbiwgd2l0aCBldmVyeSByZWdpb25cbiAgICogdG9vbCkgYmVzaWRlIHRoZSAzRCB2aWV3LCBvciBzdG9wIChudWxsKS4gS2VwdCBhY3Jvc3MgcmUtcGxvdHMgb2YgYSB2b2x1bWUgdmlldzsgYW5vdGhlciBwbG90XG4gICAqIHR5cGUgdGFrZXMgdGhlIHBhbmUgZG93biBhbmQgYSB2b2x1bWUgdmlldyBicmluZ3MgaXQgYmFjay4gUmVzb2x2ZXMgd2hldGhlciB0aGUgcGFuZSBzaG93cy5cbiAgICovXG4gIGFzeW5jIHNldFNsaWNlRWRpdG9yKGRpdjogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2xpY2VEaXYgPSBkaXY7XG4gICAgaWYgKHRoaXMuc2xpY2VFZGl0b3IkLnZhbHVlICE9PSAhIWRpdikgdGhpcy5zbGljZUVkaXRvciQubmV4dCghIWRpdik7XG4gICAgaWYgKCFkaXYpIHtcbiAgICAgIHRoaXMudW5tb3VudFNsaWNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vdW50U2xpY2UoZmFsc2UpO1xuICB9XG5cbiAgLyoqIE1vdW50IChvciByZWZyZXNoIGluIHBsYWNlKSBPU0QgaW4gdGhlIHNsaWNlIHBhbmUgb24gdGhlIGRpc3BsYXllZCBzbGljZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNsaWNlKGluUGxhY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLnNsaWNlRGl2O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGlmICghZGl2IHx8ICFpbmZvPy51cmxzPy5sZW5ndGggfHwgIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zbGljZVJlcXVlc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHRoaXMub3NkLmxvYWQoaW5mbywgdGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLm9zZC5wbG90KGRpdiwgbG9hZGVkLCBpbmZvLCB0aGlzLnBsb3R0ZWRIZWlnaHQsIFBsb3RUeXBlLklNQUdFLCBpblBsYWNlKTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zbGljZU1vdW50ZWQgPSBvaztcbiAgICAgIHRoaXMuc2xpY2VGaWxlID0gaW5mby5maWxlTmFtZTtcbiAgICAgIGlmIChvaykge1xuICAgICAgICAvLyBUaGUgc2xpY2UgbWF5IGhhdmUgbW92ZWQgd2hpbGUgdGhlIHBhbmUgbG9hZGVkLlxuICAgICAgICB0aGlzLm9zZC5zZXRaSW5kZXgodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMuc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLnNsaWNlUmVxdWVzdClcbiAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gVGhlIHNsaWNlIHBhbmUgY291bGQgbm90IHNob3cgdGhlIGltYWdlLicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRha2UgdGhlIHNsaWNlIHBhbmUncyB2aWV3ZXIgZG93biAodGhlIHNwbGl0IHN0YXlzIHdhbnRlZCB3aGlsZSB7QGxpbmsgc2xpY2VEaXZ9IGlzIHNldCkuICovXG4gIHByaXZhdGUgdW5tb3VudFNsaWNlKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5yZXNldCgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgfVxuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZUZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZWxvYWRBbmRQbG90KCk7XG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgb2YgYSByZW5kZXIgY3ljbGU6IHJlLWVuYWJsZSBuYXBhcmktanMvT1NEIGF0dGVtcHRzIChjbGVhciBhbnkgcHJpb3JcbiAgICAvLyBwZXItaW1hZ2UgZmFsbGJhY2spIGFuZCB0ZWFyIGRvd24gd2hhdGV2ZXIncyBvbiBzY3JlZW4uXG4gICAgdGhpcy5vc2RGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXQoKTtcbiAgfVxuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVsYXlvdXQodHJ1ZUltYWdlU2l6ZSk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldEF4ZXMoKTtcbiAgfVxuICBmaXRUb1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmZpdFRvVmlldygpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30uICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpdFRvVmlldygpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbUluKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbU91dCgpO1xuICB9XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldERyYWdNb2RlKG1vZGUpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5vc2Quc2V0RHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEV2ZXJ5IGJhY2tlbmQsIG9uIHNjcmVlbiBvciBub3QuICovXG4gIHByaXZhdGUgYmFja2VuZHMoKTogSVZpZXdlckJhY2tlbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmF2aWdhdG9yIC8gc21vb3RoaW5nIG9wdGlvbnMsIGFwcGxpZWQgdG8gRVZFUlkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChub3RcbiAgICoganVzdCB0aGUgYWN0aXZlIHJlbmRlcmVyKTogY29uc3VtZXJzIHNldCB0aGVtIGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLCB3aGVuXG4gICAqIGByZW5kZXJlcigpYCBpcyBzdGlsbCB0aGUgUGxvdGx5IGRlZmF1bHQsIGFuZCBPU0QvbmFwYXJpLWpzIG11c3QgcmVjZWl2ZSB0aGVtXG4gICAqIHRvIGhvbm91ciB0aGVtIGF0IHZpZXdlciBjcmVhdGlvbi5cbiAgICovXG4gIGdldE9zZFZpZXdPcHRpb25zKCk6IElPc2RWaWV3T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMudmlld09wdGlvbnM7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3T3B0aW9uczogSU9zZFZpZXdPcHRpb25zID0ge1xuICAgIHNldE5hdmlnYXRvclZpc2libGU6ICh2aXNpYmxlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gICAgfSxcbiAgICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQ6IChlbmFibGVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICB9LFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldE5hdmlnYXRvclZpc2libGUoKWAuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYC4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgfVxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0WkluZGV4KHpJbmRleCk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5zZXRaSW5kZXgoekluZGV4KTtcbiAgICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICB9XG4gIH1cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFRydWVJbWFnZVNpemUoKTtcbiAgfVxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEN1cnJlbnRJbWFnZSgpO1xuICB9XG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFBpeGVsRGF0YSgpO1xuICB9XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpO1xuICB9XG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgICB0aGlzLnVwZGF0ZVZvbHVtZVZpZXcocGxvdFR5cGUpO1xuICAgIHRoaXMucGxvdGx5LnNldFBsb3RUeXBlKHBsb3RUeXBlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRTdXJmYWNlM2RDb250cm9scygpYC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKG1vZGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5yZXNldFN1cmZhY2VDYW1lcmEoKTtcbiAgfVxuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4gKG5hcGFyaS1qcyksIGVsc2UgbnVsbC4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uc2V0KClgLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoc2NhbGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KClgLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LmdldCgpID8/IDE7XG4gIH1cbiAgLyoqIFRoZSB2aWV3cG9ydCBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIGZvciBhIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZS4gTnVsbFxuICAgKiAgd2hlbiB0aGF0IGJhY2tlbmQgY2Fubm90IHByb3ZpZGUgb25lIChlLmcuIE9TRCBmZWxsIGJhY2sgdG8gUGxvdGx5KS4gKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRQbG90TW9kZVZpZXdwb3J0Py4oKSA/PyBudWxsO1xuICB9XG4gIGdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTogUGxvdFR5cGVEZXNjcmlwdG9yW10ge1xuICAgIC8vIFBsb3RseSBlbnVtZXJhdGVzIHRoZSBmdWxsIFBMT1RfVFlQRV9ERVNDUklQVE9SUyBtYXAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgdGhlXG4gICAgLy8gbmFwYXJpLWpzIFdlYkdQVSB0eXBlcyAoaml0LXVpIzEwMikg4oCUIHNvIHRoaXMgc2luZ2xlIHNvdXJjZSBjb3ZlcnMgdGhlbSAobm8gZHVwbGljYXRlcykuXG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFBsb3RUeXBlRGVzY3JpcHRvcnMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBsb25nLWxpdmVkIG9ic2VydmFibGVzICsgc3RhY2sgZmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHNldFN0YWNrTG9hZGluZyhiOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0U3RhY2tMb2FkaW5nKGIpO1xuICB9XG4gIC8vIENhbmNlbCBpbi1mbGlnaHQgbG9hZGluZyBvbiBldmVyeSBiYWNrZW5kIOKAlCB0aGUgdXNlcidzIENhbmNlbCBzaG91bGRuJ3QgZGVwZW5kIG9uIHdoaWNoIG9uZSBpc1xuICAvLyBhY3RpdmUuIE9ubHkgYmFja2VuZHMgdGhhdCBzdHJlYW0gZnJhbWVzIChuYXBhcmktanMpIGRvIHJlYWwgd29yazsgdGhlIHJlc3Qgbm8tb3AuIFRoZSBjb25jcmV0ZVxuICAvLyBiYWNrZW5kIGNsYXNzZXMgZG9uJ3QgYWxsIGRlY2xhcmUgdGhlIG9wdGlvbmFsIGNvbnRyYWN0IG1ldGhvZCwgc28gY2FsbCBpdCB2aWEgSVZpZXdlckJhY2tlbmQuXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBiYWNrZW5kIG9mIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXSBhcyBJVmlld2VyQmFja2VuZFtdKSB7XG4gICAgICBiYWNrZW5kLmNhbmNlbExvYWRpbmc/LigpO1xuICAgIH1cbiAgfVxuICAvLyBMb2FkaW5nIHN0YXRlIGlzIHN1cmZhY2VkIGZyb20gd2hpY2hldmVyIGJhY2tlbmQgaXMgZG9pbmcgdGhlIHdvcms6IE9TRCBhbmQgbmFwYXJpLWpzICh2b2x1bWVcbiAgLy8gYXNzZW1ibHkpIGRyaXZlIHRoZWlyIG93biBzdWJqZWN0cywgc28gbWVyZ2UgYWxsIHRocmVlIGludG8gb25lIHN0YWJsZSBzdHJlYW0gdGhlIGhvc3RcbiAgLy8gc3Vic2NyaWJlcyB0byBvbmNlLiAoUHJldmlvdXNseSBoYXJkY29kZWQgdG8gUGxvdGx5LCBzbyBuYXBhcmkvT1NEIHByb2dyZXNzIG5ldmVyIHNob3dlZC4pXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucGxvdGx5LmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm9zZC5pc1N0YWNrTG9hZGluZygpLFxuICAgICAgdGhpcy5uYXBhcmkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICBdKS5waXBlKG1hcCgoZmxhZ3MpID0+IGZsYWdzLnNvbWUoQm9vbGVhbikpKTtcbiAgfVxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIC8vIFJlcG9ydCB0aGUgcHJvZ3Jlc3Mgb2Ygd2hpY2hldmVyIGJhY2tlbmQgaXMgQUNUSVZFTFkgbG9hZGluZyAobWF4IGFjcm9zcyBhY3RpdmUgb25lcykuIEEgcGxhaW5cbiAgICAvLyBtZXJnZSBsZXQgYW4gaWRsZSBiYWNrZW5kJ3Mgc3RhbGUgdmFsdWUgd2luIHRoZSBzdHJlYW0gb24gYSByZS1sb2FkIOKAlCBsZWF2aW5nIHRoZSBiYXIgYmVsb3cgdGhlXG4gICAgLy8gYWN0aXZlIGJhY2tlbmQncyByZWFsIHByb2dyZXNzIChlLmcuIHN0dWNrIH7ihZMgd2hpbGUgdGhlICUgcmVhZCAxMDApLiBHYXRpbmcgYnkgdGhlIGxvYWRpbmcgZmxhZ1xuICAgIC8vIGlnbm9yZXMgaWRsZSBiYWNrZW5kcywgc28gdGhlIGJhciB0cmFja3MgdGhlIG9uZSBkb2luZyB0aGUgd29yayBhbmQgcmVhY2hlcyAxMDAlLlxuICAgIGNvbnN0IHRyYWNrID0gKHY6IElWaWV3ZXJCYWNrZW5kKTogT2JzZXJ2YWJsZTxbbnVtYmVyLCBib29sZWFuXT4gPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW3YuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSwgdi5pc1N0YWNrTG9hZGluZygpXSk7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RyYWNrKHRoaXMucGxvdGx5KSwgdHJhY2sodGhpcy5vc2QpLCB0cmFjayh0aGlzLm5hcGFyaSldKS5waXBlKFxuICAgICAgbWFwKChwYWlycykgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBwYWlycy5maWx0ZXIoKFssIGxvYWRpbmddKSA9PiBsb2FkaW5nKS5tYXAoKFtwXSkgPT4gcCk7XG4gICAgICAgIHJldHVybiBhY3RpdmUubGVuZ3RoID8gTWF0aC5tYXgoLi4uYWN0aXZlKSA6IDA7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIC8vIEV2ZXJ5IGJhY2tlbmQgZml0cyB0byB2aWV3IG9uIGl0cyBvd24gKFBsb3RseSdzIGF1dG9zY2FsZSwgT1NEJ3MgZ29Ib21lLCBuYXBhcmkncyBjYW1lcmFcbiAgLy8gZml0KSBhbmQgZWFjaCBlbWl0cyBmcm9tIGl0cyBvd24gc3ViamVjdCwgc28gbWVyZ2UgYWxsIHRocmVlOiBsaXN0ZW5pbmcgdG8gUGxvdGx5IGFsb25lXG4gIC8vIG1pc3NlZCB0aGUgY29udGV4dC1tZW51IEF1dG9zY2FsZSBvbiB0aGUgSW1hZ2UgYW5kIG5hcGFyaSB2aWV3cy5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgdGhpcy5wbG90bHkuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMub3NkLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgICB0aGlzLm5hcGFyaS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cbiAgLyoqIFRoZSBsaW5lLVJPSSBwcm9maWxlczogc2FtcGxlZCBieSB0aGUgYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5nZXRJbnRlbnNpdHlQcm9maWxlJCgpO1xuICB9XG4gIC8vIFRoZSBpbnRlbnNpdHkgaW5zZXQgaXMgYSBQbG90bHkgTElORSBjaGFydCDigJQgcmVuZGVyIGl0IHRocm91Z2ggUGxvdGx5IHdoaWNoZXZlclxuICAvLyBiYWNrZW5kIGRyYXdzIHRoZSBtYWluIGltYWdlLlxuICByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkucmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQsIHByb2ZpbGVzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCByZWdpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBSZWdpb24gc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSwgc28gZXZlcnkgcmVhZCBhbmQgd3JpdGUgZ29lc1xuICAvLyBzdHJhaWdodCB0byBpdC4gRXZlcnkgYmFja2VuZCBkcmF3cyBmcm9tIHRoZSBzdG9yZSdzIGV2ZW50czogdGhlIE9TRCBhbmRcbiAgLy8gbmFwYXJpLWpzIG92ZXJsYXlzIGFuZCBQbG90bHkncyBzaGFwZSBwcm9qZWN0aW9uIHJlZHJhdyBvbiBpdHMgcmVnaW9uLXVwZGF0ZVxuICAvLyBhbmQgc2VsZWN0aW9uIHN0cmVhbXMsIGFuZCB0aGUgY2FudmFzIHRvb2xzIHJlc2V0IG9uIGdldFJlZ2lvblNldFJlcGxhY2VkJFxuICAvLyAodW5kbywgcmVkbywgYSBzbGljZSBzd2l0Y2gpLlxuICBzZXRSZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgICBhcHBlbmQ/OiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucywgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBhcHBlbmQpO1xuICB9XG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblBvbHlnb25zKCk7XG4gIH1cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG4gIHNlbGVjdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0UmVnaW9uKHJlZ2lvbik7XG4gIH1cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTtcbiAgfVxuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG4gIH1cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICB9XG4gIGdldEZpbGxDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpO1xuICB9XG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gIH1cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsLCBjb2xvcik7XG4gIH1cbiAgLy8gQW5ub3RhdGlvbi1jbGFzcyBwcmVzZXRzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgKGJhY2tlbmQtbmV1dHJhbFxuICAvLyBzZXNzaW9uIHN0YXRlKSwgc28gcm91dGUgc3RyYWlnaHQgdG8gaXQgcmF0aGVyIHRoYW4gdGhyb3VnaCByZW5kZXJlcigpLiAoaml0LXVpIzcwKVxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTtcbiAgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0JCgpO1xuICB9XG4gIHNldFByZXNldFNldChzZXQ6IFByZXNldFNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0UHJlc2V0U2V0KHNldCk7XG4gIH1cbiAgdXBzZXJ0Q2xhc3MocHJlc2V0OiBDbGFzc1ByZXNldCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KTtcbiAgfVxuICByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlbW92ZUNsYXNzKG5hbWUpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnJlc2V0UHJlc2V0cygpO1xuICB9XG4gIHVuZG8oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7XG4gIH1cbiAgcmVkbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlZG8oKTtcbiAgfVxuICBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblVuZG8oKTtcbiAgfVxuICBjYW5SZWRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTtcbiAgfVxuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5VbmRvJCgpO1xuICB9XG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblJlZG8kKCk7XG4gIH1cbiAgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgfVxuICBpbXBvcnRSZWdpb25zKGdlb0pzb25TdHI6IHN0cmluZyk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5pbXBvcnRSZWdpb25zKGdlb0pzb25TdHIpO1xuICB9XG4gIC8qKiBEb3dubG9hZCBgcmVnaW9uc2AgYXMgR2VvSlNPTiwgbmFtZWQgYWZ0ZXIgdGhlIGltYWdlIGxhc3QgcGxvdHRlZC4gKi9cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZXhwb3J0UmVnaW9ucyhyZWdpb25zLCB0aGlzLnBsb3R0ZWRGaWxlTmFtZSk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zKTtcbiAgfVxuXG4gIC8qKiBIb2xkIGEgbGFyZ2UgcmVnaW9uIHNldCBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UgKHNlZSBSZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UpLiAqL1xuICBhdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlOiBSZWdpb25Tb3VyY2UgfCBSZWdpb25Tb3VyY2VPcGVuZXIsIHNsaWNlcz86IFJlZ2lvblNvdXJjZVNsaWNlcyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHNvdXJjZSwgc2xpY2VzKTtcbiAgfVxuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2UoZ2VvSnNvblN0cjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGdlb0pzb25TdHIubGVuZ3RoIDwgKHRoaXMuY29uZmlnPy5yZWdpb25Tb3VyY2VNaW5DaGFycyA/PyBSRUdJT05fU09VUkNFX01JTl9DSEFSUykpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb3BlbmVkOiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgLy8gVGhlIGZpcnN0IG9wZW4gaXMgdGhlIG9uZSBqdXN0IG1hZGU7IGEgc291cmNlIGNsb3NlZCB0byBzYXZlIG1lbW9yeSBwYXJzZXMgYWdhaW4uXG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UoKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gb3BlbmVkO1xuICAgICAgb3BlbmVkID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW5HZW9Kc29uUmVnaW9uU291cmNlKGdlb0pzb25TdHIpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRyb3BSZWdpb25Tb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZHJvcFNsaWNlUmVnaW9uU291cmNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQSB0aWNrZXQgZm9yIGEgcmVnaW9uIGltcG9ydCB0aGF0IGlzIGFib3V0IHRvIHJlYWQgb3IgZGVjb2RlIGl0cyBmaWxlczogdGhlIGltcG9ydCBtZXRob2RzXG4gICAqIGdpdmVuIGl0IGNoYW5nZSBub3RoaW5nIG9uY2UgaXQgaXMgc3RhbGUg4oCUIGFub3RoZXIgaW1wb3J0IHRvb2sgYSB0aWNrZXQgc2luY2UsIGFub3RoZXIgaW1hZ2VcbiAgICogd2FzIHBsb3R0ZWQsIG9yIHRoZSBzZXJ2aWNlIHdhcyBkZXN0cm95ZWQg4oCUIHNvIGFuIGltcG9ydCB0aGF0IGZpbmlzaGVzIGxhdGUgbmV2ZXIgbGFuZHMgb24gYW5cbiAgICogaW1hZ2UgaXQgd2FzIG5vdCBzdGFydGVkIGZvci5cbiAgICovXG4gIHJlZ2lvbkltcG9ydFRpY2tldCgpOiBudW1iZXIge1xuICAgIHRoaXMuaW1wb3J0VGlja2V0ID0geyBpZDogdGhpcy5pbXBvcnRUaWNrZXQuaWQgKyAxLCBpbWFnZTogdGhpcy5pbXBvcnRJbWFnZUtleSgpIH07XG4gICAgcmV0dXJuIHRoaXMuaW1wb3J0VGlja2V0LmlkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHRpY2tldGAgaXMgc3RpbGwgdGhlIGN1cnJlbnQgaW1wb3J0J3MsIG9uIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldFZhbGlkKHRpY2tldDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRpY2tldCA9PT0gdGhpcy5pbXBvcnRUaWNrZXQuaWQgJiYgdGhpcy5pbXBvcnRUaWNrZXQuaW1hZ2UgPT09IHRoaXMuaW1wb3J0SW1hZ2VLZXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW1wb3J0SW1hZ2VLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gUmVnaW9uU2NvcGVDYWNoZS5pbWFnZUtleSh0aGlzLnBsb3R0ZWRJbmZvID8/IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBzb3VyY2UgcGVyIHNsaWNlLCBhcyBhbiBpbXBvcnRlZCBsYWJlbFxuICAgKiB2b2x1bWUgb3IgZm9sZGVyIG9mIHBlci1zbGljZSByZWdpb24gZmlsZXMgZ2l2ZXMgdGhlbTogYG9wZW5lcnNgIGJ5IHNsaWNlIGluZGV4LCBlYWNoIG9wZW5lZFxuICAgKiB0aGUgZmlyc3QgdGltZSBpdHMgc2xpY2UgaXMgc2hvd24uIEEgc2luZ2xlIGltYWdlIHRha2VzIHNsaWNlIDAncy4gUmV0dXJucyBob3cgbWFueSBzbGljZXNcbiAgICogaGF2ZSBhIHNvdXJjZSwgb3IgbnVsbCAoY2hhbmdpbmcgbm90aGluZykgd2hlbiBgdGlja2V0YCBpcyBzdGFsZSAoc2VlXG4gICAqIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9KS4gVGhlIHNvdXJjZXMgYXJlIG1hcmtlZCBpbXBvcnRlZCwgc28gYSBzYXZlIHdyaXRlcyBldmVyeSBzbGljZS5cbiAgICovXG4gIGltcG9ydFNsaWNlUmVnaW9uU291cmNlcyhvcGVuZXJzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlZ2lvblNvdXJjZU9wZW5lcj4sIHRpY2tldD86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh0aWNrZXQgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pbXBvcnRUaWNrZXRWYWxpZCh0aWNrZXQpKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnJlZ2lvbkltcG9ydFRpY2tldCgpOyAvLyBzdXBlcnNlZGVzIGFueSBpbXBvcnQgc3RpbGwgaW4gZmxpZ2h0XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucGxvdHRlZEluZm87XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKCFpbmZvPy5pc1N0YWNrKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IG9wZW5lcnMuZ2V0KDApID8/IG9wZW5lcnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgICAgaWYgKCFmaXJzdCkgcmV0dXJuIDA7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShmaXJzdCwgeyBzbGljZTogMCB9LCB0cnVlKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvKTtcbiAgICBmb3IgKGNvbnN0IFt6LCBvcGVuXSBvZiBvcGVuZXJzKSB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShvcGVuLCB7IHNsaWNlOiB6IH0sIHRydWUpO1xuICAgIHJldHVybiBvcGVuZXJzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgaW1hZ2UncyByZWdpb25zIGFuZCByZWdpb24gc291cmNlcyB3aXRoIG9uZSBpbXBvcnRlZCBzb3VyY2UgKGEgcmVnaW9uIHNldCB0aGVcbiAgICogaG9zdCdzIHNlcnZlciBzZXJ2ZXMpOiBvdmVyIGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgd2hlbiBpdCBpcyB6LWluZGV4ZWQsIGVsc2Ugb24gdGhlIHNsaWNlXG4gICAqIHNob3duLCBhcyB7QGxpbmsgYXBwbHlJbWFnZVJvaXN9IGxheXMgb3V0IGFuIGltYWdlJ3Mgb3duLiBSZXNvbHZlcyBmYWxzZSwgY2hhbmdpbmcgbm90aGluZ1xuICAgKiAoYW5kIGRpc3Bvc2luZyB0aGUgc291cmNlKSwgd2hlbiB0aGUgaW1wb3J0IHdlbnQgc3RhbGUgd2hpbGUgaXQgb3BlbmVkOiBhbm90aGVyIGltcG9ydCwgb3JcbiAgICogYW5vdGhlciBpbWFnZSAoc2VlIHtAbGluayByZWdpb25JbXBvcnRUaWNrZXR9OyBvbmUgaXMgdGFrZW4gaGVyZSB3aGVuIGB0aWNrZXRgIGlzIG5vdCBnaXZlbikuXG4gICAqL1xuICBhc3luYyBpbXBvcnRSZWdpb25Tb3VyY2VPcGVuZXIob3BlbjogUmVnaW9uU291cmNlT3BlbmVyLCB0aWNrZXQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBtaW5lID0gdGlja2V0ID8/IHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGZpcnN0OiBSZWdpb25Tb3VyY2UgfCBudWxsID0gYXdhaXQgb3BlbigpO1xuICAgIGlmICghdGhpcy5pbXBvcnRUaWNrZXRWYWxpZChtaW5lKSkge1xuICAgICAgZmlyc3QuZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXVzZTogUmVnaW9uU291cmNlT3BlbmVyID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gZmlyc3Q7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICByZXR1cm4gc291cmNlID8gUHJvbWlzZS5yZXNvbHZlKHNvdXJjZSkgOiBvcGVuKCk7XG4gICAgfTtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICBjb25zdCBwbGFuZXMgPSBmaXJzdC5pbmZvLnBsYW5lcztcbiAgICBjb25zdCB6SW5kZXhlZCA9ICEhaW5mbz8uaXNTdGFjayAmJiBwbGFuZXMuc29tZSgocCkgPT4gcCAhPT0gMCk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZXRhY2hSZWdpb25Tb3VyY2VzKCk7XG4gICAgaWYgKHpJbmRleGVkKSB7XG4gICAgICB0aGlzLmVudGVySW1wb3J0ZWRTdGFjayhpbmZvIGFzIElJbWFnZUluZm8pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2UocmV1c2UsICdwbGFuZXMnLCBbLi4ucGxhbmVzXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgeyBzbGljZTogdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSB9LCB0cnVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBFbXB0eSBldmVyeSBzbGljZSBvZiBhIHN0YWNrIChpdHMgcmVnaW9ucyBhbmQgdW5kbyBoaXN0b3J5KSBmb3IgcmVnaW9ucyBpbXBvcnRlZCBvdmVyIGl0LiAqL1xuICBwcml2YXRlIGVudGVySW1wb3J0ZWRTdGFjayhpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpXG4gICAgICA/IHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KClcbiAgICAgIDogaW5mby50aWxlZCA9PT0gZmFsc2VcbiAgICAgICAgPyAncGVyLXNsaWNlLWZpbGUnXG4gICAgICAgIDogJ2NvbWJpbmVkJztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoKSwgdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKSwgbGF5b3V0KTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VWaWV3JCgpOiBPYnNlcnZhYmxlPFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyQoKTtcbiAgfVxuICBnZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeTogT21pdDxSZWdpb25JbmRleFF1ZXJ5LCAnZXhjbHVkZSc+KTogUHJvbWlzZTxSZWdpb25JbmRleFBhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VJbmRleChxdWVyeSk7XG4gIH1cbiAgc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmU/OiBib29sZWFuKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKGlkcywgYWRkaXRpdmUpO1xuICB9XG4gIGRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZVNvdXJjZUZlYXR1cmVzKGlkcyk7XG4gIH1cbiAgZ2V0UmVnaW9uU3R5bGUkKCk6IE9ic2VydmFibGU8UmVnaW9uU3R5bGU+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25TdHlsZSQoKTtcbiAgfVxuICBzZXRSZWdpb25TdHlsZShwYXRjaDogUGFydGlhbDxSZWdpb25TdHlsZT4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvblN0eWxlKHBhdGNoKTtcbiAgfVxuICAvLyDilIDilIAgUmVnaW9ucyBpbiAzRDogdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIHNob3duIGluIHRoZSB2b2x1bWUgdmlldyDilIDilIDilIDilIDilIBcblxuICAvKiogUmVjb21wdXRlIHdoaWNoIDNEIHZpZXcgaXMgb24gc2NyZWVuIGZvciBgcGxvdFR5cGVgIChzZWUge0BsaW5rIHZvbHVtZVZpZXckfSkuICovXG4gIHByaXZhdGUgdXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlVm9sdW1lVmlldyA9IGlzTmFwYXJpVm9sdW1lKHBsb3RUeXBlKSB8fCBpc05hcGFyaUlzb3N1cmZhY2UocGxvdFR5cGUpO1xuICAgIGNvbnN0IHJlZ2lvbnMzZCA9IHRoaXMuaW1hZ2VWb2x1bWVWaWV3IHx8IChpc1NwYXRpYWxPbWljczNkKHBsb3RUeXBlKSAmJiAhIXRoaXMucGxvdHRlZEluZm8/LmlzU3RhY2spO1xuICAgIC8vIEV2ZXJ5IHBsb3QsIGFzIGJlZm9yZTogdGhlIFJlZ2lvbiBFZGl0b3IgZHJvcHMgaXRzIHBlci1jbGFzcyB2b2x1bWVzIG9uIGVhY2ggKGEgbmV3IGltYWdlKS5cbiAgICB0aGlzLnZvbHVtZVZpZXckLm5leHQocmVnaW9uczNkKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgbmFwYXJpIHZvbHVtZSAob3IgaXNvc3VyZmFjZSkgdmlldyBpcyBvbiBzY3JlZW46IHJlZ2lvbnMgY2FuIGJlIHNob3duIGluIDNELiAqL1xuICBnZXRWb2x1bWVWaWV3JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVWaWV3JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgdmlldydzIHNsaWNlIHBhbmUgaXMgd2FudGVkIChpdCBzaG93cyB3aGlsZSBhIHZvbHVtZSB2aWV3IGlzIG9uIHNjcmVlbikuICovXG4gIGdldFNsaWNlRWRpdG9yJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zbGljZUVkaXRvciQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiAqL1xuICBnZXRSZWdpb25zVGhyb3VnaFZvbHVtZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lIChpdCBoaWRlcyBub25lIG9mIHRoZW06IHN1cmZhY2VzIGluc2lkZSBpdHNcbiAgICogYnJpZ2h0IHN0cnVjdHVyZXMsIGFuIE9DVCdzIGxheWVyIGJvdW5kYXJpZXMpIG9yIGhpZGRlbiBiZWhpbmQgd2hhdCBpdCBzaG93cyAodGhlIGRlZmF1bHQpLlxuICAgKi9cbiAgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lJC52YWx1ZSA9PT0gdGhyb3VnaCkgcmV0dXJuO1xuICAgIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLm5leHQodGhyb3VnaCk7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaCk7XG4gIH1cblxuICAvKiogVGhlIGNsYXNzIGdyb3VwcyBzaG93biBpbiAzRCBvbiB0aGlzIGltYWdlIChbXSBhZnRlciBhIHN3aXRjaCB0byBhbm90aGVyIGltYWdlKS4gKi9cbiAgZ2V0UmVnaW9uQ2xhc3NlczNkJCgpOiBPYnNlcnZhYmxlPFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfT4+IHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc2VzM2QkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIEhpZGUgZXZlcnkgcmVnaW9uIHN1cmZhY2UgYW5kIGZvcmdldCB0aGVtIChhIGJ1aWxkIHN0aWxsIHJ1bm5pbmcgaXMgZHJvcHBlZCkuICovXG4gIHByaXZhdGUgY2xlYXJSZWdpb25DbGFzc2VzM2QoKTogdm9pZCB7XG4gICAgdGhpcy5tZXNoUmVxdWVzdCsrO1xuICAgIHRoaXMuc2hvd24zZCA9IFtdO1xuICAgIHRoaXMuY2xhc3NlczNkJC5uZXh0KFtdKTtcbiAgICB0aGlzLmNsYXNzZXMzZEltYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbk1lc2hlcyhbXSwgdW5kZWZpbmVkKTtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWdobGlnaHQoW10pO1xuICB9XG5cbiAgLyoqIEhpZ2hsaWdodCB0aGUgc3VyZmFjZXMgb2YgdGhlc2UgZ3JvdXAga2V5cyBpbiB0aGUgdm9sdW1lIHZpZXcgKG5vbmU6IGFsbCBhcyB1c3VhbCkuICovXG4gIGhpZ2hsaWdodFJlZ2lvbkNsYXNzZXMzZChrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZ2hsaWdodChrZXlzKTtcbiAgfVxuXG4gIC8qKiBBIHN1cmZhY2UgY2xpY2tlZCBpbiB0aGUgdm9sdW1lIHZpZXcgd2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wgKGl0cyBncm91cCBrZXkpLCBvciBub25lIChudWxsKS4gKi9cbiAgZ2V0UmVnaW9uUGlja2VkM2QkKCk6IE9ic2VydmFibGU8eyBrZXk6IHN0cmluZyB8IG51bGw7IGFkZGl0aXZlOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uTWVzaFBpY2skKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0aGVzZSBncm91cHMgb2YgY2xhc3NlcyBpbiB0aGUgdm9sdW1lIHZpZXcgYXMgM0QgcmVjb25zdHJ1Y3Rpb25zIChlYWNoIGdyb3VwIG9uZSBzdXJmYWNlXG4gICAqIGluIGl0cyBjb2xvdXI6IGFuIGF0bGFzIHN0cnVjdHVyZSB3aXRoIGl0cyBzdWJzdHJ1Y3R1cmVzKSwgYW5kIG9ubHkgdGhlc2U7IFtdIGhpZGVzIHRoZW0uXG4gICAqIFJlY29uc3RydWN0ZWQgZnJvbSBldmVyeSBzbGljZSdzIG91dGxpbmVzIGF0IHRoZSB2b2x1bWUncyByZXNvbHV0aW9uLCBjYWNoZWQgcGVyIGltYWdlLlxuICAgKi9cbiAgYXN5bmMgc2hvd1JlZ2lvbkNsYXNzZXMzZChcbiAgICBncm91cHM6IFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW107IGNvbG9yOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH0+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLm1lc2hSZXF1ZXN0O1xuICAgIHRoaXMuY2xhc3NlczNkSW1hZ2UgPSB0aGlzLnBsb3R0ZWRGaWxlTmFtZTtcbiAgICB0aGlzLnNob3duM2QgPSBncm91cHM7XG4gICAgLy8gV2hhdCBhbiBlZGl0IGZyb20gbm93IG9uIGlzIGNvbXBhcmVkIHdpdGggKHRoZSBsaXZlIHNsaWNlIG1heSBub3QgaGF2ZSBjaGFuZ2VkIHlldCkuXG4gICAgdGhpcy5saXZlQ2xhc3NlcyA9IG51bGw7XG4gICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgdGhpcy5jbGFzc2VzM2QkLm5leHQoZ3JvdXBzLm1hcCgoZykgPT4gKHsga2V5OiBnLmtleSwgY2xhc3NlczogZy5jbGFzc2VzIH0pKSk7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFRydWVJbWFnZVNpemUoKT8ud2lkdGggPz8gMTAyNDtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5uYXBhcmkucmVnaW9uVm94ZWxTdGVwKCkgPz8gTWF0aC5tYXgoMSwgd2lkdGggLyAyNTYpO1xuICAgIGNvbnN0IGltYWdlID0gdGhpcy5wbG90dGVkRmlsZU5hbWUgPz8gJyc7XG4gICAgY29uc3QgY2FjaGVLZXkgPSAoZzogeyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9KSA9PiBgJHtpbWFnZX18JHtzdGVwLnRvRml4ZWQoMyl9fCR7Zy5jbGFzc2VzLmpvaW4oJywnKX1gO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBncm91cHMuZmlsdGVyKChnKSA9PiAhdGhpcy5tZXNoQ2FjaGUuaGFzKGNhY2hlS2V5KGcpKSk7XG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IG1pc3NpbmcubWFwKChnKSA9PiBnLmtleSk7XG4gICAgICBjb25zdCB3aGF0ID0gbmFtZXMubGVuZ3RoID4gMyA/IGAke25hbWVzLmxlbmd0aH0gcmVnaW9uc2AgOiBuYW1lcy5qb2luKCcsICcpO1xuICAgICAgY29uc3QgZG9uZSA9IHRoaXMubmFwYXJpLmJlZ2luVGFzayhgQnVpbGRpbmcgJHt3aGF0fSBpbiAzROKApmApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVpbHQgPSBhd2FpdCB0aGlzLnJlZ2lvblN0b3JlLnJlY29uc3RydWN0Q2xhc3NlcyhcbiAgICAgICAgICBtaXNzaW5nLm1hcCgoZykgPT4gKHsga2V5OiBjYWNoZUtleShnKSwgY2xhc3NlczogZy5jbGFzc2VzIH0pKSxcbiAgICAgICAgICBzdGVwLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjbGFzc2VzT2YgPSBuZXcgTWFwKG1pc3NpbmcubWFwKChnKSA9PiBbY2FjaGVLZXkoZyksIGcuY2xhc3Nlc10pKTtcbiAgICAgICAgZm9yIChjb25zdCBiIG9mIGJ1aWx0KSB0aGlzLm1lc2hDYWNoZS5zZXQoYi5rZXksIHsgbWVzaDogYi5tZXNoLCBjbGFzc2VzOiBjbGFzc2VzT2YuZ2V0KGIua2V5KSA/PyBbXSB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcXVlc3QgIT09IHRoaXMubWVzaFJlcXVlc3QpIHJldHVybjtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25NZXNoZXMoXG4gICAgICBncm91cHMubWFwKChnKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc2ggPSB0aGlzLm1lc2hDYWNoZS5nZXQoY2FjaGVLZXkoZykpIS5tZXNoO1xuICAgICAgICByZXR1cm4geyBrZXk6IGcua2V5LCBjb2xvcjogZy5jb2xvciwgbGFiZWw6IGcubGFiZWwsIHZlcnRpY2VzOiBtZXNoLnZlcnRpY2VzLCBmYWNlczogbWVzaC5mYWNlcyB9O1xuICAgICAgfSksXG4gICAgICB0aGlzLnBsb3R0ZWRGaWxlTmFtZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb25zIGNoYW5nZWQ6IHdoZW4gdGhlIGxpdmUgc2xpY2UncyByZWdpb25zIG9mIHNvbWUgY2xhc3NlcyBkaWQgKGFuIGVkaXQsIGFuIHVuZG8sIG5vdFxuICAgKiBhIHNsaWNlIG9yIGltYWdlIHN3aXRjaCksIHRoZWlyIHJlY29uc3RydWN0aW9ucyBhcmUgc3RhbGUuIFRoZXkgYXJlIGRyb3BwZWQsIGFuZCB0aG9zZSBzaG93blxuICAgKiBpbiAzRCBhcmUgcmVidWlsdCBvbmNlIHRoZSBlZGl0cyBwYXVzZS5cbiAgICovXG4gIHByaXZhdGUgb25SZWdpb25zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICAvLyBOb3RoaW5nIGZvbGxvd3MgdGhlIGVkaXRzIChubyBzdXJmYWNlIGJ1aWx0IG9yIHNob3duLCBubyBzZWN0aW9ucyk6IHNraXAgdGhlIGZpbmdlcnByaW50cy5cbiAgICBpZiAoIXRoaXMuc2xpY2VNb3VudGVkICYmICF0aGlzLnNob3duM2QubGVuZ3RoICYmICF0aGlzLm1lc2hDYWNoZS5zaXplKSB7XG4gICAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5saXZlQ2xhc3NlcztcbiAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICBjb25zdCBub3cgPSB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICAvLyBBbm90aGVyIHNsaWNlIG9yIGltYWdlIGNhbWUgdXA6IG5vIHJlZ2lvbiBjaGFuZ2VkICh0aGUgc2VjdGlvbnMgcmVjdXQgZm9yIHRoZSBzbGljZSkuXG4gICAgaWYgKCFiZWZvcmUgfHwgYmVmb3JlLmF0ICE9PSBub3cuYXQpIHJldHVybjtcbiAgICBjb25zdCBjaGFuZ2VkID0gY2hhbmdlZENsYXNzZXMoYmVmb3JlLnNpZ25hdHVyZXMsIG5vdy5zaWduYXR1cmVzKTtcbiAgICAvLyBTb3VyY2UgZmVhdHVyZXMgZGVsZXRlZCAob3IgdGhhdCB1bmRvbmUpIGNoYW5nZSBubyBsaXZlIHJlZ2lvbiwgYW5kIHdoaWNoIGNsYXNzZXMgdGhleSB3ZXJlXG4gICAgLy8gaXMgbm90IGtub3duIGhlcmU6IGV2ZXJ5IGNsYXNzIGlzIHN0YWxlLiBBIGZlYXR1cmUgdGFrZW4gc2hvd3MgYXMgaXRzIGNsYXNzJ3MgY2hhbmdlLlxuICAgIGNvbnN0IGV2ZXJ5Q2xhc3MgPSAhY2hhbmdlZC5zaXplICYmIGJlZm9yZS5zb3VyY2VzICE9PSBub3cuc291cmNlcztcbiAgICBpZiAoIWNoYW5nZWQuc2l6ZSAmJiAhZXZlcnlDbGFzcykgcmV0dXJuO1xuICAgIGNvbnN0IHRvdWNoZWQgPSAoYzogc3RyaW5nKSA9PiBldmVyeUNsYXNzIHx8IGNoYW5nZWQuaGFzKGMpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5zZWN0aW9ucy5yZWdpb25zQ2hhbmdlZCgpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIFsuLi50aGlzLm1lc2hDYWNoZV0pIHtcbiAgICAgIGlmIChlbnRyeS5jbGFzc2VzLnNvbWUodG91Y2hlZCkpIHRoaXMubWVzaENhY2hlLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2hvd24zZC5zb21lKChnKSA9PiBnLmNsYXNzZXMuc29tZSh0b3VjaGVkKSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZWJ1aWxkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlYnVpbGRUaW1lcik7XG4gICAgdGhpcy5yZWJ1aWxkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVidWlsZFRpbWVyID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnNob3duM2QubGVuZ3RoICYmIHRoaXMuY2xhc3NlczNkSW1hZ2UgPT09IHRoaXMucGxvdHRlZEZpbGVOYW1lKSB7XG4gICAgICAgIHZvaWQgdGhpcy5zaG93UmVnaW9uQ2xhc3NlczNkKHRoaXMuc2hvd24zZCk7XG4gICAgICB9XG4gICAgfSwgUkVHSU9OX1NVUkZBQ0VfUkVCVUlMRF9NUyk7XG4gIH1cblxuICAvKiogRmluZ2VycHJpbnQgdGhlIGxpdmUgc2xpY2UncyBjbGFzc2VzLCB1bmxlc3MgYWxyZWFkeTogd2hhdCB0aGUgbmV4dCBlZGl0IGlzIGNvbXBhcmVkIHdpdGguICovXG4gIHByaXZhdGUgdHJhY2tMaXZlQ2xhc3NlcygpOiB7IGF0OiBzdHJpbmc7IHNpZ25hdHVyZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47IHNvdXJjZXM6IHN0cmluZyB9IHtcbiAgICB0aGlzLmxpdmVDbGFzc2VzID8/PSB7XG4gICAgICBhdDogdGhpcy5saXZlU2xpY2VLZXkoKSxcbiAgICAgIHNpZ25hdHVyZXM6IGNsYXNzU2lnbmF0dXJlcyh0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSksXG4gICAgICBzb3VyY2VzOiB0aGlzLnJlZ2lvblN0b3JlLmdldFNvdXJjZVN0YXRlS2V5KCksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5saXZlQ2xhc3NlcztcbiAgfVxuXG4gIC8qKiBXaGljaCBzbGljZSBvZiB3aGljaCBpbWFnZSB0aGUgbGl2ZSByZWdpb25zIGFyZS4gKi9cbiAgcHJpdmF0ZSBsaXZlU2xpY2VLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKX1cXG4ke3RoaXMucGxvdHRlZEZpbGVOYW1lID8/ICcnfWA7XG4gIH1cblxuICAvKiogRWFjaCBjbGFzcydzIHZvbHVtZSBvdmVyIHRoZSB3aG9sZSBzdGFjaywgaW4gcHjCsiDDlyBzbGljZXMgKHNlZSBSZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMpLiAqL1xuICBhc3luYyBnZXRDbGFzc1ZvbHVtZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGF3YWl0IHRoaXMucmVnaW9uU3RvcmUuY2xhc3NWb2x1bWVzKGNsYXNzZXMpKTtcbiAgfVxuXG4gIGdldFJlZ2lvblNvdXJjZUNsYXNzQ291bnRzKHN0YWNrPzogYm9vbGVhbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblNvdXJjZUNsYXNzQ291bnRzKHN0YWNrKTtcbiAgfVxuICBnZXRIaWRkZW5DbGFzc2VzJCgpOiBPYnNlcnZhYmxlPFJlYWRvbmx5U2V0PHN0cmluZz4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRIaWRkZW5DbGFzc2VzJCgpO1xuICB9XG4gIHNldENsYXNzZXNIaWRkZW4oY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzLCBoaWRkZW4pO1xuICAgIC8vIEEgc3VyZmFjZSBpcyBpdHMgY2xhc3MncyAoaXRzIGdyb3VwIGtleSBpcyB0aGUgY2xhc3MgbmFtZSkuXG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlkZGVuKFsuLi50aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMoKV0pO1xuICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgfVxuICBhc3luYyBzZWxlY3RSZWdpb25DbGFzc2VzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdENsYXNzZXMoY2xhc3NlcywgYWRkaXRpdmUpO1xuICB9XG4gIGdldEdlb0pzb25TdHJpbmdXaXRoU291cmNlKHJlZ2lvbnM6IFJlZ2lvbltdLCBzbGljZT86IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0R2VvSnNvbldpdGhTb3VyY2UocmVnaW9ucywgc2xpY2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBlci1zbGljZSB6LXN0YWNrIHJlZ2lvbnMgKGppdC11aSM5MyksIGZyb20gdGhlIHNoYXJlZCBSZWdpb25TdG9yZS4g4pSA4pSAXG4gIGVudGVyU3RhY2tNb2RlKFxuICAgIHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LFxuICAgIGluaXRpYWxaPzogbnVtYmVyLFxuICAgIHNhdmVMYXlvdXQ/OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5lbnRlclN0YWNrTW9kZShzbGljZXMsIGluaXRpYWxaLCBzYXZlTGF5b3V0KTtcbiAgfVxuICBleGl0U3RhY2tNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZXhpdFN0YWNrTW9kZSgpO1xuICB9XG4gIGlzU3RhY2tNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKCk7XG4gIH1cbiAgLyoqIFRoZSBzbGljZSB0aGUgcmVnaW9ucyBhcmUgc2hvd24gZm9yIChyZWNvcmRlZCBvdXRzaWRlIHN0YWNrIG1vZGUgdG9vKS4gKi9cbiAgZ2V0RGlzcGxheVNsaWNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0RGlzcGxheVNsaWNlKCk7XG4gIH1cbiAgZ2V0U3RhY2tTYXZlTGF5b3V0KCk6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKTtcbiAgfVxuICBzZXREaXNwbGF5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXREaXNwbGF5U2xpY2Uoeik7XG4gIH1cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKTtcbiAgfVxuICBnZXRTdGFja1NhdmVTbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVTbGljZXMoKTtcbiAgfVxuICAvKiogQWxsIHNsaWNlcycgQU5OT1RBVElPTiByZWdpb25zIGZvciBhIHotc3RhY2sgc2F2ZSAoaml0LXVpIzkzKSwgZWFjaCB0YWdnZWRcbiAgICogIHdpdGggaXRzIHplcm8tYmFzZWQgUmVnaW9uLno7IHByb2ZpbGUgbGluZXMgZXhjbHVkZWQuIEZsYXQgYW5ub3RhdGlvbiBzZXRcbiAgICogIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICAvKiogUGVyLXNsaWNlIGFubm90YXRpb24gcmVnaW9ucyB0byB3cml0ZSBvbiBhIGZvbGRlci1zdGFjayBzYXZlIChqaXQtdWkjOTMpOlxuICAgKiAgc2xpY2UgaW5kZXgg4oaSIHRoYXQgc2xpY2UncyBhbm5vdGF0aW9uIHJlZ2lvbnMgKHByb2ZpbGUgbGluZXMgZXhjbHVkZWQpLFxuICAgKiAgaW5jbHVkaW5nIG5vdy1lbXB0eSBzbGljZXMgdGhhdCB3ZXJlIGxvYWRlZCBub24tZW1wdHkgKHNvIHRoZXkgb3ZlcndyaXRlKS4gKi9cbiAgZ2V0U3RhY2tTYXZlQW5ub3RhdGlvblNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICBmb3IgKGNvbnN0IFt6LCByZWdzXSBvZiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpKSB7XG4gICAgICBvdXQuc2V0KFxuICAgICAgICB6LFxuICAgICAgICByZWdzLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIEF1dGhvcml0YXRpdmUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHNpemUgZm9yIG1hc2sgZXhwb3J0LiBQcmVmZXJzIHRoZVxuICAgKiAgYWN0aXZlIHJlbmRlcmVyJ3MgcmVwb3J0ZWQgc2l6ZSwgZmFsbGluZyBiYWNrIHRvIHRoZSBpbWFnZSBtZXRhZGF0YSAoeC95XG4gICAqICBhcmUgdGhlIGZ1bGwtcmVzIHBpeGVsIGRpbWVuc2lvbnMgdXNlZCBhY3Jvc3MgdGhlIGFwcCkuIFJlamVjdHMgbm9uLWZpbml0ZVxuICAgKiAgb3Igbm9uLXBvc2l0aXZlIHNpemVzIOKAlCB0aGUgUGxvdGx5IGJvdW5kcyBjYW4geWllbGQgTmFOIGJlZm9yZSBhIHBsb3QgaXNcbiAgICogIGZ1bGx5IGxhaWQgb3V0LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgY3Jhc2ggbWFzayBjcmVhdGlvbi4gKi9cbiAgZ2V0TWFza0ltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2YWxpZCA9IChzOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHwgdW5kZWZpbmVkKSA9PlxuICAgICAgcyAmJiBOdW1iZXIuaXNGaW5pdGUocy53aWR0aCkgJiYgTnVtYmVyLmlzRmluaXRlKHMuaGVpZ2h0KSAmJiBzLndpZHRoID49IDEgJiYgcy5oZWlnaHQgPj0gMVxuICAgICAgICA/IHsgd2lkdGg6IE1hdGgucm91bmQocy53aWR0aCksIGhlaWdodDogTWF0aC5yb3VuZChzLmhlaWdodCkgfVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmcm9tUmVuZGVyZXIgPSB2YWxpZCh0aGlzLmdldFRydWVJbWFnZVNpemUoKSk7XG4gICAgaWYgKGZyb21SZW5kZXJlcikgcmV0dXJuIGZyb21SZW5kZXJlcjtcblxuICAgIGxldCBtZXRhOiBJSW1hZ2VNZXRhZGF0YVtdID0gW107XG4gICAgdGhpcy5nZXRJbWFnZU1ldGEoKVxuICAgICAgLnN1YnNjcmliZSgobSkgPT4gKG1ldGEgPSBtKSlcbiAgICAgIC51bnN1YnNjcmliZSgpO1xuICAgIGNvbnN0IG0wID0gbWV0YT8uWzBdO1xuICAgIHJldHVybiBtMCA/IHZhbGlkKHsgd2lkdGg6IG0wLngsIGhlaWdodDogbTAueSB9KSA6IG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRvckFwaTogYW5ub3RhdGlvbi1vbmx5IHN1cmZhY2UgZm9yIHRoZSBSZWdpb24gRWRpdG9yIOKUgOKUgOKUgFxuICAvLyBJbnRlbnNpdHktcHJvZmlsZSBsaW5lcyAoa2luZD0ncHJvZmlsZScpIGJlbG9uZyB0byB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdFxuICAvLyB0aGUgZWRpdG9yLiBUaGVzZSBtZXRob2RzIGdpdmUgZXh0ZXJuYWwgY29uc3VtZXJzIGFuIGFubm90YXRpb24tb25seSB2aWV3XG4gIC8vIGFuZCBndWFyYW50ZWUgcHJvZmlsZSBsaW5lcyBhcmUgcHJlc2VydmVkLiBUaGUgd3JpdGVzIGxhbmQgaW4gdGhlIHN0b3JlIGxpa2VcbiAgLy8gYW55IG90aGVyLCBhbmQgZXZlcnkgYmFja2VuZCByZWRyYXdzIGZyb20gaXRzIGV2ZW50cy5cblxuICBnZXRBbm5vdGF0aW9uUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gIH1cbiAgc2V0QW5ub3RhdGlvblJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICAvLyBSZS1hcHBlbmQgdGhlIHN0b3JlJ3MgcHJvZmlsZSBsaW5lcyBzbyBhbiBlZGl0b3Igc2F2ZS9kZWxldGUgY2FuJ3QgZHJvcCB0aGVtLlxuICAgIGNvbnN0IHByb2ZpbGVzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiBpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgIGNvbnN0IGFubm90YXRpb25zID0gKHJlZ2lvbnMgfHwgW10pLmZpbHRlcigocikgPT4gIWlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgdGhpcy5zZXRSZWdpb25zKFsuLi5hbm5vdGF0aW9ucywgLi4ucHJvZmlsZXNdLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGZhbHNlKTtcbiAgfVxuICBnZXRTZWxlY3RlZFJlZ2lvbnMkKCk6IE9ic2VydmFibGU8UmVnaW9uW10+IHtcbiAgICAvLyBNYXAgdGhlIGludGVybmFsIGluZGV4LWJhc2VkIHNlbGVjdGlvbiB0byB0aGUgc2VsZWN0ZWQgYW5ub3RhdGlvbiByZWdpb25zLlxuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpLnBpcGUoXG4gICAgICBtYXAoKGlkeHMpID0+IHtcbiAgICAgICAgY29uc3QgcmVncyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgICAgICByZXR1cm4gaWR4cy5tYXAoKGkpID0+IHJlZ3NbaV0pLmZpbHRlcigocik6IHIgaXMgUmVnaW9uID0+ICEhciAmJiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgY29uc3QgcmVncyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IGluZGljZXMgPSAocmVnaW9ucyB8fCBbXSkubWFwKChyKSA9PiByZWdzLmZpbmRJbmRleCgoeCkgPT4geC5pZCA9PT0gci5pZCkpLmZpbHRlcigoaSkgPT4gaSA+PSAwKTtcbiAgICB0aGlzLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGluZGljZXMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHRvb2xzIOKGkiBhY3RpdmUgcmVuZGVyZXIgKHJ1biBvbiBlaXRoZXIgYmFja2VuZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFRoZSB3YW5kLCB2ZXJ0ZXggZXJhc2VyIGFuZCB6b29tLXRvLWJveCBhcmUgaW1wbGVtZW50ZWQgb24gYm90aCBiYWNrZW5kc1xuICAvLyB2aWEgSUNvb3JkaW5hdGVUcmFuc2Zvcm0gKCsgYSB2aWV3cG9ydCBwaXhlbCByZWFkYmFjayBmb3IgdGhlIHdhbmQpLCBzbyB0aGV5XG4gIC8vIGZvbGxvdyB0aGUgYWN0aXZlIHJlbmRlcmVyIOKAlCB0aGUgc2xpY2UgcGFuZSdzIHdoaWxlIHRoZSB2b2x1bWUgdmlldyBpcyBzcGxpdC5cbiAgc2V0QWN0aXZlVG9vbChpZDogc3RyaW5nIHwgbnVsbCwgb3B0aW9ucz86IENhbnZhc1Rvb2xPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QWN0aXZlVG9vbChpZCwgb3B0aW9ucyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IElXYW5kT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFdhbmRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0V2FuZE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLmNsZWFyQWN0aXZlV2FuZFJlZ2lvbigpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSUJydXNoT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldEJydXNoTW9kZShhY3RpdmUsIG9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRab29tVG9Cb3hNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25CYWNrZW5kKCkuc2VnbWVudFJlY3RhbmdsZXMoKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uQmFja2VuZCgpLnNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0U2FtTW9kZWwoaWQpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRTYW1Qb2ludE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLmNvbW1pdFNhbVBvaW50cygpO1xuICB9XG4gIGNsZWFyU2FtUG9pbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLmNsZWFyU2FtUG9pbnRzKCk7XG4gIH1cblxuICAvLyDilIDilIAgZGlzcGxheSBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBTdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDigJQgcmVhZHMgZ28gc3RyYWlnaHQgdG8gaXQuXG4gIC8vIFRoZSB0d28gU0VUVEVSUyBzdGlsbCByb3V0ZSB0aHJvdWdoIFBsb3RseSBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbnNcbiAgLy8gY2FycnkgcmVuZGVyIGdsdWUgYmV5b25kIHRoZSBzdG9yZSB3cml0ZSAoYSBsaXZlIFBsb3RseS5yZXN0eWxlIG9mXG4gIC8vIGNvbG9yc2NhbGUvcmV2ZXJzZXNjYWxlIG9uIHRoZSBtb3VudGVkIGhlYXRtYXApOyBPU0QgcmVjb2xvcnMgdmlhIGl0cyBvd25cbiAgLy8gc3RvcmUgc3Vic2NyaXB0aW9uIGVpdGhlciB3YXkuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCk7XG4gIH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IENvbG9ybWFwTm9kZSk6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnNldENvbG9ybWFwKGNvbG9ybWFwKTtcbiAgfVxuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwT3B0aW9ucygpO1xuICB9XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKTtcbiAgfVxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnNldFJldmVyc2VTY2FsZShyZXZlcnNlKTtcbiAgfVxuICBzZXRJbWFnZU1ldGEoaW1hZ2VNZXRhOiBJSW1hZ2VNZXRhZGF0YVtdLCBpbWFnZUtleT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0SW1hZ2VNZXRhKGltYWdlTWV0YSwgaW1hZ2VLZXkpO1xuICB9XG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbWFnZU1ldGEoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJQ2hhbm5lbEhpc3RvZ3JhbUFwaTogQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSBzdXJmYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBDaGFubmVsL2dyYXlzY2FsZS9pbnZlcnQgc3RhdGUgbGl2ZXMgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmU7IGJvdGhcbiAgLy8gYmFja2VuZHMgc3Vic2NyaWJlIGFuZCByZWNvbG9yIGxpdmUsIHNvIHNldHRlcnMganVzdCB3cml0ZSB0aGUgc3RvcmUuIFRoZVxuICAvLyBoaXN0b2dyYW0gY29tZXMgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW4gKGl0cyBuYXRpdmUgcGl4ZWxzKS5cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cbiAgLyoqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBkYXRhICgxNi1iaXQgbXVsdGktYmFuZCBUSUZGKSB2aWEgdGhlIGFjdGl2ZSBiYWNrZW5kLiAqL1xuICBleHBvcnREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5leHBvcnREYXRhKCk7XG4gIH1cbiAgZ2V0Q2hhbm5lbHMkKCk6IE9ic2VydmFibGU8SUNoYW5uZWxTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpO1xuICB9XG4gIHNldFNlbGVjdGVkQ2hhbm5lbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZENoYW5uZWwoaW5kZXgpO1xuICB9XG4gIHNldENoYW5uZWxTdGF0ZShpbmRleDogbnVtYmVyLCBwYXJ0aWFsOiBQYXJ0aWFsPElDaGFubmVsU3RhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaW5kZXgsIHBhcnRpYWwpO1xuICB9XG4gIHJlc2V0Q29udHJhc3QoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAvLyBGdWxsIHJlc2V0OiB3aW5kb3cgKDAuLjI1NSksIGdhbW1hICgxKSBBTkQgdGhlIGNoYW5uZWwncyBkZWZhdWx0IHRpbnQuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHRoaXMuc3RvcmUucmVzZXRDaGFubmVsU3RhdGUoaSk7XG4gIH1cbiAgLyoqIEF1dG8td2luZG93IGVhY2ggY2hhbm5lbCBieSBzYXR1cmF0aW5nIGBzYXR1cmF0aW9uYCAoMC4uMSkgb2YgcGl4ZWxzIGF0IGVhY2hcbiAgICogIGVuZCBvZiBpdHMgaGlzdG9ncmFtIChza2lwcGluZyBvdXRsaWVyIGZpcnN0L2xhc3QgYmlucykuICovXG4gIGF1dG9Db250cmFzdChpbmRpY2VzOiBudW1iZXJbXSwgc2F0dXJhdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICAgIGNvbnN0IGggPSB0aGlzLnJlbmRlcmVyKCkuZ2V0SGlzdG9ncmFtKGksIDI1Nik7XG4gICAgICBpZiAoIWgpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgW21pbiwgbWF4XSA9IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtKGgsIHNhdHVyYXRpb24sIFswLCAyNTVdKTtcbiAgICAgIGlmIChtYXggPiBtaW4pIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKGksIHsgbWluLCBtYXggfSk7XG4gICAgfVxuICB9XG4gIGdldEdyYXlzY2FsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0R3JheXNjYWxlKCk7XG4gIH1cbiAgc2V0R3JheXNjYWxlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRHcmF5c2NhbGUob24pO1xuICB9XG4gIGdldEludmVydCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCk7XG4gIH1cbiAgc2V0SW52ZXJ0KG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbnZlcnQob24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3RpdmUgYmFja2VuZCdzIHJlZ2lvbiBvdmVybGF5ICh0aGUgc2xpY2UgcGFuZSdzIHdoaWxlIHRoZSB2b2x1bWUgdmlldyBpcyBzcGxpdCkuIEZhbGxzXG4gICAqIGJhY2sgdG8gUGxvdGx5J3Mgd2hlbiB0aGUgYWN0aXZlIGJhY2tlbmRcbiAgICogKE9TRCBvciBuYXBhcmktanMpIGlzIHNlbGVjdGVkIGJ1dCBhIHBsb3QgaXNuJ3QgbW91bnRlZCB5ZXQsIHNvIGNhbGxlcnMgYWx3YXlzIGdldCBhXG4gICAqIHVzYWJsZSBvdmVybGF5LlxuICAgKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB7XG4gICAgY29uc3QgciA9IHRoaXMucmVnaW9uQmFja2VuZCgpO1xuICAgIGlmIChyID09PSB0aGlzLm9zZCkge1xuICAgICAgcmV0dXJuIHRoaXMub3NkLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIGlmIChyID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpLmdldFJlZ2lvbk92ZXJsYXkoKSA/PyB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5nZXRSZWdpb25PdmVybGF5KCk7XG4gIH1cblxuICAvKiogSXNvc3VyZmFjZSBjb250cm9scyBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIHdoZW4gaXQgcmVuZGVycyBpc29zdXJmYWNlcy4gKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldElzb3N1cmZhY2VDb250cm9scygpO1xuICB9XG5cbiAgLyoqIDNEIHNjZW5lIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiAoUGxvdGx5IG9yIG5hcGFyaS1qcyksIG9yIG51bGwgb24gYVxuICAgKiAgMkQtb25seSBvbmUuICovXG4gIGdldFN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTtcbiAgfVxuXG4gIC8qKiBJbnRlbnNpdHkgKGxpbmUtUk9JKSBjb250cm9scywgd2hpY2hldmVyIGJhY2tlbmQgZHJhd3MgdGhlIGltYWdlOiB0aGVcbiAgICogIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlIGFkZHMgdGhlIGxpbmUgdG8gdGhlIHN0b3JlLCBhbmQgZXZlcnkgYmFja2VuZFxuICAgKiAgKFBsb3RseSBpbmNsdWRlZCkgZHJhd3MgaXQgZnJvbSB0aGUgc3RvcmUncyB1cGRhdGUgZXZlbnQuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF0aWFsLW9taWNzIGNvbnRyb2xzLCBvciBudWxsIHdoZW4gbm8gYFNQQVRJQUxfREFUQV9QT1JUYCBpcyBib3VuZC4gU2VydmVkIGJ5IGFcbiAgICogYmFja2VuZC1uZXV0cmFsIHtAbGluayBTcGF0aWFsQ29udHJvbHNGYWNhZGV9IChzdGF0ZSBpbiB0aGUgc2hhcmVkIHN0b3JlcyksIHNvIHRoZVxuICAgKiBjb250cm9scyB3b3JrIGFjcm9zcyBhIHBsb3QtdHlwZSBzd2l0Y2ggYW5kIGJlZm9yZSBhbnkgYmFja2VuZCBoYXMgbW91bnRlZC5cbiAgICovXG4gIGdldFNwYXRpYWxDb250cm9scygpOiBJU3BhdGlhbENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNwYXRpYWxEYXRhKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGUgPz89IG5ldyBTcGF0aWFsQ29udHJvbHNGYWNhZGUodGhpcy5zcGF0aWFsRGF0YSwge1xuICAgICAgc3RvcmU6IHRoaXMuc3RvcmUsXG4gICAgICByZWdpb25TdG9yZTogdGhpcy5yZWdpb25TdG9yZSxcbiAgICAgIHNlbGVjdGlvblN0b3JlOiB0aGlzLnNlbGVjdGlvblN0b3JlLFxuICAgICAgbmFwYXJpOiB0aGlzLm5hcGFyaSxcbiAgICAgIHBsb3RUeXBlOiAoKSA9PiB0aGlzLmN1cnJlbnRQbG90VHlwZSxcbiAgICAgIHpJbmRleDogKCkgPT4gdGhpcy5jdXJyZW50WkluZGV4LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxGYWNhZGUuY29udHJvbHM7XG4gIH1cblxuICAvKiogQ3JlYXRlZCBvbiBmaXJzdCB1c2U7IG93bnMgdGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHNwYXRpYWxGYWNhZGU6IFNwYXRpYWxDb250cm9sc0ZhY2FkZSB8IG51bGwgPSBudWxsO1xuICAvKiogRGlzcGxheWVkIHNsaWNlLiBPbmx5IGEgdm9sdW1lLWJhY2tlZCBzcGF0aWFsIGRhdGFzZXQgcmVhZHMgaXQsIHRvIGtlZXAgYVxuICAgKiAgcmVnaW9uIGRyYXduIG92ZXIgb25lIHNlY3Rpb24gZnJvbSBzZWxlY3RpbmcgdGhlIHdob2xlIGRlcHRoIGJlaGluZCBpdC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WkluZGV4ID0gMDtcblxuICAvKiogQW5ndWxhciBjYWxscyB0aGlzIHdoZW4gdGhlIGluamVjdG9yIHByb3ZpZGluZyB0aGUgcm91dGVyIGlzIGRlc3Ryb3llZCDigJQgdGhlIGhvc3RcbiAgICogIGNvbXBvbmVudCBmb3IgYSBgcHJvdmlkZVZpc3VhbGl6YXRpb24oKWAgY2hhaW4uIFRoZSBkYXRhc2V0IHN1YnNjcmlwdGlvbiB3b3VsZFxuICAgKiAgb3RoZXJ3aXNlIGtlZXAgdGhlIHdob2xlIGlzb2xhdGVkIGNoYWluIHJlYWNoYWJsZSBmcm9tIHRoZSByb290IGRhdGEgcG9ydC4gKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB1bmRlZmluZWQgfTsgLy8gYSBsYXRlIGltcG9ydCBjaGFuZ2VzIG5vdGhpbmdcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGUgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uVXBkYXRlcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlY3Rpb25zLnN0b3AoKTtcbiAgICBpZiAodGhpcy5yZWJ1aWxkVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlYnVpbGRUaW1lcik7XG4gIH1cblxuICAvKipcbiAgICogSW50ZW5zaXR5LXByb2ZpbGUgc2FtcGxpbmcsIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbjogdGhlIHNhbXBsaW5nIGlzIHRoZVxuICAgKiBiYWNrZW5kLW5ldXRyYWwgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UnczsgdGhlIHZpZXdwb3J0IGNoYW5nZXMgY29tZSBmcm9tIGV2ZXJ5XG4gICAqIGJhY2tlbmQgdGhhdCByZXBvcnRzIHRoZW0gKE9wZW5TZWFkcmFnb24sIG5hcGFyaS1qcyksIG1lcmdlZCBpbnRvIG9uZSBzdGFibGVcbiAgICogc3RyZWFtIHRoZSBpbnNldCBzdWJzY3JpYmVzIHRvIG9uY2UuXG4gICAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZW5zaXR5U2FtcGxpbmc6IElJbnRlbnNpdHlTYW1wbGluZyA9IHtcbiAgICAvLyBMb2FkIHRoZSBkaXNwbGF5ZWQgc2xpY2UncyBwaXhlbHMgZm9yIGEgYmFja2VuZCB0aGF0IGhhcyBubyBmcmFtZXMgb2YgaXRzIG93blxuICAgIC8vIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanM7IFBsb3RseSBmZWVkcyBpdHMgZnJhbWVzIHRvIHRoZSBzZXJ2aWNlIHdoZW4gaXQgcGxvdHMpLlxuICAgIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nOiAoaW1hZ2VJbmZvLCB6SW5kZXgpID0+IHtcbiAgICAgIHRoaXMucG9pbnRTYW1wbGluZ0F0UGxvdCgpO1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5LmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9LFxuICAgIC8vIFJlLXNhbXBsZSBmcm9tIGEgZnJlc2ggY3JvcCBvZiB0aGUgaW1hZ2UtcGl4ZWwgUk9JIGF0IGRpc3BsYXkgcmVzb2x1dGlvbi5cbiAgICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2k6ICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpID0+IHtcbiAgICAgIHRoaXMucG9pbnRTYW1wbGluZ0F0UGxvdCgpO1xuICAgICAgdGhpcy5pbnRlbnNpdHkucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHgsIHksIHdpZHRoLCBoZWlnaHQsIHpJbmRleCk7XG4gICAgfSxcbiAgICBnZXRWaWV3cG9ydENoYW5nZSQ6ICgpID0+XG4gICAgICBtZXJnZSguLi50aGlzLmJhY2tlbmRzKCkubWFwKChiKSA9PiBiLmdldEludGVuc2l0eVNhbXBsaW5nKCk/LmdldFZpZXdwb3J0Q2hhbmdlJCgpID8/IEVNUFRZKSksXG4gIH07XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoKWAuICovXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZy5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm8sIHpJbmRleCk7XG4gIH1cblxuICAvKiogQ3JvcHMgZm9yIHNhbXBsaW5nIGFyZSBzaXplZCBmcm9tIHRoZSBwbG90IGRpdiAod2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyBpbnRvIGl0KS4gKi9cbiAgcHJpdmF0ZSBwb2ludFNhbXBsaW5nQXRQbG90KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHRoaXMuaW50ZW5zaXR5LnNldFNhbXBsaW5nRWxlbWVudCh0aGlzLnBsb3REaXYpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5nZXRWaWV3cG9ydENoYW5nZSQoKWAuICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZy5nZXRWaWV3cG9ydENoYW5nZSQoKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKClgLiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHgsIHksIHdpZHRoLCBoZWlnaHQsIHpJbmRleCk7XG4gIH1cblxuICAvKiogVGhlIHZpc3VhbGl6ZXIgdmlldyBpcyBnb2luZyBhd2F5OiBkZXRhY2ggZXZlcnkgYmFja2VuZCDigJQgZHJvcHBpbmcgdGhlaXIgdmlldy1ib3VuZFxuICAgKiAgc3Vic2NyaXB0aW9ucyBhbmQgZGlzcG9zaW5nIHRoZSBuYXBhcmktanMgdmlld2VyLCB3aG9zZSBjYW52YXMsIHJlbmRlciBsb29wIGFuZCBHUFVcbiAgICogIGJ1ZmZlcnMgd291bGQgb3RoZXJ3aXNlIG91dGxpdmUgdGhlIHZpZXcgKGZvciBhIGNvbXBvbmVudC1zY29wZWQgY2hhaW4sIGZvcmV2ZXIpLlxuICAgKiAgTm90aGluZyBpcyBvbiBzY3JlZW4gYWZ0ZXJ3YXJkcywgc28gdGhlIG5leHQgcGxvdCBzdGFydHMgZnJvbSB0aGUgZGVmYXVsdCBiYWNrZW5kLiAqL1xuICBkZXRhY2goKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVJlcXVlc3QrKztcbiAgICB0aGlzLnNlY3Rpb25zLnN0b3AoKTtcbiAgICB0aGlzLnNsaWNlTW91bnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2xpY2VEaXYgPSBudWxsO1xuICAgIHRoaXMucGxvdGx5LmRldGFjaCgpO1xuICAgIHRoaXMub3NkLmRldGFjaCgpO1xuICAgIHRoaXMubmFwYXJpLmRldGFjaCgpO1xuICAgIHRoaXMubGFzdFJlbmRlcmVkID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGRldGFjaH0uICovXG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoKCk7XG4gIH1cbn1cbiJdfQ==