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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/esm2022/index.mjs +10 -1
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/contracts/viz-config.mjs +1 -1
  9. package/esm2022/lib/geometry/loft.mjs +128 -0
  10. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  11. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  12. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  13. package/esm2022/lib/geometry/section.mjs +215 -0
  14. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
  15. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
  16. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  17. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
  18. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
  20. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
  21. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
  22. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  23. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
  24. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  25. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
  26. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
  27. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
  28. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
  29. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
  30. package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
  31. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
  32. package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
  33. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
  34. package/esm2022/lib/models/class-preset.mjs +1 -1
  35. package/esm2022/lib/models/polygon-factory.mjs +17 -1
  36. package/esm2022/lib/models/region-geojson.mjs +44 -6
  37. package/esm2022/lib/models/region.mjs +1 -1
  38. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  39. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  40. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +77 -13
  41. package/esm2022/lib/region-editor/region-editor.component.mjs +670 -42
  42. package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
  43. package/esm2022/lib/region-editor/region-persistence.service.mjs +44 -10
  44. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
  45. package/esm2022/lib/region-import/label-classes.mjs +149 -0
  46. package/esm2022/lib/region-import/label-volume.mjs +194 -0
  47. package/esm2022/lib/region-import/region-import.mjs +71 -0
  48. package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
  49. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  50. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  51. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  52. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  53. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  54. package/esm2022/lib/region-source/region-source.mjs +67 -0
  55. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  56. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  57. package/esm2022/lib/routing-visualizer.service.mjs +510 -22
  58. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  59. package/esm2022/lib/store/class-color.util.mjs +10 -5
  60. package/esm2022/lib/store/class-signatures.mjs +63 -0
  61. package/esm2022/lib/store/region-scope-cache.mjs +5 -1
  62. package/esm2022/lib/store/region-source-scope.mjs +186 -0
  63. package/esm2022/lib/store/region-store.service.mjs +774 -12
  64. package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
  65. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
  66. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
  67. package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
  68. package/esm2022/lib/visualizer/region-load.mjs +67 -4
  69. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  70. package/esm2022/lib/visualizer.component.mjs +155 -7
  71. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs} +9851 -2904
  72. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
  73. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +4 -4
  74. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
  75. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  76. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  77. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -3
  78. package/fesm2022/region-source.worker.js +1067 -0
  79. package/index.d.ts +12 -0
  80. package/lib/contracts/image.contract.d.ts +4 -0
  81. package/lib/contracts/ports/region-io.port.d.ts +24 -0
  82. package/lib/contracts/region-editor-api.contract.d.ts +102 -0
  83. package/lib/contracts/region-store.contract.d.ts +22 -0
  84. package/lib/contracts/section-view.contract.d.ts +44 -0
  85. package/lib/contracts/visualizer.contract.d.ts +10 -0
  86. package/lib/contracts/viz-config.d.ts +8 -0
  87. package/lib/geometry/loft.d.ts +22 -0
  88. package/lib/geometry/polylabel.d.ts +23 -0
  89. package/lib/geometry/reconstruct.d.ts +54 -0
  90. package/lib/geometry/reslice-image.d.ts +33 -0
  91. package/lib/geometry/section.d.ts +52 -0
  92. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
  93. package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
  94. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  95. package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
  96. package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
  97. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
  98. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
  99. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  100. package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
  101. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  102. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
  103. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
  104. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
  105. package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
  106. package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
  107. package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
  108. package/lib/implementations/osd/slice-cache.d.ts +13 -3
  109. package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
  110. package/lib/models/class-preset.d.ts +7 -0
  111. package/lib/models/polygon-factory.d.ts +5 -0
  112. package/lib/models/region-geojson.d.ts +40 -0
  113. package/lib/models/region.d.ts +19 -0
  114. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  115. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  116. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +36 -6
  117. package/lib/region-editor/region-editor.component.d.ts +159 -17
  118. package/lib/region-editor/region-metrics.d.ts +8 -0
  119. package/lib/region-editor/region-persistence.service.d.ts +17 -5
  120. package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
  121. package/lib/region-import/label-classes.d.ts +39 -0
  122. package/lib/region-import/label-volume.d.ts +31 -0
  123. package/lib/region-import/region-import.d.ts +46 -0
  124. package/lib/region-overlay/region-geometry.d.ts +4 -3
  125. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  126. package/lib/region-overlay/region-style.d.ts +52 -0
  127. package/lib/region-source/http-region-source.d.ts +45 -0
  128. package/lib/region-source/region-source-ops.d.ts +89 -0
  129. package/lib/region-source/region-source-worker.d.ts +7 -0
  130. package/lib/region-source/region-source.d.ts +82 -0
  131. package/lib/region-source/region-tiles.d.ts +289 -0
  132. package/lib/region-source/worker-region-source.d.ts +65 -0
  133. package/lib/routing-visualizer.service.d.ts +168 -1
  134. package/lib/section-pane/section-pane.component.d.ts +47 -0
  135. package/lib/store/class-color.util.d.ts +6 -3
  136. package/lib/store/class-signatures.d.ts +11 -0
  137. package/lib/store/region-scope-cache.d.ts +2 -0
  138. package/lib/store/region-source-scope.d.ts +74 -0
  139. package/lib/store/region-store.service.d.ts +216 -2
  140. package/lib/store/visualizer-store.service.d.ts +10 -0
  141. package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
  142. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
  143. package/lib/toolbar/toolbar.component.d.ts +9 -2
  144. package/lib/visualizer/region-load.d.ts +23 -4
  145. package/lib/visualizer/volume-sections.d.ts +64 -0
  146. package/lib/visualizer.component.d.ts +40 -0
  147. package/package.json +2 -2
  148. package/src/lib/assets/slice.svg +23 -0
  149. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
@@ -7,6 +7,7 @@ import { translateBounds } from '../../models/polygon-edit';
7
7
  import { makePolygon } from '../../models/polygon-factory';
8
8
  import { OPEN_PATH_TOL_PX, hitHandle, nearestEdge, regionContains, regionsInRect, topmostRegionAt, } from '../../region-overlay/region-geometry';
9
9
  import { SvgRegionRenderer, affineFromProjection } from '../../region-overlay/svg-region-renderer';
10
+ import { RegionSourceLayer, SOURCE_MARQUEE_LIMIT } from '../../region-overlay/region-source-layer';
10
11
  import { drawDraftPath, drawDraftRect, drawRegionLabel, drawSelectionBand, drawSelectionHandles, styleRegionShape, vertexMarker, } from './osd-region-overlay-draw';
11
12
  import { EDIT_TOL_PX, ZONE_CURSOR, rectZone, resizeRect } from '../../region-overlay/region-hit-test';
12
13
  const SVGNS = 'http://www.w3.org/2000/svg';
