@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.
- package/esm2022/index.mjs +10 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +1 -1
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
- package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
- package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
- package/esm2022/lib/models/class-preset.mjs +1 -1
- package/esm2022/lib/models/polygon-factory.mjs +17 -1
- package/esm2022/lib/models/region-geojson.mjs +44 -6
- package/esm2022/lib/models/region.mjs +1 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +77 -13
- package/esm2022/lib/region-editor/region-editor.component.mjs +670 -42
- package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
- package/esm2022/lib/region-editor/region-persistence.service.mjs +44 -10
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
- package/esm2022/lib/region-import/label-classes.mjs +149 -0
- package/esm2022/lib/region-import/label-volume.mjs +194 -0
- package/esm2022/lib/region-import/region-import.mjs +71 -0
- package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/routing-visualizer.service.mjs +510 -22
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/store/class-color.util.mjs +10 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-scope-cache.mjs +5 -1
- package/esm2022/lib/store/region-source-scope.mjs +186 -0
- package/esm2022/lib/store/region-store.service.mjs +774 -12
- package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
- package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
- package/esm2022/lib/visualizer/region-load.mjs +67 -4
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +155 -7
- 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
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
- 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
- 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
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -3
- package/fesm2022/region-source.worker.js +1067 -0
- package/index.d.ts +12 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +24 -0
- package/lib/contracts/region-editor-api.contract.d.ts +102 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/visualizer.contract.d.ts +10 -0
- package/lib/contracts/viz-config.d.ts +8 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
- package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
- package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
- package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
- package/lib/implementations/osd/slice-cache.d.ts +13 -3
- package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
- package/lib/models/class-preset.d.ts +7 -0
- package/lib/models/polygon-factory.d.ts +5 -0
- package/lib/models/region-geojson.d.ts +40 -0
- package/lib/models/region.d.ts +19 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +36 -6
- package/lib/region-editor/region-editor.component.d.ts +159 -17
- package/lib/region-editor/region-metrics.d.ts +8 -0
- package/lib/region-editor/region-persistence.service.d.ts +17 -5
- package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
- package/lib/region-import/label-classes.d.ts +39 -0
- package/lib/region-import/label-volume.d.ts +31 -0
- package/lib/region-import/region-import.d.ts +46 -0
- package/lib/region-overlay/region-geometry.d.ts +4 -3
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/routing-visualizer.service.d.ts +168 -1
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/store/class-color.util.d.ts +6 -3
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-scope-cache.d.ts +2 -0
- package/lib/store/region-source-scope.d.ts +74 -0
- package/lib/store/region-store.service.d.ts +216 -2
- package/lib/store/visualizer-store.service.d.ts +10 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
- package/lib/toolbar/toolbar.component.d.ts +9 -2
- package/lib/visualizer/region-load.d.ts +23 -4
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +40 -0
- package/package.json +2 -2
- package/src/lib/assets/slice.svg +23 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
|
@@ -162,12 +162,12 @@ export function topmostRegionAt(regions, x, y, opts = {}) {
|
|
|
162
162
|
/**
|
|
163
163
|
* Indices of every region whose bounding box intersects the world box
|
|
164
164
|
* [x0,y0]–[x1,y1] (rubber-band selection). `skipProfiles` leaves out
|
|
165
|
-
* intensity-profile lines.
|
|
165
|
+
* intensity-profile lines, `skip` any other region.
|
|
166
166
|
*/
|
|
167
167
|
export function regionsInRect(regions, x0, y0, x1, y1, opts = {}) {
|
|
168
168
|
const out = [];
|
|
169
169
|
regions.forEach((r, i) => {
|
|
170
|
-
if (opts.skipProfiles && r.isProfile?.())
|
|
170
|
+
if ((opts.skipProfiles && r.isProfile?.()) || opts.skip?.(r))
|
|
171
171
|
return;
|
|
172
172
|
const bb = regionBBox(r);
|
|
173
173
|
if (bb && bb.x0 <= x1 && bb.x1 >= x0 && bb.y0 <= y1 && bb.y1 >= y0)
|
|
@@ -357,4 +357,4 @@ export function nearestVertex(region, x, y) {
|
|
|
357
357
|
}
|
|
358
358
|
return best;
|
|
359
359
|
}
|
|
360
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWdlb21ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFnQixjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUszRCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFVaEQsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUlsQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxDQUErQjtJQUN4RCxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLElBQUksQ0FBQyxZQUFZLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUMxQyxJQUFJLENBQUMsWUFBWSxPQUFPO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsSUFBSSxDQUFDLFlBQVksWUFBWTtRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzlDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBRSxDQUE0QixDQUFDLFFBQVEsQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzFFLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3BELElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUFF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LE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUk7Z0JBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlZ2lvbi1vdmVybGF5IGdlb21ldHJ5IHNoYXJlZCBieSB0aGUgT3BlblNlYWRyYWdvbiBhbmQgbmFwYXJpIG92ZXJsYXlzXG4gKiAocmV2aWV3IE5BUEFSSS1CT1VOREFSWS0xMywgT1NELVBMT1RMWS0xNikuXG4gKlxuICogQm90aCBvdmVybGF5cyB1c2VkIHRvIGNhcnJ5IHRoZWlyIG93biBjb3B5IG9mIHRoaXMgY29kZSwgYW5kIHRoZSBjb3BpZXMgaGFkXG4gKiBkcmlmdGVkOiBuYXBhcmkncyBoaXQgdGVzdCBpZ25vcmVkIGhvbGVzLCBtdWx0aS1wYXJ0IHJlZ2lvbnMgYW5kIG9wZW5cbiAqIHBvbHlsaW5lcywgaXRzIGLDqXppZXIgcGF0aCBkcmV3IHN0cmFpZ2h0IGVkZ2VzIHdpdGhvdXQgc3RvcmVkIGhhbmRsZXMsIGFuZCBpdFxuICogcmVuZGVyZWQgbm90aGluZyBmb3IgYSBNdWx0aVBvbHlnb24uIEV2ZXJ5dGhpbmcgaGVyZSBpcyBwdXJlIOKAlCBubyBET00sIG5vXG4gKiB2aWV3ZXIg4oCUIHNvIHRoZSBvdmVybGF5cyBhcmUgbGVmdCB3aXRoIGdlc3R1cmVzIGFuZCBET00uXG4gKlxuICogQ29vcmRpbmF0ZXM6IHJlZ2lvbnMgYXJlIGluIFdPUkxEIChpbWFnZS1waXhlbCkgc3BhY2UuIEZ1bmN0aW9ucyB0aGF0IG5lZWQgYVxuICogc2NyZWVuLXNwYWNlIHRvbGVyYW5jZSAoYW4gb3BlbiBwb2x5bGluZSdzIGhpdCB3aWR0aCwgYSBoYW5kbGUncyBncmFiXG4gKiByYWRpdXMpIHRha2UgYSB7QGxpbmsgVG9TY3JlZW59IHByb2plY3Rpb24gYW5kIG1lYXN1cmUgaW4gaXRzIHBpeGVscywgc28gdGhleVxuICogc3RheSB1c2FibGUgYXQgYW55IHpvb20uIFBvaW50LWluLXJpbmcgYW5kIHJpbmcgYm91bmRzIGNvbWUgZnJvbVxuICogYGdlb21ldHJ5L3JpbmdgLlxuICovXG5pbXBvcnQgeyBNdWx0aVBvbHlnb24sIFBvbHlnb24sIFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBBbmNob3JIYW5kbGUsIHJlc29sdmVIYW5kbGVzIH0gZnJvbSAnLi4vbW9kZWxzL2Jlemllcic7XG5pbXBvcnQgeyBwb2ludEluUG9seWdvbldpdGhIb2xlcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JpbmcnO1xuXG4vKiogV29ybGQg4oaSIHNjcmVlbiBwcm9qZWN0aW9uLCBlLmcuIGltYWdlIOKGkiBlbGVtZW50IHBpeGVscy4gKi9cbmV4cG9ydCB0eXBlIFRvU2NyZWVuID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogVGhlIGlkZW50aXR5IHByb2plY3Rpb246IHBhdGggZGF0YSBzdGF5cyBpbiB3b3JsZCBjb29yZGluYXRlcy4gKi9cbmV4cG9ydCBjb25zdCBXT1JMRDogVG9TY3JlZW4gPSAoeCwgeSkgPT4gW3gsIHldO1xuXG4vKiogQW4gYXhpcy1hbGlnbmVkIGJveCAoaW5jbHVzaXZlIGNvcm5lcnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCQm94IHtcbiAgeDA6IG51bWJlcjtcbiAgeTA6IG51bWJlcjtcbiAgeDE6IG51bWJlcjtcbiAgeTE6IG51bWJlcjtcbn1cblxuLyoqIFNjcmVlbi1weCBkaXN0YW5jZSBmcm9tIGFuIG9wZW4gcG9seWxpbmUgd2l0aGluIHdoaWNoIGEgcG9pbnQgaXMgb24gaXQuICovXG5leHBvcnQgY29uc3QgT1BFTl9QQVRIX1RPTF9QWCA9IDY7XG5cbnR5cGUgQW55Qm91bmRzID0gUmVnaW9uWydib3VuZHMnXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZSBhIHJlZ2lvbidzIGJvdW5kcy4gQ2xhc3MgaW5zdGFuY2VzIGZpcnN0OyBwbGFpbiBvYmplY3RzIHdpdGggdGhlXG4gKiByaWdodCBmaWVsZHMgdG9vLCBzbyBhIHJlZ2lvbiB0aGF0IHNraXBwZWQgdGhlIHN0b3JlJ3MgaHlkcmF0aW9uIChKU09OIGZyb20gYVxuICogaG9zdCkgc3RpbGwgZHJhd3MgYW5kIGhpdC10ZXN0cyAoaml0LXVpIzEyNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3VuZHNLaW5kKGI6IEFueUJvdW5kcyB8IG51bGwgfCB1bmRlZmluZWQpOiAncmVjdCcgfCAncG9seScgfCAnbXVsdGknIHwgbnVsbCB7XG4gIGlmICghYikgcmV0dXJuIG51bGw7XG4gIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSByZXR1cm4gJ3JlY3QnO1xuICBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24pIHJldHVybiAncG9seSc7XG4gIGlmIChiIGluc3RhbmNlb2YgTXVsdGlQb2x5Z29uKSByZXR1cm4gJ211bHRpJztcbiAgaWYgKEFycmF5LmlzQXJyYXkoKGIgYXMgeyBwb2x5Z29ucz86IHVua25vd24gfSkucG9seWdvbnMpKSByZXR1cm4gJ211bHRpJztcbiAgaWYgKCd4cG9pbnRzJyBpbiBiIHx8ICducG9pbnRzJyBpbiBiKSByZXR1cm4gJ3BvbHknO1xuICBpZiAoJ3dpZHRoJyBpbiBiICYmICd4JyBpbiBiKSByZXR1cm4gJ3JlY3QnO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEEgcG9seWdvbidzIHJpbmcgYXMgcGFyYWxsZWwgYXJyYXlzOiB0aGUgZXh0ZXJpb3IgZm9yIGByaW5nYCAtMSwgZWxzZSBob2xlIGByaW5nYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByaW5nT2YocDogUG9seWdvbiwgcmluZzogbnVtYmVyKTogeyB4czogbnVtYmVyW107IHlzOiBudW1iZXJbXSB9IHtcbiAgaWYgKHJpbmcgPCAwKSByZXR1cm4geyB4czogcC54cG9pbnRzLCB5czogcC55cG9pbnRzIH07XG4gIGNvbnN0IHB0cyA9IHAuaG9sZXM/LltyaW5nXSA/PyBbXTtcbiAgcmV0dXJuIHsgeHM6IHB0cy5tYXAoKHEpID0+IHFbMF0pLCB5czogcHRzLm1hcCgocSkgPT4gcVsxXSkgfTtcbn1cblxuLyoqXG4gKiBBIHBvbHlnb24gcmluZydzIGLDqXppZXIgaGFuZGxlcyAoYWJzb2x1dGUsIHdvcmxkIHNwYWNlKTogdGhlIHN0b3JlZCBvZmZzZXRzXG4gKiB3aGVuIHByZXNlbnQsIGVsc2UgdGhlIENhdG11bGwtUm9tIGRlZmF1bHQgdGhlIGN1cnZlIGlzIGRyYXduIHdpdGguIEhvbGVzIGFyZVxuICogYWx3YXlzIGNsb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJpbmdIYW5kbGVzKHA6IFBvbHlnb24sIHJpbmc6IG51bWJlcik6IEFuY2hvckhhbmRsZVtdIHtcbiAgY29uc3QgeyB4cywgeXMgfSA9IHJpbmdPZihwLCByaW5nKTtcbiAgcmV0dXJuIHJpbmcgPCAwXG4gICAgPyByZXNvbHZlSGFuZGxlcyh4cywgeXMsIHAuY2xvc2VkICE9PSBmYWxzZSwgcC5oYW5kbGVzSW4sIHAuaGFuZGxlc091dClcbiAgICA6IHJlc29sdmVIYW5kbGVzKHhzLCB5cywgdHJ1ZSwgcC5ob2xlSGFuZGxlc0luPy5bcmluZ10sIHAuaG9sZUhhbmRsZXNPdXQ/LltyaW5nXSk7XG59XG5cbi8qKiBUaGUgcmluZ3Mgb2YgYSBwb2x5Z29uLCBleHRlcmlvciBmaXJzdDogLTEsIHRoZW4gZWFjaCBob2xlIGluZGV4LiAqL1xuZnVuY3Rpb24gcmluZ0luZGljZXMocDogUG9seWdvbik6IG51bWJlcltdIHtcbiAgcmV0dXJuIFstMSwgLi4uKHAuaG9sZXMgPz8gW10pLm1hcCgoXywgaSkgPT4gaSldO1xufVxuXG4vLyDilIDilIAgYm91bmRzIGFuZCBjb250YWlubWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHJlZ2lvbidzIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggaW4gd29ybGQgY29vcmRpbmF0ZXMgKGV2ZXJ5IHBhcnQgb2YgYVxuICogbXVsdGktcG9seWdvbiksIG9yIG51bGwgZm9yIGVtcHR5IGdlb21ldHJ5LiBMb29wcyByYXRoZXIgdGhhblxuICogYE1hdGgubWluKC4uLnNwcmVhZClgLCB3aGljaCB0aHJvd3Mgb24gYSBsYXJnZSBpbXBvcnRlZCBhbm5vdGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uQkJveChyZWdpb246IFBpY2s8UmVnaW9uLCAnYm91bmRzJz4pOiBCQm94IHwgbnVsbCB7XG4gIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICBjb25zdCBraW5kID0gYm91bmRzS2luZChiKTtcbiAgaWYgKGtpbmQgPT09ICdyZWN0Jykge1xuICAgIGNvbnN0IHIgPSBiIGFzIFJlY3RhbmdsZTtcbiAgICByZXR1cm4geyB4MDogci54LCB5MDogci55LCB4MTogci54ICsgci53aWR0aCwgeTE6IHIueSArIHIuaGVpZ2h0IH07XG4gIH1cbiAgaWYgKCFraW5kKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFydHMgPSBraW5kID09PSAncG9seScgPyBbYiBhcyBQb2x5Z29uXSA6IChiIGFzIE11bHRpUG9seWdvbikucG9seWdvbnM7XG4gIGxldCB4MCA9IEluZmluaXR5LFxuICAgIHkwID0gSW5maW5pdHksXG4gICAgeDEgPSAtSW5maW5pdHksXG4gICAgeTEgPSAtSW5maW5pdHk7XG4gIGZvciAoY29uc3QgcCBvZiBwYXJ0cykge1xuICAgIGNvbnN0IHhzID0gcC54cG9pbnRzID8/IFtdLFxuICAgICAgeXMgPSBwLnlwb2ludHMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHhzW2ldIDwgeDApIHgwID0geHNbaV07XG4gICAgICBpZiAoeHNbaV0gPiB4MSkgeDEgPSB4c1tpXTtcbiAgICAgIGlmICh5c1tpXSA8IHkwKSB5MCA9IHlzW2ldO1xuICAgICAgaWYgKHlzW2ldID4geTEpIHkxID0geXNbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiB4MSA+PSB4MCA/IHsgeDAsIHkwLCB4MSwgeTEgfSA6IG51bGw7XG59XG5cbi8qKiBTaG9ydGVzdCBkaXN0YW5jZSBmcm9tIChweCxweSkgdG8gdGhlIHNlZ21lbnQgKGF4LGF5KeKAkyhieCxieSksIGluIHRoZSB1bml0cyBnaXZlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWdtZW50RGlzdGFuY2UocHg6IG51bWJlciwgcHk6IG51bWJlciwgYXg6IG51bWJlciwgYXk6IG51bWJlciwgYng6IG51bWJlciwgYnk6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGR4ID0gYnggLSBheCxcbiAgICBkeSA9IGJ5IC0gYXk7XG4gIGNvbnN0IGxlbjIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgaWYgKGxlbjIgPT09IDApIHJldHVybiBNYXRoLmh5cG90KHB4IC0gYXgsIHB5IC0gYXkpO1xuICBsZXQgdCA9ICgocHggLSBheCkgKiBkeCArIChweSAtIGF5KSAqIGR5KSAvIGxlbjI7XG4gIHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSk7XG4gIHJldHVybiBNYXRoLmh5cG90KHB4IC0gKGF4ICsgdCAqIGR4KSwgcHkgLSAoYXkgKyB0ICogZHkpKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayByZWdpb25Db250YWluc30uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5zT3B0aW9ucyB7XG4gIC8qKiBQcm9qZWN0aW9uIHRoZSBvcGVuLXBvbHlsaW5lIHRvbGVyYW5jZSBpcyBtZWFzdXJlZCBpbi4gRGVmYXVsdDogd29ybGQgdW5pdHMuICovXG4gIHRvU2NyZWVuPzogVG9TY3JlZW47XG4gIC8qKiBPcGVuLXBvbHlsaW5lIGhpdCB3aWR0aCwgaW4gYHRvU2NyZWVuYCBwaXhlbHMuIERlZmF1bHQge0BsaW5rIE9QRU5fUEFUSF9UT0xfUFh9LiAqL1xuICB0b2xQeD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHdvcmxkIHBvaW50ICh4LCB5KSBsYW5kcyBvbiBgcmVnaW9uYDogYSByZWN0YW5nbGUgYnkgaXRzIChpbmNsdXNpdmUpXG4gKiBib3g7IGEgY2xvc2VkIHBvbHlnb24gYnkgaXRzIGV4dGVyaW9yIG1pbnVzIGl0cyBob2xlczsgYSBtdWx0aS1wb2x5Z29uIGJ5IGFueVxuICogcGFydCAobWludXMgdGhhdCBwYXJ0J3MgaG9sZXMpOyBhbiBvcGVuIHBvbHlsaW5lIOKAlCB3aGljaCBoYXMgbm8gaW50ZXJpb3Ig4oCUXG4gKiB3aXRoaW4gYHRvbFB4YCBzY3JlZW4gcGl4ZWxzIG9mIGl0cyBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uQ29udGFpbnMoXG4gIHJlZ2lvbjogUGljazxSZWdpb24sICdib3VuZHMnPixcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIG9wdHM6IENvbnRhaW5zT3B0aW9ucyA9IHt9LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICBzd2l0Y2ggKGJvdW5kc0tpbmQoYikpIHtcbiAgICBjYXNlICdyZWN0Jzoge1xuICAgICAgY29uc3QgciA9IGIgYXMgUmVjdGFuZ2xlO1xuICAgICAgcmV0dXJuIHggPj0gci54ICYmIHggPD0gci54ICsgci53aWR0aCAmJiB5ID49IHIueSAmJiB5IDw9IHIueSArIHIuaGVpZ2h0O1xuICAgIH1cbiAgICBjYXNlICdtdWx0aSc6XG4gICAgICByZXR1cm4gKGIgYXMgTXVsdGlQb2x5Z29uKS5wb2x5Z29ucy5zb21lKChwKSA9PiBjbG9zZWRDb250YWlucyhwLCB4LCB5KSk7XG4gICAgY2FzZSAncG9seSc6IHtcbiAgICAgIGNvbnN0IHAgPSBiIGFzIFBvbHlnb247XG4gICAgICBpZiAocC5jbG9zZWQgIT09IGZhbHNlKSByZXR1cm4gY2xvc2VkQ29udGFpbnMocCwgeCwgeSk7XG4gICAgICByZXR1cm4gbmVhclBvbHlsaW5lKHAueHBvaW50cywgcC55cG9pbnRzLCB4LCB5LCBvcHRzLnRvU2NyZWVuID8/IFdPUkxELCBvcHRzLnRvbFB4ID8/IE9QRU5fUEFUSF9UT0xfUFgpO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlZENvbnRhaW5zKHA6IFBvbHlnb24sIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBwb2ludEluUG9seWdvbldpdGhIb2xlcyh4LCB5LCBwLnhwb2ludHMgPz8gW10sIHAueXBvaW50cyA/PyBbXSwgcC5ob2xlcyk7XG59XG5cbmZ1bmN0aW9uIG5lYXJQb2x5bGluZSh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHRvU2NyZWVuOiBUb1NjcmVlbiwgdG9sOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHhzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgW3B4LCBweV0gPSB0b1NjcmVlbih4LCB5KTtcbiAgbGV0IFtheCwgYXldID0gdG9TY3JlZW4oeHNbMF0sIHlzWzBdKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IFtieCwgYnldID0gdG9TY3JlZW4oeHNbaV0sIHlzW2ldKTtcbiAgICBpZiAoc2VnbWVudERpc3RhbmNlKHB4LCBweSwgYXgsIGF5LCBieCwgYnkpIDw9IHRvbCkgcmV0dXJuIHRydWU7XG4gICAgYXggPSBieDtcbiAgICBheSA9IGJ5O1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIEluZGV4IG9mIHRoZSB0b3Btb3N0IChsYXN0KSByZWdpb24gY29udGFpbmluZyAoeCwgeSksIG9yIC0xLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvcG1vc3RSZWdpb25BdChcbiAgcmVnaW9uczogUmVhZG9ubHlBcnJheTxQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+PixcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIG9wdHM6IENvbnRhaW5zT3B0aW9ucyAmIHsgc2tpcD86IChyOiBQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+KSA9PiBib29sZWFuIH0gPSB7fSxcbik6IG51bWJlciB7XG4gIGZvciAobGV0IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKG9wdHMuc2tpcD8uKHJlZ2lvbnNbaV0pKSBjb250aW51ZTtcbiAgICBpZiAocmVnaW9uQ29udGFpbnMocmVnaW9uc1tpXSwgeCwgeSwgb3B0cykpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBJbmRpY2VzIG9mIGV2ZXJ5IHJlZ2lvbiB3aG9zZSBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB0aGUgd29ybGQgYm94XG4gKiBbeDAseTBd4oCTW3gxLHkxXSAocnViYmVyLWJhbmQgc2VsZWN0aW9uKS4gYHNraXBQcm9maWxlc2AgbGVhdmVzIG91dFxuICogaW50ZW5zaXR5LXByb2ZpbGUgbGluZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25zSW5SZWN0KFxuICByZWdpb25zOiBSZWFkb25seUFycmF5PFJlZ2lvbj4sXG4gIHgwOiBudW1iZXIsXG4gIHkwOiBudW1iZXIsXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIG9wdHM6IHsgc2tpcFByb2ZpbGVzPzogYm9vbGVhbiB9ID0ge30sXG4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgcmVnaW9ucy5mb3JFYWNoKChyLCBpKSA9PiB7XG4gICAgaWYgKG9wdHMuc2tpcFByb2ZpbGVzICYmIHIuaXNQcm9maWxlPy4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IGJiID0gcmVnaW9uQkJveChyKTtcbiAgICBpZiAoYmIgJiYgYmIueDAgPD0geDEgJiYgYmIueDEgPj0geDAgJiYgYmIueTAgPD0geTEgJiYgYmIueTEgPj0geTApIG91dC5wdXNoKGkpO1xuICB9KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLy8g4pSA4pSAIFNWRyBwYXRoIGRhdGEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBUaGUgaGFuZGxlIG9mZnNldHMgYSBiw6l6aWVyIHJpbmcgaXMgZHJhd24gd2l0aDsgYWJzZW50IGFycmF5cyBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpbmdIYW5kbGVPZmZzZXRzIHtcbiAgaW4/OiBudW1iZXJbXVtdO1xuICBvdXQ/OiBudW1iZXJbXVtdO1xufVxuXG4vKipcbiAqIFNWRyBwYXRoIGBkYCBmb3Igb25lIHJpbmcgb3IgcG9seWxpbmUsIHByb2plY3RlZCB0aHJvdWdoIGB0b1NjcmVlbmAuXG4gKiBTdHJhaWdodCBlZGdlcyB3aXRob3V0IGBoYW5kbGVzYDsgd2l0aCBgaGFuZGxlc2AsIGN1YmljIHNlZ21lbnRzIHRocm91Z2ggdGhlXG4gKiBzdG9yZWQgb2Zmc2V0cywgb3IgdGhlIENhdG11bGwtUm9tIGRlZmF1bHQgd2hlbiB0aGV5IGFyZSBtaXNzaW5nIG9yIGRvIG5vdFxuICogbWF0Y2ggdGhlIHJpbmcgKHZpYSBgcmVzb2x2ZUhhbmRsZXNgKS4gQ2xvc2VkIHJpbmdzIGVuZCBpbiBgWmAuICcnIGZvciBmZXdlclxuICogdGhhbiB0d28gdmVydGljZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByaW5nUGF0aEQoXG4gIHhzOiBudW1iZXJbXSxcbiAgeXM6IG51bWJlcltdLFxuICBjbG9zZWQ6IGJvb2xlYW4sXG4gIHRvU2NyZWVuOiBUb1NjcmVlbixcbiAgaGFuZGxlcz86IFJpbmdIYW5kbGVPZmZzZXRzLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbiA9IE1hdGgubWluKHhzLmxlbmd0aCwgeXMubGVuZ3RoKTtcbiAgaWYgKG4gPCAyKSByZXR1cm4gJyc7XG4gIGNvbnN0IHB0ID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgcSA9IHRvU2NyZWVuKHgsIHkpO1xuICAgIHJldHVybiBgJHtxWzBdfSwke3FbMV19YDtcbiAgfTtcbiAgbGV0IGQgPSBgTSAke3B0KHhzWzBdLCB5c1swXSl9YDtcbiAgaWYgKGhhbmRsZXMpIHtcbiAgICBjb25zdCBoID0gcmVzb2x2ZUhhbmRsZXMoeHMsIHlzLCBjbG9zZWQsIGhhbmRsZXMuaW4sIGhhbmRsZXMub3V0KTtcbiAgICBjb25zdCBzZWdzID0gY2xvc2VkID8gbiA6IG4gLSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnczsgaSsrKSB7XG4gICAgICBjb25zdCBqID0gKGkgKyAxKSAlIG47XG4gICAgICBkICs9IGAgQyAke3B0KGhbaV0ub3V0WzBdLCBoW2ldLm91dFsxXSl9ICR7cHQoaFtqXS5pblswXSwgaFtqXS5pblsxXSl9ICR7cHQoeHNbal0sIHlzW2pdKX1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG47IGkrKykgZCArPSBgIEwgJHtwdCh4c1tpXSwgeXNbaV0pfWA7XG4gIH1cbiAgcmV0dXJuIGNsb3NlZCA/IGQgKyAnIFonIDogZDtcbn1cblxuLyoqXG4gKiBTVkcgcGF0aCBgZGAgZm9yIGEgd2hvbGUgcmVnaW9uOiBhIHJlY3RhbmdsZSdzIGZvdXIgY29ybmVyczsgYSBwb2x5Z29uJ3NcbiAqIGV4dGVyaW9yIChjdXJ2ZWQgZm9yIGEgYsOpemllciByZWdpb24pIGZvbGxvd2VkIGJ5IG9uZSBzdWJwYXRoIHBlciBob2xlXG4gKiAoY3VydmVkIHRvbyBmb3IgYSBiw6l6aWVyIGRvbnV0KTsgYSBtdWx0aS1wb2x5Z29uJ3MgcGFydHMgd2l0aCB0aGVpciBob2xlcy5cbiAqIEhvbGVzIG5lZWQgYGZpbGwtcnVsZTogZXZlbm9kZGAgKHNlZSB7QGxpbmsgcmVnaW9uSGFzSG9sZXN9KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lvblBhdGhEKHJlZ2lvbjogUGljazxSZWdpb24sICdib3VuZHMnPiwgdG9TY3JlZW46IFRvU2NyZWVuID0gV09STEQpOiBzdHJpbmcge1xuICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgc3dpdGNoIChib3VuZHNLaW5kKGIpKSB7XG4gICAgY2FzZSAncmVjdCc6IHtcbiAgICAgIGNvbnN0IHIgPSBiIGFzIFJlY3RhbmdsZTtcbiAgICAgIHJldHVybiByaW5nUGF0aEQoXG4gICAgICAgIFtyLngsIHIueCArIHIud2lkdGgsIHIueCArIHIud2lkdGgsIHIueF0sXG4gICAgICAgIFtyLnksIHIueSwgci55ICsgci5oZWlnaHQsIHIueSArIHIuaGVpZ2h0XSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdG9TY3JlZW4sXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHJldHVybiBwb2x5Z29uUGF0aEQoYiBhcyBQb2x5Z29uLCB0b1NjcmVlbiwgdHJ1ZSk7XG4gICAgY2FzZSAnbXVsdGknOlxuICAgICAgcmV0dXJuIChiIGFzIE11bHRpUG9seWdvbikucG9seWdvbnNcbiAgICAgICAgLmZpbHRlcigocCkgPT4gKHAueHBvaW50cz8ubGVuZ3RoID8/IDApID49IDMpXG4gICAgICAgIC5tYXAoKHApID0+IHBvbHlnb25QYXRoRChwLCB0b1NjcmVlbiwgZmFsc2UpKVxuICAgICAgICAuam9pbignICcpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9seWdvblBhdGhEKHA6IFBvbHlnb24sIHRvU2NyZWVuOiBUb1NjcmVlbiwgYWxsb3dCZXppZXI6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBjbG9zZWQgPSBwLmNsb3NlZCAhPT0gZmFsc2U7XG4gIGNvbnN0IGJlemllciA9IGFsbG93QmV6aWVyICYmICEhcC5iZXppZXIgJiYgKHAueHBvaW50cz8ubGVuZ3RoID8/IDApID49IDI7XG4gIGxldCBkID0gcmluZ1BhdGhEKFxuICAgIHAueHBvaW50cyA/PyBbXSxcbiAgICBwLnlwb2ludHMgPz8gW10sXG4gICAgY2xvc2VkLFxuICAgIHRvU2NyZWVuLFxuICAgIGJlemllciA/IHsgaW46IHAuaGFuZGxlc0luLCBvdXQ6IHAuaGFuZGxlc091dCB9IDogdW5kZWZpbmVkLFxuICApO1xuICBpZiAoIWNsb3NlZCkgcmV0dXJuIGQ7XG4gIChwLmhvbGVzID8/IFtdKS5mb3JFYWNoKChyaW5nLCBoaSkgPT4ge1xuICAgIGlmIChyaW5nLmxlbmd0aCA8IDMpIHJldHVybjtcbiAgICBjb25zdCB7IHhzLCB5cyB9ID0gcmluZ09mKHAsIGhpKTtcbiAgICBkICs9XG4gICAgICAnICcgK1xuICAgICAgcmluZ1BhdGhEKFxuICAgICAgICB4cyxcbiAgICAgICAgeXMsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRvU2NyZWVuLFxuICAgICAgICBiZXppZXIgPyB7IGluOiBwLmhvbGVIYW5kbGVzSW4/LltoaV0sIG91dDogcC5ob2xlSGFuZGxlc091dD8uW2hpXSB9IDogdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgfSk7XG4gIHJldHVybiBkO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoZSByZWdpb24gZHJhd3MgYXMgc2V2ZXJhbCBzdWJwYXRocyB0aGF0IG5lZWQgYGZpbGwtcnVsZTogZXZlbm9kZGAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uSGFzSG9sZXMocmVnaW9uOiBQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICBjb25zdCBraW5kID0gYm91bmRzS2luZChiKTtcbiAgaWYgKGtpbmQgPT09ICdtdWx0aScpIHJldHVybiB0cnVlO1xuICBpZiAoa2luZCAhPT0gJ3BvbHknKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHAgPSBiIGFzIFBvbHlnb247XG4gIHJldHVybiBwLmNsb3NlZCAhPT0gZmFsc2UgJiYgISFwLmhvbGVzPy5sZW5ndGg7XG59XG5cbi8vIOKUgOKUgCBoYW5kbGUgaGl0IHRlc3RpbmcgKHNjcmVlbiBzcGFjZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBXaGF0IGEgcG9pbnRlciBncmFiYmVkIG9uIHRoZSBzZWxlY3RlZCByZWdpb24gKHNlZSB7QGxpbmsgaGl0SGFuZGxlfSkuICovXG5leHBvcnQgdHlwZSBIYW5kbGVIaXQgPVxuICAvKiogQSByZWN0YW5nbGUgY29ybmVyOyBgYW5jaG9yYCBpcyB0aGUgb3Bwb3NpdGUgKGZpeGVkKSBjb3JuZXIgZm9yIGEgcmVzaXplLiAqL1xuICB8IHsga2luZDogJ2Nvcm5lcic7IGluZGV4OiBudW1iZXI7IGFuY2hvcjogW251bWJlciwgbnVtYmVyXSB9XG4gIC8qKiBBIHBvbHlnb24gdmVydGV4OiBgcmluZ2AgLTEgZm9yIHRoZSBleHRlcmlvciwgZWxzZSB0aGUgaG9sZSBpbmRleC4gKi9cbiAgfCB7IGtpbmQ6ICd2ZXJ0ZXgnOyByaW5nOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVxuICAvKiogQSBiw6l6aWVyIGNvbnRyb2wgcG9pbnQgb2YgdmVydGV4IGBpbmRleGAgb24gYHJpbmdgLiAqL1xuICB8IHsga2luZDogJ2Jlemllcic7IHJpbmc6IG51bWJlcjsgaW5kZXg6IG51bWJlcjsgc2lkZTogJ2luJyB8ICdvdXQnIH07XG5cbi8qKlxuICogVGhlIGhhbmRsZSBvZiBgcmVnaW9uYCB1bmRlciBzY3JlZW4gcG9pbnQgKHN4LCBzeSkgd2l0aGluIGByYWRpdXNgIHNjcmVlblxuICogcGl4ZWxzLCBvciBudWxsLiBSZWN0YW5nbGVzIGhhdmUgZm91ciBjb3JuZXJzLiBQb2x5Z29uczogZXZlcnkgYsOpemllclxuICogY29udHJvbCBwb2ludCBmaXJzdCAoZXh0ZXJpb3IsIHRoZW4gZWFjaCBob2xlOyB0aGV5IHNpdCBvZmYgdGhlIGFuY2hvcnMsIHNvXG4gKiB0aGV5IG11c3Qgd2luKSwgdGhlbiB0aGUgdmVydGljZXMgKGV4dGVyaW9yLCB0aGVuIGVhY2ggaG9sZSkuIFBhc3NcbiAqIGB7IGJlemllcjogZmFsc2UgfWAgdG8gdGVzdCB2ZXJ0aWNlcyBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGl0SGFuZGxlKFxuICByZWdpb246IFBpY2s8UmVnaW9uLCAnYm91bmRzJz4sXG4gIHN4OiBudW1iZXIsXG4gIHN5OiBudW1iZXIsXG4gIHRvU2NyZWVuOiBUb1NjcmVlbixcbiAgcmFkaXVzOiBudW1iZXIsXG4gIG9wdHM6IHsgYmV6aWVyPzogYm9vbGVhbiB9ID0ge30sXG4pOiBIYW5kbGVIaXQgfCBudWxsIHtcbiAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gIGNvbnN0IG5lYXIgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBxID0gdG9TY3JlZW4oeCwgeSk7XG4gICAgcmV0dXJuIE1hdGguaHlwb3Qoc3ggLSBxWzBdLCBzeSAtIHFbMV0pIDw9IHJhZGl1cztcbiAgfTtcbiAgY29uc3Qga2luZCA9IGJvdW5kc0tpbmQoYik7XG4gIGlmIChraW5kID09PSAncmVjdCcpIHtcbiAgICBjb25zdCByID0gYiBhcyBSZWN0YW5nbGU7XG4gICAgY29uc3QgeDAgPSByLngsXG4gICAgICB5MCA9IHIueSxcbiAgICAgIHgxID0gci54ICsgci53aWR0aCxcbiAgICAgIHkxID0gci55ICsgci5oZWlnaHQ7XG4gICAgY29uc3QgY29ybmVyczogQXJyYXk8W251bWJlciwgbnVtYmVyLCBbbnVtYmVyLCBudW1iZXJdXT4gPSBbXG4gICAgICBbeDAsIHkwLCBbeDEsIHkxXV0sXG4gICAgICBbeDEsIHkwLCBbeDAsIHkxXV0sXG4gICAgICBbeDAsIHkxLCBbeDEsIHkwXV0sXG4gICAgICBbeDEsIHkxLCBbeDAsIHkwXV0sXG4gICAgXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvcm5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuZWFyKGNvcm5lcnNbaV1bMF0sIGNvcm5lcnNbaV1bMV0pKSByZXR1cm4geyBraW5kOiAnY29ybmVyJywgaW5kZXg6IGksIGFuY2hvcjogY29ybmVyc1tpXVsyXSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoa2luZCAhPT0gJ3BvbHknKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcCA9IGIgYXMgUG9seWdvbjtcbiAgY29uc3QgcmluZ3MgPSByaW5nSW5kaWNlcyhwKTtcbiAgaWYgKG9wdHMuYmV6aWVyICE9PSBmYWxzZSAmJiBwLmJlemllcikge1xuICAgIGZvciAoY29uc3QgcmluZyBvZiByaW5ncykge1xuICAgICAgY29uc3QgaGFuZGxlcyA9IHJpbmdIYW5kbGVzKHAsIHJpbmcpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGggPSBoYW5kbGVzW2ldO1xuICAgICAgICBpZiAoaC5oYXNPdXQgJiYgbmVhcihoLm91dFswXSwgaC5vdXRbMV0pKSByZXR1cm4geyBraW5kOiAnYmV6aWVyJywgcmluZywgaW5kZXg6IGksIHNpZGU6ICdvdXQnIH07XG4gICAgICAgIGlmIChoLmhhc0luICYmIG5lYXIoaC5pblswXSwgaC5pblsxXSkpIHJldHVybiB7IGtpbmQ6ICdiZXppZXInLCByaW5nLCBpbmRleDogaSwgc2lkZTogJ2luJyB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IHJpbmcgb2YgcmluZ3MpIHtcbiAgICBjb25zdCB7IHhzLCB5cyB9ID0gcmluZ09mKHAsIHJpbmcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuZWFyKHhzW2ldLCB5c1tpXSkpIHJldHVybiB7IGtpbmQ6ICd2ZXJ0ZXgnLCByaW5nLCBpbmRleDogaSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgcG9seWdvbiBlZGdlIG5lYXJlc3Qgc2NyZWVuIHBvaW50IChzeCwgc3kpLCBhY3Jvc3MgdGhlIGV4dGVyaW9yIGFuZCBldmVyeVxuICogaG9sZTogaXRzIHJpbmcgKC0xID0gZXh0ZXJpb3IpLCB0aGUgaW5kZXggb2YgaXRzIHN0YXJ0IHZlcnRleCwgYW5kIHRoZVxuICogZGlzdGFuY2UgaW4gc2NyZWVuIHBpeGVscy4gTnVsbCB3aGVuIHRoZSByZWdpb24gaXMgbm90IGEgcG9seWdvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lYXJlc3RFZGdlKFxuICByZWdpb246IFBpY2s8UmVnaW9uLCAnYm91bmRzJz4sXG4gIHN4OiBudW1iZXIsXG4gIHN5OiBudW1iZXIsXG4gIHRvU2NyZWVuOiBUb1NjcmVlbixcbik6IHsgcmluZzogbnVtYmVyOyBzZWdJbmRleDogbnVtYmVyOyBkaXN0OiBudW1iZXIgfSB8IG51bGwge1xuICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgaWYgKGJvdW5kc0tpbmQoYikgIT09ICdwb2x5JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHAgPSBiIGFzIFBvbHlnb247XG4gIGxldCBiZXN0OiB7IHJpbmc6IG51bWJlcjsgc2VnSW5kZXg6IG51bWJlcjsgZGlzdDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgZm9yIChjb25zdCByaW5nIG9mIHJpbmdJbmRpY2VzKHApKSB7XG4gICAgY29uc3QgeyB4cywgeXMgfSA9IHJpbmdPZihwLCByaW5nKTtcbiAgICBjb25zdCBuID0geHMubGVuZ3RoO1xuICAgIGNvbnN0IHNlZ3MgPSByaW5nID49IDAgfHwgcC5jbG9zZWQgIT09IGZhbHNlID8gbiA6IG4gLSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnczsgaSsrKSB7XG4gICAgICBjb25zdCBqID0gKGkgKyAxKSAlIG47XG4gICAgICBjb25zdCBhID0gdG9TY3JlZW4oeHNbaV0sIHlzW2ldKTtcbiAgICAgIGNvbnN0IGMgPSB0b1NjcmVlbih4c1tqXSwgeXNbal0pO1xuICAgICAgY29uc3QgZGlzdCA9IHNlZ21lbnREaXN0YW5jZShzeCwgc3ksIGFbMF0sIGFbMV0sIGNbMF0sIGNbMV0pO1xuICAgICAgaWYgKCFiZXN0IHx8IGRpc3QgPCBiZXN0LmRpc3QpIGJlc3QgPSB7IHJpbmcsIHNlZ0luZGV4OiBpLCBkaXN0IH07XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuXG4vKipcbiAqIFRoZSBwb2x5Z29uIHZlcnRleCBuZWFyZXN0IHdvcmxkIHBvaW50ICh4LCB5KSwgYWNyb3NzIHRoZSBleHRlcmlvciBhbmQgZXZlcnlcbiAqIGhvbGUsIHdpdGggaXRzIGRpc3RhbmNlIGluIHdvcmxkIHVuaXRzLiBOdWxsIHdoZW4gdGhlIHJlZ2lvbiBpcyBub3QgYVxuICogcG9seWdvbiBvciBoYXMgbm8gdmVydGljZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWFyZXN0VmVydGV4KFxuICByZWdpb246IFBpY2s8UmVnaW9uLCAnYm91bmRzJz4sXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogeyByaW5nOiBudW1iZXI7IGluZGV4OiBudW1iZXI7IGRpc3Q6IG51bWJlciB9IHwgbnVsbCB7XG4gIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICBpZiAoYm91bmRzS2luZChiKSAhPT0gJ3BvbHknKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcCA9IGIgYXMgUG9seWdvbjtcbiAgbGV0IGJlc3Q6IHsgcmluZzogbnVtYmVyOyBpbmRleDogbnVtYmVyOyBkaXN0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBmb3IgKGNvbnN0IHJpbmcgb2YgcmluZ0luZGljZXMocCkpIHtcbiAgICBjb25zdCB7IHhzLCB5cyB9ID0gcmluZ09mKHAsIHJpbmcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLmh5cG90KHhzW2ldIC0geCwgeXNbaV0gLSB5KTtcbiAgICAgIGlmICghYmVzdCB8fCBkaXN0IDwgYmVzdC5kaXN0KSBiZXN0ID0geyByaW5nLCBpbmRleDogaSwgZGlzdCB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmVzdDtcbn1cbiJdfQ==
|
|
360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWdlb21ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFnQixjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUszRCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFVaEQsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUlsQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxDQUErQjtJQUN4RCxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLElBQUksQ0FBQyxZQUFZLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUMxQyxJQUFJLENBQUMsWUFBWSxPQUFPO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsSUFBSSxDQUFDLFlBQVksWUFBWTtRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzlDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBRSxDQUE0QixDQUFDLFFBQVEsQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzFFLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3BELElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUFF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QUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDaEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlGLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMs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TUFBTSxJQUFJLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSTtnQkFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVnaW9uLW92ZXJsYXkgZ2VvbWV0cnkgc2hhcmVkIGJ5IHRoZSBPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmkgb3ZlcmxheXNcbiAqIChyZXZpZXcgTkFQQVJJLUJPVU5EQVJZLTEzLCBPU0QtUExPVExZLTE2KS5cbiAqXG4gKiBCb3RoIG92ZXJsYXlzIHVzZWQgdG8gY2FycnkgdGhlaXIgb3duIGNvcHkgb2YgdGhpcyBjb2RlLCBhbmQgdGhlIGNvcGllcyBoYWRcbiAqIGRyaWZ0ZWQ6IG5hcGFyaSdzIGhpdCB0ZXN0IGlnbm9yZWQgaG9sZXMsIG11bHRpLXBhcnQgcmVnaW9ucyBhbmQgb3BlblxuICogcG9seWxpbmVzLCBpdHMgYsOpemllciBwYXRoIGRyZXcgc3RyYWlnaHQgZWRnZXMgd2l0aG91dCBzdG9yZWQgaGFuZGxlcywgYW5kIGl0XG4gKiByZW5kZXJlZCBub3RoaW5nIGZvciBhIE11bHRpUG9seWdvbi4gRXZlcnl0aGluZyBoZXJlIGlzIHB1cmUg4oCUIG5vIERPTSwgbm9cbiAqIHZpZXdlciDigJQgc28gdGhlIG92ZXJsYXlzIGFyZSBsZWZ0IHdpdGggZ2VzdHVyZXMgYW5kIERPTS5cbiAqXG4gKiBDb29yZGluYXRlczogcmVnaW9ucyBhcmUgaW4gV09STEQgKGltYWdlLXBpeGVsKSBzcGFjZS4gRnVuY3Rpb25zIHRoYXQgbmVlZCBhXG4gKiBzY3JlZW4tc3BhY2UgdG9sZXJhbmNlIChhbiBvcGVuIHBvbHlsaW5lJ3MgaGl0IHdpZHRoLCBhIGhhbmRsZSdzIGdyYWJcbiAqIHJhZGl1cykgdGFrZSBhIHtAbGluayBUb1NjcmVlbn0gcHJvamVjdGlvbiBhbmQgbWVhc3VyZSBpbiBpdHMgcGl4ZWxzLCBzbyB0aGV5XG4gKiBzdGF5IHVzYWJsZSBhdCBhbnkgem9vbS4gUG9pbnQtaW4tcmluZyBhbmQgcmluZyBib3VuZHMgY29tZSBmcm9tXG4gKiBgZ2VvbWV0cnkvcmluZ2AuXG4gKi9cbmltcG9ydCB7IE11bHRpUG9seWdvbiwgUG9seWdvbiwgUmVjdGFuZ2xlLCBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IEFuY2hvckhhbmRsZSwgcmVzb2x2ZUhhbmRsZXMgfSBmcm9tICcuLi9tb2RlbHMvYmV6aWVyJztcbmltcG9ydCB7IHBvaW50SW5Qb2x5Z29uV2l0aEhvbGVzIH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmluZyc7XG5cbi8qKiBXb3JsZCDihpIgc2NyZWVuIHByb2plY3Rpb24sIGUuZy4gaW1hZ2Ug4oaSIGVsZW1lbnQgcGl4ZWxzLiAqL1xuZXhwb3J0IHR5cGUgVG9TY3JlZW4gPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl07XG5cbi8qKiBUaGUgaWRlbnRpdHkgcHJvamVjdGlvbjogcGF0aCBkYXRhIHN0YXlzIGluIHdvcmxkIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IGNvbnN0IFdPUkxEOiBUb1NjcmVlbiA9ICh4LCB5KSA9PiBbeCwgeV07XG5cbi8qKiBBbiBheGlzLWFsaWduZWQgYm94IChpbmNsdXNpdmUgY29ybmVycykuICovXG5leHBvcnQgaW50ZXJmYWNlIEJCb3gge1xuICB4MDogbnVtYmVyO1xuICB5MDogbnVtYmVyO1xuICB4MTogbnVtYmVyO1xuICB5MTogbnVtYmVyO1xufVxuXG4vKiogU2NyZWVuLXB4IGRpc3RhbmNlIGZyb20gYW4gb3BlbiBwb2x5bGluZSB3aXRoaW4gd2hpY2ggYSBwb2ludCBpcyBvbiBpdC4gKi9cbmV4cG9ydCBjb25zdCBPUEVOX1BBVEhfVE9MX1BYID0gNjtcblxudHlwZSBBbnlCb3VuZHMgPSBSZWdpb25bJ2JvdW5kcyddIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogRGlzY3JpbWluYXRlIGEgcmVnaW9uJ3MgYm91bmRzLiBDbGFzcyBpbnN0YW5jZXMgZmlyc3Q7IHBsYWluIG9iamVjdHMgd2l0aCB0aGVcbiAqIHJpZ2h0IGZpZWxkcyB0b28sIHNvIGEgcmVnaW9uIHRoYXQgc2tpcHBlZCB0aGUgc3RvcmUncyBoeWRyYXRpb24gKEpTT04gZnJvbSBhXG4gKiBob3N0KSBzdGlsbCBkcmF3cyBhbmQgaGl0LXRlc3RzIChqaXQtdWkjMTI0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJvdW5kc0tpbmQoYjogQW55Qm91bmRzIHwgbnVsbCB8IHVuZGVmaW5lZCk6ICdyZWN0JyB8ICdwb2x5JyB8ICdtdWx0aScgfCBudWxsIHtcbiAgaWYgKCFiKSByZXR1cm4gbnVsbDtcbiAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHJldHVybiAncmVjdCc7XG4gIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbikgcmV0dXJuICdwb2x5JztcbiAgaWYgKGIgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb24pIHJldHVybiAnbXVsdGknO1xuICBpZiAoQXJyYXkuaXNBcnJheSgoYiBhcyB7IHBvbHlnb25zPzogdW5rbm93biB9KS5wb2x5Z29ucykpIHJldHVybiAnbXVsdGknO1xuICBpZiAoJ3hwb2ludHMnIGluIGIgfHwgJ25wb2ludHMnIGluIGIpIHJldHVybiAncG9seSc7XG4gIGlmICgnd2lkdGgnIGluIGIgJiYgJ3gnIGluIGIpIHJldHVybiAncmVjdCc7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQSBwb2x5Z29uJ3MgcmluZyBhcyBwYXJhbGxlbCBhcnJheXM6IHRoZSBleHRlcmlvciBmb3IgYHJpbmdgIC0xLCBlbHNlIGhvbGUgYHJpbmdgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJpbmdPZihwOiBQb2x5Z29uLCByaW5nOiBudW1iZXIpOiB7IHhzOiBudW1iZXJbXTsgeXM6IG51bWJlcltdIH0ge1xuICBpZiAocmluZyA8IDApIHJldHVybiB7IHhzOiBwLnhwb2ludHMsIHlzOiBwLnlwb2ludHMgfTtcbiAgY29uc3QgcHRzID0gcC5ob2xlcz8uW3JpbmddID8/IFtdO1xuICByZXR1cm4geyB4czogcHRzLm1hcCgocSkgPT4gcVswXSksIHlzOiBwdHMubWFwKChxKSA9PiBxWzFdKSB9O1xufVxuXG4vKipcbiAqIEEgcG9seWdvbiByaW5nJ3MgYsOpemllciBoYW5kbGVzIChhYnNvbHV0ZSwgd29ybGQgc3BhY2UpOiB0aGUgc3RvcmVkIG9mZnNldHNcbiAqIHdoZW4gcHJlc2VudCwgZWxzZSB0aGUgQ2F0bXVsbC1Sb20gZGVmYXVsdCB0aGUgY3VydmUgaXMgZHJhd24gd2l0aC4gSG9sZXMgYXJlXG4gKiBhbHdheXMgY2xvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmluZ0hhbmRsZXMocDogUG9seWdvbiwgcmluZzogbnVtYmVyKTogQW5jaG9ySGFuZGxlW10ge1xuICBjb25zdCB7IHhzLCB5cyB9ID0gcmluZ09mKHAsIHJpbmcpO1xuICByZXR1cm4gcmluZyA8IDBcbiAgICA/IHJlc29sdmVIYW5kbGVzKHhzLCB5cywgcC5jbG9zZWQgIT09IGZhbHNlLCBwLmhhbmRsZXNJbiwgcC5oYW5kbGVzT3V0KVxuICAgIDogcmVzb2x2ZUhhbmRsZXMoeHMsIHlzLCB0cnVlLCBwLmhvbGVIYW5kbGVzSW4/LltyaW5nXSwgcC5ob2xlSGFuZGxlc091dD8uW3JpbmddKTtcbn1cblxuLyoqIFRoZSByaW5ncyBvZiBhIHBvbHlnb24sIGV4dGVyaW9yIGZpcnN0OiAtMSwgdGhlbiBlYWNoIGhvbGUgaW5kZXguICovXG5mdW5jdGlvbiByaW5nSW5kaWNlcyhwOiBQb2x5Z29uKTogbnVtYmVyW10ge1xuICByZXR1cm4gWy0xLCAuLi4ocC5ob2xlcyA/PyBbXSkubWFwKChfLCBpKSA9PiBpKV07XG59XG5cbi8vIOKUgOKUgCBib3VuZHMgYW5kIGNvbnRhaW5tZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEEgcmVnaW9uJ3MgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBpbiB3b3JsZCBjb29yZGluYXRlcyAoZXZlcnkgcGFydCBvZiBhXG4gKiBtdWx0aS1wb2x5Z29uKSwgb3IgbnVsbCBmb3IgZW1wdHkgZ2VvbWV0cnkuIExvb3BzIHJhdGhlciB0aGFuXG4gKiBgTWF0aC5taW4oLi4uc3ByZWFkKWAsIHdoaWNoIHRocm93cyBvbiBhIGxhcmdlIGltcG9ydGVkIGFubm90YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25CQm94KHJlZ2lvbjogUGljazxSZWdpb24sICdib3VuZHMnPik6IEJCb3ggfCBudWxsIHtcbiAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gIGNvbnN0IGtpbmQgPSBib3VuZHNLaW5kKGIpO1xuICBpZiAoa2luZCA9PT0gJ3JlY3QnKSB7XG4gICAgY29uc3QgciA9IGIgYXMgUmVjdGFuZ2xlO1xuICAgIHJldHVybiB7IHgwOiByLngsIHkwOiByLnksIHgxOiByLnggKyByLndpZHRoLCB5MTogci55ICsgci5oZWlnaHQgfTtcbiAgfVxuICBpZiAoIWtpbmQpIHJldHVybiBudWxsO1xuICBjb25zdCBwYXJ0cyA9IGtpbmQgPT09ICdwb2x5JyA/IFtiIGFzIFBvbHlnb25dIDogKGIgYXMgTXVsdGlQb2x5Z29uKS5wb2x5Z29ucztcbiAgbGV0IHgwID0gSW5maW5pdHksXG4gICAgeTAgPSBJbmZpbml0eSxcbiAgICB4MSA9IC1JbmZpbml0eSxcbiAgICB5MSA9IC1JbmZpbml0eTtcbiAgZm9yIChjb25zdCBwIG9mIHBhcnRzKSB7XG4gICAgY29uc3QgeHMgPSBwLnhwb2ludHMgPz8gW10sXG4gICAgICB5cyA9IHAueXBvaW50cyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoeHNbaV0gPCB4MCkgeDAgPSB4c1tpXTtcbiAgICAgIGlmICh4c1tpXSA+IHgxKSB4MSA9IHhzW2ldO1xuICAgICAgaWYgKHlzW2ldIDwgeTApIHkwID0geXNbaV07XG4gICAgICBpZiAoeXNbaV0gPiB5MSkgeTEgPSB5c1tpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHgxID49IHgwID8geyB4MCwgeTAsIHgxLCB5MSB9IDogbnVsbDtcbn1cblxuLyoqIFNob3J0ZXN0IGRpc3RhbmNlIGZyb20gKHB4LHB5KSB0byB0aGUgc2VnbWVudCAoYXgsYXkp4oCTKGJ4LGJ5KSwgaW4gdGhlIHVuaXRzIGdpdmVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlZ21lbnREaXN0YW5jZShweDogbnVtYmVyLCBweTogbnVtYmVyLCBheDogbnVtYmVyLCBheTogbnVtYmVyLCBieDogbnVtYmVyLCBieTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgZHggPSBieCAtIGF4LFxuICAgIGR5ID0gYnkgLSBheTtcbiAgY29uc3QgbGVuMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICBpZiAobGVuMiA9PT0gMCkgcmV0dXJuIE1hdGguaHlwb3QocHggLSBheCwgcHkgLSBheSk7XG4gIGxldCB0ID0gKChweCAtIGF4KSAqIGR4ICsgKHB5IC0gYXkpICogZHkpIC8gbGVuMjtcbiAgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQpKTtcbiAgcmV0dXJuIE1hdGguaHlwb3QocHggLSAoYXggKyB0ICogZHgpLCBweSAtIChheSArIHQgKiBkeSkpO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHJlZ2lvbkNvbnRhaW5zfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbnNPcHRpb25zIHtcbiAgLyoqIFByb2plY3Rpb24gdGhlIG9wZW4tcG9seWxpbmUgdG9sZXJhbmNlIGlzIG1lYXN1cmVkIGluLiBEZWZhdWx0OiB3b3JsZCB1bml0cy4gKi9cbiAgdG9TY3JlZW4/OiBUb1NjcmVlbjtcbiAgLyoqIE9wZW4tcG9seWxpbmUgaGl0IHdpZHRoLCBpbiBgdG9TY3JlZW5gIHBpeGVscy4gRGVmYXVsdCB7QGxpbmsgT1BFTl9QQVRIX1RPTF9QWH0uICovXG4gIHRvbFB4PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgd29ybGQgcG9pbnQgKHgsIHkpIGxhbmRzIG9uIGByZWdpb25gOiBhIHJlY3RhbmdsZSBieSBpdHMgKGluY2x1c2l2ZSlcbiAqIGJveDsgYSBjbG9zZWQgcG9seWdvbiBieSBpdHMgZXh0ZXJpb3IgbWludXMgaXRzIGhvbGVzOyBhIG11bHRpLXBvbHlnb24gYnkgYW55XG4gKiBwYXJ0IChtaW51cyB0aGF0IHBhcnQncyBob2xlcyk7IGFuIG9wZW4gcG9seWxpbmUg4oCUIHdoaWNoIGhhcyBubyBpbnRlcmlvciDigJRcbiAqIHdpdGhpbiBgdG9sUHhgIHNjcmVlbiBwaXhlbHMgb2YgaXRzIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25Db250YWlucyhcbiAgcmVnaW9uOiBQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgb3B0czogQ29udGFpbnNPcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gIHN3aXRjaCAoYm91bmRzS2luZChiKSkge1xuICAgIGNhc2UgJ3JlY3QnOiB7XG4gICAgICBjb25zdCByID0gYiBhcyBSZWN0YW5nbGU7XG4gICAgICByZXR1cm4geCA+PSByLnggJiYgeCA8PSByLnggKyByLndpZHRoICYmIHkgPj0gci55ICYmIHkgPD0gci55ICsgci5oZWlnaHQ7XG4gICAgfVxuICAgIGNhc2UgJ211bHRpJzpcbiAgICAgIHJldHVybiAoYiBhcyBNdWx0aVBvbHlnb24pLnBvbHlnb25zLnNvbWUoKHApID0+IGNsb3NlZENvbnRhaW5zKHAsIHgsIHkpKTtcbiAgICBjYXNlICdwb2x5Jzoge1xuICAgICAgY29uc3QgcCA9IGIgYXMgUG9seWdvbjtcbiAgICAgIGlmIChwLmNsb3NlZCAhPT0gZmFsc2UpIHJldHVybiBjbG9zZWRDb250YWlucyhwLCB4LCB5KTtcbiAgICAgIHJldHVybiBuZWFyUG9seWxpbmUocC54cG9pbnRzLCBwLnlwb2ludHMsIHgsIHksIG9wdHMudG9TY3JlZW4gPz8gV09STEQsIG9wdHMudG9sUHggPz8gT1BFTl9QQVRIX1RPTF9QWCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VkQ29udGFpbnMocDogUG9seWdvbiwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBvaW50SW5Qb2x5Z29uV2l0aEhvbGVzKHgsIHksIHAueHBvaW50cyA/PyBbXSwgcC55cG9pbnRzID8/IFtdLCBwLmhvbGVzKTtcbn1cblxuZnVuY3Rpb24gbmVhclBvbHlsaW5lKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdG9TY3JlZW46IFRvU2NyZWVuLCB0b2w6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoeHMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBbcHgsIHB5XSA9IHRvU2NyZWVuKHgsIHkpO1xuICBsZXQgW2F4LCBheV0gPSB0b1NjcmVlbih4c1swXSwgeXNbMF0pO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgW2J4LCBieV0gPSB0b1NjcmVlbih4c1tpXSwgeXNbaV0pO1xuICAgIGlmIChzZWdtZW50RGlzdGFuY2UocHgsIHB5LCBheCwgYXksIGJ4LCBieSkgPD0gdG9sKSByZXR1cm4gdHJ1ZTtcbiAgICBheCA9IGJ4O1xuICAgIGF5ID0gYnk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogSW5kZXggb2YgdGhlIHRvcG1vc3QgKGxhc3QpIHJlZ2lvbiBjb250YWluaW5nICh4LCB5KSwgb3IgLTEuICovXG5leHBvcnQgZnVuY3Rpb24gdG9wbW9zdFJlZ2lvbkF0PFIgZXh0ZW5kcyBQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+PihcbiAgcmVnaW9uczogUmVhZG9ubHlBcnJheTxSPixcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIG9wdHM6IENvbnRhaW5zT3B0aW9ucyAmIHsgc2tpcD86IChyOiBSKSA9PiBib29sZWFuIH0gPSB7fSxcbik6IG51bWJlciB7XG4gIGZvciAobGV0IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKG9wdHMuc2tpcD8uKHJlZ2lvbnNbaV0pKSBjb250aW51ZTtcbiAgICBpZiAocmVnaW9uQ29udGFpbnMocmVnaW9uc1tpXSwgeCwgeSwgb3B0cykpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBJbmRpY2VzIG9mIGV2ZXJ5IHJlZ2lvbiB3aG9zZSBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB0aGUgd29ybGQgYm94XG4gKiBbeDAseTBd4oCTW3gxLHkxXSAocnViYmVyLWJhbmQgc2VsZWN0aW9uKS4gYHNraXBQcm9maWxlc2AgbGVhdmVzIG91dFxuICogaW50ZW5zaXR5LXByb2ZpbGUgbGluZXMsIGBza2lwYCBhbnkgb3RoZXIgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uc0luUmVjdChcbiAgcmVnaW9uczogUmVhZG9ubHlBcnJheTxSZWdpb24+LFxuICB4MDogbnVtYmVyLFxuICB5MDogbnVtYmVyLFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICBvcHRzOiB7IHNraXBQcm9maWxlcz86IGJvb2xlYW47IHNraXA/OiAocjogUmVnaW9uKSA9PiBib29sZWFuIH0gPSB7fSxcbik6IG51bWJlcltdIHtcbiAgY29uc3Qgb3V0OiBudW1iZXJbXSA9IFtdO1xuICByZWdpb25zLmZvckVhY2goKHIsIGkpID0+IHtcbiAgICBpZiAoKG9wdHMuc2tpcFByb2ZpbGVzICYmIHIuaXNQcm9maWxlPy4oKSkgfHwgb3B0cy5za2lwPy4ocikpIHJldHVybjtcbiAgICBjb25zdCBiYiA9IHJlZ2lvbkJCb3gocik7XG4gICAgaWYgKGJiICYmIGJiLngwIDw9IHgxICYmIGJiLngxID49IHgwICYmIGJiLnkwIDw9IHkxICYmIGJiLnkxID49IHkwKSBvdXQucHVzaChpKTtcbiAgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIOKUgOKUgCBTVkcgcGF0aCBkYXRhIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogVGhlIGhhbmRsZSBvZmZzZXRzIGEgYsOpemllciByaW5nIGlzIGRyYXduIHdpdGg7IGFic2VudCBhcnJheXMgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaW5nSGFuZGxlT2Zmc2V0cyB7XG4gIGluPzogbnVtYmVyW11bXTtcbiAgb3V0PzogbnVtYmVyW11bXTtcbn1cblxuLyoqXG4gKiBTVkcgcGF0aCBgZGAgZm9yIG9uZSByaW5nIG9yIHBvbHlsaW5lLCBwcm9qZWN0ZWQgdGhyb3VnaCBgdG9TY3JlZW5gLlxuICogU3RyYWlnaHQgZWRnZXMgd2l0aG91dCBgaGFuZGxlc2A7IHdpdGggYGhhbmRsZXNgLCBjdWJpYyBzZWdtZW50cyB0aHJvdWdoIHRoZVxuICogc3RvcmVkIG9mZnNldHMsIG9yIHRoZSBDYXRtdWxsLVJvbSBkZWZhdWx0IHdoZW4gdGhleSBhcmUgbWlzc2luZyBvciBkbyBub3RcbiAqIG1hdGNoIHRoZSByaW5nICh2aWEgYHJlc29sdmVIYW5kbGVzYCkuIENsb3NlZCByaW5ncyBlbmQgaW4gYFpgLiAnJyBmb3IgZmV3ZXJcbiAqIHRoYW4gdHdvIHZlcnRpY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmluZ1BhdGhEKFxuICB4czogbnVtYmVyW10sXG4gIHlzOiBudW1iZXJbXSxcbiAgY2xvc2VkOiBib29sZWFuLFxuICB0b1NjcmVlbjogVG9TY3JlZW4sXG4gIGhhbmRsZXM/OiBSaW5nSGFuZGxlT2Zmc2V0cyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGlmIChuIDwgMikgcmV0dXJuICcnO1xuICBjb25zdCBwdCA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHEgPSB0b1NjcmVlbih4LCB5KTtcbiAgICByZXR1cm4gYCR7cVswXX0sJHtxWzFdfWA7XG4gIH07XG4gIGxldCBkID0gYE0gJHtwdCh4c1swXSwgeXNbMF0pfWA7XG4gIGlmIChoYW5kbGVzKSB7XG4gICAgY29uc3QgaCA9IHJlc29sdmVIYW5kbGVzKHhzLCB5cywgY2xvc2VkLCBoYW5kbGVzLmluLCBoYW5kbGVzLm91dCk7XG4gICAgY29uc3Qgc2VncyA9IGNsb3NlZCA/IG4gOiBuIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3M7IGkrKykge1xuICAgICAgY29uc3QgaiA9IChpICsgMSkgJSBuO1xuICAgICAgZCArPSBgIEMgJHtwdChoW2ldLm91dFswXSwgaFtpXS5vdXRbMV0pfSAke3B0KGhbal0uaW5bMF0sIGhbal0uaW5bMV0pfSAke3B0KHhzW2pdLCB5c1tqXSl9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuOyBpKyspIGQgKz0gYCBMICR7cHQoeHNbaV0sIHlzW2ldKX1gO1xuICB9XG4gIHJldHVybiBjbG9zZWQgPyBkICsgJyBaJyA6IGQ7XG59XG5cbi8qKlxuICogU1ZHIHBhdGggYGRgIGZvciBhIHdob2xlIHJlZ2lvbjogYSByZWN0YW5nbGUncyBmb3VyIGNvcm5lcnM7IGEgcG9seWdvbidzXG4gKiBleHRlcmlvciAoY3VydmVkIGZvciBhIGLDqXppZXIgcmVnaW9uKSBmb2xsb3dlZCBieSBvbmUgc3VicGF0aCBwZXIgaG9sZVxuICogKGN1cnZlZCB0b28gZm9yIGEgYsOpemllciBkb251dCk7IGEgbXVsdGktcG9seWdvbidzIHBhcnRzIHdpdGggdGhlaXIgaG9sZXMuXG4gKiBIb2xlcyBuZWVkIGBmaWxsLXJ1bGU6IGV2ZW5vZGRgIChzZWUge0BsaW5rIHJlZ2lvbkhhc0hvbGVzfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25QYXRoRChyZWdpb246IFBpY2s8UmVnaW9uLCAnYm91bmRzJz4sIHRvU2NyZWVuOiBUb1NjcmVlbiA9IFdPUkxEKTogc3RyaW5nIHtcbiAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gIHN3aXRjaCAoYm91bmRzS2luZChiKSkge1xuICAgIGNhc2UgJ3JlY3QnOiB7XG4gICAgICBjb25zdCByID0gYiBhcyBSZWN0YW5nbGU7XG4gICAgICByZXR1cm4gcmluZ1BhdGhEKFxuICAgICAgICBbci54LCByLnggKyByLndpZHRoLCByLnggKyByLndpZHRoLCByLnhdLFxuICAgICAgICBbci55LCByLnksIHIueSArIHIuaGVpZ2h0LCByLnkgKyByLmhlaWdodF0sXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRvU2NyZWVuLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAncG9seSc6XG4gICAgICByZXR1cm4gcG9seWdvblBhdGhEKGIgYXMgUG9seWdvbiwgdG9TY3JlZW4sIHRydWUpO1xuICAgIGNhc2UgJ211bHRpJzpcbiAgICAgIHJldHVybiAoYiBhcyBNdWx0aVBvbHlnb24pLnBvbHlnb25zXG4gICAgICAgIC5maWx0ZXIoKHApID0+IChwLnhwb2ludHM/Lmxlbmd0aCA/PyAwKSA+PSAzKVxuICAgICAgICAubWFwKChwKSA9PiBwb2x5Z29uUGF0aEQocCwgdG9TY3JlZW4sIGZhbHNlKSlcbiAgICAgICAgLmpvaW4oJyAnKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25QYXRoRChwOiBQb2x5Z29uLCB0b1NjcmVlbjogVG9TY3JlZW4sIGFsbG93QmV6aWVyOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2VkID0gcC5jbG9zZWQgIT09IGZhbHNlO1xuICBjb25zdCBiZXppZXIgPSBhbGxvd0JlemllciAmJiAhIXAuYmV6aWVyICYmIChwLnhwb2ludHM/Lmxlbmd0aCA/PyAwKSA+PSAyO1xuICBsZXQgZCA9IHJpbmdQYXRoRChcbiAgICBwLnhwb2ludHMgPz8gW10sXG4gICAgcC55cG9pbnRzID8/IFtdLFxuICAgIGNsb3NlZCxcbiAgICB0b1NjcmVlbixcbiAgICBiZXppZXIgPyB7IGluOiBwLmhhbmRsZXNJbiwgb3V0OiBwLmhhbmRsZXNPdXQgfSA6IHVuZGVmaW5lZCxcbiAgKTtcbiAgaWYgKCFjbG9zZWQpIHJldHVybiBkO1xuICAocC5ob2xlcyA/PyBbXSkuZm9yRWFjaCgocmluZywgaGkpID0+IHtcbiAgICBpZiAocmluZy5sZW5ndGggPCAzKSByZXR1cm47XG4gICAgY29uc3QgeyB4cywgeXMgfSA9IHJpbmdPZihwLCBoaSk7XG4gICAgZCArPVxuICAgICAgJyAnICtcbiAgICAgIHJpbmdQYXRoRChcbiAgICAgICAgeHMsXG4gICAgICAgIHlzLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0b1NjcmVlbixcbiAgICAgICAgYmV6aWVyID8geyBpbjogcC5ob2xlSGFuZGxlc0luPy5baGldLCBvdXQ6IHAuaG9sZUhhbmRsZXNPdXQ/LltoaV0gfSA6IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gIH0pO1xuICByZXR1cm4gZDtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGUgcmVnaW9uIGRyYXdzIGFzIHNldmVyYWwgc3VicGF0aHMgdGhhdCBuZWVkIGBmaWxsLXJ1bGU6IGV2ZW5vZGRgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lvbkhhc0hvbGVzKHJlZ2lvbjogUGljazxSZWdpb24sICdib3VuZHMnPik6IGJvb2xlYW4ge1xuICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgY29uc3Qga2luZCA9IGJvdW5kc0tpbmQoYik7XG4gIGlmIChraW5kID09PSAnbXVsdGknKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGtpbmQgIT09ICdwb2x5JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwID0gYiBhcyBQb2x5Z29uO1xuICByZXR1cm4gcC5jbG9zZWQgIT09IGZhbHNlICYmICEhcC5ob2xlcz8ubGVuZ3RoO1xufVxuXG4vLyDilIDilIAgaGFuZGxlIGhpdCB0ZXN0aW5nIChzY3JlZW4gc3BhY2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogV2hhdCBhIHBvaW50ZXIgZ3JhYmJlZCBvbiB0aGUgc2VsZWN0ZWQgcmVnaW9uIChzZWUge0BsaW5rIGhpdEhhbmRsZX0pLiAqL1xuZXhwb3J0IHR5cGUgSGFuZGxlSGl0ID1cbiAgLyoqIEEgcmVjdGFuZ2xlIGNvcm5lcjsgYGFuY2hvcmAgaXMgdGhlIG9wcG9zaXRlIChmaXhlZCkgY29ybmVyIGZvciBhIHJlc2l6ZS4gKi9cbiAgfCB7IGtpbmQ6ICdjb3JuZXInOyBpbmRleDogbnVtYmVyOyBhbmNob3I6IFtudW1iZXIsIG51bWJlcl0gfVxuICAvKiogQSBwb2x5Z29uIHZlcnRleDogYHJpbmdgIC0xIGZvciB0aGUgZXh0ZXJpb3IsIGVsc2UgdGhlIGhvbGUgaW5kZXguICovXG4gIHwgeyBraW5kOiAndmVydGV4JzsgcmluZzogbnVtYmVyOyBpbmRleDogbnVtYmVyIH1cbiAgLyoqIEEgYsOpemllciBjb250cm9sIHBvaW50IG9mIHZlcnRleCBgaW5kZXhgIG9uIGByaW5nYC4gKi9cbiAgfCB7IGtpbmQ6ICdiZXppZXInOyByaW5nOiBudW1iZXI7IGluZGV4OiBudW1iZXI7IHNpZGU6ICdpbicgfCAnb3V0JyB9O1xuXG4vKipcbiAqIFRoZSBoYW5kbGUgb2YgYHJlZ2lvbmAgdW5kZXIgc2NyZWVuIHBvaW50IChzeCwgc3kpIHdpdGhpbiBgcmFkaXVzYCBzY3JlZW5cbiAqIHBpeGVscywgb3IgbnVsbC4gUmVjdGFuZ2xlcyBoYXZlIGZvdXIgY29ybmVycy4gUG9seWdvbnM6IGV2ZXJ5IGLDqXppZXJcbiAqIGNvbnRyb2wgcG9pbnQgZmlyc3QgKGV4dGVyaW9yLCB0aGVuIGVhY2ggaG9sZTsgdGhleSBzaXQgb2ZmIHRoZSBhbmNob3JzLCBzb1xuICogdGhleSBtdXN0IHdpbiksIHRoZW4gdGhlIHZlcnRpY2VzIChleHRlcmlvciwgdGhlbiBlYWNoIGhvbGUpLiBQYXNzXG4gKiBgeyBiZXppZXI6IGZhbHNlIH1gIHRvIHRlc3QgdmVydGljZXMgb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpdEhhbmRsZShcbiAgcmVnaW9uOiBQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+LFxuICBzeDogbnVtYmVyLFxuICBzeTogbnVtYmVyLFxuICB0b1NjcmVlbjogVG9TY3JlZW4sXG4gIHJhZGl1czogbnVtYmVyLFxuICBvcHRzOiB7IGJlemllcj86IGJvb2xlYW4gfSA9IHt9LFxuKTogSGFuZGxlSGl0IHwgbnVsbCB7XG4gIGNvbnN0IGIgPSByZWdpb24uYm91bmRzO1xuICBjb25zdCBuZWFyID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgcSA9IHRvU2NyZWVuKHgsIHkpO1xuICAgIHJldHVybiBNYXRoLmh5cG90KHN4IC0gcVswXSwgc3kgLSBxWzFdKSA8PSByYWRpdXM7XG4gIH07XG4gIGNvbnN0IGtpbmQgPSBib3VuZHNLaW5kKGIpO1xuICBpZiAoa2luZCA9PT0gJ3JlY3QnKSB7XG4gICAgY29uc3QgciA9IGIgYXMgUmVjdGFuZ2xlO1xuICAgIGNvbnN0IHgwID0gci54LFxuICAgICAgeTAgPSByLnksXG4gICAgICB4MSA9IHIueCArIHIud2lkdGgsXG4gICAgICB5MSA9IHIueSArIHIuaGVpZ2h0O1xuICAgIGNvbnN0IGNvcm5lcnM6IEFycmF5PFtudW1iZXIsIG51bWJlciwgW251bWJlciwgbnVtYmVyXV0+ID0gW1xuICAgICAgW3gwLCB5MCwgW3gxLCB5MV1dLFxuICAgICAgW3gxLCB5MCwgW3gwLCB5MV1dLFxuICAgICAgW3gwLCB5MSwgW3gxLCB5MF1dLFxuICAgICAgW3gxLCB5MSwgW3gwLCB5MF1dLFxuICAgIF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmVhcihjb3JuZXJzW2ldWzBdLCBjb3JuZXJzW2ldWzFdKSkgcmV0dXJuIHsga2luZDogJ2Nvcm5lcicsIGluZGV4OiBpLCBhbmNob3I6IGNvcm5lcnNbaV1bMl0gfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGtpbmQgIT09ICdwb2x5JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHAgPSBiIGFzIFBvbHlnb247XG4gIGNvbnN0IHJpbmdzID0gcmluZ0luZGljZXMocCk7XG4gIGlmIChvcHRzLmJlemllciAhPT0gZmFsc2UgJiYgcC5iZXppZXIpIHtcbiAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcmluZ3MpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXMgPSByaW5nSGFuZGxlcyhwLCByaW5nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoID0gaGFuZGxlc1tpXTtcbiAgICAgICAgaWYgKGguaGFzT3V0ICYmIG5lYXIoaC5vdXRbMF0sIGgub3V0WzFdKSkgcmV0dXJuIHsga2luZDogJ2JlemllcicsIHJpbmcsIGluZGV4OiBpLCBzaWRlOiAnb3V0JyB9O1xuICAgICAgICBpZiAoaC5oYXNJbiAmJiBuZWFyKGguaW5bMF0sIGguaW5bMV0pKSByZXR1cm4geyBraW5kOiAnYmV6aWVyJywgcmluZywgaW5kZXg6IGksIHNpZGU6ICdpbicgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCByaW5nIG9mIHJpbmdzKSB7XG4gICAgY29uc3QgeyB4cywgeXMgfSA9IHJpbmdPZihwLCByaW5nKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmVhcih4c1tpXSwgeXNbaV0pKSByZXR1cm4geyBraW5kOiAndmVydGV4JywgcmluZywgaW5kZXg6IGkgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVGhlIHBvbHlnb24gZWRnZSBuZWFyZXN0IHNjcmVlbiBwb2ludCAoc3gsIHN5KSwgYWNyb3NzIHRoZSBleHRlcmlvciBhbmQgZXZlcnlcbiAqIGhvbGU6IGl0cyByaW5nICgtMSA9IGV4dGVyaW9yKSwgdGhlIGluZGV4IG9mIGl0cyBzdGFydCB2ZXJ0ZXgsIGFuZCB0aGVcbiAqIGRpc3RhbmNlIGluIHNjcmVlbiBwaXhlbHMuIE51bGwgd2hlbiB0aGUgcmVnaW9uIGlzIG5vdCBhIHBvbHlnb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWFyZXN0RWRnZShcbiAgcmVnaW9uOiBQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+LFxuICBzeDogbnVtYmVyLFxuICBzeTogbnVtYmVyLFxuICB0b1NjcmVlbjogVG9TY3JlZW4sXG4pOiB7IHJpbmc6IG51bWJlcjsgc2VnSW5kZXg6IG51bWJlcjsgZGlzdDogbnVtYmVyIH0gfCBudWxsIHtcbiAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gIGlmIChib3VuZHNLaW5kKGIpICE9PSAncG9seScpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gYiBhcyBQb2x5Z29uO1xuICBsZXQgYmVzdDogeyByaW5nOiBudW1iZXI7IHNlZ0luZGV4OiBudW1iZXI7IGRpc3Q6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIGZvciAoY29uc3QgcmluZyBvZiByaW5nSW5kaWNlcyhwKSkge1xuICAgIGNvbnN0IHsgeHMsIHlzIH0gPSByaW5nT2YocCwgcmluZyk7XG4gICAgY29uc3QgbiA9IHhzLmxlbmd0aDtcbiAgICBjb25zdCBzZWdzID0gcmluZyA+PSAwIHx8IHAuY2xvc2VkICE9PSBmYWxzZSA/IG4gOiBuIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3M7IGkrKykge1xuICAgICAgY29uc3QgaiA9IChpICsgMSkgJSBuO1xuICAgICAgY29uc3QgYSA9IHRvU2NyZWVuKHhzW2ldLCB5c1tpXSk7XG4gICAgICBjb25zdCBjID0gdG9TY3JlZW4oeHNbal0sIHlzW2pdKTtcbiAgICAgIGNvbnN0IGRpc3QgPSBzZWdtZW50RGlzdGFuY2Uoc3gsIHN5LCBhWzBdLCBhWzFdLCBjWzBdLCBjWzFdKTtcbiAgICAgIGlmICghYmVzdCB8fCBkaXN0IDwgYmVzdC5kaXN0KSBiZXN0ID0geyByaW5nLCBzZWdJbmRleDogaSwgZGlzdCB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmVzdDtcbn1cblxuLyoqXG4gKiBUaGUgcG9seWdvbiB2ZXJ0ZXggbmVhcmVzdCB3b3JsZCBwb2ludCAoeCwgeSksIGFjcm9zcyB0aGUgZXh0ZXJpb3IgYW5kIGV2ZXJ5XG4gKiBob2xlLCB3aXRoIGl0cyBkaXN0YW5jZSBpbiB3b3JsZCB1bml0cy4gTnVsbCB3aGVuIHRoZSByZWdpb24gaXMgbm90IGFcbiAqIHBvbHlnb24gb3IgaGFzIG5vIHZlcnRpY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdFZlcnRleChcbiAgcmVnaW9uOiBQaWNrPFJlZ2lvbiwgJ2JvdW5kcyc+LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IHsgcmluZzogbnVtYmVyOyBpbmRleDogbnVtYmVyOyBkaXN0OiBudW1iZXIgfSB8IG51bGwge1xuICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgaWYgKGJvdW5kc0tpbmQoYikgIT09ICdwb2x5JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHAgPSBiIGFzIFBvbHlnb247XG4gIGxldCBiZXN0OiB7IHJpbmc6IG51bWJlcjsgaW5kZXg6IG51bWJlcjsgZGlzdDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgZm9yIChjb25zdCByaW5nIG9mIHJpbmdJbmRpY2VzKHApKSB7XG4gICAgY29uc3QgeyB4cywgeXMgfSA9IHJpbmdPZihwLCByaW5nKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBkaXN0ID0gTWF0aC5oeXBvdCh4c1tpXSAtIHgsIHlzW2ldIC0geSk7XG4gICAgICBpZiAoIWJlc3QgfHwgZGlzdCA8IGJlc3QuZGlzdCkgYmVzdCA9IHsgcmluZywgaW5kZXg6IGksIGRpc3QgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3Q7XG59XG4iXX0=
|