@jax-data-science/sci-image-visualizer 0.2.3 → 0.2.5

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.
@@ -28,6 +28,7 @@ import { PlotlyRegionOverlay } from './plotly-region-overlay';
28
28
  import { PlotlyCoordinateTransform } from './plotly-coordinate-transform';
29
29
  import { VisualizerStore } from '../../store/visualizer-store.service';
30
30
  import { RegionStore } from '../../store/region-store.service';
31
+ import { VIZ_ALERT_TOAST_KEY } from '../../toast-outlets';
31
32
  import * as i0 from "@angular/core";
32
33
  import * as i1 from "primeng/api";
33
34
  import * as i2 from "@angular/common/http";
@@ -962,7 +963,7 @@ export class PlotlyService {
962
963
  catch (err) {
963
964
  const msg = err?.error?.message || err?.message || err?.statusText || String(err);
964
965
  console.error('Error occured', err);
965
- this.messageService.add({ key: 'center-toast', sticky: true, severity: 'error', summary: 'An error occured', detail: `The following
966
+ this.messageService.add({ key: VIZ_ALERT_TOAST_KEY, sticky: true, severity: 'error', summary: 'An error occured', detail: `The following
966
967
  error occured: ${msg}. Please try to open the image again through the
967
968
  file navigator.` });
968
969
  // TODO correctly clear the plot
@@ -1346,7 +1347,7 @@ export class PlotlyService {
1346
1347
  }, error: err => {
1347
1348
  const msg = err?.error?.message || err?.message || err?.statusText || String(err);
1348
1349
  console.error('Error occured when zooming', err);
1349
- this.messageService.add({ key: 'center-toast', sticky: true, severity: 'error', summary: 'An error occured',
1350
+ this.messageService.add({ key: VIZ_ALERT_TOAST_KEY, sticky: true, severity: 'error', summary: 'An error occured',
1350
1351
  detail: `The following error occured while zooming: ${msg}.
1351
1352
  Please try to open the image again through the file navigator and
1352
1353
  zoom on the selected area once more.` });
@@ -2134,4 +2135,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
2134
2135
  type: Inject,
2135
2136
  args: [CELL_SEGMENTER]
2136
2137
  }] }, { type: i9.VertexEraserToolService }, { type: i10.ZoomToBoxToolService }, { type: i11.VisualizerStore }, { type: i12.RegionStore }] });
2137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdGx5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sS0FBSyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFnQixhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQW1CLGVBQWUsRUFBZ0IsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQWdCLE1BQU0sd0NBQXdDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzlGLE9BQU8sRUFBa0IsY0FBYyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUF3QixNQUFNLHdEQUF3RCxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBSzFGLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFDaEcsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLHlCQUF5QixDQUFDO0FBR2pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFMUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFFL0QsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw2REFBNkQ7QUFDN0QseURBQXlEO0FBQ3pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdwRCxNQUFjLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUtoQyxNQUFNLE9BQU8sYUFBYTtJQThIeEIsWUFBOEMsS0FBcUIsRUFDckIsS0FBcUIsRUFDaEQsY0FBOEIsRUFBVSxJQUFnQixFQUN2RCxXQUF3QixFQUN4QixRQUF5QixFQUN6QixTQUEyQixFQUMzQixPQUF1QixFQUN2QixZQUFpQyxFQUNqQyxlQUF1QyxFQUNILGFBQW9DLEVBQ3hFLGdCQUF5QyxFQUN6QyxhQUFtQyxFQUNuQyxLQUFzQixFQUN0QixXQUF3QjtRQWJFLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ2hELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7UUFDdkQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUNILGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUN4RSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBQ3pDLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyxVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQXpJNUM7Ozs7O1dBS0c7UUFDTSxpQkFBWSxHQUF1QixjQUFjLENBQUM7WUFDekQsYUFBYSxDQUFDLFlBQVk7WUFDMUIsYUFBYSxDQUFDLFNBQVM7WUFDdkIsYUFBYSxDQUFDLGNBQWM7WUFDNUIsYUFBYSxDQUFDLGFBQWE7WUFDM0IsYUFBYSxDQUFDLFdBQVc7WUFDekIsYUFBYSxDQUFDLFdBQVc7WUFDekIsYUFBYSxDQUFDLFVBQVU7U0FDekIsQ0FBQyxDQUFDO1FBRUssV0FBTSxHQUFVLEVBQUUsQ0FBQztRQUNuQixtQkFBYyxHQUFxQixFQUFFLENBQUM7UUFDdEMsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFJdkIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxCLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBYy9CLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUdwQyxvQkFBZSxHQUF3QixJQUFJLENBQUM7UUFRNUMscUJBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUN0QixzQkFBaUIsR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDbEM7O2lFQUV5RDtRQUNqRCxzQkFBaUIsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQ7OzZGQUVxRjtRQUM3RSxtQkFBYyxHQUFtRSxJQUFJLENBQUM7UUFLdEYsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNwRCwwQkFBcUIsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvRCxnRUFBZ0U7UUFDeEQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUM1Qyx1RUFBdUU7UUFDdkUsNkVBQTZFO1FBQzdFLDhEQUE4RDtRQUM5RDtvRUFDNEQ7UUFDM0Msb0JBQWUsR0FBRztZQUNqQyxTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsT0FBTztZQUNsQixTQUFTLEVBQUUsVUFBVTtZQUNyQixTQUFTLEVBQUUsUUFBUTtZQUNuQixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsTUFBTTtZQUNqQixTQUFTLEVBQUUsT0FBTztTQUNuQixDQUFDO1FBQ0Y7MkNBQ21DO1FBQzNCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO1FBQzlEOzs7eUZBR2lGO1FBQ3pFLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxXQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3JCOzs7OytFQUl1RTtRQUMvRCxpQkFBWSxHQUE0QixJQUFJLENBQUM7UUFDckQsb0VBQW9FO1FBQ3BFLHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDL0QsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFjWCx3QkFBbUIsR0FDbEMsSUFBSSx5QkFBeUIsQ0FDM0IsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQzNDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFnQnBDLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0UseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRTtZQUMvQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ2pELGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUNuRCxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbEQsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3JELHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMzRCxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDaEMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO1NBQ3RELENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRTtZQUMvQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ2pELG9CQUFvQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7WUFDN0QsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3JELHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMzRCxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUMxRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2pGLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3pFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsNkZBQTZGO1FBQzdGLDhGQUE4RjtRQUM5RiwrRkFBK0Y7UUFDL0YsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7U0FDekIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRiwwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLDZFQUE2RTtRQUM3RSwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3JGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkMsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ2xELENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQXFCLEVBQUUsTUFBYztRQUNyRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQzVCLDBDQUEwQztRQUMxQyxJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUV6RCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDekIsbUJBQW1CO1FBQ25CLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDbkMsSUFBSSxTQUFTLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBVSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQywyRUFBMkU7WUFDM0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hDLG1GQUFtRjtnQkFDbkYsK0NBQStDO2dCQUMvQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNyRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLElBQUksV0FBVyxFQUFFLENBQUM7d0JBQ2hCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNyRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN2QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6RSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN6QixDQUFDO29CQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHNCQUFzQjtvQkFDdEIsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUNELG1DQUFtQztZQUNuQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDbEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksU0FBUyxDQUFDO1lBQ2QsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25GLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN4QixNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO2dCQUN4QixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0g7Ozs7O09BS0c7SUFDSSxJQUFJLENBQUMsT0FBZSxFQUFFLFdBQWdCLEVBQUUsU0FBcUIsRUFBRSxZQUFvQixFQUM5RSxRQUFrQixFQUFFLFVBQW1CLEtBQUs7UUFDdEQsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLG1CQUFtQjtRQUNuQixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnREFBZ0Q7UUFDakYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBRWpELHdFQUF3RTtRQUN4RSw2RUFBNkU7UUFDN0UsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSwyREFBMkQ7UUFDM0QsTUFBTSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FDekIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLEVBQzFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUIsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQzlFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQzlFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQ2pGLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssV0FBVyxDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsTUFBYSxFQUFFLFdBQXFCLEVBQ3RFLE1BQWdCLEVBQUUsWUFBb0IsRUFBRSxVQUFtQixLQUFLO1FBQ2pGLElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsT0FBTztRQUNQLE1BQU0sTUFBTSxHQUFnRSxFQUFFLENBQUM7UUFDL0UsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRztnQkFDWixFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNiLENBQUMsRUFBRSxPQUFPO2dCQUNWLElBQUksRUFBRSxTQUFTO2dCQUNmLDREQUE0RDtnQkFDNUQsbUVBQW1FO2dCQUNuRSwwR0FBMEc7Z0JBQzFHLFNBQVMsRUFBRSxNQUFNO2dCQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDbkQsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzlDLElBQUksRUFBRSxTQUFTLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQzthQUNyQixDQUFDO1lBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN2RCxPQUFRLE1BQWMsQ0FBQyxPQUFPLEVBQUUsTUFBYSxFQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM3QyxnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssV0FBVyxDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsTUFBYSxFQUFFLFdBQXFCLEVBQ3JFLE1BQWdCLEVBQUUsWUFBb0IsRUFBRSxVQUFtQixLQUFLO1FBQ2xGLElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsT0FBTztRQUNQLE1BQU0sTUFBTSxHQUFpQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRztnQkFDWixDQUFDLEVBQUUsT0FBTztnQkFDVixJQUFJLEVBQUUsU0FBUztnQkFDZixxQkFBcUI7Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNuRCxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtnQkFDOUMsOEJBQThCO2dCQUM5Qix1QkFBdUI7YUFDeEIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkQsT0FBUSxNQUFjLENBQUMsT0FBTyxFQUFFLE1BQWEsRUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsY0FBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDN0UsZ0VBQWdFO1lBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssY0FBYyxDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsTUFBYSxFQUFFLFdBQXFCLEVBQ3JFLE1BQWdCLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFDL0MsWUFBb0IsRUFBRSxVQUFtQixLQUFLO1FBQ25FLHNFQUFzRTtRQUN0RSxvRUFBb0U7UUFDcEUsaUVBQWlFO1FBQ2pFLFdBQVc7UUFDWCxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBRWpDLHlGQUF5RjtRQUN6RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ25FLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQWdFLEVBQUUsQ0FBQztRQUMvRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hDLE1BQU0sS0FBSyxHQUFHO2dCQUNaLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDYixFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLENBQUMsRUFBRSxPQUFPO2dCQUNWLG1FQUFtRTtnQkFDbkUsMEdBQTBHO2dCQUMxRyxTQUFTLEVBQUUsTUFBTTtnQkFDakIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLFNBQVMsS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLEtBQUssS0FBSyxDQUFDO2FBQ3JCLENBQUM7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3ZELE9BQVEsTUFBYyxDQUFDLE9BQU8sRUFBRSxNQUFhLEVBQUUsTUFBTSxFQUFFLE1BQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUUsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM3QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWUsQ0FBQyxTQUFxQixFQUFFLFdBQWdCLEVBQ3ZDLGFBQXVCO1FBQzdDLDJFQUEyRTtRQUMzRSwyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkUsT0FBTztZQUNMLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSTtZQUN4QixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtZQUMxQixhQUFhO1lBQ2IsV0FBVyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVztZQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUNuRCxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtZQUM5QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtZQUM1QyxNQUFNO1lBQ04sTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQ7bUZBQytFO0lBQ3ZFLHFCQUFxQixDQUFDLE1BQWEsRUFBRSxXQUFvQjtRQUMvRCxJQUFJLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDN0IsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJO3dCQUMxQixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFBRSxTQUFTO29CQUNsQyxJQUFJLENBQUMsR0FBRyxHQUFHO3dCQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUc7d0JBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7OztvRkFLZ0Y7SUFDeEUsVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQy9DLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDOUIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsc0NBQXNDO1lBQzlELEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUM3QyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDN0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksV0FBVyxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxRCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBUyxDQUFDLENBQUM7WUFDdEUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxrRkFBa0Y7SUFDM0UscUJBQXFCLEtBQWlDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUzRTs7OztPQUlHO0lBQ0ssZUFBZSxDQUFDLE9BQWUsRUFBRSxJQUF3QixFQUFFLEtBQXNCLEVBQ2pFLFlBQW9CLEVBQUUsVUFBbUIsS0FBSztRQUNwRSxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUM3QyxJQUFJLE1BQVcsQ0FBQztRQUNoQixRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixLQUFLLFdBQVc7Z0JBQ2QsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDaEMsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtnQkFDaEYsTUFBTTtZQUNSLFNBQVMsYUFBYTtnQkFDcEIsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNyRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkQsT0FBUSxNQUFjLENBQUMsT0FBTyxFQUFFLE1BQWEsRUFBRSxNQUFNLEVBQUUsTUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM5RSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3pELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNERBQTREO0lBQ3BELGNBQWM7UUFDcEIsT0FBTztZQUNMLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3pCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtZQUNqQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1lBQzdCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQseUVBQXlFO0lBQ2pFLGdCQUFnQixDQUFDLE1BQWdCLEVBQUUsTUFBZ0I7UUFDekQsT0FBTztZQUNMLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUMvRixLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLO2FBQy9FO1lBQ0QsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDekIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN0RSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSztTQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVELGtFQUFrRTtJQUMxRCxlQUFlO1FBQ3JCLE9BQU87WUFDTCxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN6QixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNyQixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNyQixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUMzQix1RUFBdUU7Z0JBQ3ZFLG9FQUFvRTtnQkFDcEUsaUVBQWlFO2dCQUNqRSwwQ0FBMEM7Z0JBQzFDLFVBQVUsRUFBRSxNQUFNO2FBQ25CO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxtRUFBbUU7SUFDNUQsc0JBQXNCO1FBQzNCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBMkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQ7b0VBQ2dFO0lBQ3pELGdCQUFnQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCx1RUFBdUU7SUFFdkU7K0RBQzJEO0lBQ3BELG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0ZBQWtGO0lBQzNFLG9CQUFvQixLQUFnQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFekU7Ozs7T0FJRztJQUNJLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxRQUE0QjtRQUNyRSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUztZQUNkLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNYLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLE9BQU87WUFDYixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMvQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0osMkVBQTJFO1FBQzNFLDhFQUE4RTtRQUM5RSxNQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUNqRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFhLEVBQUU7WUFDOUIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNwQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUN4RCxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM3RCxVQUFVLEVBQUUsS0FBSztZQUNqQixhQUFhLEVBQUUsb0JBQW9CO1lBQ25DLFlBQVksRUFBRSxvQkFBb0I7WUFDbEMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1NBQzNCLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUU7UUFDMUUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksY0FBYztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBFLCtFQUErRTtRQUMvRSw4RUFBOEU7UUFDOUUsNEVBQTRFO1FBQzVFLGdGQUFnRjtRQUNoRixzQkFBc0I7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztlQUNwRCxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSztlQUMxQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWpGLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO1FBQ2hGLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFckMsTUFBTSxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsMEVBQTBFO1FBQzFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFekUsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN4QixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUYsOEVBQThFO1FBRTlFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5DLDJFQUEyRTtRQUMzRSw4RUFBOEU7UUFDOUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCx5RUFBeUU7SUFDakUsaUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFTLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRDt1REFDbUQ7SUFDM0MsWUFBWTtRQUNsQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztTQUNmLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0NBQWdDLENBQUMsTUFBYztRQUNyRCw4RUFBOEU7UUFDOUUsd0VBQXdFO1FBQ3hFLE1BQU0sSUFBSSxHQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ2xDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4QyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQixDQUFDLE1BQWEsRUFBRSxNQUFnQixFQUFFLFNBQTJCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQXFCLEVBQUUsTUFBYztRQUN4RSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNO1lBQUUsT0FBTztRQUNyQyx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBZ0IsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNyRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDhCQUE4QixDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFDbkQsTUFBYztRQUNsRCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUM7WUFBRSxPQUFPO1FBQ3RDLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM1QixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUQsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7b0JBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPO3dCQUFFLE9BQU87b0JBQ3RDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztvQkFDN0MsTUFBTSxLQUFLLEdBQUcsTUFBTTt3QkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQzt3QkFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUNsRixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFpRSxDQUFDO1NBQy9FLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUIsQ0FBQyxJQUFTO1FBQ3ZDLE1BQU0sS0FBSyxHQUFxQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0MsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDeEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDekMsMkVBQTJFO1FBQzNFLDZFQUE2RTtRQUM3RSx5RUFBeUU7UUFDekUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxVQUFVO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUIsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLDBFQUEwRTtZQUMxRSxxREFBcUQ7WUFDckQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDekYsQ0FBQztZQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVEOztrRkFFOEU7SUFDdEUsVUFBVTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUN2QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsSUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxJQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQzVCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGlCQUFpQixFQUFFLEtBQUs7YUFBRSxDQUMzQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxhQUF3QjtRQUN0QyxJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsT0FBTyxHQUFHLGFBQWEsQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixpRUFBaUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsSUFBSSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMxQyxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQ2pELENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2xELENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUksc0JBQXNCO2dCQUNuRixDQUFDO3FCQUFNLENBQUM7b0JBQ04seUZBQXlGO29CQUN6RixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUNqRCxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBQzttREFDdkUsR0FBRztrREFDSixFQUFFLENBQUMsQ0FBQztnQkFDOUMsZ0NBQWdDO2dCQUNoQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsT0FBZSxFQUFFLFdBQW9CLEVBQUUsWUFBb0I7UUFDM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULHdCQUF3QjtZQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2xFLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVqRCx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLDRDQUE0QztZQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQVU7UUFDckMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsNkJBQTZCO1FBQzdCLHVDQUF1QztRQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN6RCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUM1QyxJQUFJLFdBQVcsS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUM5RixDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLENBQUM7b0JBQ0QsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDeEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsNEVBQTRFO1lBQzVFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFDRCx1REFBdUQ7UUFDdkQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekMsTUFBTSxXQUFXLEdBQVUsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO29CQUNuQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixDQUFDO2dCQUNELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO29CQUNuQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUNELHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFlLENBQUM7WUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVDLHNFQUFzRTtnQkFDdEUsaUVBQWlFO2dCQUNqRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO3dCQUNqRCxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO3dCQUNsQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsRUFBRTt3QkFDakQsWUFBWSxFQUFFLFVBQVU7cUJBQ3pCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCx5RUFBeUU7WUFDekUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztRQUNELGVBQWU7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUN6RSx1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUN0RCxzR0FBc0c7WUFDdEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3BDLENBQUM7UUFDRCxvQ0FBb0M7UUFDcEMsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JFLDhDQUE4QztZQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCx5RUFBeUU7UUFDekUsdUVBQXVFO1FBQ3ZFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUdELHVFQUF1RTtJQUVoRSxXQUFXLENBQUMsTUFBZSxFQUFFLFVBQXVCLEVBQUU7UUFDM0QsMkVBQTJFO1FBQzNFLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxPQUFvQjtRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0scUJBQXFCO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sWUFBWSxDQUFDLE1BQWUsRUFBRSxVQUF3QixFQUFFO1FBQzdELHlFQUF5RTtRQUN6RSxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxlQUFlLENBQUMsT0FBcUI7UUFDMUMsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE1BQWU7UUFDeEMsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0scUJBQXFCLENBQUMsTUFBYztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxNQUFlO1FBQ3JDLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLDhFQUE4RTtRQUM5RSxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsd0VBQXdFO0lBQ2hFLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUMxQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDOUIsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDeEQsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztTQUN4RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7MEVBQ3NFO0lBQy9ELGlCQUFpQjtRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDTSx5QkFBeUI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ00sV0FBVyxDQUFDLEVBQVU7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNNLGVBQWUsQ0FBQyxNQUFlO1FBQ3BDLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ00sZUFBZSxLQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELGNBQWMsS0FBVyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1RDs7OztPQUlHO0lBQ0g7aUZBQzZFO0lBQ3JFLGtCQUFrQixDQUFDLEVBQVUsRUFBRSxFQUFVO1FBQy9DLE1BQU0sRUFBRSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ25DLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRU8sY0FBYyxDQUFDLFdBQXFCO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQzVCLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7YUFDMUIsQ0FBQyxDQUFDO1FBQ1osQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsdUVBQXVFO0lBRXZFLDJEQUEyRDtJQUNwRCxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JFLENBQUM7SUFFRCwwRUFBMEU7SUFDbkUsc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRCx1RUFBdUU7SUFFdkUsc0VBQXNFO0lBQzlELGtCQUFrQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hGLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUM5QixLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUM5QixNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtTQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxFQUFFO0lBQ0YsK0VBQStFO0lBQy9FLCtFQUErRTtJQUMvRSxvRUFBb0U7SUFDcEUsNEVBQTRFO0lBQzVFLG1DQUFtQztJQUVuQyxpRkFBaUY7SUFDekUsbUJBQW1CO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMzQixPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Z0VBQzREO0lBQ3BELG1CQUFtQjtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssbUJBQW1CO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNO2FBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUM3RSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGlCQUFpQjtRQUN0QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ25GLENBQUM7SUFDSCxDQUFDO0lBRUQsb0RBQW9EO0lBQzVDLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVFLE1BQU0sRUFBRSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQzNELElBQUksT0FBTyxZQUFZLEtBQUssUUFBUTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCw2RUFBNkU7SUFDN0Usb0JBQW9CO1FBQ2xCLE9BQU87WUFDTCxrQkFBa0IsRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztZQUNuRSxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7U0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxJQUFZO1FBQ3BDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBUyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBUyxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsV0FBcUI7UUFDdkMsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsNEVBQTRFO1FBQzVFLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RCxNQUFNLFNBQVMsR0FBVSxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNuQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BDLDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNwRixNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQzFDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQzt3QkFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7d0JBQzFDLE1BQU0sS0FBSyxHQUFHLE1BQU07NEJBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7NEJBQ2xFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMxRSxvRUFBb0U7d0JBQ3BFLHFFQUFxRTt3QkFDckUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDaEYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUNwQixnRUFBZ0U7d0JBQ2hFLGdFQUFnRTt3QkFDaEUsaUVBQWlFO3dCQUNqRSxjQUFjO3dCQUNkLE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxhQUFhLEdBQUcsSUFBSTs0QkFDeEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQ0FDbkMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQ0FDdkMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU87NkJBQ3RELEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQzs0QkFDckMsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQ0FDTCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQzVFLElBQUksQ0FBQyxZQUFZLENBQUM7Z0NBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUN6RCxrRUFBa0U7d0JBQ2xFLCtEQUErRDt3QkFDL0QscUNBQXFDO3dCQUNyQyxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQzt3QkFDN0QsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7NEJBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDbEMsS0FBSyxHQUFHLElBQUksQ0FBQzs0QkFDYixJQUFJLFlBQVk7Z0NBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ2QsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEYsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUMsa0JBQWtCO29CQUN2RyxNQUFNLEVBQUMsOENBQThDLEdBQUc7OytEQUVELEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNsQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFrQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sWUFBWSxDQUFDLFNBQW1CLEVBQUUsVUFBb0I7UUFDNUQseUVBQXlFO1FBQ3pFLE1BQU0sT0FBTyxHQUF3QjtZQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXO1lBQ3ZDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUM3QixVQUFVLEVBQUUsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVTtTQUNwRSxDQUFDO1FBQ0YsSUFBSSxTQUFTLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNELElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxjQUFjLENBQUMsU0FBcUI7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxpRkFBaUY7SUFDMUUsc0JBQXNCO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQVM7UUFDbkIsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDO0lBQzNFLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBUztRQUNqQixPQUFPLFNBQVMsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLFVBQVUsQ0FBQyxPQUFpQixFQUFFLGVBQXlCLEVBQzVDLGNBQXdCLEVBQUUsU0FBa0IsRUFDNUMsU0FBa0IsS0FBSztRQUN2QyxNQUFNLFNBQVMsR0FBRyxlQUFlLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUN6RyxNQUFNLElBQUksR0FBRyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFFbEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCw2RUFBNkU7WUFDN0UsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ04sc0VBQXNFO1lBQ3RFLHdEQUF3RDtZQUN4RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBUSxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUM7SUFFRDt3RUFDb0U7SUFDNUQsY0FBYyxDQUFDLFVBQWlCO1FBQ3RDLE9BQU87WUFDTCxNQUFNLEVBQUUsVUFBVTtZQUNsQixXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsRUFBRTtTQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVEO3lCQUNxQjtJQUNiLFlBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0I7UUFDdkIsdURBQXVEO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUF3QjtRQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQztJQUMvQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0Usd0VBQXdFO0lBQ2pFLElBQUksS0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxLQUFjLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsT0FBTyxLQUFjLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsV0FBVyxLQUEwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLFdBQVcsS0FBMEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxnQkFBZ0IsS0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXhFLDRFQUE0RTtJQUNyRSxjQUFjLENBQUMsTUFBNkIsRUFBRSxRQUFpQixFQUNoRCxVQUEwQztRQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDTSxhQUFhLEtBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0QsV0FBVyxLQUFjLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakUsa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFDTSxlQUFlLENBQUMsQ0FBUyxJQUFVLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxlQUFlLEtBQWUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxrQkFBa0IsS0FBNEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTVGLGdCQUFnQixDQUFDLE1BQWdCLEVBQUUsTUFBZ0I7UUFDekQsT0FBTztZQUNMLEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUUsT0FBTztnQkFDbEIsZUFBZSxFQUFFLFFBQVE7Z0JBQ3pCLElBQUksRUFBRSxLQUFLO2dCQUNYLEtBQUssRUFBRSxFQUFFO2dCQUNULEtBQUssRUFBRSxNQUFNO2FBQ2Q7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLE9BQU87Z0JBQ2xCLGVBQWUsRUFBRSxRQUFRO2dCQUN6QixLQUFLLEVBQUUsTUFBTTtnQkFDYixLQUFLLEVBQUUsRUFBRTtnQkFDVCxVQUFVLEVBQUUsSUFBSTtnQkFDcEIsb0ZBQW9GO2dCQUNwRixTQUFTLEVBQUUsS0FBSztnQkFDWixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLO2FBQzVDO1lBQ0EsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDekIsT0FBTyxFQUFFLENBQUM7b0JBQ1IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDZCxZQUFZLEVBQUU7d0JBQ1osT0FBTyxFQUFFLElBQUk7d0JBQ2IsTUFBTSxFQUFFLFVBQVU7d0JBQ2xCLE9BQU8sRUFBRSxPQUFPO3FCQUNqQjtvQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtpQkFDdkIsQ0FBQztZQUNGLFFBQVEsRUFBRSxJQUFJO1lBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdEUsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDM0QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDL0MsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1NBQzFFLENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLFNBQWtCO1FBQ3ZDLE1BQU0sY0FBYyxHQUFxQixFQUFFLENBQUM7UUFDNUMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNyRSxZQUFZO2dCQUNaLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsS0FBSyxDQUFDLEtBQUssR0FBRzt3QkFDWixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO3dCQUN2QixZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO3dCQUMvQixZQUFZLEVBQUUsVUFBVTt3QkFDeEIsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRTtxQkFDdkMsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ25CLENBQUM7Z0JBQ0QsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUNELHVEQUF1RDtRQUN2RCxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNEOzs7Ozs7T0FNRztJQUNLLGdCQUFnQixDQUFDLE1BQWdCLEVBQUUsTUFBZ0IsRUFBRSxNQUFjO1FBQ3pFLE9BQU87WUFDTCxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xDLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUU7b0JBQ0wsU0FBUyxFQUFFLG9CQUFvQjtvQkFDL0IsYUFBYSxFQUFFLG9CQUFvQjtvQkFDbkMsY0FBYyxFQUFFLElBQUk7b0JBQ3BCLGVBQWUsRUFBRSxtQkFBbUI7b0JBQ3BDLGdCQUFnQjtpQkFDakI7Z0JBQ0QsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRSxvQkFBb0I7b0JBQy9CLGFBQWEsRUFBRSxvQkFBb0I7b0JBQ25DLGNBQWMsRUFBRSxJQUFJO29CQUNwQixlQUFlLEVBQUUsb0JBQW9CO29CQUNyQyx5QkFBeUI7b0JBQ3pCLGlCQUFpQjtvQkFDakIsbUJBQW1CO2lCQUNwQjtnQkFDRCxLQUFLLEVBQUU7b0JBQ0wsU0FBUyxFQUFFLG9CQUFvQjtvQkFDL0IsYUFBYSxFQUFFLG9CQUFvQjtvQkFDbkMsY0FBYyxFQUFFLElBQUk7b0JBQ3BCLGVBQWUsRUFBRSxtQkFBbUI7aUJBQ3JDO2dCQUNELFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFO2dCQUN0QyxVQUFVLEVBQUUsUUFBUTtnQkFDcEIsT0FBTyxFQUFFLENBQUM7d0JBQ1IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTt3QkFDZCxZQUFZLEVBQUU7NEJBQ1osT0FBTyxFQUFFLElBQUk7NEJBQ2IsTUFBTSxFQUFFLFVBQVU7NEJBQ2xCLE9BQU8sRUFBRSxPQUFPO3lCQUNqQjt3QkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtxQkFDdkIsQ0FBQzthQUNIO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxRQUFRO1FBQ2QsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDVCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ1osTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDNUUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQVc7UUFDakMsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUNwRCxDQUFDO1FBQ0YsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGVBQWU7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEYsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHFCQUFxQjtRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvQixNQUFNLEVBQUUsR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFbkQseUJBQXlCO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwQyxNQUFNLEtBQUssR0FBWSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFOUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzNCLHFEQUFxRDtZQUNyRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELE1BQU0sSUFBSSxHQUFHLElBQUksaUJBQWlCLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQztZQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO29CQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM5QixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ04sa0RBQWtEO1lBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUksaUJBQWlCLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLHNCQUFzQjtRQUMzQixNQUFNLEVBQUUsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVFLE1BQU0sRUFBRSxHQUF5QixFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDL0QsTUFBTSxFQUFFLEdBQXlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztRQUMvRCxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNiLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUNBQXVDO1lBQzFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNGLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuQyxPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUNsRCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFhLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTO1FBQ2QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRDtzRUFDa0U7SUFDM0QsZUFBZTtRQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsTUFBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDSCxDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU0sV0FBVyxDQUFDLElBQW9CO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBRSxJQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLDhGQUE4RjtRQUM5RixrRkFBa0Y7UUFDbEYsdUZBQXVGO1FBQ3ZGLDBGQUEwRjtRQUMxRiwwRkFBMEY7UUFDMUYsd0VBQXdFO1FBQ3hFLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBZ0QsQ0FBQztRQUNoRyxJQUFJLENBQUMsRUFBRSxFQUFFLFdBQVc7WUFBRSxPQUFPO1FBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDtrRUFDOEQ7SUFDdkQsbUJBQW1CLENBQUMsUUFBaUI7UUFDMUMsNENBQTRDO0lBQzlDLENBQUM7SUFFRDtxRkFDaUY7SUFDMUUsd0JBQXdCLENBQUMsUUFBaUI7UUFDL0MsbURBQW1EO0lBQ3JELENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixNQUFNLEVBQUUsR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsRUFBRSxFQUFFLFdBQVc7WUFBRSxPQUFPO1FBQzdCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ2hDLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0Usc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUs7WUFBRSxPQUFPO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUM1QixnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRTtZQUMxQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRTtTQUNwQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGlCQUFpQjtRQUN0Qix3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLGlFQUFpRTtRQUNqRSxNQUFNLEVBQUUsR0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTVFLHVFQUF1RTtRQUN2RSw2RUFBNkU7UUFDN0Usd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLFdBQVcsR0FBVyxFQUFFLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDO1lBQy9ELElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEdBQUcsQ0FBQztnQkFBRSxPQUFPO1lBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCwwRUFBMEU7UUFDMUUsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUVyQywyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLDZCQUE2QjtRQUM3QixJQUFJLEVBQUUsRUFBRSxXQUFXO1lBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNwRSxJQUFJLEVBQUUsRUFBRSxXQUFXO29CQUFHLE1BQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEQsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUErQixDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsTUFBTSxFQUFFLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXO1lBQUUsT0FBTztRQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUNoQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUNoQyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSztZQUFFLE9BQU87UUFDckMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN0MsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzVCLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFO1lBQzFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFO1NBQ3BDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTSxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQ00sZUFBZSxDQUFDLFlBQXFCO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDTSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSx5RUFBeUU7SUFDekUsMEJBQTBCO0lBQzFCLGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsV0FBVyxDQUFDLFFBQWE7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFlO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBMkI7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFrQjtRQUM3QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQVMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHdCQUF3QjtRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCLENBQUMsT0FBaUI7UUFDOUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2FBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxFQUFFLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsSUFBSSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQ3BCLEVBQUUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDO29CQUFFLE1BQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ25FLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFlBQVksQ0FBQyxNQUFjO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUQsTUFBTSxFQUFFLEdBQVEsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsSUFBSSxFQUFFLEVBQUUsV0FBVyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQztvQkFBRSxNQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLE1BQU0sRUFBRSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUM7UUFDL0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxTQUFTLENBQUMsTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs0RUFDd0U7SUFDaEUsbUJBQW1CLENBQUMsUUFBZSxFQUFFLEdBQVksRUFBRSxHQUFZO1FBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO1FBQzdELHFFQUFxRTtRQUNyRSxNQUFNLE1BQU0sR0FBUSxFQUFFLFlBQVksRUFBRSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbEQsSUFBSSxVQUFVLElBQUksSUFBSTtZQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsd0JBQXdCO1FBQ2hGLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCx3RkFBd0Y7WUFDeEYsTUFBTSxNQUFNLEdBQ1YsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsVUFBVTtnQkFDckMsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsT0FBTztnQkFDbEMsSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFDckIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLG9EQUFvRDtRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzhFQUMwRTtJQUMxRSxZQUFZLENBQUMsWUFBb0IsRUFBRSxLQUFhO1FBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsU0FBUztZQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQVMsQ0FBQztnQkFDZCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsQ0FBQyxHQUFHLFlBQVksSUFBSSxDQUFDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNO3dCQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzt3QkFDcEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ1gsQ0FBQztnQkFDRCxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFJLENBQUMsR0FBRyxDQUFDO29CQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQU0sSUFBSSxDQUFDLEdBQUcsR0FBRztvQkFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzsrRUFFMkU7SUFDM0UsYUFBYSxDQUFDLFlBQW9CLEVBQUUsSUFBWTtRQUM5QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDtzRkFDa0Y7SUFDbEYsVUFBVTtRQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUVBQXVFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQWtCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQWlCO1FBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBaUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2hDLENBQUM7OEdBcnBFVSxhQUFhLGtCQThISixnQkFBZ0IsYUFDaEIsZ0JBQWdCLHNRQVFKLGNBQWM7a0hBdkluQyxhQUFhLGNBRlosTUFBTTs7MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQStIYyxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ3ZCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFRdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBQbG90bHkgZnJvbSAncGxvdGx5LmpzLWRpc3QtbWluJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBvbHlnb24sIFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZUFjY2Vzc1BvcnQsIFRJTEVfQUNDRVNTX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBJbWFnZVN0YXRlUG9ydCwgSU1BR0VfU1RBVEVfUE9SVCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9pbWFnZS1zdGF0ZS5wb3J0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgRU1QVFksIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvc2hhcGUnO1xuaW1wb3J0IHsgQ09ORklHLCBDT05GSUdfU1VSRkFDRSwgUGxvdFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3Bsb3QudXRpbGl0aWVzJztcbmltcG9ydCB7IFdhbmRTZXJ2aWNlLCBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FjaGVkSW1hZ2VEYXRhLCBXYW5kVG9vbFNlcnZpY2UsIFdhbmRUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFRvb2xTZXJ2aWNlLCBCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLCBWZXJ0ZXhFcmFzZXJUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdmVydGV4LWVyYXNlci92ZXJ0ZXgtZXJhc2VyLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBab29tVG9Cb3hUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIHBhcnNlU3ZnUGF0aFBvbHlnb24sXG4gIHZlcnRpY2VzVG9TdmdQYXRoLFxufSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBMT1RfVFlQRV9ERVNDUklQVE9SUywgUGxvdFR5cGVEZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBQTE9UTFlfUExPVF9UWVBFX0lNUExTLFxuICBQbG90bHlQbG90VHlwZUltcGwsXG4gIFRyYWNlQnVpbGRJbnB1dCxcbn0gZnJvbSAnLi9wbG90bHktdHJhY2UtYnVpbGRlcnMnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGJ0NjAxTHVtaW5hbmNlLCBoaXN0b2dyYW0yNTYgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcywgVmlld2VyRmVhdHVyZSwgY2FwYWJpbGl0aWVzT2YgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IFBsb3RseVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuL3Bsb3RseS1yZWdpb24tb3ZlcmxheSc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBQbG90bHlDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi9wbG90bHktY29vcmRpbmF0ZS10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuXG4vLyBSZS1leHBvcnRlZCBzbyBleGlzdGluZyBjb25zdW1lcnMgY2FuIGtlZXAgaW1wb3J0aW5nIFBsb3RUeXBlIGZyb20gdGhpc1xuLy8gbW9kdWxlIHdoaWxlIGl0IHBoeXNpY2FsbHkgbGl2ZXMgaW4gdGhlIGJhY2tlbmQtbmV1dHJhbCBjb250cmFjdHMvIGRpci5cbi8vIFRPRE8ocGxvdHRpbmctYWJzdHJhY3Rpb24pOiBvbmNlIGFsbCBjb25zdW1lcnMgaW1wb3J0IGZyb21cbi8vICcuL2NvbnRyYWN0cy9wbG90LXR5cGUnIGRpcmVjdGx5LCBkcm9wIHRoaXMgcmUtZXhwb3J0LlxuZXhwb3J0IHsgUGxvdFR5cGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcblxuXG4od2luZG93IGFzIGFueSkuQnVmZmVyID0gQnVmZmVyO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbG90bHlTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuXG4gIC8qKlxuICAgKiBQbG90bHkgaXMgdGhlIGZ1bGwtZmVhdHVyZWQgZGF0YSBiYWNrZW5kOiBpdCBzdXBwb3J0cyBldmVyeSBmZWF0dXJlLFxuICAgKiBpbmNsdWRpbmcgM0Qgc2NlbmVzLCBsaXZlIHNjYWxhciBjb2xvcm1hcHMsIHBpeGVsIHJlYWRiYWNrIGFuZCB0aGVcbiAgICogc2VydmVyLXNpZGUgaGlnaC1kZWYgem9vbSByZS1mZXRjaC4gKE9wZW5TZWFkcmFnb24ncyBzdHViIGFkdmVydGlzZXMgb25seVxuICAgKiBpbWFnZSBkaXNwbGF5LilcbiAgICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuU2NhbGFyQ29sb3JtYXAsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuSGlnaERlZlpvb20sXG4gICAgVmlld2VyRmVhdHVyZS5TdGFja1NsaWRlcixcbiAgICBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2UsXG4gIF0pO1xuXG4gIHByaXZhdGUgc2hhcGVzOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIHByZXZpb3VzU2hhcGVzOiBTaGFwZVNlbGVjdGlvbltdID0gW107XG4gIHByaXZhdGUgaXNSZWdpb25TYXZlZE9uID0gdHJ1ZTtcbiAgcHJpdmF0ZSBpbWFnZUxlbmd0aCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBzY3JlZW5IZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgcGxvdERpdiE6IHN0cmluZztcbiAgcHJpdmF0ZSBpc1JlYWxab29tID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzY2FsZXJhdGlvID0gdHJ1ZTtcbiAgcHJpdmF0ZSB0cnVlSW1nU2l6ZSE6IG51bWJlcltdO1xuICBwcml2YXRlIHpvb21Db29yZGluYXRlczogbnVtYmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBmaWxlTmFtZSE6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGRyYWdNb2RlITogc3RyaW5nO1xuICAvLyBSZWdpb24gZGF0YSAodGhlIGxpc3QgKyBwZXItaW1hZ2UgY2FjaGUpLCBzZWxlY3Rpb24sIGlkIG1pbnRpbmcsIHRoZSByZWdpb25cbiAgLy8gdXBkYXRlIGV2ZW50IGFuZCB0aGUgc2hhcGUgY29sb3VyL2xhYmVsIHByZWZzIG5vdyBsaXZlIGluIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUgKGluamVjdGVkIGFzIGB0aGlzLnJlZ2lvblN0b3JlYCkg4oCUIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoXG4gIC8vIGJvdGggYmFja2VuZHMgZGVsZWdhdGUgdG8uIGB0aGlzLnNoYXBlc2AgYmVsb3cgaXMga2VwdCBhcyBQbG90bHkncyAqcmVuZGVyXG4gIC8vIHByb2plY3Rpb24qIG9mIHRob3NlIHJlZ2lvbnMgKHRoZSBkaWN0IGFycmF5IFBsb3RseS5yZWxheW91dCBjb25zdW1lcykgYW5kXG4gIC8vIGlzIG1pcnJvcmVkIGludG8gdGhlIHN0b3JlIG9uIGV2ZXJ5IHdyaXRlLiBDb2xvcm1hcCwgcmV2ZXJzZS1zY2FsZSwgaW1hZ2VcbiAgLy8gbWV0YWRhdGEgYW5kIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZVxuICAvLyAoaW5qZWN0ZWQgYXMgYHRoaXMuc3RvcmVgKS5cbiAgcHJpdmF0ZSB1cmxzITogc3RyaW5nW107XG4gIGltYWdlSW5mbyE6IElJbWFnZUluZm87XG4gIHByaXZhdGUgcGxvdFV0aWxpdGllcyA9IG5ldyBQbG90VXRpbGl0aWVzKCk7XG4gIHByaXZhdGUgcGxvdFR5cGUhOiBQbG90VHlwZTtcblxuICBwcml2YXRlIG9uUGxvdE1vdXNlRG93bjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIHBlci1pbWFnZSByZWdpb24gY2FjaGUgKHJlZ2lvbnNCeUltYWdlS2V5L2N1cnJlbnRJbWFnZUtleSkgbm93IGxpdmVzIGluXG4gIC8vIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmU7IHNldEFjdGl2ZUltYWdlKCkgZGVsZWdhdGVzIHRvIGl0IGFuZCByZS1wcm9qZWN0c1xuICAvLyBgdGhpcy5zaGFwZXNgIGZyb20gdGhlIHN0b3JlIGFmdGVyd2FyZHMuXG5cbiAgLyoqIFBpeGVsIGRhdGEgY2FjaGVkIGZvciB3YW5kIHNhbXBsaW5nLiBkYXRhW3pJbmRleF0gaXMgYSAyLUQgbWF0cml4LiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlRnJhbWVzPzogYW55W107XG4gIHByaXZhdGUgY2FjaGVkSW1hZ2VXaWR0aCA9IDA7XG4gIHByaXZhdGUgY2FjaGVkSW1hZ2VIZWlnaHQgPSAwO1xuICBwcml2YXRlIGNhY2hlZEltYWdlUmF0aW9zOiBudW1iZXJbXSA9IFsxLCAxXTtcbiAgcHJpdmF0ZSBjYWNoZWRJc0dyYXlzY2FsZSA9IGZhbHNlO1xuICAvKiogRGF0YS1zcGFjZSBjb29yZGluYXRlIG9mIHRoZSBjYWNoZWQgZnJhbWUncyBwaXhlbCAoMCwwKS4gWzAsMF0gZm9yIHRoZSBmdWxsXG4gICAqICBpbWFnZTsgYSBjcm9wJ3MgdG9wLWxlZnQgd2hlbiB6b29tZWQgKHNvIHRoZSBpbnRlbnNpdHkgcHJvZmlsZSBzYW1wbGVzIHRoZVxuICAgKiAgem9vbS1sZXZlbCBwaXhlbHMgYXQgdGhlIHJpZ2h0IG9mZnNldC9yZXNvbHV0aW9uKS4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRGcmFtZU9yaWdpbjogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgLyoqIExhc3QgdmlzaWJsZSBpbWFnZS1waXhlbCByZWN0YW5nbGUgZnJvbSB0aGUgYWN0aXZlIGJhY2tlbmQncyB2aWV3cG9ydCAoc2V0IGJ5XG4gICAqICB0aGUgT1NEIHZpZXdwb3J0LWNoYW5nZSBob29rIHZpYSByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2kpLiBOZXcgcHJvZmlsZSBsaW5lcyBhcmVcbiAgICogIHBsYWNlZCB3aXRoaW4gaXQgc28gdGhleSBsYW5kIG9uLXNjcmVlbiB3aGVuIHpvb21lZCBpbjsgbnVsbCDihpIgdXNlIGZ1bGwgaW1hZ2UuICovXG4gIHByaXZhdGUgbGFzdFZpc2libGVSb2k6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvKiogZXZlbnRzICovXG4gIHByaXZhdGUgb25SZWxheW91dEV2ZW50OiBhbnk7XG5cbiAgcHJpdmF0ZSBzdGFja0xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICAvLyBjdXJyZW50IGluZGV4IG9mIGltYWdlIGluIHN0YWNrIChpZiBzdGFjayksIDAgaWYgc2luZ2xlIGltYWdlXG4gIHByaXZhdGUgekluZGV4ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcml2YXRlIGF1dG9zY2FsZUV2ZW50ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAvLyBUaGUgcmVnaW9uIHVwZGF0ZSBldmVudCBhbmQgc2VsZWN0aW9uIHN0cmVhbSBhcmUgb3duZWQgYnkgdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZTsgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKS9nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKSBkZWxlZ2F0ZSB0b1xuICAvLyBpdCBzbyBldmVyeSBjb25zdW1lciAoYW5kIHRoZSBPU0QgYmFja2VuZCkgc2VlcyBvbmUgc3RyZWFtLlxuICAvKiogQnJpZ2h0LCB3ZWxsLXNlcGFyYXRlZCBjb2xvdXJzIGN5Y2xlZCBhcyB0aGUgdXNlciBhZGRzIHByb2ZpbGUtbGluZSBST0lzLlxuICAgKiAgVGhlIG1hdGNoaW5nIGluc2V0IHRyYWNlIGlzIGRyYXduIGluIHRoZSBzYW1lIGNvbG91ci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBQUk9GSUxFX1BBTEVUVEUgPSBbXG4gICAgJyNGRkQ0MDAnLCAvLyB5ZWxsb3dcbiAgICAnIzAwRTVGRicsIC8vIGN5YW5cbiAgICAnI0ZGMkQ5NScsIC8vIG1hZ2VudGFcbiAgICAnIzM5RkYxNCcsIC8vIGdyZWVuXG4gICAgJyNGRjk1MDAnLCAvLyBvcmFuZ2VcbiAgICAnIzdDNERGRicsIC8vIHZpb2xldFxuICAgICcjRkYzQjMwJywgLy8gcmVkXG4gICAgJyMxOEZGRkYnLCAvLyBhcXVhXG4gIF07XG4gIC8qKiBQYWxldHRlIGN1cnNvciBmb3IgcHJvZmlsZSBsaW5lcyAobmV2ZXIgcmVzZXQgb24gZGVsZXRlLCBzbyBjb2xvdXJzIGtlZXBcbiAgICogIGN5Y2xpbmcgYWNyb3NzIHRoZSBzZXNzaW9uKS4gKi9cbiAgcHJpdmF0ZSBwcm9maWxlQ29sb3JTZXEgPSAwO1xuICBwcml2YXRlIGludGVuc2l0eVByb2ZpbGUkID0gbmV3IFN1YmplY3Q8SW50ZW5zaXR5UHJvZmlsZVtdPigpO1xuICAvKiogSVNPU1VSRkFDRSBiYW5kIGFzIGEgMOKAkzI1NSBzbGlkZXIgcG9zaXRpb24sIG1hcHBlZCBvbnRvIHRoZSB2b2x1bWUncyByZWFsXG4gICAqICBpbnRlbnNpdHkgcmFuZ2UgYXQgcmVuZGVyIHRpbWUgKHNlZSBtYXBJc29CYW5kKS4gRGVmYXVsdHMgdG8gdGhlIGZ1bGwgcmFuZ2VcbiAgICogIHNvIHRoZSBmaXJzdCByZW5kZXIgc2hvd3MgdGhlIHdob2xlIHN0cnVjdHVyZSByZWdhcmRsZXNzIG9mIGhvdyBicmlnaHQgb3JcbiAgICogIGRhcmsgdGhlIHZvbHVtZSBpczsgdGhlIHVzZXIgdGhlbiBuYXJyb3dzIHRoZSBiYW5kIHRvIGlzb2xhdGUgaW50ZW5zaXRpZXMuICovXG4gIHByaXZhdGUgaXNvTWluID0gMDtcbiAgcHJpdmF0ZSBpc29NYXggPSAyNTU7XG4gIC8qKiBBY3R1YWwgaW50ZW5zaXR5IHJhbmdlIG9mIHRoZSB2b2x1bWUgb24gc2NyZWVuIChbbWluLG1heF0gb3ZlciB0aGUgbG9hZGVkXG4gICAqICBmcmFtZXMpLiBUaGUgc2xpZGVyIHNwYW5zIDDigJMyNTUsIGJ1dCBhIGdpdmVuIHN0YWNrIG9mdGVuIG9jY3VwaWVzIG9ubHkgYVxuICAgKiAgc3ViLXJhbmdlLCBzbyB3ZSBjbGFtcCB0aGUgaXNvIGJhbmQgaW50byB0aGlzIHJhbmdlICh3aXRoIGEgc21hbGwgbWFyZ2luKVxuICAgKiAgdG8gZ3VhcmFudGVlIG5vbi1kZWdlbmVyYXRlIHN1cmZhY2VzIOKAlCBib3RoIG9uIGZpcnN0IHJlbmRlciBhbmQgb24gbGl2ZVxuICAgKiAgc2xpZGVyIG1vdmVzLiBOdWxsIHVudGlsIGFuIGlzb3N1cmZhY2Ugdm9sdW1lIGhhcyBiZWVuIG1lYXN1cmVkLiAqL1xuICBwcml2YXRlIGlzb0RhdGFSYW5nZTogW251bWJlciwgbnVtYmVyXSB8IG51bGwgPSBudWxsO1xuICAvLyBJZCBtaW50aW5nIGFuZCB0aGUgc2VsZWN0aW9uIGluZGV4IHN0cmVhbSBhcmUgb3duZWQgYnkgdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZS4gU2VsZWN0aW9uIHN0aWxsIGRyaXZlcyBQbG90bHkncyBgX2FjdGl2ZVNoYXBlSW5kZXhgIChzbyBhXG4gIC8vIHNpbmdsZSBzaGFwZSBnZXRzIHRoZSBlZGl0IGhhbmRsZXMpIOKAlCBzZWUgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoKS5cbiAgcHJpdmF0ZSBpbWFnZUNhY2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGltYWdlQ2FjaGVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZmlsZW5hbWVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgLyoqIERyaXZlcyB0aGUgaW50ZW5zaXR5IGluc2V0IG9mZiByZWdpb24gYWRkcy9kcmFncy9kZWxldGVzIChib3RoIGJhY2tlbmRzKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25VcGRhdGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIC8qKiBMaXZlIChwZXItZnJhbWUsIG5vbi1jb2FsZXNjZWQpIHJlZ2lvbiBlZGl0cyDigJQgc28gdGhlIGluc2V0IHRyYWNrcyBhbiBPU0RcbiAgICogIGxpbmUgUk9JIGxpdmUgZHVyaW5nIGEgZHJhZyAoT1NEIGJhdGNoZXMgcmVnaW9uVXBkYXRlJCB1bnRpbCByZWxlYXNlKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25MaXZlRWRpdFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjaGFubmVsU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogVGhpcyBiYWNrZW5kJ3MgcmVnaW9uIHJlbmRlcmVyIChsYXppbHkgY3JlYXRlZCBpbiBnZXRSZWdpb25PdmVybGF5KS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5PzogSVJlZ2lvbk92ZXJsYXk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29vcmRpbmF0ZVRyYW5zZm9ybTogSUNvb3JkaW5hdGVUcmFuc2Zvcm0gPVxuICAgIG5ldyBQbG90bHlDb29yZGluYXRlVHJhbnNmb3JtKFxuICAgICAgKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSxcbiAgICAgICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFRJTEVfQUNDRVNTX1BPUlQpIHByaXZhdGUgdGlsZXM6IFRpbGVBY2Nlc3NQb3J0LFxuICAgICAgICAgICAgICBASW5qZWN0KElNQUdFX1NUQVRFX1BPUlQpIHByaXZhdGUgc3RhdGU6IEltYWdlU3RhdGVQb3J0LFxuICAgICAgICAgICAgICBwdWJsaWMgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgd2FuZFNlcnZpY2U6IFdhbmRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjZWxsU2VnbWVudFRvb2w6IENlbGxTZWdtZW50VG9vbFNlcnZpY2UsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgICAgICAgICAgICBwcml2YXRlIHZlcnRleEVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHpvb21Ub0JveFRvb2w6IFpvb21Ub0JveFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlKSB7XG4gICAgLy8gcmVsYXlvdXQgZXZlbnQgcm91dGVyXG4gICAgdGhpcy5vblJlbGF5b3V0RXZlbnQgPSAoZXZlbnQ6IGFueSkgPT4geyB0aGlzLnJlbGF5b3V0RXZlbnRIYW5kbGVyKGV2ZW50KTsgfTtcblxuICAgIC8vIFRvb2wgc2VydmljZXMgcmVhZC9tdXRhdGUgb3VyIHN0YXRlIHZpYSBzbWFsbCAqSG9zdCBpbnRlcmZhY2VzLiBTdG9yZWRcbiAgICAvLyBzbyB3ZSBjYW4gcmUtYmluZCB0aGVtIHRvIG91cnNlbHZlcyB3aGVuZXZlciBhIFBsb3RseSB0b29sIGlzIGFjdGl2YXRlZFxuICAgIC8vICh0aGUgT3BlblNlYWRyYWdvbiBiYWNrZW5kIHJlLWJpbmRzIHRoZSBzYW1lIHNpbmdsZXRvbiB0b29scyB0byBpdHNlbGYpLlxuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyZWdpb25zKSA9PiB0aGlzLnNldFJlZ2lvbnMocmVnaW9ucyksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMuZ2V0Q2FjaGVkSW1hZ2VEYXRhKCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmFjdGl2ZUZyYW1lSW5kZXgoKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5nZXRDb29yZGluYXRlVHJhbnNmb3JtKCksXG4gICAgICBnZXRGaWxlTmFtZTogKCkgPT4gdGhpcy5maWxlTmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5nZXRDb29yZGluYXRlVHJhbnNmb3JtKCksXG4gICAgICBnZXRDYWNoZWRJbWFnZVJhdGlvOiAoKSA9PiB0aGlzLmNhY2hlZEltYWdlUmF0aW9zWzBdIHx8IDEsXG4gICAgfTtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIC8vIFRoZSBicnVzaCByZXVzZXMgdGhlIHdhbmQgaG9zdCAoc2FtZSBjb29yZGluYXRlIGZyYW1lICsgcmVnaW9uIGFjY2VzcykuXG4gICAgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgdGhpcy5iaW5kWm9vbVRvQm94SG9zdCgpO1xuXG4gICAgdGhpcy5pbWFnZUNhY2hlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuaXNJbWFnZUNhY2hlZCQoKS5zdWJzY3JpYmUoaW1hZ2VDYWNoZWQgPT4ge1xuICAgICAgdGhpcy5pbWFnZUNhY2hlZCA9IGltYWdlQ2FjaGVkO1xuICAgIH0pO1xuICAgIHRoaXMuZmlsZW5hbWVTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmdldEZpbGVuYW1lJCgpLnN1YnNjcmliZShmaWxlbmFtZSA9PiB7XG4gICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZW5hbWU7XG4gICAgfSk7XG4gICAgLy8gTGl2ZSByZWNvbG9yIGZyb20gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmU6IHJlc3R5bGUgdGhlIGRpc3BsYXkgd2luZG93ICh6bWluL3ptYXggZm9yXG4gICAgLy8gYSBoZWF0bWFwLCBjbWluL2NtYXggZm9yIGlzb3N1cmZhY2Uvc3VyZmFjZSksIHRoZSBjb2xvcnNjYWxlIChjb2xvcm1hcCksIGFuZCByZXZlcnNlL2ludmVydFxuICAgIC8vIHdoZW4gdGhlIGNoYW5uZWwgc3RhdGUgT1IgdGhlIGNvbG9ybWFwIGNoYW5nZXMuIChHYW1tYSBpcyBhcHBsaWVkIGJ5IHRoZSBPU0QgaW1hZ2UgdmlldzsgdGhlXG4gICAgLy8gUGxvdGx5IGNvbG9yc2NhbGUgd2luZG93IGNvdmVycyB0aGUgY29tbW9uIGNvbnRyYXN0IGNhc2UuKVxuICAgIHRoaXMuY2hhbm5lbFN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjaGFubmVscywgcmV2LCBpbnZdKSA9PiB0aGlzLmFwcGx5Q2hhbm5lbERpc3BsYXkoY2hhbm5lbHMsIHJldiwgaW52KSk7XG4gICAgLy8gUHJvZmlsZSBsaW5lcyBhcmUgc3RvcmUgcmVnaW9uczsgYW55IHJlZ2lvbiBjaGFuZ2UgKGFkZC9kcmFnL2RlbGV0ZSwgb25cbiAgICAvLyBlaXRoZXIgYmFja2VuZCkgc2hvdWxkIHJlZnJlc2ggdGhlIGluc2V0IHRyYWNlcy4gVGhlIGxpdmUtZWRpdCBzdHJlYW1cbiAgICAvLyBmaXJlcyBwZXIgZnJhbWUgZHVyaW5nIGEgZHJhZyAoT1NEIGNvYWxlc2NlcyByZWdpb25VcGRhdGUkIHVudGlsIHJlbGVhc2UpLFxuICAgIC8vIHNvIHRoZSBpbnNldCB0cmFja3MgYW4gT1NEIGxpbmUgUk9JIGxpdmUgYXMgaXQncyBtb3ZlZC5cbiAgICB0aGlzLnJlZ2lvblVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5lbWl0UHJvZmlsZXMoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lvbkxpdmVFZGl0U3Vic2NyaXB0aW9uID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25MaXZlRWRpdCQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5lbWl0UHJvZmlsZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgIGlmICghdGhpcy50cnVlSW1nU2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgIHJldHVybiB7XG4gICAgICAgd2lkdGg6IHRoaXMudHJ1ZUltZ1NpemVbMV0gLSB0aGlzLnRydWVJbWdTaXplWzBdLFxuICAgICAgIGhlaWdodDogdGhpcy50cnVlSW1nU2l6ZVszXSAtIHRoaXMudHJ1ZUltZ1NpemVbMl0sXG4gICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBpbWFnZVxuICAgKiBAcGFyYW0gaW1hZ2VJbmZvXG4gICAqIEBwYXJhbSB6SW5kZXggaW5kZXggb2YgdGhlIGltYWdlIHRvIGxvYWRcbiAgICogQHJldHVybiBhbiBvYmplY3Qgd2l0aCBkYXRhIGFuZCByYXRpbyBrZXlzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgdXJscyA9IGltYWdlSW5mby51cmxzO1xuICAgIC8vIHVzZSB6SW5kZXggcHJvdmlkZWQgaWYgYW55LCAwIG90aGVyd2lzZVxuICAgIGxldCBpbWFnZVVybDtcbiAgICBpZiAoekluZGV4KSB7XG4gICAgICBpbWFnZVVybCA9IHVybHNbekluZGV4XTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW1hZ2VVcmwgPSB1cmxzWzBdO1xuICAgIH1cbiAgICBjb25zdCBpc0dyYXlzY2FsZSA9IGltYWdlSW5mby5pc0dyYXlzY2FsZTtcbiAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMubG9hZEltYWdlKGltYWdlVXJsKTtcbiAgICBjb25zdCB4UmF0aW8gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVswXSAvIGltYWdlLndpZHRoO1xuICAgIGNvbnN0IHlSYXRpbyA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzFdIC8gaW1hZ2UuaGVpZ2h0O1xuXG4gICAgY29uc3QgdHJ1ZUltYWdlU2l6ZSA9IFtdO1xuICAgIC8vIFt4MCwgeDEsIHkwLCB5MV1cbiAgICB0cnVlSW1hZ2VTaXplWzBdID0gMDtcbiAgICB0cnVlSW1hZ2VTaXplWzFdID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemVbMF07XG4gICAgdHJ1ZUltYWdlU2l6ZVsyXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVszXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzFdO1xuICAgIHRoaXMudHJ1ZUltZ1NpemUgPSB0cnVlSW1hZ2VTaXplO1xuICAgIHRoaXMuZmlsZU5hbWUgPSBpbWFnZUluZm8uZmlsZU5hbWU7XG4gICAgaWYgKGltYWdlSW5mby5pc1N0YWNrICYmIGltYWdlSW5mby5zaG93U3RhY2spIHtcbiAgICAgIGNvbnN0IGltYWdlczogYW55W10gPSBbXTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgICAvLyBPbmUgVVJMIHBlciBzbGljZSDigJQgbG9hZCB0aGVtIGFsbCAoZWFybGllciBgbGVuZ3RoLTFgIGRyb3BwZWQgdGhlIGxhc3QpLlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBpbWFnZSBzdGFjayAke2l9YCk7XG4gICAgICAgIC8vIGRvIG5vdCBrZWVwIHdpdGggbG9hZGluZyBpZiBmaWxlbmFtZSBpcyBkaWZmZXJlbnQgKGEgbmV3IGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQpXG4gICAgICAgIC8vIG9yIGlmIHRoZSBzdGFja0xvYWRpbmcgdmFsdWUgaXMgc2V0IHRvIGZhbHNlXG4gICAgICAgIGlmICh0aGlzLmZpbGVOYW1lID09PSBpbWFnZUluZm8uZmlsZU5hbWUgJiYgdGhpcy5zdGFja0xvYWRpbmckLnZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZSh1cmxzW2ldKTtcbiAgICAgICAgICBpZiAoaXNHcmF5c2NhbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyZXkgPSBpbWFnZS5ncmV5KCk7XG4gICAgICAgICAgICBjb25zdCBpbWdEYXRhID0gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoQXJyYXkuZnJvbShncmV5LmRhdGEpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgICBpbWFnZXMucHVzaChpbWdEYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmdiRGF0YSA9IGltYWdlLmdldFBpeGVsc0FycmF5KCk7XG4gICAgICAgICAgICBjb25zdCByZ2JNYXRyaXggPSB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChyZ2JEYXRhLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgICBpbWFnZXMucHVzaChyZ2JNYXRyaXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KE1hdGgucm91bmQoKGkgKiAxMDApIC8gdXJscy5sZW5ndGgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBicmVhayBzdGFjayBsb2FkaW5nXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHJlc2V0IHN0YWNrTG9hZGluZyBwcm9ncmVzcyB0byAwXG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgICAgcmV0dXJuIHsgZGF0YTogaW1hZ2VzLCByYXRpb3M6IFt4UmF0aW8sIHlSYXRpb10sXG4gICAgICAgICAgICAgICBzaXplczogW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLFxuICAgICAgICAgICAgICAgZmlsZW5hbWU6IGltYWdlSW5mby5maWxlTmFtZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaW1hZ2VEYXRhO1xuICAgICAgaWYgKGlzR3JheXNjYWxlKSB7XG4gICAgICAgIGNvbnN0IGdyZXkgPSBpbWFnZS5ncmV5KCk7XG4gICAgICAgIGltYWdlRGF0YSA9IHRoaXMucGxvdFV0aWxpdGllcy5hcnJheVRvTWF0cml4KEFycmF5LmZyb20oZ3JleS5kYXRhKSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmdiRGF0YSA9IGltYWdlLmdldFBpeGVsc0FycmF5KCk7XG4gICAgICAgIGltYWdlRGF0YSA9IHRoaXMucGxvdFV0aWxpdGllcy5hcnJheVRvTWF0cml4KHJnYkRhdGEsIGltYWdlLndpZHRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IFtpbWFnZURhdGFdLFxuICAgICAgICByYXRpb3M6IFt4UmF0aW8sIHlSYXRpb10sXG4gICAgICAgIHNpemVzOiBbaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodF0sXG4gICAgICAgIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIGltYWdlTG9hZGVkIG9iamVjdCB3aXRoIGRhdGEsIHJhdGlvcyBhbmQgc2l6ZXMga2V5XG4gICAqIEBwYXJhbSBpbWFnZUluZm8gSW1hZ2VJbmZvIG9iamVjdFxuICAgKiBAcGFyYW0gc2NyZWVuSGVpZ2h0IHNpemUgb2YgdGhlIGF2YWlsYWJsZSBzY3JlZW4gaGVpZ2h0XG4gICAqIEBwYXJhbSBwbG90VHlwZSB0eXBlIG9mIHBsb3R0aW5nXG4gICAqL1xuICAvKipcbiAgICogQHBhcmFtIGluUGxhY2Ugd2hlbiB0cnVlLCB1cGRhdGVzIHRoZSBleGlzdGluZyBwbG90IHZpYSBQbG90bHkucmVhY3RcbiAgICogICBpbnN0ZWFkIG9mIFBsb3RseS5wdXJnZSArIFBsb3RseS5uZXdQbG90LiBVc2VkIGJ5IHRoZSBtdWx0aS10aWVyXG4gICAqICAgZGlhZ3JhbSBzd2FwIChzbWFsbCDihpIgbGFyZ2UpIHNvIHRoZSBjYW52YXMgZG9lc24ndCBicmllZmx5IGJsYW5rXG4gICAqICAgYmV0d2VlbiBwaGFzZXMuXG4gICAqL1xuICBwdWJsaWMgcGxvdChwbG90RGl2OiBzdHJpbmcsIGltYWdlTG9hZGVkOiBhbnksIGltYWdlSW5mbzogSUltYWdlSW5mbywgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgIHBsb3RUeXBlOiBQbG90VHlwZSwgaW5QbGFjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgdHJ1ZUltYWdlU2l6ZTogbnVtYmVyW10gPSBbXTtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IFtdO1xuICAgIC8vIFt4MCwgeDEsIHkwLCB5MV1cbiAgICB0cnVlSW1hZ2VTaXplWzBdID0gMDtcbiAgICB0cnVlSW1hZ2VTaXplWzFdID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemVbMF07XG4gICAgdHJ1ZUltYWdlU2l6ZVsyXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVszXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzFdO1xuICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgaW1hZ2UncyByZWdpb25zIGFuZCBwdWxsIGluIGFueSBjYWNoZWQgcmVnaW9ucyBmb3IgdGhlXG4gICAgLy8gaW1hZ2Ugd2UncmUgYWJvdXQgdG8gZGlzcGxheSwgYmVmb3JlIFBsb3RseS5uZXdQbG90IHJlYWRzIGB0aGlzLnNoYXBlc2AuXG4gICAgdGhpcy5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIHRoaXMuaW1hZ2VJbmZvID0gaW1hZ2VJbmZvO1xuICAgIHRoaXMucGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgICAvLyBDYWNoZSBwaXhlbCBtYXRyaWNlcyBzbyB0aGUgd2FuZCB0b29sIGNhbiBzYW1wbGUgdGhlbS5cbiAgICB0aGlzLmNhY2hlZEltYWdlRnJhbWVzID0gaW1hZ2VMb2FkZWQuZGF0YTtcbiAgICB0aGlzLmNhY2hlZEltYWdlV2lkdGggPSBpbWFnZUxvYWRlZC5zaXplc1swXTtcbiAgICB0aGlzLmNhY2hlZEltYWdlSGVpZ2h0ID0gaW1hZ2VMb2FkZWQuc2l6ZXNbMV07XG4gICAgdGhpcy5jYWNoZWRJbWFnZVJhdGlvcyA9IGltYWdlTG9hZGVkLnJhdGlvcztcbiAgICB0aGlzLmNhY2hlZEZyYW1lT3JpZ2luID0gWzAsIDBdOyAvLyBmdWxsIGltYWdlIOKAlCByZXNldCBhbnkgcHJpb3Igem9vbS1jcm9wIG9yaWdpblxuICAgIHRoaXMuY2FjaGVkSXNHcmF5c2NhbGUgPSAhIWltYWdlSW5mby5pc0dyYXlzY2FsZTtcblxuICAgIC8vIFBsdWdnYWJsZSBwbG90IHR5cGVzIChjb250b3VyLCBzY2F0dGVyLCBzY2F0dGVyM2QsIGlzb3N1cmZhY2UpIHJlbmRlclxuICAgIC8vIHRocm91Z2ggdGhlIHRyYWNlLWJ1aWxkZXIgcmVnaXN0cnkuIFRoZSBvcmlnaW5hbCBIRUFUTUFQL1NVUkZBQ0UvUkdCLWltYWdlXG4gICAgLy8gcmVuZGVyZXJzIGtlZXAgdGhlaXIgZGVkaWNhdGVkIHBhdGhzIGJlbG93IChhbHNvIHJldXNlZCBieSB0aGUgaGlnaC1kZWZcbiAgICAvLyB6b29tIHJlLWZldGNoKS4gSW50ZW5zaXR5IHByb2ZpbGVzIGFyZSBubyBsb25nZXIgYSBwbG90IHR5cGUg4oCUIHRoZXkncmVcbiAgICAvLyBSZWdpb24tYmFzZWQgbGluZSBST0lzLCBhdmFpbGFibGUgaW4gSEVBVE1BUC9JTUFHRSBtb2RlLlxuICAgIGNvbnN0IGltcGwgPSBQTE9UTFlfUExPVF9UWVBFX0lNUExTW3Bsb3RUeXBlXTtcbiAgICBpZiAoaW1wbCkge1xuICAgICAgdGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGUgPSAhIWltYWdlSW5mby5pc0dyYXlzY2FsZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RWaWFSZWdpc3RyeShcbiAgICAgICAgcGxvdERpdiwgaW1wbCwgdGhpcy5idWlsZFRyYWNlSW5wdXQoaW1hZ2VJbmZvLCBpbWFnZUxvYWRlZCwgdHJ1ZUltYWdlU2l6ZSksXG4gICAgICAgIHNjcmVlbkhlaWdodCwgaW5QbGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKGltYWdlSW5mby5pc0dyYXlzY2FsZSkge1xuICAgICAgaWYgKHBsb3RUeXBlID09PSBQbG90VHlwZS5TVVJGQUNFKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsb3RTdXJmYWNlKHBsb3REaXYsIGltYWdlSW5mby51cmxzLCBpbWFnZUxvYWRlZC5kYXRhLCB0cnVlSW1hZ2VTaXplLFxuICAgICAgICAgIGltYWdlTG9hZGVkLnJhdGlvcywgc2NyZWVuSGVpZ2h0LCBpblBsYWNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBsb3RIZWF0bWFwKHBsb3REaXYsIGltYWdlSW5mby51cmxzLCBpbWFnZUxvYWRlZC5kYXRhLCB0cnVlSW1hZ2VTaXplLFxuICAgICAgICBpbWFnZUxvYWRlZC5yYXRpb3MsIHNjcmVlbkhlaWdodCwgaW5QbGFjZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RSR0JIZWF0bWFwKHBsb3REaXYsIGltYWdlSW5mby51cmxzLCBpbWFnZUxvYWRlZC5kYXRhLCB0cnVlSW1hZ2VTaXplLFxuICAgICAgaW1hZ2VMb2FkZWQucmF0aW9zLCBpbWFnZUxvYWRlZC5zaXplc1swXSwgaW1hZ2VMb2FkZWQuc2l6ZXNbMV0sIHNjcmVlbkhlaWdodCwgaW5QbGFjZSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBwbG90IGEgZ3JheXNjYWxlIGhlYXRtYXBcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIHVybHNcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gdHJ1ZUltZ1NpemUgYXJyYXkgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIDogW3gwLCB4MSwgeTAsIHkxXVxuICAgKiBAcGFyYW0gcmF0aW9zXG4gICAqIEBwYXJhbSBzY3JlZW5IZWlnaHRcbiAgICogQHJldHVybiBQcm9taXNlIHRydWUgd2hlbiBwbG90dGluZyBpcyBmaW5pc2hlZFxuICAgKi9cbiAgcHJpdmF0ZSBwbG90SGVhdG1hcChwbG90RGl2OiBzdHJpbmcsIHVybHM6IHN0cmluZ1tdLCBpbWFnZXM6IGFueVtdLCB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICByYXRpb3M6IG51bWJlcltdLCBzY3JlZW5IZWlnaHQ6IG51bWJlciwgaW5QbGFjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFpblBsYWNlKSBQbG90bHkucHVyZ2UocGxvdERpdik7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmltYWdlTGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcbiAgICB0aGlzLnVybHMgPSB1cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuICAgIC8vIHBsb3RcbiAgICBjb25zdCB0cmFjZXM6IHsgejogYW55OyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmlzaWJsZTogYm9vbGVhbjsgfVtdID0gW107XG4gICAgaW1hZ2VzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0cmFjZSA9IHtcbiAgICAgICAgeDA6IHRydWVJbWdTaXplWzBdLFxuICAgICAgICBkeDogcmF0aW9zWzBdLFxuICAgICAgICB5MDogdHJ1ZUltZ1NpemVbMl0sXG4gICAgICAgIGR5OiByYXRpb3NbMF0sXG4gICAgICAgIHo6IGRhdGFzZXQsXG4gICAgICAgIHR5cGU6ICdoZWF0bWFwJyxcbiAgICAgICAgLy8gV2UgcmVtb3ZlIHRoZSB0b29sdGlwIGFubm90YXRpb24gZm9yIHBlcmZvcm1hbmNlcyByZWFzb25zXG4gICAgICAgIC8vIHRleHQ6IGRhdGFzZXQubWFwKChyb3c6IGFueVtdLCBpOiBhbnkpID0+IHJvdy5tYXAoKGl0ZW0sIGopID0+IHtcbiAgICAgICAgLy8gICByZXR1cm4gYHg6ICR7KyhqICogcmF0aW9zWzBdKS50b0ZpeGVkKDIpfTxicj55OiAkeysoaSAqIHJhdGlvc1swXSkudG9GaXhlZCgyKX08YnI+dmFsdWU6ICR7aXRlbX1gfSkpLFxuICAgICAgICBob3ZlcmluZm86ICdub25lJyxcbiAgICAgICAgY29sb3JzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50Q29sb3JtYXAoKS5kYXRhLnZhbHVlLFxuICAgICAgICByZXZlcnNlc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgdmlzaWJsZTogaW5kZXggPT09IDBcbiAgICAgIH07XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0SGVhdG1hcExheW91dChbdHJ1ZUltZ1NpemVbMF0sIHRydWVJbWdTaXplWzFdXSwgW3RydWVJbWdTaXplWzNdLFxuICAgICAgICB0cnVlSW1nU2l6ZVsyXV0pLCBDT05GSUcgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgcmVsYXlvdXQgZXZlbnQgZm9yIHpvb20gLyByb2lzIGFuZCB0aGUgY2xpY2sgZXZlbnRcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIHRydWUsIHNjcmVlbkhlaWdodCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIHBsb3QgYSBncmF5c2NhbGUgc3VyZmFjZVxuICAgKiBAcGFyYW0gcGxvdERpdlxuICAgKiBAcGFyYW0gdXJsc1xuICAgKiBAcGFyYW0gaW1hZ2VzXG4gICAqIEBwYXJhbSB0cnVlSW1nU2l6ZSBhcnJheSBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgOiBbeDAsIHgxLCB5MCwgeTFdXG4gICAqIEBwYXJhbSByYXRpb3NcbiAgICogQHBhcmFtIHNjcmVlbkhlaWdodFxuICAgKiBAcmV0dXJuIFByb21pc2UgdHJ1ZSB3aGVuIHBsb3R0aW5nIGlzIGZpbmlzaGVkXG4gICAqL1xuICBwcml2YXRlIHBsb3RTdXJmYWNlKHBsb3REaXY6IHN0cmluZywgdXJsczogc3RyaW5nW10sIGltYWdlczogYW55W10sIHRydWVJbWdTaXplOiBudW1iZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICByYXRpb3M6IG51bWJlcltdLCBzY3JlZW5IZWlnaHQ6IG51bWJlciwgaW5QbGFjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFpblBsYWNlKSBQbG90bHkucHVyZ2UocGxvdERpdik7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmltYWdlTGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcbiAgICB0aGlzLnVybHMgPSB1cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuICAgIC8vIHBsb3RcbiAgICBjb25zdCB0cmFjZXM6IHsgejogYW55OyB0eXBlOiBzdHJpbmc7ICB9W10gPSBbXTtcbiAgICBpbWFnZXMuZm9yRWFjaCgoZGF0YXNldCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0ge1xuICAgICAgICB6OiBkYXRhc2V0LFxuICAgICAgICB0eXBlOiAnc3VyZmFjZScsXG4gICAgICAgIC8vIGhvdmVyaW5mbzogJ25vbmUnLFxuICAgICAgICBjb2xvcnNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpLmRhdGEudmFsdWUsXG4gICAgICAgIHJldmVyc2VzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50UmV2ZXJzZVNjYWxlKCksXG4gICAgICAgIC8vIG5hbWU6IGBTbGljZSAke2luZGV4ICsgMX1gLFxuICAgICAgICAvLyB2aXNpYmxlOiBpbmRleCA9PT0gMFxuICAgICAgfTtcbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcbiAgICBjb25zdCB4cmFuZ2UgPSBbdHJ1ZUltZ1NpemVbMF0sIHRydWVJbWdTaXplWzFdXTtcbiAgICBjb25zdCB5cmFuZ2UgPSBbdHJ1ZUltZ1NpemVbMl0sIHRydWVJbWdTaXplWzNdXTtcbiAgICBjb25zdCByZW5kZXIgPSBpblBsYWNlID8gUGxvdGx5LnJlYWN0IDogUGxvdGx5Lm5ld1Bsb3Q7XG4gICAgcmV0dXJuIChyZW5kZXIgYXMgYW55KShwbG90RGl2LCB0cmFjZXMgYXMgYW55LFxuICAgICAgdGhpcy5nZXRTdXJmYWNlTGF5b3V0KHhyYW5nZSwgeXJhbmdlLCAwLjQpLCBDT05GSUdfU1VSRkFDRSBhcyBhbnkpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gaGFuZGxlIHRoZSByZWxheW91dCBldmVudCBmb3Igem9vbSAvIHJvaXMgYW5kIHRoZSBjbGljayBldmVudFxuICAgICAgdGhpcy5zZXRFdmVudHMocGxvdERpdiwgdHJ1ZSwgc2NyZWVuSGVpZ2h0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gcGxvdCBhbiBSR0IgaGVhdG1hcFxuICAgKiBAcGFyYW0gcGxvdERpdlxuICAgKiBAcGFyYW0gdXJsc1xuICAgKiBAcGFyYW0gaW1hZ2VzXG4gICAqIEBwYXJhbSB0cnVlSW1nU2l6ZVxuICAgKiBAcGFyYW0gd2lkdGhcbiAgICogQHBhcmFtIGhlaWdodFxuICAgKiBAcGFyYW0gcmF0aW9zXG4gICAqIEBwYXJhbSBzY3JlZW5IZWlnaHRcbiAgICogQHJldHVybiBQcm9taXNlXG4gICAqL1xuICBwcml2YXRlIHBsb3RSR0JIZWF0bWFwKHBsb3REaXY6IHN0cmluZywgdXJsczogc3RyaW5nW10sIGltYWdlczogYW55W10sIHRydWVJbWdTaXplOiBudW1iZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb3M6IG51bWJlcltdLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5IZWlnaHQ6IG51bWJlciwgaW5QbGFjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gUGxvdGx5LnJlYWN0IHVwZGF0ZXMgaW4gcGxhY2U7IFBsb3RseS5wdXJnZSArIFBsb3RseS5uZXdQbG90IGJsYW5rc1xuICAgIC8vIHRoZSBjYW52YXMgZm9yIH4xMDBtcyB3aGljaCBtYWtlcyB0aGUgbXVsdGktdGllciBzbWFsbOKGkmxhcmdlIHN3YXBcbiAgICAvLyBsb29rIGxpa2UgYSByZWdyZXNzaW9uIHRvIFwibG9hZGluZ1wiIGJlZm9yZSB0aGUgc2hhcnBlciB2ZXJzaW9uXG4gICAgLy8gYXBwZWFycy5cbiAgICBpZiAoIWluUGxhY2UpIFBsb3RseS5wdXJnZShwbG90RGl2KTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIHRoaXMuaW1hZ2VMZW5ndGggPSBpbWFnZXMubGVuZ3RoO1xuICAgIHRoaXMudXJscyA9IHVybHM7XG4gICAgdGhpcy5zY3JlZW5IZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG5cbiAgICAvLyBhcyBhdXRvcmFuZ2UgaXMgc2V0IHRvIGZhbHNlLCBhbmQgbm90IHJldmVyc2VkIHdlIG5lZWQgdG8gc2V0IHRoZSB5cmFuZ2UgY29ycmVjbHkgaGVyZVxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuZ2V0SGVhdG1hcExheW91dChbdHJ1ZUltZ1NpemVbMF0sIHRydWVJbWdTaXplWzFdXSxcbiAgICAgIFt0cnVlSW1nU2l6ZVszXSwgdHJ1ZUltZ1NpemVbMl1dKTtcbiAgICBjb25zdCB0cmFjZXM6IHsgejogYW55OyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmlzaWJsZTogYm9vbGVhbjsgfVtdID0gW107XG4gICAgaW1hZ2VzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0cmFjZSA9IHtcbiAgICAgICAgeDA6IHRydWVJbWdTaXplWzBdLFxuICAgICAgICBkeDogcmF0aW9zWzBdLFxuICAgICAgICB5MDogdHJ1ZUltZ1NpemVbMl0sXG4gICAgICAgIGR5OiByYXRpb3NbMF0sXG4gICAgICAgIHg6IEFycmF5LmZyb20oQXJyYXkod2lkdGgpLmtleXMoKSksXG4gICAgICAgIHk6IEFycmF5LmZyb20oQXJyYXkoaGVpZ2h0KS5rZXlzKCkpLFxuICAgICAgICB6OiBkYXRhc2V0LFxuICAgICAgICAvLyB0ZXh0OiBkYXRhc2V0Lm1hcCgocm93OiBhbnlbXSwgaTogYW55KSA9PiByb3cubWFwKChpdGVtLCBqKSA9PiB7XG4gICAgICAgIC8vICAgcmV0dXJuIGB4OiAkeysoaiAqIHJhdGlvc1swXSkudG9GaXhlZCgyKX08YnI+eTogJHsrKGkgKiByYXRpb3NbMF0pLnRvRml4ZWQoMil9PGJyPnZhbHVlOiAke2l0ZW19YH0pKSxcbiAgICAgICAgaG92ZXJpbmZvOiAnbm9uZScsXG4gICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgIG5hbWU6IGBTbGljZSAke2luZGV4ICsgMX1gLFxuICAgICAgICB2aXNpYmxlOiBpbmRleCA9PT0gMFxuICAgICAgfTtcbiAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTtcbiAgICB9KTtcbiAgICBjb25zdCByZW5kZXIgPSBpblBsYWNlID8gUGxvdGx5LnJlYWN0IDogUGxvdGx5Lm5ld1Bsb3Q7XG4gICAgcmV0dXJuIChyZW5kZXIgYXMgYW55KShwbG90RGl2LCB0cmFjZXMgYXMgYW55LCBsYXlvdXQsIENPTkZJRyBhcyBhbnkpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gaGFuZGxlIHRoZSByZWxheW91dCBldmVudFxuICAgICAgdGhpcy5zZXRFdmVudHMocGxvdERpdiwgZmFsc2UsIHNjcmVlbkhlaWdodCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSB0aGUgbm9ybWFsaXNlZCBpbnB1dCB0aGUgcGx1Z2dhYmxlIHRyYWNlIGJ1aWxkZXJzIGNvbnN1bWUuXG4gICAqIFB1cmUgZGF0YSBvbmx5IOKAlCBubyBQbG90bHkgaGFuZGxlcyDigJQgc28gdGhlIGJ1aWxkZXJzIHN0YXkgYmFja2VuZC1uZXV0cmFsLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYWNlSW5wdXQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCBpbWFnZUxvYWRlZDogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlSW1hZ2VTaXplOiBudW1iZXJbXSk6IFRyYWNlQnVpbGRJbnB1dCB7XG4gICAgLy8gTWVhc3VyZSB0aGUgdm9sdW1lJ3MgcmVhbCBpbnRlbnNpdHkgcmFuZ2Ugc28gdGhlIGlzbyBiYW5kIGNhbiBiZSBjbGFtcGVkXG4gICAgLy8gaW50byBpdCAodGhlIHNsaWRlciBpcyBhIGZpeGVkIDDigJMyNTUgYnV0IGEgc3RhY2sgbWF5IG9jY3VweSBvbmx5IHBhcnQgb2ZcbiAgICAvLyB0aGF0LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdGhlIHN1cmZhY2VzIHdpdGggbm90aGluZyB0byBjcm9zcykuXG4gICAgaWYgKHRoaXMucGxvdFR5cGUgPT09IFBsb3RUeXBlLklTT1NVUkZBQ0UpIHtcbiAgICAgIHRoaXMuaXNvRGF0YVJhbmdlID0gdGhpcy5tZWFzdXJlSW50ZW5zaXR5UmFuZ2UoaW1hZ2VMb2FkZWQuZGF0YSwgISFpbWFnZUluZm8uaXNHcmF5c2NhbGUpO1xuICAgIH1cbiAgICBjb25zdCBbaXNvTWluLCBpc29NYXhdID0gdGhpcy5tYXBJc29CYW5kKHRoaXMuaXNvTWluLCB0aGlzLmlzb01heCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyYW1lczogaW1hZ2VMb2FkZWQuZGF0YSxcbiAgICAgIHdpZHRoOiBpbWFnZUxvYWRlZC5zaXplc1swXSxcbiAgICAgIGhlaWdodDogaW1hZ2VMb2FkZWQuc2l6ZXNbMV0sXG4gICAgICByYXRpb3M6IGltYWdlTG9hZGVkLnJhdGlvcyxcbiAgICAgIHRydWVJbWFnZVNpemUsXG4gICAgICBpc0dyYXlzY2FsZTogISFpbWFnZUluZm8uaXNHcmF5c2NhbGUsXG4gICAgICBjb2xvcnNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpLmRhdGEudmFsdWUsXG4gICAgICByZXZlcnNlc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgcmVnaW9uczogdGhpcy5nZXRSZWdpb25Qb2x5Z29ucygpLFxuICAgICAgc2hhcGVDb2xvcjogdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgICBpc29NaW4sXG4gICAgICBpc29NYXgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBNaW4vbWF4IGludGVuc2l0eSBvdmVyIGV2ZXJ5IHZveGVsIG9mIHRoZSBsb2FkZWQgZnJhbWVzIChSR0Ig4oaSIGx1bWluYW5jZSksXG4gICAqICB1c2VkIHRvIGtlZXAgdGhlIGlzbyBiYW5kIGluc2lkZSB0aGUgZGF0YS4gUmV0dXJucyBudWxsIGZvciBlbXB0eSBpbnB1dC4gKi9cbiAgcHJpdmF0ZSBtZWFzdXJlSW50ZW5zaXR5UmFuZ2UoZnJhbWVzOiBhbnlbXSwgaXNHcmF5c2NhbGU6IGJvb2xlYW4pOiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCB7XG4gICAgbGV0IG1pbiA9IEluZmluaXR5LCBtYXggPSAtSW5maW5pdHk7XG4gICAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZXMgfHwgW10pIHtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGZyYW1lIHx8IFtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3cgfHwgW10pIHtcbiAgICAgICAgICBjb25zdCB2ID0gaXNHcmF5c2NhbGUgPyBjZWxsXG4gICAgICAgICAgICA6IDAuMjk5ICogY2VsbFswXSArIDAuNTg3ICogY2VsbFsxXSArIDAuMTE0ICogY2VsbFsyXTtcbiAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSkgY29udGludWU7XG4gICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHY7XG4gICAgICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChOdW1iZXIuaXNGaW5pdGUobWluKSAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KSAmJiBtYXggPiBtaW4pID8gW21pbiwgbWF4XSA6IG51bGw7XG4gIH1cblxuICAvKiogTWFwIHRoZSAw4oCTMjU1IHNsaWRlciBiYW5kIG9udG8gdGhlIHZvbHVtZSdzIGFjdHVhbCBpbnRlbnNpdHkgcmFuZ2UuIFRoZVxuICAgKiAgc2xpZGVyIGlzIGZpeGVkIDDigJMyNTUsIGJ1dCBhIHN0YWNrIG9mdGVuIG9jY3VwaWVzIG9ubHkgYSBuYXJyb3cgc3ViLXJhbmdlXG4gICAqICAoZS5nLiB0aGlzIEVET0Ygdm9sdW1lIGlzIH4y4oCTNTAgd2l0aCBzdHJ1Y3R1cmUgbmVhciA24oCTMTApLiBNYXBwaW5nIHNwcmVhZHNcbiAgICogIHRoZSBkYXRhIGFjcm9zcyB0aGUgd2hvbGUgc2xpZGVyIHNvIGV2ZXJ5IGludGVuc2l0eSBpcyBlYXN5IHRvIHJlYWNoIGFuZFxuICAgKiAgdGhlIGJhbmQgYWx3YXlzIGxhbmRzIGluc2lkZSB0aGUgZGF0YSDigJQgYSBzbWFsbCBpbnNldCBrZWVwcyB0aGUgZXh0cmVtZVxuICAgKiAgc3VyZmFjZXMgb2ZmIHRoZSBleGFjdCBkYXRhIGVkZ2VzLCB3aGljaCBhcmUgZGVnZW5lcmF0ZSBhbmQgZHJhdyBub3RoaW5nLiAqL1xuICBwcml2YXRlIG1hcElzb0JhbmQoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgbGV0IGxvID0gTWF0aC5taW4oaXNvTWluLCBpc29NYXgpO1xuICAgIGxldCBoaSA9IE1hdGgubWF4KGlzb01pbiwgaXNvTWF4KTtcbiAgICBpZiAodGhpcy5pc29EYXRhUmFuZ2UpIHtcbiAgICAgIGNvbnN0IFt2TWluLCB2TWF4XSA9IHRoaXMuaXNvRGF0YVJhbmdlO1xuICAgICAgY29uc3Qgc3BhbiA9IHZNYXggLSB2TWluO1xuICAgICAgY29uc3QgcGFkID0gMC4wMyAqIHNwYW47XG4gICAgICBjb25zdCB1c2FibGUgPSBzcGFuIC0gMiAqIHBhZDtcbiAgICAgIGNvbnN0IFNMSURFUl9NQVggPSAyNTU7IC8vIHRvb2xiYXIgc2xpZGVyIGRvbWFpbiAoaXNvVmFsdWVNYXgpXG4gICAgICBsbyA9IHZNaW4gKyBwYWQgKyAobG8gLyBTTElERVJfTUFYKSAqIHVzYWJsZTtcbiAgICAgIGhpID0gdk1pbiArIHBhZCArIChoaSAvIFNMSURFUl9NQVgpICogdXNhYmxlO1xuICAgICAgaWYgKGxvID4gaGkpIHsgY29uc3QgdCA9IGxvOyBsbyA9IGhpOyBoaSA9IHQ7IH1cbiAgICB9XG4gICAgcmV0dXJuIFtsbywgaGldO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgaXNvc3VyZmFjZSBpbnRlbnNpdHkgYm91bmRzLiBXaGVuIGlzb3N1cmZhY2UgaXMgb24gc2NyZWVuIHRoaXNcbiAgICogcmVzdHlsZXMgYGlzb21pbmAvYGlzb21heGAgaW4gcGxhY2UgZm9yIGEgbGl2ZSB1cGRhdGUgKG5vIHZvbHVtZSByZWJ1aWxkKS5cbiAgICogU2xpZGVyIHZhbHVlcyBhcmUgbWFwcGVkIG9udG8gdGhlIHZvbHVtZSdzIHJlYWwgcmFuZ2Ugc28gdGhlIHN1cmZhY2VzIGFsd2F5c1xuICAgKiBoYXZlIGRhdGEgdG8gY3Jvc3MgKG1hdGNoaW5nIHRoZSBpbml0aWFsIHJlbmRlcikuXG4gICAqL1xuICBwdWJsaWMgc2V0SXNvUmFuZ2UoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pc29NaW4gPSBpc29NaW47XG4gICAgdGhpcy5pc29NYXggPSBpc29NYXg7XG4gICAgaWYgKHRoaXMucGxvdFR5cGUgPT09IFBsb3RUeXBlLklTT1NVUkZBQ0UgJiYgdGhpcy5wbG90RGl2KSB7XG4gICAgICBjb25zdCBbbG8sIGhpXSA9IHRoaXMubWFwSXNvQmFuZChpc29NaW4sIGlzb01heCk7XG4gICAgICB0cnkge1xuICAgICAgICBQbG90bHkucmVzdHlsZSh0aGlzLnBsb3REaXYsIHsgaXNvbWluOiBbbG9dLCBpc29tYXg6IFtoaV0gfSBhcyBhbnkpO1xuICAgICAgfSBjYXRjaCB7IC8qIHBsb3Qgbm90IHJlYWR5ICovIH1cbiAgICB9XG4gIH1cblxuICAvKiogUGxvdGx5IHJlbmRlcnMgaXNvc3VyZmFjZXMsIHNvIGl0IGV4cG9zZXMgdGhlIGlzb3N1cmZhY2UgY29udHJvbHMgKGl0c2VsZikuICovXG4gIHB1YmxpYyBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwgeyByZXR1cm4gdGhpczsgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSByZWdpc3RyeS1iYWNrZWQgcGxvdCB0eXBlOiBidWlsZCBpdHMgdHJhY2VzIGZyb20gdGhlIGlucHV0LCBwaWNrXG4gICAqIHRoZSBtYXRjaGluZyBsYXlvdXQsIHJlbmRlciwgYW5kIHdpcmUgdGhlIHVzdWFsIHJlbGF5b3V0L2NsaWNrIGV2ZW50cy5cbiAgICogTWlycm9ycyB0aGUgc3RydWN0dXJlIG9mIHRoZSBkZWRpY2F0ZWQgaGVhdG1hcC9zdXJmYWNlIHJlbmRlcmVycy5cbiAgICovXG4gIHByaXZhdGUgcGxvdFZpYVJlZ2lzdHJ5KHBsb3REaXY6IHN0cmluZywgaW1wbDogUGxvdGx5UGxvdFR5cGVJbXBsLCBpbnB1dDogVHJhY2VCdWlsZElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5IZWlnaHQ6IG51bWJlciwgaW5QbGFjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFpblBsYWNlKSBQbG90bHkucHVyZ2UocGxvdERpdik7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmltYWdlTGVuZ3RoID0gaW5wdXQuZnJhbWVzLmxlbmd0aDtcbiAgICB0aGlzLnVybHMgPSB0aGlzLmltYWdlSW5mbz8udXJscyA/PyB0aGlzLnVybHM7XG4gICAgdGhpcy5zY3JlZW5IZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG5cbiAgICBjb25zdCB0cmFjZXMgPSBpbXBsLmJ1aWxkVHJhY2VzKGlucHV0KTtcbiAgICBjb25zdCBbeDAsIHgxLCB5MCwgeTFdID0gaW5wdXQudHJ1ZUltYWdlU2l6ZTtcbiAgICBsZXQgbGF5b3V0OiBhbnk7XG4gICAgc3dpdGNoIChpbXBsLmxheW91dEtpbmQpIHtcbiAgICAgIGNhc2UgJzNkLXZvbHVtZSc6XG4gICAgICAgIGxheW91dCA9IHRoaXMuZ2V0Vm9sdW1lTGF5b3V0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMmQtY2hhcnQnOlxuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldENoYXJ0TGF5b3V0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMmQtb3ZlcmxheSc6XG4gICAgICAgIGxheW91dCA9IHRoaXMuZ2V0T3ZlcmxheUxheW91dChbeDAsIHgxXSwgW3kxLCB5MF0pOyAvLyByZXZlcnNlZCB5IGxpa2UgdGhlIGltYWdlXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogLy8gJzJkLWltYWdlJ1xuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldEhlYXRtYXBMYXlvdXQoW3gwLCB4MV0sIFt5MSwgeTBdKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gaW1wbC50aHJlZUQgPyBDT05GSUdfU1VSRkFDRSA6IENPTkZJRztcbiAgICBjb25zdCByZW5kZXIgPSBpblBsYWNlID8gUGxvdGx5LnJlYWN0IDogUGxvdGx5Lm5ld1Bsb3Q7XG4gICAgcmV0dXJuIChyZW5kZXIgYXMgYW55KShwbG90RGl2LCB0cmFjZXMgYXMgYW55LCBsYXlvdXQsIGNvbmZpZyBhcyBhbnkpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zZXRFdmVudHMocGxvdERpdiwgaW5wdXQuaXNHcmF5c2NhbGUsIHNjcmVlbkhlaWdodCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQbGFpbiAyRCBjaGFydCBheGVzIChpbnRlbnNpdHkgcHJvZmlsZSAvIGxpbmUgcGxvdHMpLiAqL1xuICBwcml2YXRlIGdldENoYXJ0TGF5b3V0KCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmdpbjogeyB0OiAzMCwgYjogNDUsIGw6IDYwLCByOiAyMCB9LFxuICAgICAgaGVpZ2h0OiB0aGlzLnNjcmVlbkhlaWdodCxcbiAgICAgIGF1dG9zaXplOiB0cnVlLFxuICAgICAgeGF4aXM6IHsgdGl0bGU6ICdQb3NpdGlvbiAocHgpJyB9LFxuICAgICAgeWF4aXM6IHsgdGl0bGU6ICdJbnRlbnNpdHknIH0sXG4gICAgICBkcmFnbW9kZTogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBJbWFnZS1hbGlnbmVkIDJEIGF4ZXMgd2l0aG91dCB0aGUgei1wbGFuZSBzbGlkZXIgKHJlZ2lvbiBzY2F0dGVyKS4gKi9cbiAgcHJpdmF0ZSBnZXRPdmVybGF5TGF5b3V0KHhSYW5nZTogbnVtYmVyW10sIHlSYW5nZTogbnVtYmVyW10pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICB4YXhpczogeyBjb25zdHJhaW46ICdyYW5nZScsIGNvbnN0cmFpbnRvd2FyZDogJ2NlbnRlcicsIHNpZGU6ICd0b3AnLCB0aWNrczogJycsIHJhbmdlOiB4UmFuZ2UgfSxcbiAgICAgIHlheGlzOiB7XG4gICAgICAgIGNvbnN0cmFpbjogJ3JhbmdlJywgY29uc3RyYWludG93YXJkOiAnY2VudGVyJywgcmFuZ2U6IHlSYW5nZSwgdGlja3M6ICcnLFxuICAgICAgICB0aWNrc3VmZml4OiAnICAnLCBhdXRvcmFuZ2U6IGZhbHNlLCBzY2FsZWFuY2hvcjogdGhpcy5zY2FsZXJhdGlvID8gJ3gnIDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgbWFyZ2luOiB7IHQ6IDMwLCBiOiA1LCBsOiA1NSwgcjogNSB9LFxuICAgICAgaGVpZ2h0OiB0aGlzLnNjcmVlbkhlaWdodCxcbiAgICAgIGF1dG9zaXplOiB0cnVlLFxuICAgICAgc2hhcGVzOiB0aGlzLmN1cnJlbnRSZW5kZXJTaGFwZXModGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpKSxcbiAgICAgIGRyYWdtb2RlOiB0aGlzLmRyYWdNb2RlID8gdGhpcy5kcmFnTW9kZSA6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgZm9yIHZvbHVtZXRyaWMgcGxvdCB0eXBlcyAoc2NhdHRlcjNkLCBpc29zdXJmYWNlKS4gKi9cbiAgcHJpdmF0ZSBnZXRWb2x1bWVMYXlvdXQoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFyZ2luOiB7IHQ6IDAsIGI6IDAsIGw6IDAsIHI6IDAgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHNjZW5lOiB7XG4gICAgICAgIHhheGlzOiB7IHRpdGxlOiAnWCcgfSxcbiAgICAgICAgeWF4aXM6IHsgdGl0bGU6ICdZJyB9LFxuICAgICAgICB6YXhpczogeyB0aXRsZTogJ1otcGxhbmUnIH0sXG4gICAgICAgIC8vICdjdWJlJyAobm90ICdkYXRhJyk6IGEgei1zdGFjayBoYXMgZmFyIGZld2VyIHBsYW5lcyB0aGFuIFgvWSBwaXhlbHMsXG4gICAgICAgIC8vIHNvICdkYXRhJyBzcXVhc2hlcyB0aGUgdm9sdW1lIGludG8gYSBuZWFyLWZsYXQgc2xhYiB0aGF0IHJlYWRzIGFzXG4gICAgICAgIC8vIGVtcHR5IGVkZ2Utb24uIEEgY3ViZSBnaXZlcyB0aGUgeiBkaW1lbnNpb24gcmVhbCBoZWlnaHQgc28gdGhlXG4gICAgICAgIC8vIGlzb3N1cmZhY2Uvdm94ZWxzIGFyZSBhY3R1YWxseSB2aXNpYmxlLlxuICAgICAgICBhc3BlY3Rtb2RlOiAnY3ViZScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogUGxvdCB0eXBlcyB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyAoZHJpdmVzIHRoZSBVSSBzZWxlY3RvcikuICovXG4gIHB1YmxpYyBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhQTE9UX1RZUEVfREVTQ1JJUFRPUlMpLmZpbHRlcigoZCk6IGQgaXMgUGxvdFR5cGVEZXNjcmlwdG9yID0+ICEhZCk7XG4gIH1cblxuICAvKiogVGhpcyBiYWNrZW5kJ3MgcmVnaW9uIHJlbmRlcmVyLiBQbG90bHkgZHJhd3Mgc2hhcGVzIG5hdGl2ZWx5LCBzbyB0aGVcbiAgICogIG92ZXJsYXkgaXMgYSB0aGluIGFkYXB0ZXIgb3ZlciB0aGlzIHNlcnZpY2UncyBkcmFnIG1vZGVzLiAqL1xuICBwdWJsaWMgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB7XG4gICAgaWYgKCF0aGlzLnJlZ2lvbk92ZXJsYXkpIHRoaXMucmVnaW9uT3ZlcmxheSA9IG5ldyBQbG90bHlSZWdpb25PdmVybGF5KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZW5zaXR5IHByb2ZpbGUgKFJlZ2lvbi1iYXNlZCBsaW5lIFJPSXMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFbWl0cyB0aGUgZnVsbCBzZXQgb2YgaW50ZW5zaXR5IHByb2ZpbGVzIChvbmUgcGVyIHByb2ZpbGUtbGluZSByZWdpb24pXG4gICAqICB3aGVuZXZlciBhIHByb2ZpbGUgbGluZSBpcyBhZGRlZCwgbW92ZWQsIG9yIHJlbW92ZWQuICovXG4gIHB1YmxpYyBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVByb2ZpbGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFBsb3RseSByZW5kZXJzIHRoZSBsaW5lIFJPSXMgKyBpbnNldCwgc28gaXQgZXhwb3NlcyB0aGUgaW50ZW5zaXR5IGNvbnRyb2xzLiAqL1xuICBwdWJsaWMgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7IHJldHVybiB0aGlzOyB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgY2hhcnQgaW50byBgZGl2SWRgIOKAlCBvbmUgbGluZVxuICAgKiB0cmFjZSBwZXIgUk9JLCBlYWNoIGRyYXduIGluIGl0cyBST0kncyBjb2xvdXIuIEtlcHQgaGVyZSAobm90IGluIHRoZSBkaWFncmFtXG4gICAqIGNvbXBvbmVudCkgc28gdGhlIGNvbnN1bWVyIG5ldmVyIHRvdWNoZXMgUGxvdGx5IGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdklkKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VzID0gKHByb2ZpbGVzID8/IFtdKS5tYXAoKHAsIGkpID0+ICh7XG4gICAgICB4OiBwLnBvc2l0aW9ucyxcbiAgICAgIHk6IHAudmFsdWVzLFxuICAgICAgdHlwZTogJ3NjYXR0ZXInLFxuICAgICAgbW9kZTogJ2xpbmVzJyxcbiAgICAgIGxpbmU6IHsgY29sb3I6IHAuY29sb3IgPz8gJyNGRkQ0MDAnLCB3aWR0aDogMiB9LFxuICAgICAgbmFtZTogYExpbmUgJHtpICsgMX1gLFxuICAgICAgaG92ZXJpbmZvOiAneCt5JyxcbiAgICB9KSk7XG4gICAgLy8gWCBheGlzIGlzIGluIG1pY3JvbnMgd2hlbiB0aGUgaW1hZ2UgY2FycmllcyBhIHBoeXNpY2FsIHBpeGVsIHNpemUgKG1wcCksXG4gICAgLy8gb3RoZXJ3aXNlIGluIHBpeGVscyDigJQgZHJpdmVuIGJ5IHRoZSB1bml0IHRoZSBzYW1wbGVyIHRhZ2dlZCBvbiB0aGUgcHJvZmlsZS5cbiAgICBjb25zdCB1bml0ID0gKHByb2ZpbGVzID8/IFtdKS5maW5kKHAgPT4gcC51bml0KT8udW5pdCA/PyAncHgnO1xuICAgIGNvbnN0IHhUaXRsZSA9IHVuaXQgPT09ICfCtW0nID8gJ1Bvc2l0aW9uICjCtW0pJyA6ICdQb3NpdGlvbiAocHgpJztcbiAgICBQbG90bHkucmVhY3QoZWwsIHRyYWNlcyBhcyBhbnksIHtcbiAgICAgIG1hcmdpbjogeyB0OiA2LCByOiA4LCBiOiAzOCwgbDogNDAgfSxcbiAgICAgIHhheGlzOiB7IHRpdGxlOiB4VGl0bGUsIHplcm9saW5lOiBmYWxzZSwgY29sb3I6ICcjZGRkJyB9LFxuICAgICAgeWF4aXM6IHsgdGl0bGU6ICdJbnRlbnNpdHknLCB6ZXJvbGluZTogZmFsc2UsIGNvbG9yOiAnI2RkZCcgfSxcbiAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgICAgcGFwZXJfYmdjb2xvcjogJ3JnYmEoMjUsMjUsMjUsMC45KScsXG4gICAgICBwbG90X2JnY29sb3I6ICdyZ2JhKDI1LDI1LDI1LDAuOSknLFxuICAgICAgZm9udDogeyBjb2xvcjogJyNlZWUnLCBzaXplOiAxMCB9LFxuICAgIH0gYXMgYW55LCB7IGRpc3BsYXlNb2RlQmFyOiBmYWxzZSwgcmVzcG9uc2l2ZTogdHJ1ZSB9IGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaW9uIHNoYXBlcyAoZmlsdGVyZWQvcmVkcmF3biBmb3IgdGhlIGN1cnJlbnQgZmlsZSkuIFRoZSBwcm9maWxlLWxpbmUgUk9Jc1xuICAgKiBhcmUgb3JkaW5hcnkgc3RvcmUgcmVnaW9ucyAodGFnZ2VkIGBraW5kOiAncHJvZmlsZSdgKSwgc28gdGhleSBhcmUgYWxyZWFkeVxuICAgKiBwYXJ0IG9mIGB0aGlzLnNoYXBlc2Ag4oCUIG5vIHNlcGFyYXRlIGFwcGVuZCBpcyBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIGN1cnJlbnRSZW5kZXJTaGFwZXMoc2hvd0xhYmVsID0gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnNoYXBlc1RvUmVkcmF3KHNob3dMYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogSUludGVuc2l0eUNvbnRyb2xzOiBhZGQgYW5vdGhlciBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIGFzIGEgbmV1dHJhbCBSZWdpb25cbiAgICogKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCkuIEl0IGlzIGEgaG9yaXpvbnRhbCBvcGVuIDItcG9pbnQgcG9seWxpbmUgc3Bhbm5pbmdcbiAgICogdGhlIGltYWdlIHdpZHRoLCBzdGFnZ2VyZWQgdmVydGljYWxseSBzbyBzdWNjZXNzaXZlIGxpbmVzIHN0YXkgZGlzdGluY3QsIGluXG4gICAqIHRoZSBuZXh0IGJyaWdodCBwYWxldHRlIGNvbG91ci4gQWRkZWQgdG8gdGhlIHNoYXJlZCBzdG9yZSBzbyBib3RoIGJhY2tlbmRzXG4gICAqIChQbG90bHkgKyBPcGVuU2VhZHJhZ29uKSByZW5kZXIgYW5kIGRyYWcgaXQ7IGV4Y2x1ZGVkIGZyb20gdGhlIFJlZ2lvbnMgdGFiXG4gICAqIGFuZCBleHBvcnRzIGJ5IGl0cyBraW5kLlxuICAgKi9cbiAgcHVibGljIGFkZFByb2ZpbGVMaW5lKCk6IFJlZ2lvbiB8IG51bGwge1xuICAgIGlmICghdGhpcy50cnVlSW1nU2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLmdldFByb2ZpbGVSZWdpb25zKCkubGVuZ3RoO1xuICAgIGNvbnN0IGltZ1gwID0gdGhpcy50cnVlSW1nU2l6ZVswXSwgaW1nWDEgPSB0aGlzLnRydWVJbWdTaXplWzFdO1xuICAgIGNvbnN0IGltZ1RvcCA9IHRoaXMudHJ1ZUltZ1NpemVbMl0sIGltZ0JvdHRvbSA9IHRoaXMudHJ1ZUltZ1NpemVbM107XG5cbiAgICAvLyBQbGFjZSB0aGUgbGluZSB3aXRoaW4gdGhlIGN1cnJlbnRseSBWSVNJQkxFIGltYWdlIGFyZWEsIHNvIHdoZW4gem9vbWVkIGluIGl0XG4gICAgLy8gbGFuZHMgb24tc2NyZWVuIGluc3RlYWQgb2Ygc3Bhbm5pbmcgdGhlIHdob2xlIChtb3N0bHkgb2ZmLXNjcmVlbikgaW1hZ2UsIGF0XG4gICAgLy8gMi8zIG9mIHRoZSB2aXNpYmxlIHdpZHRoIGFuZCBob3Jpem9udGFsbHkgY2VudHJlZC4gRmFsbHMgYmFjayB0byB0aGUgZnVsbFxuICAgIC8vIGltYWdlIHdoZW4gbm8gdmlld3BvcnQgUk9JIGlzIGtub3duIChQbG90bHkgaGVhdG1hcCkgb3IgYSBzdGFsZSBST0kgbm8gbG9uZ2VyXG4gICAgLy8gb3ZlcmxhcHMgdGhlIGltYWdlLlxuICAgIGNvbnN0IHJvaSA9IHRoaXMubGFzdFZpc2libGVSb2k7XG4gICAgY29uc3Qgb3ZlcmxhcHMgPSAhIXJvaSAmJiByb2kud2lkdGggPiAwICYmIHJvaS5oZWlnaHQgPiAwXG4gICAgICAmJiByb2kueCA8IGltZ1gxICYmIHJvaS54ICsgcm9pLndpZHRoID4gaW1nWDBcbiAgICAgICYmIHJvaS55IDwgaW1nQm90dG9tICYmIHJvaS55ICsgcm9pLmhlaWdodCA+IGltZ1RvcDtcbiAgICBjb25zdCB4MHYgPSBvdmVybGFwcyA/IE1hdGgubWF4KGltZ1gwLCByb2khLngpIDogaW1nWDA7XG4gICAgY29uc3QgeDF2ID0gb3ZlcmxhcHMgPyBNYXRoLm1pbihpbWdYMSwgcm9pIS54ICsgcm9pIS53aWR0aCkgOiBpbWdYMTtcbiAgICBjb25zdCB0b3BWID0gb3ZlcmxhcHMgPyBNYXRoLm1heChpbWdUb3AsIHJvaSEueSkgOiBpbWdUb3A7XG4gICAgY29uc3QgYm90dG9tViA9IG92ZXJsYXBzID8gTWF0aC5taW4oaW1nQm90dG9tLCByb2khLnkgKyByb2khLmhlaWdodCkgOiBpbWdCb3R0b207XG5cbiAgICBjb25zdCBjeCA9ICh4MHYgKyB4MXYpIC8gMjtcbiAgICBjb25zdCBoYWxmID0gKCh4MXYgLSB4MHYpICogKDIgLyAzKSkgLyAyOyAvLyBsaW5lIHNwYW5zIDIvMyBvZiB0aGUgdmlzaWJsZSB3aWR0aFxuICAgIGNvbnN0IHgwID0gY3ggLSBoYWxmLCB4MSA9IGN4ICsgaGFsZjtcblxuICAgIGNvbnN0IGJhbmRIID0gYm90dG9tViAtIHRvcFY7XG4gICAgY29uc3QgbWlkWSA9ICh0b3BWICsgYm90dG9tVikgLyAyO1xuICAgIC8vIFN0YWdnZXIgc3VjY2Vzc2l2ZSBsaW5lcyBhY3Jvc3MgdGhlIHZpc2libGUgYmFuZCBzbyB0aGV5IHN0YXkgZGlzdGluY3QuXG4gICAgY29uc3QgeSA9IE1hdGgubWluKGJvdHRvbVYsIE1hdGgubWF4KHRvcFYsIG1pZFkgKyBjb3VudCAqIGJhbmRIICogMC4xMikpO1xuXG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0gMjtcbiAgICBwb2x5Lnhwb2ludHMgPSBbeDAsIHgxXTtcbiAgICBwb2x5Lnlwb2ludHMgPSBbeSwgeV07XG4gICAgcG9seS5jb29yZGluYXRlcyA9IFtbeDAsIHldLCBbeDEsIHldXTtcbiAgICBwb2x5LmNsb3NlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgcmVnaW9uID0gbmV3IFJlZ2lvbigpO1xuICAgIHJlZ2lvbi5ib3VuZHMgPSBwb2x5O1xuICAgIHJlZ2lvbi5raW5kID0gJ3Byb2ZpbGUnO1xuICAgIHJlZ2lvbi5jb2xvciA9IHRoaXMuUFJPRklMRV9QQUxFVFRFW3RoaXMucHJvZmlsZUNvbG9yU2VxKysgJSB0aGlzLlBST0ZJTEVfUEFMRVRURS5sZW5ndGhdO1xuICAgIC8vIExlYXZlIHJlZ2lvbi5sYWJlbCB1bmRlZmluZWQgc28gYXBwbHlDbGFzc2lmaWNhdGlvbkNvbG9ycyB3b24ndCByZWNvbG9yIGl0LlxuXG4gICAgdGhpcy5yZWdpb25TdG9yZS5hZGRSZWdpb24ocmVnaW9uKTtcblxuICAgIC8vIElmIGEgUGxvdGx5IHBsb3QgaXMgb24gc2NyZWVuLCByZS1yZW5kZXIgc2hhcGVzIHNvIHRoZSBuZXcgbGluZSBhcHBlYXJzLlxuICAgIC8vIChUaGUgT1NEIG92ZXJsYXkgcmVuZGVycyBhdXRvbWF0aWNhbGx5IHZpYSBpdHMgcmVnaW9uLXVwZGF0ZSBzdWJzY3JpcHRpb24uKVxuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIHRoaXMuc3luY1NoYXBlc0Zyb21TdG9yZSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyBzaGFwZXM6IHRoaXMuY3VycmVudFJlbmRlclNoYXBlcygpIH0gYXMgYW55KTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBkaXYgbm90IGEgUGxvdGx5IHBsb3QgKE9TRCBvd25zIGl0KSAqLyB9XG4gICAgfVxuICAgIHJldHVybiByZWdpb247XG4gIH1cblxuICAvKiogVGhlIHByb2ZpbGUtbGluZSBST0lzIGN1cnJlbnRseSBpbiB0aGUgc3RvcmUgKGtpbmQgPT09ICdwcm9maWxlJykuICovXG4gIHByaXZhdGUgZ2V0UHJvZmlsZVJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIociA9PiAociBhcyBhbnkpLmtpbmQgPT09ICdwcm9maWxlJyk7XG4gIH1cblxuICAvKiogUmVjb21wdXRlIGFuZCBicm9hZGNhc3QgYSBwcm9maWxlIGZvciBldmVyeSBwcm9maWxlLWxpbmUgcmVnaW9uIChpZCArIGNvbG91clxuICAgKiAgdGFnZ2VkIHNvIHRoZSBpbnNldCB0cmFjZSBtYXRjaGVzIGl0cyBsaW5lKS4gKi9cbiAgcHJpdmF0ZSBlbWl0UHJvZmlsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5uZXh0KHRoaXMuZ2V0UHJvZmlsZVJlZ2lvbnMoKS5tYXAociA9PiAoe1xuICAgICAgLi4udGhpcy5jb21wdXRlSW50ZW5zaXR5UHJvZmlsZUZvclJlZ2lvbihyKSxcbiAgICAgIGlkOiByLmlkLFxuICAgICAgY29sb3I6IHIuY29sb3IsXG4gICAgfSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGUgdGhlIGludGVuc2l0eSBwcm9maWxlIGZvciBhIHByb2ZpbGUtbGluZSByZWdpb246IGV4dHJhY3QgaXRzIHR3b1xuICAgKiBwb2x5Z29uIGVuZHBvaW50cyBhbmQgcmV1c2UgdGhlIHNoYXJlZCBgY29tcHV0ZUludGVuc2l0eVByb2ZpbGVgIHNhbXBsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSW50ZW5zaXR5UHJvZmlsZUZvclJlZ2lvbihyZWdpb246IFJlZ2lvbik6IEludGVuc2l0eVByb2ZpbGUge1xuICAgIC8vIER1Y2stdHlwZWQgKG5vdCBgaW5zdGFuY2VvZiBQb2x5Z29uYCk6IGFmdGVyIGEgZHJhZyByb3VuZC10cmlwcyB0aHJvdWdoIHRoZVxuICAgIC8vIHN0b3JlIHRoZSBib3VuZHMgY2FuIGJlIGEgcGxhaW4gb2JqZWN0LCBzbyBtYXRjaCBvbiB0aGUgcG9pbnQgYXJyYXlzLlxuICAgIGNvbnN0IHBvbHk6IGFueSA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgaWYgKCFwb2x5IHx8ICFBcnJheS5pc0FycmF5KHBvbHkueHBvaW50cykgfHwgIUFycmF5LmlzQXJyYXkocG9seS55cG9pbnRzKSB8fFxuICAgICAgICBwb2x5Lnhwb2ludHMubGVuZ3RoIDwgMiB8fCBwb2x5Lnlwb2ludHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHsgcG9zaXRpb25zOiBbXSwgdmFsdWVzOiBbXSB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSW50ZW5zaXR5UHJvZmlsZSh7XG4gICAgICB4MDogcG9seS54cG9pbnRzWzBdLCB5MDogcG9seS55cG9pbnRzWzBdLFxuICAgICAgeDE6IHBvbHkueHBvaW50c1sxXSwgeTE6IHBvbHkueXBvaW50c1sxXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwbHkgcGl4ZWwgZnJhbWVzIGZvciBpbnRlbnNpdHkgc2FtcGxpbmcgKHVzZWQgYnkgdGhlIE9TRC9pbWFnZSBiYWNrZW5kLFxuICAgKiB3aG9zZSBjYWNoZWQgZnJhbWVzIG1heSBiZSBlbXB0eSkuIE9wdGlvbmFsbHkgYWxzbyBzZXRzIHRoZSBkYXRhL3BpeGVsIHJhdGlvcy5cbiAgICovXG4gIHB1YmxpYyBzZXRTYW1wbGluZ0ZyYW1lcyhmcmFtZXM6IGFueVtdLCByYXRpb3M6IG51bWJlcltdLCBvcmlnaW46IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF0pOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZEltYWdlRnJhbWVzID0gZnJhbWVzO1xuICAgIGlmIChyYXRpb3MpIHRoaXMuY2FjaGVkSW1hZ2VSYXRpb3MgPSByYXRpb3M7XG4gICAgdGhpcy5jYWNoZWRGcmFtZU9yaWdpbiA9IG9yaWdpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSB0aGUgc2FtcGxpbmcgY2FjaGUgZm9yIHRoZSBpbnRlbnNpdHkgcHJvZmlsZXMgd2hlbiBPcGVuU2VhZHJhZ29uIGlzXG4gICAqIHRoZSBhY3RpdmUgYmFja2VuZCAodGhlIEltYWdlIHBsb3QgdHlwZSkuIEluIE9TRCBtb2RlIFBsb3RseSBuZXZlciByZW5kZXJlZCxcbiAgICogc28gYGNhY2hlZEltYWdlRnJhbWVzYC9gdHJ1ZUltZ1NpemVgIGFyZSB1bnNldCDigJQgZmV0Y2ggdGhlIGN1cnJlbnQgc2xpY2Unc1xuICAgKiBwcmV2aWV3ICh0aGUgc2FtZSBwaXhlbHMgdGhlIGhlYXRtYXAgd291bGQgc2FtcGxlKSBzbyB0aGUgbGluZSBST0lzIGhhdmVcbiAgICogcGl4ZWwgZGF0YSBhbmQgYSBwbGFjZW1lbnQgZXh0ZW50LiBSZS1lbWl0cyB0aGUgcHJvZmlsZXMgb25jZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaW1hZ2VJbmZvPy51cmxzPy5sZW5ndGgpIHJldHVybjtcbiAgICAvLyBTYW1wbGUganVzdCB0aGUgZGlzcGxheWVkIHNsaWNlIChzaG93U3RhY2sgb2ZmIOKGkiBzaW5nbGUgZnJhbWUpOyBgbG9hZGBcbiAgICAvLyBhbHNvIHNldHMgYHRoaXMudHJ1ZUltZ1NpemVgLCB3aGljaCBhZGRQcm9maWxlTGluZSBuZWVkcyBmb3IgcGxhY2VtZW50LlxuICAgIGNvbnN0IHNpbmdsZSA9IHsgLi4uaW1hZ2VJbmZvLCBzaG93U3RhY2s6IGZhbHNlIH0gYXMgSUltYWdlSW5mbztcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCB0aGlzLmxvYWQoc2luZ2xlLCB6SW5kZXggfHwgMCk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZUZyYW1lcyA9IGxvYWRlZC5kYXRhO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VSYXRpb3MgPSBsb2FkZWQucmF0aW9zO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VXaWR0aCA9IGxvYWRlZC5zaXplcz8uWzBdID8/IHRoaXMuY2FjaGVkSW1hZ2VXaWR0aDtcbiAgICB0aGlzLmNhY2hlZEltYWdlSGVpZ2h0ID0gbG9hZGVkLnNpemVzPy5bMV0gPz8gdGhpcy5jYWNoZWRJbWFnZUhlaWdodDtcbiAgICB0aGlzLmNhY2hlZEZyYW1lT3JpZ2luID0gWzAsIDBdOyAvLyBmdWxsIHByZXZpZXdcbiAgICB0aGlzLmNhY2hlZElzR3JheXNjYWxlID0gISFpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgdGhpcy5lbWl0UHJvZmlsZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCB0aGUgdmlld3BvcnQtY2hhbmdlIHNpZ25hbCBpcyBPcGVuU2VhZHJhZ29uJ3NcbiAgICogKGl0IHJlLXNhbXBsZXMgb24gT1NEIHpvb20vcGFuKS4gUGxvdGx5J3Mgb3duIGhpZ2gtZGVmIHpvb20gdXBkYXRlcyB0aGVcbiAgICogc2FtcGxpbmcgY2FjaGUgaW5saW5lLCBzbyBpdCBuZXZlciBlbWl0cyBoZXJlOyByZXR1cm5zIEVNUFRZIHNvIGEgdW5pZm9ybVxuICAgKiBgSVZpc3VhbGl6ZXJgIGNvbnN1bWVyIGNhbiBzdWJzY3JpYmUgcmVnYXJkbGVzcyBvZiB0aGUgYWN0aXZlIGJhY2tlbmQuXG4gICAqL1xuICBwdWJsaWMgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBFTVBUWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1mZXRjaCB0aGUgZ2l2ZW4gaW1hZ2UtcGl4ZWwgUk9JIGF0IHRoZSBkaXNwbGF5IHJlc29sdXRpb24gYW5kIHVzZSBpdCBhc1xuICAgKiB0aGUgaW50ZW5zaXR5LXNhbXBsaW5nIHNvdXJjZSwgc28gdGhlIHByb2ZpbGUgcmVmbGVjdHMgdGhlIGRhdGEgYXQgdGhlXG4gICAqIGN1cnJlbnQgem9vbSBsZXZlbC4gU2hhcmVkIGJ5IGJvdGggYmFja2VuZHM6IHRoZSBPU0Qgdmlld3BvcnQtY2hhbmdlIGhvb2tcbiAgICogY2FsbHMgaXQgb24gem9vbS9wYW47IFBsb3RseSdzIG93biBoaWdoLWRlZiB6b29tICh0cmlnZ2VyWm9vbSkgdXBkYXRlcyB0aGVcbiAgICogc2FtZSBjYWNoZSBpbmxpbmUuIGByb2lgIGlzIGluIGZ1bGwtaW1hZ2UgcGl4ZWwgY29vcmRpbmF0ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm47XG4gICAgLy8gUmVtZW1iZXIgdGhlIHZpc2libGUgcmVnaW9uIHNvIGEgbmV3IHByb2ZpbGUgbGluZSBpcyBwbGFjZWQgaW5zaWRlIGl0LlxuICAgIHRoaXMubGFzdFZpc2libGVSb2kgPSB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbiAgICBjb25zdCByb2kgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgcm9pLnggPSBNYXRoLnJvdW5kKHgpOyByb2kueSA9IE1hdGgucm91bmQoeSk7XG4gICAgcm9pLndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCk7IHJvaS5oZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCk7XG4gICAgY29uc3Qgc2NyZWVuID0gdGhpcy5wbG90VXRpbGl0aWVzLmdldERvbVJlY3RhbmdsZSgnZGlhZ3JhbScpO1xuICAgIC8vIFNuYXBzaG90IHRoZSBmaWxlbmFtZSBzbyBhIHJlc3BvbnNlIHRoYXQgYXJyaXZlcyBhZnRlciB0aGUgdXNlciBzd2l0Y2hlZFxuICAgIC8vIGZpbGVzIGlzIGRyb3BwZWQgKHRoZSByZXF1ZXN0IGNhcnJpZWQgdGhlIGZpbGUgc2VsZWN0ZWQgYXQgY2FsbCB0aW1lKS5cbiAgICBjb25zdCByZXFOYW1lID0gdGhpcy5maWxlTmFtZTtcbiAgICB0aGlzLnRpbGVzLnpvb21PblJlZ2lvbihyb2ksIHNjcmVlbiwgekluZGV4IHx8IDApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoem9vbURhdGEpID0+IHtcbiAgICAgICAgSW1hZ2UubG9hZChCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheSh6b29tRGF0YSkpKS50aGVuKChpbWFnZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZmlsZU5hbWUgIT09IHJlcU5hbWUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBpc0dyYXkgPSAhIXRoaXMuaW1hZ2VJbmZvPy5pc0dyYXlzY2FsZTtcbiAgICAgICAgICBjb25zdCBmcmFtZSA9IGlzR3JheVxuICAgICAgICAgICAgPyB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChpbWFnZS5ncmV5KCkuZGF0YSwgaW1hZ2Uud2lkdGgpXG4gICAgICAgICAgICA6IHRoaXMucGxvdFV0aWxpdGllcy5hcnJheVRvTWF0cml4KGltYWdlLmdldFBpeGVsc0FycmF5KCksIGltYWdlLndpZHRoKTtcbiAgICAgICAgICB0aGlzLnNldFNhbXBsaW5nRnJhbWVzKFtmcmFtZV0sIFtyb2kud2lkdGggLyBpbWFnZS53aWR0aCwgcm9pLmhlaWdodCAvIGltYWdlLmhlaWdodF0sXG4gICAgICAgICAgICBbcm9pLngsIHJvaS55XSk7XG4gICAgICAgICAgdGhpcy5lbWl0UHJvZmlsZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgLyoga2VlcCB0aGUgcHJldmlvdXMgc2FtcGxpbmcgZnJhbWUgb24gYSBmYWlsZWQgY3JvcCBmZXRjaCAqLyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbXBsZSB0aGUgYWN0aXZlIGZyYW1lJ3MgaW50ZW5zaXR5IChncmF5c2NhbGUgdmFsdWUgb3IgUkdCIGx1bWluYW5jZSlcbiAgICogYWxvbmcgdGhlIGxpbmUgUk9JLiBSZXR1cm5zIGRpc3RhbmNlLWFsb25nLWxpbmUgcG9zaXRpb25zIGFuZCB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVJbnRlbnNpdHlQcm9maWxlKGxpbmU6IGFueSk6IEludGVuc2l0eVByb2ZpbGUge1xuICAgIGNvbnN0IGVtcHR5OiBJbnRlbnNpdHlQcm9maWxlID0geyBwb3NpdGlvbnM6IFtdLCB2YWx1ZXM6IFtdIH07XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzPy5sZW5ndGggfHwgIWxpbmUpIHJldHVybiBlbXB0eTtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXNbdGhpcy5hY3RpdmVGcmFtZUluZGV4KCldID8/IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXNbMF07XG4gICAgaWYgKCFmcmFtZT8ubGVuZ3RoKSByZXR1cm4gZW1wdHk7XG4gICAgY29uc3QgcnggPSB0aGlzLmNhY2hlZEltYWdlUmF0aW9zWzBdIHx8IDE7XG4gICAgY29uc3QgcnkgPSB0aGlzLmNhY2hlZEltYWdlUmF0aW9zWzFdIHx8IHJ4O1xuICAgIGNvbnN0IFtveCwgb3ldID0gdGhpcy5jYWNoZWRGcmFtZU9yaWdpbjtcbiAgICBjb25zdCB4MCA9ICtsaW5lLngwLCB5MCA9ICtsaW5lLnkwLCB4MSA9ICtsaW5lLngxLCB5MSA9ICtsaW5lLnkxO1xuICAgIGNvbnN0IGR4RGF0YSA9IHgxIC0geDAsIGR5RGF0YSA9IHkxIC0geTA7XG4gICAgLy8gU2NhbGUgdGhlIGFsb25nLWxpbmUgZGlzdGFuY2UgYnkgdGhlIHBoeXNpY2FsIHBpeGVsIHNpemUgKG1pY3JvbnMvcGl4ZWwpXG4gICAgLy8gd2hlbiB0aGUgaW1hZ2UgY2FycmllcyBvbmUg4oCUIGFuaXNvdHJvcGljIG1wcFgvbXBwWSBhcmUgYXBwbGllZCBwZXIgYXhpcyBzb1xuICAgIC8vIGRpYWdvbmFsIGxpbmVzIG1lYXN1cmUgdGhlIHRydWUgcGh5c2ljYWwgbGVuZ3RoLiBGYWxscyBiYWNrIHRvIHBpeGVscy5cbiAgICBjb25zdCB7IG1wcFgsIG1wcFkgfSA9IHRoaXMuY3VycmVudE1wcCgpO1xuICAgIGNvbnN0IHVzZU1pY3JvbnMgPSBtcHBYICE9IG51bGw7XG4gICAgY29uc3QgbGVuRGF0YSA9IHVzZU1pY3JvbnNcbiAgICAgID8gTWF0aC5oeXBvdChkeERhdGEgKiBtcHBYLCBkeURhdGEgKiAobXBwWSA/PyBtcHBYKSlcbiAgICAgIDogTWF0aC5oeXBvdChkeERhdGEsIGR5RGF0YSk7XG4gICAgY29uc3QgbGVuUHggPSBNYXRoLmh5cG90KGR4RGF0YSAvIHJ4LCBkeURhdGEgLyByeSk7XG4gICAgY29uc3QgbiA9IE1hdGgubWF4KDIsIE1hdGgucm91bmQobGVuUHgpKTtcbiAgICBjb25zdCBoID0gZnJhbWUubGVuZ3RoO1xuICAgIGNvbnN0IHcgPSBmcmFtZVswXS5sZW5ndGg7XG4gICAgY29uc3QgcG9zaXRpb25zOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgY29uc3QgdCA9IGkgLyAobiAtIDEpO1xuICAgICAgLy8gTWFwIGRhdGEgY29vcmRzIHRvIHRoZSBjYWNoZWQgZnJhbWUncyBwaXhlbCBncmlkLCBvZmZzZXQgYnkgdGhlIGZyYW1lJ3NcbiAgICAgIC8vIG9yaWdpbiAobm9uLXplcm8gd2hlbiB0aGUgZnJhbWUgaXMgYSB6b29tZWQgY3JvcCkuXG4gICAgICBjb25zdCBweCA9IE1hdGgucm91bmQoKHgwICsgdCAqIGR4RGF0YSAtIG94KSAvIHJ4KTtcbiAgICAgIGNvbnN0IHB5ID0gTWF0aC5yb3VuZCgoeTAgKyB0ICogZHlEYXRhIC0gb3kpIC8gcnkpO1xuICAgICAgbGV0IHYgPSAwO1xuICAgICAgaWYgKHB4ID49IDAgJiYgcHggPCB3ICYmIHB5ID49IDAgJiYgcHkgPCBoKSB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSBmcmFtZVtweV1bcHhdO1xuICAgICAgICB2ID0gQXJyYXkuaXNBcnJheShjZWxsKSA/ICgwLjI5OSAqIGNlbGxbMF0gKyAwLjU4NyAqIGNlbGxbMV0gKyAwLjExNCAqIGNlbGxbMl0pIDogY2VsbDtcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9ucy5wdXNoKHQgKiBsZW5EYXRhKTtcbiAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgIH1cbiAgICByZXR1cm4geyBwb3NpdGlvbnMsIHZhbHVlcywgdW5pdDogdXNlTWljcm9ucyA/ICfCtW0nIDogJ3B4JyB9O1xuICB9XG5cbiAgLyoqIFBoeXNpY2FsIHBpeGVsIHNpemUgKG1pY3JvbnMvcGl4ZWwpIGZvciB0aGUgY3VycmVudCBpbWFnZSwgaWYga25vd24uXG4gICAqICBtcHAgaXMgY29uc3RhbnQgYWNyb3NzIGZyYW1lcy9jaGFubmVscywgc28gdGhlIGZpcnN0IG1ldGFkYXRhIGVudHJ5IHRoYXRcbiAgICogIGNhcnJpZXMgYSBwb3NpdGl2ZSBtcHBYIHdpbnMuIFJldHVybnMgbnVsbHMgd2hlbiB0aGUgaW1hZ2UgaXMgdW5zY2FsZWQuICovXG4gIHByaXZhdGUgY3VycmVudE1wcCgpOiB7IG1wcFg6IG51bWJlciB8IG51bGw7IG1wcFk6IG51bWJlciB8IG51bGwgfSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuaW1hZ2VJbmZvPy5pbWFnZU1ldGE7XG4gICAgY29uc3QgbSA9IEFycmF5LmlzQXJyYXkobWV0YSlcbiAgICAgID8gKG1ldGEuZmluZChlID0+IGUgJiYgKGUubXBwWCA/PyAwKSA+IDApID8/IG1ldGFbMF0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtcHBYID0gbSAmJiAobS5tcHBYID8/IDApID4gMCA/IChtLm1wcFggYXMgbnVtYmVyKSA6IG51bGw7XG4gICAgY29uc3QgbXBwWSA9IG0gJiYgKG0ubXBwWSA/PyAwKSA+IDAgPyAobS5tcHBZIGFzIG51bWJlcikgOiBudWxsO1xuICAgIHJldHVybiB7IG1wcFgsIG1wcFkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhdXRvc2NhbGUgdGhlIHBsb3RcbiAgICovXG4gIHB1YmxpYyBhdXRvc2NhbGUoKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHtcbiAgICAgICAgJ3hheGlzLmF1dG9yYW5nZSc6IHRydWUsXG4gICAgICAgICd5YXhpcy5hdXRvcmFuZ2UnOiBmYWxzZSB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZWxheW91dCB0aGUgcGxvdFxuICAgKi9cbiAgcHVibGljIHJlbGF5b3V0KHRydWVJbWFnZVNpemU/OiBudW1iZXJbXSkge1xuICAgIGxldCBpbWdTaXplO1xuICAgIGlmICh0cnVlSW1hZ2VTaXplKSB7XG4gICAgICBpbWdTaXplID0gdHJ1ZUltYWdlU2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW1nU2l6ZSA9IHRoaXMudHJ1ZUltZ1NpemU7XG4gICAgfVxuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIC8vIFJlZnJlc2ggaGVpZ2h0IGZyb20gY3VycmVudCBET00gc28gcGFuZWwgcmVzaXplcyBhcmUgcmVmbGVjdGVkXG4gICAgICBjb25zdCBwbG90RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgICAgaWYgKHBsb3RFbD8ub2Zmc2V0SGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gcGxvdEVsLm9mZnNldEhlaWdodDtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnpvb21Db29yZGluYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFxuICAgICAgICAgICAgW3RoaXMuem9vbUNvb3JkaW5hdGVzWzBdLCB0aGlzLnpvb21Db29yZGluYXRlc1sxXV0sXG4gICAgICAgICAgICBbdGhpcy56b29tQ29vcmRpbmF0ZXNbMl0sIHRoaXMuem9vbUNvb3JkaW5hdGVzWzNdXSkpOyAgICAvLyByZXZlcnNlIHRoZSB5IHJhbmdlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYXMgYXV0b3JhbmdlIGlzIHNldCB0byBmYWxzZSwgYW5kIG5vdCByZXZlcnNlZCB3ZSBuZWVkIHRvIHNldCB0aGUgeXJhbmdlIGNvcnJlY2x5IGhlcmVcbiAgICAgICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB0aGlzLmdldEhlYXRtYXBMYXlvdXQoXG4gICAgICAgICAgICBbaW1nU2l6ZVswXSwgaW1nU2l6ZVsxXV0sIFtpbWdTaXplWzNdLCBpbWdTaXplWzJdXSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCBlcnI/LnN0YXR1c1RleHQgfHwgU3RyaW5nKGVycik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQnLCBlcnIpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IGtleTogJ2NlbnRlci10b2FzdCcsIHN0aWNreTogdHJ1ZSwgc2V2ZXJpdHk6J2Vycm9yJywgc3VtbWFyeTonQW4gZXJyb3Igb2NjdXJlZCcsIGRldGFpbDpgVGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIG9jY3VyZWQ6ICR7bXNnfS4gUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbmF2aWdhdG9yLmAgfSk7XG4gICAgICAgIC8vIFRPRE8gY29ycmVjdGx5IGNsZWFyIHRoZSBwbG90XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEV2ZW50cyhwbG90RGl2OiBzdHJpbmcsIGlzR3JheXNjYWxlOiBib29sZWFuLCBzY3JlZW5IZWlnaHQ6IG51bWJlcikge1xuICAgIHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlID0gaXNHcmF5c2NhbGU7XG4gICAgdGhpcy5zY3JlZW5IZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgY29uc3QgcGxvdDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdik7XG4gICAgaWYgKHBsb3QpIHtcbiAgICAgIC8vIHVuYmluZCBwcmV2aW91cyBldmVudFxuICAgICAgcGxvdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbG90bHlfcmVsYXlvdXQnLCB0aGlzLm9uUmVsYXlvdXRFdmVudCk7XG4gICAgICAvLyBiaW5kIG5ldyBldmVudFxuICAgICAgcGxvdC5vbigncGxvdGx5X3JlbGF5b3V0JywgdGhpcy5vblJlbGF5b3V0RXZlbnQpO1xuXG4gICAgICAvLyBDbGlja2luZyBvbiBhIHNoYXBlIGFjdGl2YXRlcyBpdCBidXQgUGxvdGx5IGRvZXNuJ3QgZmlyZSBhIGRlZGljYXRlZFxuICAgICAgLy8gZXZlbnQg4oCUIHNhbXBsZSBfYWN0aXZlU2hhcGVJbmRleCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gc3Vic2NyaWJlcnNcbiAgICAgIC8vIChSZWdpb24gRWRpdG9yKSBjYW4gbWlycm9yIHRoZSBzZWxlY3Rpb24uXG4gICAgICBwbG90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25QbG90TW91c2VEb3duKTtcbiAgICAgIHRoaXMub25QbG90TW91c2VEb3duID0gKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLm1heWJlRW1pdEFjdGl2ZVNoYXBlSW5kZXgoKSwgMCk7XG4gICAgICBwbG90LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25QbG90TW91c2VEb3duKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbGF5b3V0RXZlbnRIYW5kbGVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZXZlbnQpLmluY2x1ZGVzKCdkcmFnbW9kZScpKSB7XG4gICAgICB0aGlzLmRyYWdNb2RlID0gZXZlbnQuZHJhZ21vZGU7XG4gICAgfVxuICAgIC8vIHdoZW4gcmVsYXlvdXQgZXZlbnQgb2NjdXJzXG4gICAgLy8gdXBkYXRlIHRoZSByZWdpb24gc2VsZWN0aW9uIHVkcGRhdGVzXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50KTtcbiAgICBsZXQgc2hhcGVzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICBrZXlzLmZvckVhY2goKGtleTogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LnN0YXJ0c1dpdGgoJ3NoYXBlc1snKSkge1xuICAgICAgICBjb25zdCBzaGFwZU51bWJlciA9ICtrZXkuc3BsaXQoJ1snKVsxXS5zcGxpdCgnXScpWzBdO1xuICAgICAgICBjb25zdCBzaGFwZUNoYW5nZSA9IGtleS5zcGxpdCgnLicpWzFdO1xuICAgICAgICBpZiAodGhpcy5zaGFwZXMgJiYgdGhpcy5zaGFwZXNbc2hhcGVOdW1iZXJdKSB7XG4gICAgICAgICAgaWYgKHNoYXBlQ2hhbmdlID09PSAncGF0aCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVzW3NoYXBlTnVtYmVyXVtzaGFwZUNoYW5nZV0gPSB0aGlzLnBsb3RVdGlsaXRpZXMucm91bmRQYXRoQ29vcmRpbmF0ZXMoZXZlbnRba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVzW3NoYXBlTnVtYmVyXVtzaGFwZUNoYW5nZV0gPSBNYXRoLnJvdW5kKCtldmVudFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hhcGVzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHNoYXBlc01vZGlmaWVkKSB7XG4gICAgICAvLyBNaXJyb3IgdGhlIGluLXBsYWNlIGVkaXQgaW50byB0aGUgc2hhcmVkIHN0b3JlIChzeW5jcyBpdHMgY2FjaGUgKyBlbWl0cykuXG4gICAgICB0aGlzLmNvbW1pdFNoYXBlc1RvU3RvcmUoKTtcbiAgICB9XG4gICAgLy8gbWFuYWdlIGhpZ2ggZGVmIHpvb20gKG5vdCBpZiB3ZSBhcmUgc2hvd2luZyBhIHN0YWNrKVxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gNCAmJiB0aGlzLmlzUmVhbFpvb20pIHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzOiBhbnlbXSA9IFtdO1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgneGF4aXMucmFuZ2VbJykpIHtcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKGV2ZW50W2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgneWF4aXMucmFuZ2VbJykpIHtcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKGV2ZW50W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG4gICAgICBpZiAoIXRoaXMuaW1hZ2VJbmZvLnNob3dTdGFjaykge1xuICAgICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2hlbiBzaGFwZSBpcyBjcmVhdGVkXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmICdzaGFwZXMnIGluIGV2ZW50KSB7XG4gICAgICB0aGlzLnNoYXBlcyA9IGV2ZW50LnNoYXBlcyBhcyBhbnlbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQSBmcmVzaGx5IFBsb3RseS1kcmF3biBzaGFwZSBoYXMgbm8gaWQgeWV0IOKAlCBnaXZlIGl0IGEgbGFiZWwgb2JqZWN0XG4gICAgICAgIC8vICh3aGVuIGxhYmVscyBhcmUgb24pIGJlZm9yZSB0aGUgc3RvcmUgbWludHMgaWQgKyBkZWZhdWx0IG5hbWUuXG4gICAgICAgIGNvbnN0IGlzTmV3ID0gdGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbDtcbiAgICAgICAgdGhpcy5zaGFwZXNbaV0uZmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgICB0aGlzLnNoYXBlc1tpXSA9IHRoaXMucGxvdFV0aWxpdGllcy5zbmFwUmVnaW9uKHRoaXMuc2hhcGVzW2ldKTtcbiAgICAgICAgaWYgKGlzTmV3ICYmIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSkge1xuICAgICAgICAgIHRoaXMuc2hhcGVzW2ldLmxhYmVsID0geyB0ZXh0OiB0aGlzLnNoYXBlc1tpXS5sYWJlbCxcbiAgICAgICAgICAgIHRleHR0ZW1wbGF0ZTogdGhpcy5zaGFwZXNbaV0ubGFiZWwsXG4gICAgICAgICAgICBmb250OiB7IGNvbG9yOiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSB9LFxuICAgICAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWludCBpZHMvbmFtZXMgaW4gdGhlIHN0b3JlLCB3cml0ZSB0aGVtIGJhY2sgb250byB0aGUgZGljdHMsIGFuZCBlbWl0LlxuICAgICAgdGhpcy5jb21taXRTaGFwZXNUb1N0b3JlKCk7XG4gICAgICBpZiAodGhpcy5pc1JlZ2lvblNhdmVkT24pIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGlmIGF1dG9zY2FsZVxuICAgIGlmIChrZXlzLmluY2x1ZGVzKCd4YXhpcy5hdXRvcmFuZ2UnKSAmJiBrZXlzLmluY2x1ZGVzKCd5YXhpcy5hdXRvcmFuZ2UnKSkge1xuICAgICAgLy8gdHJpZ2dlciBhbiBhdXRvc2NhbGUgZXZlbnQgdG8gcmVzZXQgdGhlIHNlbGVjdGVkIGltYWdlIG1vZGUgZHJvcGRvd25cbiAgICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQubmV4dCgnYW4gYXV0b3NjYWxlIGhhcyBoYXBwZW5lZCcpO1xuICAgICAgLy8gc2VsZWN0IGRpc3BsYXkgdHlwZSB0byB0cmlnZ2VyIGEgbmV3IHBsb3R0aW5nIHVwZGF0ZSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHBsb3R0aW5nIHBhcmFtZXRlcnMgc2V0XG4gICAgICB0aGlzLnRpbGVzLnNlbGVjdERpYWdyYW1EaXNwbGF5KCk7XG4gICAgfVxuICAgIC8vIGlmIHNob3dzdGFjayBvciBhc3BlY3RyYXRpbyBldmVudFxuICAgIGlmIChldmVudC5zaG93c3RhY2sgIT09IHVuZGVmaW5lZCB8fCBldmVudC5hc3BlY3RyYXRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTZXQgbmV3IGltYWdlIGluZm8gdG8gdHJpZ2dlciBhIHBsb3QgdXBkYXRlXG4gICAgICB0aGlzLnNldEltYWdlSW5mbyhldmVudC5zaG93c3RhY2ssIGV2ZW50LmFzcGVjdHJhdGlvKTtcbiAgICB9XG5cbiAgICAvLyBQbG90bHkgbWF5IGhhdmUgdXBkYXRlZCB0aGUgYWN0aXZlIHNoYXBlIGluZGV4IGFzIHBhcnQgb2YgdGhlIHJlbGF5b3V0XG4gICAgLy8gKGUuZy4gY2xpY2tpbmcgYSBzaGFwZSdzIGVkaXQgaGFuZGxlLCBvciBmaW5pc2hpbmcgYSBkcmF3KSDigJQgc3VyZmFjZVxuICAgIC8vIHRoYXQgY2hhbmdlIHRvIHRoZSBSZWdpb24gRWRpdG9yLlxuICAgIHRoaXMubWF5YmVFbWl0QWN0aXZlU2hhcGVJbmRleCgpO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zZXRJbWFnZUluZm8oKTtcbiAgfVxuXG5cbiAgLy8g4pSA4pSAIFRvb2wgZGVsZWdhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHVibGljIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9uczogV2FuZE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGVzZSBzaW5nbGV0b25zLlxuICAgIGlmIChhY3RpdmUpIHRoaXMud2FuZFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogV2FuZE9wdGlvbnMpIHtcbiAgICB0aGlzLndhbmRUb29sLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCkge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zOiBCcnVzaE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGlzIHNpbmdsZXRvbi5cbiAgICBpZiAoYWN0aXZlKSB0aGlzLmJydXNoVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IEJydXNoT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNpemUgIT0gbnVsbCkgdGhpcy5icnVzaFRvb2wuc2V0U2l6ZShvcHRpb25zLnNpemUpO1xuICB9XG5cbiAgcHVibGljIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpIHtcbiAgICB0aGlzLnZlcnRleEVyYXNlclRvb2wuc2V0UmFkaXVzKHJhZGl1cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAvLyBUaGUgem9vbS10by1ib3ggdG9vbCBpcyBhIHJvb3Qgc2luZ2xldG9uIHNoYXJlZCB3aXRoIHRoZSBPU0QgYmFja2VuZCxcbiAgICAvLyB3aGljaCByZWJpbmRzIGl0IHRvIGl0cyBvd24gaG9zdCBvbiBhY3RpdmF0aW9uLiBSZWJpbmQgdG8gb3VycyB3aGVuIHdlXG4gICAgLy8gYWN0aXZhdGUgc28gYSBwcmlvciBPU0Qgem9vbS10by1ib3ggZG9lc24ndCBsZWF2ZSB0aGUgc2luZ2xldG9uIHBvaW50aW5nXG4gICAgLy8gYXQgT1NEJ3MgY29vcmRpbmF0ZS96b29tIGhhbmRsZXJzICh3aGljaCB3b3VsZCBicmVhayBib3gtem9vbSBvbiBoZWF0bWFwcykuXG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5iaW5kWm9vbVRvQm94SG9zdCgpO1xuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cblxuICAvKiogQmluZCB0aGUgc2hhcmVkIHpvb20tdG8tYm94IHRvb2wgdG8gdGhpcyAoUGxvdGx5KSBiYWNrZW5kJ3MgaG9zdC4gKi9cbiAgcHJpdmF0ZSBiaW5kWm9vbVRvQm94SG9zdCgpIHtcbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuYmluZEhvc3Qoe1xuICAgICAgZ2V0UGxvdERpdjogKCkgPT4gdGhpcy5wbG90RGl2LFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHRoaXMuem9vbUJveFBpeGVsVG9EYXRhKHB4LCBweSksXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU06IHNlZ21lbnQgdGhlIGRyYXduIHJlY3RhbmdsZXMuIFRoZSBTQU0gdG9vbCByZXVzZXMgdGhlXG4gICAqICB3YW5kIGhvc3QgKGNhY2hlZCBmcmFtZSArIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgcmVnaW9uIHN0b3JlKS4gKi9cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgcHVibGljIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvb2wuc2V0TW9kZWwoaWQpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGVsKGlkKTtcbiAgfVxuICBwdWJsaWMgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBwdWJsaWMgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jb21taXQoKTsgfVxuICBwdWJsaWMgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7IH1cblxuICAvKipcbiAgICogVG9vbC1ob3N0IGNhbGxiYWNrOiBhcHBseSB0aGUgem9vbS10by1ib3ggc2VsZWN0aW9uLiBTdGFjayBtb2RlIGRvZXMgYVxuICAgKiBwdXJlIGF4aXMtcmFuZ2UgcmVsYXlvdXQ7IG5vbi1zdGFjayBtb2RlIGdvZXMgdGhyb3VnaCB0aGUgaGlnaC1kZWZcbiAgICogdHJpZ2dlclpvb20gcGlwZWxpbmUgc28gdGhlIGltYWdlIGlzIHJlLWZldGNoZWQgYXQgdGhlIG5ldyByZXNvbHV0aW9uLlxuICAgKi9cbiAgLyoqIE92ZXJsYXktcGl4ZWwgLT4gUGxvdGx5IGRhdGEgY29vcmRzIHZpYSB0aGUgYXhpcyBvYmplY3RzIChzdWJ0cmFjdGluZyB0aGVcbiAgICogIHBsb3QgbWFyZ2luIG9mZnNldCkuIFRoZSB6b29tLXRvLWJveCB0b29sIGNhbGxzIHRoaXMgdGhyb3VnaCBpdHMgaG9zdC4gKi9cbiAgcHJpdmF0ZSB6b29tQm94UGl4ZWxUb0RhdGEocHg6IG51bWJlciwgcHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgY29uc3QgeGF4aXMgPSBnZC5fZnVsbExheW91dC54YXhpcztcbiAgICBjb25zdCB5YXhpcyA9IGdkLl9mdWxsTGF5b3V0LnlheGlzO1xuICAgIHJldHVybiB7IHg6IHhheGlzLnAyZChweCAtIHhheGlzLl9vZmZzZXQpLCB5OiB5YXhpcy5wMmQocHkgLSB5YXhpcy5fb2Zmc2V0KSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pIHtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGlmICh0aGlzLmltYWdlSW5mbz8uc2hvd1N0YWNrKSB7XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAgICd4YXhpcy5yYW5nZVswXSc6IGNvb3JkaW5hdGVzWzBdLFxuICAgICAgICAneGF4aXMucmFuZ2VbMV0nOiBjb29yZGluYXRlc1sxXSxcbiAgICAgICAgJ3lheGlzLnJhbmdlWzBdJzogY29vcmRpbmF0ZXNbMl0sXG4gICAgICAgICd5YXhpcy5yYW5nZVsxXSc6IGNvb3JkaW5hdGVzWzNdLFxuICAgICAgfSBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgSVZpZXdwb3J0SG9zdCBpbXBsZW1lbnRhdGlvbiAoZm9yIHRoZSBvbi1jYW52YXMgdG9vbHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgcGxvdCBlbGVtZW50IHRoZSB0b29sIGNhbnZhcyBvdmVybGF5cyBhdHRhY2ggdG8uICovXG4gIHB1YmxpYyBnZXRPdmVybGF5Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICB9XG5cbiAgLyoqIFBsb3RseSBjb29yZGluYXRlIHRyYW5zZm9ybSAoc2NyZWVuIDwtPiBkYXRhIHZpYSB0aGUgYXhpcyBvYmplY3RzKS4gKi9cbiAgcHVibGljIGdldENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVUcmFuc2Zvcm07XG4gIH1cblxuICAvLyDilIDilIAgV2FuZFRvb2xIb3N0IGltcGxlbWVudGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBQaXhlbCBkYXRhIHRoZSB3YW5kIG5lZWRzIGZvciBzYW1wbGluZy4gbnVsbCA9IG5vIGltYWdlIGxvYWRlZC4gKi9cbiAgcHJpdmF0ZSBnZXRDYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgZnJhbWVzOiB0aGlzLmNhY2hlZEltYWdlRnJhbWVzLFxuICAgICAgd2lkdGg6IHRoaXMuY2FjaGVkSW1hZ2VXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jYWNoZWRJbWFnZUhlaWdodCxcbiAgICAgIHJhdGlvczogdGhpcy5jYWNoZWRJbWFnZVJhdGlvcyxcbiAgICAgIGlzR3JheXNjYWxlOiB0aGlzLmNhY2hlZElzR3JheXNjYWxlLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgc2hhcmVkLXN0b3JlIHN5bmMgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gYHRoaXMuc2hhcGVzYCBpcyBQbG90bHkncyBvd24gcmVwcmVzZW50YXRpb24gKHRoZSBkaWN0IGFycmF5IFBsb3RseS5yZWxheW91dFxuICAvLyBjb25zdW1lcykuIFRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgsIGhvbGRpbmcgdGhlXG4gIC8vIG5ldXRyYWwgUmVnaW9uIG1vZGVsLiBUaGVzZSBoZWxwZXJzIGJyaWRnZSB0aGUgdHdvOiB3cml0ZXMgbWlycm9yXG4gIC8vIGB0aGlzLnNoYXBlc2AgSU5UTyB0aGUgc3RvcmU7IGltYWdlIHN3aXRjaGVzL2V4dGVybmFsIGNoYW5nZXMgcHJvamVjdCB0aGVcbiAgLy8gc3RvcmUgYmFjayBPVVQgdG8gYHRoaXMuc2hhcGVzYC5cblxuICAvKiogQnVpbGQgUGxvdGx5IHNoYXBlIGRpY3RzIGZyb20gdGhlIHN0b3JlJ3MgcmVnaW9ucyAodGhlIHJlbmRlciBwcm9qZWN0aW9uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zVG9TaGFwZURpY3RzKCk6IGFueVtdIHtcbiAgICBjb25zdCBzaG93TGFiZWwgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCk7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLm1hcChyID0+IHtcbiAgICAgIHIuZmlsZW5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgcmV0dXJuIHsgLi4uci5nZXRTaGFwZShzaG93TGFiZWwpIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgZGljdCB3b3JraW5nLXNldCBmcm9tIHRoZSBzdG9yZSAoYWZ0ZXIgYW4gaW1hZ2Ugc3dpdGNoLCBvciB3aGVuXG4gICAqICByZWdpb25zIGNoYW5nZWQgd2hpbGUgYW5vdGhlciBiYWNrZW5kIHdhcyByZW5kZXJpbmcpLiAqL1xuICBwcml2YXRlIHN5bmNTaGFwZXNGcm9tU3RvcmUoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFwZXMgPSB0aGlzLnJlZ2lvbnNUb1NoYXBlRGljdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSBzaGFyZWQgc3RvcmUgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlIGN1cnJlbnQgZGljdCB3b3JraW5nLXNldDogY29udmVydFxuICAgKiBgdGhpcy5zaGFwZXNgIHRvIG5ldXRyYWwgcmVnaW9ucyBhbmQgcmVwbGFjZSB0aGUgc3RvcmUncyBsaXN0ICh0aGUgc3RvcmVcbiAgICogbWludHMgaWRzLCBhcHBsaWVzIGNsYXNzIGNvbG91cnMsIHN5bmNzIGl0cyBwZXItaW1hZ2UgY2FjaGUgYW5kIGVtaXRzIHRoZVxuICAgKiByZWdpb24tdXBkYXRlIGV2ZW50KS4gU3RvcmUtbWludGVkIGlkcyBhcmUgd3JpdHRlbiBiYWNrIG9udG8gdGhlIGRpY3RzIHNvIHRoZVxuICAgKiB0d28gcmVwcmVzZW50YXRpb25zIHN0YXkgYWxpZ25lZC4gUHJvZmlsZS1saW5lIFJPSXMgYXJlIG9yZGluYXJ5IHJlZ2lvbnNcbiAgICogKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCkgYW5kIHJvdW5kLXRyaXAgdGhyb3VnaCBoZXJlIHRvby5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0U2hhcGVzVG9TdG9yZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5zaGFwZXNcbiAgICAgIC5tYXAocyA9PiBPYmplY3QuYXNzaWduKG5ldyBTaGFwZVNlbGVjdGlvbigpLCBzKS5nZXRSZWdpb24oKSk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSwgdHJ1ZSxcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCksIGZhbHNlKTtcbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hhcGVzLmxlbmd0aCAmJiBpIDwgc3RvcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbCkgdGhpcy5zaGFwZXNbaV0uaWQgPSBzdG9yZWRbaV0uaWQ7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0ubmFtZSA9PSBudWxsKSB0aGlzLnNoYXBlc1tpXS5uYW1lID0gc3RvcmVkW2ldLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggdGhlIGN1cnJlbnQgYHRoaXMuc2hhcGVzYCB0byBQbG90bHksIG1pcnJvciB0aGVtIGludG8gdGhlIHNoYXJlZCBzdG9yZVxuICAgKiAod2hpY2ggc3luY3MgaXRzIGNhY2hlICsgZW1pdHMgdGhlIHJlZ2lvbi11cGRhdGUgZXZlbnQpLCBhbmQgcmVmcmVzaCB0aGVcbiAgICogbG9jYWwgcHJldmlvdXMtc2hhcGVzIGJ1ZmZlci4gVGhlIHdhbmQvZXJhc2VyIHRvb2xzIGNhbGwgdGhpcyBhZnRlciBtdXRhdGluZ1xuICAgKiB0aGUgc2hhcGVzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIGFwcGx5U2hhcGVzQ2hhbmdlKCkge1xuICAgIGlmICh0aGlzLmlzUmVnaW9uU2F2ZWRPbikge1xuICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgfVxuICAgIHRoaXMuY29tbWl0U2hhcGVzVG9TdG9yZSgpO1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMuc2hhcGVzLm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5zaGFwZXNSZWxheW91dChkaWN0QXJyYXkpIGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXRzIG92ZXJsYXkgcmVuZGVycyBzaGFwZXMgKi8gfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBBY3RpdmUgZnJhbWUgaW5kZXggaW4gdGhlIGNhY2hlZCBpbWFnZSBzdGFjay4gKi9cbiAgcHJpdmF0ZSBhY3RpdmVGcmFtZUluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoIDw9IDEpIHJldHVybiAwO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGNvbnN0IHNsaWRlckFjdGl2ZSA9IGdkPy5fZnVsbExheW91dD8uc2xpZGVycz8uWzBdPy5hY3RpdmU7XG4gICAgaWYgKHR5cGVvZiBzbGlkZXJBY3RpdmUgPT09ICdudW1iZXInKSByZXR1cm4gc2xpZGVyQWN0aXZlO1xuICAgIHJldHVybiB0aGlzLnpJbmRleC52YWx1ZSB8fCAwO1xuICB9XG5cbiAgLyoqIENhcGFiaWxpdHktZ2F0ZWQgM0Qgc2NlbmUgY29udHJvbHMgKFBsb3RseSByZW5kZXJzIHRoZSAzRCBwbG90IHR5cGVzKS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN1cmZhY2VEcmFnTW9kZTogKG1vZGU6IHN0cmluZykgPT4gdGhpcy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSksXG4gICAgICByZXNldFN1cmZhY2VDYW1lcmE6ICgpID0+IHRoaXMucmVzZXRTdXJmYWNlQ2FtZXJhKCksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyAnc2NlbmUuZHJhZ21vZGUnOiBtb2RlIH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXRTdXJmYWNlQ2FtZXJhKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgJ3NjZW5lLmNhbWVyYSc6IHt9IH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJab29tKGNvb3JkaW5hdGVzOiBudW1iZXJbXSkge1xuICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0UmVjdGFuZ2xlKGNvb3JkaW5hdGVzLCB0aGlzLnRydWVJbWdTaXplKTtcbiAgICBpZiAodGhpcy5wbG90VXRpbGl0aWVzLmlzWm9vbVNhbWVBc0ltZ1NpemUocmVjdCwgdGhpcy50cnVlSW1nU2l6ZSkpIHtcbiAgICAgIHRoaXMuYXV0b3NjYWxlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgYnJpZWYgXCJDYWNoaW5nIGltYWdlLi4uXCIgbWVzc2FnZSBmb3IgdW5jYWNoZWQgZmlsZXMgKGxhcmdlIGZpbGVzIHRha2UgYVxuICAgIC8vIG1vbWVudCB0byBjYWNoZSk7IGp1c3QgYSBzcGlubmVyIG90aGVyd2lzZS5cbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZ01lc3NhZ2UodGhpcy5pbWFnZUNhY2hlZCA/ICcnIDogJ0NhY2hpbmcgaW1hZ2UuLi4nKTtcbiAgICBjb25zdCBzY3JlZW4gPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0RG9tUmVjdGFuZ2xlKCdkaWFncmFtJyk7XG4gICAgY29uc3QgaW1hZ2VTaXplOiBhbnlbXSA9IFtdO1xuICAgIGltYWdlU2l6ZVswXSA9IHJlY3QueDtcbiAgICBpbWFnZVNpemVbMV0gPSByZWN0LnggKyByZWN0LndpZHRoO1xuICAgIGltYWdlU2l6ZVsyXSA9IHJlY3QueTtcbiAgICBpbWFnZVNpemVbM10gPSByZWN0LnkgKyByZWN0LmhlaWdodDtcbiAgICAvLyBTbmFwc2hvdCB0aGUgZmlsZW5hbWUgc28gYSByZXNwb25zZSB0aGF0IGFycml2ZXMgYWZ0ZXIgdGhlIHVzZXIgc3dpdGNoZWRcbiAgICAvLyBmaWxlcyBpcyBkcm9wcGVkICh0aGUgcmVxdWVzdCBjYXJyaWVkIHRoZSBmaWxlIHNlbGVjdGVkIGF0IGNhbGwgdGltZSkuXG4gICAgY29uc3QgcmVxTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5zdGF0ZS5zZXRab29tKHRydWUpO1xuICAgIHRoaXMudGlsZXMuem9vbU9uUmVnaW9uKHJlY3QsIHNjcmVlbiwgdGhpcy56SW5kZXgudmFsdWUpLnN1YnNjcmliZSh7IG5leHQ6IHpvb21EYXRhID0+IHtcbiAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSh6b29tRGF0YSk7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh1aW50OEFycmF5KTtcbiAgICAgIEltYWdlLmxvYWQoYnVmZmVyKS50aGVuKChpbWFnZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHhSYXRpbyA9IHJlY3Qud2lkdGggLyBpbWFnZS53aWR0aDtcbiAgICAgICAgY29uc3QgeVJhdGlvID0gcmVjdC5oZWlnaHQgLyBpbWFnZS5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmZpbGVOYW1lID09PSByZXFOYW1lKSB7XG4gICAgICAgICAgY29uc3QgaXNHcmF5ID0gdGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBpc0dyYXlcbiAgICAgICAgICAgID8gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoaW1hZ2UuZ3JleSgpLmRhdGEsIGltYWdlLndpZHRoKVxuICAgICAgICAgICAgOiB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChpbWFnZS5nZXRQaXhlbHNBcnJheSgpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgLy8gQWxzbyBzYW1wbGUgdGhlIGludGVuc2l0eSBwcm9maWxlcyBmcm9tIHRoaXMgaGlnaC1kZWYgY3JvcCBzbyB0aGVcbiAgICAgICAgICAvLyBpbnNldCByZWZsZWN0cyB0aGUgem9vbS1sZXZlbCByZXNvbHV0aW9uIChvcmlnaW4gPSBjcm9wIHRvcC1sZWZ0KS5cbiAgICAgICAgICB0aGlzLnNldFNhbXBsaW5nRnJhbWVzKFtmcmFtZV0sIFt4UmF0aW8sIHlSYXRpb10sIFtpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsyXV0pO1xuICAgICAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBoaWdoLWRlZiBjcm9wIGluIHRoZSBTQU1FIHBsb3QgdHlwZSB0aGUgdXNlciBpc1xuICAgICAgICAgIC8vIHZpZXdpbmcuIFdpdGhvdXQgdGhpcyB0aGUgem9vbSByZS1mZXRjaCBhbHdheXMgZmVsbCBiYWNrIHRvIGFcbiAgICAgICAgICAvLyBoZWF0bWFwLCBzbyB6b29taW5nIGluIGNvbnRvdXIgKG9yIGFueSByZWdpc3RyeSB0eXBlKSByZXZlcnRlZFxuICAgICAgICAgIC8vIHRvIGhlYXRtYXAuXG4gICAgICAgICAgY29uc3QgaW1wbCA9IFBMT1RMWV9QTE9UX1RZUEVfSU1QTFNbdGhpcy5wbG90VHlwZV07XG4gICAgICAgICAgY29uc3QgcmVuZGVyUHJvbWlzZSA9IGltcGxcbiAgICAgICAgICAgID8gdGhpcy5wbG90VmlhUmVnaXN0cnkodGhpcy5wbG90RGl2LCBpbXBsLFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUcmFjZUlucHV0KHRoaXMuaW1hZ2VJbmZvLCB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiBbZnJhbWVdLCByYXRpb3M6IFt4UmF0aW8sIHlSYXRpb10sXG4gICAgICAgICAgICAgICAgICBzaXplczogW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLCBmaWxlbmFtZTogcmVxTmFtZSxcbiAgICAgICAgICAgICAgICB9LCBpbWFnZVNpemUpLCB0aGlzLnNjcmVlbkhlaWdodClcbiAgICAgICAgICAgIDogKGlzR3JheVxuICAgICAgICAgICAgICAgID8gdGhpcy5wbG90SGVhdG1hcCh0aGlzLnBsb3REaXYsIHRoaXMudXJscywgW2ZyYW1lXSwgaW1hZ2VTaXplLCBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmVlbkhlaWdodClcbiAgICAgICAgICAgICAgICA6IHRoaXMucGxvdFJHQkhlYXRtYXAodGhpcy5wbG90RGl2LCB0aGlzLnVybHMsIFtmcmFtZV0sIGltYWdlU2l6ZSwgW3hSYXRpbywgeVJhdGlvXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgdGhpcy5zY3JlZW5IZWlnaHQpKTtcbiAgICAgICAgICAvLyBwbG90VmlhUmVnaXN0cnkgYWxyZWFkeSBhcHBsaWVzIHRoZSB0eXBlJ3Mgb3duIGxheW91dC9yYW5nZSBmb3JcbiAgICAgICAgICAvLyBub24taW1hZ2UgbGF5b3V0cyAoY2hhcnQvb3ZlcmxheSk7IG9ubHkgcmUtYXBwbHkgdGhlIGhlYXRtYXBcbiAgICAgICAgICAvLyByYW5nZSBmb3IgdGhlIGltYWdlLWFsaWduZWQgcGF0aHMuXG4gICAgICAgICAgY29uc3QgcmVhcHBseVJhbmdlID0gIWltcGwgfHwgaW1wbC5sYXlvdXRLaW5kID09PSAnMmQtaW1hZ2UnO1xuICAgICAgICAgIHJlbmRlclByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlQ2FjaGVkKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgaW1hZ2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJlYXBwbHlSYW5nZSkgdGhpcy5yZWxheW91dChpbWFnZVNpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBlcnJvcjogZXJyID0+IHtcbiAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IGVycj8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgd2hlbiB6b29taW5nJywgZXJyKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiAnY2VudGVyLXRvYXN0Jywgc3RpY2t5OiB0cnVlLCBzZXZlcml0eTonZXJyb3InLCBzdW1tYXJ5OidBbiBlcnJvciBvY2N1cmVkJyxcbiAgICAgICAgZGV0YWlsOmBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VyZWQgd2hpbGUgem9vbWluZzogJHttc2d9LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgdHJ5IHRvIG9wZW4gdGhlIGltYWdlIGFnYWluIHRocm91Z2ggdGhlIGZpbGUgbmF2aWdhdG9yIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tIG9uIHRoZSBzZWxlY3RlZCBhcmVhIG9uY2UgbW9yZS5gIH0pO1xuICAgICAgdGhpcy5zdGF0ZS5zZXRMb2FkaW5nRXJyb3IodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZyhmYWxzZSk7XG4gICAgfSwgY29tcGxldGU6ICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCd6b29taW5nIGNvbXBsZXRlJyk7XG4gICAgfSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbG90VHlwZShwbG90VHlwZTogUGxvdFR5cGUpIHtcbiAgICB0aGlzLnBsb3RUeXBlID0gcGxvdFR5cGU7XG4gIH1cblxuICBwcml2YXRlIHNldEltYWdlSW5mbyhzaG93U3RhY2s/OiBib29sZWFuLCBzY2FsZXJhdGlvPzogYm9vbGVhbikge1xuICAgIC8vIEJ1aWxkIGEgcGFydGlhbCBpbWFnZSBkZXNjcmlwdG9yIGFuZCBwdXNoIGl0IHRvIHRoZSBob3N0IHZpYSB0aGUgcG9ydC5cbiAgICBjb25zdCBpbWdJbmZvOiBQYXJ0aWFsPElJbWFnZUluZm8+ID0ge1xuICAgICAgaXNHcmF5c2NhbGU6IHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlLFxuICAgICAgdHJ1ZUltYWdlU2l6ZTogW3RoaXMudHJ1ZUltZ1NpemVbMV0sIHRoaXMudHJ1ZUltZ1NpemVbM11dLFxuICAgICAgdXJsczogdGhpcy51cmxzLFxuICAgICAgaXNTdGFjazogdGhpcy51cmxzLmxlbmd0aCA+IDEsXG4gICAgICBzY2FsZVJhdGlvOiBzY2FsZXJhdGlvICE9PSB1bmRlZmluZWQgPyBzY2FsZXJhdGlvIDogdGhpcy5zY2FsZXJhdGlvLFxuICAgIH07XG4gICAgaWYgKHNob3dTdGFjayAhPT0gdW5kZWZpbmVkKSBpbWdJbmZvLnNob3dTdGFjayA9IHNob3dTdGFjaztcbiAgICBpZiAodGhpcy5maWxlTmFtZSkgaW1nSW5mby5maWxlTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUluZm8oaW1nSW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2hhcGVzKCkge1xuICAgIHJldHVybiB0aGlzLnNoYXBlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmFtZXdvcmstbmV1dHJhbCB2aWV3IG9mIHRoZSBjdXJyZW50IHJlZ2lvbnMg4oCUIGRlbGVnYXRlcyB0byB0aGUgc2hhcmVkXG4gICAqIFJlZ2lvblN0b3JlICh0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCkuIFRoZSBjYW5vbmljYWwgYWNjZXNzb3Igb24gdGhlXG4gICAqIGBJVmlzdWFsaXplcmAgY29udHJhY3Q7IGNvbnN1bWVycyBzaG91bGQgcHJlZmVyIHRoaXMgb3ZlciBgZ2V0U2hhcGVzKClgXG4gICAqICh3aGljaCBleHBvc2VzIFBsb3RseS1zaGFwZWQgZGljdHMpLlxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdGhlIGFjdGl2ZSBpbWFnZS4gVGhlIHNoYXJlZCBSZWdpb25TdG9yZSBvd25zIHRoZSBwZXItaW1hZ2UgcmVnaW9uXG4gICAqIGNhY2hlIChzbmFwc2hvdCBvdXRnb2luZyAvIHJlc3RvcmUgaW5jb21pbmcgLyBjbGVhciBzZWxlY3Rpb24gLyBlbWl0KTsgd2VcbiAgICogZGVsZWdhdGUgdG8gaXQsIHRoZW4gcmUtcHJvamVjdCB0aGUgc3RvcmUncyByZWdpb25zIGludG8gUGxvdGx5J3MgZGljdFxuICAgKiB3b3JraW5nLXNldC4gUmUtcHJvamVjdGluZyB1bmNvbmRpdGlvbmFsbHkgKGV2ZW4gd2hlbiB0aGUgc3RvcmUgbm8tb3BzIGZvclxuICAgKiB0aGUgc2FtZSBpbWFnZSkgbWVhbnMgUGxvdGx5IGFsc28gcGlja3MgdXAgcmVnaW9ucyBhbm90aGVyIGJhY2tlbmQgKE9TRClcbiAgICogYWRkZWQgd2hpbGUgaXQgd2FzIG9mZi1zY3JlZW4uIENhbGxlZCBmcm9tIGBwbG90KClgIGFuZCBmcm9tIHRoZSByb3V0ZXJcbiAgICogYmVmb3JlIGFueSBiYWNrZW5kIHJlbmRlcnMuXG4gICAqL1xuICBwdWJsaWMgc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvKSB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIHRoaXMuc3luY1NoYXBlc0Zyb21TdG9yZSgpO1xuICAgIHRoaXMucHJldmlvdXNTaGFwZXMgPSB0aGlzLnNoYXBlcy5zbGljZSgpO1xuICB9XG5cbiAgLyoqIFRlc3QvZGV2IGhvb2sg4oCUIGRyb3AgdGhlIGVudGlyZSBwZXItaW1hZ2UgY2FjaGUgKGxvZ291dCAvIHByb2plY3Qgc3dpdGNoKS4gKi9cbiAgcHVibGljIGNsZWFyUmVnaW9uc0J5SW1hZ2VLZXkoKSB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5jbGVhclJlZ2lvbnNCeUltYWdlS2V5KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgc2VsZWN0ZWQgcmVnaW9ucyBhcyBwb2x5Z29ucy4gT3BlbiBwb2x5bGluZXMgKGNsb3NlZCA9PT0gZmFsc2UpXG4gICAqIGFyZSBleGNsdWRlZCDigJQgdGhleSdyZSBhbm5vdGF0aW9uLW9ubHkgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGZpbGxlZCByZWdpb25zXG4gICAqIGZvciBpbWFnZSBwcm9jZXNzaW5nLiBEZWxlZ2F0ZXMgdG8gdGhlIHNoYXJlZCBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWdpb25Qb2x5Z29ucygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuXG4gIGlzUmVjdGFuZ2xlKGJuZHM6IGFueSk6IGJuZHMgaXMgUmVjdGFuZ2xlIHtcbiAgICByZXR1cm4gJ3gnIGluIGJuZHMgJiYgJ3knIGluIGJuZHMgJiYgJ3dpZHRoJyBpbiBibmRzICYmICdoZWlnaHQnIGluIGJuZHM7XG4gIH1cblxuICBpc1BvbHlnb24oYm5kczogYW55KTogYm5kcyBpcyBQb2x5Z29uIHtcbiAgICByZXR1cm4gJ25wb2ludHMnIGluIGJuZHMgJiYgJ3hwb2ludHMnIGluIGJuZHMgJiYgJ3lwb2ludHMnIGluIGJuZHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBsb3QgcmVnaW9ucy4gRGVsZWdhdGVzIHRoZSBzdGF0ZSBjaGFuZ2UgdG8gdGhlIHNoYXJlZCBSZWdpb25TdG9yZVxuICAgKiAoaWQvbmFtZSBtaW50aW5nLCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzLCBhcHBlbmQgZGUtZHVwbGljYXRpb24sIHBlci1pbWFnZVxuICAgKiBjYWNoZSBhbmQgdGhlIHJlZ2lvbi11cGRhdGUgZXZlbnQgYWxsIGxpdmUgdGhlcmUpLCB0aGVuIHJlLXByb2plY3RzIHRoZVxuICAgKiBzdG9yZSdzIHJlZ2lvbnMgaW50byBQbG90bHkncyBkaWN0IHdvcmtpbmctc2V0IGFuZCByZW5kZXJzLlxuICAgKlxuICAgKiBXaGVuIGBpc1JlZ2lvblNhdmVPbmAgaXMgZmFsc2UgdGhlIHJlZ2lvbnMgYXJlIHNob3duIHRyYW5zaWVudGx5IOKAlCByZW5kZXJlZFxuICAgKiB3aXRob3V0IGFsdGVyaW5nIHRoZSBzdG9yZWQgd29ya2luZy1zZXQgKHByZXNlcnZlcyB0aGUgcHJpb3IgYmVoYXZpb3VyKS5cbiAgICovXG4gIHB1YmxpYyBzZXRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdLCBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBzaG93TGFiZWwgPSBzaG93UmVnaW9uTGFiZWwgPT09IHVuZGVmaW5lZCA/IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSA6IHNob3dSZWdpb25MYWJlbDtcbiAgICBjb25zdCBzYXZlID0gaXNSZWdpb25TYXZlT24gPT09IHVuZGVmaW5lZCA/IHRoaXMuaXNSZWdpb25TYXZlZE9uIDogaXNSZWdpb25TYXZlT247XG5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucywgc2hvd1JlZ2lvbkxhYmVsLCBpc1JlZ2lvblNhdmVPbiwgZmlsbENvbG9yLCBhcHBlbmQpO1xuICAgIHRoaXMuaXNSZWdpb25TYXZlZE9uID0gc2F2ZTtcblxuICAgIGlmIChzYXZlKSB7XG4gICAgICAvLyBSZS1wcm9qZWN0IHRoZSBhdXRob3JpdGF0aXZlIHJlZ2lvbnMgaW50byBQbG90bHkncyB3b3JraW5nLXNldCBhbmQgcmVuZGVyLlxuICAgICAgdGhpcy5zeW5jU2hhcGVzRnJvbVN0b3JlKCk7XG4gICAgICB0aGlzLnJlbmRlclNoYXBlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmFuc2llbnQgZGlzcGxheSBvbmx5IOKAlCByZW5kZXIgdGhlIHBhc3NlZCByZWdpb25zLCBkb24ndCB0b3VjaCB0aGVcbiAgICAgIC8vIHdvcmtpbmctc2V0IChhbmQgdGhlIHN0b3JlIGRpZG4ndCBzdG9yZSB0aGVtIGVpdGhlcikuXG4gICAgICBjb25zdCBkaWN0cyA9IHJlZ2lvbnMubWFwKHIgPT4geyByLmZpbGVuYW1lID0gdGhpcy5maWxlTmFtZTsgcmV0dXJuIHsgLi4uci5nZXRTaGFwZShzaG93TGFiZWwpIH07IH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5zaGFwZXNSZWxheW91dChkaWN0cykgYXMgYW55KTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kIChPU0QpIOKAlCBpdHMgb3ZlcmxheSByZW5kZXJzIHNoYXBlcyAqLyB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzaGFwZXMtcmVsYXlvdXQgcGF5bG9hZDogcmVnaW9uIHNoYXBlcyAocHJvZmlsZS1saW5lIFJPSXMgaW5jbHVkZWQsIGFzXG4gICAqICB0aGV5IGFyZSBvcmRpbmFyeSByZWdpb25zKSBwbHVzIHRoZSBhY3RpdmUtc2hhcGUgZmlsbCBjb2xvdXIuICovXG4gIHByaXZhdGUgc2hhcGVzUmVsYXlvdXQoc2hhcGVEaWN0czogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBzaGFwZXM6IHNoYXBlRGljdHMsXG4gICAgICBhY3RpdmVzaGFwZTogeyBmaWxsY29sb3I6IHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCkgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFB1c2ggdGhlIGN1cnJlbnQgZGljdCB3b3JraW5nLXNldCB0byBQbG90bHkgKG5vLW9wIHdoZW4gYW5vdGhlciBiYWNrZW5kXG4gICAqICBvd25zIHRoZSBkaXYpLiAqL1xuICBwcml2YXRlIHJlbmRlclNoYXBlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuO1xuICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMuc2hhcGVzLm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICAgIHRyeSB7XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB0aGlzLnNoYXBlc1JlbGF5b3V0KGRpY3RBcnJheSkgYXMgYW55KTtcbiAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXRzIG92ZXJsYXkgcmVuZGVycyBzaGFwZXMgKi8gfVxuICB9XG5cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJldmlvdXMgc2F2ZWQgc2hhcGVzXG4gICAqL1xuICBwdWJsaWMgcGxvdFByZXZpb3VzU2hhcGVzKCkge1xuICAgIC8vIGNvbnZlcnQgdG8gZGljdCBzbyB0aGF0IHBsb3RseSByZWNvZ25pc2VzIHRoZSBzaGFwZXNcbiAgICBjb25zdCBkaWN0QXJyYXkgPSB0aGlzLnByZXZpb3VzU2hhcGVzLm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICAgIHRyeSB7XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7IHNoYXBlczogZGljdEFycmF5IH0pO1xuICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kIChPU0QpICovIH1cbiAgfVxuXG4gIHNldFByZXZpb3VzU2hhcGVzKHNoYXBlczogU2hhcGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMucHJldmlvdXNTaGFwZXMgPSBzaGFwZXM7XG4gIH1cblxuICBnZXRQcmV2aW91c1NoYXBlcygpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2aW91c1NoYXBlcztcbiAgfVxuXG4gIC8vIFVuZG8gKGppdC11aSM4NSk6IHJlZ2lvbiBoaXN0b3J5IGxpdmVzIGluIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUsIHNvIHRoZVxuICAvLyBhY3RpdmUgYmFja2VuZCdzIG92ZXJsYXkgcmUtcmVuZGVycyBvZmYgaXRzIHJlZ2lvblVwZGF0ZSQgb24gcmVzdG9yZS5cbiAgcHVibGljIHVuZG8oKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUudW5kbygpOyB9XG4gIHB1YmxpYyByZWRvKCk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnJlZG8oKTsgfVxuICBwdWJsaWMgY2FuVW5kbygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuVW5kbygpOyB9XG4gIHB1YmxpYyBjYW5SZWRvKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5jYW5SZWRvKCk7IH1cbiAgcHVibGljIGdldENhblVuZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5VbmRvJCgpOyB9XG4gIHB1YmxpYyBnZXRDYW5SZWRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuUmVkbyQoKTsgfVxuICBwdWJsaWMgcmVzZXRVbmRvSGlzdG9yeSgpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS5yZXNldFVuZG9IaXN0b3J5KCk7IH1cblxuICAvLyDilIDilIAgUGVyLXNsaWNlIHotc3RhY2sgcmVnaW9ucyDihpIgUmVnaW9uU3RvcmUgKGppdC11aSM5Mykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHB1YmxpYyBlbnRlclN0YWNrTW9kZShzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiwgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlTGF5b3V0PzogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICB9XG4gIHB1YmxpYyBleGl0U3RhY2tNb2RlKCk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLmV4aXRTdGFja01vZGUoKTsgfVxuICBwdWJsaWMgaXNTdGFja01vZGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKCk7IH1cbiAgcHVibGljIGdldFN0YWNrU2F2ZUxheW91dCgpOiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlTGF5b3V0KCk7XG4gIH1cbiAgcHVibGljIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS5zZXREaXNwbGF5U2xpY2Uoeik7IH1cbiAgcHVibGljIGdldFNsaWNlUmVnaW9ucygpOiBSZWdpb25bXSB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpOyB9XG4gIHB1YmxpYyBnZXRTdGFja1NhdmVTbGljZXMoKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCk7IH1cblxuICBwcml2YXRlIGdldEhlYXRtYXBMYXlvdXQoeFJhbmdlOiBudW1iZXJbXSwgeVJhbmdlOiBudW1iZXJbXSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHhheGlzOiB7XG4gICAgICAgIGNvbnN0cmFpbjogJ3JhbmdlJyxcbiAgICAgICAgY29uc3RyYWludG93YXJkOiAnY2VudGVyJyxcbiAgICAgICAgc2lkZTogJ3RvcCcsXG4gICAgICAgIHRpY2tzOiAnJyxcbiAgICAgICAgcmFuZ2U6IHhSYW5nZVxuICAgICAgfSxcbiAgICAgIHlheGlzOiB7XG4gICAgICAgIGNvbnN0cmFpbjogJ3JhbmdlJyxcbiAgICAgICAgY29uc3RyYWludG93YXJkOiAnY2VudGVyJyxcbiAgICAgICAgcmFuZ2U6IHlSYW5nZSxcbiAgICAgICAgdGlja3M6ICcnLFxuICAgICAgICB0aWNrc3VmZml4OiAnICAnLFxuXHRcdFx0XHQvLyBzZXQgYXV0b3JhbmdlIHRvIGZhbHNlIHNvIHRoYXQgcGxvdGx5IGRvZXMgbm90IG92ZXJ3cml0ZSB0aGUgcmFuZ2UgZm9yIHRoZSB5IGF4aXNcblx0XHRcdFx0YXV0b3JhbmdlOiBmYWxzZSxcbiAgICAgICAgc2NhbGVhbmNob3I6IHRoaXMuc2NhbGVyYXRpbyA/ICd4JyA6IGZhbHNlXG4gICAgIH0sXG4gICAgICBtYXJnaW46IHsgdDogMzAsIGI6IDUsIGw6IDU1LCByOiA1IH0sXG4gICAgICBoZWlnaHQ6IHRoaXMuc2NyZWVuSGVpZ2h0LFxuICAgICAgc2xpZGVyczogW3tcbiAgICAgICAgcGFkOiB7IHQ6IDUwIH0sXG4gICAgICAgIGN1cnJlbnR2YWx1ZToge1xuICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgcHJlZml4OiAnWi1wbGFuZTonLFxuICAgICAgICAgIHhhbmNob3I6ICdyaWdodCcsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZXBzOiB0aGlzLmdldFN0ZXBzKClcbiAgICAgIH1dLFxuICAgICAgYXV0b3NpemU6IHRydWUsXG4gICAgICBzaGFwZXM6IHRoaXMuY3VycmVudFJlbmRlclNoYXBlcyh0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCkpLFxuICAgICAgYWN0aXZlc2hhcGU6IHsgZmlsbGNvbG9yOiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpIH0sXG4gICAgICBkcmFnbW9kZTogdGhpcy5kcmFnTW9kZSA/IHRoaXMuZHJhZ01vZGUgOiBmYWxzZSxcbiAgICAgIG5ld3NoYXBlOiB7IGxpbmU6IHsgY29sb3I6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLCB3aWR0aDogMyB9IH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaGFwZXNUb1JlZHJhdyhzaG93TGFiZWw6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzaGFwZXNUb1JlZHJhdzogU2hhcGVTZWxlY3Rpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2YgdGhpcy5zaGFwZXMpIHtcbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShzaGFwZS5maWxlTmFtZSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsZU5hbWUpKSB7XG4gICAgICAgIC8vIFNldCBsYWJlbFxuICAgICAgICBpZiAoc2hvd0xhYmVsKSB7XG4gICAgICAgICAgc2hhcGUubGFiZWwgPSB7XG4gICAgICAgICAgICB0ZXh0OiBgJHtzaGFwZS5sZWdlbmR9YCxcbiAgICAgICAgICAgIHRleHR0ZW1wbGF0ZTogYCR7c2hhcGUubGVnZW5kfWAsXG4gICAgICAgICAgICB0ZXh0cG9zaXRpb246ICd0b3AgbGVmdCcsXG4gICAgICAgICAgICBmb250OiB7IGNvbG9yOiBgJHtzaGFwZS5saW5lLmNvbG9yfWAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hhcGUubGFiZWwgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBzaGFwZXNUb1JlZHJhdy5wdXNoKHNoYXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29udmVydCB0byBkaWN0IHNvIHRoYXQgcGxvdGx5IHJlY29nbmlzZXMgdGhlIHNoYXBlc1xuICAgIHJldHVybiBzaGFwZXNUb1JlZHJhdy5tYXAocyA9PiAoeyAuLi5zIH0pKTtcbiAgfVxuICAvKipcbiAgICogVW51c2VkICh3aWxsIGJlIHVzZWQgd2hlbiBzdXJmYWNlIHBsb3QgaXMgYWRkZWQpXG4gICAqIEBwYXJhbSB4UmFuZ2VcbiAgICogQHBhcmFtIHlSYW5nZVxuICAgKiBAcGFyYW0gelJhdGlvXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldFN1cmZhY2VMYXlvdXQoeFJhbmdlOiBudW1iZXJbXSwgeVJhbmdlOiBudW1iZXJbXSwgelJhdGlvOiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtYXJnaW46IHsgdDogMCwgYjogMCwgbDogMCwgcjogMCB9LFxuICAgICAgc2NlbmU6IHtcbiAgICAgICAgeGF4aXM6IHtcbiAgICAgICAgICBncmlkY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHplcm9saW5lY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHNob3diYWNrZ3JvdW5kOiB0cnVlLFxuICAgICAgICAgIGJhY2tncm91bmRjb2xvcjogJ3JnYigyMzAsIDIzMCwyMzApJyxcbiAgICAgICAgICAvLyByYW5nZTogeFJhbmdlXG4gICAgICAgIH0sXG4gICAgICAgIHlheGlzOiB7XG4gICAgICAgICAgZ3JpZGNvbG9yOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICB6ZXJvbGluZWNvbG9yOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICBzaG93YmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgICBiYWNrZ3JvdW5kY29sb3I6ICdyZ2IoMjMwLCAyMzAsIDIzMCknLFxuICAgICAgICAgIC8vIGF1dG9yYW5nZTogJ3JldmVyc2VkJyxcbiAgICAgICAgICAvLyByYW5nZTogeVJhbmdlLFxuICAgICAgICAgIC8vIHNjYWxlYW5jaG9yOiAneCdcbiAgICAgICAgfSxcbiAgICAgICAgemF4aXM6IHtcbiAgICAgICAgICBncmlkY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHplcm9saW5lY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHNob3diYWNrZ3JvdW5kOiB0cnVlLFxuICAgICAgICAgIGJhY2tncm91bmRjb2xvcjogJ3JnYigyMzAsIDIzMCwyMzApJ1xuICAgICAgICB9LFxuICAgICAgICBhc3BlY3RyYXRpbzogeyB4OiAxLCB5OiAxLCB6OiB6UmF0aW8gfSxcbiAgICAgICAgYXNwZWN0bW9kZTogJ21hbnVhbCcsXG4gICAgICAgIHNsaWRlcnM6IFt7XG4gICAgICAgICAgcGFkOiB7IHQ6IDUwIH0sXG4gICAgICAgICAgY3VycmVudHZhbHVlOiB7XG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgcHJlZml4OiAnWi1wbGFuZTonLFxuICAgICAgICAgICAgeGFuY2hvcjogJ3JpZ2h0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0ZXBzOiB0aGlzLmdldFN0ZXBzKClcbiAgICAgICAgfV0sXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RlcHMoKSB7XG4gICAgY29uc3Qgc3RlcHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW1hZ2VMZW5ndGg7IGkrKykge1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIGxhYmVsOiBpICsgMSxcbiAgICAgICAgbWV0aG9kOiAncmVzdHlsZScsXG4gICAgICAgIGFyZ3M6IFsndmlzaWJsZScsIEFycmF5KHRoaXMuaW1hZ2VMZW5ndGgpLmZpbGwoZmFsc2UpLmZpbGwodHJ1ZSwgaSwgaSArIDEpXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYW4gaW1hZ2UgdmlhIEFuZ3VsYXIgSHR0cENsaWVudCBzbyB0aGF0IGF1dGggaW50ZXJjZXB0b3JzIChCZWFyZXIgdG9rZW4pXG4gICAqIGFyZSBhcHBsaWVkLCB0aGVuIGRlY29kZSBpdCB3aXRoIGltYWdlLWpzLiBUaGlzIGF2b2lkcyByYXcgYnJvd3NlciBmZXRjaCgpXG4gICAqIGNhbGxzIHRoYXQgYnlwYXNzIHRoZSBpbnRlcmNlcHRvciBjaGFpbiBhbmQgZmFpbCBiZWhpbmQgYW4gT0F1dGgyIHByb3h5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSW1hZ2UodXJsOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlPiB7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicgfSlcbiAgICApO1xuICAgIHJldHVybiBJbWFnZS5sb2FkKEJ1ZmZlci5mcm9tKGJ1ZmZlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBpbWFnZSBhcyBhbiBpbWFnZS1qcyBJbWFnZSBpbnN0YW5jZS5cbiAgICogVXNlZCBieSB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZSB0byBvYnRhaW4gdGhlIGlucHV0IGltYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5pbWFnZUluZm8gfHwgIXRoaXMuaW1hZ2VJbmZvLnVybHMgfHwgdGhpcy5pbWFnZUluZm8udXJscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB6SWR4ID0gdGhpcy56SW5kZXgudmFsdWUgfHwgMDtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmltYWdlSW5mby51cmxzW3pJZHhdIHx8IHRoaXMuaW1hZ2VJbmZvLnVybHNbMF07XG4gICAgcmV0dXJuIHRoaXMubG9hZEltYWdlKHVybCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBsb3QgcGl4ZWwgZGF0YSBhcyBhIGZsYXQgVWludDhDbGFtcGVkQXJyYXkuXG4gICAqIFRoaXMgY2FwdHVyZXMgd2hhdGV2ZXIgaXMgYWN0dWFsbHkgcmVuZGVyZWQg4oCUIGluY2x1ZGluZyB6b29tZWQgcmVnaW9ucy5cbiAgICogUmV0dXJucyB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzLCBkYXRhIH0gb3IgbnVsbCBpZiBubyBwbG90IGlzIGRpc3BsYXllZC5cbiAgICovXG4gIHB1YmxpYyBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgY2hhbm5lbHM6IG51bWJlcjtcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGlmICghZ2Q/LmRhdGEgfHwgZ2QuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgLy8gRmluZCB0aGUgdmlzaWJsZSB0cmFjZVxuICAgIGNvbnN0IGZyYW1lSWR4ID0gdGhpcy5hY3RpdmVGcmFtZUluZGV4KCk7XG4gICAgY29uc3QgdHJhY2UgPSBnZC5kYXRhW2ZyYW1lSWR4XSB8fCBnZC5kYXRhWzBdO1xuICAgIGlmICghdHJhY2UgfHwgIXRyYWNlLnopIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgekRhdGE6IGFueVtdW10gPSB0cmFjZS56O1xuICAgIGNvbnN0IGhlaWdodCA9IHpEYXRhLmxlbmd0aDtcbiAgICBpZiAoaGVpZ2h0ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB3aWR0aCA9IHpEYXRhWzBdLmxlbmd0aDtcblxuICAgIGlmICh0cmFjZS50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgICAvLyBSR0IgaW1hZ2U6IHpbcm93XVtjb2xdID0gW3IsIGcsIGJdIG9yIFtyLCBnLCBiLCBhXVxuICAgICAgY29uc3Qgc2FtcGxlID0gekRhdGFbMF1bMF07XG4gICAgICBjb25zdCBjaGFubmVscyA9IEFycmF5LmlzQXJyYXkoc2FtcGxlKSA/IHNhbXBsZS5sZW5ndGggOiAzO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNoYW5uZWxzKTtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgY29uc3QgcGl4ZWwgPSB6RGF0YVt5XVt4XTtcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoeSAqIHdpZHRoICsgeCkgKiBjaGFubmVscztcbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgY10gPSBwaXhlbFtjXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzLCBkYXRhIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhlYXRtYXAgKGdyYXlzY2FsZSk6IHpbcm93XVtjb2xdID0gc2NhbGFyIHZhbHVlXG4gICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgZGF0YVt5ICogd2lkdGggKyB4XSA9IE1hdGgucm91bmQoekRhdGFbeV1beF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBjaGFubmVsczogMSwgZGF0YSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpb24gb2YgdGhlIG9yaWdpbmFsIGltYWdlIHRoYXQgdGhlIGRpc3BsYXllZCBgemAgZ3JpZCBjb3ZlcnMsIGluXG4gICAqIGZ1bGwtaW1hZ2UgcGl4ZWwgY29vcmRzLiBPbiBhIHNlcnZlciB6b29tIChgdHJpZ2dlclpvb21gKSB0aGUgdHJhY2UgYHpgIGlzXG4gICAqIHJlcGxhY2VkIHdpdGggdGhlIGhpZ2gtZGVmIGNyb3AgYW5kIHRoZSBheGVzIGFyZSByZWxhaWQgb3V0IHRvIHRoZSBjcm9wJ3NcbiAgICogb3JpZ2luYWwtaW1hZ2UgYm91bmRzIChgaW1hZ2VTaXplYCksIHNvIHRoZSBsaXZlIGF4aXMgcmFuZ2VzIEFSRSB0aGF0XG4gICAqIHJlY3RhbmdsZTsgd2hlbiB0aGUgd2hvbGUgaW1hZ2UgaXMgaW4gdmlldyB0aGUgcmFuZ2VzIHNwYW4gYHRydWVJbWdTaXplYC5cbiAgICogUmVhZGluZyB0aGUgcmFuZ2VzIHRoZXJlZm9yZSB5aWVsZHMgdGhlIGNyb3Agb3JpZ2luICsgZXh0ZW50IHdpdGhvdXRcbiAgICogdHJhY2tpbmcgem9vbSBzdGF0ZSBzZXBhcmF0ZWx5LiBGYWxscyBiYWNrIHRvIHRoZSBmdWxsIGltYWdlLCB0aGVuIGBudWxsYC5cbiAgICovXG4gIHB1YmxpYyBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBnZDogYW55ID0gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG4gICAgY29uc3QgeHI6IG51bWJlcltdIHwgdW5kZWZpbmVkID0gZ2Q/Ll9mdWxsTGF5b3V0Py54YXhpcz8ucmFuZ2U7XG4gICAgY29uc3QgeXI6IG51bWJlcltdIHwgdW5kZWZpbmVkID0gZ2Q/Ll9mdWxsTGF5b3V0Py55YXhpcz8ucmFuZ2U7XG4gICAgaWYgKHhyICYmIHlyKSB7XG4gICAgICBjb25zdCB4MCA9IE1hdGgubWluKHhyWzBdLCB4clsxXSk7XG4gICAgICBjb25zdCB5MCA9IE1hdGgubWluKHlyWzBdLCB5clsxXSk7IC8vIHkgYXhpcyBpcyByZXZlcnNlZCBmb3IgaW1hZ2UgbGF5b3V0c1xuICAgICAgcmV0dXJuIHsgeDogeDAsIHk6IHkwLCB3aWR0aDogTWF0aC5hYnMoeHJbMV0gLSB4clswXSksIGhlaWdodDogTWF0aC5hYnMoeXJbMV0gLSB5clswXSkgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRydWVJbWdTaXplKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy50cnVlSW1nU2l6ZVswXSxcbiAgICAgIHk6IHRoaXMudHJ1ZUltZ1NpemVbMl0sXG4gICAgICB3aWR0aDogdGhpcy50cnVlSW1nU2l6ZVsxXSAtIHRoaXMudHJ1ZUltZ1NpemVbMF0sXG4gICAgICBoZWlnaHQ6IHRoaXMudHJ1ZUltZ1NpemVbM10gLSB0aGlzLnRydWVJbWdTaXplWzJdLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgUGxvdGx5Lm5ld1Bsb3QodGhpcy5wbG90RGl2LCBbXSxcbiAgICAgICAgdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFswLCAxMDBdLCBbMTAwLCAwXSksIENPTkZJRyBhcyBhbnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSByZW1vdmUgUGxvdGx5J3MgRE9NIGZyb20gdGhlIHBsb3QgZGl2IChheGVzIGluY2x1ZGVkKS4gVXNlZCB3aGVuXG4gICAqIGhhbmRpbmcgdGhlIGRpdiB0byBhbm90aGVyIGJhY2tlbmQgKE9wZW5TZWFkcmFnb24pIOKAlCB1bmxpa2UgYHJlc2V0KClgLFxuICAgKiB3aGljaCByZS1yZW5kZXJzIGFuIGVtcHR5IHBsb3QgYW5kIHdvdWxkIGxlYXZlIHRoZSBQbG90bHkgYXhlcyBzaG93aW5nLlxuICAgKi9cbiAgcHVibGljIHB1cmdlUGxvdCgpIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICBQbG90bHkucHVyZ2UodGhpcy5wbG90RGl2KTtcbiAgICB9XG4gIH1cblxuICAvKiogRXhwb3J0IHRoZSBoZWF0bWFwIGFzIGEgUE5HICh0aGUgcmVuZGVyZWQgcGxvdCBhbHJlYWR5IHJlZmxlY3RzIHRoZSBhY3RpdmVcbiAgICogIGNvbG9ybWFwL3dpbmRvdykuIFRoZSBmdWxsLXJlcyB0aWxlIGNvbXBvc2l0ZSBpcyBPU0QncyBqb2IuICovXG4gIHB1YmxpYyBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kb3dubG9hZEltYWdlKCk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRJbWFnZSgpIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICAoUGxvdGx5IGFzIGFueSkuZG93bmxvYWRJbWFnZSh0aGlzLnBsb3REaXYsIHsgZm9ybWF0OiAncG5nJywgZmlsZW5hbWU6IHRoaXMuZmlsZU5hbWUgfHwgJ2ltYWdlJyB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXRBeGVzKCkge1xuICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gW107XG4gICAgdGhpcy5yZWxheW91dCgpO1xuICB9XG5cbiAgcHVibGljIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKSB7XG4gICAgdGhpcy5kcmFnTW9kZSA9IG1vZGUgPyAobW9kZSBhcyBzdHJpbmcpIDogJyc7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICAvLyBPbmx5IHJlbGF5b3V0IGEgTElWRSBQbG90bHkgZ3JhcGguIFdoZW4gYW5vdGhlciBiYWNrZW5kIChPU0QgLyBuYXBhcmktanMpIG93bnMgdGhlIHZpZXcgdGhlXG4gICAgLy8gZGl2IGlkIGlzIHN0aWxsIHNldCBidXQgaGFzIG5vIFBsb3RseSBwbG90IGF0dGFjaGVkLCBhbmQgUGxvdGx5LnJlbGF5b3V0IHRocm93c1xuICAgIC8vIChcImNhbid0IGFjY2VzcyBwcm9wZXJ0eSBfZ3VpRWRpdGluZywgbiBpcyB1bmRlZmluZWRcIikuIFRoYXQgdGhyb3cgYWJvcnRlZCB0aGUgY2FsbGVyXG4gICAgLy8gKGRlYWN0aXZhdGVBY3RpdmVUb29sIOKGkiBvblNlbGVjdFBsb3RUeXBlKSBiZWZvcmUgdGhlIHJlLXBsb3QgcmFuLCB3ZWRnaW5nIHRoZSBwbG90IHR5cGVcbiAgICAvLyAoZS5nLiBzdHVjayBzd2l0Y2hpbmcgbmFwYXJpIHZvbHVtZSDihpQgaXNvc3VyZmFjZSkuIEd1YXJkIG9uIGBfZnVsbExheW91dGAgbGlrZSB0aGUgem9vbVxuICAgIC8vIGhlbHBlcnMgZG8gc28gaXQgc2FmZWx5IG5vLW9wcyB3aGVuIFBsb3RseSBpc24ndCB0aGUgYWN0aXZlIHJlbmRlcmVyLlxuICAgIGNvbnN0IGdkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSBhcyB1bmtub3duIGFzIHsgX2Z1bGxMYXlvdXQ/OiB1bmtub3duIH0gfCBudWxsO1xuICAgIGlmICghZ2Q/Ll9mdWxsTGF5b3V0KSByZXR1cm47XG4gICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyBkcmFnbW9kZTogbW9kZSB9IGFzIGFueSk7XG4gIH1cblxuICAvKioge0BsaW5rIElEYXRhUmVuZGVyZXJ9IHN0dWIg4oCUIFBsb3RseSBoYXMgbm8gb3ZlcnZpZXcgbmF2aWdhdG9yIChpdCdzIGFuXG4gICAqICBPcGVuU2VhZHJhZ29uIGZlYXR1cmUpLCBzbyB0b2dnbGluZyBpdCBpcyBhIG5vLW9wIGhlcmUuICovXG4gIHB1YmxpYyBzZXROYXZpZ2F0b3JWaXNpYmxlKF92aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogbm8tb3A6IG5hdmlnYXRvciBpcyBPcGVuU2VhZHJhZ29uLW9ubHkgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSURhdGFSZW5kZXJlcn0gc3R1YiDigJQgaW1hZ2Ugc21vb3RoaW5nIGlzIGFuIE9wZW5TZWFkcmFnb24gY2FudmFzLWRyYXdlclxuICAgKiAgc2V0dGluZzsgdGhlIFBsb3RseSBpbWFnZS9oZWF0bWFwIHRyYWNlcyBkb24ndCBleHBvc2UgaXQsIHNvIGl0J3MgYSBuby1vcC4gKi9cbiAgcHVibGljIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChfZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIG5vLW9wOiBzbW9vdGhpbmcgdG9nZ2xlIGlzIE9wZW5TZWFkcmFnb24tb25seSAqL1xuICB9XG5cbiAgcHVibGljIHpvb21JbigpIHtcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGlmICghZ2Q/Ll9mdWxsTGF5b3V0KSByZXR1cm47XG4gICAgY29uc3QgeGwgPSBnZC5fZnVsbExheW91dC54YXhpcztcbiAgICBjb25zdCB5bCA9IGdkLl9mdWxsTGF5b3V0LnlheGlzO1xuICAgIC8vIDNEIHNjZW5lcyBoYXZlIG5vIDJEIHhheGlzL3lheGlzICh0aGV5IGxpdmUgdW5kZXIgYHNjZW5lYCk7IHRoZSBzdGVwLXpvb21cbiAgICAvLyBpcyBtZWFuaW5nbGVzcyB0aGVyZSBhbmQgd291bGQgdGhyb3cgb24gYHhsLnJhbmdlYC4gUGxvdGx5J3Mgc2NlbmUgaGFuZGxlc1xuICAgIC8vIHNjcm9sbC16b29tIG5hdGl2ZWx5LCBzbyBqdXN0IGJhaWwuXG4gICAgaWYgKCF4bD8ucmFuZ2UgfHwgIXlsPy5yYW5nZSkgcmV0dXJuO1xuICAgIGNvbnN0IHhjID0gKHhsLnJhbmdlWzBdICsgeGwucmFuZ2VbMV0pIC8gMjtcbiAgICBjb25zdCB5YyA9ICh5bC5yYW5nZVswXSArIHlsLnJhbmdlWzFdKSAvIDI7XG4gICAgY29uc3QgZHggPSAoeGwucmFuZ2VbMV0gLSB4bC5yYW5nZVswXSkgLyAxLjM7XG4gICAgY29uc3QgZHkgPSAoeWwucmFuZ2VbMV0gLSB5bC5yYW5nZVswXSkgLyAxLjM7XG4gICAgY29uc3QgeDAgPSB4YyAtIGR4IC8gMiwgeDEgPSB4YyArIGR4IC8gMjtcbiAgICBjb25zdCB5MCA9IHljIC0gZHkgLyAyLCB5MSA9IHljICsgZHkgLyAyO1xuICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gW3gwLCB4MSwgeTAsIHkxXTtcbiAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAneGF4aXMucmFuZ2VbMF0nOiB4MCwgJ3hheGlzLnJhbmdlWzFdJzogeDEsXG4gICAgICAneWF4aXMucmFuZ2VbMF0nOiB5MCwgJ3lheGlzLnJhbmdlWzFdJzogeTFcbiAgICB9IGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGV2ZXJ5IGN1cnJlbnRseSBzZWxlY3RlZCBzaGFwZS4gRmFsbHMgYmFjayB0byB0aGUgc2luZ2xlXG4gICAqIGBfYWN0aXZlU2hhcGVJbmRleGAgd2hlbiBubyBtdWx0aS1zZWxlY3Rpb24gaXMgYWN0aXZlIChjb3ZlcnMgdGhlIGNhc2VcbiAgICogd2hlcmUgUGxvdGx5IGNsaWNrZWQgYSBzaGFwZSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIHRhYmxlKS5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVBY3RpdmVTaGFwZSgpIHtcbiAgICAvLyBOb3RlOiBubyBgcGxvdERpdmAgZ3VhcmQg4oCUIHdoZW4gT3BlblNlYWRyYWdvbiBpcyB0aGUgcmVuZGVyZXIsIFBsb3RseVxuICAgIC8vIG5ldmVyIHBsb3R0ZWQgKHBsb3REaXYgaXMgdW5zZXQpLCBidXQgZGVsZXRpb24gb25seSBuZWVkcyB0aGUgc2hhcGUgbGlzdFxuICAgIC8vICsgdGhlIGN1cnJlbnQgc2VsZWN0aW9uOyB0aGUgUGxvdGx5IHJlbGF5b3V0IGJlbG93IGlzIGd1YXJkZWQuXG4gICAgY29uc3QgZ2Q6IGFueSA9IHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuXG4gICAgLy8gUmVzb2x2ZSB3aGF0IHRvIGRlbGV0ZTogdGhlIHN0b3JlJ3Mgc2VsZWN0aW9uLCBlbHNlIHRoZSBzaGFwZSBQbG90bHlcbiAgICAvLyB0cmFja3MgYXMgY2xpY2tlZCAod2hlbiB0aGUgdXNlciBjbGlja2VkIGEgc2hhcGUgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZVxuICAgIC8vIFJlZ2lvbiBFZGl0b3IgdGFibGUpLlxuICAgIGlmICh0aGlzLnJlZ2lvblN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBhY3RpdmVJbmRleDogbnVtYmVyID0gZ2Q/Ll9mdWxsTGF5b3V0Py5fYWN0aXZlU2hhcGVJbmRleDtcbiAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGFjdGl2ZUluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhbYWN0aXZlSW5kZXhdKTtcbiAgICB9XG4gICAgLy8gVGhlIHN0b3JlIHJlbW92ZXMgdGhlIHNlbGVjdGVkIHJlZ2lvbnMsIGNsZWFycyB0aGUgc2VsZWN0aW9uLCBzeW5jcyBpdHNcbiAgICAvLyBjYWNoZSBhbmQgZW1pdHMgdGhlIHJlZ2lvbi11cGRhdGUgZXZlbnQuXG4gICAgdGhpcy5yZWdpb25TdG9yZS5kZWxldGVBY3RpdmVTaGFwZSgpO1xuXG4gICAgLy8gUmUtcHJvamVjdCB0aGUgcmVtYWluaW5nIHJlZ2lvbnMgYW5kIHJlbmRlciBvbiB0aGUgUGxvdGx5IHBsb3QgKGEgbm8tb3AsXG4gICAgLy8gY2F1Z2h0LCB3aGVuIGFub3RoZXIgYmFja2VuZCBvd25zIHRoZSBkaXYg4oCUIGl0cyBvdmVybGF5IHJlLXJlbmRlcnMgdmlhXG4gICAgLy8gdGhlIHN0b3JlJ3MgdXBkYXRlIGV2ZW50KS5cbiAgICBpZiAoZ2Q/Ll9mdWxsTGF5b3V0KSBnZC5fZnVsbExheW91dC5fYWN0aXZlU2hhcGVJbmRleCA9IC0xO1xuICAgIHRoaXMuc3luY1NoYXBlc0Zyb21TdG9yZSgpO1xuICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMuc2hhcGVzLm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICAgIHRyeSB7XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7IHNoYXBlczogZGljdEFycmF5IH0gYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKGdkPy5fZnVsbExheW91dCkgKFBsb3RseSBhcyBhbnkpLnJlZHJhdyhnZCk7XG4gICAgICB9LCAoKSA9PiB7IC8qIGRpdiBub3QgYSBQbG90bHkgcGxvdCAqLyB9KTtcbiAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAqLyB9XG4gIH1cblxuICBwdWJsaWMgem9vbU91dCgpIHtcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGlmICghZ2Q/Ll9mdWxsTGF5b3V0KSByZXR1cm47XG4gICAgY29uc3QgeGwgPSBnZC5fZnVsbExheW91dC54YXhpcztcbiAgICBjb25zdCB5bCA9IGdkLl9mdWxsTGF5b3V0LnlheGlzO1xuICAgIC8vIDNEIHNjZW5lcyBoYXZlIG5vIDJEIHhheGlzL3lheGlzIOKAlCBzZWUgem9vbUluKCkuXG4gICAgaWYgKCF4bD8ucmFuZ2UgfHwgIXlsPy5yYW5nZSkgcmV0dXJuO1xuICAgIGNvbnN0IHhjID0gKHhsLnJhbmdlWzBdICsgeGwucmFuZ2VbMV0pIC8gMjtcbiAgICBjb25zdCB5YyA9ICh5bC5yYW5nZVswXSArIHlsLnJhbmdlWzFdKSAvIDI7XG4gICAgY29uc3QgZHggPSAoeGwucmFuZ2VbMV0gLSB4bC5yYW5nZVswXSkgKiAxLjM7XG4gICAgY29uc3QgZHkgPSAoeWwucmFuZ2VbMV0gLSB5bC5yYW5nZVswXSkgKiAxLjM7XG4gICAgY29uc3QgeDAgPSB4YyAtIGR4IC8gMiwgeDEgPSB4YyArIGR4IC8gMjtcbiAgICBjb25zdCB5MCA9IHljIC0gZHkgLyAyLCB5MSA9IHljICsgZHkgLyAyO1xuICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gW3gwLCB4MSwgeTAsIHkxXTtcbiAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAneGF4aXMucmFuZ2VbMF0nOiB4MCwgJ3hheGlzLnJhbmdlWzFdJzogeDEsXG4gICAgICAneWF4aXMucmFuZ2VbMF0nOiB5MCwgJ3lheGlzLnJhbmdlWzFdJzogeTFcbiAgICB9IGFzIGFueSk7XG4gIH1cblxuICBwdWJsaWMgaXNTdGFja0xvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgcHVibGljIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChzdGFja0xvYWRpbmcpO1xuICB9XG4gIHB1YmxpYyBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcyQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBDb2xvcm1hcCAvIHJldmVyc2Utc2NhbGUgLyBpbWFnZSBtZXRhZGF0YSBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkXG4gIC8vIFZpc3VhbGl6ZXJTdG9yZTsgdGhlc2UgZGVsZWdhdGUsIGtlZXBpbmcgb25seSB0aGUgUGxvdGx5LXNwZWNpZmljIGxpdmVcbiAgLy8gcmVzdHlsZSBhcyByZW5kZXIgZ2x1ZS5cbiAgZ2V0Q29sb3JtYXBPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENvbG9ybWFwT3B0aW9ucygpO1xuICB9XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBhbnkpIHtcbiAgICB0aGlzLnN0b3JlLnNldENvbG9ybWFwKGNvbG9ybWFwKTtcbiAgICB0cnkge1xuICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5wbG90RGl2LCB7ICdjb2xvcnNjYWxlJzogW2NvbG9ybWFwLmRhdGEudmFsdWVdIH0pO1xuICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kIChPU0QpIOKAlCBpdCByZWNvbG9ycyB2aWEgdGhlIExVVCAqLyB9XG4gIH1cbiAgZ2V0Q29sb3JtYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKTtcbiAgfVxuXG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNjYWxlOiBhbnkpIHtcbiAgICB0aGlzLnN0b3JlLnNldFJldmVyc2VTY2FsZShyZXZlcnNjYWxlKTtcbiAgICB0cnkge1xuICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5wbG90RGl2LCB7ICdyZXZlcnNlc2NhbGUnOiByZXZlcnNjYWxlIH0pO1xuICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kIChPU0QpIOKAlCBpdCByZWNvbG9ycyB2aWEgdGhlIExVVCAqLyB9XG4gIH1cblxuICBnZXRSZXZlcnNlU2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCk7XG4gIH1cblxuICBzZXRJbWFnZU1ldGEoaW1hZ2VNZXRhOiBJSW1hZ2VNZXRhZGF0YVtdKSB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbWFnZU1ldGEoaW1hZ2VNZXRhKTtcbiAgfVxuXG4gIGdldEltYWdlTWV0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbWFnZU1ldGEoKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhzaG93c3RhY2s6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXNob3dzdGFjaykge1xuICAgICAgdGhpcy56SW5kZXgubmV4dCgwKTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZUluZm8uc2hvd1N0YWNrID0gc2hvd3N0YWNrO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHNob3dzdGFjayk7XG4gICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyAnc2hvd3N0YWNrJzogc2hvd3N0YWNrIH0gYXMgYW55KTtcbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmF1dG9zY2FsZUV2ZW50LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gb2YgdGhlIGluZGljZXMgb2YgY3VycmVudGx5IHNlbGVjdGVkIHJlZ2lvbnMg4oCUIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgICogUmVnaW9uU3RvcmUgc28gdGhlIHNlbGVjdGlvbiBpcyBjb25zaXN0ZW50IGFjcm9zcyBiYWNrZW5kcyBhbmQgdGhlIFJlZ2lvblxuICAgKiBFZGl0b3IgdGFibGUuIEVtcHR5ID0gbm90aGluZyBzZWxlY3RlZC5cbiAgICovXG4gIGdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpOiBPYnNlcnZhYmxlPG51bWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSBzZWxlY3QgcmVnaW9ucyAob3IgY2xlYXIgd2l0aCBbXSkuIFRoZSBzaGFyZWQgc3RvcmUgb3duc1xuICAgKiB0aGUgc2VsZWN0aW9uIHN0YXRlICh2YWxpZGF0ZXMvZGVkdXBlcy9lbWl0cyk7IGhlcmUgd2UgYWRkaXRpb25hbGx5IHBvaW50XG4gICAqIFBsb3RseSdzIGBfYWN0aXZlU2hhcGVJbmRleGAgYXQgdGhlIGxhc3Qgc2VsZWN0ZWQgc2hhcGUgc28gaXQgZ2V0cyB0aGUgZWRpdFxuICAgKiBoYW5kbGVzLiBObyB2aXN1YWwgY2hhbmdlIHRvIG5vbi1hY3RpdmUgc2hhcGVzIOKAlCBQbG90bHkncyBvd24gYWN0aXZlLXNoYXBlXG4gICAqIHJlbmRlcmluZyBpcyB0aGUgb25seSBoaWdobGlnaHQuXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICBjb25zdCB2YWxpZCA9IChpbmRpY2VzIHx8IFtdKVxuICAgICAgLmZpbHRlcihpID0+IE51bWJlci5pc0Zpbml0ZShpKSAmJiBpID49IDAgJiYgaSA8IHRoaXMuc2hhcGVzLmxlbmd0aCk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGNvbnN0IGNsZWFuZWQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpIG9mIHZhbGlkKSB7XG4gICAgICBpZiAoIXNlZW4uaGFzKGkpKSB7IHNlZW4uYWRkKGkpOyBjbGVhbmVkLnB1c2goaSk7IH1cbiAgICB9XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgICBpZiAoZ2Q/Ll9mdWxsTGF5b3V0KSB7XG4gICAgICAgIGdkLl9mdWxsTGF5b3V0Ll9hY3RpdmVTaGFwZUluZGV4ID0gY2xlYW5lZC5sZW5ndGggPiAwID8gY2xlYW5lZFtjbGVhbmVkLmxlbmd0aCAtIDFdIDogLTE7XG4gICAgICAgIHRyeSB7IChQbG90bHkgYXMgYW55KS5yZWRyYXcoZ2QpOyB9IGNhdGNoIHsgLyogbm9vcCBpbiB0ZXN0cyAqLyB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoY2xlYW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGEgc3BlY2lmaWMgcmVnaW9uIChJUmVnaW9uU3RvcmUuc2VsZWN0UmVnaW9uKS4gU2V0cyB0aGUgc2hhcmVkIHN0b3JlXG4gICAqIHNlbGVjdGlvbiBieSBpZGVudGl0eSBhbmQgcG9pbnRzIFBsb3RseSdzIGFjdGl2ZS1zaGFwZSBhdCB0aGUgbWF0Y2hpbmdcbiAgICogcmVuZGVyZWQgc2hhcGUgc28gaXRzIGVkaXQgaGFuZGxlcyBhcHBlYXIuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLnNoYXBlcy5maW5kSW5kZXgocyA9PiBzLmlkID09PSByZWdpb24/LmlkKTtcbiAgICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgICAgaWYgKGdkPy5fZnVsbExheW91dCAmJiBpZHggPj0gMCkge1xuICAgICAgICBnZC5fZnVsbExheW91dC5fYWN0aXZlU2hhcGVJbmRleCA9IGlkeDtcbiAgICAgICAgdHJ5IHsgKFBsb3RseSBhcyBhbnkpLnJlZHJhdyhnZCk7IH0gY2F0Y2ggeyAvKiBub29wIGluIHRlc3RzICovIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBQbG90bHkncyBgX2FjdGl2ZVNoYXBlSW5kZXhgIGFuZCBwdXNoIGl0IGFzIHRoZSBzZWxlY3Rpb24uIENhbGxlZCBmcm9tXG4gICAqIHRoZSByZWxheW91dCBoYW5kbGVyIGFuZCB0aGUgcG9zdC1jbGljayB0aWNrIOKAlCBQbG90bHkgZG9lc24ndCBmaXJlIGFcbiAgICogZGVkaWNhdGVkIGFjdGl2ZS1zaGFwZSBldmVudCBmb3IgY2xpY2tzLCBzbyB3ZSBzYW1wbGUuIFRoZSBzdG9yZSBuby1vcHMgaWZcbiAgICogdGhlIHNlbGVjdGlvbiBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIG1heWJlRW1pdEFjdGl2ZVNoYXBlSW5kZXgoKSB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICBjb25zdCBnZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICBjb25zdCByYXcgPSBnZD8uX2Z1bGxMYXlvdXQ/Ll9hY3RpdmVTaGFwZUluZGV4O1xuICAgIGNvbnN0IGlkeCA9ICh0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyAmJiByYXcgPj0gMCAmJiByYXcgPCB0aGlzLnNoYXBlcy5sZW5ndGgpID8gcmF3IDogLTE7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpZHggPj0gMCA/IFtpZHhdIDogW10pO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuekluZGV4Lm5leHQoekluZGV4KTtcbiAgfVxuXG4gIGdldFNoYXBlQ29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICB9XG4gIGdldEZpbGxDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRGaWxsQ29sb3IoKTtcbiAgfVxuXG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gIH1cblxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBTdWJzY3JpcHRpb25zXG4gICAqL1xuICB1bnN1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy5pbWFnZUNhY2hlZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pbWFnZUNhY2hlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5maWxlbmFtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWdpb25VcGRhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlZ2lvbkxpdmVFZGl0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlZ2lvbkxpdmVFZGl0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoYW5uZWxTdWIpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMaXZlLWFwcGx5IHRoZSBjaGFubmVsIGRpc3BsYXkgd2luZG93ICh6bWluL3ptYXgpICsgcmV2ZXJzZS9pbnZlcnQgdG8gdGhlXG4gICAqICBoZWF0bWFwLiBOby1vcCB3aGVuIG5vIFBsb3RseSBwbG90IGlzIG1vdW50ZWQgKE9TRCBvd25zIHRoZSBkaXYpLiAqL1xuICBwcml2YXRlIGFwcGx5Q2hhbm5lbERpc3BsYXkoY2hhbm5lbHM6IGFueVtdLCByZXY6IGJvb2xlYW4sIGludjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgY2ggPSBjaGFubmVscz8uWzBdO1xuICAgIGNvbnN0IGNvbG9yc2NhbGUgPSB0aGlzLnN0b3JlLmN1cnJlbnRDb2xvcm1hcCgpPy5kYXRhPy52YWx1ZTtcbiAgICAvLyByZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wOyBib3RoIHRvZ2V0aGVyIGNhbmNlbC5cbiAgICBjb25zdCB1cGRhdGU6IGFueSA9IHsgcmV2ZXJzZXNjYWxlOiByZXYgIT09IGludiB9O1xuICAgIGlmIChjb2xvcnNjYWxlICE9IG51bGwpIHVwZGF0ZS5jb2xvcnNjYWxlID0gY29sb3JzY2FsZTsgLy8gbGl2ZSBjb2xvcm1hcCByZWNvbG9yXG4gICAgaWYgKGNoKSB7XG4gICAgICAvLyBTdXJmYWNlL2lzb3N1cmZhY2Uvc2NhdHRlcjNkIGNvbG91ci1tYXAgdmlhIGNtaW4vY21heDsgaGVhdG1hcC9jb250b3VyIHZpYSB6bWluL3ptYXguXG4gICAgICBjb25zdCB0aHJlZUQgPVxuICAgICAgICB0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFIHx8XG4gICAgICAgIHRoaXMucGxvdFR5cGUgPT09IFBsb3RUeXBlLlNVUkZBQ0UgfHxcbiAgICAgICAgdGhpcy5wbG90VHlwZSA9PT0gUGxvdFR5cGUuU0NBVFRFUjNEO1xuICAgICAgaWYgKHRocmVlRCkge1xuICAgICAgICB1cGRhdGUuY21pbiA9IGNoLm1pbjtcbiAgICAgICAgdXBkYXRlLmNtYXggPSBjaC5tYXg7XG4gICAgICAgIHVwZGF0ZS5jYXV0byA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXBkYXRlLnptaW4gPSBjaC5taW47XG4gICAgICAgIHVwZGF0ZS56bWF4ID0gY2gubWF4O1xuICAgICAgICB1cGRhdGUuemF1dG8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZXN0eWxlKHRoaXMucGxvdERpdiwgdXBkYXRlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIG5vdCBhIGNvbG91ci1tYXBwZWQgdHJhY2UsIG9yIE9TRCBvd25zIHRoZSBkaXYgKi9cbiAgICB9XG4gIH1cblxuICAvKiogQmlubmVkIGludGVuc2l0eSBoaXN0b2dyYW0gZm9yIGEgY2hhbm5lbCBmcm9tIHRoZSBjYWNoZWQgc291cmNlIGZyYW1lc1xuICAgKiAgKHJhdywgcHJlLUxVVCkuIEdyYXlzY2FsZSBjZWxscyBhcmUgbnVtYmVyczsgUkdCIGNlbGxzIGFyZSBbcixnLGJdLiAqL1xuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIF9iaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgZnJhbWVzID0gdGhpcy5jYWNoZWRJbWFnZUZyYW1lcztcbiAgICBpZiAoIWZyYW1lcz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBmcmFtZSA9IGZyYW1lc1t0aGlzLmFjdGl2ZUZyYW1lSW5kZXgoKV0gPz8gZnJhbWVzWzBdO1xuICAgIGlmICghZnJhbWU/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY291bnRzID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBmcmFtZSkge1xuICAgICAgaWYgKCFyb3cpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykge1xuICAgICAgICBsZXQgdjogbnVtYmVyO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjZWxsKSkge1xuICAgICAgICAgIHYgPSBjaGFubmVsSW5kZXggPj0gMCAmJiBjaGFubmVsSW5kZXggPCBjZWxsLmxlbmd0aFxuICAgICAgICAgICAgPyBjZWxsW2NoYW5uZWxJbmRleF1cbiAgICAgICAgICAgIDogTWF0aC5yb3VuZChidDYwMUx1bWluYW5jZShjZWxsWzBdLCBjZWxsWzFdLCBjZWxsWzJdKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdiA9IGNlbGw7XG4gICAgICAgIH1cbiAgICAgICAgdiA9IHYgfCAwO1xuICAgICAgICBpZiAodiA8IDApIHYgPSAwOyBlbHNlIGlmICh2ID4gMjU1KSB2ID0gMjU1O1xuICAgICAgICBjb3VudHNbdl0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpc3RvZ3JhbTI1Nihjb3VudHMpO1xuICB9XG5cbiAgLyoqIEFzeW5jIGhpc3RvZ3JhbSBzdHJlYW0g4oCUIFBsb3RseSByZW5kZXJzIGhlYXRtYXAgZnJhbWUgZGF0YSAoYWxyZWFkeSBpblxuICAgKiAgbWVtb3J5LCA4LWJpdCBsdW1pbmFuY2UpLCBzbyB0aGlzIGp1c3Qgd3JhcHMgdGhlIHN5bmNocm9ub3VzIDgtYml0XG4gICAqICBoaXN0b2dyYW0uIE5hdGl2ZSAxNi1iaXQgaGlzdG9ncmFtcyBvbmx5IGFwcGx5IHRvIHRoZSBPU0QgdGlsZSBwYXRoLiAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIG9mKHRoaXMuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucykpO1xuICB9XG5cbiAgLyoqIERhdGEgZXhwb3J0ICgxNi1iaXQgVElGRikgaXMgYW4gT1NELXRpbGUtcGF0aCBmZWF0dXJlIGJhY2tlZCBieSB0aGUgc2VydmVyLlxuICAgKiAgUGxvdGx5IHJlbmRlcnMgaGVhdG1hcHMgZnJvbSBmcmFtZSBkYXRhLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZXhwb3J0IGhlcmUuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgY29uc29sZS53YXJuKCdbcGxvdGx5XSAxNi1iaXQgZGF0YSBleHBvcnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGhlYXRtYXAgYmFja2VuZC4nKTtcbiAgfVxuXG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnBsb3RVdGlsaXRpZXMuaW1wb3J0Uk9Jc0Zyb21HZW9Kc29uKGdlb0pzb25TdHIpO1xuICB9XG5cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSkge1xuICAgIGNvbnN0IGpzb25TdHJpbmcgPSB0aGlzLnBsb3RVdGlsaXRpZXMuZXhwb3J0Uk9Jc1RvR2VvSnNvbihyZWdpb25zKTtcbiAgICB0aGlzLnBsb3RVdGlsaXRpZXMuc2F2ZVRvRmlsZShqc29uU3RyaW5nLCB0aGlzLmZpbGVOYW1lKTtcbiAgfVxuXG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsb3RVdGlsaXRpZXMuZXhwb3J0Uk9Jc1RvR2VvSnNvbihyZWdpb25zKTtcbiAgfVxuXG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrTG9hZGluZ1Byb2dyZXNzJCgpO1xuICB9XG5cbiAgaXNTdGFja0xvYWRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdGFja0xvYWRpbmckKCk7XG4gIH1cblxufVxuIl19
2138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdGx5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sS0FBSyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWhDLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFnQixhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQW1CLGVBQWUsRUFBZ0IsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RyxP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Q0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSztlQUMxQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWpGLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO1FBQ2hGLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7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QUFhLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFpQjtRQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQWlCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNoQyxDQUFDOzhHQXJwRVUsYUFBYSxrQkE4SEosZ0JBQWdCLGFBQ2hCLGdCQUFnQixzUUFRSixjQUFjO2tIQXZJbkMsYUFBYSxjQUZaLE1BQU07OzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkErSGMsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUN2QixNQUFNOzJCQUFDLGdCQUFnQjs7MEJBUXZCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0ICogYXMgUGxvdGx5IGZyb20gJ3Bsb3RseS5qcy1kaXN0LW1pbic7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQb2x5Z29uLCBSZWN0YW5nbGUsIFJlZ2lvbiB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IElJbWFnZUluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFRpbGVBY2Nlc3NQb3J0LCBUSUxFX0FDQ0VTU19QT1JUIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgSW1hZ2VTdGF0ZVBvcnQsIElNQUdFX1NUQVRFX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvaW1hZ2Utc3RhdGUucG9ydCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIEVNUFRZLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFNoYXBlU2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NoYXBlJztcbmltcG9ydCB7IENPTkZJRywgQ09ORklHX1NVUkZBQ0UsIFBsb3RVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi9wbG90LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBXYW5kU2VydmljZSwgV2FuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlZEltYWdlRGF0YSwgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtVG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxsLXNlZ21lbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyLCBDRUxMX1NFR01FTlRFUiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgeyBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSwgVmVydGV4RXJhc2VyVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVRvQm94VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBwYXJzZVN2Z1BhdGhQb2x5Z29uLFxuICB2ZXJ0aWNlc1RvU3ZnUGF0aCxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlb21ldHJ5JztcbmltcG9ydCB7IFBsb3RUeXBlLCBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgUExPVExZX1BMT1RfVFlQRV9JTVBMUyxcbiAgUGxvdGx5UGxvdFR5cGVJbXBsLFxuICBUcmFjZUJ1aWxkSW5wdXQsXG59IGZyb20gJy4vcGxvdGx5LXRyYWNlLWJ1aWxkZXJzJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBJbnRlbnNpdHlQcm9maWxlLCBJSXNvc3VyZmFjZUNvbnRyb2xzLCBJSW50ZW5zaXR5Q29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidDYwMUx1bWluYW5jZSwgaGlzdG9ncmFtMjU2IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5pbXBvcnQgeyBWaWV3ZXJDYXBhYmlsaXRpZXMsIFZpZXdlckZlYXR1cmUsIGNhcGFiaWxpdGllc09mIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBQbG90bHlSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9wbG90bHktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgSUNvb3JkaW5hdGVUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgUGxvdGx5Q29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4vcGxvdGx5LWNvb3JkaW5hdGUtdHJhbnNmb3JtJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFZJWl9BTEVSVF9UT0FTVF9LRVkgfSBmcm9tICcuLi8uLi90b2FzdC1vdXRsZXRzJztcblxuLy8gUmUtZXhwb3J0ZWQgc28gZXhpc3RpbmcgY29uc3VtZXJzIGNhbiBrZWVwIGltcG9ydGluZyBQbG90VHlwZSBmcm9tIHRoaXNcbi8vIG1vZHVsZSB3aGlsZSBpdCBwaHlzaWNhbGx5IGxpdmVzIGluIHRoZSBiYWNrZW5kLW5ldXRyYWwgY29udHJhY3RzLyBkaXIuXG4vLyBUT0RPKHBsb3R0aW5nLWFic3RyYWN0aW9uKTogb25jZSBhbGwgY29uc3VtZXJzIGltcG9ydCBmcm9tXG4vLyAnLi9jb250cmFjdHMvcGxvdC10eXBlJyBkaXJlY3RseSwgZHJvcCB0aGlzIHJlLWV4cG9ydC5cbmV4cG9ydCB7IFBsb3RUeXBlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5cblxuKHdpbmRvdyBhcyBhbnkpLkJ1ZmZlciA9IEJ1ZmZlcjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGxvdGx5U2VydmljZSBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcblxuICAvKipcbiAgICogUGxvdGx5IGlzIHRoZSBmdWxsLWZlYXR1cmVkIGRhdGEgYmFja2VuZDogaXQgc3VwcG9ydHMgZXZlcnkgZmVhdHVyZSxcbiAgICogaW5jbHVkaW5nIDNEIHNjZW5lcywgbGl2ZSBzY2FsYXIgY29sb3JtYXBzLCBwaXhlbCByZWFkYmFjayBhbmQgdGhlXG4gICAqIHNlcnZlci1zaWRlIGhpZ2gtZGVmIHpvb20gcmUtZmV0Y2guIChPcGVuU2VhZHJhZ29uJ3Mgc3R1YiBhZHZlcnRpc2VzIG9ubHlcbiAgICogaW1hZ2UgZGlzcGxheS4pXG4gICAqL1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc09mKFtcbiAgICBWaWV3ZXJGZWF0dXJlLkltYWdlRGlzcGxheSxcbiAgICBWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRCxcbiAgICBWaWV3ZXJGZWF0dXJlLlNjYWxhckNvbG9ybWFwLFxuICAgIFZpZXdlckZlYXR1cmUuUGl4ZWxSZWFkYmFjayxcbiAgICBWaWV3ZXJGZWF0dXJlLkhpZ2hEZWZab29tLFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlLFxuICBdKTtcblxuICBwcml2YXRlIHNoYXBlczogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBwcmV2aW91c1NoYXBlczogU2hhcGVTZWxlY3Rpb25bXSA9IFtdO1xuICBwcml2YXRlIGlzUmVnaW9uU2F2ZWRPbiA9IHRydWU7XG4gIHByaXZhdGUgaW1hZ2VMZW5ndGghOiBudW1iZXI7XG4gIHByaXZhdGUgc2NyZWVuSGVpZ2h0ITogbnVtYmVyO1xuICBwcml2YXRlIHBsb3REaXYhOiBzdHJpbmc7XG4gIHByaXZhdGUgaXNSZWFsWm9vbSA9IHRydWU7XG4gIHByaXZhdGUgc2NhbGVyYXRpbyA9IHRydWU7XG4gIHByaXZhdGUgdHJ1ZUltZ1NpemUhOiBudW1iZXJbXTtcbiAgcHJpdmF0ZSB6b29tQ29vcmRpbmF0ZXM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZmlsZU5hbWUhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBkcmFnTW9kZSE6IHN0cmluZztcbiAgLy8gUmVnaW9uIGRhdGEgKHRoZSBsaXN0ICsgcGVyLWltYWdlIGNhY2hlKSwgc2VsZWN0aW9uLCBpZCBtaW50aW5nLCB0aGUgcmVnaW9uXG4gIC8vIHVwZGF0ZSBldmVudCBhbmQgdGhlIHNoYXBlIGNvbG91ci9sYWJlbCBwcmVmcyBub3cgbGl2ZSBpbiB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIChpbmplY3RlZCBhcyBgdGhpcy5yZWdpb25TdG9yZWApIOKAlCB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICAvLyBib3RoIGJhY2tlbmRzIGRlbGVnYXRlIHRvLiBgdGhpcy5zaGFwZXNgIGJlbG93IGlzIGtlcHQgYXMgUGxvdGx5J3MgKnJlbmRlclxuICAvLyBwcm9qZWN0aW9uKiBvZiB0aG9zZSByZWdpb25zICh0aGUgZGljdCBhcnJheSBQbG90bHkucmVsYXlvdXQgY29uc3VtZXMpIGFuZFxuICAvLyBpcyBtaXJyb3JlZCBpbnRvIHRoZSBzdG9yZSBvbiBldmVyeSB3cml0ZS4gQ29sb3JtYXAsIHJldmVyc2Utc2NhbGUsIGltYWdlXG4gIC8vIG1ldGFkYXRhIGFuZCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmVcbiAgLy8gKGluamVjdGVkIGFzIGB0aGlzLnN0b3JlYCkuXG4gIHByaXZhdGUgdXJscyE6IHN0cmluZ1tdO1xuICBpbWFnZUluZm8hOiBJSW1hZ2VJbmZvO1xuICBwcml2YXRlIHBsb3RVdGlsaXRpZXMgPSBuZXcgUGxvdFV0aWxpdGllcygpO1xuICBwcml2YXRlIHBsb3RUeXBlITogUGxvdFR5cGU7XG5cbiAgcHJpdmF0ZSBvblBsb3RNb3VzZURvd246ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChyZWdpb25zQnlJbWFnZUtleS9jdXJyZW50SW1hZ2VLZXkpIG5vdyBsaXZlcyBpblxuICAvLyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlOyBzZXRBY3RpdmVJbWFnZSgpIGRlbGVnYXRlcyB0byBpdCBhbmQgcmUtcHJvamVjdHNcbiAgLy8gYHRoaXMuc2hhcGVzYCBmcm9tIHRoZSBzdG9yZSBhZnRlcndhcmRzLlxuXG4gIC8qKiBQaXhlbCBkYXRhIGNhY2hlZCBmb3Igd2FuZCBzYW1wbGluZy4gZGF0YVt6SW5kZXhdIGlzIGEgMi1EIG1hdHJpeC4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZUZyYW1lcz86IGFueVtdO1xuICBwcml2YXRlIGNhY2hlZEltYWdlV2lkdGggPSAwO1xuICBwcml2YXRlIGNhY2hlZEltYWdlSGVpZ2h0ID0gMDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVJhdGlvczogbnVtYmVyW10gPSBbMSwgMV07XG4gIHByaXZhdGUgY2FjaGVkSXNHcmF5c2NhbGUgPSBmYWxzZTtcbiAgLyoqIERhdGEtc3BhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY2FjaGVkIGZyYW1lJ3MgcGl4ZWwgKDAsMCkuIFswLDBdIGZvciB0aGUgZnVsbFxuICAgKiAgaW1hZ2U7IGEgY3JvcCdzIHRvcC1sZWZ0IHdoZW4gem9vbWVkIChzbyB0aGUgaW50ZW5zaXR5IHByb2ZpbGUgc2FtcGxlcyB0aGVcbiAgICogIHpvb20tbGV2ZWwgcGl4ZWxzIGF0IHRoZSByaWdodCBvZmZzZXQvcmVzb2x1dGlvbikuICovXG4gIHByaXZhdGUgY2FjaGVkRnJhbWVPcmlnaW46IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gIC8qKiBMYXN0IHZpc2libGUgaW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlIGZyb20gdGhlIGFjdGl2ZSBiYWNrZW5kJ3Mgdmlld3BvcnQgKHNldCBieVxuICAgKiAgdGhlIE9TRCB2aWV3cG9ydC1jaGFuZ2UgaG9vayB2aWEgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKS4gTmV3IHByb2ZpbGUgbGluZXMgYXJlXG4gICAqICBwbGFjZWQgd2l0aGluIGl0IHNvIHRoZXkgbGFuZCBvbi1zY3JlZW4gd2hlbiB6b29tZWQgaW47IG51bGwg4oaSIHVzZSBmdWxsIGltYWdlLiAqL1xuICBwcml2YXRlIGxhc3RWaXNpYmxlUm9pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIGV2ZW50cyAqL1xuICBwcml2YXRlIG9uUmVsYXlvdXRFdmVudDogYW55O1xuXG4gIHByaXZhdGUgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgLy8gY3VycmVudCBpbmRleCBvZiBpbWFnZSBpbiBzdGFjayAoaWYgc3RhY2spLCAwIGlmIHNpbmdsZSBpbWFnZVxuICBwcml2YXRlIHpJbmRleCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBhdXRvc2NhbGVFdmVudCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgLy8gVGhlIHJlZ2lvbiB1cGRhdGUgZXZlbnQgYW5kIHNlbGVjdGlvbiBzdHJlYW0gYXJlIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmU7IGdldFJlZ2lvblVwZGF0ZUV2ZW50KCkvZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkgZGVsZWdhdGUgdG9cbiAgLy8gaXQgc28gZXZlcnkgY29uc3VtZXIgKGFuZCB0aGUgT1NEIGJhY2tlbmQpIHNlZXMgb25lIHN0cmVhbS5cbiAgLyoqIEJyaWdodCwgd2VsbC1zZXBhcmF0ZWQgY29sb3VycyBjeWNsZWQgYXMgdGhlIHVzZXIgYWRkcyBwcm9maWxlLWxpbmUgUk9Jcy5cbiAgICogIFRoZSBtYXRjaGluZyBpbnNldCB0cmFjZSBpcyBkcmF3biBpbiB0aGUgc2FtZSBjb2xvdXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgUFJPRklMRV9QQUxFVFRFID0gW1xuICAgICcjRkZENDAwJywgLy8geWVsbG93XG4gICAgJyMwMEU1RkYnLCAvLyBjeWFuXG4gICAgJyNGRjJEOTUnLCAvLyBtYWdlbnRhXG4gICAgJyMzOUZGMTQnLCAvLyBncmVlblxuICAgICcjRkY5NTAwJywgLy8gb3JhbmdlXG4gICAgJyM3QzRERkYnLCAvLyB2aW9sZXRcbiAgICAnI0ZGM0IzMCcsIC8vIHJlZFxuICAgICcjMThGRkZGJywgLy8gYXF1YVxuICBdO1xuICAvKiogUGFsZXR0ZSBjdXJzb3IgZm9yIHByb2ZpbGUgbGluZXMgKG5ldmVyIHJlc2V0IG9uIGRlbGV0ZSwgc28gY29sb3VycyBrZWVwXG4gICAqICBjeWNsaW5nIGFjcm9zcyB0aGUgc2Vzc2lvbikuICovXG4gIHByaXZhdGUgcHJvZmlsZUNvbG9yU2VxID0gMDtcbiAgcHJpdmF0ZSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgLyoqIElTT1NVUkZBQ0UgYmFuZCBhcyBhIDDigJMyNTUgc2xpZGVyIHBvc2l0aW9uLCBtYXBwZWQgb250byB0aGUgdm9sdW1lJ3MgcmVhbFxuICAgKiAgaW50ZW5zaXR5IHJhbmdlIGF0IHJlbmRlciB0aW1lIChzZWUgbWFwSXNvQmFuZCkuIERlZmF1bHRzIHRvIHRoZSBmdWxsIHJhbmdlXG4gICAqICBzbyB0aGUgZmlyc3QgcmVuZGVyIHNob3dzIHRoZSB3aG9sZSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiBob3cgYnJpZ2h0IG9yXG4gICAqICBkYXJrIHRoZSB2b2x1bWUgaXM7IHRoZSB1c2VyIHRoZW4gbmFycm93cyB0aGUgYmFuZCB0byBpc29sYXRlIGludGVuc2l0aWVzLiAqL1xuICBwcml2YXRlIGlzb01pbiA9IDA7XG4gIHByaXZhdGUgaXNvTWF4ID0gMjU1O1xuICAvKiogQWN0dWFsIGludGVuc2l0eSByYW5nZSBvZiB0aGUgdm9sdW1lIG9uIHNjcmVlbiAoW21pbixtYXhdIG92ZXIgdGhlIGxvYWRlZFxuICAgKiAgZnJhbWVzKS4gVGhlIHNsaWRlciBzcGFucyAw4oCTMjU1LCBidXQgYSBnaXZlbiBzdGFjayBvZnRlbiBvY2N1cGllcyBvbmx5IGFcbiAgICogIHN1Yi1yYW5nZSwgc28gd2UgY2xhbXAgdGhlIGlzbyBiYW5kIGludG8gdGhpcyByYW5nZSAod2l0aCBhIHNtYWxsIG1hcmdpbilcbiAgICogIHRvIGd1YXJhbnRlZSBub24tZGVnZW5lcmF0ZSBzdXJmYWNlcyDigJQgYm90aCBvbiBmaXJzdCByZW5kZXIgYW5kIG9uIGxpdmVcbiAgICogIHNsaWRlciBtb3Zlcy4gTnVsbCB1bnRpbCBhbiBpc29zdXJmYWNlIHZvbHVtZSBoYXMgYmVlbiBtZWFzdXJlZC4gKi9cbiAgcHJpdmF0ZSBpc29EYXRhUmFuZ2U6IFtudW1iZXIsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgLy8gSWQgbWludGluZyBhbmQgdGhlIHNlbGVjdGlvbiBpbmRleCBzdHJlYW0gYXJlIG93bmVkIGJ5IHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUuIFNlbGVjdGlvbiBzdGlsbCBkcml2ZXMgUGxvdGx5J3MgYF9hY3RpdmVTaGFwZUluZGV4YCAoc28gYVxuICAvLyBzaW5nbGUgc2hhcGUgZ2V0cyB0aGUgZWRpdCBoYW5kbGVzKSDigJQgc2VlIHNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKCkuXG4gIHByaXZhdGUgaW1hZ2VDYWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZpbGVuYW1lU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIC8qKiBEcml2ZXMgdGhlIGludGVuc2l0eSBpbnNldCBvZmYgcmVnaW9uIGFkZHMvZHJhZ3MvZGVsZXRlcyAoYm90aCBiYWNrZW5kcykuICovXG4gIHByaXZhdGUgcmVnaW9uVXBkYXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAvKiogTGl2ZSAocGVyLWZyYW1lLCBub24tY29hbGVzY2VkKSByZWdpb24gZWRpdHMg4oCUIHNvIHRoZSBpbnNldCB0cmFja3MgYW4gT1NEXG4gICAqICBsaW5lIFJPSSBsaXZlIGR1cmluZyBhIGRyYWcgKE9TRCBiYXRjaGVzIHJlZ2lvblVwZGF0ZSQgdW50aWwgcmVsZWFzZSkuICovXG4gIHByaXZhdGUgcmVnaW9uTGl2ZUVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY2hhbm5lbFN1Yj86IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIHdhbmRIb3N0ITogV2FuZFRvb2xIb3N0O1xuICBwcml2YXRlIGVyYXNlckhvc3QhOiBWZXJ0ZXhFcmFzZXJUb29sSG9zdDtcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAobGF6aWx5IGNyZWF0ZWQgaW4gZ2V0UmVnaW9uT3ZlcmxheSkuICovXG4gIHByaXZhdGUgcmVnaW9uT3ZlcmxheT86IElSZWdpb25PdmVybGF5O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvb3JkaW5hdGVUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtID1cbiAgICBuZXcgUGxvdGx5Q29vcmRpbmF0ZVRyYW5zZm9ybShcbiAgICAgICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdiksXG4gICAgICAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSk7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICAgICAgICAgICAgQEluamVjdChJTUFHRV9TVEFURV9QT1JUKSBwcml2YXRlIHN0YXRlOiBJbWFnZVN0YXRlUG9ydCxcbiAgICAgICAgICAgICAgcHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIHdhbmRTZXJ2aWNlOiBXYW5kU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGJydXNoVG9vbDogQnJ1c2hUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB2ZXJ0ZXhFcmFzZXJUb29sOiBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlZ2lvblN0b3JlOiBSZWdpb25TdG9yZSkge1xuICAgIC8vIHJlbGF5b3V0IGV2ZW50IHJvdXRlclxuICAgIHRoaXMub25SZWxheW91dEV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHsgdGhpcy5yZWxheW91dEV2ZW50SGFuZGxlcihldmVudCk7IH07XG5cbiAgICAvLyBUb29sIHNlcnZpY2VzIHJlYWQvbXV0YXRlIG91ciBzdGF0ZSB2aWEgc21hbGwgKkhvc3QgaW50ZXJmYWNlcy4gU3RvcmVkXG4gICAgLy8gc28gd2UgY2FuIHJlLWJpbmQgdGhlbSB0byBvdXJzZWx2ZXMgd2hlbmV2ZXIgYSBQbG90bHkgdG9vbCBpcyBhY3RpdmF0ZWRcbiAgICAvLyAodGhlIE9wZW5TZWFkcmFnb24gYmFja2VuZCByZS1iaW5kcyB0aGUgc2FtZSBzaW5nbGV0b24gdG9vbHMgdG8gaXRzZWxmKS5cbiAgICB0aGlzLndhbmRIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VEYXRhOiAoKSA9PiB0aGlzLmdldENhY2hlZEltYWdlRGF0YSgpLFxuICAgICAgZ2V0QWN0aXZlRnJhbWVJbmRleDogKCkgPT4gdGhpcy5hY3RpdmVGcmFtZUluZGV4KCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMuZmlsZU5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybSgpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1swXSB8fCAxLFxuICAgIH07XG4gICAgdGhpcy53YW5kVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICAvLyBUaGUgYnJ1c2ggcmV1c2VzIHRoZSB3YW5kIGhvc3QgKHNhbWUgY29vcmRpbmF0ZSBmcmFtZSArIHJlZ2lvbiBhY2Nlc3MpLlxuICAgIHRoaXMuYnJ1c2hUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMudmVydGV4RXJhc2VyVG9vbC5iaW5kSG9zdCh0aGlzLmVyYXNlckhvc3QpO1xuICAgIHRoaXMuYmluZFpvb21Ub0JveEhvc3QoKTtcblxuICAgIHRoaXMuaW1hZ2VDYWNoZWRTdWJzY3JpcHRpb24gPSB0aGlzLnN0YXRlLmlzSW1hZ2VDYWNoZWQkKCkuc3Vic2NyaWJlKGltYWdlQ2FjaGVkID0+IHtcbiAgICAgIHRoaXMuaW1hZ2VDYWNoZWQgPSBpbWFnZUNhY2hlZDtcbiAgICB9KTtcbiAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZS5nZXRGaWxlbmFtZSQoKS5zdWJzY3JpYmUoZmlsZW5hbWUgPT4ge1xuICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVuYW1lO1xuICAgIH0pO1xuICAgIC8vIExpdmUgcmVjb2xvciBmcm9tIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lOiByZXN0eWxlIHRoZSBkaXNwbGF5IHdpbmRvdyAoem1pbi96bWF4IGZvclxuICAgIC8vIGEgaGVhdG1hcCwgY21pbi9jbWF4IGZvciBpc29zdXJmYWNlL3N1cmZhY2UpLCB0aGUgY29sb3JzY2FsZSAoY29sb3JtYXApLCBhbmQgcmV2ZXJzZS9pbnZlcnRcbiAgICAvLyB3aGVuIHRoZSBjaGFubmVsIHN0YXRlIE9SIHRoZSBjb2xvcm1hcCBjaGFuZ2VzLiAoR2FtbWEgaXMgYXBwbGllZCBieSB0aGUgT1NEIGltYWdlIHZpZXc7IHRoZVxuICAgIC8vIFBsb3RseSBjb2xvcnNjYWxlIHdpbmRvdyBjb3ZlcnMgdGhlIGNvbW1vbiBjb250cmFzdCBjYXNlLilcbiAgICB0aGlzLmNoYW5uZWxTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY2hhbm5lbHMsIHJldiwgaW52XSkgPT4gdGhpcy5hcHBseUNoYW5uZWxEaXNwbGF5KGNoYW5uZWxzLCByZXYsIGludikpO1xuICAgIC8vIFByb2ZpbGUgbGluZXMgYXJlIHN0b3JlIHJlZ2lvbnM7IGFueSByZWdpb24gY2hhbmdlIChhZGQvZHJhZy9kZWxldGUsIG9uXG4gICAgLy8gZWl0aGVyIGJhY2tlbmQpIHNob3VsZCByZWZyZXNoIHRoZSBpbnNldCB0cmFjZXMuIFRoZSBsaXZlLWVkaXQgc3RyZWFtXG4gICAgLy8gZmlyZXMgcGVyIGZyYW1lIGR1cmluZyBhIGRyYWcgKE9TRCBjb2FsZXNjZXMgcmVnaW9uVXBkYXRlJCB1bnRpbCByZWxlYXNlKSxcbiAgICAvLyBzbyB0aGUgaW5zZXQgdHJhY2tzIGFuIE9TRCBsaW5lIFJPSSBsaXZlIGFzIGl0J3MgbW92ZWQuXG4gICAgdGhpcy5yZWdpb25VcGRhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpb25MaXZlRWRpdFN1YnNjcmlwdGlvbiA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uTGl2ZUVkaXQkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgICByZXR1cm4ge1xuICAgICAgIHdpZHRoOiB0aGlzLnRydWVJbWdTaXplWzFdIC0gdGhpcy50cnVlSW1nU2l6ZVswXSxcbiAgICAgICBoZWlnaHQ6IHRoaXMudHJ1ZUltZ1NpemVbM10gLSB0aGlzLnRydWVJbWdTaXplWzJdLFxuICAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgaW1hZ2VcbiAgICogQHBhcmFtIGltYWdlSW5mb1xuICAgKiBAcGFyYW0gekluZGV4IGluZGV4IG9mIHRoZSBpbWFnZSB0byBsb2FkXG4gICAqIEByZXR1cm4gYW4gb2JqZWN0IHdpdGggZGF0YSBhbmQgcmF0aW8ga2V5c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHVybHMgPSBpbWFnZUluZm8udXJscztcbiAgICAvLyB1c2UgekluZGV4IHByb3ZpZGVkIGlmIGFueSwgMCBvdGhlcndpc2VcbiAgICBsZXQgaW1hZ2VVcmw7XG4gICAgaWYgKHpJbmRleCkge1xuICAgICAgaW1hZ2VVcmwgPSB1cmxzW3pJbmRleF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlVXJsID0gdXJsc1swXTtcbiAgICB9XG4gICAgY29uc3QgaXNHcmF5c2NhbGUgPSBpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZShpbWFnZVVybCk7XG4gICAgY29uc3QgeFJhdGlvID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemVbMF0gLyBpbWFnZS53aWR0aDtcbiAgICBjb25zdCB5UmF0aW8gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXSAvIGltYWdlLmhlaWdodDtcblxuICAgIGNvbnN0IHRydWVJbWFnZVNpemUgPSBbXTtcbiAgICAvLyBbeDAsIHgxLCB5MCwgeTFdXG4gICAgdHJ1ZUltYWdlU2l6ZVswXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVsxXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzBdO1xuICAgIHRydWVJbWFnZVNpemVbMl0gPSAwO1xuICAgIHRydWVJbWFnZVNpemVbM10gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXTtcbiAgICB0aGlzLnRydWVJbWdTaXplID0gdHJ1ZUltYWdlU2l6ZTtcbiAgICB0aGlzLmZpbGVOYW1lID0gaW1hZ2VJbmZvLmZpbGVOYW1lO1xuICAgIGlmIChpbWFnZUluZm8uaXNTdGFjayAmJiBpbWFnZUluZm8uc2hvd1N0YWNrKSB7XG4gICAgICBjb25zdCBpbWFnZXM6IGFueVtdID0gW107XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgICAgLy8gT25lIFVSTCBwZXIgc2xpY2Ug4oCUIGxvYWQgdGhlbSBhbGwgKGVhcmxpZXIgYGxlbmd0aC0xYCBkcm9wcGVkIHRoZSBsYXN0KS5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zb2xlLmxvZyhgaW1hZ2Ugc3RhY2sgJHtpfWApO1xuICAgICAgICAvLyBkbyBub3Qga2VlcCB3aXRoIGxvYWRpbmcgaWYgZmlsZW5hbWUgaXMgZGlmZmVyZW50IChhIG5ldyBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkKVxuICAgICAgICAvLyBvciBpZiB0aGUgc3RhY2tMb2FkaW5nIHZhbHVlIGlzIHNldCB0byBmYWxzZVxuICAgICAgICBpZiAodGhpcy5maWxlTmFtZSA9PT0gaW1hZ2VJbmZvLmZpbGVOYW1lICYmIHRoaXMuc3RhY2tMb2FkaW5nJC52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2UodXJsc1tpXSk7XG4gICAgICAgICAgaWYgKGlzR3JheXNjYWxlKSB7XG4gICAgICAgICAgICBjb25zdCBncmV5ID0gaW1hZ2UuZ3JleSgpO1xuICAgICAgICAgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMucGxvdFV0aWxpdGllcy5hcnJheVRvTWF0cml4KEFycmF5LmZyb20oZ3JleS5kYXRhKSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgICAgICAgaW1hZ2VzLnB1c2goaW1nRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJnYkRhdGEgPSBpbWFnZS5nZXRQaXhlbHNBcnJheSgpO1xuICAgICAgICAgICAgY29uc3QgcmdiTWF0cml4ID0gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgocmdiRGF0YSwgaW1hZ2Uud2lkdGgpO1xuICAgICAgICAgICAgaW1hZ2VzLnB1c2gocmdiTWF0cml4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChpICogMTAwKSAvIHVybHMubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYnJlYWsgc3RhY2sgbG9hZGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyByZXNldCBzdGFja0xvYWRpbmcgcHJvZ3Jlc3MgdG8gMFxuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICAgIHJldHVybiB7IGRhdGE6IGltYWdlcywgcmF0aW9zOiBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICAgICAgICAgc2l6ZXM6IFtpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0XSxcbiAgICAgICAgICAgICAgIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGltYWdlRGF0YTtcbiAgICAgIGlmIChpc0dyYXlzY2FsZSkge1xuICAgICAgICBjb25zdCBncmV5ID0gaW1hZ2UuZ3JleSgpO1xuICAgICAgICBpbWFnZURhdGEgPSB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChBcnJheS5mcm9tKGdyZXkuZGF0YSksIGltYWdlLndpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJnYkRhdGEgPSBpbWFnZS5nZXRQaXhlbHNBcnJheSgpO1xuICAgICAgICBpbWFnZURhdGEgPSB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChyZ2JEYXRhLCBpbWFnZS53aWR0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhOiBbaW1hZ2VEYXRhXSxcbiAgICAgICAgcmF0aW9zOiBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICBzaXplczogW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLFxuICAgICAgICBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwbG90RGl2XG4gICAqIEBwYXJhbSBpbWFnZUxvYWRlZCBvYmplY3Qgd2l0aCBkYXRhLCByYXRpb3MgYW5kIHNpemVzIGtleVxuICAgKiBAcGFyYW0gaW1hZ2VJbmZvIEltYWdlSW5mbyBvYmplY3RcbiAgICogQHBhcmFtIHNjcmVlbkhlaWdodCBzaXplIG9mIHRoZSBhdmFpbGFibGUgc2NyZWVuIGhlaWdodFxuICAgKiBAcGFyYW0gcGxvdFR5cGUgdHlwZSBvZiBwbG90dGluZ1xuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSBpblBsYWNlIHdoZW4gdHJ1ZSwgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcGxvdCB2aWEgUGxvdGx5LnJlYWN0XG4gICAqICAgaW5zdGVhZCBvZiBQbG90bHkucHVyZ2UgKyBQbG90bHkubmV3UGxvdC4gVXNlZCBieSB0aGUgbXVsdGktdGllclxuICAgKiAgIGRpYWdyYW0gc3dhcCAoc21hbGwg4oaSIGxhcmdlKSBzbyB0aGUgY2FudmFzIGRvZXNuJ3QgYnJpZWZseSBibGFua1xuICAgKiAgIGJldHdlZW4gcGhhc2VzLlxuICAgKi9cbiAgcHVibGljIHBsb3QocGxvdERpdjogc3RyaW5nLCBpbWFnZUxvYWRlZDogYW55LCBpbWFnZUluZm86IElJbWFnZUluZm8sIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICBwbG90VHlwZTogUGxvdFR5cGUsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHRydWVJbWFnZVNpemU6IG51bWJlcltdID0gW107XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICAvLyBbeDAsIHgxLCB5MCwgeTFdXG4gICAgdHJ1ZUltYWdlU2l6ZVswXSA9IDA7XG4gICAgdHJ1ZUltYWdlU2l6ZVsxXSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplWzBdO1xuICAgIHRydWVJbWFnZVNpemVbMl0gPSAwO1xuICAgIHRydWVJbWFnZVNpemVbM10gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZVsxXTtcbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucyBhbmQgcHVsbCBpbiBhbnkgY2FjaGVkIHJlZ2lvbnMgZm9yIHRoZVxuICAgIC8vIGltYWdlIHdlJ3JlIGFib3V0IHRvIGRpc3BsYXksIGJlZm9yZSBQbG90bHkubmV3UGxvdCByZWFkcyBgdGhpcy5zaGFwZXNgLlxuICAgIHRoaXMuc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvKTtcbiAgICB0aGlzLmltYWdlSW5mbyA9IGltYWdlSW5mbztcbiAgICB0aGlzLnBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgLy8gQ2FjaGUgcGl4ZWwgbWF0cmljZXMgc28gdGhlIHdhbmQgdG9vbCBjYW4gc2FtcGxlIHRoZW0uXG4gICAgdGhpcy5jYWNoZWRJbWFnZUZyYW1lcyA9IGltYWdlTG9hZGVkLmRhdGE7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVdpZHRoID0gaW1hZ2VMb2FkZWQuc2l6ZXNbMF07XG4gICAgdGhpcy5jYWNoZWRJbWFnZUhlaWdodCA9IGltYWdlTG9hZGVkLnNpemVzWzFdO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VSYXRpb3MgPSBpbWFnZUxvYWRlZC5yYXRpb3M7XG4gICAgdGhpcy5jYWNoZWRGcmFtZU9yaWdpbiA9IFswLCAwXTsgLy8gZnVsbCBpbWFnZSDigJQgcmVzZXQgYW55IHByaW9yIHpvb20tY3JvcCBvcmlnaW5cbiAgICB0aGlzLmNhY2hlZElzR3JheXNjYWxlID0gISFpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG5cbiAgICAvLyBQbHVnZ2FibGUgcGxvdCB0eXBlcyAoY29udG91ciwgc2NhdHRlciwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSByZW5kZXJcbiAgICAvLyB0aHJvdWdoIHRoZSB0cmFjZS1idWlsZGVyIHJlZ2lzdHJ5LiBUaGUgb3JpZ2luYWwgSEVBVE1BUC9TVVJGQUNFL1JHQi1pbWFnZVxuICAgIC8vIHJlbmRlcmVycyBrZWVwIHRoZWlyIGRlZGljYXRlZCBwYXRocyBiZWxvdyAoYWxzbyByZXVzZWQgYnkgdGhlIGhpZ2gtZGVmXG4gICAgLy8gem9vbSByZS1mZXRjaCkuIEludGVuc2l0eSBwcm9maWxlcyBhcmUgbm8gbG9uZ2VyIGEgcGxvdCB0eXBlIOKAlCB0aGV5J3JlXG4gICAgLy8gUmVnaW9uLWJhc2VkIGxpbmUgUk9JcywgYXZhaWxhYmxlIGluIEhFQVRNQVAvSU1BR0UgbW9kZS5cbiAgICBjb25zdCBpbXBsID0gUExPVExZX1BMT1RfVFlQRV9JTVBMU1twbG90VHlwZV07XG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlID0gISFpbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgICByZXR1cm4gdGhpcy5wbG90VmlhUmVnaXN0cnkoXG4gICAgICAgIHBsb3REaXYsIGltcGwsIHRoaXMuYnVpbGRUcmFjZUlucHV0KGltYWdlSW5mbywgaW1hZ2VMb2FkZWQsIHRydWVJbWFnZVNpemUpLFxuICAgICAgICBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICAgIH1cblxuICAgIGlmIChpbWFnZUluZm8uaXNHcmF5c2NhbGUpIHtcbiAgICAgIGlmIChwbG90VHlwZSA9PT0gUGxvdFR5cGUuU1VSRkFDRSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbG90U3VyZmFjZShwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgICAgICBpbWFnZUxvYWRlZC5yYXRpb3MsIHNjcmVlbkhlaWdodCwgaW5QbGFjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wbG90SGVhdG1hcChwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgICAgaW1hZ2VMb2FkZWQucmF0aW9zLCBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90UkdCSGVhdG1hcChwbG90RGl2LCBpbWFnZUluZm8udXJscywgaW1hZ2VMb2FkZWQuZGF0YSwgdHJ1ZUltYWdlU2l6ZSxcbiAgICAgIGltYWdlTG9hZGVkLnJhdGlvcywgaW1hZ2VMb2FkZWQuc2l6ZXNbMF0sIGltYWdlTG9hZGVkLnNpemVzWzFdLCBzY3JlZW5IZWlnaHQsIGluUGxhY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gcGxvdCBhIGdyYXlzY2FsZSBoZWF0bWFwXG4gICAqIEBwYXJhbSBwbG90RGl2XG4gICAqIEBwYXJhbSB1cmxzXG4gICAqIEBwYXJhbSBpbWFnZXNcbiAgICogQHBhcmFtIHRydWVJbWdTaXplIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyA6IFt4MCwgeDEsIHkwLCB5MV1cbiAgICogQHBhcmFtIHJhdGlvc1xuICAgKiBAcGFyYW0gc2NyZWVuSGVpZ2h0XG4gICAqIEByZXR1cm4gUHJvbWlzZSB0cnVlIHdoZW4gcGxvdHRpbmcgaXMgZmluaXNoZWRcbiAgICovXG4gIHByaXZhdGUgcGxvdEhlYXRtYXAocGxvdERpdjogc3RyaW5nLCB1cmxzOiBzdHJpbmdbXSwgaW1hZ2VzOiBhbnlbXSwgdHJ1ZUltZ1NpemU6IG51bWJlcltdLFxuICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdXJscztcbiAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHNjcmVlbkhlaWdodDtcbiAgICAvLyBwbG90XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IH1bXSA9IFtdO1xuICAgIGltYWdlcy5mb3JFYWNoKChkYXRhc2V0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSB7XG4gICAgICAgIHgwOiB0cnVlSW1nU2l6ZVswXSxcbiAgICAgICAgZHg6IHJhdGlvc1swXSxcbiAgICAgICAgeTA6IHRydWVJbWdTaXplWzJdLFxuICAgICAgICBkeTogcmF0aW9zWzBdLFxuICAgICAgICB6OiBkYXRhc2V0LFxuICAgICAgICB0eXBlOiAnaGVhdG1hcCcsXG4gICAgICAgIC8vIFdlIHJlbW92ZSB0aGUgdG9vbHRpcCBhbm5vdGF0aW9uIGZvciBwZXJmb3JtYW5jZXMgcmVhc29uc1xuICAgICAgICAvLyB0ZXh0OiBkYXRhc2V0Lm1hcCgocm93OiBhbnlbXSwgaTogYW55KSA9PiByb3cubWFwKChpdGVtLCBqKSA9PiB7XG4gICAgICAgIC8vICAgcmV0dXJuIGB4OiAkeysoaiAqIHJhdGlvc1swXSkudG9GaXhlZCgyKX08YnI+eTogJHsrKGkgKiByYXRpb3NbMF0pLnRvRml4ZWQoMil9PGJyPnZhbHVlOiAke2l0ZW19YH0pKSxcbiAgICAgICAgaG92ZXJpbmZvOiAnbm9uZScsXG4gICAgICAgIGNvbG9yc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCkuZGF0YS52YWx1ZSxcbiAgICAgICAgcmV2ZXJzZXNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRSZXZlcnNlU2NhbGUoKSxcbiAgICAgICAgbmFtZTogYFNsaWNlICR7aW5kZXggKyAxfWAsXG4gICAgICAgIHZpc2libGU6IGluZGV4ID09PSAwXG4gICAgICB9O1xuICAgICAgdHJhY2VzLnB1c2godHJhY2UpO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbmRlciA9IGluUGxhY2UgPyBQbG90bHkucmVhY3QgOiBQbG90bHkubmV3UGxvdDtcbiAgICByZXR1cm4gKHJlbmRlciBhcyBhbnkpKHBsb3REaXYsIHRyYWNlcyBhcyBhbnksXG4gICAgICB0aGlzLmdldEhlYXRtYXBMYXlvdXQoW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV0sIFt0cnVlSW1nU2l6ZVszXSxcbiAgICAgICAgdHJ1ZUltZ1NpemVbMl1dKSwgQ09ORklHIGFzIGFueSkudGhlbigoKSA9PiB7XG4gICAgICAvLyBoYW5kbGUgdGhlIHJlbGF5b3V0IGV2ZW50IGZvciB6b29tIC8gcm9pcyBhbmQgdGhlIGNsaWNrIGV2ZW50XG4gICAgICB0aGlzLnNldEV2ZW50cyhwbG90RGl2LCB0cnVlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBwbG90IGEgZ3JheXNjYWxlIHN1cmZhY2VcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIHVybHNcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gdHJ1ZUltZ1NpemUgYXJyYXkgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIDogW3gwLCB4MSwgeTAsIHkxXVxuICAgKiBAcGFyYW0gcmF0aW9zXG4gICAqIEBwYXJhbSBzY3JlZW5IZWlnaHRcbiAgICogQHJldHVybiBQcm9taXNlIHRydWUgd2hlbiBwbG90dGluZyBpcyBmaW5pc2hlZFxuICAgKi9cbiAgcHJpdmF0ZSBwbG90U3VyZmFjZShwbG90RGl2OiBzdHJpbmcsIHVybHM6IHN0cmluZ1tdLCBpbWFnZXM6IGFueVtdLCB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGltYWdlcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdXJscztcbiAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHNjcmVlbkhlaWdodDtcbiAgICAvLyBwbG90XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyAgfVtdID0gW107XG4gICAgaW1hZ2VzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0cmFjZSA9IHtcbiAgICAgICAgejogZGF0YXNldCxcbiAgICAgICAgdHlwZTogJ3N1cmZhY2UnLFxuICAgICAgICAvLyBob3ZlcmluZm86ICdub25lJyxcbiAgICAgICAgY29sb3JzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50Q29sb3JtYXAoKS5kYXRhLnZhbHVlLFxuICAgICAgICByZXZlcnNlc2NhbGU6IHRoaXMuc3RvcmUuY3VycmVudFJldmVyc2VTY2FsZSgpLFxuICAgICAgICAvLyBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgLy8gdmlzaWJsZTogaW5kZXggPT09IDBcbiAgICAgIH07XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG4gICAgY29uc3QgeHJhbmdlID0gW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV07XG4gICAgY29uc3QgeXJhbmdlID0gW3RydWVJbWdTaXplWzJdLCB0cnVlSW1nU2l6ZVszXV07XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSxcbiAgICAgIHRoaXMuZ2V0U3VyZmFjZUxheW91dCh4cmFuZ2UsIHlyYW5nZSwgMC40KSwgQ09ORklHX1NVUkZBQ0UgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgcmVsYXlvdXQgZXZlbnQgZm9yIHpvb20gLyByb2lzIGFuZCB0aGUgY2xpY2sgZXZlbnRcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIHRydWUsIHNjcmVlbkhlaWdodCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIHBsb3QgYW4gUkdCIGhlYXRtYXBcbiAgICogQHBhcmFtIHBsb3REaXZcbiAgICogQHBhcmFtIHVybHNcbiAgICogQHBhcmFtIGltYWdlc1xuICAgKiBAcGFyYW0gdHJ1ZUltZ1NpemVcbiAgICogQHBhcmFtIHdpZHRoXG4gICAqIEBwYXJhbSBoZWlnaHRcbiAgICogQHBhcmFtIHJhdGlvc1xuICAgKiBAcGFyYW0gc2NyZWVuSGVpZ2h0XG4gICAqIEByZXR1cm4gUHJvbWlzZVxuICAgKi9cbiAgcHJpdmF0ZSBwbG90UkdCSGVhdG1hcChwbG90RGl2OiBzdHJpbmcsIHVybHM6IHN0cmluZ1tdLCBpbWFnZXM6IGFueVtdLCB0cnVlSW1nU2l6ZTogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9zOiBudW1iZXJbXSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFBsb3RseS5yZWFjdCB1cGRhdGVzIGluIHBsYWNlOyBQbG90bHkucHVyZ2UgKyBQbG90bHkubmV3UGxvdCBibGFua3NcbiAgICAvLyB0aGUgY2FudmFzIGZvciB+MTAwbXMgd2hpY2ggbWFrZXMgdGhlIG11bHRpLXRpZXIgc21hbGzihpJsYXJnZSBzd2FwXG4gICAgLy8gbG9vayBsaWtlIGEgcmVncmVzc2lvbiB0byBcImxvYWRpbmdcIiBiZWZvcmUgdGhlIHNoYXJwZXIgdmVyc2lvblxuICAgIC8vIGFwcGVhcnMuXG4gICAgaWYgKCFpblBsYWNlKSBQbG90bHkucHVyZ2UocGxvdERpdik7XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmltYWdlTGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDtcbiAgICB0aGlzLnVybHMgPSB1cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuXG4gICAgLy8gYXMgYXV0b3JhbmdlIGlzIHNldCB0byBmYWxzZSwgYW5kIG5vdCByZXZlcnNlZCB3ZSBuZWVkIHRvIHNldCB0aGUgeXJhbmdlIGNvcnJlY2x5IGhlcmVcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmdldEhlYXRtYXBMYXlvdXQoW3RydWVJbWdTaXplWzBdLCB0cnVlSW1nU2l6ZVsxXV0sXG4gICAgICBbdHJ1ZUltZ1NpemVbM10sIHRydWVJbWdTaXplWzJdXSk7XG4gICAgY29uc3QgdHJhY2VzOiB7IHo6IGFueTsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZpc2libGU6IGJvb2xlYW47IH1bXSA9IFtdO1xuICAgIGltYWdlcy5mb3JFYWNoKChkYXRhc2V0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSB7XG4gICAgICAgIHgwOiB0cnVlSW1nU2l6ZVswXSxcbiAgICAgICAgZHg6IHJhdGlvc1swXSxcbiAgICAgICAgeTA6IHRydWVJbWdTaXplWzJdLFxuICAgICAgICBkeTogcmF0aW9zWzBdLFxuICAgICAgICB4OiBBcnJheS5mcm9tKEFycmF5KHdpZHRoKS5rZXlzKCkpLFxuICAgICAgICB5OiBBcnJheS5mcm9tKEFycmF5KGhlaWdodCkua2V5cygpKSxcbiAgICAgICAgejogZGF0YXNldCxcbiAgICAgICAgLy8gdGV4dDogZGF0YXNldC5tYXAoKHJvdzogYW55W10sIGk6IGFueSkgPT4gcm93Lm1hcCgoaXRlbSwgaikgPT4ge1xuICAgICAgICAvLyAgIHJldHVybiBgeDogJHsrKGogKiByYXRpb3NbMF0pLnRvRml4ZWQoMil9PGJyPnk6ICR7KyhpICogcmF0aW9zWzBdKS50b0ZpeGVkKDIpfTxicj52YWx1ZTogJHtpdGVtfWB9KSksXG4gICAgICAgIGhvdmVyaW5mbzogJ25vbmUnLFxuICAgICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgICBuYW1lOiBgU2xpY2UgJHtpbmRleCArIDF9YCxcbiAgICAgICAgdmlzaWJsZTogaW5kZXggPT09IDBcbiAgICAgIH07XG4gICAgICB0cmFjZXMucHVzaCh0cmFjZSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSwgbGF5b3V0LCBDT05GSUcgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIC8vIGhhbmRsZSB0aGUgcmVsYXlvdXQgZXZlbnRcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIGZhbHNlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgdGhlIG5vcm1hbGlzZWQgaW5wdXQgdGhlIHBsdWdnYWJsZSB0cmFjZSBidWlsZGVycyBjb25zdW1lLlxuICAgKiBQdXJlIGRhdGEgb25seSDigJQgbm8gUGxvdGx5IGhhbmRsZXMg4oCUIHNvIHRoZSBidWlsZGVycyBzdGF5IGJhY2tlbmQtbmV1dHJhbC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFjZUlucHV0KGltYWdlSW5mbzogSUltYWdlSW5mbywgaW1hZ2VMb2FkZWQ6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZUltYWdlU2l6ZTogbnVtYmVyW10pOiBUcmFjZUJ1aWxkSW5wdXQge1xuICAgIC8vIE1lYXN1cmUgdGhlIHZvbHVtZSdzIHJlYWwgaW50ZW5zaXR5IHJhbmdlIHNvIHRoZSBpc28gYmFuZCBjYW4gYmUgY2xhbXBlZFxuICAgIC8vIGludG8gaXQgKHRoZSBzbGlkZXIgaXMgYSBmaXhlZCAw4oCTMjU1IGJ1dCBhIHN0YWNrIG1heSBvY2N1cHkgb25seSBwYXJ0IG9mXG4gICAgLy8gdGhhdCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSBzdXJmYWNlcyB3aXRoIG5vdGhpbmcgdG8gY3Jvc3MpLlxuICAgIGlmICh0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFKSB7XG4gICAgICB0aGlzLmlzb0RhdGFSYW5nZSA9IHRoaXMubWVhc3VyZUludGVuc2l0eVJhbmdlKGltYWdlTG9hZGVkLmRhdGEsICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlKTtcbiAgICB9XG4gICAgY29uc3QgW2lzb01pbiwgaXNvTWF4XSA9IHRoaXMubWFwSXNvQmFuZCh0aGlzLmlzb01pbiwgdGhpcy5pc29NYXgpO1xuICAgIHJldHVybiB7XG4gICAgICBmcmFtZXM6IGltYWdlTG9hZGVkLmRhdGEsXG4gICAgICB3aWR0aDogaW1hZ2VMb2FkZWQuc2l6ZXNbMF0sXG4gICAgICBoZWlnaHQ6IGltYWdlTG9hZGVkLnNpemVzWzFdLFxuICAgICAgcmF0aW9zOiBpbWFnZUxvYWRlZC5yYXRpb3MsXG4gICAgICB0cnVlSW1hZ2VTaXplLFxuICAgICAgaXNHcmF5c2NhbGU6ICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlLFxuICAgICAgY29sb3JzY2FsZTogdGhpcy5zdG9yZS5jdXJyZW50Q29sb3JtYXAoKS5kYXRhLnZhbHVlLFxuICAgICAgcmV2ZXJzZXNjYWxlOiB0aGlzLnN0b3JlLmN1cnJlbnRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHJlZ2lvbnM6IHRoaXMuZ2V0UmVnaW9uUG9seWdvbnMoKSxcbiAgICAgIHNoYXBlQ29sb3I6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLFxuICAgICAgaXNvTWluLFxuICAgICAgaXNvTWF4LFxuICAgIH07XG4gIH1cblxuICAvKiogTWluL21heCBpbnRlbnNpdHkgb3ZlciBldmVyeSB2b3hlbCBvZiB0aGUgbG9hZGVkIGZyYW1lcyAoUkdCIOKGkiBsdW1pbmFuY2UpLFxuICAgKiAgdXNlZCB0byBrZWVwIHRoZSBpc28gYmFuZCBpbnNpZGUgdGhlIGRhdGEuIFJldHVybnMgbnVsbCBmb3IgZW1wdHkgaW5wdXQuICovXG4gIHByaXZhdGUgbWVhc3VyZUludGVuc2l0eVJhbmdlKGZyYW1lczogYW55W10sIGlzR3JheXNjYWxlOiBib29sZWFuKTogW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICAgIGxldCBtaW4gPSBJbmZpbml0eSwgbWF4ID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzIHx8IFtdKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBmcmFtZSB8fCBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93IHx8IFtdKSB7XG4gICAgICAgICAgY29uc3QgdiA9IGlzR3JheXNjYWxlID8gY2VsbFxuICAgICAgICAgICAgOiAwLjI5OSAqIGNlbGxbMF0gKyAwLjU4NyAqIGNlbGxbMV0gKyAwLjExNCAqIGNlbGxbMl07XG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICh2IDwgbWluKSBtaW4gPSB2O1xuICAgICAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoTnVtYmVyLmlzRmluaXRlKG1pbikgJiYgTnVtYmVyLmlzRmluaXRlKG1heCkgJiYgbWF4ID4gbWluKSA/IFttaW4sIG1heF0gOiBudWxsO1xuICB9XG5cbiAgLyoqIE1hcCB0aGUgMOKAkzI1NSBzbGlkZXIgYmFuZCBvbnRvIHRoZSB2b2x1bWUncyBhY3R1YWwgaW50ZW5zaXR5IHJhbmdlLiBUaGVcbiAgICogIHNsaWRlciBpcyBmaXhlZCAw4oCTMjU1LCBidXQgYSBzdGFjayBvZnRlbiBvY2N1cGllcyBvbmx5IGEgbmFycm93IHN1Yi1yYW5nZVxuICAgKiAgKGUuZy4gdGhpcyBFRE9GIHZvbHVtZSBpcyB+MuKAkzUwIHdpdGggc3RydWN0dXJlIG5lYXIgNuKAkzEwKS4gTWFwcGluZyBzcHJlYWRzXG4gICAqICB0aGUgZGF0YSBhY3Jvc3MgdGhlIHdob2xlIHNsaWRlciBzbyBldmVyeSBpbnRlbnNpdHkgaXMgZWFzeSB0byByZWFjaCBhbmRcbiAgICogIHRoZSBiYW5kIGFsd2F5cyBsYW5kcyBpbnNpZGUgdGhlIGRhdGEg4oCUIGEgc21hbGwgaW5zZXQga2VlcHMgdGhlIGV4dHJlbWVcbiAgICogIHN1cmZhY2VzIG9mZiB0aGUgZXhhY3QgZGF0YSBlZGdlcywgd2hpY2ggYXJlIGRlZ2VuZXJhdGUgYW5kIGRyYXcgbm90aGluZy4gKi9cbiAgcHJpdmF0ZSBtYXBJc29CYW5kKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGxldCBsbyA9IE1hdGgubWluKGlzb01pbiwgaXNvTWF4KTtcbiAgICBsZXQgaGkgPSBNYXRoLm1heChpc29NaW4sIGlzb01heCk7XG4gICAgaWYgKHRoaXMuaXNvRGF0YVJhbmdlKSB7XG4gICAgICBjb25zdCBbdk1pbiwgdk1heF0gPSB0aGlzLmlzb0RhdGFSYW5nZTtcbiAgICAgIGNvbnN0IHNwYW4gPSB2TWF4IC0gdk1pbjtcbiAgICAgIGNvbnN0IHBhZCA9IDAuMDMgKiBzcGFuO1xuICAgICAgY29uc3QgdXNhYmxlID0gc3BhbiAtIDIgKiBwYWQ7XG4gICAgICBjb25zdCBTTElERVJfTUFYID0gMjU1OyAvLyB0b29sYmFyIHNsaWRlciBkb21haW4gKGlzb1ZhbHVlTWF4KVxuICAgICAgbG8gPSB2TWluICsgcGFkICsgKGxvIC8gU0xJREVSX01BWCkgKiB1c2FibGU7XG4gICAgICBoaSA9IHZNaW4gKyBwYWQgKyAoaGkgLyBTTElERVJfTUFYKSAqIHVzYWJsZTtcbiAgICAgIGlmIChsbyA+IGhpKSB7IGNvbnN0IHQgPSBsbzsgbG8gPSBoaTsgaGkgPSB0OyB9XG4gICAgfVxuICAgIHJldHVybiBbbG8sIGhpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGlzb3N1cmZhY2UgaW50ZW5zaXR5IGJvdW5kcy4gV2hlbiBpc29zdXJmYWNlIGlzIG9uIHNjcmVlbiB0aGlzXG4gICAqIHJlc3R5bGVzIGBpc29taW5gL2Bpc29tYXhgIGluIHBsYWNlIGZvciBhIGxpdmUgdXBkYXRlIChubyB2b2x1bWUgcmVidWlsZCkuXG4gICAqIFNsaWRlciB2YWx1ZXMgYXJlIG1hcHBlZCBvbnRvIHRoZSB2b2x1bWUncyByZWFsIHJhbmdlIHNvIHRoZSBzdXJmYWNlcyBhbHdheXNcbiAgICogaGF2ZSBkYXRhIHRvIGNyb3NzIChtYXRjaGluZyB0aGUgaW5pdGlhbCByZW5kZXIpLlxuICAgKi9cbiAgcHVibGljIHNldElzb1JhbmdlKGlzb01pbjogbnVtYmVyLCBpc29NYXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaXNvTWluID0gaXNvTWluO1xuICAgIHRoaXMuaXNvTWF4ID0gaXNvTWF4O1xuICAgIGlmICh0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5JU09TVVJGQUNFICYmIHRoaXMucGxvdERpdikge1xuICAgICAgY29uc3QgW2xvLCBoaV0gPSB0aGlzLm1hcElzb0JhbmQoaXNvTWluLCBpc29NYXgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5wbG90RGl2LCB7IGlzb21pbjogW2xvXSwgaXNvbWF4OiBbaGldIH0gYXMgYW55KTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBwbG90IG5vdCByZWFkeSAqLyB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFBsb3RseSByZW5kZXJzIGlzb3N1cmZhY2VzLCBzbyBpdCBleHBvc2VzIHRoZSBpc29zdXJmYWNlIGNvbnRyb2xzIChpdHNlbGYpLiAqL1xuICBwdWJsaWMgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHsgcmV0dXJuIHRoaXM7IH1cblxuICAvKipcbiAgICogUmVuZGVyIGEgcmVnaXN0cnktYmFja2VkIHBsb3QgdHlwZTogYnVpbGQgaXRzIHRyYWNlcyBmcm9tIHRoZSBpbnB1dCwgcGlja1xuICAgKiB0aGUgbWF0Y2hpbmcgbGF5b3V0LCByZW5kZXIsIGFuZCB3aXJlIHRoZSB1c3VhbCByZWxheW91dC9jbGljayBldmVudHMuXG4gICAqIE1pcnJvcnMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGVkaWNhdGVkIGhlYXRtYXAvc3VyZmFjZSByZW5kZXJlcnMuXG4gICAqL1xuICBwcml2YXRlIHBsb3RWaWFSZWdpc3RyeShwbG90RGl2OiBzdHJpbmcsIGltcGw6IFBsb3RseVBsb3RUeXBlSW1wbCwgaW5wdXQ6IFRyYWNlQnVpbGRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsIGluUGxhY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaW5QbGFjZSkgUGxvdGx5LnB1cmdlKHBsb3REaXYpO1xuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5pbWFnZUxlbmd0aCA9IGlucHV0LmZyYW1lcy5sZW5ndGg7XG4gICAgdGhpcy51cmxzID0gdGhpcy5pbWFnZUluZm8/LnVybHMgPz8gdGhpcy51cmxzO1xuICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuXG4gICAgY29uc3QgdHJhY2VzID0gaW1wbC5idWlsZFRyYWNlcyhpbnB1dCk7XG4gICAgY29uc3QgW3gwLCB4MSwgeTAsIHkxXSA9IGlucHV0LnRydWVJbWFnZVNpemU7XG4gICAgbGV0IGxheW91dDogYW55O1xuICAgIHN3aXRjaCAoaW1wbC5sYXlvdXRLaW5kKSB7XG4gICAgICBjYXNlICczZC12b2x1bWUnOlxuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldFZvbHVtZUxheW91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzJkLWNoYXJ0JzpcbiAgICAgICAgbGF5b3V0ID0gdGhpcy5nZXRDaGFydExheW91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzJkLW92ZXJsYXknOlxuICAgICAgICBsYXlvdXQgPSB0aGlzLmdldE92ZXJsYXlMYXlvdXQoW3gwLCB4MV0sIFt5MSwgeTBdKTsgLy8gcmV2ZXJzZWQgeSBsaWtlIHRoZSBpbWFnZVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IC8vICcyZC1pbWFnZSdcbiAgICAgICAgbGF5b3V0ID0gdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFt4MCwgeDFdLCBbeTEsIHkwXSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IGltcGwudGhyZWVEID8gQ09ORklHX1NVUkZBQ0UgOiBDT05GSUc7XG4gICAgY29uc3QgcmVuZGVyID0gaW5QbGFjZSA/IFBsb3RseS5yZWFjdCA6IFBsb3RseS5uZXdQbG90O1xuICAgIHJldHVybiAocmVuZGVyIGFzIGFueSkocGxvdERpdiwgdHJhY2VzIGFzIGFueSwgbGF5b3V0LCBjb25maWcgYXMgYW55KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0RXZlbnRzKHBsb3REaXYsIGlucHV0LmlzR3JheXNjYWxlLCBzY3JlZW5IZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGxhaW4gMkQgY2hhcnQgYXhlcyAoaW50ZW5zaXR5IHByb2ZpbGUgLyBsaW5lIHBsb3RzKS4gKi9cbiAgcHJpdmF0ZSBnZXRDaGFydExheW91dCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtYXJnaW46IHsgdDogMzAsIGI6IDQ1LCBsOiA2MCwgcjogMjAgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHhheGlzOiB7IHRpdGxlOiAnUG9zaXRpb24gKHB4KScgfSxcbiAgICAgIHlheGlzOiB7IHRpdGxlOiAnSW50ZW5zaXR5JyB9LFxuICAgICAgZHJhZ21vZGU6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKiogSW1hZ2UtYWxpZ25lZCAyRCBheGVzIHdpdGhvdXQgdGhlIHotcGxhbmUgc2xpZGVyIChyZWdpb24gc2NhdHRlcikuICovXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUxheW91dCh4UmFuZ2U6IG51bWJlcltdLCB5UmFuZ2U6IG51bWJlcltdKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgeGF4aXM6IHsgY29uc3RyYWluOiAncmFuZ2UnLCBjb25zdHJhaW50b3dhcmQ6ICdjZW50ZXInLCBzaWRlOiAndG9wJywgdGlja3M6ICcnLCByYW5nZTogeFJhbmdlIH0sXG4gICAgICB5YXhpczoge1xuICAgICAgICBjb25zdHJhaW46ICdyYW5nZScsIGNvbnN0cmFpbnRvd2FyZDogJ2NlbnRlcicsIHJhbmdlOiB5UmFuZ2UsIHRpY2tzOiAnJyxcbiAgICAgICAgdGlja3N1ZmZpeDogJyAgJywgYXV0b3JhbmdlOiBmYWxzZSwgc2NhbGVhbmNob3I6IHRoaXMuc2NhbGVyYXRpbyA/ICd4JyA6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG1hcmdpbjogeyB0OiAzMCwgYjogNSwgbDogNTUsIHI6IDUgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHNoYXBlczogdGhpcy5jdXJyZW50UmVuZGVyU2hhcGVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICBkcmFnbW9kZTogdGhpcy5kcmFnTW9kZSA/IHRoaXMuZHJhZ01vZGUgOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIDNEIHNjZW5lIGZvciB2b2x1bWV0cmljIHBsb3QgdHlwZXMgKHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkuICovXG4gIHByaXZhdGUgZ2V0Vm9sdW1lTGF5b3V0KCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmdpbjogeyB0OiAwLCBiOiAwLCBsOiAwLCByOiAwIH0sXG4gICAgICBoZWlnaHQ6IHRoaXMuc2NyZWVuSGVpZ2h0LFxuICAgICAgYXV0b3NpemU6IHRydWUsXG4gICAgICBzY2VuZToge1xuICAgICAgICB4YXhpczogeyB0aXRsZTogJ1gnIH0sXG4gICAgICAgIHlheGlzOiB7IHRpdGxlOiAnWScgfSxcbiAgICAgICAgemF4aXM6IHsgdGl0bGU6ICdaLXBsYW5lJyB9LFxuICAgICAgICAvLyAnY3ViZScgKG5vdCAnZGF0YScpOiBhIHotc3RhY2sgaGFzIGZhciBmZXdlciBwbGFuZXMgdGhhbiBYL1kgcGl4ZWxzLFxuICAgICAgICAvLyBzbyAnZGF0YScgc3F1YXNoZXMgdGhlIHZvbHVtZSBpbnRvIGEgbmVhci1mbGF0IHNsYWIgdGhhdCByZWFkcyBhc1xuICAgICAgICAvLyBlbXB0eSBlZGdlLW9uLiBBIGN1YmUgZ2l2ZXMgdGhlIHogZGltZW5zaW9uIHJlYWwgaGVpZ2h0IHNvIHRoZVxuICAgICAgICAvLyBpc29zdXJmYWNlL3ZveGVscyBhcmUgYWN0dWFsbHkgdmlzaWJsZS5cbiAgICAgICAgYXNwZWN0bW9kZTogJ2N1YmUnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBwdWJsaWMgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUExPVF9UWVBFX0RFU0NSSVBUT1JTKS5maWx0ZXIoKGQpOiBkIGlzIFBsb3RUeXBlRGVzY3JpcHRvciA9PiAhIWQpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gUGxvdGx5IGRyYXdzIHNoYXBlcyBuYXRpdmVseSwgc28gdGhlXG4gICAqICBvdmVybGF5IGlzIGEgdGhpbiBhZGFwdGVyIG92ZXIgdGhpcyBzZXJ2aWNlJ3MgZHJhZyBtb2Rlcy4gKi9cbiAgcHVibGljIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkge1xuICAgIGlmICghdGhpcy5yZWdpb25PdmVybGF5KSB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgUGxvdGx5UmVnaW9uT3ZlcmxheSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25PdmVybGF5O1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVuc2l0eSBwcm9maWxlIChSZWdpb24tYmFzZWQgbGluZSBST0lzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRW1pdHMgdGhlIGZ1bGwgc2V0IG9mIGludGVuc2l0eSBwcm9maWxlcyAob25lIHBlciBwcm9maWxlLWxpbmUgcmVnaW9uKVxuICAgKiAgd2hlbmV2ZXIgYSBwcm9maWxlIGxpbmUgaXMgYWRkZWQsIG1vdmVkLCBvciByZW1vdmVkLiAqL1xuICBwdWJsaWMgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBQbG90bHkgcmVuZGVycyB0aGUgbGluZSBST0lzICsgaW5zZXQsIHNvIGl0IGV4cG9zZXMgdGhlIGludGVuc2l0eSBjb250cm9scy4gKi9cbiAgcHVibGljIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwgeyByZXR1cm4gdGhpczsgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGZsb2F0aW5nIGludGVuc2l0eS1wcm9maWxlIGluc2V0IGNoYXJ0IGludG8gYGRpdklkYCDigJQgb25lIGxpbmVcbiAgICogdHJhY2UgcGVyIFJPSSwgZWFjaCBkcmF3biBpbiBpdHMgUk9JJ3MgY29sb3VyLiBLZXB0IGhlcmUgKG5vdCBpbiB0aGUgZGlhZ3JhbVxuICAgKiBjb21wb25lbnQpIHNvIHRoZSBjb25zdW1lciBuZXZlciB0b3VjaGVzIFBsb3RseSBkaXJlY3RseS5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZDogc3RyaW5nLCBwcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZJZCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHRyYWNlcyA9IChwcm9maWxlcyA/PyBbXSkubWFwKChwLCBpKSA9PiAoe1xuICAgICAgeDogcC5wb3NpdGlvbnMsXG4gICAgICB5OiBwLnZhbHVlcyxcbiAgICAgIHR5cGU6ICdzY2F0dGVyJyxcbiAgICAgIG1vZGU6ICdsaW5lcycsXG4gICAgICBsaW5lOiB7IGNvbG9yOiBwLmNvbG9yID8/ICcjRkZENDAwJywgd2lkdGg6IDIgfSxcbiAgICAgIG5hbWU6IGBMaW5lICR7aSArIDF9YCxcbiAgICAgIGhvdmVyaW5mbzogJ3greScsXG4gICAgfSkpO1xuICAgIC8vIFggYXhpcyBpcyBpbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbCBwaXhlbCBzaXplIChtcHApLFxuICAgIC8vIG90aGVyd2lzZSBpbiBwaXhlbHMg4oCUIGRyaXZlbiBieSB0aGUgdW5pdCB0aGUgc2FtcGxlciB0YWdnZWQgb24gdGhlIHByb2ZpbGUuXG4gICAgY29uc3QgdW5pdCA9IChwcm9maWxlcyA/PyBbXSkuZmluZChwID0+IHAudW5pdCk/LnVuaXQgPz8gJ3B4JztcbiAgICBjb25zdCB4VGl0bGUgPSB1bml0ID09PSAnwrVtJyA/ICdQb3NpdGlvbiAowrVtKScgOiAnUG9zaXRpb24gKHB4KSc7XG4gICAgUGxvdGx5LnJlYWN0KGVsLCB0cmFjZXMgYXMgYW55LCB7XG4gICAgICBtYXJnaW46IHsgdDogNiwgcjogOCwgYjogMzgsIGw6IDQwIH0sXG4gICAgICB4YXhpczogeyB0aXRsZTogeFRpdGxlLCB6ZXJvbGluZTogZmFsc2UsIGNvbG9yOiAnI2RkZCcgfSxcbiAgICAgIHlheGlzOiB7IHRpdGxlOiAnSW50ZW5zaXR5JywgemVyb2xpbmU6IGZhbHNlLCBjb2xvcjogJyNkZGQnIH0sXG4gICAgICBzaG93bGVnZW5kOiBmYWxzZSxcbiAgICAgIHBhcGVyX2JnY29sb3I6ICdyZ2JhKDI1LDI1LDI1LDAuOSknLFxuICAgICAgcGxvdF9iZ2NvbG9yOiAncmdiYSgyNSwyNSwyNSwwLjkpJyxcbiAgICAgIGZvbnQ6IHsgY29sb3I6ICcjZWVlJywgc2l6ZTogMTAgfSxcbiAgICB9IGFzIGFueSwgeyBkaXNwbGF5TW9kZUJhcjogZmFsc2UsIHJlc3BvbnNpdmU6IHRydWUgfSBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBzaGFwZXMgKGZpbHRlcmVkL3JlZHJhd24gZm9yIHRoZSBjdXJyZW50IGZpbGUpLiBUaGUgcHJvZmlsZS1saW5lIFJPSXNcbiAgICogYXJlIG9yZGluYXJ5IHN0b3JlIHJlZ2lvbnMgKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCksIHNvIHRoZXkgYXJlIGFscmVhZHlcbiAgICogcGFydCBvZiBgdGhpcy5zaGFwZXNgIOKAlCBubyBzZXBhcmF0ZSBhcHBlbmQgaXMgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjdXJyZW50UmVuZGVyU2hhcGVzKHNob3dMYWJlbCA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zaGFwZXNUb1JlZHJhdyhzaG93TGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIElJbnRlbnNpdHlDb250cm9sczogYWRkIGFub3RoZXIgaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBhcyBhIG5ldXRyYWwgUmVnaW9uXG4gICAqICh0YWdnZWQgYGtpbmQ6ICdwcm9maWxlJ2ApLiBJdCBpcyBhIGhvcml6b250YWwgb3BlbiAyLXBvaW50IHBvbHlsaW5lIHNwYW5uaW5nXG4gICAqIHRoZSBpbWFnZSB3aWR0aCwgc3RhZ2dlcmVkIHZlcnRpY2FsbHkgc28gc3VjY2Vzc2l2ZSBsaW5lcyBzdGF5IGRpc3RpbmN0LCBpblxuICAgKiB0aGUgbmV4dCBicmlnaHQgcGFsZXR0ZSBjb2xvdXIuIEFkZGVkIHRvIHRoZSBzaGFyZWQgc3RvcmUgc28gYm90aCBiYWNrZW5kc1xuICAgKiAoUGxvdGx5ICsgT3BlblNlYWRyYWdvbikgcmVuZGVyIGFuZCBkcmFnIGl0OyBleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYlxuICAgKiBhbmQgZXhwb3J0cyBieSBpdHMga2luZC5cbiAgICovXG4gIHB1YmxpYyBhZGRQcm9maWxlTGluZSgpOiBSZWdpb24gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5nZXRQcm9maWxlUmVnaW9ucygpLmxlbmd0aDtcbiAgICBjb25zdCBpbWdYMCA9IHRoaXMudHJ1ZUltZ1NpemVbMF0sIGltZ1gxID0gdGhpcy50cnVlSW1nU2l6ZVsxXTtcbiAgICBjb25zdCBpbWdUb3AgPSB0aGlzLnRydWVJbWdTaXplWzJdLCBpbWdCb3R0b20gPSB0aGlzLnRydWVJbWdTaXplWzNdO1xuXG4gICAgLy8gUGxhY2UgdGhlIGxpbmUgd2l0aGluIHRoZSBjdXJyZW50bHkgVklTSUJMRSBpbWFnZSBhcmVhLCBzbyB3aGVuIHpvb21lZCBpbiBpdFxuICAgIC8vIGxhbmRzIG9uLXNjcmVlbiBpbnN0ZWFkIG9mIHNwYW5uaW5nIHRoZSB3aG9sZSAobW9zdGx5IG9mZi1zY3JlZW4pIGltYWdlLCBhdFxuICAgIC8vIDIvMyBvZiB0aGUgdmlzaWJsZSB3aWR0aCBhbmQgaG9yaXpvbnRhbGx5IGNlbnRyZWQuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGxcbiAgICAvLyBpbWFnZSB3aGVuIG5vIHZpZXdwb3J0IFJPSSBpcyBrbm93biAoUGxvdGx5IGhlYXRtYXApIG9yIGEgc3RhbGUgUk9JIG5vIGxvbmdlclxuICAgIC8vIG92ZXJsYXBzIHRoZSBpbWFnZS5cbiAgICBjb25zdCByb2kgPSB0aGlzLmxhc3RWaXNpYmxlUm9pO1xuICAgIGNvbnN0IG92ZXJsYXBzID0gISFyb2kgJiYgcm9pLndpZHRoID4gMCAmJiByb2kuaGVpZ2h0ID4gMFxuICAgICAgJiYgcm9pLnggPCBpbWdYMSAmJiByb2kueCArIHJvaS53aWR0aCA+IGltZ1gwXG4gICAgICAmJiByb2kueSA8IGltZ0JvdHRvbSAmJiByb2kueSArIHJvaS5oZWlnaHQgPiBpbWdUb3A7XG4gICAgY29uc3QgeDB2ID0gb3ZlcmxhcHMgPyBNYXRoLm1heChpbWdYMCwgcm9pIS54KSA6IGltZ1gwO1xuICAgIGNvbnN0IHgxdiA9IG92ZXJsYXBzID8gTWF0aC5taW4oaW1nWDEsIHJvaSEueCArIHJvaSEud2lkdGgpIDogaW1nWDE7XG4gICAgY29uc3QgdG9wViA9IG92ZXJsYXBzID8gTWF0aC5tYXgoaW1nVG9wLCByb2khLnkpIDogaW1nVG9wO1xuICAgIGNvbnN0IGJvdHRvbVYgPSBvdmVybGFwcyA/IE1hdGgubWluKGltZ0JvdHRvbSwgcm9pIS55ICsgcm9pIS5oZWlnaHQpIDogaW1nQm90dG9tO1xuXG4gICAgY29uc3QgY3ggPSAoeDB2ICsgeDF2KSAvIDI7XG4gICAgY29uc3QgaGFsZiA9ICgoeDF2IC0geDB2KSAqICgyIC8gMykpIC8gMjsgLy8gbGluZSBzcGFucyAyLzMgb2YgdGhlIHZpc2libGUgd2lkdGhcbiAgICBjb25zdCB4MCA9IGN4IC0gaGFsZiwgeDEgPSBjeCArIGhhbGY7XG5cbiAgICBjb25zdCBiYW5kSCA9IGJvdHRvbVYgLSB0b3BWO1xuICAgIGNvbnN0IG1pZFkgPSAodG9wViArIGJvdHRvbVYpIC8gMjtcbiAgICAvLyBTdGFnZ2VyIHN1Y2Nlc3NpdmUgbGluZXMgYWNyb3NzIHRoZSB2aXNpYmxlIGJhbmQgc28gdGhleSBzdGF5IGRpc3RpbmN0LlxuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihib3R0b21WLCBNYXRoLm1heCh0b3BWLCBtaWRZICsgY291bnQgKiBiYW5kSCAqIDAuMTIpKTtcblxuICAgIGNvbnN0IHBvbHkgPSBuZXcgUG9seWdvbigpO1xuICAgIHBvbHkubnBvaW50cyA9IDI7XG4gICAgcG9seS54cG9pbnRzID0gW3gwLCB4MV07XG4gICAgcG9seS55cG9pbnRzID0gW3ksIHldO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSBbW3gwLCB5XSwgW3gxLCB5XV07XG4gICAgcG9seS5jbG9zZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gcG9seTtcbiAgICByZWdpb24ua2luZCA9ICdwcm9maWxlJztcbiAgICByZWdpb24uY29sb3IgPSB0aGlzLlBST0ZJTEVfUEFMRVRURVt0aGlzLnByb2ZpbGVDb2xvclNlcSsrICUgdGhpcy5QUk9GSUxFX1BBTEVUVEUubGVuZ3RoXTtcbiAgICAvLyBMZWF2ZSByZWdpb24ubGFiZWwgdW5kZWZpbmVkIHNvIGFwcGx5Q2xhc3NpZmljYXRpb25Db2xvcnMgd29uJ3QgcmVjb2xvciBpdC5cblxuICAgIHRoaXMucmVnaW9uU3RvcmUuYWRkUmVnaW9uKHJlZ2lvbik7XG5cbiAgICAvLyBJZiBhIFBsb3RseSBwbG90IGlzIG9uIHNjcmVlbiwgcmUtcmVuZGVyIHNoYXBlcyBzbyB0aGUgbmV3IGxpbmUgYXBwZWFycy5cbiAgICAvLyAoVGhlIE9TRCBvdmVybGF5IHJlbmRlcnMgYXV0b21hdGljYWxseSB2aWEgaXRzIHJlZ2lvbi11cGRhdGUgc3Vic2NyaXB0aW9uLilcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICB0aGlzLnN5bmNTaGFwZXNGcm9tU3RvcmUoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgc2hhcGVzOiB0aGlzLmN1cnJlbnRSZW5kZXJTaGFwZXMoKSB9IGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG5vdCBhIFBsb3RseSBwbG90IChPU0Qgb3ducyBpdCkgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG5cbiAgLyoqIFRoZSBwcm9maWxlLWxpbmUgUk9JcyBjdXJyZW50bHkgaW4gdGhlIHN0b3JlIChraW5kID09PSAncHJvZmlsZScpLiAqL1xuICBwcml2YXRlIGdldFByb2ZpbGVSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKHIgPT4gKHIgYXMgYW55KS5raW5kID09PSAncHJvZmlsZScpO1xuICB9XG5cbiAgLyoqIFJlY29tcHV0ZSBhbmQgYnJvYWRjYXN0IGEgcHJvZmlsZSBmb3IgZXZlcnkgcHJvZmlsZS1saW5lIHJlZ2lvbiAoaWQgKyBjb2xvdXJcbiAgICogIHRhZ2dlZCBzbyB0aGUgaW5zZXQgdHJhY2UgbWF0Y2hlcyBpdHMgbGluZSkuICovXG4gIHByaXZhdGUgZW1pdFByb2ZpbGVzKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQubmV4dCh0aGlzLmdldFByb2ZpbGVSZWdpb25zKCkubWFwKHIgPT4gKHtcbiAgICAgIC4uLnRoaXMuY29tcHV0ZUludGVuc2l0eVByb2ZpbGVGb3JSZWdpb24ociksXG4gICAgICBpZDogci5pZCxcbiAgICAgIGNvbG9yOiByLmNvbG9yLFxuICAgIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogU2FtcGxlIHRoZSBpbnRlbnNpdHkgcHJvZmlsZSBmb3IgYSBwcm9maWxlLWxpbmUgcmVnaW9uOiBleHRyYWN0IGl0cyB0d29cbiAgICogcG9seWdvbiBlbmRwb2ludHMgYW5kIHJldXNlIHRoZSBzaGFyZWQgYGNvbXB1dGVJbnRlbnNpdHlQcm9maWxlYCBzYW1wbGluZy5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUludGVuc2l0eVByb2ZpbGVGb3JSZWdpb24ocmVnaW9uOiBSZWdpb24pOiBJbnRlbnNpdHlQcm9maWxlIHtcbiAgICAvLyBEdWNrLXR5cGVkIChub3QgYGluc3RhbmNlb2YgUG9seWdvbmApOiBhZnRlciBhIGRyYWcgcm91bmQtdHJpcHMgdGhyb3VnaCB0aGVcbiAgICAvLyBzdG9yZSB0aGUgYm91bmRzIGNhbiBiZSBhIHBsYWluIG9iamVjdCwgc28gbWF0Y2ggb24gdGhlIHBvaW50IGFycmF5cy5cbiAgICBjb25zdCBwb2x5OiBhbnkgPSByZWdpb24uYm91bmRzO1xuICAgIGlmICghcG9seSB8fCAhQXJyYXkuaXNBcnJheShwb2x5Lnhwb2ludHMpIHx8ICFBcnJheS5pc0FycmF5KHBvbHkueXBvaW50cykgfHxcbiAgICAgICAgcG9seS54cG9pbnRzLmxlbmd0aCA8IDIgfHwgcG9seS55cG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB7IHBvc2l0aW9uczogW10sIHZhbHVlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUludGVuc2l0eVByb2ZpbGUoe1xuICAgICAgeDA6IHBvbHkueHBvaW50c1swXSwgeTA6IHBvbHkueXBvaW50c1swXSxcbiAgICAgIHgxOiBwb2x5Lnhwb2ludHNbMV0sIHkxOiBwb2x5Lnlwb2ludHNbMV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VwcGx5IHBpeGVsIGZyYW1lcyBmb3IgaW50ZW5zaXR5IHNhbXBsaW5nICh1c2VkIGJ5IHRoZSBPU0QvaW1hZ2UgYmFja2VuZCxcbiAgICogd2hvc2UgY2FjaGVkIGZyYW1lcyBtYXkgYmUgZW1wdHkpLiBPcHRpb25hbGx5IGFsc28gc2V0cyB0aGUgZGF0YS9waXhlbCByYXRpb3MuXG4gICAqL1xuICBwdWJsaWMgc2V0U2FtcGxpbmdGcmFtZXMoZnJhbWVzOiBhbnlbXSwgcmF0aW9zOiBudW1iZXJbXSwgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZWRJbWFnZUZyYW1lcyA9IGZyYW1lcztcbiAgICBpZiAocmF0aW9zKSB0aGlzLmNhY2hlZEltYWdlUmF0aW9zID0gcmF0aW9zO1xuICAgIHRoaXMuY2FjaGVkRnJhbWVPcmlnaW4gPSBvcmlnaW47XG4gIH1cblxuICAvKipcbiAgICogUG9wdWxhdGUgdGhlIHNhbXBsaW5nIGNhY2hlIGZvciB0aGUgaW50ZW5zaXR5IHByb2ZpbGVzIHdoZW4gT3BlblNlYWRyYWdvbiBpc1xuICAgKiB0aGUgYWN0aXZlIGJhY2tlbmQgKHRoZSBJbWFnZSBwbG90IHR5cGUpLiBJbiBPU0QgbW9kZSBQbG90bHkgbmV2ZXIgcmVuZGVyZWQsXG4gICAqIHNvIGBjYWNoZWRJbWFnZUZyYW1lc2AvYHRydWVJbWdTaXplYCBhcmUgdW5zZXQg4oCUIGZldGNoIHRoZSBjdXJyZW50IHNsaWNlJ3NcbiAgICogcHJldmlldyAodGhlIHNhbWUgcGl4ZWxzIHRoZSBoZWF0bWFwIHdvdWxkIHNhbXBsZSkgc28gdGhlIGxpbmUgUk9JcyBoYXZlXG4gICAqIHBpeGVsIGRhdGEgYW5kIGEgcGxhY2VtZW50IGV4dGVudC4gUmUtZW1pdHMgdGhlIHByb2ZpbGVzIG9uY2UgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWltYWdlSW5mbz8udXJscz8ubGVuZ3RoKSByZXR1cm47XG4gICAgLy8gU2FtcGxlIGp1c3QgdGhlIGRpc3BsYXllZCBzbGljZSAoc2hvd1N0YWNrIG9mZiDihpIgc2luZ2xlIGZyYW1lKTsgYGxvYWRgXG4gICAgLy8gYWxzbyBzZXRzIGB0aGlzLnRydWVJbWdTaXplYCwgd2hpY2ggYWRkUHJvZmlsZUxpbmUgbmVlZHMgZm9yIHBsYWNlbWVudC5cbiAgICBjb25zdCBzaW5nbGUgPSB7IC4uLmltYWdlSW5mbywgc2hvd1N0YWNrOiBmYWxzZSB9IGFzIElJbWFnZUluZm87XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgdGhpcy5sb2FkKHNpbmdsZSwgekluZGV4IHx8IDApO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMgPSBsb2FkZWQuZGF0YTtcbiAgICB0aGlzLmNhY2hlZEltYWdlUmF0aW9zID0gbG9hZGVkLnJhdGlvcztcbiAgICB0aGlzLmNhY2hlZEltYWdlV2lkdGggPSBsb2FkZWQuc2l6ZXM/LlswXSA/PyB0aGlzLmNhY2hlZEltYWdlV2lkdGg7XG4gICAgdGhpcy5jYWNoZWRJbWFnZUhlaWdodCA9IGxvYWRlZC5zaXplcz8uWzFdID8/IHRoaXMuY2FjaGVkSW1hZ2VIZWlnaHQ7XG4gICAgdGhpcy5jYWNoZWRGcmFtZU9yaWdpbiA9IFswLCAwXTsgLy8gZnVsbCBwcmV2aWV3XG4gICAgdGhpcy5jYWNoZWRJc0dyYXlzY2FsZSA9ICEhaW1hZ2VJbmZvLmlzR3JheXNjYWxlO1xuICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgdGhlIHZpZXdwb3J0LWNoYW5nZSBzaWduYWwgaXMgT3BlblNlYWRyYWdvbidzXG4gICAqIChpdCByZS1zYW1wbGVzIG9uIE9TRCB6b29tL3BhbikuIFBsb3RseSdzIG93biBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlXG4gICAqIHNhbXBsaW5nIGNhY2hlIGlubGluZSwgc28gaXQgbmV2ZXIgZW1pdHMgaGVyZTsgcmV0dXJucyBFTVBUWSBzbyBhIHVuaWZvcm1cbiAgICogYElWaXN1YWxpemVyYCBjb25zdW1lciBjYW4gc3Vic2NyaWJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdGl2ZSBiYWNrZW5kLlxuICAgKi9cbiAgcHVibGljIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICAvKipcbiAgICogUmUtZmV0Y2ggdGhlIGdpdmVuIGltYWdlLXBpeGVsIFJPSSBhdCB0aGUgZGlzcGxheSByZXNvbHV0aW9uIGFuZCB1c2UgaXQgYXNcbiAgICogdGhlIGludGVuc2l0eS1zYW1wbGluZyBzb3VyY2UsIHNvIHRoZSBwcm9maWxlIHJlZmxlY3RzIHRoZSBkYXRhIGF0IHRoZVxuICAgKiBjdXJyZW50IHpvb20gbGV2ZWwuIFNoYXJlZCBieSBib3RoIGJhY2tlbmRzOiB0aGUgT1NEIHZpZXdwb3J0LWNoYW5nZSBob29rXG4gICAqIGNhbGxzIGl0IG9uIHpvb20vcGFuOyBQbG90bHkncyBvd24gaGlnaC1kZWYgem9vbSAodHJpZ2dlclpvb20pIHVwZGF0ZXMgdGhlXG4gICAqIHNhbWUgY2FjaGUgaW5saW5lLiBgcm9pYCBpcyBpbiBmdWxsLWltYWdlIHBpeGVsIGNvb3JkaW5hdGVzLlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgcmV0dXJuO1xuICAgIC8vIFJlbWVtYmVyIHRoZSB2aXNpYmxlIHJlZ2lvbiBzbyBhIG5ldyBwcm9maWxlIGxpbmUgaXMgcGxhY2VkIGluc2lkZSBpdC5cbiAgICB0aGlzLmxhc3RWaXNpYmxlUm9pID0geyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH07XG4gICAgY29uc3Qgcm9pID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgIHJvaS54ID0gTWF0aC5yb3VuZCh4KTsgcm9pLnkgPSBNYXRoLnJvdW5kKHkpO1xuICAgIHJvaS53aWR0aCA9IE1hdGgucm91bmQod2lkdGgpOyByb2kuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgIGNvbnN0IHNjcmVlbiA9IHRoaXMucGxvdFV0aWxpdGllcy5nZXREb21SZWN0YW5nbGUoJ2RpYWdyYW0nKTtcbiAgICAvLyBTbmFwc2hvdCB0aGUgZmlsZW5hbWUgc28gYSByZXNwb25zZSB0aGF0IGFycml2ZXMgYWZ0ZXIgdGhlIHVzZXIgc3dpdGNoZWRcbiAgICAvLyBmaWxlcyBpcyBkcm9wcGVkICh0aGUgcmVxdWVzdCBjYXJyaWVkIHRoZSBmaWxlIHNlbGVjdGVkIGF0IGNhbGwgdGltZSkuXG4gICAgY29uc3QgcmVxTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy50aWxlcy56b29tT25SZWdpb24ocm9pLCBzY3JlZW4sIHpJbmRleCB8fCAwKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHpvb21EYXRhKSA9PiB7XG4gICAgICAgIEltYWdlLmxvYWQoQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoem9vbURhdGEpKSkudGhlbigoaW1hZ2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmZpbGVOYW1lICE9PSByZXFOYW1lKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgaXNHcmF5ID0gISF0aGlzLmltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBpc0dyYXlcbiAgICAgICAgICAgID8gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoaW1hZ2UuZ3JleSgpLmRhdGEsIGltYWdlLndpZHRoKVxuICAgICAgICAgICAgOiB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChpbWFnZS5nZXRQaXhlbHNBcnJheSgpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgdGhpcy5zZXRTYW1wbGluZ0ZyYW1lcyhbZnJhbWVdLCBbcm9pLndpZHRoIC8gaW1hZ2Uud2lkdGgsIHJvaS5oZWlnaHQgLyBpbWFnZS5oZWlnaHRdLFxuICAgICAgICAgICAgW3JvaS54LCByb2kueV0pO1xuICAgICAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IC8qIGtlZXAgdGhlIHByZXZpb3VzIHNhbXBsaW5nIGZyYW1lIG9uIGEgZmFpbGVkIGNyb3AgZmV0Y2ggKi8gfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGUgdGhlIGFjdGl2ZSBmcmFtZSdzIGludGVuc2l0eSAoZ3JheXNjYWxlIHZhbHVlIG9yIFJHQiBsdW1pbmFuY2UpXG4gICAqIGFsb25nIHRoZSBsaW5lIFJPSS4gUmV0dXJucyBkaXN0YW5jZS1hbG9uZy1saW5lIHBvc2l0aW9ucyBhbmQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSW50ZW5zaXR5UHJvZmlsZShsaW5lOiBhbnkpOiBJbnRlbnNpdHlQcm9maWxlIHtcbiAgICBjb25zdCBlbXB0eTogSW50ZW5zaXR5UHJvZmlsZSA9IHsgcG9zaXRpb25zOiBbXSwgdmFsdWVzOiBbXSB9O1xuICAgIGlmICghdGhpcy5jYWNoZWRJbWFnZUZyYW1lcz8ubGVuZ3RoIHx8ICFsaW5lKSByZXR1cm4gZW1wdHk7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmNhY2hlZEltYWdlRnJhbWVzW3RoaXMuYWN0aXZlRnJhbWVJbmRleCgpXSA/PyB0aGlzLmNhY2hlZEltYWdlRnJhbWVzWzBdO1xuICAgIGlmICghZnJhbWU/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgIGNvbnN0IHJ4ID0gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1swXSB8fCAxO1xuICAgIGNvbnN0IHJ5ID0gdGhpcy5jYWNoZWRJbWFnZVJhdGlvc1sxXSB8fCByeDtcbiAgICBjb25zdCBbb3gsIG95XSA9IHRoaXMuY2FjaGVkRnJhbWVPcmlnaW47XG4gICAgY29uc3QgeDAgPSArbGluZS54MCwgeTAgPSArbGluZS55MCwgeDEgPSArbGluZS54MSwgeTEgPSArbGluZS55MTtcbiAgICBjb25zdCBkeERhdGEgPSB4MSAtIHgwLCBkeURhdGEgPSB5MSAtIHkwO1xuICAgIC8vIFNjYWxlIHRoZSBhbG9uZy1saW5lIGRpc3RhbmNlIGJ5IHRoZSBwaHlzaWNhbCBwaXhlbCBzaXplIChtaWNyb25zL3BpeGVsKVxuICAgIC8vIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgb25lIOKAlCBhbmlzb3Ryb3BpYyBtcHBYL21wcFkgYXJlIGFwcGxpZWQgcGVyIGF4aXMgc29cbiAgICAvLyBkaWFnb25hbCBsaW5lcyBtZWFzdXJlIHRoZSB0cnVlIHBoeXNpY2FsIGxlbmd0aC4gRmFsbHMgYmFjayB0byBwaXhlbHMuXG4gICAgY29uc3QgeyBtcHBYLCBtcHBZIH0gPSB0aGlzLmN1cnJlbnRNcHAoKTtcbiAgICBjb25zdCB1c2VNaWNyb25zID0gbXBwWCAhPSBudWxsO1xuICAgIGNvbnN0IGxlbkRhdGEgPSB1c2VNaWNyb25zXG4gICAgICA/IE1hdGguaHlwb3QoZHhEYXRhICogbXBwWCwgZHlEYXRhICogKG1wcFkgPz8gbXBwWCkpXG4gICAgICA6IE1hdGguaHlwb3QoZHhEYXRhLCBkeURhdGEpO1xuICAgIGNvbnN0IGxlblB4ID0gTWF0aC5oeXBvdChkeERhdGEgLyByeCwgZHlEYXRhIC8gcnkpO1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgyLCBNYXRoLnJvdW5kKGxlblB4KSk7XG4gICAgY29uc3QgaCA9IGZyYW1lLmxlbmd0aDtcbiAgICBjb25zdCB3ID0gZnJhbWVbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IHBvc2l0aW9uczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IHQgPSBpIC8gKG4gLSAxKTtcbiAgICAgIC8vIE1hcCBkYXRhIGNvb3JkcyB0byB0aGUgY2FjaGVkIGZyYW1lJ3MgcGl4ZWwgZ3JpZCwgb2Zmc2V0IGJ5IHRoZSBmcmFtZSdzXG4gICAgICAvLyBvcmlnaW4gKG5vbi16ZXJvIHdoZW4gdGhlIGZyYW1lIGlzIGEgem9vbWVkIGNyb3ApLlxuICAgICAgY29uc3QgcHggPSBNYXRoLnJvdW5kKCh4MCArIHQgKiBkeERhdGEgLSBveCkgLyByeCk7XG4gICAgICBjb25zdCBweSA9IE1hdGgucm91bmQoKHkwICsgdCAqIGR5RGF0YSAtIG95KSAvIHJ5KTtcbiAgICAgIGxldCB2ID0gMDtcbiAgICAgIGlmIChweCA+PSAwICYmIHB4IDwgdyAmJiBweSA+PSAwICYmIHB5IDwgaCkge1xuICAgICAgICBjb25zdCBjZWxsID0gZnJhbWVbcHldW3B4XTtcbiAgICAgICAgdiA9IEFycmF5LmlzQXJyYXkoY2VsbCkgPyAoMC4yOTkgKiBjZWxsWzBdICsgMC41ODcgKiBjZWxsWzFdICsgMC4xMTQgKiBjZWxsWzJdKSA6IGNlbGw7XG4gICAgICB9XG4gICAgICBwb3NpdGlvbnMucHVzaCh0ICogbGVuRGF0YSk7XG4gICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcG9zaXRpb25zLCB2YWx1ZXMsIHVuaXQ6IHVzZU1pY3JvbnMgPyAnwrVtJyA6ICdweCcgfTtcbiAgfVxuXG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIChtaWNyb25zL3BpeGVsKSBmb3IgdGhlIGN1cnJlbnQgaW1hZ2UsIGlmIGtub3duLlxuICAgKiAgbXBwIGlzIGNvbnN0YW50IGFjcm9zcyBmcmFtZXMvY2hhbm5lbHMsIHNvIHRoZSBmaXJzdCBtZXRhZGF0YSBlbnRyeSB0aGF0XG4gICAqICBjYXJyaWVzIGEgcG9zaXRpdmUgbXBwWCB3aW5zLiBSZXR1cm5zIG51bGxzIHdoZW4gdGhlIGltYWdlIGlzIHVuc2NhbGVkLiAqL1xuICBwcml2YXRlIGN1cnJlbnRNcHAoKTogeyBtcHBYOiBudW1iZXIgfCBudWxsOyBtcHBZOiBudW1iZXIgfCBudWxsIH0ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmltYWdlSW5mbz8uaW1hZ2VNZXRhO1xuICAgIGNvbnN0IG0gPSBBcnJheS5pc0FycmF5KG1ldGEpXG4gICAgICA/IChtZXRhLmZpbmQoZSA9PiBlICYmIChlLm1wcFggPz8gMCkgPiAwKSA/PyBtZXRhWzBdKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbXBwWCA9IG0gJiYgKG0ubXBwWCA/PyAwKSA+IDAgPyAobS5tcHBYIGFzIG51bWJlcikgOiBudWxsO1xuICAgIGNvbnN0IG1wcFkgPSBtICYmIChtLm1wcFkgPz8gMCkgPiAwID8gKG0ubXBwWSBhcyBudW1iZXIpIDogbnVsbDtcbiAgICByZXR1cm4geyBtcHBYLCBtcHBZIH07XG4gIH1cblxuICAvKipcbiAgICogYXV0b3NjYWxlIHRoZSBwbG90XG4gICAqL1xuICBwdWJsaWMgYXV0b3NjYWxlKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gW107XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAgICd4YXhpcy5hdXRvcmFuZ2UnOiB0cnVlLFxuICAgICAgICAneWF4aXMuYXV0b3JhbmdlJzogZmFsc2UgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVsYXlvdXQgdGhlIHBsb3RcbiAgICovXG4gIHB1YmxpYyByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pIHtcbiAgICBsZXQgaW1nU2l6ZTtcbiAgICBpZiAodHJ1ZUltYWdlU2l6ZSkge1xuICAgICAgaW1nU2l6ZSA9IHRydWVJbWFnZVNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZ1NpemUgPSB0aGlzLnRydWVJbWdTaXplO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICAvLyBSZWZyZXNoIGhlaWdodCBmcm9tIGN1cnJlbnQgRE9NIHNvIHBhbmVsIHJlc2l6ZXMgYXJlIHJlZmxlY3RlZFxuICAgICAgY29uc3QgcGxvdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICAgIGlmIChwbG90RWw/Lm9mZnNldEhlaWdodCkge1xuICAgICAgICB0aGlzLnNjcmVlbkhlaWdodCA9IHBsb3RFbC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy56b29tQ29vcmRpbmF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHRoaXMuZ2V0SGVhdG1hcExheW91dChcbiAgICAgICAgICAgIFt0aGlzLnpvb21Db29yZGluYXRlc1swXSwgdGhpcy56b29tQ29vcmRpbmF0ZXNbMV1dLFxuICAgICAgICAgICAgW3RoaXMuem9vbUNvb3JkaW5hdGVzWzJdLCB0aGlzLnpvb21Db29yZGluYXRlc1szXV0pKTsgICAgLy8gcmV2ZXJzZSB0aGUgeSByYW5nZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFzIGF1dG9yYW5nZSBpcyBzZXQgdG8gZmFsc2UsIGFuZCBub3QgcmV2ZXJzZWQgd2UgbmVlZCB0byBzZXQgdGhlIHlyYW5nZSBjb3JyZWNseSBoZXJlXG4gICAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5nZXRIZWF0bWFwTGF5b3V0KFxuICAgICAgICAgICAgW2ltZ1NpemVbMF0sIGltZ1NpemVbMV1dLCBbaW1nU2l6ZVszXSwgaW1nU2l6ZVsyXV0pKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgZXJyPy5zdGF0dXNUZXh0IHx8IFN0cmluZyhlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cmVkJywgZXJyKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IFZJWl9BTEVSVF9UT0FTVF9LRVksIHN0aWNreTogdHJ1ZSwgc2V2ZXJpdHk6J2Vycm9yJywgc3VtbWFyeTonQW4gZXJyb3Igb2NjdXJlZCcsIGRldGFpbDpgVGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIG9jY3VyZWQ6ICR7bXNnfS4gUGxlYXNlIHRyeSB0byBvcGVuIHRoZSBpbWFnZSBhZ2FpbiB0aHJvdWdoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbmF2aWdhdG9yLmAgfSk7XG4gICAgICAgIC8vIFRPRE8gY29ycmVjdGx5IGNsZWFyIHRoZSBwbG90XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEV2ZW50cyhwbG90RGl2OiBzdHJpbmcsIGlzR3JheXNjYWxlOiBib29sZWFuLCBzY3JlZW5IZWlnaHQ6IG51bWJlcikge1xuICAgIHRoaXMuaW1hZ2VJbmZvLmlzR3JheXNjYWxlID0gaXNHcmF5c2NhbGU7XG4gICAgdGhpcy5zY3JlZW5IZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgY29uc3QgcGxvdDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdik7XG4gICAgaWYgKHBsb3QpIHtcbiAgICAgIC8vIHVuYmluZCBwcmV2aW91cyBldmVudFxuICAgICAgcGxvdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbG90bHlfcmVsYXlvdXQnLCB0aGlzLm9uUmVsYXlvdXRFdmVudCk7XG4gICAgICAvLyBiaW5kIG5ldyBldmVudFxuICAgICAgcGxvdC5vbigncGxvdGx5X3JlbGF5b3V0JywgdGhpcy5vblJlbGF5b3V0RXZlbnQpO1xuXG4gICAgICAvLyBDbGlja2luZyBvbiBhIHNoYXBlIGFjdGl2YXRlcyBpdCBidXQgUGxvdGx5IGRvZXNuJ3QgZmlyZSBhIGRlZGljYXRlZFxuICAgICAgLy8gZXZlbnQg4oCUIHNhbXBsZSBfYWN0aXZlU2hhcGVJbmRleCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sgc28gc3Vic2NyaWJlcnNcbiAgICAgIC8vIChSZWdpb24gRWRpdG9yKSBjYW4gbWlycm9yIHRoZSBzZWxlY3Rpb24uXG4gICAgICBwbG90LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25QbG90TW91c2VEb3duKTtcbiAgICAgIHRoaXMub25QbG90TW91c2VEb3duID0gKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLm1heWJlRW1pdEFjdGl2ZVNoYXBlSW5kZXgoKSwgMCk7XG4gICAgICBwbG90LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25QbG90TW91c2VEb3duKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbGF5b3V0RXZlbnRIYW5kbGVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZXZlbnQpLmluY2x1ZGVzKCdkcmFnbW9kZScpKSB7XG4gICAgICB0aGlzLmRyYWdNb2RlID0gZXZlbnQuZHJhZ21vZGU7XG4gICAgfVxuICAgIC8vIHdoZW4gcmVsYXlvdXQgZXZlbnQgb2NjdXJzXG4gICAgLy8gdXBkYXRlIHRoZSByZWdpb24gc2VsZWN0aW9uIHVkcGRhdGVzXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50KTtcbiAgICBsZXQgc2hhcGVzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICBrZXlzLmZvckVhY2goKGtleTogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LnN0YXJ0c1dpdGgoJ3NoYXBlc1snKSkge1xuICAgICAgICBjb25zdCBzaGFwZU51bWJlciA9ICtrZXkuc3BsaXQoJ1snKVsxXS5zcGxpdCgnXScpWzBdO1xuICAgICAgICBjb25zdCBzaGFwZUNoYW5nZSA9IGtleS5zcGxpdCgnLicpWzFdO1xuICAgICAgICBpZiAodGhpcy5zaGFwZXMgJiYgdGhpcy5zaGFwZXNbc2hhcGVOdW1iZXJdKSB7XG4gICAgICAgICAgaWYgKHNoYXBlQ2hhbmdlID09PSAncGF0aCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVzW3NoYXBlTnVtYmVyXVtzaGFwZUNoYW5nZV0gPSB0aGlzLnBsb3RVdGlsaXRpZXMucm91bmRQYXRoQ29vcmRpbmF0ZXMoZXZlbnRba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVzW3NoYXBlTnVtYmVyXVtzaGFwZUNoYW5nZV0gPSBNYXRoLnJvdW5kKCtldmVudFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hhcGVzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHNoYXBlc01vZGlmaWVkKSB7XG4gICAgICAvLyBNaXJyb3IgdGhlIGluLXBsYWNlIGVkaXQgaW50byB0aGUgc2hhcmVkIHN0b3JlIChzeW5jcyBpdHMgY2FjaGUgKyBlbWl0cykuXG4gICAgICB0aGlzLmNvbW1pdFNoYXBlc1RvU3RvcmUoKTtcbiAgICB9XG4gICAgLy8gbWFuYWdlIGhpZ2ggZGVmIHpvb20gKG5vdCBpZiB3ZSBhcmUgc2hvd2luZyBhIHN0YWNrKVxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gNCAmJiB0aGlzLmlzUmVhbFpvb20pIHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzOiBhbnlbXSA9IFtdO1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgneGF4aXMucmFuZ2VbJykpIHtcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKGV2ZW50W2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgneWF4aXMucmFuZ2VbJykpIHtcbiAgICAgICAgICBjb29yZGluYXRlcy5wdXNoKGV2ZW50W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuem9vbUNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG4gICAgICBpZiAoIXRoaXMuaW1hZ2VJbmZvLnNob3dTdGFjaykge1xuICAgICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2hlbiBzaGFwZSBpcyBjcmVhdGVkXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmICdzaGFwZXMnIGluIGV2ZW50KSB7XG4gICAgICB0aGlzLnNoYXBlcyA9IGV2ZW50LnNoYXBlcyBhcyBhbnlbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaGFwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQSBmcmVzaGx5IFBsb3RseS1kcmF3biBzaGFwZSBoYXMgbm8gaWQgeWV0IOKAlCBnaXZlIGl0IGEgbGFiZWwgb2JqZWN0XG4gICAgICAgIC8vICh3aGVuIGxhYmVscyBhcmUgb24pIGJlZm9yZSB0aGUgc3RvcmUgbWludHMgaWQgKyBkZWZhdWx0IG5hbWUuXG4gICAgICAgIGNvbnN0IGlzTmV3ID0gdGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbDtcbiAgICAgICAgdGhpcy5zaGFwZXNbaV0uZmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgICB0aGlzLnNoYXBlc1tpXSA9IHRoaXMucGxvdFV0aWxpdGllcy5zbmFwUmVnaW9uKHRoaXMuc2hhcGVzW2ldKTtcbiAgICAgICAgaWYgKGlzTmV3ICYmIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSkge1xuICAgICAgICAgIHRoaXMuc2hhcGVzW2ldLmxhYmVsID0geyB0ZXh0OiB0aGlzLnNoYXBlc1tpXS5sYWJlbCxcbiAgICAgICAgICAgIHRleHR0ZW1wbGF0ZTogdGhpcy5zaGFwZXNbaV0ubGFiZWwsXG4gICAgICAgICAgICBmb250OiB7IGNvbG9yOiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSB9LFxuICAgICAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWludCBpZHMvbmFtZXMgaW4gdGhlIHN0b3JlLCB3cml0ZSB0aGVtIGJhY2sgb250byB0aGUgZGljdHMsIGFuZCBlbWl0LlxuICAgICAgdGhpcy5jb21taXRTaGFwZXNUb1N0b3JlKCk7XG4gICAgICBpZiAodGhpcy5pc1JlZ2lvblNhdmVkT24pIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGlmIGF1dG9zY2FsZVxuICAgIGlmIChrZXlzLmluY2x1ZGVzKCd4YXhpcy5hdXRvcmFuZ2UnKSAmJiBrZXlzLmluY2x1ZGVzKCd5YXhpcy5hdXRvcmFuZ2UnKSkge1xuICAgICAgLy8gdHJpZ2dlciBhbiBhdXRvc2NhbGUgZXZlbnQgdG8gcmVzZXQgdGhlIHNlbGVjdGVkIGltYWdlIG1vZGUgZHJvcGRvd25cbiAgICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQubmV4dCgnYW4gYXV0b3NjYWxlIGhhcyBoYXBwZW5lZCcpO1xuICAgICAgLy8gc2VsZWN0IGRpc3BsYXkgdHlwZSB0byB0cmlnZ2VyIGEgbmV3IHBsb3R0aW5nIHVwZGF0ZSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHBsb3R0aW5nIHBhcmFtZXRlcnMgc2V0XG4gICAgICB0aGlzLnRpbGVzLnNlbGVjdERpYWdyYW1EaXNwbGF5KCk7XG4gICAgfVxuICAgIC8vIGlmIHNob3dzdGFjayBvciBhc3BlY3RyYXRpbyBldmVudFxuICAgIGlmIChldmVudC5zaG93c3RhY2sgIT09IHVuZGVmaW5lZCB8fCBldmVudC5hc3BlY3RyYXRpbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTZXQgbmV3IGltYWdlIGluZm8gdG8gdHJpZ2dlciBhIHBsb3QgdXBkYXRlXG4gICAgICB0aGlzLnNldEltYWdlSW5mbyhldmVudC5zaG93c3RhY2ssIGV2ZW50LmFzcGVjdHJhdGlvKTtcbiAgICB9XG5cbiAgICAvLyBQbG90bHkgbWF5IGhhdmUgdXBkYXRlZCB0aGUgYWN0aXZlIHNoYXBlIGluZGV4IGFzIHBhcnQgb2YgdGhlIHJlbGF5b3V0XG4gICAgLy8gKGUuZy4gY2xpY2tpbmcgYSBzaGFwZSdzIGVkaXQgaGFuZGxlLCBvciBmaW5pc2hpbmcgYSBkcmF3KSDigJQgc3VyZmFjZVxuICAgIC8vIHRoYXQgY2hhbmdlIHRvIHRoZSBSZWdpb24gRWRpdG9yLlxuICAgIHRoaXMubWF5YmVFbWl0QWN0aXZlU2hhcGVJbmRleCgpO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZEFuZFBsb3QoKSB7XG4gICAgdGhpcy5zZXRJbWFnZUluZm8oKTtcbiAgfVxuXG5cbiAgLy8g4pSA4pSAIFRvb2wgZGVsZWdhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHVibGljIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9uczogV2FuZE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGVzZSBzaW5nbGV0b25zLlxuICAgIGlmIChhY3RpdmUpIHRoaXMud2FuZFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogV2FuZE9wdGlvbnMpIHtcbiAgICB0aGlzLndhbmRUb29sLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCkge1xuICAgIHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCcnVzaE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zOiBCcnVzaE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIFJlLWJpbmQgdG8gb3Vyc2VsdmVzIGluIGNhc2UgdGhlIE9TRCBiYWNrZW5kIGxhc3QgdXNlZCB0aGlzIHNpbmdsZXRvbi5cbiAgICBpZiAoYWN0aXZlKSB0aGlzLmJydXNoVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IEJydXNoT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNpemUgIT0gbnVsbCkgdGhpcy5icnVzaFRvb2wuc2V0U2l6ZShvcHRpb25zLnNpemUpO1xuICB9XG5cbiAgcHVibGljIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgdGhpcy52ZXJ0ZXhFcmFzZXJUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpIHtcbiAgICB0aGlzLnZlcnRleEVyYXNlclRvb2wuc2V0UmFkaXVzKHJhZGl1cyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAvLyBUaGUgem9vbS10by1ib3ggdG9vbCBpcyBhIHJvb3Qgc2luZ2xldG9uIHNoYXJlZCB3aXRoIHRoZSBPU0QgYmFja2VuZCxcbiAgICAvLyB3aGljaCByZWJpbmRzIGl0IHRvIGl0cyBvd24gaG9zdCBvbiBhY3RpdmF0aW9uLiBSZWJpbmQgdG8gb3VycyB3aGVuIHdlXG4gICAgLy8gYWN0aXZhdGUgc28gYSBwcmlvciBPU0Qgem9vbS10by1ib3ggZG9lc24ndCBsZWF2ZSB0aGUgc2luZ2xldG9uIHBvaW50aW5nXG4gICAgLy8gYXQgT1NEJ3MgY29vcmRpbmF0ZS96b29tIGhhbmRsZXJzICh3aGljaCB3b3VsZCBicmVhayBib3gtem9vbSBvbiBoZWF0bWFwcykuXG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5iaW5kWm9vbVRvQm94SG9zdCgpO1xuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cblxuICAvKiogQmluZCB0aGUgc2hhcmVkIHpvb20tdG8tYm94IHRvb2wgdG8gdGhpcyAoUGxvdGx5KSBiYWNrZW5kJ3MgaG9zdC4gKi9cbiAgcHJpdmF0ZSBiaW5kWm9vbVRvQm94SG9zdCgpIHtcbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuYmluZEhvc3Qoe1xuICAgICAgZ2V0UGxvdERpdjogKCkgPT4gdGhpcy5wbG90RGl2LFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHRoaXMuem9vbUJveFBpeGVsVG9EYXRhKHB4LCBweSksXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU06IHNlZ21lbnQgdGhlIGRyYXduIHJlY3RhbmdsZXMuIFRoZSBTQU0gdG9vbCByZXVzZXMgdGhlXG4gICAqICB3YW5kIGhvc3QgKGNhY2hlZCBmcmFtZSArIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgcmVnaW9uIHN0b3JlKS4gKi9cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgcHVibGljIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgcHVibGljIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvb2wuc2V0TW9kZWwoaWQpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGVsKGlkKTtcbiAgfVxuICBwdWJsaWMgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBwdWJsaWMgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jb21taXQoKTsgfVxuICBwdWJsaWMgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7IH1cblxuICAvKipcbiAgICogVG9vbC1ob3N0IGNhbGxiYWNrOiBhcHBseSB0aGUgem9vbS10by1ib3ggc2VsZWN0aW9uLiBTdGFjayBtb2RlIGRvZXMgYVxuICAgKiBwdXJlIGF4aXMtcmFuZ2UgcmVsYXlvdXQ7IG5vbi1zdGFjayBtb2RlIGdvZXMgdGhyb3VnaCB0aGUgaGlnaC1kZWZcbiAgICogdHJpZ2dlclpvb20gcGlwZWxpbmUgc28gdGhlIGltYWdlIGlzIHJlLWZldGNoZWQgYXQgdGhlIG5ldyByZXNvbHV0aW9uLlxuICAgKi9cbiAgLyoqIE92ZXJsYXktcGl4ZWwgLT4gUGxvdGx5IGRhdGEgY29vcmRzIHZpYSB0aGUgYXhpcyBvYmplY3RzIChzdWJ0cmFjdGluZyB0aGVcbiAgICogIHBsb3QgbWFyZ2luIG9mZnNldCkuIFRoZSB6b29tLXRvLWJveCB0b29sIGNhbGxzIHRoaXMgdGhyb3VnaCBpdHMgaG9zdC4gKi9cbiAgcHJpdmF0ZSB6b29tQm94UGl4ZWxUb0RhdGEocHg6IG51bWJlciwgcHk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgY29uc3QgeGF4aXMgPSBnZC5fZnVsbExheW91dC54YXhpcztcbiAgICBjb25zdCB5YXhpcyA9IGdkLl9mdWxsTGF5b3V0LnlheGlzO1xuICAgIHJldHVybiB7IHg6IHhheGlzLnAyZChweCAtIHhheGlzLl9vZmZzZXQpLCB5OiB5YXhpcy5wMmQocHkgLSB5YXhpcy5fb2Zmc2V0KSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pIHtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGlmICh0aGlzLmltYWdlSW5mbz8uc2hvd1N0YWNrKSB7XG4gICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7XG4gICAgICAgICd4YXhpcy5yYW5nZVswXSc6IGNvb3JkaW5hdGVzWzBdLFxuICAgICAgICAneGF4aXMucmFuZ2VbMV0nOiBjb29yZGluYXRlc1sxXSxcbiAgICAgICAgJ3lheGlzLnJhbmdlWzBdJzogY29vcmRpbmF0ZXNbMl0sXG4gICAgICAgICd5YXhpcy5yYW5nZVsxXSc6IGNvb3JkaW5hdGVzWzNdLFxuICAgICAgfSBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaWdnZXJab29tKGNvb3JkaW5hdGVzKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgSVZpZXdwb3J0SG9zdCBpbXBsZW1lbnRhdGlvbiAoZm9yIHRoZSBvbi1jYW52YXMgdG9vbHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgcGxvdCBlbGVtZW50IHRoZSB0b29sIGNhbnZhcyBvdmVybGF5cyBhdHRhY2ggdG8uICovXG4gIHB1YmxpYyBnZXRPdmVybGF5Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICB9XG5cbiAgLyoqIFBsb3RseSBjb29yZGluYXRlIHRyYW5zZm9ybSAoc2NyZWVuIDwtPiBkYXRhIHZpYSB0aGUgYXhpcyBvYmplY3RzKS4gKi9cbiAgcHVibGljIGdldENvb3JkaW5hdGVUcmFuc2Zvcm0oKTogSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVUcmFuc2Zvcm07XG4gIH1cblxuICAvLyDilIDilIAgV2FuZFRvb2xIb3N0IGltcGxlbWVudGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBQaXhlbCBkYXRhIHRoZSB3YW5kIG5lZWRzIGZvciBzYW1wbGluZy4gbnVsbCA9IG5vIGltYWdlIGxvYWRlZC4gKi9cbiAgcHJpdmF0ZSBnZXRDYWNoZWRJbWFnZURhdGEoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgZnJhbWVzOiB0aGlzLmNhY2hlZEltYWdlRnJhbWVzLFxuICAgICAgd2lkdGg6IHRoaXMuY2FjaGVkSW1hZ2VXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jYWNoZWRJbWFnZUhlaWdodCxcbiAgICAgIHJhdGlvczogdGhpcy5jYWNoZWRJbWFnZVJhdGlvcyxcbiAgICAgIGlzR3JheXNjYWxlOiB0aGlzLmNhY2hlZElzR3JheXNjYWxlLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgc2hhcmVkLXN0b3JlIHN5bmMgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gYHRoaXMuc2hhcGVzYCBpcyBQbG90bHkncyBvd24gcmVwcmVzZW50YXRpb24gKHRoZSBkaWN0IGFycmF5IFBsb3RseS5yZWxheW91dFxuICAvLyBjb25zdW1lcykuIFRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgsIGhvbGRpbmcgdGhlXG4gIC8vIG5ldXRyYWwgUmVnaW9uIG1vZGVsLiBUaGVzZSBoZWxwZXJzIGJyaWRnZSB0aGUgdHdvOiB3cml0ZXMgbWlycm9yXG4gIC8vIGB0aGlzLnNoYXBlc2AgSU5UTyB0aGUgc3RvcmU7IGltYWdlIHN3aXRjaGVzL2V4dGVybmFsIGNoYW5nZXMgcHJvamVjdCB0aGVcbiAgLy8gc3RvcmUgYmFjayBPVVQgdG8gYHRoaXMuc2hhcGVzYC5cblxuICAvKiogQnVpbGQgUGxvdGx5IHNoYXBlIGRpY3RzIGZyb20gdGhlIHN0b3JlJ3MgcmVnaW9ucyAodGhlIHJlbmRlciBwcm9qZWN0aW9uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zVG9TaGFwZURpY3RzKCk6IGFueVtdIHtcbiAgICBjb25zdCBzaG93TGFiZWwgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCk7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLm1hcChyID0+IHtcbiAgICAgIHIuZmlsZW5hbWUgPSB0aGlzLmZpbGVOYW1lO1xuICAgICAgcmV0dXJuIHsgLi4uci5nZXRTaGFwZShzaG93TGFiZWwpIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgZGljdCB3b3JraW5nLXNldCBmcm9tIHRoZSBzdG9yZSAoYWZ0ZXIgYW4gaW1hZ2Ugc3dpdGNoLCBvciB3aGVuXG4gICAqICByZWdpb25zIGNoYW5nZWQgd2hpbGUgYW5vdGhlciBiYWNrZW5kIHdhcyByZW5kZXJpbmcpLiAqL1xuICBwcml2YXRlIHN5bmNTaGFwZXNGcm9tU3RvcmUoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFwZXMgPSB0aGlzLnJlZ2lvbnNUb1NoYXBlRGljdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSBzaGFyZWQgc3RvcmUgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlIGN1cnJlbnQgZGljdCB3b3JraW5nLXNldDogY29udmVydFxuICAgKiBgdGhpcy5zaGFwZXNgIHRvIG5ldXRyYWwgcmVnaW9ucyBhbmQgcmVwbGFjZSB0aGUgc3RvcmUncyBsaXN0ICh0aGUgc3RvcmVcbiAgICogbWludHMgaWRzLCBhcHBsaWVzIGNsYXNzIGNvbG91cnMsIHN5bmNzIGl0cyBwZXItaW1hZ2UgY2FjaGUgYW5kIGVtaXRzIHRoZVxuICAgKiByZWdpb24tdXBkYXRlIGV2ZW50KS4gU3RvcmUtbWludGVkIGlkcyBhcmUgd3JpdHRlbiBiYWNrIG9udG8gdGhlIGRpY3RzIHNvIHRoZVxuICAgKiB0d28gcmVwcmVzZW50YXRpb25zIHN0YXkgYWxpZ25lZC4gUHJvZmlsZS1saW5lIFJPSXMgYXJlIG9yZGluYXJ5IHJlZ2lvbnNcbiAgICogKHRhZ2dlZCBga2luZDogJ3Byb2ZpbGUnYCkgYW5kIHJvdW5kLXRyaXAgdGhyb3VnaCBoZXJlIHRvby5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0U2hhcGVzVG9TdG9yZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5zaGFwZXNcbiAgICAgIC5tYXAocyA9PiBPYmplY3QuYXNzaWduKG5ldyBTaGFwZVNlbGVjdGlvbigpLCBzKS5nZXRSZWdpb24oKSk7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSwgdHJ1ZSxcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCksIGZhbHNlKTtcbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hhcGVzLmxlbmd0aCAmJiBpIDwgc3RvcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0uaWQgPT0gbnVsbCkgdGhpcy5zaGFwZXNbaV0uaWQgPSBzdG9yZWRbaV0uaWQ7XG4gICAgICBpZiAodGhpcy5zaGFwZXNbaV0ubmFtZSA9PSBudWxsKSB0aGlzLnNoYXBlc1tpXS5uYW1lID0gc3RvcmVkW2ldLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggdGhlIGN1cnJlbnQgYHRoaXMuc2hhcGVzYCB0byBQbG90bHksIG1pcnJvciB0aGVtIGludG8gdGhlIHNoYXJlZCBzdG9yZVxuICAgKiAod2hpY2ggc3luY3MgaXRzIGNhY2hlICsgZW1pdHMgdGhlIHJlZ2lvbi11cGRhdGUgZXZlbnQpLCBhbmQgcmVmcmVzaCB0aGVcbiAgICogbG9jYWwgcHJldmlvdXMtc2hhcGVzIGJ1ZmZlci4gVGhlIHdhbmQvZXJhc2VyIHRvb2xzIGNhbGwgdGhpcyBhZnRlciBtdXRhdGluZ1xuICAgKiB0aGUgc2hhcGVzIGFycmF5IGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIGFwcGx5U2hhcGVzQ2hhbmdlKCkge1xuICAgIGlmICh0aGlzLmlzUmVnaW9uU2F2ZWRPbikge1xuICAgICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gICAgfVxuICAgIHRoaXMuY29tbWl0U2hhcGVzVG9TdG9yZSgpO1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMuc2hhcGVzLm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgdGhpcy5zaGFwZXNSZWxheW91dChkaWN0QXJyYXkpIGFzIGFueSk7XG4gICAgICB9IGNhdGNoIHsgLyogZGl2IG93bmVkIGJ5IGFub3RoZXIgYmFja2VuZCAoT1NEKSDigJQgaXRzIG92ZXJsYXkgcmVuZGVycyBzaGFwZXMgKi8gfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBBY3RpdmUgZnJhbWUgaW5kZXggaW4gdGhlIGNhY2hlZCBpbWFnZSBzdGFjay4gKi9cbiAgcHJpdmF0ZSBhY3RpdmVGcmFtZUluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlZEltYWdlRnJhbWVzIHx8IHRoaXMuY2FjaGVkSW1hZ2VGcmFtZXMubGVuZ3RoIDw9IDEpIHJldHVybiAwO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGNvbnN0IHNsaWRlckFjdGl2ZSA9IGdkPy5fZnVsbExheW91dD8uc2xpZGVycz8uWzBdPy5hY3RpdmU7XG4gICAgaWYgKHR5cGVvZiBzbGlkZXJBY3RpdmUgPT09ICdudW1iZXInKSByZXR1cm4gc2xpZGVyQWN0aXZlO1xuICAgIHJldHVybiB0aGlzLnpJbmRleC52YWx1ZSB8fCAwO1xuICB9XG5cbiAgLyoqIENhcGFiaWxpdHktZ2F0ZWQgM0Qgc2NlbmUgY29udHJvbHMgKFBsb3RseSByZW5kZXJzIHRoZSAzRCBwbG90IHR5cGVzKS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN1cmZhY2VEcmFnTW9kZTogKG1vZGU6IHN0cmluZykgPT4gdGhpcy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSksXG4gICAgICByZXNldFN1cmZhY2VDYW1lcmE6ICgpID0+IHRoaXMucmVzZXRTdXJmYWNlQ2FtZXJhKCksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGxvdERpdikge1xuICAgICAgUGxvdGx5LnJlbGF5b3V0KHRoaXMucGxvdERpdiwgeyAnc2NlbmUuZHJhZ21vZGUnOiBtb2RlIH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXRTdXJmYWNlQ2FtZXJhKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgJ3NjZW5lLmNhbWVyYSc6IHt9IH0gYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJab29tKGNvb3JkaW5hdGVzOiBudW1iZXJbXSkge1xuICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDAgfHwgIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybjtcbiAgICB0aGlzLnpvb21Db29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0UmVjdGFuZ2xlKGNvb3JkaW5hdGVzLCB0aGlzLnRydWVJbWdTaXplKTtcbiAgICBpZiAodGhpcy5wbG90VXRpbGl0aWVzLmlzWm9vbVNhbWVBc0ltZ1NpemUocmVjdCwgdGhpcy50cnVlSW1nU2l6ZSkpIHtcbiAgICAgIHRoaXMuYXV0b3NjYWxlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgYnJpZWYgXCJDYWNoaW5nIGltYWdlLi4uXCIgbWVzc2FnZSBmb3IgdW5jYWNoZWQgZmlsZXMgKGxhcmdlIGZpbGVzIHRha2UgYVxuICAgIC8vIG1vbWVudCB0byBjYWNoZSk7IGp1c3QgYSBzcGlubmVyIG90aGVyd2lzZS5cbiAgICB0aGlzLnN0YXRlLnNldEltYWdlTG9hZGluZ01lc3NhZ2UodGhpcy5pbWFnZUNhY2hlZCA/ICcnIDogJ0NhY2hpbmcgaW1hZ2UuLi4nKTtcbiAgICBjb25zdCBzY3JlZW4gPSB0aGlzLnBsb3RVdGlsaXRpZXMuZ2V0RG9tUmVjdGFuZ2xlKCdkaWFncmFtJyk7XG4gICAgY29uc3QgaW1hZ2VTaXplOiBhbnlbXSA9IFtdO1xuICAgIGltYWdlU2l6ZVswXSA9IHJlY3QueDtcbiAgICBpbWFnZVNpemVbMV0gPSByZWN0LnggKyByZWN0LndpZHRoO1xuICAgIGltYWdlU2l6ZVsyXSA9IHJlY3QueTtcbiAgICBpbWFnZVNpemVbM10gPSByZWN0LnkgKyByZWN0LmhlaWdodDtcbiAgICAvLyBTbmFwc2hvdCB0aGUgZmlsZW5hbWUgc28gYSByZXNwb25zZSB0aGF0IGFycml2ZXMgYWZ0ZXIgdGhlIHVzZXIgc3dpdGNoZWRcbiAgICAvLyBmaWxlcyBpcyBkcm9wcGVkICh0aGUgcmVxdWVzdCBjYXJyaWVkIHRoZSBmaWxlIHNlbGVjdGVkIGF0IGNhbGwgdGltZSkuXG4gICAgY29uc3QgcmVxTmFtZSA9IHRoaXMuZmlsZU5hbWU7XG4gICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5zdGF0ZS5zZXRab29tKHRydWUpO1xuICAgIHRoaXMudGlsZXMuem9vbU9uUmVnaW9uKHJlY3QsIHNjcmVlbiwgdGhpcy56SW5kZXgudmFsdWUpLnN1YnNjcmliZSh7IG5leHQ6IHpvb21EYXRhID0+IHtcbiAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSh6b29tRGF0YSk7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh1aW50OEFycmF5KTtcbiAgICAgIEltYWdlLmxvYWQoYnVmZmVyKS50aGVuKChpbWFnZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHhSYXRpbyA9IHJlY3Qud2lkdGggLyBpbWFnZS53aWR0aDtcbiAgICAgICAgY29uc3QgeVJhdGlvID0gcmVjdC5oZWlnaHQgLyBpbWFnZS5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmZpbGVOYW1lID09PSByZXFOYW1lKSB7XG4gICAgICAgICAgY29uc3QgaXNHcmF5ID0gdGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGU7XG4gICAgICAgICAgY29uc3QgZnJhbWUgPSBpc0dyYXlcbiAgICAgICAgICAgID8gdGhpcy5wbG90VXRpbGl0aWVzLmFycmF5VG9NYXRyaXgoaW1hZ2UuZ3JleSgpLmRhdGEsIGltYWdlLndpZHRoKVxuICAgICAgICAgICAgOiB0aGlzLnBsb3RVdGlsaXRpZXMuYXJyYXlUb01hdHJpeChpbWFnZS5nZXRQaXhlbHNBcnJheSgpLCBpbWFnZS53aWR0aCk7XG4gICAgICAgICAgLy8gQWxzbyBzYW1wbGUgdGhlIGludGVuc2l0eSBwcm9maWxlcyBmcm9tIHRoaXMgaGlnaC1kZWYgY3JvcCBzbyB0aGVcbiAgICAgICAgICAvLyBpbnNldCByZWZsZWN0cyB0aGUgem9vbS1sZXZlbCByZXNvbHV0aW9uIChvcmlnaW4gPSBjcm9wIHRvcC1sZWZ0KS5cbiAgICAgICAgICB0aGlzLnNldFNhbXBsaW5nRnJhbWVzKFtmcmFtZV0sIFt4UmF0aW8sIHlSYXRpb10sIFtpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsyXV0pO1xuICAgICAgICAgIHRoaXMuZW1pdFByb2ZpbGVzKCk7XG4gICAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBoaWdoLWRlZiBjcm9wIGluIHRoZSBTQU1FIHBsb3QgdHlwZSB0aGUgdXNlciBpc1xuICAgICAgICAgIC8vIHZpZXdpbmcuIFdpdGhvdXQgdGhpcyB0aGUgem9vbSByZS1mZXRjaCBhbHdheXMgZmVsbCBiYWNrIHRvIGFcbiAgICAgICAgICAvLyBoZWF0bWFwLCBzbyB6b29taW5nIGluIGNvbnRvdXIgKG9yIGFueSByZWdpc3RyeSB0eXBlKSByZXZlcnRlZFxuICAgICAgICAgIC8vIHRvIGhlYXRtYXAuXG4gICAgICAgICAgY29uc3QgaW1wbCA9IFBMT1RMWV9QTE9UX1RZUEVfSU1QTFNbdGhpcy5wbG90VHlwZV07XG4gICAgICAgICAgY29uc3QgcmVuZGVyUHJvbWlzZSA9IGltcGxcbiAgICAgICAgICAgID8gdGhpcy5wbG90VmlhUmVnaXN0cnkodGhpcy5wbG90RGl2LCBpbXBsLFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUcmFjZUlucHV0KHRoaXMuaW1hZ2VJbmZvLCB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiBbZnJhbWVdLCByYXRpb3M6IFt4UmF0aW8sIHlSYXRpb10sXG4gICAgICAgICAgICAgICAgICBzaXplczogW2ltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHRdLCBmaWxlbmFtZTogcmVxTmFtZSxcbiAgICAgICAgICAgICAgICB9LCBpbWFnZVNpemUpLCB0aGlzLnNjcmVlbkhlaWdodClcbiAgICAgICAgICAgIDogKGlzR3JheVxuICAgICAgICAgICAgICAgID8gdGhpcy5wbG90SGVhdG1hcCh0aGlzLnBsb3REaXYsIHRoaXMudXJscywgW2ZyYW1lXSwgaW1hZ2VTaXplLCBbeFJhdGlvLCB5UmF0aW9dLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmVlbkhlaWdodClcbiAgICAgICAgICAgICAgICA6IHRoaXMucGxvdFJHQkhlYXRtYXAodGhpcy5wbG90RGl2LCB0aGlzLnVybHMsIFtmcmFtZV0sIGltYWdlU2l6ZSwgW3hSYXRpbywgeVJhdGlvXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgdGhpcy5zY3JlZW5IZWlnaHQpKTtcbiAgICAgICAgICAvLyBwbG90VmlhUmVnaXN0cnkgYWxyZWFkeSBhcHBsaWVzIHRoZSB0eXBlJ3Mgb3duIGxheW91dC9yYW5nZSBmb3JcbiAgICAgICAgICAvLyBub24taW1hZ2UgbGF5b3V0cyAoY2hhcnQvb3ZlcmxheSk7IG9ubHkgcmUtYXBwbHkgdGhlIGhlYXRtYXBcbiAgICAgICAgICAvLyByYW5nZSBmb3IgdGhlIGltYWdlLWFsaWduZWQgcGF0aHMuXG4gICAgICAgICAgY29uc3QgcmVhcHBseVJhbmdlID0gIWltcGwgfHwgaW1wbC5sYXlvdXRLaW5kID09PSAnMmQtaW1hZ2UnO1xuICAgICAgICAgIHJlbmRlclByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnNldEltYWdlQ2FjaGVkKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbWFnZUxvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgaW1hZ2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJlYXBwbHlSYW5nZSkgdGhpcy5yZWxheW91dChpbWFnZVNpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBlcnJvcjogZXJyID0+IHtcbiAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IGVycj8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgd2hlbiB6b29taW5nJywgZXJyKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiBWSVpfQUxFUlRfVE9BU1RfS0VZLCBzdGlja3k6IHRydWUsIHNldmVyaXR5OidlcnJvcicsIHN1bW1hcnk6J0FuIGVycm9yIG9jY3VyZWQnLFxuICAgICAgICBkZXRhaWw6YFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJlZCB3aGlsZSB6b29taW5nOiAke21zZ30uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSB0cnkgdG8gb3BlbiB0aGUgaW1hZ2UgYWdhaW4gdGhyb3VnaCB0aGUgZmlsZSBuYXZpZ2F0b3IgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gb24gdGhlIHNlbGVjdGVkIGFyZWEgb25jZSBtb3JlLmAgfSk7XG4gICAgICB0aGlzLnN0YXRlLnNldExvYWRpbmdFcnJvcih0cnVlKTtcbiAgICAgIHRoaXMuc3RhdGUuc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICB9LCBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3pvb21pbmcgY29tcGxldGUnKTtcbiAgICB9IH0pO1xuICB9XG5cbiAgcHVibGljIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSkge1xuICAgIHRoaXMucGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW1hZ2VJbmZvKHNob3dTdGFjaz86IGJvb2xlYW4sIHNjYWxlcmF0aW8/OiBib29sZWFuKSB7XG4gICAgLy8gQnVpbGQgYSBwYXJ0aWFsIGltYWdlIGRlc2NyaXB0b3IgYW5kIHB1c2ggaXQgdG8gdGhlIGhvc3QgdmlhIHRoZSBwb3J0LlxuICAgIGNvbnN0IGltZ0luZm86IFBhcnRpYWw8SUltYWdlSW5mbz4gPSB7XG4gICAgICBpc0dyYXlzY2FsZTogdGhpcy5pbWFnZUluZm8uaXNHcmF5c2NhbGUsXG4gICAgICB0cnVlSW1hZ2VTaXplOiBbdGhpcy50cnVlSW1nU2l6ZVsxXSwgdGhpcy50cnVlSW1nU2l6ZVszXV0sXG4gICAgICB1cmxzOiB0aGlzLnVybHMsXG4gICAgICBpc1N0YWNrOiB0aGlzLnVybHMubGVuZ3RoID4gMSxcbiAgICAgIHNjYWxlUmF0aW86IHNjYWxlcmF0aW8gIT09IHVuZGVmaW5lZCA/IHNjYWxlcmF0aW8gOiB0aGlzLnNjYWxlcmF0aW8sXG4gICAgfTtcbiAgICBpZiAoc2hvd1N0YWNrICE9PSB1bmRlZmluZWQpIGltZ0luZm8uc2hvd1N0YWNrID0gc2hvd1N0YWNrO1xuICAgIGlmICh0aGlzLmZpbGVOYW1lKSBpbWdJbmZvLmZpbGVOYW1lID0gdGhpcy5maWxlTmFtZTtcbiAgICB0aGlzLnN0YXRlLnNldEltYWdlSW5mbyhpbWdJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaGFwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyYW1ld29yay1uZXV0cmFsIHZpZXcgb2YgdGhlIGN1cnJlbnQgcmVnaW9ucyDigJQgZGVsZWdhdGVzIHRvIHRoZSBzaGFyZWRcbiAgICogUmVnaW9uU3RvcmUgKHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoKS4gVGhlIGNhbm9uaWNhbCBhY2Nlc3NvciBvbiB0aGVcbiAgICogYElWaXN1YWxpemVyYCBjb250cmFjdDsgY29uc3VtZXJzIHNob3VsZCBwcmVmZXIgdGhpcyBvdmVyIGBnZXRTaGFwZXMoKWBcbiAgICogKHdoaWNoIGV4cG9zZXMgUGxvdGx5LXNoYXBlZCBkaWN0cykuXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIGltYWdlLiBUaGUgc2hhcmVkIFJlZ2lvblN0b3JlIG93bnMgdGhlIHBlci1pbWFnZSByZWdpb25cbiAgICogY2FjaGUgKHNuYXBzaG90IG91dGdvaW5nIC8gcmVzdG9yZSBpbmNvbWluZyAvIGNsZWFyIHNlbGVjdGlvbiAvIGVtaXQpOyB3ZVxuICAgKiBkZWxlZ2F0ZSB0byBpdCwgdGhlbiByZS1wcm9qZWN0IHRoZSBzdG9yZSdzIHJlZ2lvbnMgaW50byBQbG90bHkncyBkaWN0XG4gICAqIHdvcmtpbmctc2V0LiBSZS1wcm9qZWN0aW5nIHVuY29uZGl0aW9uYWxseSAoZXZlbiB3aGVuIHRoZSBzdG9yZSBuby1vcHMgZm9yXG4gICAqIHRoZSBzYW1lIGltYWdlKSBtZWFucyBQbG90bHkgYWxzbyBwaWNrcyB1cCByZWdpb25zIGFub3RoZXIgYmFja2VuZCAoT1NEKVxuICAgKiBhZGRlZCB3aGlsZSBpdCB3YXMgb2ZmLXNjcmVlbi4gQ2FsbGVkIGZyb20gYHBsb3QoKWAgYW5kIGZyb20gdGhlIHJvdXRlclxuICAgKiBiZWZvcmUgYW55IGJhY2tlbmQgcmVuZGVycy5cbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmVJbWFnZShpbWFnZUluZm86IElJbWFnZUluZm8pIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldEFjdGl2ZUltYWdlKGltYWdlSW5mbyk7XG4gICAgdGhpcy5zeW5jU2hhcGVzRnJvbVN0b3JlKCk7XG4gICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHRoaXMuc2hhcGVzLnNsaWNlKCk7XG4gIH1cblxuICAvKiogVGVzdC9kZXYgaG9vayDigJQgZHJvcCB0aGUgZW50aXJlIHBlci1pbWFnZSBjYWNoZSAobG9nb3V0IC8gcHJvamVjdCBzd2l0Y2gpLiAqL1xuICBwdWJsaWMgY2xlYXJSZWdpb25zQnlJbWFnZUtleSgpIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmNsZWFyUmVnaW9uc0J5SW1hZ2VLZXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBzZWxlY3RlZCByZWdpb25zIGFzIHBvbHlnb25zLiBPcGVuIHBvbHlsaW5lcyAoY2xvc2VkID09PSBmYWxzZSlcbiAgICogYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGFubm90YXRpb24tb25seSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgZmlsbGVkIHJlZ2lvbnNcbiAgICogZm9yIGltYWdlIHByb2Nlc3NpbmcuIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkIHN0b3JlLlxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lvblBvbHlnb25zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Qb2x5Z29ucygpO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGxvdCByZWdpb25zLiBEZWxlZ2F0ZXMgdGhlIHN0YXRlIGNoYW5nZSB0byB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlXG4gICAqIChpZC9uYW1lIG1pbnRpbmcsIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMsIGFwcGVuZCBkZS1kdXBsaWNhdGlvbiwgcGVyLWltYWdlXG4gICAqIGNhY2hlIGFuZCB0aGUgcmVnaW9uLXVwZGF0ZSBldmVudCBhbGwgbGl2ZSB0aGVyZSksIHRoZW4gcmUtcHJvamVjdHMgdGhlXG4gICAqIHN0b3JlJ3MgcmVnaW9ucyBpbnRvIFBsb3RseSdzIGRpY3Qgd29ya2luZy1zZXQgYW5kIHJlbmRlcnMuXG4gICAqXG4gICAqIFdoZW4gYGlzUmVnaW9uU2F2ZU9uYCBpcyBmYWxzZSB0aGUgcmVnaW9ucyBhcmUgc2hvd24gdHJhbnNpZW50bHkg4oCUIHJlbmRlcmVkXG4gICAqIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIHN0b3JlZCB3b3JraW5nLXNldCAocHJlc2VydmVzIHRoZSBwcmlvciBiZWhhdmlvdXIpLlxuICAgKi9cbiAgcHVibGljIHNldFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10sIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbiwgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHNob3dMYWJlbCA9IHNob3dSZWdpb25MYWJlbCA9PT0gdW5kZWZpbmVkID8gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpIDogc2hvd1JlZ2lvbkxhYmVsO1xuICAgIGNvbnN0IHNhdmUgPSBpc1JlZ2lvblNhdmVPbiA9PT0gdW5kZWZpbmVkID8gdGhpcy5pc1JlZ2lvblNhdmVkT24gOiBpc1JlZ2lvblNhdmVPbjtcblxuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGFwcGVuZCk7XG4gICAgdGhpcy5pc1JlZ2lvblNhdmVkT24gPSBzYXZlO1xuXG4gICAgaWYgKHNhdmUpIHtcbiAgICAgIC8vIFJlLXByb2plY3QgdGhlIGF1dGhvcml0YXRpdmUgcmVnaW9ucyBpbnRvIFBsb3RseSdzIHdvcmtpbmctc2V0IGFuZCByZW5kZXIuXG4gICAgICB0aGlzLnN5bmNTaGFwZXNGcm9tU3RvcmUoKTtcbiAgICAgIHRoaXMucmVuZGVyU2hhcGVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYW5zaWVudCBkaXNwbGF5IG9ubHkg4oCUIHJlbmRlciB0aGUgcGFzc2VkIHJlZ2lvbnMsIGRvbid0IHRvdWNoIHRoZVxuICAgICAgLy8gd29ya2luZy1zZXQgKGFuZCB0aGUgc3RvcmUgZGlkbid0IHN0b3JlIHRoZW0gZWl0aGVyKS5cbiAgICAgIGNvbnN0IGRpY3RzID0gcmVnaW9ucy5tYXAociA9PiB7IHIuZmlsZW5hbWUgPSB0aGlzLmZpbGVOYW1lOyByZXR1cm4geyAuLi5yLmdldFNoYXBlKHNob3dMYWJlbCkgfTsgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB0aGlzLnNoYXBlc1JlbGF5b3V0KGRpY3RzKSBhcyBhbnkpO1xuICAgICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkg4oCUIGl0cyBvdmVybGF5IHJlbmRlcnMgc2hhcGVzICovIH1cbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHNoYXBlcy1yZWxheW91dCBwYXlsb2FkOiByZWdpb24gc2hhcGVzIChwcm9maWxlLWxpbmUgUk9JcyBpbmNsdWRlZCwgYXNcbiAgICogIHRoZXkgYXJlIG9yZGluYXJ5IHJlZ2lvbnMpIHBsdXMgdGhlIGFjdGl2ZS1zaGFwZSBmaWxsIGNvbG91ci4gKi9cbiAgcHJpdmF0ZSBzaGFwZXNSZWxheW91dChzaGFwZURpY3RzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXBlczogc2hhcGVEaWN0cyxcbiAgICAgIGFjdGl2ZXNoYXBlOiB7IGZpbGxjb2xvcjogdGhpcy5yZWdpb25TdG9yZS5nZXRGaWxsQ29sb3IoKSB9LFxuICAgIH07XG4gIH1cblxuICAvKiogUHVzaCB0aGUgY3VycmVudCBkaWN0IHdvcmtpbmctc2V0IHRvIFBsb3RseSAobm8tb3Agd2hlbiBhbm90aGVyIGJhY2tlbmRcbiAgICogIG93bnMgdGhlIGRpdikuICovXG4gIHByaXZhdGUgcmVuZGVyU2hhcGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgZGljdEFycmF5ID0gdGhpcy5zaGFwZXMubWFwKHMgPT4gKHsgLi4ucyB9KSk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHRoaXMuc2hhcGVzUmVsYXlvdXQoZGljdEFycmF5KSBhcyBhbnkpO1xuICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kIChPU0QpIOKAlCBpdHMgb3ZlcmxheSByZW5kZXJzIHNoYXBlcyAqLyB9XG4gIH1cblxuICBnZXRTaG93U2hhcGVMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwcmV2aW91cyBzYXZlZCBzaGFwZXNcbiAgICovXG4gIHB1YmxpYyBwbG90UHJldmlvdXNTaGFwZXMoKSB7XG4gICAgLy8gY29udmVydCB0byBkaWN0IHNvIHRoYXQgcGxvdGx5IHJlY29nbmlzZXMgdGhlIHNoYXBlc1xuICAgIGNvbnN0IGRpY3RBcnJheSA9IHRoaXMucHJldmlvdXNTaGFwZXMubWFwKHMgPT4gKHsgLi4ucyB9KSk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgc2hhcGVzOiBkaWN0QXJyYXkgfSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkgKi8gfVxuICB9XG5cbiAgc2V0UHJldmlvdXNTaGFwZXMoc2hhcGVzOiBTaGFwZVNlbGVjdGlvbltdKSB7XG4gICAgdGhpcy5wcmV2aW91c1NoYXBlcyA9IHNoYXBlcztcbiAgfVxuXG4gIGdldFByZXZpb3VzU2hhcGVzKCkge1xuICAgIHJldHVybiB0aGlzLnByZXZpb3VzU2hhcGVzO1xuICB9XG5cbiAgLy8gVW5kbyAoaml0LXVpIzg1KTogcmVnaW9uIGhpc3RvcnkgbGl2ZXMgaW4gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSwgc28gdGhlXG4gIC8vIGFjdGl2ZSBiYWNrZW5kJ3Mgb3ZlcmxheSByZS1yZW5kZXJzIG9mZiBpdHMgcmVnaW9uVXBkYXRlJCBvbiByZXN0b3JlLlxuICBwdWJsaWMgdW5kbygpOiB2b2lkIHsgdGhpcy5yZWdpb25TdG9yZS51bmRvKCk7IH1cbiAgcHVibGljIHJlZG8oKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUucmVkbygpOyB9XG4gIHB1YmxpYyBjYW5VbmRvKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5jYW5VbmRvKCk7IH1cbiAgcHVibGljIGNhblJlZG8oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmNhblJlZG8oKTsgfVxuICBwdWJsaWMgZ2V0Q2FuVW5kbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7IHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblVuZG8kKCk7IH1cbiAgcHVibGljIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRDYW5SZWRvJCgpOyB9XG4gIHB1YmxpYyByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnJlc2V0VW5kb0hpc3RvcnkoKTsgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2Ugei1zdGFjayByZWdpb25zIOKGkiBSZWdpb25TdG9yZSAoaml0LXVpIzkzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHVibGljIGVudGVyU3RhY2tNb2RlKHNsaWNlczogTWFwPG51bWJlciwgUmVnaW9uW10+LCBpbml0aWFsWj86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMYXlvdXQ/OiAnY29tYmluZWQnIHwgJ3Blci1zbGljZS1maWxlJyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUoc2xpY2VzLCBpbml0aWFsWiwgc2F2ZUxheW91dCk7XG4gIH1cbiAgcHVibGljIGV4aXRTdGFja01vZGUoKTogdm9pZCB7IHRoaXMucmVnaW9uU3RvcmUuZXhpdFN0YWNrTW9kZSgpOyB9XG4gIHB1YmxpYyBpc1N0YWNrTW9kZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaXNTdGFja01vZGUoKTsgfVxuICBwdWJsaWMgZ2V0U3RhY2tTYXZlTGF5b3V0KCk6ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKTtcbiAgfVxuICBwdWJsaWMgc2V0RGlzcGxheVNsaWNlKHo6IG51bWJlcik6IHZvaWQgeyB0aGlzLnJlZ2lvblN0b3JlLnNldERpc3BsYXlTbGljZSh6KTsgfVxuICBwdWJsaWMgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHsgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0U2xpY2VSZWdpb25zKCk7IH1cbiAgcHVibGljIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4geyByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVTbGljZXMoKTsgfVxuXG4gIHByaXZhdGUgZ2V0SGVhdG1hcExheW91dCh4UmFuZ2U6IG51bWJlcltdLCB5UmFuZ2U6IG51bWJlcltdKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgeGF4aXM6IHtcbiAgICAgICAgY29uc3RyYWluOiAncmFuZ2UnLFxuICAgICAgICBjb25zdHJhaW50b3dhcmQ6ICdjZW50ZXInLFxuICAgICAgICBzaWRlOiAndG9wJyxcbiAgICAgICAgdGlja3M6ICcnLFxuICAgICAgICByYW5nZTogeFJhbmdlXG4gICAgICB9LFxuICAgICAgeWF4aXM6IHtcbiAgICAgICAgY29uc3RyYWluOiAncmFuZ2UnLFxuICAgICAgICBjb25zdHJhaW50b3dhcmQ6ICdjZW50ZXInLFxuICAgICAgICByYW5nZTogeVJhbmdlLFxuICAgICAgICB0aWNrczogJycsXG4gICAgICAgIHRpY2tzdWZmaXg6ICcgICcsXG5cdFx0XHRcdC8vIHNldCBhdXRvcmFuZ2UgdG8gZmFsc2Ugc28gdGhhdCBwbG90bHkgZG9lcyBub3Qgb3ZlcndyaXRlIHRoZSByYW5nZSBmb3IgdGhlIHkgYXhpc1xuXHRcdFx0XHRhdXRvcmFuZ2U6IGZhbHNlLFxuICAgICAgICBzY2FsZWFuY2hvcjogdGhpcy5zY2FsZXJhdGlvID8gJ3gnIDogZmFsc2VcbiAgICAgfSxcbiAgICAgIG1hcmdpbjogeyB0OiAzMCwgYjogNSwgbDogNTUsIHI6IDUgfSxcbiAgICAgIGhlaWdodDogdGhpcy5zY3JlZW5IZWlnaHQsXG4gICAgICBzbGlkZXJzOiBbe1xuICAgICAgICBwYWQ6IHsgdDogNTAgfSxcbiAgICAgICAgY3VycmVudHZhbHVlOiB7XG4gICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBwcmVmaXg6ICdaLXBsYW5lOicsXG4gICAgICAgICAgeGFuY2hvcjogJ3JpZ2h0JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RlcHM6IHRoaXMuZ2V0U3RlcHMoKVxuICAgICAgfV0sXG4gICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgIHNoYXBlczogdGhpcy5jdXJyZW50UmVuZGVyU2hhcGVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSksXG4gICAgICBhY3RpdmVzaGFwZTogeyBmaWxsY29sb3I6IHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCkgfSxcbiAgICAgIGRyYWdtb2RlOiB0aGlzLmRyYWdNb2RlID8gdGhpcy5kcmFnTW9kZSA6IGZhbHNlLFxuICAgICAgbmV3c2hhcGU6IHsgbGluZTogeyBjb2xvcjogdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksIHdpZHRoOiAzIH0gfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNoYXBlc1RvUmVkcmF3KHNob3dMYWJlbDogYm9vbGVhbikge1xuICAgIGNvbnN0IHNoYXBlc1RvUmVkcmF3OiBTaGFwZVNlbGVjdGlvbltdID0gW107XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiB0aGlzLnNoYXBlcykge1xuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHNoYXBlLmZpbGVOYW1lKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5maWxlTmFtZSkpIHtcbiAgICAgICAgLy8gU2V0IGxhYmVsXG4gICAgICAgIGlmIChzaG93TGFiZWwpIHtcbiAgICAgICAgICBzaGFwZS5sYWJlbCA9IHtcbiAgICAgICAgICAgIHRleHQ6IGAke3NoYXBlLmxlZ2VuZH1gLFxuICAgICAgICAgICAgdGV4dHRlbXBsYXRlOiBgJHtzaGFwZS5sZWdlbmR9YCxcbiAgICAgICAgICAgIHRleHRwb3NpdGlvbjogJ3RvcCBsZWZ0JyxcbiAgICAgICAgICAgIGZvbnQ6IHsgY29sb3I6IGAke3NoYXBlLmxpbmUuY29sb3J9YCB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaGFwZS5sYWJlbCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHNoYXBlc1RvUmVkcmF3LnB1c2goc2hhcGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb252ZXJ0IHRvIGRpY3Qgc28gdGhhdCBwbG90bHkgcmVjb2duaXNlcyB0aGUgc2hhcGVzXG4gICAgcmV0dXJuIHNoYXBlc1RvUmVkcmF3Lm1hcChzID0+ICh7IC4uLnMgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBVbnVzZWQgKHdpbGwgYmUgdXNlZCB3aGVuIHN1cmZhY2UgcGxvdCBpcyBhZGRlZClcbiAgICogQHBhcmFtIHhSYW5nZVxuICAgKiBAcGFyYW0geVJhbmdlXG4gICAqIEBwYXJhbSB6UmF0aW9cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0U3VyZmFjZUxheW91dCh4UmFuZ2U6IG51bWJlcltdLCB5UmFuZ2U6IG51bWJlcltdLCB6UmF0aW86IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1hcmdpbjogeyB0OiAwLCBiOiAwLCBsOiAwLCByOiAwIH0sXG4gICAgICBzY2VuZToge1xuICAgICAgICB4YXhpczoge1xuICAgICAgICAgIGdyaWRjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgemVyb2xpbmVjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgc2hvd2JhY2tncm91bmQ6IHRydWUsXG4gICAgICAgICAgYmFja2dyb3VuZGNvbG9yOiAncmdiKDIzMCwgMjMwLDIzMCknLFxuICAgICAgICAgIC8vIHJhbmdlOiB4UmFuZ2VcbiAgICAgICAgfSxcbiAgICAgICAgeWF4aXM6IHtcbiAgICAgICAgICBncmlkY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHplcm9saW5lY29sb3I6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgIHNob3diYWNrZ3JvdW5kOiB0cnVlLFxuICAgICAgICAgIGJhY2tncm91bmRjb2xvcjogJ3JnYigyMzAsIDIzMCwgMjMwKScsXG4gICAgICAgICAgLy8gYXV0b3JhbmdlOiAncmV2ZXJzZWQnLFxuICAgICAgICAgIC8vIHJhbmdlOiB5UmFuZ2UsXG4gICAgICAgICAgLy8gc2NhbGVhbmNob3I6ICd4J1xuICAgICAgICB9LFxuICAgICAgICB6YXhpczoge1xuICAgICAgICAgIGdyaWRjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgemVyb2xpbmVjb2xvcjogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgc2hvd2JhY2tncm91bmQ6IHRydWUsXG4gICAgICAgICAgYmFja2dyb3VuZGNvbG9yOiAncmdiKDIzMCwgMjMwLDIzMCknXG4gICAgICAgIH0sXG4gICAgICAgIGFzcGVjdHJhdGlvOiB7IHg6IDEsIHk6IDEsIHo6IHpSYXRpbyB9LFxuICAgICAgICBhc3BlY3Rtb2RlOiAnbWFudWFsJyxcbiAgICAgICAgc2xpZGVyczogW3tcbiAgICAgICAgICBwYWQ6IHsgdDogNTAgfSxcbiAgICAgICAgICBjdXJyZW50dmFsdWU6IHtcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBwcmVmaXg6ICdaLXBsYW5lOicsXG4gICAgICAgICAgICB4YW5jaG9yOiAncmlnaHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RlcHM6IHRoaXMuZ2V0U3RlcHMoKVxuICAgICAgICB9XSxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGVwcygpIHtcbiAgICBjb25zdCBzdGVwcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbWFnZUxlbmd0aDsgaSsrKSB7XG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IGkgKyAxLFxuICAgICAgICBtZXRob2Q6ICdyZXN0eWxlJyxcbiAgICAgICAgYXJnczogWyd2aXNpYmxlJywgQXJyYXkodGhpcy5pbWFnZUxlbmd0aCkuZmlsbChmYWxzZSkuZmlsbCh0cnVlLCBpLCBpICsgMSldLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbiBpbWFnZSB2aWEgQW5ndWxhciBIdHRwQ2xpZW50IHNvIHRoYXQgYXV0aCBpbnRlcmNlcHRvcnMgKEJlYXJlciB0b2tlbilcbiAgICogYXJlIGFwcGxpZWQsIHRoZW4gZGVjb2RlIGl0IHdpdGggaW1hZ2UtanMuIFRoaXMgYXZvaWRzIHJhdyBicm93c2VyIGZldGNoKClcbiAgICogY2FsbHMgdGhhdCBieXBhc3MgdGhlIGludGVyY2VwdG9yIGNoYWluIGFuZCBmYWlsIGJlaGluZCBhbiBPQXV0aDIgcHJveHkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRJbWFnZSh1cmw6IHN0cmluZyk6IFByb21pc2U8SW1hZ2U+IHtcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgIHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyB9KVxuICAgICk7XG4gICAgcmV0dXJuIEltYWdlLmxvYWQoQnVmZmVyLmZyb20oYnVmZmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGltYWdlIGFzIGFuIGltYWdlLWpzIEltYWdlIGluc3RhbmNlLlxuICAgKiBVc2VkIGJ5IHRoZSBwcm9jZXNzaW5nIHBpcGVsaW5lIHRvIG9idGFpbiB0aGUgaW5wdXQgaW1hZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmltYWdlSW5mbyB8fCAhdGhpcy5pbWFnZUluZm8udXJscyB8fCB0aGlzLmltYWdlSW5mby51cmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHpJZHggPSB0aGlzLnpJbmRleC52YWx1ZSB8fCAwO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuaW1hZ2VJbmZvLnVybHNbeklkeF0gfHwgdGhpcy5pbWFnZUluZm8udXJsc1swXTtcbiAgICByZXR1cm4gdGhpcy5sb2FkSW1hZ2UodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGxvdCBwaXhlbCBkYXRhIGFzIGEgZmxhdCBVaW50OENsYW1wZWRBcnJheS5cbiAgICogVGhpcyBjYXB0dXJlcyB3aGF0ZXZlciBpcyBhY3R1YWxseSByZW5kZXJlZCDigJQgaW5jbHVkaW5nIHpvb21lZCByZWdpb25zLlxuICAgKiBSZXR1cm5zIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHMsIGRhdGEgfSBvciBudWxsIGlmIG5vIHBsb3QgaXMgZGlzcGxheWVkLlxuICAgKi9cbiAgcHVibGljIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBjaGFubmVsczogbnVtYmVyO1xuICAgIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5IH0gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgaWYgKCFnZD8uZGF0YSB8fCBnZC5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBGaW5kIHRoZSB2aXNpYmxlIHRyYWNlXG4gICAgY29uc3QgZnJhbWVJZHggPSB0aGlzLmFjdGl2ZUZyYW1lSW5kZXgoKTtcbiAgICBjb25zdCB0cmFjZSA9IGdkLmRhdGFbZnJhbWVJZHhdIHx8IGdkLmRhdGFbMF07XG4gICAgaWYgKCF0cmFjZSB8fCAhdHJhY2UueikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB6RGF0YTogYW55W11bXSA9IHRyYWNlLno7XG4gICAgY29uc3QgaGVpZ2h0ID0gekRhdGEubGVuZ3RoO1xuICAgIGlmIChoZWlnaHQgPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHdpZHRoID0gekRhdGFbMF0ubGVuZ3RoO1xuXG4gICAgaWYgKHRyYWNlLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICAgIC8vIFJHQiBpbWFnZTogeltyb3ddW2NvbF0gPSBbciwgZywgYl0gb3IgW3IsIGcsIGIsIGFdXG4gICAgICBjb25zdCBzYW1wbGUgPSB6RGF0YVswXVswXTtcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gQXJyYXkuaXNBcnJheShzYW1wbGUpID8gc2FtcGxlLmxlbmd0aCA6IDM7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogY2hhbm5lbHMpO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICBjb25zdCBwaXhlbCA9IHpEYXRhW3ldW3hdO1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh5ICogd2lkdGggKyB4KSAqIGNoYW5uZWxzO1xuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyBjXSA9IHBpeGVsW2NdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHMsIGRhdGEgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGVhdG1hcCAoZ3JheXNjYWxlKTogeltyb3ddW2NvbF0gPSBzY2FsYXIgdmFsdWVcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICBkYXRhW3kgKiB3aWR0aCArIHhdID0gTWF0aC5yb3VuZCh6RGF0YVt5XVt4XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiAxLCBkYXRhIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgdGhhdCB0aGUgZGlzcGxheWVkIGB6YCBncmlkIGNvdmVycywgaW5cbiAgICogZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMuIE9uIGEgc2VydmVyIHpvb20gKGB0cmlnZ2VyWm9vbWApIHRoZSB0cmFjZSBgemAgaXNcbiAgICogcmVwbGFjZWQgd2l0aCB0aGUgaGlnaC1kZWYgY3JvcCBhbmQgdGhlIGF4ZXMgYXJlIHJlbGFpZCBvdXQgdG8gdGhlIGNyb3Anc1xuICAgKiBvcmlnaW5hbC1pbWFnZSBib3VuZHMgKGBpbWFnZVNpemVgKSwgc28gdGhlIGxpdmUgYXhpcyByYW5nZXMgQVJFIHRoYXRcbiAgICogcmVjdGFuZ2xlOyB3aGVuIHRoZSB3aG9sZSBpbWFnZSBpcyBpbiB2aWV3IHRoZSByYW5nZXMgc3BhbiBgdHJ1ZUltZ1NpemVgLlxuICAgKiBSZWFkaW5nIHRoZSByYW5nZXMgdGhlcmVmb3JlIHlpZWxkcyB0aGUgY3JvcCBvcmlnaW4gKyBleHRlbnQgd2l0aG91dFxuICAgKiB0cmFja2luZyB6b29tIHN0YXRlIHNlcGFyYXRlbHkuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgaW1hZ2UsIHRoZW4gYG51bGxgLlxuICAgKi9cbiAgcHVibGljIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IGdkOiBhbnkgPSB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcbiAgICBjb25zdCB4cjogbnVtYmVyW10gfCB1bmRlZmluZWQgPSBnZD8uX2Z1bGxMYXlvdXQ/LnhheGlzPy5yYW5nZTtcbiAgICBjb25zdCB5cjogbnVtYmVyW10gfCB1bmRlZmluZWQgPSBnZD8uX2Z1bGxMYXlvdXQ/LnlheGlzPy5yYW5nZTtcbiAgICBpZiAoeHIgJiYgeXIpIHtcbiAgICAgIGNvbnN0IHgwID0gTWF0aC5taW4oeHJbMF0sIHhyWzFdKTtcbiAgICAgIGNvbnN0IHkwID0gTWF0aC5taW4oeXJbMF0sIHlyWzFdKTsgLy8geSBheGlzIGlzIHJldmVyc2VkIGZvciBpbWFnZSBsYXlvdXRzXG4gICAgICByZXR1cm4geyB4OiB4MCwgeTogeTAsIHdpZHRoOiBNYXRoLmFicyh4clsxXSAtIHhyWzBdKSwgaGVpZ2h0OiBNYXRoLmFicyh5clsxXSAtIHlyWzBdKSB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJ1ZUltZ1NpemUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLnRydWVJbWdTaXplWzBdLFxuICAgICAgeTogdGhpcy50cnVlSW1nU2l6ZVsyXSxcbiAgICAgIHdpZHRoOiB0aGlzLnRydWVJbWdTaXplWzFdIC0gdGhpcy50cnVlSW1nU2l6ZVswXSxcbiAgICAgIGhlaWdodDogdGhpcy50cnVlSW1nU2l6ZVszXSAtIHRoaXMudHJ1ZUltZ1NpemVbMl0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICBQbG90bHkubmV3UGxvdCh0aGlzLnBsb3REaXYsIFtdLFxuICAgICAgICB0aGlzLmdldEhlYXRtYXBMYXlvdXQoWzAsIDEwMF0sIFsxMDAsIDBdKSwgQ09ORklHIGFzIGFueSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHJlbW92ZSBQbG90bHkncyBET00gZnJvbSB0aGUgcGxvdCBkaXYgKGF4ZXMgaW5jbHVkZWQpLiBVc2VkIHdoZW5cbiAgICogaGFuZGluZyB0aGUgZGl2IHRvIGFub3RoZXIgYmFja2VuZCAoT3BlblNlYWRyYWdvbikg4oCUIHVubGlrZSBgcmVzZXQoKWAsXG4gICAqIHdoaWNoIHJlLXJlbmRlcnMgYW4gZW1wdHkgcGxvdCBhbmQgd291bGQgbGVhdmUgdGhlIFBsb3RseSBheGVzIHNob3dpbmcuXG4gICAqL1xuICBwdWJsaWMgcHVyZ2VQbG90KCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIFBsb3RseS5wdXJnZSh0aGlzLnBsb3REaXYpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFeHBvcnQgdGhlIGhlYXRtYXAgYXMgYSBQTkcgKHRoZSByZW5kZXJlZCBwbG90IGFscmVhZHkgcmVmbGVjdHMgdGhlIGFjdGl2ZVxuICAgKiAgY29sb3JtYXAvd2luZG93KS4gVGhlIGZ1bGwtcmVzIHRpbGUgY29tcG9zaXRlIGlzIE9TRCdzIGpvYi4gKi9cbiAgcHVibGljIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRvd25sb2FkSW1hZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEltYWdlKCkge1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIChQbG90bHkgYXMgYW55KS5kb3dubG9hZEltYWdlKHRoaXMucGxvdERpdiwgeyBmb3JtYXQ6ICdwbmcnLCBmaWxlbmFtZTogdGhpcy5maWxlTmFtZSB8fCAnaW1hZ2UnIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldEF4ZXMoKSB7XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICB0aGlzLnJlbGF5b3V0KCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpIHtcbiAgICB0aGlzLmRyYWdNb2RlID0gbW9kZSA/IChtb2RlIGFzIHN0cmluZykgOiAnJztcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuO1xuICAgIC8vIE9ubHkgcmVsYXlvdXQgYSBMSVZFIFBsb3RseSBncmFwaC4gV2hlbiBhbm90aGVyIGJhY2tlbmQgKE9TRCAvIG5hcGFyaS1qcykgb3ducyB0aGUgdmlldyB0aGVcbiAgICAvLyBkaXYgaWQgaXMgc3RpbGwgc2V0IGJ1dCBoYXMgbm8gUGxvdGx5IHBsb3QgYXR0YWNoZWQsIGFuZCBQbG90bHkucmVsYXlvdXQgdGhyb3dzXG4gICAgLy8gKFwiY2FuJ3QgYWNjZXNzIHByb3BlcnR5IF9ndWlFZGl0aW5nLCBuIGlzIHVuZGVmaW5lZFwiKS4gVGhhdCB0aHJvdyBhYm9ydGVkIHRoZSBjYWxsZXJcbiAgICAvLyAoZGVhY3RpdmF0ZUFjdGl2ZVRvb2wg4oaSIG9uU2VsZWN0UGxvdFR5cGUpIGJlZm9yZSB0aGUgcmUtcGxvdCByYW4sIHdlZGdpbmcgdGhlIHBsb3QgdHlwZVxuICAgIC8vIChlLmcuIHN0dWNrIHN3aXRjaGluZyBuYXBhcmkgdm9sdW1lIOKGlCBpc29zdXJmYWNlKS4gR3VhcmQgb24gYF9mdWxsTGF5b3V0YCBsaWtlIHRoZSB6b29tXG4gICAgLy8gaGVscGVycyBkbyBzbyBpdCBzYWZlbHkgbm8tb3BzIHdoZW4gUGxvdGx5IGlzbid0IHRoZSBhY3RpdmUgcmVuZGVyZXIuXG4gICAgY29uc3QgZ2QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIGFzIHVua25vd24gYXMgeyBfZnVsbExheW91dD86IHVua25vd24gfSB8IG51bGw7XG4gICAgaWYgKCFnZD8uX2Z1bGxMYXlvdXQpIHJldHVybjtcbiAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7IGRyYWdtb2RlOiBtb2RlIH0gYXMgYW55KTtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgSURhdGFSZW5kZXJlcn0gc3R1YiDigJQgUGxvdGx5IGhhcyBubyBvdmVydmlldyBuYXZpZ2F0b3IgKGl0J3MgYW5cbiAgICogIE9wZW5TZWFkcmFnb24gZmVhdHVyZSksIHNvIHRvZ2dsaW5nIGl0IGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgcHVibGljIHNldE5hdmlnYXRvclZpc2libGUoX3Zpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBuby1vcDogbmF2aWdhdG9yIGlzIE9wZW5TZWFkcmFnb24tb25seSAqL1xuICB9XG5cbiAgLyoqIHtAbGluayBJRGF0YVJlbmRlcmVyfSBzdHViIOKAlCBpbWFnZSBzbW9vdGhpbmcgaXMgYW4gT3BlblNlYWRyYWdvbiBjYW52YXMtZHJhd2VyXG4gICAqICBzZXR0aW5nOyB0aGUgUGxvdGx5IGltYWdlL2hlYXRtYXAgdHJhY2VzIGRvbid0IGV4cG9zZSBpdCwgc28gaXQncyBhIG5vLW9wLiAqL1xuICBwdWJsaWMgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKF9lbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogbm8tb3A6IHNtb290aGluZyB0b2dnbGUgaXMgT3BlblNlYWRyYWdvbi1vbmx5ICovXG4gIH1cblxuICBwdWJsaWMgem9vbUluKCkge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgaWYgKCFnZD8uX2Z1bGxMYXlvdXQpIHJldHVybjtcbiAgICBjb25zdCB4bCA9IGdkLl9mdWxsTGF5b3V0LnhheGlzO1xuICAgIGNvbnN0IHlsID0gZ2QuX2Z1bGxMYXlvdXQueWF4aXM7XG4gICAgLy8gM0Qgc2NlbmVzIGhhdmUgbm8gMkQgeGF4aXMveWF4aXMgKHRoZXkgbGl2ZSB1bmRlciBgc2NlbmVgKTsgdGhlIHN0ZXAtem9vbVxuICAgIC8vIGlzIG1lYW5pbmdsZXNzIHRoZXJlIGFuZCB3b3VsZCB0aHJvdyBvbiBgeGwucmFuZ2VgLiBQbG90bHkncyBzY2VuZSBoYW5kbGVzXG4gICAgLy8gc2Nyb2xsLXpvb20gbmF0aXZlbHksIHNvIGp1c3QgYmFpbC5cbiAgICBpZiAoIXhsPy5yYW5nZSB8fCAheWw/LnJhbmdlKSByZXR1cm47XG4gICAgY29uc3QgeGMgPSAoeGwucmFuZ2VbMF0gKyB4bC5yYW5nZVsxXSkgLyAyO1xuICAgIGNvbnN0IHljID0gKHlsLnJhbmdlWzBdICsgeWwucmFuZ2VbMV0pIC8gMjtcbiAgICBjb25zdCBkeCA9ICh4bC5yYW5nZVsxXSAtIHhsLnJhbmdlWzBdKSAvIDEuMztcbiAgICBjb25zdCBkeSA9ICh5bC5yYW5nZVsxXSAtIHlsLnJhbmdlWzBdKSAvIDEuMztcbiAgICBjb25zdCB4MCA9IHhjIC0gZHggLyAyLCB4MSA9IHhjICsgZHggLyAyO1xuICAgIGNvbnN0IHkwID0geWMgLSBkeSAvIDIsIHkxID0geWMgKyBkeSAvIDI7XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbeDAsIHgxLCB5MCwgeTFdO1xuICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHtcbiAgICAgICd4YXhpcy5yYW5nZVswXSc6IHgwLCAneGF4aXMucmFuZ2VbMV0nOiB4MSxcbiAgICAgICd5YXhpcy5yYW5nZVswXSc6IHkwLCAneWF4aXMucmFuZ2VbMV0nOiB5MVxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZXZlcnkgY3VycmVudGx5IHNlbGVjdGVkIHNoYXBlLiBGYWxscyBiYWNrIHRvIHRoZSBzaW5nbGVcbiAgICogYF9hY3RpdmVTaGFwZUluZGV4YCB3aGVuIG5vIG11bHRpLXNlbGVjdGlvbiBpcyBhY3RpdmUgKGNvdmVycyB0aGUgY2FzZVxuICAgKiB3aGVyZSBQbG90bHkgY2xpY2tlZCBhIHNoYXBlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgdGFibGUpLlxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFjdGl2ZVNoYXBlKCkge1xuICAgIC8vIE5vdGU6IG5vIGBwbG90RGl2YCBndWFyZCDigJQgd2hlbiBPcGVuU2VhZHJhZ29uIGlzIHRoZSByZW5kZXJlciwgUGxvdGx5XG4gICAgLy8gbmV2ZXIgcGxvdHRlZCAocGxvdERpdiBpcyB1bnNldCksIGJ1dCBkZWxldGlvbiBvbmx5IG5lZWRzIHRoZSBzaGFwZSBsaXN0XG4gICAgLy8gKyB0aGUgY3VycmVudCBzZWxlY3Rpb247IHRoZSBQbG90bHkgcmVsYXlvdXQgYmVsb3cgaXMgZ3VhcmRlZC5cbiAgICBjb25zdCBnZDogYW55ID0gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG5cbiAgICAvLyBSZXNvbHZlIHdoYXQgdG8gZGVsZXRlOiB0aGUgc3RvcmUncyBzZWxlY3Rpb24sIGVsc2UgdGhlIHNoYXBlIFBsb3RseVxuICAgIC8vIHRyYWNrcyBhcyBjbGlja2VkICh3aGVuIHRoZSB1c2VyIGNsaWNrZWQgYSBzaGFwZSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlXG4gICAgLy8gUmVnaW9uIEVkaXRvciB0YWJsZSkuXG4gICAgaWYgKHRoaXMucmVnaW9uU3RvcmUuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSBnZD8uX2Z1bGxMYXlvdXQ/Ll9hY3RpdmVTaGFwZUluZGV4O1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSB1bmRlZmluZWQgfHwgYWN0aXZlSW5kZXggPCAwKSByZXR1cm47XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKFthY3RpdmVJbmRleF0pO1xuICAgIH1cbiAgICAvLyBUaGUgc3RvcmUgcmVtb3ZlcyB0aGUgc2VsZWN0ZWQgcmVnaW9ucywgY2xlYXJzIHRoZSBzZWxlY3Rpb24sIHN5bmNzIGl0c1xuICAgIC8vIGNhY2hlIGFuZCBlbWl0cyB0aGUgcmVnaW9uLXVwZGF0ZSBldmVudC5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRlbGV0ZUFjdGl2ZVNoYXBlKCk7XG5cbiAgICAvLyBSZS1wcm9qZWN0IHRoZSByZW1haW5pbmcgcmVnaW9ucyBhbmQgcmVuZGVyIG9uIHRoZSBQbG90bHkgcGxvdCAoYSBuby1vcCxcbiAgICAvLyBjYXVnaHQsIHdoZW4gYW5vdGhlciBiYWNrZW5kIG93bnMgdGhlIGRpdiDigJQgaXRzIG92ZXJsYXkgcmUtcmVuZGVycyB2aWFcbiAgICAvLyB0aGUgc3RvcmUncyB1cGRhdGUgZXZlbnQpLlxuICAgIGlmIChnZD8uX2Z1bGxMYXlvdXQpIGdkLl9mdWxsTGF5b3V0Ll9hY3RpdmVTaGFwZUluZGV4ID0gLTE7XG4gICAgdGhpcy5zeW5jU2hhcGVzRnJvbVN0b3JlKCk7XG4gICAgY29uc3QgZGljdEFycmF5ID0gdGhpcy5zaGFwZXMubWFwKHMgPT4gKHsgLi4ucyB9KSk7XG4gICAgdHJ5IHtcbiAgICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHsgc2hhcGVzOiBkaWN0QXJyYXkgfSBhcyBhbnkpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAoZ2Q/Ll9mdWxsTGF5b3V0KSAoUGxvdGx5IGFzIGFueSkucmVkcmF3KGdkKTtcbiAgICAgIH0sICgpID0+IHsgLyogZGl2IG5vdCBhIFBsb3RseSBwbG90ICovIH0pO1xuICAgIH0gY2F0Y2ggeyAvKiBkaXYgb3duZWQgYnkgYW5vdGhlciBiYWNrZW5kICovIH1cbiAgfVxuXG4gIHB1YmxpYyB6b29tT3V0KCkge1xuICAgIGlmICghdGhpcy5wbG90RGl2KSByZXR1cm47XG4gICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgaWYgKCFnZD8uX2Z1bGxMYXlvdXQpIHJldHVybjtcbiAgICBjb25zdCB4bCA9IGdkLl9mdWxsTGF5b3V0LnhheGlzO1xuICAgIGNvbnN0IHlsID0gZ2QuX2Z1bGxMYXlvdXQueWF4aXM7XG4gICAgLy8gM0Qgc2NlbmVzIGhhdmUgbm8gMkQgeGF4aXMveWF4aXMg4oCUIHNlZSB6b29tSW4oKS5cbiAgICBpZiAoIXhsPy5yYW5nZSB8fCAheWw/LnJhbmdlKSByZXR1cm47XG4gICAgY29uc3QgeGMgPSAoeGwucmFuZ2VbMF0gKyB4bC5yYW5nZVsxXSkgLyAyO1xuICAgIGNvbnN0IHljID0gKHlsLnJhbmdlWzBdICsgeWwucmFuZ2VbMV0pIC8gMjtcbiAgICBjb25zdCBkeCA9ICh4bC5yYW5nZVsxXSAtIHhsLnJhbmdlWzBdKSAqIDEuMztcbiAgICBjb25zdCBkeSA9ICh5bC5yYW5nZVsxXSAtIHlsLnJhbmdlWzBdKSAqIDEuMztcbiAgICBjb25zdCB4MCA9IHhjIC0gZHggLyAyLCB4MSA9IHhjICsgZHggLyAyO1xuICAgIGNvbnN0IHkwID0geWMgLSBkeSAvIDIsIHkxID0geWMgKyBkeSAvIDI7XG4gICAgdGhpcy56b29tQ29vcmRpbmF0ZXMgPSBbeDAsIHgxLCB5MCwgeTFdO1xuICAgIFBsb3RseS5yZWxheW91dCh0aGlzLnBsb3REaXYsIHtcbiAgICAgICd4YXhpcy5yYW5nZVswXSc6IHgwLCAneGF4aXMucmFuZ2VbMV0nOiB4MSxcbiAgICAgICd5YXhpcy5yYW5nZVswXSc6IHkwLCAneWF4aXMucmFuZ2VbMV0nOiB5MVxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N0YWNrTG9hZGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBwdWJsaWMgc2V0U3RhY2tMb2FkaW5nKHN0YWNrTG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHN0YWNrTG9hZGluZyk7XG4gIH1cbiAgcHVibGljIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzJCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIENvbG9ybWFwIC8gcmV2ZXJzZS1zY2FsZSAvIGltYWdlIG1ldGFkYXRhIHN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWRcbiAgLy8gVmlzdWFsaXplclN0b3JlOyB0aGVzZSBkZWxlZ2F0ZSwga2VlcGluZyBvbmx5IHRoZSBQbG90bHktc3BlY2lmaWMgbGl2ZVxuICAvLyByZXN0eWxlIGFzIHJlbmRlciBnbHVlLlxuICBnZXRDb2xvcm1hcE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gIH1cbiAgc2V0Q29sb3JtYXAoY29sb3JtYXA6IGFueSkge1xuICAgIHRoaXMuc3RvcmUuc2V0Q29sb3JtYXAoY29sb3JtYXApO1xuICAgIHRyeSB7XG4gICAgICBQbG90bHkucmVzdHlsZSh0aGlzLnBsb3REaXYsIHsgJ2NvbG9yc2NhbGUnOiBbY29sb3JtYXAuZGF0YS52YWx1ZV0gfSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkg4oCUIGl0IHJlY29sb3JzIHZpYSB0aGUgTFVUICovIH1cbiAgfVxuICBnZXRDb2xvcm1hcCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpO1xuICB9XG5cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2NhbGU6IGFueSkge1xuICAgIHRoaXMuc3RvcmUuc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2NhbGUpO1xuICAgIHRyeSB7XG4gICAgICBQbG90bHkucmVzdHlsZSh0aGlzLnBsb3REaXYsIHsgJ3JldmVyc2VzY2FsZSc6IHJldmVyc2NhbGUgfSk7XG4gICAgfSBjYXRjaCB7IC8qIGRpdiBvd25lZCBieSBhbm90aGVyIGJhY2tlbmQgKE9TRCkg4oCUIGl0IHJlY29sb3JzIHZpYSB0aGUgTFVUICovIH1cbiAgfVxuXG4gIGdldFJldmVyc2VTY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKTtcbiAgfVxuXG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10pIHtcbiAgICB0aGlzLnN0b3JlLnNldEltYWdlTWV0YShpbWFnZU1ldGEpO1xuICB9XG5cbiAgZ2V0SW1hZ2VNZXRhKCkge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEltYWdlTWV0YSgpO1xuICB9XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbikge1xuICAgIGlmICghc2hvd3N0YWNrKSB7XG4gICAgICB0aGlzLnpJbmRleC5uZXh0KDApO1xuICAgIH1cbiAgICB0aGlzLmltYWdlSW5mby5zaG93U3RhY2sgPSBzaG93c3RhY2s7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc2hvd3N0YWNrKTtcbiAgICBQbG90bHkucmVsYXlvdXQodGhpcy5wbG90RGl2LCB7ICdzaG93c3RhY2snOiBzaG93c3RhY2sgfSBhcyBhbnkpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRSZWdpb25VcGRhdGVFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25VcGRhdGVFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBvZiB0aGUgaW5kaWNlcyBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgcmVnaW9ucyDigJQgb3duZWQgYnkgdGhlIHNoYXJlZFxuICAgKiBSZWdpb25TdG9yZSBzbyB0aGUgc2VsZWN0aW9uIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGJhY2tlbmRzIGFuZCB0aGUgUmVnaW9uXG4gICAqIEVkaXRvciB0YWJsZS4gRW1wdHkgPSBub3RoaW5nIHNlbGVjdGVkLlxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCByZWdpb25zIChvciBjbGVhciB3aXRoIFtdKS4gVGhlIHNoYXJlZCBzdG9yZSBvd25zXG4gICAqIHRoZSBzZWxlY3Rpb24gc3RhdGUgKHZhbGlkYXRlcy9kZWR1cGVzL2VtaXRzKTsgaGVyZSB3ZSBhZGRpdGlvbmFsbHkgcG9pbnRcbiAgICogUGxvdGx5J3MgYF9hY3RpdmVTaGFwZUluZGV4YCBhdCB0aGUgbGFzdCBzZWxlY3RlZCBzaGFwZSBzbyBpdCBnZXRzIHRoZSBlZGl0XG4gICAqIGhhbmRsZXMuIE5vIHZpc3VhbCBjaGFuZ2UgdG8gbm9uLWFjdGl2ZSBzaGFwZXMg4oCUIFBsb3RseSdzIG93biBhY3RpdmUtc2hhcGVcbiAgICogcmVuZGVyaW5nIGlzIHRoZSBvbmx5IGhpZ2hsaWdodC5cbiAgICovXG4gIHB1YmxpYyBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IHZhbGlkID0gKGluZGljZXMgfHwgW10pXG4gICAgICAuZmlsdGVyKGkgPT4gTnVtYmVyLmlzRmluaXRlKGkpICYmIGkgPj0gMCAmJiBpIDwgdGhpcy5zaGFwZXMubGVuZ3RoKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgY2xlYW5lZDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdmFsaWQpIHtcbiAgICAgIGlmICghc2Vlbi5oYXMoaSkpIHsgc2Vlbi5hZGQoaSk7IGNsZWFuZWQucHVzaChpKTsgfVxuICAgIH1cbiAgICBpZiAodGhpcy5wbG90RGl2KSB7XG4gICAgICBjb25zdCBnZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KTtcbiAgICAgIGlmIChnZD8uX2Z1bGxMYXlvdXQpIHtcbiAgICAgICAgZ2QuX2Z1bGxMYXlvdXQuX2FjdGl2ZVNoYXBlSW5kZXggPSBjbGVhbmVkLmxlbmd0aCA+IDAgPyBjbGVhbmVkW2NsZWFuZWQubGVuZ3RoIC0gMV0gOiAtMTtcbiAgICAgICAgdHJ5IHsgKFBsb3RseSBhcyBhbnkpLnJlZHJhdyhnZCk7IH0gY2F0Y2ggeyAvKiBub29wIGluIHRlc3RzICovIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhjbGVhbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBzcGVjaWZpYyByZWdpb24gKElSZWdpb25TdG9yZS5zZWxlY3RSZWdpb24pLiBTZXRzIHRoZSBzaGFyZWQgc3RvcmVcbiAgICogc2VsZWN0aW9uIGJ5IGlkZW50aXR5IGFuZCBwb2ludHMgUGxvdGx5J3MgYWN0aXZlLXNoYXBlIGF0IHRoZSBtYXRjaGluZ1xuICAgKiByZW5kZXJlZCBzaGFwZSBzbyBpdHMgZWRpdCBoYW5kbGVzIGFwcGVhci5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNlbGVjdFJlZ2lvbihyZWdpb24pO1xuICAgIGlmICh0aGlzLnBsb3REaXYpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuc2hhcGVzLmZpbmRJbmRleChzID0+IHMuaWQgPT09IHJlZ2lvbj8uaWQpO1xuICAgICAgY29uc3QgZ2Q6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdik7XG4gICAgICBpZiAoZ2Q/Ll9mdWxsTGF5b3V0ICYmIGlkeCA+PSAwKSB7XG4gICAgICAgIGdkLl9mdWxsTGF5b3V0Ll9hY3RpdmVTaGFwZUluZGV4ID0gaWR4O1xuICAgICAgICB0cnkgeyAoUGxvdGx5IGFzIGFueSkucmVkcmF3KGdkKTsgfSBjYXRjaCB7IC8qIG5vb3AgaW4gdGVzdHMgKi8gfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIFBsb3RseSdzIGBfYWN0aXZlU2hhcGVJbmRleGAgYW5kIHB1c2ggaXQgYXMgdGhlIHNlbGVjdGlvbi4gQ2FsbGVkIGZyb21cbiAgICogdGhlIHJlbGF5b3V0IGhhbmRsZXIgYW5kIHRoZSBwb3N0LWNsaWNrIHRpY2sg4oCUIFBsb3RseSBkb2Vzbid0IGZpcmUgYVxuICAgKiBkZWRpY2F0ZWQgYWN0aXZlLXNoYXBlIGV2ZW50IGZvciBjbGlja3MsIHNvIHdlIHNhbXBsZS4gVGhlIHN0b3JlIG5vLW9wcyBpZlxuICAgKiB0aGUgc2VsZWN0aW9uIGlzIHVuY2hhbmdlZC5cbiAgICovXG4gIHByaXZhdGUgbWF5YmVFbWl0QWN0aXZlU2hhcGVJbmRleCgpIHtcbiAgICBpZiAoIXRoaXMucGxvdERpdikgcmV0dXJuO1xuICAgIGNvbnN0IGdkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpO1xuICAgIGNvbnN0IHJhdyA9IGdkPy5fZnVsbExheW91dD8uX2FjdGl2ZVNoYXBlSW5kZXg7XG4gICAgY29uc3QgaWR4ID0gKHR5cGVvZiByYXcgPT09ICdudW1iZXInICYmIHJhdyA+PSAwICYmIHJhdyA8IHRoaXMuc2hhcGVzLmxlbmd0aCkgPyByYXcgOiAtMTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGlkeCA+PSAwID8gW2lkeF0gOiBbXSk7XG4gIH1cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy56SW5kZXgubmV4dCh6SW5kZXgpO1xuICB9XG5cbiAgZ2V0U2hhcGVDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEZpbGxDb2xvcigpO1xuICB9XG5cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuXG4gIHNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWw6IHN0cmluZywgY29sb3I6IHN0cmluZykge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbCwgY29sb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIFN1YnNjcmlwdGlvbnNcbiAgICovXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLmltYWdlQ2FjaGVkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmltYWdlQ2FjaGVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZpbGVuYW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlZ2lvblVwZGF0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZWdpb25VcGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVnaW9uTGl2ZUVkaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVnaW9uTGl2ZUVkaXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hhbm5lbFN1Yikge1xuICAgICAgdGhpcy5jaGFubmVsU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIExpdmUtYXBwbHkgdGhlIGNoYW5uZWwgZGlzcGxheSB3aW5kb3cgKHptaW4vem1heCkgKyByZXZlcnNlL2ludmVydCB0byB0aGVcbiAgICogIGhlYXRtYXAuIE5vLW9wIHdoZW4gbm8gUGxvdGx5IHBsb3QgaXMgbW91bnRlZCAoT1NEIG93bnMgdGhlIGRpdikuICovXG4gIHByaXZhdGUgYXBwbHlDaGFubmVsRGlzcGxheShjaGFubmVsczogYW55W10sIHJldjogYm9vbGVhbiwgaW52OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsb3REaXYpIHJldHVybjtcbiAgICBjb25zdCBjaCA9IGNoYW5uZWxzPy5bMF07XG4gICAgY29uc3QgY29sb3JzY2FsZSA9IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCk/LmRhdGE/LnZhbHVlO1xuICAgIC8vIHJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXA7IGJvdGggdG9nZXRoZXIgY2FuY2VsLlxuICAgIGNvbnN0IHVwZGF0ZTogYW55ID0geyByZXZlcnNlc2NhbGU6IHJldiAhPT0gaW52IH07XG4gICAgaWYgKGNvbG9yc2NhbGUgIT0gbnVsbCkgdXBkYXRlLmNvbG9yc2NhbGUgPSBjb2xvcnNjYWxlOyAvLyBsaXZlIGNvbG9ybWFwIHJlY29sb3JcbiAgICBpZiAoY2gpIHtcbiAgICAgIC8vIFN1cmZhY2UvaXNvc3VyZmFjZS9zY2F0dGVyM2QgY29sb3VyLW1hcCB2aWEgY21pbi9jbWF4OyBoZWF0bWFwL2NvbnRvdXIgdmlhIHptaW4vem1heC5cbiAgICAgIGNvbnN0IHRocmVlRCA9XG4gICAgICAgIHRoaXMucGxvdFR5cGUgPT09IFBsb3RUeXBlLklTT1NVUkZBQ0UgfHxcbiAgICAgICAgdGhpcy5wbG90VHlwZSA9PT0gUGxvdFR5cGUuU1VSRkFDRSB8fFxuICAgICAgICB0aGlzLnBsb3RUeXBlID09PSBQbG90VHlwZS5TQ0FUVEVSM0Q7XG4gICAgICBpZiAodGhyZWVEKSB7XG4gICAgICAgIHVwZGF0ZS5jbWluID0gY2gubWluO1xuICAgICAgICB1cGRhdGUuY21heCA9IGNoLm1heDtcbiAgICAgICAgdXBkYXRlLmNhdXRvID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGUuem1pbiA9IGNoLm1pbjtcbiAgICAgICAgdXBkYXRlLnptYXggPSBjaC5tYXg7XG4gICAgICAgIHVwZGF0ZS56YXV0byA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5wbG90RGl2LCB1cGRhdGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogbm90IGEgY29sb3VyLW1hcHBlZCB0cmFjZSwgb3IgT1NEIG93bnMgdGhlIGRpdiAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCaW5uZWQgaW50ZW5zaXR5IGhpc3RvZ3JhbSBmb3IgYSBjaGFubmVsIGZyb20gdGhlIGNhY2hlZCBzb3VyY2UgZnJhbWVzXG4gICAqICAocmF3LCBwcmUtTFVUKS4gR3JheXNjYWxlIGNlbGxzIGFyZSBudW1iZXJzOyBSR0IgY2VsbHMgYXJlIFtyLGcsYl0uICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgX2JpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICBjb25zdCBmcmFtZXMgPSB0aGlzLmNhY2hlZEltYWdlRnJhbWVzO1xuICAgIGlmICghZnJhbWVzPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZyYW1lID0gZnJhbWVzW3RoaXMuYWN0aXZlRnJhbWVJbmRleCgpXSA/PyBmcmFtZXNbMF07XG4gICAgaWYgKCFmcmFtZT8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGZyYW1lKSB7XG4gICAgICBpZiAoIXJvdykgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93KSB7XG4gICAgICAgIGxldCB2OiBudW1iZXI7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGwpKSB7XG4gICAgICAgICAgdiA9IGNoYW5uZWxJbmRleCA+PSAwICYmIGNoYW5uZWxJbmRleCA8IGNlbGwubGVuZ3RoXG4gICAgICAgICAgICA/IGNlbGxbY2hhbm5lbEluZGV4XVxuICAgICAgICAgICAgOiBNYXRoLnJvdW5kKGJ0NjAxTHVtaW5hbmNlKGNlbGxbMF0sIGNlbGxbMV0sIGNlbGxbMl0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gY2VsbDtcbiAgICAgICAgfVxuICAgICAgICB2ID0gdiB8IDA7XG4gICAgICAgIGlmICh2IDwgMCkgdiA9IDA7IGVsc2UgaWYgKHYgPiAyNTUpIHYgPSAyNTU7XG4gICAgICAgIGNvdW50c1t2XSsrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGlzdG9ncmFtMjU2KGNvdW50cyk7XG4gIH1cblxuICAvKiogQXN5bmMgaGlzdG9ncmFtIHN0cmVhbSDigJQgUGxvdGx5IHJlbmRlcnMgaGVhdG1hcCBmcmFtZSBkYXRhIChhbHJlYWR5IGluXG4gICAqICBtZW1vcnksIDgtYml0IGx1bWluYW5jZSksIHNvIHRoaXMganVzdCB3cmFwcyB0aGUgc3luY2hyb25vdXMgOC1iaXRcbiAgICogIGhpc3RvZ3JhbS4gTmF0aXZlIDE2LWJpdCBoaXN0b2dyYW1zIG9ubHkgYXBwbHkgdG8gdGhlIE9TRCB0aWxlIHBhdGguICovXG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICByZXR1cm4gb2YodGhpcy5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSk7XG4gIH1cblxuICAvKiogRGF0YSBleHBvcnQgKDE2LWJpdCBUSUZGKSBpcyBhbiBPU0QtdGlsZS1wYXRoIGZlYXR1cmUgYmFja2VkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAqICBQbG90bHkgcmVuZGVycyBoZWF0bWFwcyBmcm9tIGZyYW1lIGRhdGEsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBleHBvcnQgaGVyZS4gKi9cbiAgZXhwb3J0RGF0YSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLndhcm4oJ1twbG90bHldIDE2LWJpdCBkYXRhIGV4cG9ydCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgaGVhdG1hcCBiYWNrZW5kLicpO1xuICB9XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFV0aWxpdGllcy5pbXBvcnRST0lzRnJvbUdlb0pzb24oZ2VvSnNvblN0cik7XG4gIH1cblxuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKSB7XG4gICAgY29uc3QganNvblN0cmluZyA9IHRoaXMucGxvdFV0aWxpdGllcy5leHBvcnRST0lzVG9HZW9Kc29uKHJlZ2lvbnMpO1xuICAgIHRoaXMucGxvdFV0aWxpdGllcy5zYXZlVG9GaWxlKGpzb25TdHJpbmcsIHRoaXMuZmlsZU5hbWUpO1xuICB9XG5cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGxvdFV0aWxpdGllcy5leHBvcnRST0lzVG9HZW9Kc29uKHJlZ2lvbnMpO1xuICB9XG5cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MkKCk7XG4gIH1cblxuICBpc1N0YWNrTG9hZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1N0YWNrTG9hZGluZyQoKTtcbiAgfVxuXG59XG4iXX0=