@@ -104,13 +105,18 @@ export class OsdRegionOverlay {
104
105
  this.viewer.canvas.appendChild(this.svg);
105
106
  this.renderer = new SvgRegionRenderer(this.svg, {
106
107
  rectElement: 'polygon',
107
- styleShape: (el, region, selected) => styleRegionShape(el, region, selected, this.store.getShapeColor()),
108
+ styleShape: (el, region, selected) => styleRegionShape(el, region, selected, this.store.getShapeColor(), this.store.getRegionStyle?.()),
108
109
  // The class label, when the Region Editor's "show labels" is on.
109
110
  decorate: (region, _i, _selected, layer) => {
110
- if (this.store.getShowShapeLabel())
111
- drawRegionLabel(layer, region, this.store.getShapeColor());
111
+ if (this.store.getShowShapeLabel() && !this.store.isLabelCovered?.(region.label)) {
112
+ drawRegionLabel(layer, region, this.store.getShapeColor(), this.store.getRegionStyle?.());
113
+ }
112
114
  },
115
+ skip: (region) => this.hidden(region),
113
116
  });
117
+ this.sourceLayer = this.store.getRegionSourceView$
118
+ ? new RegionSourceLayer(this.svg, this.store.getRegionSourceView$())
119
+ : null;
114
120
  this.viewer.canvas.addEventListener('pointercancel', this.pointerCancelHandler);
115
121
  // 'update-viewport' fires on every redrawn frame, animated ones included —
116
122
  // also listening to 'animation' rebuilt the whole SVG twice per frame.
@@ -192,6 +198,7 @@ export class OsdRegionOverlay {
192
198
  this.viewer.removeHandler('rotate', this.cameraHandler);
193
199
  if (this.tracker)
194
200
  this.tracker.destroy();
201
+ this.sourceLayer?.destroy();
195
202
  if (this.svg.parentNode)
196
203
  this.svg.parentNode.removeChild(this.svg);
197
204
  }
@@ -214,7 +221,9 @@ export class OsdRegionOverlay {
214
221
  /** Follow the current image→element projection: the renderer rewrites one transform
215
222
  * and re-positions its screen-space elements, or does nothing when it did not move. */
216
223
  updateCamera() {
217
- this.renderer.setCamera(affineFromProjection(this.toScreen));
224
+ const affine = affineFromProjection(this.toScreen);
225
+ this.renderer.setCamera(affine);
226
+ this.sourceLayer?.setCamera(affine);
218
227
  }
219
228
  /** Rebuild everything: the regions (in image coordinates), their labels and the overlay. */
220
229
  redraw() {
@@ -388,7 +397,8 @@ export class OsdRegionOverlay {
388
397
  const x1 = Math.max(start.x, end.x), y1 = Math.max(start.y, end.y);
389
398
  // Only a real drag selects; a click-sized band falls through to onClick.
390
399
  if (this.bandDragged && (x1 - x0 > 2 || y1 - y0 > 2)) {
391
- this.store.setSelectedShapeIndices(regionsInRect(this.store.getRegions(), x0, y0, x1, y1));
400
+ this.store.setSelectedShapeIndices(regionsInRect(this.store.getRegions(), x0, y0, x1, y1, { skip: (r) => this.hidden(r) }));
401
+ this.selectSourceIn(x0, y0, x1, y1);
392
402
  }
393
403
  this.renderOverlay();
394
404
  }
@@ -481,7 +491,8 @@ export class OsdRegionOverlay {
481
491
  this.viewer.canvas.style.cursor = ZONE_CURSOR[ez.zone];
482
492
  return;
483
493
  }
484
- this.updateCursor(this.regionIndexAt(this.toWorld(e.position)) >= 0);
494
+ const pt = this.toWorld(e.position);
495
+ this.updateCursor(this.regionIndexAt(pt) >= 0 || !!this.sourceLayer?.featureAt(pt.x, pt.y, OPEN_PATH_TOL_PX));
485
496
  }
486
497
  /**
487
498
  * The move/resize zone under the cursor for the currently-selected region
@@ -600,6 +611,13 @@ export class OsdRegionOverlay {
600
611
  }
601
612
  selectAt(pt, additive = false) {
602
613
  const idx = this.regionIndexAt(pt);
614
+ // Not on a region: a feature of the region source there is taken into the regions and
615
+ // selected (the source draws it until then).
616
+ const feature = idx < 0 ? this.sourceLayer?.featureAt(pt.x, pt.y, OPEN_PATH_TOL_PX) : null;
617
+ if (feature && this.store.selectSourceFeatures) {
618
+ void this.store.selectSourceFeatures([feature.id], additive);
619
+ return;
620
+ }
603
621
  if (additive) {
604
622
  // Shift-click on empty space keeps the current selection.
605
623
  if (idx < 0)
@@ -617,11 +635,23 @@ export class OsdRegionOverlay {
617
635
  }
618
636
  this.store.setSelectedShapeIndices(idx >= 0 ? [idx] : []);
619
637
  }
638
+ /** Take the region-source features the band meets into the regions, adding them to the selection. */
639
+ selectSourceIn(x0, y0, x1, y1) {
640
+ const features = this.sourceLayer?.featuresInRect(x0, y0, x1, y1) ?? [];
641
+ if (!features.length || !this.store.selectSourceFeatures)
642
+ return;
643
+ const ids = features.slice(0, SOURCE_MARQUEE_LIMIT).map((f) => f.id);
644
+ void this.store.selectSourceFeatures(ids, true);
645
+ }
620
646
  /** Index of the topmost region under an image point, or -1. */
621
647
  regionIndexAt(pt) {
622
- const opts = { toScreen: this.toScreen, tolPx: OPEN_PATH_TOL_PX };
648
+ const opts = { toScreen: this.toScreen, tolPx: OPEN_PATH_TOL_PX, skip: (r) => this.hidden(r) };
623
649
  return topmostRegionAt(this.store.getRegions(), pt.x, pt.y, opts);
624
650
  }
651
+ /** Whether a region's class is hidden (not drawn, not picked). */
652
+ hidden(region) {
653
+ return !!this.store.isClassHidden?.(region.label);
654
+ }
625
655
  /** Whether the element-pixel `position` lands on `region` (see `regionContains`). */
626
656
  containsPoint(region, position) {
627
657
  const pt = this.toWorld(position);
@@ -700,4 +730,4 @@ export class OsdRegionOverlay {
700
730
  this.redraw();
701
731
  }
702
732
  }
703
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NkLXJlZ2lvbi1vdmVybGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvb3NkL29zZC1yZWdpb24tb3ZlcmxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSS9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNULFdBQVcsRUFDWCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGVBQWUsR0FDaEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBWSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBWWhILE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFDO0FBUTNDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFN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TUFBTSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIE9wZW5TZWFkcmFnb24gZnJvbSAnb3BlbnNlYWRyYWdvbic7XG5pbXBvcnQgeyBPU0QgfSBmcm9tICcuL29zZC1saWInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlZ2lvbiwgUmVjdGFuZ2xlLCBQb2x5Z29uLCBNdWx0aVBvbHlnb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IElSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25FZGl0QXBpIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1zdG9yZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSwgUmVnaW9uVG9vbE1vZGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgZWxlbWVudFRvSW1hZ2UsIGltYWdlVG9FbGVtZW50IH0gZnJvbSAnLi9vc2QtY29vcmRzJztcbmltcG9ydCB7IE9zZFZpZXdlckxpa2UgfSBmcm9tICcuL29zZC12aWV3ZXItbGlrZSc7XG5pbXBvcnQgeyBPU0RfWk9PTV9QRVJfU0NST0xMIH0gZnJvbSAnLi9vc2Qtem9vbSc7XG5pbXBvcnQgeyB0cmFuc2xhdGVCb3VuZHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvcG9seWdvbi1lZGl0JztcbmltcG9ydCB7IG1ha2VQb2x5Z29uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BvbHlnb24tZmFjdG9yeSc7XG5pbXBvcnQge1xuICBPUEVOX1BBVEhfVE9MX1BYLFxuICBUb1NjcmVlbixcbiAgaGl0SGFuZGxlLFxuICBuZWFyZXN0RWRnZSxcbiAgcmVnaW9uQ29udGFpbnMsXG4gIHJlZ2lvbnNJblJlY3QsXG4gIHRvcG1vc3RSZWdpb25BdCxcbn0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWdlb21ldHJ5JztcbmltcG9ydCB7IFN2Z1JlZ2lvblJlbmRlcmVyLCBhZmZpbmVGcm9tUHJvamVjdGlvbiB9IGZyb20gJy4uLy4uL3JlZ2lvbi1vdmVybGF5L3N2Zy1yZWdpb24tcmVuZGVyZXInO1xuaW1wb3J0IHtcbiAgZHJhd0RyYWZ0UGF0aCxcbiAgZHJhd0RyYWZ0UmVjdCxcbiAgZHJhd1JlZ2lvbkxhYmVsLFxuICBkcmF3U2VsZWN0aW9uQmFuZCxcbiAgZHJhd1NlbGVjdGlvbkhhbmRsZXMsXG4gIHN0eWxlUmVnaW9uU2hhcGUsXG4gIHZlcnRleE1hcmtlcixcbn0gZnJvbSAnLi9vc2QtcmVnaW9uLW92ZXJsYXktZHJhdyc7XG5pbXBvcnQgeyBFRElUX1RPTF9QWCwgRWRpdFpvbmUsIFpPTkVfQ1VSU09SLCByZWN0Wm9uZSwgcmVzaXplUmVjdCB9IGZyb20gJy4uLy4uL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1oaXQtdGVzdCc7XG5cbi8qKlxuICogVGhlIHNoYXJlZCByZWdpb24gc3RvcmUgYXMgdGhlIG92ZXJsYXkgbmVlZHMgaXQ6IHRoZSBjcm9zcy1iYWNrZW5kXG4gKiB7QGxpbmsgSVJlZ2lvblN0b3JlfSAocmVhZCByZWdpb25zLCBzZWxlY3Rpb24sIGNvbG91cnMpIHBsdXMgdGhlIFJlZ2lvbi1uYXRpdmVcbiAqIHtAbGluayBJUmVnaW9uRWRpdEFwaX0gKGFkZC9tb3ZlL3Jlc2l6ZS92ZXJ0ZXggZWRpdHMpLiBUaGUgc2hhcmVkIFJlZ2lvblN0b3JlXG4gKiBzYXRpc2ZpZXMgYm90aC4gVGhlIG92ZXJsYXkgZWRpdHMgdGhyb3VnaCB0aGVzZSB0eXBlZCBvcGVyYXRpb25zIG9uIHRoZVxuICogbmV1dHJhbCBSZWdpb24gbW9kZWwg4oCUIGl0IG5ldmVyIHRvdWNoZXMgYSBiYWNrZW5kJ3Mgb3duIHNoYXBlIHJlcHJlc2VudGF0aW9uXG4gKiAoZS5nLiBQbG90bHkncyBgeDAveTAveDEveTFgIC8gYE3igKZM4oCmWmAgZGljdHMpLlxuICovXG5leHBvcnQgdHlwZSBSZWdpb25FZGl0U3RvcmUgPSBJUmVnaW9uU3RvcmUgJiBJUmVnaW9uRWRpdEFwaTtcblxuY29uc3QgU1ZHTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG4vKiogQSByZWdpb24ncyBnZW9tZXRyeSBhdCB0aGUgc3RhcnQgb2YgYSBtb3ZlL3Jlc2l6ZSAoc2VlIGBzbmFwc2hvdGApOiBhIHJlY3RhbmdsZSdzXG4gKiAgYm94IGZvciBhIHJlc2l6ZSwgb3IgdGhlIHBvbHlnb24vbXVsdGktcG9seWdvbiBib3VuZHMgdGhlbXNlbHZlcyBmb3IgYSBtb3ZlIOKAlCB0aGVcbiAqICBzdG9yZSBpcyBjb3B5LW9uLXdyaXRlLCBzbyB0aGUgZ2VzdHVyZS1zdGFydCBpbnN0YW5jZSBuZXZlciBjaGFuZ2VzIHVuZGVyIHRoZSBkcmFnLiAqL1xudHlwZSBFZGl0U25hcHNob3QgPVxuICB7IGtpbmQ6ICdyZWN0JzsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdzaGFwZSc7IGJvdW5kczogUG9seWdvbiB8IE11bHRpUG9seWdvbiB9O1xuXG4vKipcbiAqIE9wZW5TZWFkcmFnb24gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElSZWdpb25PdmVybGF5fS5cbiAqXG4gKiAtIFJlbmRlcnMgdGhlIHN0b3JlJ3MgcmVnaW9ucyAocmVjdC9wb2x5Z29uKSBpbiBpbWFnZS1waXhlbCBzcGFjZSwga2VwdFxuICogICBhbGlnbmVkIG9uIGV2ZXJ5IHBhbi96b29tIHZpYSB0aGUgT1NEIHZpZXdwb3J0IEFQSS5cbiAqIC0gRHJhd3MgbmV3IHJlY3RhbmdsZSBhbmQgcG9seWdvbiByZWdpb25zIChjb21taXR0ZWQgdG8gdGhlIHNoYXJlZCBzdG9yZSkuXG4gKiAtIENsaWNrLXRvLXNlbGVjdCBpbiAnc2VsZWN0JyBtb2RlLlxuICpcbiAqIFJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIHtAbGluayBJUmVnaW9uU3RvcmV9LCBzbyByZWdpb25zIHN0YXkgaW4gc3luYyB3aXRoIHRoZVxuICogUmVnaW9uIEVkaXRvciBhbmQgdGhlIFBsb3RseSBiYWNrZW5kLiBUaGUgd2FuZCwgdmVydGV4LWVyYXNlciBhbmQgem9vbS10by1ib3hcbiAqIHRvb2xzIGFyZSBOT1QgaGFuZGxlZCBoZXJlIOKAlCB0aGV5J3JlIG93bmVkIGJ5IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZVxuICogKHdoaWNoIGJpbmRzIHRoZW0gdG8gT1NEIHZpYSB0aGUgc2hhcmVkIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgdmlld3BvcnQgcGl4ZWxcbiAqIHJlYWRiYWNrKSwgdGhlIHNhbWUgc2luZ2xldG9uIHRvb2wgc2VydmljZXMgdGhlIFBsb3RseSBiYWNrZW5kIHVzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPc2RSZWdpb25PdmVybGF5IGltcGxlbWVudHMgSVJlZ2lvbk92ZXJsYXkge1xuICBwcml2YXRlIHJlYWRvbmx5IHN2ZzogU1ZHU1ZHRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHNlbGVjdGVkOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIG1vZGU6IFJlZ2lvblRvb2xNb2RlID0gJ25vbmUnO1xuXG4gIHByaXZhdGUgdHJhY2tlcjogT3BlblNlYWRyYWdvbi5Nb3VzZVRyYWNrZXI7XG4gIHByaXZhdGUgcmVjdFN0YXJ0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDsgLy8gaW1hZ2UgY29vcmRzXG4gIHByaXZhdGUgcmVjdEN1cnJlbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvbHlQb2ludHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdID0gW107IC8vIGltYWdlIGNvb3Jkc1xuICAvKiogVHJ1ZSB3aGlsZSBkcmFnZ2luZyBhIGZyZWVoYW5kIHBhdGggKGZyZWVmb3JtIC8gcG9seWxpbmUpLiAqL1xuICBwcml2YXRlIGZyZWVoYW5kRHJhZ2dpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGxhY2luZyBhIGNsaWNrLXRvLWFkZCBwb2x5Z29uICgnZHJhd3BvbHlnb24nIG1vZGUpLiAqL1xuICBwcml2YXRlIGRyYXdpbmdQb2x5Z29uID0gZmFsc2U7XG4gIC8qKiBMYXN0IGVsZW1lbnQtcGl4ZWwgcG9pbnQgYXBwZW5kZWQsIHRvIHRoaW4gdGhlIGZyZWVoYW5kIHBhdGguICovXG4gIHByaXZhdGUgbGFzdEZyZWVoYW5kUHg6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogSW4tcHJvZ3Jlc3MgZWRpdCBvZiB0aGUgc2VsZWN0ZWQgcmVnaW9uOlxuICAgKiAgLSBraW5kICdib3VuZHMnIOKAlCByZWN0YW5nbGUgcmVzaXplL21vdmUgb3Igd2hvbGUtcmVnaW9uIG1vdmUgKHVzZXMgYHpvbmVgKTtcbiAgICogIC0ga2luZCAndmVydGV4JyDigJQgZHJhZ2dpbmcgYSBzaW5nbGUgcG9seWdvbiB2ZXJ0ZXggKHVzZXMgYHZlcnRleEluZGV4YCkuXG4gICAqL1xuICBwcml2YXRlIGVkaXQ6IHtcbiAgICBraW5kOiAnYm91bmRzJyB8ICd2ZXJ0ZXgnIHwgJ2hhbmRsZSc7XG4gICAgem9uZTogRWRpdFpvbmU7XG4gICAgdmVydGV4SW5kZXg6IG51bWJlcjtcbiAgICAvKiogV2hpY2ggcmluZyB0aGUgZHJhZ2dlZCB2ZXJ0ZXggYmVsb25ncyB0bzogLTEgPSBleHRlcmlvciwgZWxzZSBhIGhvbGVcbiAgICAgKiAgaW5kZXggaW50byBgUG9seWdvbi5ob2xlc2AgKGppdC11aSM4NSkuICovXG4gICAgcmluZzogbnVtYmVyO1xuICAgIGhhbmRsZVNpZGU6ICdpbicgfCAnb3V0JztcbiAgICBpZDogbnVtYmVyO1xuICAgIHN0YXJ0SW1nOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgLyoqIEdlc3R1cmUtc3RhcnQgZ2VvbWV0cnk7IHNldCBmb3IgJ2JvdW5kcycgZWRpdHMgb25seS4gKi9cbiAgICBvcmlnOiBFZGl0U25hcHNob3QgfCBudWxsO1xuICB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRpdERyYWdnZWQgPSBmYWxzZTtcbiAgLyoqIFJ1YmJlci1iYW5kIChtYXJxdWVlKSBtdWx0aS1zZWxlY3QgaW4gJ3NlbGVjdCcgbW9kZTogcHJlc3Mgb24gZW1wdHkgc3BhY2VcbiAgICogIGFuZCBkcmFnIHRvIHNlbGVjdCBldmVyeSByZWdpb24gdGhlIGJhbmQgaW50ZXJzZWN0cy4gSW1hZ2UgY29vcmRzLiAqL1xuICBwcml2YXRlIGJhbmRTdGFydDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFuZEN1cnJlbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGJhbmREcmFnZ2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZWRyYXdIYW5kbGVyID0gKCkgPT4gdGhpcy5yZWRyYXcoKTtcbiAgLyoqIEEgY2FtZXJhIG1vdmUgKCd1cGRhdGUtdmlld3BvcnQnLCByYWlzZWQgb24gZXZlcnkgcmVkcmF3biBmcmFtZSwgYW5pbWF0ZWQgb25lc1xuICAgKiAgaW5jbHVkZWQ7ICdyZXNpemUnOyAncm90YXRlJykuIFRoZSByZWdpb25zIGFyZSBkcmF3biBpbiBpbWFnZSBjb29yZGluYXRlcywgc29cbiAgICogIG9ubHkgdGhlIHJlbmRlcmVyJ3MgdHJhbnNmb3JtIGFuZCBpdHMgZmV3IHNjcmVlbi1zcGFjZSBlbGVtZW50cyBmb2xsb3c7IG5vdGhpbmdcbiAgICogIGlzIHJlYnVpbHQgKE9TRC1QTE9UTFktMTEpLiBBIHRpbGUtb25seSBmcmFtZSAobG9hZGluZywgcmVjb2xvcikgbGVhdmVzIHRoZVxuICAgKiAgcHJvamVjdGlvbiwgYW5kIHNvIHRoZSBET00sIHVudG91Y2hlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjYW1lcmFIYW5kbGVyID0gKCkgPT4gdGhpcy51cGRhdGVDYW1lcmEoKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogU3ZnUmVnaW9uUmVuZGVyZXI7XG4gIC8qKiBPU0QncyBNb3VzZVRyYWNrZXIgZHJvcHMgYSBjYW5jZWxsZWQgcG9pbnRlciAodG91Y2ggaW50ZXJydXB0ZWQsIHBvaW50ZXJcbiAgICogIGNhcHR1cmUgbG9zdCB0byB0aGUgYnJvd3Nlcikgd2l0aG91dCBjYWxsaW5nIHJlbGVhc2VIYW5kbGVyLCBzbyB0aGVcbiAgICogIGdlc3R1cmUgaXMgZW5kZWQgaGVyZSBpbnN0ZWFkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBvaW50ZXJDYW5jZWxIYW5kbGVyID0gKCkgPT4ge1xuICAgIHRoaXMuZW5kR2VzdHVyZSgpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aWV3ZXI6IE9zZFZpZXdlckxpa2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogUmVnaW9uRWRpdFN0b3JlLFxuICApIHtcbiAgICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgJ3N2ZycpIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnN2Zy5zdHlsZSwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJywgLy8gT1NEIGhhbmRsZXMgbmF2aWdhdGlvbiB1bmxlc3Mgd2UncmUgZHJhd2luZ1xuICAgIH0pO1xuICAgIHRoaXMudmlld2VyLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBTdmdSZWdpb25SZW5kZXJlcih0aGlzLnN2Zywge1xuICAgICAgcmVjdEVsZW1lbnQ6ICdwb2x5Z29uJyxcbiAgICAgIHN0eWxlU2hhcGU6IChlbCwgcmVnaW9uLCBzZWxlY3RlZCkgPT4gc3R5bGVSZWdpb25TaGFwZShlbCwgcmVnaW9uLCBzZWxlY3RlZCwgdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCkpLFxuICAgICAgLy8gVGhlIGNsYXNzIGxhYmVsLCB3aGVuIHRoZSBSZWdpb24gRWRpdG9yJ3MgXCJzaG93IGxhYmVsc1wiIGlzIG9uLlxuICAgICAgZGVjb3JhdGU6IChyZWdpb24sIF9pLCBfc2VsZWN0ZWQsIGxheWVyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCkpIGRyYXdSZWdpb25MYWJlbChsYXllciwgcmVnaW9uLCB0aGlzLnN0b3JlLmdldFNoYXBlQ29sb3IoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMudmlld2VyLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5wb2ludGVyQ2FuY2VsSGFuZGxlcik7XG5cbiAgICAvLyAndXBkYXRlLXZpZXdwb3J0JyBmaXJlcyBvbiBldmVyeSByZWRyYXduIGZyYW1lLCBhbmltYXRlZCBvbmVzIGluY2x1ZGVkIOKAlFxuICAgIC8vIGFsc28gbGlzdGVuaW5nIHRvICdhbmltYXRpb24nIHJlYnVpbHQgdGhlIHdob2xlIFNWRyB0d2ljZSBwZXIgZnJhbWUuXG4gICAgdGhpcy52aWV3ZXIuYWRkSGFuZGxlcigndXBkYXRlLXZpZXdwb3J0JywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICB0aGlzLnZpZXdlci5hZGRIYW5kbGVyKCdyZXNpemUnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIHRoaXMudmlld2VyLmFkZEhhbmRsZXIoJ3JvdGF0ZScsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgLy8gS2VlcCB3aGVlbC16b29tIGFsaXZlIHdoaWxlIGEgdG9vbCBoYXMgbW91c2UtbmF2IGRpc2FibGVkIChzZWUgaGFuZGxlcikuXG4gICAgdGhpcy52aWV3ZXIuZWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLndoZWVsWm9vbUhhbmRsZXIsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICB0aGlzLnRyYWNrZXIgPSBuZXcgT1NELk1vdXNlVHJhY2tlcih7XG4gICAgICBlbGVtZW50OiB0aGlzLnZpZXdlci5jYW52YXMsXG4gICAgICBwcmVzc0hhbmRsZXI6IChlOiBhbnkpID0+IHRoaXMub25QcmVzcyhlKSxcbiAgICAgIGRyYWdIYW5kbGVyOiAoZTogYW55KSA9PiB0aGlzLm9uRHJhZyhlKSxcbiAgICAgIHJlbGVhc2VIYW5kbGVyOiAoZTogYW55KSA9PiB0aGlzLm9uUmVsZWFzZShlKSxcbiAgICAgIGNsaWNrSGFuZGxlcjogKGU6IGFueSkgPT4gdGhpcy5vbkNsaWNrKGUpLFxuICAgICAgbW92ZUhhbmRsZXI6IChlOiBhbnkpID0+IHRoaXMub25Nb3ZlKGUpLFxuICAgIH0pO1xuICAgIHRoaXMudHJhY2tlci5zZXRUcmFja2luZyhmYWxzZSk7XG5cbiAgICB0aGlzLnN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKS5zdWJzY3JpYmUodGhpcy5yZWRyYXdIYW5kbGVyKSk7XG4gICAgdGhpcy5zdWJzLmFkZChcbiAgICAgIHRoaXMuc3RvcmUuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkuc3Vic2NyaWJlKChpZHgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGlkeCB8fCBbXTtcbiAgICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG5cbiAgLyoqIFN3aXRjaCBkcmF3aW5nL3NlbGVjdGlvbiBtb2RlOyB0b2dnbGVzIE9TRCBuYXZpZ2F0aW9uIGFjY29yZGluZ2x5LiAqL1xuICBzZXRNb2RlKG1vZGU6IFJlZ2lvblRvb2xNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnJlc2V0SW5Qcm9ncmVzcygpO1xuICAgIC8vIEFueSBhY3RpdmUgcmVnaW9uIHRvb2wgdGFrZXMgb3ZlciB0aGUgcG9pbnRlciDigJQgT1NEIHBhbi96b29tIGlzIGRpc2FibGVkXG4gICAgLy8gc28gZHJhZ2dpbmcgZHJhd3MgKGFuZCBjbGlja3Mgc2VsZWN0KSBpbnN0ZWFkIG9mIHBhbm5pbmcuIFdpdGggbm8gdG9vbCxcbiAgICAvLyBPU0QgbmF2aWdhdGVzIG5vcm1hbGx5LlxuICAgIHRoaXMudmlld2VyLnNldE1vdXNlTmF2RW5hYmxlZChtb2RlID09PSAnbm9uZScpO1xuICAgIHRoaXMudHJhY2tlci5zZXRUcmFja2luZyhtb2RlICE9PSAnbm9uZScpO1xuICAgIHRoaXMudXBkYXRlQ3Vyc29yKGZhbHNlKTtcbiAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKiBEcml2ZSBPU0Qgem9vbSBmcm9tIHRoZSB3aGVlbCB3aGlsZSBhbnkgdG9vbCBvd25zIHRoZSBwb2ludGVyLlxuICAgKlxuICAgKiBPU0QncyBuYXRpdmUgc2Nyb2xsLXpvb20gaXMgcGFydCBvZiBtb3VzZS1uYXYsIHNvIGBzZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpYFxuICAgKiAodXNlZCBieSBldmVyeSByZWdpb24gdG9vbCBhbmQgYnkgdGhlIHdhbmQvYnJ1c2gvZXJhc2VyL1NBTSB0b29scykgZGlzYWJsZXNcbiAgICogaXQuIFRoZSBjb3ZlcmluZy1jYW52YXMgdG9vbHMgYWxzbyBzaXQgYWJvdmUgdGhlIE9TRCBjYW52YXMgYW5kIHN3YWxsb3cgdGhlXG4gICAqIHdoZWVsIG91dHJpZ2h0LiBUaGlzIGxpc3RlbmVyIGlzIGJvdW5kIG9uY2UgdG8gdGhlIHZpZXdlciBlbGVtZW50IOKAlCBhblxuICAgKiBhbmNlc3RvciBvZiBib3RoIHRoZSBPU0QgY2FudmFzIGFuZCB0aGUgdG9vbCBvdmVybGF5cyDigJQgYW5kIGZvcndhcmRzIHRoZVxuICAgKiB3aGVlbCB0byBhIGN1cnNvci1jZW50cmVkIHpvb20gd2hlbmV2ZXIgbW91c2UtbmF2IGlzIG9mZi4gV2hlbiBuYXYgaXMgb24gKG5vXG4gICAqIHRvb2wgYWN0aXZlKSBpdCBkb2VzIG5vdGhpbmcgYW5kIE9TRCB6b29tcyBuYXRpdmVseS4gKGppdC11aSM5NCkgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB3aGVlbFpvb21IYW5kbGVyID0gKGU6IFdoZWVsRXZlbnQpID0+IHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBjb25zdCBlbCA9IHRoaXMudmlld2VyPy5lbGVtZW50O1xuICAgIC8vIE5hdiBvbiDihpIgbm8gdG9vbCBhY3RpdmUg4oaSIGxldCBPU0QgaGFuZGxlIHNjcm9sbC16b29tIG5hdGl2ZWx5LlxuICAgIGlmICghdnAgfHwgIWVsIHx8IGUuZGVsdGFZID09PSAwIHx8IHRoaXMudmlld2VyLmlzTW91c2VOYXZFbmFibGVkKCkpIHJldHVybjtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHJlZlBvaW50ID0gdnAucG9pbnRGcm9tUGl4ZWwobmV3IE9TRC5Qb2ludChlLmNsaWVudFggLSByZWN0LmxlZnQsIGUuY2xpZW50WSAtIHJlY3QudG9wKSk7XG4gICAgdnAuem9vbUJ5KGUuZGVsdGFZIDwgMCA/IE9TRF9aT09NX1BFUl9TQ1JPTEwgOiAxIC8gT1NEX1pPT01fUEVSX1NDUk9MTCwgcmVmUG9pbnQpO1xuICAgIHZwLmFwcGx5Q29uc3RyYWludHMoKTtcbiAgfTtcblxuICAvKiogQ3Vyc29yIGZlZWRiYWNrIHBlciBtb2RlIChjcm9zc2hhaXIgd2hpbGUgZHJhd2luZzsgcG9pbnRlciBvdmVyIGEgcmVnaW9uXG4gICAqICBpbiBzZWxlY3QgbW9kZSkuICovXG4gIHByaXZhdGUgdXBkYXRlQ3Vyc29yKG92ZXJSZWdpb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLnZpZXdlci5jYW52YXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tb2RlID09PSAnZHJhd3JlY3QnIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgfHxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2RyYXdvcGVucGF0aCcgfHxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2RyYXdwb2x5Z29uJyB8fFxuICAgICAgdGhpcy5tb2RlID09PSAnYWRkcG9pbnQnIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdkZWxldGVwb2ludCdcbiAgICApIHtcbiAgICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ21vdmUnKSB7XG4gICAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IG92ZXJSZWdpb24gPyAncG9pbnRlcicgOiAnZGVmYXVsdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSAnJzsgLy8gT1NEIGRlZmF1bHQgKGdyYWIpXG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNlbGVjdGVkIHJlZ2lvbidzIHZlcnRpY2VzL2hhbmRsZXMgc2hvdWxkIGJlIGRyYXduLiBTaG93blxuICAgKiAgd2hlbmV2ZXIgYSByZWdpb24gaXMgc2VsZWN0ZWQg4oCUIGluY2x1ZGluZyBgbm9uZWAgKGRpc3BsYXkpIG1vZGUgYW5kIHdoaWxlXG4gICAqICBhbm90aGVyIHRvb2wgKHdhbmQsIGJydXNoLCBTQU3igKYpIGlzIGFjdGl2ZSDigJQgc28gYSBzZWxlY3Rpb24gYWx3YXlzIHJldmVhbHNcbiAgICogIGl0cyB2ZXJ0aWNlcy4gU3VwcHJlc3NlZCBvbmx5IHdoaWxlIGFjdGl2ZWx5IGRyYXdpbmcgYSBicmFuZC1uZXcgc2hhcGUsXG4gICAqICB3aGVyZSBzdHJheSBoYW5kbGVzIHdvdWxkIGJlIG5vaXNlLiAqL1xuICBwcml2YXRlIGdldCBzaG93c1NlbGVjdGVkVmVydGljZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubW9kZSAhPT0gJ2RyYXdyZWN0JyAmJlxuICAgICAgdGhpcy5tb2RlICE9PSAnZHJhd3BvbHlnb24nICYmXG4gICAgICB0aGlzLm1vZGUgIT09ICdkcmF3Y2xvc2VkcGF0aCcgJiZcbiAgICAgIHRoaXMubW9kZSAhPT0gJ2RyYXdvcGVucGF0aCdcbiAgICApO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbG9zZSBhIGdlc3R1cmUgaW4gZmxpZ2h0IGZpcnN0OiBhIGRyYWcncyBvcGVuIHN0b3JlIGJhdGNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHN1cHByZXNzIGV2ZXJ5IGxhdGVyIHJlZ2lvbi11cGRhdGUgZW1pc3Npb24gYXBwLXdpZGUuXG4gICAgdGhpcy5lbmRHZXN0dXJlKCk7XG4gICAgdGhpcy52aWV3ZXIuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLnBvaW50ZXJDYW5jZWxIYW5kbGVyKTtcbiAgICB0aGlzLnN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnZpZXdlci5lbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMud2hlZWxab29tSGFuZGxlcik7XG4gICAgdGhpcy52aWV3ZXIucmVtb3ZlSGFuZGxlcigndXBkYXRlLXZpZXdwb3J0JywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICB0aGlzLnZpZXdlci5yZW1vdmVIYW5kbGVyKCdyZXNpemUnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIHRoaXMudmlld2VyLnJlbW92ZUhhbmRsZXIoJ3JvdGF0ZScsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgaWYgKHRoaXMudHJhY2tlcikgdGhpcy50cmFja2VyLmRlc3Ryb3koKTtcbiAgICBpZiAodGhpcy5zdmcucGFyZW50Tm9kZSkgdGhpcy5zdmcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnN2Zyk7XG4gIH1cblxuICAvLyDilIDilIAgY29vcmRpbmF0ZSBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogSW1hZ2UtcGl4ZWwgcG9pbnQgLT4gZWxlbWVudCBwaXhlbCBwb2ludC4gKi9cbiAgcHJpdmF0ZSB0b1B4KGltZ1g6IG51bWJlciwgaW1nWTogbnVtYmVyKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICByZXR1cm4gaW1hZ2VUb0VsZW1lbnQodGhpcy52aWV3ZXIsIGltZ1gsIGltZ1kpO1xuICB9XG4gIC8qKiBFbGVtZW50IHBpeGVsIHBvaW50IChmcm9tIGEgTW91c2VUcmFja2VyIGV2ZW50KSAtPiBpbWFnZS1waXhlbCBwb2ludCwgcm91bmRlZFxuICAgKiAgdG8gd2hvbGUgcGl4ZWxzICh3aGVyZSBhIGRyYXduIHZlcnRleCBsYW5kcykuICovXG4gIHByaXZhdGUgdG9JbWFnZShwb3M6IGFueSk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgcCA9IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBwb3MueCwgcG9zLnkpO1xuICAgIHJldHVybiB7IHg6IE1hdGgucm91bmQocC54KSwgeTogTWF0aC5yb3VuZChwLnkpIH07XG4gIH1cbiAgLyoqIEVsZW1lbnQgcGl4ZWwgcG9pbnQgLT4gZXhhY3QgaW1hZ2UgcG9pbnQsIGZvciBoaXQgdGVzdHMuICovXG4gIHByaXZhdGUgdG9Xb3JsZChwb3M6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBwb3MueCwgcG9zLnkpO1xuICB9XG4gIC8qKiBJbWFnZSBwb2ludCAtPiBlbGVtZW50IHB4LCBhcyB0aGUgc2hhcmVkIHJlZ2lvbiBnZW9tZXRyeSB3YW50cyBpdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0b1NjcmVlbjogVG9TY3JlZW4gPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHEgPSB0aGlzLnRvUHgoeCwgeSk7XG4gICAgcmV0dXJuIFtxLngsIHEueV07XG4gIH07XG5cbiAgLy8g4pSA4pSAIHJlbmRlcmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqIEZvbGxvdyB0aGUgY3VycmVudCBpbWFnZeKGkmVsZW1lbnQgcHJvamVjdGlvbjogdGhlIHJlbmRlcmVyIHJld3JpdGVzIG9uZSB0cmFuc2Zvcm1cbiAgICogIGFuZCByZS1wb3NpdGlvbnMgaXRzIHNjcmVlbi1zcGFjZSBlbGVtZW50cywgb3IgZG9lcyBub3RoaW5nIHdoZW4gaXQgZGlkIG5vdCBtb3ZlLiAqL1xuICBwcml2YXRlIHVwZGF0ZUNhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENhbWVyYShhZmZpbmVGcm9tUHJvamVjdGlvbih0aGlzLnRvU2NyZWVuKSk7XG4gIH1cblxuICAvKiogUmVidWlsZCBldmVyeXRoaW5nOiB0aGUgcmVnaW9ucyAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLCB0aGVpciBsYWJlbHMgYW5kIHRoZSBvdmVybGF5LiAqL1xuICByZWRyYXcoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYW1lcmEoKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKSwgdGhpcy5zZWxlY3RlZCk7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCB0aGUgc2NyZWVuLXNwYWNlIG92ZXJsYXkgb25seTogdGhlIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMsIHRoZSBydWJiZXIgYmFuZFxuICAgKiBhbmQgYW55IGluLXByb2dyZXNzIGRyYXdpbmcuIERyYXdpbmcgYW5kIG1hcnF1ZWUgZHJhZ3MgY2FsbCB0aGlzIHJhdGhlciB0aGFuXG4gICAqIHtAbGluayByZWRyYXd9LCBzbyB0aGUgcmVnaW9ucyBhcmUgbm90IHJlYnVpbHQgcGVyIHBvaW50ZXIgbW92ZS5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyT3ZlcmxheSgpOiB2b2lkIHtcbiAgICBjb25zdCBzaGFwZUNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXJPdmVybGF5KChsYXllcikgPT4ge1xuICAgICAgLy8gSGFuZGxlcyBvbiB0aGUgc2VsZWN0ZWQgcmVnaW9uLCBzbyB0aGUgdXNlciBjYW4gZ3JhYi9pbnNlcnQvZGVsZXRlXG4gICAgICAvLyB2ZXJ0aWNlcyDigJQgaW4gdGhlIHJlZ2lvbidzIG93biBjb2xvdXIsIHNvIHRoZXkgbWF0Y2ggdGhlIHNoYXBlLlxuICAgICAgY29uc3Qgc2VsID0gdGhpcy5zaG93c1NlbGVjdGVkVmVydGljZXMgPyB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpIDogbnVsbDtcbiAgICAgIGlmIChzZWwpIGRyYXdTZWxlY3Rpb25IYW5kbGVzKGxheWVyLCBzZWwucmVnaW9uLCBzZWwucmVnaW9uLmNvbG9yIHx8IHNoYXBlQ29sb3IpO1xuICAgICAgLy8gUnViYmVyLWJhbmQgKG1hcnF1ZWUpIHNlbGVjdGlvbiBwcmV2aWV3LlxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcgJiYgdGhpcy5iYW5kU3RhcnQgJiYgdGhpcy5iYW5kQ3VycmVudCkge1xuICAgICAgICBkcmF3U2VsZWN0aW9uQmFuZChsYXllciwgdGhpcy5iYW5kU3RhcnQsIHRoaXMuYmFuZEN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgLy8gSW4tcHJvZ3Jlc3MgZHJhd2luZyBwcmV2aWV3LlxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0JyAmJiB0aGlzLnJlY3RTdGFydCAmJiB0aGlzLnJlY3RDdXJyZW50KSB7XG4gICAgICAgIGRyYXdEcmFmdFJlY3QobGF5ZXIsIHRoaXMucmVjdFN0YXJ0LCB0aGlzLnJlY3RDdXJyZW50LCBzaGFwZUNvbG9yKTtcbiAgICAgIH1cbiAgICAgIGlmICgodGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8IHRoaXMubW9kZSA9PT0gJ2RyYXdvcGVucGF0aCcpICYmIHRoaXMucG9seVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgZHJhd0RyYWZ0UGF0aChsYXllciwgdGhpcy5wb2x5UG9pbnRzLCBzaGFwZUNvbG9yKTtcbiAgICAgIH1cbiAgICAgIC8vIENsaWNrLXRvLXBsYWNlIHBvbHlnb24gcHJldmlldzogdGhlIHBvbHlsaW5lIHNvIGZhciArIGEgbWFya2VyIG9uIHRoZVxuICAgICAgLy8gZmlyc3QgdmVydGV4IChjbGljayBpdCB0byBjbG9zZSkuXG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3BvbHlnb24nICYmIHRoaXMucG9seVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgZHJhd0RyYWZ0UGF0aChsYXllciwgdGhpcy5wb2x5UG9pbnRzLCBzaGFwZUNvbG9yKTtcbiAgICAgICAgdmVydGV4TWFya2VyKGxheWVyLCB0aGlzLnBvbHlQb2ludHNbMF0ueCwgdGhpcy5wb2x5UG9pbnRzWzBdLnksIHRydWUsIHNoYXBlQ29sb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVyYWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGdldCBpc0ZyZWVoYW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgfHwgdGhpcy5tb2RlID09PSAnZHJhd29wZW5wYXRoJztcbiAgfVxuXG4gIHByaXZhdGUgb25QcmVzcyhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnKSB7XG4gICAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucmVjdEN1cnJlbnQgPSB0aGlzLnJlY3RTdGFydDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNGcmVlaGFuZCkge1xuICAgICAgLy8gRnJlZWhhbmQgZHJhdyAobWF0Y2hlcyBQbG90bHkgZHJhd2Nsb3NlZHBhdGgvZHJhd29wZW5wYXRoKTogcHJlc3MgdG9cbiAgICAgIC8vIHN0YXJ0LCBkcmFnIHRvIHRyYWNlLCByZWxlYXNlIHRvIGNvbW1pdC5cbiAgICAgIHRoaXMuZnJlZWhhbmREcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLnBvbHlQb2ludHMgPSBbdGhpcy50b0ltYWdlKGUucG9zaXRpb24pXTtcbiAgICAgIHRoaXMubGFzdEZyZWVoYW5kUHggPSB7IHg6IGUucG9zaXRpb24ueCwgeTogZS5wb3NpdGlvbi55IH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb3ZlJykge1xuICAgICAgLy8gV2hvbGUtcmVnaW9uIGRyYWcgKCdtb3ZlJyBtb2RlKTogcHJlc3MgaW5zaWRlIHRoZSBzZWxlY3RlZCByZWdpb25cbiAgICAgIC8vIHRvIHRyYW5zbGF0ZSBpdCwgaWdub3JpbmcgdmVydGljZXMvZWRnZXMuXG4gICAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpO1xuICAgICAgaWYgKHNlbCAmJiB0aGlzLmNvbnRhaW5zUG9pbnQoc2VsLnJlZ2lvbiwgZS5wb3NpdGlvbikpIHtcbiAgICAgICAgdGhpcy5zdGFydEVkaXQoJ2JvdW5kcycsICdtb3ZlJywgLTEsIHNlbC5yZWdpb24sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAvLyBBIGJlemllciBjb250cm9sIGhhbmRsZSB0YWtlcyB0b3AgcHJpb3JpdHkgKGl0IHNpdHMgb2ZmIHRoZSBhbmNob3IpLCB0aGVuXG4gICAgICAvLyBkcmFnZ2luZyBhIHNpbmdsZSBwb2x5Z29uIHZlcnRleCAob3ZlciBib2R5LW1vdmUvcmVzaXplKS5cbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMuaGl0UG9seWdvbkhhbmRsZShlLnBvc2l0aW9uKTtcbiAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gdGhpcy5zdG9yZS5nZXRSZWdpb25zKClbdGhpcy5zZWxlY3RlZFt0aGlzLnNlbGVjdGVkLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgaWYgKGhpdC5raW5kID09PSAnYmV6aWVyJykge1xuICAgICAgICAgIHRoaXMuc3RhcnRFZGl0KCdoYW5kbGUnLCAnbW92ZScsIGhpdC5pbmRleCwgcmVnaW9uLCB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbiksIGhpdC5zaWRlLCBoaXQucmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGFydEVkaXQoJ3ZlcnRleCcsICdtb3ZlJywgaGl0LmluZGV4LCByZWdpb24sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSwgJ291dCcsIGhpdC5yaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2Ugc3RhcnQgYSBtb3ZlL3Jlc2l6ZSB3aGVuIHByZXNzaW5nIHRoZSBzZWxlY3RlZCByZWdpb24nc1xuICAgICAgLy8gYm9keS9oYW5kbGVzLlxuICAgICAgY29uc3QgZXogPSB0aGlzLmVkaXRab25lQXQoZS5wb3NpdGlvbik7XG4gICAgICBpZiAoZXopIHtcbiAgICAgICAgdGhpcy5zdGFydEVkaXQoJ2JvdW5kcycsIGV6LnpvbmUsIC0xLCB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKVtlei5pbmRleF0sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXNzIG9uIGVtcHR5IHNwYWNlIC8gYSBub24tc2VsZWN0ZWQgcmVnaW9uOiBiZWdpbiBhIHJ1YmJlci1iYW5kXG4gICAgICAvLyBtdWx0aS1zZWxlY3QuIEEgcGxhaW4gY2xpY2sgKG5vIGRyYWcpIGZhbGxzIHRocm91Z2ggdG8gb25DbGljaywgd2hpY2hcbiAgICAgIC8vIHNpbmdsZS1zZWxlY3RzIG9yIGNsZWFycy5cbiAgICAgIHRoaXMuYmFuZFN0YXJ0ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5iYW5kQ3VycmVudCA9IHRoaXMuYmFuZFN0YXJ0O1xuICAgICAgdGhpcy5iYW5kRHJhZ2dlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCZWdpbiBhbiBlZGl0IGdlc3R1cmUgKG1vdmUvcmVzaXplIG9yIHNpbmdsZS12ZXJ0ZXggZHJhZykgYW5kIG9wZW4gYSBzdG9yZVxuICAgKiAgYmF0Y2ggc28gdGhlIGxpdmUgZHJhZyBlbWl0cyBvbmNlIG9uIHJlbGVhc2UuICovXG4gIHByaXZhdGUgc3RhcnRFZGl0KFxuICAgIGtpbmQ6ICdib3VuZHMnIHwgJ3ZlcnRleCcgfCAnaGFuZGxlJyxcbiAgICB6b25lOiBFZGl0Wm9uZSxcbiAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyLFxuICAgIHJlZ2lvbjogUmVnaW9uLFxuICAgIHN0YXJ0SW1nOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgaGFuZGxlU2lkZTogJ2luJyB8ICdvdXQnID0gJ291dCcsXG4gICAgcmluZyA9IC0xLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVkaXQgPSB7XG4gICAgICBraW5kLFxuICAgICAgem9uZSxcbiAgICAgIHZlcnRleEluZGV4LFxuICAgICAgcmluZyxcbiAgICAgIGhhbmRsZVNpZGUsXG4gICAgICBpZDogcmVnaW9uLmlkLFxuICAgICAgc3RhcnRJbWcsXG4gICAgICBvcmlnOiBraW5kID09PSAnYm91bmRzJyA/IHRoaXMuc25hcHNob3QocmVnaW9uKSA6IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLmVkaXREcmFnZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5zdG9yZS5iZWdpbkJhdGNoKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZyhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnICYmIHRoaXMucmVjdFN0YXJ0KSB7XG4gICAgICB0aGlzLnJlY3RDdXJyZW50ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyZWVoYW5kRHJhZ2dpbmcgJiYgdGhpcy5pc0ZyZWVoYW5kKSB7XG4gICAgICAvLyBUaGluIHRoZSBwYXRoOiBvbmx5IHNhbXBsZSBvbmNlIHRoZSBjdXJzb3IgaGFzIG1vdmVkIGEgZmV3IHNjcmVlbiBweC5cbiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RGcmVlaGFuZFB4O1xuICAgICAgaWYgKCFsYXN0IHx8IE1hdGguaHlwb3QoZS5wb3NpdGlvbi54IC0gbGFzdC54LCBlLnBvc2l0aW9uLnkgLSBsYXN0LnkpID49IDQpIHtcbiAgICAgICAgdGhpcy5wb2x5UG9pbnRzLnB1c2godGhpcy50b0ltYWdlKGUucG9zaXRpb24pKTtcbiAgICAgICAgdGhpcy5sYXN0RnJlZWhhbmRQeCA9IHsgeDogZS5wb3NpdGlvbi54LCB5OiBlLnBvc2l0aW9uLnkgfTtcbiAgICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuZWRpdERyYWdnZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseUVkaXQodGhpcy50b0ltYWdlKGUucG9zaXRpb24pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFuZFN0YXJ0KSB7XG4gICAgICB0aGlzLmJhbmRDdXJyZW50ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5iYW5kRHJhZ2dlZCA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUmVsZWFzZShlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnICYmIHRoaXMucmVjdFN0YXJ0KSB7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbik7XG4gICAgICBjb25zdCB4ID0gTWF0aC5taW4odGhpcy5yZWN0U3RhcnQueCwgZW5kLngpO1xuICAgICAgY29uc3QgeSA9IE1hdGgubWluKHRoaXMucmVjdFN0YXJ0LnksIGVuZC55KTtcbiAgICAgIGNvbnN0IHcgPSBNYXRoLmFicyhlbmQueCAtIHRoaXMucmVjdFN0YXJ0LngpO1xuICAgICAgY29uc3QgaCA9IE1hdGguYWJzKGVuZC55IC0gdGhpcy5yZWN0U3RhcnQueSk7XG4gICAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMucmVjdEN1cnJlbnQgPSBudWxsO1xuICAgICAgaWYgKHcgPiAyICYmIGggPiAyKSB0aGlzLmNvbW1pdFJlY3RhbmdsZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlZWhhbmREcmFnZ2luZykge1xuICAgICAgdGhpcy5mcmVlaGFuZERyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RGcmVlaGFuZFB4ID0gbnVsbDtcbiAgICAgIC8vIENsb3NlZCA9IGZyZWVmb3JtIChkcmF3Y2xvc2VkcGF0aCk7IG9wZW4gPSBwb2x5bGluZSAoZHJhd29wZW5wYXRoKS5cbiAgICAgIHRoaXMuY29tbWl0UG9seWdvbih0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBNb3ZlL3Jlc2l6ZSBhbHJlYWR5IGFwcGxpZWQgbGl2ZTsgZmx1c2ggdGhlIGNvYWxlc2NlZCBlZGl0cyArIGVuZCB0aGVcbiAgICAvLyBnZXN0dXJlIChrZWVwIHNlbGVjdGlvbikuXG4gICAgaWYgKHRoaXMuZWRpdCkge1xuICAgICAgdGhpcy5zdG9yZS5lbmRCYXRjaCgpO1xuICAgICAgdGhpcy5lZGl0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmluaXNoIGEgcnViYmVyLWJhbmQgc2VsZWN0aW9uOiBzZWxlY3QgZXZlcnkgcmVnaW9uIHRoZSBiYW5kIGludGVyc2VjdHMuXG4gICAgaWYgKHRoaXMuYmFuZFN0YXJ0KSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuYmFuZFN0YXJ0O1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5iYW5kQ3VycmVudCA/PyBzdGFydDtcbiAgICAgIHRoaXMuYmFuZFN0YXJ0ID0gdGhpcy5iYW5kQ3VycmVudCA9IG51bGw7XG4gICAgICBjb25zdCB4MCA9IE1hdGgubWluKHN0YXJ0LngsIGVuZC54KSxcbiAgICAgICAgeTAgPSBNYXRoLm1pbihzdGFydC55LCBlbmQueSk7XG4gICAgICBjb25zdCB4MSA9IE1hdGgubWF4KHN0YXJ0LngsIGVuZC54KSxcbiAgICAgICAgeTEgPSBNYXRoLm1heChzdGFydC55LCBlbmQueSk7XG4gICAgICAvLyBPbmx5IGEgcmVhbCBkcmFnIHNlbGVjdHM7IGEgY2xpY2stc2l6ZWQgYmFuZCBmYWxscyB0aHJvdWdoIHRvIG9uQ2xpY2suXG4gICAgICBpZiAodGhpcy5iYW5kRHJhZ2dlZCAmJiAoeDEgLSB4MCA+IDIgfHwgeTEgLSB5MCA+IDIpKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMocmVnaW9uc0luUmVjdCh0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKSwgeDAsIHkwLCB4MSwgeTEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25DbGljayhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuICAgICAgLy8gQSBtb3ZlL3Jlc2l6ZS92ZXJ0ZXggZHJhZyBvciBhIHJ1YmJlci1iYW5kIGRyYWcgYWxzbyBlbmRzIHdpdGggYSBjbGlja1xuICAgICAgLy8gZXZlbnQg4oCUIGRvbid0IHRyZWF0IGl0IGFzIGEgcmUtc2VsZWN0aW9uLlxuICAgICAgaWYgKHRoaXMuZWRpdERyYWdnZWQpIHtcbiAgICAgICAgdGhpcy5lZGl0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5iYW5kRHJhZ2dlZCkge1xuICAgICAgICB0aGlzLmJhbmREcmFnZ2VkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFNoaWZ0IChvciBDbWQvQ3RybCkgdG9nZ2xlcyB0aGUgY2xpY2tlZCByZWdpb24gaW4vb3V0IG9mIHRoZSBjdXJyZW50XG4gICAgICAvLyBzZWxlY3Rpb247IGEgcGxhaW4gY2xpY2sgcmVwbGFjZXMgaXQuXG4gICAgICBjb25zdCBvZSA9IGUub3JpZ2luYWxFdmVudDtcbiAgICAgIGNvbnN0IGFkZGl0aXZlID0gISFvZSAmJiAob2Uuc2hpZnRLZXkgfHwgb2UubWV0YUtleSB8fCBvZS5jdHJsS2V5KTtcbiAgICAgIHRoaXMuc2VsZWN0QXQodGhpcy50b1dvcmxkKGUucG9zaXRpb24pLCBhZGRpdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkcmF3cG9seWdvbicpIHtcbiAgICAgIHRoaXMub25EcmF3UG9seWdvbkNsaWNrKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSAnYWRkcG9pbnQnKSB7XG4gICAgICAvLyBJbnNlcnQgYSB2ZXJ0ZXggb24gdGhlIGNsaWNrZWQgZWRnZSDigJQgZXh0ZXJpb3Igb3IgYW4gaW50ZXJpb3IgcmluZy5cbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25JbmZvKCk7XG4gICAgICBjb25zdCBlZGdlID0gc2VsID8gdGhpcy5oaXRFZGdlKGUucG9zaXRpb24sIHNlbC5yZWdpb24pIDogbnVsbDtcbiAgICAgIGlmIChzZWwgJiYgZWRnZSkge1xuICAgICAgICBpZiAoZWRnZS5yaW5nIDwgMCkgdGhpcy5zdG9yZS5hZGRWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgZWRnZS5zZWdJbmRleCwgZWRnZS54LCBlZGdlLnkpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcmUuYWRkSG9sZVZlcnRleChzZWwucmVnaW9uLmlkLCBlZGdlLnJpbmcsIGVkZ2Uuc2VnSW5kZXgsIGVkZ2UueCwgZWRnZS55KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RlbGV0ZXBvaW50Jykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBjbGlja2VkIHZlcnRleCDigJQgZXh0ZXJpb3Igb3IgYW4gaW50ZXJpb3IgcmluZyAoaml0LXVpIzg1KS5cbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25JbmZvKCk7XG4gICAgICBjb25zdCB2aCA9IHRoaXMuaGl0UG9seWdvbkhhbmRsZShlLnBvc2l0aW9uLCBmYWxzZSk7XG4gICAgICBpZiAoc2VsICYmIHZoKSB7XG4gICAgICAgIGlmICh2aC5yaW5nIDwgMCkgdGhpcy5zdG9yZS5kZWxldGVWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgdmguaW5kZXgpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcmUuZGVsZXRlSG9sZVZlcnRleChzZWwucmVnaW9uLmlkLCB2aC5yaW5nLCB2aC5pbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsaWNrLXRvLXBsYWNlIHBvbHlnb24gKCdkcmF3cG9seWdvbicpOiB0aGUgZmlyc3QgY2xpY2sgc3RhcnRzIHRoZVxuICAgKiBwb2x5Z29uLCBlYWNoIHN1YnNlcXVlbnQgY2xpY2sgYWRkcyBhIHZlcnRleCwgYW5kIGNsaWNraW5nIG5lYXIgdGhlIGZpcnN0XG4gICAqIHZlcnRleCAod2l0aCBhdCBsZWFzdCAzIHBsYWNlZCkgY2xvc2VzIGFuZCBjb21taXRzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBvbkRyYXdQb2x5Z29uQ2xpY2soZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgcHQgPSB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbik7XG4gICAgaWYgKCF0aGlzLmRyYXdpbmdQb2x5Z29uKSB7XG4gICAgICB0aGlzLnBvbHlQb2ludHMgPSBbcHRdO1xuICAgICAgdGhpcy5kcmF3aW5nUG9seWdvbiA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLnRvUHgodGhpcy5wb2x5UG9pbnRzWzBdLngsIHRoaXMucG9seVBvaW50c1swXS55KTtcbiAgICBjb25zdCBvbkZpcnN0ID0gTWF0aC5oeXBvdChlLnBvc2l0aW9uLnggLSBmaXJzdC54LCBlLnBvc2l0aW9uLnkgLSBmaXJzdC55KSA8PSBFRElUX1RPTF9QWDtcbiAgICBpZiAob25GaXJzdCAmJiB0aGlzLnBvbHlQb2ludHMubGVuZ3RoID49IDMpIHtcbiAgICAgIHRoaXMuY29tbWl0UG9seWdvbih0cnVlKTsgLy8gY2xvc2VzICsgcmVzZXRzIGluLXByb2dyZXNzIChpbmNsLiBkcmF3aW5nUG9seWdvbilcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2x5UG9pbnRzLnB1c2gocHQpO1xuICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdmVyIGZlZWRiYWNrIGluIHNlbGVjdCBtb2RlOiBtb3ZlL3Jlc2l6ZSBjdXJzb3JzIG92ZXIgdGhlIHNlbGVjdGVkXG4gICAqIHJlZ2lvbidzIGJvZHkvZWRnZXMvY29ybmVycywgYSBwb2ludGVyIG92ZXIgYW55IG90aGVyIHJlZ2lvbi5cbiAgICovXG4gIHByaXZhdGUgb25Nb3ZlKGU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdzZWxlY3QnKSByZXR1cm47XG4gICAgLy8gQSBncmFiYmFibGUgYmV6aWVyIGNvbnRyb2wgaGFuZGxlIG9yIHZlcnRleCBvZiB0aGUgc2VsZWN0ZWQgcG9seWdvbiB0YWtlc1xuICAgIC8vIHByaW9yaXR5LlxuICAgIGlmICh0aGlzLmhpdFBvbHlnb25IYW5kbGUoZS5wb3NpdGlvbikpIHtcbiAgICAgIHRoaXMudmlld2VyLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV6ID0gdGhpcy5lZGl0Wm9uZUF0KGUucG9zaXRpb24pO1xuICAgIGlmIChleikge1xuICAgICAgdGhpcy52aWV3ZXIuY2FudmFzLnN0eWxlLmN1cnNvciA9IFpPTkVfQ1VSU09SW2V6LnpvbmVdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUN1cnNvcih0aGlzLnJlZ2lvbkluZGV4QXQodGhpcy50b1dvcmxkKGUucG9zaXRpb24pKSA+PSAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW92ZS9yZXNpemUgem9uZSB1bmRlciB0aGUgY3Vyc29yIGZvciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvblxuICAgKiAocmVjdGFuZ2xlcyBnZXQgZWRnZS9jb3JuZXIgaGFuZGxlcyArIGJvZHk7IHBvbHlnb25zIGdldCBib2R5LW1vdmUgb25seSksXG4gICAqIG9yIG51bGwgaWYgdGhlIGN1cnNvciBpc24ndCBvdmVyIHRoZSBzZWxlY3RlZCByZWdpb24uXG4gICAqL1xuICBwcml2YXRlIGVkaXRab25lQXQocG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IHsgem9uZTogRWRpdFpvbmU7IGluZGV4OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkW3RoaXMuc2VsZWN0ZWQubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5zdG9yZS5nZXRSZWdpb25zKClbaW5kZXhdO1xuICAgIGlmICghcmVnaW9uKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgICBpZiAoYiBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgY29uc3QgYSA9IHRoaXMudG9QeChiLngsIGIueSk7XG4gICAgICBjb25zdCBjID0gdGhpcy50b1B4KGIueCArIGIud2lkdGgsIGIueSArIGIuaGVpZ2h0KTtcbiAgICAgIGNvbnN0IHpvbmUgPSByZWN0Wm9uZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB7XG4gICAgICAgIHgwOiBNYXRoLm1pbihhLngsIGMueCksXG4gICAgICAgIHkwOiBNYXRoLm1pbihhLnksIGMueSksXG4gICAgICAgIHgxOiBNYXRoLm1heChhLngsIGMueCksXG4gICAgICAgIHkxOiBNYXRoLm1heChhLnksIGMueSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB6b25lID8geyB6b25lLCBpbmRleCB9IDogbnVsbDtcbiAgICB9XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uIHx8IGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHtcbiAgICAgIC8vIFBvbHlnb25zICsgbXVsdGktcGFydCByZWdpb25zIHN1cHBvcnQgd2hvbGUtcmVnaW9uIG1vdmUgKG5vIHJlc2l6ZSB6b25lcykuXG4gICAgICByZXR1cm4gdGhpcy5jb250YWluc1BvaW50KHJlZ2lvbiwgcG9zaXRpb24pID8geyB6b25lOiAnbW92ZScsIGluZGV4IH0gOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvbiAodGhlIGxhc3Qgb25lIHNlbGVjdGVkKSwgb3IgbnVsbC4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZFJlZ2lvbkluZm8oKTogeyByZWdpb246IFJlZ2lvbjsgaW5kZXg6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRbdGhpcy5zZWxlY3RlZC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKVtpbmRleF07XG4gICAgcmV0dXJuIHJlZ2lvbiA/IHsgcmVnaW9uLCBpbmRleCB9IDogbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgYmV6aWVyIGNvbnRyb2wgaGFuZGxlICh3aGVuIGBiZXppZXJgKSBvciB2ZXJ0ZXggb2YgdGhlIHNlbGVjdGVkIHBvbHlnb25cbiAgICogIHVuZGVyIHRoZSBjdXJzb3IgKHNjcmVlbi1waXhlbCB0b2xlcmFuY2UpLCBvciBudWxsLiBSZWN0YW5nbGVzIGhhdmUgbm9cbiAgICogIGVkaXRhYmxlIHZlcnRpY2VzICh0aGVpciBjb3JuZXJzIGFyZSByZXNpemUgem9uZXMsIHNlZSB7QGxpbmsgcmVjdFpvbmV9KS4gKi9cbiAgcHJpdmF0ZSBoaXRQb2x5Z29uSGFuZGxlKFxuICAgIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgYmV6aWVyID0gdHJ1ZSxcbiAgKTogeyBraW5kOiAndmVydGV4JyB8ICdiZXppZXInOyByaW5nOiBudW1iZXI7IGluZGV4OiBudW1iZXI7IHNpZGU6ICdpbicgfCAnb3V0JyB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RlZFJlZ2lvbkluZm8oKTtcbiAgICBpZiAoIXNlbCB8fCAhKHNlbC5yZWdpb24uYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbikpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGhpdCA9IGhpdEhhbmRsZShzZWwucmVnaW9uLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB0aGlzLnRvU2NyZWVuLCBFRElUX1RPTF9QWCwgeyBiZXppZXIgfSk7XG4gICAgaWYgKCFoaXQgfHwgaGl0LmtpbmQgPT09ICdjb3JuZXInKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyBraW5kOiBoaXQua2luZCwgcmluZzogaGl0LnJpbmcsIGluZGV4OiBoaXQuaW5kZXgsIHNpZGU6IGhpdC5raW5kID09PSAnYmV6aWVyJyA/IGhpdC5zaWRlIDogJ291dCcgfTtcbiAgfVxuXG4gIC8qKiBUaGUgZWRnZSBvZiBgcmVnaW9uYCdzIHBvbHlnb24gbmVhcmVzdCB0aGUgY3Vyc29yICh3aXRoaW4gdG9sZXJhbmNlKSwgd2l0aFxuICAgKiAgdGhlIGNsaWNrZWQgcG9pbnQgaW4gaW1hZ2UgY29vcmRzIGFzIHRoZSBpbnNlcnRpb24gcG9zaXRpb24sIG9yIG51bGwuICovXG4gIHByaXZhdGUgaGl0RWRnZShcbiAgICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuICAgIHJlZ2lvbjogUmVnaW9uLFxuICApOiB7IHJpbmc6IG51bWJlcjsgc2VnSW5kZXg6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IGVkZ2UgPSBuZWFyZXN0RWRnZShyZWdpb24sIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHRoaXMudG9TY3JlZW4pO1xuICAgIGlmICghZWRnZSB8fCBlZGdlLmRpc3QgPiBFRElUX1RPTF9QWCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaW1nID0gdGhpcy50b0ltYWdlKHBvc2l0aW9uKTtcbiAgICByZXR1cm4geyByaW5nOiBlZGdlLnJpbmcsIHNlZ0luZGV4OiBlZGdlLnNlZ0luZGV4LCB4OiBpbWcueCwgeTogaW1nLnkgfTtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCB0aGUgc2VsZWN0ZWQgcmVnaW9uJ3MgZ2VvbWV0cnkgYXQgdGhlIHN0YXJ0IG9mIGFuIGVkaXQuICovXG4gIHByaXZhdGUgc25hcHNob3QocmVnaW9uOiBSZWdpb24pOiBFZGl0U25hcHNob3Qge1xuICAgIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICAgIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbiB8fCBiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSByZXR1cm4geyBraW5kOiAnc2hhcGUnLCBib3VuZHM6IGIgfTtcbiAgICBpZiAoYiBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgcmV0dXJuIHsga2luZDogJ3JlY3QnLCB4OiBiLngsIHk6IGIueSwgdzogYi53aWR0aCwgaDogYi5oZWlnaHQgfTtcbiAgICByZXR1cm4geyBraW5kOiAncmVjdCcsIHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgaW4tcHJvZ3Jlc3MgbW92ZS9yZXNpemUgdG8gdGhlIHJlZ2lvbiwgbGl2ZSwgdGhyb3VnaCB0aGVcbiAgICogUmVnaW9uLW5hdGl2ZSBlZGl0IEFQSS4gUmVjb21wdXRlZCBhYnNvbHV0ZWx5IGZyb20gdGhlIGdlc3R1cmUtc3RhcnRcbiAgICogc25hcHNob3QgKGBvcmlnYCkgKyB0aGUgdG90YWwgZGVsdGEsIHNvIGVhY2ggZnJhbWUgaXMgaWRlbXBvdGVudC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlFZGl0KGN1ckltZzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmVkaXQua2luZCA9PT0gJ3ZlcnRleCcpIHtcbiAgICAgIC8vIERyYWcgYSBzaW5nbGUgdmVydGV4IHRvIHRoZSBjdXJzb3IgKGFic29sdXRlIOKAlCBpZGVtcG90ZW50KS4gUm91dGUgdG8gdGhlXG4gICAgICAvLyBleHRlcmlvciBvciB0aGUgbWF0Y2hpbmcgaW50ZXJpb3IgcmluZyAoaG9sZSkg4oCUIGppdC11aSM4NS5cbiAgICAgIGlmICh0aGlzLmVkaXQucmluZyA8IDApIHtcbiAgICAgICAgdGhpcy5zdG9yZS5tb3ZlVmVydGV4KHRoaXMuZWRpdC5pZCwgdGhpcy5lZGl0LnZlcnRleEluZGV4LCBjdXJJbWcueCwgY3VySW1nLnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9yZS5tb3ZlSG9sZVZlcnRleCh0aGlzLmVkaXQuaWQsIHRoaXMuZWRpdC5yaW5nLCB0aGlzLmVkaXQudmVydGV4SW5kZXgsIGN1ckltZy54LCBjdXJJbWcueSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXQua2luZCA9PT0gJ2hhbmRsZScpIHtcbiAgICAgIC8vIERyYWcgYSBiZXppZXIgY29udHJvbCBoYW5kbGUgdG8gdGhlIGN1cnNvciDigJQgZXh0ZXJpb3IgKHJpbmcgLTEpIG9yIGEgZG9udXQgaG9sZSByaW5nLlxuICAgICAgaWYgKHRoaXMuZWRpdC5yaW5nIDwgMCkge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVCZXppZXJIYW5kbGUodGhpcy5lZGl0LmlkLCB0aGlzLmVkaXQudmVydGV4SW5kZXgsIHRoaXMuZWRpdC5oYW5kbGVTaWRlLCBjdXJJbWcueCwgY3VySW1nLnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9yZS5tb3ZlSG9sZUJlemllckhhbmRsZShcbiAgICAgICAgICB0aGlzLmVkaXQuaWQsXG4gICAgICAgICAgdGhpcy5lZGl0LnJpbmcsXG4gICAgICAgICAgdGhpcy5lZGl0LnZlcnRleEluZGV4LFxuICAgICAgICAgIHRoaXMuZWRpdC5oYW5kbGVTaWRlLFxuICAgICAgICAgIGN1ckltZy54LFxuICAgICAgICAgIGN1ckltZy55LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkeCA9IGN1ckltZy54IC0gdGhpcy5lZGl0LnN0YXJ0SW1nLng7XG4gICAgY29uc3QgZHkgPSBjdXJJbWcueSAtIHRoaXMuZWRpdC5zdGFydEltZy55O1xuXG4gICAgY29uc3QgbyA9IHRoaXMuZWRpdC5vcmlnO1xuICAgIGlmICghbykgcmV0dXJuO1xuICAgIGlmIChvLmtpbmQgPT09ICdyZWN0Jykge1xuICAgICAgY29uc3QgYm94ID0gcmVzaXplUmVjdCh7IHg6IG8ueCwgeTogby55LCB3aWR0aDogby53LCBoZWlnaHQ6IG8uaCB9LCB0aGlzLmVkaXQuem9uZSwgZHgsIGR5KTtcbiAgICAgIHRoaXMuc3RvcmUudXBkYXRlQm91bmRzKHRoaXMuZWRpdC5pZCwgT2JqZWN0LmFzc2lnbihuZXcgUmVjdGFuZ2xlKCksIGJveCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQb2x5Z29uIC8gbXVsdGktcGFydCByZWdpb246IHRyYW5zbGF0ZSBldmVyeSB2ZXJ0ZXgsIGhvbGUgYW5kIHBhcnQsIHJvdW5kZWQgdG9cbiAgICAgIC8vIHdob2xlIHBpeGVscy4gQmV6aWVyIGhhbmRsZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSwgc28gdGhleSBjYXJyeSBvdmVyIHVuY2hhbmdlZC5cbiAgICAgIHRoaXMuc3RvcmUudXBkYXRlQm91bmRzKHRoaXMuZWRpdC5pZCwgdHJhbnNsYXRlQm91bmRzKG8uYm91bmRzLCBkeCwgZHksIE1hdGgucm91bmQpKTtcbiAgICB9XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0QXQocHQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSwgYWRkaXRpdmUgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucmVnaW9uSW5kZXhBdChwdCk7XG4gICAgaWYgKGFkZGl0aXZlKSB7XG4gICAgICAvLyBTaGlmdC1jbGljayBvbiBlbXB0eSBzcGFjZSBrZWVwcyB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gICAgICBpZiAoaWR4IDwgMCkgcmV0dXJuO1xuICAgICAgLy8gYHRoaXMuc2VsZWN0ZWRgIG1pcnJvcnMgdGhlIHN0b3JlJ3MgY3VycmVudCBzZWxlY3Rpb24gKGtlcHQgaW4gc3luYyB2aWFcbiAgICAgIC8vIHRoZSBzdWJzY3JpcHRpb24pLCBzbyBpdCdzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggd2l0aG91dCBhIHN5bmMgZ2V0dGVyLlxuICAgICAgY29uc3QgY3VyID0gdGhpcy5zZWxlY3RlZC5zbGljZSgpO1xuICAgICAgY29uc3QgYXQgPSBjdXIuaW5kZXhPZihpZHgpO1xuICAgICAgaWYgKGF0ID49IDApXG4gICAgICAgIGN1ci5zcGxpY2UoYXQsIDEpOyAvLyB0b2dnbGUgb2ZmXG4gICAgICBlbHNlIGN1ci5wdXNoKGlkeCk7IC8vIHRvZ2dsZSBvblxuICAgICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhjdXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKGlkeCA+PSAwID8gW2lkeF0gOiBbXSk7XG4gIH1cblxuICAvKiogSW5kZXggb2YgdGhlIHRvcG1vc3QgcmVnaW9uIHVuZGVyIGFuIGltYWdlIHBvaW50LCBvciAtMS4gKi9cbiAgcHJpdmF0ZSByZWdpb25JbmRleEF0KHB0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIGNvbnN0IG9wdHMgPSB7IHRvU2NyZWVuOiB0aGlzLnRvU2NyZWVuLCB0b2xQeDogT1BFTl9QQVRIX1RPTF9QWCB9O1xuICAgIHJldHVybiB0b3Btb3N0UmVnaW9uQXQodGhpcy5zdG9yZS5nZXRSZWdpb25zKCksIHB0LngsIHB0LnksIG9wdHMpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQtcGl4ZWwgYHBvc2l0aW9uYCBsYW5kcyBvbiBgcmVnaW9uYCAoc2VlIGByZWdpb25Db250YWluc2ApLiAqL1xuICBwcml2YXRlIGNvbnRhaW5zUG9pbnQocmVnaW9uOiBSZWdpb24sIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICBjb25zdCBwdCA9IHRoaXMudG9Xb3JsZChwb3NpdGlvbik7XG4gICAgcmV0dXJuIHJlZ2lvbkNvbnRhaW5zKHJlZ2lvbiwgcHQueCwgcHQueSwgeyB0b1NjcmVlbjogdGhpcy50b1NjcmVlbiwgdG9sUHg6IE9QRU5fUEFUSF9UT0xfUFggfSk7XG4gIH1cblxuICAvKiogQWJhbmRvbiB3aGF0ZXZlciBwb2ludGVyIGdlc3R1cmUgaXMgaW4gcHJvZ3Jlc3MgKGRyYXdpbmcsIGVkaXQgZHJhZyxcbiAgICogIHJ1YmJlciBiYW5kKSBhbmQgY2xvc2UgaXRzIHN0b3JlIGJhdGNoLiAqL1xuICBwcml2YXRlIGVuZEdlc3R1cmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEluUHJvZ3Jlc3MoKTtcbiAgICB0aGlzLmJhbmRTdGFydCA9IHRoaXMuYmFuZEN1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuYmFuZERyYWdnZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRJblByb2dyZXNzKCk6IHZvaWQge1xuICAgIHRoaXMucmVjdFN0YXJ0ID0gdGhpcy5yZWN0Q3VycmVudCA9IG51bGw7XG4gICAgdGhpcy5wb2x5UG9pbnRzID0gW107XG4gICAgdGhpcy5mcmVlaGFuZERyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5kcmF3aW5nUG9seWdvbiA9IGZhbHNlO1xuICAgIHRoaXMubGFzdEZyZWVoYW5kUHggPSBudWxsO1xuICAgIC8vIENsb3NlIGFueSBvcGVuIGVkaXQgYmF0Y2ggKGUuZy4gYSBtb2RlIHN3aXRjaCBtaWQtZHJhZykgc28gdGhlIHN0b3JlJ3NcbiAgICAvLyBlbWl0IGNvYWxlc2NpbmcgZG9lc24ndCBnZXQgc3R1Y2suXG4gICAgaWYgKHRoaXMuZWRpdCkge1xuICAgICAgdGhpcy5zdG9yZS5lbmRCYXRjaCgpO1xuICAgICAgdGhpcy5lZGl0ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgY29tbWl0IHRvIHRoZSBzdG9yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSBjb21taXRSZWN0YW5nbGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcmVnaW9uID0gbmV3IFJlZ2lvbigpO1xuICAgIGNvbnN0IHJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgcmVjdC54ID0geDtcbiAgICByZWN0LnkgPSB5O1xuICAgIHJlY3Qud2lkdGggPSB3O1xuICAgIHJlY3QuaGVpZ2h0ID0gaDtcbiAgICByZWdpb24uYm91bmRzID0gcmVjdDtcbiAgICByZWdpb24uY29sb3IgPSB0aGlzLnN0b3JlLmdldFNoYXBlQ29sb3IoKTtcbiAgICB0aGlzLmNvbW1pdFJlZ2lvbihyZWdpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21taXRQb2x5Z29uKGNsb3NlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbHlQb2ludHMubGVuZ3RoIDwgKGNsb3NlZCA/IDMgOiAyKSkge1xuICAgICAgdGhpcy5yZXNldEluUHJvZ3Jlc3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVnaW9uID0gbmV3IFJlZ2lvbigpO1xuICAgIHJlZ2lvbi5ib3VuZHMgPSBtYWtlUG9seWdvbihcbiAgICAgIHRoaXMucG9seVBvaW50cy5tYXAoKHApID0+IHAueCksXG4gICAgICB0aGlzLnBvbHlQb2ludHMubWFwKChwKSA9PiBwLnkpLFxuICAgICAgeyBjbG9zZWQgfSxcbiAgICApO1xuICAgIHJlZ2lvbi5jb2xvciA9IHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpO1xuICAgIHRoaXMucmVzZXRJblByb2dyZXNzKCk7XG4gICAgdGhpcy5jb21taXRSZWdpb24ocmVnaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBmcmVzaGx5LWRyYXduIHJlZ2lvbiB0byB0aGUgc2hhcmVkIHN0b3JlIGFuZCByZWRyYXcgaW1tZWRpYXRlbHkuIFRoZVxuICAgKiBzdG9yZSBtaW50cyB0aGUgaWQsIHNlbGVjdHMgdGhlIG5ldyByZWdpb24gKHNvIGl0IHJlbmRlcnMgc29saWQvaGlnaGxpZ2h0ZWRcbiAgICogcmF0aGVyIHRoYW4gYXMgYSBkYXNoZWQgaW4tcHJvZ3Jlc3Mgc2hhcGUpIGFuZCBlbWl0cyB0aGUgZnVsbCByZWdpb24gbGlzdCB0b1xuICAgKiB0aGUgUmVnaW9uIEVkaXRvciDigJQgd2Ugc3RpbGwgcmVkcmF3IGxvY2FsbHkgcmF0aGVyIHRoYW4gcmVseWluZyBzb2xlbHkgb25cbiAgICogdGhlIHN0b3JlJ3MgdXBkYXRlIGV2ZW50LCB3aGljaCBjYW4gYmUgc3dhbGxvd2VkIHdoZW4gUGxvdGx5IGlzbid0IGFjdGl2ZS5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgLy8gRGVmYXVsdCBjbGFzcy9hbm5vdGF0aW9uIG5hbWUsIG1hdGNoaW5nIHRoZSBQbG90bHkgYmFja2VuZCBhbmQgdGhlIFJlZ2lvblxuICAgIC8vIEVkaXRvcidzIFwiQWRkXCIgYWN0aW9ucyBzbyBhIGZyZXNobHkgZHJhd24gcmVnaW9uIGlzbid0IHVubGFiZWxlZC5cbiAgICBpZiAocmVnaW9uLmxhYmVsID09IG51bGwpIHJlZ2lvbi5sYWJlbCA9ICdSZWdpb24nO1xuICAgIHRoaXMuc3RvcmUuYWRkUmVnaW9uKHJlZ2lvbik7XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBzZWxlY3RlZCByZWdpb24ocykgdG8vZnJvbSBhIGJlemllciBjdXJ2ZSAodG9CZXppZXIgPSB0cnVlIC9cbiAgICogdG9Qb2x5Z29uID0gZmFsc2UpLiBPbmUtc2hvdDsgdGhlIGFuY2hvcnMgYXJlIHVuY2hhbmdlZCxcbiAgICogb25seSB0aGUgc21vb3RoLWN1cnZlIHJlbmRlcmluZyBpcyB0b2dnbGVkLlxuICAgKi9cbiAgc2V0U2VsZWN0ZWRCZXppZXIoYmV6aWVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpO1xuICAgIGZvciAoY29uc3QgaWR4IG9mIHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlZ2lvbnNbaWR4XTtcbiAgICAgIGlmIChyZWdpb24pIHRoaXMuc3RvcmUuc2V0QmV6aWVyKHJlZ2lvbi5pZCwgYmV6aWVyKTtcbiAgICB9XG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxufVxuIl19
733
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NkLXJlZ2lvbi1vdmVybGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvb3NkL29zZC1yZWdpb24tb3ZlcmxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSS9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsU0FBUyxFQUNULFdBQVcsRUFDWCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGVBQWUsR0FDaEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBWSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBYWhILE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFDO0FBUTNDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBMkQzQixZQUNVLE1BQXFCLEVBQ3JCLEtBQXNCO1FBRHRCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUEzRGYsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUN4QixTQUFJLEdBQW1CLE1BQU0sQ0FBQztRQUc5QixjQUFTLEdBQW9DLElBQUksQ0FBQyxDQUFDLGVBQWU7UUFDbEUsZ0JBQVcsR0FBb0MsSUFBSSxDQUFDO1FBQ3BELGVBQVUsR0FBK0IsRUFBRSxDQUFDLENBQUMsZUFBZTtRQUNwRSxpRUFBaUU7UUFDekQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLHNFQUFzRTtRQUM5RCxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUMvQixvRUFBb0U7UUFDNUQsbUJBQWMsR0FBb0MsSUFBSSxDQUFDO1FBQy9EOzs7O1dBSUc7UUFDSyxTQUFJLEdBWUQsSUFBSSxDQUFDO1FBQ1IsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDNUI7aUZBQ3lFO1FBQ2pFLGNBQVMsR0FBb0MsSUFBSSxDQUFDO1FBQ2xELGdCQUFXLEdBQW9DLElBQUksQ0FBQztRQUNwRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVYLGtCQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JEOzs7O3FEQUk2QztRQUM1QixrQkFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUkzRDs7NkNBRXFDO1FBQ3BCLHlCQUFvQixHQUFHLEdBQUcsRUFBRTtZQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQTJFRjs7Ozs7Ozs7OEVBUXNFO1FBQ3JELHFCQUFnQixHQUFHLENBQUMsQ0FBYSxFQUFFLEVBQUU7WUFDcEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7WUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFDaEMsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtnQkFBRSxPQUFPO1lBQzVFLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQztRQW9FRix5RUFBeUU7UUFDeEQsYUFBUSxHQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQUM7UUFoS0EsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQWtCLENBQUM7UUFDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTtZQUM1QixRQUFRLEVBQUUsVUFBVTtZQUNwQixJQUFJLEVBQUUsR0FBRztZQUNULEdBQUcsRUFBRSxHQUFHO1lBQ1IsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsTUFBTTtZQUNkLGFBQWEsRUFBRSxNQUFNLEVBQUUsOENBQThDO1NBQ3RFLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUMsV0FBVyxFQUFFLFNBQVM7WUFDdEIsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNuQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUNuRyxpRUFBaUU7WUFDakUsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDakYsZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUYsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0I7WUFDaEQsQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDcEUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUVoRiwyRUFBMkU7UUFDM0UsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckQsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUxRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQztZQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQzNCLFlBQVksRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDekMsV0FBVyxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QyxjQUFjLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzdDLFlBQVksRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDekMsV0FBVyxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0RCxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxPQUFPLENBQUMsSUFBb0I7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBdUJEOzJCQUN1QjtJQUNmLFlBQVksQ0FBQyxVQUFtQjtRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxJQUNFLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVTtZQUN4QixJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQjtZQUM5QixJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWM7WUFDNUIsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhO1lBQzNCLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVTtZQUN4QixJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFDM0IsQ0FBQztZQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUNwQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDM0QsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs4Q0FJMEM7SUFDMUMsSUFBWSxxQkFBcUI7UUFDL0IsT0FBTyxDQUNMLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVTtZQUN4QixJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWE7WUFDM0IsSUFBSSxDQUFDLElBQUksS0FBSyxnQkFBZ0I7WUFDOUIsSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLG1FQUFtRTtRQUNuRSxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsZ0RBQWdEO0lBQ3hDLElBQUksQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUNyQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0Q7d0RBQ29EO0lBQzVDLE9BQU8sQ0FBQyxHQUFRO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUNELCtEQUErRDtJQUN2RCxPQUFPLENBQUMsR0FBNkI7UUFDM0MsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBT0Qsd0VBQXdFO0lBQ3hFOzRGQUN3RjtJQUNoRixZQUFZO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLE1BQU07UUFDSixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYTtRQUNuQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEMscUVBQXFFO1lBQ3JFLGtFQUFrRTtZQUNsRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUUsSUFBSSxHQUFHO2dCQUFFLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxDQUFDO1lBQ2pGLDJDQUEyQztZQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELCtCQUErQjtZQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuRSxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMvRixhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELHdFQUF3RTtZQUN4RSxvQ0FBb0M7WUFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxRCxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2xELFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsSUFBWSxVQUFVO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQztJQUN4RSxDQUFDO0lBRU8sT0FBTyxDQUFDLENBQU07UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2xDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsdUVBQXVFO1lBQ3ZFLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsb0VBQW9FO1lBQ3BFLDRDQUE0QztZQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNCLDRFQUE0RTtZQUM1RSw0REFBNEQ7WUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEcsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRyxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBQ0Qsb0VBQW9FO1lBQ3BFLGdCQUFnQjtZQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbkcsT0FBTztZQUNULENBQUM7WUFDRCxvRUFBb0U7WUFDcEUsd0VBQXdFO1lBQ3hFLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVEO3dEQUNvRDtJQUM1QyxTQUFTLENBQ2YsSUFBb0MsRUFDcEMsSUFBYyxFQUNkLFdBQW1CLEVBQ25CLE1BQWMsRUFDZCxRQUFrQyxFQUNsQyxhQUEyQixLQUFLLEVBQ2hDLElBQUksR0FBRyxDQUFDLENBQUM7UUFFVCxJQUFJLENBQUMsSUFBSSxHQUFHO1lBQ1YsSUFBSTtZQUNKLElBQUk7WUFDSixXQUFXO1lBQ1gsSUFBSTtZQUNKLFVBQVU7WUFDVixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDYixRQUFRO1lBQ1IsSUFBSSxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDdkQsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxDQUFNO1FBQ25CLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdDLHdFQUF3RTtZQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsQ0FBTTtRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLHNFQUFzRTtZQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsQ0FBQztZQUNuRCxPQUFPO1FBQ1QsQ0FBQztRQUNELHdFQUF3RTtRQUN4RSw0QkFBNEI7UUFDNUIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsMkVBQTJFO1FBQzNFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUM7WUFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN6QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNqQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNqQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyx5RUFBeUU7WUFDekUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUNoQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUN4RixDQUFDO2dCQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVPLE9BQU8sQ0FBQyxDQUFNO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzQix5RUFBeUU7WUFDekUsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDekIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLE9BQU87WUFDVCxDQUFDO1lBQ0QsdUVBQXVFO1lBQ3ZFLHdDQUF3QztZQUN4QyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQzNCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdCLHNFQUFzRTtZQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMvRCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7b0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDaEMsd0VBQXdFO1lBQ3hFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNkLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxrQkFBa0IsQ0FBQyxDQUFNO1FBQy9CLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQztRQUMxRixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMscURBQXFEO1lBQy9FLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsQ0FBTTtRQUNuQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDbkMsNEVBQTRFO1FBQzVFLFlBQVk7UUFDWixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUM1QyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkQsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssVUFBVSxDQUFDLFFBQWtDO1FBQ25ELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksU0FBUyxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO2dCQUM1QyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLE9BQU8sSUFBSSxDQUFDLFlBQVksWUFBWSxFQUFFLENBQUM7WUFDdEQsNkVBQTZFO1lBQzdFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQy9FLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxzRUFBc0U7SUFDOUQsa0JBQWtCO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O29GQUVnRjtJQUN4RSxnQkFBZ0IsQ0FDdEIsUUFBa0MsRUFDbEMsTUFBTSxHQUFHLElBQUk7UUFFYixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxPQUFPLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNqRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0MsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUcsQ0FBQztJQUVEO2dGQUM0RTtJQUNwRSxPQUFPLENBQ2IsUUFBa0MsRUFDbEMsTUFBYztRQUVkLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2xELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUUsQ0FBQztJQUVELHVFQUF1RTtJQUMvRCxRQUFRLENBQUMsTUFBYztRQUM3QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLE9BQU8sSUFBSSxDQUFDLFlBQVksWUFBWTtZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMzRixJQUFJLENBQUMsWUFBWSxTQUFTO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxTQUFTLENBQUMsTUFBZ0M7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUV2QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLDJFQUEyRTtZQUMzRSw2REFBNkQ7WUFDN0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsd0ZBQXdGO1lBQ3hGLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0csQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFDcEIsTUFBTSxDQUFDLENBQUMsRUFDUixNQUFNLENBQUMsQ0FBQyxDQUNULENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUUzQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDZixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdEIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQzthQUFNLENBQUM7WUFDTixpRkFBaUY7WUFDakYsa0ZBQWtGO1lBQ2xGLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRU8sUUFBUSxDQUFDLEVBQTRCLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxzRkFBc0Y7UUFDdEYsNkNBQTZDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0YsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9DLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM3RCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYiwwREFBMEQ7WUFDMUQsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFBRSxPQUFPO1lBQ3BCLDBFQUEwRTtZQUMxRSx3RUFBd0U7WUFDeEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQ1QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhOztnQkFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVk7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELHFHQUFxRztJQUM3RixjQUFjLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVTtRQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDakUsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCwrREFBK0Q7SUFDdkQsYUFBYSxDQUFDLEVBQTRCO1FBQ2hELE1BQU0sSUFBSSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZHLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxrRUFBa0U7SUFDMUQsTUFBTSxDQUFDLE1BQTZCO1FBQzFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxxRkFBcUY7SUFDN0UsYUFBYSxDQUFDLE1BQWMsRUFBRSxRQUFrQztRQUN0RSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRDtrREFDOEM7SUFDdEMsVUFBVTtRQUNoQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IseUVBQXlFO1FBQ3pFLHFDQUFxQztRQUNyQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsZUFBZSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxhQUFhLENBQUMsTUFBZTtRQUNuQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDL0IsRUFBRSxNQUFNLEVBQUUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxZQUFZLENBQUMsTUFBYztRQUNqQyw0RUFBNEU7UUFDNUUsb0VBQW9FO1FBQ3BFLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJO1lBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsTUFBZTtRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixJQUFJLE1BQU07Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgT3BlblNlYWRyYWdvbiBmcm9tICdvcGVuc2VhZHJhZ29uJztcbmltcG9ydCB7IE9TRCB9IGZyb20gJy4vb3NkLWxpYic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVnaW9uLCBSZWN0YW5nbGUsIFBvbHlnb24sIE11bHRpUG9seWdvbiB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgSVJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRBcGksIElSZWdpb25Tb3VyY2VBcGkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLXN0b3JlLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5LCBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBlbGVtZW50VG9JbWFnZSwgaW1hZ2VUb0VsZW1lbnQgfSBmcm9tICcuL29zZC1jb29yZHMnO1xuaW1wb3J0IHsgT3NkVmlld2VyTGlrZSB9IGZyb20gJy4vb3NkLXZpZXdlci1saWtlJztcbmltcG9ydCB7IE9TRF9aT09NX1BFUl9TQ1JPTEwgfSBmcm9tICcuL29zZC16b29tJztcbmltcG9ydCB7IHRyYW5zbGF0ZUJvdW5kcyB9IGZyb20gJy4uLy4uL21vZGVscy9wb2x5Z29uLWVkaXQnO1xuaW1wb3J0IHsgbWFrZVBvbHlnb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcG9seWdvbi1mYWN0b3J5JztcbmltcG9ydCB7XG4gIE9QRU5fUEFUSF9UT0xfUFgsXG4gIFRvU2NyZWVuLFxuICBoaXRIYW5kbGUsXG4gIG5lYXJlc3RFZGdlLFxuICByZWdpb25Db250YWlucyxcbiAgcmVnaW9uc0luUmVjdCxcbiAgdG9wbW9zdFJlZ2lvbkF0LFxufSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnknO1xuaW1wb3J0IHsgU3ZnUmVnaW9uUmVuZGVyZXIsIGFmZmluZUZyb21Qcm9qZWN0aW9uIH0gZnJvbSAnLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5pbXBvcnQgeyBSZWdpb25Tb3VyY2VMYXllciwgU09VUkNFX01BUlFVRUVfTElNSVQgfSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc291cmNlLWxheWVyJztcbmltcG9ydCB7XG4gIGRyYXdEcmFmdFBhdGgsXG4gIGRyYXdEcmFmdFJlY3QsXG4gIGRyYXdSZWdpb25MYWJlbCxcbiAgZHJhd1NlbGVjdGlvbkJhbmQsXG4gIGRyYXdTZWxlY3Rpb25IYW5kbGVzLFxuICBzdHlsZVJlZ2lvblNoYXBlLFxuICB2ZXJ0ZXhNYXJrZXIsXG59IGZyb20gJy4vb3NkLXJlZ2lvbi1vdmVybGF5LWRyYXcnO1xuaW1wb3J0IHsgRURJVF9UT0xfUFgsIEVkaXRab25lLCBaT05FX0NVUlNPUiwgcmVjdFpvbmUsIHJlc2l6ZVJlY3QgfSBmcm9tICcuLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24taGl0LXRlc3QnO1xuXG4vKipcbiAqIFRoZSBzaGFyZWQgcmVnaW9uIHN0b3JlIGFzIHRoZSBvdmVybGF5IG5lZWRzIGl0OiB0aGUgY3Jvc3MtYmFja2VuZFxuICoge0BsaW5rIElSZWdpb25TdG9yZX0gKHJlYWQgcmVnaW9ucywgc2VsZWN0aW9uLCBjb2xvdXJzKSBwbHVzIHRoZSBSZWdpb24tbmF0aXZlXG4gKiB7QGxpbmsgSVJlZ2lvbkVkaXRBcGl9IChhZGQvbW92ZS9yZXNpemUvdmVydGV4IGVkaXRzKS4gVGhlIHNoYXJlZCBSZWdpb25TdG9yZVxuICogc2F0aXNmaWVzIGJvdGguIFRoZSBvdmVybGF5IGVkaXRzIHRocm91Z2ggdGhlc2UgdHlwZWQgb3BlcmF0aW9ucyBvbiB0aGVcbiAqIG5ldXRyYWwgUmVnaW9uIG1vZGVsIOKAlCBpdCBuZXZlciB0b3VjaGVzIGEgYmFja2VuZCdzIG93biBzaGFwZSByZXByZXNlbnRhdGlvblxuICogKGUuZy4gUGxvdGx5J3MgYHgwL3kwL3gxL3kxYCAvIGBN4oCmTOKAplpgIGRpY3RzKS4gV2l0aCB7QGxpbmsgSVJlZ2lvblNvdXJjZUFwaX1cbiAqIChvcHRpb25hbCkgaXQgYWxzbyBkcmF3cyBhbmQgcGlja3MgdGhlIGltYWdlJ3MgcmVnaW9uIHNvdXJjZS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uRWRpdFN0b3JlID0gSVJlZ2lvblN0b3JlICYgSVJlZ2lvbkVkaXRBcGkgJiBQYXJ0aWFsPElSZWdpb25Tb3VyY2VBcGk+O1xuXG5jb25zdCBTVkdOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5cbi8qKiBBIHJlZ2lvbidzIGdlb21ldHJ5IGF0IHRoZSBzdGFydCBvZiBhIG1vdmUvcmVzaXplIChzZWUgYHNuYXBzaG90YCk6IGEgcmVjdGFuZ2xlJ3NcbiAqICBib3ggZm9yIGEgcmVzaXplLCBvciB0aGUgcG9seWdvbi9tdWx0aS1wb2x5Z29uIGJvdW5kcyB0aGVtc2VsdmVzIGZvciBhIG1vdmUg4oCUIHRoZVxuICogIHN0b3JlIGlzIGNvcHktb24td3JpdGUsIHNvIHRoZSBnZXN0dXJlLXN0YXJ0IGluc3RhbmNlIG5ldmVyIGNoYW5nZXMgdW5kZXIgdGhlIGRyYWcuICovXG50eXBlIEVkaXRTbmFwc2hvdCA9XG4gIHsga2luZDogJ3JlY3QnOyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB8IHsga2luZDogJ3NoYXBlJzsgYm91bmRzOiBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uIH07XG5cbi8qKlxuICogT3BlblNlYWRyYWdvbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVJlZ2lvbk92ZXJsYXl9LlxuICpcbiAqIC0gUmVuZGVycyB0aGUgc3RvcmUncyByZWdpb25zIChyZWN0L3BvbHlnb24pIGluIGltYWdlLXBpeGVsIHNwYWNlLCBrZXB0XG4gKiAgIGFsaWduZWQgb24gZXZlcnkgcGFuL3pvb20gdmlhIHRoZSBPU0Qgdmlld3BvcnQgQVBJLlxuICogLSBEcmF3cyBuZXcgcmVjdGFuZ2xlIGFuZCBwb2x5Z29uIHJlZ2lvbnMgKGNvbW1pdHRlZCB0byB0aGUgc2hhcmVkIHN0b3JlKS5cbiAqIC0gQ2xpY2stdG8tc2VsZWN0IGluICdzZWxlY3QnIG1vZGUuXG4gKlxuICogUmVhZHMvd3JpdGVzIHRoZSBzaGFyZWQge0BsaW5rIElSZWdpb25TdG9yZX0sIHNvIHJlZ2lvbnMgc3RheSBpbiBzeW5jIHdpdGggdGhlXG4gKiBSZWdpb24gRWRpdG9yIGFuZCB0aGUgUGxvdGx5IGJhY2tlbmQuIFRoZSB3YW5kLCB2ZXJ0ZXgtZXJhc2VyIGFuZCB6b29tLXRvLWJveFxuICogdG9vbHMgYXJlIE5PVCBoYW5kbGVkIGhlcmUg4oCUIHRoZXkncmUgb3duZWQgYnkgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlXG4gKiAod2hpY2ggYmluZHMgdGhlbSB0byBPU0QgdmlhIHRoZSBzaGFyZWQgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyB2aWV3cG9ydCBwaXhlbFxuICogcmVhZGJhY2spLCB0aGUgc2FtZSBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB0aGUgUGxvdGx5IGJhY2tlbmQgdXNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE9zZFJlZ2lvbk92ZXJsYXkgaW1wbGVtZW50cyBJUmVnaW9uT3ZlcmxheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ZnOiBTVkdTVkdFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgc2VsZWN0ZWQ6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgbW9kZTogUmVnaW9uVG9vbE1vZGUgPSAnbm9uZSc7XG5cbiAgcHJpdmF0ZSB0cmFja2VyOiBPcGVuU2VhZHJhZ29uLk1vdXNlVHJhY2tlcjtcbiAgcHJpdmF0ZSByZWN0U3RhcnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsOyAvLyBpbWFnZSBjb29yZHNcbiAgcHJpdmF0ZSByZWN0Q3VycmVudDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9seVBvaW50czogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9W10gPSBbXTsgLy8gaW1hZ2UgY29vcmRzXG4gIC8qKiBUcnVlIHdoaWxlIGRyYWdnaW5nIGEgZnJlZWhhbmQgcGF0aCAoZnJlZWZvcm0gLyBwb2x5bGluZSkuICovXG4gIHByaXZhdGUgZnJlZWhhbmREcmFnZ2luZyA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwbGFjaW5nIGEgY2xpY2stdG8tYWRkIHBvbHlnb24gKCdkcmF3cG9seWdvbicgbW9kZSkuICovXG4gIHByaXZhdGUgZHJhd2luZ1BvbHlnb24gPSBmYWxzZTtcbiAgLyoqIExhc3QgZWxlbWVudC1waXhlbCBwb2ludCBhcHBlbmRlZCwgdG8gdGhpbiB0aGUgZnJlZWhhbmQgcGF0aC4gKi9cbiAgcHJpdmF0ZSBsYXN0RnJlZWhhbmRQeDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBJbi1wcm9ncmVzcyBlZGl0IG9mIHRoZSBzZWxlY3RlZCByZWdpb246XG4gICAqICAtIGtpbmQgJ2JvdW5kcycg4oCUIHJlY3RhbmdsZSByZXNpemUvbW92ZSBvciB3aG9sZS1yZWdpb24gbW92ZSAodXNlcyBgem9uZWApO1xuICAgKiAgLSBraW5kICd2ZXJ0ZXgnIOKAlCBkcmFnZ2luZyBhIHNpbmdsZSBwb2x5Z29uIHZlcnRleCAodXNlcyBgdmVydGV4SW5kZXhgKS5cbiAgICovXG4gIHByaXZhdGUgZWRpdDoge1xuICAgIGtpbmQ6ICdib3VuZHMnIHwgJ3ZlcnRleCcgfCAnaGFuZGxlJztcbiAgICB6b25lOiBFZGl0Wm9uZTtcbiAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyO1xuICAgIC8qKiBXaGljaCByaW5nIHRoZSBkcmFnZ2VkIHZlcnRleCBiZWxvbmdzIHRvOiAtMSA9IGV4dGVyaW9yLCBlbHNlIGEgaG9sZVxuICAgICAqICBpbmRleCBpbnRvIGBQb2x5Z29uLmhvbGVzYCAoaml0LXVpIzg1KS4gKi9cbiAgICByaW5nOiBudW1iZXI7XG4gICAgaGFuZGxlU2lkZTogJ2luJyB8ICdvdXQnO1xuICAgIGlkOiBudW1iZXI7XG4gICAgc3RhcnRJbWc6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICAvKiogR2VzdHVyZS1zdGFydCBnZW9tZXRyeTsgc2V0IGZvciAnYm91bmRzJyBlZGl0cyBvbmx5LiAqL1xuICAgIG9yaWc6IEVkaXRTbmFwc2hvdCB8IG51bGw7XG4gIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlZGl0RHJhZ2dlZCA9IGZhbHNlO1xuICAvKiogUnViYmVyLWJhbmQgKG1hcnF1ZWUpIG11bHRpLXNlbGVjdCBpbiAnc2VsZWN0JyBtb2RlOiBwcmVzcyBvbiBlbXB0eSBzcGFjZVxuICAgKiAgYW5kIGRyYWcgdG8gc2VsZWN0IGV2ZXJ5IHJlZ2lvbiB0aGUgYmFuZCBpbnRlcnNlY3RzLiBJbWFnZSBjb29yZHMuICovXG4gIHByaXZhdGUgYmFuZFN0YXJ0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBiYW5kQ3VycmVudDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFuZERyYWdnZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlZHJhd0hhbmRsZXIgPSAoKSA9PiB0aGlzLnJlZHJhdygpO1xuICAvKiogQSBjYW1lcmEgbW92ZSAoJ3VwZGF0ZS12aWV3cG9ydCcsIHJhaXNlZCBvbiBldmVyeSByZWRyYXduIGZyYW1lLCBhbmltYXRlZCBvbmVzXG4gICAqICBpbmNsdWRlZDsgJ3Jlc2l6ZSc7ICdyb3RhdGUnKS4gVGhlIHJlZ2lvbnMgYXJlIGRyYXduIGluIGltYWdlIGNvb3JkaW5hdGVzLCBzb1xuICAgKiAgb25seSB0aGUgcmVuZGVyZXIncyB0cmFuc2Zvcm0gYW5kIGl0cyBmZXcgc2NyZWVuLXNwYWNlIGVsZW1lbnRzIGZvbGxvdzsgbm90aGluZ1xuICAgKiAgaXMgcmVidWlsdCAoT1NELVBMT1RMWS0xMSkuIEEgdGlsZS1vbmx5IGZyYW1lIChsb2FkaW5nLCByZWNvbG9yKSBsZWF2ZXMgdGhlXG4gICAqICBwcm9qZWN0aW9uLCBhbmQgc28gdGhlIERPTSwgdW50b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbWVyYUhhbmRsZXIgPSAoKSA9PiB0aGlzLnVwZGF0ZUNhbWVyYSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBTdmdSZWdpb25SZW5kZXJlcjtcbiAgLyoqIFRoZSBpbWFnZSdzIHJlZ2lvbiBzb3VyY2UsIGRyYXduIHVuZGVyIHRoZSByZWdpb25zIGF0IHRoZSB6b29tJ3MgbGV2ZWwgb2YgZGV0YWlsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZUxheWVyOiBSZWdpb25Tb3VyY2VMYXllciB8IG51bGw7XG4gIC8qKiBPU0QncyBNb3VzZVRyYWNrZXIgZHJvcHMgYSBjYW5jZWxsZWQgcG9pbnRlciAodG91Y2ggaW50ZXJydXB0ZWQsIHBvaW50ZXJcbiAgICogIGNhcHR1cmUgbG9zdCB0byB0aGUgYnJvd3Nlcikgd2l0aG91dCBjYWxsaW5nIHJlbGVhc2VIYW5kbGVyLCBzbyB0aGVcbiAgICogIGdlc3R1cmUgaXMgZW5kZWQgaGVyZSBpbnN0ZWFkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBvaW50ZXJDYW5jZWxIYW5kbGVyID0gKCkgPT4ge1xuICAgIHRoaXMuZW5kR2VzdHVyZSgpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aWV3ZXI6IE9zZFZpZXdlckxpa2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogUmVnaW9uRWRpdFN0b3JlLFxuICApIHtcbiAgICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUywgJ3N2ZycpIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnN2Zy5zdHlsZSwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJywgLy8gT1NEIGhhbmRsZXMgbmF2aWdhdGlvbiB1bmxlc3Mgd2UncmUgZHJhd2luZ1xuICAgIH0pO1xuICAgIHRoaXMudmlld2VyLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBTdmdSZWdpb25SZW5kZXJlcih0aGlzLnN2Zywge1xuICAgICAgcmVjdEVsZW1lbnQ6ICdwb2x5Z29uJyxcbiAgICAgIHN0eWxlU2hhcGU6IChlbCwgcmVnaW9uLCBzZWxlY3RlZCkgPT5cbiAgICAgICAgc3R5bGVSZWdpb25TaGFwZShlbCwgcmVnaW9uLCBzZWxlY3RlZCwgdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCksIHRoaXMuc3RvcmUuZ2V0UmVnaW9uU3R5bGU/LigpKSxcbiAgICAgIC8vIFRoZSBjbGFzcyBsYWJlbCwgd2hlbiB0aGUgUmVnaW9uIEVkaXRvcidzIFwic2hvdyBsYWJlbHNcIiBpcyBvbi5cbiAgICAgIGRlY29yYXRlOiAocmVnaW9uLCBfaSwgX3NlbGVjdGVkLCBsYXllcikgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpICYmICF0aGlzLnN0b3JlLmlzTGFiZWxDb3ZlcmVkPy4ocmVnaW9uLmxhYmVsKSkge1xuICAgICAgICAgIGRyYXdSZWdpb25MYWJlbChsYXllciwgcmVnaW9uLCB0aGlzLnN0b3JlLmdldFNoYXBlQ29sb3IoKSwgdGhpcy5zdG9yZS5nZXRSZWdpb25TdHlsZT8uKCkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2tpcDogKHJlZ2lvbikgPT4gdGhpcy5oaWRkZW4ocmVnaW9uKSxcbiAgICB9KTtcbiAgICB0aGlzLnNvdXJjZUxheWVyID0gdGhpcy5zdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JFxuICAgICAgPyBuZXcgUmVnaW9uU291cmNlTGF5ZXIodGhpcy5zdmcsIHRoaXMuc3RvcmUuZ2V0UmVnaW9uU291cmNlVmlldyQoKSlcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLnZpZXdlci5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMucG9pbnRlckNhbmNlbEhhbmRsZXIpO1xuXG4gICAgLy8gJ3VwZGF0ZS12aWV3cG9ydCcgZmlyZXMgb24gZXZlcnkgcmVkcmF3biBmcmFtZSwgYW5pbWF0ZWQgb25lcyBpbmNsdWRlZCDigJRcbiAgICAvLyBhbHNvIGxpc3RlbmluZyB0byAnYW5pbWF0aW9uJyByZWJ1aWx0IHRoZSB3aG9sZSBTVkcgdHdpY2UgcGVyIGZyYW1lLlxuICAgIHRoaXMudmlld2VyLmFkZEhhbmRsZXIoJ3VwZGF0ZS12aWV3cG9ydCcsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgdGhpcy52aWV3ZXIuYWRkSGFuZGxlcigncmVzaXplJywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICB0aGlzLnZpZXdlci5hZGRIYW5kbGVyKCdyb3RhdGUnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIC8vIEtlZXAgd2hlZWwtem9vbSBhbGl2ZSB3aGlsZSBhIHRvb2wgaGFzIG1vdXNlLW5hdiBkaXNhYmxlZCAoc2VlIGhhbmRsZXIpLlxuICAgIHRoaXMudmlld2VyLmVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy53aGVlbFpvb21IYW5kbGVyLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy50cmFja2VyID0gbmV3IE9TRC5Nb3VzZVRyYWNrZXIoe1xuICAgICAgZWxlbWVudDogdGhpcy52aWV3ZXIuY2FudmFzLFxuICAgICAgcHJlc3NIYW5kbGVyOiAoZTogYW55KSA9PiB0aGlzLm9uUHJlc3MoZSksXG4gICAgICBkcmFnSGFuZGxlcjogKGU6IGFueSkgPT4gdGhpcy5vbkRyYWcoZSksXG4gICAgICByZWxlYXNlSGFuZGxlcjogKGU6IGFueSkgPT4gdGhpcy5vblJlbGVhc2UoZSksXG4gICAgICBjbGlja0hhbmRsZXI6IChlOiBhbnkpID0+IHRoaXMub25DbGljayhlKSxcbiAgICAgIG1vdmVIYW5kbGVyOiAoZTogYW55KSA9PiB0aGlzLm9uTW92ZShlKSxcbiAgICB9KTtcbiAgICB0aGlzLnRyYWNrZXIuc2V0VHJhY2tpbmcoZmFsc2UpO1xuXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLnN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKHRoaXMucmVkcmF3SGFuZGxlcikpO1xuICAgIHRoaXMuc3Vicy5hZGQoXG4gICAgICB0aGlzLnN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpLnN1YnNjcmliZSgoaWR4KSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBpZHggfHwgW107XG4gICAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKiBTd2l0Y2ggZHJhd2luZy9zZWxlY3Rpb24gbW9kZTsgdG9nZ2xlcyBPU0QgbmF2aWdhdGlvbiBhY2NvcmRpbmdseS4gKi9cbiAgc2V0TW9kZShtb2RlOiBSZWdpb25Ub29sTW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yZXNldEluUHJvZ3Jlc3MoKTtcbiAgICAvLyBBbnkgYWN0aXZlIHJlZ2lvbiB0b29sIHRha2VzIG92ZXIgdGhlIHBvaW50ZXIg4oCUIE9TRCBwYW4vem9vbSBpcyBkaXNhYmxlZFxuICAgIC8vIHNvIGRyYWdnaW5nIGRyYXdzIChhbmQgY2xpY2tzIHNlbGVjdCkgaW5zdGVhZCBvZiBwYW5uaW5nLiBXaXRoIG5vIHRvb2wsXG4gICAgLy8gT1NEIG5hdmlnYXRlcyBub3JtYWxseS5cbiAgICB0aGlzLnZpZXdlci5zZXRNb3VzZU5hdkVuYWJsZWQobW9kZSA9PT0gJ25vbmUnKTtcbiAgICB0aGlzLnRyYWNrZXIuc2V0VHJhY2tpbmcobW9kZSAhPT0gJ25vbmUnKTtcbiAgICB0aGlzLnVwZGF0ZUN1cnNvcihmYWxzZSk7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH1cblxuICAvKiogRHJpdmUgT1NEIHpvb20gZnJvbSB0aGUgd2hlZWwgd2hpbGUgYW55IHRvb2wgb3ducyB0aGUgcG9pbnRlci5cbiAgICpcbiAgICogT1NEJ3MgbmF0aXZlIHNjcm9sbC16b29tIGlzIHBhcnQgb2YgbW91c2UtbmF2LCBzbyBgc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKWBcbiAgICogKHVzZWQgYnkgZXZlcnkgcmVnaW9uIHRvb2wgYW5kIGJ5IHRoZSB3YW5kL2JydXNoL2VyYXNlci9TQU0gdG9vbHMpIGRpc2FibGVzXG4gICAqIGl0LiBUaGUgY292ZXJpbmctY2FudmFzIHRvb2xzIGFsc28gc2l0IGFib3ZlIHRoZSBPU0QgY2FudmFzIGFuZCBzd2FsbG93IHRoZVxuICAgKiB3aGVlbCBvdXRyaWdodC4gVGhpcyBsaXN0ZW5lciBpcyBib3VuZCBvbmNlIHRvIHRoZSB2aWV3ZXIgZWxlbWVudCDigJQgYW5cbiAgICogYW5jZXN0b3Igb2YgYm90aCB0aGUgT1NEIGNhbnZhcyBhbmQgdGhlIHRvb2wgb3ZlcmxheXMg4oCUIGFuZCBmb3J3YXJkcyB0aGVcbiAgICogd2hlZWwgdG8gYSBjdXJzb3ItY2VudHJlZCB6b29tIHdoZW5ldmVyIG1vdXNlLW5hdiBpcyBvZmYuIFdoZW4gbmF2IGlzIG9uIChub1xuICAgKiB0b29sIGFjdGl2ZSkgaXQgZG9lcyBub3RoaW5nIGFuZCBPU0Qgem9vbXMgbmF0aXZlbHkuIChqaXQtdWkjOTQpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd2hlZWxab29tSGFuZGxlciA9IChlOiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgY29uc3QgdnAgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgY29uc3QgZWwgPSB0aGlzLnZpZXdlcj8uZWxlbWVudDtcbiAgICAvLyBOYXYgb24g4oaSIG5vIHRvb2wgYWN0aXZlIOKGkiBsZXQgT1NEIGhhbmRsZSBzY3JvbGwtem9vbSBuYXRpdmVseS5cbiAgICBpZiAoIXZwIHx8ICFlbCB8fCBlLmRlbHRhWSA9PT0gMCB8fCB0aGlzLnZpZXdlci5pc01vdXNlTmF2RW5hYmxlZCgpKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByZWZQb2ludCA9IHZwLnBvaW50RnJvbVBpeGVsKG5ldyBPU0QuUG9pbnQoZS5jbGllbnRYIC0gcmVjdC5sZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCkpO1xuICAgIHZwLnpvb21CeShlLmRlbHRhWSA8IDAgPyBPU0RfWk9PTV9QRVJfU0NST0xMIDogMSAvIE9TRF9aT09NX1BFUl9TQ1JPTEwsIHJlZlBvaW50KTtcbiAgICB2cC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH07XG5cbiAgLyoqIEN1cnNvciBmZWVkYmFjayBwZXIgbW9kZSAoY3Jvc3NoYWlyIHdoaWxlIGRyYXdpbmc7IHBvaW50ZXIgb3ZlciBhIHJlZ2lvblxuICAgKiAgaW4gc2VsZWN0IG1vZGUpLiAqL1xuICBwcml2YXRlIHVwZGF0ZUN1cnNvcihvdmVyUmVnaW9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy52aWV3ZXIuY2FudmFzO1xuICAgIGlmIChcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0JyB8fFxuICAgICAgdGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdkcmF3b3BlbnBhdGgnIHx8XG4gICAgICB0aGlzLm1vZGUgPT09ICdkcmF3cG9seWdvbicgfHxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ2FkZHBvaW50JyB8fFxuICAgICAgdGhpcy5tb2RlID09PSAnZGVsZXRlcG9pbnQnXG4gICAgKSB7XG4gICAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdtb3ZlJykge1xuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICdtb3ZlJztcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBvdmVyUmVnaW9uID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gJyc7IC8vIE9TRCBkZWZhdWx0IChncmFiKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3RlZCByZWdpb24ncyB2ZXJ0aWNlcy9oYW5kbGVzIHNob3VsZCBiZSBkcmF3bi4gU2hvd25cbiAgICogIHdoZW5ldmVyIGEgcmVnaW9uIGlzIHNlbGVjdGVkIOKAlCBpbmNsdWRpbmcgYG5vbmVgIChkaXNwbGF5KSBtb2RlIGFuZCB3aGlsZVxuICAgKiAgYW5vdGhlciB0b29sICh3YW5kLCBicnVzaCwgU0FN4oCmKSBpcyBhY3RpdmUg4oCUIHNvIGEgc2VsZWN0aW9uIGFsd2F5cyByZXZlYWxzXG4gICAqICBpdHMgdmVydGljZXMuIFN1cHByZXNzZWQgb25seSB3aGlsZSBhY3RpdmVseSBkcmF3aW5nIGEgYnJhbmQtbmV3IHNoYXBlLFxuICAgKiAgd2hlcmUgc3RyYXkgaGFuZGxlcyB3b3VsZCBiZSBub2lzZS4gKi9cbiAgcHJpdmF0ZSBnZXQgc2hvd3NTZWxlY3RlZFZlcnRpY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm1vZGUgIT09ICdkcmF3cmVjdCcgJiZcbiAgICAgIHRoaXMubW9kZSAhPT0gJ2RyYXdwb2x5Z29uJyAmJlxuICAgICAgdGhpcy5tb2RlICE9PSAnZHJhd2Nsb3NlZHBhdGgnICYmXG4gICAgICB0aGlzLm1vZGUgIT09ICdkcmF3b3BlbnBhdGgnXG4gICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgYSBnZXN0dXJlIGluIGZsaWdodCBmaXJzdDogYSBkcmFnJ3Mgb3BlbiBzdG9yZSBiYXRjaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBldmVyeSBsYXRlciByZWdpb24tdXBkYXRlIGVtaXNzaW9uIGFwcC13aWRlLlxuICAgIHRoaXMuZW5kR2VzdHVyZSgpO1xuICAgIHRoaXMudmlld2VyLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5wb2ludGVyQ2FuY2VsSGFuZGxlcik7XG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52aWV3ZXIuZWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLndoZWVsWm9vbUhhbmRsZXIpO1xuICAgIHRoaXMudmlld2VyLnJlbW92ZUhhbmRsZXIoJ3VwZGF0ZS12aWV3cG9ydCcsIHRoaXMuY2FtZXJhSGFuZGxlcik7XG4gICAgdGhpcy52aWV3ZXIucmVtb3ZlSGFuZGxlcigncmVzaXplJywgdGhpcy5jYW1lcmFIYW5kbGVyKTtcbiAgICB0aGlzLnZpZXdlci5yZW1vdmVIYW5kbGVyKCdyb3RhdGUnLCB0aGlzLmNhbWVyYUhhbmRsZXIpO1xuICAgIGlmICh0aGlzLnRyYWNrZXIpIHRoaXMudHJhY2tlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zb3VyY2VMYXllcj8uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLnN2Zy5wYXJlbnROb2RlKSB0aGlzLnN2Zy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3ZnKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBjb29yZGluYXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKiBJbWFnZS1waXhlbCBwb2ludCAtPiBlbGVtZW50IHBpeGVsIHBvaW50LiAqL1xuICBwcml2YXRlIHRvUHgoaW1nWDogbnVtYmVyLCBpbWdZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIHJldHVybiBpbWFnZVRvRWxlbWVudCh0aGlzLnZpZXdlciwgaW1nWCwgaW1nWSk7XG4gIH1cbiAgLyoqIEVsZW1lbnQgcGl4ZWwgcG9pbnQgKGZyb20gYSBNb3VzZVRyYWNrZXIgZXZlbnQpIC0+IGltYWdlLXBpeGVsIHBvaW50LCByb3VuZGVkXG4gICAqICB0byB3aG9sZSBwaXhlbHMgKHdoZXJlIGEgZHJhd24gdmVydGV4IGxhbmRzKS4gKi9cbiAgcHJpdmF0ZSB0b0ltYWdlKHBvczogYW55KTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICBjb25zdCBwID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIHBvcy54LCBwb3MueSk7XG4gICAgcmV0dXJuIHsgeDogTWF0aC5yb3VuZChwLngpLCB5OiBNYXRoLnJvdW5kKHAueSkgfTtcbiAgfVxuICAvKiogRWxlbWVudCBwaXhlbCBwb2ludCAtPiBleGFjdCBpbWFnZSBwb2ludCwgZm9yIGhpdCB0ZXN0cy4gKi9cbiAgcHJpdmF0ZSB0b1dvcmxkKHBvczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICByZXR1cm4gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIHBvcy54LCBwb3MueSk7XG4gIH1cbiAgLyoqIEltYWdlIHBvaW50IC0+IGVsZW1lbnQgcHgsIGFzIHRoZSBzaGFyZWQgcmVnaW9uIGdlb21ldHJ5IHdhbnRzIGl0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRvU2NyZWVuOiBUb1NjcmVlbiA9ICh4LCB5KSA9PiB7XG4gICAgY29uc3QgcSA9IHRoaXMudG9QeCh4LCB5KTtcbiAgICByZXR1cm4gW3EueCwgcS55XTtcbiAgfTtcblxuICAvLyDilIDilIAgcmVuZGVyaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogRm9sbG93IHRoZSBjdXJyZW50IGltYWdl4oaSZWxlbWVudCBwcm9qZWN0aW9uOiB0aGUgcmVuZGVyZXIgcmV3cml0ZXMgb25lIHRyYW5zZm9ybVxuICAgKiAgYW5kIHJlLXBvc2l0aW9ucyBpdHMgc2NyZWVuLXNwYWNlIGVsZW1lbnRzLCBvciBkb2VzIG5vdGhpbmcgd2hlbiBpdCBkaWQgbm90IG1vdmUuICovXG4gIHByaXZhdGUgdXBkYXRlQ2FtZXJhKCk6IHZvaWQge1xuICAgIGNvbnN0IGFmZmluZSA9IGFmZmluZUZyb21Qcm9qZWN0aW9uKHRoaXMudG9TY3JlZW4pO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2FtZXJhKGFmZmluZSk7XG4gICAgdGhpcy5zb3VyY2VMYXllcj8uc2V0Q2FtZXJhKGFmZmluZSk7XG4gIH1cblxuICAvKiogUmVidWlsZCBldmVyeXRoaW5nOiB0aGUgcmVnaW9ucyAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLCB0aGVpciBsYWJlbHMgYW5kIHRoZSBvdmVybGF5LiAqL1xuICByZWRyYXcoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYW1lcmEoKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKSwgdGhpcy5zZWxlY3RlZCk7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCB0aGUgc2NyZWVuLXNwYWNlIG92ZXJsYXkgb25seTogdGhlIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMsIHRoZSBydWJiZXIgYmFuZFxuICAgKiBhbmQgYW55IGluLXByb2dyZXNzIGRyYXdpbmcuIERyYXdpbmcgYW5kIG1hcnF1ZWUgZHJhZ3MgY2FsbCB0aGlzIHJhdGhlciB0aGFuXG4gICAqIHtAbGluayByZWRyYXd9LCBzbyB0aGUgcmVnaW9ucyBhcmUgbm90IHJlYnVpbHQgcGVyIHBvaW50ZXIgbW92ZS5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyT3ZlcmxheSgpOiB2b2lkIHtcbiAgICBjb25zdCBzaGFwZUNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXJPdmVybGF5KChsYXllcikgPT4ge1xuICAgICAgLy8gSGFuZGxlcyBvbiB0aGUgc2VsZWN0ZWQgcmVnaW9uLCBzbyB0aGUgdXNlciBjYW4gZ3JhYi9pbnNlcnQvZGVsZXRlXG4gICAgICAvLyB2ZXJ0aWNlcyDigJQgaW4gdGhlIHJlZ2lvbidzIG93biBjb2xvdXIsIHNvIHRoZXkgbWF0Y2ggdGhlIHNoYXBlLlxuICAgICAgY29uc3Qgc2VsID0gdGhpcy5zaG93c1NlbGVjdGVkVmVydGljZXMgPyB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpIDogbnVsbDtcbiAgICAgIGlmIChzZWwpIGRyYXdTZWxlY3Rpb25IYW5kbGVzKGxheWVyLCBzZWwucmVnaW9uLCBzZWwucmVnaW9uLmNvbG9yIHx8IHNoYXBlQ29sb3IpO1xuICAgICAgLy8gUnViYmVyLWJhbmQgKG1hcnF1ZWUpIHNlbGVjdGlvbiBwcmV2aWV3LlxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlbGVjdCcgJiYgdGhpcy5iYW5kU3RhcnQgJiYgdGhpcy5iYW5kQ3VycmVudCkge1xuICAgICAgICBkcmF3U2VsZWN0aW9uQmFuZChsYXllciwgdGhpcy5iYW5kU3RhcnQsIHRoaXMuYmFuZEN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgLy8gSW4tcHJvZ3Jlc3MgZHJhd2luZyBwcmV2aWV3LlxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RyYXdyZWN0JyAmJiB0aGlzLnJlY3RTdGFydCAmJiB0aGlzLnJlY3RDdXJyZW50KSB7XG4gICAgICAgIGRyYXdEcmFmdFJlY3QobGF5ZXIsIHRoaXMucmVjdFN0YXJ0LCB0aGlzLnJlY3RDdXJyZW50LCBzaGFwZUNvbG9yKTtcbiAgICAgIH1cbiAgICAgIGlmICgodGhpcy5tb2RlID09PSAnZHJhd2Nsb3NlZHBhdGgnIHx8IHRoaXMubW9kZSA9PT0gJ2RyYXdvcGVucGF0aCcpICYmIHRoaXMucG9seVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgZHJhd0RyYWZ0UGF0aChsYXllciwgdGhpcy5wb2x5UG9pbnRzLCBzaGFwZUNvbG9yKTtcbiAgICAgIH1cbiAgICAgIC8vIENsaWNrLXRvLXBsYWNlIHBvbHlnb24gcHJldmlldzogdGhlIHBvbHlsaW5lIHNvIGZhciArIGEgbWFya2VyIG9uIHRoZVxuICAgICAgLy8gZmlyc3QgdmVydGV4IChjbGljayBpdCB0byBjbG9zZSkuXG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3BvbHlnb24nICYmIHRoaXMucG9seVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgZHJhd0RyYWZ0UGF0aChsYXllciwgdGhpcy5wb2x5UG9pbnRzLCBzaGFwZUNvbG9yKTtcbiAgICAgICAgdmVydGV4TWFya2VyKGxheWVyLCB0aGlzLnBvbHlQb2ludHNbMF0ueCwgdGhpcy5wb2x5UG9pbnRzWzBdLnksIHRydWUsIHNoYXBlQ29sb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVyYWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGdldCBpc0ZyZWVoYW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcgfHwgdGhpcy5tb2RlID09PSAnZHJhd29wZW5wYXRoJztcbiAgfVxuXG4gIHByaXZhdGUgb25QcmVzcyhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnKSB7XG4gICAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucmVjdEN1cnJlbnQgPSB0aGlzLnJlY3RTdGFydDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNGcmVlaGFuZCkge1xuICAgICAgLy8gRnJlZWhhbmQgZHJhdyAobWF0Y2hlcyBQbG90bHkgZHJhd2Nsb3NlZHBhdGgvZHJhd29wZW5wYXRoKTogcHJlc3MgdG9cbiAgICAgIC8vIHN0YXJ0LCBkcmFnIHRvIHRyYWNlLCByZWxlYXNlIHRvIGNvbW1pdC5cbiAgICAgIHRoaXMuZnJlZWhhbmREcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLnBvbHlQb2ludHMgPSBbdGhpcy50b0ltYWdlKGUucG9zaXRpb24pXTtcbiAgICAgIHRoaXMubGFzdEZyZWVoYW5kUHggPSB7IHg6IGUucG9zaXRpb24ueCwgeTogZS5wb3NpdGlvbi55IH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb3ZlJykge1xuICAgICAgLy8gV2hvbGUtcmVnaW9uIGRyYWcgKCdtb3ZlJyBtb2RlKTogcHJlc3MgaW5zaWRlIHRoZSBzZWxlY3RlZCByZWdpb25cbiAgICAgIC8vIHRvIHRyYW5zbGF0ZSBpdCwgaWdub3JpbmcgdmVydGljZXMvZWRnZXMuXG4gICAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpO1xuICAgICAgaWYgKHNlbCAmJiB0aGlzLmNvbnRhaW5zUG9pbnQoc2VsLnJlZ2lvbiwgZS5wb3NpdGlvbikpIHtcbiAgICAgICAgdGhpcy5zdGFydEVkaXQoJ2JvdW5kcycsICdtb3ZlJywgLTEsIHNlbC5yZWdpb24sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAvLyBBIGJlemllciBjb250cm9sIGhhbmRsZSB0YWtlcyB0b3AgcHJpb3JpdHkgKGl0IHNpdHMgb2ZmIHRoZSBhbmNob3IpLCB0aGVuXG4gICAgICAvLyBkcmFnZ2luZyBhIHNpbmdsZSBwb2x5Z29uIHZlcnRleCAob3ZlciBib2R5LW1vdmUvcmVzaXplKS5cbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMuaGl0UG9seWdvbkhhbmRsZShlLnBvc2l0aW9uKTtcbiAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gdGhpcy5zdG9yZS5nZXRSZWdpb25zKClbdGhpcy5zZWxlY3RlZFt0aGlzLnNlbGVjdGVkLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgaWYgKGhpdC5raW5kID09PSAnYmV6aWVyJykge1xuICAgICAgICAgIHRoaXMuc3RhcnRFZGl0KCdoYW5kbGUnLCAnbW92ZScsIGhpdC5pbmRleCwgcmVnaW9uLCB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbiksIGhpdC5zaWRlLCBoaXQucmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGFydEVkaXQoJ3ZlcnRleCcsICdtb3ZlJywgaGl0LmluZGV4LCByZWdpb24sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSwgJ291dCcsIGhpdC5yaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2Ugc3RhcnQgYSBtb3ZlL3Jlc2l6ZSB3aGVuIHByZXNzaW5nIHRoZSBzZWxlY3RlZCByZWdpb24nc1xuICAgICAgLy8gYm9keS9oYW5kbGVzLlxuICAgICAgY29uc3QgZXogPSB0aGlzLmVkaXRab25lQXQoZS5wb3NpdGlvbik7XG4gICAgICBpZiAoZXopIHtcbiAgICAgICAgdGhpcy5zdGFydEVkaXQoJ2JvdW5kcycsIGV6LnpvbmUsIC0xLCB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKVtlei5pbmRleF0sIHRoaXMudG9JbWFnZShlLnBvc2l0aW9uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXNzIG9uIGVtcHR5IHNwYWNlIC8gYSBub24tc2VsZWN0ZWQgcmVnaW9uOiBiZWdpbiBhIHJ1YmJlci1iYW5kXG4gICAgICAvLyBtdWx0aS1zZWxlY3QuIEEgcGxhaW4gY2xpY2sgKG5vIGRyYWcpIGZhbGxzIHRocm91Z2ggdG8gb25DbGljaywgd2hpY2hcbiAgICAgIC8vIHNpbmdsZS1zZWxlY3RzIG9yIGNsZWFycy5cbiAgICAgIHRoaXMuYmFuZFN0YXJ0ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5iYW5kQ3VycmVudCA9IHRoaXMuYmFuZFN0YXJ0O1xuICAgICAgdGhpcy5iYW5kRHJhZ2dlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCZWdpbiBhbiBlZGl0IGdlc3R1cmUgKG1vdmUvcmVzaXplIG9yIHNpbmdsZS12ZXJ0ZXggZHJhZykgYW5kIG9wZW4gYSBzdG9yZVxuICAgKiAgYmF0Y2ggc28gdGhlIGxpdmUgZHJhZyBlbWl0cyBvbmNlIG9uIHJlbGVhc2UuICovXG4gIHByaXZhdGUgc3RhcnRFZGl0KFxuICAgIGtpbmQ6ICdib3VuZHMnIHwgJ3ZlcnRleCcgfCAnaGFuZGxlJyxcbiAgICB6b25lOiBFZGl0Wm9uZSxcbiAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyLFxuICAgIHJlZ2lvbjogUmVnaW9uLFxuICAgIHN0YXJ0SW1nOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgaGFuZGxlU2lkZTogJ2luJyB8ICdvdXQnID0gJ291dCcsXG4gICAgcmluZyA9IC0xLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVkaXQgPSB7XG4gICAgICBraW5kLFxuICAgICAgem9uZSxcbiAgICAgIHZlcnRleEluZGV4LFxuICAgICAgcmluZyxcbiAgICAgIGhhbmRsZVNpZGUsXG4gICAgICBpZDogcmVnaW9uLmlkLFxuICAgICAgc3RhcnRJbWcsXG4gICAgICBvcmlnOiBraW5kID09PSAnYm91bmRzJyA/IHRoaXMuc25hcHNob3QocmVnaW9uKSA6IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLmVkaXREcmFnZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5zdG9yZS5iZWdpbkJhdGNoKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZyhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnICYmIHRoaXMucmVjdFN0YXJ0KSB7XG4gICAgICB0aGlzLnJlY3RDdXJyZW50ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyZWVoYW5kRHJhZ2dpbmcgJiYgdGhpcy5pc0ZyZWVoYW5kKSB7XG4gICAgICAvLyBUaGluIHRoZSBwYXRoOiBvbmx5IHNhbXBsZSBvbmNlIHRoZSBjdXJzb3IgaGFzIG1vdmVkIGEgZmV3IHNjcmVlbiBweC5cbiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RGcmVlaGFuZFB4O1xuICAgICAgaWYgKCFsYXN0IHx8IE1hdGguaHlwb3QoZS5wb3NpdGlvbi54IC0gbGFzdC54LCBlLnBvc2l0aW9uLnkgLSBsYXN0LnkpID49IDQpIHtcbiAgICAgICAgdGhpcy5wb2x5UG9pbnRzLnB1c2godGhpcy50b0ltYWdlKGUucG9zaXRpb24pKTtcbiAgICAgICAgdGhpcy5sYXN0RnJlZWhhbmRQeCA9IHsgeDogZS5wb3NpdGlvbi54LCB5OiBlLnBvc2l0aW9uLnkgfTtcbiAgICAgICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuZWRpdERyYWdnZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseUVkaXQodGhpcy50b0ltYWdlKGUucG9zaXRpb24pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFuZFN0YXJ0KSB7XG4gICAgICB0aGlzLmJhbmRDdXJyZW50ID0gdGhpcy50b0ltYWdlKGUucG9zaXRpb24pO1xuICAgICAgdGhpcy5iYW5kRHJhZ2dlZCA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUmVsZWFzZShlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZHJhd3JlY3QnICYmIHRoaXMucmVjdFN0YXJ0KSB7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbik7XG4gICAgICBjb25zdCB4ID0gTWF0aC5taW4odGhpcy5yZWN0U3RhcnQueCwgZW5kLngpO1xuICAgICAgY29uc3QgeSA9IE1hdGgubWluKHRoaXMucmVjdFN0YXJ0LnksIGVuZC55KTtcbiAgICAgIGNvbnN0IHcgPSBNYXRoLmFicyhlbmQueCAtIHRoaXMucmVjdFN0YXJ0LngpO1xuICAgICAgY29uc3QgaCA9IE1hdGguYWJzKGVuZC55IC0gdGhpcy5yZWN0U3RhcnQueSk7XG4gICAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMucmVjdEN1cnJlbnQgPSBudWxsO1xuICAgICAgaWYgKHcgPiAyICYmIGggPiAyKSB0aGlzLmNvbW1pdFJlY3RhbmdsZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlZWhhbmREcmFnZ2luZykge1xuICAgICAgdGhpcy5mcmVlaGFuZERyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RGcmVlaGFuZFB4ID0gbnVsbDtcbiAgICAgIC8vIENsb3NlZCA9IGZyZWVmb3JtIChkcmF3Y2xvc2VkcGF0aCk7IG9wZW4gPSBwb2x5bGluZSAoZHJhd29wZW5wYXRoKS5cbiAgICAgIHRoaXMuY29tbWl0UG9seWdvbih0aGlzLm1vZGUgPT09ICdkcmF3Y2xvc2VkcGF0aCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBNb3ZlL3Jlc2l6ZSBhbHJlYWR5IGFwcGxpZWQgbGl2ZTsgZmx1c2ggdGhlIGNvYWxlc2NlZCBlZGl0cyArIGVuZCB0aGVcbiAgICAvLyBnZXN0dXJlIChrZWVwIHNlbGVjdGlvbikuXG4gICAgaWYgKHRoaXMuZWRpdCkge1xuICAgICAgdGhpcy5zdG9yZS5lbmRCYXRjaCgpO1xuICAgICAgdGhpcy5lZGl0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmluaXNoIGEgcnViYmVyLWJhbmQgc2VsZWN0aW9uOiBzZWxlY3QgZXZlcnkgcmVnaW9uIHRoZSBiYW5kIGludGVyc2VjdHMuXG4gICAgaWYgKHRoaXMuYmFuZFN0YXJ0KSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuYmFuZFN0YXJ0O1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5iYW5kQ3VycmVudCA/PyBzdGFydDtcbiAgICAgIHRoaXMuYmFuZFN0YXJ0ID0gdGhpcy5iYW5kQ3VycmVudCA9IG51bGw7XG4gICAgICBjb25zdCB4MCA9IE1hdGgubWluKHN0YXJ0LngsIGVuZC54KSxcbiAgICAgICAgeTAgPSBNYXRoLm1pbihzdGFydC55LCBlbmQueSk7XG4gICAgICBjb25zdCB4MSA9IE1hdGgubWF4KHN0YXJ0LngsIGVuZC54KSxcbiAgICAgICAgeTEgPSBNYXRoLm1heChzdGFydC55LCBlbmQueSk7XG4gICAgICAvLyBPbmx5IGEgcmVhbCBkcmFnIHNlbGVjdHM7IGEgY2xpY2stc2l6ZWQgYmFuZCBmYWxscyB0aHJvdWdoIHRvIG9uQ2xpY2suXG4gICAgICBpZiAodGhpcy5iYW5kRHJhZ2dlZCAmJiAoeDEgLSB4MCA+IDIgfHwgeTEgLSB5MCA+IDIpKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoXG4gICAgICAgICAgcmVnaW9uc0luUmVjdCh0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKSwgeDAsIHkwLCB4MSwgeTEsIHsgc2tpcDogKHIpID0+IHRoaXMuaGlkZGVuKHIpIH0pLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlbGVjdFNvdXJjZUluKHgwLCB5MCwgeDEsIHkxKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25DbGljayhlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuICAgICAgLy8gQSBtb3ZlL3Jlc2l6ZS92ZXJ0ZXggZHJhZyBvciBhIHJ1YmJlci1iYW5kIGRyYWcgYWxzbyBlbmRzIHdpdGggYSBjbGlja1xuICAgICAgLy8gZXZlbnQg4oCUIGRvbid0IHRyZWF0IGl0IGFzIGEgcmUtc2VsZWN0aW9uLlxuICAgICAgaWYgKHRoaXMuZWRpdERyYWdnZWQpIHtcbiAgICAgICAgdGhpcy5lZGl0RHJhZ2dlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5iYW5kRHJhZ2dlZCkge1xuICAgICAgICB0aGlzLmJhbmREcmFnZ2VkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFNoaWZ0IChvciBDbWQvQ3RybCkgdG9nZ2xlcyB0aGUgY2xpY2tlZCByZWdpb24gaW4vb3V0IG9mIHRoZSBjdXJyZW50XG4gICAgICAvLyBzZWxlY3Rpb247IGEgcGxhaW4gY2xpY2sgcmVwbGFjZXMgaXQuXG4gICAgICBjb25zdCBvZSA9IGUub3JpZ2luYWxFdmVudDtcbiAgICAgIGNvbnN0IGFkZGl0aXZlID0gISFvZSAmJiAob2Uuc2hpZnRLZXkgfHwgb2UubWV0YUtleSB8fCBvZS5jdHJsS2V5KTtcbiAgICAgIHRoaXMuc2VsZWN0QXQodGhpcy50b1dvcmxkKGUucG9zaXRpb24pLCBhZGRpdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkcmF3cG9seWdvbicpIHtcbiAgICAgIHRoaXMub25EcmF3UG9seWdvbkNsaWNrKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSAnYWRkcG9pbnQnKSB7XG4gICAgICAvLyBJbnNlcnQgYSB2ZXJ0ZXggb24gdGhlIGNsaWNrZWQgZWRnZSDigJQgZXh0ZXJpb3Igb3IgYW4gaW50ZXJpb3IgcmluZy5cbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25JbmZvKCk7XG4gICAgICBjb25zdCBlZGdlID0gc2VsID8gdGhpcy5oaXRFZGdlKGUucG9zaXRpb24sIHNlbC5yZWdpb24pIDogbnVsbDtcbiAgICAgIGlmIChzZWwgJiYgZWRnZSkge1xuICAgICAgICBpZiAoZWRnZS5yaW5nIDwgMCkgdGhpcy5zdG9yZS5hZGRWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgZWRnZS5zZWdJbmRleCwgZWRnZS54LCBlZGdlLnkpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcmUuYWRkSG9sZVZlcnRleChzZWwucmVnaW9uLmlkLCBlZGdlLnJpbmcsIGVkZ2Uuc2VnSW5kZXgsIGVkZ2UueCwgZWRnZS55KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RlbGV0ZXBvaW50Jykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBjbGlja2VkIHZlcnRleCDigJQgZXh0ZXJpb3Igb3IgYW4gaW50ZXJpb3IgcmluZyAoaml0LXVpIzg1KS5cbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25JbmZvKCk7XG4gICAgICBjb25zdCB2aCA9IHRoaXMuaGl0UG9seWdvbkhhbmRsZShlLnBvc2l0aW9uLCBmYWxzZSk7XG4gICAgICBpZiAoc2VsICYmIHZoKSB7XG4gICAgICAgIGlmICh2aC5yaW5nIDwgMCkgdGhpcy5zdG9yZS5kZWxldGVWZXJ0ZXgoc2VsLnJlZ2lvbi5pZCwgdmguaW5kZXgpO1xuICAgICAgICBlbHNlIHRoaXMuc3RvcmUuZGVsZXRlSG9sZVZlcnRleChzZWwucmVnaW9uLmlkLCB2aC5yaW5nLCB2aC5pbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsaWNrLXRvLXBsYWNlIHBvbHlnb24gKCdkcmF3cG9seWdvbicpOiB0aGUgZmlyc3QgY2xpY2sgc3RhcnRzIHRoZVxuICAgKiBwb2x5Z29uLCBlYWNoIHN1YnNlcXVlbnQgY2xpY2sgYWRkcyBhIHZlcnRleCwgYW5kIGNsaWNraW5nIG5lYXIgdGhlIGZpcnN0XG4gICAqIHZlcnRleCAod2l0aCBhdCBsZWFzdCAzIHBsYWNlZCkgY2xvc2VzIGFuZCBjb21taXRzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBvbkRyYXdQb2x5Z29uQ2xpY2soZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgcHQgPSB0aGlzLnRvSW1hZ2UoZS5wb3NpdGlvbik7XG4gICAgaWYgKCF0aGlzLmRyYXdpbmdQb2x5Z29uKSB7XG4gICAgICB0aGlzLnBvbHlQb2ludHMgPSBbcHRdO1xuICAgICAgdGhpcy5kcmF3aW5nUG9seWdvbiA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLnRvUHgodGhpcy5wb2x5UG9pbnRzWzBdLngsIHRoaXMucG9seVBvaW50c1swXS55KTtcbiAgICBjb25zdCBvbkZpcnN0ID0gTWF0aC5oeXBvdChlLnBvc2l0aW9uLnggLSBmaXJzdC54LCBlLnBvc2l0aW9uLnkgLSBmaXJzdC55KSA8PSBFRElUX1RPTF9QWDtcbiAgICBpZiAob25GaXJzdCAmJiB0aGlzLnBvbHlQb2ludHMubGVuZ3RoID49IDMpIHtcbiAgICAgIHRoaXMuY29tbWl0UG9seWdvbih0cnVlKTsgLy8gY2xvc2VzICsgcmVzZXRzIGluLXByb2dyZXNzIChpbmNsLiBkcmF3aW5nUG9seWdvbilcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2x5UG9pbnRzLnB1c2gocHQpO1xuICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdmVyIGZlZWRiYWNrIGluIHNlbGVjdCBtb2RlOiBtb3ZlL3Jlc2l6ZSBjdXJzb3JzIG92ZXIgdGhlIHNlbGVjdGVkXG4gICAqIHJlZ2lvbidzIGJvZHkvZWRnZXMvY29ybmVycywgYSBwb2ludGVyIG92ZXIgYW55IG90aGVyIHJlZ2lvbi5cbiAgICovXG4gIHByaXZhdGUgb25Nb3ZlKGU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdzZWxlY3QnKSByZXR1cm47XG4gICAgLy8gQSBncmFiYmFibGUgYmV6aWVyIGNvbnRyb2wgaGFuZGxlIG9yIHZlcnRleCBvZiB0aGUgc2VsZWN0ZWQgcG9seWdvbiB0YWtlc1xuICAgIC8vIHByaW9yaXR5LlxuICAgIGlmICh0aGlzLmhpdFBvbHlnb25IYW5kbGUoZS5wb3NpdGlvbikpIHtcbiAgICAgIHRoaXMudmlld2VyLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV6ID0gdGhpcy5lZGl0Wm9uZUF0KGUucG9zaXRpb24pO1xuICAgIGlmIChleikge1xuICAgICAgdGhpcy52aWV3ZXIuY2FudmFzLnN0eWxlLmN1cnNvciA9IFpPTkVfQ1VSU09SW2V6LnpvbmVdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwdCA9IHRoaXMudG9Xb3JsZChlLnBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZUN1cnNvcih0aGlzLnJlZ2lvbkluZGV4QXQocHQpID49IDAgfHwgISF0aGlzLnNvdXJjZUxheWVyPy5mZWF0dXJlQXQocHQueCwgcHQueSwgT1BFTl9QQVRIX1RPTF9QWCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtb3ZlL3Jlc2l6ZSB6b25lIHVuZGVyIHRoZSBjdXJzb3IgZm9yIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVnaW9uXG4gICAqIChyZWN0YW5nbGVzIGdldCBlZGdlL2Nvcm5lciBoYW5kbGVzICsgYm9keTsgcG9seWdvbnMgZ2V0IGJvZHktbW92ZSBvbmx5KSxcbiAgICogb3IgbnVsbCBpZiB0aGUgY3Vyc29yIGlzbid0IG92ZXIgdGhlIHNlbGVjdGVkIHJlZ2lvbi5cbiAgICovXG4gIHByaXZhdGUgZWRpdFpvbmVBdChwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogeyB6b25lOiBFZGl0Wm9uZTsgaW5kZXg6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRbdGhpcy5zZWxlY3RlZC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKVtpbmRleF07XG4gICAgaWYgKCFyZWdpb24pIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICBjb25zdCBhID0gdGhpcy50b1B4KGIueCwgYi55KTtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnRvUHgoYi54ICsgYi53aWR0aCwgYi55ICsgYi5oZWlnaHQpO1xuICAgICAgY29uc3Qgem9uZSA9IHJlY3Rab25lKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHtcbiAgICAgICAgeDA6IE1hdGgubWluKGEueCwgYy54KSxcbiAgICAgICAgeTA6IE1hdGgubWluKGEueSwgYy55KSxcbiAgICAgICAgeDE6IE1hdGgubWF4KGEueCwgYy54KSxcbiAgICAgICAgeTE6IE1hdGgubWF4KGEueSwgYy55KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHpvbmUgPyB7IHpvbmUsIGluZGV4IH0gOiBudWxsO1xuICAgIH1cbiAgICBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24gfHwgYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikge1xuICAgICAgLy8gUG9seWdvbnMgKyBtdWx0aS1wYXJ0IHJlZ2lvbnMgc3VwcG9ydCB3aG9sZS1yZWdpb24gbW92ZSAobm8gcmVzaXplIHpvbmVzKS5cbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zUG9pbnQocmVnaW9uLCBwb3NpdGlvbikgPyB7IHpvbmU6ICdtb3ZlJywgaW5kZXggfSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVnaW9uICh0aGUgbGFzdCBvbmUgc2VsZWN0ZWQpLCBvciBudWxsLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkUmVnaW9uSW5mbygpOiB7IHJlZ2lvbjogUmVnaW9uOyBpbmRleDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZFt0aGlzLnNlbGVjdGVkLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuc3RvcmUuZ2V0UmVnaW9ucygpW2luZGV4XTtcbiAgICByZXR1cm4gcmVnaW9uID8geyByZWdpb24sIGluZGV4IH0gOiBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBiZXppZXIgY29udHJvbCBoYW5kbGUgKHdoZW4gYGJlemllcmApIG9yIHZlcnRleCBvZiB0aGUgc2VsZWN0ZWQgcG9seWdvblxuICAgKiAgdW5kZXIgdGhlIGN1cnNvciAoc2NyZWVuLXBpeGVsIHRvbGVyYW5jZSksIG9yIG51bGwuIFJlY3RhbmdsZXMgaGF2ZSBub1xuICAgKiAgZWRpdGFibGUgdmVydGljZXMgKHRoZWlyIGNvcm5lcnMgYXJlIHJlc2l6ZSB6b25lcywgc2VlIHtAbGluayByZWN0Wm9uZX0pLiAqL1xuICBwcml2YXRlIGhpdFBvbHlnb25IYW5kbGUoXG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbiAgICBiZXppZXIgPSB0cnVlLFxuICApOiB7IGtpbmQ6ICd2ZXJ0ZXgnIHwgJ2Jlemllcic7IHJpbmc6IG51bWJlcjsgaW5kZXg6IG51bWJlcjsgc2lkZTogJ2luJyB8ICdvdXQnIH0gfCBudWxsIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGVkUmVnaW9uSW5mbygpO1xuICAgIGlmICghc2VsIHx8ICEoc2VsLnJlZ2lvbi5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaGl0ID0gaGl0SGFuZGxlKHNlbC5yZWdpb24sIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHRoaXMudG9TY3JlZW4sIEVESVRfVE9MX1BYLCB7IGJlemllciB9KTtcbiAgICBpZiAoIWhpdCB8fCBoaXQua2luZCA9PT0gJ2Nvcm5lcicpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IGtpbmQ6IGhpdC5raW5kLCByaW5nOiBoaXQucmluZywgaW5kZXg6IGhpdC5pbmRleCwgc2lkZTogaGl0LmtpbmQgPT09ICdiZXppZXInID8gaGl0LnNpZGUgOiAnb3V0JyB9O1xuICB9XG5cbiAgLyoqIFRoZSBlZGdlIG9mIGByZWdpb25gJ3MgcG9seWdvbiBuZWFyZXN0IHRoZSBjdXJzb3IgKHdpdGhpbiB0b2xlcmFuY2UpLCB3aXRoXG4gICAqICB0aGUgY2xpY2tlZCBwb2ludCBpbiBpbWFnZSBjb29yZHMgYXMgdGhlIGluc2VydGlvbiBwb3NpdGlvbiwgb3IgbnVsbC4gKi9cbiAgcHJpdmF0ZSBoaXRFZGdlKFxuICAgIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgcmVnaW9uOiBSZWdpb24sXG4gICk6IHsgcmluZzogbnVtYmVyOyBzZWdJbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgZWRnZSA9IG5lYXJlc3RFZGdlKHJlZ2lvbiwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgdGhpcy50b1NjcmVlbik7XG4gICAgaWYgKCFlZGdlIHx8IGVkZ2UuZGlzdCA+IEVESVRfVE9MX1BYKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnRvSW1hZ2UocG9zaXRpb24pO1xuICAgIHJldHVybiB7IHJpbmc6IGVkZ2UucmluZywgc2VnSW5kZXg6IGVkZ2Uuc2VnSW5kZXgsIHg6IGltZy54LCB5OiBpbWcueSB9O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IHRoZSBzZWxlY3RlZCByZWdpb24ncyBnZW9tZXRyeSBhdCB0aGUgc3RhcnQgb2YgYW4gZWRpdC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdChyZWdpb246IFJlZ2lvbik6IEVkaXRTbmFwc2hvdCB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBQb2x5Z29uIHx8IGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHJldHVybiB7IGtpbmQ6ICdzaGFwZScsIGJvdW5kczogYiB9O1xuICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSByZXR1cm4geyBraW5kOiAncmVjdCcsIHg6IGIueCwgeTogYi55LCB3OiBiLndpZHRoLCBoOiBiLmhlaWdodCB9O1xuICAgIHJldHVybiB7IGtpbmQ6ICdyZWN0JywgeDogMCwgeTogMCwgdzogMCwgaDogMCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBpbi1wcm9ncmVzcyBtb3ZlL3Jlc2l6ZSB0byB0aGUgcmVnaW9uLCBsaXZlLCB0aHJvdWdoIHRoZVxuICAgKiBSZWdpb24tbmF0aXZlIGVkaXQgQVBJLiBSZWNvbXB1dGVkIGFic29sdXRlbHkgZnJvbSB0aGUgZ2VzdHVyZS1zdGFydFxuICAgKiBzbmFwc2hvdCAoYG9yaWdgKSArIHRoZSB0b3RhbCBkZWx0YSwgc28gZWFjaCBmcmFtZSBpcyBpZGVtcG90ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUVkaXQoY3VySW1nOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZWRpdC5raW5kID09PSAndmVydGV4Jykge1xuICAgICAgLy8gRHJhZyBhIHNpbmdsZSB2ZXJ0ZXggdG8gdGhlIGN1cnNvciAoYWJzb2x1dGUg4oCUIGlkZW1wb3RlbnQpLiBSb3V0ZSB0byB0aGVcbiAgICAgIC8vIGV4dGVyaW9yIG9yIHRoZSBtYXRjaGluZyBpbnRlcmlvciByaW5nIChob2xlKSDigJQgaml0LXVpIzg1LlxuICAgICAgaWYgKHRoaXMuZWRpdC5yaW5nIDwgMCkge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVWZXJ0ZXgodGhpcy5lZGl0LmlkLCB0aGlzLmVkaXQudmVydGV4SW5kZXgsIGN1ckltZy54LCBjdXJJbWcueSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVIb2xlVmVydGV4KHRoaXMuZWRpdC5pZCwgdGhpcy5lZGl0LnJpbmcsIHRoaXMuZWRpdC52ZXJ0ZXhJbmRleCwgY3VySW1nLngsIGN1ckltZy55KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdC5raW5kID09PSAnaGFuZGxlJykge1xuICAgICAgLy8gRHJhZyBhIGJlemllciBjb250cm9sIGhhbmRsZSB0byB0aGUgY3Vyc29yIOKAlCBleHRlcmlvciAocmluZyAtMSkgb3IgYSBkb251dCBob2xlIHJpbmcuXG4gICAgICBpZiAodGhpcy5lZGl0LnJpbmcgPCAwKSB7XG4gICAgICAgIHRoaXMuc3RvcmUubW92ZUJlemllckhhbmRsZSh0aGlzLmVkaXQuaWQsIHRoaXMuZWRpdC52ZXJ0ZXhJbmRleCwgdGhpcy5lZGl0LmhhbmRsZVNpZGUsIGN1ckltZy54LCBjdXJJbWcueSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3JlLm1vdmVIb2xlQmV6aWVySGFuZGxlKFxuICAgICAgICAgIHRoaXMuZWRpdC5pZCxcbiAgICAgICAgICB0aGlzLmVkaXQucmluZyxcbiAgICAgICAgICB0aGlzLmVkaXQudmVydGV4SW5kZXgsXG4gICAgICAgICAgdGhpcy5lZGl0LmhhbmRsZVNpZGUsXG4gICAgICAgICAgY3VySW1nLngsXG4gICAgICAgICAgY3VySW1nLnksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGR4ID0gY3VySW1nLnggLSB0aGlzLmVkaXQuc3RhcnRJbWcueDtcbiAgICBjb25zdCBkeSA9IGN1ckltZy55IC0gdGhpcy5lZGl0LnN0YXJ0SW1nLnk7XG5cbiAgICBjb25zdCBvID0gdGhpcy5lZGl0Lm9yaWc7XG4gICAgaWYgKCFvKSByZXR1cm47XG4gICAgaWYgKG8ua2luZCA9PT0gJ3JlY3QnKSB7XG4gICAgICBjb25zdCBib3ggPSByZXNpemVSZWN0KHsgeDogby54LCB5OiBvLnksIHdpZHRoOiBvLncsIGhlaWdodDogby5oIH0sIHRoaXMuZWRpdC56b25lLCBkeCwgZHkpO1xuICAgICAgdGhpcy5zdG9yZS51cGRhdGVCb3VuZHModGhpcy5lZGl0LmlkLCBPYmplY3QuYXNzaWduKG5ldyBSZWN0YW5nbGUoKSwgYm94KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvbHlnb24gLyBtdWx0aS1wYXJ0IHJlZ2lvbjogdHJhbnNsYXRlIGV2ZXJ5IHZlcnRleCwgaG9sZSBhbmQgcGFydCwgcm91bmRlZCB0b1xuICAgICAgLy8gd2hvbGUgcGl4ZWxzLiBCZXppZXIgaGFuZGxlIG9mZnNldHMgYXJlIHJlbGF0aXZlLCBzbyB0aGV5IGNhcnJ5IG92ZXIgdW5jaGFuZ2VkLlxuICAgICAgdGhpcy5zdG9yZS51cGRhdGVCb3VuZHModGhpcy5lZGl0LmlkLCB0cmFuc2xhdGVCb3VuZHMoby5ib3VuZHMsIGR4LCBkeSwgTWF0aC5yb3VuZCkpO1xuICAgIH1cbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RBdChwdDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LCBhZGRpdGl2ZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5yZWdpb25JbmRleEF0KHB0KTtcbiAgICAvLyBOb3Qgb24gYSByZWdpb246IGEgZmVhdHVyZSBvZiB0aGUgcmVnaW9uIHNvdXJjZSB0aGVyZSBpcyB0YWtlbiBpbnRvIHRoZSByZWdpb25zIGFuZFxuICAgIC8vIHNlbGVjdGVkICh0aGUgc291cmNlIGRyYXdzIGl0IHVudGlsIHRoZW4pLlxuICAgIGNvbnN0IGZlYXR1cmUgPSBpZHggPCAwID8gdGhpcy5zb3VyY2VMYXllcj8uZmVhdHVyZUF0KHB0LngsIHB0LnksIE9QRU5fUEFUSF9UT0xfUFgpIDogbnVsbDtcbiAgICBpZiAoZmVhdHVyZSAmJiB0aGlzLnN0b3JlLnNlbGVjdFNvdXJjZUZlYXR1cmVzKSB7XG4gICAgICB2b2lkIHRoaXMuc3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoW2ZlYXR1cmUuaWRdLCBhZGRpdGl2ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhZGRpdGl2ZSkge1xuICAgICAgLy8gU2hpZnQtY2xpY2sgb24gZW1wdHkgc3BhY2Uga2VlcHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgICAgaWYgKGlkeCA8IDApIHJldHVybjtcbiAgICAgIC8vIGB0aGlzLnNlbGVjdGVkYCBtaXJyb3JzIHRoZSBzdG9yZSdzIGN1cnJlbnQgc2VsZWN0aW9uIChrZXB0IGluIHN5bmMgdmlhXG4gICAgICAvLyB0aGUgc3Vic2NyaXB0aW9uKSwgc28gaXQncyB0aGUgc291cmNlIG9mIHRydXRoIHdpdGhvdXQgYSBzeW5jIGdldHRlci5cbiAgICAgIGNvbnN0IGN1ciA9IHRoaXMuc2VsZWN0ZWQuc2xpY2UoKTtcbiAgICAgIGNvbnN0IGF0ID0gY3VyLmluZGV4T2YoaWR4KTtcbiAgICAgIGlmIChhdCA+PSAwKVxuICAgICAgICBjdXIuc3BsaWNlKGF0LCAxKTsgLy8gdG9nZ2xlIG9mZlxuICAgICAgZWxzZSBjdXIucHVzaChpZHgpOyAvLyB0b2dnbGUgb25cbiAgICAgIHRoaXMuc3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoY3VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdG9yZS5zZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpZHggPj0gMCA/IFtpZHhdIDogW10pO1xuICB9XG5cbiAgLyoqIFRha2UgdGhlIHJlZ2lvbi1zb3VyY2UgZmVhdHVyZXMgdGhlIGJhbmQgbWVldHMgaW50byB0aGUgcmVnaW9ucywgYWRkaW5nIHRoZW0gdG8gdGhlIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RTb3VyY2VJbih4MDogbnVtYmVyLCB5MDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLnNvdXJjZUxheWVyPy5mZWF0dXJlc0luUmVjdCh4MCwgeTAsIHgxLCB5MSkgPz8gW107XG4gICAgaWYgKCFmZWF0dXJlcy5sZW5ndGggfHwgIXRoaXMuc3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMpIHJldHVybjtcbiAgICBjb25zdCBpZHMgPSBmZWF0dXJlcy5zbGljZSgwLCBTT1VSQ0VfTUFSUVVFRV9MSU1JVCkubWFwKChmKSA9PiBmLmlkKTtcbiAgICB2b2lkIHRoaXMuc3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzLCB0cnVlKTtcbiAgfVxuXG4gIC8qKiBJbmRleCBvZiB0aGUgdG9wbW9zdCByZWdpb24gdW5kZXIgYW4gaW1hZ2UgcG9pbnQsIG9yIC0xLiAqL1xuICBwcml2YXRlIHJlZ2lvbkluZGV4QXQocHQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IG51bWJlciB7XG4gICAgY29uc3Qgb3B0cyA9IHsgdG9TY3JlZW46IHRoaXMudG9TY3JlZW4sIHRvbFB4OiBPUEVOX1BBVEhfVE9MX1BYLCBza2lwOiAocjogUmVnaW9uKSA9PiB0aGlzLmhpZGRlbihyKSB9O1xuICAgIHJldHVybiB0b3Btb3N0UmVnaW9uQXQodGhpcy5zdG9yZS5nZXRSZWdpb25zKCksIHB0LngsIHB0LnksIG9wdHMpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSByZWdpb24ncyBjbGFzcyBpcyBoaWRkZW4gKG5vdCBkcmF3biwgbm90IHBpY2tlZCkuICovXG4gIHByaXZhdGUgaGlkZGVuKHJlZ2lvbjogUGljazxSZWdpb24sICdsYWJlbCc+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdG9yZS5pc0NsYXNzSGlkZGVuPy4ocmVnaW9uLmxhYmVsKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBlbGVtZW50LXBpeGVsIGBwb3NpdGlvbmAgbGFuZHMgb24gYHJlZ2lvbmAgKHNlZSBgcmVnaW9uQ29udGFpbnNgKS4gKi9cbiAgcHJpdmF0ZSBjb250YWluc1BvaW50KHJlZ2lvbjogUmVnaW9uLCBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHQgPSB0aGlzLnRvV29ybGQocG9zaXRpb24pO1xuICAgIHJldHVybiByZWdpb25Db250YWlucyhyZWdpb24sIHB0LngsIHB0LnksIHsgdG9TY3JlZW46IHRoaXMudG9TY3JlZW4sIHRvbFB4OiBPUEVOX1BBVEhfVE9MX1BYIH0pO1xuICB9XG5cbiAgLyoqIEFiYW5kb24gd2hhdGV2ZXIgcG9pbnRlciBnZXN0dXJlIGlzIGluIHByb2dyZXNzIChkcmF3aW5nLCBlZGl0IGRyYWcsXG4gICAqICBydWJiZXIgYmFuZCkgYW5kIGNsb3NlIGl0cyBzdG9yZSBiYXRjaC4gKi9cbiAgcHJpdmF0ZSBlbmRHZXN0dXJlKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRJblByb2dyZXNzKCk7XG4gICAgdGhpcy5iYW5kU3RhcnQgPSB0aGlzLmJhbmRDdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLmJhbmREcmFnZ2VkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0SW5Qcm9ncmVzcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlY3RTdGFydCA9IHRoaXMucmVjdEN1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMucG9seVBvaW50cyA9IFtdO1xuICAgIHRoaXMuZnJlZWhhbmREcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZHJhd2luZ1BvbHlnb24gPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RGcmVlaGFuZFB4ID0gbnVsbDtcbiAgICAvLyBDbG9zZSBhbnkgb3BlbiBlZGl0IGJhdGNoIChlLmcuIGEgbW9kZSBzd2l0Y2ggbWlkLWRyYWcpIHNvIHRoZSBzdG9yZSdzXG4gICAgLy8gZW1pdCBjb2FsZXNjaW5nIGRvZXNuJ3QgZ2V0IHN0dWNrLlxuICAgIGlmICh0aGlzLmVkaXQpIHtcbiAgICAgIHRoaXMuc3RvcmUuZW5kQmF0Y2goKTtcbiAgICAgIHRoaXMuZWRpdCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIGNvbW1pdCB0byB0aGUgc3RvcmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgY29tbWl0UmVjdGFuZ2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICBjb25zdCByZWN0ID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgIHJlY3QueCA9IHg7XG4gICAgcmVjdC55ID0geTtcbiAgICByZWN0LndpZHRoID0gdztcbiAgICByZWN0LmhlaWdodCA9IGg7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHJlY3Q7XG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5jb21taXRSZWdpb24ocmVnaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbWl0UG9seWdvbihjbG9zZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2x5UG9pbnRzLmxlbmd0aCA8IChjbG9zZWQgPyAzIDogMikpIHtcbiAgICAgIHRoaXMucmVzZXRJblByb2dyZXNzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gbWFrZVBvbHlnb24oXG4gICAgICB0aGlzLnBvbHlQb2ludHMubWFwKChwKSA9PiBwLngpLFxuICAgICAgdGhpcy5wb2x5UG9pbnRzLm1hcCgocCkgPT4gcC55KSxcbiAgICAgIHsgY2xvc2VkIH0sXG4gICAgKTtcbiAgICByZWdpb24uY29sb3IgPSB0aGlzLnN0b3JlLmdldFNoYXBlQ29sb3IoKTtcbiAgICB0aGlzLnJlc2V0SW5Qcm9ncmVzcygpO1xuICAgIHRoaXMuY29tbWl0UmVnaW9uKHJlZ2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZnJlc2hseS1kcmF3biByZWdpb24gdG8gdGhlIHNoYXJlZCBzdG9yZSBhbmQgcmVkcmF3IGltbWVkaWF0ZWx5LiBUaGVcbiAgICogc3RvcmUgbWludHMgdGhlIGlkLCBzZWxlY3RzIHRoZSBuZXcgcmVnaW9uIChzbyBpdCByZW5kZXJzIHNvbGlkL2hpZ2hsaWdodGVkXG4gICAqIHJhdGhlciB0aGFuIGFzIGEgZGFzaGVkIGluLXByb2dyZXNzIHNoYXBlKSBhbmQgZW1pdHMgdGhlIGZ1bGwgcmVnaW9uIGxpc3QgdG9cbiAgICogdGhlIFJlZ2lvbiBFZGl0b3Ig4oCUIHdlIHN0aWxsIHJlZHJhdyBsb2NhbGx5IHJhdGhlciB0aGFuIHJlbHlpbmcgc29sZWx5IG9uXG4gICAqIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudCwgd2hpY2ggY2FuIGJlIHN3YWxsb3dlZCB3aGVuIFBsb3RseSBpc24ndCBhY3RpdmUuXG4gICAqL1xuICBwcml2YXRlIGNvbW1pdFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IHZvaWQge1xuICAgIC8vIERlZmF1bHQgY2xhc3MvYW5ub3RhdGlvbiBuYW1lLCBtYXRjaGluZyB0aGUgUGxvdGx5IGJhY2tlbmQgYW5kIHRoZSBSZWdpb25cbiAgICAvLyBFZGl0b3IncyBcIkFkZFwiIGFjdGlvbnMgc28gYSBmcmVzaGx5IGRyYXduIHJlZ2lvbiBpc24ndCB1bmxhYmVsZWQuXG4gICAgaWYgKHJlZ2lvbi5sYWJlbCA9PSBudWxsKSByZWdpb24ubGFiZWwgPSAnUmVnaW9uJztcbiAgICB0aGlzLnN0b3JlLmFkZFJlZ2lvbihyZWdpb24pO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgc2VsZWN0ZWQgcmVnaW9uKHMpIHRvL2Zyb20gYSBiZXppZXIgY3VydmUgKHRvQmV6aWVyID0gdHJ1ZSAvXG4gICAqIHRvUG9seWdvbiA9IGZhbHNlKS4gT25lLXNob3Q7IHRoZSBhbmNob3JzIGFyZSB1bmNoYW5nZWQsXG4gICAqIG9ubHkgdGhlIHNtb290aC1jdXJ2ZSByZW5kZXJpbmcgaXMgdG9nZ2xlZC5cbiAgICovXG4gIHNldFNlbGVjdGVkQmV6aWVyKGJlemllcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnN0b3JlLmdldFJlZ2lvbnMoKTtcbiAgICBmb3IgKGNvbnN0IGlkeCBvZiB0aGlzLnNlbGVjdGVkKSB7XG4gICAgICBjb25zdCByZWdpb24gPSByZWdpb25zW2lkeF07XG4gICAgICBpZiAocmVnaW9uKSB0aGlzLnN0b3JlLnNldEJlemllcihyZWdpb24uaWQsIGJlemllcik7XG4gICAgfVxuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,71 @@
1
+ import { LoadingBadgeState } from '../napari-js/napari-loading-state';
2
+ /**
3
+ * "Image reloading…" over the OpenSeadragon view while it fetches the tiles of what it shows, as
4
+ * napari's views show it for their image, cells and transcripts (the same badge). Driven by each
5
+ * world item's own `fully-loaded-change` (an image, a stack slice, a channel), so it covers every
6
+ * tile source alike, and shown only after a short delay, so tiles served from cache never flash it.
7
+ *
8
+ * Only items on screen count (opacity above 0): a hidden channel loads nothing by design (it is
9
+ * not preloaded), so it never becomes fully loaded, and a slice cached or loading in the
10
+ * background is not what the view shows. An item is weighed again when its opacity changes.
11
+ */
12
+ export class OsdTileLoading {
13
+ constructor(viewer) {
14
+ this.viewer = viewer;
15
+ this.state = new LoadingBadgeState();
16
+ /** Each item still loading, with the function that un-counts it. */
17
+ this.loading = new Map();
18
+ this.watched = new Map();
19
+ this.onAdd = (e) => this.watch(e.item);
20
+ this.onRemove = (e) => this.unwatch(e.item);
21
+ this.state.attach(viewer.element);
22
+ viewer.world.addHandler('add-item', this.onAdd);
23
+ viewer.world.addHandler('remove-item', this.onRemove);
24
+ for (let i = 0; i < viewer.world.getItemCount(); i++)
25
+ this.watch(viewer.world.getItemAt(i));
26
+ }
27
+ /** The badge's text (shown, or about to be). */
28
+ get text() {
29
+ return this.state.text;
30
+ }
31
+ destroy() {
32
+ this.viewer.world.removeHandler('add-item', this.onAdd);
33
+ this.viewer.world.removeHandler('remove-item', this.onRemove);
34
+ for (const item of [...this.watched.keys()])
35
+ this.unwatch(item);
36
+ this.state.reset();
37
+ }
38
+ watch(item) {
39
+ if (!item || this.watched.has(item))
40
+ return;
41
+ const handler = () => this.set(item, this.isLoading(item));
42
+ this.watched.set(item, handler);
43
+ item.addHandler('fully-loaded-change', handler);
44
+ item.addHandler('opacity-change', handler);
45
+ handler();
46
+ }
47
+ unwatch(item) {
48
+ const handler = this.watched.get(item);
49
+ if (handler) {
50
+ item.removeHandler('fully-loaded-change', handler);
51
+ item.removeHandler('opacity-change', handler);
52
+ }
53
+ this.watched.delete(item);
54
+ this.set(item, false);
55
+ }
56
+ /** Whether the item is on screen and still fetching its tiles. */
57
+ isLoading(item) {
58
+ const opacity = typeof item.getOpacity === 'function' ? item.getOpacity() : 1;
59
+ return opacity > 0 && !item.getFullyLoaded();
60
+ }
61
+ set(item, loading) {
62
+ const end = this.loading.get(item);
63
+ if (loading && !end)
64
+ this.loading.set(item, this.state.begin('Image'));
65
+ else if (!loading && end) {
66
+ end();
67
+ this.loading.delete(item);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NkLXRpbGUtbG9hZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL29zZC9vc2QtdGlsZS1sb2FkaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBc0J0RTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQVN6QixZQUE2QixNQUFxQjtRQUFyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBUmpDLFVBQUssR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDakQsb0VBQW9FO1FBQ25ELFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztRQUM3QyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7UUFFN0MsVUFBSyxHQUFHLENBQUMsQ0FBb0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBbUIsQ0FBQyxDQUFDO1FBQ3BFLGFBQVEsR0FBRyxDQUFDLENBQW9CLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQW1CLENBQUMsQ0FBQztRQUd4RixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRTtZQUFFLElBQUksQ0FBQyxLQUFL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RiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvYWRpbmdCYWRnZVN0YXRlIH0gZnJvbSAnLi4vbmFwYXJpLWpzL25hcGFyaS1sb2FkaW5nLXN0YXRlJztcblxuLyoqIFdoYXQge0BsaW5rIE9zZFRpbGVMb2FkaW5nfSBuZWVkcyBvZiBhIHdvcmxkIGl0ZW06IE9TRCdzIGBUaWxlZEltYWdlYC4gKi9cbmludGVyZmFjZSBMb2FkaW5nSXRlbSB7XG4gIGdldEZ1bGx5TG9hZGVkKCk6IGJvb2xlYW47XG4gIC8qKiAwIGZvciBhbiBpdGVtIHRoYXQgaXMgbm90IHNob3duOiBhIGhpZGRlbiBjaGFubmVsLCBhIGNhY2hlZCBvciBiYWNrZ3JvdW5kLWxvYWRpbmcgc2xpY2UuICovXG4gIGdldE9wYWNpdHkoKTogbnVtYmVyO1xuICBhZGRIYW5kbGVyKGV2ZW50OiAnZnVsbHktbG9hZGVkLWNoYW5nZScgfCAnb3BhY2l0eS1jaGFuZ2UnLCBoYW5kbGVyOiAoKSA9PiB2b2lkKTogdW5rbm93bjtcbiAgcmVtb3ZlSGFuZGxlcihldmVudDogJ2Z1bGx5LWxvYWRlZC1jaGFuZ2UnIHwgJ29wYWNpdHktY2hhbmdlJywgaGFuZGxlcjogKCkgPT4gdm9pZCk6IHVua25vd247XG59XG5cbi8qKiBXaGF0IGl0IG5lZWRzIG9mIHRoZSB2aWV3ZXIuICovXG5pbnRlcmZhY2UgTG9hZGluZ1ZpZXdlciB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICB3b3JsZDoge1xuICAgIGdldEl0ZW1Db3VudCgpOiBudW1iZXI7XG4gICAgZ2V0SXRlbUF0KGk6IG51bWJlcik6IHVua25vd247XG4gICAgYWRkSGFuZGxlcihldmVudDogJ2FkZC1pdGVtJyB8ICdyZW1vdmUtaXRlbScsIGhhbmRsZXI6IChlOiB7IGl0ZW06IHVua25vd24gfSkgPT4gdm9pZCk6IHVua25vd247XG4gICAgcmVtb3ZlSGFuZGxlcihldmVudDogJ2FkZC1pdGVtJyB8ICdyZW1vdmUtaXRlbScsIGhhbmRsZXI6IChlOiB7IGl0ZW06IHVua25vd24gfSkgPT4gdm9pZCk6IHVua25vd247XG4gIH07XG59XG5cbi8qKlxuICogXCJJbWFnZSByZWxvYWRpbmfigKZcIiBvdmVyIHRoZSBPcGVuU2VhZHJhZ29uIHZpZXcgd2hpbGUgaXQgZmV0Y2hlcyB0aGUgdGlsZXMgb2Ygd2hhdCBpdCBzaG93cywgYXNcbiAqIG5hcGFyaSdzIHZpZXdzIHNob3cgaXQgZm9yIHRoZWlyIGltYWdlLCBjZWxscyBhbmQgdHJhbnNjcmlwdHMgKHRoZSBzYW1lIGJhZGdlKS4gRHJpdmVuIGJ5IGVhY2hcbiAqIHdvcmxkIGl0ZW0ncyBvd24gYGZ1bGx5LWxvYWRlZC1jaGFuZ2VgIChhbiBpbWFnZSwgYSBzdGFjayBzbGljZSwgYSBjaGFubmVsKSwgc28gaXQgY292ZXJzIGV2ZXJ5XG4gKiB0aWxlIHNvdXJjZSBhbGlrZSwgYW5kIHNob3duIG9ubHkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgc28gdGlsZXMgc2VydmVkIGZyb20gY2FjaGUgbmV2ZXIgZmxhc2ggaXQuXG4gKlxuICogT25seSBpdGVtcyBvbiBzY3JlZW4gY291bnQgKG9wYWNpdHkgYWJvdmUgMCk6IGEgaGlkZGVuIGNoYW5uZWwgbG9hZHMgbm90aGluZyBieSBkZXNpZ24gKGl0IGlzXG4gKiBub3QgcHJlbG9hZGVkKSwgc28gaXQgbmV2ZXIgYmVjb21lcyBmdWxseSBsb2FkZWQsIGFuZCBhIHNsaWNlIGNhY2hlZCBvciBsb2FkaW5nIGluIHRoZVxuICogYmFja2dyb3VuZCBpcyBub3Qgd2hhdCB0aGUgdmlldyBzaG93cy4gQW4gaXRlbSBpcyB3ZWlnaGVkIGFnYWluIHdoZW4gaXRzIG9wYWNpdHkgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE9zZFRpbGVMb2FkaW5nIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZSA9IG5ldyBMb2FkaW5nQmFkZ2VTdGF0ZSgpO1xuICAvKiogRWFjaCBpdGVtIHN0aWxsIGxvYWRpbmcsIHdpdGggdGhlIGZ1bmN0aW9uIHRoYXQgdW4tY291bnRzIGl0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmcgPSBuZXcgTWFwPExvYWRpbmdJdGVtLCAoKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdhdGNoZWQgPSBuZXcgTWFwPExvYWRpbmdJdGVtLCAoKSA9PiB2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25BZGQgPSAoZTogeyBpdGVtOiB1bmtub3duIH0pID0+IHRoaXMud2F0Y2goZS5pdGVtIGFzIExvYWRpbmdJdGVtKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblJlbW92ZSA9IChlOiB7IGl0ZW06IHVua25vd24gfSkgPT4gdGhpcy51bndhdGNoKGUuaXRlbSBhcyBMb2FkaW5nSXRlbSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IExvYWRpbmdWaWV3ZXIpIHtcbiAgICB0aGlzLnN0YXRlLmF0dGFjaCh2aWV3ZXIuZWxlbWVudCk7XG4gICAgdmlld2VyLndvcmxkLmFkZEhhbmRsZXIoJ2FkZC1pdGVtJywgdGhpcy5vbkFkZCk7XG4gICAgdmlld2VyLndvcmxkLmFkZEhhbmRsZXIoJ3JlbW92ZS1pdGVtJywgdGhpcy5vblJlbW92ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3ZXIud29ybGQuZ2V0SXRlbUNvdW50KCk7IGkrKykgdGhpcy53YXRjaCh2aWV3ZXIud29ybGQuZ2V0SXRlbUF0KGkpIGFzIExvYWRpbmdJdGVtKTtcbiAgfVxuXG4gIC8qKiBUaGUgYmFkZ2UncyB0ZXh0IChzaG93biwgb3IgYWJvdXQgdG8gYmUpLiAqL1xuICBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnRleHQ7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyLndvcmxkLnJlbW92ZUhhbmRsZXIoJ2FkZC1pdGVtJywgdGhpcy5vbkFkZCk7XG4gICAgdGhpcy52aWV3ZXIud29ybGQucmVtb3ZlSGFuZGxlcigncmVtb3ZlLWl0ZW0nLCB0aGlzLm9uUmVtb3ZlKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgWy4uLnRoaXMud2F0Y2hlZC5rZXlzKCldKSB0aGlzLnVud2F0Y2goaXRlbSk7XG4gICAgdGhpcy5zdGF0ZS5yZXNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaChpdGVtOiBMb2FkaW5nSXRlbSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghaXRlbSB8fCB0aGlzLndhdGNoZWQuaGFzKGl0ZW0pKSByZXR1cm47XG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHRoaXMuc2V0KGl0ZW0sIHRoaXMuaXNMb2FkaW5nKGl0ZW0pKTtcbiAgICB0aGlzLndhdGNoZWQuc2V0KGl0ZW0sIGhhbmRsZXIpO1xuICAgIGl0ZW0uYWRkSGFuZGxlcignZnVsbHktbG9hZGVkLWNoYW5nZScsIGhhbmRsZXIpO1xuICAgIGl0ZW0uYWRkSGFuZGxlcignb3BhY2l0eS1jaGFuZ2UnLCBoYW5kbGVyKTtcbiAgICBoYW5kbGVyKCk7XG4gIH1cblxuICBwcml2YXRlIHVud2F0Y2goaXRlbTogTG9hZGluZ0l0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy53YXRjaGVkLmdldChpdGVtKTtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgaXRlbS5yZW1vdmVIYW5kbGVyKCdmdWxseS1sb2FkZWQtY2hhbmdlJywgaGFuZGxlcik7XG4gICAgICBpdGVtLnJlbW92ZUhhbmRsZXIoJ29wYWNpdHktY2hhbmdlJywgaGFuZGxlcik7XG4gICAgfVxuICAgIHRoaXMud2F0Y2hlZC5kZWxldGUoaXRlbSk7XG4gICAgdGhpcy5zZXQoaXRlbSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGl0ZW0gaXMgb24gc2NyZWVuIGFuZCBzdGlsbCBmZXRjaGluZyBpdHMgdGlsZXMuICovXG4gIHByaXZhdGUgaXNMb2FkaW5nKGl0ZW06IExvYWRpbmdJdGVtKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3BhY2l0eSA9IHR5cGVvZiBpdGVtLmdldE9wYWNpdHkgPT09ICdmdW5jdGlvbicgPyBpdGVtLmdldE9wYWNpdHkoKSA6IDE7XG4gICAgcmV0dXJuIG9wYWNpdHkgPiAwICYmICFpdGVtLmdldEZ1bGx5TG9hZGVkKCk7XG4gIH1cblxuICBwcml2YXRlIHNldChpdGVtOiBMb2FkaW5nSXRlbSwgbG9hZGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGVuZCA9IHRoaXMubG9hZGluZy5nZXQoaXRlbSk7XG4gICAgaWYgKGxvYWRpbmcgJiYgIWVuZCkgdGhpcy5sb2FkaW5nLnNldChpdGVtLCB0aGlzLnN0YXRlLmJlZ2luKCdJbWFnZScpKTtcbiAgICBlbHNlIGlmICghbG9hZGluZyAmJiBlbmQpIHtcbiAgICAgIGVuZCgpO1xuICAgICAgdGhpcy5sb2FkaW5nLmRlbGV0ZShpdGVtKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==